--- name: demo-create description: 基于项目中 .vscode/south.code-snippets 定义的 CRUD 模板,快速生成后台管理系统的标准 CRUD 页面代码。该技能根据用户提供的业务模块信息(如模块名称、API路径、字段配置等),自动生成完整的页面文件(Page)、数据模型文件(Model)和 API 接口文件(Api),支持分页列表页面(demoPage)、独立操作页面(demoOptionPage)两种页面模式。 --- # demo-create ## Description 基于项目中 `.vscode/south.code-snippets` 定义的 CRUD 模板,快速生成后台管理系统的标准 CRUD 页面代码。根据用户提供的业务模块信息(模块名称、API路径、字段配置等),自动生成完整的页面文件(Page)、数据模型文件(Model)和 API 接口文件(Api),支持弹窗模式(demoPage)和独立页面模式(demoOptionPage)两种。 ## Instructions ### 1. 收集必要信息 在生成代码前,向用户确认以下信息(未提供则主动询问,一个一个询问): - **moduleName**:模块名称(英文 PascalCase),如 `User`、`Article` - **apiPath**:API 路径前缀,如 `/system/user` - **permissionPrefix**:权限前缀路径,如 `/system/user` - **pageMode**:`modal`(弹窗模式)或 `page`(独立页面模式) - **enableI18n**:是否开启国际化(`true`/`false`),开启时使用 `t()` 函数包裹标签文本 - **fatherPath**:父路径(仅 page 模式),如 `/system/user` - **zhTitle / enTitle**:中英文标题(仅 page 模式),如 `用户` / `User` - **fields**:业务字段列表,每个字段包含: - `dataIndex`(字段名) - `label`(标签) - `component`(组件类型:`Input`/`InputNumber`/`Select`/`DatePicker`/`RangePicker`/`TextArea`/`Switch`/`Upload`) - `search`(是否搜索项) - `table`(是否表格列) - `form`(是否表单字段) - `required`(是否必填) - `width`(表格列宽度,默认200) ### 2. 生成文件结构 #### Modal 模式 ``` src/pages/{modulePath}/ ├── index.tsx # 主页面(demoPage 模板) └── model.ts # 数据模型(demoModel 模板) src/servers/{modulePath}.ts # API 接口(demoApi 模板) ``` #### Page 模式 ``` src/pages/{modulePath}/ ├── index.tsx # 列表页(demoPage 模板,新增/编辑改为路由跳转) ├── model.ts # 数据模型(demoModel 模板) └── option.tsx # 操作页(demoOptionPage 模板) src/servers/{modulePath}.ts # API 接口(demoApi 模板) ``` ### 3. 代码生成规则 #### 3.1 通用替换规则 所有模板中进行以下替换: - `getXXXPage` → `get{ModuleName}Page` - `getXXXById` → `get{ModuleName}ById` - `createXXX` → `create{ModuleName}` - `updateXXX` → `update{ModuleName}` - `deleteXXX` → `delete{ModuleName}` - `batchDeleteXXX` → `batchDelete{ModuleName}` - `API.URL = '/xxx'` → 实际 `apiPath` - `@/servers/xxx` → `@/servers/{实际模块路径}` - `permissionPrefix = '/xxx'` → 实际权限前缀 - `fatherPath = '/xxx'` → 实际父路径(page 模式) #### 3.2 API 文件(基于 south.code-snippets 中 demoApi 模板) 参照 `.vscode/south.code-snippets` 中 `demoApi` 的 `body` 内容生成,替换所有 `XXX`/`xxx` 为对应模块名称和路径。保持所有函数签名、类型定义和注释不变。 #### 3.3 Model 文件(基于 south.code-snippets 中 demoModel 模板) 参照 `.vscode/south.code-snippets` 中 `demoModel` 的 `body` 内容生成: - **searchList**:仅包含 `search: true` 的字段,`wrapperWidth` 默认 200 - `enableI18n = true`:label 使用 `t('moduleName.fieldName')` 格式 - `enableI18n = false`:label 使用中文字符串 - **tableColumns**:仅包含 `table: true` 的字段,始终保留 `operate` 操作列,`width` 默认 200 - `enableI18n = true`:title 使用 `t('moduleName.fieldName')` 格式,保留 `createdAt`/`updatedAt` 使用 `t('public.creationTime')`/`t('public.updateTime')` - `enableI18n = false`:title 使用中文字符串 - **createList**:仅包含 `form: true` 的字段,必填字段添加 `rules: FORM_REQUIRED` - `enableI18n = true`:label 使用 `t('moduleName.fieldName')` 格式 - `enableI18n = false`:label 使用中文字符串 #### 3.4 Page 文件(基于 south.code-snippets 中 demoPage 模板) 参照 `.vscode/south.code-snippets` 中 `demoPage` 的 `body` 内容生成: - **RowData 接口**:根据用户字段生成,始终包含 `id: string` - **initCreate**:设置合理的默认值(如 `status: 1`) - 替换 import 中的 API 函数名和路径 - 替换 `permissionPrefix` #### 3.5 Option 文件(仅 page 模式,基于 south.code-snippets 中 demoOptionPage 模板) 参照 `.vscode/south.code-snippets` 中 `demoOptionPage` 的 `body` 内容生成: - 替换 `fatherPath`、`zhTitle`、`enTitle` - 替换 `useSingleTab` 中的标题 - 替换 `permissionPrefix` ### 4. 国际化处理 根据 `enableI18n` 参数决定如何处理标签文本: - **开启国际化(enableI18n = true)**:所有标签使用 `t()` 函数包裹,如 `t('public.name')`、`t('product.code')` - **关闭国际化(enableI18n = false)**:所有标签使用中文字符串,如 `'产品编码'`、`'产品名称'` ### 5. 文件生成要求 **重要**:使用 Python 脚本生成代码,而不是手动输出代码块。 #### 5.1 使用 Python 脚本生成 1. 准备配置 JSON,包含所有收集的信息 2. 调用 Python 脚本生成文件: ```bash python3 .claude/skills/demo-create/scripts/generate.py '' ``` 或使用包装脚本: ```bash bash .claude/skills/demo-create/scripts/run.sh '' ``` 3. 脚本会自动: - 创建必要的目录 - 生成所有文件内容 - 写入文件到正确位置 - 运行 prettier 格式化 - 输出生成进度 #### 5.2 配置 JSON 格式 ```json { "module_name": "Product", "api_path": "/product", "permission_prefix": "/product", "page_mode": "modal", "enable_i18n": true, "project_root": "/Users/south/Desktop/case/react-admin", "fields": [ { "dataIndex": "name", "label_zh": "产品名称", "label_en": "Product Name", "component": "Input", "search": true, "table": true, "form": true, "required": true, "width": 200 } ] } ``` **配置说明**: - `module_name`: 模块名称(PascalCase,如 Product) - `api_path`: API 路径前缀(如 /product) - `permission_prefix`: 权限前缀(如 /product) - `page_mode`: 页面模式("modal" 或 "page") - `enable_i18n`: 是否开启国际化(true 或 false) - `project_root`: 项目根路径(可选,默认为当前目录) - `fields`: 字段配置数组 **字段配置说明**: - `dataIndex`: 字段名 - `label_zh`: 字段中文标签(由 AI 根据字段名智能生成) - `label_en`: 字段英文标签(由 AI 根据字段名智能生成) - `component`: 组件类型(Input/InputNumber/Select/DatePicker/RangePicker/TextArea/Switch/Upload) - `search`: 是否作为搜索项 - `table`: 是否作为表格列 - `form`: 是否作为表单字段 - `required`: 是否必填 - `width`: 表格列宽度(默认200) **重要**:AI 应根据字段的业务含义智能生成合适的中英文标签,而不是使用固定的映射表。例如: - `name` → "产品名称" / "Product Name"(在产品模块中) - `name` → "分类名称" / "Category Name"(在分类模块中) - `title` → "文章标题" / "Article Title"(在文章模块中) ### 6. 注意事项 - 不修改模板中已有的工具函数、hooks、组件使用方式 - 保持代码风格与模板一致(缩进、空行、注释) - 所有类型引用保持与模板一致:`BaseFormData`、`PagePermission`、`BaseSearchList`、`TableColumn`、`TableOptions`、`PaginationData`、`PageServerResult` - 保留所有工具函数引用:`checkPermission`、`useCommonStore`、`usePublicStore`、`useTabsStore`、`INIT_PAGINATION`、`ADD_TITLE`、`EDIT_TITLE`、`FORM_REQUIRED`、`useSingleTab`、`useEffectOnActive`、`useTranslation`、`useLocation` - 生成的代码应可直接使用,无需额外修改 ### 7. 国际化文件生成(仅当 enableI18n = true 时) 当开启国际化时,额外生成以下文件: #### 7.1 中文国际化文件 **文件路径**:`src/locales/zh/{moduleName}.ts` 根据字段配置生成翻译对象,格式: ```typescript export default { fieldName1: '中文名称1', fieldName2: '中文名称2', // ... }; ``` **注意**:翻译内容由 AI 根据字段名和业务模块智能生成,例如: - 产品模块的 `name` → "产品名称" - 分类模块的 `name` → "分类名称" - 文章模块的 `title` → "文章标题" #### 7.2 英文国际化文件 **文件路径**:`src/locales/en/{moduleName}.ts` 格式同中文文件,使用英文翻译: ```typescript export default { fieldName1: 'Field Name 1', fieldName2: 'Field Name 2', // ... }; ``` **注意**:翻译内容由 AI 根据字段名和业务模块智能生成,例如: - 产品模块的 `name` → "Product Name" - 分类模块的 `name` → "Category Name" - 文章模块的 `title` → "Article Title" ### 8. 输出顺序 1. API 文件(`src/servers/{modulePath}.ts`) 2. Model 文件(`src/pages/{modulePath}/model.ts`) 3. Page 文件(`src/pages/{modulePath}/index.tsx`) 4. Option 文件(仅 page 模式,`src/pages/{modulePath}/option.tsx`) 5. 中文国际化文件(仅 enableI18n = true,`src/locales/zh/{moduleName}.ts`) 6. 英文国际化文件(仅 enableI18n = true,`src/locales/en/{moduleName}.ts`)