接口文档神器-apidoc使用方法

1、安装
npm install apidoc -g

2、在app目录下生成配置文件apidoc.json
{
“version”: “1.0.0”,
“description”: “xxx核心接口”,
“title”: “ggg系统接口”,
“url” : “http://test.com”,
“sampleUrl”: “http://test.com”
}

3、执行生成
apidoc -i src/ -o apidoc/
src-代码文件夹
apidoc-doc静态文件生成路径

注释格式举例:
“””
@api {POST} /api/user/getUserInfo
@apiName 取得用户信息 api
@apiGroup Group
@apiVersion 1.0.1
@apiDescription 取得用户信息
@apiPermission 登录用户
@apiSampleRequest http://api.test.com/api/user/getUserInfo
@apiParam {int} [id] any id
@apiParamExample {json} 请求例子:
{
“id”: 4711
}
@apiSuccess (200) {String} msg 信息
@apiSuccess (200) {int} code 200
@apiSuccess (200) {String} name 真实姓名
@apiSuccess (200) {String} mobile 手机号
@apiSuccess (200) {String} birthday 生日
@apiSuccess (200) {String} email 邮箱
@apiSuccessExample {json} 返回样例:
{
“code”: 200,
“msg”: “”,
“name”: “真实姓名”,
“mobile”: 12345678901,
“birthday”: “1980-03-05”,
“email”: “test@gamil.com”
}
@apiErrorExample {json} 错误返回:
{
“code”: 14695
“msg”: “数据出错”
}
“””

@apiParam {String} [paging=turn] 页式:slide-滑动(向上向下滚动效果时使用,手机端使用该参数值)turn-翻页模式,PC端使用
@apiParam {Integer} [index=0] 索引值 不同页式时的输入值:slide:最后一个条目的编号item_id turn:条目偏移量
@apiParam {Integer} [page_size=20] 每页显示条目数

Sublime Text 3配置React IDE

 

安装Package Control:

一、自动安装(亲测可用)

