XpmJS - 小程序云端增强 SDK

[复制链接]
admin 发表于 2017-4-4 15:02:22 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

马上注册,开通VIP,获取100T视频教程,精品源码,经典电子书下载权限

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
XpmJS - 小程序云端增强 SDK一、XpmJS 是啥

XpmJS可以链接任何云端资源,为小程序、移动应用提供云资源通道和后端能力。降低开发门槛,提升小程序的开发效率。无需编写后端代码,即可实现用户登录、WebSocket 通信、微信支付、云端数据表格、文件存储等功能。虽然 PHP 是最好的编程语言, 但是使用 XpmJS 后, 无需学习包括 PHP 在内的任何后端语言,用 Javascript 即可搞定一切,NodeJS 也不用!

二、为啥 XpmJS从代码结构上看 XpmJS 更优雅!因为使用了 Promise!

XpmJS 封装了常用后端操作,还提供一个管理后台,微信支付只要一行代码就可以实现!

后端部署在你的云主机上!你可以完全掌控数据。

方法1: 一键安装

推荐使用腾讯云一键安装链接 ( 访问微信接口快, 可以免费申请 Https 证书 )

方法2: 安装脚本

安装前,先提前申请 Docker Hub 镜像 申请地址 [url]https://www.daocloud.io/mirror[/url]

# 请采用 Ubuntu 14.04 64位 LTScurl -sSL http://tuanduimao.com/xpmjs-server.sh | sh -s yourdomain.com http://<your id>.m.daocloud.io' V5 Y$ N" B! P* X9 o8 e/ t7 Z
+ A2 `. c8 D' K. W

方法3: 使用 Docker 安装

# 安装 Docker curl -sSL https://get.daocloud.io/docker | sh# 启动容器docker run -d --name=xpmjs-server  \    -e "HOST=yourdomain.com" \    -v /host/data:/data  \    -v /host/apps:/apps  \    -v /host/config:/config  \    -p 80:80 -p 443:443  \    tuanduimao/xpmjs-server:1.05 n8 u5 _; ]3 L# V

) g1 y% z6 U8 LXpmJS Server 升级

第一步: 下载代码:

curl http://xpmjs-1252011659.costj.my ... s-server-1.0.tar.gz' A3 ?* h& q1 r  d/ u3 M
: S; ?5 B' ^- {3 X' n, [

第二步: 解压并更新:

tar xvfz xpmjs-server-1.0.tar.gzcd 1.0 && docker cp . xpmjs-server:/code
% H$ O5 Y+ b* S6 i4 C
/ g; D' }: m% _, ]" B+ ?' A
三、XpmJS 咋用1. 用户 ( User )用户登录 login()var user = app.xpm.require('User');user.login().then( function( userInfo ) {     console.log( '用户登录成功', userInfo );    app.session.set('loginUser', userInfo );}).catch( function( excp ) {     console.log('用户登录失败', excp );});0 k& c$ I3 o3 F, S3 E% X

" r- E- D5 M- ]; l用户退出 logout()var user = app.xpm.require('User');user.logout().then( function( userInfo ) {     console.log( '用户注销成功', userInfo );}).catch( function( excp ) {     console.log('用户注销失败', excp );});
% t$ Z; [+ `1 I' R$ P8 Y/ z/ o9 `% t

. k/ k2 u9 r% F, C0 g6 w读取资料 get()

来自微信客户端的用户信息 ( 非云端数据 )

var user = app.xpm.require('User');user.get().then( function( userInfo ) {     console.log( '读取成功', userInfo );}).catch( function( excp ) {     console.log('读取失败', excp );});
6 [2 \: x" c5 C' ]  ^8 i8 E
2 P% S! d+ h$ Q1 q
2. 信道( Wss )

使用 Websocket 信道,可以实现双向实时通信。

打开信道 open()var wss = app.xpm.require('Wss');wss.open('/wxapp').then(function( res ) {    console.log( '信道连接成功', res );}).catch( function( excp ) {     console.log('信道连接失败', excp );});
+ g8 V; F1 a# x) B, X  s& f

$ f7 o, g% E$ x, O, x, l) B在线用户 liveUsers ()var wss = app.xpm.require('Wss');wss.liveUsers().then(function( users ) {    console.log( '读取在线用户成功', users );}).catch( function( excp ) {     console.log('读取在线用户失败', excp );});
9 E0 S; b: N; _
  H, ]* h) g4 y1 F

