This commit is contained in:
2026-10-08 18:20:51 +08:00
parent dec4ebc773
commit 6f1b2dc03a
621 changed files with 47117 additions and 43176 deletions
@@ -0,0 +1,12 @@
const requireFn = function(path) {
return require(path);
}
const initConfig = {
baseDir: __dirname, // 云函数根目录地址
requireFn,
customUtil :{
// 你自己的工具包,写这里后即可听过customUtil.mynpm1调用
// mynpm1:mynpm1
}
};
module.exports = initConfig;
@@ -0,0 +1,29 @@
// 加载模块 - 数据库dao层 API 请勿改动此文件-----------------------------------
const modulesPath = __dirname + "/modules";
const fs = require('fs');
const fileList = fs.readdirSync(modulesPath);
const moduleObj = {};
const modulesNames = [];
fileList.map((file, index) => {
if (file.indexOf("Dao.js") > -1) {
modulesNames.push(file.substring(0, file.length - 3));
}
});
modulesNames.map((modulesName, index) => {
try {
moduleObj[modulesName] = require(modulesPath + "/" + modulesName);
} catch (err) {
console.error(`【异常】加载【${modulesName}】异常,请检查!↓↓↓请查看下方的错误提示↓↓↓`);
console.error(err);
console.error(`【异常】加载【${modulesName}】异常,请检查!↑↑↑请查看上方的错误提示↑↑↑`);
}
});
moduleObj.init = function(obj) {
modulesNames.map((modulesName, index) => {
if (typeof moduleObj[modulesName] === "object" && typeof moduleObj[modulesName].init === "function") {
moduleObj[modulesName].init(obj);
}
});
}
module.exports = moduleObj;
// 加载模块 - 数据库dao层 API 请勿改动此文件-----------------------------------
@@ -0,0 +1,621 @@
// 涉及的表名
const dbName = {
user: "uni-id-users", // 用户
};
var dao = {};
var util = {};
// 初始化
dao.init = function(obj) {
util = obj;
}
/**
* 获取用户信息
* 调用示例
* await vk.daoCenter.userDao.findById(user_id);
* data 请求参数说明
* @param {String} user_id 用户ID
*/
dao.findById = async (user_id) => {
let { vk, db, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
res = await vk.baseDao.findById({
dbName: dbName.user,
id: user_id,
fieldJson: { token: false, password: false },
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 查 - 根据whereJson获取单条记录
* @param {Object} whereJson 条件
* @param {Object} fieldJson 字段显示规则
* 调用示例
let userInfo = await vk.daoCenter.userDao.findByWhereJson({
});
*/
dao.findByWhereJson = async (whereJson, fieldJson={ token: false, password: false }) => {
let { vk, db, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
res = await vk.baseDao.findByWhereJson({
dbName: dbName.user,
whereJson,
fieldJson
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 根据邀请码获取用户信息
* let inviterUserInfo = await vk.daoCenter.userDao.findByInviteCode(invite_code);
* @param {String} invite_code 邀请码
*/
dao.findByInviteCode = async (invite_code) => {
let { vk, db, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
res = await vk.baseDao.findByWhereJson({
dbName: dbName.user,
whereJson: {
my_invite_code: invite_code
},
fieldJson: { token: false, password: false }
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 增 - 添加一条记录
* @param {Object} dataJson 添加的数据
* 调用示例
await vk.daoCenter.userDao.add({
});
或
* 调用示例
await vk.daoCenter.userDao.add({
db: transaction,
dataJson: {
}
});
*/
dao.add = async (obj) => {
let { vk, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
if (obj.db && obj.dataJson) {
// 支持事务
res = await vk.baseDao.add({
...obj,
cancelAddTime: true, // 因为user表使用了register_date作为创建时间
dbName: dbName.user,
});
} else {
// 不支持事务
res = await vk.baseDao.add({
dbName: dbName.user,
cancelAddTime: true, // 因为user表使用了register_date作为创建时间
dataJson: obj
});
}
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 增 - 添加多条记录
* @param {Object} dataJson 添加的数据
* 调用示例
await vk.daoCenter.userDao.adds(dataArr);
*/
dao.adds = async (dataArr) => {
let { vk, db, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
res = await vk.baseDao.adds({
dbName: dbName.user,
cancelAddTime: true, // 因为user表使用了register_date作为创建时间
dataJson: dataArr
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 删 - 删除多条记录
* @param {Object} whereJson 条件
* 调用示例
await vk.daoCenter.userDao.del({
});
*/
dao.del = async (whereJson) => {
let { vk, db, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
res = await vk.baseDao.del({
dbName: dbName.user,
whereJson
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 删 - 据ID删除单条数据
* @param {String} _id
* 调用示例
await vk.daoCenter.userDao.deleteById(_id);
或
await vk.daoCenter.userDao.deleteById(_id, transaction);
*/
dao.deleteById = async (_id, db) => {
let { vk, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
res = await vk.baseDao.deleteById({
db,
dbName: dbName.user,
id: _id
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 改 - 批量修改
* @param {Object} whereJson 条件
* @param {Object} dataJson 修改的数据
* 调用示例
await vk.daoCenter.userDao.update({
whereJson:{
},
dataJson:{
}
});
*/
dao.update = async (obj = {}) => {
let { vk, db, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
res = await vk.baseDao.update({
...obj,
dbName: dbName.user
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 改 - 根据id修改
* @param {Object} whereJson 条件
* @param {Object} dataJson 修改的数据
* 调用示例
await vk.daoCenter.userDao.updateById({
id: uid,
dataJson:{
}
});
*/
dao.updateById = async (obj = {}) => {
let { vk, db, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
res = await vk.baseDao.updateById({
...obj,
dbName: dbName.user
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 改 - 更新并返回更新后的数据(无论条件匹配到多少条记录,只会修改第一条记录,同时返回修改后的数据)
* @param {Object} whereJson 条件
* @param {Object} dataJson 修改的数据
* 调用示例
await vk.daoCenter.userDao.updateAndReturn({
whereJson:{
},
dataJson:{
}
});
*/
dao.updateAndReturn = async (obj = {}) => {
let { vk, db, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
res = await vk.baseDao.updateAndReturn({
...obj,
dbName: dbName.user
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 查 - 获取记录总条数
* @param {Object} whereJson 条件
* 调用示例
await vk.daoCenter.userDao.count(whereJson);
*/
dao.count = async (whereJson) => {
let { vk, db, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
res = await vk.baseDao.count({
dbName: dbName.user,
whereJson
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 查 - 求和
* @param {String} fieldName 需要求和的字段名
* @param {Object} whereJson 筛选条件
* 调用示例
let userSum = await vk.daoCenter.userDao.sum({
fieldName: "",
whereJson: {
}
});
*/
dao.sum = async (obj) => {
let { vk, db, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
res = await vk.baseDao.sum({
...obj,
dbName: dbName.user,
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 查 - 求最大值
* @param {String} fieldName 需要求最大值的字段名
* @param {Object} whereJson 筛选条件
* 调用示例
let userMax = await vk.daoCenter.userDao.max({
fieldName: "",
whereJson: {
}
});
*/
dao.max = async (obj) => {
let { vk, db, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
res = await vk.baseDao.max({
...obj,
dbName: dbName.user,
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 查 - 求最小值
* @param {String} fieldName 需要求最小值的字段名
* @param {Object} whereJson 筛选条件
* 调用示例
let userMin = await vk.daoCenter.userDao.min({
fieldName: "",
whereJson: {
}
});
*/
dao.min = async (obj) => {
let { vk, db, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
res = await vk.baseDao.min({
...obj,
dbName: dbName.user,
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 查 - 求最平均值
* @param {String} fieldName 需要求最平均值的字段名
* @param {Object} whereJson 筛选条件
* 调用示例
let userAvg = await vk.daoCenter.userDao.avg({
fieldName: "",
whereJson: {
}
});
*/
dao.avg = async (obj) => {
let { vk, db, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
res = await vk.baseDao.avg({
...obj,
dbName: dbName.user,
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 查 - 获取数据列表
* 调用示例
let userList = await vk.daoCenter.userDao.select({
pageIndex:1,
pageSize:20,
getMain:false,
whereJson:{
},
fieldJson:{},
sortArr:[{ "name":"_id", "type":"desc" }],
});
*/
dao.select = async (obj = {}) => {
let { vk, db, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
res = await vk.baseDao.select({
...obj,
dbName: dbName.user
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 查 - 获取数据列表
* 调用示例
let userList = await vk.daoCenter.userDao.selects({
pageIndex:1,
pageSize:20,
getMain:false,
whereJson:{
},
fieldJson:{},
sortArr:[{ "name":"_id", "type":"desc" }],
// 副表列表
foreignDB:[
{
dbName:"副表表名",
localKey:"主表外键名",
foreignKey:"副表外键名",
as:"副表as字段",
limit:1
}
]
});
*/
dao.selects = async (obj = {}) => {
let { vk, db, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
res = await vk.baseDao.selects({
...obj,
dbName: dbName.user
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 查 - 获取数据列表
* 调用示例
res = await vk.daoCenter.userDao.getTableData({
data
});
*/
dao.getTableData = async (obj = {}) => {
let { vk, db, _ } = util;
let res = {};
// 数据库操作开始-----------------------------------------------------------
res = await vk.baseDao.getTableData({
...obj,
dbName: dbName.user
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 获取用户信息(旧版)
* _id
* username
* mobile
* email
* wx_openid.app-plus
* wx_openid.mp-weixin
* wx_unionid
* ali_openid
* my_invite_code
* 调用示例
await vk.daoCenter.userDao.findByUserInfo({
mobile:mobile
});
* data 请求参数说明
* @param {Object} userInfo 用户信息
*/
dao.findByUserInfo = async (userInfo) => {
let { vk, db, _ } = util;
let res;
// 数据库操作开始-----------------------------------------------------------
let whereJson = {};
let list = [
"_id",
"username",
"mobile",
"email",
"wx_openid.app-plus",
"wx_openid.mp-weixin",
"wx_unionid",
"ali_openid",
"my_invite_code"
];
let orArr = [];
for (let i = 0; i < list.length; i++) {
let keyName = list[i];
let orObj = {};
if (vk.pubfn.isNotNull(userInfo[keyName])) orObj[keyName] = userInfo[keyName];
if (vk.pubfn.isNotNull(orObj)) {
orArr.push(orObj);
}
}
if (orArr.length > 0) {
whereJson = _.or(orArr);
res = await vk.baseDao.findByWhereJson({
dbName: dbName.user,
fieldJson: { token: false, password: false },
whereJson: whereJson
});
}
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 根据ID数组获取用户列表 最多支持500个
* 调用示例
* await vk.daoCenter.userDao.listByIds(userIdArr);
* data 请求参数说明
* @param {Array} userIdArr 用户ID数组
*/
dao.listByIds = async (userIdArr) => {
let { vk, db, _ } = util;
let res = await vk.baseDao.select({
dbName: dbName.user,
pageIndex: 1,
pageSize: 500,
getMain: true,
fieldJson: { token: false, password: false },
whereJson: {
_id: _.in(userIdArr)
},
});
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 根据手机号直接注册账号并登录
* 若手机号已存在,则直接登录
* @param {Object} data 参数
* mobile 手机号 必填
* password 初始密码
* inviteCode 邀请人的邀请码
* myInviteCode 设置当前注册用户自己的邀请码
* needPermission 设置为true时会在checkToken时返回用户权限(permission),建议在管理控制台中使用
* 调用示例
await vk.daoCenter.userDao.registerUserByMobile({
mobile,
});
*/
dao.registerUserByMobile = async (data) => {
let { vk, db, _, uniID } = util;
let res = {};
let {
mobile,
password,
inviteCode,
myInviteCode,
needPermission
} = data;
// 数据库操作开始-----------------------------------------------------------
let code = vk.pubfn.random(6);
// 设置验证码
await uniID.setVerifyCode({
mobile,
code,
expiresIn: 60,
type: "login"
});
// 若手机号不存在,则注册并登录。存在,则直接登录。
res = await uniID.loginBySms({
mobile,
code,
password,
inviteCode,
myInviteCode,
needPermission
});
if (res.uid && vk.pubfn.isNull(res.userInfo)) {
res.userInfo = await vk.daoCenter.userDao.findById(res.uid);
}
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 重置用户密码
* data 请求参数说明
* @param {String} uid 用户ID
* @param {String} password 需要重置的密码
* 调用示例
await vk.daoCenter.userDao.resetPwd({
uid: uid,
password: "123456"
});
*/
dao.resetPwd = async (data) => {
let { vk, db, _, uniID } = util;
let res = {};
let {
uid,
password
} = data;
// 数据库操作开始-----------------------------------------------------------
res = await uniID.resetPwd({ uid, password });
// 数据库操作结束-----------------------------------------------------------
return res;
};
/**
* 获取一个未被使用的6位数分享码
* 调用示例
await vk.daoCenter.userDao.getValidInviteCode();
*/
dao.getValidInviteCode = async (data) => {
let { vk, db, _ } = util;
// 数据库操作开始-----------------------------------------------------------
let inviteCode = await vk.pubfn.randomAsync(6, "23456789ABCDEFGHJKLMNPQRSTUVWXYZ", async (val)=>{
let num = await vk.baseDao.count({
dbName: dbName.user,
whereJson:{
my_invite_code: val
}
}, 10); // 最大重试10次
return num === 0 ? true : false;
});
// 数据库操作结束-----------------------------------------------------------
return inviteCode;
};
module.exports = dao;
@@ -0,0 +1,7 @@
'use strict';
// 注意:此为云函数路由入口文件,请勿修改此文件代码,你自己的云函数逻辑应写在service目录下
const vkCloud = require('vk-unicloud'); // 引入 vk-unicloud
const vk = vkCloud.createInstance(require('./config.js')); // 通过 vkCloud.createInstance 创建 vk 实例
exports.main = async (event, context) => {
return await vk.router({ event, context, vk });
};
@@ -0,0 +1,29 @@
// 加载模块 - 中间件 请勿改动此文件-----------------------------------
const modulesPath = __dirname+"/modules";
const fs = require('fs');
const fileList = fs.readdirSync(modulesPath);
var moduleList = [];
var modulesNames = [];
fileList.map((file, index) => {
if(file.indexOf(".js") > -1){
modulesNames.push(file.substring(0,file.length-3));
}
});
modulesNames.map((modulesName, index) => {
try {
moduleList.push(require(modulesPath+"/"+modulesName));
} catch (err) {
console.error(`【异常】加载中间件【${modulesName}】异常,请检查!↓↓↓请查看下方的错误提示↓↓↓`);
console.error(err);
console.error(`【异常】加载中间件【${modulesName}】异常,请检查!↑↑↑请查看上方的错误提示↑↑↑`);
}
});
var middlewareList = [];
moduleList.map((moduleItem, index) => {
middlewareList = middlewareList.concat(moduleItem);
});
module.exports = middlewareList;
// 加载模块 - 中间件 请勿改动此文件-----------------------------------
@@ -0,0 +1,63 @@
/**
* 添加操作日志
*/
// 需要添加日志的云函数列表
const urlList = [
{ url: "admin/system/user/sys/add", title: "用户添加" },
{ url: "admin/system/user/sys/update", title: "用户修改" },
{ url: "admin/system/user/sys/delete", title: "用户删除" },
{ url: "admin/system/user/sys/batchUpdateStatus", title: "批量修改用户冻结状态" }
];
// 生成regExp规则
let regExp = urlList.map((item, index) => {
return `^${item.url}$`;
});
module.exports = [{
id: "addAdminLog",
// 需要添加操作日志的云函数列表
regExp,
description: "添加admin操作日志",
index: 999, // 确保最后执行即可
mode: "onActionExecuted", // 可选 onActionExecuting onActionExecuted
enable: true, // 通过设置enable=false可以关闭该中间件
main: async function(event, serviceRes) {
let { url, data = {}, uniIdToken, util, filterResponse, originalParam } = event;
let { uniID, config, vk, db, _ } = util;
let { userInfo = {} } = filterResponse;
let res = serviceRes;
try {
// 此处加 try catch 保证即使添加日志环节出错,不影响业务运行。
if (res.code === 0) {
// 只有请求成功的请求才添加日志
let item = vk.pubfn.getListItem(urlList, "url", url);
let title = item && item.title ? item.title : "未分类";
delete data.uid;
// 日志写入数据库
// 获取请求id(只有云端云函数才有请求id,本地运行的云函数无请求id)
let request_id;
if (typeof vk.pubfn.getUniCloudRequestId === "function") {
request_id = vk.pubfn.getUniCloudRequestId();
}
await vk.baseDao.add({
dbName: "opendb-admin-log",
dataJson: {
user_id: userInfo._id,
user_name: userInfo.nickname,
title,
ip: originalParam.context.CLIENTIP,
url: url,
request_param: data,
response: serviceRes,
request_id
}
});
}
} catch (err) {
console.error("添加日志异常", err);
}
return res;
}
}]
@@ -0,0 +1,22 @@
/**
* 自定义过滤器 - 前置
*/
module.exports = [
{
id: "xxxx1",
regExp: "^xxx1/kh", // 正则匹配规则,这个是以^xxx1/kh/开头的云函数会被拦截
description: "这里是你过滤器1号的描述",
index: 310,// 此处必须>300 因为检测用户是否登录的过滤器的index是200(sys是300,因此为了能通用,建议填大于300的值)(越小越先执行)
mode:"onActionExecuting", // 可选 onActionExecuting onActionExecuted
main: async function(event) {
// 这里是拦截规则,可以查数据库,最终code:0 代表通过,其他均为未通过,msg是被拦截的原因
let { data = {}, util } = event;
let { vk } = util;
return {
code: -1,
msg: "被自定义过滤器1号拦截了"
}
}
}
]
@@ -0,0 +1,19 @@
/**
* 自定义过滤器 - 后置
*/
module.exports = [
{
id: "xxxx2",
regExp: "^xxx2/kh", // 正则匹配规则,这个是以^xxx2/kh/开头的云函数会被拦截
description: "这里是你过滤器2号的描述",
index: 310,// 此处必须>300 因为检测用户是否登录的过滤器的index是200(sys是300,因此为了能通用,建议填大于300的值)(越小越先执行)
mode:"onActionExecuted", // 可选 onActionExecuting onActionExecuted
main: async function(event, serviceRes) {
let { data = {}, util } = event;
let { vk } = util;
serviceRes.msg = "被过滤器修改后的值";
return serviceRes;
}
}
]
@@ -0,0 +1,46 @@
/**
* 注册成功后,统一给用户初始化字段值
*/
module.exports = [{
id: "registerInit",
// 符合下方正则条件的云函数才会进入该中间件
regExp: [
"^user/pub/register(.*)",
"^user/pub/login(.*)",
"^admin/system/user/sys/add"
],
description: "注册成功后,统一给用户初始化字段值",
index: 301,
mode: "onActionExecuted", // 可选 onActionExecuting onActionExecuted
enable: true, // 通过设置enable=false可以关闭该中间件
main: async function(event, serviceRes) {
let { data = {}, util, filterResponse, originalParam } = event;
let { vk, config, db, _ } = util;
let res = serviceRes;
// 初始化用户信息(只在用户注册成功时才执行下面的代码)
if (res.code === 0 && res.type === "register" && res.uid) {
let uniIdConfig = vk.pubfn.getUniIdConfig(config); // 获取uniID的配置
// 你要初始化的字段数据
let initData = {
// 这里可以加你想要初始化的其他字段,如 status字段初始化为 0
status: 0, // 用户状态:0 正常 1 禁用 2 审核中 3 审核拒绝
};
// 如果开启了删除dcloud_appid功能,则初始化数据带上 dcloud_appid: _.remove()
if (uniIdConfig.removeDcloudAppid) {
// remove功能是删除该字段(代表关闭隔离不同端用户功能),该用户在其他项目中登录时就不会产生新的账号 详见:https://uniapp.dcloud.io/uniCloud/uni-id.html#isolate-user
initData["dcloud_appid"] = _.remove();
}
// 修改用户信息,并返回修改后的用户信息
res.userInfo = await vk.daoCenter.userDao.updateAndReturn({
whereJson: {
_id: res.uid,
},
dataJson: initData
});
}
return res;
}
}]
@@ -0,0 +1,81 @@
/**
* 返回用户信息
* 由于通常前端需要对用户信息、登录token进行缓存
* 故云函数对用户进行修改后,需要返回给前端最新的用户信息,以便前端始终能够缓存最新用户信息
*/
module.exports = [{
id: "returnUserInfo",
regExp: [
"^user/pub/login(.*)",
"^user/pub/register(.*)",
"^user/kh/bind(.*)",
"^user/kh/unbind(.*)",
"^user/kh/update(.*)",
"^user/kh/set(.*)",
"^user/kh/acceptInvite$",
"^user/kh/getMyUserInfo$",
"^client/user/pub/register(.*)",
"^client/user/pub/login(.*)"
],
description: "用于指定哪些云函数请求后需要通知前端更新userInfo、token、tokenExpired",
index: 310,
mode: "onActionExecuted", // 可选 onActionExecuting onActionExecuted
enable: true, // 通过设置enable=false可以关闭该中间件
main: async function(event, serviceRes) {
let { data = {}, uniIdToken, util, filterResponse, originalParam } = event;
let { uniID, config = {}, vk, db, _ } = util;
let { userInfo = {} } = filterResponse;
let res = serviceRes;
if (res.code === 0) {
if (vk.pubfn.isNull(res.userInfo)) {
if (vk.pubfn.isNotNull(res.uid)) {
res.userInfo = await vk.daoCenter.userDao.findById(res.uid);
} else if (vk.pubfn.isNotNull(uniIdToken)) {
let tokenRes = await uniID.checkToken(uniIdToken);
if (tokenRes.code === 0) {
res.userInfo = tokenRes.userInfo;
}
}
}
if (vk.pubfn.isNotNull(res.userInfo)) {
if (res.type === "login") {
// 如果是登录
// 判断用户当前 token数量 是否超过了最大限制 若 tokenMaxLimit 设置为0,代表不限制
let tokenMaxLimit = config.uni && config.uni.tokenMaxLimit;
if (tokenMaxLimit > 0) {
let newUserInfo = await vk.baseDao.findById({
dbName: "uni-id-users",
id: res.userInfo._id,
fieldJson: { token: true }
});
let token = newUserInfo.token || [];
if (token.length > tokenMaxLimit) {
// 淘汰旧的 token
token = token.splice(tokenMaxLimit * -1);
await vk.baseDao.updateById({
dbName: "uni-id-users",
id: res.userInfo._id,
dataJson: {
token: _.set(token)
}
});
}
}
}
res.needUpdateUserInfo = true;
// 此处可以继续去除你不想返回给前端的字段
let deleteKeys = ["token", "password"];
res.userInfo = vk.pubfn.deleteObjectKeys(res.userInfo, deleteKeys);
}
if (vk.pubfn.isNotNullAll(res.token, res.tokenExpired)) {
// 当返回vk_uni_token对象后,框架会让token自动被前端缓存,前端不需要手动再保存token至本地缓存了。
res.vk_uni_token = {
token: res.token,
tokenExpired: res.tokenExpired
};
}
}
return res;
}
}]
@@ -0,0 +1,28 @@
{
"name": "router",
"version": "1.0.0",
"description": "在router目录下执行 npm i",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"uni-config-center": "file:../../../uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center",
"uni-id": "file:../../../uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id",
"vk-unicloud": "file:../../../uni_modules/vk-unicloud/uniCloud/cloudfunctions/common/vk-unicloud"
},
"private": true,
"cloudfunction-config": {
"concurrency": 1,
"memorySize": 512,
"path": "",
"timeout": 60,
"triggers": [],
"runtime": "Nodejs12",
"keepRunningAfterReturn": false
},
"extensions": {}
}
@@ -0,0 +1,13 @@
// 运行方法:右键云函数根目录(如router目录),并点击【运行-本地云函数】即可。
// 若函数需要登录才能访问,则填写uni_id_token的值,值为对应用户的token(可直接从数据库中复制1个过来)
// $url 是 云函数运行路径,如 user/pub/checkToken
// data 是 请求参数,为标准json格式(属性名需要加双引号)
{
"uni_id_token":"",
"$url":"template/openapi/weixin/pub/getTemplateList",
"data":{
}
}
@@ -0,0 +1,34 @@
module.exports = {
/**
* 添加单条数据
* @url admin/kong/sys/add 前端调用的url参数地址
* data 请求参数 说明
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : 'ok' };
// 业务逻辑开始-----------------------------------------------------------
let {
params1,
params2,
params3
} = data;
// 这里需要把 params1 params2 params3 改成你数据库里允许用户添加的字段
let dbName = "vk-test";
res.id = await vk.baseDao.add({
dbName,
dataJson:{
params1,
params2,
params3
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,29 @@
module.exports = {
/**
* 数据删除
* @url admin/kong/sys/delete 前端调用的url参数地址
* data 请求参数 说明
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : 'ok' };
// 业务逻辑开始-----------------------------------------------------------
let { _id } = data;
if(vk.pubfn.isNull(_id)){
return { code : -1, msg : 'id不能为空' };
}
let dbName = "vk-test";
await vk.baseDao.deleteById({
dbName,
id:_id
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,29 @@
module.exports = {
/**
* 查询多条记录 分页
* @url admin/kong/sys/getList 前端调用的url参数地址
* data 请求参数 说明
* @param {Number} pageIndex 当前页码
* @param {Number} pageSize 每页显示数量
* @param {Array<Object>} sortRule 排序规则
* @param {object} formData 查询条件数据源
* @param {Array<Object>} columns 查询条件规则
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
let dbName = "vk-test";
res = await vk.baseDao.getTableData({
dbName,
data
});
return res;
}
}
@@ -0,0 +1,40 @@
module.exports = {
/**
* 修改数据
* @url admin/kong/sys/update 前端调用的url参数地址
* data 请求参数 说明
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : 'ok' };
// 业务逻辑开始-----------------------------------------------------------
let {
_id,
params1,
params2,
params3
} = data;
// 这里需要把 params1 params2 params3 改成你数据库里允许用户添加的字段
if(vk.pubfn.isNullOne(_id)){
return { code : -1, msg : '参数错误' };
}
let dbName = "vk-test";
await vk.baseDao.updateById({
dbName,
id:_id,
dataJson:{
params1,
params2,
params3
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,96 @@
module.exports = {
/**
* 查询用户列表(用于后端用户选择器的搜索数据)
* @url admin/select/kh/user 前端调用的url参数地址
* data 请求参数 说明
* @param {String} searchvalue 搜索内容
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
// 可写与数据库的交互逻辑等等
let { searchvalue } = data;
if (!searchvalue) {
return { code: 0, list: [] };
}
let dbName = "uni-id-users";
let fieldJson = {
_id: true,
username: true,
nickname: true,
mobile: true,
};
let sortArr = [];
// 排序规则开始-----------------------------------------------------------
sortArr.push({
"name": "register_date",
"type": "desc"
});
// 排序规则结束-----------------------------------------------------------
// 查询条件开始-----------------------------------------------------------
let whereJson = {};
let andArr = [];
if (searchvalue) {
// 查询包含searchvalue的数据
try {
let regExp = new RegExp(searchvalue);
let orObj = _.or([
{
"username": regExp
},
{
"nickname": regExp
},
{
"mobile": regExp
},
{
"_id": searchvalue
}
]);
andArr.push(orObj);
} catch (err) {
return { code: -1, msg: '请输入合法的查询内容' };
}
}
if (andArr.length > 0) {
whereJson = _.and(andArr);
}
// 查询条件结束-----------------------------------------------------------
let selectRes = await vk.baseDao.select({
dbName: dbName,
pageIndex: 1,
pageSize: 10,
fieldJson: fieldJson,
whereJson: whereJson,
sortArr: sortArr
}, util);
let list = [];
for (let i in selectRes.rows) {
let item = selectRes.rows[i];
let value = item._id;
let label = item.nickname || "未设置昵称";
if (item.mobile) {
item.mobile = vk.pubfn.hidden(item.mobile, 3, 4);
label += `(${item.mobile})`;
} else if (item.username) {
item.username = vk.pubfn.hidden(item.username, 2, 3);
label += `(${item.username})`;
}
list.push({
value: value,
label: label
});
}
res.list = list;
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,162 @@
const formRules = require("../util/formRules.js");
module.exports = {
/**
* 添加或修改
* @url admin/system/app-upgrade-center/sys/addUpdate, 前端调用的url参数地址
* data 请求参数 说明
* @param {String} appid 应用的AppID
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util } = event;
let { vk, _ } = util;
let { uid } = data;
let res = { code: 0, msg: 'ok' };
// 业务逻辑开始-----------------------------------------------------------
if (data.platformRadio && vk.pubfn.isNull(data.platform)) {
data.platform = [data.platformRadio];
}
let {
_id,
appid,
name,
title,
contents,
platform,
platformRadio,
type,
version,
min_uni_version,
url,
stable_publish,
is_silently,
is_mandatory,
create_env = "upgrade-center",
store_list
} = data;
// 参数合法校验开始-----------------------------------------------------------
let mode = _id ? "update" : "add";
let formRulesRes = await formRules[mode](event);
if (formRulesRes.code !== 0) {
return formRulesRes;
}
if (type === "wgt") {
if (vk.pubfn.isNull(min_uni_version)) return { code: -1, msg: "最低app版本号不能为空" };
}
// 参数合法校验结束-----------------------------------------------------------
appid = appid.trim();
let create_date = Date.now();
let uni_platform = platform.indexOf("Android") > -1 ? "android" : "ios";
let dbName = "opendb-app-versions";
// 添加和修改公共的dataJson
let dataJson = {
title,
contents,
url,
min_uni_version,
stable_publish,
is_silently,
is_mandatory,
store_list
};
if (mode === "add") {
// 获取最新的已发布的版本信息
let info = await vk.baseDao.select({
dbName,
getCount: false,
getMain: true,
getOne: true,
pageIndex: 1,
pageSize: 1,
whereJson: {
appid,
type,
platform,
stable_publish: true
},
sortArr: [{ name: "create_date", type: "desc" }],
});
// 版本必须比之前的版本高
if (info && info.version && compareVersion(version, info.version) !== 1) {
return { code: -1, msg: `版本必须大于${info.version}` };
}
// 添加
vk.pubfn.objectAssign(dataJson, {
appid,
name,
platform,
version,
type,
create_date,
uni_platform,
create_env,
});
_id = await vk.baseDao.add({
dbName,
dataJson
});
if (_id) {
res.success = true;
res.msg = "添加成功";
}
} else {
// 修改并返回修改后的数据
res.info = await vk.baseDao.updateAndReturn({
dbName,
whereJson: {
_id
},
dataJson
});
if (res.info) {
res.success = true;
res.msg = "修改成功";
}
}
if (res.success && dataJson.stable_publish) {
// 将其他版本设置为已下线
await vk.baseDao.update({
dbName,
whereJson: {
appid,
type,
platform,
stable_publish: true,
_id: _.neq(_id)
},
dataJson: {
stable_publish: false
}
});
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
/**
* 比较2个版本号的大小
* 1 version1 > version2
* 0 version1 = version2
* -1 version1 < version2
*/
function compareVersion(version1, version2) {
let arr1 = version1.split(".");
let arr2 = version2.split(".");
if (Number(arr1[0]) === Number(arr2[0]) && Number(arr1[1]) === Number(arr2[1]) && Number(arr1[2]) === Number(arr2[2])) {
return 0;
}
if (Number(arr1[0]) > Number(arr2[0])) {
return 1;
}
if (Number(arr1[0]) === Number(arr2[0]) && Number(arr1[1]) > Number(arr2[1])) {
return 1;
}
if (Number(arr1[0]) === Number(arr2[0]) && Number(arr1[1]) === Number(arr2[1]) && Number(arr1[2]) > Number(arr2[2])) {
return 1;
}
return -1;
}
@@ -0,0 +1,34 @@
module.exports = {
/**
* 删除
* @url admin/system/app-upgrade-center/sys/delete 前端调用的url参数地址
* data 请求参数 说明
* @param {String} _id id
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util } = event;
let { vk, _ } = util;
let { uid } = data;
let res = { code: 0, msg: 'ok' };
// 业务逻辑开始-----------------------------------------------------------
let { _id } = data;
if (vk.pubfn.isNull(_id)) return { code: -1, msg: 'id不能为空' };
let dbName = "opendb-app-versions";
let info = await vk.baseDao.findById({
dbName,
id: _id,
});
if (vk.pubfn.isNull(info)) return { code: -1, msg: "版本不存在" };
if (info.stable_publish) return { code: -1, msg: "不可删除已上线的版本" };
res.num = await vk.baseDao.deleteById({
dbName,
id: _id
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,31 @@
module.exports = {
/**
* 分页查询
* @url admin/system/app-upgrade-center/sys/getList 前端调用的url参数地址
* data 请求参数 说明
* @param {Number} pageIndex 当前页码
* @param {Number} pageSize 每页显示数量
* @param {Array<Object>} sortRule 排序规则
* @param {object} formData 查询条件数据源
* @param {Array<Object>} columns 查询条件规则
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util } = event;
let { vk, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
// 可写与数据库的交互逻辑等等
let dbName = "opendb-app-versions";
res = await vk.baseDao.getTableData({
dbName,
data,
sortArr: [{ name: "create_date", type: "desc" }]
});
return res;
}
}
@@ -0,0 +1,83 @@
'use strict';
/**
* 表单验证
*/
class Util {
constructor() {
}
/**
* 添加
*/
async add(event) {
let { data = {}, userInfo, util } = event;
let { vk } = util;
let res = { code: 0, msg: '' };
// 验证规则开始 -----------------------------------------------------------
let rules = {
appid: [
// 必填
{ required: true, message: "appid不能为空", trigger: ['blur','change'] }
],
contents: [
// 必填
{ required: true, message: "更新内容不能为空", trigger: ['blur','change'] }
],
platform: [
// 必填
{ required: true, message: "平台不能为空", trigger: ['blur','change'] }
],
version: [
// 必填
{ required: true, message: "版本号不能为空", trigger: ['blur','change'] },
{ validator: vk.pubfn.validator("version"), message: '版本号格式必须为:xx.xx.xx(3个数字组成,数字范围1-99,0-99,0-99) 如1.0.1 不可以是1.0.01', trigger: 'blur' }
],
url: [
// 必填
{ required: true, message: "链接不能为空", trigger: ['blur','change'] }
],
};
// 验证规则结束 -----------------------------------------------------------
// 开始进行验证
res = vk.pubfn.formValidate({
data: data,
rules: rules
});
// 返回验证结果
return res;
}
/**
* 修改
*/
async update(event) {
let { data = {}, userInfo, util } = event;
let { vk } = util;
let res = { code: 0, msg: '' };
// 验证规则开始 -----------------------------------------------------------
let rules = {
_id: [
{ required: true, message: 'id不能为空', trigger: 'blur' },
],
contents: [
// 必填
{ required: true, message: "更新内容不能为空", trigger: ['blur','change'] }
],
url: [
// 必填
{ required: true, message: "链接不能为空", trigger: ['blur','change'] }
],
};
// 验证规则结束 -----------------------------------------------------------
// 开始进行验证
res = vk.pubfn.formValidate({
data: data,
rules: rules
});
// 返回验证结果
return res;
}
}
module.exports = new Util
@@ -0,0 +1,100 @@
const formRules = require("../util/formRules.js");
module.exports = {
/**
* 添加应用
* @url admin/system/app/sys/add 前端调用的url参数地址
* data 请求参数 说明
* @param {String} _id id
* @param {String} appid 应用的AppID
* @param {String} type 应用类型
* @param {String} name 应用名称
* @param {String} description 应用描述
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: 'ok' };
// 业务逻辑开始-----------------------------------------------------------
let {
appid,
type,
name,
description,
// 1.13.4 新增以下字段(主要用于生成统一发布页和APP升级中心)
enable_upgrade_center,
introduction,
icon_url,
screenshot,
app_android,
app_ios,
mp_weixin,
mp_alipay,
mp_baidu,
mp_toutiao,
mp_qq,
mp_kuaishou,
mp_lark,
mp_jd,
mp_dingtalk,
quickapp,
h5,
store_list,
} = data;
// 参数合法校验开始-----------------------------------------------------------
let formRulesRes = await formRules.add(event);
if (formRulesRes.code !== 0) {
return formRulesRes;
}
// 参数合法校验结束-----------------------------------------------------------
appid = appid.trim();
let dbName = "opendb-app-list";
let num = await vk.baseDao.count({
dbName,
whereJson: {
appid
}
});
if (num > 0) {
return { code: -1, msg: 'appid已存在,请勿重复添加' };
}
let create_date = Date.now();
res.id = await vk.baseDao.add({
dbName,
dataJson: {
appid,
type,
name,
description,
create_date,
// 1.13.4 新增以下字段(主要用于生成统一发布页和APP升级中心)
enable_upgrade_center,
creator_uid: uid, // 创建者
introduction,
icon_url,
screenshot,
app_android,
app_ios,
mp_weixin,
mp_alipay,
mp_baidu,
mp_toutiao,
mp_qq,
mp_kuaishou,
mp_lark,
mp_jd,
mp_dingtalk,
quickapp,
h5,
store_list,
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,22 @@
'use strict';
const createPublishHtml = require('../util/createPublishHtml/index.js')
module.exports = {
/**
* 生成发布页HTML
* @url admin/system/app/sys/createPublishHtml 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util } = event;
let { vk, db, _ } = util;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
let { id } = data;
res = await createPublishHtml({
id
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,31 @@
module.exports = {
/**
* 删除应用
* @url admin/system/app/sys/delete 前端调用的url参数地址
* data 请求参数 说明
* @param {String} _id id
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : 'ok' };
// 业务逻辑开始-----------------------------------------------------------
// 这里id不传默认设置成"___" 是为了防止因未传_id导致误删所有数据.
let { _id } = data;
if(vk.pubfn.isNull(_id)){
return { code : -1, msg : 'id不能为空' };
}
let dbName = "opendb-app-list";
res.num = await vk.baseDao.deleteById({
dbName,
id:_id
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,26 @@
'use strict';
module.exports = {
/**
* 根据id获取信息
* @url admin/system/app/sys/getInfo 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
let { appid } = data;
let dbName = "opendb-app-list";
res.info = await vk.baseDao.findByWhereJson({
dbName,
whereJson:{
appid
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,31 @@
module.exports = {
/**
* 分页查询应用
* @url admin/system/app/sys/getList 前端调用的url参数地址
* data 请求参数 说明
* @param {Number} pageIndex 当前页码
* @param {Number} pageSize 每页显示数量
* @param {Array<Object>} sortRule 排序规则
* @param {object} formData 查询条件数据源
* @param {Array<Object>} columns 查询条件规则
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
// 可写与数据库的交互逻辑等等
let dbName = "opendb-app-list";
res = await vk.baseDao.getTableData({
dbName,
data,
sortArr: [{ name: "_id", type: "asc" }]
});
return res;
}
}
@@ -0,0 +1,98 @@
const formRules = require("../util/formRules.js");
module.exports = {
/**
* 修改应用
* @url admin/system/app/sys/update 前端调用的url参数地址
* data 请求参数 说明
* @param {String} _id id
* @param {String} name 应用名称
* @param {String} type 应用类型
* @param {String} description 应用描述
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : 'ok' };
// 业务逻辑开始-----------------------------------------------------------
let {
_id,
appid,
type,
name,
description,
// 1.13.4 新增以下字段(主要用于生成统一发布页和APP升级中心)
enable_upgrade_center,
introduction,
icon_url,
screenshot,
app_android,
app_ios,
mp_weixin,
mp_alipay,
mp_baidu,
mp_toutiao,
mp_qq,
mp_kuaishou,
mp_lark,
mp_jd,
mp_dingtalk,
quickapp,
h5,
store_list,
} = data;
// 参数合法校验开始-----------------------------------------------------------
let formRulesRes = await formRules.update(event);
if (formRulesRes.code !== 0) {
return formRulesRes;
}
// 参数合法校验结束-----------------------------------------------------------
appid = appid.trim();
let dbName = "opendb-app-list";
let num = await vk.baseDao.count({
dbName,
whereJson: {
_id: _.neq(_id),
appid
}
});
if (num > 0) {
return { code: -1, msg: '修改失败,appid已存在!' };
}
res.num = await vk.baseDao.updateById({
dbName,
id:_id,
dataJson:{
appid,
type,
name,
description,
// 1.13.4 新增以下字段(主要用于生成统一发布页和APP升级中心)
enable_upgrade_center,
introduction,
icon_url,
screenshot,
app_android,
app_ios,
mp_weixin,
mp_alipay,
mp_baidu,
mp_toutiao,
mp_qq,
mp_kuaishou,
mp_lark,
mp_jd,
mp_dingtalk,
quickapp,
h5,
store_list,
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,214 @@
const fs = require('fs')
const path = require('path')
const TE = require('./lib/art-template.js');
// 标准语法的界定符规则
TE.defaults.openTag = '{@'
TE.defaults.closeTag = '@}'
const success = {
code: 0,
success: true,
}
const fail = {
code: -1,
success: false
}
async function translateTCB(_fileList = []) {
if (!_fileList.length) return _fileList
// 腾讯云和阿里云下载链接不同,需要处理一下,阿里云会原样返回
const {
fileList
} = await uniCloud.getTempFileURL({
fileList: _fileList
});
return fileList.map((item, index) => item.tempFileURL ? item.tempFileURL : _fileList[index])
}
function hasValue(value) {
if (typeof value !== 'object') return !!value
if (value instanceof Array) return !!value.length
return !!(value && Object.keys(value).length && value.enable)
}
module.exports = async function(data = {}) {
let {
id,
template
} = data;
if (!id) {
return {
...fail,
code: -1,
errMsg: 'id required'
};
}
// 方式一:使用网络资源
let templatePage;
if (template) {
try {
let htmlBuffer = await vk.request({
url: template,
method: "GET",
dataType: "default"
});
templatePage = htmlBuffer.toString("utf8");
} catch (err) {
return {
...fail,
code: -2,
errMsg: 'page template no found',
err
};
}
} else {
// 方式二:使用本地资源
templatePage = fs.readFileSync(path.resolve(__dirname, './template.html'), 'utf8');
if (!templatePage) {
return {
...fail,
code: -2,
errMsg: 'page template no found'
};
}
}
let appInfo = await vk.baseDao.findById({
dbName: "opendb-app-list",
id: id
});
if (appInfo) {
const defaultOptions = {
hasApp: false,
hasMP: false,
hasH5: false,
hasQuickApp: false
}
defaultOptions.mpNames = {
'mp_weixin': '微信',
'mp_alipay': '支付宝',
'mp_baidu': '百度',
'mp_toutiao': '字节',
'mp_qq': 'QQ',
'mp_dingtalk': '钉钉',
'mp_kuaishou': '快手',
'mp_lark': '飞书',
'mp_jd': '京东'
}
const imageList = [];
['app_android'].forEach(key => {
if (!hasValue(appInfo[key])) return
imageList.push({
key,
urlKey: 'url',
url: appInfo[key].url
})
})
Object.keys(defaultOptions.mpNames).concat('quickapp').forEach(key => {
if (!hasValue(appInfo[key])) return
imageList.push({
key,
urlKey: 'qrcode_url',
url: appInfo[key].qrcode_url
})
});
['icon_url'].forEach(key => {
if (!hasValue(appInfo[key])) return
imageList.push({
key,
url: appInfo[key]
})
})
const filelist = await translateTCB(imageList.map(item => item.url))
imageList.forEach((item, index) => {
if (item.urlKey) {
appInfo[item.key][item.urlKey] = filelist[index]
} else {
appInfo[item.key] = filelist[index]
}
})
if (hasValue(appInfo.screenshot)) {
appInfo.screenshot = await translateTCB(appInfo.screenshot)
}
{
const appInfoKeys = Object.keys(appInfo)
if (appInfoKeys.some(key => {
return key.indexOf('app_') !== -1 && hasValue(appInfo[key])
})) {
defaultOptions.hasApp = true
}
if (appInfoKeys.some(key => {
return key.indexOf('mp') !== -1 && hasValue(appInfo[key])
})) {
defaultOptions.hasMP = true
}
if (appInfo.h5 && appInfo.h5.url) {
defaultOptions.hasH5 = true
}
if (appInfo.quickapp && appInfo.quickapp.qrcode_url) {
defaultOptions.hasQuickApp = true
}
// app
if (defaultOptions.hasApp && appInfo.app_android && appInfo.app_android.url) {
defaultOptions.android_url = appInfo.app_android.url
} else {
defaultOptions.android_url = ''
}
if (defaultOptions.hasApp && appInfo.app_ios && appInfo.app_ios.url) {
defaultOptions.ios_url = appInfo.app_ios.url
} else {
defaultOptions.ios_url = ''
}
// mp
defaultOptions.mpKeys = Object.keys(appInfo).filter(key => {
return key.indexOf('mp') !== -1 && hasValue(appInfo[key])
})
}
// 解决二维码不显示的问题
if (appInfo.icon_url && appInfo.icon_url.indexOf("http") == 0) {
let imageBuffer = await vk.request({
url: appInfo.icon_url,
method: "GET",
dataType: "default"
});
appInfo.icon_url = "data:image/png;base64," + imageBuffer.toString('base64');
}
const html = TE.render(templatePage)(Object.assign({}, appInfo, defaultOptions));
if (!(defaultOptions.hasApp || defaultOptions.hasH5 || defaultOptions.hasMP || defaultOptions
.hasQuickApp)) {
return {
...fail,
code: -100,
errMsg: '缺少应用信息,App、小程序、H5、快应用请至少填写一项'
}
}
return {
...success,
mpserverlessComposedResponse: true, // 使用阿里云返回集成响应是需要此字段为true
statusCode: 200,
headers: {
'content-type': 'text/html'
},
body: html
};
}
return {
...fail,
code: -3,
errMsg: 'no record'
};
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,72 @@
'use strict';
/**
* 表单验证
*/
class Util {
constructor() {
}
/**
* 添加
*/
async add(event) {
let { data = {}, userInfo, util } = event;
let { vk } = util;
let res = { code: 0, msg: '' };
// 验证规则开始 -----------------------------------------------------------
let rules = {
appid: [
{ required: true, message: '应用的AppID为必填字段', trigger: 'blur' },
],
name: [
{ required: true, message: '应用名称为必填字段', trigger: 'blur' }
],
type: [
{ required: true, message: '应用类型为必填字段', trigger: 'blur' }
]
};
// 验证规则结束 -----------------------------------------------------------
// 开始进行验证
res = vk.pubfn.formValidate({
data: data,
rules: rules
});
// 返回验证结果
return res;
}
/**
* 修改
*/
async update(event) {
let { data = {}, userInfo, util } = event;
let { vk } = util;
let res = { code: 0, msg: '' };
// 验证规则开始 -----------------------------------------------------------
let rules = {
_id: [
{ required: true, message: 'id不能为空', trigger: 'blur' },
],
appid: [
{ required: true, message: '应用的AppID为必填字段', trigger: 'blur' },
],
name: [
{ required: true, message: '应用名称为必填字段', trigger: 'blur' }
],
type: [
{ required: true, message: '应用类型为必填字段', trigger: 'blur' }
]
};
// 验证规则结束 -----------------------------------------------------------
// 开始进行验证
res = vk.pubfn.formValidate({
data: data,
rules: rules
});
// 返回验证结果
return res;
}
}
module.exports = new Util
@@ -0,0 +1,87 @@
const formRules = require("../util/formRules.js");
module.exports = {
/**
* 新增
* @url admin/system/menu/sys/add 前端调用的url参数地址
* data 请求参数 说明
* @param {String} menu_id 菜单Id,唯一标识
* @param {String} name 菜单名称
* @param {String} comment 备注
* @param {String} url 页面路径
* @param {String} icon 菜单图标
* @param {Number} sort 排序(越大越在前面)
* @param {String} parent_id 父级id
* @param {Boolean} enable 是否启用
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
let {
menu_id,
name,
comment,
url,
icon,
sort = 0,
parent_id,
enable = true,
hidden_menu
} = data;
// 参数合法校验开始-----------------------------------------------------------
let formRulesRes = await formRules.add(event);
if(formRulesRes.code !== 0){
return formRulesRes;
}
// 参数合法校验结束-----------------------------------------------------------
let dbName = "opendb-admin-menus";
// 检测menu_id是否存在
let num = await vk.baseDao.count({
dbName,
whereJson:{
menu_id
}
});
if(num > 0){
return { code : -1, msg : `标识【${menu_id}】不能重复!` };
}
let dataJson = {
menu_id,
name,
comment,
url,
icon,
sort,
parent_id,
enable,
hidden_menu
};
// 检测parent_id是否不存在
if(vk.pubfn.isNotNull(parent_id)){
let num = await vk.baseDao.count({
dbName,
whereJson:{
menu_id : parent_id
}
});
if(num <= 0){
return { code : -1, msg : `父标识【${parent_id}】不存在!` };
}
}else{
delete dataJson.parent_id;
}
// 执行数据库API请求
res.id = await vk.baseDao.add({
dbName,
dataJson
});
return res;
}
}
@@ -0,0 +1,74 @@
const formRules = require("../util/formRules.js");
module.exports = {
/**
* 批量新增
* @url admin/system/menu/sys/adds 前端调用的url参数地址
* data 请求参数 说明
* @param {Number} mode 模式 1 :覆盖 2:忽略
* @param {Array<Object>} menus 菜单json
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
let {
mode,
menus,
} = data;
// 参数合法校验开始-----------------------------------------------------------
let formRulesRes = await formRules.adds(event);
if(formRulesRes.code !== 0){
return formRulesRes;
}
// 参数合法校验结束-----------------------------------------------------------
let dataArr = [];
for(let i=0;i<menus.length;i++){
let {
menu_id,
name,
comment,
url,
icon,
sort = 0,
parent_id,
enable = true,
hidden_menu
} = menus[i];
dataArr.push({
menu_id,
name,
comment,
url,
icon,
sort,
parent_id,
enable,
hidden_menu
});
}
if(mode == 1){
// 如果是覆盖,则先删除原先的数据
let menuIds = vk.pubfn.arrayObjectGetArray(dataArr, "menu_id");
await vk.baseDao.del({
dbName:"opendb-admin-menus",
whereJson:{
menu_id : _.in(menuIds)
}
});
}
// 执行数据库API请求
await vk.baseDao.adds({
dbName:"opendb-admin-menus",
dataJson:dataArr
});
return res;
}
}
@@ -0,0 +1,33 @@
module.exports = {
/**
* 为菜单设置内置权限
* 角色拥有菜单后,将同时拥有菜单内的所有内置权限
* @url admin/system/menu/sys/bindPermission 前端调用的url参数地址
* data 请求参数 说明
* @param {String} menu_id 菜单id(menu_id)
* @param {Array} permissionList 权限Id(permission_id)列表
* @param {Boolean} reset 是否直接覆盖权限,true:直接将permissionList设置为权限,false:在菜单已有权限后追加权限
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
let {
menu_id,
permissionList,
reset
} = data;
res = await vk.system.sysDao.menuBindPermission({
menu_id,
permissionList,
reset
});
return res;
}
}
@@ -0,0 +1,40 @@
module.exports = {
/**
* 删除
* @url admin/system/menu/sys/delete 前端调用的url参数地址
* data 请求参数 说明
* @param {String} menu_id 菜单Id,唯一标识
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
let { menu_id } = data;
if(vk.pubfn.isNullOne(menu_id)){
return { code : -1, msg : 'menu_id不能为空' };
}
// 检查是否有子项
let num = await vk.baseDao.count({
dbName:"opendb-admin-menus",
whereJson:{
parent_id : menu_id
}
});
if(num > 0){
return { code : -1, msg : '该项含有子项,请先删除子项!' };
}
res.num = await vk.baseDao.del({
dbName:"opendb-admin-menus",
whereJson:{
menu_id
}
});
return res;
}
}
@@ -0,0 +1,31 @@
'use strict';
module.exports = {
/**
* 获取菜单列表(一次性获取全部)
* @url admin/system/menu/sys/getAll 前端调用的url参数地址
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
// 返回树状结构代码详情见:https://vkdoc.fsq.pub/client/uniCloud/db/getTree.html
res = await vk.system.sysDao.listMenuToTree({
pageIndex: 1,
pageSize: 500,
whereJson: {
parent_id: _.in([null, ""]),
menu_id: _.exists(true)
},
treeProps: {
level: 3
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,57 @@
'use strict';
module.exports = {
/**
* 获取菜单级联数据(懒加载形式)
* @url admin/system/menu/sys/getCascader 前端调用的url参数地址
* data 请求参数 说明
* @param {Object} node 当前点击的节点
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
let { node = {} } = data;
let whereJson = {
enable: true
};
if (node.root) {
whereJson["parent_id"] = null;
} else {
whereJson["parent_id"] = node.value;
}
res = await vk.baseDao.selects({
dbName: "opendb-admin-menus",
pageIndex: 1,
pageSize: 500,
whereJson,
sortArr: [{ name: "sort", type: "asc" }],
// 副表列表
foreignDB: [
{
dbName: "opendb-admin-menus",
localKey:"menu_id",
foreignKey: "parent_id",
as: "hasChildren",
limit: 1, // 避免浪费查询,这里设置limit:1
}
]
});
// 数据预处理
let rows = res.rows;
for (let i in rows) {
let item = rows[i];
rows[i].label = `${item.name}(${item.menu_id})`;
if(vk.pubfn.isNull(item.hasChildren)){
rows[i].leaf = true;
}
}
res.rows = rows;
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,87 @@
const formRules = require("../util/formRules.js");
module.exports = {
/**
* 修改
* @url admin/system/menu/sys/update 前端调用的url参数地址
* data 请求参数 说明
* @param {String} menu_id 菜单Id,唯一标识
* @param {String} name 菜单名称
* @param {String} comment 备注
* @param {String} url 页面路径
* @param {String} icon 菜单图标
* @param {Number} sort 排序(越大越在前面)
* @param {String} parent_id 父级id
* @param {Boolean} enable 是否启用
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
menu_id,
name,
comment,
url,
icon,
sort = 0,
parent_id,
enable = true,
hidden_menu
} = data;
// 参数合法校验开始-----------------------------------------------------------
let formRulesRes = await formRules.update(event);
if (formRulesRes.code !== 0) {
return formRulesRes;
}
// 参数合法校验结束-----------------------------------------------------------
let dbName = "opendb-admin-menus";
let dataJson = {
name,
comment,
url,
icon,
sort,
parent_id,
enable,
hidden_menu
};
// 检测parent_id是否不存在
if (vk.pubfn.isNotNull(parent_id)) {
let num = await vk.baseDao.count({
dbName,
whereJson: {
menu_id: parent_id
}
});
if (num <= 0) {
return { code: -1, msg: `父标识【${parent_id}】不存在!` };
}
let info = await vk.baseDao.findByWhereJson({
dbName,
whereJson: {
menu_id
}
});
if (vk.pubfn.isNotNull(info) && info.menu_id === parent_id) {
return { code: -1, msg: `不可以设置自己为父菜单` };
}
} else {
dataJson["parent_id"] = _.remove();
}
// 执行数据库API请求
res.num = await vk.baseDao.update({
dbName,
whereJson: {
menu_id
},
dataJson
});
return res;
}
}
@@ -0,0 +1,43 @@
module.exports = {
/**
* 修改基础信息
* @url admin/system/menu/sys/updateBase 前端调用的url参数地址
* data 请求参数 说明
* @param {String} _id _id
* @param {Number} sort 排序
* @param {Boolean} enable 是否启用
* @param {Boolean} hidden_menu 是否隐藏(左侧菜单中不显示)
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
_id,
sort,
enable,
hidden_menu
} = data;
if (vk.pubfn.isNull(_id)) return { code: -1, msg: "_id不能为空" };
let dbName = "opendb-admin-menus";
// 执行数据库API请求
res.num = await vk.baseDao.updateById({
dbName,
id: _id,
dataJson: {
sort,
enable,
hidden_menu
},
});
return res;
}
}
@@ -0,0 +1,80 @@
'use strict';
/**
* 表单验证
*/
class Util {
constructor() {
}
/**
* 添加
*/
async add(event){
let { data = {}, userInfo, util } = event;
let { vk } = util;
let res = { code : 0, msg : '' };
// 验证规则开始 -----------------------------------------------------------
let rules = {
menu_id: [
{ required: true, message: '菜单标识不能为空', trigger: 'blur' },
],
name: [
{ required: true, message: '菜单名称不能为空', trigger: 'blur' },
],
sort:[
{ type: 'number', message: '排序值必须为数字'}
]
};
// 验证规则结束 -----------------------------------------------------------
// 开始进行验证
res = vk.pubfn.formValidate({
data : data,
rules : rules
});
// 返回验证结果
return res;
}
/**
* 修改
*/
async update(event){
return this.add(event);
}
/**
* 批量添加
*/
async adds(event){
let { data = {}, userInfo, util } = event;
let { vk } = util;
let res = { code : 0, msg : '' };
// 验证规则开始 -----------------------------------------------------------
let rules = {
menu_id: [
{ required: true, message: '菜单标识不能为空', trigger: 'blur' },
],
name: [
{ required: true, message: '菜单名称不能为空', trigger: 'blur' },
],
sort:[
{ type: 'number', message: '排序值必须为数字'}
]
};
// 验证规则结束 -----------------------------------------------------------
let { menus } = data;
for(let i=0;i<menus.length;i++){
let formValidateRes = vk.pubfn.formValidate({
data : menus[i],
rules : rules
});
if(formValidateRes.code != 0){
res = formValidateRes;
break;
}
}
return res;
}
}
module.exports = new Util
@@ -0,0 +1,96 @@
const formRules = require("../util/formRules.js");
module.exports = {
/**
* 新增权限
* @url admin/system/permission/sys/add 前端调用的url参数地址
* data 请求参数 说明
* @param {String} permission_id 权限Id,唯一标识
* @param {String} permission_name 权限名称,展示用
* @param {String} comment 备注
* @param {String} url 云函数路径
* @param {String} icon 图标
* @param {Number} sort 排序(越大越在前面)
* @param {String} parent_id 父级id
* @param {Boolean} enable 是否启用
* @param {Boolean} match_mode 0:完整路径 1:通配符 2:正则表达式
* @param {Boolean} curd_category 0:未分类 1:增 2:删 3:改 4:查 5:特殊
* @param {Boolean} level 0:未分类 1:子弹级 2:炸弹级 3:榴弹级 4:核弹级
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
permission_id,
permission_name,
comment,
url,
icon,
sort = 0,
parent_id,
enable = true,
match_mode = 0,
curd_category,
level
} = data;
// 参数合法校验开始-----------------------------------------------------------
let formRulesRes = await formRules.add(event);
if (formRulesRes.code !== 0) {
return formRulesRes;
}
// 参数合法校验结束-----------------------------------------------------------
let dbName = "uni-id-permissions";
// 检测permission_id是否存在
let num = await vk.baseDao.count({
dbName,
whereJson: {
permission_id
}
});
if (num > 0) {
return { code: -1, msg: `标识【${permission_id}】不能重复!` };
}
let dataJson = {
permission_id,
permission_name,
comment,
url,
icon,
sort,
parent_id,
enable,
match_mode,
curd_category,
level
};
// 检测parent_id是否不存在
if (vk.pubfn.isNotNull(parent_id)) {
let num = await vk.baseDao.count({
dbName,
whereJson: {
permission_id: parent_id
}
});
if (num <= 0) {
return { code: -1, msg: `父标识【${parent_id}】不存在!` };
}
} else{
delete dataJson.parent_id;
}
if(url === "" || JSON.stringify(url) === '[""]'){
delete dataJson.url;
}
// 执行数据库API请求
res.id = await vk.baseDao.add({
dbName,
dataJson
});
return res;
}
}
@@ -0,0 +1,39 @@
module.exports = {
/**
* 删除权限
* @url admin/system/permission/sys/delete 前端调用的url参数地址
* data 请求参数 说明
* @param {String} permission_id 权限Id,唯一标识
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let { permission_id } = data;
if (vk.pubfn.isNullOne(permission_id)) {
return { code: -1, msg: 'permission_id不能为空' };
}
let dbName = "uni-id-permissions";
// 检查是否有子项
let num = await vk.baseDao.count({
dbName,
whereJson: {
parent_id: permission_id
}
});
if (num > 0) {
return { code: -1, msg: '该项含有子项,请先删除子项!' };
}
res = uniID.deletePermission({
permissionID: permission_id
});
res.msg = res.message;
return res;
}
}
@@ -0,0 +1,30 @@
'use strict';
module.exports = {
/**
* 获取权限列表
* @url admin/system/permission/sys/getAll 前端调用的url参数地址
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
res = await vk.system.sysDao.listPermissionToTree({
pageIndex: 1,
pageSize: 500,
whereJson: {
parent_id: _.in([null, ""]),
permission_id: _.exists(true)
},
treeProps: {
level: 3
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,97 @@
const formRules = require("../util/formRules.js");
module.exports = {
/**
* 修改权限
* @url admin/system/permission/sys/update 前端调用的url参数地址
* data 请求参数 说明
* @param {String} permission_id 权限Id,唯一标识
* @param {String} permission_name 权限名称,展示用
* @param {String} comment 备注
* @param {String} url 云函数路径
* @param {String} icon 图标
* @param {Number} sort 排序(越大越在前面)
* @param {String} parent_id 父级id
* @param {Boolean} enable 是否启用
* @param {Number} match_mode 0:完整路径 1:通配符 2:正则表达式
* @param {Number} curd_category 0:未分类 1:增 2:删 3:改 4:查 5:特殊
* @param {Number} level 0:未分类 1:子弹级 2:炸弹级 3:榴弹级 4:核弹级
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
permission_id,
permission_name,
comment,
url,
icon,
sort = 0,
parent_id,
enable = true,
match_mode = 0,
curd_category,
level
} = data;
// 参数合法校验开始-----------------------------------------------------------
let formRulesRes = await formRules.update(event);
if (formRulesRes.code !== 0) {
return formRulesRes;
}
// 参数合法校验结束-----------------------------------------------------------
let dbName = "uni-id-permissions";
let dataJson = {
permission_name,
comment,
url,
icon,
sort,
parent_id,
enable,
match_mode,
curd_category,
level
};
// 检测parent_id是否不存在
if (vk.pubfn.isNotNull(parent_id)) {
let num = await vk.baseDao.count({
dbName,
whereJson: {
permission_id: parent_id
}
});
if (num <= 0) {
return { code: -1, msg: `父标识【${parent_id}】不存在!` };
}
let info = await vk.baseDao.findByWhereJson({
dbName,
whereJson: {
permission_id
}
});
if (vk.pubfn.isNotNull(info) && info.permission_id === parent_id) {
return { code: -1, msg: `不可以设置自己为父级` };
}
} else {
dataJson["parent_id"] = _.remove();
}
if (url === "" || JSON.stringify(url) === '[""]') {
dataJson["url"] = _.remove();
}
// 执行数据库API请求
res.num = await vk.baseDao.update({
dbName,
whereJson: {
permission_id
},
dataJson
});
return res;
}
}
@@ -0,0 +1,40 @@
module.exports = {
/**
* 修改基础信息
* @url admin/system/permission/sys/updateBase 前端调用的url参数地址
* data 请求参数 说明
* @param {String} _id id
* @param {Number} sort 排序
* @param {Boolean} enable 是否启用
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
_id,
sort,
enable,
} = data;
if (vk.pubfn.isNull(_id)) return { code: -1, msg: "_id不能为空" };
let dbName = "uni-id-permissions";
// 执行数据库API请求
res.num = await vk.baseDao.updateById({
dbName,
id: _id,
dataJson: {
sort,
enable,
},
});
return res;
}
}
@@ -0,0 +1,34 @@
module.exports = {
/**
* 修改权限分类
* @url admin/system/permission/sys/updateCategory 前端调用的url参数地址
* data 请求参数 说明
* @param {String} _id 权限Id
* @param {Number} curd_category 0:未分类 1:增 2:删 3:改 4:查 5:特殊
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
_id,
curd_category=0,
} = data;
let dbName = "uni-id-permissions";
// 执行数据库API请求
res.num = await vk.baseDao.updateById({
dbName,
id:_id,
dataJson:{
curd_category
}
});
return res;
}
}
@@ -0,0 +1,34 @@
module.exports = {
/**
* 修改权限等级
* @url admin/system/permission/sys/updateLevel 前端调用的url参数地址
* data 请求参数 说明
* @param {String} _id 权限Id
* @param {Number} level 0:未分类 1:子弹级 2:炸弹级 3:榴弹级 4:核弹级
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
_id,
level=0,
} = data;
let dbName = "uni-id-permissions";
// 执行数据库API请求
res.num = await vk.baseDao.updateById({
dbName,
id:_id,
dataJson:{
level
}
});
return res;
}
}
@@ -0,0 +1,46 @@
'use strict';
/**
* 表单验证
*/
class Util {
constructor() {
}
/**
* 添加
*/
async add(event) {
let { data = {}, userInfo, util } = event;
let { vk } = util;
let res = { code: 0, msg: '' };
// 验证规则开始 -----------------------------------------------------------
let rules = {
permission_id: [
{ required: true, message: '权限标识不能为空', trigger: 'blur' },
],
permission_name: [
{ required: true, message: '权限名称不能为空', trigger: 'blur' },
],
sort: [
{ type: 'number', message: '排序值必须为数字' }
]
};
// 验证规则结束 -----------------------------------------------------------
// 开始进行验证
res = vk.pubfn.formValidate({
data: data,
rules: rules
});
// 返回验证结果
return res;
}
/**
* 修改
*/
async update(event) {
return this.add(event);
}
}
module.exports = new Util
@@ -0,0 +1,58 @@
const formRules = require("../util/formRules.js");
module.exports = {
/**
* 新增角色
* @url admin/system/role/sys/add 前端调用的url参数地址
* data 请求参数 说明
* @param {String} role_id 角色Id(role_id)
* @param {String} role_name 角色名称,展示用
* @param {String} comment 备注
* @param {Boolean} enable 是否启用
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
role_id,
role_name,
comment,
enable = true,
} = data;
// 参数合法校验开始-----------------------------------------------------------
let formRulesRes = await formRules.add(event);
if (formRulesRes.code !== 0) {
return formRulesRes;
}
// 参数合法校验结束-----------------------------------------------------------
let dbName = "uni-id-roles";
// 检查role_id是否存在
let num = await vk.baseDao.count({
dbName,
whereJson: {
role_id
}
});
if (num > 0) {
return { code: -1, msg: `标识【${role_id}】不能重复!` };
}
// 执行数据库API请求
res.id = await vk.baseDao.add({
dbName,
dataJson: {
role_id,
role_name,
comment,
enable
}
});
return res;
}
}
@@ -0,0 +1,49 @@
module.exports = {
/**
* 为角色绑定菜单
* @url admin/system/role/sys/bindMenu 前端调用的url参数地址
* data 请求参数 说明
* @param {Array} role_id 角色Id(role_id)
* @param {Array} menuList 菜单Id(menu_id)列表
* @param {Boolean} reset 是否直接覆盖菜单,true:直接将menuList设置为角色菜单,false:在角色已有菜单后追加菜单
* @param {Boolean} addPermission 是否自动添加菜单内置的权限 默认false
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let { role_id, menuList, reset, addPermission } = data;
res = await vk.system.sysDao.roleBindMenu({
role_id,
menuList,
reset,
addPermission
});
if (res.code !== 0) return res;
let dbName = "uni-id-roles";
let roleInfo = await vk.baseDao.findByWhereJson({
dbName,
whereJson: {
role_id,
}
});
let count = roleInfo.menu ? roleInfo.menu.length : 0;
// 修改stats_count_info统计信息
res.info = await vk.baseDao.updateAndReturn({
dbName,
whereJson: {
role_id
},
dataJson: {
["stats_count_info.type.0.count"]: count
},
});
return res;
}
}
@@ -0,0 +1,40 @@
module.exports = {
/**
* 为角色绑定权限
* @url admin/system/role/sys/bindPermission 前端调用的url参数地址
* data 请求参数 说明
* @param {Array} role_id 角色Id(role_id)
* @param {Array} permissionList 权限Id(permission_id)列表
* @param {Boolean} reset 是否直接覆盖角色权限,true:直接将permissionList设置为角色权限,false:在角色已有权限后追加权限
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let { role_id, permissionList, reset, stats_count_info = {} } = data;
res = await uniID.bindPermission({
roleID: role_id,
permissionList,
reset
});
if (res.code !== 0) return res;
res.msg = res.message;
// 修改stats_count_info统计信息
res.info = await vk.baseDao.updateAndReturn({
dbName: "uni-id-roles",
whereJson: {
role_id
},
dataJson: {
stats_count_info: _.set(stats_count_info)
},
});
return res;
}
}
@@ -0,0 +1,28 @@
module.exports = {
/**
* 删除角色
* @url admin/system/role/sys/delete 前端调用的url参数地址
* data 请求参数 说明
* @param {String} role_id 角色Id(role_id)
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let { role_id } = data;
if (vk.pubfn.isNullOne(role_id)) {
return { code: -1, msg: 'role_id不能为空' };
}
res = uniID.deleteRole({
roleID: role_id
});
res.msg = res.message;
return res;
}
}
@@ -0,0 +1,51 @@
module.exports = {
/**
* 查询角色列表
* @url admin/system/role/sys/getList 前端调用的url参数地址
* data 请求参数 说明
* @param {Number} pageIndex 当前页码
* @param {Number} pageSize 每页显示数量
* @param {Array<Object>} sortRule 排序规则
* @param {object} formData 查询条件数据源
* @param {Array<Object>} columns 查询条件规则
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let dbName = "uni-id-roles";
res = await vk.baseDao.getTableData({
dbName,
data,
// 副表列表
foreignDB: [
{
dbName: "uni-id-permissions",
localKey: "permission",
localKeyType: "array",
foreignKey: "permission_id",
as: "permissionList",
limit: 500,
fieldJson: { permission_id:true, permission_name:true,comment:true, enable:true, url:true },
},
{
dbName: "opendb-admin-menus",
localKey: "menu",
localKeyType: "array",
foreignKey: "menu_id",
as: "menuList",
limit: 500,
fieldJson: { menu_id:true, name:true,comment:true, enable:true, url:true },
},
]
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,50 @@
const formRules = require("../util/formRules.js");
module.exports = {
/**
* 修改角色
* @url admin/system/role/sys/update 前端调用的url参数地址
* data 请求参数 说明
* @param {String} role_id 角色Id(role_id)
* @param {String} role_name 角色名称,展示用
* @param {String} comment 备注
* @param {Boolean} enable 是否启用
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
role_id,
role_name,
comment,
enable = true,
} = data;
// 参数合法校验开始-----------------------------------------------------------
let formRulesRes = await formRules.add(event);
if (formRulesRes.code !== 0) {
return formRulesRes;
}
// 参数合法校验结束-----------------------------------------------------------
// 执行数据库API请求
res.num = await vk.baseDao.update({
dbName: "uni-id-roles",
whereJson: {
role_id
},
dataJson: {
role_name,
comment,
enable
}
});
return res;
}
}
@@ -0,0 +1,37 @@
module.exports = {
/**
* 修改基础信息
* @url admin/system/role/sys/updateBase 前端调用的url参数地址
* data 请求参数 说明
* @param {String} _id id
* @param {Boolean} enable 是否启用
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
_id,
enable,
} = data;
if (vk.pubfn.isNull(_id)) return { code: -1, msg: "_id不能为空" };
let dbName = "uni-id-roles";
// 执行数据库API请求
res.num = await vk.baseDao.updateById({
dbName,
id: _id,
dataJson: {
enable,
},
});
return res;
}
}
@@ -0,0 +1,43 @@
'use strict';
/**
* 表单验证
*/
class Util {
constructor() {
}
/**
* 添加
*/
async add(event) {
let { data = {}, userInfo, util } = event;
let { vk } = util;
let res = { code: 0, msg: '' };
// 验证规则开始 -----------------------------------------------------------
let rules = {
role_id: [
{ required: true, message: '角色标识不能为空', trigger: 'blur' },
],
role_name: [
{ required: true, message: '角色名称不能为空', trigger: 'change' }
]
};
// 验证规则结束 -----------------------------------------------------------
// 开始进行验证
res = vk.pubfn.formValidate({
data: data,
rules: rules
});
// 返回验证结果
return res;
}
/**
* 修改
*/
async update(event) {
return this.add(event);
}
}
module.exports = new Util
@@ -0,0 +1,93 @@
const formRules = require("../util/formRules.js");
module.exports = {
/**
* 添加用户
* @url admin/system/user/sys/add 前端调用的url参数地址
* data 请求参数 说明
* @param {String} username 用户名
* @param {String} nickname 昵称
* @param {String} gender 性别
* @param {Boolean} mobile 手机号
* @param {String} comment 备注
* @param {Array} dcloud_appid 允许登录的应用列表
* @param {Number} login_appid_type 0:全部应用 1:部分应用
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
username,
password,
nickname,
gender,
mobile,
email,
comment,
allow_login_background,
dcloud_appid = [],
login_appid_type
} = data;
if (!password) password = "234567";
// 参数合法校验开始-----------------------------------------------------------
let formRulesRes = await formRules.add(event);
if (formRulesRes.code !== 0) {
return formRulesRes;
}
// 参数合法校验结束-----------------------------------------------------------
let dbName = "uni-id-users";
// 检测username
let num = await vk.baseDao.count({ dbName, whereJson: { username } });
if (num > 0) return { code: -1, msg: `用户名【${username}】已注册!` };
// 检测mobile
if (mobile) {
let num = await vk.baseDao.count({ dbName, whereJson: { mobile } });
if (num > 0) return { code: -1, msg: `手机号【${mobile}】已注册!` };
}
// 检测email
if (email) {
let num = await vk.baseDao.count({ dbName, whereJson: { email } });
if (num > 0) return { code: -1, msg: `邮箱【${email}】已注册!` };
}
if (typeof uniID.addUser !== "function") return { code: -1, msg: `请升级uni-id版本至3.3.14或以上。` };
let addUserRes = await uniID.addUser({
username,
password,
mobile,
email,
authorizedApp: dcloud_appid
});
if (addUserRes.code !== 0 || !addUserRes.uid) {
return addUserRes;
}
// 用户其他信息
let dataJson = {
nickname,
gender,
comment,
allow_login_background,
status: 0,
};
// 如果设置允许登录所有应用,则直接删除dcloud_appid字段
if (login_appid_type === 0) {
dataJson["dcloud_appid"] = _.remove();
}
// 设置用户其他信息
await vk.baseDao.update({
dbName,
whereJson: {
_id: addUserRes.uid
},
dataJson
});
res.type = "register";
res.uid = addUserRes.uid;
return res;
}
}
@@ -0,0 +1,78 @@
'use strict';
module.exports = {
/**
* 批量修改用户可登录的客户端
* @url admin/system/user/sys/batchUpdateAppLogin 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { uniID, customUtil, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
// 可写与数据库的交互逻辑等等
let {
user_ids,
allow_login_background = false,
dcloud_appid,
login_appid_type,
mode
} = data;
if(vk.pubfn.isNullOne(user_ids, login_appid_type, mode)){
return { code: -1, msg: "参数错误" };
}
if(mode !== 1 && typeof dcloud_appid !== "string"){
return { code: -1, msg: "新增和移除模式下,dcloud_appid只能是字符串" };
}
let dataJson = {};
dataJson["allow_login_background"] = allow_login_background;
if(login_appid_type === 0){
// 可登录全部应用
dataJson["dcloud_appid"] = _.remove();
} else{
res.successNum = 0;
res.failNum = 0;
for(let i=0; i<user_ids.length; i++){
let user_id = user_ids[i];
let updateRes;
try {
if(mode === 1){
// 可登录部分应用
updateRes = await uniID.setAuthorizedAppLogin({
uid: user_id,
dcloudAppidList: dcloud_appid
});
}else if(mode === 2){
// 可登录部分应用
updateRes = await uniID.authorizeAppLogin({
uid: user_id,
dcloudAppid: dcloud_appid
});
}else if(mode === 3){
// 可登录部分应用
updateRes = await uniID.forbidAppLogin({
uid: user_id,
dcloudAppid: dcloud_appid
});
}
}catch(err){}
if(updateRes.code === 0){
res.successNum ++;
}else{
res.failNum ++;
}
}
}
res.num = await vk.baseDao.update({
dbName:"uni-id-users",
whereJson:{
_id: _.in(user_ids)
},
dataJson
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,42 @@
module.exports = {
/**
* 修改用户推荐人
* @url admin/system/user/sys/batchUpdateInviterUid 前端调用的url参数地址
* data 请求参数 说明
* @param {String} user_id 用户ID
* @param {String} parent_id 修改成的用户推荐人邀请码
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let { user_id, parent_id } = data;
// 参数非空检测
if (vk.pubfn.isNullOne(user_id)) {
return { code: -1, msg: '参数错误' };
}
let parentUser = await vk.baseDao.findById({
dbName: "uni-id-users",
id: parent_id,
});
if (vk.pubfn.isNull(parentUser)) {
return { code: -1, msg: '父标识对应的用户不存在!' };
}
let { my_invite_code } = parentUser;
if (vk.pubfn.isNull(my_invite_code)) {
return { code: -1, msg: '父标识对应的用户无邀请码,无法邀请!' };
}
// 执行数据库API请求
res = await uniID.acceptInvite({
uid: user_id,
inviteCode: my_invite_code
});
res.msg = res.message;
return res;
}
}
@@ -0,0 +1,40 @@
module.exports = {
/**
* 批量修改用户状态
* @url admin/system/user/sys/batchUpdateStatus 前端调用的url参数地址
* data 请求参数 说明
* @param {Array} user_ids 用户id数组
* @param {Integer} status 修改成的用户状态:0 正常 1 禁用 2 审核中 3 审核拒绝
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let { user_ids, status } = data;
// 参数非空检测
if (vk.pubfn.isNullOne(user_ids, status)) {
return { code: -1, msg: '参数错误' };
}
if (user_ids.indexOf(uid) > -1 && status === 1) {
return { code: -1, msg: '不可禁用自己' };
}
// 执行数据库API请求
res.num = await vk.baseDao.update({
dbName: "uni-id-users",
whereJson: {
_id: _.in(user_ids)
},
dataJson: {
status: status
}
});
return res;
}
}
@@ -0,0 +1,29 @@
module.exports = {
/**
* 为用户绑定角色
* @url admin/system/user/sys/bindRole 前端调用的url参数地址
* data 请求参数 说明
* @param {String} user_id 用户id
* @param {Array} roleList 角色Id(role_id)列表
* @param {Boolean} reset 是否直接覆盖用户角色,true:直接将roleList设置为用户角色,false:在用户已有角色后追加角色
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let { user_id, roleList, reset } = data;
res = uniID.bindRole({
uid: user_id,
roleList,
reset
});
res.msg = res.message;
return res;
}
}
@@ -0,0 +1,32 @@
module.exports = {
/**
* 删除用户
* @url admin/system/user/sys/delete 前端调用的url参数地址
* data 请求参数 说明
* @param {String} _id 用户ID
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let { _id } = data;
if (vk.pubfn.isNullOne(_id)) {
return { code: -1, msg: '_id不能为空' };
}
if (uid === _id) {
return { code: -1, msg: '请勿删除当前登录账户!' };
}
// 执行数据库API请求
res.num = await vk.baseDao.deleteById({
dbName: "uni-id-users",
id:_id
});
return res;
}
}
@@ -0,0 +1,54 @@
module.exports = {
/**
* 查询用户列表(可登录后台的)
* @url admin/system/user/sys/getList 前端调用的url参数地址
* data 请求参数 说明
* @param {Number} pageIndex 当前页码
* @param {Number} pageSize 每页显示数量
* @param {Array<Object>} sortRule 排序规则
* @param {object} formData 查询条件数据源
* @param {Array<Object>} columns 查询条件规则
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let { dcloud_appid, appids } = data.formData || {};
let whereJson = {};
if (dcloud_appid) {
if (dcloud_appid === "___empty-array___") {
whereJson["dcloud_appid"] = [];
} else if (dcloud_appid === "___error___") {
whereJson["dcloud_appid"] = _.and(_.exists(true), _.nin(appids));
} else if (dcloud_appid === "___non-existent___") {
whereJson["dcloud_appid"] = _.exists(false);
} else {
whereJson["dcloud_appid"] = _.or(_.eq(dcloud_appid), _.exists(false));
}
}
let dbName = "uni-id-users";
res = await vk.baseDao.getTableData({
dbName,
data,
whereJson,
sortArr: [{ "name": "register_date", "type": "desc" }],
// 副表列表
foreignDB: [{
dbName: "opendb-app-list",
localKey: "dcloud_appid",
foreignKey: "appid",
localKeyType: "array",
as: "appList",
limit: 500
}],
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,27 @@
module.exports = {
/**
* 强制重置用户密码
* @url admin/system/user/sys/resetPassword 前端调用的url参数地址
* data 请求参数 说明
* @param {String} user_id 用户ID
* @param {String} password 重置后的密码
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { uniID, customUtil, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
let { user_id, password } = data;
// 重置密码
res = await uniID.resetPwd({
uid: user_id,
password
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,102 @@
const formRules = require("../util/formRules.js");
module.exports = {
/**
* 修改用户信息
* @url admin/system/user/sys/update 前端调用的url参数地址
* data 请求参数 说明
* @param {String} _id 用户ID
* @param {String} nickname 昵称
* @param {String} gender 性别
* @param {Boolean} mobile 手机号
* @param {String} comment 备注
* @param {Array} dcloud_appid 允许登录的应用列表
* @param {Number} login_appid_type 0:全部应用 1:部分应用
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
_id,
nickname,
gender,
mobile,
email,
comment,
allow_login_background,
dcloud_appid = [],
login_appid_type
} = data;
let mobile_confirmed;
let email_confirmed;
// 参数合法校验开始-----------------------------------------------------------
let formRulesRes = await formRules.update(event);
if (formRulesRes.code !== 0) {
return formRulesRes;
}
// 参数合法校验结束-----------------------------------------------------------
let dbName = "uni-id-users";
// 检测mobile
if (mobile) {
let num = await vk.baseDao.count({
dbName,
whereJson: {
mobile: mobile,
_id: _.neq(_id)
}
});
if (num > 0) return { code: -1, msg: `手机号【${mobile}】已注册!` };
mobile_confirmed = 1; // 设置该手机号为已验证(否则无法通过手机号进行登录)
}
// 检测email
if (email) {
let num = await vk.baseDao.count({
dbName,
whereJson: {
email: email,
_id: _.neq(_id)
}
});
if (num > 0) return { code: -1, msg: `邮箱【${email}】已注册!` };
email_confirmed = 1; // 设置该邮箱为已验证(否则无法通过邮箱进行登录)
}
let dataJson = {
nickname,
gender,
mobile,
mobile_confirmed,
email,
email_confirmed,
comment,
allow_login_background
};
// 设置允许登录的应用列表
if (login_appid_type && typeof uniID.setAuthorizedAppLogin === "function") {
let setAuthorizedAppLoginRes = await uniID.setAuthorizedAppLogin({
uid: _id,
dcloudAppidList: dcloud_appid
});
if (setAuthorizedAppLoginRes.code !== 0) {
return setAuthorizedAppLoginRes;
}
} else if (login_appid_type === 0) {
dataJson["dcloud_appid"] = _.remove();
}
// 执行数据库API请求
res.num = await vk.baseDao.updateById({
dbName,
id: _id,
dataJson
});
return res;
}
}
@@ -0,0 +1,81 @@
'use strict';
/**
* 表单验证
*/
class Util {
constructor() {
}
/**
* 添加
*/
async add(event) {
let { data = {}, userInfo, util } = event;
let { vk } = util;
let res = { code: 0, msg: '' };
// 验证规则开始 -----------------------------------------------------------
let rules = {
username: [
{ required: true, validator: vk.pubfn.validator("username"),
message: '用户名以字母开头,长度在6~18之间,只能包含字母、数字和下划线', trigger: 'blur' }
],
nickname: [
{ required: true, message: '昵称为必填字段', trigger: 'blur' },
{ min: 2, max: 20, message: '昵称长度在 2 到 20 个字符', trigger: 'blur' }
],
password: [
{ validator:vk.pubfn.validator("password"), message: '密码长度在6~18之间,只能包含字母、数字和下划线', trigger: 'blur' }
],
mobile: [
{ validator: vk.pubfn.validator("mobile"), message: '手机号格式错误', trigger: 'blur' }
],
email: [
{ validator: vk.pubfn.validator("email"), message: '邮箱格式错误', trigger: 'blur' }
],
};
// 验证规则结束 -----------------------------------------------------------
// 开始进行验证
res = vk.pubfn.formValidate({
data: data,
rules: rules
});
// 返回验证结果
return res;
}
/**
* 修改
*/
async update(event) {
let { data = {}, userInfo, util } = event;
let { vk } = util;
let res = { code: 0, msg: '' };
// 验证规则开始 -----------------------------------------------------------
let rules = {
_id: [
{ required: true, message: '用户ID不能为空', trigger: 'blur' },
],
nickname: [
{ required: true, message: '昵称为必填字段', trigger: 'blur' },
{ min: 2, max: 20, message: '昵称长度在 2 到 20 个字符', trigger: 'blur' }
],
mobile: [
{ validator: vk.pubfn.validator("mobile"), message: '手机号格式错误', trigger: 'blur' }
],
email: [
{ validator: vk.pubfn.validator("email"), message: '邮箱格式错误', trigger: 'blur' }
]
};
// 验证规则结束 -----------------------------------------------------------
// 开始进行验证
res = vk.pubfn.formValidate({
data: data,
rules: rules
});
// 返回验证结果
return res;
}
}
module.exports = new Util
@@ -0,0 +1,32 @@
module.exports = {
/**
* 分页查询
* @url admin/system_uni/admin-log/sys/getList 前端调用的url参数地址
* data 请求参数 说明
* @param {Number} pageIndex 当前页码
* @param {Number} pageSize 每页显示数量
* @param {Array<Object>} sortRule 排序规则
* @param {object} formData 查询条件数据源
* @param {Array<Object>} columns 查询条件规则
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
let dbName = "opendb-admin-log";
res = await vk.baseDao.getTableData({
dbName,
data,
whereJson:{
}
});
return res;
}
}
@@ -0,0 +1,61 @@
module.exports = {
/**
* 添加
* @url admin/system_uni/components-dynamic/sys/add 前端调用的url参数地址
* data 请求参数 说明
* @param {String} data_id 组件数据id
* @param {String} title 数据标题
* @param {Object} data 组件数据
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
data_id,
data: dynamicData,
title,
description,
type,
sort = 0,
show = true,
name
} = data;
// 参数非空检测
if (vk.pubfn.isNull(data_id)) return { code: -1, msg: 'data_id不能为空' };
let dbName = "vk-components-dynamic";
// 检测key是否已存在
let num = await vk.baseDao.count({
dbName: dbName,
whereJson: {
data_id,
}
});
if (num > 0) {
return { code: -1, msg: `组件数据id不能重复!` };
}
// 执行数据库API请求
res.id = await vk.baseDao.add({
dbName,
dataJson: {
data: dynamicData,
data_id,
title,
description,
type,
sort,
show,
name
}
});
return res;
}
}
@@ -0,0 +1,32 @@
module.exports = {
/**
* 删除
* @url admin/system_uni/components-dynamic/sys/delete 前端调用的url参数地址
* data 请求参数 说明
* @param {String} _id id
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
let { _id } = data;
// 参数非空检测
if(vk.pubfn.isNullOne(_id)){
return { code : -1, msg : '_id不能为空' };
}
// 执行数据库API请求
let num = await vk.baseDao.del({
dbName:"vk-components-dynamic",
whereJson:{
_id
}
});
return res;
}
}
@@ -0,0 +1,32 @@
module.exports = {
/**
* 分页查询
* @url admin/system_uni/components-dynamic/sys/getList 前端调用的url参数地址
* data 请求参数 说明
* @param {Number} pageIndex 当前页码
* @param {Number} pageSize 每页显示数量
* @param {Array<Object>} sortRule 排序规则
* @param {object} formData 查询条件数据源
* @param {Array<Object>} columns 查询条件规则
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
let dbName = "vk-components-dynamic";
res = await vk.baseDao.getTableData({
dbName,
data,
whereJson:{
}
});
return res;
}
}
@@ -0,0 +1,69 @@
module.exports = {
/**
* 修改
* @url admin/system_uni/components-dynamic/sys/update 前端调用的url参数地址
* data 请求参数 说明
* @param {String} data_id 组件数据id
* @param {String} title 数据标题
* @param {Object} data 组件数据
* @param {Object} description 数据描述
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
_id,
data_id,
data: dynamicData,
title,
description,
type,
sort,
show,
name
} = data;
// 参数非空检测
if (vk.pubfn.isNull(_id)) return { code: -1, msg: 'id不能为空' };
let dbName = "vk-components-dynamic";
if (vk.pubfn.isNotNull(data_id)) {
// 检测data_id是否已存在
let num = await vk.baseDao.count({
dbName,
whereJson: {
data_id,
_id: _.neq(_id)
}
});
if (num > 0) {
return { code: -1, msg: `组件数据id不能重复!` };
}
}
// 执行数据库API请求
res.num = await vk.baseDao.updateById({
dbName,
id: _id,
dataJson: {
data: dynamicData,
data_id,
title,
description,
type,
sort,
show,
name
}
});
return res;
}
}
@@ -0,0 +1,59 @@
const formRules = require('../util/formRules.js');
module.exports = {
/**
* 添加
* @url admin/system_uni/global-data/sys/add 前端调用的url参数地址
* data 请求参数 说明
* @param {String} key 键名
* @param {any} value 键值
* @param {time} expired_at 过期时间
* @param {String} comment 备注
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
key,
value,
expired_at,
comment
} = data;
if (!expired_at) expired_at = 0;
// 参数合法校验
let formRulesRes = await formRules.add(event);
if (formRulesRes.code !== 0) {
return formRulesRes;
}
let dbName = "vk-global-data";
// 检测key是否已存在
let num = await vk.baseDao.count({
dbName,
whereJson: {
key
}
});
if (num > 0) {
return { code: -1, msg: `键值【${key}】不能重复!` };
}
// 执行数据库API请求
res.id = await vk.baseDao.add({
dbName,
dataJson: {
_id: key, // 此处将_id也设置为key,方便使用doc查询提高性能
key,
value,
expired_at,
comment
}
});
return res;
}
}
@@ -0,0 +1,33 @@
module.exports = {
/**
* 删除
* @url admin/system_uni/global-data/sys/delete 前端调用的url参数地址
* data 请求参数 说明
* @param {String} _id id
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
let { _id } = data;
// 参数非空检测
if(vk.pubfn.isNullOne(_id)){
return { code : -1, msg : '_id不能为空' };
}
let dbName = "vk-global-data";
// 执行数据库API请求
let num = await vk.baseDao.del({
dbName:dbName,
whereJson:{
_id
}
});
return res;
}
}
@@ -0,0 +1,32 @@
module.exports = {
/**
* 分页查询
* @url admin/system_uni/global-data/sys/getList 前端调用的url参数地址
* data 请求参数 说明
* @param {Number} pageIndex 当前页码
* @param {Number} pageSize 每页显示数量
* @param {Array<Object>} sortRule 排序规则
* @param {object} formData 查询条件数据源
* @param {Array<Object>} columns 查询条件规则
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
let dbName = "vk-global-data";
res = await vk.baseDao.getTableData({
dbName,
data,
whereJson:{
}
});
return res;
}
}
@@ -0,0 +1,52 @@
const formRules = require('../util/formRules.js');
module.exports = {
/**
* 修改
* @url admin/system_uni/global-data/sys/update 前端调用的url参数地址
* data 请求参数 说明
* @param {String} key 键名
* @param {any} value 键值
* @param {time} expired_at 过期时间
* @param {any} comment 备注
* @param {String} _id id
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
_id,
key,
value,
expired_at,
comment
} = data;
if (typeof expired_at !== "undefined" && !expired_at) expired_at = 0;
// 参数合法校验
let formRulesRes = await formRules.update(event);
if (formRulesRes.code !== 0) {
return formRulesRes;
}
let dbName = "vk-global-data";
// 执行数据库API请求
res.num = await vk.baseDao.update({
dbName: dbName,
whereJson: {
_id: key
},
dataJson: {
value,
expired_at,
comment
}
});
return res;
}
}
@@ -0,0 +1,64 @@
'use strict';
/**
* 表单验证
*/
class Util {
constructor() {
}
/**
* 添加
*/
async add(event) {
let { data = {}, userInfo, util } = event;
let { vk } = util;
let res = { code: 0, msg: '' };
// 验证规则开始 -----------------------------------------------------------
let rules = {
key: [
{ required: true, message: '键名不能为空', trigger: 'blur' },
],
value: [
{ required: true, message: '键值不能为空', trigger: 'change' }
]
};
// 验证规则结束 -----------------------------------------------------------
// 开始进行验证
res = vk.pubfn.formValidate({
data: data,
rules: rules
});
// 返回验证结果
return res;
}
/**
* 修改
*/
async update(event) {
let { data = {}, userInfo, util } = event;
let { vk } = util;
let res = { code: 0, msg: '' };
// 验证规则开始 -----------------------------------------------------------
let rules = {
key: [
{ required: true, message: '键名不能为空', trigger: 'blur' },
],
value: [
{ required: true, message: '键值不能为空', trigger: 'change' }
]
};
// 验证规则结束 -----------------------------------------------------------
// 开始进行验证
res = vk.pubfn.formValidate({
data: data,
rules: rules
});
// 返回验证结果
return res;
}
}
module.exports = new Util
@@ -0,0 +1,117 @@
'use strict';
module.exports = {
/**
* 重新执行回调通知
* @url admin/system_uni/pay-orders/sys/afreshNotice 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, originalParam } = event;
let { config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
let {
_id, // 订单id
} = data;
let dbName = "vk-pay-orders";
// 获取异步回调配置
let spaceId = originalParam.context.SPACEINFO.spaceId; // 服务空间ID
let currentNotifyUrl = getNotifyUrl(config, spaceId);
if (!currentNotifyUrl || currentNotifyUrl.indexOf("http") !== 0) {
return { code: -1, msg: "请先配置正确的异步回调URL,参考配置文档:https://vkdoc.fsq.pub/vk-uni-pay/config.html" }
}
// 获取订单信息
let orderInfo = await vk.baseDao.findById({
dbName,
id: _id
});
if (vk.pubfn.isNull(orderInfo)) return { code: -1, msg: "订单不存在" };
if (orderInfo.status !== 1) return { code: -1, msg: "订单状态错误" };
if (orderInfo.user_order_success) return { code: -1, msg: "无需重新通知" };
// 先将订单的状态改为未支付(重新回调需要)
let updateNum = await vk.baseDao.update({
dbName,
whereJson: {
_id,
status: 1
},
dataJson: {
status: 0,
user_order_success: _.remove()
}
});
if (!updateNum) {
return { code: -1, msg: "订单状态错误" };
}
let { original_data, out_trade_no } = orderInfo;
try {
// 执行回调
let requestRes = await vk.request({
url: `${currentNotifyUrl}${original_data.path}`,
method: "POST",
dataType: "text",
header: original_data.headers,
content: original_data.body
});
} catch (err) {}
// 再次获取订单信息,判断是否回调成功
let payOrderInfo = await vk.baseDao.findById({
dbName,
id: _id
});
if (payOrderInfo.status === 1) {
// 等待回调全部执行完成,最大等待20秒
let await_max_time = 20;
if (typeof payOrderInfo.user_order_success == "undefined") {
let whileTime = 0; // 当前循环已执行的时间(毫秒)
let whileInterval = 1000; // 每次循环间隔时间(毫秒)
let maxTime = await_max_time * 1000; // 循环执行时间超过此值则退出循环(毫秒)
while (typeof payOrderInfo.user_order_success == "undefined" && whileTime <= maxTime) {
await vk.pubfn.sleep(whileInterval);
whileTime += whileInterval;
// 查询最新的订单信息
payOrderInfo = await vk.baseDao.findById({
dbName,
id: _id
});
}
}
}
// 还原部分信息(如支付时间不可被重新回调修改)
await vk.baseDao.updateById({
dbName,
id: _id,
dataJson: {
status: orderInfo.status,
pay_date: orderInfo.pay_date,
original_data: orderInfo.original_data,
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
// 获取异步回调配置
function getNotifyUrl(config, spaceId) {
const payConifg = config["uni-pay"];
const { notifyUrl } = payConifg;
let currentNotifyUrl = notifyUrl[spaceId]; // 异步回调地址
// 兼容正式版阿里云与公测版阿里云spaceId开始-----------------------------------------------------------
if (!currentNotifyUrl) {
if (spaceId.indexOf("mp-") === 0) {
currentNotifyUrl = notifyUrl[spaceId.substring(3)];
} else {
currentNotifyUrl = notifyUrl[`mp-${spaceId}`];
}
}
// 兼容正式版阿里云与公测版阿里云spaceId结束-----------------------------------------------------------
return currentNotifyUrl;
}
@@ -0,0 +1,29 @@
module.exports = {
/**
* vk-pay支付插件支付订单查询
* @url admin/system_uni/pay-orders/sys/getList 前端调用的url参数地址
* data 请求参数 说明
* @param {Number} pageIndex 当前页码
* @param {Number} pageSize 每页显示数量
* @param {Array<Object>} sortRule 排序规则
* @param {object} formData 查询条件数据源
* @param {Array<Object>} columns 查询条件规则
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let dbName = "vk-pay-orders";
res = await vk.baseDao.getTableData({
dbName,
data
});
return res;
}
}
@@ -0,0 +1,33 @@
module.exports = {
/**
* 分页查询
* @url admin/system_uni/uni-id-files/categories/kh/getList 前端调用的url参数地址
* data 请求参数 说明
* @param {Number} pageIndex 当前页码
* @param {Number} pageSize 每页显示数量
* @param {Array<Object>} sortRule 排序规则
* @param {object} formData 查询条件数据源
* @param {Array<Object>} columns 查询条件规则
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
let dbName = "vk-files-categories";
res = await vk.baseDao.getTableData({
dbName,
data,
whereJson:{
},
sortArr:[{ name:"_id", type:"asc" }]
});
return res;
}
}
@@ -0,0 +1,51 @@
module.exports = {
/**
* 添加
* @url admin/system_uni/uni-id-files/categories/sys/add 前端调用的url参数地址
* data 请求参数 说明
* @param {String} name 分类名称
* @param {String} description 数据描述
* @param {Number} sort 排序值
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
let {
name,
description,
sort,
} = data;
// 参数非空检测
if(vk.pubfn.isNull(name)){
return { code : -1, msg : '名称不能为空' };
}
let dbName = "vk-files-categories";
// 检测key是否已存在
let num = await vk.baseDao.count({
dbName,
whereJson:{
name,
}
});
if(num > 0){
return { code : -1, msg : `名称【${name}】不能重复!` };
}
// 执行数据库API请求
res.id = await vk.baseDao.add({
dbName,
dataJson:{
name,
description,
sort
}
});
return res;
}
}
@@ -0,0 +1,30 @@
module.exports = {
/**
* 删除
* @url admin/system_uni/uni-id-files/categories/sys/delete 前端调用的url参数地址
* data 请求参数 说明
* @param {String} _id id
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
let { _id } = data;
// 参数非空检测
if(vk.pubfn.isNullOne(_id)){
return { code : -1, msg : '_id不能为空' };
}
let dbName = "vk-files-categories";
await vk.baseDao.deleteById({
dbName,
id:_id
});
return res;
}
}
@@ -0,0 +1,57 @@
module.exports = {
/**
* 修改
* @url admin/system_uni/uni-id-files/categories/sys/update 前端调用的url参数地址
* data 请求参数 说明
* @param {String} _id id
* @param {String} name 分类名称
* @param {String} description 数据描述
* @param {Number} sort 排序值
* @param {String} parent_id 父id
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
let {
_id,
name,
description,
sort
} = data;
// 参数非空检测
if(vk.pubfn.isNull(name)){
return { code : -1, msg : '名称不能为空' };
}
let dbName = "vk-files-categories";
// 检测data_id是否已存在
let num = await vk.baseDao.count({
dbName,
whereJson:{
name,
_id : _.neq(_id)
}
});
if(num > 0){
return { code : -1, msg : `名称【${name}】不能重复!` };
}
// 执行数据库API请求
res.num = await vk.baseDao.updateById({
dbName,
id:_id,
dataJson:{
name,
description,
sort
}
});
return res;
}
}
@@ -0,0 +1,60 @@
module.exports = {
/**
* 删除
* @url admin/system_uni/uni-id-files/files/kh/delete 前端调用的url参数地址
* data 请求参数 说明
* @param {String,Array<String>} _id id 或id数组
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let { _id } = data;
// 参数非空检测
if (vk.pubfn.isNullOne(_id)) {
return { code: -1, msg: '_id不能为空' };
}
let whereJson = {};
let { role = [] } = userInfo;
if (role.indexOf("admin") === -1) {
// 如果不是admin角色用户,则只能删除自己上传的
whereJson["user_id"] = uid;
}
if (typeof _id === "string") {
// 单条删除
whereJson["_id"] = _id;
} else if (typeof _id === "object") {
// 批量删除
whereJson["_id"] = _.in(_id);
}
let selectRes = await vk.baseDao.select({
dbName: "vk-files",
pageIndex: 1,
pageSize: 500,
getMain: true,
whereJson,
fieldJson: {
file_id: true
}
});
if (selectRes.length > 0) {
try {
let fileList = vk.pubfn.arrayObjectGetArray(selectRes, "file_id");
await uniCloud.deleteFile({ fileList });
} catch (err) {}
// 执行数据库API请求
res.num = await vk.baseDao.del({
dbName: "vk-files",
whereJson
});
}
res.msg = "ok";
return res;
}
}
@@ -0,0 +1,40 @@
module.exports = {
/**
* 分页查询
* @url admin/system_uni/uni-id-files/files/kh/getList 前端调用的url参数地址
* data 请求参数 说明
* @param {Number} pageIndex 当前页码
* @param {Number} pageSize 每页显示数量
* @param {Array<Object>} sortRule 排序规则
* @param {object} formData 查询条件数据源
* @param {Array<Object>} columns 查询条件规则
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let dbName = "vk-files";
let whereJson = {};
let { role = [] } = userInfo;
let { formData = {} } = data;
let { category_id } = formData;
if (category_id == "null") {
whereJson["category_id"] = null;
}
if (role.indexOf("admin") === -1) {
// 如果不是admin角色用户,则只能查看自己上传的
whereJson["user_id"] = uid;
}
res = await vk.baseDao.getTableData({
dbName,
data,
whereJson
});
return res;
}
}
@@ -0,0 +1,64 @@
module.exports = {
/**
* 修改
* @url admin/system_uni/uni-id-files/files/kh/update 前端调用的url参数地址
* data 请求参数 说明
* @param {String} display_name 显示在后台的文件名称
* @param {String} category_id 分类id
* @param {Number} status 0:未审核 1:已审核通过 2:审核不通过
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
_id,
display_name,
category_id,
cover_image,
status = 0
} = data;
// 参数非空检测
if (vk.pubfn.isNullOne(_id)) {
return { code: -1, msg: '_id不能为空' };
}
let dbName = "vk-files";
let whereJson = {};
let dataJson = {
display_name,
category_id,
cover_image,
status
};
let { role = [] } = userInfo;
if (role.indexOf("admin") === -1) {
// 如果不是admin角色用户,则只能修改自己上传的
whereJson["user_id"] = uid;
}
if (typeof _id === "string") {
// 单条操作
whereJson["_id"] = _id;
} else if (typeof _id === "object") {
// 批量操作
whereJson["_id"] = _.in(_id);
}
if (category_id == "null" || category_id === "") {
dataJson["category_id"] = _.remove();
}
// 执行数据库API请求
res.num = await vk.baseDao.update({
dbName: dbName,
whereJson,
dataJson
});
return res;
}
}
@@ -0,0 +1,66 @@
module.exports = {
/**
* 分页查询
* @url admin/system_uni/uni-id-log/sys/getList 前端调用的url参数地址
* data 请求参数 说明
* @param {Number} pageIndex 当前页码
* @param {Number} pageSize 每页显示数量
* @param {Array<Object>} sortRule 排序规则
* @param {object} formData 查询条件数据源
* @param {Array<Object>} columns 查询条件规则
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let { dcloud_appid, appids } = data.formData || {};
let whereJson = {};
if (dcloud_appid) {
if (dcloud_appid === "___empty-array___") {
whereJson["dcloud_appid"] = [];
} else if (dcloud_appid === "___error___") {
whereJson["dcloud_appid"] = _.and(_.exists(true), _.nin(appids));
} else if (dcloud_appid === "___non-existent___") {
whereJson["dcloud_appid"] = _.exists(false);
} else {
whereJson["dcloud_appid"] = _.or(_.eq(dcloud_appid), _.exists(false));
}
}
let dbName = "uni-id-log";
res = await vk.baseDao.getTableData({
dbName,
data,
whereJson,
// 副表列表
foreignDB: [{
dbName: "opendb-app-list",
localKey: "dcloud_appid",
foreignKey: "appid",
localKeyType: "array",
as: "appList",
limit: 500
},
{
dbName: "uni-id-users",
localKey: "user_id",
foreignKey: "_id",
as: "userInfo",
limit: 1,
fieldJson: {
_id: true,
avatar: true,
nickname: true,
gender: true
}
}
],
});
return res;
}
}
@@ -0,0 +1,17 @@
## PC后台admin管理端
#### `router/service/admin` 目录为后台管理端逻辑
#### 以下的目录并非强制性,只是建议,便于统一开发规范。
```
.
├── admin──────────────────────# 后台管理端逻辑
│ └── system────────────────# 系统(用户、角色、权限、菜单、应用)
│ └── system_uni────────────# 系统插件
│ └── user──────────────────# 用户管理
│ └── order─────────────────# 订单管理
│ ── └── xxxxxxxxxxxxxxx──────#
│ ── └── xxxxxxxxxxxxxxx──────#
│ ── └── xxxxxxxxxxxxxxx──────#
│ ── └── xxxxxxxxxxxxxxx──────#
└─────────────────────────────────
```
@@ -0,0 +1,11 @@
## 客户端(H5、小程序、APP客户端)
#### `router/service/client` 目录为客户端端逻辑
#### 以下的目录并非强制性,只是建议,便于统一开发规范。
```
.
├── client──────────────────────# 客户端逻辑
│ └── user───────────────────# 用户服务
│ └── order──────────────────# 订单服务
└─────────────────────────────────
```
@@ -0,0 +1,35 @@
'use strict';
module.exports = {
/**
* 此函数名称
* @url user/pub/test1 前端调用的url参数地址
* @description 此函数描述
* @param {Object} data 请求参数
* @param {String} uniIdToken 用户token
* @param {String} userInfo 当前登录用户信息(可信任,仅kh目录下的函数有此值)
* pub目录下请求参数需要带上 need_user_info = true
* @param {Object} util 公共工具包
* @param {Object} filterResponse 过滤器返回的数据
* @param {Object} originalParam 原始请求参数(包含了原始event和context)
* data 请求参数 说明
* @param {String} uid 当前登录用户id(可信任,仅kh目录下的函数有此值)
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
// 注意: userInfo 和 uid 是可信任的,但默认只有kh目录下的函数才有此值
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
// 可写与数据库的交互逻辑等等
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,23 @@
'use strict';
module.exports = {
/**
* 此函数名称
* @url user/pub/test1 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
// 可写与数据库的交互逻辑等等
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,21 @@
'use strict';
module.exports = {
/**
* 获取accessToken
* @url plugs/baidu/client/pub/getAccessToken 前端调用的url参数地址
* data 请求参数 说明
* @param {String} image 图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式
* @param {String} url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式,当image字段存在时url字段失效请注意关闭URL防盗链
* 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 : '' };
res.access_token = await vk.openapi.baidu.open.auth.getAccessToken();
return res;
}
}
@@ -0,0 +1,29 @@
'use strict';
module.exports = {
/**
* 营业执照识别
* @url plugs/baidu/client/pub/ocr/business_license 前端调用的url参数地址
* data 请求参数 说明
* @param {String} image 图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式
* @param {String} url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式,当image字段存在时url字段失效请注意关闭URL防盗链
* 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 : '' };
let { image, url } = data;
res = await vk.openapi.baidu.open.request({
action:"ocr/v1/business_license",
actionVersion: "2.0",
data:{
image,
url
}
});
return res;
}
}
@@ -0,0 +1,29 @@
'use strict';
module.exports = {
/**
* 身份证识别
* @url plugs/baidu/client/pub/ocr/idcard 前端调用的url参数地址
* data 请求参数 说明
* @param {String} image 图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式
* @param {String} url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式,当image字段存在时url字段失效请注意关闭URL防盗链
* 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 : '' };
let { image, url } = data;
res = await vk.openapi.baidu.open.request({
action:"ocr/v1/idcard",
actionVersion: "2.0",
data:{
image,
url
}
});
return res;
}
}
@@ -0,0 +1,37 @@
module.exports = {
/**
* 此函数名称
* @url plugs/components_dynamic/client/pub/getComponentsDynamicData 前端调用的url参数地址
* data 请求参数 说明
* @params {String} uid 当前登录用户id,若用户已登录且token有效,则data中会带uid参数
* (此参数是后端过滤器通过token获取并添加到data中的,是可信任的)(只有kh函数才带此参数)
* @params {Array<String>} ids 需要获取的组件数据 id数组
* 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, ids } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
// 根据ids获取组件动态数据列表
let res_select = await vk.baseDao.select({
dbName:"vk-components-dynamic",
getCount:false,
pageSize:100,
whereJson:{
data_id : _.in(ids)
},
}, event.util);
// 将数组形式 转换成 组件需要的格式
res.componentsDynamic = {};
for(let i in res_select.rows){
let item = res_select.rows[i];
res.componentsDynamic[item.data_id] = item.data;
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,138 @@
module.exports = {
/**
* 初始化数据
* @url plugs/components_dynamic/client/pub/init 前端调用的url参数地址
* data 请求参数 说明
* res 返回参数说明
* @params {Number} code 错误码,0表示成功
* @params {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, originalParam } = event;
let { uniID, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : 'ok' };
// 业务逻辑开始-----------------------------------------------------------
// 承载所有读操作的 promise 的数组
let dbName = "vk-components-dynamic";
let data_ids = [
"vk-test-notice-bar-01",
"vk-test-notice-bar-02",
"vk-test-notice-bar-03",
"vk-test-notice-bar-04",
"vk-test-index-swiper-01",
"vk-test-grid-button-01"
];
let whereJson = {
data_id:_.in(data_ids)
};
res = await vk.baseDao.select({
dbName:dbName,
getCount:true,
pageIndex:1,
pageSize:100,
whereJson:whereJson
}, event.util);
if(res.rows.length == data_ids.length){
return res;
}
await vk.baseDao.del({
dbName:dbName,
whereJson:whereJson
},event.util);
let dataArr = [
{
"data_id": "vk-test-notice-bar-01",
"data": {
"list": [
"公告111公告111公告111公告111公告111公告111公告111"
]
}
},
{
"data_id": "vk-test-notice-bar-02",
"data": {
"list": [
"公告222公告222公告222公告222公告222公告222公告222"
]
}
},
{
"data_id": "vk-test-notice-bar-03",
"data": {
"list": [
"公告333333公告333333公告333333公告333333公告333333"
]
}
},
{
"data_id": "vk-test-notice-bar-04",
"data": {
"list": [
"公告44444公告44444公告44444公告44444公告44444公告44444"
]
}
},
{
"data_id": "vk-test-index-swiper-01",
"data": {
"list": [
{
"title": "标题11111111",
"image": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1594798331539&di=fe544344d765e4f23f90457f02a2d361&imgtype=0&src=http%3A%2F%2Fpic1.win4000.com%2Fwallpaper%2F1%2F58f03bf05fddb.jpg%3Fdown"
},
{
"title": "标题2222222",
"image": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1594798658581&di=bcd5486940ad88cf88a904f411c53e94&imgtype=0&src=http%3A%2F%2Fn.sinaimg.cn%2Fsinacn15%2F600%2Fw1920h1080%2F20180505%2Fad66-hacuuvt5802647.jpg"
},
{
"title": "标题3333333",
"image": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1594798022306&di=ed613c19ef36df7856b383601acb2f05&imgtype=0&src=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fupload%2Fupc%2Ftx%2Fwallpaper%2F1306%2F17%2Fc1%2F22199754_1371460645988.jpg"
}
],
"height": 300
}
},
{
"data_id": "vk-test-grid-button-01",
"data": {
"col":4,
"icon-size":46,
"text-margin-top":10,
"text-color":"#000000",
"icon-color":"#000000",
"border":false,
"list":[
{
"icon":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1594798331539&di=fe544344d765e4f23f90457f02a2d361&imgtype=0&src=http%3A%2F%2Fpic1.win4000.com%2Fwallpaper%2F1%2F58f03bf05fddb.jpg%3Fdown",
"text":"按钮1",
"page":"../vk-u-notice-bar/vk-u-notice-bar"
},
{
"icon":"red-packet",
"text":"按钮2",
"icon-color":"red",
"page":"../vk-u-swiper/vk-u-swiper"
},
{
"icon":"red-packet",
"text":"按钮3",
"text-color":"red"
},
{
"icon":"red-packet",
"text":"按钮4"
}
]
}
}
];
await vk.baseDao.adds({
dbName:dbName,
dataJson:dataArr
},event.util);
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,29 @@
module.exports = {
/**
* 修改数据
* @url plugs/components_dynamic/client/pub/update 前端调用的url参数地址
* data 请求参数 说明
* res 返回参数说明
* @params {Number} code 错误码,0表示成功
* @params {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, originalParam } = event;
let { uniID, pubFun, vk , db, _ } = util;
let { uid, data_id, data_value } = data;
let res = { code : 0, msg : 'ok' };
// 业务逻辑开始-----------------------------------------------------------
res.num = await vk.baseDao.update({
dbName:"vk-components-dynamic",
whereJson:{
data_id : data_id,
},
dataJson:{
data : data_value
}
},event.util);
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,15 @@
## 插件
#### `router/service/plugs`
#### 此目录一般为插件作者开发的一些通用功能,如动态数据组件的API将在此目录,未来会新增微信小程序订阅消息发送等等。
```
.
├── plugs──────────────────────# 插件逻辑
│ └── plugs-A───────────────────# 插件A
│ ────└── admin───────────────────# 插件A admin端
│ ────└── client──────────────────# 插件A client端
│ └── plugs-B───────────────────# 插件B
│ ────└── admin───────────────────# 插件B admin端
│ ────└── client──────────────────# 插件B client端
└─────────────────────────────────
```
@@ -0,0 +1,54 @@
module.exports = {
/**
* 此函数名称
* @url template/db_api/user/pub/Promise.all 前端调用的url参数地址
* data 请求参数 说明
* res 返回参数说明
* @params {Number} code 错误码,0表示成功
* @params {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, originalParam } = event;
let { uniID, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : 'ok' };
// 业务逻辑开始-----------------------------------------------------------
let dbName = "vk-test";
let runTime1 = new Date().getTime();
let addNum = 200;
console.log(new Date(runTime1),"开始运行,添加"+addNum+"条数据");
// 承载所有读操作的 promise 的数组
let tasks = [];
for(let i = 1; i <= addNum; i++){
let promise = vk.baseDao.add({
dbName:dbName,
dataJson:{
"money": 10.02+i,
"_add_time": 1597456395010+i,
"user_id": "001"
}
});
tasks.push(promise);
}
// 等待所有
let ids = [];
try {
res = await Promise.all(tasks).then((values) => {
return {
//ids:values,
total:values.length
};
});
} catch (e) {
//console.log("异常:",e,res);
console.log("异常:运行超时");
res.msg = "运行超时";
}
let runTime2 = new Date().getTime();
let runTime = (runTime2 - runTime1) / 1000 + "秒";
console.log(new Date(runTime2),"运行结束,耗时:"+runTime);
res.runTime = runTime;
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,36 @@
module.exports = {
/**
* 添加单条数据
* @url template/db_api/pub/add 前端调用的url参数地址
* data 请求参数 说明
* res 返回参数说明
* @params {Number} code 错误码,0表示成功
* @params {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, originalParam } = event;
let { uniID, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : 'ok' };
// 业务逻辑开始-----------------------------------------------------------
// 随机定位开始-----------------------------------------------------------
// 为了方便测试,这里固定在杭州市西湖区附近
let longitude = 120.12792 + Math.floor(Math.random() * 500) / 10000;
let latitude = 30.228932 + Math.floor(Math.random() * 500) / 10000;
// 随机定位结束-----------------------------------------------------------
res.id = await vk.baseDao.add({
dbName:"vk-test",
dataJson:{
"money": Math.floor(Math.random() * 9 + 1),
"user_id": "00"+Math.floor(Math.random() * 2 + 1),
"location":new db.Geo.Point(longitude, latitude),
"position":{
"longitude":longitude,
"latitude":latitude,
},
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}

Some files were not shown because too many files have changed in this diff Show More