@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,298 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const {
|
|
3
|
+
sqlExecutor,
|
|
4
|
+
insertSqlBuilder,
|
|
5
|
+
updateSqlBuilder,
|
|
6
|
+
deleteSqlBuilder,
|
|
7
|
+
} = require('@gingkoo/node-tools');
|
|
8
|
+
const entity = require('../common/entity');
|
|
9
|
+
|
|
10
|
+
module.exports = {
|
|
11
|
+
/*** —————————— 模块 ----—————————— ***/
|
|
12
|
+
/**
|
|
13
|
+
* 查询所有模块 比进行排序
|
|
14
|
+
* 排序规则 在上面 ORDER_NO 为NULL放在下方
|
|
15
|
+
* 在上面 ORDER_NO 为NULL放在下方
|
|
16
|
+
* 其他正常按ORDER_NO降序排序
|
|
17
|
+
* ORDER_NO 为NULL 按创建时间排序
|
|
18
|
+
*
|
|
19
|
+
* */
|
|
20
|
+
getAllModules: async function () {
|
|
21
|
+
let sql = `select * from ${entity.BASE_MODULES} where STATUS = '00' order by
|
|
22
|
+
NAV_POSITION ASC,
|
|
23
|
+
case when NAV_POSITION='nav' and ISNULL(ORDER_NO) then 10000 else 1 end,
|
|
24
|
+
ORDER_NO ASC,
|
|
25
|
+
case when NAV_POSITION='usercenter' then DATA_CRT_TIME end desc`;
|
|
26
|
+
|
|
27
|
+
let dbResult = await sqlExecutor(sql, []);
|
|
28
|
+
if (dbResult.error) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return dbResult.results;
|
|
32
|
+
},
|
|
33
|
+
/***
|
|
34
|
+
* 查询模块 导航
|
|
35
|
+
* 排序 按ORDER_NO 降序
|
|
36
|
+
* 没有的 按创建时间排序
|
|
37
|
+
* 查询表: base_modules
|
|
38
|
+
* @param {string} moduleid 模块id
|
|
39
|
+
*/
|
|
40
|
+
getModuleNavs: async function (moduleid) {
|
|
41
|
+
let dbResult = await sqlExecutor(
|
|
42
|
+
`select * from ${entity.BASE_MODULE_NAV} where MODULE_ID=? order by ORDER_NO ASC,DATA_CRT_TIME`,
|
|
43
|
+
[moduleid],
|
|
44
|
+
);
|
|
45
|
+
if (dbResult.error) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
return dbResult.results;
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* 查询当前 模块ID是否存在 查询单条模块信息
|
|
53
|
+
* 查询表: base_modules
|
|
54
|
+
* @param {string} id //模块ID
|
|
55
|
+
* @return null | any[]
|
|
56
|
+
*/
|
|
57
|
+
getHesModules: async function (id) {
|
|
58
|
+
let sql = `select * from ${entity.BASE_MODULES} where MODULE_ID = ?`;
|
|
59
|
+
let { error, results } = await sqlExecutor(sql, [id]);
|
|
60
|
+
if (error || !results?.length) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
return results;
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* 修改模块
|
|
68
|
+
* 如果修改模块类型 排序清空
|
|
69
|
+
* @param {Object} props 修改内容
|
|
70
|
+
* @props string MODULE_NAME 模块名称
|
|
71
|
+
* @props string MODULE_ICON 模块名称
|
|
72
|
+
* @props string MODULE_DESC 模块说明
|
|
73
|
+
* @props string NAV_POSITION 模块位置
|
|
74
|
+
* @props string NAV_TYPE 控制加载导航方式
|
|
75
|
+
* @props string DYN_API 动态API
|
|
76
|
+
* @props string VIEW_TYPE 模块打开类型
|
|
77
|
+
* @props string URL 导航地址
|
|
78
|
+
* @props string ORDER_NO 顺序
|
|
79
|
+
* @props string STATUS 状态
|
|
80
|
+
* @param {Object} filter 修改条件
|
|
81
|
+
* @filter MODULE_ID
|
|
82
|
+
* @returns
|
|
83
|
+
*/
|
|
84
|
+
putModules: async function (props, filter) {
|
|
85
|
+
const field = [
|
|
86
|
+
'MODULE_NAME',
|
|
87
|
+
'MODULE_ICON',
|
|
88
|
+
'MODULE_DESC',
|
|
89
|
+
'URL',
|
|
90
|
+
'NAV_POSITION',
|
|
91
|
+
'NAV_TYPE',
|
|
92
|
+
'VIEW_TYPE',
|
|
93
|
+
'DYN_API',
|
|
94
|
+
'ORDER_NO',
|
|
95
|
+
'STATUS',
|
|
96
|
+
];
|
|
97
|
+
|
|
98
|
+
let content = field.reduce((obj, v) => {
|
|
99
|
+
if (props[v] != null || props[v] != undefined) {
|
|
100
|
+
return {
|
|
101
|
+
...obj,
|
|
102
|
+
[v]: props[v],
|
|
103
|
+
};
|
|
104
|
+
} else {
|
|
105
|
+
return obj;
|
|
106
|
+
}
|
|
107
|
+
}, {});
|
|
108
|
+
|
|
109
|
+
if (content.NAV_POSITION) {
|
|
110
|
+
content.ORDER_NO = null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
let sql = updateSqlBuilder(entity.BASE_MODULES, content, filter);
|
|
114
|
+
let dbResult = await sqlExecutor(sql.sql, sql.params);
|
|
115
|
+
|
|
116
|
+
if (dbResult.error) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
return true;
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* 创建模块
|
|
124
|
+
* 修改表 base_modules
|
|
125
|
+
* @param {Object} 添加 修改内容
|
|
126
|
+
* @props string MODULE_ID 模块名称
|
|
127
|
+
* @props string MODULE_NAME 模块名称
|
|
128
|
+
* @props string MODULE_ICON 模块名称
|
|
129
|
+
* @props string MODULE_DESC 模块说明
|
|
130
|
+
* @props string NAV_POSITION 模块位置
|
|
131
|
+
* @props string NAV_TYPE 控制加载导航方式
|
|
132
|
+
* @props string VIEW_TYPE 模块打开类型
|
|
133
|
+
* @props string DYN_API 动态API
|
|
134
|
+
* @props string URL 导航地址
|
|
135
|
+
* @props string ORDER_NO 顺序
|
|
136
|
+
* @props string STATUS 状态
|
|
137
|
+
* @param {Object} filter 修改条件
|
|
138
|
+
* @filter MODULE_ID
|
|
139
|
+
* @returns true| null
|
|
140
|
+
*/
|
|
141
|
+
postModule: async function (props) {
|
|
142
|
+
//过滤多余内容
|
|
143
|
+
|
|
144
|
+
props = {
|
|
145
|
+
ORG_ID: global.orgid,
|
|
146
|
+
...props,
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
//查询sql
|
|
150
|
+
let sql = insertSqlBuilder(entity.BASE_MODULES, props);
|
|
151
|
+
let { error, results } = await sqlExecutor(sql.sql, sql.params);
|
|
152
|
+
if (error) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
return true;
|
|
156
|
+
},
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* 查询当前 模块ID是否存在 查询单条模块信息
|
|
160
|
+
* 查询表: base_modules
|
|
161
|
+
* @param {string} id //模块ID
|
|
162
|
+
* @return null | any[]
|
|
163
|
+
*/
|
|
164
|
+
getHesModules: async function (id) {
|
|
165
|
+
let sql = `select * from ${entity.BASE_MODULES} where MODULE_ID = ?`;
|
|
166
|
+
let { error, results } = await sqlExecutor(sql, [id]);
|
|
167
|
+
if (error || !results?.length) {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
return results;
|
|
171
|
+
},
|
|
172
|
+
|
|
173
|
+
/*** —————————— 导航 ----—————————— ***/
|
|
174
|
+
|
|
175
|
+
/***
|
|
176
|
+
* 查询当前 模块下 查询单条模块信息
|
|
177
|
+
* 查询表: base_module_nav
|
|
178
|
+
* @param {string} moduleid 模块ID
|
|
179
|
+
* @param {string} navid 导航ID
|
|
180
|
+
* @return null | any[]
|
|
181
|
+
*/
|
|
182
|
+
getHesNavs: async function (moduleid, navid) {
|
|
183
|
+
if (!moduleid || !navid) return null;
|
|
184
|
+
let sql = `select * from ${entity.BASE_MODULE_NAV} where MODULE_ID=? and NAV_ID = ?`;
|
|
185
|
+
let { error, results } = await sqlExecutor(sql, [moduleid, navid]);
|
|
186
|
+
if (error || !results?.length) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
return results;
|
|
190
|
+
},
|
|
191
|
+
|
|
192
|
+
//所有导航信息
|
|
193
|
+
getAllNavs: async function () {
|
|
194
|
+
let dbResult = await sqlExecutor(
|
|
195
|
+
`select * from ${entity.BASE_MODULE_NAV} order by MODULE_ID ASC ,ORDER_NO ASC,DATA_CRT_TIME`,
|
|
196
|
+
[],
|
|
197
|
+
);
|
|
198
|
+
if (dbResult.error) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
if (!dbResult.results.length) {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
return dbResult.results;
|
|
205
|
+
},
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* 创建导航
|
|
209
|
+
* 修改表 base_module_nav
|
|
210
|
+
* @param {Object} 添加 修改内容
|
|
211
|
+
* @props string NAV_ID 导航ID
|
|
212
|
+
* @props string MODULE_ID 模块ID
|
|
213
|
+
* @props string NAV_NAME 导航名称
|
|
214
|
+
* @props string NAV_ICON 导航图标
|
|
215
|
+
* @props string NAV_DESC 导航说明
|
|
216
|
+
* @props string NAV_TYPE 展示方式
|
|
217
|
+
* @props string URL 导航地址
|
|
218
|
+
* @props string ORDER_NO 顺序
|
|
219
|
+
* @returns true| null
|
|
220
|
+
*/
|
|
221
|
+
postNavs: async function (props) {
|
|
222
|
+
props = {
|
|
223
|
+
ORG_ID: global.orgid,
|
|
224
|
+
...props,
|
|
225
|
+
};
|
|
226
|
+
//查询sql
|
|
227
|
+
let sql = insertSqlBuilder(entity.BASE_MODULE_NAV, props);
|
|
228
|
+
let { error, results } = await sqlExecutor(sql.sql, sql.params);
|
|
229
|
+
if (error) {
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
return true;
|
|
233
|
+
},
|
|
234
|
+
|
|
235
|
+
/***
|
|
236
|
+
* 导航修改
|
|
237
|
+
* 修改表 base_module_nav
|
|
238
|
+
* @props string MODULE_ID 模块ID
|
|
239
|
+
* @props string NAV_NAME 导航名称
|
|
240
|
+
* @props string NAV_ICON 导航图标
|
|
241
|
+
* @props string NAV_DESC 导航说明
|
|
242
|
+
* @props string NAV_TYPE 展示方式
|
|
243
|
+
* @props string URL 导航地址
|
|
244
|
+
* @props string ORDER_NO 顺序
|
|
245
|
+
* @returns true| null
|
|
246
|
+
*/
|
|
247
|
+
putNavs: async function (props, filter) {
|
|
248
|
+
const { NAV_ID, MODULE_ID } = filter;
|
|
249
|
+
if (!NAV_ID || !MODULE_ID) return null;
|
|
250
|
+
//过滤多余内容
|
|
251
|
+
const field = [
|
|
252
|
+
'MODULE_ID',
|
|
253
|
+
'NAV_ID',
|
|
254
|
+
'NAV_NAME',
|
|
255
|
+
'NAV_ICON',
|
|
256
|
+
'NAV_DESC',
|
|
257
|
+
'URL',
|
|
258
|
+
'NAV_TYPE',
|
|
259
|
+
'ORDER_NO',
|
|
260
|
+
];
|
|
261
|
+
|
|
262
|
+
let content = field.reduce((obj, v) => {
|
|
263
|
+
if (props[v] != null || props[v] != undefined) {
|
|
264
|
+
return {
|
|
265
|
+
...obj,
|
|
266
|
+
[v]: props[v],
|
|
267
|
+
};
|
|
268
|
+
} else {
|
|
269
|
+
return obj;
|
|
270
|
+
}
|
|
271
|
+
}, {});
|
|
272
|
+
|
|
273
|
+
//查询sql
|
|
274
|
+
let sql = updateSqlBuilder(entity.BASE_MODULE_NAV, content, filter);
|
|
275
|
+
let { error, results } = await sqlExecutor(sql.sql, sql.params);
|
|
276
|
+
if (error) {
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
return true;
|
|
280
|
+
},
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* 导航 删除
|
|
284
|
+
* 物理删除
|
|
285
|
+
* 修改表 base_module_nav
|
|
286
|
+
*/
|
|
287
|
+
delNavs: async function (moduleid, navid) {
|
|
288
|
+
let sql = deleteSqlBuilder(entity.BASE_MODULE_NAV, {
|
|
289
|
+
MODULE_ID: moduleid,
|
|
290
|
+
NAV_ID: navid,
|
|
291
|
+
});
|
|
292
|
+
let { error, results } = await sqlExecutor(sql.sql, sql.params);
|
|
293
|
+
if (error) {
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
return true;
|
|
297
|
+
},
|
|
298
|
+
};
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const { v4: uuidv4 } = require('uuid');
|
|
3
|
+
|
|
4
|
+
const {
|
|
5
|
+
sqlExecutor,
|
|
6
|
+
queryParamsBuilder,
|
|
7
|
+
pageQuery,
|
|
8
|
+
insertSqlBuilder,
|
|
9
|
+
updateSqlBuilder,
|
|
10
|
+
checkTableFilterFields,
|
|
11
|
+
deleteSqlBuilder,
|
|
12
|
+
} = require('@gingkoo/node-tools');
|
|
13
|
+
const entity = require('../common/entity');
|
|
14
|
+
const { permission: permissionConstant } = require('../common/enum');
|
|
15
|
+
const { logger } = require('../common/logger/index');
|
|
16
|
+
|
|
17
|
+
module.exports = {
|
|
18
|
+
getOperPermissions: async function (filter, pageInfo) {
|
|
19
|
+
if (Array.isArray(filter['OPER_ID']) && filter['OPER_ID'].length === 0) {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
let sql = `select * from ${entity.IDM_PERMISSIONS} where ORG_ID=? and STATUS='00'`;
|
|
23
|
+
let params = [global.orgid];
|
|
24
|
+
|
|
25
|
+
let filters = await checkTableFilterFields(filter, entity.IDM_PERMISSIONS);
|
|
26
|
+
if (filters && Object.keys(filters).length) {
|
|
27
|
+
let queryParam = queryParamsBuilder(filters, null, null);
|
|
28
|
+
sql = sql + ' and ' + queryParam.sql;
|
|
29
|
+
params = params.concat(queryParam.params);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (pageInfo) {
|
|
33
|
+
let pageSize = pageInfo.pageSize || +pageInfo.size;
|
|
34
|
+
let pageIndex = pageInfo.pageIndex || pageInfo.page - 1;
|
|
35
|
+
let dbResult = await pageQuery(sql, params, pageSize, pageIndex);
|
|
36
|
+
return dbResult;
|
|
37
|
+
}
|
|
38
|
+
let { error, results } = await sqlExecutor(sql, params);
|
|
39
|
+
if (error) {
|
|
40
|
+
logger.error(error);
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
return results;
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
// 添加权限
|
|
47
|
+
addOperPermission: async function (props) {
|
|
48
|
+
let params = {
|
|
49
|
+
...props,
|
|
50
|
+
STATUS: '00',
|
|
51
|
+
PERM_ID: uuidv4().replaceAll('-', ''),
|
|
52
|
+
ORG_ID: global.orgid,
|
|
53
|
+
ACTIONS: props['ACTIONS'] || 'select',
|
|
54
|
+
MODULE_ID: props['MODULE_ID'] || 'MANAGE',
|
|
55
|
+
};
|
|
56
|
+
let sqlResult = insertSqlBuilder(entity.IDM_PERMISSIONS, params);
|
|
57
|
+
let { error, results } = await sqlExecutor(sqlResult.sql, sqlResult.params);
|
|
58
|
+
if (error) {
|
|
59
|
+
logger.error(error);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return true;
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
// 修改操作对象权限范围
|
|
66
|
+
updateOperPermRange: async function (filter, params) {
|
|
67
|
+
if (!params || !filter || !Object.keys(filter).length) return false;
|
|
68
|
+
let filters = {
|
|
69
|
+
...filter,
|
|
70
|
+
ORG_ID: global.orgid,
|
|
71
|
+
STATUS: '00',
|
|
72
|
+
};
|
|
73
|
+
let sqlResult = updateSqlBuilder(entity.IDM_PERMISSIONS, params, filters);
|
|
74
|
+
let { error, results } = await sqlExecutor(sqlResult.sql, sqlResult.params);
|
|
75
|
+
if (error) {
|
|
76
|
+
logger.error(error);
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
return true;
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
// 根据操作对象查询权限
|
|
83
|
+
checkOperPermission: async function (operType, operId, perm, filter) {
|
|
84
|
+
if (Array.isArray(operId) && operId.length === 0) {
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
let sql = `select * from ${entity.IDM_PERMISSIONS} where ORG_ID=? and STATUS='00'`;
|
|
88
|
+
let params = [global.orgid];
|
|
89
|
+
if (operType === permissionConstant.OPER_TYPE.USER) {
|
|
90
|
+
sql += ` and (OPER_TYPE in (?, ?, ?) and (OPER_ID in (select GROUP_ID from ${entity.IDM_GROUP_MEMBERS} where USER_ID=?) or OPER_ID in (select DEPT_NO from ${entity.IDM_USERS} where USER_ID=?) or OPER_ID=?))`;
|
|
91
|
+
params = [
|
|
92
|
+
global.orgid,
|
|
93
|
+
permissionConstant.OPER_TYPE.DEPT,
|
|
94
|
+
permissionConstant.OPER_TYPE.GROUP,
|
|
95
|
+
permissionConstant.OPER_TYPE.USER,
|
|
96
|
+
operId,
|
|
97
|
+
operId,
|
|
98
|
+
operId,
|
|
99
|
+
];
|
|
100
|
+
} else if (operType === permissionConstant.OPER_TYPE.GROUP) {
|
|
101
|
+
sql += ` and (OPER_TYPE in (?, ?) and OPER_ID in ((select DEPT_ID from ${entity.IDM_GROUPS} where GROUP_ID=?), ?))`;
|
|
102
|
+
params = [global.orgid, operType, permissionConstant.OPER_TYPE.DEPT, operId, operId];
|
|
103
|
+
} else if (operType === permissionConstant.OPER_TYPE.DEPT) {
|
|
104
|
+
sql += ` and OPER_TYPE=? and OPER_ID=?`;
|
|
105
|
+
params = [global.orgid, operType, operId];
|
|
106
|
+
} else if (operType === permissionConstant.OPER_TYPE.ROLE) {
|
|
107
|
+
if (typeof operId === 'string') {
|
|
108
|
+
sql += ` and OPER_TYPE=? and OPER_ID=?`;
|
|
109
|
+
params = [global.orgid, operType, operId];
|
|
110
|
+
}
|
|
111
|
+
if (Array.isArray(operId) && operId.length) {
|
|
112
|
+
params.push(operType);
|
|
113
|
+
let operSql = operId
|
|
114
|
+
.reduce((mo, id) => {
|
|
115
|
+
mo.push('?');
|
|
116
|
+
params.push(id);
|
|
117
|
+
return mo;
|
|
118
|
+
}, [])
|
|
119
|
+
.join(',');
|
|
120
|
+
sql += ` and OPER_TYPE=? and OPER_ID in (${operSql})`;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (perm && typeof perm === 'string' && perm.trim().length) {
|
|
124
|
+
let permSql = perm
|
|
125
|
+
.split(',')
|
|
126
|
+
.map((item) => {
|
|
127
|
+
return `(RES_RANGE like '%,${item},%' or RES_RANGE like '${item}' or RES_RANGE like '%,${item}' or RES_RANGE like '${item},%')`;
|
|
128
|
+
})
|
|
129
|
+
.join(' or ');
|
|
130
|
+
sql += ` and (${permSql})`;
|
|
131
|
+
}
|
|
132
|
+
if (Array.isArray(perm) && perm.length) {
|
|
133
|
+
let permSql = perm
|
|
134
|
+
.map((item) => {
|
|
135
|
+
return `(RES_RANGE like '%,${item},%' or RES_RANGE like '${item}' or RES_RANGE like '%,${item}' or RES_RANGE like '${item},%')`;
|
|
136
|
+
})
|
|
137
|
+
.join(' or ');
|
|
138
|
+
sql += ` and (${permSql})`;
|
|
139
|
+
}
|
|
140
|
+
let newFilter = await checkTableFilterFields(filter, entity.IDM_PERMISSIONS);
|
|
141
|
+
if (newFilter && Object.keys(newFilter).length) {
|
|
142
|
+
let queryParam = queryParamsBuilder(newFilter, null, null);
|
|
143
|
+
sql = sql + ' and ' + queryParam.sql;
|
|
144
|
+
params = params.concat(queryParam.params);
|
|
145
|
+
}
|
|
146
|
+
let { error, results } = await sqlExecutor(sql, params);
|
|
147
|
+
if (error) {
|
|
148
|
+
logger.error(error);
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
return results;
|
|
152
|
+
},
|
|
153
|
+
|
|
154
|
+
// 添加角色成员
|
|
155
|
+
addRoleMember: async function (props) {
|
|
156
|
+
let params = {
|
|
157
|
+
...props,
|
|
158
|
+
ORG_ID: global.orgid,
|
|
159
|
+
};
|
|
160
|
+
let sqlResult = insertSqlBuilder(entity.IDM_ROLE_MEMBERS, params);
|
|
161
|
+
let { error, results } = await sqlExecutor(sqlResult.sql, sqlResult.params);
|
|
162
|
+
if (error) {
|
|
163
|
+
logger.error(error);
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
return true;
|
|
167
|
+
},
|
|
168
|
+
|
|
169
|
+
// 修改角色成员信息
|
|
170
|
+
updRoleMemberInfo: async function (filters, params) {
|
|
171
|
+
if (!params || !filters || !Object.keys(filters).length) return false;
|
|
172
|
+
let sqlResult = updateSqlBuilder(entity.IDM_ROLE_MEMBERS, params, filters);
|
|
173
|
+
let { error, results } = await sqlExecutor(sqlResult.sql, sqlResult.params);
|
|
174
|
+
if (error) {
|
|
175
|
+
logger.error(error);
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
return true;
|
|
179
|
+
},
|
|
180
|
+
|
|
181
|
+
// 删除角色成员
|
|
182
|
+
delRoleMember: async function (filters) {
|
|
183
|
+
if (!filters || !Object.keys(filters).length) return false;
|
|
184
|
+
let sqlResult = deleteSqlBuilder(entity.IDM_ROLE_MEMBERS, filters);
|
|
185
|
+
let { error, results } = await sqlExecutor(sqlResult.sql, sqlResult.params);
|
|
186
|
+
if (error) {
|
|
187
|
+
logger.error(error);
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
return true;
|
|
191
|
+
},
|
|
192
|
+
};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const isPlainObject = require('lodash/isPlainObject');
|
|
3
|
+
|
|
4
|
+
const { sqlExecutor } = require('@gingkoo/node-tools');
|
|
5
|
+
const entity = require('../common/entity');
|
|
6
|
+
const path = require('../utils/path');
|
|
7
|
+
const generateAvatar = require('../utils/avatar');
|
|
8
|
+
const userService = require('../common/services/user');
|
|
9
|
+
const dictService = require('../common/services/dict');
|
|
10
|
+
|
|
11
|
+
module.exports = {
|
|
12
|
+
// 系统管理权限
|
|
13
|
+
getSystemPower: async function () {
|
|
14
|
+
let sql = `select DEPT_LEADER as userid from ${entity.IDM_DEPTS}
|
|
15
|
+
union select GROUP_LEADER as userid from ${entity.IDM_GROUPS}`;
|
|
16
|
+
let dbResult = await sqlExecutor(sql, []);
|
|
17
|
+
if (dbResult.error) {
|
|
18
|
+
console.log(dbResult.error);
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
if (!dbResult.results.length) {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
return dbResult.results;
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
getUserInfo: async function (userid) {
|
|
28
|
+
let dbResult = await sqlExecutor(
|
|
29
|
+
`select u.*, d.DEPT_NAME, o.ORG_NAME from ${entity.IDM_USERS} u join idm_depts d on u.DEPT_NO=d.DEPT_NO join idm_orgs o on u.ORG_ID = o.ORG_ID where u.ORG_ID=? and u.USER_ID=?`,
|
|
30
|
+
[global.orgid, userid],
|
|
31
|
+
);
|
|
32
|
+
if (dbResult.error) {
|
|
33
|
+
console.log(dbResult.error);
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
let userinfo = dbResult.results?.[0];
|
|
37
|
+
|
|
38
|
+
if (!userinfo) return null;
|
|
39
|
+
|
|
40
|
+
// 没有头像默认一个头像 并插入到表里面
|
|
41
|
+
if (!userinfo?.AVATAR) {
|
|
42
|
+
// 头像 附件存放位置
|
|
43
|
+
const attachmentPath = path.join(
|
|
44
|
+
config.app.home,
|
|
45
|
+
'storage',
|
|
46
|
+
global.orgid.toLowerCase(),
|
|
47
|
+
'avatars',
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
path.mkdirPath(attachmentPath);
|
|
51
|
+
|
|
52
|
+
let data = await generateAvatar.generate();
|
|
53
|
+
|
|
54
|
+
await path.saveFile(path.join(attachmentPath, userinfo.USER_ID + '.svg'), data);
|
|
55
|
+
|
|
56
|
+
let url = `/fss/resources/avatar/${userinfo.USER_ID}`;
|
|
57
|
+
await userService.operTeamMember(userid, {
|
|
58
|
+
AVATAR: url,
|
|
59
|
+
});
|
|
60
|
+
userinfo.AVATAR = url;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return userinfo;
|
|
64
|
+
},
|
|
65
|
+
getAllOrgs: async function (userid) {
|
|
66
|
+
let dbResult = await sqlExecutor(
|
|
67
|
+
`select * from ${entity.IDM_ORGS} where ORG_ID in (select ORG_ID from idm_users where USER_ID=?)`,
|
|
68
|
+
[userid],
|
|
69
|
+
);
|
|
70
|
+
if (dbResult.error) {
|
|
71
|
+
console.log(dbResult.error);
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
if (dbResult.results.length == 0) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
return dbResult.results;
|
|
78
|
+
},
|
|
79
|
+
getMappings: async function () {
|
|
80
|
+
// 分类
|
|
81
|
+
let dictGroups = [
|
|
82
|
+
'IDM_EDUCATION', //学历
|
|
83
|
+
'IDM_USER_TYPE', //用户类型
|
|
84
|
+
'IDM_USER_POSITION', //职位
|
|
85
|
+
'IDM_USER_STATUS', //用户状态
|
|
86
|
+
'IDM_USER_GENDER', //学位
|
|
87
|
+
'IDM_DEGREE', //学位
|
|
88
|
+
'IDM_LANGUAGE', //语言
|
|
89
|
+
'IDM_AREA', //地区
|
|
90
|
+
'IDM_TIMEFORMAT', //时间格式
|
|
91
|
+
'DATE_FORMAT', //日期格式
|
|
92
|
+
];
|
|
93
|
+
|
|
94
|
+
let data = {};
|
|
95
|
+
|
|
96
|
+
// 先搂字典表
|
|
97
|
+
if (Array.isArray(dictGroups) && dictGroups.length) {
|
|
98
|
+
let dicts = await dictService.getDicts(dictGroups);
|
|
99
|
+
if (isPlainObject(dicts)) {
|
|
100
|
+
Object.entries(dicts).forEach((dict) => {
|
|
101
|
+
let [key, value] = dict;
|
|
102
|
+
if (Array.isArray(value) && value.length) {
|
|
103
|
+
data[key] = value.reduce((mo, item) => {
|
|
104
|
+
let { value, ...rest } = item;
|
|
105
|
+
mo[value] = rest;
|
|
106
|
+
return mo;
|
|
107
|
+
}, {});
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return data;
|
|
114
|
+
},
|
|
115
|
+
};
|