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 CHANGED
@@ -1,25 +1,49 @@
1
1
  # mcp-vue-codegen
2
2
 
3
- MCP Server,根据数据库表字段 JSON 文档自动生成 Vue3 前端 CRUD 模块代码。
3
+ MCP Server,根据数据库表字段 JSON 文档自动生成 **Vue3 前端** + **Java 后端** 完整 CRUD 模块代码。
4
4
 
5
- ## 生成文件
5
+ ## 功能概览
6
6
 
7
- - `options.ts` 表单字段配置、过滤类型
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
- ### npx 直接运行
16
+ ### 后端生成(Spring Boot + MyBatis-Plus)
15
17
 
16
- ```bash
17
- npx mcp-vue-codegen
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
- ### IDE 配置
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
- Claude CodeMCP 设置中添加:
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
- | schemaJson | string | JSON 文档内容 |
89
+ | 参数 | 类型 | 必填 | 说明 |
90
+ |------|------|------|------|
91
+ | schemaInput | string | 是 | JSON 文件路径 或 JSON 字符串 |
44
92
 
45
93
  ### generate_vue_crud
46
94
 
47
- 根据 JSON 文档生成完整 CRUD 代码。
95
+ 生成 Vue3 前端 CRUD 代码。
96
+
97
+ | 参数 | 类型 | 必填 | 说明 |
98
+ |------|------|------|------|
99
+ | schemaInput | string | 是 | JSON 文件路径 或 JSON 字符串 |
100
+ | projectRoot | string | 否 | 前端项目根目录,默认当前工作目录 |
101
+ | outputDir | string | 否 | 直接指定输出目录,指定后忽略自动推导 |
48
102
 
49
- | 参数 | 类型 | 说明 |
50
- |------|------|------|
51
- | schemaJson | string | JSON 文档内容 |
52
- | outputDir | string | 输出目录路径 |
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
- "fields": [...]
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
- "fields": [...]
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,4CAyGC;AAxHD,4CAA8B;AAC9B,gDAAkC;AAElC,sDAAmD;AACnD,sEAAgG;AAChG,sEAAkJ;AAClJ,wEAAyJ;AACzJ,8EAA4E;AAQrE,KAAK,UAAU,gBAAgB,CAAC,UAAkB,EAAE,WAAmB;IAC5E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,yBAAW,EAAC,UAAU,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACxB,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC;QAC5B,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;QAChC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QAElC,MAAM,KAAK,GAA2D,EAAE,CAAC;QAEzE,OAAO;QACP,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,UAAU,EAAE,EAAE,WAAW,UAAU,MAAM,EACzF,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,UAAU,EAAE,EAAE,WAAW,UAAU,MAAM,EACzF,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAClE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,UAAU,EAAE,EAAE,WAAW,UAAU,MAAM,EAC9F,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAE9B,WAAW;QACX,SAAS,SAAS,CAAC,QAAgB,EAAE,OAAe,EAAE,IAAY;YAChE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,YAAY;QACZ,SAAS,CACP,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,aAAa,CAAC,EACpD,IAAA,oCAAoB,EAAC,MAAM,CAAC,EAC5B,OAAO,CACR,CAAC;QAEF,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CACP,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,mBAAmB,CAAC,EAC1D,IAAA,oCAAoB,EAAC,MAAM,CAAC,EAC5B,OAAO,CACR,CAAC;QACJ,CAAC;QAED,YAAY;QACZ,SAAS,CACP,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,aAAa,CAAC,EACpD,IAAA,oCAAoB,EAAC,MAAM,CAAC,EAC5B,cAAc,CACf,CAAC;QAEF,SAAS,CACP,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,GAAG,MAAM,YAAY,CAAC,EACxD,IAAA,uCAAuB,EAAC,MAAM,CAAC,EAC/B,eAAe,CAChB,CAAC;QAEF,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CACP,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,mBAAmB,CAAC,EAC1D,IAAA,oCAAoB,EAAC,MAAM,CAAC,EAC5B,cAAc,CACf,CAAC;YAEF,SAAS,CACP,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,GAAG,MAAM,kBAAkB,CAAC,EAC9D,IAAA,uCAAuB,EAAC,MAAM,CAAC,EAC/B,eAAe,CAChB,CAAC;QACJ,CAAC;QAED,aAAa;QACb,SAAS,CACP,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,cAAc,CAAC,EACtD,IAAA,sCAAqB,EAAC,MAAM,CAAC,EAC7B,eAAe,CAChB,CAAC;QAEF,SAAS,CACP,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAkB,CAAC,EAClE,IAAA,0CAAyB,EAAC,MAAM,CAAC,EACjC,yBAAyB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CACzD,CAAC;QAEF,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CACP,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAC5D,IAAA,sCAAqB,EAAC,MAAM,CAAC,EAC7B,eAAe,CAChB,CAAC;YAEF,SAAS,CACP,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,wBAAwB,CAAC,EACxE,IAAA,0CAAyB,EAAC,MAAM,CAAC,EACjC,eAAe,CAChB,CAAC;QACJ,CAAC;QAED,gBAAgB;QAChB,SAAS,CACP,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,iBAAiB,CAAC,EAC5D,IAAA,sCAAkB,EAAC,MAAM,CAAC,EAC1B,cAAc,CAAC,CAAC,CAAC,WAAW,IAAI,KAAK,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,GAAG,CACvH,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IACzD,CAAC;AACH,CAAC"}
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.2.0',
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();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { TableSchema } from '../../types/schema.js';
2
+ export declare function generateController(schema: TableSchema): string;
3
+ //# sourceMappingURL=controller.tpl.d.ts.map
@@ -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":";;AAEA,gDAgMC;AAhMD,SAAgB,kBAAkB,CAAC,MAAmB;IACpD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC;IAC5B,MAAM,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;IAClC,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;IAC9B,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC5B,MAAM,GAAG,GAAG,uBAAuB,CAAC,CAAC,UAAU,aAAa,CAAC;IAC7D,MAAM,OAAO,GAAG,uBAAuB,CAAC,CAAC,UAAU,EAAE,CAAC;IAEtD,0DAA0D;IAC1D,MAAM,YAAY,GAAG,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEhE,OAAO;IACP,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,uBAAuB,CAAC;IACvF,MAAM,oBAAoB,GAAG,+CAA+C,cAAc;yDACnC,CAAC;IAExD,IAAI,OAAO,GAAG;;;EAGd,oBAAoB;;;;;SAKb,OAAO,WAAW,MAAM;SACxB,OAAO,YAAY,MAAM;;;;;uBAKX,CAAC;IAEtB,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,IAAI;;;;;sBAKO,CAAC;IACrB,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,IAAI;;uEAEwD,CAAC;IACtE,CAAC;IAED,OAAO;IACP,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,oBAAoB;IACpB,OAAO,IAAI;;;iBAGI,UAAU,CAAC,MAAM,CAAC;;CAElC,CAAC;IAEA,cAAc;IACd,OAAO,IAAI;;eAEE,CAAC,CAAC,YAAY;;kCAEK,CAAC,CAAC,YAAY,2BAA2B,CAAC,CAAC,YAAY;;;sBAGnE,UAAU,CAAC,MAAM,CAAC;;CAEvC,CAAC;IAEA,OAAO;IACP,OAAO,IAAI;;WAEF,CAAC,CAAC,YAAY;;8BAEK,CAAC,CAAC,YAAY,uBAAuB,CAAC,CAAC,YAAY;;iCAEhD,MAAM;cACzB,UAAU,CAAC,MAAM,CAAC;;;;;CAK/B,CAAC;IAEA,aAAa;IACb,OAAO,IAAI;;WAEF,CAAC,CAAC,YAAY;;8BAEK,CAAC,CAAC,YAAY,uBAAuB,CAAC,CAAC,YAAY;;uCAE1C,MAAM;cAC/B,UAAU,CAAC,MAAM,CAAC;;;;;CAK/B,CAAC;IAEA,UAAU;IACV,OAAO,IAAI;;eAEE,CAAC,CAAC,YAAY;;;;;sBAKP,UAAU,CAAC,MAAM,CAAC;;CAEvC,CAAC;IAEA,OAAO;IACP,OAAO,IAAI;;aAEA,CAAC,CAAC,YAAY;;;;kBAIT,MAAM,sBAAsB,MAAM;2BACzB,MAAM;;sBAEX,UAAU,CAAC,MAAM,CAAC;;CAEvC,CAAC;IAEA,SAAS;IACT,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,IAAI;;WAEJ,CAAC,CAAC,YAAY;;;;;;;;;UASf,MAAM,uBAAuB,MAAM;;2BAElB,MAAM;;eAElB,MAAM,qBAAqB,UAAU,CAAC,MAAM,CAAC;;;CAG3D,CAAC;IACA,CAAC;IAED,QAAQ;IACR,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,IAAI;;;;;;;;;8CAS+B,UAAU,CAAC,MAAM,CAAC;;;;;CAK/D,CAAC;IACA,CAAC;IAED,OAAO;;;UAGC,GAAG;;EAEX,OAAO;;;KAGJ,CAAC,CAAC,YAAY;;;;;;mBAMA,WAAW;sBACR,MAAM,cAAc,CAAC,CAAC,YAAY;eACzC,MAAM,sBAAsB,cAAc;;oBAErC,MAAM,WAAW,UAAU,CAAC,MAAM,CAAC;EACrD,OAAO;;CAER,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { TableSchema } from '../../types/schema.js';
2
+ export declare function generateMasterEntity(schema: TableSchema): string;
3
+ export declare function generateDetailEntity(schema: TableSchema): string;
4
+ //# sourceMappingURL=entity.tpl.d.ts.map
@@ -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"}