@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.
- package/README.md +7 -0
- package/app.js +32 -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/assets/css/index-cc834b52.css +3 -0
- package/dist/assets/css/index-cc834b52.css.gz +0 -0
- package/dist/assets/js/index-9eef7474.js +762 -0
- package/dist/assets/js/index-9eef7474.js.gz +0 -0
- package/dist/assets/js/react-cropper.es-d3337769.js +10 -0
- package/dist/assets/js/react-cropper.es-d3337769.js.gz +0 -0
- package/dist/assets/png/u9-2348c304.png +0 -0
- package/dist/assets/woff2/materialicons-83be7b2f.woff2 +0 -0
- package/dist/index.html +162 -0
- package/package.json +60 -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,184 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const express = require('express');
|
|
3
|
+
const { v4: uuidv4 } = require('uuid');
|
|
4
|
+
const { parseQueryParams } = require('../utils/page-query-helper/index');
|
|
5
|
+
|
|
6
|
+
const setting = require('../services/setting');
|
|
7
|
+
|
|
8
|
+
const router = express.Router();
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* ❤️ 查询分组 和导航的信息
|
|
12
|
+
*/
|
|
13
|
+
router.get('/', async function (req, res) {
|
|
14
|
+
const modules = await setting.getModules('setting');
|
|
15
|
+
const navs = await setting.getNavs();
|
|
16
|
+
|
|
17
|
+
if (Array.isArray(modules) && Array.isArray(navs)) {
|
|
18
|
+
return res.sendOk({
|
|
19
|
+
module: modules,
|
|
20
|
+
nav: navs,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
res.sendOk({ module: [], nav: [] });
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* 新建导航
|
|
28
|
+
* @body string NAV_NAME 导航名称
|
|
29
|
+
* @body string NAV_TYPE 导航类型
|
|
30
|
+
* @body string NAV_ICON 导航图标
|
|
31
|
+
* @body string NAV_DESC 导航说明
|
|
32
|
+
* @body string URL 导航位置
|
|
33
|
+
* @body string PARENT_ID 内联ID
|
|
34
|
+
* @body string ORDER_NO 顺序
|
|
35
|
+
* @body string OBJECT_ID 关联ID
|
|
36
|
+
*/
|
|
37
|
+
router.post('/', async function (req, res) {
|
|
38
|
+
let userid = req.get('X-UserId');
|
|
39
|
+
const { NAV_NAME, NAV_TYPE, NAV_ICON, NAV_DESC, URL, PARENT_ID, ORDER_NO, OBJECT_ID } = req.body;
|
|
40
|
+
const props = {
|
|
41
|
+
ORG_ID: global.orgid,
|
|
42
|
+
NAV_ID: uuidv4().replaceAll('-', ''),
|
|
43
|
+
NAV_NAME,
|
|
44
|
+
NAV_TYPE,
|
|
45
|
+
NAV_ICON,
|
|
46
|
+
NAV_DESC,
|
|
47
|
+
URL,
|
|
48
|
+
PARENT_ID,
|
|
49
|
+
ORDER_NO: ORDER_NO || null,
|
|
50
|
+
OBJECT_ID,
|
|
51
|
+
DATA_CRT_USER: userid,
|
|
52
|
+
STATUS: '00',
|
|
53
|
+
MODULE_ID: 'setting',
|
|
54
|
+
};
|
|
55
|
+
const data = await setting.postSetNav(props);
|
|
56
|
+
if (!data) {
|
|
57
|
+
res.sendErr('创建失败');
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
res.sendOk('创建成功');
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* 排序条件
|
|
65
|
+
* @body content 内容 格式:{key:NAV_ID,sort ORDER_NO }
|
|
66
|
+
*/
|
|
67
|
+
router.put('/sort', async function (req, res) {
|
|
68
|
+
const { content } = req.body;
|
|
69
|
+
if (!content || !Array.isArray(content)) {
|
|
70
|
+
res.sendErr('格式错误');
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
Promise.all(
|
|
74
|
+
content.map(async (v) => {
|
|
75
|
+
if (v.key) {
|
|
76
|
+
await setting.putNav({ NAV_ID: v.key }, { ORDER_NO: v.sort });
|
|
77
|
+
}
|
|
78
|
+
return true;
|
|
79
|
+
}),
|
|
80
|
+
);
|
|
81
|
+
res.sendOk('修改成功');
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* 修改信息
|
|
86
|
+
* @params string navid NAV_ID 导航ID
|
|
87
|
+
*/
|
|
88
|
+
router.put('/info/:navid', async function (req, res) {
|
|
89
|
+
const navid = req.params['navid'];
|
|
90
|
+
const { NAV_NAME, NAV_TYPE, NAV_ICON, NAV_DESC, URL, PARENT_ID, OBJECT_ID } = req.body;
|
|
91
|
+
if (!navid) {
|
|
92
|
+
res.sendErr('格式错误');
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
let props = {
|
|
96
|
+
NAV_NAME,
|
|
97
|
+
NAV_TYPE,
|
|
98
|
+
NAV_ICON,
|
|
99
|
+
NAV_DESC,
|
|
100
|
+
URL,
|
|
101
|
+
PARENT_ID,
|
|
102
|
+
OBJECT_ID,
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
let data = await setting.putNav({ NAV_ID: navid }, props);
|
|
106
|
+
if (!data) {
|
|
107
|
+
res.sendErr('修改失败');
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
res.sendOk('修改成功');
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* 删除信息
|
|
115
|
+
* @params string navid NAV_ID 导航ID
|
|
116
|
+
*/
|
|
117
|
+
router.delete('/info/:navid', async function (req, res) {
|
|
118
|
+
const navid = req.params['navid'];
|
|
119
|
+
let data = await setting.putNav({ NAV_ID: navid }, { STATUS: '01' });
|
|
120
|
+
if (!data) {
|
|
121
|
+
res.sendErr('删除失败');
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
res.sendOk('删除成功');
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
router.get('/api-list', async function (req, res) {
|
|
128
|
+
let queryParams = parseQueryParams(req.query, ['ORG_ID'], true, 50);
|
|
129
|
+
let params = queryParams.params;
|
|
130
|
+
|
|
131
|
+
let data = await setting.getApiList(
|
|
132
|
+
params,
|
|
133
|
+
null,
|
|
134
|
+
{ API_NAME: 'like', API_DESC: 'like' },
|
|
135
|
+
queryParams.pageInfo,
|
|
136
|
+
);
|
|
137
|
+
if (!data) {
|
|
138
|
+
return res.sendErr({ message: '没有找到数据', code: 'NotFound' });
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return res.sendOk(data);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
router.post('/api-list', async function (req, res) {
|
|
145
|
+
let { API_ID } = req.body;
|
|
146
|
+
|
|
147
|
+
if (!API_ID) return res.sendErr('缺少API_ID');
|
|
148
|
+
|
|
149
|
+
let check = await setting.getApiList({ API_ID });
|
|
150
|
+
|
|
151
|
+
if (check && check.length) return res.sendErr('API_ID重复,请重新配置');
|
|
152
|
+
|
|
153
|
+
let result = await setting.insertApi(req.body);
|
|
154
|
+
|
|
155
|
+
if (!result) return res.sendErr('创建API失败');
|
|
156
|
+
|
|
157
|
+
return res.sendOk('创建API成功');
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
router.put('/api-list/:id', async function (req, res) {
|
|
161
|
+
let id = req.params['id'];
|
|
162
|
+
|
|
163
|
+
let apiList = await setting.getApiList({ DATA_ID: id });
|
|
164
|
+
if (!apiList) return res.sendErr('当前API的DATA_ID无效');
|
|
165
|
+
|
|
166
|
+
let result = await setting.updateApiInfo({ DATA_ID: id }, req.body);
|
|
167
|
+
if (!result) return res.sendErr('修改API失败');
|
|
168
|
+
|
|
169
|
+
return res.sendOk('修改API成功');
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
router.delete('/api-list/:id', async function (req, res) {
|
|
173
|
+
let id = req.params['id'];
|
|
174
|
+
|
|
175
|
+
let apiList = await setting.getApiList({ DATA_ID: id });
|
|
176
|
+
if (!apiList) return res.sendErr('当前API的DATA_ID无效');
|
|
177
|
+
|
|
178
|
+
let result = await setting.deleteApi({ DATA_ID: id });
|
|
179
|
+
if (!result) return res.sendErr('删除API失败');
|
|
180
|
+
|
|
181
|
+
return res.sendOk('删除API成功');
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
module.exports = router;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var express = require('express');
|
|
3
|
+
const { authCheck } = require('../../common/middleware/auth');
|
|
4
|
+
const pages = require('./routers/pages');
|
|
5
|
+
const member = require('./routers/member');
|
|
6
|
+
const mapping = require('./routers/mapping');
|
|
7
|
+
const roles = require('./routers/roles');
|
|
8
|
+
const teamInfo = require('./routers/teaminfo');
|
|
9
|
+
const membermanage = require('./routers/membermanage');
|
|
10
|
+
const usergroup = require('./routers/usergroup');
|
|
11
|
+
|
|
12
|
+
var router = express.Router();
|
|
13
|
+
|
|
14
|
+
router.use('/pages', authCheck, pages);
|
|
15
|
+
router.use('/member', authCheck, member);
|
|
16
|
+
router.use('/mapping', authCheck, mapping);
|
|
17
|
+
router.use('/roles', authCheck, roles);
|
|
18
|
+
router.use('/teaminfo', authCheck, teamInfo);
|
|
19
|
+
router.use('/membermanage', authCheck, membermanage);
|
|
20
|
+
router.use('/usergroup', authCheck, usergroup);
|
|
21
|
+
|
|
22
|
+
module.exports = router;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const express = require('express');
|
|
3
|
+
var router = express.Router();
|
|
4
|
+
|
|
5
|
+
const mappingService = require('../services/mapping');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @apiQuery {string} list 指定需要的mapping列表 竖线分隔 为空则返回全部.
|
|
9
|
+
*/
|
|
10
|
+
router.get('/', async function (req, res) {
|
|
11
|
+
let { list } = req.query;
|
|
12
|
+
|
|
13
|
+
let dictsList = [];
|
|
14
|
+
if (list && typeof list === 'string') {
|
|
15
|
+
dictsList = list.split('|');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let result = await mappingService.getMapping(dictsList);
|
|
19
|
+
|
|
20
|
+
if (!result) {
|
|
21
|
+
return res.sendErr('查询失败');
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
res.sendOk({
|
|
25
|
+
dict: result,
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
module.exports = router;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const express = require('express');
|
|
3
|
+
const userService = require('../../../common/services/user');
|
|
4
|
+
|
|
5
|
+
const router = express.Router();
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @api {get} /team/member 获取团队成员
|
|
9
|
+
* @apiDescription 获取团队成员
|
|
10
|
+
* @apiVersion 1.0.0
|
|
11
|
+
*
|
|
12
|
+
*
|
|
13
|
+
*/
|
|
14
|
+
router.get('/', async function (req, res) {
|
|
15
|
+
let { page = 1, size = 50 } = req.query;
|
|
16
|
+
let userid = req.get('X-UserId');
|
|
17
|
+
let param = {};
|
|
18
|
+
for (let v in req.query) {
|
|
19
|
+
if (v !== 'page' && v !== 'size') {
|
|
20
|
+
param[v] = req.query[v];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
let result = await userService.getTeamUsers(userid, param, {
|
|
24
|
+
pageSize: +size,
|
|
25
|
+
pageIndex: page - 1,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
res.sendOk(result);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
router.get('/list', async function (req, res) {
|
|
32
|
+
let a = {
|
|
33
|
+
actionType: 'ajax',
|
|
34
|
+
api: 'post:/team/member/list', // 编辑
|
|
35
|
+
value: 'a', // 默认
|
|
36
|
+
key: 'nihao', // 请求参数的key
|
|
37
|
+
options: [
|
|
38
|
+
{
|
|
39
|
+
label: '选项一',
|
|
40
|
+
value: 'a',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
label: '选项二',
|
|
44
|
+
value: 'b',
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
let b = {
|
|
50
|
+
actionType: 'reload',
|
|
51
|
+
value: 'a', // 默认
|
|
52
|
+
key: 'nihao', // 请求参数的key
|
|
53
|
+
options: [
|
|
54
|
+
{
|
|
55
|
+
label: '选项一',
|
|
56
|
+
value: 'a',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
label: '选项二',
|
|
60
|
+
value: 'b',
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
res.sendOk(b);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
router.post('/list', async function (req, res) {
|
|
69
|
+
res.sendOk();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
module.exports = router;
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const express = require('express');
|
|
3
|
+
const { parseQueryParams } = require('../../../utils/page-query-helper/index');
|
|
4
|
+
const userService = require('../../../common/services/user');
|
|
5
|
+
const entity = require('../../../common/entity');
|
|
6
|
+
const { idmLevelType } = require('../../../common/enum');
|
|
7
|
+
const memberService = require('../services/member');
|
|
8
|
+
|
|
9
|
+
const router = express.Router();
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @api {get} /team/member 获取团队成员
|
|
13
|
+
* @apiName GetProject
|
|
14
|
+
* @apiGroup team
|
|
15
|
+
* @apiDescription 获取团队成员
|
|
16
|
+
* @apiVersion 1.0.0
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
router.get('/', async function (req, res) {
|
|
20
|
+
let queryParams = parseQueryParams(req.query, ['ORG_ID', 'RANGE'], true, 50);
|
|
21
|
+
let params = queryParams.params;
|
|
22
|
+
const { cat, type } = req.query;
|
|
23
|
+
if (!cat || !type) return res.sendErr('参数错误');
|
|
24
|
+
let realType =
|
|
25
|
+
type === idmLevelType.IDM_LENVEL_TYPE.DEPT
|
|
26
|
+
? [entity.IDM_USERS, 'DEPT_NO']
|
|
27
|
+
: [entity.IDM_GROUP_MEMBERS, 'GROUP_ID'];
|
|
28
|
+
let team =
|
|
29
|
+
type === idmLevelType.IDM_LENVEL_TYPE.DEPT
|
|
30
|
+
? [entity.IDM_DEPTS, 'DEPT_NO']
|
|
31
|
+
: [entity.IDM_GROUPS, 'GROUP_ID'];
|
|
32
|
+
|
|
33
|
+
let teamInfo = await userService.getTeamInfo(team, cat);
|
|
34
|
+
let isHasLeader = params.LEADER;
|
|
35
|
+
delete params.LEADER;
|
|
36
|
+
let result = await userService.getMemberlist(realType, cat, params, queryParams.pageInfo);
|
|
37
|
+
if (!teamInfo) return res.sendErr('没有找到数据');
|
|
38
|
+
let leader = teamInfo['DEPT_LEADER'] || teamInfo['GROUP_LEADER'];
|
|
39
|
+
result.content = result.content.map((user) => {
|
|
40
|
+
return { ...user, LEADER: user.USER_ID === leader ? '负责人' : '' };
|
|
41
|
+
});
|
|
42
|
+
if (isHasLeader) {
|
|
43
|
+
let results = [];
|
|
44
|
+
result.content.map((user) => {
|
|
45
|
+
if (user.LEADER == '负责人') {
|
|
46
|
+
result.content.map((user) => {
|
|
47
|
+
if (user.USER_NAME.indexOf(isHasLeader) > -1) {
|
|
48
|
+
results.push(user);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
result.content = results;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
res.sendOk(result);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// 修改团队成员信息 通知
|
|
60
|
+
router.put('/modify/:userid', async function (req, res) {
|
|
61
|
+
const { userid } = req.params;
|
|
62
|
+
if (!userid) {
|
|
63
|
+
return res.send(failureResult('参数错误'));
|
|
64
|
+
}
|
|
65
|
+
let userFields = [
|
|
66
|
+
'USER_TYPE',
|
|
67
|
+
'EN_NAME',
|
|
68
|
+
'PASSWD',
|
|
69
|
+
'NIKE_NAME',
|
|
70
|
+
'GENDER',
|
|
71
|
+
'EMAIL',
|
|
72
|
+
'MOBILE',
|
|
73
|
+
'TEL',
|
|
74
|
+
'TITLE',
|
|
75
|
+
'DEPT_NO',
|
|
76
|
+
'AVATAR',
|
|
77
|
+
'ADDR',
|
|
78
|
+
'POSITION',
|
|
79
|
+
'STAFF_NO',
|
|
80
|
+
'USER_STATUS',
|
|
81
|
+
'USER_GID',
|
|
82
|
+
'EDUCATION',
|
|
83
|
+
'SCHOOL',
|
|
84
|
+
'ADMISSION_DATE',
|
|
85
|
+
'JOINED_DATE',
|
|
86
|
+
'LEAVE_DATE',
|
|
87
|
+
];
|
|
88
|
+
let userProps = {};
|
|
89
|
+
for (let k in req.body) {
|
|
90
|
+
if (userFields.indexOf(k) != -1) {
|
|
91
|
+
userProps[k] = req.body[k];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
let data = await userService.operTeamMember(userid, userProps);
|
|
95
|
+
if (!data) {
|
|
96
|
+
return res.sendErr('没有找到数据');
|
|
97
|
+
}
|
|
98
|
+
res.sendOk('操作成功');
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// 新增团队成员 通知
|
|
102
|
+
router.post('/add', async function (req, res) {
|
|
103
|
+
const { type, cat, USER_ID } = req.body;
|
|
104
|
+
if (!cat || !type || !USER_ID) return res.sendErr('参数错误');
|
|
105
|
+
if (type === idmLevelType.IDM_LENVEL_TYPE.DEPT) return res.sendErr('不能在部门里添加成员!');
|
|
106
|
+
let USER_ADD_LIST = USER_ID.split(',');
|
|
107
|
+
let realType =
|
|
108
|
+
type === idmLevelType.IDM_LENVEL_TYPE.DEPT
|
|
109
|
+
? ['idm_users', 'DEPT_NO']
|
|
110
|
+
: ['idm_group_members', 'GROUP_ID'];
|
|
111
|
+
|
|
112
|
+
for (let i = 0; i < USER_ADD_LIST.length; i++) {
|
|
113
|
+
let userid = USER_ADD_LIST[i];
|
|
114
|
+
let result = await memberService.isExistGroupMember(userid, cat);
|
|
115
|
+
if (!result) return res.sendErr('操作失败');
|
|
116
|
+
if (result.length > 0) {
|
|
117
|
+
let result = await userService.getUserInfo(userid);
|
|
118
|
+
if (!result) return res.sendErr('操作失败');
|
|
119
|
+
const { USER_NAME } = result;
|
|
120
|
+
return res.sendErr(USER_NAME + '已存在');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
let insertIds = USER_ADD_LIST.map(async (userid) => {
|
|
125
|
+
return await userService.insertTeamMember(userid, realType, cat);
|
|
126
|
+
});
|
|
127
|
+
let results = await Promise.all(insertIds);
|
|
128
|
+
if (!results.filter((v) => !v).length) {
|
|
129
|
+
return res.sendOk('操作成功');
|
|
130
|
+
}
|
|
131
|
+
res.sendErr('操作失败');
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
//删除
|
|
135
|
+
router.delete('/del/:USER_ID', async function (req, res) {
|
|
136
|
+
const { USER_ID } = req.params;
|
|
137
|
+
if (!USER_ID) res.sendErr('参数错误');
|
|
138
|
+
let result = await memberService.isExitMember(USER_ID);
|
|
139
|
+
if (result.error) return res.sendErr(result.error);
|
|
140
|
+
if (result.length == 0) return res.send('用户不存在');
|
|
141
|
+
|
|
142
|
+
let results = await memberService.delMember(USER_ID);
|
|
143
|
+
if (results.error) return res.sendErr(results.error);
|
|
144
|
+
|
|
145
|
+
return res.sendOk();
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// 批量删除
|
|
149
|
+
router.put('/batchdel', async function (req, res) {
|
|
150
|
+
const { ids, type, cat } = req.body;
|
|
151
|
+
if (!ids || !typeof ids == 'string') {
|
|
152
|
+
res.sendErr('参数错误');
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
let idsArr = ids.split(',');
|
|
156
|
+
let delids = idsArr.map((v) => {
|
|
157
|
+
return userService.delUserMember({ USER_ID: v });
|
|
158
|
+
});
|
|
159
|
+
let results = await Promise.all(delids);
|
|
160
|
+
if (!results.filter((v) => !v).length) {
|
|
161
|
+
return res.sendOk();
|
|
162
|
+
}
|
|
163
|
+
res.sendErr('操作失败');
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* @api {put} /team/membermanage/api/module 修改用户/部门
|
|
168
|
+
* @apiGroup teams
|
|
169
|
+
* @apiDescription
|
|
170
|
+
* @apiVersion 1.0.0
|
|
171
|
+
*
|
|
172
|
+
* @apiQuery name:更新的值的值
|
|
173
|
+
* id:表名 idm_groups (DEPT_SA01) idm_depts
|
|
174
|
+
*/
|
|
175
|
+
router.put('/api/group', async function (req, res) {
|
|
176
|
+
const { id, name, type } = req.body;
|
|
177
|
+
if (!id || !name) return res.sendErr('参数错误');
|
|
178
|
+
const { error, result } = await memberService.modifyGroupDepts(id, name, type);
|
|
179
|
+
if (error) return res.sendErr(error);
|
|
180
|
+
return res.sendOk();
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* @api {post} /team/membermanage/api/group 新增 用户/部门
|
|
185
|
+
* @apiGroup teams
|
|
186
|
+
* @apiDescription
|
|
187
|
+
* @apiVersion 1.0.0
|
|
188
|
+
*
|
|
189
|
+
* @apiQuery name:更新的值的值
|
|
190
|
+
* inputid:唯一的key值
|
|
191
|
+
* parentId:父节点值
|
|
192
|
+
* pid:部门
|
|
193
|
+
*/
|
|
194
|
+
router.post('/api/group', async function (req, res) {
|
|
195
|
+
const { inputId, name, pid, parentId } = req.body;
|
|
196
|
+
if (!name || !inputId || !pid || !parentId) return res.sendErr('参数错误');
|
|
197
|
+
var reg = /^[a-zA-Z_-]([a-zA-Z0-9_-]+)?$/;
|
|
198
|
+
if (!reg.test(inputId)) return res.sendErr('节点id只支持以英文字字母或下划线开头的组合!');
|
|
199
|
+
let resultes = await memberService.isExistMemberId({ DEPT_NO: inputId });
|
|
200
|
+
if (resultes.error) return res.sendErr(resultes.error);
|
|
201
|
+
if (resultes.results.length > 0) return res.sendErr('部门id重复');
|
|
202
|
+
|
|
203
|
+
let childNode = await memberService.getIdmDeptParentId(parentId);
|
|
204
|
+
if (!childNode) return res.sendErr('sql执行错误');
|
|
205
|
+
let pathEnd = 0;
|
|
206
|
+
childNode.map((v) => {
|
|
207
|
+
const { DEPT_PARENT } = v;
|
|
208
|
+
let curParent = DEPT_PARENT.split('/');
|
|
209
|
+
pathEnd = Math.max(pathEnd, +curParent[curParent.length - 1]);
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
let parentPath =
|
|
213
|
+
parentId == global.orgid ? '/' + (+pathEnd + 1) : parentId + '/' + (+pathEnd + 1);
|
|
214
|
+
|
|
215
|
+
const { error, result } = await memberService.addGroupDepts({
|
|
216
|
+
DEPT_NAME: name,
|
|
217
|
+
DEPT_NO: inputId,
|
|
218
|
+
DEPT_PARENT: parentPath,
|
|
219
|
+
});
|
|
220
|
+
if (error) return res.sendErr(error);
|
|
221
|
+
return res.sendOk();
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* @api {delete} /team/membermanage/api/group 删除用户/部门
|
|
226
|
+
* @apiGroup teams
|
|
227
|
+
* @apiDescription
|
|
228
|
+
* @apiVersion 1.0.0
|
|
229
|
+
*
|
|
230
|
+
* @apiQuery id: (GROUP_DEV) idm_groups (DEPT_SA01) idm_depts
|
|
231
|
+
*/
|
|
232
|
+
router.delete('/api/group', async function (req, res) {
|
|
233
|
+
const { id, parentId } = req.body;
|
|
234
|
+
if (!id || !parentId) return res.sendErr('参数错误');
|
|
235
|
+
if (parentId == global.orgid) return res.sendErr('组织机构不允许删除');
|
|
236
|
+
const childNode = await memberService.getIdmDeptChildDept(parentId);
|
|
237
|
+
if (!childNode) return res.sendErr('操作失败');
|
|
238
|
+
childNode.push({ DEPT_NO: id, DEPT_PARENT: parentId, ORG_ID: global.orgid });
|
|
239
|
+
if (childNode.length > 0) {
|
|
240
|
+
for (let i = 0; i < childNode.length; i++) {
|
|
241
|
+
const { DEPT_NO, DEPT_PARENT } = childNode[i];
|
|
242
|
+
let userResult = await userService.getUsers({
|
|
243
|
+
DEPT_NO,
|
|
244
|
+
});
|
|
245
|
+
if (!userResult) return res.sendErr('数据库操作失败');
|
|
246
|
+
if (userResult.length > 0) {
|
|
247
|
+
let deptData = await memberService.getIdmDepts({
|
|
248
|
+
DEPT_PARENT: '/' + parentId.split('/')[1],
|
|
249
|
+
});
|
|
250
|
+
const { DEPT_NO } = deptData;
|
|
251
|
+
for (let i = 0; i < userResult.length; i++) {
|
|
252
|
+
const { USER_ID } = userResult[i];
|
|
253
|
+
let updateUserResult = await userService.operTeamMember(USER_ID, { DEPT_NO });
|
|
254
|
+
if (!updateUserResult) return res.sendErr('数据库操作失败');
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
let result = await memberService.delGroupDepts(childNode[i]);
|
|
258
|
+
if (!result) return res.sendErr('数据库操作失败');
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return res.sendOk();
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* @api {post} /team/api/group/leader
|
|
267
|
+
* @apiDescription 新增负责人
|
|
268
|
+
* @apiVersion 1.0.0
|
|
269
|
+
* ids 用户的userid(USER_ID)
|
|
270
|
+
* cat 组的id
|
|
271
|
+
* */
|
|
272
|
+
router.post('/api/group/leader', async function (req, res) {
|
|
273
|
+
const { ids, cat } = req.body;
|
|
274
|
+
if (!ids || !cat) return res.sendErr('参数错误');
|
|
275
|
+
let users = ids.split(',');
|
|
276
|
+
if (users.length > 1) return res.sendErr('负责人只能选中一个');
|
|
277
|
+
|
|
278
|
+
let result = await memberService.updateIdmDept(
|
|
279
|
+
{
|
|
280
|
+
DEPT_LEADER: users[0],
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
DEPT_NO: cat,
|
|
284
|
+
},
|
|
285
|
+
);
|
|
286
|
+
if (!result) return res.sendErr('操作失败');
|
|
287
|
+
return res.sendOk();
|
|
288
|
+
});
|
|
289
|
+
module.exports = router;
|
|
@@ -0,0 +1,47 @@
|
|
|
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 { PROJECT_ID, 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
|
+
|
|
47
|
+
module.exports = router;
|