提交 4909acc0 编写于 作者: VK1688's avatar VK1688

1.7.0

上级 5f23562f
### uniCloud云函数路由框架研究Q群:22466457 如有问题或建议可以在群内讨论。
### 插件名称:`vk-unicloud-router`
### 作者:VK
### 更新时间:2021-01-15
### 更新时间:2021-01-25
## 主要功能 以及 对开发者的价值
#### 1、实现云函数路由模式
......@@ -11,6 +11,7 @@
1.3、部分通用的代码块可以放在公共区执行,类似公共函数的效果
1.4、可以在开发环境和生产环境中任意切换,开发时,用开发环境,开发过程中不会影响到线上环境。(具体切换方法在文档最后)
1.5、美化云函数请求过程中的日志排版,使请求日志一目了然。
1.6、可以强制关闭云端服务(适用于需要临时关闭后端服务的情况,如腾讯云迁移数据到阿里云时需要先关闭服务,否则迁移过程中会有新数据产生)
```
#### 2、实现`全局过滤器`,过滤非法请求
......@@ -32,7 +33,7 @@
#### 7、封装`uni.callFunction` 和 `uni.request` 使之合二为一 通过this.vk.callFunction 调用
#### 8、【1.2.2 新增】 `vk.baseDao`数据库工具包,使小白也能轻松上手对数据库的调用。
#### 8、【1.2.2 新增】 `vk.baseDao`数据库工具包,使小白也能轻松上手对数据库的调用。`1.7.0`起支持`数据库事务`
#### 9、【1.2.7 新增】 集成`uview-ui` UI框架(感谢`uview-ui`作者)。
......@@ -55,9 +56,13 @@
#### 16、【1.6.5 新增】美化云函数请求过程中的日志排版,使请求日志一目了然。
#### 17、作者亲自在群内解答框架使用问题,让你轻松上手`uniCloud云开发`。
#### 17、【1.7.0 新增】可以`强制关闭`云端服务(适用于需要临时关闭后端服务的情况,如腾讯云迁移数据到阿里云时需要先关闭服务,否则迁移过程中会有新数据产生)
#### 18、其他好处…
#### 18、【1.7.0 新增】全局数据缓存API,现在可以很方便的在云函数中使用缓存。 [点击查看详情](https://gitee.com/vk-uni/vk-uni-cloud-router/wikis/%E5%85%A8%E5%B1%80%E6%95%B0%E6%8D%AE%E7%BC%93%E5%AD%98vk.globalDataCache?sort_id=3442025)
#### 19、作者亲自在群内解答框架使用问题,让你轻松上手`uniCloud云开发`。
#### 20、其他好处…
##### 插件首页体验地址
......
### uniCloud 云函数路由研究群:22466457 如有问题或建议可以在群内讨论。
### 更新内容
#### 1、【升级】`vk-unicloud` 升级至 `1.11.0`
#### 2、【升级】`vk-unicloud-page` 升级至 `1.17.0`
#### 3、【新增】`vk.pubfn.getCurrentPage();` 可快速获取页面数据,如(完整路径、页面参数、vue实例等)
#### 4、【新增】`vk.pubfn.isNullOneByObject(obj)` 检测obj对象是否没有一个属性是空值,如果有空值,则返回首个是空值的属性名
#### 5、【新增】`vk.globalDataCache` 全局数据缓存API,现在可以很方便的在云函数中使用缓存。 [点击查看详情](https://gitee.com/vk-uni/vk-uni-cloud-router/wikis/%E5%85%A8%E5%B1%80%E6%95%B0%E6%8D%AE%E7%BC%93%E5%AD%98vk.globalDataCache?sort_id=3442025)
#### 6、【重要】`vk.baseDao`API自插件`1.7.0`版本开始不再需要传util参数了(为了向下兼容,即使传了也可以) [点击查看详情](https://gitee.com/vk-uni/vk-uni-cloud-router/wikis/%60vk.baseDao%60%E6%95%B0%E6%8D%AE%E5%BA%93API?sort_id=3065608)
#### 7、【重要】`vk.baseDao`API自插件`1.7.0`版本开始支持数据库事务 [点击查看详情](https://gitee.com/vk-uni/vk-uni-cloud-router/wikis/vk.baseDao%20%E4%BD%BF%E7%94%A8%E4%BA%8B%E5%8A%A1?sort_id=3454834)
#### 8、【重要】公共模块`config`新增配置`vk.system.serviceShutdown` 和 `vk.system.serviceShutdownDescription`
```
若serviceShutdow设置为true,则所有云函数无法访问(适用于需要临时关闭后端服务的情况,如迁移数据)
vk.system.serviceShutdownDescription为关闭服务时,对用户的提示。
```
#### 9、【重要】本次更新框架文件有以下部分改动
```js
1. 替换文件`router/dao/index.js`
2. 替换文件`router/dao/modules/userDao.js` 如有新增过方法需要部分替换
3. 替换目录`router/service/template`替换整个目录
```
#### 10、【重要提示】暂不要升级 `uni-id` 至`3.0` 版本,框架正在适配`uni-id 3.0`中!
#### 如有疑问,请加群:22466457 关于插件的问题包教包会!
### 你也可以在评论区发布留言交流心得。
\ No newline at end of file
......@@ -10,9 +10,9 @@
"integrity": "sha512-DqKc+qRrOZLPcyfWv4b0HspSS9n1Cd6BbgKiYEv9rjTAnWoqJV7rXsvWqZdr5iKGP5EMNbNS741GLNw4sIHbpw=="
},
"vk-unicloud-page": {
"version": "1.16.3",
"resolved": "https://registry.npmjs.org/vk-unicloud-page/-/vk-unicloud-page-1.16.3.tgz",
"integrity": "sha512-f3i1YxSzbK8FgG+IAU1qGfo3MF8tOE4rGmw4gSoX4mbRMZf2lkV+lqsgi7B+7tqh4g2anzr8vFbHyrcPRYy+YQ=="
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/vk-unicloud-page/-/vk-unicloud-page-1.17.0.tgz",
"integrity": "sha512-eAvbdx95og65P5QVs0FeRSsQ3/irj94RHI7IdapUjGChxxgaluIRxsHCDwSmFC2u4IFYOU4Dx/KvEqCuYR5lZA=="
}
}
}
......@@ -4,7 +4,7 @@
"description": "【开箱即用】vk-uniCloud-router - 云函数路由模式 - uniCloud开发框架 - 已集成uni-id",
"main": "main.js",
"dependencies": {
"vk-unicloud-page": "^1.16.3",
"vk-unicloud-page": "^1.17.0",
"uview-ui": "~1.8.3"
},
"devDependencies": {},
......
module.exports = {
"uni":{
"passwordSecret": "passwordSecret", // 加密密码所用的密钥
"tokenSecret": "tokenSecret", // 生成token所用的密钥
"passwordSecret": "passwordSecret", // 加密密码所用的密钥,修改会导致所用户之前的密码失效。如一定要修改,请查看https://uniapp.dcloud.io/uniCloud/uni-id?id=modifysecret
"tokenSecret": "tokenSecret", // 生成token所用的密钥,修改会导致所有用户之前的token失效。
"tokenExpiresIn": 2592000, // 全平台token过期时间,未指定过期时间的平台会使用此值
"tokenExpiresThreshold": 3600, // 新增于uni-id 1.1.7版本,checkToken时如果token有效期小于此值则自动获取新token,如果不配置此参数则不开启自动获取新token功能
"passwordErrorLimit": 6, // 密码错误最大重试次数
......@@ -48,6 +48,12 @@ module.exports = {
}
},
"vk":{
"system":{
// 若serviceShutdow:true,则所有云函数无法访问(适用于需要临时关闭后端服务的情况,如迁移数据)
// 注意:本地调试时,需要重新启动本地服务才能生效。
"serviceShutdown":false,
"serviceShutdownDescription":"系统维护中,预计2小时恢复!"
},
"service": {
// 邮箱发送服务
"email": {
......@@ -66,6 +72,7 @@ module.exports = {
"sms": {
// 阿里云短信服务
"aliyun": {
"enable":false, // 是否使用阿里云短信代替unicloud短信发送短信验证码
"accessKeyId": "", // 短信密钥key
"accessKeySecret": "", // 短信密钥secret
"endpoint":"https://dysmsapi.aliyuncs.com", // api请求地址
......
{
"name": "vk-unicloud",
"version": "1.9.5",
"version": "1.11.0",
"description": "【云函数端SDK】VK云函数路由模式uniCloud开发框架,在router目录下执行 npm i vk-unicloud 进行安装和升级",
"main": "index.js",
"homepage": "https://gitee.com/vk-uni/vk-uni-cloud-router.git",
......
......@@ -10,7 +10,7 @@ const daoCenter = require('./dao/index');
const requireFn = function(path){
return require(path);
}
const initRes = {
const initConfig = {
baseDir:__dirname, // 云函数根目录地址
requireFn,
config,
......@@ -24,4 +24,4 @@ const initRes = {
// }
};
module.exports = initRes;
module.exports = initConfig;
// 加载模块 - 数据库dao层 API
// 加载模块 - 数据库dao层 API 请勿改动此文件-----------------------------------
const modulesPath = __dirname+"/modules";
const fs = require('fs');
const fileList = fs.readdirSync(modulesPath);
......@@ -12,4 +12,12 @@ fileList.map((file, index) => {
modulesNames.map((modulesName, index) => {
moduleObj[modulesName] = require(modulesPath+"/"+modulesName);
});
module.exports = moduleObj;
\ No newline at end of file
moduleObj.init = function(obj){
modulesNames.map((modulesName, index) => {
if(typeof moduleObj[modulesName].init === "function"){
moduleObj[modulesName].init(obj);
}
});
}
module.exports = moduleObj;
// 加载模块 - 数据库dao层 API 请勿改动此文件-----------------------------------
\ No newline at end of file
......@@ -4,15 +4,19 @@
const dbName_user = "uni-id-users"; // 用户
var dao = {};
var util = {};
// 初始化
dao.init = function(obj){
util = obj;
}
/**
* 获取用户信息
* 调用示例
* await vk.daoCenter.userDao.findById(user_id, util);
* await vk.daoCenter.userDao.findById(user_id);
* data 请求参数说明
* @params {String} user_id 用户ID
* @params {Object} util 公共工具包
*/
dao.findById = async (user_id, util) => {
dao.findById = async (user_id) => {
let { vk , db, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
......@@ -20,7 +24,7 @@ dao.findById = async (user_id, util) => {
dbName:dbName_user,
id:user_id,
fieldJson:{ token:false, password:false },
},util);
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
......@@ -39,12 +43,11 @@ dao.findById = async (user_id, util) => {
* 调用示例
await vk.daoCenter.userDao.findByUserInfo({
mobile:mobile
}, util);
});
* data 请求参数说明
* @params {Object} userInfo 用户信息
* @params {Object} util 公共工具包
*/
dao.findByUserInfo = async (userInfo, util) => {
dao.findByUserInfo = async (userInfo) => {
let { vk , db, _ } = util;
let res;
// 数据库操作开始-----------------------------------------------------------
......@@ -75,11 +78,34 @@ dao.findByUserInfo = async (userInfo, util) => {
dbName:dbName_user,
fieldJson:{ token:false, password:false },
whereJson:whereJson
}, util);
});
}
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 根据ID数组获取用户列表 最多支持500个
* 调用示例
* await vk.daoCenter.userDao.listByIds(userIdArr);
* data 请求参数说明
* @params {Array} userIdArr 用户ID数组
*/
dao.listByIds = async (userIdArr) => {
let { vk , db, _ } = util;
let res = {};
let selectRes = await vk.baseDao.select({
dbName:dbName_user,
pageIndex:1,
pageSize:500,
fieldJson:{ token:false, password:false },
whereJson:{
_id:_.in(userIdArr)
},
});
res = selectRes.rows;
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 根据手机号直接注册账号并登录
* 若手机号已存在,则直接登录
......@@ -92,9 +118,9 @@ dao.findByUserInfo = async (userInfo, util) => {
* 调用示例
await vk.daoCenter.userDao.registerUserByMobile({
mobile,
}, util);
});
*/
dao.registerUserByMobile = async (data, util) => {
dao.registerUserByMobile = async (data) => {
let { vk , db, _, uniID } = util;
let res = {};
let {
......@@ -123,7 +149,7 @@ dao.registerUserByMobile = async (data, util) => {
needPermission
});
if(res.uid && vk.pubfn.isNull(res.userInfo)){
res.userInfo = await vk.daoCenter.userDao.findById(res.uid, util);
res.userInfo = await vk.daoCenter.userDao.findById(res.uid);
}
// 数据库操作结束-----------------------------------------------------------
return res;
......
// 加载模块 - 中间件
// 加载模块 - 中间件 请勿改动此文件-----------------------------------
const modulesPath = __dirname+"/modules";
const fs = require('fs');
const fileList = fs.readdirSync(modulesPath);
......@@ -19,4 +19,5 @@ var middlewareList = [];
moduleList.map((moduleItem, index) => {
middlewareList = middlewareList.concat(moduleItem);
});
module.exports = middlewareList;
\ No newline at end of file
module.exports = middlewareList;
// 加载模块 - 中间件 请勿改动此文件-----------------------------------
\ No newline at end of file
......@@ -10,7 +10,11 @@ module.exports = [
regExp: [
"^user/pub/login(.*)",
"^user/pub/register$",
"^user/kh/(.*)",
"^user/kh/bind(.*)",
"^user/kh/unbind(.*)",
"^user/kh/update(.*)",
"^user/kh/set(.*)",
"^user/kh/acceptInvite$"
],
description: "可用于指定哪些云函数需要返回给前端userInfo",
index: 210,
......
......@@ -27,7 +27,7 @@ module.exports = {
"_add_time": 1597456395010+i,
"user_id": "001"
}
}, event.util);
});
tasks.push(promise);
}
// 等待所有
......
......@@ -29,7 +29,7 @@ module.exports = {
"latitude":latitude,
},
}
},event.util);
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
......@@ -39,7 +39,7 @@ module.exports = {
await vk.baseDao.adds({
dbName:dbName,
dataJson:dataArr
},event.util);
});
let runTime2 = new Date().getTime();
let runTime = ((runTime2 - runTime1) / 1000 + "");
......
......@@ -19,7 +19,7 @@ module.exports = {
whereJson:{
}
},event.util);
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
......@@ -18,7 +18,7 @@ module.exports = {
whereJson:{
}
},event.util);
});
// 对应的sql:
// count * from vk-test
// 业务逻辑结束-----------------------------------------------------------
......
......@@ -23,7 +23,7 @@ module.exports = {
whereJson:{
user_id:_.neq("___")
}
},event.util);
});
// 对应的sql:
// delete from vk-test where user_id != '___'
// 业务逻辑结束-----------------------------------------------------------
......
......@@ -19,7 +19,7 @@ module.exports = {
fieldJson:{
}
},event.util);
});
// 上面的 fieldJson 可以设置 显示什么字段或设置不显示什么字段 如 money:false 代表不显示money字段
// 对应的sql:
// select * from vk-test where _id = "5f3a125b3d11c6000106d338"
......
......@@ -21,7 +21,7 @@ module.exports = {
whereJson:{
_id:data._id,
}
},event.util);
});
// 上面的 fieldJson 可以设置 显示什么字段或设置不显示什么字段 如 money:false 代表不显示money字段
// 对应的sql:
// select * from vk-test where _id = "5f3a125b3d11c6000106d338"
......
......@@ -24,7 +24,7 @@ module.exports = {
minDistance: 0 // 选填,最小距离,米为单位
})
},
}, event.util);
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
......@@ -65,7 +65,7 @@ module.exports = {
fieldJson:fieldJson,
whereJson:whereJson,
sortArr:sortArr
}, util);
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
......@@ -19,7 +19,7 @@ module.exports = {
whereJson:{
}
},event.util);
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
......@@ -19,7 +19,7 @@ module.exports = {
whereJson:{
}
},event.util);
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
......@@ -19,7 +19,7 @@ module.exports = {
whereJson:{
},
},event.util);
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
......@@ -20,7 +20,7 @@ module.exports = {
whereJson:{
user_id:"001"
},
}, event.util);
});
// 对应的sql:
// select * from vk-test where user_id == '001' limit 0,100;
// 业务逻辑结束-----------------------------------------------------------
......
module.exports = {
/**
* 连表查询(两表查询)(VK版本)
* 连表查询(仅限两表查询)(VK版本)
* @url template/db_api/pub/select2 前端调用的url参数地址
* data 请求参数 说明
* res 返回参数说明
......@@ -43,7 +43,7 @@ module.exports = {
sortArr:[{"name":"money", "type":"desc"}],
}
]
}, event.util);
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
......@@ -56,7 +56,7 @@ module.exports = {
sortArr:[{"name":"id", "type":"desc"}],
},
]
}, event.util);
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
......@@ -32,7 +32,7 @@ module.exports = {
limit:1
}
]
}, event.util);
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
......@@ -19,7 +19,7 @@ module.exports = {
whereJson:{
}
},event.util);
});
// 对应的sql:
// select sum(money) from vk-test
// 业务逻辑结束-----------------------------------------------------------
......
......@@ -13,14 +13,16 @@ module.exports = {
let { uid } = data;
let res = { code : 0, msg : 'ok' };
// 业务逻辑开始-----------------------------------------------------------
let { id = "___", dataJson } = data;
let { _id = "___" } = data;
res.num = await vk.baseDao.update({
dbName:"vk-test",
whereJson:{
_id:id,
_id:_id,
},
dataJson:dataJson
},event.util);
dataJson:{
money:1
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
module.exports = {
/**
* 缓存API演示
* @url template/db_api/sys/globalDataCache 前端调用的url参数地址
* data 请求参数 说明
* res 返回参数说明
* @params {Number} code 错误码,0表示成功
* @params {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, originalParam } = event;
let { uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : 'ok' };
// 业务逻辑开始-----------------------------------------------------------
let { mode, key, value, second } = data;
if(mode === "get"){
// 获取缓存
res = await vk.globalDataCache.get(key);
}else if(mode === "set"){
// 设置缓存
res = await vk.globalDataCache.set({
key:key,
value:value,
second:second
});
}else if(mode === "del"){
// 删除缓存
res = await vk.globalDataCache.del(key);
}else if(mode === "clear"){
// 清空缓存
res = await vk.globalDataCache.clear(key);
}else if(mode === "list"){
// 缓存列表
res = await vk.globalDataCache.list({
pageIndex:1,
pageSize:100,
whereJson:{
}
});
}else if(mode === "count"){
// 缓存数量
res = await vk.globalDataCache.count();
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
'use strict';
module.exports = {
/**
* 事务使用示例 - 两个账户之间进行转账的简易示例
* @url template/db_api/sys/transaction 前端调用的url参数地址
* data 请求参数 说明
* res 返回参数说明
* @params {Number} code 错误码,0表示成功
* @params {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, originalParam } = event;
let { customUtil, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
// 可写与数据库的交互逻辑等等
// 开启事务
const transaction = await vk.baseDao.startTransaction();
try {
let dbName = "uni-id-users";
let money = 100;
// 给用户001减100余额
let update1Res = await vk.baseDao.updateById({
db:transaction,
dbName,
id:"001",
dataJson:{
account_balance:_.inc(money * -1)
},
});
// 给用户2加100余额
let update2Res = await vk.baseDao.updateById({
db:transaction,
dbName,
id:"002",
dataJson:{
account_balance:_.inc(money)
},
});
const endRes = await vk.baseDao.findById({
db:transaction,
dbName,
id:"001"
});
if (endRes.account_balance < 0) {
transaction.rollback(-100);
return {
code:-1,
msg:"用户001账户余额不足",
aaaAccount: endRes.account_balance
}
}else{
// 提交事物
await transaction.commit();
console.log(`transaction succeeded`);
return {
code:0,
msg:"转账成功",
aaaAccount: endRes.account_balance
}
}
}catch (err) {
// 事务回滚
await transaction.rollback();
console.error(`transaction error`, err)
return {
code: -1,
msg:"数据库写入异常,事务已回滚",
err: {
message:err.message,
stack:err.stack
}
}
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
......@@ -19,9 +19,6 @@ module.exports = {
let res = { code : 0, msg : '' };
// 绑定
res = await uniID.bindAlipay(event.data);
if(res.code === 0){
res.userInfo = await vk.daoCenter.userDao.findById(uid, util);
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
......@@ -19,9 +19,6 @@ module.exports = {
let res = { code : 0, msg : '' };
// 绑定
res = await uniID.bindWeixin(event.data);
if(res.code === 0){
res.userInfo = await vk.daoCenter.userDao.findById(uid, util);
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
......@@ -3,20 +3,15 @@ module.exports = {
* 获取接受邀请的用户清单
* @url user/kh/getInvitedUser 前端调用的url参数地址
* @description 此接口用于在其他接口不满足需求时使用
* @params {Object} data 请求参数
* @params {String} uniIdToken 用户token
* @params {Object} util 公共工具包
* data 请求参数 说明
* @params {String} uid 当前登录用户id,若用户已登录且token有效,则data中会带uid参数
* (此参数是后端过滤器通过token获取并添加到data中的,是可信任的)
* @params {Number} level 指定获取第几级邀请用户,默认1
* @params {Number} limit 指定返回列表长度,默认20
* @params {Number} offset 指定列表偏移量,默认0
* @params {Number} needTotal 是否需要返回总数,默认false
* @params {Number} pageIndex 第几页
* @params {Number} pageSize 每页显示数量
* @params {Number} getCount 是否需要返回总数,默认false
* res 返回参数说明
* @params {Number} code 错误码,0表示成功
* @params {String} msg 详细信息
* @params {Array} invitedUser 邀请的用户列表
* @params {Array} rows 邀请的用户列表
* invitedUser每项结构
* @params {String} username 被邀请者用户名
* @params {String} mobile 被邀请者手机号
......@@ -26,15 +21,24 @@ module.exports = {
main: async (event) => {
let { data = {}, util, originalParam } = event;
let { uniID } = util;
let { uid, limit, offset, needTotal } = data;
let res = {};
let { uid } = data;
let res = { code:0, msg:"" };
// 业务逻辑开始-----------------------------------------------------------
res = await uniID.getInvitedUser({
let { pageIndex = 1, pageSize = 20, getCount = false } = data;
let limit = pageSize;
let offset = (pageIndex - 1) * pageSize;
let getInvitedUserRes = await uniID.getInvitedUser({
uid:uid,
limit:limit,
offset:offset,
needTotal:needTotal
needTotal:getCount
});
res.rows = getInvitedUserRes.invitedUser;
res.code = getInvitedUserRes.code;
res.msg = getInvitedUserRes.msg;
if(res.code === 0 && res.rows && res.rows.length === pageSize){
res.hasMore = true;
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
......@@ -26,6 +26,7 @@ module.exports = {
// 业务逻辑开始-----------------------------------------------------------
let tokenRes = await uniID.checkToken(event.uniIdToken);
let { permission } = tokenRes;
userInfo.permission = permission;
res.userInfo = userInfo;
if(vk.pubfn.isNotNull(permission)){
let perRes = await vk.baseDao.select({
......@@ -36,54 +37,20 @@ module.exports = {
type : 0
},
sortArr:[{"name":"sort","type":"asc"}]
}, event.util);
});
// 将子菜单合并到父菜单的children字段中
for(let i in perRes.rows){
perRes.rows[i].menu_id = perRes.rows[i].permission_id;
perRes.rows[i].name = perRes.rows[i].permission_name;
}
res.menus = buildMenus(perRes.rows);
res.menus = vk.pubfn.arrayToTree(perRes.rows,{
id:"menu_id",
parent_id:"parent_id",
children:"children",
});
res.menuList = perRes.rows;
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
function buildMenus(menuList) {
// 保证父子级顺序
menuList = menuList.sort(function(a, b) {
if (a.parent_id === b.permission_id) {
return 1
}
return -1
})
// 删除无subMenu且无url的菜单项
for (let i = menuList.length - 1; i > -1; i--) {
const currentMenu = menuList[i]
const subMenu = menuList.filter(subMenuItem => subMenuItem.parent_id === currentMenu.permission_id)
if (!currentMenu.url && !subMenu.length) {
menuList.splice(i, 1)
}
}
const menu = menuList.filter(item => !item.parent_id)
function buildMenu(menu) {
let nextLayer = []
for (let i = menu.length - 1; i > -1; i--) {
const currentMenu = menu[i]
if (currentMenu.url) {
continue
}
const subMenu = menuList.filter(item => item.parent_id === currentMenu.permission_id)
nextLayer = nextLayer.concat(subMenu)
currentMenu.children = subMenu
}
if (nextLayer.length) {
buildMenu(nextLayer)
}
}
buildMenu(menu)
return menu
}
\ No newline at end of file
......@@ -9,7 +9,7 @@ module.exports = {
let { uniID, vk, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
res.userInfo = await vk.daoCenter.userDao.findById(uid, util);
res.userInfo = await vk.daoCenter.userDao.findById(uid);
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
......@@ -20,9 +20,6 @@ module.exports = {
let res = { code : 0, msg : '' };
// 解绑
res = await uniID.unbindAlipay(event.data);
if(res.code === 0){
res.userInfo = await vk.daoCenter.userDao.findById(uid, util);
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
......@@ -19,10 +19,7 @@ module.exports = {
let { uid } = data;
let res = { code : 0, msg : '' };
// 解绑
res = await uniID.unbindWeixin(event.data);
if(res.code === 0){
res.userInfo = await vk.daoCenter.userDao.findById(uid, util);
}
res = await uniID.unbindWeixin(uid);
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
......@@ -20,7 +20,7 @@ module.exports = {
let res = {};
// 业务逻辑开始-----------------------------------------------------------
// 允许修改的字段列表
let updateKeys = ["nickname","avatar","gender"];
let updateKeys = ["nickname","avatar","gender","social_info"];
let dataJson = {};
for(let i in updateKeys){
let key = updateKeys[i];
......
......@@ -3,9 +3,7 @@ module.exports = {
* 验证token是否有效
* @url user/pub/checkToken 前端调用的url参数地址
* @description 验证token是否有效(会返回uid)
* @params {Object} data 请求参数
* @params {String} uniIdToken 用户token
* @params {Object} util 公共工具包
* res 返回参数说明
* @params {Number} code 错误码,0表示成功
* @params {String} msg 详细信息
......
......@@ -15,7 +15,6 @@ module.exports = {
let {uniID} = event.util;
let res = {};
// 业务逻辑开始-----------------------------------------------------------
// 验证token是否有效(会返回uid)
const password = await uniID.encryptPwd('123456');
res = {
code: 0,
......
......@@ -19,6 +19,7 @@ module.exports = {
let res = {};
// 业务逻辑开始-----------------------------------------------------------
// 用户登录(账号+密码)
res = await uniID.login({
...event.data,
// 不指定queryField的情况下只会查询username
......
......@@ -18,7 +18,10 @@ module.exports = {
let { uid } = data;
let res = {};
// 业务逻辑开始-----------------------------------------------------------
res = await uniID.loginByAlipay(event.data);
let { code, needPermission } = data;
res = await uniID.loginByAlipay({
code, needPermission
});
if(res.token){
// 日志服务
const loginLogService = vk.require("service/user/util/login_log");
......
......@@ -18,7 +18,10 @@ module.exports = {
let { uid } = data;
let res = {};
// 业务逻辑开始-----------------------------------------------------------
res = await uniID.loginByEmail(event.data);
let { email, code, type, password, needPermission } = data;
res = await uniID.loginByEmail({
email, code, type, password, needPermission
});
if(res.token){
// 日志服务
const loginLogService = vk.require("service/user/util/login_log");
......
......@@ -18,10 +18,24 @@ module.exports = {
let { uid } = data;
let res = {};
// 业务逻辑开始-----------------------------------------------------------
res = await uniID.loginBySms(event.data);
let { mobile, code, password, inviteCode, needPermission, type } = data;
// 正式上线请删除该代码-----------------------------------------------------------
if(code === "888888" && inviteCode === "888888"){
// 设置验证码
await uniID.setVerifyCode({
mobile,
code,
expiresIn:60,
type
});
}
// 正式上线请删除该代码-----------------------------------------------------------
res = await uniID.loginBySms({
type, mobile, code, password, inviteCode, needPermission
});
// 修改用户昵称为:手机尾号xxxx用户
if(res.token){
let mobileStr = event.data.mobile.substring(7);
let mobileStr = mobile.substring(7);
await vk.baseDao.update({
dbName:"uni-id-users",
whereJson:{
......@@ -31,7 +45,7 @@ module.exports = {
dataJson:{
nickname:`手机尾号${mobileStr}用户`
}
},event.util);
});
// 日志服务
const loginLogService = vk.require("service/user/util/login_log");
await loginLogService.add({
......
......@@ -19,7 +19,10 @@ module.exports = {
let res = {};
// 业务逻辑开始-----------------------------------------------------------
// 微信登录(未绑定任何账号时,会新建账号)
res = await uniID.loginByWeixin(event.data);
let { code, needPermission } = data;
res = await uniID.loginByWeixin({
code, needPermission
});
if(res.token){
// 日志服务
const loginLogService = vk.require("service/user/util/login_log");
......
......@@ -16,9 +16,10 @@ module.exports = {
main: async (event) => {
let { data = {}, userInfo, util, originalParam } = event;
let { uniID, config, pubFun, vk , db, _ } = util;
let { uid, username, password } = data;
let { uid } = data;
let res = { code : -1, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
let { username, password, needPermission } = data;
// username必须以字母开头,长度在6~18之间,只能包含字母、数字和下划线
if(!vk.pubfn.test(username,"username")){
return { code : -1, msg : "账号必须以字母开头,长度在6~18之间,只能包含字母、数字和下划线" };
......@@ -27,7 +28,9 @@ module.exports = {
if(!vk.pubfn.test(password,"pwd")){
return { code : -1, msg : "密码长度在6~18之间,只能包含字母、数字和下划线" };
}
res = await uniID.register(event.data);
res = await uniID.register({
username, password, needPermission
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
......
......@@ -3,11 +3,6 @@ module.exports = {
* 根据手机+手机号重置密码
* @url user/pub/resetPasswordByMobile 前端调用的url参数地址
* @description 此函数描述
* @params {Object} data 请求参数
* @params {String} uniIdToken 用户token
* @params {String} userInfo 当前登录用户信息(同理,是可信任的)(只有kh函数才带此参数)
* @params {Object} util 公共工具包
* @params {Object} originalParam 原始请求参数(包含了原始event和context)
* data 请求参数 说明
* @params {String} password 重置后的密码
* @params {String} code 验证码
......
......@@ -7,9 +7,6 @@ module.exports = {
* 发送邮箱验证码
* @url user/pub/sendEmailCode 前端调用的url参数地址
* @description 发送邮箱验证码
* @params {Object} data 请求参数
* @params {String} uniIdToken 用户token
* @params {Object} util 公共工具包
* data 请求参数 说明
* @params {String} email 邮箱
* @params {String} type 验证码类型
......
......@@ -33,7 +33,7 @@ module.exports = {
provider : "aliyun",
mobile : mobile,
code : code,
}, event.util);
});
if(sendSmsRes.code != 0){
return {
code : -1,
......
module.exports = {
/**
* 设置验证码
* @url user/pub/setVerifyCode 前端调用的url参数地址
* @description 设置验证码
* @params {Object} data 请求参数
* @params {String} uniIdToken 用户token
* @params {Object} util 公共工具包
* @url user/sys/setVerifyCode 前端调用的url参数地址
* @description 设置验证码(此接口正式环境不要暴露,故写在了sys目录下)
* data 请求参数 说明
* @params {String} email 邮箱
* @params {String} mobile 手机号
......
module.exports = {
/**
* 此函数名称
* @url user/sys/test1 前端调用的url参数地址
* @description 此函数描述
* @params {Object} data 请求参数
* @params {String} uniIdToken 用户token
* @params {Object} util 公共工具包
* data 请求参数 说明
* @params {String} username 用户名,唯一
* @params {String} password 密码
* res 返回参数说明
* @params {Number} code 错误码,0表示成功
* @params {String} msg 详细信息
* @params {String} token 注册完成自动登录之后返回的token信息
* @params {String} tokenExpired token过期时间
*/
main: async (event) => {
let {uniID} = event.util;
let res = {code :-1, msg : ''};
// 业务逻辑开始-----------------------------------------------------------
// res = await uniID.loginByAlipay(event.data.code);
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
\ No newline at end of file
......@@ -23,9 +23,9 @@ module.exports = {
dbName:"uni-id-log",
dataJson:{
type, login_type, user_id,
ip, ua, os, platform, context
ip, ua, os, platform
}
},util);
});
}catch(err){
console.log("日志写入错误");
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册