使用Ctrl+`快捷键或者通过View->Show Console菜单打开命令行,粘贴如下代码:

import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read())

如果顺利的话,此时就可以在Preferences菜单下看到Package Settings和Package Control两个菜单了。

二、手动安装(未测试)

可能由于各种原因,无法使用代码安装,那可以通过以下步骤手动安装Package Control:

1.点击Preferences > Browse Packages菜单

2.进入打开的目录的上层目录,然后再进入Installed Packages/目录

3.下载Package Control.sublime-package并复制到Installed Packages/目录

4.重启Sublime Text。

安装React Native 需要用到的插件

React Native 开发推荐的一些插件:
  • ReactJS:支持React开发,提供JSX代码提示,高亮显示,ReactJS官方介绍
  • Emmet:前端开发必备,能够存储和重用开发代码块,Emmet介绍
  • Terminal:在Sublime中打开终端并定位到当前目录,(快捷键cmd+shift+T
  • react-native-snippets:react native 代码片段,react-native-snippets官方介绍
1> 打开Package Control:点击菜单栏Preferences-->Package Control 或者使用快捷键 Ctrl + Shift + T
2> 输入install选中:Package Control:install package
3> 等待几秒,在弹出的终端中输入想要安装的插件

 

Thrift入门2-介绍

首先思考一下分布式系统中的 RPC (Remote Procedure Call) 问题,一个完整的 RPC 模块需要可以分为三个层次

· 服务层(service):RPC 接口定义与实现

· 协议层(protocol):RPC 报文格式和数据编码格式

· 传输层(transport):实现底层的通信(如 socket)以及系统相关的功能(如事件循环、多线程)

在实际的大型分布式系统中,不同的服务往往会使用不同的语言来实现,所以一般的 RPC 系统会提供一种跨语言的过程调用功能,比如一段用C++实现的客户端代码可以远程调用一个用 Java 实现的服务。实现跨语言 RPC 有两种方法:

· 静态代码生成:开发者用一种中间语言(IDL,接口定义语言)来定义 RPC 的接口和数据类型,然后通过一个编译器来生成不同语言的代码(如C++, Java, Python),并由生成的代码来负责 RPC 协议层和传输层的实现。例如,服务的实现用C++,则服务端需要生成实现RPC协议和传输层的C++代码,服务层使用生成的代码来实现与客户端的通信;而如果客户端用 Python,则客户端需要生成Python代码。

· 基于“自省”的动态类型系统来实现:协议和传输层可以只用一种语言实现成一个库,但是这种语言需要关联一个具备“自省”或者反射机制的动态类型系统,对外提供其他语言的绑定,客户端和服务端通过语言绑定来使用 RPC。比如,可以考虑用 C 和 GObject 实现一个 RPC 库,然后通过 GObject 实现其他语言的绑定。

第一种方法的优点是RPC的协议层和传输层的实现不需要和某种动态类型系统(如GObject)绑定在一起,同时避免了动态类型检查和转换,程序效率比较高,但是它的缺点是要为不同语言提供不同的 RPC 协议层和传输层实现。第二种方法的主要难度在于语言绑定和通用的对象串行化机制的实现,同时也需要考虑效率的问题。

Thrift 是一个基于静态代码生成的跨语言的RPC协议栈实现,它可以生成包括C++, Java, Python, Ruby, PHP 等主流语言的代码,这些代码实现了 RPC 的协议层和传输层功能,从而让用户可以集中精力于服务的调用和实现。Cassandra 的服务访问协议是基于 Thrift 来实现的。

第二节 thrift介绍

Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金会将Thrift作为一个开源项目,对于当时的facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传输通信以及系统之间语言环境不同需要跨平台的特性。所以thrift可以支持多种程序语言,例如:  C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk. 在多种不同的语言之间通信thrift可以作为二进制的高性能的通讯中间件,支持数据(对象)序列化和多种类型的RPC服务。Thrift适用于程序对程 序静态的数据交换,需要先确定好他的数据结构,他是完全静态化的,当数据结构发生变化时,必须重新编辑IDL文件,代码生成,再编译载入的流程,跟其他IDL工具相比较可以视为是Thrift的弱项,Thrift适用于搭建大型数据交换及存储的通用工具,对于大型系统中的内部数据传输相对于JSON和xml无论在性能、传输大小上有明显的优势。

Thrift 主要由5个部分组成:

· 类型系统以及 IDL 编译器:负责由用户给定的 IDL 文件生成相应语言的接口代码

· TProtocol:实现 RPC 的协议层,可以选择多种不同的对象串行化方式,如 JSON, Binary。

· TTransport:实现 RPC 的传输层,同样可以选择不同的传输层实现,如socket, 非阻塞的 socket, MemoryBuffer 等。

· TProcessor:作为协议层和用户提供的服务实现之间的纽带,负责调用服务实现的接口。

· TServer:聚合 TProtocol, TTransport 和 TProcessor 几个对象。

上述的这5个部件都是在 Thrift 的源代码中通过为不同语言提供库来实现的,这些库的代码在 Thrift 源码目录的 lib 目录下面,在使用 Thrift 之前需要先熟悉与自己的语言对应的库提供的接口。

Thrift入门1-Mac下python服务及客户端实例

1、brew install thrift
2、pip install thrift
3、建立thrift模版文件PythonService.thrift

service PythonService{
string get(1:i32 id)
i32 remove(1:i32 id)
}

4、使用命令生成Python文件

thrift --gen py PythonService.thrift

5、将gen-py/PythonService路径下的全部文件拷贝到自己的项目路径下,比如PythonThrift\PythonService
6、Server端

# coding=utf-8
import sys
sys.path.append('../') #导入上下文环境
from PythonService import  PythonService
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.protocol import TCompactProtocol
from thrift.server import TServer
import socket
# 实现类
class PythonServiceServer:
     def get(self, id):
         print socket.gethostbyname(socket.gethostname())
         return "get=="+str(id)
     
     def remove(self, id):
         print socket.gethostbyname(socket.gethostname())
         return id
     
handler = PythonServiceServer()
# 注册实现类
processor = PythonService.Processor(handler)
transport = TSocket.TServerSocket('localhost',30303)
tfactory = TTransport.TBufferedTransportFactory()
# pfactory = TBinaryProtocol.TBinaryProtocolFactory()
pfactory = TCompactProtocol.TCompactProtocolFactory()

server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)

print "Starting python server..."
server.serve()
print "done!" 

7、client端

# coding=utf-8
import sys
sys.path.append('../') #导入上下文环境

from servicePy import  PythonService
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.protocol import TCompactProtocol

def pythonServerExe():
    try:
        transport = TSocket.TSocket('localhost', 30303) 
        transport = TTransport.TBufferedTransport(transport)
        # protocol = TBinaryProtocol.TBinaryProtocol(transport)
        protocol = TCompactProtocol.TCompactProtocol(transport)
        client = PythonService.Client(protocol)
        transport.open()
        print "The return value is : " 
        print client.remove(12)
        print client.get(100)
        print "............"
        transport.close()
    except Thrift.TException, tx:
        print '%s' % (tx.message)
if __name__ == '__main__':
    pythonServerExe()

【示例下载】http://pan.baidu.com/s/1pKBf6np

使用jquery实现不同页面同时加载同一个div

需要加载页面:

<script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
<script>// <![CDATA[
$(document).ready(function(){
$("#btn1").click(function(){
$('#test').load('/test.txt');
})
})
// ]]></script>
</code>
<h3 id="test">请点击下面的按钮,通过 jQuery AJAX 改变这段文本。</h3>
<button id="btn1" type="button">获得外部的内容</button>

test.txt

<h2>jQuery and AJAX is FUN!!!</h2>
<p id="p1">This is some text in a paragraph.</p>

注意test.txt跟加载页在一个域内

Ajax post数据

<script type=”text/javascript”>
preAllow = true;
$(function()
{
$(“#btnQ”).click(function(event)
{
if(preAllow){
preAllow=false;
var flag =1
var name = $(“#name”).val();
var phone = $(“#phone”).val();
var activityId = $(“#activityId”).val();
var startTime = $(“#startTime”).val();
var endTime = $(“#endTime”).val();

if(flag){
$.ajax({
type: “POST”,
url: “/”,
data: {“name”:name,”phone”:phone,”activityId”:activityId,”startTime”:startTime,”endTime”:endTime},
success: function(data){
alert(decodeURI(data));
preAllow = true;
}

});
}}
else {alert(“请不要重复点击!”);}
});
})
// ]]></script>