@es-plus/cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +421 -0
- package/build/commands/create.d.ts +3 -0
- package/build/commands/create.d.ts.map +1 -0
- package/build/commands/create.js +79 -0
- package/build/commands/create.js.map +1 -0
- package/build/commands/scaffold.d.ts +3 -0
- package/build/commands/scaffold.d.ts.map +1 -0
- package/build/commands/scaffold.js +29 -0
- package/build/commands/scaffold.js.map +1 -0
- package/build/commands/validate.d.ts +3 -0
- package/build/commands/validate.d.ts.map +1 -0
- package/build/commands/validate.js +57 -0
- package/build/commands/validate.js.map +1 -0
- package/build/core/code-generator.d.ts +9 -0
- package/build/core/code-generator.d.ts.map +1 -0
- package/build/core/code-generator.js +87 -0
- package/build/core/code-generator.js.map +1 -0
- package/build/core/constants.d.ts +61 -0
- package/build/core/constants.d.ts.map +1 -0
- package/build/core/constants.js +51 -0
- package/build/core/constants.js.map +1 -0
- package/build/core/crud-engine.d.ts +12 -0
- package/build/core/crud-engine.d.ts.map +1 -0
- package/build/core/crud-engine.js +405 -0
- package/build/core/crud-engine.js.map +1 -0
- package/build/core/schema-validator.d.ts +9 -0
- package/build/core/schema-validator.d.ts.map +1 -0
- package/build/core/schema-validator.js +83 -0
- package/build/core/schema-validator.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +16 -0
- package/build/index.js.map +1 -0
- package/package.json +57 -0
- package/schemas/api-params.schema.json +36 -0
- package/schemas/btn-config.schema.json +77 -0
- package/schemas/dialog-options.schema.json +149 -0
- package/schemas/form-item.schema.json +146 -0
- package/schemas/index.schema.json +71 -0
- package/schemas/table-column.schema.json +118 -0
- package/schemas/table-options.schema.json +141 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 liujiaao
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
# @es-plus/cli
|
|
2
|
+
|
|
3
|
+
[es-plus-ui](https://www.npmjs.com/package/es-plus-ui) 官方命令行工具 —— 用自然语言生成 Vue 3 CRUD 页面,校验 JSON 配置,快速搭建页面脚手架。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# 方式一:npx 直接运行(无需安装)
|
|
9
|
+
npx @es-plus/cli create user-management
|
|
10
|
+
|
|
11
|
+
# 方式二:全局安装
|
|
12
|
+
npm install -g @es-plus/cli
|
|
13
|
+
|
|
14
|
+
# 方式三:项目内安装
|
|
15
|
+
npm install -D @es-plus/cli
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
安装后,终端可直接使用 `es-plus` 命令。
|
|
19
|
+
|
|
20
|
+
> **环境要求:** Node.js >= 18,npm >= 8
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 命令总览
|
|
25
|
+
|
|
26
|
+
| 命令 | 说明 | 示例 |
|
|
27
|
+
|------|------|------|
|
|
28
|
+
| `es-plus create <name>` | 自然语言 → 完整 CRUD 页面 | `es-plus create user-management` |
|
|
29
|
+
| `es-plus validate <file>` | 校验 JSON 配置文件 | `es-plus validate ./config.json` |
|
|
30
|
+
| `es-plus scaffold <name>` | 生成最小页面脚手架 | `es-plus scaffold dashboard` |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## create — 生成 CRUD 页面
|
|
35
|
+
|
|
36
|
+
从自然语言描述生成完整的 Vue 3 CRUD 页面(.vue SFC),包含查询表单、数据表格、新增/编辑弹窗、删除确认。
|
|
37
|
+
|
|
38
|
+
### 基本用法
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# 交互式 — 引导选择预设或输入描述
|
|
42
|
+
es-plus create user-management
|
|
43
|
+
|
|
44
|
+
# 非交互式 — 直接传入描述
|
|
45
|
+
es-plus create user-management \
|
|
46
|
+
-d "用户管理,查询姓名、手机号、状态,表格显示姓名、手机号、邮箱、状态、创建时间,支持新增编辑删除"
|
|
47
|
+
|
|
48
|
+
# 指定输出路径
|
|
49
|
+
es-plus create user-management \
|
|
50
|
+
-d "用户管理,查询姓名、手机号、状态,表格显示姓名、手机号、邮箱、状态、创建时间,支持新增编辑删除" \
|
|
51
|
+
-o ./src/views/system/UserManagement.vue
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 参数说明
|
|
55
|
+
|
|
56
|
+
| 参数 | 说明 | 默认值 |
|
|
57
|
+
|------|------|--------|
|
|
58
|
+
| `<name>` | 页面名称(kebab-case) | **必填** |
|
|
59
|
+
| `-d, --description` | 跳过交互,直接用此描述生成 | 无(进入交互模式) |
|
|
60
|
+
| `-o, --output <path>` | 输出文件路径 | `./src/views/<PascalName>.vue` |
|
|
61
|
+
|
|
62
|
+
### 交互流程
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
$ es-plus create order-list
|
|
66
|
+
|
|
67
|
+
? 选择预设或自定义描述
|
|
68
|
+
❯ 自定义描述
|
|
69
|
+
用户管理
|
|
70
|
+
订单列表
|
|
71
|
+
商品管理
|
|
72
|
+
日志查询
|
|
73
|
+
角色权限
|
|
74
|
+
员工花名册
|
|
75
|
+
文章管理
|
|
76
|
+
系统配置
|
|
77
|
+
|
|
78
|
+
? 请描述页面功能: 订单列表,查询订单号、客户名称、日期范围、状态,
|
|
79
|
+
表格显示订单号、客户、金额、状态、创建时间,支持查看详情和删除
|
|
80
|
+
|
|
81
|
+
? 输出路径: ./src/views/OrderList.vue
|
|
82
|
+
|
|
83
|
+
⏳ 正在生成...
|
|
84
|
+
|
|
85
|
+
✔ 已生成: ./src/views/OrderList.vue
|
|
86
|
+
Generated CRUD page with:
|
|
87
|
+
- 4 query form fields
|
|
88
|
+
- 6 table columns (including actions)
|
|
89
|
+
- Actions: view, delete
|
|
90
|
+
- Dialog form with 5 fields and validation
|
|
91
|
+
- Status column with ElTag render
|
|
92
|
+
- Delete with confirmation dialog
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### 描述技巧
|
|
96
|
+
|
|
97
|
+
描述越明确,生成代码越精确。格式:**页面名称 + 查询字段 + 表格字段 + 操作类型**
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# ✅ 好 — 明确分段
|
|
101
|
+
"用户管理页面,
|
|
102
|
+
查询条件有姓名、手机号、状态,
|
|
103
|
+
表格显示姓名、手机号、邮箱、状态、创建时间,
|
|
104
|
+
支持新增编辑删除"
|
|
105
|
+
|
|
106
|
+
# ✅ 好 — 简洁罗列(自动推断查询和表格共用)
|
|
107
|
+
"员工管理:姓名、部门、职位、手机号、状态"
|
|
108
|
+
|
|
109
|
+
# ✅ 好 — 只读列表
|
|
110
|
+
"操作日志查询,查询关键词、级别、日期范围,表格显示时间、级别、操作人、内容,只查看"
|
|
111
|
+
|
|
112
|
+
# ❌ 差 — 太模糊
|
|
113
|
+
"做一个管理页面"
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 关键词智能识别
|
|
117
|
+
|
|
118
|
+
引擎根据字段名自动推断控件类型:
|
|
119
|
+
|
|
120
|
+
| 字段关键词 | 映射控件 | 示例字段 |
|
|
121
|
+
|-----------|---------|---------|
|
|
122
|
+
| 状态、类型、分类、级别、来源 | Select 下拉选择 | 订单状态、用户类型 |
|
|
123
|
+
| 日期、创建时间、更新时间 | datePicker 日期选择器 | 注册日期、下单时间 |
|
|
124
|
+
| 时间、时刻 | timePicker 时间选择器 | 开始时间 |
|
|
125
|
+
| 开关、启用、是否 | Switch 开关 | 是否启用 |
|
|
126
|
+
| 评分、星级 | Rate 评分 | 满意度评分 |
|
|
127
|
+
| 头像、图片、文件、附件 | Upload 上传 | 用户头像 |
|
|
128
|
+
| 备注、描述、内容、简介 | Input(textarea) 多行文本 | 备注信息 |
|
|
129
|
+
| 性别、单选 | Radio 单选框 | 性别 |
|
|
130
|
+
| 多选、标签、兴趣 | Checkbox 多选框 | 兴趣爱好 |
|
|
131
|
+
| 省市、城市、地区、层级 | Cascader 级联选择 | 所在城市 |
|
|
132
|
+
| 进度、区间、范围 | Slider 滑块 | 完成进度 |
|
|
133
|
+
| 穿梭、分配 | Transfer 穿梭框 | 权限分配 |
|
|
134
|
+
| 其他 | Input 输入框 | 姓名、手机号 |
|
|
135
|
+
|
|
136
|
+
### 操作类型识别
|
|
137
|
+
|
|
138
|
+
在描述中用"支持 XXX"指定操作:
|
|
139
|
+
|
|
140
|
+
| 关键词 | 生成内容 |
|
|
141
|
+
|--------|---------|
|
|
142
|
+
| 新增 / 添加 / 创建 | 新增按钮 + 弹窗表单 |
|
|
143
|
+
| 编辑 / 修改 / 更新 | 编辑按钮 + 弹窗表单(回填数据) |
|
|
144
|
+
| 删除 / 移除 | 删除按钮 + ElMessageBox 确认 |
|
|
145
|
+
| 查看 / 详情 | 查看按钮 + 只读弹窗 |
|
|
146
|
+
| 导出 | 导出按钮 |
|
|
147
|
+
| 导入 | 导入按钮 |
|
|
148
|
+
| 只查看 / 只读 | 仅生成表格,无操作按钮 |
|
|
149
|
+
| 不指定 | 默认生成新增、编辑、删除 |
|
|
150
|
+
|
|
151
|
+
### 8 个内置预设
|
|
152
|
+
|
|
153
|
+
| 预设 | 查询 | 表格 | 操作 |
|
|
154
|
+
|------|------|------|------|
|
|
155
|
+
| 用户管理 | 姓名、手机号、状态 | 姓名、手机号、邮箱、状态、创建时间 | 增删改 |
|
|
156
|
+
| 订单列表 | 订单号、客户、日期、状态 | 订单号、客户、金额、状态、创建时间 | 查看、删除 |
|
|
157
|
+
| 商品管理 | 名称、分类、状态 | 名称、分类、价格、库存、状态 | 增删改 |
|
|
158
|
+
| 日志查询 | 关键词、级别、日期 | 时间、级别、操作人、内容 | 只读 |
|
|
159
|
+
| 角色权限 | 角色名称、状态 | 角色名称、描述、状态、创建时间 | 增删改 |
|
|
160
|
+
| 员工花名册 | 姓名、部门、职位 | 姓名、性别、年龄、部门、职位、手机号、状态 | 新增、编辑 |
|
|
161
|
+
| 文章管理 | 标题、分类、状态 | 标题、分类、创建人、创建时间、状态 | 增删改 |
|
|
162
|
+
| 系统配置 | 名称、类型 | 名称、编号、类型、描述、状态 | 增删改导出 |
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## validate — 校验配置
|
|
167
|
+
|
|
168
|
+
校验 JSON 配置文件是否符合 es-plus-ui 组件的 Schema 规范。
|
|
169
|
+
|
|
170
|
+
### 基本用法
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
# 指定 schema 类型
|
|
174
|
+
es-plus validate ./config/form-items.json --schema form-item
|
|
175
|
+
|
|
176
|
+
# 自动检测 schema 类型
|
|
177
|
+
es-plus validate ./config/table-options.json
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### 参数说明
|
|
181
|
+
|
|
182
|
+
| 参数 | 说明 | 默认值 |
|
|
183
|
+
|------|------|--------|
|
|
184
|
+
| `<file>` | JSON 配置文件路径 | **必填** |
|
|
185
|
+
| `-s, --schema <type>` | Schema 类型 | 自动检测 |
|
|
186
|
+
|
|
187
|
+
### 支持的 Schema 类型
|
|
188
|
+
|
|
189
|
+
| 类型 | 验证内容 | 对应组件 |
|
|
190
|
+
|------|----------|----------|
|
|
191
|
+
| `form-item` | 表单项配置 | EsForm 的 `formItemList` |
|
|
192
|
+
| `table-column` | 表格列配置 | EsTable 的 `columns` |
|
|
193
|
+
| `table-options` | 表格选项配置 | EsTable 的 `options` |
|
|
194
|
+
| `dialog-options` | 弹窗配置 | useDialog 参数 |
|
|
195
|
+
|
|
196
|
+
### 自动检测规则
|
|
197
|
+
|
|
198
|
+
不指定 `--schema` 时,根据 JSON 内容自动判断:
|
|
199
|
+
|
|
200
|
+
| JSON 中包含 | 判定为 |
|
|
201
|
+
|-------------|--------|
|
|
202
|
+
| `columns` / `tableData` | `table-column` |
|
|
203
|
+
| `httpRequest` / `configTableOut` / `apiParams` | `table-options` |
|
|
204
|
+
| `render` / `configBtn` / `isDraggable` | `dialog-options` |
|
|
205
|
+
| 其他 | `form-item` |
|
|
206
|
+
|
|
207
|
+
### 输出示例
|
|
208
|
+
|
|
209
|
+
**校验通过:**
|
|
210
|
+
|
|
211
|
+
```
|
|
212
|
+
✔ 校验通过 (schema: form-item)
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**校验失败:**
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
✗ 校验失败(2 个错误):
|
|
219
|
+
(root): must have required property 'prop'
|
|
220
|
+
/formtype: must be equal to one of the allowed values
|
|
221
|
+
|
|
222
|
+
建议:
|
|
223
|
+
- Add missing property "prop"
|
|
224
|
+
- Valid values for /formtype: Input, Select, datePicker, timePicker,
|
|
225
|
+
Slider, ColorPicker, Transfer, Cascader, Radio, Checkbox, Switch, Rate, Upload
|
|
226
|
+
|
|
227
|
+
可用 schema: form-item, table-column, table-options, dialog-options
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### 配合 CI 使用
|
|
231
|
+
|
|
232
|
+
```yaml
|
|
233
|
+
# .github/workflows/validate.yml
|
|
234
|
+
- name: Validate es-plus configs
|
|
235
|
+
run: |
|
|
236
|
+
npx @es-plus/cli validate ./src/configs/user-form.json --schema form-item
|
|
237
|
+
npx @es-plus/cli validate ./src/configs/table-options.json --schema table-options
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## scaffold — 生成脚手架
|
|
243
|
+
|
|
244
|
+
生成最小化的 es-plus 页面模板,适合需要手动编写配置的场景。
|
|
245
|
+
|
|
246
|
+
### 基本用法
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
# 默认:查询 + 表格
|
|
250
|
+
es-plus scaffold user-list
|
|
251
|
+
|
|
252
|
+
# 查询 + 表格 + 弹窗
|
|
253
|
+
es-plus scaffold user-management --features query,table,dialog
|
|
254
|
+
|
|
255
|
+
# 只有表格
|
|
256
|
+
es-plus scaffold data-view --features table
|
|
257
|
+
|
|
258
|
+
# 指定输出路径
|
|
259
|
+
es-plus scaffold report -o ./src/views/report/Index.vue
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### 参数说明
|
|
263
|
+
|
|
264
|
+
| 参数 | 说明 | 默认值 |
|
|
265
|
+
|------|------|--------|
|
|
266
|
+
| `<name>` | 页面名称(kebab-case) | **必填** |
|
|
267
|
+
| `-f, --features <list>` | 功能列表(逗号分隔) | `query,table` |
|
|
268
|
+
| `-o, --output <path>` | 输出文件路径 | `./src/views/<PascalName>.vue` |
|
|
269
|
+
|
|
270
|
+
### 可用 features
|
|
271
|
+
|
|
272
|
+
| Feature | 生成内容 |
|
|
273
|
+
|---------|---------|
|
|
274
|
+
| `query` | EsForm 查询表单 + 查询/重置按钮 |
|
|
275
|
+
| `table` | EsTable 表格 + 分页 + httpRequest 模板 |
|
|
276
|
+
| `dialog` | useDialog 引入 + dialog 实例 |
|
|
277
|
+
|
|
278
|
+
### 生成结果
|
|
279
|
+
|
|
280
|
+
```vue
|
|
281
|
+
<template>
|
|
282
|
+
<div class="user-list-page">
|
|
283
|
+
<es-table ref="tableRef" :columns="columns" :options="options"
|
|
284
|
+
v-model:data-source="tableData" v-model:pagination="pagination">
|
|
285
|
+
<es-form :model="queryForm" :form-item-list="formItems" :config-btn="queryBtns" />
|
|
286
|
+
</es-table>
|
|
287
|
+
</div>
|
|
288
|
+
</template>
|
|
289
|
+
|
|
290
|
+
<script setup>
|
|
291
|
+
import { reactive, ref } from 'vue'
|
|
292
|
+
|
|
293
|
+
const queryForm = reactive({})
|
|
294
|
+
const formItems = []
|
|
295
|
+
const queryBtns = [
|
|
296
|
+
{ name: '查询', type: 'primary', key: 'query', triggerEvent: true },
|
|
297
|
+
{ name: '重置', key: 'rest', triggerEvent: true },
|
|
298
|
+
]
|
|
299
|
+
|
|
300
|
+
const tableRef = ref(null)
|
|
301
|
+
const tableData = ref([])
|
|
302
|
+
const pagination = ref({ current: 1, pageSize: 10, total: 0 })
|
|
303
|
+
const columns = []
|
|
304
|
+
const options = {
|
|
305
|
+
border: true,
|
|
306
|
+
stripe: true,
|
|
307
|
+
highlightCurrentRow: true,
|
|
308
|
+
headerCellStyle: { background: '#f5f7fa' },
|
|
309
|
+
httpRequest: async (params) => {
|
|
310
|
+
// TODO: 替换为实际接口调用
|
|
311
|
+
},
|
|
312
|
+
configTableOut: { total: 'total', tableData: 'data', pageSize: 'pageSize', current: 'pageIndex' },
|
|
313
|
+
}
|
|
314
|
+
</script>
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## 生成代码说明
|
|
320
|
+
|
|
321
|
+
生成的代码是完整可运行的 Vue 3 SFC,通常只需修改以下部分:
|
|
322
|
+
|
|
323
|
+
### 1. 替换接口地址
|
|
324
|
+
|
|
325
|
+
```js
|
|
326
|
+
// 修改 options 中的 httpRequest
|
|
327
|
+
const options = {
|
|
328
|
+
httpRequest: async (params) => {
|
|
329
|
+
const res = await axios.get('/api/user/list', { params: params.formParams })
|
|
330
|
+
return res.data
|
|
331
|
+
},
|
|
332
|
+
configTableOut: {
|
|
333
|
+
total: 'total', // 总条数字段名
|
|
334
|
+
tableData: 'records', // 列表数据字段名(根据实际接口调整)
|
|
335
|
+
pageSize: 'pageSize',
|
|
336
|
+
current: 'pageIndex'
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### 2. 替换删除接口
|
|
342
|
+
|
|
343
|
+
```js
|
|
344
|
+
function handleDelete(row) {
|
|
345
|
+
ElMessageBox.confirm('确定删除该条数据吗?', '提示', { type: 'warning' })
|
|
346
|
+
.then(async () => {
|
|
347
|
+
await axios.delete(`/api/user/${row.id}`) // 替换为实际接口
|
|
348
|
+
ElMessage.success('删除成功')
|
|
349
|
+
tableRef.value?.httpRequestInstance()
|
|
350
|
+
})
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### 3. 替换保存接口
|
|
355
|
+
|
|
356
|
+
```js
|
|
357
|
+
// openForm 函数中的确定按钮
|
|
358
|
+
click: async (_, { close, getRefs }) => {
|
|
359
|
+
try {
|
|
360
|
+
await getRefs('form')?.validate()
|
|
361
|
+
await axios.post('/api/user/save', formData) // 替换为实际接口
|
|
362
|
+
close()
|
|
363
|
+
tableRef.value?.httpRequestInstance()
|
|
364
|
+
} catch { /* 表单验证失败 */ }
|
|
365
|
+
}
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### 4. 调整 Select 选项数据
|
|
369
|
+
|
|
370
|
+
```js
|
|
371
|
+
// 默认生成的是占位选项,替换为实际数据或从接口获取
|
|
372
|
+
{ prop: 'status', label: '状态', formtype: 'Select',
|
|
373
|
+
dataOptions: [{ label: '启用', value: 1 }, { label: '禁用', value: 0 }] }
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## 与 @es-plus/mcp-server 的区别
|
|
379
|
+
|
|
380
|
+
| 特性 | @es-plus/cli | @es-plus/mcp-server |
|
|
381
|
+
|------|-------------|---------------------|
|
|
382
|
+
| 使用方式 | 终端命令行 | AI 编码工具自动调用 |
|
|
383
|
+
| 适用场景 | 批量生成、CI/CD | AI 对话式开发 |
|
|
384
|
+
| 交互方式 | 终端问答 / 命令参数 | AI 自然语言对话 |
|
|
385
|
+
| 输出 | 直接写入 .vue 文件 | 返回代码字符串给 AI |
|
|
386
|
+
|
|
387
|
+
**推荐组合:** 项目初始化用 CLI 批量生成 → 日常迭代用 MCP Server 让 AI 辅助修改。
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
## 常见问题
|
|
392
|
+
|
|
393
|
+
### Q: 支持 TypeScript 吗?
|
|
394
|
+
|
|
395
|
+
生成的是 `<script setup>` 格式(JavaScript)。如需 TypeScript,将 `<script setup>` 改为 `<script setup lang="ts">` 并添加类型注解即可。
|
|
396
|
+
|
|
397
|
+
### Q: 生成的代码依赖什么?
|
|
398
|
+
|
|
399
|
+
- `vue` >= 3.3
|
|
400
|
+
- `es-plus-ui` — 提供 EsForm、EsTable、useDialog
|
|
401
|
+
- `element-plus` — 提供 ElTag、ElMessageBox、ElMessage 等
|
|
402
|
+
|
|
403
|
+
### Q: Windows 下 npx 报错?
|
|
404
|
+
|
|
405
|
+
确保使用 PowerShell 或 Git Bash,Node.js >= 18:
|
|
406
|
+
|
|
407
|
+
```bash
|
|
408
|
+
npx @es-plus/cli create user-management
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
---
|
|
412
|
+
|
|
413
|
+
## 相关链接
|
|
414
|
+
|
|
415
|
+
- [es-plus-ui 组件库](https://www.npmjs.com/package/es-plus-ui)
|
|
416
|
+
- [@es-plus/mcp-server AI 集成](https://www.npmjs.com/package/@es-plus/mcp-server)
|
|
417
|
+
- [GitHub 仓库](https://github.com/es-plus-ui/es-plus)
|
|
418
|
+
|
|
419
|
+
## License
|
|
420
|
+
|
|
421
|
+
[MIT](./LICENSE)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,eAAO,MAAM,aAAa,SA+EtB,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import prompts from "prompts";
|
|
3
|
+
import pc from "picocolors";
|
|
4
|
+
import { writeFileSync, existsSync, mkdirSync } from "node:fs";
|
|
5
|
+
import { dirname, resolve } from "node:path";
|
|
6
|
+
import { generateCrudPage } from "../core/code-generator.js";
|
|
7
|
+
import { PRESET_EXAMPLES } from "../core/constants.js";
|
|
8
|
+
function toPascalCase(str) {
|
|
9
|
+
return str
|
|
10
|
+
.replace(/(^|[-_])([a-z])/g, (_, __, letter) => letter.toUpperCase())
|
|
11
|
+
.replace(/[-_]/g, "");
|
|
12
|
+
}
|
|
13
|
+
export const createCommand = new Command("create")
|
|
14
|
+
.argument("<name>", "page name (kebab-case, e.g. user-management)")
|
|
15
|
+
.option("-o, --output <path>", "output file path")
|
|
16
|
+
.option("-d, --description <desc>", "skip interactive prompt, use this description directly")
|
|
17
|
+
.description("Generate a CRUD page from natural language description")
|
|
18
|
+
.action(async (name, options) => {
|
|
19
|
+
let description = options.description;
|
|
20
|
+
if (!description) {
|
|
21
|
+
const presetChoices = [
|
|
22
|
+
{ title: "自定义描述", value: "__custom__" },
|
|
23
|
+
...PRESET_EXAMPLES.map((p) => ({ title: p.label, value: p.prompt })),
|
|
24
|
+
];
|
|
25
|
+
const { source } = await prompts({
|
|
26
|
+
type: "select",
|
|
27
|
+
name: "source",
|
|
28
|
+
message: "选择预设或自定义描述",
|
|
29
|
+
choices: presetChoices,
|
|
30
|
+
});
|
|
31
|
+
if (!source) {
|
|
32
|
+
console.log(pc.yellow("已取消"));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (source === "__custom__") {
|
|
36
|
+
const { desc } = await prompts({
|
|
37
|
+
type: "text",
|
|
38
|
+
name: "desc",
|
|
39
|
+
message: "请描述页面功能(自然语言)",
|
|
40
|
+
validate: (v) => (v.length > 5 ? true : "描述至少 6 个字符"),
|
|
41
|
+
});
|
|
42
|
+
if (!desc) {
|
|
43
|
+
console.log(pc.yellow("已取消"));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
description = desc;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
description = source;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const defaultOutput = resolve(process.cwd(), `src/views/${toPascalCase(name)}.vue`);
|
|
53
|
+
let outputPath = options.output;
|
|
54
|
+
if (!outputPath) {
|
|
55
|
+
const { path } = await prompts({
|
|
56
|
+
type: "text",
|
|
57
|
+
name: "path",
|
|
58
|
+
message: "输出路径",
|
|
59
|
+
initial: defaultOutput,
|
|
60
|
+
});
|
|
61
|
+
if (!path) {
|
|
62
|
+
console.log(pc.yellow("已取消"));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
outputPath = path;
|
|
66
|
+
}
|
|
67
|
+
outputPath = resolve(process.cwd(), outputPath);
|
|
68
|
+
console.log(pc.cyan("\n⏳ 正在生成..."));
|
|
69
|
+
const result = generateCrudPage(description);
|
|
70
|
+
const dir = dirname(outputPath);
|
|
71
|
+
if (!existsSync(dir)) {
|
|
72
|
+
mkdirSync(dir, { recursive: true });
|
|
73
|
+
}
|
|
74
|
+
writeFileSync(outputPath, result.code, "utf-8");
|
|
75
|
+
console.log(pc.green(`\n✔ 已生成: ${outputPath}`));
|
|
76
|
+
console.log(pc.dim(result.summary));
|
|
77
|
+
console.log("");
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,eAAe,SAyBxB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import pc from "picocolors";
|
|
3
|
+
import { writeFileSync, existsSync, mkdirSync } from "node:fs";
|
|
4
|
+
import { dirname, resolve } from "node:path";
|
|
5
|
+
import { generateScaffold } from "../core/code-generator.js";
|
|
6
|
+
function toPascalCase(str) {
|
|
7
|
+
return str
|
|
8
|
+
.replace(/(^|[-_])([a-z])/g, (_, __, letter) => letter.toUpperCase())
|
|
9
|
+
.replace(/[-_]/g, "");
|
|
10
|
+
}
|
|
11
|
+
export const scaffoldCommand = new Command("scaffold")
|
|
12
|
+
.argument("<name>", "page name (kebab-case)")
|
|
13
|
+
.option("-f, --features <list>", "comma-separated features: query,table,dialog", "query,table")
|
|
14
|
+
.option("-o, --output <path>", "output file path")
|
|
15
|
+
.description("Generate a minimal es-plus page scaffold")
|
|
16
|
+
.action((name, options) => {
|
|
17
|
+
const features = options.features.split(",").map((f) => f.trim());
|
|
18
|
+
const outputPath = resolve(process.cwd(), options.output || `src/views/${toPascalCase(name)}.vue`);
|
|
19
|
+
const code = generateScaffold(name, features);
|
|
20
|
+
const dir = dirname(outputPath);
|
|
21
|
+
if (!existsSync(dir)) {
|
|
22
|
+
mkdirSync(dir, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
writeFileSync(outputPath, code, "utf-8");
|
|
25
|
+
console.log(pc.green(`✔ 已生成: ${outputPath}`));
|
|
26
|
+
console.log(pc.dim(` features: ${features.join(", ")}`));
|
|
27
|
+
console.log("");
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG;SACP,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;SACpE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;KAC5C,MAAM,CAAC,uBAAuB,EAAE,8CAA8C,EAAE,aAAa,CAAC;KAC9F,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,CAAC,IAAY,EAAE,OAA8C,EAAE,EAAE;IACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAElE,MAAM,UAAU,GAAG,OAAO,CACxB,OAAO,CAAC,GAAG,EAAE,EACb,OAAO,CAAC,MAAM,IAAI,aAAa,YAAY,CAAC,IAAI,CAAC,MAAM,CACxD,CAAC;IAEF,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE9C,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAEzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,UAAU,EAAE,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,eAAe,SAiDxB,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import pc from "picocolors";
|
|
3
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
4
|
+
import { resolve } from "node:path";
|
|
5
|
+
import { validateConfig, listAvailableSchemas } from "../core/schema-validator.js";
|
|
6
|
+
export const validateCommand = new Command("validate")
|
|
7
|
+
.argument("<file>", "JSON config file to validate")
|
|
8
|
+
.option("-s, --schema <type>", "schema type: " + listAvailableSchemas().join(", "))
|
|
9
|
+
.description("Validate es-plus config JSON against schema")
|
|
10
|
+
.action((file, options) => {
|
|
11
|
+
const filePath = resolve(process.cwd(), file);
|
|
12
|
+
if (!existsSync(filePath)) {
|
|
13
|
+
console.log(pc.red(`✗ 文件不存在: ${filePath}`));
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
let config;
|
|
17
|
+
try {
|
|
18
|
+
const raw = readFileSync(filePath, "utf-8");
|
|
19
|
+
config = JSON.parse(raw);
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
console.log(pc.red(`✗ JSON 解析失败: ${e.message}`));
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
const schemaType = options.schema || detectSchemaType(config);
|
|
26
|
+
const result = validateConfig(config, schemaType);
|
|
27
|
+
if (result.valid) {
|
|
28
|
+
console.log(pc.green(`✔ 校验通过 (schema: ${schemaType})`));
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
console.log(pc.red(`✗ 校验失败(${result.errors.length} 个错误):`));
|
|
32
|
+
for (const err of result.errors) {
|
|
33
|
+
console.log(pc.red(` ${err}`));
|
|
34
|
+
}
|
|
35
|
+
if (result.suggestions.length) {
|
|
36
|
+
console.log(pc.yellow("\n建议:"));
|
|
37
|
+
for (const s of result.suggestions) {
|
|
38
|
+
console.log(pc.yellow(` - ${s}`));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
console.log(pc.dim(`\n可用 schema: ${listAvailableSchemas().join(", ")}`));
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
function detectSchemaType(config) {
|
|
46
|
+
if (!config || typeof config !== "object")
|
|
47
|
+
return "form-item";
|
|
48
|
+
const obj = config;
|
|
49
|
+
if ("columns" in obj || "tableData" in obj)
|
|
50
|
+
return "table-column";
|
|
51
|
+
if ("httpRequest" in obj || "configTableOut" in obj || "apiParams" in obj)
|
|
52
|
+
return "table-options";
|
|
53
|
+
if ("render" in obj || "configBtn" in obj || "isDraggable" in obj)
|
|
54
|
+
return "dialog-options";
|
|
55
|
+
return "form-item";
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type GeneratedConfig } from "./crud-engine.js";
|
|
2
|
+
export interface GenerateResult {
|
|
3
|
+
code: string;
|
|
4
|
+
config: GeneratedConfig;
|
|
5
|
+
summary: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function generateCrudPage(description: string): GenerateResult;
|
|
8
|
+
export declare function generateScaffold(name: string, features?: string[]): string;
|
|
9
|
+
//# sourceMappingURL=code-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../src/core/code-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE1F,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAmBpE;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,MAAM,CA2ER"}
|