@meadmin/cli 1.0.0
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/dist/commanders/crud.d.ts +2 -0
- package/dist/commanders/crud.js +543 -0
- package/dist/commanders/index.d.ts +2 -0
- package/dist/commanders/index.js +12 -0
- package/dist/commanders/sync.d.ts +2 -0
- package/dist/commanders/sync.js +32 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +12 -0
- package/dist/utils/app.d.ts +5 -0
- package/dist/utils/app.js +12 -0
- package/dist/utils/db.d.ts +1 -0
- package/dist/utils/db.js +8 -0
- package/dist/utils/env.d.ts +1 -0
- package/dist/utils/env.js +20 -0
- package/dist/utils/file.d.ts +13 -0
- package/dist/utils/file.js +24 -0
- package/dist/utils/formatting.d.ts +68 -0
- package/dist/utils/formatting.js +103 -0
- package/dist/utils/log.d.ts +12 -0
- package/dist/utils/log.js +59 -0
- package/package.json +55 -0
- package/template/crud/server/controller/controller.ts.art +124 -0
- package/template/crud/server/dto/create.dto.ts.art +11 -0
- package/template/crud/server/dto/query.dto.ts.art +19 -0
- package/template/crud/server/dto/update.dto.ts.art +11 -0
- package/template/crud/server/service/service.ts.art +220 -0
- package/template/crud/view/api/api.ts.art +120 -0
- package/template/crud/view/api/class.ts.art +2 -0
- package/template/crud/view/api/searchTypes.ts.art +4 -0
- package/template/crud/view/api/type.ts.art +2 -0
- package/template/crud/view/api/valueDefault.ts.art +1 -0
- package/template/crud/view/api/valueType.ts.art +3 -0
- package/template/crud/view/views/components/addOrUp.vue.art +96 -0
- package/template/crud/view/views/components/addOrUpItem.vue.art +26 -0
- package/template/crud/view/views/components/info.vue.art +63 -0
- package/template/crud/view/views/components/rules.ts.art +5 -0
- package/template/crud/view/views/components/rulesList.ts.art +2 -0
- package/template/crud/view/views/dict.ts.art +11 -0
- package/template/crud/view/views/index.vue.art +83 -0
- package/template/crud/view/views/lang/en.json.art +4 -0
- package/template/crud/view/views/searchItem.vue.art +17 -0
- package/template/crud/view/views/tableColum.vue.art +19 -0
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
import { Sequelize } from '@sequelize/core';
|
|
2
|
+
import { getKeyInfo, lowerFirstCase, normalizeToKebabOrSnakeCase, relativePath, resovePath, toHump, upFirstCase } from '../utils/formatting.js';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import { join, resolve } from 'node:path';
|
|
5
|
+
import { getConfig } from '../utils/db.js';
|
|
6
|
+
import { delFileSync, recursionWriteFileSync } from '../utils/file.js';
|
|
7
|
+
import { Log } from '../utils/log.js';
|
|
8
|
+
import template from 'art-template';
|
|
9
|
+
import { getClassMetadata } from '@midwayjs/core';
|
|
10
|
+
import { DECORATORS, DECORATORS_CLASS_METADATA, SwaggerExplorer } from '@midwayjs/swagger';
|
|
11
|
+
import { pathToFileURL } from 'node:url';
|
|
12
|
+
import * as prettier from 'prettier';
|
|
13
|
+
import prettierrc from '../../.prettierrc.cjs';
|
|
14
|
+
import { omit } from 'lodash-es';
|
|
15
|
+
let swaggerSchemas = {};
|
|
16
|
+
let sequelize; //数据库配置
|
|
17
|
+
const tableInfos = {};
|
|
18
|
+
//关闭自动编码
|
|
19
|
+
template.defaults.excape = false;
|
|
20
|
+
template.defaults.minimize = false;
|
|
21
|
+
const include = template.defaults.include;
|
|
22
|
+
template.defaults.include = (...args) => include(...args).trim();
|
|
23
|
+
class MeSwaggerExplorer extends SwaggerExplorer {
|
|
24
|
+
/**
|
|
25
|
+
* 解析 ApiExtraModel
|
|
26
|
+
* @param clzz
|
|
27
|
+
*/
|
|
28
|
+
parseApiExtraModel(clzz) {
|
|
29
|
+
const metaForClass = getClassMetadata(DECORATORS_CLASS_METADATA, clzz) || [];
|
|
30
|
+
const extraModels = metaForClass.filter((item) => item.key === DECORATORS.API_EXTRA_MODEL);
|
|
31
|
+
for (const m of extraModels) {
|
|
32
|
+
if (Array.isArray(m.metadata)) {
|
|
33
|
+
for (const sclz of m.metadata) {
|
|
34
|
+
this.parseClzz(sclz);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
this.parseClzz(m.metadata);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 解析 ApiExtraModel
|
|
44
|
+
* @param clzz
|
|
45
|
+
*/
|
|
46
|
+
parseClzz(clzz) {
|
|
47
|
+
return super.parseClzz(clzz);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 获取schemas对象
|
|
52
|
+
* @param documentBuilder
|
|
53
|
+
* @param entitySchemaName
|
|
54
|
+
* @returns
|
|
55
|
+
*/
|
|
56
|
+
const getSchemas = (documentBuilder, entitySchemaName) => {
|
|
57
|
+
const swaggerSchemas = {};
|
|
58
|
+
const setSchemas = (schemaName) => {
|
|
59
|
+
const name = (typeof schemaName === 'function' ? schemaName() : schemaName).replace('#/components/schemas/', '');
|
|
60
|
+
if (swaggerSchemas[name]) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
swaggerSchemas[name] = documentBuilder.getSchema(name);
|
|
64
|
+
const setItem = (item) => {
|
|
65
|
+
if (item['$ref']) {
|
|
66
|
+
let ref = item['$ref'];
|
|
67
|
+
if (typeof item['$ref'] === 'function') {
|
|
68
|
+
ref = ref();
|
|
69
|
+
}
|
|
70
|
+
if (!['#/components/schemas/SystemAdmin', '#/components/schemas/File'].includes(ref)) {
|
|
71
|
+
setSchemas(ref);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
item['$ref'] = item['$ref'].replace('SystemAdmin', 'SystemAdminInfo').replace('File', 'FileInfo');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (item.items) {
|
|
78
|
+
setItem(item.items);
|
|
79
|
+
}
|
|
80
|
+
if (item.properties) {
|
|
81
|
+
setProperties(item.properties);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const setProperties = (properties) => {
|
|
85
|
+
//设置变量顺序,放到到末尾
|
|
86
|
+
['createdAt', 'updatedAt'].forEach((key) => {
|
|
87
|
+
if (properties[key]) {
|
|
88
|
+
const temp = properties[key];
|
|
89
|
+
delete properties[key];
|
|
90
|
+
properties[key] = temp;
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
Object.keys(properties).forEach((key) => {
|
|
94
|
+
setItem(properties[key]);
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
if (swaggerSchemas[name].properties) {
|
|
98
|
+
setProperties(swaggerSchemas[name].properties);
|
|
99
|
+
}
|
|
100
|
+
if (swaggerSchemas[name].items) {
|
|
101
|
+
setItem(swaggerSchemas[name].items);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
setSchemas(entitySchemaName);
|
|
105
|
+
return swaggerSchemas;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* 获取数据库信息
|
|
109
|
+
* @param entityName 实例className
|
|
110
|
+
* @param noBelongs 不查询belongs关联
|
|
111
|
+
* @returns
|
|
112
|
+
*/
|
|
113
|
+
function tableInfo(entityName, noBelongs = false) {
|
|
114
|
+
if (tableInfos[entityName]) {
|
|
115
|
+
return tableInfos[entityName];
|
|
116
|
+
}
|
|
117
|
+
const modelDefinition = sequelize.models.get(entityName)?.modelDefinition;
|
|
118
|
+
if (!modelDefinition) {
|
|
119
|
+
tableInfos[entityName] = {
|
|
120
|
+
tableComment: '',
|
|
121
|
+
pk: [],
|
|
122
|
+
deletedAt: null,
|
|
123
|
+
attributes: {},
|
|
124
|
+
autoAttributes: [],
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
let tableComment = modelDefinition.options.comment;
|
|
129
|
+
if (tableComment.endsWith('表')) {
|
|
130
|
+
tableComment = tableComment.slice(0, -1);
|
|
131
|
+
}
|
|
132
|
+
const autoAttributes = [...modelDefinition.primaryKeysAttributeNames, ...modelDefinition.readOnlyAttributeNames];
|
|
133
|
+
['deletedVersion', 'createdAdminId', 'updatedAdminId', 'createdUserId', 'updatedUserId'].forEach((attribute) => {
|
|
134
|
+
if (modelDefinition.attributes.has(attribute)) {
|
|
135
|
+
autoAttributes.push(attribute);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
if (swaggerSchemas[entityName]?.properties?.['createdAdmin']) {
|
|
139
|
+
autoAttributes.push('createdAdmin');
|
|
140
|
+
}
|
|
141
|
+
if (swaggerSchemas[entityName]?.properties?.['updatedAdmin']) {
|
|
142
|
+
autoAttributes.push('updatedAdmin');
|
|
143
|
+
}
|
|
144
|
+
if (swaggerSchemas[entityName]?.properties?.['createdUser']) {
|
|
145
|
+
autoAttributes.push('createdUser');
|
|
146
|
+
}
|
|
147
|
+
if (swaggerSchemas[entityName]?.properties?.['updatedUser']) {
|
|
148
|
+
autoAttributes.push('updatedUser');
|
|
149
|
+
}
|
|
150
|
+
const belongs = [];
|
|
151
|
+
const belongsTo = [];
|
|
152
|
+
const belongsToEntity = {};
|
|
153
|
+
const belongsToMany = [];
|
|
154
|
+
const belongsToManyEntity = {};
|
|
155
|
+
if (!noBelongs) {
|
|
156
|
+
Object.keys(modelDefinition.associations).forEach(key => {
|
|
157
|
+
if (['createdAdmin', 'updatedAdmin', 'createdUser', 'updatedUser'].includes(key)) {
|
|
158
|
+
belongs.push(key);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
if (modelDefinition.associations[key].isSelfAssociation) { //TODO::自关联暂不支持
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if ('BelongsTo' === modelDefinition.associations[key].associationType) {
|
|
165
|
+
belongs.push(key);
|
|
166
|
+
belongsTo.push(key);
|
|
167
|
+
belongsToEntity[key] = tableInfo(modelDefinition.associations[key].target.name, true);
|
|
168
|
+
}
|
|
169
|
+
if ('BelongsToMany' === modelDefinition.associations[key].associationType) {
|
|
170
|
+
belongs.push(key);
|
|
171
|
+
belongsToMany.push(key);
|
|
172
|
+
belongsToManyEntity[key] = tableInfo(modelDefinition.associations[key].target.name, true);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
const nameKeys = []; //可快捷查询的name
|
|
177
|
+
for (const key of modelDefinition.attributes.keys()) {
|
|
178
|
+
if ((key.endsWith('name') || key.endsWith('Name')) && ['VARCHAR', 'CHAR', 'STRING'].some(v => modelDefinition.attributes.get(key).type.toString().includes(v))) {
|
|
179
|
+
nameKeys.push(key);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
tableInfos[entityName] = {
|
|
183
|
+
entityName,
|
|
184
|
+
entityFileName: lowerFirstCase(entityName),
|
|
185
|
+
tableComment,
|
|
186
|
+
pk: Array.from(modelDefinition.primaryKeysAttributeNames),
|
|
187
|
+
deletedAt: modelDefinition.options.deletedAt,
|
|
188
|
+
attributes: modelDefinition.attributes,
|
|
189
|
+
autoAttributes,
|
|
190
|
+
belongsTo,
|
|
191
|
+
belongsToEntity,
|
|
192
|
+
belongsToMany,
|
|
193
|
+
belongsToManyEntity,
|
|
194
|
+
belongs: belongs,
|
|
195
|
+
nameKeys,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
return tableInfos[entityName];
|
|
199
|
+
}
|
|
200
|
+
template.defaults.imports.tableInfo = tableInfo;
|
|
201
|
+
template.defaults.imports.upFirstCase = upFirstCase;
|
|
202
|
+
template.defaults.imports.lowerFirstCase = lowerFirstCase;
|
|
203
|
+
template.defaults.imports.objectKeys = Object.keys;
|
|
204
|
+
template.defaults.imports.objectValues = Object.values;
|
|
205
|
+
template.defaults.imports.leftTag = () => '{{';
|
|
206
|
+
template.defaults.imports.rightTag = () => '}}';
|
|
207
|
+
template.defaults.imports.getKeyInfo = getKeyInfo;
|
|
208
|
+
template.defaults.imports.langName = (name) => upFirstCase(normalizeToKebabOrSnakeCase(name, ' ').replace(' at', ' time')); //字段名转义为语言
|
|
209
|
+
// template.defaults.imports.log = console.log;//调试打印时放开
|
|
210
|
+
//需要写入的文件地址集(以.js结尾)
|
|
211
|
+
const writeServerFiles = {
|
|
212
|
+
entityPath: '',
|
|
213
|
+
createDtoPath: '',
|
|
214
|
+
updateDtoPath: '',
|
|
215
|
+
queryDtoPath: '',
|
|
216
|
+
servicePath: '',
|
|
217
|
+
controllerPath: '',
|
|
218
|
+
baseControllerPath: '',
|
|
219
|
+
};
|
|
220
|
+
const noWriteKey = ['entityPath', 'baseControllerPath'];
|
|
221
|
+
//需要写入的前端文件地址集
|
|
222
|
+
const writeViewFiles = {
|
|
223
|
+
apiPath: '',
|
|
224
|
+
listPath: '',
|
|
225
|
+
dictPath: '',
|
|
226
|
+
langEnPath: '',
|
|
227
|
+
info: '',
|
|
228
|
+
addOrUp: '',
|
|
229
|
+
};
|
|
230
|
+
const replaceNames = {
|
|
231
|
+
name: '',
|
|
232
|
+
Name: '',
|
|
233
|
+
createDto: '',
|
|
234
|
+
CreateDto: '',
|
|
235
|
+
updateDto: '',
|
|
236
|
+
UpdateDto: '',
|
|
237
|
+
queryDto: '',
|
|
238
|
+
QueryDto: '',
|
|
239
|
+
service: '',
|
|
240
|
+
Service: '',
|
|
241
|
+
controller: '',
|
|
242
|
+
Controller: '',
|
|
243
|
+
controllerPath: '',
|
|
244
|
+
namePath: '',
|
|
245
|
+
roleName: '',
|
|
246
|
+
};
|
|
247
|
+
//是否添加权限校验
|
|
248
|
+
let adminPermission = false;
|
|
249
|
+
/**
|
|
250
|
+
* 监测路径,如果待写入文件已存在则返回对应数组,否则返回true
|
|
251
|
+
* @returns Boolean|Array<string>
|
|
252
|
+
*/
|
|
253
|
+
function checkPaths() {
|
|
254
|
+
const existsFiles = [];
|
|
255
|
+
Object.keys(writeServerFiles).forEach((key) => {
|
|
256
|
+
const path = writeServerFiles[key].endsWith('.js') ? writeServerFiles[key].replace('.js', '.ts') : writeServerFiles[key];
|
|
257
|
+
if (!noWriteKey.includes(key) && existsSync(path)) {
|
|
258
|
+
existsFiles.push(path);
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
Object.keys(writeViewFiles).forEach((key) => {
|
|
262
|
+
const path = writeViewFiles[key].endsWith('.js') ? writeViewFiles[key].replace('.js', '.ts') : writeViewFiles[key];
|
|
263
|
+
if (!noWriteKey.includes(key) && existsSync(path)) {
|
|
264
|
+
existsFiles.push(path);
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
return existsFiles.length === 0 ? true : existsFiles;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* 替换模板内容并写入
|
|
271
|
+
* @param templatePath 模板文件路径
|
|
272
|
+
* @param toPath 写入文件路径
|
|
273
|
+
* @returns
|
|
274
|
+
*/
|
|
275
|
+
async function writeContent(templatePath, toPath, writeType) {
|
|
276
|
+
const paths = writeType === 'api' ? { ...writeServerFiles } : { ...writeViewFiles };
|
|
277
|
+
Object.keys(paths).forEach((key) => {
|
|
278
|
+
paths[key] = relativePath(toPath, paths[key], []);
|
|
279
|
+
});
|
|
280
|
+
const str = template(resolve(import.meta.dirname, templatePath), {
|
|
281
|
+
adminPermission,
|
|
282
|
+
replaceNames,
|
|
283
|
+
paths,
|
|
284
|
+
swaggerSchemas,
|
|
285
|
+
entitySchema: swaggerSchemas[replaceNames.Name],
|
|
286
|
+
entity: tableInfo(replaceNames.Name),
|
|
287
|
+
});
|
|
288
|
+
if (str.trim()) {
|
|
289
|
+
recursionWriteFileSync(toPath.endsWith('.js') ? toPath.replace('.js', '.ts') : toPath, await prettier.format(str, {
|
|
290
|
+
...prettierrc,
|
|
291
|
+
filepath: toPath.endsWith('.js') ? toPath.replace('.js', '.ts') : toPath,
|
|
292
|
+
}), { flag: 'w' });
|
|
293
|
+
Log.success((toPath.endsWith('.js') ? toPath.replace('.js', '.ts') : toPath) + ' 写入完成');
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
//写入后端文件
|
|
297
|
+
function writeServer() {
|
|
298
|
+
//写入后端文件
|
|
299
|
+
return Promise.all([
|
|
300
|
+
writeContent('../../template/crud/server/dto/create.dto.ts.art', writeServerFiles.createDtoPath, 'api'),
|
|
301
|
+
writeContent('../../template/crud/server/dto/update.dto.ts.art', writeServerFiles.updateDtoPath, 'api'),
|
|
302
|
+
writeContent('../../template/crud/server/dto/query.dto.ts.art', writeServerFiles.queryDtoPath, 'api'),
|
|
303
|
+
writeContent('../../template/crud/server/service/service.ts.art', writeServerFiles.servicePath, 'api'),
|
|
304
|
+
writeContent('../../template/crud/server/controller/controller.ts.art', writeServerFiles.controllerPath, 'api'),
|
|
305
|
+
]);
|
|
306
|
+
}
|
|
307
|
+
//写入前端接口文件
|
|
308
|
+
function writeViewApi() {
|
|
309
|
+
return writeContent('../../template/crud/view/api/api.ts.art', writeViewFiles.apiPath, 'view');
|
|
310
|
+
}
|
|
311
|
+
//写入前端view文件
|
|
312
|
+
function writeViews() {
|
|
313
|
+
return Promise.all([
|
|
314
|
+
writeContent('../../template/crud/view/views/lang/en.json.art', writeViewFiles.langEnPath, 'view'),
|
|
315
|
+
writeContent('../../template/crud/view/views/dict.ts.art', writeViewFiles.dictPath, 'view'),
|
|
316
|
+
writeContent('../../template/crud/view/views/index.vue.art', writeViewFiles.listPath, 'view'),
|
|
317
|
+
writeContent('../../template/crud/view/views/components/info.vue.art', writeViewFiles.info, 'view'),
|
|
318
|
+
writeContent('../../template/crud/view/views/components/addOrUp.vue.art', writeViewFiles.addOrUp, 'view'),
|
|
319
|
+
]);
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* 设置菜单及对应语言包内容
|
|
323
|
+
* @param model
|
|
324
|
+
* @returns
|
|
325
|
+
*/
|
|
326
|
+
async function setMenu(model, namePath, sequelize) {
|
|
327
|
+
let parentId = null;
|
|
328
|
+
let paths = [];
|
|
329
|
+
const langFilePath = resovePath(`view/${model}/src/locales/lang/en/menu`, ['.json']);
|
|
330
|
+
const lang = await import(pathToFileURL(langFilePath).href, { with: { type: 'json' } });
|
|
331
|
+
const comments = tableInfo(replaceNames.Name).tableComment.split('_');
|
|
332
|
+
const menuNames = namePath.split('/').filter(v => v);
|
|
333
|
+
for (let i = 0; i < menuNames.length; i++) {
|
|
334
|
+
const menu = menuNames[i];
|
|
335
|
+
paths.push(menu);
|
|
336
|
+
let menuTitle = upFirstCase(toHump(menu));
|
|
337
|
+
if (comments.length === menuNames.length) {
|
|
338
|
+
lang.default[comments[i]] = menuTitle;
|
|
339
|
+
menuTitle = comments[i];
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
if (i === (menuNames.length - 1)) {
|
|
343
|
+
lang.default[tableInfo(replaceNames.Name).tableComment] = menuTitle;
|
|
344
|
+
menuTitle = tableInfo(replaceNames.Name).tableComment;
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
lang.default[menuTitle] = menuTitle;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
if (i < (menuNames.length - 1)) {
|
|
351
|
+
const [menuEntity] = await sequelize.models.get('SystemMenu').findOrCreate({
|
|
352
|
+
where: { rule: paths.join('_') },
|
|
353
|
+
defaults: {
|
|
354
|
+
title: menuTitle,
|
|
355
|
+
menuType: 1, //目录
|
|
356
|
+
orderNum: 999,
|
|
357
|
+
path: '/' + paths.join('/'),
|
|
358
|
+
parentId,
|
|
359
|
+
alwaysShow: 1,
|
|
360
|
+
},
|
|
361
|
+
});
|
|
362
|
+
parentId = menuEntity.get('id');
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
const [menuEntity] = await sequelize.models.get('SystemMenu').findOrCreate({
|
|
366
|
+
where: { rule: paths.join('_') },
|
|
367
|
+
defaults: {
|
|
368
|
+
title: menuTitle,
|
|
369
|
+
menuType: 2, //菜单
|
|
370
|
+
orderNum: 999,
|
|
371
|
+
path: '/' + paths.join('/'),
|
|
372
|
+
component: namePath + '/index',
|
|
373
|
+
parentId,
|
|
374
|
+
},
|
|
375
|
+
});
|
|
376
|
+
parentId = menuEntity.get('id');
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
await sequelize.models.get('SystemMenu').findOrCreate({
|
|
380
|
+
where: { rule: paths.join('_') + '_list' },
|
|
381
|
+
defaults: {
|
|
382
|
+
parentId,
|
|
383
|
+
title: '列表',
|
|
384
|
+
menuType: 3, //按钮
|
|
385
|
+
orderNum: 99,
|
|
386
|
+
},
|
|
387
|
+
});
|
|
388
|
+
await sequelize.models.get('SystemMenu').findOrCreate({
|
|
389
|
+
where: { rule: paths.join('_') + '_info' },
|
|
390
|
+
defaults: {
|
|
391
|
+
parentId,
|
|
392
|
+
title: '详情',
|
|
393
|
+
menuType: 3, //按钮
|
|
394
|
+
orderNum: 98,
|
|
395
|
+
},
|
|
396
|
+
});
|
|
397
|
+
await sequelize.models.get('SystemMenu').findOrCreate({
|
|
398
|
+
where: { rule: paths.join('_') + '_add' },
|
|
399
|
+
defaults: {
|
|
400
|
+
parentId,
|
|
401
|
+
title: '新增',
|
|
402
|
+
menuType: 3, //按钮
|
|
403
|
+
orderNum: 97,
|
|
404
|
+
},
|
|
405
|
+
});
|
|
406
|
+
await sequelize.models.get('SystemMenu').findOrCreate({
|
|
407
|
+
where: { rule: paths.join('_') + '_edit' },
|
|
408
|
+
defaults: {
|
|
409
|
+
parentId,
|
|
410
|
+
title: '编辑',
|
|
411
|
+
menuType: 3, //按钮
|
|
412
|
+
orderNum: 96,
|
|
413
|
+
},
|
|
414
|
+
});
|
|
415
|
+
await sequelize.models.get('SystemMenu').findOrCreate({
|
|
416
|
+
where: { rule: paths.join('_') + '_del' },
|
|
417
|
+
defaults: {
|
|
418
|
+
parentId,
|
|
419
|
+
title: '删除',
|
|
420
|
+
menuType: 3, //按钮
|
|
421
|
+
orderNum: 95,
|
|
422
|
+
},
|
|
423
|
+
});
|
|
424
|
+
recursionWriteFileSync(langFilePath, await prettier.format(JSON.stringify(lang.default), {
|
|
425
|
+
...prettierrc,
|
|
426
|
+
filepath: langFilePath,
|
|
427
|
+
}));
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
export const crudInit = async (program) => {
|
|
431
|
+
program
|
|
432
|
+
.command('crud')
|
|
433
|
+
.description('创建crud')
|
|
434
|
+
.argument('<file>', '基于的entity文件地址,如果是相对路径会基于src/entities查找')
|
|
435
|
+
.requiredOption('--model <char>', 'model名称会放到app/{model}下对应的文件夹', 'admin')
|
|
436
|
+
.option('-f, --force', '强制覆盖')
|
|
437
|
+
.option('-n, --name <char>', '使用的数据库配置defaultDataSourceName')
|
|
438
|
+
.option('-d, --dbConfig <char>', '数据库配置文件地址默认为当前目录下dist/config/database.js', join(process.cwd(), 'dist/config/database.js'))
|
|
439
|
+
.option('--del', '删除crud创建的文件')
|
|
440
|
+
.option('--path <char>', '生成的路径,默认根据驼峰转多级路径')
|
|
441
|
+
.option('-c, --controller <char>', '生成的controller路径,默认使用path')
|
|
442
|
+
.option('--menu', '生成菜单')
|
|
443
|
+
.option('--cov, --coverage <char>', '生成代码发覆盖范围:b后端代码、a前端api接口代码、v前端view 代码、p后台权限校验,默认值bavp', 'bavp')
|
|
444
|
+
.action(async (file, options) => {
|
|
445
|
+
sequelize = new Sequelize(await getConfig(options.dbConfig, options.name));
|
|
446
|
+
const noSuffixEntityPath = relativePath('', file, ['.entity', '.ts']);
|
|
447
|
+
const entityFileName = lowerFirstCase(toHump(relativePath('', noSuffixEntityPath, []).split('/').pop()));
|
|
448
|
+
replaceNames.namePath = options.path ? options.path : normalizeToKebabOrSnakeCase(entityFileName, '/');
|
|
449
|
+
replaceNames.namePath = replaceNames.namePath.replaceAll('//', '/');
|
|
450
|
+
if (replaceNames.namePath.endsWith('/')) {
|
|
451
|
+
replaceNames.namePath = replaceNames.namePath.slice(0, -1);
|
|
452
|
+
}
|
|
453
|
+
if (replaceNames.namePath.startsWith('/')) {
|
|
454
|
+
replaceNames.namePath = replaceNames.namePath.slice(1);
|
|
455
|
+
}
|
|
456
|
+
replaceNames.roleName = replaceNames.namePath.split('/').filter(v => v).join('_');
|
|
457
|
+
replaceNames.controllerPath = options.controllerPath ? options.controllerPath : replaceNames.namePath;
|
|
458
|
+
//初始化需要创建的文件路径
|
|
459
|
+
writeServerFiles.entityPath = resovePath(noSuffixEntityPath + '.entity.js', [], process.cwd() + '/src/entities');
|
|
460
|
+
writeServerFiles.baseControllerPath = resovePath(`src/app/${options.model}/controller/base`, ['.controller', '.js']);
|
|
461
|
+
const entity = await import(pathToFileURL(writeServerFiles.entityPath.replace('/src/', '/dist/')).href);
|
|
462
|
+
writeServerFiles.createDtoPath = resovePath(`src/app/${options.model}/dto/${replaceNames.namePath}Create`, ['.dto', '.js']);
|
|
463
|
+
writeServerFiles.updateDtoPath = resovePath(`src/app/${options.model}/dto/${replaceNames.namePath}Update`, ['.dto', '.js']);
|
|
464
|
+
writeServerFiles.queryDtoPath = resovePath(`src/app/${options.model}/dto/${replaceNames.namePath}Query`, ['.dto', '.js']);
|
|
465
|
+
writeServerFiles.servicePath = resovePath(`src/app/${options.model}/service/${replaceNames.namePath}`, ['.service', '.js']);
|
|
466
|
+
writeServerFiles.controllerPath = resovePath(`src/app/${options.model}/controller/${replaceNames.namePath}`, ['.controller', '.js']);
|
|
467
|
+
writeViewFiles.apiPath = resovePath(`view/${options.model}/src/api/${replaceNames.namePath}`, ['.js']);
|
|
468
|
+
writeViewFiles.langEnPath = resovePath(`view/${options.model}/src/views/${replaceNames.namePath}/lang/en`, ['.json']);
|
|
469
|
+
writeViewFiles.dictPath = resovePath(`view/${options.model}/src/views/${replaceNames.namePath}/dict`, ['.js']);
|
|
470
|
+
writeViewFiles.listPath = resovePath(`view/${options.model}/src/views/${replaceNames.namePath}/index`, ['.vue']);
|
|
471
|
+
writeViewFiles.info = resovePath(`view/${options.model}/src/views/${replaceNames.namePath}/components/info`, ['.vue']);
|
|
472
|
+
writeViewFiles.addOrUp = resovePath(`view/${options.model}/src/views/${replaceNames.namePath}/components/addOrUp`, ['.vue']);
|
|
473
|
+
if (options.del) {
|
|
474
|
+
const delPath = [];
|
|
475
|
+
if (options.coverage.includes('b')) {
|
|
476
|
+
delPath.push(...Object.values(omit(writeServerFiles, noWriteKey)));
|
|
477
|
+
}
|
|
478
|
+
if (options.coverage.includes('a') && !noWriteKey.includes('apiPath')) {
|
|
479
|
+
delPath.push(writeViewFiles.apiPath);
|
|
480
|
+
}
|
|
481
|
+
if (options.coverage.includes('v')) {
|
|
482
|
+
delPath.push(...Object.values(omit(writeViewFiles, ['apiPath', ...noWriteKey])));
|
|
483
|
+
}
|
|
484
|
+
delPath.forEach((toPath) => {
|
|
485
|
+
delFileSync(toPath.endsWith('.js') ? toPath.replace('.js', '.ts') : toPath);
|
|
486
|
+
Log.warn((toPath.endsWith('.js') ? toPath.replace('.js', '.ts') : toPath) + ' 已删除');
|
|
487
|
+
});
|
|
488
|
+
if (options.coverage.includes('v')) {
|
|
489
|
+
delFileSync(`view/${options.model}/src/views/${replaceNames.namePath}`);
|
|
490
|
+
Log.warn(`view/${options.model}/src/views/${replaceNames.namePath}` + ' 已删除');
|
|
491
|
+
}
|
|
492
|
+
Log.success(entityFileName + ' 清除成功');
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
if (!options.force) {
|
|
496
|
+
let res = checkPaths();
|
|
497
|
+
if (res !== true) {
|
|
498
|
+
Log.error('文件已存在,如果想要强制覆盖请使用-f参数\n' + res.join('\n'));
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
//初始化变量名称
|
|
503
|
+
replaceNames.name = entityFileName;
|
|
504
|
+
replaceNames.Name = upFirstCase(replaceNames.name);
|
|
505
|
+
replaceNames.createDto = `${entityFileName}CreateDto`;
|
|
506
|
+
replaceNames.CreateDto = upFirstCase(replaceNames.createDto);
|
|
507
|
+
replaceNames.updateDto = `${entityFileName}UpdateDto`;
|
|
508
|
+
replaceNames.UpdateDto = upFirstCase(replaceNames.updateDto);
|
|
509
|
+
replaceNames.queryDto = `${entityFileName}QueryDto`;
|
|
510
|
+
replaceNames.QueryDto = upFirstCase(replaceNames.queryDto);
|
|
511
|
+
replaceNames.service = `${entityFileName}Service`;
|
|
512
|
+
replaceNames.Service = upFirstCase(replaceNames.service);
|
|
513
|
+
replaceNames.controller = `${entityFileName}Controller`;
|
|
514
|
+
replaceNames.Controller = upFirstCase(replaceNames.controller);
|
|
515
|
+
const swaggerExplorer = new MeSwaggerExplorer();
|
|
516
|
+
swaggerExplorer.parseApiExtraModel(entity[upFirstCase(entityFileName)]);
|
|
517
|
+
swaggerExplorer.parseClzz(entity[upFirstCase(entityFileName)]);
|
|
518
|
+
for (let modelName of sequelize.models.getNames()) {
|
|
519
|
+
swaggerExplorer.parseApiExtraModel(sequelize.models.get(modelName));
|
|
520
|
+
swaggerExplorer.parseClzz(sequelize.models.get(modelName));
|
|
521
|
+
}
|
|
522
|
+
swaggerSchemas = getSchemas(swaggerExplorer.getDocumentBuilder(), replaceNames.Name);
|
|
523
|
+
if (options.coverage.includes('p')) {
|
|
524
|
+
adminPermission = true;
|
|
525
|
+
}
|
|
526
|
+
//写入文件
|
|
527
|
+
if (options.coverage.includes('b')) {
|
|
528
|
+
await writeServer();
|
|
529
|
+
}
|
|
530
|
+
if (options.coverage.includes('a')) {
|
|
531
|
+
await writeViewApi();
|
|
532
|
+
}
|
|
533
|
+
if (options.coverage.includes('v')) {
|
|
534
|
+
await writeViews();
|
|
535
|
+
}
|
|
536
|
+
if (options.menu) {
|
|
537
|
+
await setMenu(options.model, replaceNames.namePath, sequelize);
|
|
538
|
+
}
|
|
539
|
+
sequelize.close();
|
|
540
|
+
Log.success(entityFileName + ' crud创建完成');
|
|
541
|
+
});
|
|
542
|
+
};
|
|
543
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kZXJzL2NydWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQyxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSwyQkFBMkIsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVoSixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sUUFBUSxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLHlCQUF5QixFQUF1RCxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoSixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBR3pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sVUFBVSxDQUFDO0FBQ3JDLE9BQU8sVUFBVSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakMsSUFBSSxjQUFjLEdBQUcsRUFBa0MsQ0FBQztBQUN4RCxJQUFJLFNBQW9CLENBQUMsQ0FBQyxPQUFPO0FBQ2pDLE1BQU0sVUFBVSxHQUFHLEVBS2xCLENBQUM7QUFDRixRQUFRO0FBQ1IsUUFB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QUFPLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEcsZ0JBQWdCLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxXQUFXLE9BQU8sQ0FBQyxLQUFLLFFBQVEsWUFBWSxDQUFDLFFBQVEsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDNUgsZ0JBQWdCLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxXQUFXLE9BQU8sQ0FBQyxLQUFLLFFBQVEsWUFBWSxDQUFDLFFBQVEsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDNUgsZ0JBQWdCLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxXQUFXLE9BQU8sQ0FBQyxLQUFLLFFBQVEsWUFBWSxDQUFDLFFBQVEsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDMUgsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxXQUFXLE9BQU8sQ0FBQyxLQUFLLFlBQVksWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDNUgsZ0JBQWdCLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQyxXQUFXLE9BQU8sQ0FBQyxLQUFLLGVBQWUsWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDckksY0FBYyxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsUUFBUSxPQUFPLENBQUMsS0FBSyxZQUFZLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdkcsY0FBYyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsUUFBUSxPQUFPLENBQUMsS0FBSyxjQUFjLFlBQVksQ0FBQyxRQUFRLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDdEgsY0FB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
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { crudInit } from './crud.js';
|
|
2
|
+
import { syncInit } from './sync.js';
|
|
3
|
+
import { setEnv } from '../utils/env.js';
|
|
4
|
+
export const init = (program) => {
|
|
5
|
+
program.option('-m <char>', 'env环境变量')
|
|
6
|
+
.hook('preAction', (thisCommand) => {
|
|
7
|
+
setEnv(thisCommand.opts().m);
|
|
8
|
+
});
|
|
9
|
+
syncInit(program);
|
|
10
|
+
crudInit(program);
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLE9BQWUsRUFBQyxFQUFFO0lBQ25DLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQztTQUNyQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUU7UUFDL0IsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNILFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEIsQ0FBQyxDQUFBIn0=
|