用户信息数据结构

字段中文说明
id客户端ID
_id用户ID
nickName微信昵称
gender性别
avatarUrl头像
language语言
group用户组
isadmin是否是管理员0 非管理员 1 管理员
检查用户是否在线 isOnline ( xpmjs-server 1.0rc4+ )var user = app.xpm.require('User');var wss = app.xpm.require('Wss');user.login().then( function( userInfo ) {     return wss.isOnline( userInfo['_id'] )}).then function( isOnline ) {    if ( isOnline ) {        console.log( '用户在线');    } else {        console.log( '用户离线');    }}).catch( function( excp ) {     console.log('出错啦', excp );});
) e# v6 C" I" P/ W9 Y
- K/ r4 q% S4 T4 z, u! N* {
监听指令 listen()

小程序仅提供 WebSocket 客户端 API,所以小程序本身无法实现 WebSocket服务器。 wss.listen() 方法并非启动 WebSocket Server, 而是用来接收云端信道转发的指令。

var wss = app.xpm.require('Wss');wss.listen('payment', function( res, status ){    // 当接收到 payment 指令后运行     if ( status != 'success') return ;    console.log( res, status );});- [) ?1 o% Z$ ?
' J" R5 `& l4 a
发送指令 send()var wss = app.xpm.require('Wss');wss.liveUsers().then(function( users ) {    console.log( '读取在线用户成功', users );    // 向第一个用户发送 payment 指令    if ( users.length > 0 )  {        return wss.send('payment', users[0], users[0]['id'] )    } else {        return {code:404, message:'no live user'};    }}).then( function( res ){    console.log('发送完毕', res);});.catch( function( excp ) {     console.log('出错了', excp );});
8 b( k( Y% Z0 g' G  E: Q, r0 S
3 m. n. W( m* F! d0 T6 W
绑定事件 bind()

接收并处理 websocket 服务器事件,有效值 ( open/close/message/error )

var wss = app.xpm.require('Wss');wss.bind('open', function(event) {    console.log('信道服务器开启', event );});wss.bind('close', function(event) {    console.log('信道服务器关闭', event );});) T  U2 g4 i$ C- c6 n# {) _4 f3 X
; Z& Y. _4 e' }3 ?7 P- V, _9 v
3. 会话 ( Session )

Session 会话分为客户端和服务端两部分,客户端与服务端会话ID相同,客户端保存用户信息资料,服务端保存用户 openid 等敏感信息。与服务端通信,使用Sesssion ID 鉴权,通过服务器端验证后,请勿将 Session ID 发送给第三方。

启用会话 start()

启用会话后,会自动创建一个会话ID

var session = app.xpm.require('session');    session.start();" ^6 w( Q; r4 u' T6 ?

0 j& N, L& d4 Y# F3 }, H. `* G会话 ID id()var session = app.xpm.require('session');var sid = app.id();console.log( sid );
2 r8 k  P# D. o0 |' V1 [2 l

2 g' T* B% n2 ~/ F6 d6 y  [客户端会话数据管理 set() & get()var session = app.xpm.require('session');session.set('hello', 'world');console.log( session.get('hello') );
5 F" n* K2 E1 e0 p* @" m
4 F2 Q0 K4 }) n/ Y1 K
4. 云端表格 ( Table )

可以使用云端表格接口,将数据保存在 MySQL 中,可以通过 SQL 查询数据。

创建数据表 _schema()

仅管理员帐号拥有创建数据表权限 ( 登录管理后台,打开用户表,将开发者对应帐号记录的 isadmin 字段数值设置为 1 )

var table = app.xpm.require('Table', 'hello');table._schema(    [        {name:"name", type:'string', option:{length:80, require:true }, acl:"rwd:r:-" },      {name:"company", type:'string', option:{length:100}, acl:"w:-:-" }    ],     { record:"rwd:rw:-", table:"rwd:-:-", field:'rwd:r:-',  user:'admin', group:'member' }, true ).then( function( data ) {    console.log('数据表创建成功', data );}).catch( function( excp ) {     console.log('数据表创建失败', excp );});
1 B, z, u6 f% {+ H* q' _$ o% {
# R7 G4 f+ y, C# K+ ?

字段配置参数

参数中文说明
name字段名称
type字段类型string/integer/text/boolean 等
option字段参数index:true 索引 unique:true 唯一索引 length:80 字段长度
acl字段鉴权rw:rw:rw r: 读取 w: 写入 -:无 user:groupther
数据增删改查 get() create() update() remove()var table = app.xpm.require('Table', 'hello');// 创建table.create(     {name:'张艺谋', company:'中国电影制片厂'}).then(function(data) { // 更新    return table.update(data['_id'], {name:'冯小刚'});}).then(function(data) { // 读取    return table.get(data['_id']);}).then(function(data) { // 删除    return table.remove(data['name'], 'name' );}).then(function(resp) {    console.log( 'remove success', resp );}).catch( function( excp ) {     console.log('出错了', excp );});& |. K, d7 x% J' y9 Q
: D3 D3 O# y: n
数据查询 query()var table = app.xpm.require('Table', 'hello');table.query()    .where('name', '=', '冯小刚')    .orderby('name', 'asc')    .limit(2)  // 仅查询 2条 .fetch('name','company').then(function(data) {      console.log( '查询结果', data ); })table.query()    .where('name', '=', '冯小刚')    .orderby('name', 'asc')    .paginate(3, 2)  // 分3页,当前显示第 2页 .fetch('name','company').then(function(data) {      console.log( '查询结果', data ); });
4 b: U% t6 e  f( `
$ {. S2 ?) t  v  \! c) V
联合查询 join(), leftjoin(), rightjoin() (xpmjs-server 1.0rc4+)

Table 1: User

idnametitle
1张三产品经理
2李四工程师
3王五运维工程师

Table 2: Project

idnameuid
1小程序开发组1
2网页开发组3
var table = app.xpm.require('Table', 'Project');table.query()    .join('User', 'User.id', '=', 'Project.uid' )  // leftjoin / rightjoin    .limit(1)  .fetch('User.id as userid', 'User.name as username', 'Project.*').then(function(data) {      console.log( '查询结果', data ); })
0 T* d/ D0 }/ \

; F; w1 ]% z$ D3 D& O4 W' D

返回值

[    {        "id":1,        "name":"小程序开发组"        "userid":1,        "username":"产品经理"    }]* t' V# |$ ]4 E* ?5 y6 Q

' H' T+ f$ ?) G( ]/ O4 @" QinWhere 查询 inWhere()

Table 1: User

idnametitle
1张三产品经理
2李四工程师
3王五运维工程师

Table 2: Project

idnameusers
1小程序开发组["1","2","3"]
2网页开发组["1", "3"]
var table = app.xpm.require('Table', 'Project');table.query()    .inWhere('users', 'User', 'id', '*' )    .limit(1)  .fetch('User.id as userid', 'User.name as username', 'Project.*').then(function(data) {      console.log( '查询结果', data ); })
: V: T0 ]/ {3 [6 E6 z
/ _: j: }' K5 n" @, y

返回值

[    {        "id":1,        "name":"小程序开发组"        "users":[            {                "id":1,                "name":"张三",                "title":"产品经理"            }            ...        ]    }]
8 M$ m( {; O+ f" w* I3 J

3 J+ ^. D, q+ P( f$ v2 R5. 微信支付 ( Pay )发起支付 request();var pay = app.xpm.require('Pay');pay.request({    total_fee:500,  // 单位分    body:'算命、服务器开光',    attach:'HELLO XpmJS.com',     detail:'{id:888,desp:"算命,抽SSR,赠送服务器开光"}'}).then(function( data ){    console.log('Request Pay Success', data );}).catch( function( excp){    console.log('Request Pay Failure', excp );});
! V/ s# M1 ]' G  U0 V- k( B  \+ Z6 Y, c. K
- ^5 |4 n, a4 G4 [0 k! \" j& T
云端事件 before(), success(), fail(), complete() (xpmjs-server 1.0rc4+)pay.before('create', {  // 创建充值记录 (统一下单成功后, 发起支付前, 在云端运行 )    'table':'income',    'data': {        sn:'{{sn}}',        order_sn: data.order.sn,        uid:data.order.uid,        amount:data.order.sale_price,        amount_free:0,        status:'PENDING',        status_tips:"F请求付款"    }}).order({   // 生成订单  ( 统一下单接口, 仅设定并不发送请求 )    total_fee:data.order.sale_price,  // 单位分    body:data.order.show_name,    attach:'attach user is ' + mid,  // 应该是当前登录用户的 ID     detail:data}).success('update', { // 更新充值记录 ( 支付成功后回调,在云端运行 )    'table':'income',    'data': {        sn:'{{sn}}',        status:'DONE',        status_tips:"income status_tips field"    },    'unique':'sn'}).success('app', {   // 调用APP 示例 ( 支付成功后回调,在云端运行 )    'name':'xapp',    'api':['ticket','index',{sn:'{{sn}}','status_tips':"{{0.status_tips}}"}],    'data': {        sn:'{{sn}}',        status:'DONE'    }}).success('update', {  // 更新订单状态 ( 支付成功后回调,在云端运行 )    'table':'order',    'data': {        _idid,        status:'PENDING'    }}).success('create', {   // 创建消费记录 ( 支付成功后回调,在云端运行 )    'table':'payout',    'data': {        sn:'{{sn}}',        order_sn: data.order.sn,        uid:data.order.uid,        amount:data.order.sale_price,        amount_free:0,        status:'DONE',        status_tips:"F请求付款"    }}).request().then(function( payResp  ) {  // 发起请求    console.log( payResp );})) T2 L# `5 H% K/ m: {4 }0 B  w, G% g
2 }& J4 Z+ l- ~8 d# m
6. 本地存储 ( Stor )var stor = app.xpm.require('Stor');stor.setSync('key','value');console.log(stor.getSync('key'));stor.setMapSync('map_name', 'key', 'value');console.log(stor.getMapSync('map_name','key'));9 {  N9 \8 h, C( V& N) E
* d+ h, \. \8 m! N- l9 {
7. 云端应用 ( App ) (xpmjs-server 1.0rc3+)调用示例var xapp = app.xpm.require('App', 'xapp' );  // xapp 应用名称xapp.api( 'ticket', 'available' )  // ticket 控制器  available 方法名.post({    'train_date':'2017-01-26',    'from_station':'BJP',    'to_station':'SHH'}).then( function( resp ) {  console.log('POST RESP:', resp );}).catch( function( excp ) {  console.log('POST EXCP:', excp );});6 o6 _. n4 p# Y

( p  [6 Y+ }7 R& X" ~9 {; Z8 rXpmJS 云端应用开发

参考云端应用 Demo <火车票余票查询接口实现>

https://git.oschina.net/xpmjs/xapp

8. 云端队列 ( Que.js ) (xpmjs-server 1.0rc4+)var que = app.xpm.require('Que', 'hello');que.select('world').push('create', {  // 增加数据    table:'payout',    data: {        sn:'200193',        order_sn:'test29993',        amount:100,        status:'DONE'    }}).push('update', { // 更新数据    table:'order',    data: {        sn:'148457330261256',        status_tips:'{{0.sn}} {{0.status}}'    },    unique:'sn'}).push('app', {   // 调用APP 示例    'name':'xapp',    'api':['ticket','index',{sn:'{{0.sn}}'}],    'data': {        sn:'{{0.sn}} {{1.sn}}',        status:'DONE'    }}).run().then(function(resp){    console.log( 'Response', resp );}).catch(function(excp){    console.log( 'Error', excp );})
! k6 f* w7 \+ [2 C/ q& K3 b* O

' x% E: V8 _. U( v9. 文件上传 Utils.upload & App.upload (xpmjs-server 1.0+)

上传文件到腾讯云对象存储

var qcloud = app.xpm.require('app', 'xqcloud');qcloud.api("cos",'upload').upload( tempFilePaths[0] ).then(function(data){    that.setData({        'rs.corver':data.access_url,        'rs.images':[data.access_url]    });}).catch( function(excp){    console.log('Upload Fail', excp );});
  j9 v4 A, u# M! U; d% K! y9 K
& ]* o3 j" G, P/ X
10. 常用方法 ( Utils )请求网址 ( Utils.fetch ) (xpmjs-server 1.0rc3+)var utils = app.xpm.require('Utils' );  utils.fetch( 'http://qcloud.com' ).then( function( resp ) {        console.log('FETCH RESP:', resp );}).catch( function( excp ) {  console.log('FETCH EXCP:', excp );});8 k8 u. K- ?4 M" _2 s& }& g
- _4 `( j" T9 ]( o( P" @3 Q9 n  E1 a
生成二维码图片 ( Utils.qrImageUrl ) (xpmjs-server 1.0+)

返回二维码图片地址

var utils = app.xpm.require('Utils' ); var url = utils.qrImageUrl('hello world', {size:200});console.log( url );
. J1 n3 M* a- y2 z0 z  G; i
+ X2 C5 J, ^  l2 f# C
生成小程序页面二维码 ( Utils.qrcode ) ( xpmjs-server 1.0 )var utils = app.xpm.require('Utils' ); var url = utils.qrcode('/page/detail?id=1');console.log( url );
7 {. J- l  D' D  c1 `

3 ]' t9 q( z) c0 L& U三、微信小程序 Demo

小程序 Demo 源码

四、安装配置1. 云端配置

【安装后端程序】

推荐使用腾讯云( 访问微信接口快, 可以免费申请 Https 证书 )

方法1: 使用脚本安装 ( 目前仅支持 Ubuntu 14.04 64 LTS 操作系统

创建一台云服务器,选择 Ubuntu 14.04 64 LTS 操作系统。 登录服务器运行以下脚本。

安装前,先提前申请 Docker Hub 镜像 申请地址 [url]https://www.daocloud.io/mirror[/url]

curl -sSL http://tuanduimao.com/xpmjs-server.sh | sh -s yourdomain.com http://<your id>.m.daocloud.io
: k, c$ W; z* i# A0 h
& T, E1 j0 Z% z+ M1 h% D1 }$ C$ I

方法2: 使用 Docker 安装

docker run -d --name=xpmjs-server  \    -e "HOST=yourdomain.com" \    -v /host/data:/data  \    -v /host/apps:/apps  \    -v /host/config:/config  \    -p 80:80 -p 443:443  \    tuanduimao/xpmjs-server:1.0% m1 x6 w0 l% Q
- d1 I5 d; l/ T

【设置管理员名称和密码】

访问: http://yourdomian.com/setup.php

  • 填写后台信息

  • 填写管理员信息

    , ^7 x  k( N* A( N9 g: }

【上传 HTTPS 证书 & 微信支付证书】

访问:http://yourdomian.com/baas-admin/cert/index 上传 HTTPS 证书和证书密钥; 如已申请微信支付,建议尽量上传支付证书,用于双向验证证书和密钥,确保支付安全。

上传好证书后,登录服务器,重启容器。

docker restart xpmjs-server1 R; T9 J" I: e2 j
* R  U% @( N, F2 x

访问: https://yourdomian.com ( 有 "S", 检查证书是否生效 )

【设置小程序配置信息】

访问: https://yourdomian.com/baas-admin/conf/index ( 有 "S", 填写小程序和微信支付的信息 )

2. 使用 XpmJS

【下载代码】

使用 Git Bash , 进入小程序项目目录, 运行 git clone 拉去代码。(也可以 使用 Git 等客户端 Clone 代码 )

git clone https://git.oschina.net/xpmjs/xpmjs.git xpmjs
: I9 z9 A7 j7 g! k

3 ^4 O8 r( }* i8 S5 C" ^

克隆成功后的目录结构为:

【编写配置信息】

编辑 app.js 将域名更换为你的域名。( 必须配置好 Https 证书 )

App({  onLaunch: function () {    var that = this;    // 创建 xpm 对象    this.xpm = require('xpmjs/xpm.js').option({        'app':1,  // 对应后台 APP 配置,支持5个        'host':'yourdomian.com',        'https':'yourdomian.com',        'wss': 'yourdomian.com/ws-server',        'table.prefix': 'demo',        'user.table':'user'    });    // 创建全局对象    this.wss = this.xpm.require('wss');  // 信道    this.session = this.xpm.require('session');  // 会话    this.stor = this.xpm.require('stor'); // 存储  },  xpm:null,  session:null,  stor:null,  wss:null})
0 f0 X# Q) m! h6 M$ Q" e7 ~

, Y! f! j( G, D

建议将 xpm、wss、session、stor 设定为全局变量。更多示例参考 小程序Demo

下载地址:1 B* ~1 U0 }1 A
回复

使用道具 举报

精彩评论1

双人愚 发表于 2017-12-6 22:28:07 | 显示全部楼层
正需要,支持怪兽IT学院大人了!
回复 支持 反对

使用道具 举报

关注0

粉丝7

帖子7350

发布主题
推荐阅读 更多
阅读排行 更多
广告位
400-8888-8888
周一至周日 9:00-24:00
意见反馈:postmaster@guaishouxueyuan.net
关于我们

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2013 Comsenz Inc.