From 4909acc0c49578e74ac10364445323f7a9b5e35c Mon Sep 17 00:00:00 2001 From: VK <370725567@qq.com> Date: Mon, 25 Jan 2021 12:44:20 +0800 Subject: [PATCH] 1.7.0 --- README.md | 13 ++- README/1.7/1.7.0.md | 23 ++++++ package-lock.json | 6 +- package.json | 2 +- .../cloudfunctions/common/config/index.js | 11 ++- .../common/vk-unicloud/index.js | 2 +- .../common/vk-unicloud/package.json | 2 +- .../cloudfunctions/router/config.js | 4 +- .../cloudfunctions/router/dao/index.js | 12 ++- .../router/dao/modules/userDao.js | 48 ++++++++--- .../cloudfunctions/router/middleware/index.js | 5 +- .../modules/returnUserInfoFilter.js | 6 +- .../template/db_api/pub/Promise.all.js | 2 +- .../router/service/template/db_api/pub/add.js | 2 +- .../service/template/db_api/pub/adds.js | 2 +- .../router/service/template/db_api/pub/avg.js | 2 +- .../service/template/db_api/pub/count.js | 2 +- .../router/service/template/db_api/pub/del.js | 2 +- .../service/template/db_api/pub/findById.js | 2 +- .../template/db_api/pub/findByWhereJson.js | 2 +- .../router/service/template/db_api/pub/geo.js | 2 +- .../service/template/db_api/pub/getList.js | 2 +- .../router/service/template/db_api/pub/max.js | 2 +- .../router/service/template/db_api/pub/min.js | 2 +- .../service/template/db_api/pub/sample.js | 2 +- .../service/template/db_api/pub/select.js | 2 +- .../service/template/db_api/pub/select2.js | 4 +- .../service/template/db_api/pub/selects.js | 2 +- .../template/db_api/pub/selects_mode_2.js | 2 +- .../router/service/template/db_api/pub/sum.js | 2 +- .../service/template/db_api/pub/update.js | 10 ++- .../template/db_api/sys/globalDataCache.js | 49 ++++++++++++ .../template/db_api/sys/transaction.js | 79 +++++++++++++++++++ .../router/service/user/kh/bindAlipay.js | 3 - .../router/service/user/kh/bindWeixin.js | 3 - .../router/service/user/kh/getInvitedUser.js | 30 ++++--- .../router/service/user/kh/getMenu.js | 47 ++--------- .../router/service/user/kh/getMyUserInfo.js | 2 +- .../router/service/user/kh/unbindAlipay.js | 3 - .../router/service/user/kh/unbindWeixin.js | 5 +- .../router/service/user/kh/updateUser.js | 2 +- .../router/service/user/pub/checkToken.js | 2 - .../router/service/user/pub/encryptPwd.js | 1 - .../router/service/user/pub/login.js | 1 + .../router/service/user/pub/loginByAlipay.js | 5 +- .../router/service/user/pub/loginByEmail.js | 5 +- .../router/service/user/pub/loginBySms.js | 20 ++++- .../router/service/user/pub/loginByWeixin.js | 5 +- .../router/service/user/pub/register.js | 7 +- .../service/user/pub/resetPasswordByMobile.js | 5 -- .../router/service/user/pub/sendEmailCode.js | 3 - .../router/service/user/pub/sendSmsCode.js | 2 +- .../user/{pub => sys}/setVerifyCode.js | 7 +- .../router/service/user/sys/test1.js | 26 ------ .../router/service/user/util/login_log.js | 4 +- 55 files changed, 324 insertions(+), 174 deletions(-) create mode 100644 README/1.7/1.7.0.md create mode 100644 uniCloud-aliyun/cloudfunctions/router/service/template/db_api/sys/globalDataCache.js create mode 100644 uniCloud-aliyun/cloudfunctions/router/service/template/db_api/sys/transaction.js rename uniCloud-aliyun/cloudfunctions/router/service/user/{pub => sys}/setVerifyCode.js (79%) delete mode 100644 uniCloud-aliyun/cloudfunctions/router/service/user/sys/test1.js diff --git a/README.md b/README.md index 8ea8de1..d2effca 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ### 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、其他好处… ##### 插件首页体验地址 diff --git a/README/1.7/1.7.0.md b/README/1.7/1.7.0.md new file mode 100644 index 0000000..519e980 --- /dev/null +++ b/README/1.7/1.7.0.md @@ -0,0 +1,23 @@ +### 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 diff --git a/package-lock.json b/package-lock.json index b3d1229..ab447c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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==" } } } diff --git a/package.json b/package.json index 4c308c1..9f4589d 100644 --- a/package.json +++ b/package.json @@ -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": {}, diff --git a/uniCloud-aliyun/cloudfunctions/common/config/index.js b/uniCloud-aliyun/cloudfunctions/common/config/index.js index d1c78d9..711927f 100644 --- a/uniCloud-aliyun/cloudfunctions/common/config/index.js +++ b/uniCloud-aliyun/cloudfunctions/common/config/index.js @@ -1,7 +1,7 @@ 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请求地址 diff --git a/uniCloud-aliyun/cloudfunctions/common/vk-unicloud/index.js b/uniCloud-aliyun/cloudfunctions/common/vk-unicloud/index.js index 3c80646..9084781 100644 --- a/uniCloud-aliyun/cloudfunctions/common/vk-unicloud/index.js +++ b/uniCloud-aliyun/cloudfunctions/common/vk-unicloud/index.js @@ -1 +1 @@ -"use strict";var e={main:async e=>{let{uniID:t}=e.util,n={code:-1,msg:""},i=await t.checkToken(e.uniIdToken);if(i.code&&i.code>0)return i;let a=i.userInfo;return delete a.token,delete a.password,n.uid=i.uid,n.userInfo=a,i.token&&(n.token=i.token,n.tokenExpired=i.tokenExpired),n.code=0,n.msg="ok",n}},t=[{id:"pub",regExp:"/pub/",description:"pub函数为所有人都可以访问的函数",index:100,mode:"onActionExecuting",main:async function(t){let n={};return t.data.need_user_info&&(n=await e.main(t)),n.code=0,n.msg="ok",n}},{id:"kh",regExp:"/kh/",description:"kh函数为必须登录后才能访问的函数(客户端用户)",index:200,mode:"onActionExecuting",main:e.main},{id:"sys",regExp:"/sys/",description:"sys函数为后端管理人员才能访问的函数(商家后台工作人员)",index:300,mode:"onActionExecuting",main:{main:async t=>{let{url:n,util:i}=t,{uniID:a,config:r,pubFun:o,vk:l,db:s,_:d}=i,u={code:-1,msg:""};const c=e;if(u=await c.main(t),0!==u.code)return u;if(!u.userInfo.allow_login_background)return{code:403,msg:"您无权限登录后台"};if(l.pubfn.isNotNull(u.userInfo.role)&&u.userInfo.role.includes("admin"))return u;let f=await l.baseDao.select({dbName:"uni-id-roles",whereJson:{role_id:d.in(u.userInfo.role),enable:!0},fieldJson:{permission:!0}},t.util),g=[];for(let e in f.rows){let t=f.rows[e].permission;l.pubfn.isNotNull(t)&&(g=g.concat(t))}return 0==g.length||await l.baseDao.count({dbName:"uni-id-permissions",whereJson:{permission_id:d.in(g),enable:!0,url:n}},t.util)<=0?{code:403,msg:"权限不足"}:(u.code=0,u.msg="ok",u)}}.main}];var n=function(e){let n=[];if(e){let i=[...t,...e];i.sort((function(e,t){return e.index-t.index})),n=i.filter((e,t,n)=>{var a=[];return i.forEach((e,t)=>{a.push(e.id)}),a.indexOf(e.id)===t})}else n=t;return n},i={regExpTest:function(e,t){let n=!1;if("string"==typeof e){new RegExp(e).test(t)&&(n=!0)}else if("object"==typeof e)for(let i=0;i{let i={code:403,msg:"access denied",filterStack:[]},{url:r}=e;const o=n(t);for(let t in o){let n=o[t],{mode:l="onActionExecuting",enable:s=!0}=n;if("onActionExecuting"===l&&(s&&a.regExpTest(n.regExp,r))){e.filterResponse=i;let t=await n.main(e);if(t.filterId=n.id,i.filterStack.push(t),0!==t.code){i=t;break}i=Object.assign(i,t)}}return i},o=async(e,t,i)=>{let{url:r}=e;const o=n(t);for(let t in o){let n=o[t],{mode:l="onActionExecuting",enable:s=!0}=n;if("onActionExecuted"===l&&(s&&a.regExpTest(n.regExp,r))){let t=await n.main(e,i);if(t){if(0!==t.code){i=t;break}i=Object.assign(i,t)}}}return i};process.env.TZ="Asia/Shanghai";var l=async function(e){let t,{event:n,context:i,vk:a}=e,{config:l,uniID:s,uniPay:d,db:u,middlewareService:c,pubFun:f,customUtil:g}=a.config,p={event:n,context:i},y=a.getQueryStringParameters(n),{url:m,data:h,uniIdToken:w}=y,_={url:m,data:h,uniIdToken:w,util:{vk:a,config:l,pubFun:f,uniID:s,uniPay:d,db:u,customUtil:g,_:u.command},originalParam:p},b=await r(_,c);if(0!==b.code)return b;b.uid&&(h.uid=b.uid),_.filterResponse=b;try{t=a.require("service/"+m)}catch(e){return e&&"MODULE_NOT_FOUND"==e.code?(console.error(`云函数 ${m} 不存在!`,e),{code:404,msg:`云函数 ${m} 不存在!`,err:{message:e.message,stack:e.stack}}):(console.error(`云函数 ${m} 编译异常!`,e),{code:500,msg:`云函数 ${m} 编译异常!`,err:{message:e.message,stack:e.stack}})}let x=await async function(e={}){let{res:t,serviceParam:n,serviceMain:i}=e;t.uid&&(n.uid=t.uid);t.userInfo&&(n.userInfo=t.userInfo);let a=await i.main(n);t.token&&"object"==typeof a&&(a.vk_uni_token={token:t.token,tokenExpired:t.tokenExpired});return a}({res:b,serviceParam:_,serviceMain:t});return x=await o(_,c,x),x};function s(e,t,n,i,a,r){return g((o=g(g(t,e),g(i,r)))<<(l=a)|o>>>32-l,n);var o,l}function d(e,t,n,i,a,r,o){return s(t&n|~t&i,e,t,a,r,o)}function u(e,t,n,i,a,r,o){return s(t&i|n&~i,e,t,a,r,o)}function c(e,t,n,i,a,r,o){return s(t^n^i,e,t,a,r,o)}function f(e,t,n,i,a,r,o){return s(n^(t|~i),e,t,a,r,o)}function g(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}var p=function(e){return function(e){for(var t="",n=0;n<4*e.length;n++)t+="0123456789abcdef".charAt(e[n>>2]>>n%4*8+4&15)+"0123456789abcdef".charAt(e[n>>2]>>n%4*8&15);return t}(function(e,t){e[t>>5]|=128<>>9<<4)]=t;for(var n=1732584193,i=-271733879,a=-1732584194,r=271733878,o=0;o>5]|=(255&e.charCodeAt(n/8))<100)return await y.selectAll(e,t);let l=await y.getSelectData(e,t),{result:s,hasMore:d,total:u,getCount:c,pageIndex:f}=l;return s=s.skip((f-1)*o).limit(o),s.get().then(e=>{let t={};return c?(t.hasMore=d,t.total=u):(t.total=e.data?e.data.length:0,t.hasMore=t.total>=o),t.rows=e.data,t.code=0,t.key=1,t.pageIndex=f,t.pageSize=o,t})},findById:async function(e,t){let{db:n,_:i}=t,{dbName:a,id:r,fieldJson:o}=e;try{let e=n.collection(a).doc(r);return o&&(e=e.field(o)),(await e.get()).data[0]}catch(e){return console.error(e),null}},findByWhereJson:async function(e,t){let{db:n,_:i}=t,{dbName:a,whereJson:r,fieldJson:o}=e;try{if(r&&"{}"!==JSON.stringify(r)){let e=n.collection(a).where(r);o&&(e=e.field(o));let t=await e.limit(1).get();if(t.data&&t.data.length>0)return t.data[0]}else console.error("whereJson条件不能为空")}catch(e){console.error(e)}return null},count:async function(e,t){let{db:n,_:i}=t,{dbName:a,whereJson:r}=e;r&&"{}"!==JSON.stringify(r)||(r={_id:i.neq("___")});try{return(await n.collection(a).where(r).count()).total}catch(e){return console.error(e),null}},select2:async function(e,t){let{foreignKeyType:n="many-to-one"}=e;return"many-to-one"===n?await y.select2_ManyToOne(e,t):"one-to-many"===n?await y.select2_OneToMany(e,t):(console.error("不支持的foreignKeyType"),{})},count2_ManyToOne:async function(e,t){let{db:n,_:i,vk:a}=t,{dbName:r,dbName2:o,foreignKey:l="_id",foreignKey2:s="_id",whereJson:d={},whereJson2:u={},pageIndex:c=1,pageSize:f=10,getCount:g=!1,sortArr:p={},fieldJson:y={},fieldJson2:m={},as:h}=e;h||(h=o),"{}"===JSON.stringify(d)&&(d={_id:i.neq("___")});i.aggregate;let w=n.collection(r).aggregate();if(d&&"{}"!==JSON.stringify(d)&&(w=w.match(d)),y&&"{}"!==JSON.stringify(y)&&(w=w.project(y)),p&&"{}"!==JSON.stringify(p)){let e={};for(let t in p){let n=p[t],i=n.name,a=n.type;a=null==a||""==a||"asc"==a?1:-1,e[i]=a}w=w.sort(e)}let _={from:o,localField:l,foreignField:s,as:h};if(w=w.lookup(_),m&&"{}"!==JSON.stringify(m)){let e={};for(let t in m)e[h+"."+t]=m[t];w=w.project(e)}if(u&&"{}"!==JSON.stringify(u)){let e={};for(let t in u)e[h+"."+t]=u[t];w=w.match(e)}let b=await w.count("total").end();try{return b.data[0].total}catch(e){return console.log(e),0}},select2_ManyToOne:async function(e,t){let{db:n,_:i,vk:a}=t,{dbName:r,dbName2:o,foreignKey:l="_id",foreignKey2:s="_id",whereJson:d={},whereJson2:u={},pageIndex:c=1,pageSize:f=10,getCount:g=!1,sortArr:p=[],fieldJson:y={},fieldJson2:m={},as:h,whereJsonPub:w={}}=e;h||(h=o),"{}"===JSON.stringify(d)&&(d={_id:i.neq("___")}),-1==f&&(c=1,f=999999999,g=!1);let _=0,b=!1;if(g){_=(await n.collection(r).where(d).count()).total,c0?J[e][h]=J[e][h][0]:J[e][h]={};return g?(x.hasMore=b,x.total=_):(x.total=J?J.length:0,x.hasMore=_>=f),x.rows=J,x.code=0,x.key=1,x},select2_OneToMany:async function(e,t){let{db:n,_:i,vk:a}=t,{dbName:r,dbName2:o,foreignKey:l="_id",foreignKey2:s="_id",whereJson:d={},whereJson2:u={},pageIndex:c=1,pageSize:f=10,getCount:g=!1,sortArr:p=[],sortArr2:y=[],fieldJson:m={},fieldJson2:h={},as:w}=e;w||(w=o),"{}"===JSON.stringify(d)&&(d={_id:i.neq("___")}),-1==f&&(c=1,f=999999999,g=!1);let _=0,b=!1;if(g){_=(await n.collection(r).where(d).count()).total,c=f),x.rows=J,x.code=0,x.key=1,x},getSelectData:async function(e,t){let{db:n,_:i}=t,{dbName:a,whereJson:r,pageIndex:o=1,pageSize:l=10,getCount:s=!1}=e;r&&"{}"!==JSON.stringify(r)||(r={_id:i.neq("___")}),l<0&&(o=1,l=999999999,s=!0);let d=e.sortArr,u=e.fieldJson,c=0,f=!1;if(s){c=(await n.collection(a).where(r).count()).total,o0&&!c&&!f&&(c=p);let m={};if(f&&0===c)m={data:[]};else{let t=c;pr&&(n=r-t);let o=d.skip(t).limit(n).get();i.push(o)}try{m=(await Promise.all(i)).reduce((e,t)=>({data:e.data.concat(t.data),errMsg:e.errMsg}))}catch(t){console.error("selectAll-异常",e,t),m={data:[]}}}return o.rows=m.data,o.key=1,o.code=0,o.hasMore=u,o.pageIndex=g,o.pageSize=p,o.total=f?c:m.data?m.data.length:0,o},sum:async function(e,t){let{db:n,_:i}=t,{dbName:a,fieldName:r,whereJson:o}=e;o&&"{}"!==JSON.stringify(o)||(o={_id:i.neq("___")});const l=n.command.aggregate;try{let e=await n.collection(a).aggregate().match(o).group({_id:null,num:l.sum("$"+r)}).end();return e.data&&e.data[0]?e.data[0].num:0}catch(e){return console.error(e),null}},avg:async function(e,t){let{db:n,_:i}=t,{dbName:a,fieldName:r,whereJson:o}=e;o&&"{}"!==JSON.stringify(o)||(o={_id:i.neq("___")});const l=n.command.aggregate;try{let e=await n.collection(a).aggregate().match(o).group({_id:null,num:l.avg("$"+r)}).end();return e.data&&e.data[0]?e.data[0].num:null}catch(e){return console.error(e),null}},max:async function(e,t){let{db:n,_:i}=t,{dbName:a,fieldName:r,whereJson:o}=e;o&&"{}"!==JSON.stringify(o)||(o={_id:i.neq("___")});const l=n.command.aggregate;try{let e=await n.collection(a).aggregate().match(o).group({_id:null,num:l.max("$"+r)}).end();return e.data&&e.data[0]?e.data[0].num:null}catch(e){return console.error(e),null}},min:async function(e,t){let{db:n,_:i}=t,{dbName:a,fieldName:r,whereJson:o}=e;o&&"{}"!==JSON.stringify(o)||(o={_id:i.neq("___")});const l=n.command.aggregate;try{let e=await n.collection(a).aggregate().match(o).group({_id:null,num:l.min("$"+r)}).end();return e.data&&e.data[0]?e.data[0].num:null}catch(e){return console.error(e),null}},sample:async function(e,t){let{db:n,_:i}=t,{dbName:a,whereJson:r,size:o}=e;r&&"{}"!==JSON.stringify(r)||(r={_id:i.neq("___")});n.command.aggregate;try{return(await n.collection(a).aggregate().match(r).sample({size:o}).end()).data}catch(e){return console.error(e),null}},updateById:async function(e,t){let{db:n,_:i}=t,{dbName:a,id:r,dataJson:o}=e,l=0,s=await n.collection(a).doc(r).update(o);return s?l=s.updated:(console.error(s.errMsg),l=0),l},selects:async function(e,t){let{db:n,_:i,vk:a}=t,{dbName:r,foreignKey:o="_id",whereJson:l={},pageIndex:s=1,pageSize:d=10,getCount:u=!1,sortArr:c=[],fieldJson:f={},foreignDB:g=[]}=e;"{}"===JSON.stringify(l)&&(l={_id:i.neq("___")}),-1==d&&(s=1,d=999999999,u=!1);let p=0,y=!1;if(u){p=(await n.collection(r).where(l).count()).total,s0?_[e][n]=_[e][n][0]:_[e][n]={})}return u?(m.hasMore=y,m.total=p):(m.total=_?_.length:0,m.hasMore=p>=d),m.rows=_,m.code=0,m.key=1,m},addWhereJson:function(e,t,n={}){let{vk:i,db:a,_:r}=t,{formData:o,columns:l}=e;for(let e in l){let t,a=l[e],{key:s,mode:d,defaultValue:u,type:c=""}=a,f=s;if(i.pubfn.isNotNull(a.fieldName)&&(f=a.fieldName),t=i.pubfn.isNotNull(a.value)?a.value:o[s],i.pubfn.isNull(t)&&i.pubfn.isNotNull(u)&&(t=u),i.pubfn.isNull(d)&&(d=["address","province","city","area"].indexOf(c)>-1?"address":"[object Array]"===Object.prototype.toString.call(t)&&t.length>=2?"[]":"="),i.pubfn.isNotNull(t))if("custom"===d);else if("%%"===d)try{n[f]=new RegExp(t)}catch(e){}else if("%*"===d)try{n[f]=new RegExp("^"+t)}catch(e){}else if("*%"===d)try{n[f]=new RegExp(t+"$")}catch(e){}else if(">"===d)n[f]=r.gt(t);else if(">="===d)n[f]=r.gte(t);else if("<"===d)n[f]=r.lt(t);else if("<="===d)n[f]=r.lte(t);else if("in"===d)n[f]=r.in(t);else if("nin"===d)n[f]=r.nin(t);else if("!="===d)n[f]=r.neq(t);else if("[]"===d)n[f]=r.gte(t[0]).lte(t[1]);else if("[)"===d)n[f]=r.gte(t[0]).lt(t[1]);else if("(]"===d)n[f]=r.gt(t[0]).lte(t[1]);else if("()"===d)n[f]=r.gt(t[0]).lt(t[1]);else if("address"===d){let e={};t.province&&t.province.code&&(e["province.code"]=t.province.code),t.city&&t.city.code&&(e["city.code"]=t.city.code),t.area&&t.area.code&&(e["area.code"]=t.area.code),n[f]=e}else n[f]=t}return n}},m=y,h=async(e={})=>{"[object object]"==Object.prototype.toString.call(e.content)&&(e.content=JSON.stringify(e.content)),void 0===e.dataType&&(e.dataType="json"),"default"==e.dataType&&delete e.dataType,e.useContent&&(e.content=JSON.stringify(e.data)),e.method||(e.method="POST"),e.data&&(e.headers||(e.headers={"content-type":"application/json; charset=UTF-8"}));var t=await uniCloud.httpclient.request(e.url,e);return t&&t.data?t.data:t},w={formValidateItem:function(e,t,n){let i={code:0,msg:"ok"};for(let a in n){let r=n[a];if(void 0===e[t]&&r.required){i={type:"undefined",code:-1,msg:"字段:"+t+" 名称错误,请检查!",key:t,value:e[t]};break}if(r.required&&(null==e[t]||null==e[t]||""===e[t]||0==e[t].length)){i={type:"required",code:-1,msg:r.message,key:t,value:e[t]};break}if(r.type){if(Object.prototype.toString.call(e[t]).toLowerCase()!==`[object ${r.type}]`){i={type:"type",code:-1,msg:r.message,key:t,value:e[t]};break}}if(r.len&&e[t].length!=r.len){i={type:"len",code:-1,msg:r.message,key:t,value:e[t]};break}if(r.min)if(r.type&&"number"==r.type){if(e[t]r.max){i={type:"max",code:-1,msg:r.message,key:t,value:e[t]};break}}else if(e[t].length>r.max){i={type:"max",code:-1,msg:r.message,key:t,value:e[t]};break}if("function"==typeof r.validator){let n=r.validator(r,e[t],(function(e){return e}));if(void 0!==n&&!0!==n){i={type:"validator",code:-1,msg:r.message,key:t,value:e[t]};break}}}return i}};function _(e){return JSON.parse(JSON.stringify(e))}var b={};function x(e){let t=[];for(let n=0;n0&&(n=b.treeToArrayFn(d[o],t,n,d[a])),l&&delete d[o]}return n},b.arrayToTree=function(e,t){let n=_(e),{id:i="_id",parent_id:a="parent_id",children:r="children",deleteParentId:o=!0,need_field:l}=t,s=[],d={};for(let e=0;e0&&a>0){const e=60*(new Date).getTimezoneOffset()*1e3+60*t*60*1e3;let r=new Date(i,a,0).getDate();n.startTime=new Date(`${i}/${a}/1`).getTime()-e,n.endTime=new Date(`${i}/${a}/${r}`).getTime()+86399999-e}return n}},S=k,O={formValidate:function(e={}){let t={code:0,msg:"ok"},{data:n,rules:i}=e;if(i)for(let e in i){let a=i[e];if(t=w.formValidateItem(n,e,a),0!=t.code)break}return t}};O.treeUtil=N,O.timeUtil=S,O.timeFormat=O.timeUtil.timeFormat,O.getFullTime=O.timeUtil.getFullTime,O.getWeekStartAndEnd=O.timeUtil.getWeekStartAndEnd,O.getCommonTime=O.timeUtil.getCommonTime,O.getMonthStartAndEnd=O.timeUtil.getMonthStartAndEnd,O.validator=function(e){return function(t,n,i){let a=O.test(n,e);return"function"!=typeof i||!a&&n?i(!1):void i()}},O.test=function(e,t){switch(t){case"mobile":return new RegExp(/^1[3|4|5|6|7|8|9][0-9]{9}$/).test(e);case"tel":return new RegExp(/^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/).test(e);case"card":return new RegExp(/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/).test(e);case"mobileCode":return new RegExp(/^[0-9]{6}$/).test(e);case"username":return new RegExp(/^[a-zA-Z]([-_a-zA-Z0-9]{5,17})$/).test(e);case"pwd":return new RegExp(/^([a-zA-Z0-9_]){6,18}$/).test(e);case"payPwd":return new RegExp(/^[0-9]{6}$/).test(e);case"postal":return new RegExp(/[1-9]\d{5}(?!\d)/).test(e);case"QQ":return new RegExp(/^[1-9][0-9]{4,9}$/).test(e);case"email":return new RegExp(/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/).test(e);case"money":return new RegExp(/^\d*(?:\.\d{0,2})?$/).test(e);case"URL":return new RegExp(/(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/).test(e);case"IP":return new RegExp(/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/).test(e);case"date":return new RegExp(/^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/).test(e);case"time":return new RegExp(/^(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/).test(e);case"dateTime":return new RegExp(/^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/).test(e);case"number":return new RegExp(/^[0-9]*$/).test(e);case"english":return new RegExp(/^[a-zA-Z]+$/).test(e);case"chinese":return new RegExp(/^[\\u4E00-\\u9FA5]+$/).test(e);case"lower":return new RegExp(/^[a-z]+$/).test(e);case"upper":return new RegExp(/^[A-Z]+$/).test(e);case"HTML":return new RegExp(/<("[^"]*"|'[^']*'|[^'">])*>/).test(e);default:return!0}},O.checkStr=O.test,O.priceFilter=function(e){return"string"==typeof e&&(e=parseFloat(e)),(e/100).toFixed(2)},O.objectAssign=function(e,t){return Object.assign(e,t)},O.copyObject=function(e){return JSON.parse(JSON.stringify(e))},O.formAssign=function(e,t){let n=O.copyObject(e);return O.objectAssign(n,t)},O.arr_concat=function(e,t,n){n||(n="id");var i=e.concat(t),a=[];if(-1!=n){var r=[];for(var o in i)-1==r.indexOf(i[o][n])&&(r.push(i[o][n]),a.push(i[o]))}else a=i;return a},O.getData=function(e,t,n){var i=JSON.parse(JSON.stringify(e));t=t.replace(/\s+/g,"")+".";for(var a="",r=0;ri){n+="0123456789"[e[i].charCodeAt()%10]}else n="0"+n;return n},O.hidden=function(e,t,n){let i=e.length-t-n,a="";for(let e=0;e-1&&(n=!0);return n},O.calcFreights=function(e,t){let{first_weight:n,first_weight_price:i,continuous_weight:a,continuous_weight_price:r,max_weight:o=1e8}=e,l=0,s=0,d=o,u=!1,c=0;for(;t>0;)u?(c++,t-=a,d-=a):(u=!0,s++,d=o,t-=n,d-=n),d<=0&&(u=!1);return l=s*i+r*c,l},O.getNewObject=function(e,t){let n=O.copyObject(e),i={};if(t&&t.length>0)for(let e in t){let a=t[e];O.isNotNull(n[a])&&(i[a]=n[a])}else i=n;return i},O.deleteObjectKeys=function(e,t=[]){var n={};if(e)for(let i in e)-1==t.indexOf(i)&&(n[i]=e[i]);return n},O.arrayToTree=O.treeUtil.arrayToTree,O.treeToArray=O.treeUtil.treeToArray,O.wildcardTest=function(e,t){let n=new RegExp("\\*"),i=t.replace(n,"(.*)");return new RegExp("^"+i+"$").test(e)},O.urlStringToJson=function(e){var t={};if(""!=e&&null!=e&&null!=e)for(var n=e.split("&"),i=0;i-1){var o=a.indexOf('"',r),l=a.substring(r,o);if(o>r){var s=a.indexOf("---",o),d=a.substring(o+1,s).trim();n[l]=d}}}return n};var T=O;var J={addAsyncTasks:async(e={},t)=>{let{vk:n,db:i,_:a}=t,{type:r,title:o,out_trade_no:l,user_order_success:s}=e,d={};return d=await n.baseDao.add({dbName:"opendb-async-tasks",dataJson:{status:0,type:r,title:o,out_trade_no:l,user_order_success:s}},t),d},addPayOrders:async(e={},t)=>{let{vk:n,db:i,_:a}=t,{pay_type:r,out_trade_no:o,openid:l,total_fee:s,appid:d,original_data:u,wxpay_info:c,alipay_info:f}=e,g={};return g=await n.baseDao.add({dbName:"uni-pay-orders",dataJson:{pay_type:r,out_trade_no:o,openid:l,total_fee:s,appid:d,original_data:u,wxpay_info:c,alipay_info:f}},t),g},findPayOrdersByOutTradeNo:async(e="___",t)=>{let{vk:n,db:i,_:a}=t,r={};return r=await n.baseDao.findByWhereJson({dbName:"uni-pay-orders",whereJson:{out_trade_no:e}},t),r}},v=J,A={};A.payDao=v,A.pay=async(e={},t)=>{let{uniPay:n,config:i,vk:a,db:r,_:o}=t,{data:l={},userInfo:s,provider:d,originalParam:u}=e,{outTradeNo:c,subject:f="",body:g="",totalFee:p}=l;const{wxConfigMp:y,wxConfigApp:m,wxConfigH5:h,aliConfigMp:w,aliConfigApp:_,aliConfigH5:b,notifyUrl:x,alipay_app_to_h5:N}=i["uni-pay"];let k,S,O,T=d+"_"+u.context.PLATFORM;N&&"alipay_app-plus"==T&&(T="alipay_h5");var J=x+"/"+T;switch(T){case"wxpay_mp-weixin":k=n.initWeixin(y),S=s.wx_openid["mp-weixin"],O="JSAPI";break;case"wxpay_app-plus":k=n.initWeixin(m),O="APP";break;case"wxpay_h5":k=n.initWeixin(h),O="NATIVE";break;case"alipay_mp-alipay":k=n.initAlipay(w),S=s.ali_openid;break;case"alipay_app-plus":k=n.initAlipay(_),O="APP";break;case"alipay_h5":k=n.initAlipay(b),O="NATIVE";break;default:return{code:-1,msg:"参数错误",value:d+"_"+u.context.PLATFORM}}let v;try{S&&(l.openid=S),l.notifyUrl=J,l.tradeType=O,"alipay"===d&&void 0===l.extendParams&&(l.extendParams={sysServiceProviderId:"2088731216435275"}),v=await k.getOrderInfo(l)}catch(e){return console.log("error: ",e.message),{code:-3,msg:"获取支付信息失败,请稍后再试。"+e.message}}return{code:0,msg:"ok",outTradeNo:c,orderInfo:v}},A.payNotify=async function(e){let{event:t,context:n,vk:i,orderPaySuccess:a}=e,{config:r,uniPay:o,db:l,customUtil:s}=i.config,d={vk:i,config:r,uniPay:o,db:l,customUtil:s,_:l.command};const{wxConfigMp:u,wxConfigApp:c,wxConfigH5:f,aliConfigMp:g,aliConfigApp:p,aliConfigH5:y,alipay_app_to_h5:m}=r["uni-pay"];(new Date).getTime();let h,w=t.path.substring(1);switch(m&&"alipay_app-plus"==w&&(w="alipay_h5"),w){case"wxpay_mp-weixin":h=o.initWeixin(u);break;case"wxpay_app-plus":h=o.initWeixin(c);break;case"wxpay_h5":h=o.initWeixin(f);break;case"alipay_mp-alipay":h=o.initAlipay(g);break;case"alipay_app-plus":h=o.initAlipay(p);break;case"alipay_h5":h=o.initAlipay(y);break;default:return console.log("---------参数错误---------"),{code:-1,msg:"参数错误"}}let _=await h.verifyPaymentNotify(t);if(!_)return console.log("---------!验证未通过!---------"),{};let b,x,{outTradeNo:N,totalFee:k,transactionId:S,resultCode:O,openid:T,appId:J}=_;0==w.indexOf("wxpay_")?b=_:0==w.indexOf("alipay_")&&(x=_);let A=!1;return"function"==typeof a&&(A=await a({util:d,data:_})),"SUCCESS"==O&&(await v.addAsyncTasks({type:1001,title:`订单【${N}】付款成功`,out_trade_no:N,user_order_success:A},d),await v.addPayOrders({pay_type:w,out_trade_no:N,openid:T,total_fee:k,appid:J,original_data:t.body,wxpay_info:b,alipay_info:x},d)),0==w.indexOf("wxpay_")?{mpserverlessComposedResponse:!0,statusCode:200,headers:{"content-type":"text/xml"},body:""}:(w.indexOf("alipay_"),"SUCCESS")},A.payQuery=async(e={},t)=>{let{uniPay:n,config:i,vk:a,db:r,_:o}=t,{data:l={}}=e,{outTradeNo:s}=l,d={code:-1,msg:""};const{wxConfigMp:u,wxConfigApp:c,wxConfigH5:f,aliConfigMp:g,aliConfigApp:p,aliConfigH5:y,notifyUrl:m}=i["uni-pay"];if(!s)return{code:-1,msg:"订单号不能为空"};let h=await v.findPayOrdersByOutTradeNo(s,t);if(!h)return{code:-2,msg:"订单不存在或订单未支付!"};let w;switch(h.pay_type){case"wxpay_mp-weixin":w=n.initWeixin(u);break;case"wxpay_app-plus":w=n.initWeixin(c);break;case"wxpay_h5":w=n.initWeixin(f);break;case"alipay_mp-alipay":w=n.initAlipay(g);break;case"alipay_app-plus":w=n.initAlipay(p);break;case"alipay_h5":w=n.initAlipay(y);break;default:return{code:-1,msg:"参数错误"}}let _=await w.orderQuery({outTradeNo:s});if("SUCCESS"===_.tradeState||"FINISHED"===_.tradeState)d={code:0,msg:"支付成功",orderPaid:!0};else{let e=_.tradeStateDesc||"未支付或已退款";e.indexOf("订单发生过退款")>-1&&(e="订单已退款"),d={code:-1,msg:e,orderPaid:!1}}return d},A.refund=async(e={},t)=>{let{uniPay:n,config:i,vk:a,db:r,_:o}=t,{data:l={},originalParam:s,orderRefundSuccess:d}=e,{outTradeNo:u}=l,c={code:-1,msg:""};const{wxConfigMp:f,wxConfigApp:g,wxConfigH5:p,aliConfigMp:y,aliConfigApp:m,aliConfigH5:h,notifyUrl:w}=i["uni-pay"];let _=u;if(!u)return{code:-1,msg:"订单号不能为空"};let b=await v.findPayOrdersByOutTradeNo(u,t);if(!b)return{code:-2,msg:"订单不存在或订单未支付!"};let x=b.total_fee,N=x;const k=b.pay_type;let S;switch(k){case"wxpay_mp-weixin":S=n.initWeixin(f);break;case"wxpay_app-plus":S=n.initWeixin(g);break;case"wxpay_h5":S=n.initWeixin(p);break;case"alipay_mp-alipay":S=n.initAlipay(y);break;case"alipay_app-plus":S=n.initAlipay(m);break;case"alipay_h5":S=n.initAlipay(h);break;default:return{code:-1,msg:"参数错误,暂不支持"+k}}let O=!1;return"function"==typeof d&&(O=await d({payOrder:b})),await v.addAsyncTasks({type:1011,title:`订单【${u}】退款成功`,out_trade_no:u,user_order_success:O},t),console.log(`---- ${u} -- ${_} -- ${x} -- ${N}`),c=await S.refund({outTradeNo:u,outRefundNo:_,totalFee:x,refundFee:N}),c.outTradeNo?(c.code=0,c.msg="退款成功"):(c.code=-1,c.msg="退款失败"),c},A.refundQuery=async(e={},t)=>{let{uniPay:n,config:i,vk:a,db:r,_:o}=t,{data:l={}}=e,{outTradeNo:s}=l,d={code:-1,msg:""};const{wxConfigMp:u,wxConfigApp:c,wxConfigH5:f,aliConfigMp:g,aliConfigApp:p,aliConfigH5:y,notifyUrl:m}=i["uni-pay"];if(!s)return{code:-1,msg:"订单号不能为空"};let h=await v.findPayOrdersByOutTradeNo(s,t);if(!h)return{code:-2,msg:"订单不存在或订单未支付!"};let w,_;switch(h.pay_type){case"wxpay_mp-weixin":w=n.initWeixin(u);break;case"wxpay_app-plus":w=n.initWeixin(c);break;case"wxpay_h5":w=n.initWeixin(f);break;case"alipay_mp-alipay":w=n.initAlipay(g);break;case"alipay_app-plus":w=n.initAlipay(p);break;case"alipay_h5":w=n.initAlipay(y);break;default:return{code:-1,msg:"参数错误"}}let b={};try{_=await w.refundQuery({outTradeNo:s,outRefundNo:s})}catch(e){return{code:-1,msg:"查询失败,请稍后再试!",err:e,refundQueryJson:b,queryResult:_}}if(_.refundFee>0){let e="退款成功";for(let t in _.refundList){let n=_.refundList[t];e+=`${t+1}、 ${n.refundSuccessTime}: \r\n退款到 ${n.refundRecvAccout};\r\n`}d={code:0,msg:e,queryResult:_}}else d={code:-1,msg:"未退款",queryResult:_};return d};var $=A,E={},D={};E.get=function(e){let t,n=D[e];if(n){let{value:i,expired:a}=n;E.isExpired(e)?delete D[e]:t=i}return t},E.set=function(e,t,n=0){let i={value:t,expired:n>0?(new Date).getTime()+1e3*n:0};D[e]=i},E.del=function(e){delete D[e]},E.clear=function(e){if(e)for(let t in D)0==t.indexOf(e)&&delete D[t];else D={}},E.isExpired=function(e){let t=!0,n=D[e];return n&&(0==n.expired||n.expired>(new Date).getTime())&&(t=!1),t},E.getAll=function(e){let t={};if(e)for(let n in D)0==n.indexOf(e)&&(t[e]=D[e]);else t=D;for(let e in t)E.isExpired(e)&&(delete t[e],delete D[e]);return t};var C=E,M={};M.router=l,M.md5=p,M.baseDao=m,M.request=h,M.pubfn=T,M.payUtil=$,M.temporaryCache=C,M.requireCache={},M.require=function(e){if(M.requireCache&&M.requireCache[e])return M.requireCache[e];{const t=M.config.requireFn(M.config.baseDir+"/"+e);return M.requireCache[e]=t,t}},M.config={},M.init=function(e){M.config.config=e.config,M.config.uniID=e.uniID,M.config.db=e.db,M.config.pubFun=e.pubFun,M.config.middlewareService=e.middlewareService,M.config.customUtil=e.customUtil,M.config.uniPay=e.uniPay,M.config.baseDir=e.baseDir,M.config.requireFn=e.requireFn,M.daoCenter=e.daoCenter},M.getQueryStringParameters=function(e){let t={};if(e.httpMethod){if(e.body){let n=e.body;e.isBase64Encoded&&(n=Buffer.from(n,"base64").toString("utf-8")),"string"==typeof n&&(n=JSON.parse(n)),t=n}else if(e.queryStringParameters){let n=e.queryStringParameters;"string"==typeof n.data&&(n.data=JSON.parse(n.data)),t=n}}else t=JSON.parse(JSON.stringify(e));return t.data||(t.data={}),t.uniIdToken||(t.uniIdToken=t.uni_id_token),t.url=t.$url||"",t};var I=M;module.exports=I; +"use strict";var e={main:async e=>{let{uniID:t}=e.util,n={code:-1,msg:""},a=await t.checkToken(e.uniIdToken,{needUserInfo:!0});if(a.code&&a.code>0)return a;let i=a.userInfo;return delete i.token,delete i.password,n.uid=a.uid,n.userInfo=i,a.token&&(n.token=a.token,n.tokenExpired=a.tokenExpired),n.code=0,n.msg="ok",n}};async function t(e={},t){let{vk:n,db:a,_:i}=t,{whereJson:r={},fieldJson:o={},justNeedID:l=!1}=e;l&&(o={permission_id:!0}),r.enable=!0;let s=[],d=await n.baseDao.select({dbName:"uni-id-permissions",pageIndex:1,pageSize:500,fieldJson:o,whereJson:r},t);if(l)for(let e=0;e{let{url:a,util:i}=n,{uniID:r,config:o,pubFun:l,vk:s,db:d,_:u}=i,c={code:-1,msg:""};const f=e;if(c=await f.main(n),0!==c.code)return c;if(c.userInfo.role||(c.userInfo.role=[]),c.userInfo.role.includes("admin"))return c;if(!c.userInfo.allow_login_background)return{code:403,msg:"您无权限登录后台"};let g=[];if(c.userInfo.role.includes("admin-lv3")){let e=await t({whereJson:{level:u.in([1,2,3])},justNeedID:!0},i);s.pubfn.isNotNull(e)&&(g=g.concat(e))}else if(c.userInfo.role.includes("admin-lv2")){let e=await t({whereJson:{level:u.in([1,2])},justNeedID:!0},i);s.pubfn.isNotNull(e)&&(g=g.concat(e))}else if(c.userInfo.role.includes("admin-lv1")){let e=await t({whereJson:{level:u.in([1])},justNeedID:!0},i);s.pubfn.isNotNull(e)&&(g=g.concat(e))}else if(c.userInfo.role.includes("query-all")){let e=await t({whereJson:{curd_category:4,level:u.neq(4)},justNeedID:!0},i);s.pubfn.isNotNull(e)&&(g=g.concat(e))}let p=await async function(e,t){let{vk:n,db:a,_:i}=t,{role:r}=e;if(n.pubfn.isNull(r))return[];return(await n.baseDao.select({dbName:"uni-id-roles",whereJson:{role_id:i.in(r),enable:!0},fieldJson:{permission:!0}},t)).rows}({role:c.userInfo.role},i);for(let e in p){let t=p[e].permission;s.pubfn.isNotNull(t)&&(g=g.concat(t))}if(0==g.length)return{code:403,msg:"权限不足"};let y=await t({whereJson:{permission_id:u.in(g),match_mode:u.in([1,2])}},i),m=!1;for(let e=0;e0}({myPermission:g,url:a},i)&&(m=!0)}return m?(c.code=0,c.msg="ok",c):{code:403,msg:"权限不足"}}}.main}];var a=function(e){let t=[];if(e){let a=[...n,...e];a.sort((function(e,t){return e.index-t.index})),t=a.filter((e,t,n)=>{var i=[];return a.forEach((e,t)=>{i.push(e.id)}),i.indexOf(e.id)===t})}else t=n;return t},i={regExpTest:function(e,t){let n=!1;if("string"==typeof e){new RegExp(e).test(t)&&(n=!0)}else if("object"==typeof e)for(let a=0;a{let n={code:403,msg:"access denied",filterStack:[]},{url:i}=e;const o=a(t);for(let t in o){let a=o[t],{mode:l="onActionExecuting",enable:s=!0}=a;if("onActionExecuting"===l&&(s&&r.regExpTest(a.regExp,i))){e.filterResponse=n;let t=await a.main(e);if(t.filterId=a.id,n.filterStack.push(t),0!==t.code){n=t;break}n=Object.assign(n,t)}}return n},l=async(e,t,n)=>{let{url:i}=e;const o=a(t);for(let t in o){let a=o[t],{mode:l="onActionExecuting",enable:s=!0}=a;if("onActionExecuted"===l&&(s&&r.regExpTest(a.regExp,i))){let t=await a.main(e,n);if(t){if(0!==t.code){n=t;break}n=Object.assign(n,t)}}}return n};process.env.TZ="Asia/Shanghai";var s=async function(e){let{event:t,context:n,vk:a}=e,{config:i,uniID:r,uniPay:s,db:d,middlewareService:u,pubFun:c,customUtil:f}=a.config;if(a.pubfn.getData(i,"vk.system.serviceShutdown"))return{code:405,msg:a.pubfn.getData(i,"vk.system.serviceShutdownDescription")};let g,p={event:t,context:n},y=a.getQueryStringParameters(t),{url:m,data:w,uniIdToken:h}=y,b={url:m,data:w,uniIdToken:h,util:{vk:a,config:i,pubFun:c,uniID:r,uniPay:s,db:d,customUtil:f,_:d.command},originalParam:p},_=await o(b,u);if(0!==_.code)return _;_.uid&&(w.uid=_.uid),b.filterResponse=_;try{g=a.require("service/"+m)}catch(e){return e&&"MODULE_NOT_FOUND"==e.code?(console.error(`云函数 ${m} 不存在!`,e),{code:404,msg:`云函数 ${m} 不存在!`,err:{message:e.message,stack:e.stack}}):(console.error(`云函数 ${m} 编译异常!`,e),{code:500,msg:`云函数 ${m} 编译异常!`,err:{message:e.message,stack:e.stack}})}let N=await async function(e={}){let{res:t,serviceParam:n,serviceMain:a}=e;t.uid&&(n.uid=t.uid);t.userInfo&&(n.userInfo=t.userInfo);let i=await a.main(n);t.token&&"object"==typeof i&&(i.vk_uni_token={token:t.token,tokenExpired:t.tokenExpired});return i}({res:_,serviceParam:b,serviceMain:g});return N=await l(b,u,N),N};function d(e,t,n,a,i,r){return p((o=p(p(t,e),p(a,r)))<<(l=i)|o>>>32-l,n);var o,l}function u(e,t,n,a,i,r,o){return d(t&n|~t&a,e,t,i,r,o)}function c(e,t,n,a,i,r,o){return d(t&a|n&~a,e,t,i,r,o)}function f(e,t,n,a,i,r,o){return d(t^n^a,e,t,i,r,o)}function g(e,t,n,a,i,r,o){return d(n^(t|~a),e,t,i,r,o)}function p(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}var y=function(e){return function(e){for(var t="",n=0;n<4*e.length;n++)t+="0123456789abcdef".charAt(e[n>>2]>>n%4*8+4&15)+"0123456789abcdef".charAt(e[n>>2]>>n%4*8&15);return t}(function(e,t){e[t>>5]|=128<>>9<<4)]=t;for(var n=1732584193,a=-271733879,i=-1732584194,r=271733878,o=0;o>5]|=(255&e.charCodeAt(n/8))<100)return await w.selectAll(e);let o=await w.getSelectData(e),{result:l,hasMore:s,total:d,getCount:u,pageIndex:c}=o;return l=l.skip((c-1)*r).limit(r),l.get().then(e=>{let t={};return u?(t.hasMore=s,t.total=d):(t.total=e.data?e.data.length:0,t.hasMore=t.total>=r),t.rows=e.data,t.code=0,t.key=1,t.pageIndex=c,t.pageSize=r,t})},findById:async function(e){let{db:t,_:n}=m,{dbName:a,id:i,fieldJson:r,db:o}=e,l=o||t;try{let e=l.collection(a).doc(i);r&&(e=e.field(r));let t=await e.get();return"[object Array]"===Object.prototype.toString.call(t.data)?t.data[0]:t.data}catch(e){return console.error(e),null}},findByWhereJson:async function(e){let{db:t,_:n}=m,{dbName:a,whereJson:i,fieldJson:r,sortArr:o}=e;try{if(i&&"{}"!==JSON.stringify(i)){let e=t.collection(a).where(i);if(o)for(let t in o){let n=o[t],a=n.name,i=n.type;null!=i&&""!=i||(i="asc"),e=e.orderBy(a,i)}r&&(e=e.field(r));let n=await e.limit(1).get();if(n.data&&n.data.length>0)return n.data[0]}else console.error("whereJson条件不能为空")}catch(e){console.error(e)}return null},count:async function(e){let{db:t,_:n}=m,{dbName:a,whereJson:i}=e;i&&"{}"!==JSON.stringify(i)||(i={_id:n.neq("___")});try{return(await t.collection(a).where(i).count()).total}catch(e){return console.error(e),null}},select2:async function(e){let{foreignKeyType:t="many-to-one"}=e;return"many-to-one"===t?await w.select2_ManyToOne(e):"one-to-many"===t?await w.select2_OneToMany(e):(console.error("不支持的foreignKeyType"),{})},count2_ManyToOne:async function(e){let{db:t,_:n,vk:a}=m,{dbName:i,dbName2:r,foreignKey:o="_id",foreignKey2:l="_id",whereJson:s={},whereJson2:d={},pageIndex:u=1,pageSize:c=10,getCount:f=!1,sortArr:g={},fieldJson:p={},fieldJson2:y={},as:w}=e;w||(w=r),"{}"===JSON.stringify(s)&&(s={_id:n.neq("___")});n.aggregate;let h=t.collection(i).aggregate();if(s&&"{}"!==JSON.stringify(s)&&(h=h.match(s)),p&&"{}"!==JSON.stringify(p)&&(h=h.project(p)),g&&"{}"!==JSON.stringify(g)){let e={};for(let t in g){let n=g[t],a=n.name,i=n.type;i=null==i||""==i||"asc"==i?1:-1,e[a]=i}h=h.sort(e)}let b={from:r,localField:o,foreignField:l,as:w};if(h=h.lookup(b),y&&"{}"!==JSON.stringify(y)){let e={};for(let t in y)e[w+"."+t]=y[t];h=h.project(e)}if(d&&"{}"!==JSON.stringify(d)){let e={};for(let t in d)e[w+"."+t]=d[t];h=h.match(e)}let _=await h.count("total").end();try{return _.data[0].total}catch(e){return console.log(e),0}},select2_ManyToOne:async function(e){let{db:t,_:n,vk:a}=m,{dbName:i,dbName2:r,foreignKey:o="_id",foreignKey2:l="_id",whereJson:s={},whereJson2:d={},pageIndex:u=1,pageSize:c=10,getCount:f=!1,sortArr:g=[],fieldJson:p={},fieldJson2:y={},as:w,whereJsonPub:h={}}=e;w||(w=r),"{}"===JSON.stringify(s)&&(s={_id:n.neq("___")}),-1==c&&(u=1,c=999999999,f=!1);let b=0,_=!1;if(f){b=(await t.collection(i).where(s).count()).total,u0?T[e][w]=T[e][w][0]:T[e][w]={};return f?(N.hasMore=_,N.total=b):(N.total=T?T.length:0,N.hasMore=b>=c),N.rows=T,N.code=0,N.key=1,N},select2_OneToMany:async function(e){let{db:t,_:n,vk:a}=m,{dbName:i,dbName2:r,foreignKey:o="_id",foreignKey2:l="_id",whereJson:s={},whereJson2:d={},pageIndex:u=1,pageSize:c=10,getCount:f=!1,sortArr:g=[],sortArr2:p=[],fieldJson:y={},fieldJson2:w={},as:h}=e;h||(h=r),"{}"===JSON.stringify(s)&&(s={_id:n.neq("___")}),-1==c&&(u=1,c=999999999,f=!1);let b=0,_=!1;if(f){b=(await t.collection(i).where(s).count()).total,u=c),N.rows=T,N.code=0,N.key=1,N},getSelectData:async function(e){let{db:t,_:n}=m,{dbName:a,whereJson:i,pageIndex:r=1,pageSize:o=10,getCount:l=!1}=e;i&&"{}"!==JSON.stringify(i)||(i={_id:n.neq("___")}),o<0&&(r=1,o=999999999,l=!0);let s=e.sortArr,d=e.fieldJson,u=0,c=!1;if(l){u=(await t.collection(a).where(i).count()).total,r0&&!u&&!c&&(u=g);let p={};if(c&&0===u)p={data:[]};else{let t=u;gr&&(n=r-t);let l=s.skip(t).limit(n).get();a.push(l)}try{p=(await Promise.all(a)).reduce((e,t)=>({data:e.data.concat(t.data),errMsg:e.errMsg}))}catch(t){console.error("selectAll-异常",e,t),p={data:[]}}}return r.rows=p.data,r.key=1,r.code=0,r.hasMore=d,r.pageIndex=f,r.pageSize=g,r.total=c?u:p.data?p.data.length:0,r},sum:async function(e){let{db:t,_:n}=m,{dbName:a,fieldName:i,whereJson:r}=e;r&&"{}"!==JSON.stringify(r)||(r={_id:n.neq("___")});const o=t.command.aggregate;try{let e=await t.collection(a).aggregate().match(r).group({_id:null,num:o.sum("$"+i)}).end();return e.data&&e.data[0]?e.data[0].num:0}catch(e){return console.error(e),null}},avg:async function(e){let{db:t,_:n}=m,{dbName:a,fieldName:i,whereJson:r}=e;r&&"{}"!==JSON.stringify(r)||(r={_id:n.neq("___")});const o=t.command.aggregate;try{let e=await t.collection(a).aggregate().match(r).group({_id:null,num:o.avg("$"+i)}).end();return e.data&&e.data[0]?e.data[0].num:null}catch(e){return console.error(e),null}},max:async function(e){let{db:t,_:n}=m,{dbName:a,fieldName:i,whereJson:r}=e;r&&"{}"!==JSON.stringify(r)||(r={_id:n.neq("___")});const o=t.command.aggregate;try{let e=await t.collection(a).aggregate().match(r).group({_id:null,num:o.max("$"+i)}).end();return e.data&&e.data[0]?e.data[0].num:null}catch(e){return console.error(e),null}},min:async function(e){let{db:t,_:n}=m,{dbName:a,fieldName:i,whereJson:r}=e;r&&"{}"!==JSON.stringify(r)||(r={_id:n.neq("___")});const o=t.command.aggregate;try{let e=await t.collection(a).aggregate().match(r).group({_id:null,num:o.min("$"+i)}).end();return e.data&&e.data[0]?e.data[0].num:null}catch(e){return console.error(e),null}},sample:async function(e){let{db:t,_:n}=m,{dbName:a,whereJson:i,size:r}=e;i&&"{}"!==JSON.stringify(i)||(i={_id:n.neq("___")});t.command.aggregate;try{return(await t.collection(a).aggregate().match(i).sample({size:r}).end()).data}catch(e){return console.error(e),null}},selects:async function(e){let{db:t,_:n,vk:a}=m,{dbName:i,foreignKey:r="_id",whereJson:o={},pageIndex:l=1,pageSize:s=10,getCount:d=!1,sortArr:u=[],fieldJson:c={},foreignDB:f=[]}=e;"{}"===JSON.stringify(o)&&(o={_id:n.neq("___")}),-1==s&&(l=1,s=999999999,d=!1);let g=0,p=!1;if(d){g=(await t.collection(i).where(o).count()).total,l0?b[e][n]=b[e][n][0]:b[e][n]={})}return d?(y.hasMore=p,y.total=g):(y.total=b?b.length:0,y.hasMore=g>=s),y.rows=b,y.code=0,y.key=1,y},addWhereJson:function(e,t={}){let{vk:n,db:a,_:i}=m,{formData:r,columns:o}=e;for(let e in o){let a,l=o[e],{key:s,mode:d,defaultValue:u,type:c=""}=l,f=s;if(n.pubfn.isNotNull(l.fieldName)&&(f=l.fieldName),a=n.pubfn.isNotNull(l.value)?l.value:r[s],n.pubfn.isNull(a)&&n.pubfn.isNotNull(u)&&(a=u),n.pubfn.isNull(d)&&(d=["address","province","city","area"].indexOf(c)>-1?"address":"[object Array]"===Object.prototype.toString.call(a)&&a.length>=2?"[]":"="),n.pubfn.isNotNull(a))if("custom"===d);else if("%%"===d)try{t[f]=new RegExp(a)}catch(e){}else if("%*"===d)try{t[f]=new RegExp("^"+a)}catch(e){}else if("*%"===d)try{t[f]=new RegExp(a+"$")}catch(e){}else if(">"===d)t[f]=i.gt(a);else if(">="===d)t[f]=i.gte(a);else if("<"===d)t[f]=i.lt(a);else if("<="===d)t[f]=i.lte(a);else if("in"===d)t[f]=i.in(a);else if("nin"===d)t[f]=i.nin(a);else if("!="===d)t[f]=i.neq(a);else if("[]"===d)t[f]=i.gte(a[0]).lte(a[1]);else if("[)"===d)t[f]=i.gte(a[0]).lt(a[1]);else if("(]"===d)t[f]=i.gt(a[0]).lte(a[1]);else if("()"===d)t[f]=i.gt(a[0]).lt(a[1]);else if("address"===d){let e={};a.province&&a.province.code&&(e["province.code"]=a.province.code),a.city&&a.city.code&&(e["city.code"]=a.city.code),a.area&&a.area.code&&(e["area.code"]=a.area.code),t[f]=e}else t[f]=a}return t},getTableData:async function(e){let{vk:t,db:n,_:a}=m,{dbName:i,data:r,whereJson:o,fieldJson:l}=e,{pageIndex:s,pageSize:d,pagination:u,sortRule:c,formData:f,columns:g}=r;u&&(s=u.pageIndex,d=u.pageSize);let p={},y={},h=[];return h.push({name:"_add_time",type:"desc"}),t.pubfn.isNotNull(c)&&(h=c),y=w.addWhereJson(r),t.pubfn.isNotNull(o)&&t.pubfn.objectAssign(y,o),t.pubfn.isNotNull(l)&&t.pubfn.objectAssign(p,l),await t.baseDao.select({dbName:i,getCount:!0,pageIndex:s,pageSize:d,fieldJson:p,whereJson:y,sortArr:h})},startTransaction:async function(e){let{vk:t,db:n,_:a}=m;return await n.startTransaction()}},h=w,b=async(e={})=>{"[object object]"==Object.prototype.toString.call(e.content)&&(e.content=JSON.stringify(e.content)),void 0===e.dataType&&(e.dataType="json"),"default"==e.dataType&&delete e.dataType,e.useContent&&(e.content=JSON.stringify(e.data)),e.method||(e.method="POST"),e.data&&(e.headers||(e.headers={"content-type":"application/json; charset=UTF-8"}));var t=await uniCloud.httpclient.request(e.url,e);return t&&t.data?t.data:t},_={formValidateItem:function(e,t,n){let a={code:0,msg:"ok"};for(let i in n){let r=n[i];if(void 0===e[t]&&r.required){a={type:"undefined",code:-1,msg:"字段:"+t+" 名称错误,请检查!",key:t,value:e[t]};break}if(r.required&&(null==e[t]||null==e[t]||""===e[t]||0==e[t].length)){a={type:"required",code:-1,msg:r.message,key:t,value:e[t]};break}if(r.type){if(Object.prototype.toString.call(e[t]).toLowerCase()!==`[object ${r.type}]`){a={type:"type",code:-1,msg:r.message,key:t,value:e[t]};break}}if(r.len&&e[t].length!=r.len){a={type:"len",code:-1,msg:r.message,key:t,value:e[t]};break}if(r.min)if(r.type&&"number"==r.type){if(e[t]r.max){a={type:"max",code:-1,msg:r.message,key:t,value:e[t]};break}}else if(e[t].length>r.max){a={type:"max",code:-1,msg:r.message,key:t,value:e[t]};break}if("function"==typeof r.validator){let n=r.validator(r,e[t],(function(e){return e}));if(void 0!==n&&!0!==n){a={type:"validator",code:-1,msg:r.message,key:t,value:e[t]};break}}}return a}};function N(e){return JSON.parse(JSON.stringify(e))}var x={};function k(e){let t=[];for(let n=0;n0&&(n=x.treeToArrayFn(d[o],t,n,d[i])),l&&delete d[o]}return n},x.arrayToTree=function(e,t){let n=N(e),{id:a="_id",parent_id:i="parent_id",children:r="children",deleteParentId:o=!0,need_field:l}=t,s=[],d={};for(let e=0;e0&&i>0){const e=60*(new Date).getTimezoneOffset()*1e3+60*t*60*1e3;let r=new Date(a,i,0).getDate();n.startTime=new Date(`${a}/${i}/1`).getTime()-e,n.endTime=new Date(`${a}/${i}/${r}`).getTime()+86399999-e}return n}},J=S,T={formValidate:function(e={}){let t={code:0,msg:"ok"},{data:n,rules:a}=e;if(a)for(let e in a){let i=a[e];if(t=_.formValidateItem(n,e,i),0!=t.code)break}return t}};T.treeUtil=v,T.timeUtil=J,T.timeFormat=T.timeUtil.timeFormat,T.getFullTime=T.timeUtil.getFullTime,T.getWeekStartAndEnd=T.timeUtil.getWeekStartAndEnd,T.getCommonTime=T.timeUtil.getCommonTime,T.getMonthStartAndEnd=T.timeUtil.getMonthStartAndEnd,T.validator=function(e){return function(t,n,a){let i=T.test(n,e);return"function"!=typeof a||!i&&n?a(!1):void a()}},T.test=function(e,t){switch(t){case"mobile":return new RegExp(/^1[3|4|5|6|7|8|9][0-9]{9}$/).test(e);case"tel":return new RegExp(/^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/).test(e);case"card":return new RegExp(/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/).test(e);case"mobileCode":return new RegExp(/^[0-9]{6}$/).test(e);case"username":return new RegExp(/^[a-zA-Z]([-_a-zA-Z0-9]{5,17})$/).test(e);case"pwd":return new RegExp(/^([a-zA-Z0-9_]){6,18}$/).test(e);case"payPwd":return new RegExp(/^[0-9]{6}$/).test(e);case"postal":return new RegExp(/[1-9]\d{5}(?!\d)/).test(e);case"QQ":return new RegExp(/^[1-9][0-9]{4,9}$/).test(e);case"email":return new RegExp(/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/).test(e);case"money":return new RegExp(/^\d*(?:\.\d{0,2})?$/).test(e);case"URL":return new RegExp(/(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/).test(e);case"IP":return new RegExp(/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/).test(e);case"date":return new RegExp(/^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/).test(e);case"time":return new RegExp(/^(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/).test(e);case"dateTime":return new RegExp(/^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/).test(e);case"number":return new RegExp(/^[0-9]*$/).test(e);case"english":return new RegExp(/^[a-zA-Z]+$/).test(e);case"chinese":return new RegExp(/^[\\u4E00-\\u9FA5]+$/).test(e);case"lower":return new RegExp(/^[a-z]+$/).test(e);case"upper":return new RegExp(/^[A-Z]+$/).test(e);case"HTML":return new RegExp(/<("[^"]*"|'[^']*'|[^'">])*>/).test(e);default:return!0}},T.checkStr=T.test,T.priceFilter=function(e){return"string"==typeof e&&(e=parseFloat(e)),(e/100).toFixed(2)},T.objectAssign=function(e,t){return Object.assign(e,t)},T.copyObject=function(e){return JSON.parse(JSON.stringify(e))},T.formAssign=function(e,t){let n=T.copyObject(e);return T.objectAssign(n,t)},T.arr_concat=function(e,t,n){n||(n="id");var a=e.concat(t),i=[];if(-1!=n){var r=[];for(var o in a)-1==r.indexOf(a[o][n])&&(r.push(a[o][n]),i.push(a[o]))}else i=a;return i},T.getData=function(e,t,n){var a=JSON.parse(JSON.stringify(e));t=t.replace(/\s+/g,"")+".";for(var i="",r=0;re){n+="0123456789"[a[e].charCodeAt()%10]}else n="0"+n;return n},T.hidden=function(e,t,n){let a=e.length-t-n,i="";for(let e=0;e-1&&(n=!0);return n},T.calcFreights=function(e,t){let{first_weight:n,first_weight_price:a,continuous_weight:i,continuous_weight_price:r,max_weight:o=1e8}=e,l=0,s=0,d=o,u=!1,c=0;for(;t>0;)u?(c++,t-=i,d-=i):(u=!0,s++,d=o,t-=n,d-=n),d<=0&&(u=!1);return l=s*a+r*c,l},T.getNewObject=function(e,t){let n=T.copyObject(e),a={};if(t&&t.length>0)for(let e in t){let i=t[e];T.isNotNull(n[i])&&(a[i]=n[i])}else a=n;return a},T.deleteObjectKeys=function(e,t=[]){var n={};if(e)for(let a in e)-1==t.indexOf(a)&&(n[a]=e[a]);return n},T.arrayToTree=T.treeUtil.arrayToTree,T.treeToArray=T.treeUtil.treeToArray,T.wildcardTestOne=function(e,t){if(!t)return!1;let n=t.replace(new RegExp("\\*"),"(.*)"),a=0!==t.indexOf("*")?"^":"",i="*"!==t[t.length-1]?"$":"";return new RegExp(a+n+i).test(e)},T.wildcardTest=function(e,t){let n=0;if("string"==typeof t)T.wildcardTestOne(e,t)&&n++;else if("object"==typeof t)for(let a=0;a-1){var o=i.indexOf('"',r),l=i.substring(r,o);if(o>r){var s=i.indexOf("---",o),d=i.substring(o+1,s).trim();n[l]=d}}}return n};var O=T;var D={addAsyncTasks:async(e={},t)=>{let{vk:n,db:a,_:i}=t,{type:r,title:o,out_trade_no:l,user_order_success:s}=e,d={};return d=await n.baseDao.add({dbName:"opendb-async-tasks",dataJson:{status:0,type:r,title:o,out_trade_no:l,user_order_success:s}},t),d},addPayOrders:async(e={},t)=>{let{vk:n,db:a,_:i}=t,{pay_type:r,out_trade_no:o,openid:l,total_fee:s,appid:d,original_data:u,wxpay_info:c,alipay_info:f}=e,g={};return g=await n.baseDao.add({dbName:"uni-pay-orders",dataJson:{pay_type:r,out_trade_no:o,openid:l,total_fee:s,appid:d,original_data:u,wxpay_info:c,alipay_info:f}},t),g},findPayOrdersByOutTradeNo:async(e="___",t)=>{let{vk:n,db:a,_:i}=t,r={};return r=await n.baseDao.findByWhereJson({dbName:"uni-pay-orders",whereJson:{out_trade_no:e}},t),r}},A=D,E={};E.payDao=A,E.pay=async(e={},t)=>{let{uniPay:n,config:a,vk:i,db:r,_:o}=t,{data:l={},userInfo:s,provider:d,originalParam:u}=e,{outTradeNo:c,subject:f="",body:g="",totalFee:p}=l;const{wxConfigMp:y,wxConfigApp:m,wxConfigH5:w,aliConfigMp:h,aliConfigApp:b,aliConfigH5:_,notifyUrl:N,alipay_app_to_h5:x}=a["uni-pay"];let k,v,S,J=d+"_"+u.context.PLATFORM;x&&"alipay_app-plus"==J&&(J="alipay_h5");var T=N+"/"+J;switch(J){case"wxpay_mp-weixin":k=n.initWeixin(y),v=s.wx_openid["mp-weixin"],S="JSAPI";break;case"wxpay_app-plus":k=n.initWeixin(m),S="APP";break;case"wxpay_h5":k=n.initWeixin(w),S="NATIVE";break;case"alipay_mp-alipay":k=n.initAlipay(h),v=s.ali_openid;break;case"alipay_app-plus":k=n.initAlipay(b),S="APP";break;case"alipay_h5":k=n.initAlipay(_),S="NATIVE";break;default:return{code:-1,msg:"参数错误",value:d+"_"+u.context.PLATFORM}}let O;try{v&&(l.openid=v),l.notifyUrl=T,l.tradeType=S,"alipay"===d&&void 0===l.extendParams&&(l.extendParams={sysServiceProviderId:"2088731216435275"}),O=await k.getOrderInfo(l)}catch(e){return console.log("error: ",e.message),{code:-3,msg:"获取支付信息失败,请稍后再试。"+e.message}}return{code:0,msg:"ok",outTradeNo:c,orderInfo:O}},E.payNotify=async function(e){let{event:t,context:n,vk:a,orderPaySuccess:i}=e,{config:r,uniPay:o,db:l,customUtil:s}=a.config,d={vk:a,config:r,uniPay:o,db:l,customUtil:s,_:l.command};const{wxConfigMp:u,wxConfigApp:c,wxConfigH5:f,aliConfigMp:g,aliConfigApp:p,aliConfigH5:y,alipay_app_to_h5:m}=r["uni-pay"];(new Date).getTime();let w,h=t.path.substring(1);switch(m&&"alipay_app-plus"==h&&(h="alipay_h5"),h){case"wxpay_mp-weixin":w=o.initWeixin(u);break;case"wxpay_app-plus":w=o.initWeixin(c);break;case"wxpay_h5":w=o.initWeixin(f);break;case"alipay_mp-alipay":w=o.initAlipay(g);break;case"alipay_app-plus":w=o.initAlipay(p);break;case"alipay_h5":w=o.initAlipay(y);break;default:return console.log("---------参数错误---------"),{code:-1,msg:"参数错误"}}let b=await w.verifyPaymentNotify(t);if(!b)return console.log("---------!验证未通过!---------"),{};let _,N,{outTradeNo:x,totalFee:k,transactionId:v,resultCode:S,openid:J,appId:T}=b;0==h.indexOf("wxpay_")?_=b:0==h.indexOf("alipay_")&&(N=b);let O=!1;return"function"==typeof i&&(O=await i({util:d,data:b})),"SUCCESS"==S&&(await A.addAsyncTasks({type:1001,title:`订单【${x}】付款成功`,out_trade_no:x,user_order_success:O},d),await A.addPayOrders({pay_type:h,out_trade_no:x,openid:J,total_fee:k,appid:T,original_data:t.body,wxpay_info:_,alipay_info:N},d)),0==h.indexOf("wxpay_")?{mpserverlessComposedResponse:!0,statusCode:200,headers:{"content-type":"text/xml"},body:""}:(h.indexOf("alipay_"),"SUCCESS")},E.payQuery=async(e={},t)=>{let{uniPay:n,config:a,vk:i,db:r,_:o}=t,{data:l={}}=e,{outTradeNo:s}=l,d={code:-1,msg:""};const{wxConfigMp:u,wxConfigApp:c,wxConfigH5:f,aliConfigMp:g,aliConfigApp:p,aliConfigH5:y,notifyUrl:m}=a["uni-pay"];if(!s)return{code:-1,msg:"订单号不能为空"};let w=await A.findPayOrdersByOutTradeNo(s,t);if(!w)return{code:-2,msg:"订单不存在或订单未支付!"};let h;switch(w.pay_type){case"wxpay_mp-weixin":h=n.initWeixin(u);break;case"wxpay_app-plus":h=n.initWeixin(c);break;case"wxpay_h5":h=n.initWeixin(f);break;case"alipay_mp-alipay":h=n.initAlipay(g);break;case"alipay_app-plus":h=n.initAlipay(p);break;case"alipay_h5":h=n.initAlipay(y);break;default:return{code:-1,msg:"参数错误"}}let b=await h.orderQuery({outTradeNo:s});if("SUCCESS"===b.tradeState||"FINISHED"===b.tradeState)d={code:0,msg:"支付成功",orderPaid:!0};else{let e=b.tradeStateDesc||"未支付或已退款";e.indexOf("订单发生过退款")>-1&&(e="订单已退款"),d={code:-1,msg:e,orderPaid:!1}}return d},E.refund=async(e={},t)=>{let{uniPay:n,config:a,vk:i,db:r,_:o}=t,{data:l={},originalParam:s,orderRefundSuccess:d}=e,{outTradeNo:u}=l,c={code:-1,msg:""};const{wxConfigMp:f,wxConfigApp:g,wxConfigH5:p,aliConfigMp:y,aliConfigApp:m,aliConfigH5:w,notifyUrl:h}=a["uni-pay"];let b=u;if(!u)return{code:-1,msg:"订单号不能为空"};let _=await A.findPayOrdersByOutTradeNo(u,t);if(!_)return{code:-2,msg:"订单不存在或订单未支付!"};let N=_.total_fee,x=N;const k=_.pay_type;let v;switch(k){case"wxpay_mp-weixin":v=n.initWeixin(f);break;case"wxpay_app-plus":v=n.initWeixin(g);break;case"wxpay_h5":v=n.initWeixin(p);break;case"alipay_mp-alipay":v=n.initAlipay(y);break;case"alipay_app-plus":v=n.initAlipay(m);break;case"alipay_h5":v=n.initAlipay(w);break;default:return{code:-1,msg:"参数错误,暂不支持"+k}}let S=!1;return"function"==typeof d&&(S=await d({payOrder:_})),await A.addAsyncTasks({type:1002,title:`订单【${u}】退款成功`,out_trade_no:u,user_order_success:S},t),console.log(`---- ${u} -- ${b} -- ${N} -- ${x}`),c=await v.refund({outTradeNo:u,outRefundNo:b,totalFee:N,refundFee:x}),c.outTradeNo?(c.code=0,c.msg="退款成功"):(c.code=-1,c.msg="退款失败"),c},E.refundQuery=async(e={},t)=>{let{uniPay:n,config:a,vk:i,db:r,_:o}=t,{data:l={}}=e,{outTradeNo:s}=l,d={code:-1,msg:""};const{wxConfigMp:u,wxConfigApp:c,wxConfigH5:f,aliConfigMp:g,aliConfigApp:p,aliConfigH5:y,notifyUrl:m}=a["uni-pay"];if(!s)return{code:-1,msg:"订单号不能为空"};let w=await A.findPayOrdersByOutTradeNo(s,t);if(!w)return{code:-2,msg:"订单不存在或订单未支付!"};let h,b;switch(w.pay_type){case"wxpay_mp-weixin":h=n.initWeixin(u);break;case"wxpay_app-plus":h=n.initWeixin(c);break;case"wxpay_h5":h=n.initWeixin(f);break;case"alipay_mp-alipay":h=n.initAlipay(g);break;case"alipay_app-plus":h=n.initAlipay(p);break;case"alipay_h5":h=n.initAlipay(y);break;default:return{code:-1,msg:"参数错误"}}let _={};try{b=await h.refundQuery({outTradeNo:s,outRefundNo:s})}catch(e){return{code:-1,msg:"查询失败,请稍后再试!",err:e,refundQueryJson:_,queryResult:b}}if(b.refundFee>0){let e="退款成功";for(let t in b.refundList){let n=b.refundList[t];e+=`${t+1}、 ${n.refundSuccessTime}: \r\n退款到 ${n.refundRecvAccout};\r\n`}d={code:0,msg:e,queryResult:b}}else d={code:-1,msg:"未退款",queryResult:b};return d};var $=E,C={},I={};C.get=function(e){let t,n=I[e];if(n){let{value:a,expired:i}=n;C.isExpired(e)?delete I[e]:t=a}return t},C.set=function(e,t,n=0){let a={value:t,expired:n>0?(new Date).getTime()+1e3*n:0};I[e]=a},C.del=function(e){delete I[e]},C.clear=function(e){if(e)for(let t in I)0==t.indexOf(e)&&delete I[t];else I={}},C.isExpired=function(e){let t=!0,n=I[e];return n&&(0==n.expired||n.expired>(new Date).getTime())&&(t=!1),t},C.getAll=function(e){let t={};if(e)for(let n in I)0==n.indexOf(e)&&(t[e]=I[e]);else t=I;for(let e in t)C.isExpired(e)&&(delete t[e],delete I[e]);return t};var M=C;const P="opendb-global-data";var R={},j={};R.init=function(e){j=e},R.find=async e=>{let{vk:t,db:n,_:a}=j,i={};return i=await t.baseDao.findByWhereJson({dbName:P,whereJson:{key:e}}),i},R.del=async e=>{let{vk:t,db:n,_:a}=j,i={};return i=await t.baseDao.del({dbName:P,whereJson:{key:e}}),i},R.deleteByWhere=async e=>{let{vk:t,db:n,_:a}=j,i={};return i=await t.baseDao.del({dbName:P,whereJson:e}),i},R.update=async e=>{let{vk:t,db:n,_:a}=j,i={},{key:r,value:o,comment:l,expired_at:s}=e;return i=await t.baseDao.update({dbName:P,whereJson:{key:r},dataJson:{value:a.set(o),comment:l,expired_at:s}}),i},R.add=async e=>{let{vk:t,db:n,_:a}=j,i={},{key:r,value:o,comment:l,expired_at:s}=e;return i=await t.baseDao.add({dbName:P,dataJson:{key:r,value:o,comment:l,expired_at:s}}),i},R.count=async e=>{let{vk:t,db:n,_:a}=j,i={};return i=await t.baseDao.count({dbName:P,whereJson:e}),i},R.set=async e=>{let t={code:0,msg:"ok"};return await R.count({key:e.key})>0?(t.num=await R.update(e),t.mode="update"):(t.num=await R.add(e),t.mode="add"),t},R.list=async e=>{let{vk:t,db:n,_:a}=j,i={},{pageIndex:r,pageSize:o,whereJson:l,sortArr:s}=e;return i=await t.baseDao.select({dbName:P,pageIndex:r,pageSize:o,whereJson:l,sortArr:s}),i};var q=R,F={init:function(e){q.init(e)},get:async function(e){let t;try{let n=await q.find(e);if(n){let{value:a,expired_at:i}=n;F.isExpired(n)?F.del(e):t=a}}catch(e){return}return t},set:async function(e){let{key:t,value:n,second:a=0}=e,i={code:0,msg:"ok"};try{if(!t)return{code:-1,msg:"key值不能为空"};let e=a>0?(new Date).getTime()+1e3*a:0;i=await q.set({key:t,value:n,expired_at:e})}catch(e){return{code:-1,msg:"异常"}}return i},del:async function(e){await q.del(e)},clear:async function(e){if(e)return await q.deleteByWhere({key:new RegExp("^"+e)})},list:async function(e){return await q.list(e)},count:async function(e){return await q.count(e)},isExpired:function(e){let t=!0;return e&&(!e.expired_at||0==e.expired_at||e.expired_at>(new Date).getTime())&&(t=!1),t}},z=F,U={};U.router=s,U.md5=y,U.baseDao=h,U.request=b,U.pubfn=O,U.payUtil=$,U.temporaryCache=M,U.globalDataCache=z,U.requireCache={},U.require=function(e){if(U.requireCache&&U.requireCache[e])return U.requireCache[e];{const t=U.config.requireFn(U.config.baseDir+"/"+e);return U.requireCache[e]=t,t}},U.config={},U.init=function(e){U.config.config=e.config,U.config.uniID=e.uniID,U.config.uniPay=e.uniPay,U.config.db=e.db,U.config._=e.db.command,U.config.pubfn=U.pubfn,U.config.middlewareService=e.middlewareService,U.config.pubFun=e.pubFun,U.config.customUtil=e.customUtil,U.config.baseDir=e.baseDir,U.config.requireFn=e.requireFn;const t={vk:U,...U.config};U.baseDao.init(t),U.daoCenter=e.daoCenter,U.daoCenter&&"function"==typeof U.daoCenter.init&&U.daoCenter.init(t),U.globalDataCache.init(t)},U.getQueryStringParameters=function(e){let t={};if(e.httpMethod){if(e.body){let n=e.body;e.isBase64Encoded&&(n=Buffer.from(n,"base64").toString("utf-8")),"string"==typeof n&&(n=JSON.parse(n)),t=n}else if(e.queryStringParameters){let n=e.queryStringParameters;"string"==typeof n.data&&(n.data=JSON.parse(n.data)),t=n}}else t=JSON.parse(JSON.stringify(e));return t.data||(t.data={}),t.uniIdToken||(t.uniIdToken=t.uni_id_token),t.url=t.$url||"",t};var W=U;module.exports=W; diff --git a/uniCloud-aliyun/cloudfunctions/common/vk-unicloud/package.json b/uniCloud-aliyun/cloudfunctions/common/vk-unicloud/package.json index 54badd0..1565d6e 100644 --- a/uniCloud-aliyun/cloudfunctions/common/vk-unicloud/package.json +++ b/uniCloud-aliyun/cloudfunctions/common/vk-unicloud/package.json @@ -1,6 +1,6 @@ { "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", diff --git a/uniCloud-aliyun/cloudfunctions/router/config.js b/uniCloud-aliyun/cloudfunctions/router/config.js index 36562fb..59e0fa1 100644 --- a/uniCloud-aliyun/cloudfunctions/router/config.js +++ b/uniCloud-aliyun/cloudfunctions/router/config.js @@ -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; diff --git a/uniCloud-aliyun/cloudfunctions/router/dao/index.js b/uniCloud-aliyun/cloudfunctions/router/dao/index.js index c618eee..94ed463 100644 --- a/uniCloud-aliyun/cloudfunctions/router/dao/index.js +++ b/uniCloud-aliyun/cloudfunctions/router/dao/index.js @@ -1,4 +1,4 @@ -// 加载模块 - 数据库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 diff --git a/uniCloud-aliyun/cloudfunctions/router/dao/modules/userDao.js b/uniCloud-aliyun/cloudfunctions/router/dao/modules/userDao.js index 9934fc0..b3c64c7 100644 --- a/uniCloud-aliyun/cloudfunctions/router/dao/modules/userDao.js +++ b/uniCloud-aliyun/cloudfunctions/router/dao/modules/userDao.js @@ -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; diff --git a/uniCloud-aliyun/cloudfunctions/router/middleware/index.js b/uniCloud-aliyun/cloudfunctions/router/middleware/index.js index 1152d22..baf3a76 100644 --- a/uniCloud-aliyun/cloudfunctions/router/middleware/index.js +++ b/uniCloud-aliyun/cloudfunctions/router/middleware/index.js @@ -1,4 +1,4 @@ -// 加载模块 - 中间件 +// 加载模块 - 中间件 请勿改动此文件----------------------------------- 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 diff --git a/uniCloud-aliyun/cloudfunctions/router/middleware/modules/returnUserInfoFilter.js b/uniCloud-aliyun/cloudfunctions/router/middleware/modules/returnUserInfoFilter.js index 742c941..330fce7 100644 --- a/uniCloud-aliyun/cloudfunctions/router/middleware/modules/returnUserInfoFilter.js +++ b/uniCloud-aliyun/cloudfunctions/router/middleware/modules/returnUserInfoFilter.js @@ -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, diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/Promise.all.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/Promise.all.js index 96618e1..52b1628 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/Promise.all.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/Promise.all.js @@ -27,7 +27,7 @@ module.exports = { "_add_time": 1597456395010+i, "user_id": "001" } - }, event.util); + }); tasks.push(promise); } // 等待所有 diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/add.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/add.js index 1495104..deea807 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/add.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/add.js @@ -29,7 +29,7 @@ module.exports = { "latitude":latitude, }, } - },event.util); + }); // 业务逻辑结束----------------------------------------------------------- return res; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/adds.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/adds.js index b22808c..cb49256 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/adds.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/adds.js @@ -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 + "秒"); diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/avg.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/avg.js index f8e4990..83b5637 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/avg.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/avg.js @@ -19,7 +19,7 @@ module.exports = { whereJson:{ } - },event.util); + }); // 业务逻辑结束----------------------------------------------------------- return res; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/count.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/count.js index 4e8a7b9..15a4d2b 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/count.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/count.js @@ -18,7 +18,7 @@ module.exports = { whereJson:{ } - },event.util); + }); // 对应的sql: // count * from vk-test // 业务逻辑结束----------------------------------------------------------- diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/del.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/del.js index f147d02..20b7e52 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/del.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/del.js @@ -23,7 +23,7 @@ module.exports = { whereJson:{ user_id:_.neq("___") } - },event.util); + }); // 对应的sql: // delete from vk-test where user_id != '___' // 业务逻辑结束----------------------------------------------------------- diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/findById.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/findById.js index b31fe2c..312a7a4 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/findById.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/findById.js @@ -19,7 +19,7 @@ module.exports = { fieldJson:{ } - },event.util); + }); // 上面的 fieldJson 可以设置 显示什么字段或设置不显示什么字段 如 money:false 代表不显示money字段 // 对应的sql: // select * from vk-test where _id = "5f3a125b3d11c6000106d338" diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/findByWhereJson.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/findByWhereJson.js index e213147..16db31c 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/findByWhereJson.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/findByWhereJson.js @@ -21,7 +21,7 @@ module.exports = { whereJson:{ _id:data._id, } - },event.util); + }); // 上面的 fieldJson 可以设置 显示什么字段或设置不显示什么字段 如 money:false 代表不显示money字段 // 对应的sql: // select * from vk-test where _id = "5f3a125b3d11c6000106d338" diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/geo.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/geo.js index 56eed50..ef13849 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/geo.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/geo.js @@ -24,7 +24,7 @@ module.exports = { minDistance: 0 // 选填,最小距离,米为单位 }) }, - }, event.util); + }); // 业务逻辑结束----------------------------------------------------------- return res; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/getList.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/getList.js index 8ad0a15..d9af7a6 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/getList.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/getList.js @@ -65,7 +65,7 @@ module.exports = { fieldJson:fieldJson, whereJson:whereJson, sortArr:sortArr - }, util); + }); // 业务逻辑结束----------------------------------------------------------- return res; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/max.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/max.js index c6ef9f2..095865b 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/max.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/max.js @@ -19,7 +19,7 @@ module.exports = { whereJson:{ } - },event.util); + }); // 业务逻辑结束----------------------------------------------------------- return res; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/min.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/min.js index ee74142..14152d3 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/min.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/min.js @@ -19,7 +19,7 @@ module.exports = { whereJson:{ } - },event.util); + }); // 业务逻辑结束----------------------------------------------------------- return res; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/sample.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/sample.js index 603dc27..ba8fa80 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/sample.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/sample.js @@ -19,7 +19,7 @@ module.exports = { whereJson:{ }, - },event.util); + }); // 业务逻辑结束----------------------------------------------------------- return res; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/select.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/select.js index da8bdcb..37146fb 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/select.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/select.js @@ -20,7 +20,7 @@ module.exports = { whereJson:{ user_id:"001" }, - }, event.util); + }); // 对应的sql: // select * from vk-test where user_id == '001' limit 0,100; // 业务逻辑结束----------------------------------------------------------- diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/select2.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/select2.js index fbb1a11..e0b47f0 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/select2.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/select2.js @@ -1,6 +1,6 @@ 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; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/selects.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/selects.js index c079ac2..9e61131 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/selects.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/selects.js @@ -56,7 +56,7 @@ module.exports = { sortArr:[{"name":"id", "type":"desc"}], }, ] - }, event.util); + }); // 业务逻辑结束----------------------------------------------------------- return res; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/selects_mode_2.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/selects_mode_2.js index 400e017..c52956c 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/selects_mode_2.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/selects_mode_2.js @@ -32,7 +32,7 @@ module.exports = { limit:1 } ] - }, event.util); + }); // 业务逻辑结束----------------------------------------------------------- return res; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/sum.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/sum.js index e3e9514..5024dcf 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/sum.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/sum.js @@ -19,7 +19,7 @@ module.exports = { whereJson:{ } - },event.util); + }); // 对应的sql: // select sum(money) from vk-test // 业务逻辑结束----------------------------------------------------------- diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/update.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/update.js index 00c8a8f..123032b 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/update.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/pub/update.js @@ -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; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/sys/globalDataCache.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/sys/globalDataCache.js new file mode 100644 index 0000000..e56f3d9 --- /dev/null +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/sys/globalDataCache.js @@ -0,0 +1,49 @@ +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; + } +} diff --git a/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/sys/transaction.js b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/sys/transaction.js new file mode 100644 index 0000000..7bdab42 --- /dev/null +++ b/uniCloud-aliyun/cloudfunctions/router/service/template/db_api/sys/transaction.js @@ -0,0 +1,79 @@ +'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; + } +} diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/bindAlipay.js b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/bindAlipay.js index fb2599e..0d32f7a 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/bindAlipay.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/bindAlipay.js @@ -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; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/bindWeixin.js b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/bindWeixin.js index 486ac3c..2d95e28 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/bindWeixin.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/bindWeixin.js @@ -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; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/getInvitedUser.js b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/getInvitedUser.js index b29c07c..79f629c 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/getInvitedUser.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/getInvitedUser.js @@ -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; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/getMenu.js b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/getMenu.js index 6d867f0..c2d9ad0 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/getMenu.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/getMenu.js @@ -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 diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/getMyUserInfo.js b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/getMyUserInfo.js index 3399bd6..e1610ec 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/getMyUserInfo.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/getMyUserInfo.js @@ -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; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/unbindAlipay.js b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/unbindAlipay.js index 1993934..884bc68 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/unbindAlipay.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/unbindAlipay.js @@ -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; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/unbindWeixin.js b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/unbindWeixin.js index 69da5b8..b7be64c 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/unbindWeixin.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/unbindWeixin.js @@ -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; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/updateUser.js b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/updateUser.js index 47ac85a..2e6763a 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/updateUser.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/updateUser.js @@ -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]; diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/checkToken.js b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/checkToken.js index c7fd5e1..a77f00f 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/checkToken.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/checkToken.js @@ -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 详细信息 diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/encryptPwd.js b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/encryptPwd.js index 2720ae0..416677b 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/encryptPwd.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/encryptPwd.js @@ -15,7 +15,6 @@ module.exports = { let {uniID} = event.util; let res = {}; // 业务逻辑开始----------------------------------------------------------- - // 验证token是否有效(会返回uid) const password = await uniID.encryptPwd('123456'); res = { code: 0, diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/login.js b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/login.js index eb781a0..f170ab2 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/login.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/login.js @@ -19,6 +19,7 @@ module.exports = { let res = {}; // 业务逻辑开始----------------------------------------------------------- // 用户登录(账号+密码) + res = await uniID.login({ ...event.data, // 不指定queryField的情况下只会查询username diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByAlipay.js b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByAlipay.js index 3f2f83b..c54b37f 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByAlipay.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByAlipay.js @@ -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"); diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByEmail.js b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByEmail.js index a30d079..fed50bb 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByEmail.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByEmail.js @@ -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"); diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginBySms.js b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginBySms.js index 27713fa..e1a4fe8 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginBySms.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginBySms.js @@ -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({ diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByWeixin.js b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByWeixin.js index 1f28521..8f98514 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByWeixin.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByWeixin.js @@ -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"); diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/register.js b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/register.js index b997717..3cf05e0 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/register.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/register.js @@ -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; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/resetPasswordByMobile.js b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/resetPasswordByMobile.js index 58a6d03..6c360da 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/resetPasswordByMobile.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/resetPasswordByMobile.js @@ -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 验证码 diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/sendEmailCode.js b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/sendEmailCode.js index 3f28ab3..f534b4b 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/sendEmailCode.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/sendEmailCode.js @@ -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 验证码类型 diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/sendSmsCode.js b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/sendSmsCode.js index e070ba4..8037e83 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/sendSmsCode.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/sendSmsCode.js @@ -33,7 +33,7 @@ module.exports = { provider : "aliyun", mobile : mobile, code : code, - }, event.util); + }); if(sendSmsRes.code != 0){ return { code : -1, diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/setVerifyCode.js b/uniCloud-aliyun/cloudfunctions/router/service/user/sys/setVerifyCode.js similarity index 79% rename from uniCloud-aliyun/cloudfunctions/router/service/user/pub/setVerifyCode.js rename to uniCloud-aliyun/cloudfunctions/router/service/user/sys/setVerifyCode.js index 5a80330..efc43c8 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/setVerifyCode.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/sys/setVerifyCode.js @@ -1,11 +1,8 @@ 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 手机号 diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/sys/test1.js b/uniCloud-aliyun/cloudfunctions/router/service/user/sys/test1.js deleted file mode 100644 index 4c633dc..0000000 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/sys/test1.js +++ /dev/null @@ -1,26 +0,0 @@ -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 diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/util/login_log.js b/uniCloud-aliyun/cloudfunctions/router/service/user/util/login_log.js index 0fa3c51..b9f668e 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/util/login_log.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/util/login_log.js @@ -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("日志写入错误"); } -- GitLab