@gingkoo/base-server 0.0.1-alpha.0 → 0.0.1-alpha.1

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.
Files changed (122) hide show
  1. package/README.md +7 -0
  2. package/app.js +32 -40
  3. package/backend/common/entity.js +55 -0
  4. package/backend/common/enum.js +247 -0
  5. package/backend/common/fss/index.js +18 -0
  6. package/backend/common/fss/routers/attachment.js +45 -0
  7. package/backend/common/fss/routers/download.js +43 -0
  8. package/backend/common/fss/routers/import_export.js +113 -0
  9. package/backend/common/fss/routers/resources.js +149 -0
  10. package/backend/common/fss/routers/upload.js +81 -0
  11. package/backend/common/fss/services/import_export.js +159 -0
  12. package/backend/common/fss/services/index.js +92 -0
  13. package/backend/common/fss/utils.js +39 -0
  14. package/backend/common/ginfo/config.js +5 -0
  15. package/backend/common/ginfo/index.js +62 -0
  16. package/backend/common/index_template.html +28 -0
  17. package/backend/common/logger/index.js +96 -0
  18. package/backend/common/mapping.js +98 -0
  19. package/backend/common/middleware/auth.js +97 -0
  20. package/backend/common/middleware/cors.js +13 -0
  21. package/backend/common/middleware/response.js +25 -0
  22. package/backend/common/page_engine.js +487 -0
  23. package/backend/common/schedule.js +45 -0
  24. package/backend/common/services/dataCombine.js +67 -0
  25. package/backend/common/services/dept.js +37 -0
  26. package/backend/common/services/dict.js +487 -0
  27. package/backend/common/services/email.js +49 -0
  28. package/backend/common/services/generalConfig.js +137 -0
  29. package/backend/common/services/login.js +18 -0
  30. package/backend/common/services/notice.js +260 -0
  31. package/backend/common/services/permission.js +500 -0
  32. package/backend/common/services/roles.js +57 -0
  33. package/backend/common/services/send-notice.js +86 -0
  34. package/backend/common/services/task.js +259 -0
  35. package/backend/common/services/user.js +673 -0
  36. package/backend/common/socket.js +18 -0
  37. package/backend/common/sse/index.js +81 -0
  38. package/backend/common/sse/router.js +30 -0
  39. package/backend/common/task.js +75 -0
  40. package/backend/common/wechat/index.js +9 -0
  41. package/backend/common/wechat/routers/auth.js +238 -0
  42. package/{modules/user/frontend → backend/common/wechat/routers}/index.html +14 -7
  43. package/backend/common/wechat/services/auth.js +209 -0
  44. package/backend/common/wechat/services/notice.js +171 -0
  45. package/backend/config/index.js +63 -0
  46. package/backend/config/path.js +3 -0
  47. package/backend/router.js +96 -0
  48. package/backend/routers/app.js +222 -0
  49. package/backend/routers/automate.js +276 -0
  50. package/backend/routers/dict.js +370 -0
  51. package/backend/routers/email.js +85 -0
  52. package/backend/routers/generalConfig.js +276 -0
  53. package/backend/routers/idm.js +245 -0
  54. package/backend/routers/module.js +357 -0
  55. package/backend/routers/notice.js +138 -0
  56. package/backend/routers/pages.js +46 -0
  57. package/backend/routers/permission.js +985 -0
  58. package/backend/routers/setting.js +184 -0
  59. package/backend/routers/team/index.js +22 -0
  60. package/backend/routers/team/routers/mapping.js +29 -0
  61. package/backend/routers/team/routers/member.js +72 -0
  62. package/backend/routers/team/routers/membermanage.js +289 -0
  63. package/backend/routers/team/routers/pages.js +47 -0
  64. package/backend/routers/team/routers/roles.js +92 -0
  65. package/backend/routers/team/routers/teaminfo.js +27 -0
  66. package/backend/routers/team/routers/usergroup.js +213 -0
  67. package/backend/routers/team/services/mapping.js +101 -0
  68. package/backend/routers/team/services/member.js +206 -0
  69. package/backend/routers/team/services/roles.js +71 -0
  70. package/backend/routers/team/services/teaminfo.js +20 -0
  71. package/backend/routers/team/services/usergroup.js +128 -0
  72. package/backend/routers/user.js +436 -0
  73. package/backend/services/automate.js +60 -0
  74. package/backend/services/config.js +14 -0
  75. package/backend/services/module.js +298 -0
  76. package/backend/services/permission.js +192 -0
  77. package/backend/services/services.js +115 -0
  78. package/backend/services/setting.js +190 -0
  79. package/backend/services/token.js +42 -0
  80. package/backend/space.js +52 -0
  81. package/backend/space_mapping.js +15 -0
  82. package/backend/utils/avatar.js +48 -0
  83. package/backend/utils/color_gen_helper.js +20 -0
  84. package/backend/utils/date.js +66 -0
  85. package/backend/utils/excel.js +446 -0
  86. package/backend/utils/fs/doc.md +64 -0
  87. package/backend/utils/fs/index.js +127 -0
  88. package/backend/utils/jwt.js +54 -0
  89. package/backend/utils/modules/sequence.js +93 -0
  90. package/backend/utils/object.js +31 -0
  91. package/backend/utils/page-query-helper/index.js +61 -0
  92. package/backend/utils/path.js +123 -0
  93. package/backend/utils/run.js +25 -0
  94. package/backend/utils/tokenize.js +82 -0
  95. package/backend/utils/typeof.js +5 -0
  96. package/backend/utils/util.js +153 -0
  97. package/backend/views/api/index.js +32 -0
  98. package/backend/views/api/index.xml +49 -0
  99. package/backend/views/dict/index.js +80 -0
  100. package/backend/views/dict/index.xml +52 -0
  101. package/backend/views/index.js +32 -0
  102. package/backend/views/members_manage/index.js +68 -0
  103. package/backend/views/members_manage/index.xml +68 -0
  104. package/backend/views/roles/index.js +17 -0
  105. package/backend/views/roles/index.xml +47 -0
  106. package/backend/views/usergroup/index.js +68 -0
  107. package/backend/views/usergroup/index.xml +65 -0
  108. package/dist/assets/css/index-cc834b52.css +3 -0
  109. package/dist/assets/css/index-cc834b52.css.gz +0 -0
  110. package/dist/assets/js/index-9eef7474.js +762 -0
  111. package/dist/assets/js/index-9eef7474.js.gz +0 -0
  112. package/dist/assets/js/react-cropper.es-d3337769.js +10 -0
  113. package/dist/assets/js/react-cropper.es-d3337769.js.gz +0 -0
  114. package/dist/assets/png/u9-2348c304.png +0 -0
  115. package/dist/assets/woff2/materialicons-83be7b2f.woff2 +0 -0
  116. package/dist/index.html +162 -0
  117. package/package.json +60 -5
  118. package/common/router.js +0 -42
  119. package/modules/user/backend/index.js +0 -19
  120. package/modules/user/backend/routers/user.js +0 -11
  121. package/modules/user/frontend/index.js +0 -1
  122. package/serve.js +0 -9
