befly 3.76.0 → 3.76.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 (155) hide show
  1. package/Befly.js +159 -0
  2. package/README.md +50 -11
  3. package/apis/admin/delete.js +1 -3
  4. package/apis/admin/insert.js +2 -1
  5. package/apis/admin/select.js +2 -7
  6. package/apis/admin/update.js +3 -8
  7. package/apis/api/select.js +2 -7
  8. package/apis/auth/login.js +16 -20
  9. package/apis/dict/delete.js +1 -1
  10. package/apis/dict/detail.js +1 -3
  11. package/apis/dict/select.js +1 -2
  12. package/apis/dict/update.js +1 -1
  13. package/apis/dictType/delete.js +1 -1
  14. package/apis/dictType/detail.js +1 -1
  15. package/apis/dictType/insert.js +1 -1
  16. package/apis/dictType/select.js +2 -7
  17. package/apis/dictType/update.js +2 -2
  18. package/apis/email/config.js +4 -7
  19. package/apis/email/logList.js +2 -7
  20. package/apis/email/send.js +1 -2
  21. package/apis/email/verify.js +1 -3
  22. package/apis/loginLog/select.js +2 -7
  23. package/apis/menu/select.js +2 -7
  24. package/apis/operateLog/select.js +2 -7
  25. package/apis/role/apiSave.js +2 -2
  26. package/apis/role/menuSave.js +2 -2
  27. package/apis/role/select.js +2 -7
  28. package/apis/source/imageList.js +2 -5
  29. package/apis/tongJi/dailyReport.js +12 -13
  30. package/apis/tongJi/dailyReportSelect.js +1 -2
  31. package/apis/tongJi/dailyStats.js +1 -1
  32. package/apis/tongJi/dailyStatsDistribution.js +2 -2
  33. package/apis/tongJi/errorList.js +1 -2
  34. package/apis/tongJi/errorReport.js +1 -2
  35. package/apis/tongJi/projectDelete.js +1 -3
  36. package/apis/tongJi/projectSelect.js +2 -4
  37. package/apis/tongJi/projectUpdate.js +2 -2
  38. package/apis/upload/file.js +7 -5
  39. package/checks/api.js +43 -66
  40. package/checks/config.js +17 -12
  41. package/checks/corns.js +28 -46
  42. package/checks/field.js +18 -0
  43. package/checks/items.js +16 -60
  44. package/checks/menu.js +28 -39
  45. package/checks/table.js +106 -26
  46. package/checks/validation.js +13 -0
  47. package/configs/beflyConfig.json +6 -6
  48. package/configs/constConfig.js +2 -63
  49. package/exports.js +2 -0
  50. package/hooks/auth.js +11 -7
  51. package/hooks/parser.js +55 -59
  52. package/hooks/permission.js +5 -2
  53. package/hooks/rateLimit.js +25 -62
  54. package/hooks/validator.js +43 -31
  55. package/index.js +43 -344
  56. package/{lib → libs}/cacheHelper.js +3 -8
  57. package/libs/cron.js +60 -0
  58. package/libs/logger/index.js +1 -0
  59. package/libs/logger/logger.js +245 -0
  60. package/libs/logger/sanitize.js +115 -0
  61. package/{lib → libs/mysql}/dbHelper.js +100 -73
  62. package/{lib → libs/mysql}/dbParse.js +16 -9
  63. package/{lib → libs/mysql}/dbUtil.js +15 -32
  64. package/libs/mysql/error.js +29 -0
  65. package/libs/mysql/index.js +6 -0
  66. package/libs/mysql/is.js +29 -0
  67. package/libs/mysql/mysql.js +43 -0
  68. package/libs/mysql/sql/identifier.js +85 -0
  69. package/libs/mysql/sql/index.js +2 -0
  70. package/{lib → libs/mysql/sql}/sqlBuilder.js +2 -3
  71. package/libs/mysql/util.js +44 -0
  72. package/libs/redis/index.js +2 -0
  73. package/libs/redis/redis.js +204 -0
  74. package/libs/redis/redisError.js +8 -0
  75. package/libs/tableModel.js +72 -0
  76. package/libs/tool.js +33 -0
  77. package/libs/validator/compiler.js +248 -0
  78. package/libs/validator/index.js +10 -0
  79. package/libs/validator/parser.js +173 -0
  80. package/libs/validator/util.js +5 -0
  81. package/package.json +10 -8
  82. package/paths.js +2 -3
  83. package/plugins/cache.js +2 -1
  84. package/plugins/email.js +4 -4
  85. package/plugins/mysql.js +5 -15
  86. package/plugins/redis.js +4 -12
  87. package/router/api.js +14 -10
  88. package/router/root.js +14 -0
  89. package/router/static.js +3 -3
  90. package/schemas/api.json +99 -0
  91. package/schemas/config.json +255 -0
  92. package/schemas/corn.json +39 -0
  93. package/schemas/item.json +43 -0
  94. package/schemas/menu.json +44 -0
  95. package/schemas/table.json +80 -0
  96. package/scripts/syncDb/apply.js +87 -0
  97. package/scripts/syncDb/ddl.js +43 -0
  98. package/scripts/syncDb/index.js +175 -30
  99. package/scripts/syncDb/model.js +60 -0
  100. package/scripts/syncDb/plan.js +160 -0
  101. package/scripts/syncDb/preflight.js +98 -0
  102. package/scripts/syncDb/report.js +177 -162
  103. package/scripts/syncDb/snapshot.js +118 -0
  104. package/sync/syncUtil.js +7 -13
  105. package/tables/admin.json +51 -53
  106. package/tables/api.json +29 -40
  107. package/tables/dailyReport.json +85 -73
  108. package/tables/dict.json +27 -39
  109. package/tables/dictType.json +20 -34
  110. package/tables/emailLog.json +49 -47
  111. package/tables/errorReport.json +86 -60
  112. package/tables/file.json +47 -50
  113. package/tables/loginLog.json +68 -55
  114. package/tables/menu.json +20 -34
  115. package/tables/operateLog.json +53 -47
  116. package/tables/project.json +18 -30
  117. package/tables/role.json +33 -37
  118. package/utils/cors.js +37 -41
  119. package/utils/deepMerge.js +3 -1
  120. package/utils/error.js +1 -56
  121. package/utils/id.js +44 -0
  122. package/utils/is.js +6 -243
  123. package/utils/response.js +12 -1
  124. package/utils/scanFiles.js +13 -4
  125. package/utils/scanSources.js +58 -20
  126. package/utils/util.js +11 -163
  127. package/apis/_apis.js +0 -20
  128. package/apis/auth/sendSmsCode.js +0 -24
  129. package/apis/role/delete.js +0 -41
  130. package/apis/role/insert.js +0 -45
  131. package/apis/role/save.js +0 -36
  132. package/apis/role/update.js +0 -66
  133. package/configs/regexpAlias.json +0 -55
  134. package/lib/connect.js +0 -119
  135. package/lib/logger.js +0 -430
  136. package/lib/redisHelper.js +0 -399
  137. package/lib/validator.js +0 -274
  138. package/lib/xmlParse.js +0 -149
  139. package/plugins/config.js +0 -13
  140. package/plugins/cron.js +0 -115
  141. package/plugins/logger.js +0 -17
  142. package/plugins/tool.js +0 -131
  143. package/plugins/xmlParse.js +0 -10
  144. package/schemas/config.js +0 -67
  145. package/scripts/syncDb/context.js +0 -120
  146. package/scripts/syncDb/diff.js +0 -279
  147. package/scripts/syncDb/transform.js +0 -113
  148. package/sql/befly.sql +0 -271
  149. package/utils/email.js +0 -3
  150. package/utils/fieldClear.js +0 -22
  151. package/utils/formatValidationIssues.js +0 -28
  152. package/utils/getClientIp.js +0 -47
  153. package/utils/loggerUtils.js +0 -196
  154. package/utils/regexpUtil.js +0 -52
  155. /package/{lib → libs}/smtpText.js +0 -0
