@gingkoo/base-server 0.0.1-alpha.0 → 0.0.1-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/app.js +36 -40
- package/backend/common/entity.js +55 -0
- package/backend/common/enum.js +247 -0
- package/backend/common/fss/index.js +18 -0
- package/backend/common/fss/routers/attachment.js +45 -0
- package/backend/common/fss/routers/download.js +43 -0
- package/backend/common/fss/routers/import_export.js +113 -0
- package/backend/common/fss/routers/resources.js +149 -0
- package/backend/common/fss/routers/upload.js +81 -0
- package/backend/common/fss/services/import_export.js +159 -0
- package/backend/common/fss/services/index.js +92 -0
- package/backend/common/fss/utils.js +39 -0
- package/backend/common/ginfo/config.js +5 -0
- package/backend/common/ginfo/index.js +62 -0
- package/backend/common/index_template.html +28 -0
- package/backend/common/logger/index.js +96 -0
- package/backend/common/mapping.js +98 -0
- package/backend/common/middleware/auth.js +97 -0
- package/backend/common/middleware/cors.js +13 -0
- package/backend/common/middleware/response.js +25 -0
- package/backend/common/page_engine.js +487 -0
- package/backend/common/schedule.js +45 -0
- package/backend/common/services/dataCombine.js +67 -0
- package/backend/common/services/dept.js +37 -0
- package/backend/common/services/dict.js +487 -0
- package/backend/common/services/email.js +49 -0
- package/backend/common/services/generalConfig.js +137 -0
- package/backend/common/services/login.js +18 -0
- package/backend/common/services/notice.js +260 -0
- package/backend/common/services/permission.js +500 -0
- package/backend/common/services/roles.js +57 -0
- package/backend/common/services/send-notice.js +86 -0
- package/backend/common/services/task.js +259 -0
- package/backend/common/services/user.js +673 -0
- package/backend/common/socket.js +18 -0
- package/backend/common/sse/index.js +81 -0
- package/backend/common/sse/router.js +30 -0
- package/backend/common/task.js +75 -0
- package/backend/common/wechat/index.js +9 -0
- package/backend/common/wechat/routers/auth.js +238 -0
- package/{modules/user/frontend → backend/common/wechat/routers}/index.html +14 -7
- package/backend/common/wechat/services/auth.js +209 -0
- package/backend/common/wechat/services/notice.js +171 -0
- package/backend/config/index.js +63 -0
- package/backend/config/path.js +3 -0
- package/backend/router.js +96 -0
- package/backend/routers/app.js +222 -0
- package/backend/routers/automate.js +276 -0
- package/backend/routers/dict.js +370 -0
- package/backend/routers/email.js +85 -0
- package/backend/routers/generalConfig.js +276 -0
- package/backend/routers/idm.js +245 -0
- package/backend/routers/module.js +357 -0
- package/backend/routers/notice.js +138 -0
- package/backend/routers/pages.js +46 -0
- package/backend/routers/permission.js +985 -0
- package/backend/routers/setting.js +184 -0
- package/backend/routers/team/index.js +22 -0
- package/backend/routers/team/routers/mapping.js +29 -0
- package/backend/routers/team/routers/member.js +72 -0
- package/backend/routers/team/routers/membermanage.js +289 -0
- package/backend/routers/team/routers/pages.js +47 -0
- package/backend/routers/team/routers/roles.js +92 -0
- package/backend/routers/team/routers/teaminfo.js +27 -0
- package/backend/routers/team/routers/usergroup.js +213 -0
- package/backend/routers/team/services/mapping.js +101 -0
- package/backend/routers/team/services/member.js +206 -0
- package/backend/routers/team/services/roles.js +71 -0
- package/backend/routers/team/services/teaminfo.js +20 -0
- package/backend/routers/team/services/usergroup.js +128 -0
- package/backend/routers/user.js +436 -0
- package/backend/services/automate.js +60 -0
- package/backend/services/config.js +14 -0
- package/backend/services/module.js +298 -0
- package/backend/services/permission.js +192 -0
- package/backend/services/services.js +115 -0
- package/backend/services/setting.js +190 -0
- package/backend/services/token.js +42 -0
- package/backend/space.js +52 -0
- package/backend/space_mapping.js +15 -0
- package/backend/utils/avatar.js +48 -0
- package/backend/utils/color_gen_helper.js +20 -0
- package/backend/utils/date.js +66 -0
- package/backend/utils/excel.js +446 -0
- package/backend/utils/fs/doc.md +64 -0
- package/backend/utils/fs/index.js +127 -0
- package/backend/utils/jwt.js +54 -0
- package/backend/utils/modules/sequence.js +93 -0
- package/backend/utils/object.js +31 -0
- package/backend/utils/page-query-helper/index.js +61 -0
- package/backend/utils/path.js +123 -0
- package/backend/utils/run.js +25 -0
- package/backend/utils/tokenize.js +82 -0
- package/backend/utils/typeof.js +5 -0
- package/backend/utils/util.js +153 -0
- package/backend/views/api/index.js +32 -0
- package/backend/views/api/index.xml +49 -0
- package/backend/views/dict/index.js +80 -0
- package/backend/views/dict/index.xml +52 -0
- package/backend/views/index.js +32 -0
- package/backend/views/members_manage/index.js +68 -0
- package/backend/views/members_manage/index.xml +68 -0
- package/backend/views/roles/index.js +17 -0
- package/backend/views/roles/index.xml +47 -0
- package/backend/views/usergroup/index.js +68 -0
- package/backend/views/usergroup/index.xml +65 -0
- package/dist/common-assets/css/index-05a08720.css +3 -0
- package/dist/common-assets/css/index-05a08720.css.gz +0 -0
- package/dist/common-assets/js/index-2e8c7128.js +762 -0
- package/dist/common-assets/js/index-2e8c7128.js.gz +0 -0
- package/dist/common-assets/js/react-cropper.es-19c27537.js +10 -0
- package/dist/common-assets/js/react-cropper.es-19c27537.js.gz +0 -0
- package/dist/common-assets/png/u9-2348c304.png +0 -0
- package/dist/common-assets/woff2/materialicons-83be7b2f.woff2 +0 -0
- package/dist/index.html +162 -0
- package/package.json +61 -5
- package/common/router.js +0 -42
- package/modules/user/backend/index.js +0 -19
- package/modules/user/backend/routers/user.js +0 -11
- package/modules/user/frontend/index.js +0 -1
- package/serve.js +0 -9
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var express = require('express');
|
|
3
|
+
const { permission: permissionConstant } = require('../common/enum');
|
|
4
|
+
const servicesServices = require('../services/services');
|
|
5
|
+
const moduleServices = require('../services/module');
|
|
6
|
+
const permissionService = require('../services/permission');
|
|
7
|
+
var router = express.Router();
|
|
8
|
+
|
|
9
|
+
async function userPermissionModules(userId) {
|
|
10
|
+
let userPerms = await permissionService.checkOperPermission('user', userId, null, {
|
|
11
|
+
RES_KIND: permissionConstant.RES_KIND.PAGE,
|
|
12
|
+
RES_TYPE: permissionConstant.RES_TYPE.MODULE,
|
|
13
|
+
});
|
|
14
|
+
if (!Array.isArray(userPerms) || !userPerms.length) return [];
|
|
15
|
+
let modules = userPerms.reduce(
|
|
16
|
+
(mo, perm) => {
|
|
17
|
+
let ms = perm.RES_RANGE?.split(',').filter((v) => !mo.includes(v));
|
|
18
|
+
mo = mo.concat(ms);
|
|
19
|
+
return mo;
|
|
20
|
+
},
|
|
21
|
+
['teams-my'],
|
|
22
|
+
);
|
|
23
|
+
return modules;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const NAV_TYPE = {
|
|
27
|
+
FRAME: 'frame',
|
|
28
|
+
WINDOW: 'window',
|
|
29
|
+
SPA: 'spa',
|
|
30
|
+
STATIC: 'static',
|
|
31
|
+
DYNAMIC: 'dynamic',
|
|
32
|
+
CUSTOM: 'custom',
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 导航查询
|
|
37
|
+
* 查询系统管理权限
|
|
38
|
+
* 返回看模块信息模块
|
|
39
|
+
*/
|
|
40
|
+
router.get('/getMenu', async function (req, res) {
|
|
41
|
+
let userid = req.get('X-UserId');
|
|
42
|
+
let modules = await moduleServices.getAllModules();
|
|
43
|
+
if (!modules) {
|
|
44
|
+
return res.sendErr();
|
|
45
|
+
}
|
|
46
|
+
if (!Array.isArray(modules)) {
|
|
47
|
+
return res.sendOk([]);
|
|
48
|
+
}
|
|
49
|
+
let member = await servicesServices.getSystemPower();
|
|
50
|
+
|
|
51
|
+
if (!Array.isArray(member)) member = [];
|
|
52
|
+
|
|
53
|
+
member = member.filter((v) => v?.userid);
|
|
54
|
+
// modules = modules.filter((v) => member.includes(userid) || v.MODULE_ID !== 'teams-system');
|
|
55
|
+
|
|
56
|
+
// 先过滤掉权限
|
|
57
|
+
// let permissionModules = await userPermissionModules(userid);
|
|
58
|
+
// modules = modules.filter((v) => permissionModules.includes(v.MODULE_ID));
|
|
59
|
+
|
|
60
|
+
let data = await Promise.all(
|
|
61
|
+
modules.map(async (v) => {
|
|
62
|
+
let navs = [];
|
|
63
|
+
|
|
64
|
+
if (~[NAV_TYPE.STATIC].indexOf(v.NAV_TYPE)) {
|
|
65
|
+
navs = await moduleServices.getModuleNavs(v.MODULE_ID);
|
|
66
|
+
navs = Array.isArray(navs) ? navs : [];
|
|
67
|
+
navs = navs.map((o) => {
|
|
68
|
+
return { id: o.NAV_ID, name: o.NAV_NAME, type: o.NAV_TYPE, url: o.URL, icon: o.NAV_ICON };
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
id: v.MODULE_ID, // 模块ID required
|
|
73
|
+
name: v.MODULE_NAME, // 模块名称 required
|
|
74
|
+
icon: v.MODULE_ICON, // 模块图标 required
|
|
75
|
+
url: v.URL, // 地址 只有当 navType = frame 或 navType = window 才需要
|
|
76
|
+
desc: v.MODULE_DESC, // 模块描述
|
|
77
|
+
size: v.ICON_SIZE, // 图标大小 (没用了)
|
|
78
|
+
viewSize: v.VIEW_SIZE, // 弹框大小 只有当 viewType = dialog 才需要
|
|
79
|
+
dyn_api: v.DYN_API, // 动态导航地址 只有当 navType = dynamic 或 navType = custom 才需要
|
|
80
|
+
// 暂时不用
|
|
81
|
+
moduleType: v.MODULE_TYPE,
|
|
82
|
+
|
|
83
|
+
// 1、nav 放上面
|
|
84
|
+
// 2、usercenter 放下面
|
|
85
|
+
position: v.NAV_POSITION, // 模块位置
|
|
86
|
+
|
|
87
|
+
// 控制加载导航方式
|
|
88
|
+
// 1、frame 没有导航,直接内部打开url( 表示不加载子导航 直接用url打开模块,)
|
|
89
|
+
// 2、window 没有导航,新窗口打开url (表示不加载子导航 直接用url外部窗口打开)
|
|
90
|
+
// 3、spa space模块内部页面
|
|
91
|
+
// 4、static 加载子导航 (直接用子导航数据)
|
|
92
|
+
// 5、dynamic 通过dyn_api请求menu菜单,再通过菜单查询子导航需要的数据
|
|
93
|
+
// 6、custom 通过dyn_api 请求子导航
|
|
94
|
+
navType: v.NAV_TYPE, // 导航类型
|
|
95
|
+
|
|
96
|
+
// 1、view 普通视图
|
|
97
|
+
// 2、dialog 弹框
|
|
98
|
+
// 3、menu 菜单
|
|
99
|
+
// 4、drawer 抽屉
|
|
100
|
+
viewType: v.VIEW_TYPE, // 打开方式
|
|
101
|
+
navs, // 二级导航 navType = static 才有
|
|
102
|
+
};
|
|
103
|
+
}),
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
res.sendOk(data);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* 导航查询
|
|
111
|
+
* 返回 所有的模块和 导航 信息
|
|
112
|
+
* 返回格式 {modules:any[],navs:any[]}
|
|
113
|
+
*/
|
|
114
|
+
router.get('/allinfo', async function (req, res) {
|
|
115
|
+
let modules = await moduleServices.getAllModules();
|
|
116
|
+
if (!modules || !Array.isArray(modules)) {
|
|
117
|
+
return res.sendErr('');
|
|
118
|
+
}
|
|
119
|
+
let navs = await moduleServices.getAllNavs();
|
|
120
|
+
if (!modules || !Array.isArray(modules)) {
|
|
121
|
+
navs = [];
|
|
122
|
+
}
|
|
123
|
+
let data = {
|
|
124
|
+
modules,
|
|
125
|
+
navs,
|
|
126
|
+
};
|
|
127
|
+
res.sendOk(data);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* 导航排序
|
|
132
|
+
*@body any[] content 格式{id,sore}
|
|
133
|
+
*@body nav|usercenter filter 过滤条件
|
|
134
|
+
*/
|
|
135
|
+
router.post('/menuSort', async function (req, res) {
|
|
136
|
+
const { content } = req.body;
|
|
137
|
+
await Promise.all(
|
|
138
|
+
content.map(async (v) => {
|
|
139
|
+
let data = await moduleServices.putModules({ ORDER_NO: v.sort }, { MODULE_ID: v.id });
|
|
140
|
+
if (data) {
|
|
141
|
+
return true;
|
|
142
|
+
} else {
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
}),
|
|
146
|
+
);
|
|
147
|
+
return res.sendOk('修改成功');
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* 创建模块
|
|
152
|
+
* 页面: 系统管理 -> 应用管理
|
|
153
|
+
*/
|
|
154
|
+
router.post('/', async function (req, res) {
|
|
155
|
+
const {
|
|
156
|
+
MODULE_ID,
|
|
157
|
+
MODULE_NAME,
|
|
158
|
+
NAV_POSITION,
|
|
159
|
+
VIEW_TYPE,
|
|
160
|
+
MODULE_ICON,
|
|
161
|
+
MODULE_DESC,
|
|
162
|
+
MODULE_TYPE,
|
|
163
|
+
URL,
|
|
164
|
+
NAV_TYPE,
|
|
165
|
+
DYN_API,
|
|
166
|
+
ORDER_NO,
|
|
167
|
+
} = req.body;
|
|
168
|
+
if (!MODULE_ID || !MODULE_NAME) {
|
|
169
|
+
return res.sendErr('缺少参数');
|
|
170
|
+
}
|
|
171
|
+
let module = await moduleServices.getHesModules(MODULE_ID);
|
|
172
|
+
if (module) {
|
|
173
|
+
return res.sendErr('当前ID已存在');
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
let content = {
|
|
177
|
+
MODULE_ID,
|
|
178
|
+
MODULE_NAME,
|
|
179
|
+
MODULE_ICON,
|
|
180
|
+
MODULE_TYPE,
|
|
181
|
+
MODULE_DESC,
|
|
182
|
+
NAV_POSITION,
|
|
183
|
+
VIEW_TYPE,
|
|
184
|
+
URL,
|
|
185
|
+
NAV_TYPE,
|
|
186
|
+
DYN_API,
|
|
187
|
+
ORDER_NO,
|
|
188
|
+
STATUS: '00',
|
|
189
|
+
};
|
|
190
|
+
let data = await moduleServices.postModule(content);
|
|
191
|
+
if (!data) {
|
|
192
|
+
return res.sendErr('创建失败');
|
|
193
|
+
}
|
|
194
|
+
res.sendOk('创建成功');
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* 修改模块
|
|
199
|
+
* 页面: 系统管理 -> 应用管理
|
|
200
|
+
*/
|
|
201
|
+
router.put('/:moduleId', async function (req, res) {
|
|
202
|
+
let { moduleId } = req.params;
|
|
203
|
+
const {
|
|
204
|
+
MODULE_NAME,
|
|
205
|
+
MODULE_ICON,
|
|
206
|
+
MODULE_DESC,
|
|
207
|
+
URL,
|
|
208
|
+
DYN_API,
|
|
209
|
+
NAV_POSITION,
|
|
210
|
+
NAV_TYPE,
|
|
211
|
+
ORDER_NO,
|
|
212
|
+
VIEW_TYPE,
|
|
213
|
+
STATUS,
|
|
214
|
+
} = req.body;
|
|
215
|
+
if (!moduleId) {
|
|
216
|
+
return res.sendErr('缺少参数');
|
|
217
|
+
}
|
|
218
|
+
let content = {
|
|
219
|
+
MODULE_NAME,
|
|
220
|
+
MODULE_ICON,
|
|
221
|
+
MODULE_DESC,
|
|
222
|
+
NAV_POSITION,
|
|
223
|
+
NAV_TYPE,
|
|
224
|
+
VIEW_TYPE,
|
|
225
|
+
URL,
|
|
226
|
+
DYN_API,
|
|
227
|
+
ORDER_NO,
|
|
228
|
+
STATUS,
|
|
229
|
+
};
|
|
230
|
+
let data = await moduleServices.putModules(content, { MODULE_ID: moduleId });
|
|
231
|
+
if (!data) {
|
|
232
|
+
return res.sendErr('修改失败');
|
|
233
|
+
}
|
|
234
|
+
res.sendOk('修改成功');
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* 删除 模块信息
|
|
239
|
+
* 页面: 系统管理 -> 应用管理
|
|
240
|
+
* 逻辑删除
|
|
241
|
+
*/
|
|
242
|
+
router.delete('/', async function (req, res) {
|
|
243
|
+
const { MODULE_ID } = req.body;
|
|
244
|
+
if (!MODULE_ID) {
|
|
245
|
+
return res.sendErr('缺少参数');
|
|
246
|
+
}
|
|
247
|
+
let data = await moduleServices.putModules({ STATUS: '01' }, { MODULE_ID });
|
|
248
|
+
if (!data) {
|
|
249
|
+
return res.sendErr('删除失败');
|
|
250
|
+
}
|
|
251
|
+
res.sendOk('删除成功');
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* 创建 导航信息
|
|
256
|
+
* 页面: 系统管理 -> 应用管理
|
|
257
|
+
* MODULE_ID, NAV_ID, NAV_NAME, NAV_ICON, NAV_DESC, NAV_TYPE, URL, ORDER_NO 字段信息
|
|
258
|
+
*/
|
|
259
|
+
router.post('/nav', async function (req, res) {
|
|
260
|
+
const { MODULE_ID, NAV_ID, NAV_NAME, NAV_ICON, NAV_DESC, NAV_TYPE, URL, ORDER_NO } = req.body;
|
|
261
|
+
if (!NAV_ID || !NAV_NAME || !MODULE_ID) {
|
|
262
|
+
return res.sendErr('缺少参数');
|
|
263
|
+
}
|
|
264
|
+
let module = await moduleServices.getHesNavs(MODULE_ID, NAV_ID);
|
|
265
|
+
if (module) {
|
|
266
|
+
return res.sendErr('当前ID已存在');
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
let content = {
|
|
270
|
+
NAV_ID,
|
|
271
|
+
MODULE_ID,
|
|
272
|
+
NAV_NAME,
|
|
273
|
+
NAV_ICON,
|
|
274
|
+
NAV_TYPE,
|
|
275
|
+
NAV_DESC,
|
|
276
|
+
URL,
|
|
277
|
+
ORDER_NO,
|
|
278
|
+
};
|
|
279
|
+
let data = await moduleServices.postNavs(content);
|
|
280
|
+
if (!data) {
|
|
281
|
+
return res.sendErr('创建失败');
|
|
282
|
+
}
|
|
283
|
+
res.sendOk('创建成功');
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* 修改导航信息
|
|
288
|
+
* 页面: 系统管理 -> 应用管理
|
|
289
|
+
* MODULE_ID, NAV_ID, NAV_NAME, NAV_ICON, NAV_DESC, NAV_TYPE, URL, ORDER_NO 字段信息
|
|
290
|
+
*/
|
|
291
|
+
router.put('/nav/:moduleId/:navId', async function (req, res) {
|
|
292
|
+
let { moduleId, navId } = req.params;
|
|
293
|
+
const { NAV_NAME, NAV_ICON, NAV_DESC, NAV_TYPE, URL, ORDER_NO } = req.body;
|
|
294
|
+
if (!NAV_NAME || !moduleId || !navId) {
|
|
295
|
+
return res.sendErr('缺少参数');
|
|
296
|
+
}
|
|
297
|
+
let content = {
|
|
298
|
+
NAV_NAME,
|
|
299
|
+
NAV_ICON,
|
|
300
|
+
NAV_TYPE,
|
|
301
|
+
NAV_DESC,
|
|
302
|
+
URL,
|
|
303
|
+
ORDER_NO,
|
|
304
|
+
};
|
|
305
|
+
let data = await moduleServices.putNavs(content, { MODULE_ID: moduleId, NAV_ID: navId });
|
|
306
|
+
if (!data) {
|
|
307
|
+
return res.sendErr('修改失败');
|
|
308
|
+
}
|
|
309
|
+
res.sendOk('修改成功');
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* 导航排序
|
|
314
|
+
*@body any[] content 格式{id:NAV_ID ,sore}
|
|
315
|
+
*@body steing moduleid 过滤条件
|
|
316
|
+
*/
|
|
317
|
+
|
|
318
|
+
router.post('/navSort', async function (req, res) {
|
|
319
|
+
const { content, moduleid } = req.body;
|
|
320
|
+
if (!moduleid) {
|
|
321
|
+
return res.sendErr('缺少参数');
|
|
322
|
+
}
|
|
323
|
+
await Promise.all(
|
|
324
|
+
content.map(async (v) => {
|
|
325
|
+
let data = await moduleServices.putNavs(
|
|
326
|
+
{ ORDER_NO: v.sort },
|
|
327
|
+
{ MODULE_ID: moduleid, NAV_ID: v.id },
|
|
328
|
+
);
|
|
329
|
+
if (data) {
|
|
330
|
+
return true;
|
|
331
|
+
} else {
|
|
332
|
+
return false;
|
|
333
|
+
}
|
|
334
|
+
}),
|
|
335
|
+
);
|
|
336
|
+
return res.sendOk('修改成功');
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* 删除导航信息
|
|
341
|
+
* 页面: 系统管理 -> 应用管理
|
|
342
|
+
* @body MODULE_ID 模块ID,
|
|
343
|
+
* @body NAV_ID 导航ID,
|
|
344
|
+
*/
|
|
345
|
+
router.delete('/nav', async function (req, res) {
|
|
346
|
+
const { MODULE_ID, NAV_ID } = req.body;
|
|
347
|
+
if (!NAV_ID || !MODULE_ID) {
|
|
348
|
+
return res.sendErr('缺少参数');
|
|
349
|
+
}
|
|
350
|
+
let data = await moduleServices.delNavs(MODULE_ID, NAV_ID);
|
|
351
|
+
if (!data) {
|
|
352
|
+
return res.sendErr('删除失败');
|
|
353
|
+
}
|
|
354
|
+
res.sendOk('删除成功');
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
module.exports = router;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var express = require('express');
|
|
3
|
+
const isPlainObject = require('lodash/isPlainObject');
|
|
4
|
+
const { checkLogin } = require('../common/middleware/auth');
|
|
5
|
+
const noticeServices = require('../common/services/notice');
|
|
6
|
+
|
|
7
|
+
var router = express.Router();
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 修改通知数据
|
|
11
|
+
* NOT_ID: 修改单个通知数据
|
|
12
|
+
* ALL_READ: 修改用户所有通知数据状态为已读
|
|
13
|
+
* IS_READ: 通知数据状态 已读或未读
|
|
14
|
+
*/
|
|
15
|
+
router.put('/', checkLogin, async function (req, res) {
|
|
16
|
+
let userid = req.get('X-UserId');
|
|
17
|
+
const { NOT_ID, ALL_READ, IS_READ } = req.body;
|
|
18
|
+
// 判断是修改单个通知数据还是修改多个通知数据
|
|
19
|
+
if (ALL_READ) {
|
|
20
|
+
let notices = await noticeServices.updateNotice(
|
|
21
|
+
{ IS_READ: 'Y' },
|
|
22
|
+
{ RECEIVE_USER: userid, IS_READ: 'N' },
|
|
23
|
+
);
|
|
24
|
+
if (!notices) return res.sendErr(null);
|
|
25
|
+
return res.sendOk('修改成功');
|
|
26
|
+
} else {
|
|
27
|
+
if (!NOT_ID) return res.sendErr('缺少参数');
|
|
28
|
+
let notices = await noticeServices.updateNotice({ IS_READ: IS_READ }, { NOT_ID: NOT_ID });
|
|
29
|
+
if (!notices) return res.sendErr(null);
|
|
30
|
+
return res.sendOk('修改成功');
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 删除通知数据
|
|
36
|
+
* NOT_ID: 删除单个通知数据
|
|
37
|
+
* ALL_DEL: 删除用户所有通知数据
|
|
38
|
+
*/
|
|
39
|
+
router.delete('/', checkLogin, async function (req, res) {
|
|
40
|
+
let userid = req.get('X-UserId');
|
|
41
|
+
const { NOT_ID, ALL_DEL } = req.body;
|
|
42
|
+
// 判断是修改单个通知数据还是修改多个通知数据
|
|
43
|
+
if (ALL_DEL) {
|
|
44
|
+
let notices = await noticeServices.deleteNotice({ RECEIVE_USER: userid });
|
|
45
|
+
if (!notices) return res.sendErr(null);
|
|
46
|
+
return res.sendOk('删除成功');
|
|
47
|
+
} else {
|
|
48
|
+
if (!NOT_ID) return res.sendErr('缺少参数');
|
|
49
|
+
let notices = await noticeServices.deleteNotice({ NOT_ID: NOT_ID });
|
|
50
|
+
if (!notices) return res.sendErr(null);
|
|
51
|
+
return res.sendOk('删除成功');
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// 获取用户通知数据
|
|
56
|
+
router.get('/notices', checkLogin, async function (req, res) {
|
|
57
|
+
let userId = req.get('X-UserId');
|
|
58
|
+
if (!userId) return res.sendErr('缺少用户ID');
|
|
59
|
+
|
|
60
|
+
let notices = await noticeServices.getNotices(userId);
|
|
61
|
+
if (!notices) return res.sendErr('查询失败');
|
|
62
|
+
|
|
63
|
+
return res.sendOk(notices);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// 获取用户通知权限
|
|
67
|
+
router.get('/permission', checkLogin, async function (req, res) {
|
|
68
|
+
let userId = req.get('X-UserId');
|
|
69
|
+
if (!userId) return res.sendErr('缺少用户ID');
|
|
70
|
+
let notices = await noticeServices.getUserPermission({ IS_NOTICE: '01', USER_ID: userId });
|
|
71
|
+
if (!notices) return res.sendErr('查询失败');
|
|
72
|
+
return res.sendOk(notices);
|
|
73
|
+
});
|
|
74
|
+
// 修改用户通知权限
|
|
75
|
+
router.put('/permission', checkLogin, async function (req, res) {
|
|
76
|
+
let userId = req.get('X-UserId');
|
|
77
|
+
const { IS_NOTICE, NOT_TYPE, NOT_GROUP, CHANNEL } = req.body;
|
|
78
|
+
if (!userId) return res.sendErr('缺少用户ID');
|
|
79
|
+
//查看是否存在
|
|
80
|
+
let notice = await noticeServices.getUserPermission({
|
|
81
|
+
NOT_TYPE,
|
|
82
|
+
CHANNEL,
|
|
83
|
+
NOT_GROUP: NOT_GROUP || null,
|
|
84
|
+
USER_ID: userId,
|
|
85
|
+
});
|
|
86
|
+
if (notice?.length) {
|
|
87
|
+
//有就修改
|
|
88
|
+
let is = await noticeServices.putUserPermission(
|
|
89
|
+
{ IS_NOTICE: IS_NOTICE },
|
|
90
|
+
{ NOT_TYPE, NOT_GROUP: NOT_GROUP || null, CHANNEL, USER_ID: userId },
|
|
91
|
+
);
|
|
92
|
+
if (!is) {
|
|
93
|
+
return res.sendErr('修改失败');
|
|
94
|
+
}
|
|
95
|
+
return res.sendOk('修改成功');
|
|
96
|
+
}
|
|
97
|
+
//没有就创建
|
|
98
|
+
let is = await noticeServices.postUserPermission({
|
|
99
|
+
IS_NOTICE: IS_NOTICE,
|
|
100
|
+
NOT_TYPE,
|
|
101
|
+
NOT_GROUP: NOT_GROUP || null,
|
|
102
|
+
CHANNEL,
|
|
103
|
+
USER_ID: userId,
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
if (!is) {
|
|
107
|
+
return res.sendErr('修改失败');
|
|
108
|
+
}
|
|
109
|
+
return res.sendOk('修改成功');
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
router.get('/dict', checkLogin, async function (req, res) {
|
|
113
|
+
const DICT_GROUPS = [
|
|
114
|
+
'NOTICE_TYPE', //通知类型
|
|
115
|
+
'CHANNEL', //渠道
|
|
116
|
+
'NOTICE_CONTENT',
|
|
117
|
+
];
|
|
118
|
+
let dicts = await noticeServices.getNoticeDict(DICT_GROUPS);
|
|
119
|
+
let data = {};
|
|
120
|
+
if (isPlainObject(dicts)) {
|
|
121
|
+
Object.entries(dicts).forEach((dict) => {
|
|
122
|
+
let [key, value] = dict;
|
|
123
|
+
if (Array.isArray(value) && value.length) {
|
|
124
|
+
data[key] = value.reduce((mo, item) => {
|
|
125
|
+
let { value } = item;
|
|
126
|
+
mo[value] = item;
|
|
127
|
+
return mo;
|
|
128
|
+
}, {});
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
} else {
|
|
132
|
+
return res.sendErr('查询失败');
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return res.sendOk(data);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
module.exports = router;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const express = require('express');
|
|
3
|
+
const PageEngine = require('../common/page_engine');
|
|
4
|
+
const permissionService = require('../common/services/permission');
|
|
5
|
+
const views = require('../views');
|
|
6
|
+
|
|
7
|
+
const router = express.Router();
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @api {get} /team/pages/:PROJECT_ID/:pageId 获取html页面
|
|
11
|
+
* @apiName GetProject
|
|
12
|
+
* @apiGroup team
|
|
13
|
+
* @apiDescription 返回团队指定页面
|
|
14
|
+
* @apiVersion 1.0.0
|
|
15
|
+
*
|
|
16
|
+
* @apiParam {members} pageId 页面id.
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
router.get('/:pageId', async function (req, res) {
|
|
20
|
+
let { pageId } = req.params;
|
|
21
|
+
let module = views(pageId);
|
|
22
|
+
|
|
23
|
+
if (!module) {
|
|
24
|
+
return res.sendErr('页面不存在');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// xml替换占位参数
|
|
28
|
+
let data = { pageId };
|
|
29
|
+
let ISSUE_CLASS = { issues: 'Issue', requirement: 'Requirement' };
|
|
30
|
+
if (!Reflect.has(ISSUE_CLASS, pageId)) {
|
|
31
|
+
data.ISSUE_CLASS = ISSUE_CLASS[pageId];
|
|
32
|
+
}
|
|
33
|
+
let pageEngine = new PageEngine(module, data);
|
|
34
|
+
let schema = pageEngine.generateSchema();
|
|
35
|
+
schema = await permissionService.formatPermHtml(
|
|
36
|
+
req.get('X-UserId'),
|
|
37
|
+
req.query['NAV_ID'],
|
|
38
|
+
schema,
|
|
39
|
+
req.query['RES_TYPE'],
|
|
40
|
+
);
|
|
41
|
+
let htmlContent = pageEngine.renderHtml(schema);
|
|
42
|
+
|
|
43
|
+
res.type('text/html; charset=UTF-8');
|
|
44
|
+
res.send(htmlContent);
|
|
45
|
+
});
|
|
46
|
+
module.exports = router;
|