@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.
- package/dist/commanders/addon.d.ts +2 -0
- package/dist/commanders/addon.js +170 -0
- package/dist/commanders/crud.js +86 -29
- package/dist/commanders/index.js +3 -1
- package/dist/commanders/sync.js +26 -8
- package/dist/index.js +0 -0
- package/dist/utils/file.d.ts +36 -0
- package/dist/utils/file.js +120 -3
- package/dist/utils/formatting.js +3 -3
- package/package.json +10 -10
- package/template/addons/.prettierrc.js +2 -0
- package/template/addons/addons.json +10 -0
- package/template/addons/packageTemplate.json +32 -0
- package/template/addons/src/index.ts +0 -0
- package/template/addons/tsconfig.json +13 -0
- package/template/addons/tsdown.config.js +9 -0
- package/template/crud/server/controller/controller.ts.art +9 -9
- package/template/crud/view/api/api.ts.art +7 -7
- package/template/crud/view/api/valueType.ts.art +1 -1
- package/template/crud/view/views/components/addOrUp.vue.art +4 -4
- package/template/crud/view/views/components/addOrUpItem.vue.art +3 -3
- package/template/crud/view/views/components/info.vue.art +3 -3
- package/template/crud/view/views/index.vue.art +5 -5
- package/.prettierrc.cjs +0 -7
package/dist/commanders/sync.js
CHANGED
|
@@ -1,25 +1,43 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
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
|
|
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
|
-
|
|
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,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kZXJzL3N5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdkMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLE9BQWdCLEVBQUUsRUFBRTtJQUMzQyxPQUFPO1NBQ0osT0FBTyxDQUFDLE1BQU0sQ0FBQztTQUNmLFdBQVcsQ0FBQyxTQUFTLENBQUM7U0FDdEIsUUFBUSxDQUFDLFFBQVEsRUFBRSwwQ0FBMEMsQ0FBQztTQUM5RCxNQUFNLENBQUMsdUJBQXVCLEVBQUUsMENBQTBDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1NBQzNILE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSwrQkFBK0IsQ0FBQztTQUM1RCxNQUFNLENBQUMsS0FBSyxFQUFFLElBQVksRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUN0QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVFLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7U0FDdkMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDakIsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsY0FBYztZQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JCLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDdEMsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDMUQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzFCLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFDdEMsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDMUQsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxDQUFDO29CQUNoQyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDIn0=
|
package/dist/index.js
CHANGED
|
File without changes
|
package/dist/utils/file.d.ts
CHANGED
|
@@ -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[];
|
package/dist/utils/file.js
CHANGED
|
@@ -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
|
-
|
|
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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
|
package/dist/utils/formatting.js
CHANGED
|
@@ -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,
|
|
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.
|
|
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": "
|
|
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": ">=
|
|
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,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
|
+
}
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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"
|
|
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}}"
|
|
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:
|
|
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}}"
|
|
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"
|
|
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}}']);
|