@@ -0,0 +1,985 @@
1
+ 'use strict';
2
+ const express = require('express');
3
+ const permService = require('../common/services/permission');
4
+ const userService = require('../common/services/user');
5
+ const rolesService = require('../common/services/roles');
6
+ const { permission: permissionConstant } = require('../common/enum');
7
+
8
+ const permissionService = require('../services/permission');
9
+ const moduleServices = require('../services/module');
10
+ const setting = require('../services/setting');
11
+ const router = express.Router();
12
+
13
+ function currentUser(req, userid) {
14
+ for (let v in req) {
15
+ if (typeof req[v] === 'string') {
16
+ req[v] = req[v].replace('currentUser', userid);
17
+ }
18
+ }
19
+ return req;
20
+ }
21
+
22
+ /**
23
+ * 团队管理模块权限存储 :模块ID
24
+ * 系统管理模块权限存储 :导航ID
25
+ * 根据权限类型RES_TYPE决定当前权限管理模块 module为设置左侧模块权限,project为设置项目管理模块内部权限,manage为系统设置的权限管理
26
+ *
27
+ */
28
+
29
+ /* ***********************************系统权限操作********************************************* */
30
+
31
+ // 根据当前系统用户的角色所有导航功能权限
32
+ router.get('/userPerm', async function (req, res) {
33
+ let userRoles = await rolesService.getRoleMembers(null, {
34
+ USER_ID: req.get('X-UserId'),
35
+ ROLE_TYPE: permissionConstant.ROLE_TYPE.MANAGER,
36
+ });
37
+ if (!Array.isArray(userRoles)) return res.sendErr('查询用户角色失败');
38
+ userRoles = userRoles.map((role) => role.ROLE_ID);
39
+ let permission = await permissionService.getOperPermissions({
40
+ OPER_TYPE: permissionConstant.OPER_TYPE.ROLE,
41
+ OPER_ID: userRoles,
42
+ RES_KIND: permissionConstant.RES_KIND.API,
43
+ RES_TYPE: permissionConstant.RES_TYPE.SYSTEM_NAV,
44
+ });
45
+ if (!Array.isArray(permission)) return res.sendErr('查询权限失败');
46
+ let perms = permission.reduce((obj, perm) => {
47
+ let objNavPerm = [];
48
+ try {
49
+ objNavPerm = JSON.parse(perm.PROPS);
50
+ !Array.isArray(objNavPerm) && (objNavPerm = []);
51
+ } catch (error) {}
52
+ if (Array.isArray(obj[perm.RES_RANGE]) && obj[perm.RES_RANGE].length) {
53
+ objNavPerm = objNavPerm.map((v) => v.feature);
54
+ obj[perm.RES_RANGE] = obj[perm.RES_RANGE]
55
+ .map((v) => v.feature)
56
+ .concat(objNavPerm)
57
+ .filter((v, i, arr) => arr.indexOf(v) === i)
58
+ .map((v) => {
59
+ return {
60
+ feature: v,
61
+ };
62
+ });
63
+ } else {
64
+ obj[perm.RES_RANGE] = objNavPerm;
65
+ }
66
+ return obj;
67
+ }, {});
68
+
69
+ return res.sendOk(perms);
70
+ });
71
+
72
+ // 查询用户角色的系统管理权限
73
+ router.get('/rolePermission', async function (req, res) {
74
+ let roleId = req.query['ROLE_ID'];
75
+ let permission = await permissionService.getOperPermissions({
76
+ OPER_TYPE: permissionConstant.OPER_TYPE.ROLE,
77
+ OPER_ID: roleId,
78
+ // RES_TYPE: [permissionConstant.RES_TYPE.SYSTEM_MODULE, permissionConstant.RES_TYPE.SYSTEM_NAV],
79
+ });
80
+ if (!permission) return res.sendErr('查询失败');
81
+
82
+ return res.sendOk(permission);
83
+ });
84
+
85
+ // 查询所有系统角色成员列表
86
+ router.get('/roleMember', async function (req, res) {
87
+ let data = await rolesService.getRoleMembers(null, {
88
+ ROLE_TYPE: permissionConstant.ROLE_TYPE.MANAGER,
89
+ ...req.query,
90
+ });
91
+ if (!Array.isArray(data)) return res.sendErr('查询失败');
92
+ let result = {};
93
+ data.forEach((item) => {
94
+ if (Array.isArray(result[item.ROLE_ID])) {
95
+ result[item.ROLE_ID].push(item);
96
+ } else {
97
+ result[item.ROLE_ID] = [item];
98
+ }
99
+ });
100
+
101
+ return res.sendOk(result);
102
+ });
103
+
104
+ // 添加系统角色成员
105
+ router.post('/roleMember', async function (req, res) {
106
+ let roleMemberFields = ['ROLE_ID', 'USER_ID', 'REMARKS'];
107
+ let props = {};
108
+ req.body = currentUser(req.body, req.get('X-UserId'));
109
+ for (let k in req.body) {
110
+ if (roleMemberFields.includes(k)) {
111
+ props[k] = req.body[k];
112
+ }
113
+ }
114
+ let create = await permissionService.addRoleMember({
115
+ ...props,
116
+ ROLE_TYPE: permissionConstant.ROLE_TYPE.MANAGER,
117
+ });
118
+ if (!create) return res.sendErr('创建失败');
119
+ return res.sendOk('创建成功');
120
+ });
121
+
122
+ // 修改系统角色成员
123
+ router.put('/roleMember', async function (req, res) {
124
+ req.body = currentUser(req.body, req.get('X-UserId'));
125
+ let filter = {
126
+ ROLE_ID: req.body['ROLE_ID'],
127
+ USER_ID: req.body['USER_ID'],
128
+ ROLE_TYPE: permissionConstant.ROLE_TYPE.MANAGER,
129
+ };
130
+ let params = {
131
+ REMARKS: req.body['REMARKS'],
132
+ };
133
+ if (!filter['ROLE_ID'] || !filter['USER_ID']) return res.sendErr('修改失败,缺少参数');
134
+ let upd = await permissionService.updRoleMemberInfo(filter, params);
135
+ if (!upd) return res.sendErr('修改失败');
136
+ return res.sendOk('修改成功');
137
+ });
138
+
139
+ // 删除系统角色成员信息
140
+ router.delete('/roleMember', async function (req, res) {
141
+ req.body = currentUser(req.body, req.get('X-UserId'));
142
+ let filter = {
143
+ ROLE_ID: req.body['ROLE_ID'],
144
+ USER_ID: req.body['USER_ID'],
145
+ ROLE_TYPE: permissionConstant.ROLE_TYPE.MANAGER,
146
+ };
147
+ if (!filter['ROLE_ID'] || !filter['USER_ID']) return res.sendErr('删除失败,缺少参数');
148
+ let option = await permissionService.delRoleMember(filter);
149
+ if (!option) return res.sendErr('删除失败');
150
+ return res.sendOk('删除成功');
151
+ });
152
+
153
+ // 查询系统角色列表
154
+ router.get('/roleList', async function (req, res) {
155
+ let data = await rolesService.getRoles(permissionConstant.ROLE_TYPE.MANAGER);
156
+ if (!data) return res.sendErr('查询失败');
157
+ return res.sendOk(data);
158
+ });
159
+
160
+ /**
161
+ * 获取所有系统管理页面模块
162
+ */
163
+ router.get('/systemPages', async function (req, res) {
164
+ const module = await setting.getModules('setting');
165
+ const nav = await setting.getNavs();
166
+ if (Array.isArray(module) && Array.isArray(nav) && module.length) {
167
+ res.sendOk({
168
+ module,
169
+ nav,
170
+ });
171
+ return;
172
+ }
173
+ res.sendErr('查询失败');
174
+ });
175
+
176
+ /**
177
+ * 用户开启或关闭权限设置
178
+ * @param ACTION 操作权限的动作,开启或关闭,开启为true,关闭为false
179
+ * @param OPER_ID 操作对象ID
180
+ * @param OPER_TYPE 操作对象类型
181
+ * @param RES_KIND 权限种类 page|api|file
182
+ * @param RES_TYPE 权限应用类型
183
+ * @param RES_RANGE 导航ID
184
+ */
185
+ router.put('/permission', async function (req, res) {
186
+ let action = req.body['ACTION'];
187
+ let operId = req.body['OPER_ID'];
188
+ let operType = req.body['OPER_TYPE'];
189
+ let resType = req.body['RES_TYPE'];
190
+ let features = req.body['features'];
191
+ if (!features || !resType || !operId || !operType) return res.sendErr('缺少参数');
192
+
193
+ if (!Array.isArray(features)) return res.sendErr('features参数格式错误');
194
+
195
+ let result = false;
196
+ let pageFilter = {
197
+ RES_KIND: permissionConstant.RES_KIND.PAGE,
198
+ RES_TYPE: resType,
199
+ OPER_ID: operId,
200
+ OPER_TYPE: operType,
201
+ };
202
+
203
+ let apiFilter = {
204
+ RES_KIND: permissionConstant.RES_KIND.API,
205
+ RES_TYPE: resType,
206
+ OPER_ID: operId,
207
+ OPER_TYPE: operType,
208
+ };
209
+
210
+ async function apiFun() {
211
+ let apiFeature = features.filter((v) => v.RES_KIND === permissionConstant.RES_KIND.API);
212
+ if (!apiFeature.length) return [true];
213
+ let apiRangeFeature = apiFeature.reduce((obj, v) => {
214
+ if (Array.isArray(obj[v.RES_RANGE])) {
215
+ obj[v.RES_RANGE].push({ feature: v.feature || '', api: v.api || '' });
216
+ } else {
217
+ obj[v.RES_RANGE] = [{ feature: v.feature || '', api: v.api || '' }];
218
+ }
219
+ return obj;
220
+ }, {});
221
+ let apiPromiss = Object.keys(apiRangeFeature).map(async (range) => {
222
+ let operPerm = await permissionService.checkOperPermission(null, null, range, apiFilter);
223
+ if (!Array.isArray(operPerm)) return false;
224
+ let permProps = operPerm?.[0]?.PROPS || '[]';
225
+ try {
226
+ permProps = JSON.parse(permProps);
227
+ } catch (error) {}
228
+ if (!operPerm.length && action) {
229
+ let params = {
230
+ ...apiFilter,
231
+ RES_RANGE: range,
232
+ PROPS: JSON.stringify(apiRangeFeature[range]),
233
+ };
234
+ return permissionService.addOperPermission(params);
235
+ }
236
+
237
+ if (permProps !== null && !Array.isArray(permProps)) return false;
238
+
239
+ let oldProps = permProps.map((v) => v.feature);
240
+ let newFeatures = apiRangeFeature[range].map((v) => v.feature);
241
+ let newProps = action
242
+ ? oldProps.concat(newFeatures).filter((v, i, arr) => arr.indexOf(v) === i)
243
+ : oldProps?.filter((v) => !newFeatures.includes(v));
244
+
245
+ let params = {
246
+ PROPS: JSON.stringify(
247
+ newProps.map((v) => {
248
+ return {
249
+ feature: v,
250
+ };
251
+ }),
252
+ ),
253
+ };
254
+ let newFilter = {
255
+ ...apiFilter,
256
+ RES_RANGE: range,
257
+ };
258
+ return permissionService.updateOperPermRange(newFilter, params);
259
+ });
260
+ return await Promise.all(apiPromiss);
261
+ }
262
+
263
+ async function pageFun() {
264
+ let pageFeature = features.filter((v) => v.RES_KIND === permissionConstant.RES_KIND.PAGE);
265
+ if (!pageFeature.length) return true;
266
+ let pagePerm = await permissionService.checkOperPermission(null, null, null, pageFilter);
267
+ let pageRange = pageFeature
268
+ .map((v) => v.RES_RANGE)
269
+ .filter((v) => {
270
+ if (action) {
271
+ // 添加查看页面权限,要添加数据,在此过滤下重复数据,然后添加
272
+ return v && !pagePerm?.[0]?.RES_RANGE?.includes(v);
273
+ } else {
274
+ // 取消查看页面权限,这些数据要删除
275
+ return v && pagePerm?.[0]?.RES_RANGE?.includes(v);
276
+ }
277
+ });
278
+
279
+ if (!pagePerm.length && action) {
280
+ // 添加权限,此操作对象没有查看页面的权限
281
+ let params = {
282
+ ...pageFilter,
283
+ RES_RANGE: pageRange.join(','),
284
+ };
285
+ return await permissionService.addOperPermission(params);
286
+ }
287
+ if (pagePerm[0].RES_RANGE !== null && typeof pagePerm[0].RES_RANGE !== 'string') return false;
288
+
289
+ let oldRange = pagePerm[0].RES_RANGE?.split(',') || [];
290
+ let newRange = action
291
+ ? oldRange.concat(pageRange)?.join(',')
292
+ : oldRange.filter((o) => !pageRange.includes(o))?.join(',');
293
+ return await permissionService.updateOperPermRange(pageFilter, { RES_RANGE: newRange });
294
+ }
295
+
296
+ async function executeFun() {
297
+ let pageResult = await pageFun();
298
+ let apiResult = await apiFun();
299
+ return pageResult && !apiResult.filter((v) => !v).length;
300
+ }
301
+
302
+ result = await executeFun();
303
+
304
+ if (!result) return res.sendErr('操作失败');
305
+ return res.sendOk('操作成功');
306
+ });
307
+
308
+ /* ***********************************模块权限操作********************************************* */
309
+
310
+ /**
311
+ * 模块选择对象
312
+ * @param type 操作对象类型 部门|团队|用户 dept|groups|user
313
+ * @param moduleId 操作的模块
314
+ * @param value 操作对象的值,多选时,字符串或数组
315
+ * 这个接口只应用于团队管理的权限管理
316
+ */
317
+ router.put('/module/:moduleId', async function (req, res) {
318
+ // type ===> dept || group || user
319
+ let type = req.body['type'];
320
+ let moduleId = req.params['moduleId'];
321
+ let value = req.body['value'];
322
+
323
+ if (typeof value === 'string') {
324
+ value = value.split(',');
325
+ }
326
+ if (!Array.isArray(value)) return res.sendErr('数据格式错误');
327
+
328
+ value = value.filter((v) => v);
329
+
330
+ async function setModulePermission(operType, operId, moduleId) {
331
+ // 检查此操作对象是否有当前权限
332
+ let perms = await permissionService.checkOperPermission(null, null, moduleId, {
333
+ RES_KIND: 'page',
334
+ RES_TYPE: permissionConstant.RES_TYPE.MODULE,
335
+ OPER_ID: operId,
336
+ OPER_TYPE: operType,
337
+ });
338
+ let oper = await permissionService.checkOperPermission(null, null, null, {
339
+ RES_KIND: 'page',
340
+ RES_TYPE: permissionConstant.RES_TYPE.MODULE,
341
+ OPER_ID: operId,
342
+ OPER_TYPE: operType,
343
+ });
344
+ if (!Array.isArray(perms) || !Array.isArray(oper)) return false;
345
+ let result;
346
+ if (!perms.length) {
347
+ // 没有权限,添加
348
+ result = oper.length
349
+ ? permissionService.updateOperPermRange(
350
+ {
351
+ OPER_TYPE: operType,
352
+ OPER_ID: operId,
353
+ RES_KIND: 'page',
354
+ RES_TYPE: permissionConstant.RES_TYPE.MODULE,
355
+ },
356
+ { RES_RANGE: oper?.[0]?.RES_RANGE ? `${oper[0].RES_RANGE},${moduleId}` : moduleId },
357
+ )
358
+ : permissionService.addOperPermission({
359
+ OPER_TYPE: operType,
360
+ OPER_ID: operId,
361
+ RES_KIND: 'page',
362
+ RES_TYPE: permissionConstant.RES_TYPE.MODULE,
363
+ RES_RANGE: moduleId,
364
+ REMARKS: '查看模块权限',
365
+ });
366
+ }
367
+ return result;
368
+ }
369
+
370
+ async function cancelModulePermission(operType, operId, range) {
371
+ let filter = {
372
+ RES_KIND: 'page',
373
+ RES_TYPE: permissionConstant.RES_TYPE.MODULE,
374
+ OPER_TYPE: operType,
375
+ OPER_ID: operId,
376
+ };
377
+ let params = {
378
+ RES_RANGE: range,
379
+ };
380
+ return await permissionService.updateOperPermRange(filter, params);
381
+ }
382
+
383
+ // 配置传来的操作对象
384
+ await Promise.all(value.map((v) => setModulePermission(type, v, moduleId)));
385
+
386
+ // 筛选出需要删除的操作对象权限
387
+ let moduleOpers = await permissionService.checkOperPermission(null, null, moduleId, {
388
+ RES_KIND: 'page',
389
+ RES_TYPE: permissionConstant.RES_TYPE.MODULE,
390
+ });
391
+ if (Array.isArray(moduleOpers) && moduleOpers.length) {
392
+ let delOpers = moduleOpers.reduce((mo, item) => {
393
+ if (item.OPER_TYPE === type && !value.includes(item.OPER_ID)) {
394
+ mo.push({
395
+ OPER_TYPE: item.OPER_TYPE,
396
+ OPER_ID: item.OPER_ID,
397
+ RES_RANGE: item.RES_RANGE?.split(',')
398
+ ?.filter((v) => v !== moduleId)
399
+ ?.join(','),
400
+ });
401
+ }
402
+ return mo;
403
+ }, []);
404
+ delOpers.length &&
405
+ (await Promise.all(
406
+ delOpers.map((v) => cancelModulePermission(type, v.OPER_ID, v.RES_RANGE)),
407
+ ));
408
+ }
409
+
410
+ return res.sendOk('操作成功');
411
+ });
412
+
413
+ /**
414
+ * 获取所有模块
415
+ */
416
+ router.get('/allModules', async function (req, res) {
417
+ let allModules = await moduleServices.getAllModules();
418
+ if (!allModules || !Array.isArray(allModules)) return res.sendErr('查询失败');
419
+ return res.sendOk(allModules);
420
+ });
421
+
422
+ // 获取部门,团队,用户列表
423
+ router.get('/operList', async function (req, res) {
424
+ let deptData = await userService.getDeptData();
425
+ let groupData = await userService.getGroupData();
426
+ let userData = await userService.getUsers();
427
+ if (!Array.isArray(deptData) || !Array.isArray(groupData) || !Array.isArray(userData))
428
+ return res.sendErr('查询失败');
429
+ return res.sendOk({ deptData, groupData, userData });
430
+ });
431
+
432
+ // 查询当前操作对象权限
433
+ router.get('/operPerm', async function (req, res) {
434
+ let userId = req.query['USER_ID'];
435
+ let userPerms = await permissionService.checkOperPermission('user', userId, null, {
436
+ RES_KIND: 'page',
437
+ RES_TYPE: permissionConstant.RES_TYPE.MODULE,
438
+ });
439
+ if (!Array.isArray(userPerms) || !userPerms.length) return res.sendErr('查询失败');
440
+ let modules = userPerms.reduce((mo, perm) => {
441
+ let ms = perm.RES_RANGE?.split(',').filter((v) => !mo.includes(v));
442
+ mo = mo.concat(ms);
443
+ return mo;
444
+ }, []);
445
+ return res.sendOk(modules);
446
+ });
447
+
448
+ /**
449
+ * 获取模块操作对象
450
+ */
451
+ router.get('/moduleOpers', async function (req, res) {
452
+ let data = await permissionService.checkOperPermission(null, null, null, {
453
+ RES_KIND: 'page',
454
+ RES_TYPE: permissionConstant.RES_TYPE.MODULE,
455
+ });
456
+
457
+ if (!Array.isArray(data)) return res.sendErr('查询失败');
458
+ let result = {};
459
+ data.forEach((item) => {
460
+ if (typeof item.RES_RANGE === 'string' && item.RES_RANGE) {
461
+ item.RES_RANGE.split(',').forEach((m) => {
462
+ if (!result[m]) {
463
+ result[m] = {
464
+ dept: [],
465
+ group: [],
466
+ user: [],
467
+ };
468
+ }
469
+ if (Array.isArray(result[m][item.OPER_TYPE])) {
470
+ result[m][item.OPER_TYPE].push(item.OPER_ID);
471
+ }
472
+ });
473
+ }
474
+ });
475
+
476
+ return res.sendOk(result);
477
+ });
478
+
479
+ router.get('/permissionData', async function (req, res) {
480
+ let result = [
481
+ {
482
+ NAV_ID: '8a72a8ed6ac44a3e8ebfc51ce25672b4',
483
+ NAV_NAME: '团队信息',
484
+ PERMISSION: [],
485
+ },
486
+ {
487
+ NAV_ID: 'eba2eb575b8843dfb21c3ce87686c079',
488
+ NAV_NAME: '团队成员',
489
+ PERMISSION: [
490
+ {
491
+ feature: 'edit',
492
+ title: '编辑成员',
493
+ api: 'put:/team/membermanage/modify/${USER_ID},post:/team/membermanage/api/group/leader',
494
+ },
495
+ {
496
+ feature: 'del',
497
+ title: '删除成员',
498
+ api: 'put:/team/membermanage/batchdel',
499
+ },
500
+ ],
501
+ },
502
+ {
503
+ NAV_ID: 'c089227bd71d42c5a312286f214b582f',
504
+ NAV_NAME: '用户组',
505
+ PERMISSION: [
506
+ {
507
+ feature: 'add',
508
+ title: '新增组成员',
509
+ api: 'post:/team/usergroup',
510
+ },
511
+ {
512
+ feature: 'del',
513
+ title: '删除组成员',
514
+ api: 'delete:/team/usergroup',
515
+ },
516
+ {
517
+ feature: 'edit',
518
+ title: '编辑组负责人',
519
+ api: 'post:/team/usergroup/api/usergroup/leader',
520
+ },
521
+ ],
522
+ },
523
+ {
524
+ NAV_ID: '050f25df236e4fc0bfd043d2cebd99c6',
525
+ NAV_NAME: '角色',
526
+ PERMISSION: [
527
+ {
528
+ feature: 'add',
529
+ title: '新增角色',
530
+ api: 'post:/team/roles',
531
+ },
532
+ {
533
+ feature: 'edit',
534
+ title: '编辑角色',
535
+ api: 'put:/team/roles/${ROLE_ID}',
536
+ },
537
+ {
538
+ feature: 'del',
539
+ title: '删除角色',
540
+ api: 'delete:/team/roles/${ROLE_ID}',
541
+ },
542
+ ],
543
+ },
544
+ {
545
+ NAV_ID: 'f78b05ac9d25414bb97a9640bc63ed7d',
546
+ NAV_NAME: '权限设置',
547
+ PERMISSION: [
548
+ {
549
+ feature: 'edit',
550
+ title: '配置权限',
551
+ api: '',
552
+ },
553
+ ],
554
+ },
555
+
556
+ {
557
+ NAV_ID: '36e5f91b49394535ad48399c696d5be7',
558
+ NAV_NAME: '界面配置',
559
+ PERMISSION: [
560
+ {
561
+ feature: 'add',
562
+ title: '添加模块导航',
563
+ api: '',
564
+ },
565
+ {
566
+ feature: 'edit',
567
+ title: '编辑模块导航',
568
+ api: '',
569
+ },
570
+ {
571
+ feature: 'del',
572
+ title: '删除模块导航',
573
+ api: '',
574
+ },
575
+ ],
576
+ },
577
+ {
578
+ NAV_ID: '7a799accc840446eb0677255c2da9f0e',
579
+ NAV_NAME: '一般配置',
580
+ PERMISSION: [],
581
+ },
582
+ {
583
+ NAV_ID: 'd0bd026cf645402888dd544d7ada37e6',
584
+ NAV_NAME: '数据字典',
585
+ PERMISSION: [
586
+ {
587
+ feature: 'add',
588
+ title: '新增码值',
589
+ api: 'post:/space/dict',
590
+ },
591
+ {
592
+ feature: 'edit',
593
+ title: '编辑码值',
594
+ api: 'put:/space/dict/${ITEM_ID},post:/space/dict/dictsort',
595
+ },
596
+ {
597
+ feature: 'del',
598
+ title: '删除码值',
599
+ api: 'delete:/space/dict/${ITEM_ID}',
600
+ },
601
+ ],
602
+ },
603
+ {
604
+ NAV_ID: '3e90ee0760ab4ef2ad6515e0996826e0',
605
+ NAV_NAME: '安全设置',
606
+ PERMISSION: [],
607
+ },
608
+ {
609
+ NAV_ID: '24de3d1792e748b29e01fd095e27317b',
610
+ NAV_NAME: 'API',
611
+ PERMISSION: [],
612
+ },
613
+ {
614
+ NAV_ID: 'e8821c573da448f8b7332fb79f1c7b58',
615
+ NAV_NAME: '第三方集成',
616
+ PERMISSION: [],
617
+ },
618
+ {
619
+ NAV_ID: 'f0db4f3fda494828a797f16948602e77',
620
+ NAV_NAME: '通知',
621
+ PERMISSION: [],
622
+ },
623
+ {
624
+ NAV_ID: '5bb98d2045c44efba9bf6aa979a9f825',
625
+ NAV_NAME: '自动化规则',
626
+ PERMISSION: [
627
+ {
628
+ feature: 'add',
629
+ title: '新建自动化规则',
630
+ api: '',
631
+ },
632
+ {
633
+ feature: 'edit',
634
+ title: '编辑自动化规则',
635
+ api: '',
636
+ },
637
+ {
638
+ feature: 'del',
639
+ title: '删除自动化规则',
640
+ api: '',
641
+ },
642
+ ],
643
+ },
644
+ {
645
+ NAV_ID: '25f6463680d84055b4fe1c97a19725c1',
646
+ NAV_NAME: '权限设置',
647
+ PERMISSION: [
648
+ {
649
+ feature: 'add',
650
+ title: '添加角色成员',
651
+ api: '',
652
+ },
653
+ {
654
+ feature: 'edit',
655
+ title: '编辑角色成员,配置权限',
656
+ api: '',
657
+ },
658
+ {
659
+ feature: 'del',
660
+ title: '删除角色成员',
661
+ api: '',
662
+ },
663
+ ],
664
+ },
665
+ ];
666
+ return res.sendOk(result);
667
+ });
668
+
669
+ router.get('/projectPermissionData', async function (req, res) {
670
+ let result = [
671
+ {
672
+ NAV_ID: 'issues',
673
+ NAV_NAME: '工作项',
674
+ PERMISSION: [],
675
+ },
676
+ {
677
+ NAV_ID: 'taskboard',
678
+ NAV_NAME: '任务看板',
679
+ PERMISSION: [],
680
+ },
681
+ {
682
+ NAV_ID: 'item-plan',
683
+ NAV_NAME: '项目计划',
684
+ PERMISSION: [],
685
+ },
686
+ {
687
+ NAV_ID: 'requirement',
688
+ NAV_NAME: '需求',
689
+ PERMISSION: [],
690
+ },
691
+ {
692
+ NAV_ID: 'modules',
693
+ NAV_NAME: '模块',
694
+ PERMISSION: [
695
+ {
696
+ feature: 'add',
697
+ title: '添加模块数据',
698
+ api: '',
699
+ },
700
+ {
701
+ feature: 'edit',
702
+ title: '编辑模块数据',
703
+ api: '',
704
+ },
705
+ {
706
+ feature: 'del',
707
+ title: '删除模块数据',
708
+ api: '',
709
+ },
710
+ ],
711
+ },
712
+ {
713
+ NAV_ID: 'person-plan',
714
+ NAV_NAME: '人员计划',
715
+ PERMISSION: [],
716
+ },
717
+ {
718
+ NAV_ID: 'versions',
719
+ NAV_NAME: '版本',
720
+ PERMISSION: [
721
+ {
722
+ feature: 'add',
723
+ title: '添加版本',
724
+ api: '',
725
+ },
726
+ {
727
+ feature: 'edit',
728
+ title: '修改版本信息',
729
+ api: '',
730
+ },
731
+ {
732
+ feature: 'del',
733
+ title: '删除版本',
734
+ api: '',
735
+ },
736
+ ],
737
+ },
738
+ {
739
+ NAV_ID: 'members',
740
+ NAV_NAME: '成员',
741
+ PERMISSION: [
742
+ {
743
+ feature: 'add',
744
+ title: '添加项目成员',
745
+ api: '',
746
+ },
747
+ {
748
+ feature: 'edit',
749
+ title: '修改项目成员',
750
+ api: '',
751
+ },
752
+ {
753
+ feature: 'del',
754
+ title: '删除项目成员',
755
+ api: '',
756
+ },
757
+ ],
758
+ },
759
+ {
760
+ NAV_ID: 'branch',
761
+ NAV_NAME: '分支',
762
+ PERMISSION: [
763
+ {
764
+ feature: 'add',
765
+ title: '添加分支',
766
+ api: '',
767
+ },
768
+ {
769
+ feature: 'edit',
770
+ title: '修改分支信息',
771
+ api: '',
772
+ },
773
+ {
774
+ feature: 'del',
775
+ title: '删除分支',
776
+ api: '',
777
+ },
778
+ {
779
+ feature: 'merge',
780
+ title: '合并分支',
781
+ api: '',
782
+ },
783
+ ],
784
+ },
785
+ {
786
+ NAV_ID: 'project_work',
787
+ NAV_NAME: '项目文档',
788
+ PERMISSION: [],
789
+ },
790
+ {
791
+ NAV_ID: 'projectSetting-component',
792
+ NAV_NAME: '项目组件',
793
+ PERMISSION: [
794
+ {
795
+ feature: 'edit',
796
+ title: '修改项目组件配置',
797
+ api: '',
798
+ },
799
+ {
800
+ feature: 'del',
801
+ title: '移除项目组件配置',
802
+ api: '',
803
+ },
804
+ ],
805
+ },
806
+ {
807
+ NAV_ID: 'projectSetting-taskboard',
808
+ NAV_NAME: '任务看板',
809
+ PERMISSION: [
810
+ {
811
+ feature: 'add',
812
+ title: '添加面板配置数据',
813
+ api: '',
814
+ },
815
+ {
816
+ feature: 'edit',
817
+ title: '编辑面板配置数据',
818
+ api: '',
819
+ },
820
+ {
821
+ feature: 'del',
822
+ title: '删除面板配置数据',
823
+ api: '',
824
+ },
825
+ ],
826
+ },
827
+ {
828
+ NAV_ID: 'projectSetting-stage',
829
+ NAV_NAME: '项目阶段',
830
+ PERMISSION: [
831
+ {
832
+ feature: 'add',
833
+ title: '添加项目阶段',
834
+ api: '',
835
+ },
836
+ {
837
+ feature: 'edit',
838
+ title: '修改项目阶段',
839
+ api: '',
840
+ },
841
+ {
842
+ feature: 'del',
843
+ title: '删除项目阶段',
844
+ api: '',
845
+ },
846
+ ],
847
+ },
848
+ {
849
+ NAV_ID: 'test',
850
+ NAV_NAME: '测试数据',
851
+ PERMISSION: [
852
+ {
853
+ feature: 'add',
854
+ title: '添加项目阶段',
855
+ api: '',
856
+ },
857
+ {
858
+ feature: 'edit',
859
+ title: '修改项目阶段',
860
+ api: '',
861
+ },
862
+ {
863
+ feature: 'del',
864
+ title: '删除项目阶段',
865
+ api: '',
866
+ },
867
+ ],
868
+ },
869
+ ];
870
+ res.sendOk(result);
871
+ });
872
+
873
+ // 查询项目角色列表
874
+ router.get('/projectRoleList', async function (req, res) {
875
+ let data = await rolesService.getRoles(permissionConstant.ROLE_TYPE.PROJECT);
876
+ if (!data) return res.sendErr('查询失败');
877
+ return res.sendOk(data);
878
+ });
879
+
880
+ // 查询项目页面列表
881
+ router.get('/projectNavs', async function (req, res) {
882
+ let projectNavs = await permService.getModuleNavs('teams-project');
883
+
884
+ if (!Array.isArray(projectNavs)) return res.sendErr('查询失败');
885
+ let module = [
886
+ {
887
+ NAV_ID: 'projectPages',
888
+ NAV_NAME: '项目管理 - 页面列表',
889
+ },
890
+ {
891
+ NAV_ID: 'projectSetting',
892
+ NAV_NAME: '项目管理 - 项目设置',
893
+ },
894
+ ];
895
+
896
+ let projectSettingNavs = [
897
+ {
898
+ NAV_ID: 'projectSetting-component',
899
+ NAV_NAME: '项目组件',
900
+ PARENT_ID: 'projectSetting',
901
+ },
902
+ {
903
+ NAV_ID: 'projectSetting-taskboard',
904
+ NAV_NAME: '任务看板',
905
+ PARENT_ID: 'projectSetting',
906
+ },
907
+ {
908
+ NAV_ID: 'projectSetting-stage',
909
+ NAV_NAME: '项目阶段',
910
+ PARENT_ID: 'projectSetting',
911
+ },
912
+ ];
913
+
914
+ let nav = projectNavs.reduce((mo, nav) => {
915
+ mo.push({
916
+ ...nav,
917
+ PARENT_ID: 'projectPages',
918
+ });
919
+ return mo;
920
+ }, projectSettingNavs);
921
+
922
+ return res.sendOk({ module, nav });
923
+ });
924
+
925
+ // 查询当前用户在项目中角色的权限
926
+ router.get('/projectPerm', async function (req, res) {
927
+ let proId = req.query['PROJECT_ID'];
928
+ let userId = req.get('X-UserId');
929
+ if (!proId || !userId) return res.sendErr('查询失败,缺少参数');
930
+
931
+ let role = await permService.getUserProjectRole({ PROJECT_ID: proId, USER_ID: userId });
932
+ if (!role) return res.sendErr('查询项目角色失败');
933
+
934
+ // 一个用户在一个项目中只有一个角色
935
+ if (!Array.isArray(role) || !role[0] || !role[0].MEM_ROLE) return res.sendOk({});
936
+
937
+ let permission = await permissionService.getOperPermissions({
938
+ OPER_TYPE: permissionConstant.OPER_TYPE.ROLE,
939
+ OPER_ID: role[0].MEM_ROLE,
940
+ RES_TYPE: permissionConstant.RES_TYPE.PROJECT_NAV,
941
+ });
942
+ if (!Array.isArray(permission)) return res.sendErr('查询权限失败');
943
+ let perms = permission
944
+ .filter((perm) => perm.RES_KIND === permissionConstant.RES_KIND.API)
945
+ .reduce((obj, perm) => {
946
+ let objNavPerm = [];
947
+ try {
948
+ objNavPerm = JSON.parse(perm.PROPS);
949
+ !Array.isArray(objNavPerm) && (objNavPerm = []);
950
+ } catch (error) {}
951
+ if (Array.isArray(obj[perm.RES_RANGE]) && obj[perm.RES_RANGE].length) {
952
+ objNavPerm = objNavPerm.map((v) => v.feature);
953
+ obj[perm.RES_RANGE] = obj[perm.RES_RANGE]
954
+ .map((v) => v.feature)
955
+ .concat(objNavPerm)
956
+ .filter((v, i, arr) => arr.indexOf(v) === i)
957
+ .map((v) => {
958
+ return {
959
+ feature: v,
960
+ };
961
+ });
962
+ } else {
963
+ obj[perm.RES_RANGE] = objNavPerm;
964
+ }
965
+ return obj;
966
+ }, {});
967
+
968
+ permission
969
+ .filter((perm) => perm.RES_KIND === permissionConstant.RES_KIND.PAGE)
970
+ .forEach((perm) => {
971
+ let pages = (typeof perm['RES_RANGE'] === 'string' && perm['RES_RANGE'].split(',')) || null;
972
+ Array.isArray(pages) &&
973
+ pages.forEach((page) => {
974
+ if (Array.isArray(perms[page])) {
975
+ perms[page].push({ feature: 'page' });
976
+ } else {
977
+ perms[page] = [{ feature: 'page' }];
978
+ }
979
+ });
980
+ });
981
+
982
+ return res.sendOk(perms);
983
+ });
984
+
985
+ module.exports = router;