@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.
Files changed (122) hide show
  1. package/README.md +7 -0
  2. package/app.js +36 -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/common-assets/css/index-05a08720.css +3 -0
  109. package/dist/common-assets/css/index-05a08720.css.gz +0 -0
  110. package/dist/common-assets/js/index-2e8c7128.js +762 -0
  111. package/dist/common-assets/js/index-2e8c7128.js.gz +0 -0
  112. package/dist/common-assets/js/react-cropper.es-19c27537.js +10 -0
  113. package/dist/common-assets/js/react-cropper.es-19c27537.js.gz +0 -0
  114. package/dist/common-assets/png/u9-2348c304.png +0 -0
  115. package/dist/common-assets/woff2/materialicons-83be7b2f.woff2 +0 -0
  116. package/dist/index.html +162 -0
  117. package/package.json +61 -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,190 @@
1
+ 'use strict';
2
+
3
+ const { v4: uuidv4 } = require('uuid');
4
+ const {
5
+ sqlExecutor,
6
+ insertSqlBuilder,
7
+ updateSqlBuilder,
8
+ queryParamsBuilder,
9
+ checkTableFilterFields,
10
+ pageQuery,
11
+ } = require('@gingkoo/node-tools');
12
+ const { logger } = require('../common/logger');
13
+ const entity = require('../common/entity');
14
+
15
+ module.exports = {
16
+ /**
17
+ * ❤️ 查询模块
18
+ * @param {string} parentid 上级ID {最上级ID为 setting}
19
+ */
20
+ async getModules(parentid) {
21
+ let sql = `select * from ${entity.BASE_SETUP_NAV} where PARENT_ID = ? and STATUS ='00'
22
+ ORDER BY ISNULL(ORDER_NO),ORDER_NO ASC,DATA_CRT_TIME ASC`;
23
+ let { error, results } = await sqlExecutor(sql, [parentid]);
24
+ if (error) {
25
+ return [];
26
+ }
27
+ return results;
28
+ },
29
+
30
+ /**
31
+ * ❤️ 查询所有模块下的导航
32
+ */
33
+ async getNavs() {
34
+ let sql = `select * from ${entity.BASE_SETUP_NAV} where PARENT_ID != 'setting' and STATUS ='00'
35
+ ORDER BY ISNULL(ORDER_NO), ORDER_NO ASC,DATA_CRT_TIME ASC`;
36
+ let { error, results } = await sqlExecutor(sql, []);
37
+ if (error) {
38
+ return [];
39
+ }
40
+
41
+ return results;
42
+ },
43
+
44
+ /***
45
+ * 新增
46
+ * @param {object} props
47
+ * @props string NAV_ID 导航ID
48
+ * @props string NAV_NAME 导航名称
49
+ * @props string NAV_TYPE 导航类型
50
+ * @props string NAV_ICON 导航图标
51
+ * @props string NAV_DESC 导航说明
52
+ * @props string URL 导航位置
53
+ * @props string PARENT_ID 内联ID
54
+ * @props string ORDER_NO 顺序
55
+ * @props string OBJECT_ID 关联ID
56
+ * @props string DATA_CRT_USER 创建人
57
+ * @props string MODULE_ID 模块ID
58
+ *
59
+ * @returns true|null
60
+ */
61
+ postSetNav: async function (props) {
62
+ let params = insertSqlBuilder(entity.BASE_SETUP_NAV, props);
63
+ let { error, results } = await sqlExecutor(params.sql, params.params);
64
+ if (error) {
65
+ return null;
66
+ }
67
+ return true;
68
+ },
69
+
70
+ /***
71
+ * @param {object} filter 过滤条件
72
+ * @filter string NAV_ID 导航ID
73
+ * @param {object} props 修改内容
74
+ * @props string NAV_NAME 导航名称
75
+ * @props string NAV_TYPE 导航类型
76
+ * @props string NAV_ICON 导航图标
77
+ * @props string NAV_DESC 导航说明
78
+ * @props string URL 导航位置
79
+ * @props string PARENT_ID 内联ID
80
+ * @props string ORDER_NO 顺序
81
+ * @props string OBJECT_ID 关联ID
82
+ * @returns true|null
83
+ */
84
+ putNav: async function (filter, props) {
85
+ let arr = [
86
+ 'NAV_NAME',
87
+ 'NAV_TYPE',
88
+ 'NAV_ICON',
89
+ 'NAV_DESC',
90
+ 'URL',
91
+ 'PARENT_ID',
92
+ 'ORDER_NO',
93
+ 'OBJECT_ID',
94
+ 'STATUS',
95
+ ];
96
+
97
+ let content = arr.reduce((obj, v) => {
98
+ if (props[v] !== null && props[v] !== undefined) {
99
+ return {
100
+ ...obj,
101
+ [v]: props[v],
102
+ };
103
+ } else {
104
+ return obj;
105
+ }
106
+ }, {});
107
+ let params = updateSqlBuilder(entity.BASE_SETUP_NAV, content, filter);
108
+ let data = await sqlExecutor(params.sql, params.params);
109
+ if (data.error) {
110
+ return null;
111
+ }
112
+ return true;
113
+ },
114
+
115
+ getApiList: async function (filter, customSql, spOps, pageInfo) {
116
+ let sql = `select * from ${entity.BASE_API_CONFIG} where ORG_ID=? and STATUS='00'`;
117
+ let params = [global.orgid];
118
+
119
+ let where = await checkTableFilterFields(filter, entity.BASE_API_CONFIG);
120
+ if (where && Object.keys(where).length) {
121
+ let queryParam = queryParamsBuilder(where, null, null, spOps);
122
+ sql = sql + ' and ' + queryParam.sql;
123
+ params = params.concat(queryParam.params);
124
+ }
125
+ if (typeof customSql === 'string' && customSql.length) {
126
+ sql += customSql;
127
+ }
128
+ sql += 'order by DATA_CRT_DATE DESC ';
129
+ if (pageInfo?.pageSize || pageInfo?.pageIndex) {
130
+ let dbResult = await pageQuery(sql, params, pageInfo.pageSize, pageInfo.pageIndex);
131
+ return dbResult;
132
+ }
133
+ let { error, results } = await sqlExecutor(sql, params);
134
+ if (error) {
135
+ logger.error(error);
136
+ return null;
137
+ }
138
+ return results;
139
+ },
140
+
141
+ insertApi: async function (props) {
142
+ let DATA_ID = uuidv4().replaceAll('-', '');
143
+ let params = {
144
+ ...props,
145
+ STATUS: '00',
146
+ ORG_ID: global.orgid,
147
+ DATA_ID,
148
+ };
149
+ let newParams = await checkTableFilterFields(params, entity.BASE_API_CONFIG);
150
+ let dbParams = insertSqlBuilder(entity.BASE_API_CONFIG, newParams);
151
+ let dbResult = await sqlExecutor(dbParams.sql, dbParams.params);
152
+ if (dbResult.error) {
153
+ console.log(dbResult.error);
154
+ return null;
155
+ }
156
+ return newParams;
157
+ },
158
+
159
+ updateApiInfo: async function (filter, props) {
160
+ let where = await checkTableFilterFields(filter, entity.BASE_API_CONFIG);
161
+ let params = await checkTableFilterFields(props, entity.BASE_API_CONFIG);
162
+ if (!where || !params || !Object.keys(where) || !Object.keys(params)) {
163
+ return null;
164
+ }
165
+
166
+ let dbParams = updateSqlBuilder(entity.BASE_API_CONFIG, params, where);
167
+ let dbResult = await sqlExecutor(dbParams.sql, dbParams.params);
168
+ if (dbResult.error) {
169
+ console.log(dbResult.error);
170
+ return null;
171
+ }
172
+ return '操作成功';
173
+ },
174
+
175
+ deleteApi: async function (filter) {
176
+ let where = await checkTableFilterFields(filter, entity.BASE_API_CONFIG);
177
+ if (!where || !Object.keys(where)) {
178
+ return null;
179
+ }
180
+ // let sqlParams = deleteSqlBuilder(entity.BASE_API_CONFIG, where); //物理删除
181
+ let sqlParams = updateSqlBuilder(entity.BASE_API_CONFIG, { STATUS: '01' }, where);
182
+
183
+ let dbResult = await sqlExecutor(sqlParams.sql, sqlParams.params);
184
+ if (dbResult.error) {
185
+ console.log(dbResult.error);
186
+ return null;
187
+ }
188
+ return true;
189
+ },
190
+ };
@@ -0,0 +1,42 @@
1
+ const { sqlExecutor, updateSqlBuilder, queryBaseSqlBuilder } = require('@gingkoo/node-tools');
2
+ const { logger } = require('../common/logger/index');
3
+ const entity = require('../common/entity');
4
+
5
+ const tokenService = {
6
+ queryFields: ['TITLE', 'TOKEN_DESC', 'APP_ID'],
7
+ createFields: ['TITLE', 'TOKEN_DESC', 'APP_ID', 'EXPIRED_TIME'],
8
+ updateFields: ['TITLE', 'TOKEN_DESC', 'STATUS'],
9
+ primaryFields: ['USER_ID', 'TOKEN_ID', 'APP_ID'],
10
+
11
+ // 获取 token 列表
12
+ async getTokens(where) {
13
+ let filter = {
14
+ ORG_ID: global.orgid,
15
+ STATUS: '00',
16
+ ...where,
17
+ };
18
+ let { sql, params } = await queryBaseSqlBuilder(entity.IDM_USER_TOKEN, filter);
19
+ let { error, results } = await sqlExecutor(sql + ' order by DATA_CRT_TIME desc', params);
20
+ if (error) {
21
+ logger.error('查询用户token列表', error);
22
+ }
23
+
24
+ return [error, results];
25
+ },
26
+
27
+ // 更新 token
28
+ async update(params, where) {
29
+ where = where || {};
30
+ where.ORG_ID = global.orgid;
31
+
32
+ let { sql, params: _params } = updateSqlBuilder(entity.IDM_USER_TOKEN, params, where);
33
+
34
+ let { error } = await sqlExecutor(sql, _params);
35
+ if (error) {
36
+ logger.error('更新信息', error);
37
+ }
38
+ return [error];
39
+ },
40
+ };
41
+
42
+ module.exports = tokenService;
@@ -0,0 +1,52 @@
1
+ 'use strict';
2
+ var express = require('express');
3
+ const { checkLogin, authCheck } = require('./common/middleware/auth');
4
+ const { loginType, getLoginMethod } = require('./common/services/login');
5
+ const automateRouter = require('./routers/automate');
6
+ const app = require('./routers/app');
7
+ const users = require('./routers/user');
8
+ const notices = require('./routers/notice');
9
+ const _module = require('./routers/module');
10
+ const idm = require('./routers/idm');
11
+ const pages = require('./routers/pages');
12
+ const dict = require('./routers/dict');
13
+ const setting = require('./routers/setting');
14
+ const configService = require('./services/config');
15
+ const permission = require('./routers/permission');
16
+ const general = require('./routers/generalConfig'); //一般配置
17
+ const email = require('./routers/email'); //一般配置
18
+ const team = require('./routers/team');
19
+
20
+ var router = express.Router();
21
+
22
+ router.use('/app', app);
23
+ router.use('/automate', checkLogin, automateRouter);
24
+ router.use('/user', checkLogin, users);
25
+ router.use('/notices', checkLogin, notices);
26
+ router.use('/module', checkLogin, _module);
27
+ router.use('/idm', checkLogin, idm);
28
+ router.use('/dict', checkLogin, dict);
29
+ router.use('/setting', checkLogin, setting);
30
+ router.use('/permission', checkLogin, permission);
31
+ router.use('/general', checkLogin, general);
32
+ router.use('/email', checkLogin, email);
33
+ router.use('/team', checkLogin, team);
34
+ router.use('/pages', authCheck, pages);
35
+
36
+ router.get('/config', async function (req, res) {
37
+ let logo = await configService.getTeamLogo();
38
+
39
+ let loginUrl = '';
40
+ if ((await getLoginMethod()) === loginType.wechat) {
41
+ loginUrl = '/wechat/auth';
42
+ } else {
43
+ loginUrl = '/#/login';
44
+ }
45
+
46
+ res.sendOk({
47
+ loginUrl,
48
+ logo,
49
+ });
50
+ });
51
+
52
+ module.exports = router;
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+ const mapping = require('./common/mapping');
3
+ const deptService = require('./common/services/dept');
4
+
5
+ mapping.register('space', {
6
+ async DEPT_LIST() {
7
+ let res = await deptService.getDepts();
8
+ return res.reduce((mo, item) => {
9
+ if (item.DEPT_NO) {
10
+ mo[item.DEPT_NO] = item.DEPT_NAME;
11
+ }
12
+ return mo;
13
+ }, {});
14
+ },
15
+ });
@@ -0,0 +1,48 @@
1
+ const axios = require('axios');
2
+ const avatars = require('getavataaars');
3
+
4
+ // 随机头像
5
+ class GenerateAvatar {
6
+ constructor() {}
7
+
8
+ getRandomEnumValue(anEnum) {
9
+ const enumValues = Object.values(anEnum);
10
+ const randomIndex = Math.floor(Math.random() * enumValues.length);
11
+ return enumValues[randomIndex];
12
+ }
13
+
14
+ async utltoHtml(url) {
15
+ return await axios
16
+ .get(url)
17
+ .then((response) => {
18
+ if (response.status === 200) {
19
+ const html = response.data;
20
+ return html;
21
+ } else {
22
+ return null;
23
+ }
24
+ })
25
+ .catch((error) => {
26
+ console.error('发生错误:', error);
27
+ });
28
+ }
29
+
30
+ async generate() {
31
+ let image = avatars.generateAvatar({
32
+ Hair: this.getRandomEnumValue(avatars.Hair),
33
+ Accessories: this.getRandomEnumValue(avatars.Accessories),
34
+ Eyebrow: this.getRandomEnumValue(avatars.Eyebrow),
35
+ AvatarStyle: avatars.AvatarStyle.Transparent,
36
+ FacialHair: this.getRandomEnumValue(avatars.FacialHair),
37
+ HairColour: this.getRandomEnumValue(avatars.HairColour),
38
+ Clothes: this.getRandomEnumValue(avatars.Clothes),
39
+ FabricColour: this.getRandomEnumValue(avatars.FabricColour),
40
+ Eyes: this.getRandomEnumValue(avatars.Eyes),
41
+ Mouth: this.getRandomEnumValue(avatars.Mouth),
42
+ Skin: this.getRandomEnumValue(avatars.Skin),
43
+ });
44
+ let data = await this.utltoHtml(image);
45
+ return data;
46
+ }
47
+ }
48
+ module.exports = new GenerateAvatar();
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+ var CAL_COLORS = [
3
+ '#333366', '#333399', '#3333CC', '#336633', '#336666', '#336699', '#3366CC', '#339933', '#339966', '#339999', '#3399CC', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#663333', '#663366',
4
+ '#663399', '#6633CC', '#666633', '#666666', '#666699', '#6666CC', '#669933', '#669966', '#669999', '#6699CC', '#66CC33', '#66CC66', '#66CC99', '#66CCCC', '#993333', '#993366', '#993399',
5
+ '#9933CC', '#996633', '#996666', '#996699', '#9966CC', '#999933', '#999966', '#9999CC', '#99CC33', '#99CC66', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC6633', '#CC6666', '#CC66CC',
6
+ '#CC9933', '#CC9966', '#CC99CC', '#CCCC33', '#CCCC66'
7
+ ];
8
+
9
+ function calColor(v) {
10
+ let total = 0
11
+ for (let i = 0; i < v.length; i++) {
12
+ total = total + v[i].charCodeAt();
13
+ }
14
+
15
+ return CAL_COLORS[(total + v.length) % CAL_COLORS.length]
16
+ }
17
+
18
+ module.exports = {
19
+ calColor,
20
+ }
@@ -0,0 +1,66 @@
1
+ const moment = require('moment');
2
+ const { format } = require('date-fns');
3
+
4
+ /**
5
+ * 将表里面的日期格式化
6
+ * @param {string} dateStr
7
+ * @returns 2023-09-07 13:53:40 or 2023-09-07
8
+ */
9
+ exports.dateFormatTime = (dateStr) => {
10
+ let len = dateStr.length;
11
+ if (len === 9) {
12
+ return dateStr.replace(/(\d{4})(\d{2})(\d{2})/g, '$1-$2-$3');
13
+ }
14
+
15
+ if (len === 14) {
16
+ return dateStr.replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/g, '$1-$2-$3 $4:$5:$6');
17
+ }
18
+
19
+ return dateStr;
20
+ };
21
+
22
+ /**
23
+ * 将表里面的日期格式化
24
+ * @param {string} dateStr
25
+ * @returns 2023-09-07 13:53:40
26
+ */
27
+ exports.dateFormatTime2 = (dateStr) => {
28
+ if (!dateStr) return '';
29
+ let year = dateStr.slice(0, 4);
30
+ let month = dateStr.slice(4, 6);
31
+ let day = dateStr.slice(6, 8);
32
+ let h = dateStr.slice(8, 10);
33
+ let m = dateStr.slice(10, 12);
34
+ let s = dateStr.slice(12, 14);
35
+ return `${year}-${month}-${day} ${h}:${m}:${s}`;
36
+ };
37
+
38
+ /**
39
+ * 传入时间和当前时间间隔
40
+ * @param {string} time
41
+ * @returns
42
+ */
43
+ exports.timeDiff = (time) => {
44
+ // weeks、years、months、days、hours、minutes、 seconds
45
+ let endTime = moment(); //获取当前时间
46
+ let startTime = time; //设置之前时间
47
+ let d = endTime.diff(startTime, 'days');
48
+ let h = endTime.diff(startTime, 'hours') % 24;
49
+ let m = endTime.diff(startTime, 'minutes') % 60;
50
+ let str = '';
51
+ if (d) {
52
+ str += `${d}天`;
53
+ }
54
+ if (!str && h) {
55
+ str += `${h}小时`;
56
+ }
57
+ if (!str && m) {
58
+ str += `${m}分钟`;
59
+ }
60
+
61
+ return str;
62
+ };
63
+
64
+ exports.formatDate = (date = new Date(), formatStr = 'yyyy-MM-dd HH:mm:ss') => {
65
+ return format(date, formatStr);
66
+ };