create-jnrs-vue 1.2.36 → 2.0.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 +1 -1
- package/bin/create.mjs +11 -3
- package/jnrs-vue/AGENTS.md +78 -0
- package/jnrs-vue/README.md +11 -13
- package/jnrs-vue/components.d.ts +5 -3
- package/jnrs-vue/package.json +11 -4
- package/jnrs-vue/public/system/menu.json +25 -35
- package/jnrs-vue/src/api/examples/portfolio-management/portfolio.ts +163 -0
- package/jnrs-vue/src/api/examples/portfolio-management/program.ts +149 -0
- package/jnrs-vue/src/api/examples/portfolio-management/project.ts +125 -0
- package/jnrs-vue/src/api/examples/program-management/index.ts +143 -0
- package/jnrs-vue/src/api/examples/program-management/sub-project.ts +125 -0
- package/jnrs-vue/src/api/{demos/project.ts → examples/project-management/index.ts} +48 -23
- package/jnrs-vue/src/api/{demos → examples/project-management}/manager.ts +1 -1
- package/jnrs-vue/src/api/request.ts +1 -1
- package/jnrs-vue/src/api/system/index.ts +2 -2
- package/jnrs-vue/src/assets/styles/root.scss +5 -0
- package/jnrs-vue/src/components/common/DictTag.vue +12 -6
- package/jnrs-vue/src/components/common/ImageView.vue +0 -1
- package/jnrs-vue/src/components/select/SelectManager.vue +1 -1
- package/jnrs-vue/src/composables/useDateRangeField.ts +10 -6
- package/jnrs-vue/src/layout/RouterTabs.vue +2 -2
- package/jnrs-vue/src/layout/TopHeader.vue +2 -2
- package/jnrs-vue/src/utils/field.ts +73 -0
- package/jnrs-vue/src/utils/file.ts +0 -36
- package/jnrs-vue/src/utils/index.ts +1 -0
- package/jnrs-vue/src/views/{demos → examples}/playground/RequestPage.vue +1 -1
- package/jnrs-vue/src/views/examples/portfolio-management/index.vue +65 -0
- package/jnrs-vue/src/views/examples/portfolio-management/portfolioTree/editDialog.vue +155 -0
- package/jnrs-vue/src/views/examples/portfolio-management/portfolioTree/index.vue +257 -0
- package/jnrs-vue/src/views/examples/portfolio-management/programList/editDialog.vue +167 -0
- package/jnrs-vue/src/views/examples/portfolio-management/programList/index.vue +225 -0
- package/jnrs-vue/src/views/examples/portfolio-management/projectList/editDialog.vue +177 -0
- package/jnrs-vue/src/views/examples/portfolio-management/projectList/index.vue +159 -0
- package/jnrs-vue/src/views/examples/program-management/index.vue +48 -0
- package/jnrs-vue/src/views/examples/program-management/mainPage/editDialog.vue +201 -0
- package/jnrs-vue/src/views/examples/program-management/mainPage/index.vue +218 -0
- package/jnrs-vue/src/views/examples/program-management/subPage/editDialog.vue +202 -0
- package/jnrs-vue/src/views/examples/program-management/subPage/index.vue +176 -0
- package/jnrs-vue/src/views/{demos/crud → examples/project-management}/EditDialog.vue +77 -37
- package/jnrs-vue/src/views/{demos/crud → examples/project-management}/index.vue +67 -38
- package/jnrs-vue/src/views/home/index.vue +8 -8
- package/jnrs-vue/src/views/login/index.vue +1 -1
- package/jnrs-vue/viteMockServe/fail.ts +2 -2
- package/jnrs-vue/viteMockServe/index.ts +254 -7
- package/jnrs-vue/viteMockServe/json/dictRes.json +11 -1
- package/jnrs-vue/viteMockServe/json/{loginRes_admin.json → loginResAdmin.json} +20 -0
- package/jnrs-vue/viteMockServe/json/programListRes.json +81 -0
- package/jnrs-vue/viteMockServe/json/projectListRes.json +34 -31
- package/jnrs-vue/viteMockServe/json/subProjectListRes.json +221 -0
- package/jnrs-vue/viteMockServe/success.ts +8 -8
- package/package.json +2 -2
- package/jnrs-vue/AGENTS/README_API.md +0 -95
- package/jnrs-vue/AGENTS/README_BASE.md +0 -11
- package/jnrs-vue/AGENTS/README_COMMON.md +0 -9
- package/jnrs-vue/AGENTS/README_CRUD.md +0 -90
- package/jnrs-vue/AGENTS/README_DEPENDENCIES.md +0 -11
- package/jnrs-vue/AGENTS/README_MENU.md +0 -593
- /package/jnrs-vue/src/views/{demos → examples}/playground/index.vue +0 -0
- /package/jnrs-vue/viteMockServe/json/{loginRes_user.json → loginResUser.json} +0 -0
package/README.md
CHANGED
package/bin/create.mjs
CHANGED
|
@@ -114,15 +114,23 @@ async function main() {
|
|
|
114
114
|
await fs.cp(templateDir, root, { recursive: true })
|
|
115
115
|
|
|
116
116
|
// 定义可选的内部模块
|
|
117
|
-
const allWorkspaceDeps = ['@jnrs/shared', '@jnrs/vue-core', '@jnrs/lingshu-smart']
|
|
118
|
-
const defaultSelected = ['@jnrs/shared', '@jnrs/vue-core']
|
|
117
|
+
const allWorkspaceDeps = ['@jnrs/shared', '@jnrs/vue-core', '@jnrs/lingshu-smart', '@jnrs/skills-biz']
|
|
118
|
+
const defaultSelected = ['@jnrs/shared', '@jnrs/vue-core', '@jnrs/skills-biz']
|
|
119
|
+
|
|
120
|
+
// 依赖备注
|
|
121
|
+
const depNotes = {
|
|
122
|
+
'@jnrs/shared': '【必选】通用工具库',
|
|
123
|
+
'@jnrs/vue-core': '【必选】Vue 专用核心功能包',
|
|
124
|
+
'@jnrs/lingshu-smart': '【可选】2D数字孪生系统(灵枢智造)',
|
|
125
|
+
'@jnrs/skills-biz': '【可选】AI Agent 业务技能库(service/views/script/menu 生成器)'
|
|
126
|
+
}
|
|
119
127
|
|
|
120
128
|
const { selected: selectedWorkspaceDeps } = await prompts({
|
|
121
129
|
type: 'multiselect',
|
|
122
130
|
name: 'selected',
|
|
123
131
|
message: '请选择要包含的内部依赖模块(默认已选中必要模块):',
|
|
124
132
|
choices: allWorkspaceDeps.map((dep) => ({
|
|
125
|
-
title: dep
|
|
133
|
+
title: `${dep} ${depNotes[dep] || ''}`,
|
|
126
134
|
value: dep,
|
|
127
135
|
selected: defaultSelected.includes(dep)
|
|
128
136
|
})),
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# jnrs-vue 工程 AI 开发指南
|
|
2
|
+
|
|
3
|
+
本文档面向在 jnrs-vue 工程中进行业务开发的开发者,说明如何使用 `@jnrs/skills-biz` 技能库加速开发。
|
|
4
|
+
|
|
5
|
+
## 技能库配置
|
|
6
|
+
|
|
7
|
+
`@jnrs/skills-biz` 随项目依赖安装,位于 `node_modules/@jnrs/skills-biz/`。**使用前需将技能目录配置到 AI IDE 的 skills 目录中**(如 Trae 的 `.trae/skills/`),供 AI Agent 自动加载调用。
|
|
8
|
+
|
|
9
|
+
## 技能清单
|
|
10
|
+
|
|
11
|
+
| 技能 | 作用 | 依赖 |
|
|
12
|
+
| ----------------- | ------------------------------------------------- | -------------------- |
|
|
13
|
+
| service-generator | 生成接口服务层代码(TS 类型 + API 函数) | OAS 文档或 mock 模式 |
|
|
14
|
+
| views-generator | 生成视图显示层及部分脚本控制层代码( .vue 文件(`<template>` + `<script setup>`)) | 接口服务层 |
|
|
15
|
+
| script-generator | 生成完整控制层代码 `<script setup>` patterns 参考 | 接口服务层 |
|
|
16
|
+
| menu-generator | 生成 `public/system/menu.json` 菜单配置代码 | 视图层 |
|
|
17
|
+
|
|
18
|
+
## 开发流程
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
1. service-generator → 生成 src/api/<module>/*.ts
|
|
22
|
+
2. views-generator → 生成 src/views/<module>/*.vue(含 template + script setup)
|
|
23
|
+
↑ 生成 script setup 时参考 script-generator 的 patterns
|
|
24
|
+
3. menu-generator → 在 public/system/menu.json 中追加菜单项
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 各技能使用方式
|
|
28
|
+
|
|
29
|
+
| 技能 | 触发方式 |
|
|
30
|
+
| ----------------- | ------------------------------------------------------------------------------------------------------ |
|
|
31
|
+
| service-generator | 向 AI 描述:**"生成 <模块名> 的服务层"** 或 **"生成 <模块名> 的 API"**。OAS 模式需确保 `OAS/` 目录存在 |
|
|
32
|
+
| views-generator | 向 AI 描述:**"生成 <模块名> 的页面"**。自动检测多栏布局,内部参考 script-generator 生成控制层代码 |
|
|
33
|
+
| script-generator | 通常由 views-generator 自动查阅。也可单独向 AI 描述:**"查看 <模块名> 的脚本模式"** |
|
|
34
|
+
| menu-generator | 向 AI 描述:**"生成菜单"** 或 **"新增菜单项"**。列出待生成菜单项供确认后写入 |
|
|
35
|
+
|
|
36
|
+
### 约束
|
|
37
|
+
|
|
38
|
+
- **必须**按 service → views → menu 顺序生成
|
|
39
|
+
- **禁止**跳过接口服务层直接生成视图
|
|
40
|
+
- 菜单生成前必须列出清单供用户确认
|
|
41
|
+
|
|
42
|
+
## 架构说明
|
|
43
|
+
|
|
44
|
+
业务模块采用三层架构(逻辑分离,非物理文件分离):
|
|
45
|
+
|
|
46
|
+
| 层级 | 物理位置 | 职责 | 生成器 |
|
|
47
|
+
| ---------- | ------------------------------------------- | ---------------------------- | ----------------- |
|
|
48
|
+
| 接口服务层 | `src/api/<module>/*.ts` | TS 类型定义 + API 请求函数 | service-generator |
|
|
49
|
+
| 控制层 | `src/views/<module>/*.vue` `<script setup>` | 状态管理、数据获取、事件处理 | views-generator |
|
|
50
|
+
| 视图层 | `src/views/<module>/*.vue` `<template>` | 模板代码、组件引用 | views-generator |
|
|
51
|
+
|
|
52
|
+
## 命名规范
|
|
53
|
+
|
|
54
|
+
| 类型 | 规范 | 示例 |
|
|
55
|
+
| --------- | ------------ | ------------------------------ |
|
|
56
|
+
| 目录 | kebab-case | `project-management/` |
|
|
57
|
+
| .vue 文件 | camelCase | `editDialog.vue`、`index.vue` |
|
|
58
|
+
| TS 文件 | kebab-case | `project-management.ts` |
|
|
59
|
+
| API 函数 | `*Api`小驼峰 | `projectTableApi` |
|
|
60
|
+
| 路由 name | 小驼峰 | `examplesProjectManagement` |
|
|
61
|
+
| 路由 path | kebab-case | `/examples/project-management` |
|
|
62
|
+
| 权限 | 两段式 | `module:view`、`module:edit` |
|
|
63
|
+
|
|
64
|
+
## 术语
|
|
65
|
+
|
|
66
|
+
- **OAS**:OpenAPI Specification,由接口管理工具(如 ApiFox)导出,存放于 `OAS/` 目录
|
|
67
|
+
- **JSDoc Tags**:自定义注签(`@dict`、`@enumValues`、`@independentModification`、`@useSelectComponent`、`@fileField`、`@foreignKey`),在服务层代码中标记字段特性,供视图生成时识别处理
|
|
68
|
+
- 后端 api 中所说的 `列表、分页列表` 即为前端的 `表格`
|
|
69
|
+
|
|
70
|
+
## 常用 @jnrs/ 库参考
|
|
71
|
+
|
|
72
|
+
| 导入 | 来源 | 文档 |
|
|
73
|
+
| ----------------------------------------------------- | --------------------------- | --------------------------------------- |
|
|
74
|
+
| `JnTable`, `JnPagination`, `JnDialog`, `JnFileUpload` | `@jnrs/vue-core/components` | `node_modules/@jnrs/vue-core/AGENTS.md` |
|
|
75
|
+
| `useRouter`, `useRoute` | `@jnrs/vue-core/router` | `node_modules/@jnrs/vue-core/AGENTS.md` |
|
|
76
|
+
| `useSystemStore`, `useMenuStore` | `@jnrs/vue-core/pinia` | `node_modules/@jnrs/vue-core/AGENTS.md` |
|
|
77
|
+
| `debounce` | `@jnrs/shared/lodash` | `node_modules/@jnrs/shared/AGENTS.md` |
|
|
78
|
+
| `objectMatchAssign`, `dateFormatsToObject` | `@jnrs/shared` | `node_modules/@jnrs/shared/AGENTS.md` |
|
package/jnrs-vue/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## ✨ 介绍
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
巨能(JNRS)前端工程化开发,Vue 项目信息化管理系统
|
|
6
6
|
|
|
7
7
|
## 💻 技术栈
|
|
8
8
|
|
|
@@ -18,23 +18,20 @@ pnpm build
|
|
|
18
18
|
|
|
19
19
|
## 🤖 AI Agent 使用说明
|
|
20
20
|
|
|
21
|
+
本脚手架模板现支持自动化生成业务模块前端代码。
|
|
22
|
+
|
|
21
23
|
- 前置准备
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
- 保存记忆:`读取并分析当前 README.md 文件及 /AGENTS/README_BASE.md 文件并作为 IDE AI Agent 的记忆`
|
|
27
|
-
- 生成菜单:`根据提供的菜单原型图,生成菜单`
|
|
28
|
-
- 生成服务文件:`根据提供的 openapi 文档或 MCP 服务,生成API 服务文件`
|
|
29
|
-
- 生成增删改查页面文件:`根据提供的界面原型图,生成增删改查页面文件`
|
|
24
|
+
- 重要:从接口管理工具(如 ApiFox)中导出 OAS 文件(如 openapi.json)放入 `skills-biz/OAS/` 目录下
|
|
25
|
+
- 可选:将业务功能原型图作为生成前端代码的参考文件,调用多模态能力
|
|
26
|
+
|
|
27
|
+
详细说明及提示词请参考[AGENTS.md](./AGENTS.md)
|
|
30
28
|
|
|
31
29
|
#### 项目结构
|
|
32
30
|
|
|
33
31
|
```Text
|
|
34
32
|
jnrs-vue/
|
|
35
|
-
├──
|
|
36
|
-
├──
|
|
37
|
-
├── public/ # 静态资源
|
|
33
|
+
├── viteMockServe/ # Mock 服务配置目录
|
|
34
|
+
├── public/ # 静态资源目录
|
|
38
35
|
├── src/ # 源码目录
|
|
39
36
|
│ ├── components/ # Vue 组件
|
|
40
37
|
│ ├── composables/ # 组合式函数
|
|
@@ -54,7 +51,8 @@ jnrs-vue/
|
|
|
54
51
|
├── tsconfig.json # TypeScript 配置
|
|
55
52
|
├── auto-imports.d.ts # 自动导入类型声明
|
|
56
53
|
├── components.d.ts # 全局组件类型声明
|
|
57
|
-
├── README.md #
|
|
54
|
+
├── README.md # 项目使用说明
|
|
55
|
+
├── AGENTS.md # AI Agent 使用说明
|
|
58
56
|
├── .env.development # 开发环境变量
|
|
59
57
|
├── .env.production # 生产环境变量
|
|
60
58
|
├── .gitignore # Git 忽略规则
|
package/jnrs-vue/components.d.ts
CHANGED
|
@@ -19,11 +19,12 @@ declare module 'vue' {
|
|
|
19
19
|
ElCard: typeof import('element-plus/es')['ElCard']
|
|
20
20
|
ElCascader: typeof import('element-plus/es')['ElCascader']
|
|
21
21
|
ElCol: typeof import('element-plus/es')['ElCol']
|
|
22
|
-
ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
|
|
23
22
|
ElContainer: typeof import('element-plus/es')['ElContainer']
|
|
24
23
|
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
|
|
25
24
|
ElDatePickerPanel: typeof import('element-plus/es')['ElDatePickerPanel']
|
|
26
|
-
|
|
25
|
+
ElDropdown: typeof import('element-plus/es')['ElDropdown']
|
|
26
|
+
ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
|
|
27
|
+
ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
|
|
27
28
|
ElForm: typeof import('element-plus/es')['ElForm']
|
|
28
29
|
ElFormItem: typeof import('element-plus/es')['ElFormItem']
|
|
29
30
|
ElHeader: typeof import('element-plus/es')['ElHeader']
|
|
@@ -35,16 +36,17 @@ declare module 'vue' {
|
|
|
35
36
|
ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
|
|
36
37
|
ElOption: typeof import('element-plus/es')['ElOption']
|
|
37
38
|
ElPopover: typeof import('element-plus/es')['ElPopover']
|
|
39
|
+
ElProgress: typeof import('element-plus/es')['ElProgress']
|
|
38
40
|
ElRow: typeof import('element-plus/es')['ElRow']
|
|
39
41
|
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
|
|
40
42
|
ElSelect: typeof import('element-plus/es')['ElSelect']
|
|
41
43
|
ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
|
|
42
44
|
ElSwitch: typeof import('element-plus/es')['ElSwitch']
|
|
43
|
-
ElTable: typeof import('element-plus/es')['ElTable']
|
|
44
45
|
ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
|
|
45
46
|
ElTabPane: typeof import('element-plus/es')['ElTabPane']
|
|
46
47
|
ElTabs: typeof import('element-plus/es')['ElTabs']
|
|
47
48
|
ElTag: typeof import('element-plus/es')['ElTag']
|
|
49
|
+
ElTree: typeof import('element-plus/es')['ElTree']
|
|
48
50
|
ElWatermark: typeof import('element-plus/es')['ElWatermark']
|
|
49
51
|
}
|
|
50
52
|
export interface GlobalDirectives {
|
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.38",
|
|
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.31",
|
|
23
|
+
"@jnrs/shared": "1.1.32",
|
|
24
|
+
"@jnrs/vue-core": "1.2.26",
|
|
25
25
|
"@vueuse/core": "^14.1.0",
|
|
26
26
|
"element-plus": "^2.13.3",
|
|
27
27
|
"pinia": "^3.0.4",
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"vue-i18n": "^11.2.8"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
+
"@jnrs/skills-biz": "*",
|
|
33
34
|
"@tsconfig/node22": "^22.0.5",
|
|
34
35
|
"@types/node": "^22.19.1",
|
|
35
36
|
"@typescript-eslint/parser": "^8.48.1",
|
|
@@ -52,5 +53,11 @@
|
|
|
52
53
|
"vite-plugin-mock": "^3.0.2",
|
|
53
54
|
"vite-plugin-vue-devtools": "^8.0.5",
|
|
54
55
|
"vue-tsc": "^3.1.5"
|
|
56
|
+
},
|
|
57
|
+
"pnpm": {
|
|
58
|
+
"onlyBuiltDependencies": [
|
|
59
|
+
"@parcel/watcher",
|
|
60
|
+
"esbuild"
|
|
61
|
+
]
|
|
55
62
|
}
|
|
56
63
|
}
|
|
@@ -10,39 +10,40 @@
|
|
|
10
10
|
},
|
|
11
11
|
"children": [
|
|
12
12
|
{
|
|
13
|
-
"path": "/playground",
|
|
14
|
-
"name": "
|
|
13
|
+
"path": "/examples/playground",
|
|
14
|
+
"name": "examplesPlayground",
|
|
15
15
|
"meta": {
|
|
16
16
|
"title": "基础功能测试",
|
|
17
17
|
"todoCount": 8
|
|
18
18
|
},
|
|
19
|
-
"component": "/
|
|
19
|
+
"component": "/examples/playground/index"
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
|
-
"path": "/
|
|
23
|
-
"name": "
|
|
22
|
+
"path": "/examples/project-management",
|
|
23
|
+
"name": "examplesProjectManagement",
|
|
24
24
|
"meta": {
|
|
25
25
|
"title": "项目管理",
|
|
26
26
|
"todoCount": 0
|
|
27
27
|
},
|
|
28
|
-
"component": "/
|
|
29
|
-
}
|
|
30
|
-
]
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
"meta": {
|
|
34
|
-
"title": "业务功能测试",
|
|
35
|
-
"icon": "Operation"
|
|
36
|
-
},
|
|
37
|
-
"children": [
|
|
28
|
+
"component": "/examples/project-management/index"
|
|
29
|
+
},
|
|
38
30
|
{
|
|
39
|
-
"path": "/
|
|
40
|
-
"name": "
|
|
31
|
+
"path": "/examples/program-management",
|
|
32
|
+
"name": "examplesProgramManagement",
|
|
41
33
|
"meta": {
|
|
42
|
-
"title": "
|
|
43
|
-
"todoCount":
|
|
34
|
+
"title": "项目集管理",
|
|
35
|
+
"todoCount": 0
|
|
44
36
|
},
|
|
45
|
-
"component": "/
|
|
37
|
+
"component": "/examples/program-management/index"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"path": "/examples/portfolio-management",
|
|
41
|
+
"name": "examplesPortfolioManagement",
|
|
42
|
+
"meta": {
|
|
43
|
+
"title": "项目组合管理",
|
|
44
|
+
"todoCount": 0
|
|
45
|
+
},
|
|
46
|
+
"component": "/examples/portfolio-management/index"
|
|
46
47
|
}
|
|
47
48
|
]
|
|
48
49
|
},
|
|
@@ -57,7 +58,6 @@
|
|
|
57
58
|
"name": "lingshuSmartEditorPage",
|
|
58
59
|
"meta": {
|
|
59
60
|
"title": "编辑器",
|
|
60
|
-
"icon": "Operation",
|
|
61
61
|
"noAuth": true,
|
|
62
62
|
"global": true
|
|
63
63
|
},
|
|
@@ -68,7 +68,6 @@
|
|
|
68
68
|
"name": "lingshuSmartPreviewPage",
|
|
69
69
|
"meta": {
|
|
70
70
|
"title": "看板",
|
|
71
|
-
"icon": "Platform",
|
|
72
71
|
"noAuth": true,
|
|
73
72
|
"global": true
|
|
74
73
|
},
|
|
@@ -98,25 +97,16 @@
|
|
|
98
97
|
"name": "systemMine",
|
|
99
98
|
"meta": {
|
|
100
99
|
"title": "个人中心",
|
|
101
|
-
"permissions": ["
|
|
100
|
+
"permissions": ["systemMine:view", "systemMine:edit"]
|
|
102
101
|
},
|
|
103
102
|
"component": "/system/mine/index"
|
|
104
103
|
},
|
|
105
|
-
{
|
|
106
|
-
"path": "/system/user",
|
|
107
|
-
"name": "systemUser",
|
|
108
|
-
"meta": {
|
|
109
|
-
"title": "用户管理",
|
|
110
|
-
"permissions": ["user:view", "user:edit"]
|
|
111
|
-
},
|
|
112
|
-
"component": "/system/user/index"
|
|
113
|
-
},
|
|
114
104
|
{
|
|
115
105
|
"path": "/system/role",
|
|
116
106
|
"name": "systemRole",
|
|
117
107
|
"meta": {
|
|
118
108
|
"title": "角色管理",
|
|
119
|
-
"permissions": ["
|
|
109
|
+
"permissions": ["systemRole:view", "systemRole:edit"]
|
|
120
110
|
},
|
|
121
111
|
"component": "/system/role/index"
|
|
122
112
|
},
|
|
@@ -125,7 +115,7 @@
|
|
|
125
115
|
"name": "systemDict",
|
|
126
116
|
"meta": {
|
|
127
117
|
"title": "字典管理",
|
|
128
|
-
"permissions": ["
|
|
118
|
+
"permissions": ["systemDict:view", "systemDict:edit"]
|
|
129
119
|
},
|
|
130
120
|
"component": "/system/dict/index"
|
|
131
121
|
},
|
|
@@ -134,7 +124,7 @@
|
|
|
134
124
|
"name": "systemMenu",
|
|
135
125
|
"meta": {
|
|
136
126
|
"title": "菜单管理",
|
|
137
|
-
"permissions": ["
|
|
127
|
+
"permissions": ["systemMenu:view", "systemMenu:edit"]
|
|
138
128
|
},
|
|
139
129
|
"component": "/system/menu/index"
|
|
140
130
|
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @File : portfolio-management/portfolio.ts
|
|
3
|
+
* @Desc. : 项目组合模块接口文档(左侧树)
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { IFullResponse } from '@jnrs/shared'
|
|
7
|
+
import { axiosRequest } from '../../request'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 项目组合 - 详情
|
|
11
|
+
*/
|
|
12
|
+
export interface Portfolio {
|
|
13
|
+
id: number
|
|
14
|
+
/** 组合名称 */
|
|
15
|
+
name: string
|
|
16
|
+
/** 排序 */
|
|
17
|
+
sequence: number
|
|
18
|
+
/** 是否有子组合 */
|
|
19
|
+
hasSubPortfolio: boolean
|
|
20
|
+
/** 描述 */
|
|
21
|
+
description: string
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 项目组合 - 新增
|
|
26
|
+
*/
|
|
27
|
+
export interface AddPortfolio {
|
|
28
|
+
/** 组合名称 */
|
|
29
|
+
name: string
|
|
30
|
+
/** 描述 */
|
|
31
|
+
description: string
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 项目组合 - 上方新增
|
|
36
|
+
*/
|
|
37
|
+
export interface UpSideAddPortfolio {
|
|
38
|
+
targetPortfolioId: number
|
|
39
|
+
name: string
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 项目组合 - 下方新增
|
|
44
|
+
*/
|
|
45
|
+
export interface DownSideAddPortfolio {
|
|
46
|
+
targetPortfolioId: number
|
|
47
|
+
name: string
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* 项目组合 - 子组合新增
|
|
52
|
+
*/
|
|
53
|
+
export interface InnerAddPortfolio {
|
|
54
|
+
targetPortfolioId: number
|
|
55
|
+
name: string
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* 项目组合 - 修改
|
|
60
|
+
*/
|
|
61
|
+
export interface UpdatePortfolio {
|
|
62
|
+
id: number
|
|
63
|
+
name: string
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* 项目组合 - 列表
|
|
68
|
+
*/
|
|
69
|
+
export const portfolioListApi = (parentId?: number): Promise<Portfolio[]> => {
|
|
70
|
+
return axiosRequest({
|
|
71
|
+
url: '/agentic/portfolio/list',
|
|
72
|
+
method: 'get',
|
|
73
|
+
params: { parentId }
|
|
74
|
+
})
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* 项目组合 - 最外侧新增
|
|
79
|
+
*/
|
|
80
|
+
export const addPortfolioApi = (data: AddPortfolio) => {
|
|
81
|
+
return axiosRequest({
|
|
82
|
+
url: '/agentic/portfolio/save',
|
|
83
|
+
method: 'post',
|
|
84
|
+
data
|
|
85
|
+
})
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* 项目组合 - 上方新增
|
|
90
|
+
*/
|
|
91
|
+
export const upSideAddPortfolioApi = (data: UpSideAddPortfolio) => {
|
|
92
|
+
return axiosRequest({
|
|
93
|
+
url: '/agentic/portfolio/upSideAdd',
|
|
94
|
+
method: 'post',
|
|
95
|
+
data
|
|
96
|
+
})
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* 项目组合 - 下方新增
|
|
101
|
+
*/
|
|
102
|
+
export const downSideAddPortfolioApi = (data: DownSideAddPortfolio) => {
|
|
103
|
+
return axiosRequest({
|
|
104
|
+
url: '/agentic/portfolio/downSideAdd',
|
|
105
|
+
method: 'post',
|
|
106
|
+
data
|
|
107
|
+
})
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* 项目组合 - 子组合新增
|
|
112
|
+
*/
|
|
113
|
+
export const innerAddPortfolioApi = (data: InnerAddPortfolio) => {
|
|
114
|
+
return axiosRequest({
|
|
115
|
+
url: '/agentic/portfolio/innerAdd',
|
|
116
|
+
method: 'post',
|
|
117
|
+
data
|
|
118
|
+
})
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* 项目组合 - 修改
|
|
123
|
+
*/
|
|
124
|
+
export const updatePortfolioApi = (data: UpdatePortfolio) => {
|
|
125
|
+
return axiosRequest({
|
|
126
|
+
url: '/agentic/portfolio/update',
|
|
127
|
+
method: 'put',
|
|
128
|
+
data
|
|
129
|
+
})
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* 项目组合 - 上移
|
|
134
|
+
*/
|
|
135
|
+
export const moveUpPortfolioApi = (data: { targetPortfolioId: number }) => {
|
|
136
|
+
return axiosRequest({
|
|
137
|
+
url: '/agentic/portfolio/moveUp',
|
|
138
|
+
method: 'put',
|
|
139
|
+
data
|
|
140
|
+
})
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* 项目组合 - 下移
|
|
145
|
+
*/
|
|
146
|
+
export const moveDownPortfolioApi = (data: { targetPortfolioId: number }) => {
|
|
147
|
+
return axiosRequest({
|
|
148
|
+
url: '/agentic/portfolio/moveDown',
|
|
149
|
+
method: 'put',
|
|
150
|
+
data
|
|
151
|
+
})
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* 项目组合 - 删除
|
|
156
|
+
*/
|
|
157
|
+
export const deletePortfolioApi = (id: number): Promise<IFullResponse<unknown>> => {
|
|
158
|
+
return axiosRequest({
|
|
159
|
+
url: `/agentic/portfolio/delete/${id}`,
|
|
160
|
+
method: 'delete',
|
|
161
|
+
returnFullResponse: true
|
|
162
|
+
})
|
|
163
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @File : portfolio-management/program.ts
|
|
3
|
+
* @Desc. : 项目集模块接口文档(中间表格,归属项目组合)
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { IFullResponse } from '@jnrs/shared'
|
|
7
|
+
import type { IPagination, IPageTableData } from '@/types'
|
|
8
|
+
import { axiosRequest } from '../../request'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* 项目集(归属组合) - 详情
|
|
12
|
+
*/
|
|
13
|
+
export interface PortfolioProgram {
|
|
14
|
+
id: string
|
|
15
|
+
/** 项目组合Id */
|
|
16
|
+
portfolioId: number
|
|
17
|
+
/** 项目集编码 */
|
|
18
|
+
code: number
|
|
19
|
+
/** 项目集名称 */
|
|
20
|
+
name: string
|
|
21
|
+
/** 项目集描述 */
|
|
22
|
+
description: string
|
|
23
|
+
/** 项目经理Id */
|
|
24
|
+
managerId: number
|
|
25
|
+
/** 项目经理名称 */
|
|
26
|
+
managerName: string
|
|
27
|
+
/** 预算 */
|
|
28
|
+
budget: number
|
|
29
|
+
/** 开始日期 */
|
|
30
|
+
startDate: string
|
|
31
|
+
/** 结束日期 */
|
|
32
|
+
endDate: string
|
|
33
|
+
/**
|
|
34
|
+
* 项目集状态
|
|
35
|
+
* @dict programStatus
|
|
36
|
+
* @enumValues [0, 1, 2]
|
|
37
|
+
*/
|
|
38
|
+
programStatus: number
|
|
39
|
+
/**
|
|
40
|
+
* 启用状态
|
|
41
|
+
* @independentModification portfolioProgramEnableApi
|
|
42
|
+
*/
|
|
43
|
+
enable: boolean
|
|
44
|
+
/** 项目数量 */
|
|
45
|
+
projectCount: number
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* 项目集(归属组合) - 新增
|
|
50
|
+
*/
|
|
51
|
+
export interface AddPortfolioProgram {
|
|
52
|
+
portfolioId?: number
|
|
53
|
+
code: number
|
|
54
|
+
name: string
|
|
55
|
+
description: string
|
|
56
|
+
/**
|
|
57
|
+
* 项目经理
|
|
58
|
+
* @useSelectComponent SelectManager
|
|
59
|
+
*/
|
|
60
|
+
managerId?: Record<string, unknown> | number
|
|
61
|
+
budget: number
|
|
62
|
+
startDate: string
|
|
63
|
+
endDate: string
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* 项目集(归属组合) - 修改
|
|
68
|
+
*/
|
|
69
|
+
export interface UpdatePortfolioProgram extends AddPortfolioProgram {
|
|
70
|
+
id: string
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* 项目集(归属组合) - 启用/禁用
|
|
75
|
+
*/
|
|
76
|
+
export interface PortfolioProgramEnable {
|
|
77
|
+
id: string
|
|
78
|
+
enable: boolean
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* 项目集(归属组合) - 查询
|
|
83
|
+
*/
|
|
84
|
+
export interface PortfolioProgramQuery extends IPagination {
|
|
85
|
+
/**
|
|
86
|
+
* 项目组合Id
|
|
87
|
+
* @foreignKey portfolioId
|
|
88
|
+
*/
|
|
89
|
+
portfolioId?: number
|
|
90
|
+
code?: string
|
|
91
|
+
name?: string
|
|
92
|
+
managerId?: number
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* 项目集(归属组合) - 列表数据
|
|
97
|
+
*/
|
|
98
|
+
export const portfolioProgramTableApi = (params?: PortfolioProgramQuery): Promise<IPageTableData<PortfolioProgram>> => {
|
|
99
|
+
return axiosRequest({
|
|
100
|
+
url: '/agentic/portfolio-program/list',
|
|
101
|
+
method: 'get',
|
|
102
|
+
params
|
|
103
|
+
})
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* 项目集(归属组合) - 新增
|
|
108
|
+
*/
|
|
109
|
+
export const addPortfolioProgramApi = (data: AddPortfolioProgram) => {
|
|
110
|
+
return axiosRequest({
|
|
111
|
+
url: '/agentic/portfolio-program/save',
|
|
112
|
+
method: 'post',
|
|
113
|
+
data
|
|
114
|
+
})
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* 项目集(归属组合) - 修改
|
|
119
|
+
*/
|
|
120
|
+
export const editPortfolioProgramApi = (data: UpdatePortfolioProgram) => {
|
|
121
|
+
return axiosRequest({
|
|
122
|
+
url: '/agentic/portfolio-program/save',
|
|
123
|
+
method: 'post',
|
|
124
|
+
data
|
|
125
|
+
})
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* 项目集(归属组合) - 删除
|
|
130
|
+
*/
|
|
131
|
+
export const deletePortfolioProgramApi = (id: string): Promise<IFullResponse<unknown>> => {
|
|
132
|
+
return axiosRequest({
|
|
133
|
+
url: `/agentic/portfolio-program/delete/${id}`,
|
|
134
|
+
method: 'delete',
|
|
135
|
+
returnFullResponse: true
|
|
136
|
+
})
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* 项目集(归属组合) - 启用/禁用
|
|
141
|
+
*/
|
|
142
|
+
export const portfolioProgramEnableApi = (data: PortfolioProgramEnable) => {
|
|
143
|
+
return axiosRequest({
|
|
144
|
+
url: '/agentic/portfolio-program/enable',
|
|
145
|
+
method: 'put',
|
|
146
|
+
data,
|
|
147
|
+
returnFullResponse: true
|
|
148
|
+
})
|
|
149
|
+
}
|