@meadmin/cli 1.1.0 → 1.2.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.
@@ -1,25 +1,43 @@
1
- import { importModels, Sequelize } from '@sequelize/core';
2
- import { join, resolve } from 'node:path';
1
+ import { Sequelize } from '@sequelize/core';
2
+ import { upperFirst } from 'lodash-es';
3
+ import { join } from 'node:path';
3
4
  import { getConfig } from '../utils/db.js';
4
5
  import { Log } from '../utils/log.js';
5
6
  export const syncInit = (program) => {
6
7
  program
7
8
  .command('sync')
8
9
  .description('同步数据库结构')
9
- .argument('<file>', '需要同步的entity文件地址支持,隔开的多文件或glob,文件地址相对于项目dist/entities')
10
+ .argument('<file>', '需要同步的entity实例name(支持,隔开的多个name)或*(*代表所有)')
10
11
  .option('-d, --dbConfig <char>', '数据库配置文件地址默认为当前目录下dist/config/database.js', join(process.cwd(), 'dist/config/database.js'))
11
12
  .option('-n, --name <char>', '使用的数据库配置defaultDataSourceName')
12
13
  .action(async (file, options) => {
13
- const files = file.split(',');
14
- files.push('./abstract/*');
15
14
  const config = Object.assign(await getConfig(options.dbConfig, options.name), {
16
15
  logging: (message) => Log.log(message),
17
- models: await importModels(files.map((item) => resolve(process.cwd(), 'dist/entities/', item.endsWith('.js') || item.endsWith('.mjs') || item.endsWith('.cjs') || item.endsWith('.ts') || item.endsWith('.mts') || item.endsWith('.cts') ? item : item + '.entity.js').replace(/\\/g, '/'))),
18
16
  });
19
17
  const sequelize = new Sequelize(config);
20
- await sequelize.sync({ alter: true });
18
+ if (file === '*') {
19
+ await sequelize.sync({ alter: true });
20
+ }
21
+ else {
22
+ const files = file.split(' '); //,隔开的空格会自动转空格
23
+ for (let i = 0; i < files.length; i++) {
24
+ let model = files[i];
25
+ if (sequelize.models.hasByName(model)) {
26
+ await sequelize.models.get(model).sync({ alter: true });
27
+ }
28
+ else {
29
+ model = upperFirst(model);
30
+ if (sequelize.models.hasByName(model)) {
31
+ await sequelize.models.get(model).sync({ alter: true });
32
+ }
33
+ else {
34
+ Log.warn(model + '不存在,已自动跳过');
35
+ }
36
+ }
37
+ }
38
+ }
21
39
  sequelize.close();
22
40
  Log.success('同步数据表结构成功');
23
41
  });
24
42
  };
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kZXJzL3N5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLE9BQWdCLEVBQUUsRUFBRTtJQUMzQyxPQUFPO1NBQ0osT0FBTyxDQUFDLE1BQU0sQ0FBQztTQUNmLFdBQVcsQ0FBQyxTQUFTLENBQUM7U0FDdEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxzREFBc0QsQ0FBQztTQUMxRSxNQUFNLENBQUMsdUJBQXVCLEVBQUUsMENBQTBDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1NBQzNILE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSwrQkFBK0IsQ0FBQztTQUM1RCxNQUFNLENBQUMsS0FBSyxFQUFFLElBQVksRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUN0QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDM0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM1RSxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1lBQ3RDLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FDeEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ2pCLE9BQU8sQ0FDTCxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQ2IsZ0JBQWdCLEVBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxZQUFZLENBQzlLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FDdEIsQ0FDRjtTQUNGLENBQUMsQ0FBQztRQUNILE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDIn0=
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kZXJzL3N5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdkMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLE9BQWdCLEVBQUUsRUFBRTtJQUMzQyxPQUFPO1NBQ0osT0FBTyxDQUFDLE1BQU0sQ0FBQztTQUNmLFdBQVcsQ0FBQyxTQUFTLENBQUM7U0FDdEIsUUFBUSxDQUFDLFFBQVEsRUFBRSwwQ0FBMEMsQ0FBQztTQUM5RCxNQUFNLENBQUMsdUJBQXVCLEVBQUUsMENBQTBDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1NBQzNILE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSwrQkFBK0IsQ0FBQztTQUM1RCxNQUFNLENBQUMsS0FBSyxFQUFFLElBQVksRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUN0QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVFLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7U0FDdkMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDakIsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsY0FBYztZQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JCLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDdEMsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDMUQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzFCLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFDdEMsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDMUQsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxDQUFDO29CQUNoQyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDIn0=
package/dist/index.js CHANGED
File without changes
@@ -11,3 +11,39 @@ export declare function recursionWriteFileSync(filePath: string, content: string
11
11
  * @param filePath
12
12
  */
13
13
  export declare function delFileSync(filePath: string): void;
14
+ /**
15
+ * package.json 文件名互相转换,已规避lint-staged 模板转换问题
16
+ * @param file
17
+ * @param isEncodePackage
18
+ * @returns
19
+ */
20
+ export declare function encodePackageFileName(file: string, isEncodePackage: boolean): string;
21
+ /**
22
+ * copy文件
23
+ * @param fromFile
24
+ * @param toFile
25
+ * @param fileSetFunction
26
+ * @param isEncodeFileName
27
+ * @returns
28
+ */
29
+ export declare function copyFile(fromFile: string, toFile: string, fileSetFunction?: (content: string) => string, isEncodePackage?: boolean): Promise<boolean>;
30
+ /**
31
+ * copy 文件夹
32
+ * @param pathFile
33
+ * @param toPath
34
+ * @param relativePath
35
+ * @param ignoreFile
36
+ * @param fileSetFunctions
37
+ * @param isEncodeFileName
38
+ * @returns
39
+ */
40
+ export declare function copyPath(pathFile: any, toPath: any, relativePath?: string, ignoreFile?: Array<string | RegExp>, fileSetFunctions?: Record<string, (content: string) => string>, isEncodePackage?: boolean): Promise<boolean[]>;
41
+ /**
42
+ * 检测文件夹文件是否存在
43
+ * @param pathFile
44
+ * @param toPath
45
+ * @param relativePath
46
+ * @param hasFiles
47
+ * @returns
48
+ */
49
+ export declare function checkPathFile(pathFile: any, toPath: any, relativePath?: string, hasFiles?: string[]): string[];
@@ -1,5 +1,5 @@
1
- import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
2
- import { dirname } from 'node:path';
1
+ import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join, resolve } from 'node:path';
3
3
  /**
4
4
  * 写入文件【当文件所在文件夹不存在时会递归创建】
5
5
  * @param filePath
@@ -21,4 +21,121 @@ export function delFileSync(filePath) {
21
21
  rmSync(filePath, { recursive: true, force: true });
22
22
  }
23
23
  }
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBb0IsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsUUFBZ0IsRUFBRSxPQUFlLEVBQUUsT0FBMEI7SUFDbEcsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9CLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNyQyxhQUFhLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxQyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLFFBQWdCO0lBQzFDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDekIsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQztBQUNILENBQUMifQ==
24
+ /**
25
+ * package.json 文件名互相转换,已规避lint-staged 模板转换问题
26
+ * @param file
27
+ * @param isEncodePackage
28
+ * @returns
29
+ */
30
+ export function encodePackageFileName(file, isEncodePackage) {
31
+ if (isEncodePackage) {
32
+ if (file.endsWith('package.json')) {
33
+ return file.replace('package.json', 'packageTemplate.json');
34
+ }
35
+ }
36
+ else if (file.endsWith('packageTemplate.json')) {
37
+ return file.replace('packageTemplate.json', 'package.json');
38
+ }
39
+ return file;
40
+ }
41
+ /**
42
+ * copy文件
43
+ * @param fromFile
44
+ * @param toFile
45
+ * @param fileSetFunction
46
+ * @param isEncodeFileName
47
+ * @returns
48
+ */
49
+ export async function copyFile(fromFile, toFile, fileSetFunction, isEncodePackage = true) {
50
+ if (!existsSync(fromFile)) {
51
+ return;
52
+ }
53
+ let content = readFileSync(fromFile, 'utf-8');
54
+ if (fileSetFunction) {
55
+ content = await fileSetFunction(content);
56
+ }
57
+ return recursionWriteFileSync(encodePackageFileName(toFile, isEncodePackage), content);
58
+ }
59
+ /**
60
+ * copy 文件夹
61
+ * @param pathFile
62
+ * @param toPath
63
+ * @param relativePath
64
+ * @param ignoreFile
65
+ * @param fileSetFunctions
66
+ * @param isEncodeFileName
67
+ * @returns
68
+ */
69
+ export async function copyPath(pathFile, toPath, relativePath = '', ignoreFile = [], fileSetFunctions, isEncodePackage = true) {
70
+ if (!existsSync(pathFile)) {
71
+ return;
72
+ }
73
+ const fileList = readdirSync(pathFile);
74
+ return Promise.all(fileList.map(async (file) => {
75
+ const relativeFilePath = join(relativePath, file).replaceAll('\\', '/');
76
+ for (let i = 0; i < ignoreFile.length; i++) {
77
+ const item = ignoreFile[i];
78
+ if (item instanceof RegExp) {
79
+ if (item.test(relativeFilePath)) {
80
+ return;
81
+ }
82
+ }
83
+ else if (item === relativeFilePath) {
84
+ return;
85
+ }
86
+ }
87
+ const path = resolve(pathFile, file);
88
+ const toSetPath = resolve(toPath, file);
89
+ const stats = statSync(path);
90
+ if (stats.isDirectory()) {
91
+ mkdirSync(toSetPath, { recursive: true });
92
+ //文件夹递归处理
93
+ copyPath(path, toSetPath, relativeFilePath, ignoreFile, fileSetFunctions, isEncodePackage);
94
+ }
95
+ else {
96
+ if (fileSetFunctions) {
97
+ const files = Object.keys(fileSetFunctions);
98
+ for (let i = 0; i < files.length; i++) {
99
+ if (files[i] === relativeFilePath) {
100
+ return await copyFile(path, toSetPath, fileSetFunctions[files[i]], isEncodePackage);
101
+ }
102
+ }
103
+ }
104
+ await copyFile(path, toSetPath, undefined, isEncodePackage);
105
+ }
106
+ return true;
107
+ }));
108
+ }
109
+ /**
110
+ * 检测文件夹文件是否存在
111
+ * @param pathFile
112
+ * @param toPath
113
+ * @param relativePath
114
+ * @param hasFiles
115
+ * @returns
116
+ */
117
+ export function checkPathFile(pathFile, toPath, relativePath = '', hasFiles = []) {
118
+ if (!existsSync(pathFile)) {
119
+ return [];
120
+ }
121
+ const fileList = readdirSync(pathFile);
122
+ fileList.forEach((file) => {
123
+ const relativeFilePath = join(relativePath, file).replaceAll('\\', '/');
124
+ const path = resolve(pathFile, file);
125
+ const toSetPath = resolve(toPath, file);
126
+ if (!existsSync(toSetPath)) {
127
+ return;
128
+ }
129
+ const stats = statSync(path);
130
+ if (stats.isDirectory()) {
131
+ //文件夹递归处理
132
+ copyPath(path, toSetPath, relativeFilePath, hasFiles);
133
+ }
134
+ else {
135
+ hasFiles.push(toSetPath);
136
+ }
137
+ return true;
138
+ });
139
+ return hasFiles;
140
+ }
141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBb0IsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlILE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxRQUFnQixFQUFFLE9BQWUsRUFBRSxPQUEwQjtJQUNsRyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0IsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsUUFBZ0I7SUFDMUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN6QixNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLElBQVksRUFBRSxlQUF3QjtJQUMxRSxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsc0JBQXNCLENBQUMs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
@@ -31,7 +31,7 @@ export function toHump(str) {
31
31
  * @return {[type]} [return description]
32
32
  */
33
33
  export function lowerFirstCase(str) {
34
- return str[0].toLowerCase() + str.slice(1);
34
+ return str ? str[0].toLowerCase() + str.slice(1) : str;
35
35
  }
36
36
  /**
37
37
  * 首字母大写
@@ -41,7 +41,7 @@ export function lowerFirstCase(str) {
41
41
  * @return {[type]} [return description]
42
42
  */
43
43
  export function upFirstCase(str) {
44
- return str[0].toUpperCase() + str.slice(1);
44
+ return str ? str[0].toUpperCase() + str.slice(1) : str;
45
45
  }
46
46
  /**
47
47
  * 获取绝对路径 并添加对应后缀
@@ -100,4 +100,4 @@ export function getKeyInfo(description) {
100
100
  return { name: nameArr[0] };
101
101
  }
102
102
  }
103
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9mb3JtYXR0aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEU7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLDJCQUEyQixDQUFDLEdBQVcsRUFBRSxVQUFVLEdBQUcsR0FBRztJQUN2RSxNQUFNLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUN0QyxNQUFNLHdCQUF3QixHQUFHLG1CQUFtQixDQUFDO0lBQ3JELE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLFVBQVUsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQy9ILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLEdBQVc7SUFDaEMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLFVBQVUsR0FBRyxFQUFFLE1BQU07UUFDMUQsT0FBTyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDOUIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFXO0lBQ3hDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsR0FBVztJQUNyQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxHQUFXLEVBQUUsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUU7SUFDNUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEIsR0FBRyxJQUFJLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBWSxFQUFFLEVBQVUsRUFBRSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDckUsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUQsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ2hDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3hCLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUNILElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNoQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNuRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsV0FBbUI7SUFDNUMsK0JBQStCO0lBQy9CLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsTUFBTSxJQUFJLEdBQUcsRUFBNEIsQ0FBQztJQUMxQyxNQUFNLE9BQU8sR0FBRyxFQUE2QyxDQUFDO0lBQzlELElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzVELENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM5QixDQUFDO0FBQ0gsQ0FBQyJ9
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9mb3JtYXR0aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEU7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLDJCQUEyQixDQUFDLEdBQVcsRUFBRSxVQUFVLEdBQUcsR0FBRztJQUN2RSxNQUFNLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUN0QyxNQUFNLHdCQUF3QixHQUFHLG1CQUFtQixDQUFDO0lBQ3JELE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLFVBQVUsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQy9ILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLEdBQVc7SUFDaEMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLFVBQVUsR0FBRyxFQUFFLE1BQU07UUFDMUQsT0FBTyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDOUIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFXO0lBQ3hDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ3pELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLEdBQVc7SUFDckMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxD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
package/package.json CHANGED
@@ -1,17 +1,21 @@
1
1
  {
2
2
  "name": "@meadmin/cli",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "meadmin cli",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "bin": {
8
8
  "meadmin": "dist/index.js"
9
9
  },
10
+ "scripts": {
11
+ "test": "echo \"Error: no test specified\" && exit 1",
12
+ "build": "rimraf dist && tsc --build",
13
+ "prepublishOnly": "pnpm build"
14
+ },
10
15
  "files": [
11
16
  "dist/**/*.js",
12
17
  "dist/**/*.d.ts",
13
- "template",
14
- ".prettierrc.cjs"
18
+ "template"
15
19
  ],
