mcp-vue-codegen 1.2.1 → 1.3.1
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/README.md +129 -26
- package/build/generators/backend.d.ts +11 -0
- package/build/generators/backend.d.ts.map +1 -0
- package/build/generators/backend.js +89 -0
- package/build/generators/backend.js.map +1 -0
- package/build/index.js +32 -1
- package/build/index.js.map +1 -1
- package/build/templates/backend/controller.tpl.d.ts +3 -0
- package/build/templates/backend/controller.tpl.d.ts.map +1 -0
- package/build/templates/backend/controller.tpl.js +185 -0
- package/build/templates/backend/controller.tpl.js.map +1 -0
- package/build/templates/backend/entity.tpl.d.ts +4 -0
- package/build/templates/backend/entity.tpl.d.ts.map +1 -0
- package/build/templates/backend/entity.tpl.js +214 -0
- package/build/templates/backend/entity.tpl.js.map +1 -0
- package/build/templates/backend/mapper.tpl.d.ts +6 -0
- package/build/templates/backend/mapper.tpl.d.ts.map +1 -0
- package/build/templates/backend/mapper.tpl.js +81 -0
- package/build/templates/backend/mapper.tpl.js.map +1 -0
- package/build/templates/backend/service.tpl.d.ts +6 -0
- package/build/templates/backend/service.tpl.d.ts.map +1 -0
- package/build/templates/backend/service.tpl.js +246 -0
- package/build/templates/backend/service.tpl.js.map +1 -0
- package/example/table-schema.json +937 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,25 +1,49 @@
|
|
|
1
1
|
# mcp-vue-codegen
|
|
2
2
|
|
|
3
|
-
MCP Server,根据数据库表字段 JSON 文档自动生成 Vue3
|
|
3
|
+
MCP Server,根据数据库表字段 JSON 文档自动生成 **Vue3 前端** + **Java 后端** 完整 CRUD 模块代码。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 功能概览
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
- `api/*.ts` — 5 个标准 CRUD 接口
|
|
9
|
-
- `index.vue` — 列表页(表格、搜索、按钮、分页、工作流)
|
|
10
|
-
- `form.vue` — 表单页(折叠面板、字段控件、校验规则、主从表)
|
|
7
|
+
### 前端生成(Vue3 + Element Plus)
|
|
11
8
|
|
|
12
|
-
|
|
9
|
+
| 文件 | 说明 |
|
|
10
|
+
|------|------|
|
|
11
|
+
| `options.ts` | 表单字段配置、过滤类型 |
|
|
12
|
+
| `api/*.ts` | 5 个标准 CRUD 接口(fetchList / addObj / getObj / delObjs / putObj) |
|
|
13
|
+
| `index.vue` | 列表页:表格、智能搜索、分页、按钮(增删改查/提交/流转/导出/打印) |
|
|
14
|
+
| `form.vue` | 表单页:折叠面板、字段控件、校验规则、弹窗选择器、主从表 |
|
|
13
15
|
|
|
14
|
-
###
|
|
16
|
+
### 后端生成(Spring Boot + MyBatis-Plus)
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
| 文件 | 说明 |
|
|
19
|
+
|------|------|
|
|
20
|
+
| `{Entity}Entity.java` | 主表实体类(含 @TableId、@Dict、@Schema 等注解) |
|
|
21
|
+
| `{Entity}DetailEntity.java` | 从表实体类(有从表时生成) |
|
|
22
|
+
| `{Entity}Mapper.java` + `.xml` | MyBatis-Plus Mapper 接口及 XML |
|
|
23
|
+
| `{Entity}Service.java` | Service 接口 |
|
|
24
|
+
| `{Entity}ServiceImpl.java` | Service 实现(主从表级联 CRUD、工作流回调) |
|
|
25
|
+
| `{Entity}Controller.java` | REST Controller(分页查询、增删改查、导出、打印) |
|
|
26
|
+
|
|
27
|
+
## 快速开始
|
|
28
|
+
|
|
29
|
+
### 1. 配置 MCP
|
|
30
|
+
|
|
31
|
+
在你的 IDE 中添加 MCP Server 配置:
|
|
19
32
|
|
|
20
|
-
|
|
33
|
+
**Claude Code**(`~/.claude/settings.json` 或项目下 `.claude/settings.json`):
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"mcpServers": {
|
|
38
|
+
"vue-codegen": {
|
|
39
|
+
"command": "npx",
|
|
40
|
+
"args": ["-y", "mcp-vue-codegen"]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
21
45
|
|
|
22
|
-
|
|
46
|
+
**Trae / VS Code**(MCP 设置中添加):
|
|
23
47
|
|
|
24
48
|
```json
|
|
25
49
|
{
|
|
@@ -32,51 +56,130 @@ npx mcp-vue-codegen
|
|
|
32
56
|
}
|
|
33
57
|
```
|
|
34
58
|
|
|
59
|
+
### 2. 准备 JSON 文档
|
|
60
|
+
|
|
61
|
+
参考 [example/table-schema.json](./example/table-schema.json) 编写你的表字段描述文件。
|
|
62
|
+
|
|
63
|
+
### 3. 在 IDE 中调用
|
|
64
|
+
|
|
65
|
+
配置好后,直接在 AI 对话中用自然语言调用即可:
|
|
66
|
+
|
|
67
|
+
**生成前端代码:**
|
|
68
|
+
|
|
69
|
+
> 用 generate_vue_crud 工具,schemaInput 为 E:/codegen/template/table-schema.json
|
|
70
|
+
|
|
71
|
+
输出路径自动推导为 `{projectRoot}/src/views/{moduleName}/{componentName}/`
|
|
72
|
+
|
|
73
|
+
**生成后端代码:**
|
|
74
|
+
|
|
75
|
+
> 用 generate_java_crud 工具,schemaInput 为 E:/codegen/template/table-schema.json,projectRoot 为 E:/vue3/worsoft5.3
|
|
76
|
+
|
|
77
|
+
输出路径自动推导为 `{projectRoot}/worsoft-{moduleName}/` 下的标准 Java 包结构
|
|
78
|
+
|
|
79
|
+
**校验 JSON 文档:**
|
|
80
|
+
|
|
81
|
+
> 用 validate_schema 工具,schemaInput 为 E:/codegen/template/table-schema.json
|
|
82
|
+
|
|
35
83
|
## MCP Tools
|
|
36
84
|
|
|
37
85
|
### validate_schema
|
|
38
86
|
|
|
39
|
-
校验 JSON
|
|
87
|
+
校验 JSON 文档是否符合代码生成规范。
|
|
40
88
|
|
|
41
|
-
| 参数 | 类型 | 说明 |
|
|
42
|
-
|
|
43
|
-
|
|
|
89
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
90
|
+
|------|------|------|------|
|
|
91
|
+
| schemaInput | string | 是 | JSON 文件路径 或 JSON 字符串 |
|
|
44
92
|
|
|
45
93
|
### generate_vue_crud
|
|
46
94
|
|
|
47
|
-
|
|
95
|
+
生成 Vue3 前端 CRUD 代码。
|
|
96
|
+
|
|
97
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
98
|
+
|------|------|------|------|
|
|
99
|
+
| schemaInput | string | 是 | JSON 文件路径 或 JSON 字符串 |
|
|
100
|
+
| projectRoot | string | 否 | 前端项目根目录,默认当前工作目录 |
|
|
101
|
+
| outputDir | string | 否 | 直接指定输出目录,指定后忽略自动推导 |
|
|
48
102
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
103
|
+
### generate_java_crud
|
|
104
|
+
|
|
105
|
+
生成 Java 后端 CRUD 代码。
|
|
106
|
+
|
|
107
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
108
|
+
|------|------|------|------|
|
|
109
|
+
| schemaInput | string | 是 | JSON 文件路径 或 JSON 字符串 |
|
|
110
|
+
| projectRoot | string | 否 | 后端项目根目录,默认当前工作目录 |
|
|
53
111
|
|
|
54
112
|
## JSON 文档格式
|
|
55
113
|
|
|
114
|
+
完整示例见 [example/table-schema.json](./example/table-schema.json),核心结构如下:
|
|
115
|
+
|
|
56
116
|
```json
|
|
57
117
|
{
|
|
58
118
|
"module": {
|
|
59
119
|
"moduleName": "oa",
|
|
60
120
|
"businessName": "企业证照借用",
|
|
61
121
|
"entityName": "CertBorrow",
|
|
122
|
+
"componentName": "CertBorrow",
|
|
62
123
|
"apiBasePath": "/oa/certBorrow",
|
|
124
|
+
"apiFilePath": "api/oa/CertBorrow",
|
|
63
125
|
"permissionPrefix": "oa_OaCertificatesBorrow",
|
|
64
126
|
"hasWorkflow": true,
|
|
65
127
|
"hasExport": true,
|
|
66
|
-
"hasPrint": true
|
|
128
|
+
"hasPrint": true,
|
|
129
|
+
"labelWidth": "100px"
|
|
67
130
|
},
|
|
68
131
|
"master": {
|
|
69
132
|
"tableName": "oa_cert_borrow",
|
|
70
|
-
"formSections": [
|
|
71
|
-
|
|
133
|
+
"formSections": [
|
|
134
|
+
{ "name": "basic", "collapseIndex": "0", "title": "基本信息" }
|
|
135
|
+
],
|
|
136
|
+
"filterTypes": { "billStateId": 30 },
|
|
137
|
+
"fields": [
|
|
138
|
+
{
|
|
139
|
+
"columnName": "id",
|
|
140
|
+
"fieldName": "id",
|
|
141
|
+
"label": "单据ID",
|
|
142
|
+
"dataType": "varchar(64)",
|
|
143
|
+
"inputType": "hidden",
|
|
144
|
+
"required": false,
|
|
145
|
+
"showInTable": false,
|
|
146
|
+
"alwaysHide": true,
|
|
147
|
+
"smartSearch": false,
|
|
148
|
+
"tableWidth": "0",
|
|
149
|
+
"isPrimaryKey": true
|
|
150
|
+
}
|
|
151
|
+
]
|
|
72
152
|
},
|
|
73
153
|
"detail": {
|
|
74
154
|
"tableName": "oa_cert_borrow_detail",
|
|
75
|
-
"
|
|
155
|
+
"detailTitle": "企业证照借用从表",
|
|
156
|
+
"detailFkField": "mainId",
|
|
157
|
+
"detailListName": "details",
|
|
158
|
+
"fields": []
|
|
76
159
|
}
|
|
77
160
|
}
|
|
78
161
|
```
|
|
79
162
|
|
|
163
|
+
### 关键字段说明
|
|
164
|
+
|
|
165
|
+
| 字段属性 | 作用 |
|
|
166
|
+
|---------|------|
|
|
167
|
+
| `hasWorkflow` | 控制流程相关按钮(提交/流转)和后端 processCompleted 回调 |
|
|
168
|
+
| `hasExport` / `hasPrint` | 控制导出/打印按钮及后端对应接口 |
|
|
169
|
+
| `showInTable` + `alwaysHide` | 决定表格列是否显示 |
|
|
170
|
+
| `showInForm` + `formSection` + `formRow` + `formColSpan` | 决定表单字段布局 |
|
|
171
|
+
| `inputType` | 控件类型:input / date / textarea / file / select / userRef / personRef |
|
|
172
|
+
| `smartSearch` | 是否纳入智能搜索范围 |
|
|
173
|
+
| `dictCode` + `needFormatter` | 字典格式化(前端 formatter + 后端 @Dict 注解) |
|
|
174
|
+
| `refConfig` | 弹窗选择器配置(组件、字段映射) |
|
|
175
|
+
| `editableInTable` | 从表行内编辑(select / date) |
|
|
176
|
+
| `required` | 前端校验规则 |
|
|
177
|
+
| `isPrimaryKey` / `isForeignKey` / `isSystemField` | 后端实体类字段类型推导和过滤 |
|
|
178
|
+
|
|
179
|
+
## 环境要求
|
|
180
|
+
|
|
181
|
+
- Node.js >= 18
|
|
182
|
+
|
|
80
183
|
## License
|
|
81
184
|
|
|
82
185
|
MIT
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface BackendGenerateResult {
|
|
2
|
+
success: boolean;
|
|
3
|
+
files: {
|
|
4
|
+
path: string;
|
|
5
|
+
lines: number;
|
|
6
|
+
description: string;
|
|
7
|
+
}[];
|
|
8
|
+
error?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function generateJavaCrud(schemaJson: string, projectRoot: string): Promise<BackendGenerateResult>;
|
|
11
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/generators/backend.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAyG9G"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.generateJavaCrud = generateJavaCrud;
|
|
37
|
+
const fs = __importStar(require("node:fs"));
|
|
38
|
+
const path = __importStar(require("node:path"));
|
|
39
|
+
const validate_js_1 = require("../tools/validate.js");
|
|
40
|
+
const entity_tpl_js_1 = require("../templates/backend/entity.tpl.js");
|
|
41
|
+
const mapper_tpl_js_1 = require("../templates/backend/mapper.tpl.js");
|
|
42
|
+
const service_tpl_js_1 = require("../templates/backend/service.tpl.js");
|
|
43
|
+
const controller_tpl_js_1 = require("../templates/backend/controller.tpl.js");
|
|
44
|
+
async function generateJavaCrud(schemaJson, projectRoot) {
|
|
45
|
+
try {
|
|
46
|
+
const schema = (0, validate_js_1.parseSchema)(schemaJson);
|
|
47
|
+
const m = schema.module;
|
|
48
|
+
const entity = m.entityName;
|
|
49
|
+
const moduleName = m.moduleName;
|
|
50
|
+
const hasDetail = !!schema.detail;
|
|
51
|
+
const files = [];
|
|
52
|
+
// 基础路径
|
|
53
|
+
const apiBase = path.join(projectRoot, `worsoft-${moduleName}`, `worsoft-${moduleName}-api`, 'src', 'main', 'java', 'com', 'worsoft', 'worsoft', moduleName);
|
|
54
|
+
const bizBase = path.join(projectRoot, `worsoft-${moduleName}`, `worsoft-${moduleName}-biz`, 'src', 'main', 'java', 'com', 'worsoft', 'worsoft', moduleName);
|
|
55
|
+
const resourceBase = path.join(projectRoot, `worsoft-${moduleName}`, `worsoft-${moduleName}-biz`, 'src', 'main', 'resources');
|
|
56
|
+
// 辅助函数:写文件
|
|
57
|
+
function writeFile(filePath, content, desc) {
|
|
58
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
59
|
+
fs.writeFileSync(filePath, content, 'utf-8');
|
|
60
|
+
files.push({ path: filePath, lines: content.split('\n').length, description: desc });
|
|
61
|
+
}
|
|
62
|
+
// 1. Entity
|
|
63
|
+
writeFile(path.join(apiBase, 'entity', `${entity}Entity.java`), (0, entity_tpl_js_1.generateMasterEntity)(schema), `主表实体类`);
|
|
64
|
+
if (hasDetail) {
|
|
65
|
+
writeFile(path.join(apiBase, 'entity', `${entity}DetailEntity.java`), (0, entity_tpl_js_1.generateDetailEntity)(schema), `从表实体类`);
|
|
66
|
+
}
|
|
67
|
+
// 2. Mapper
|
|
68
|
+
writeFile(path.join(bizBase, 'mapper', `${entity}Mapper.java`), (0, mapper_tpl_js_1.generateMasterMapper)(schema), `主表 Mapper 接口`);
|
|
69
|
+
writeFile(path.join(resourceBase, 'mapper', `${entity}Mapper.xml`), (0, mapper_tpl_js_1.generateMasterMapperXml)(schema), `主表 Mapper XML`);
|
|
70
|
+
if (hasDetail) {
|
|
71
|
+
writeFile(path.join(bizBase, 'mapper', `${entity}DetailMapper.java`), (0, mapper_tpl_js_1.generateDetailMapper)(schema), `从表 Mapper 接口`);
|
|
72
|
+
writeFile(path.join(resourceBase, 'mapper', `${entity}DetailMapper.xml`), (0, mapper_tpl_js_1.generateDetailMapperXml)(schema), `从表 Mapper XML`);
|
|
73
|
+
}
|
|
74
|
+
// 3. Service
|
|
75
|
+
writeFile(path.join(bizBase, 'service', `${entity}Service.java`), (0, service_tpl_js_1.generateMasterService)(schema), `主表 Service 接口`);
|
|
76
|
+
writeFile(path.join(bizBase, 'service', 'impl', `${entity}ServiceImpl.java`), (0, service_tpl_js_1.generateMasterServiceImpl)(schema), `主表 Service 实现(含从表CRUD、${m.hasWorkflow ? '工作流回调' : ''})`);
|
|
77
|
+
if (hasDetail) {
|
|
78
|
+
writeFile(path.join(bizBase, 'service', `${entity}DetailService.java`), (0, service_tpl_js_1.generateDetailService)(schema), `从表 Service 接口`);
|
|
79
|
+
writeFile(path.join(bizBase, 'service', 'impl', `${entity}DetailServiceImpl.java`), (0, service_tpl_js_1.generateDetailServiceImpl)(schema), `从表 Service 实现`);
|
|
80
|
+
}
|
|
81
|
+
// 4. Controller
|
|
82
|
+
writeFile(path.join(bizBase, 'controller', `${entity}Controller.java`), (0, controller_tpl_js_1.generateController)(schema), `Controller(${[m.hasWorkflow && '工作流', m.hasExport && '导出', m.hasPrint && '打印'].filter(Boolean).join('、') || 'CRUD'})`);
|
|
83
|
+
return { success: true, files };
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
return { success: false, files: [], error: e.message };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/generators/backend.ts"],"names":[],"mappings":"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"}
|
package/build/index.js
CHANGED
|
@@ -41,9 +41,10 @@ const fs = __importStar(require("node:fs"));
|
|
|
41
41
|
const path = __importStar(require("node:path"));
|
|
42
42
|
const validate_js_1 = require("./tools/validate.js");
|
|
43
43
|
const generate_js_1 = require("./tools/generate.js");
|
|
44
|
+
const backend_js_1 = require("./generators/backend.js");
|
|
44
45
|
const server = new mcp_js_1.McpServer({
|
|
45
46
|
name: 'mcp-vue-codegen',
|
|
46
|
-
version: '1.
|
|
47
|
+
version: '1.3.0',
|
|
47
48
|
});
|
|
48
49
|
/**
|
|
49
50
|
* 读取 schema:支持文件路径或 JSON 字符串
|
|
@@ -120,6 +121,36 @@ projectRoot 和 outputDir 都是可选的,不传则使用当前工作目录作
|
|
|
120
121
|
};
|
|
121
122
|
}
|
|
122
123
|
});
|
|
124
|
+
// Tool 3: generate_java_crud
|
|
125
|
+
server.tool('generate_java_crud', `根据 JSON 文档生成完整的 Java 后端 CRUD 代码(Entity、Mapper、Service、ServiceImpl、Controller)。
|
|
126
|
+
|
|
127
|
+
自动生成到 {projectRoot}/worsoft-{moduleName}/ 下对应的 api 和 biz 子模块中。
|
|
128
|
+
包含:主表/从表实体类、Mapper接口及XML、Service接口及实现、Controller(含分页查询、新增、修改、删除、导出、打印等接口)。`, {
|
|
129
|
+
schemaInput: zod_1.z.string().describe('JSON 文件路径(如 E:/codegen/table-schema.json)或 JSON 字符串'),
|
|
130
|
+
projectRoot: zod_1.z.string().optional().describe('后端项目根目录(如 E:/vue3/worsoft5.3),不传则使用当前工作目录'),
|
|
131
|
+
}, async ({ schemaInput, projectRoot }) => {
|
|
132
|
+
try {
|
|
133
|
+
const schemaJson = resolveSchemaJson(schemaInput);
|
|
134
|
+
const root = projectRoot || process.cwd();
|
|
135
|
+
const result = await (0, backend_js_1.generateJavaCrud)(schemaJson, root);
|
|
136
|
+
if (result.success) {
|
|
137
|
+
const fileList = result.files
|
|
138
|
+
.map(f => ` - ${f.path} (${f.lines} 行) — ${f.description}`)
|
|
139
|
+
.join('\n');
|
|
140
|
+
return {
|
|
141
|
+
content: [{ type: 'text', text: `✅ 后端代码生成成功!\n\n生成文件列表:\n${fileList}` }],
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
content: [{ type: 'text', text: `❌ 后端代码生成失败:${result.error}` }],
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
catch (e) {
|
|
149
|
+
return {
|
|
150
|
+
content: [{ type: 'text', text: `❌ 错误:${e.message}` }],
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
});
|
|
123
154
|
// Start the server
|
|
124
155
|
async function main() {
|
|
125
156
|
const transport = new stdio_js_1.StdioServerTransport();
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,oEAAoE;AACpE,wEAAiF;AACjF,6BAAwB;AACxB,4CAA8B;AAC9B,gDAAkC;AAClC,qDAAkE;AAClE,qDAAsD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.tpl.d.ts","sourceRoot":"","sources":["../../../src/templates/backend/controller.tpl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAgM9D"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateController = generateController;
|
|
4
|
+
function generateController(schema) {
|
|
5
|
+
const m = schema.module;
|
|
6
|
+
const entity = m.entityName;
|
|
7
|
+
const hasWorkflow = m.hasWorkflow;
|
|
8
|
+
const hasExport = m.hasExport;
|
|
9
|
+
const hasPrint = m.hasPrint;
|
|
10
|
+
const pkg = `com.worsoft.worsoft.${m.moduleName}.controller`;
|
|
11
|
+
const basePkg = `com.worsoft.worsoft.${m.moduleName}`;
|
|
12
|
+
// 请求路径:从 apiBasePath 取最后一段,如 /oa/certBorrow → /certBorrow
|
|
13
|
+
const pathSegments = m.apiBasePath.split('/').filter(Boolean);
|
|
14
|
+
const requestPath = '/' + pathSegments[pathSegments.length - 1];
|
|
15
|
+
// 基类选择
|
|
16
|
+
const baseController = hasWorkflow ? 'BaseProcessController' : 'BaseProcessController';
|
|
17
|
+
const baseControllerImport = `import com.worsoft.worsoft.common.data.base.${baseController};
|
|
18
|
+
import com.worsoft.worsoft.common.data.base.BaseService;`;
|
|
19
|
+
let imports = `import com.worsoft.worsoft.common.core.constant.ErrorConstants;
|
|
20
|
+
import com.worsoft.worsoft.common.core.constant.FieldConstant;
|
|
21
|
+
import com.worsoft.worsoft.common.core.util.R;
|
|
22
|
+
${baseControllerImport}
|
|
23
|
+
import com.worsoft.worsoft.common.data.dto.PageDto;
|
|
24
|
+
import com.worsoft.worsoft.common.data.util.BaseQueryWrapper;
|
|
25
|
+
import com.worsoft.worsoft.common.data.util.WrapperBuilder;
|
|
26
|
+
import com.worsoft.worsoft.common.security.util.SecurityUtils;
|
|
27
|
+
import ${basePkg}.entity.${entity}Entity;
|
|
28
|
+
import ${basePkg}.service.${entity}Service;
|
|
29
|
+
import io.swagger.v3.oas.annotations.Operation;
|
|
30
|
+
import io.swagger.v3.oas.annotations.tags.Tag;
|
|
31
|
+
import lombok.RequiredArgsConstructor;
|
|
32
|
+
import org.springframework.web.bind.annotation.*;
|
|
33
|
+
import java.util.List;`;
|
|
34
|
+
if (hasExport) {
|
|
35
|
+
imports += `
|
|
36
|
+
import cn.hutool.core.bean.BeanUtil;
|
|
37
|
+
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
38
|
+
import com.worsoft.worsoft.common.excel.annotation.ResponseExcel;
|
|
39
|
+
import com.worsoft.worsoft.common.excel.dto.ExportExcelVO;
|
|
40
|
+
import java.util.Map;`;
|
|
41
|
+
}
|
|
42
|
+
if (hasPrint) {
|
|
43
|
+
imports += `
|
|
44
|
+
import com.worsoft.worsoft.common.data.handler.JimuResolver;
|
|
45
|
+
import com.worsoft.worsoft.common.security.tenant.TenantContextHolder;`;
|
|
46
|
+
}
|
|
47
|
+
// 方法生成
|
|
48
|
+
let methods = '';
|
|
49
|
+
// getCurrentService
|
|
50
|
+
methods += `
|
|
51
|
+
@Override
|
|
52
|
+
protected BaseService getCurrentService() {
|
|
53
|
+
return ${lowerFirst(entity)}Service;
|
|
54
|
+
}
|
|
55
|
+
`;
|
|
56
|
+
// removeByIds
|
|
57
|
+
methods += `
|
|
58
|
+
/**
|
|
59
|
+
* 通过id删除${m.businessName}
|
|
60
|
+
*/
|
|
61
|
+
@Operation(summary = "通过id删除${m.businessName}", description = "通过id删除${m.businessName}")
|
|
62
|
+
@PostMapping("/removeByIds")
|
|
63
|
+
public R removeById(@RequestBody List<Long> ids) {
|
|
64
|
+
return R.ok(${lowerFirst(entity)}Service.removeByIds(ids));
|
|
65
|
+
}
|
|
66
|
+
`;
|
|
67
|
+
// save
|
|
68
|
+
methods += `
|
|
69
|
+
/**
|
|
70
|
+
* 新增${m.businessName}
|
|
71
|
+
*/
|
|
72
|
+
@Operation(summary = "新增${m.businessName}", description = "新增${m.businessName}")
|
|
73
|
+
@PostMapping
|
|
74
|
+
public R save(@RequestBody ${entity}Entity entity) {
|
|
75
|
+
if (${lowerFirst(entity)}Service.save(entity)) {
|
|
76
|
+
return R.ok(entity);
|
|
77
|
+
}
|
|
78
|
+
return R.failed(ErrorConstants.SUBMIT_ERROR_MSG);
|
|
79
|
+
}
|
|
80
|
+
`;
|
|
81
|
+
// updateById
|
|
82
|
+
methods += `
|
|
83
|
+
/**
|
|
84
|
+
* 修改${m.businessName}
|
|
85
|
+
*/
|
|
86
|
+
@Operation(summary = "修改${m.businessName}", description = "修改${m.businessName}")
|
|
87
|
+
@PostMapping("/updateById")
|
|
88
|
+
public R updateById(@RequestBody ${entity}Entity entity) {
|
|
89
|
+
if (${lowerFirst(entity)}Service.updateAllColumnById(entity)) {
|
|
90
|
+
return R.ok(entity);
|
|
91
|
+
}
|
|
92
|
+
return R.failed(ErrorConstants.DB_UPDATE_ERROR_MSG);
|
|
93
|
+
}
|
|
94
|
+
`;
|
|
95
|
+
// getById
|
|
96
|
+
methods += `
|
|
97
|
+
/**
|
|
98
|
+
* 通过id查询${m.businessName}
|
|
99
|
+
*/
|
|
100
|
+
@Operation(summary = "通过id查询", description = "通过id查询")
|
|
101
|
+
@GetMapping("/{id}")
|
|
102
|
+
public R getById(@PathVariable("id") Long id) {
|
|
103
|
+
return R.ok(${lowerFirst(entity)}Service.getById(id));
|
|
104
|
+
}
|
|
105
|
+
`;
|
|
106
|
+
// page
|
|
107
|
+
methods += `
|
|
108
|
+
/**
|
|
109
|
+
* 分页查询${m.businessName}
|
|
110
|
+
*/
|
|
111
|
+
@Operation(summary = "分页查询", description = "分页查询")
|
|
112
|
+
@GetMapping("/page")
|
|
113
|
+
public R get${entity}Page(PageDto page, ${entity}Entity entity) {
|
|
114
|
+
BaseQueryWrapper<${entity}Entity> query = WrapperBuilder.generateQuery(entity, page);
|
|
115
|
+
query.likeRight(FieldConstant.CREATE_PSM_FULL_ID, SecurityUtils.getCurrentPsmInfo().getOgnFullId());
|
|
116
|
+
return R.ok(${lowerFirst(entity)}Service.page(page, query));
|
|
117
|
+
}
|
|
118
|
+
`;
|
|
119
|
+
// export
|
|
120
|
+
if (hasExport) {
|
|
121
|
+
methods += `
|
|
122
|
+
/**
|
|
123
|
+
* 导出${m.businessName}
|
|
124
|
+
*/
|
|
125
|
+
@ResponseExcel
|
|
126
|
+
@Operation(summary = "导出功能", description = "导出功能")
|
|
127
|
+
@PostMapping("/export")
|
|
128
|
+
public ExportExcelVO export(@RequestBody Map params) {
|
|
129
|
+
PageDto page = new PageDto();
|
|
130
|
+
page.setSize(-1);
|
|
131
|
+
BeanUtil.copyProperties(params, page);
|
|
132
|
+
${entity}Entity entity = new ${entity}Entity();
|
|
133
|
+
BeanUtil.copyProperties(params, entity);
|
|
134
|
+
BaseQueryWrapper<${entity}Entity> query = WrapperBuilder.generateQuery(entity, page);
|
|
135
|
+
query.likeRight(FieldConstant.CREATE_PSM_FULL_ID, SecurityUtils.getCurrentPsmInfo().getOgnFullId());
|
|
136
|
+
List<${entity}Entity> records = ${lowerFirst(entity)}Service.page((Page) page, query).getRecords();
|
|
137
|
+
return new ExportExcelVO(records, params);
|
|
138
|
+
}
|
|
139
|
+
`;
|
|
140
|
+
}
|
|
141
|
+
// print
|
|
142
|
+
if (hasPrint) {
|
|
143
|
+
methods += `
|
|
144
|
+
/**
|
|
145
|
+
* 获取打印数据
|
|
146
|
+
*/
|
|
147
|
+
@Operation(summary = "获取打印数据通过ID", description = "获取打印数据通过ID")
|
|
148
|
+
@GetMapping("/getPrintById/{id}")
|
|
149
|
+
public R getPrintById(@PathVariable("id") Long id) {
|
|
150
|
+
try {
|
|
151
|
+
TenantContextHolder.setTenantSkip();
|
|
152
|
+
return R.ok(JimuResolver.getObj(${lowerFirst(entity)}Service.getById(id)));
|
|
153
|
+
} finally {
|
|
154
|
+
TenantContextHolder.clear();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
`;
|
|
158
|
+
}
|
|
159
|
+
return `/*
|
|
160
|
+
* Copyright (c) 2018-2025, worsoft All rights reserved.
|
|
161
|
+
*/
|
|
162
|
+
package ${pkg};
|
|
163
|
+
|
|
164
|
+
${imports}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* ${m.businessName}
|
|
168
|
+
*
|
|
169
|
+
* @author codegen
|
|
170
|
+
*/
|
|
171
|
+
@RestController
|
|
172
|
+
@RequiredArgsConstructor
|
|
173
|
+
@RequestMapping("${requestPath}")
|
|
174
|
+
@Tag(description = "${entity}", name = "${m.businessName}管理")
|
|
175
|
+
public class ${entity}Controller extends ${baseController} {
|
|
176
|
+
|
|
177
|
+
private final ${entity}Service ${lowerFirst(entity)}Service;
|
|
178
|
+
${methods}
|
|
179
|
+
}
|
|
180
|
+
`;
|
|
181
|
+
}
|
|
182
|
+
function lowerFirst(s) {
|
|
183
|
+
return s.charAt(0).toLowerCase() + s.slice(1);
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=controller.tpl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.tpl.js","sourceRoot":"","sources":["../../../src/templates/backend/controller.tpl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity.tpl.d.ts","sourceRoot":"","sources":["../../../src/templates/backend/entity.tpl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAY,MAAM,uBAAuB,CAAC;AAuD9D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA4FhE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA0EhE"}
|