@@ -1,279 +0,0 @@
1
- import { join } from "node:path";
2
-
3
- import { BEFLY_TABLE_PREFIX } from "#befly/configs/constConfig.js";
4
- import { isNonEmptyString, isPlainObject } from "#befly/utils/is.js";
5
- import { camelCase, snakeCase } from "#befly/utils/util.js";
6
-
7
- import { printSyncDbProcessLog } from "./report.js";
8
- import { toSyncDbFieldDef } from "./transform.js";
9
-
10
- const SYNC_DB_MANAGED_FIELD_NAMES = new Set(["id", "created_at", "updated_at", "deleted_at", "state"]);
11
- const SYNC_DB_HEAD_FIELD_NAME = "id";
12
- const SYNC_DB_TAIL_FIELD_NAMES = ["created_at", "updated_at", "deleted_at", "state"];
13
- const SYNC_DB_TAIL_FIELD_NAME_SET = new Set(SYNC_DB_TAIL_FIELD_NAMES);
14
-
15
- function shouldSkipSyncDbColumn(columnMeta, beflyMode) {
16
- if (beflyMode !== "manual") {
17
- return false;
18
- }
19
-
20
- const columnName = String(columnMeta?.columnName || "").toLowerCase();
21
- return SYNC_DB_MANAGED_FIELD_NAMES.has(columnName);
22
- }
23
-
24
- function shouldSkipSyncDbFieldName(fieldName, beflyMode) {
25
- if (beflyMode !== "manual") {
26
- return false;
27
- }
28
-
29
- return SYNC_DB_MANAGED_FIELD_NAMES.has(snakeCase(String(fieldName || "")));
30
- }
31
-
32
- function sortSyncDbObjectKeys(source) {
33
- const output = {};
34
-
35
- if (Object.hasOwn(source, SYNC_DB_HEAD_FIELD_NAME)) {
36
- output[SYNC_DB_HEAD_FIELD_NAME] = source[SYNC_DB_HEAD_FIELD_NAME];
37
- }
38
-
39
- for (const [key, value] of Object.entries(source)) {
40
- if (key === SYNC_DB_HEAD_FIELD_NAME) {
41
- continue;
42
- }
43
- if (SYNC_DB_TAIL_FIELD_NAME_SET.has(snakeCase(key))) {
44
- continue;
45
- }
46
-
47
- output[key] = value;
48
- }
49
-
50
- for (const fieldName of SYNC_DB_TAIL_FIELD_NAMES) {
51
- for (const [key, value] of Object.entries(source)) {
52
- if (snakeCase(key) !== fieldName) {
53
- continue;
54
- }
55
-
56
- output[key] = value;
57
- }
58
- }
59
-
60
- return output;
61
- }
62
-
63
- export function groupSyncDbColumns(rows) {
64
- const grouped = new Map();
65
-
66
- for (const row of rows) {
67
- const tableName = String(row.tableName || "");
68
- if (!isNonEmptyString(tableName)) {
69
- continue;
70
- }
71
- if (tableName.toLowerCase().startsWith(BEFLY_TABLE_PREFIX)) {
72
- continue;
73
- }
74
-
75
- if (!grouped.has(tableName)) {
76
- grouped.set(tableName, []);
77
- }
78
-
79
- const tableColumns = grouped.get(tableName);
80
- tableColumns.push({
81
- tableName: tableName,
82
- tableComment: row.tableComment,
83
- columnName: row.columnName,
84
- dataType: row.dataType,
85
- columnType: row.columnType,
86
- charLength: row.charLength,
87
- columnComment: row.columnComment,
88
- ordinalPosition: row.ordinalPosition
89
- });
90
- }
91
-
92
- return grouped;
93
- }
94
-
95
- export function buildSyncDbDiff(groupedDbColumns, existingTableMap, beflyMode = "auto") {
96
- const missingTables = [];
97
- const extraTables = [];
98
- const missingFieldsByTable = {};
99
- const extraFieldsByTable = {};
100
- const groupedDbTableKeySet = new Set();
101
- let missingFieldCount = 0;
102
- let extraFieldCount = 0;
103
-
104
- for (const [tableName, columns] of groupedDbColumns.entries()) {
105
- const tableFileName = camelCase(tableName);
106
- const tableKey = String(tableFileName).toLowerCase();
107
- groupedDbTableKeySet.add(tableKey);
108
- const existing = existingTableMap.get(tableKey);
109
- const filteredColumns = columns.filter((columnMeta) => !shouldSkipSyncDbColumn(columnMeta, beflyMode));
110
-
111
- if (!existing) {
112
- if (filteredColumns.length === 0) {
113
- continue;
114
- }
115
-
116
- missingTables.push({
117
- tableName: tableName,
118
- tableFileName: tableFileName,
119
- columns: filteredColumns
120
- });
121
- continue;
122
- }
123
-
124
- const existingFields = isPlainObject(existing.tableDef) ? existing.tableDef : {};
125
- const existingFieldNameByDbColumnName = new Map();
126
-
127
- for (const fieldName of Object.keys(existingFields)) {
128
- if (shouldSkipSyncDbFieldName(fieldName, beflyMode)) {
129
- continue;
130
- }
131
-
132
- existingFieldNameByDbColumnName.set(snakeCase(fieldName), fieldName);
133
- }
134
-
135
- const missingFields = [];
136
- const dbFieldNameSet = new Set();
137
- for (const columnMeta of filteredColumns) {
138
- const fieldInfo = toSyncDbFieldDef(columnMeta);
139
- const dbColumnName = String(columnMeta.columnName || "");
140
- const normalizedDbColumnName = dbColumnName.toLowerCase();
141
-
142
- dbFieldNameSet.add(normalizedDbColumnName);
143
- if (existingFieldNameByDbColumnName.has(normalizedDbColumnName)) {
144
- continue;
145
- }
146
-
147
- missingFields.push({
148
- tableName: tableName,
149
- tableFileName: tableFileName,
150
- dbColumnName: dbColumnName,
151
- dbDataType: columnMeta.dataType,
152
- dbColumnType: columnMeta.columnType,
153
- dbCharLength: columnMeta.charLength,
154
- fieldName: fieldInfo.fieldName,
155
- fieldDef: fieldInfo.fieldDef
156
- });
157
- }
158
-
159
- if (missingFields.length > 0) {
160
- missingFieldCount = missingFieldCount + missingFields.length;
161
- missingFieldsByTable[tableFileName] = {
162
- tableName: tableName,
163
- tableFileName: existing.tableFileName || tableFileName,
164
- filePath: existing.filePath,
165
- fields: missingFields
166
- };
167
- }
168
-
169
- const extraFields = [];
170
- for (const fieldName of Object.keys(existingFields)) {
171
- if (shouldSkipSyncDbFieldName(fieldName, beflyMode)) {
172
- continue;
173
- }
174
- if (dbFieldNameSet.has(snakeCase(fieldName))) {
175
- continue;
176
- }
177
-
178
- extraFields.push({
179
- tableName: tableName,
180
- tableFileName: tableFileName,
181
- fieldName: fieldName,
182
- fieldDef: existingFields[fieldName]
183
- });
184
- }
185
-
186
- if (extraFields.length > 0) {
187
- extraFieldCount = extraFieldCount + extraFields.length;
188
- extraFieldsByTable[tableFileName] = {
189
- tableName: tableName,
190
- tableFileName: existing.tableFileName || tableFileName,
191
- filePath: existing.filePath,
192
- fields: extraFields
193
- };
194
- }
195
- }
196
-
197
- for (const [tableKey, existing] of existingTableMap.entries()) {
198
- if (groupedDbTableKeySet.has(tableKey)) {
199
- continue;
200
- }
201
-
202
- extraTables.push({
203
- tableFileName: existing.tableFileName || camelCase(tableKey),
204
- filePath: existing.filePath
205
- });
206
- }
207
-
208
- return {
209
- missingTables: missingTables,
210
- extraTables: extraTables,
211
- missingFieldsByTable: missingFieldsByTable,
212
- extraFieldsByTable: extraFieldsByTable,
213
- missingFieldCount: missingFieldCount,
214
- extraFieldCount: extraFieldCount
215
- };
216
- }
217
-
218
- export async function applySyncDbDiff(diff, tablesDir, existingTableMap) {
219
- let createdTableFileCount = 0;
220
- let appendedFieldCount = 0;
221
- let removedFieldCount = 0;
222
-
223
- for (const missingTable of diff.missingTables) {
224
- const tableDef = {};
225
- for (const columnMeta of missingTable.columns) {
226
- const fieldInfo = toSyncDbFieldDef(columnMeta);
227
- tableDef[fieldInfo.fieldName] = fieldInfo.fieldDef;
228
- }
229
-
230
- const filePath = join(tablesDir, `${missingTable.tableFileName}.json`);
231
- await Bun.write(filePath, `${JSON.stringify(sortSyncDbObjectKeys(tableDef), null, 4)}\n`);
232
- createdTableFileCount = createdTableFileCount + 1;
233
- printSyncDbProcessLog(`已生成表映射 ${filePath}`);
234
- }
235
-
236
- for (const [tableFileName, tableInfo] of Object.entries(diff.missingFieldsByTable)) {
237
- const existing = existingTableMap.get(String(tableFileName).toLowerCase());
238
- const targetFilePath = existing?.filePath || join(tablesDir, `${tableFileName}.json`);
239
-
240
- const currentTableDef = isPlainObject(existing?.tableDef) ? existing.tableDef : {};
241
- for (const fieldItem of tableInfo.fields) {
242
- currentTableDef[fieldItem.fieldName] = fieldItem.fieldDef;
243
- appendedFieldCount = appendedFieldCount + 1;
244
- }
245
-
246
- await Bun.write(targetFilePath, `${JSON.stringify(sortSyncDbObjectKeys(currentTableDef), null, 4)}\n`);
247
- printSyncDbProcessLog(`已补充字段映射 ${targetFilePath},补充字段数量=${tableInfo.fields.length}`);
248
- }
249
-
250
- for (const [tableFileName, tableInfo] of Object.entries(diff.extraFieldsByTable)) {
251
- const existing = existingTableMap.get(String(tableFileName).toLowerCase());
252
- const targetFilePath = existing?.filePath || tableInfo.filePath || join(tablesDir, `${tableFileName}.json`);
253
- const currentTableDef = isPlainObject(existing?.tableDef) ? existing.tableDef : {};
254
- let tableRemovedFieldCount = 0;
255
-
256
- for (const fieldItem of tableInfo.fields) {
257
- if (!Object.hasOwn(currentTableDef, fieldItem.fieldName)) {
258
- continue;
259
- }
260
-
261
- delete currentTableDef[fieldItem.fieldName];
262
- removedFieldCount = removedFieldCount + 1;
263
- tableRemovedFieldCount = tableRemovedFieldCount + 1;
264
- }
265
-
266
- if (tableRemovedFieldCount <= 0) {
267
- continue;
268
- }
269
-
270
- await Bun.write(targetFilePath, `${JSON.stringify(sortSyncDbObjectKeys(currentTableDef), null, 4)}\n`);
271
- printSyncDbProcessLog(`已删除多余字段映射 ${targetFilePath},删除字段数量=${tableRemovedFieldCount}`);
272
- }
273
-
274
- return {
275
- createdTableFileCount: createdTableFileCount,
276
- appendedFieldCount: appendedFieldCount,
277
- removedFieldCount: removedFieldCount
278
- };
279
- }
@@ -1,113 +0,0 @@
1
- import { DECIMAL_KIND_TYPES, ENUM_KIND_TYPES, FLOAT_KIND_TYPES, INT_KIND_TYPES, JSON_KIND_TYPES, STRING_KIND_TYPES, TEXT_KIND_TYPES } from "#befly/configs/constConfig.js";
2
- import { isNonEmptyString, isNumber } from "#befly/utils/is.js";
3
- import { camelCase, snakeCase } from "#befly/utils/util.js";
4
-
5
- function resolveSyncDbEnumInput(columnType) {
6
- const matched = /^enum\((.*)\)$/.exec(columnType);
7
- if (!matched || !matched[1]) {
8
- return "";
9
- }
10
-
11
- const values = [];
12
- const enumValueRegexp = /'((?:[^'\\]|\\.)*)'/g;
13
-
14
- let execResult = enumValueRegexp.exec(matched[1]);
15
- while (execResult) {
16
- const decodedValue = String(execResult[1]).replaceAll("\\'", "'");
17
- values.push(decodedValue);
18
- execResult = enumValueRegexp.exec(matched[1]);
19
- }
20
-
21
- if (values.length === 0) {
22
- return "";
23
- }
24
-
25
- return values.join("|");
26
- }
27
-
28
- function resolveSyncDbInputByColumn(columnMeta) {
29
- const dataType = String(columnMeta.dataType || "").toLowerCase();
30
- const columnType = String(columnMeta.columnType || "").toLowerCase();
31
-
32
- if (ENUM_KIND_TYPES.includes(dataType)) {
33
- const enumInput = resolveSyncDbEnumInput(columnType);
34
- if (isNonEmptyString(enumInput)) {
35
- return enumInput;
36
- }
37
- return "string";
38
- }
39
-
40
- if (JSON_KIND_TYPES.includes(dataType)) {
41
- return "json";
42
- }
43
-
44
- if (INT_KIND_TYPES.includes(dataType)) {
45
- return "integer";
46
- }
47
-
48
- if (DECIMAL_KIND_TYPES.includes(dataType) || FLOAT_KIND_TYPES.includes(dataType)) {
49
- return "number";
50
- }
51
-
52
- if (STRING_KIND_TYPES.includes(dataType) || TEXT_KIND_TYPES.includes(dataType)) {
53
- if (dataType === "char") {
54
- return "char";
55
- }
56
- return "string";
57
- }
58
-
59
- if (dataType.includes("date") || dataType.includes("time") || dataType === "year") {
60
- return "string";
61
- }
62
-
63
- if (dataType === "bit" || dataType === "boolean") {
64
- return "integer";
65
- }
66
-
67
- return "string";
68
- }
69
-
70
- function resolveSyncDbMaxByColumn(columnMeta) {
71
- const dataType = String(columnMeta.dataType || "").toLowerCase();
72
-
73
- if (!(STRING_KIND_TYPES.includes(dataType) || TEXT_KIND_TYPES.includes(dataType))) {
74
- return null;
75
- }
76
-
77
- if (!isNumber(columnMeta.charLength)) {
78
- return null;
79
- }
80
-
81
- if (!Number.isFinite(columnMeta.charLength)) {
82
- return null;
83
- }
84
-
85
- if (columnMeta.charLength <= 0 || columnMeta.charLength > Number.MAX_SAFE_INTEGER) {
86
- return null;
87
- }
88
-
89
- return Math.floor(columnMeta.charLength);
90
- }
91
-
92
- export function toSyncDbFieldDef(columnMeta) {
93
- const camelFieldName = camelCase(columnMeta.columnName);
94
- const columnName = String(columnMeta.columnName || "");
95
- const fieldName = snakeCase(camelFieldName) === columnName ? camelFieldName : columnName;
96
- const fieldDisplayName = isNonEmptyString(columnMeta.columnComment) ? String(columnMeta.columnComment).trim() : fieldName;
97
- const fieldInput = resolveSyncDbInputByColumn(columnMeta);
98
- const fieldMax = resolveSyncDbMaxByColumn(columnMeta);
99
-
100
- const fieldDef = {
101
- name: fieldDisplayName,
102
- input: fieldInput
103
- };
104
-
105
- if (isNumber(fieldMax)) {
106
- fieldDef.max = fieldMax;
107
- }
108
-
109
- return {
110
- fieldName: fieldName,
111
- fieldDef: fieldDef
112
- };
113
- }
package/sql/befly.sql DELETED
@@ -1,271 +0,0 @@
1
- CREATE TABLE IF NOT EXISTS `befly_admin` (
2
- `id` BIGINT NOT NULL,
3
- `nickname` VARCHAR(50) NOT NULL DEFAULT '',
4
- `username` VARCHAR(30) NOT NULL DEFAULT '',
5
- `password` VARCHAR(500) NOT NULL DEFAULT '',
6
- `email` VARCHAR(100) NOT NULL DEFAULT '',
7
- `phone` VARCHAR(20) NOT NULL DEFAULT '',
8
- `avatar` VARCHAR(500) NOT NULL DEFAULT '',
9
- `role_code` VARCHAR(50) NOT NULL DEFAULT '',
10
- `role_type` VARCHAR(5) NOT NULL DEFAULT 'user',
11
- `last_login_time` BIGINT NOT NULL DEFAULT 0,
12
- `last_login_ip` VARCHAR(50) NOT NULL DEFAULT '',
13
- `state` TINYINT NOT NULL DEFAULT 1,
14
- `created_at` BIGINT NOT NULL DEFAULT 0,
15
- `updated_at` BIGINT NOT NULL DEFAULT 0,
16
- `deleted_at` BIGINT NULL DEFAULT NULL,
17
- PRIMARY KEY (`id`)
18
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
19
-
20
- CREATE TABLE IF NOT EXISTS `befly_api` (
21
- `id` BIGINT NOT NULL,
22
- `name` VARCHAR(100) NOT NULL DEFAULT '',
23
- `auth` VARCHAR(200) NOT NULL DEFAULT '',
24
- `path` VARCHAR(200) NOT NULL DEFAULT '',
25
- `parent_path` VARCHAR(200) NOT NULL DEFAULT '',
26
- `method` VARCHAR(20) NOT NULL DEFAULT '',
27
- `state` TINYINT NOT NULL DEFAULT 1,
28
- `created_at` BIGINT NOT NULL DEFAULT 0,
29
- `updated_at` BIGINT NOT NULL DEFAULT 0,
30
- `deleted_at` BIGINT NULL DEFAULT NULL,
31
- PRIMARY KEY (`id`)
32
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
33
-
34
- CREATE TABLE IF NOT EXISTS `befly_daily_report` (
35
- `id` BIGINT NOT NULL AUTO_INCREMENT,
36
- `report_time` BIGINT NOT NULL DEFAULT 0,
37
- `report_date` INT NOT NULL DEFAULT 0,
38
- `member_type` VARCHAR(6) NOT NULL DEFAULT '',
39
- `member` VARCHAR(500) NOT NULL DEFAULT '',
40
- `user_id` BIGINT NOT NULL DEFAULT 0,
41
- `client_id` VARCHAR(120) NOT NULL DEFAULT '',
42
- `ip` VARCHAR(50) NOT NULL DEFAULT '',
43
- `client_type` VARCHAR(20) NOT NULL DEFAULT '',
44
- `product_name` VARCHAR(100) NOT NULL DEFAULT '',
45
- `product_code` VARCHAR(100) NOT NULL DEFAULT '',
46
- `product_version` VARCHAR(50) NOT NULL DEFAULT '',
47
- `client_version` VARCHAR(100) NOT NULL DEFAULT '',
48
- `os` VARCHAR(100) NOT NULL DEFAULT '',
49
- `system` VARCHAR(100) NOT NULL DEFAULT '',
50
- `brand` VARCHAR(100) NOT NULL DEFAULT '',
51
- `model` VARCHAR(100) NOT NULL DEFAULT '',
52
- `state` TINYINT NOT NULL DEFAULT 1,
53
- `created_at` BIGINT NOT NULL DEFAULT 0,
54
- `updated_at` BIGINT NOT NULL DEFAULT 0,
55
- `deleted_at` BIGINT NULL DEFAULT NULL,
56
- PRIMARY KEY (`id`),
57
- UNIQUE KEY `uk_befly_daily_report_report_date_member` (`report_date`, `member`),
58
- KEY `idx_befly_daily_report_report_date_product_code` (`report_date`, `product_code`)
59
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
60
-
61
- CREATE TABLE IF NOT EXISTS `befly_dict` (
62
- `id` BIGINT NOT NULL,
63
- `type_code` VARCHAR(50) NOT NULL DEFAULT '',
64
- `key` VARCHAR(50) NOT NULL DEFAULT '',
65
- `label` VARCHAR(100) NOT NULL DEFAULT '',
66
- `sort` INT NOT NULL DEFAULT 0,
67
- `remark` VARCHAR(200) NOT NULL DEFAULT '',
68
- `state` TINYINT NOT NULL DEFAULT 1,
69
- `created_at` BIGINT NOT NULL DEFAULT 0,
70
- `updated_at` BIGINT NOT NULL DEFAULT 0,
71
- `deleted_at` BIGINT NULL DEFAULT NULL,
72
- PRIMARY KEY (`id`)
73
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
74
-
75
- CREATE TABLE IF NOT EXISTS `befly_dict_type` (
76
- `id` BIGINT NOT NULL,
77
- `code` VARCHAR(50) NOT NULL DEFAULT '',
78
- `name` VARCHAR(50) NOT NULL DEFAULT '',
79
- `description` VARCHAR(200) NOT NULL DEFAULT '',
80
- `sort` INT NOT NULL DEFAULT 0,
81
- `state` TINYINT NOT NULL DEFAULT 1,
82
- `created_at` BIGINT NOT NULL DEFAULT 0,
83
- `updated_at` BIGINT NOT NULL DEFAULT 0,
84
- `deleted_at` BIGINT NULL DEFAULT NULL,
85
- PRIMARY KEY (`id`)
86
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
87
-
88
- CREATE TABLE IF NOT EXISTS `befly_email_log` (
89
- `id` BIGINT NOT NULL,
90
- `admin_id` BIGINT NOT NULL DEFAULT 0,
91
- `username` VARCHAR(100) NOT NULL DEFAULT '',
92
- `nickname` VARCHAR(100) NOT NULL DEFAULT '',
93
- `to_email` VARCHAR(200) NOT NULL DEFAULT '',
94
- `subject` VARCHAR(200) NOT NULL DEFAULT '',
95
- `content` TEXT NULL,
96
- `cc_email` VARCHAR(500) NOT NULL DEFAULT '',
97
- `bcc_email` VARCHAR(500) NOT NULL DEFAULT '',
98
- `send_time` BIGINT NOT NULL DEFAULT 0,
99
- `send_result` TINYINT NOT NULL DEFAULT 0,
100
- `message_id` VARCHAR(200) NOT NULL DEFAULT '',
101
- `fail_reason` VARCHAR(500) NOT NULL DEFAULT '',
102
- `state` TINYINT NOT NULL DEFAULT 1,
103
- `created_at` BIGINT NOT NULL DEFAULT 0,
104
- `updated_at` BIGINT NOT NULL DEFAULT 0,
105
- `deleted_at` BIGINT NULL DEFAULT NULL,
106
- PRIMARY KEY (`id`)
107
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
108
-
109
- CREATE TABLE IF NOT EXISTS `befly_file` (
110
- `id` BIGINT NOT NULL,
111
- `user_id` BIGINT NOT NULL DEFAULT 0,
112
- `file_path` VARCHAR(500) NOT NULL DEFAULT '',
113
- `url` VARCHAR(1000) NOT NULL DEFAULT '',
114
- `is_image` TINYINT NOT NULL DEFAULT 0,
115
- `file_type` VARCHAR(20) NOT NULL DEFAULT '',
116
- `file_size` BIGINT NOT NULL DEFAULT 0,
117
- `file_key` VARCHAR(100) NOT NULL DEFAULT '',
118
- `file_ext` VARCHAR(20) NOT NULL DEFAULT '',
119
- `file_name` VARCHAR(200) NOT NULL DEFAULT '',
120
- `state` TINYINT NOT NULL DEFAULT 1,
121
- `created_at` BIGINT NOT NULL DEFAULT 0,
122
- `updated_at` BIGINT NOT NULL DEFAULT 0,
123
- `deleted_at` BIGINT NULL DEFAULT NULL,
124
- PRIMARY KEY (`id`),
125
- KEY `idx_befly_file_user_id` (`user_id`),
126
- KEY `idx_befly_file_is_image` (`is_image`)
127
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
128
-
129
- CREATE TABLE IF NOT EXISTS `befly_login_log` (
130
- `id` BIGINT NOT NULL AUTO_INCREMENT,
131
- `admin_id` BIGINT NOT NULL DEFAULT 0,
132
- `username` VARCHAR(50) NOT NULL DEFAULT '',
133
- `nickname` VARCHAR(50) NOT NULL DEFAULT '',
134
- `ip` VARCHAR(50) NOT NULL DEFAULT '',
135
- `client_type` VARCHAR(20) NOT NULL DEFAULT '',
136
- `product_name` VARCHAR(100) NOT NULL DEFAULT '',
137
- `product_code` VARCHAR(100) NOT NULL DEFAULT '',
138
- `product_version` VARCHAR(50) NOT NULL DEFAULT '',
139
- `client_version` VARCHAR(100) NOT NULL DEFAULT '',
140
- `os` VARCHAR(100) NOT NULL DEFAULT '',
141
- `system` VARCHAR(100) NOT NULL DEFAULT '',
142
- `brand` VARCHAR(100) NOT NULL DEFAULT '',
143
- `model` VARCHAR(100) NOT NULL DEFAULT '',
144
- `login_time` BIGINT NOT NULL DEFAULT 0,
145
- `login_result` TINYINT NOT NULL DEFAULT 0,
146
- `fail_reason` VARCHAR(200) NOT NULL DEFAULT '',
147
- `state` TINYINT NOT NULL DEFAULT 1,
148
- `created_at` BIGINT NOT NULL DEFAULT 0,
149
- `updated_at` BIGINT NOT NULL DEFAULT 0,
150
- `deleted_at` BIGINT NULL DEFAULT NULL,
151
- PRIMARY KEY (`id`),
152
- KEY `idx_befly_login_log_login_time` (`login_time`)
153
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
154
-
155
- CREATE TABLE IF NOT EXISTS `befly_menu` (
156
- `id` BIGINT NOT NULL,
157
- `name` VARCHAR(50) NOT NULL DEFAULT '',
158
- `path` VARCHAR(150) NOT NULL DEFAULT '',
159
- `sort` INT NOT NULL DEFAULT 0,
160
- `parent_path` VARCHAR(200) NOT NULL DEFAULT '',
161
- `state` TINYINT NOT NULL DEFAULT 1,
162
- `created_at` BIGINT NOT NULL DEFAULT 0,
163
- `updated_at` BIGINT NOT NULL DEFAULT 0,
164
- `deleted_at` BIGINT NULL DEFAULT NULL,
165
- PRIMARY KEY (`id`)
166
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
167
-
168
- CREATE TABLE IF NOT EXISTS `befly_operate_log` (
169
- `id` BIGINT NOT NULL,
170
- `admin_id` BIGINT NOT NULL DEFAULT 0,
171
- `username` VARCHAR(50) NOT NULL DEFAULT '',
172
- `nickname` VARCHAR(50) NOT NULL DEFAULT '',
173
- `ip` VARCHAR(50) NOT NULL DEFAULT '',
174
- `module` VARCHAR(50) NOT NULL DEFAULT '',
175
- `action` VARCHAR(50) NOT NULL DEFAULT '',
176
- `method` VARCHAR(10) NOT NULL DEFAULT '',
177
- `path` VARCHAR(200) NOT NULL DEFAULT '',
178
- `params` TEXT NULL,
179
- `result` TINYINT NOT NULL DEFAULT 0,
180
- `response` TEXT NULL,
181
- `duration` BIGINT NOT NULL DEFAULT 0,
182
- `operate_time` BIGINT NOT NULL DEFAULT 0,
183
- `remark` VARCHAR(500) NOT NULL DEFAULT '',
184
- `state` TINYINT NOT NULL DEFAULT 1,
185
- `created_at` BIGINT NOT NULL DEFAULT 0,
186
- `updated_at` BIGINT NOT NULL DEFAULT 0,
187
- `deleted_at` BIGINT NULL DEFAULT NULL,
188
- PRIMARY KEY (`id`)
189
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
190
-
191
- CREATE TABLE IF NOT EXISTS `befly_role` (
192
- `id` BIGINT NOT NULL,
193
- `name` VARCHAR(50) NOT NULL DEFAULT '',
194
- `code` VARCHAR(50) NOT NULL DEFAULT '',
195
- `description` VARCHAR(200) NOT NULL DEFAULT '',
196
- `menus` JSON NULL,
197
- `apis` JSON NULL,
198
- `sort` INT NOT NULL DEFAULT 0,
199
- `state` TINYINT NOT NULL DEFAULT 1,
200
- `created_at` BIGINT NOT NULL DEFAULT 0,
201
- `updated_at` BIGINT NOT NULL DEFAULT 0,
202
- `deleted_at` BIGINT NULL DEFAULT NULL,
203
- PRIMARY KEY (`id`)
204
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
205
-
206
- CREATE TABLE IF NOT EXISTS `befly_sys_config` (
207
- `id` BIGINT NOT NULL,
208
- `name` VARCHAR(50) NOT NULL DEFAULT '',
209
- `code` VARCHAR(100) NOT NULL DEFAULT '',
210
- `value` TEXT NULL,
211
- `value_type` VARCHAR(20) NOT NULL DEFAULT '',
212
- `group` VARCHAR(50) NOT NULL DEFAULT '',
213
- `sort` INT NOT NULL DEFAULT 0,
214
- `is_system` TINYINT NOT NULL DEFAULT 0,
215
- `description` VARCHAR(500) NOT NULL DEFAULT '',
216
- `state` TINYINT NOT NULL DEFAULT 1,
217
- `created_at` BIGINT NOT NULL DEFAULT 0,
218
- `updated_at` BIGINT NOT NULL DEFAULT 0,
219
- `deleted_at` BIGINT NULL DEFAULT NULL,
220
- PRIMARY KEY (`id`)
221
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
222
-
223
- CREATE TABLE IF NOT EXISTS `befly_error_report` (
224
- `id` BIGINT NOT NULL AUTO_INCREMENT,
225
- `report_time` BIGINT NOT NULL DEFAULT 0,
226
- `first_report_time` BIGINT NOT NULL DEFAULT 0,
227
- `last_report_time` BIGINT NOT NULL DEFAULT 0,
228
- `bucket_time` BIGINT NOT NULL DEFAULT 0,
229
- `bucket_date` INT NOT NULL DEFAULT 0,
230
- `hit_count` BIGINT NOT NULL DEFAULT 1,
231
- `client_type` VARCHAR(20) NOT NULL DEFAULT '',
232
- `client_id` VARCHAR(120) NOT NULL DEFAULT '',
233
- `member_type` VARCHAR(6) NOT NULL DEFAULT '',
234
- `member` VARCHAR(200) NOT NULL DEFAULT '',
235
- `user_id` BIGINT NULL DEFAULT NULL,
236
- `ip` VARCHAR(50) NULL DEFAULT NULL,
237
- `product_name` VARCHAR(100) NOT NULL DEFAULT '',
238
- `product_code` VARCHAR(100) NOT NULL DEFAULT '',
239
- `product_version` VARCHAR(100) NOT NULL DEFAULT '',
240
- `page_path` VARCHAR(200) NOT NULL DEFAULT '',
241
- `page_name` VARCHAR(100) NOT NULL DEFAULT '',
242
- `error_type` VARCHAR(50) NOT NULL DEFAULT '',
243
- `message` VARCHAR(500) NOT NULL DEFAULT '',
244
- `extracted_message` VARCHAR(200) NOT NULL DEFAULT '',
245
- `detail` TEXT NULL,
246
- `state` TINYINT NOT NULL DEFAULT 1,
247
- `created_at` BIGINT NOT NULL DEFAULT 0,
248
- `updated_at` BIGINT NOT NULL DEFAULT 0,
249
- `deleted_at` BIGINT NULL DEFAULT NULL,
250
- PRIMARY KEY (`id`),
251
- KEY `idx_befly_error_report_time` (`report_time`),
252
- KEY `idx_befly_error_report_bucket_date` (`bucket_date`),
253
- UNIQUE KEY `idx_befly_error_report_unique` (`bucket_date`, `error_type`, `extracted_message`, `product_code`, `member`),
254
- KEY `idx_befly_error_report_bucket_date_error_type` (`bucket_date`, `error_type`),
255
- KEY `idx_befly_error_report_product_code_report_time` (`product_code`, `report_time`),
256
- KEY `idx_befly_error_report_error_type_report_time` (`error_type`, `report_time`)
257
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
258
-
259
- CREATE TABLE IF NOT EXISTS `befly_project` (
260
- `id` BIGINT NOT NULL AUTO_INCREMENT,
261
- `code` VARCHAR(100) NOT NULL DEFAULT '',
262
- `name` VARCHAR(100) NOT NULL DEFAULT '',
263
- `sort` INT NOT NULL DEFAULT 0,
264
- `state` TINYINT NOT NULL DEFAULT 1,
265
- `created_at` BIGINT NOT NULL DEFAULT 0,
266
- `updated_at` BIGINT NOT NULL DEFAULT 0,
267
- `deleted_at` BIGINT NULL DEFAULT NULL,
268
- PRIMARY KEY (`id`),
269
- UNIQUE KEY `uk_befly_project_code` (`code`),
270
- KEY `idx_befly_project_state` (`state`)
271
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
package/utils/email.js DELETED
@@ -1,3 +0,0 @@
1
- export function hasEmailConfig(config) {
2
- return Boolean(String(config?.host || "").trim() && String(config?.user || "").trim() && String(config?.pass || "").trim());
3
- }
@@ -1,22 +0,0 @@
1
- // fieldClear 工具函数实现
2
- // 过滤对象中指定值(如 undefined)的字段,其余字段原样保留
3
-
4
- import { isPlainObject } from "./is.js";
5
-
6
- export function fieldClear(data, options = {}) {
7
- if (!isPlainObject(data)) {
8
- return data;
9
- }
10
-
11
- const { excludeValues } = options;
12
- const result = {};
13
-
14
- for (const [key, value] of Object.entries(data)) {
15
- if (excludeValues && excludeValues.length && excludeValues.includes(value)) {
16
- continue;
17
- }
18
- result[key] = value;
19
- }
20
-
21
- return result;
22
- }