16
20
  "bugs": {
17
21
  "url": "https://github.com/meadmin-cn/meadmin"
@@ -38,7 +42,7 @@
38
42
  "commander": "^14.0.0",
39
43
  "dotenv": "^16.6.1",
40
44
  "swagger-client": "^3.35.6",
41
- "prettier": "2.8.8",
45
+ "prettier": "3.8.1",
42
46
  "prettier-plugin-organize-imports": "^4.3.0"
43
47
  },
44
48
  "peerDependencies": {
@@ -47,10 +51,6 @@
47
51
  "@sequelize/postgres": "7.x || >=7.0.0-alpha.46"
48
52
  },
49
53
  "engines": {
50
- "node": ">=20.13.1"
51
- },
52
- "scripts": {
53
- "test": "echo \"Error: no test specified\" && exit 1",
54
- "build": "rimraf dist && tsc --build"
54
+ "node": ">=22.14.0"
55
55
  }
56
- }
56
+ }
@@ -0,0 +1,2 @@
1
+ import config from '../../.prettierrc.js';
2
+ export default config;
@@ -0,0 +1,10 @@
1
+ {
2
+ "name":"{addonsName}",
3
+ "chineseName":"中文名称",
4
+ "version": "1.0.0",
5
+ "description": "说明",
6
+ "keywords": [],
7
+ "author": "作者",
8
+ "installShells":[],
9
+ "uninstallShells":[]
10
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "meadmin-addons-{addonsName}",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "export": {
8
+ ".": "./dist/index.js",
9
+ "./*": "./*.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsdown",
13
+ "dev": "tsdown --watch"
14
+ },
15
+ "files": [
16
+ "dist/**/*",
17
+ "template/"
18
+ ],
19
+ "keywords": [],
20
+ "author": "",
21
+ "license": "",
22
+ "engines": {
23
+ "node": ">=22.14.0"
24
+ },
25
+ "dependencies": {
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^25.3.0",
29
+ "tsdown": "^0.20.1",
30
+ "typescript": "^5.9.3"
31
+ }
32
+ }
File without changes
@@ -0,0 +1,13 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compileOnSave": true,
4
+ "compilerOptions": {
5
+ "rootDir": "src",
6
+ "outDir": "dist",
7
+ "baseUrl": ".",
8
+ "paths": {},
9
+ "module": "es6",
10
+ "moduleResolution": "bundler"
11
+ },
12
+ "exclude": ["*.js", "*.ts", "dist", "node_modules", "test", "rescources","template"]
13
+ }
@@ -0,0 +1,9 @@
1
+ import { defineConfig } from 'tsdown';
2
+ export default defineConfig({
3
+ entry: ['src/index.ts', 'src/preview.ts', 'src/style.ts'],
4
+ dts: true,
5
+ target: 'node20',
6
+ minify: false,
7
+ inlineOnly: false,
8
+ fixedExtension: false,
9
+ });
@@ -12,7 +12,7 @@ import { ApiOperationResponse } from '@/decorators/index.js';
12
12
  * 为了防止防火墙禁止PUT、DELETE请求,方便传参,除详情外统一使用post请求。
