create-jnrs-vue 1.2.34 → 1.2.36
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 +3 -3
- package/jnrs-vue/.env.development +2 -2
- package/jnrs-vue/{agentic/RULES_API.md → AGENTS/README_API.md} +16 -12
- package/jnrs-vue/AGENTS/README_BASE.md +11 -0
- package/jnrs-vue/{agentic/RULES_COMMON.md → AGENTS/README_COMMON.md} +3 -0
- package/jnrs-vue/{agentic/RULES_CRUD.md → AGENTS/README_CRUD.md} +53 -16
- package/jnrs-vue/{agentic/RULES_DEPENDENCIES.md → AGENTS/README_DEPENDENCIES.md} +1 -1
- package/jnrs-vue/{agentic/RULES_MENU.md → AGENTS/README_MENU.md} +12 -12
- package/jnrs-vue/README.md +3 -3
- package/jnrs-vue/package.json +4 -4
- package/jnrs-vue/public/system/menu.json +17 -0
- package/jnrs-vue/src/api/business/index.ts +69 -0
- package/jnrs-vue/src/api/common/index.ts +3 -2
- package/jnrs-vue/src/api/demos/project.ts +39 -4
- package/jnrs-vue/src/api/system/index.ts +1 -1
- package/jnrs-vue/src/components/common/ImageView.vue +19 -26
- package/jnrs-vue/src/components/common/PdfView.vue +19 -26
- package/jnrs-vue/src/composables/useDateRangeField.ts +26 -0
- package/jnrs-vue/src/utils/file.ts +5 -4
- package/jnrs-vue/src/utils/packages.ts +10 -8
- package/jnrs-vue/src/views/businessPlayground/EditDialog.vue +137 -0
- package/jnrs-vue/src/views/businessPlayground/index.vue +90 -0
- package/jnrs-vue/src/views/demos/crud/EditDialog.vue +13 -20
- package/jnrs-vue/src/views/demos/crud/index.vue +50 -7
- package/jnrs-vue/src/views/demos/playground/RequestPage.vue +13 -1
- package/jnrs-vue/src/views/lingshuSmart/editorPage.vue +1 -2
- package/jnrs-vue/tsconfig.json +3 -3
- package/package.json +1 -1
- package/jnrs-vue/agentic/RULES_BASE.md +0 -8
package/README.md
CHANGED
|
@@ -36,9 +36,9 @@ pnpm add create-jnrs-vue
|
|
|
36
36
|
- 前置准备
|
|
37
37
|
- 将业务功能原型图作为生成前端代码的参考图
|
|
38
38
|
- 从 api 工具(如 ApiFox) 中导出 openapi 文档,或接入其提供的 MCP 服务
|
|
39
|
-
- 使用 AI Agent 读取并分析当前 `README.md` 文件及 `/
|
|
39
|
+
- 使用 AI Agent 读取并分析当前 `README.md` 文件及 `/AGENTS/README_BASE.md` 文件并作为 IDE AI Agent 的记忆
|
|
40
40
|
- 预置提示词
|
|
41
|
-
- 保存记忆:`读取并分析当前 README.md 文件及 /
|
|
41
|
+
- 保存记忆:`读取并分析当前 README.md 文件及 /AGENTS/README_BASE.md 文件并作为 IDE AI Agent 的记忆`
|
|
42
42
|
- 生成菜单:`根据提供的菜单原型图,生成菜单`
|
|
43
43
|
- 生成服务文件:`根据提供的 openapi 文档或 MCP 服务,生成API 服务文件`
|
|
44
44
|
- 生成增删改查页面文件:`根据提供的界面原型图,生成增删改查页面文件`
|
|
@@ -47,7 +47,7 @@ pnpm add create-jnrs-vue
|
|
|
47
47
|
|
|
48
48
|
```Text
|
|
49
49
|
jnrs-vue/
|
|
50
|
-
├──
|
|
50
|
+
├── AGENTS/ # AI Agent 规则与提示词
|
|
51
51
|
├── viteMockServe/ # Mock 服务配置
|
|
52
52
|
├── public/ # 静态资源
|
|
53
53
|
├── src/ # 源码目录
|
|
@@ -4,8 +4,8 @@ ENV = 'development'
|
|
|
4
4
|
VITE_USE_MOCK = true
|
|
5
5
|
|
|
6
6
|
# 后端接口基地址 - 开发环境
|
|
7
|
-
|
|
8
|
-
VITE_BASE_URL = '192.168.1.50:5001'
|
|
7
|
+
VITE_BASE_URL = '192.168.1.6:5001'
|
|
8
|
+
# VITE_BASE_URL = '192.168.1.50:5001'
|
|
9
9
|
|
|
10
10
|
# 应用运行主机(置空默认为 localhost)
|
|
11
11
|
VITE_APP_HOST = ''
|
|
@@ -1,49 +1,53 @@
|
|
|
1
1
|
# API 服务文件配置规则(Service Layer)
|
|
2
2
|
|
|
3
|
-
说明:对提供的 `
|
|
3
|
+
说明:对提供的 `openapi` 进行业务模块解析,最终生成的 `API 服务文件(Service Layer)`代码示例参考 /src/api/demos/project.ts,最终目的是作为 AI Agent 提示词,基于每个业务模块的 Service Layer 文件直接生成 views 等代码,便于 Vibe Coding。
|
|
4
4
|
|
|
5
|
-
## apifox 中对于
|
|
5
|
+
## apifox 中对于 openapi 的导出规则
|
|
6
6
|
|
|
7
7
|
- apifox 导出配置:
|
|
8
8
|
- 数据格式:OpenAPI Spec。
|
|
9
9
|
- OpenAPI Spec 版本:OpenAPI 3.1。
|
|
10
10
|
- 文件格式:JSON。
|
|
11
|
-
- 包含 Apifox 扩展的 OpenAPI
|
|
12
|
-
- 将 API 文档的目录,作为 Tags
|
|
11
|
+
- 包含 Apifox 扩展的 OpenAPI 属性(x-apifox-\*\*\*):包含。
|
|
12
|
+
- 将 API 文档的目录,作为 Tags 属性导出:否。
|
|
13
13
|
|
|
14
14
|
- 最终导出的文件为 `*openapi.json`。
|
|
15
15
|
- 优先使用 apifox 提供的 MCP 服务。
|
|
16
16
|
|
|
17
|
-
## \*openapi.json
|
|
17
|
+
## \*openapi.json 文件内容详细解析规则(以下简称 openapi 文档)
|
|
18
18
|
|
|
19
19
|
- 基本规则
|
|
20
|
-
- 禁止对
|
|
21
|
-
-
|
|
22
|
-
- 所有新生成的 Service Layer 文件及目录都存放在
|
|
20
|
+
- 禁止对 openapi 文档进行任何修改。
|
|
21
|
+
- 除非后文中明确指出需要创造,否则禁止创造 openapi 文档中不存在的接口、类型、属性、字段、值。
|
|
22
|
+
- 所有新生成的 Service Layer 文件及目录都存放在 `/src/api` 目录下, 生成路径参考 `menu.json` 中 component 属性的路径配置。
|
|
23
23
|
- 所有新创建的 api 函数均命名为 `*Api`,如:`projectListApi`、`addProductApi`。
|
|
24
|
+
- 所有创建的 api 函数、interface、enum、type 都必须包含注释信息,优先参考 openapi 文档进行注释。
|
|
24
25
|
|
|
25
26
|
- 解析规则
|
|
26
27
|
- 解析 'paths' 中 'x-apifox-folder' 的值,作为当前文件的模块名称,如:`project.ts`;如果'x-apifox-folder' 的值包含层级,则按照层级创建目录及文件,如:`product/craft.ts`、`product/process.ts`。
|
|
27
28
|
- 按需生成类型,按需拆分接口逻辑,如将编辑接口拆分为新增和修改接口。
|
|
29
|
+
- 解析 'description' 的值,作为注释参考。
|
|
28
30
|
- 解析 'paths' 中的 summary,作为 export 的注释信息,如:`/** 项目 - 列表 */`。
|
|
29
31
|
- 解析 'paths' 中的 URL Path,作为 axiosRequest 函数的 url 参数值。
|
|
30
32
|
- 解析 'paths' 中的 HTTP Method,作为 axiosRequest 函数的 method 参数值。
|
|
31
33
|
- 解析 'paths' 中的 parameters,作为 axiosRequest 函数的 params 参数值。
|
|
32
34
|
- 解析 'paths' 中的 requestBody,作为 axiosRequest 函数的 data 参数值;如果 content-type 为 `form-data`,则 axiosRequest 函数的 data 类型值必须使用 objectToFormData 函数包裹,如 `data: objectToFormData(data)`。
|
|
35
|
+
- 如果某项 schema 存在 `"$ref"` JSON Reference 关键字,则对 `"$ref"` 的值路径进行进一步解析,获取其指向的类型定义,作为当前属性的类型值。
|
|
36
|
+
- 如果某项 schema 存在 `enum` 关键字,则忽略 `enum` 的值,而是查找当前 schema 所在对象中 name 属性的值如 'projectType' 等,作为字典名称,并在生成服务文件时添加额外注释 “[DICT] 此属性为字典值,字典名称为:projectType,字典值为:[${enum 的值}]”。
|
|
33
37
|
- 如果 views 中需要使用原始响应数据,如需要显示后端返回的 msg 信息,则需要在 axiosRequest 函数中设置属性 `returnRawResponse: true`
|
|
34
38
|
|
|
35
39
|
- parameters 特殊处理
|
|
36
40
|
- 如果查询参数包含 `pageNo` 和 `pageSize`,则查询类型必须继承 `IPagination`
|
|
37
41
|
|
|
38
42
|
- requestBody 特殊处理
|
|
39
|
-
- 如果某个 'properties' 类型名为 '\*Id',如 'projectId、productProcessId',则认为该属性和 `components/select`
|
|
43
|
+
- 如果某个 'properties' 类型名为 '\*Id',如 'projectId、productProcessId',则认为该属性和 `components/select` 相关,则类型值必须固定设置为 `Record<string, unknown> | number | undefined` 并添加额外注释:`// 适配 components/selectXXX 组件`,如下所示:
|
|
40
44
|
|
|
41
45
|
```ts
|
|
42
|
-
managerId?: Record<string, unknown> | number
|
|
46
|
+
managerId?: Record<string, unknown> | number // 适配 components/selectManager 组件
|
|
43
47
|
```
|
|
44
48
|
|
|
45
49
|
- 如果某个 'properties' 的类型名同时包含 'orginAttachmentName、newAttachmentFile' 或 'orginImageNames
|
|
46
|
-
newImageFiles'
|
|
50
|
+
newImageFiles',则不需要创建该属性,因为在 objectToFormData 函数中会自动处理,应该创建一个新的类型并继承模块类型,然后按需额外添加 `newImageFiles` 和 `newAttachmentFile` 属性供列表使用,类型值固定为 `IAttachment[] | undefined`,如下所示:
|
|
47
51
|
|
|
48
52
|
```ts
|
|
49
53
|
export interface ProcessedProject extends Project {
|
|
@@ -52,7 +56,7 @@
|
|
|
52
56
|
}
|
|
53
57
|
```
|
|
54
58
|
|
|
55
|
-
|
|
59
|
+
但是在新增和修改功能中,则设置其属性类型值为 `[]`,如下所示:
|
|
56
60
|
|
|
57
61
|
```ts
|
|
58
62
|
export interface AddProject {
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# 基础规则
|
|
2
|
+
|
|
3
|
+
- 提示词关键字:
|
|
4
|
+
- `生成服务` 时,参考 [服务配置规则](./README_API.md)
|
|
5
|
+
- `生成菜单` 时,参考 [菜单配置规则](./README_MENU.md)
|
|
6
|
+
- `生成增删改查页面` 时,参考 [增删改查页面配置规则](./README_CRUD.md)
|
|
7
|
+
|
|
8
|
+
- 严格按照 ESLint 规范进行编码,参考 [eslint config](../eslint.config.ts)
|
|
9
|
+
- 代码风格按照 Prettier 规范进行编码,参考 [prettierrc config](../prettierrc.json)
|
|
10
|
+
- 所有新创建的文件或目录都使用小驼峰命名,命名需简洁精炼,不同目录下但是属于同一个模块的文件命名应保持统一,如 `/src/views/productManagement.vue`、`/src/api/productManagement.ts`
|
|
11
|
+
- 禁止导入未使用的变量,避免出现 `'xxx' is defined but never used` 警告
|
|
@@ -4,3 +4,6 @@
|
|
|
4
4
|
- 模块:模块是业务逻辑的集合,如:项目模块、产品模块、用户模块、系统模块...,基本是一个模块对应一个 'menu.json' 中一个菜单或目录项;一个模块对应一个 Service Layer 文件,如:`project.ts`、`product.ts`、`user.ts`、`system.ts`。
|
|
5
5
|
- components/select:选择功能组件,可借助 AI Agent 通过引用 JnSelectTemplate 生成,具体使用参考 SelectProject.vue 文件,如:`SelectProject.vue`、`SelectProduct.vue`、`SelectUser.vue`,功能为“选择某模块的某项数据,获取其 id 值”,如 'SelectProject.vue' 的功能为选择项目模块的某个项目,获取项目 id 值。
|
|
6
6
|
- components/common:通用功能组件,属于编程人员预置文件,不可通过 AI Agent 自动生成,如:`CardTable.vue`、`DictTag.vue`、`ImageView.vue`、`PdfView.vue`。
|
|
7
|
+
|
|
8
|
+
- utils
|
|
9
|
+
- 具体功能见目录:`/src/utils`
|
|
@@ -8,33 +8,67 @@
|
|
|
8
8
|
|
|
9
9
|
| 特征文件路径 | 特征描述 | 特征索引 |
|
|
10
10
|
| ----------------------------------------------------------------------- | ---------------------------------------------------------------- | -------- |
|
|
11
|
-
| /
|
|
12
|
-
| /
|
|
13
|
-
| /
|
|
11
|
+
| /AGENTS/README_BASE.md | 基础规则 | 0 |
|
|
12
|
+
| /AGENTS/README_DEPENDENCIES.md | 工程外部依赖包提供的能力 | 1 |
|
|
13
|
+
| /AGENTS/README_COMMON.md | 工程内部提供的通用能力 | 2 |
|
|
14
14
|
| /src/views/demos/crud/index.vue 和 /src/views/demos/crud/EditDialog.vue | 具体的业务功能:数据列表页、新增&修改弹窗面 | 3 |
|
|
15
15
|
| /src/api/demos/project.ts | API 服务文件(Service Layer),即具体的业务功能 API 函数及类型系统 | 4 |
|
|
16
16
|
|
|
17
17
|
## 通用规则约束
|
|
18
18
|
|
|
19
|
+
- 禁止对函数进行多余的包装
|
|
20
|
+
- 所有 `el-form-item` 组件必须包含 `label` 和 `prop` 属性,分别对应表单中的标签和属性名。
|
|
19
21
|
- 所有以 `Select*` 开头的组件,如 `SelectProject.vue`, 其文件路径均在 /src/components/select 目录下,功能为“选择某模块的某项数据,获取其 id 值”,如 `SelectProject.vue` 的功能为选择项目模块的某个项目,获取项目 id 值。
|
|
22
|
+
- 所有新生成的文件及目录都存放在 `/src/views` 目录下, 生成路径严格按照 `menu.json` 中 component 属性的路径配置。
|
|
23
|
+
- 如果在服务文件中某属性的注释中识别到 ‘[DICT]’ 相关注释,则使用 element-plus 组件库中的 `el-select` 组件且 `el-option` 组件需使用 getDictList 函数获取字典列表进行生成,且 getDictList 函数的 dictName 参数即为注释中的字典名称,如 'projectType',在表单中如果该字典的属性值是必填项,则在定义时默认值为注释中的字典值的第一个值,如下方代码所示:
|
|
24
|
+
|
|
25
|
+
```vue
|
|
26
|
+
<el-form-item label="项目类型" prop="projectType">
|
|
27
|
+
<el-select v-model="form.projectType" filterable placeholder="" clearable>
|
|
28
|
+
<el-option
|
|
29
|
+
:label="item.label"
|
|
30
|
+
:value="item.value"
|
|
31
|
+
v-for="item in getDictList('projectType')"
|
|
32
|
+
:key="item.value"
|
|
33
|
+
/>
|
|
34
|
+
</el-select>
|
|
35
|
+
</el-form-item>
|
|
36
|
+
```
|
|
20
37
|
|
|
21
38
|
## 详细规则约束
|
|
22
39
|
|
|
23
40
|
index.vue 文件内容:
|
|
24
41
|
|
|
25
|
-
| 主要组成部分描述 | 使用场景
|
|
26
|
-
| ------------------------------------------------------------------------------------------------------------------ |
|
|
27
|
-
| template 顶层块内编写 `<span class="jn-card-title">项目管理</span>` | 当前模块名称,通常在“ElCard#header“组件中配套使用,具体名称按需修改
|
|
28
|
-
| template 顶层块内使用 `JnTable` 组件 | 当前模块存在列表功能
|
|
29
|
-
| template 顶层块内使用 `JnPagination` 组件 | 当前模块存在分页功能
|
|
30
|
-
| template 顶层块内使用 `EditDialog` 组件 | 当前模块存在新增、修改功能
|
|
31
|
-
| template 顶层块内使用 `JnImportAndExport` 组件 | 当前模块存在倒入、导出功能
|
|
32
|
-
| template 顶层块内使用 `Select*` 组件 | 当前模块存在选择其他模块数据功能,通常在“查询条件“表单中配套使用
|
|
33
|
-
|
|
|
34
|
-
| template 顶层块内使用 `JnDatetime` 组件 | 当前模块存在ISO 8601 日期时间格式化功能
|
|
35
|
-
| template 顶层块内使用 `ImageView` 组件 | 当前模块存在图片查看功能
|
|
36
|
-
| template 顶层块内使用 `PdfView` 组件 | 当前模块存在 PDF 文件查看功能
|
|
37
|
-
| script 顶层块内,getTable 函数体对 tableData 的特殊处理(基于 raw data 新增 newImageFiles,newAttachmentFile 属性) | 表格中要使用 `ImageView` 组件时需处理
|
|
42
|
+
| 主要组成部分描述 | 使用场景 | 上下文权重数组 |
|
|
43
|
+
| ------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------- | -------------- |
|
|
44
|
+
| template 顶层块内编写 `<span class="jn-card-title">项目管理</span>` | 当前模块名称,通常在“ElCard#header“组件中配套使用,具体名称按需修改 | [0,-1,-1,1,-1] |
|
|
45
|
+
| template 顶层块内使用 `JnTable` 组件 | 当前模块存在列表功能 | [0,1,1,1,1] |
|
|
46
|
+
| template 顶层块内使用 `JnPagination` 组件 | 当前模块存在分页功能 | [0,1,1,1,1] |
|
|
47
|
+
| template 顶层块内使用 `EditDialog` 组件 | 当前模块存在新增、修改功能 | [1,1,1,1,1] |
|
|
48
|
+
| template 顶层块内使用 `JnImportAndExport` 组件 | 当前模块存在倒入、导出功能 | [0,1,1,1,1] |
|
|
49
|
+
| template 顶层块内使用 `Select*` 组件 | 当前模块存在选择其他模块数据功能,通常在“查询条件“表单中配套使用 | [0,0,1,1,1] |
|
|
50
|
+
| el-table 块内使用 `DictTag` 组件 | 如果在服务文件中某属性的注释中识别到 ‘[DICT]’ 相关注释,则使用`DictTag` 组件且 dictName 属性的值即为注释中字典名称。 | [0,0,1,1,1] |
|
|
51
|
+
| template 顶层块内使用 `JnDatetime` 组件 | 当前模块存在ISO 8601 日期时间格式化功能 | [0,1,1,1,1] |
|
|
52
|
+
| template 顶层块内使用 `ImageView` 组件 | 当前模块存在图片查看功能 | [0,0,1,1,1] |
|
|
53
|
+
| template 顶层块内使用 `PdfView` 组件 | 当前模块存在 PDF 文件查看功能 | [0,0,1,1,1] |
|
|
54
|
+
| script 顶层块内,getTable 函数体对 tableData 的特殊处理(基于 raw data 新增 newImageFiles,newAttachmentFile 属性) | 表格中要使用 `ImageView` 组件时需处理 | [0,0,1,1,1] |
|
|
55
|
+
|
|
56
|
+
edit.vue 文件其他规则:
|
|
57
|
+
|
|
58
|
+
- 对于搜索表单中时间/日期范围选择器的绑定值处理:
|
|
59
|
+
- 引入 import { useDateRangeField } from '@/composables/useDateRangeField'
|
|
60
|
+
- 定义 const dateRange = useDateRangeField(queryForm.value, 'startDate', 'endDate')
|
|
61
|
+
- 绑定控件 <el-date-picker
|
|
62
|
+
v-model="dateRange"
|
|
63
|
+
type="daterange"
|
|
64
|
+
range-separator="至"
|
|
65
|
+
start-placeholder="开始日期"
|
|
66
|
+
end-placeholder="结束日期"
|
|
67
|
+
value-format="YYYY-MM-DD"
|
|
68
|
+
size="small"
|
|
69
|
+
style="width: 300px"
|
|
70
|
+
/>
|
|
71
|
+
- 使用 handleReset 函数重置表单时,需要将 dateRange.value 重置为 null
|
|
38
72
|
|
|
39
73
|
edit.vue 文件内容:
|
|
40
74
|
|
|
@@ -51,3 +85,6 @@ edit.vue 文件其他规则:
|
|
|
51
85
|
|
|
52
86
|
- el-form 组件内编写的 el-input 组件加 `maxlength`、`show-word-limit` 属性。
|
|
53
87
|
- el-form 组件内编写的 el-input-number 组件的 '#prefix' 按需使用。
|
|
88
|
+
- open 函数中 `const matched = objectMatchAssign(ruleForm.value, row)`,用于将 row 中的属性值赋值给 ruleForm.value 中的属性。
|
|
89
|
+
- open 函数中会自动回填 imageDocument 和 attachmentDocument 属性,不需要手动处理。
|
|
90
|
+
- submitForm 函数中 `const matched = objectMatchAssign(ruleForm.value, row)`,用于将 ruleForm.value 中的属性值赋值给 row 中的属性(深拷贝合并对象中已有的键值,排除 null、undefined 值),且 objectMatchAssign 函数中会自动处理 newAttachmentFile、newImageFiles 属性,将它们转换为数组类型,不需要手动处理。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 工程外部提供的作用域依赖包的规则
|
|
2
2
|
|
|
3
|
-
说明:使用当前工程依赖 `@jnrs` 命名空间下的包时,如:`@jnrs/shared`、`@jnrs/vue-core`、`@jnrs/lingshu-smart`,详细描述参考各自的 `README.md` 和 `
|
|
3
|
+
说明:使用当前工程依赖 `@jnrs` 命名空间下的包时,如:`@jnrs/shared`、`@jnrs/vue-core`、`@jnrs/lingshu-smart`,详细描述参考各自的 `README.md` 和 `AGENTS.md` 文件。
|
|
4
4
|
|
|
5
5
|
## 使用优先级
|
|
6
6
|
|
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
}
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
|
|
|
22
|
+
| 属性 | 类型 | 说明 |
|
|
23
23
|
| ---- | -------- | -------------------- |
|
|
24
24
|
| code | `number` | 状态码,`0` 表示成功 |
|
|
25
25
|
| msg | `string` | 提示信息 |
|
|
26
26
|
| data | `Array` | 菜单数据数组 |
|
|
27
27
|
|
|
28
|
-
**注意:** 模拟真实后端接口,遵循统一的 API 响应格式规范,`code` 为 `0` 时表示成功,`data`
|
|
28
|
+
**注意:** 模拟真实后端接口,遵循统一的 API 响应格式规范,`code` 为 `0` 时表示成功,`data` 属性包含实际的菜单数据。
|
|
29
29
|
|
|
30
30
|
---
|
|
31
31
|
|
|
@@ -68,13 +68,13 @@
|
|
|
68
68
|
|
|
69
69
|
---
|
|
70
70
|
|
|
71
|
-
## 📝
|
|
71
|
+
## 📝 属性详细说明
|
|
72
72
|
|
|
73
73
|
### 1. meta 对象(元信息)
|
|
74
74
|
|
|
75
75
|
所有菜单项都必须包含 `meta` 对象,用于存储路由元信息。
|
|
76
76
|
|
|
77
|
-
|
|
|
77
|
+
| 属性 | 类型 | 必填 | 默认值 | 说明 |
|
|
78
78
|
| ----------- | ---------- | ---- | ------- | -------------------------------------------------------- |
|
|
79
79
|
| title | `string` | 是 | — | 菜单/页面标题 |
|
|
80
80
|
| icon | `string` | - | — | Element Plus 图标名称(如 `ChatDotRound`、`StarFilled`) |
|
|
@@ -139,7 +139,7 @@
|
|
|
139
139
|
|
|
140
140
|
### 1. 待办提醒 (todoCount)
|
|
141
141
|
|
|
142
|
-
`todoCount`
|
|
142
|
+
`todoCount` 属性用于在菜单项上显示待办事项数量的角标提醒。
|
|
143
143
|
|
|
144
144
|
**使用场景:**
|
|
145
145
|
|
|
@@ -164,8 +164,8 @@
|
|
|
164
164
|
|
|
165
165
|
### 2. 权限控制 (permissions)
|
|
166
166
|
|
|
167
|
-
`permissions`
|
|
168
|
-
|
|
167
|
+
`permissions` 属性用于细粒度的权限控制,配合系统的权限验证机制使用。
|
|
168
|
+
如果没有权限控制需求,可以忽略该属性。
|
|
169
169
|
|
|
170
170
|
**权限格式:** `模块:操作`,例如:
|
|
171
171
|
|
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
|
|
188
188
|
**工作原理:**
|
|
189
189
|
|
|
190
|
-
- 如果设置了 permissions
|
|
190
|
+
- 如果设置了 permissions 属性,系统会根据当前用户的权限列表进行匹配
|
|
191
191
|
- 如果用户拥有至少一个列出的权限,则可以访问该菜单
|
|
192
192
|
- 如果用户没有任何匹配的权限,则菜单不会显示
|
|
193
193
|
|
|
@@ -198,7 +198,7 @@
|
|
|
198
198
|
|
|
199
199
|
### 3. 免登录访问 (noAuth)
|
|
200
200
|
|
|
201
|
-
`noAuth`
|
|
201
|
+
`noAuth` 属性设置为 `true` 时,该路由无需登录即可访问。
|
|
202
202
|
|
|
203
203
|
**使用场景:**
|
|
204
204
|
|
|
@@ -224,7 +224,7 @@
|
|
|
224
224
|
|
|
225
225
|
### 4. 全局路由 (global)
|
|
226
226
|
|
|
227
|
-
`global`
|
|
227
|
+
`global` 属性设置为 `true` 时,该路由会使用全局布局组件。
|
|
228
228
|
|
|
229
229
|
**工作原理:**
|
|
230
230
|
|
|
@@ -247,7 +247,7 @@
|
|
|
247
247
|
|
|
248
248
|
### 5. 重定向 (redirect)
|
|
249
249
|
|
|
250
|
-
`redirect`
|
|
250
|
+
`redirect` 属性用于设置路由重定向,访问该路径时会自动跳转到指定路径。
|
|
251
251
|
|
|
252
252
|
**使用场景:**
|
|
253
253
|
|
|
@@ -415,7 +415,7 @@
|
|
|
415
415
|
|
|
416
416
|
## 🔍 常用 Element Plus 图标
|
|
417
417
|
|
|
418
|
-
以下是一些常用的图标名称,可直接用于 `meta.icon`
|
|
418
|
+
以下是一些常用的图标名称,可直接用于 `meta.icon` 属性:
|
|
419
419
|
|
|
420
420
|
| 图标名称 | 用途 |
|
|
421
421
|
| -------------- | ---------- |
|
package/jnrs-vue/README.md
CHANGED
|
@@ -21,9 +21,9 @@ pnpm build
|
|
|
21
21
|
- 前置准备
|
|
22
22
|
- 将业务功能原型图作为生成前端代码的参考图
|
|
23
23
|
- 从 api 工具(如 ApiFox) 中导出 openapi 文档,或接入其提供的 MCP 服务
|
|
24
|
-
- 使用 AI Agent 读取并分析当前 `README.md` 文件及 `/
|
|
24
|
+
- 使用 AI Agent 读取并分析当前 `README.md` 文件及 `/AGENTS/README_BASE.md` 文件并作为 IDE AI Agent 的记忆
|
|
25
25
|
- 预置提示词
|
|
26
|
-
- 保存记忆:`读取并分析当前 README.md 文件及 /
|
|
26
|
+
- 保存记忆:`读取并分析当前 README.md 文件及 /AGENTS/README_BASE.md 文件并作为 IDE AI Agent 的记忆`
|
|
27
27
|
- 生成菜单:`根据提供的菜单原型图,生成菜单`
|
|
28
28
|
- 生成服务文件:`根据提供的 openapi 文档或 MCP 服务,生成API 服务文件`
|
|
29
29
|
- 生成增删改查页面文件:`根据提供的界面原型图,生成增删改查页面文件`
|
|
@@ -32,7 +32,7 @@ pnpm build
|
|
|
32
32
|
|
|
33
33
|
```Text
|
|
34
34
|
jnrs-vue/
|
|
35
|
-
├──
|
|
35
|
+
├── AGENTS/ # AI Agent 规则与提示词
|
|
36
36
|
├── viteMockServe/ # Mock 服务配置
|
|
37
37
|
├── public/ # 静态资源
|
|
38
38
|
├── src/ # 源码目录
|
package/jnrs-vue/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jnrs-vue",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.36",
|
|
4
4
|
"description": "JNRS 信息化管理系统",
|
|
5
5
|
"author": "talia_tan",
|
|
6
6
|
"private": true,
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"@element-plus/icons-vue": "^2.3.2",
|
|
22
|
-
"@jnrs/lingshu-smart": "2.2.
|
|
23
|
-
"@jnrs/shared": "1.1.
|
|
24
|
-
"@jnrs/vue-core": "1.2.
|
|
22
|
+
"@jnrs/lingshu-smart": "2.2.29",
|
|
23
|
+
"@jnrs/shared": "1.1.28",
|
|
24
|
+
"@jnrs/vue-core": "1.2.21",
|
|
25
25
|
"@vueuse/core": "^14.1.0",
|
|
26
26
|
"element-plus": "^2.13.3",
|
|
27
27
|
"pinia": "^3.0.4",
|
|
@@ -29,6 +29,23 @@
|
|
|
29
29
|
}
|
|
30
30
|
]
|
|
31
31
|
},
|
|
32
|
+
{
|
|
33
|
+
"meta": {
|
|
34
|
+
"title": "业务功能测试",
|
|
35
|
+
"icon": "Operation"
|
|
36
|
+
},
|
|
37
|
+
"children": [
|
|
38
|
+
{
|
|
39
|
+
"path": "/businessPlayground",
|
|
40
|
+
"name": "businessPlayground",
|
|
41
|
+
"meta": {
|
|
42
|
+
"title": "业务功能测试",
|
|
43
|
+
"todoCount": 8
|
|
44
|
+
},
|
|
45
|
+
"component": "/businessPlayground/index"
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
},
|
|
32
49
|
{
|
|
33
50
|
"meta": {
|
|
34
51
|
"title": "灵枢智造系统",
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author : TanRui
|
|
3
|
+
* @WeChat : Tan578853789
|
|
4
|
+
* @File : business/index.ts
|
|
5
|
+
* @Date : 2026/05/25
|
|
6
|
+
* @Desc. : 业务功能测试模块接口文档
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { IBlobItem } from '@jnrs/shared'
|
|
10
|
+
import type { IPagination, IPageTableData, IFile } from '@/types'
|
|
11
|
+
import { axiosRequest } from '../request'
|
|
12
|
+
import { objectToFormData } from '@/utils'
|
|
13
|
+
|
|
14
|
+
export interface ProcessItem extends IFile {
|
|
15
|
+
id?: number
|
|
16
|
+
productName?: string
|
|
17
|
+
productCode?: string
|
|
18
|
+
height?: number
|
|
19
|
+
isProcessCompleteness?: boolean
|
|
20
|
+
imageDocumentId?: unknown
|
|
21
|
+
attachmentDocumentId?: unknown
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface SaveProcessRequest {
|
|
25
|
+
/** ID 编号 */
|
|
26
|
+
id?: number
|
|
27
|
+
productName: string
|
|
28
|
+
productCode: string
|
|
29
|
+
height: number
|
|
30
|
+
orginAttachmentName?: string
|
|
31
|
+
/** 文件 */
|
|
32
|
+
newAttachmentFile: []
|
|
33
|
+
orginImageNames?: string[]
|
|
34
|
+
/** 图片 */
|
|
35
|
+
newImageFiles: []
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 列表
|
|
40
|
+
*/
|
|
41
|
+
export const getProductManagementProcessListApi = (params: IPagination): Promise<IPageTableData<ProcessItem>> => {
|
|
42
|
+
return axiosRequest({
|
|
43
|
+
url: '/product/process',
|
|
44
|
+
method: 'get',
|
|
45
|
+
params
|
|
46
|
+
})
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* 新建/编辑
|
|
51
|
+
*/
|
|
52
|
+
export const saveProductManagementProcessApi = (data: SaveProcessRequest): Promise<void> => {
|
|
53
|
+
return axiosRequest({
|
|
54
|
+
url: '/product/process',
|
|
55
|
+
method: 'post',
|
|
56
|
+
data: objectToFormData(data)
|
|
57
|
+
})
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* 齐套检查 导出
|
|
62
|
+
*/
|
|
63
|
+
export const getStandardLoadKitCheckExportApi = (): Promise<IBlobItem> => {
|
|
64
|
+
return axiosRequest({
|
|
65
|
+
url: '/order/completeness-check/export',
|
|
66
|
+
method: 'get',
|
|
67
|
+
responseType: 'blob'
|
|
68
|
+
})
|
|
69
|
+
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { axiosRequest } from '../request'
|
|
2
|
+
import type { IBlobItem } from '@jnrs/shared'
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* axios 方式下载文件
|
|
5
6
|
* @param uniqueFileName 文件唯一名称(列表中一般是在 item.attachmentDocument/imageDocument.attachments[].uniqueFileName)
|
|
6
7
|
* @returns Blob
|
|
7
8
|
*/
|
|
8
|
-
export const
|
|
9
|
+
export const fileDownloadApi = (uniqueFileName: string): Promise<IBlobItem> => {
|
|
9
10
|
return axiosRequest({
|
|
10
11
|
url: '/files/' + uniqueFileName,
|
|
11
12
|
method: 'get',
|
|
@@ -18,7 +19,7 @@ export const FileApi = (uniqueFileName: string): Promise<Blob> => {
|
|
|
18
19
|
* Fetch 方式下载文件
|
|
19
20
|
*/
|
|
20
21
|
// import { useFetch } from '@vueuse/core'
|
|
21
|
-
// export const
|
|
22
|
+
// export const fileDownloadApi = (uniqueFileName: string) => {
|
|
22
23
|
// return useFetch(`/files/${uniqueFileName}`, {
|
|
23
24
|
// method: 'get',
|
|
24
25
|
// headers: {
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* @Desc. : 项目模块接口文档
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import type { IFullResponse, IBlobItem } from '@jnrs/shared'
|
|
9
10
|
import type { IDocument, IAttachment, IPagination, IPageTableData } from '@/types'
|
|
10
11
|
import { axiosRequest } from '../request'
|
|
11
12
|
import { objectToFormData } from '@/utils'
|
|
@@ -20,6 +21,7 @@ export interface Project {
|
|
|
20
21
|
name: string
|
|
21
22
|
description: string
|
|
22
23
|
projectType: number
|
|
24
|
+
managerId: number
|
|
23
25
|
managerName: string
|
|
24
26
|
budget: number
|
|
25
27
|
plannedStartDate: string
|
|
@@ -27,6 +29,7 @@ export interface Project {
|
|
|
27
29
|
milestoneFinishDate: string
|
|
28
30
|
progress: string
|
|
29
31
|
status: number
|
|
32
|
+
enable: boolean
|
|
30
33
|
/**
|
|
31
34
|
* 图片
|
|
32
35
|
*/
|
|
@@ -82,14 +85,24 @@ export interface UpdateProject {
|
|
|
82
85
|
newAttachmentFile: []
|
|
83
86
|
}
|
|
84
87
|
|
|
88
|
+
/**
|
|
89
|
+
* 项目 - 启用/禁用
|
|
90
|
+
*/
|
|
91
|
+
export interface ProjectEnable {
|
|
92
|
+
id: string
|
|
93
|
+
enable: boolean
|
|
94
|
+
}
|
|
95
|
+
|
|
85
96
|
/**
|
|
86
97
|
* 项目 - 查询
|
|
87
98
|
*/
|
|
88
99
|
export interface ProjectQuery extends IPagination {
|
|
89
100
|
code?: string
|
|
90
101
|
projectType?: number
|
|
91
|
-
|
|
102
|
+
managerName?: string
|
|
92
103
|
plannedStartDate?: string
|
|
104
|
+
startDate?: string
|
|
105
|
+
endDate?: string
|
|
93
106
|
}
|
|
94
107
|
|
|
95
108
|
/**
|
|
@@ -128,7 +141,7 @@ export const updateProjectApi = (data: Project) => {
|
|
|
128
141
|
/**
|
|
129
142
|
* 项目 - 删除
|
|
130
143
|
*/
|
|
131
|
-
export const deleteProjectApi = (id: string) => {
|
|
144
|
+
export const deleteProjectApi = (id: string): Promise<IFullResponse<unknown>> => {
|
|
132
145
|
return axiosRequest({
|
|
133
146
|
url: `/agentic/project/delete/${id}`,
|
|
134
147
|
method: 'delete',
|
|
@@ -136,6 +149,17 @@ export const deleteProjectApi = (id: string) => {
|
|
|
136
149
|
})
|
|
137
150
|
}
|
|
138
151
|
|
|
152
|
+
/**
|
|
153
|
+
* 项目 - 启用/禁用
|
|
154
|
+
*/
|
|
155
|
+
export const projectEnableApi = (data: ProjectEnable) => {
|
|
156
|
+
return axiosRequest({
|
|
157
|
+
url: '/agentic/project/enable',
|
|
158
|
+
method: 'put',
|
|
159
|
+
data
|
|
160
|
+
})
|
|
161
|
+
}
|
|
162
|
+
|
|
139
163
|
/**
|
|
140
164
|
* 项目 - 列表数据
|
|
141
165
|
*/
|
|
@@ -171,11 +195,12 @@ export const importProjectApi = (data: FormData) => {
|
|
|
171
195
|
/**
|
|
172
196
|
* 项目数据导出
|
|
173
197
|
*/
|
|
174
|
-
export const exportProjectApi = (data: Record<string, unknown>): Promise<
|
|
198
|
+
export const exportProjectApi = (data: Record<string, unknown>): Promise<IBlobItem> => {
|
|
175
199
|
return axiosRequest({
|
|
176
200
|
url: '/agentic/project/export',
|
|
177
201
|
method: 'post',
|
|
178
|
-
data
|
|
202
|
+
data,
|
|
203
|
+
responseType: 'blob'
|
|
179
204
|
})
|
|
180
205
|
}
|
|
181
206
|
|
|
@@ -210,3 +235,13 @@ export const NoAuthApi = (showErrorMsg: boolean) => {
|
|
|
210
235
|
showErrorMsg // 是否显示错误信息,默认为 true
|
|
211
236
|
})
|
|
212
237
|
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* 测试 请求错误
|
|
241
|
+
*/
|
|
242
|
+
export const FailApi = () => {
|
|
243
|
+
return axiosRequest({
|
|
244
|
+
url: '/auth/fail',
|
|
245
|
+
method: 'post'
|
|
246
|
+
})
|
|
247
|
+
}
|