This commit is contained in:
2026-10-08 18:18:21 +08:00
parent 9cc1ff546c
commit 1e3095c05e
1911 changed files with 349551 additions and 0 deletions
@@ -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,63 @@
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 @@
'use strict';
module.exports = {
/**
* XXXnameXXX
* @url admin/system/user/sys/changeCoop 前端调用的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: "" };
// 业务逻辑开始-----------------------------------------------------------
const company = await vk.baseDao.findById({
dbName: "uni-id-users",
id: data.id
});
const isCoop = (!company.isCoop || company.isCoop === 0) ? 1 : 0
await vk.baseDao.updateById({
dbName: "uni-id-users",
id: data.id,
dataJson: {
isCoop
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,60 @@
'use strict';
const PROFILE_KEY = 'notaryUnionPayProfile';
module.exports = {
/**
* 审核金久信公正银联资料
* @url admin/system/user/sys/changeNotaryUnionPayProfileStatus 前端调用的url参数地址
*/
main: async (event) => {
const {data = {}, util} = event;
const {vk} = util;
const {id, status, refuseReason = null} = data;
const user = await vk.baseDao.findByWhereJson({
dbName: 'uni-id-users',
whereJson: {_id: id}
});
if (!user || !user[PROFILE_KEY]) {
return {
code: -1,
msg: '未找到银联资料'
};
}
const profile = {
...user[PROFILE_KEY],
status,
refuseReason: status === 2 ? refuseReason : null,
reviewTime: vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss"),
reviewTimestamp: Date.now(),
};
await vk.baseDao.updateById({
dbName: 'uni-id-users',
id,
dataJson: {
[PROFILE_KEY]: profile,
isNotaryBusiness: status === 1 ? 1 : 0
}
});
await vk.baseDao.add({
dbName: "jjx-message",
dataJson: {
uid: id,
title: '银联资料审核结果',
content: `尊敬的用户,您的金久信公正银联资料已${status === 1 ? '审核通过' : '审核拒绝'}。${status === 2 && refuseReason ? `拒绝原因:${refuseReason}` : ''}`,
type: 'notary-union-pay-profile',
hasRead: false
}
});
return {
code: 0,
msg: '操作成功'
};
}
}
@@ -0,0 +1,32 @@
'use strict';
module.exports = {
/**
* XXXnameXXX
* @url admin/system/user/sys/changeCoop 前端调用的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: "" };
// 业务逻辑开始-----------------------------------------------------------
const company = await vk.baseDao.findById({
dbName: "uni-id-users",
id: data.id
});
const showInYellow = (!company.showInYellow || company.showInYellow === 0) ? 1 : 0
await vk.baseDao.updateById({
dbName: "uni-id-users",
id: data.id,
dataJson: {
showInYellow
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,52 @@
'use strict';
module.exports = {
/**
* 认证审核
* @url admin/system/user/sys/changeStatus 前端调用的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: ""};
// 业务逻辑开始-----------------------------------------------------------
const {id, authStatus, refuseReason} = data
let userLevel = authStatus === 1 ? 0 : -1
const user = await vk.baseDao.findByWhereJson({
dbName: 'uni-id-users',
whereJson: {
_id: id
},
})
if (user.userLevel > 0) userLevel = user.userLevel
await vk.baseDao.updateAndReturn({
dbName: 'uni-id-users',
whereJson: {
_id: id
},
dataJson: {
authStatus,
// fadadaConfirm,
refuseReason,
userLevel,
authTime: Date.now()
}
})
await vk.baseDao.add({
dbName: "jjx-message",
dataJson: {
uid: res.uid,
title: '认证结果',
content: `尊敬的用户,您的认证已${authStatus === 1 ? '通过' : '拒绝'}。`,
type: 'auth',
hasRead: false
}
});
// 业务逻辑结束-----------------------------------------------------------
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,226 @@
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, type} = 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));
}
}
if (type) {
whereJson["accountType"] = type;
}
if (data.type) {
whereJson["accountType"] = data.type;
}
if (data.isCompanyQuote) {
whereJson["isCompanyQuote"] = 1;
}
if (data.isProductQuote) {
whereJson["isProductQuote"] = 1;
}
if (data.isCostQuote) {
whereJson["isCostQuote"] = 1;
}
if (data.formData) {
if (data.formData.address && data.formData.address.province) {
whereJson["company.addressRegion.province.code"] = data.formData.address.province.code
}
if (data.formData.type) whereJson["accountType"] = data.formData.type;
if (data.formData.isSignOnly) whereJson["isSignOnly"] = true;
if (data.formData.onlyNotaryUnionPayProfile) {
whereJson["notaryUnionPayProfile.status"] = _.in([0, 1, 2]);
}
if (data.formData.hasOwnProperty('profileStatus') && data.formData.profileStatus !== '' && data.formData.profileStatus !== null && data.formData.profileStatus !== undefined) {
if (parseInt(data.formData.profileStatus) === -1) {
whereJson["notaryUnionPayProfile.status"] = _.exists(false);
} else {
whereJson["notaryUnionPayProfile.status"] = parseInt(data.formData.profileStatus);
}
}
}
console.log('whereJson', whereJson)
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
},
{
dbName: "uni-id-users",
localKey: "inviter_uid",
foreignKey: "_id",
localKeyType: "array",
as: "parent",
limit: 1
}
],
});
const toNum = (value, defaultValue = 0) => {
const num = Number(value);
return Number.isNaN(num) ? defaultValue : num;
};
if (data.formData && data.formData.isSignOnly && res.rows && res.rows.length > 0) {
const userIds = res.rows.map(item => item._id).filter(Boolean);
const qybStatMap = {};
userIds.forEach(userId => {
qybStatMap[userId] = {
qybBuyNum: 0,
qybUsedNum: 0,
qybGiftNum: 0,
qybTotalGetNum: 0
};
});
if (userIds.length > 0) {
const payRes = await vk.baseDao.select({
dbName: "jjx-sign-pay_list",
pageSize: 5000,
whereJson: {
userId: _.in(userIds)
}
});
(payRes.rows || []).forEach(item => {
if (item.userId && qybStatMap[item.userId]) qybStatMap[item.userId].qybUsedNum += 1;
});
const orderRes = await vk.baseDao.select({
dbName: "jjx-order",
pageSize: 5000,
whereJson: {
uid: _.in(userIds),
type: 13,
orderStatus: 4
}
});
const orderUserMap = {};
const orderIds = [];
(orderRes.rows || []).forEach(item => {
if (item._id && item.uid && qybStatMap[item.uid]) {
orderUserMap[item._id] = item.uid;
orderIds.push(item._id);
}
});
if (orderIds.length > 0) {
const goodsRes = await vk.baseDao.select({
dbName: "jjx-order-goods",
pageSize: 5000,
whereJson: {
orderId: _.in(orderIds)
}
});
const goodsRows = goodsRes.rows || [];
const qybIds = [...new Set(goodsRows.map(item => item.goodsId).filter(Boolean))];
const qybMap = {};
if (qybIds.length > 0) {
const qybRes = await vk.baseDao.select({
dbName: "jjx-qyb",
pageSize: 5000,
whereJson: {
_id: _.in(qybIds)
}
});
(qybRes.rows || []).forEach(item => {
qybMap[item._id] = item;
});
}
goodsRows.forEach(item => {
const userId = orderUserMap[item.orderId];
if (userId && qybStatMap[userId]) {
const buyNum = Math.max(toNum(item.num, 1), 1);
const qyb = qybMap[item.goodsId];
const getNum = qyb ? toNum(qyb.getNum, 1) : 1;
qybStatMap[userId].qybBuyNum += buyNum;
qybStatMap[userId].qybTotalGetNum += getNum * buyNum;
}
});
}
Object.keys(qybStatMap).forEach(userId => {
qybStatMap[userId].qybGiftNum = Math.max(qybStatMap[userId].qybTotalGetNum - qybStatMap[userId].qybBuyNum, 0);
});
res.rows.forEach(item => {
const qybStat = qybStatMap[item._id] || {};
item.qybBuyNum = qybStat.qybBuyNum || 0;
item.qybUsedNum = qybStat.qybUsedNum || 0;
item.qybNum = toNum(item.qybNum, 0);
item.qybGiftNum = qybStat.qybGiftNum || 0;
});
}
}
for (let i = 0; i < res.rows.length; i++) {
if (res.rows[i].isNotaryBusiness === undefined || res.rows[i].isNotaryBusiness === null) {
res.rows[i].isNotaryBusiness = res.rows[i].notaryUnionPayProfile && res.rows[i].notaryUnionPayProfile.status === 1 ? 1 : 0
}
res.rows[i].profileStatus = res.rows[i].notaryUnionPayProfile ? res.rows[i].notaryUnionPayProfile.status : -1
if (res.rows[i].accountType === 1) {
if (res.rows[i].person && res.rows[i].person.mainSpotCategoryIds && res.rows[i].person.mainSpotCategoryIds.length > 0) {
const goodsRes = await vk.baseDao.select({
dbName: "jjx-spot-category",
whereJson: {
_id: _.in(res.rows[i].person.mainSpotCategoryIds)
}
});
console.log('goodsRes', goodsRes)
if (goodsRes.rows && goodsRes.rows.length > 0) {
res.rows[i].person.mainSpotCategoryNames = goodsRes.rows.map(item => item.name).join(",");
}
}
}
if (res.rows[i].accountType === 2) {
if (res.rows[i].company && res.rows[i].company.mainSpotCategoryIds && res.rows[i].company.mainSpotCategoryIds.length > 0) {
const goodsRes = await vk.baseDao.select({
dbName: "jjx-spot-category",
whereJson: {
_id: _.in(res.rows[i].company.mainSpotCategoryIds)
}
});
console.log('goodsRes', goodsRes)
if (goodsRes.rows && goodsRes.rows.length > 0) {
res.rows[i].company.mainSpotCategoryNames = goodsRes.rows.map(item => item.name).join(",");
}
}
}
}
// 业务逻辑结束-----------------------------------------------------------
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,106 @@
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,
isService,
allowArea,
} = 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,
isService,
allowArea
};
// 设置允许登录的应用列表
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