13
13
  * meadmin对controller做了装饰器继承封装,当以/开头时会使用当前controller前缀地址,不以/开头时会递归继承controller前缀地址
14
14
  */
15
- @Controller('{{@ replaceNames.controllerPath}}')
15
+ @Controller('{{@ replaceNames.addonsPath+replaceNames.controllerPath}}')
16
16
  export class {{@ replaceNames.Controller}} extends BaseController {
17
17
  @Inject()
18
18
  {{@ replaceNames.service}}: {{@ replaceNames.Service}};
@@ -26,7 +26,7 @@ export class {{@ replaceNames.Controller}} extends BaseController {
26
26
  responseType: {{@ replaceNames.Name}},
27
27
  summary: '查询{{@ valueEntity.tableComment}}信息',
28
28
  }){{if adminPermission}}
29
- @AdminPermission('{{@replaceNames.Name}}List'){{/if}}
29
+ @AdminPermission('{{@replaceNames.roleName}}_list'){{/if}}
30
30
  async get{{@ valueEntity.entityName}}(
31
31
  @Body('{{@ valueEntity.pk[0]}}') {{@ valueEntity.pk[0]}}: {{@ swaggerSchemas[valueEntity.entityName]?.properties?.[entity.pk[0]]?.type || 'string'}},{{if valueEntity.nameKeys.length}}
32
32
  @Body('{{@ valueEntity.nameKeys[0]}}') {{@ valueEntity.nameKeys[0]}}: string,{{/if}}
@@ -44,7 +44,7 @@ export class {{@ replaceNames.Controller}} extends BaseController {
44
44
  responseType: {{@ replaceNames.Name}},
45
45
  summary: '查询{{@ valueEntity.tableComment}}信息',
46
46
  }){{if adminPermission}}
47
- @AdminPermission('{{@replaceNames.Name}}List'){{/if}}
47
+ @AdminPermission('{{@replaceNames.roleName}}_list'){{/if}}
48
48
  async get{{@ valueEntity.entityName}}(
49
49
  @Body('{{@ valueEntity.pk[0]}}') {{@ valueEntity.pk[0]}}: {{@ swaggerSchemas[valueEntity.entityName]?.properties?.[entity.pk[0]]?.type || 'string'}},{{if valueEntity.nameKeys.length}}
50
50
  @Body('{{@ valueEntity.nameKeys[0]}}') {{@ valueEntity.nameKeys[0]}}: string,{{/if}}
@@ -60,7 +60,7 @@ export class {{@ replaceNames.Controller}} extends BaseController {
60
60
  responseType: {{@ replaceNames.Name}},
61
61
  summary: '添加{{@ entity.tableComment}}信息',
62
62
  }){{if adminPermission}}
63
- @AdminPermission('{{@replaceNames.Name}}Add'){{/if}}
63
+ @AdminPermission('{{@replaceNames.roleName}}_add'){{/if}}
64
64
  async add(@Body() createDto: {{@ replaceNames.CreateDto}}) {
65
65
  return this.success(await this.{{@ replaceNames.service}}.create(createDto));
66
66
  }
@@ -71,7 +71,7 @@ export class {{@ replaceNames.Controller}} extends BaseController {
71
71
  responsePage: {{@ replaceNames.Name}},
72
72
  summary: '获取{{@ entity.tableComment}}列表',
73
73
  }){{if adminPermission}}
74
- @AdminPermission('{{@replaceNames.Name}}List'){{/if}}
74
+ @AdminPermission('{{@replaceNames.roleName}}_list'){{/if}}
75
75
  async list(@Body() queryDto: {{@ replaceNames.QueryDto}}) {
76
76
  return this.success(await this.{{@ replaceNames.service}}.list(queryDto));
77
77
  }
@@ -82,7 +82,7 @@ export class {{@ replaceNames.Controller}} extends BaseController {
82
82
  responseType: {{@ replaceNames.Name}},
83
83
  summary: '根据{{@ entity.pk.join('/:')}}获取{{@ entity.tableComment}}详情',
84
84
  }){{if adminPermission}}
85
- @AdminPermission('{{@replaceNames.Name}}Edit'){{/if}}
85
+ @AdminPermission('{{@replaceNames.roleName}}_info'){{/if}}
86
86
  async findOne({{each entity.pk}}{{if index>0}}, {{/if}}@Param('{{@ $value}}') {{@ $value}}: {{@ entitySchema.properties[$value].type}}{{/each}}) {
87
87
  {{if entity.pk.length>1}}const entity = await this.{{@ replaceNames.service}}.findOne({
88
88
  {{each entity.pk}}{{@ $value}},{{/each}}
@@ -95,9 +95,9 @@ export class {{@ replaceNames.Controller}} extends BaseController {
95
95
  @Post('/up/:{{@ entity.pk.join('/:')}}')
96
96
  @ApiOperationResponse({
97
97
  responseType: {{@ replaceNames.Name}},
98
- summary: '根据{{@ entity.pk.join('/:')}}更新{{@ entity.tableComment}}详情',
98
+ summary: '根据{{@ entity.pk.join('/:')}}更新{{@ entity.tableComment}}信息',
99
99
  }){{if adminPermission}}
100
- @AdminPermission('{{@replaceNames.Name}}Edit'){{/if}}
100
+ @AdminPermission('{{@replaceNames.roleName}}_edit'){{/if}}
101
101
  async update({{each entity.pk}}@Param('{{@ $value}}') {{@ $value}}: {{@ entitySchema.properties[$value].type}}, {{/each}}@Body() updateDto: {{@ replaceNames.UpdateDto}}) {
102
102
  return this.success(
103
103
  {{if entity.pk.length>1}}await this.{{@ replaceNames.service}}.update({
@@ -112,7 +112,7 @@ export class {{@ replaceNames.Controller}} extends BaseController {
112
112
  @ApiOperationResponse({
113
113
  summary: '根据{{@ entity.pk.join('/:')}}删除{{@ entity.tableComment}}信息',
114
114
  }){{if adminPermission}}
115
- @AdminPermission('{{@replaceNames.Name}}Del'){{/if}}
115
+ @AdminPermission('{{@replaceNames.roleName}}_del'){{/if}}
116
116
  async delete({{each entity.pk}}{{if index>0}}, {{/if}}@Param('{{@ $value}}') {{@ $value}}: {{@ entitySchema.properties[$value].type}}{{/each}}) {
117
117
  {{if entity.pk.length>1}}await this.{{@ replaceNames.service}}.remove({
118
118
  {{each entity.pk}}
@@ -26,7 +26,7 @@ export function get{{@ valueEnitty.entityName}}Api() {
26
26
  pageSize:number,
27
27
  }]>(
28
28
  (data) => ({
29
- url: '{{@ replaceNames.controllerPath}}/get{{@ valueEnitty.entityName}}',
29
+ url: '{{@ replaceNames.addonsPath+replaceNames.controllerPath}}/get{{@ valueEnitty.entityName}}',
30
30
  method: 'post',
31
31
  data: data,
32
32
  }),
@@ -44,7 +44,7 @@ export function get{{@ valueEnitty.entityName}}Api() {
44
44
  pageSize:number,
45
45
  }]>(
46
46
  (data) => ({
47
- url: '{{@ replaceNames.controllerPath}}/get{{@ valueEnitty.entityName}}',
47
+ url: '{{@ replaceNames.addonsPath+replaceNames.controllerPath}}/get{{@ valueEnitty.entityName}}',
48
48
  method: 'post',
49
49
  data: data,
50
50
  }),
@@ -60,7 +60,7 @@ export type {{@ replaceNames.Name}}Info = {{@ replaceNames.Name}} & {
60
60
  export function add{{@ replaceNames.Name}}Api() {
61
61
  return request<{{@ replaceNames.Name}}Info, [{{@ replaceNames.Name}}]>(
62
62
  (data) => ({
63
- url: '{{@ replaceNames.controllerPath}}/add',
63
+ url: '{{@ replaceNames.addonsPath+replaceNames.controllerPath}}/add',
64
64
  method: 'post',
65
65
  data: data,
66
66
  }),
@@ -76,7 +76,7 @@ export class {{@ replaceNames.Name}}ListParam extends PageParam {
76
76
  export function {{@ replaceNames.name}}ListApi(options?: RequestOptions<{{@ replaceNames.Name}}ListResult, [{{replaceNames.Name}}ListParam]>) {
77
77
  return request<{{@ replaceNames.Name}}ListResult, [{{@ replaceNames.Name}}ListParam]>(
78
78
  (data) => ({
79
- url: '{{@ replaceNames.controllerPath}}/',
79
+ url: '{{@ replaceNames.addonsPath+replaceNames.controllerPath}}/',
80
80
  method: 'post',
81
81
  data: data,
82
82
  }),
@@ -88,7 +88,7 @@ export function {{@ replaceNames.name}}ListApi(options?: RequestOptions<{{@ repl
88
88
  export function {{@ replaceNames.name}}InfoApi(options?: RequestOptions<{{@ replaceNames.Name}}Info, [{{@ entity.pk.map(v=>entitySchema.properties[v].type).join(', ')}}]>) {
89
89
  return request<{{@ replaceNames.Name}}Info, [{{entity.pk.map(v=>entitySchema.properties[v].type).join(', ')}}]>(
90
90
  ({{@ entity.pk.join(', ')}}) => ({
91
- url: `{{@ replaceNames.controllerPath}}/info/${<%- entity.pk.join('/${') %>}`,
91
+ url: `{{@ replaceNames.addonsPath+replaceNames.controllerPath}}/info/${<%- entity.pk.join('/${') %>}`,
92
92
  method: 'get',
93
93
  }),
94
94
  Object.assign({ noLoading: true }, options),
@@ -100,7 +100,7 @@ export type Update{{replaceNames.Name}}InfoParam = Omit<Partial<{{@ replaceNames
100
100
  export function update{{@ replaceNames.Name}}Api(options?: RequestOptions<{{@ replaceNames.Name}}Info, [{{each entity.pk}}{{entitySchema.properties[$value].type}}, {{/each}}Update{{replaceNames.Name}}InfoParam]>) {
101
101
  return request<{{@ replaceNames.Name}}Info, [{{each entity.pk}}{{entitySchema.properties[$value].type}}, {{/each}}Update{{replaceNames.Name}}InfoParam]>(
102
102
  ({{@ entity.pk.join(', ')}}, data) => ({
103
- url: `{{@ replaceNames.controllerPath}}/up/${<%- entity.pk.join('/${') %>}`,
103
+ url: `{{@ replaceNames.addonsPath+replaceNames.controllerPath}}/up/${<%- entity.pk.join('/${') %>}`,
104
104
  method: 'post',
105
105
  data: data,
106
106
  }),
@@ -112,7 +112,7 @@ export function update{{@ replaceNames.Name}}Api(options?: RequestOptions<{{@ re
112
112
  export function del{{@ replaceNames.Name}}Api(options?: RequestOptions<null, [{{@ entity.pk.map(v=>entitySchema.properties[v].type).join(', ')}}]>) {
113
113
  return request<null, [{{entity.pk.map(v=>entitySchema.properties[v].type).join(', ')}}]>(
114
114
  ({{@ entity.pk.join(', ')}}) => ({
115
- url: `{{@ replaceNames.controllerPath}}/del/${<%- entity.pk.join('/${') %>}`,
115
+ url: `{{@ replaceNames.addonsPath+replaceNames.controllerPath}}/del/${<%- entity.pk.join('/${') %>}`,
116
116
  method: 'post',
117
117
  }),
118
118
  Object.assign({ noLoading: true }, options),
@@ -1,3 +1,3 @@
1
1
  {{if $ref}}{{@ $ref.replace('#/components/schemas/','')}}{{else if ['object','Object'].includes(type)}}{
2
2
  <% include('./type.ts.art', {properties:properties,entity:{}}) %>
3
- }{{else if ['array','Array'].includes(type)}}Array<<% include('./valueType.ts.art', {...items, key:$data.key, entity:{}, notNull:true}) %>>{{else if $data.enum}}{{if type==='string'}}'{{@ $data.enum.map(v=>''+v).join("' | '")}}'{{else}}{{@ $data.enum.map(v=>''+v).join(' | ')}}{{/if}}{{else}}{{if type ==='integer'}}number{{else}}{{@ type}}{{/if}}{{/if}}{{if !notNull && !entity?.pk?.includes(key) && entity?.attributes?.get(key)?.allowNull !==false && !['array','Array'].includes(type) }} | null{{/if}}
3
+ }{{else if ['array','Array'].includes(type)}}Array<<% include('./valueType.ts.art', {...items, key:$data.key, entity:{}, notNull:true}) %>>{{else if $data.enum}}{{if type==='string'}}'{{@ $data.enum.map(v=>''+v).join("' | '")}}'{{else}}{{@ $data.enum.map(v=>''+v).join(' | ')}}{{/if}}{{else}}{{if type ==='integer'}}number{{else}}{{@ type}}{{/if}}{{/if}}{{if !notNull && !entity?.pk?.includes(key) && entity?.attributes?.get?.(key)?.allowNull !==false && !['array','Array'].includes(type) }} | null{{/if}}
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <me-dialog v-model="show" :title="t({{@ entity.pk[0]}} ? '编辑' : '新增')" :close-on-click-modal="false"
3
3
  @closed="emit('closed')">
4
- <el-form v-loading="loading" ref="formEl" :model="info" :rules="rules" class="add" label-width="auto">
4
+ <el-form ref="formEl" v-loading="loading" :model="info" :rules="rules" class="add" label-width="auto">
5
5
  <% include('./addOrUpItem.vue.art', {...entitySchema, entity:entity, belongsToEntity:entity.belongsToEntity, belongsToManyEntity:entity.belongsToManyEntity}) %>
6
6
  </el-form>
7
7
  <template #footer>
@@ -12,7 +12,7 @@
12
12
  </template>
13
13
 
14
14
  <script setup lang="ts" name="AddOrUp{{@ replaceNames.Name}}">
15
- import { {{@ replaceNames.Name}}, {{@ replaceNames.Name}}Info, add{{@ replaceNames.Name}}Api, update{{@ replaceNames.Name}}Api, {{@ replaceNames.name}}InfoApi } from '@/api/{{@ replaceNames.namePath}}';
15
+ import { {{@ replaceNames.Name}}, {{@ replaceNames.Name}}Info, add{{@ replaceNames.Name}}Api, update{{@ replaceNames.Name}}Api, {{@ replaceNames.name}}InfoApi } from '@/{{@ replaceNames.addonsPath}}api/{{@ replaceNames.namePath}}';
16
16
  import { useLocalesI18n } from '@/locales/i18n';
17
17
  import { resetObj<% if($imports.objectValues(entitySchema.properties).some(v=>v.enum || v.description.includes(':'))){%>, formatterStr<%}%> } from '@/utils/helper';
18
18
  import { FormInstance, FormRules } from 'element-plus';
@@ -23,7 +23,7 @@ const { runAsync:addRunAsync } = add{{@ replaceNames.Name}}Api();
23
23
  const { runAsync:infoRunAsync } = {{@ replaceNames.name}}InfoApi();
24
24
  <% const hasStatement = ['File']; %>
25
25
  {{each $imports.objectKeys(entity.belongsToEntity)}}<% const valueEntity = entity.belongsToEntity[$value]; %>{{if hasStatement.includes(valueEntity.entityName)}}<% return; %>{{else}}<% hasStatement.push(valueEntity.entityName);%>{{/if}}
26
- import {get{{@ valueEntity.entityName}}Api} from '@/api/{{@ replaceNames.namePath}}';
26
+ import {get{{@ valueEntity.entityName}}Api} from '@/{{@ replaceNames.addonsPath}}api/{{@ replaceNames.namePath}}';
27
27
  const { runAsync:get{{@ valueEntity.entityName}}RunAsync } = get{{@ valueEntity.entityName}}Api();
28
28
  const serach{{@ valueEntity.entityName}} = async (query:string,page:number,pageSize:number)=>{
29
29
  return await get{{@ valueEntity.entityName}}RunAsync({
@@ -34,7 +34,7 @@ const serach{{@ valueEntity.entityName}} = async (query:string,page:number,pageS
34
34
  }
35
35
  {{/each}}
36
36
  {{each $imports.objectKeys(entity.belongsToManyEntity)}}<% const valueEntity = entity.belongsToManyEntity[$value]; %>{{if hasStatement.includes(valueEntity.entityName)}}<% return; %>{{else}}<% hasStatement.push(valueEntity.entityName);%>{{/if}}
37
- import {get{{@ valueEntity.entityName}}Api} from '@/api/{{@ replaceNames.namePath}}';
37
+ import {get{{@ valueEntity.entityName}}Api} from '@/{{@ replaceNames.addonsPath}}api/{{@ replaceNames.namePath}}';
38
38
  const { runAsync:get{{@ valueEntity.entityName}}RunAsync } = get{{@ valueEntity.entityName}}Api();
39
39
  const serach{{@ valueEntity.entityName}} = async (query:string,page:number,pageSize:number)=>{
40
40
  return await get{{@ valueEntity.entityName}}RunAsync({
@@ -16,11 +16,11 @@
16
16
  <me-upload v-model="info.{{@ $index}}" ></me-upload>
17
17
  </el-form-item>{{else if $value?.items.$ref}}<% const entityName = $value.items.$ref.replace('#/components/schemas/',''); %><% const valueEntity = belongsToManyEntity[$index] || belongsToEntity[$index]; %>{{if !valueEntity}}<% return;%>{{/if}}
18
18
  <el-form-item :label="t('{{@ keyInfo.name}}')" prop="{{@ $index}}">
19
- <me-select-list v-model="info.{{@ $index}}" :props="{label:'{{@ valueEntity.nameKeys?.[0] || valueEntity.pk[0]}}',value:'{{@ valueEntity.pk[0] }}'}" value-key="{{@ valueEntity.pk[0] }}" @search="serach{{@ valueEntity.entityName}}" :multiple="true"></me-select-list>
19
+ <me-select-list v-model="info.{{@ $index}}" :props="{label:'{{@ valueEntity.nameKeys?.[0] || valueEntity.pk[0]}}',value:'{{@ valueEntity.pk[0] }}'}" value-key="{{@ valueEntity.pk[0] }}" :multiple="true" @search="serach{{@ valueEntity.entityName}}"></me-select-list>
20
20
  </el-form-item>{{/if}}{{else if $value.$ref === '#/components/schemas/FileInfo'}}
21
21
  <el-form-item :label="t('{{@ keyInfo.name}}')" prop="{{@ $index}}">
22
- <me-upload :limit="1" :model-value="info.{{@ $index}}?[info.{{@ $index}}]:[]" @update:modelValue="(files)=>info.{{@ $index}} =files.length? files[0]:null" ></me-upload>
22
+ <me-upload :limit="1" :model-value="info.{{@ $index}}?[info.{{@ $index}}]:[]" @update:model-value="(files)=>info.{{@ $index}} =files.length? files[0]:null" ></me-upload>
23
23
  </el-form-item>{{else if $value.$ref}}<% const entityName = $value.$ref.replace('#/components/schemas/',''); %><% const valueEntity = belongsToManyEntity[$index] || belongsToEntity[$index]; %>{{if !valueEntity}}<% return;%>{{/if}}
24
24
  <el-form-item :label="t('{{@ keyInfo.name}}')" prop="{{@ $index}}">
25
- <me-select-list v-model="info.{{@ $index}}" :props="{label:'{{@ valueEntity.nameKeys?.[0] || valueEntity.pk[0]}}',value:'{{@ valueEntity.pk[0] }}'}" value-key="{{@ valueEntity.pk[0] }}" @search="serach{{@ valueEntity.entityName}}" clearable></me-select-list>
25
+ <me-select-list v-model="info.{{@ $index}}" :props="{label:'{{@ valueEntity.nameKeys?.[0] || valueEntity.pk[0]}}',value:'{{@ valueEntity.pk[0] }}'}" value-key="{{@ valueEntity.pk[0] }}" clearable @search="serach{{@ valueEntity.entityName}}"></me-select-list>
26
26
  </el-form-item>{{/if}}{{/if}}{{/each}}
@@ -1,6 +1,6 @@
1
1
  <template>
2
- <me-dialog v-model="show" :title="t('详情')" :close-on-click-modal="false" @closed="emit('closed')">
3
- <el-descriptions class="info" :border="true" v-loading="loading">
2
+ <me-dialog v-model="show" :title="t('详情')" v-loading="loading" :close-on-click-modal="false" @closed="emit('closed')">
3
+ <el-descriptions class="info" :border="true">
4
4
  {{each entitySchema.properties}} {{if ['createdAdmin','updatedAdmin'].includes($index)}} <% return; %>{{/if}} <% const keyInfo = $imports.getKeyInfo($value.description); %>
5
5
  <el-descriptions-item :label="t('{{@ keyInfo.name}}')">{{if $value.$ref === '#/components/schemas/FileInfo'}}
6
6
  <me-files-view :files="data?.{{$index}}?[data.{{$index}}]:[]"></me-files-view>
@@ -28,7 +28,7 @@ formatterAtExec(
28
28
  </template>
29
29
 
30
30
  <script setup lang="ts" name="Info">
31
- import { {{@ replaceNames.name}}InfoApi } from '@/api/{{@ replaceNames.namePath}}';
31
+ import { {{@ replaceNames.name}}InfoApi } from '@/{{@ replaceNames.addonsPath}}api/{{@ replaceNames.namePath}}';
32
32
  import { useLocalesI18n } from '@/locales/hooks.js';
33
33
  import { formatterAtExec, formatterStrExec,formatterObjectExecFn,formatterArrExecFn } from '@/utils/helper.js';
34
34
  let { t, loadRes } = useLocalesI18n({}, [(locale: string) => import(`../lang/${locale}.json`), '{{@ replaceNames.name}}']);