create-jnrs-vue 1.2.25 → 1.2.27
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/jnrs-vue/package.json +4 -4
- package/jnrs-vue/public/system/menu.json +18 -0
- package/jnrs-vue/src/api/demos/ai_agent_context.ts +159 -0
- package/jnrs-vue/src/api/demos/index.ts +31 -23
- package/jnrs-vue/src/api/request.ts +2 -2
- package/jnrs-vue/src/components/common/DictTag.vue +1 -1
- package/jnrs-vue/src/composables/useCrud.ts +228 -55
- package/jnrs-vue/src/layout/SideMenu.vue +1 -2
- package/jnrs-vue/src/layout/TopHeader.vue +1 -3
- package/jnrs-vue/src/utils/packages.ts +2 -2
- package/jnrs-vue/src/views/demos/compositionCrud/index.vue +350 -0
- package/jnrs-vue/src/views/demos/compositionTable/index.vue +85 -0
- package/jnrs-vue/src/views/demos/crud/index.vue +5 -5
- package/jnrs-vue/src/views/demos/unitTest/RequestPage.vue +2 -2
- package/jnrs-vue/src/views/visual/index.vue +2 -5
- package/jnrs-vue/tsconfig.json +2 -1
- package/package.json +1 -1
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.27",
|
|
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.7",
|
|
23
|
+
"@jnrs/shared": "1.1.23",
|
|
24
|
+
"@jnrs/vue-core": "1.2.15",
|
|
25
25
|
"@vueuse/core": "^14.1.0",
|
|
26
26
|
"element-plus": "^2.13.3",
|
|
27
27
|
"pinia": "^3.0.4",
|
|
@@ -27,6 +27,15 @@
|
|
|
27
27
|
},
|
|
28
28
|
"component": "/demos/simpleTable/index"
|
|
29
29
|
},
|
|
30
|
+
{
|
|
31
|
+
"path": "/compositionTable",
|
|
32
|
+
"name": "compositionTable",
|
|
33
|
+
"meta": {
|
|
34
|
+
"title": "简单数据表格 - 组合式",
|
|
35
|
+
"todoCount": 0
|
|
36
|
+
},
|
|
37
|
+
"component": "/demos/compositionTable/index"
|
|
38
|
+
},
|
|
30
39
|
{
|
|
31
40
|
"path": "/crud",
|
|
32
41
|
"name": "Crud",
|
|
@@ -36,6 +45,15 @@
|
|
|
36
45
|
},
|
|
37
46
|
"component": "/demos/crud/index"
|
|
38
47
|
},
|
|
48
|
+
{
|
|
49
|
+
"path": "/compositionCrud",
|
|
50
|
+
"name": "compositionCrud",
|
|
51
|
+
"meta": {
|
|
52
|
+
"title": "完整增删改查 - 组合式",
|
|
53
|
+
"todoCount": 0
|
|
54
|
+
},
|
|
55
|
+
"component": "/demos/compositionCrud/index"
|
|
56
|
+
},
|
|
39
57
|
{
|
|
40
58
|
"path": "/testRedirect",
|
|
41
59
|
"name": "TestRedirect",
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Author : TanRui
|
|
3
|
+
* @WeChat : Tan578853789
|
|
4
|
+
* @File : project/ai_agent_context.ts
|
|
5
|
+
* @Date : 2026/03/01
|
|
6
|
+
* @Desc. : 示例模块接口文档(对于标准业务功能可作为 AI Agent 上下文)
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type {
|
|
10
|
+
// 列表数据及数据总数
|
|
11
|
+
IPageTableData,
|
|
12
|
+
// 分页
|
|
13
|
+
IPagination,
|
|
14
|
+
// 附件
|
|
15
|
+
IFile
|
|
16
|
+
} from '@/types'
|
|
17
|
+
import {
|
|
18
|
+
// axios 请求方法泛型拓展封装
|
|
19
|
+
axiosRequest
|
|
20
|
+
} from '../request'
|
|
21
|
+
import {
|
|
22
|
+
// 将对象转为 FormData
|
|
23
|
+
objectToFormData
|
|
24
|
+
} from '@/utils'
|
|
25
|
+
|
|
26
|
+
export interface Project extends IFile {
|
|
27
|
+
id: string
|
|
28
|
+
programCode: string
|
|
29
|
+
program: string
|
|
30
|
+
code: string
|
|
31
|
+
name: string
|
|
32
|
+
description: string
|
|
33
|
+
projectType?: '敏捷型' | '瀑布型' | '混合型'
|
|
34
|
+
manager: string
|
|
35
|
+
budget: number
|
|
36
|
+
plannedStartDate: string
|
|
37
|
+
plannedFinishDate: string
|
|
38
|
+
progress: string
|
|
39
|
+
status: '进行中' | '已完成' | '未开始' | '已暂停'
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
type ProjectReadOnly =
|
|
43
|
+
| 'programCode'
|
|
44
|
+
| 'program'
|
|
45
|
+
| 'code'
|
|
46
|
+
| 'manager'
|
|
47
|
+
| 'plannedFinishDate'
|
|
48
|
+
| 'progress'
|
|
49
|
+
| 'status'
|
|
50
|
+
| 'imageDocument'
|
|
51
|
+
| 'attachmentDocument'
|
|
52
|
+
|
|
53
|
+
export type EditProject = Omit<Project, ProjectReadOnly> & {
|
|
54
|
+
newAttachmentFile: []
|
|
55
|
+
newImageFiles: []
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface ProjectQuery extends IPagination {
|
|
59
|
+
code?: string
|
|
60
|
+
projectType?: '敏捷型' | '瀑布型' | '混合型'
|
|
61
|
+
manager?: string
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* 项目 - 列表数据
|
|
66
|
+
*/
|
|
67
|
+
export const ProjectListApi = (params?: ProjectQuery): Promise<IPageTableData<Project>> => {
|
|
68
|
+
return axiosRequest({
|
|
69
|
+
url: '/project/table',
|
|
70
|
+
method: 'get',
|
|
71
|
+
params
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* 项目 - 详情数据
|
|
77
|
+
*/
|
|
78
|
+
export const DataApiTest = (params: { id: string }): Promise<Project> => {
|
|
79
|
+
return axiosRequest({
|
|
80
|
+
url: '/project/info',
|
|
81
|
+
method: 'get',
|
|
82
|
+
params
|
|
83
|
+
})
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* 项目 - 新增
|
|
88
|
+
*/
|
|
89
|
+
export const CreateProjectApi = (data: Omit<Project, 'id'>) => {
|
|
90
|
+
return axiosRequest({
|
|
91
|
+
url: '/project/save',
|
|
92
|
+
method: 'post',
|
|
93
|
+
data
|
|
94
|
+
})
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* 项目 - 编辑
|
|
99
|
+
*/
|
|
100
|
+
export const EditProjectApi = (data: EditProject) => {
|
|
101
|
+
return axiosRequest({
|
|
102
|
+
url: '/project/save',
|
|
103
|
+
method: 'post',
|
|
104
|
+
data: objectToFormData(data) // 请求体如果为 formData 类型,使用 objectToFormData 方法转换
|
|
105
|
+
})
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* 项目 - 更新
|
|
110
|
+
*/
|
|
111
|
+
export const UpdateProjectApi = (data: Project) => {
|
|
112
|
+
return axiosRequest({
|
|
113
|
+
url: '/project/update',
|
|
114
|
+
method: 'put',
|
|
115
|
+
data
|
|
116
|
+
})
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* 项目 - 删除
|
|
121
|
+
*/
|
|
122
|
+
export const DeleteProjectApi = (id: string) => {
|
|
123
|
+
return axiosRequest({
|
|
124
|
+
url: `/project/delete/${id}`,
|
|
125
|
+
method: 'delete'
|
|
126
|
+
})
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* 项目 - 导入
|
|
131
|
+
*/
|
|
132
|
+
export const ImportDataApi = (data: FormData) => {
|
|
133
|
+
return axiosRequest({
|
|
134
|
+
url: '/project/import',
|
|
135
|
+
method: 'post',
|
|
136
|
+
data
|
|
137
|
+
})
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* 项目 - 导出
|
|
142
|
+
*/
|
|
143
|
+
export const ExportApi = (data: Record<string, unknown>): Promise<Blob> => {
|
|
144
|
+
return axiosRequest({
|
|
145
|
+
url: '/project/export',
|
|
146
|
+
method: 'post',
|
|
147
|
+
data
|
|
148
|
+
})
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* 项目 - 文件下载
|
|
153
|
+
*/
|
|
154
|
+
export const DownloadFileApi = (): Promise<Blob> => {
|
|
155
|
+
return axiosRequest({
|
|
156
|
+
url: '/project/files',
|
|
157
|
+
method: 'post'
|
|
158
|
+
})
|
|
159
|
+
}
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
* @WeChat : Tan578853789
|
|
4
4
|
* @File : demos/index.ts
|
|
5
5
|
* @Date : 2026/03/01
|
|
6
|
-
* @Desc. :
|
|
6
|
+
* @Desc. : 示例模块接口文档(非标业务功能人工编码参考)
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import type {
|
|
9
|
+
import type { IFullResponse } from '@jnrs/shared'
|
|
10
10
|
import type { IPagination, IPageTableData, IFile, IUser } from '@/types'
|
|
11
11
|
import { axiosRequest } from '../request'
|
|
12
12
|
import { objectToFormData } from '@/utils'
|
|
@@ -15,7 +15,7 @@ import { objectToFormData } from '@/utils'
|
|
|
15
15
|
* 项目 - 详情
|
|
16
16
|
*/
|
|
17
17
|
export interface Project extends IFile {
|
|
18
|
-
id:
|
|
18
|
+
id: number
|
|
19
19
|
programCode: string
|
|
20
20
|
program: string
|
|
21
21
|
code: string
|
|
@@ -31,10 +31,9 @@ export interface Project extends IFile {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
34
|
+
* 创建时不能修改的属性
|
|
35
35
|
*/
|
|
36
|
-
type
|
|
37
|
-
| 'id'
|
|
36
|
+
type ProjectReadOnly =
|
|
38
37
|
| 'programCode'
|
|
39
38
|
| 'program'
|
|
40
39
|
| 'code'
|
|
@@ -48,8 +47,7 @@ type CreateProjectOmit =
|
|
|
48
47
|
/**
|
|
49
48
|
* 项目 - 创建
|
|
50
49
|
*/
|
|
51
|
-
export type EditProject = Omit<Project,
|
|
52
|
-
id?: string
|
|
50
|
+
export type EditProject = Omit<Project, ProjectReadOnly> & {
|
|
53
51
|
managerId?: Record<string, unknown> | number
|
|
54
52
|
newAttachmentFile: []
|
|
55
53
|
newImageFiles: []
|
|
@@ -62,27 +60,24 @@ export interface ProjectQuery extends IPagination {
|
|
|
62
60
|
code?: string
|
|
63
61
|
projectType?: '敏捷型' | '瀑布型' | '混合型'
|
|
64
62
|
manager?: string
|
|
63
|
+
plannedStartDate?: string
|
|
65
64
|
}
|
|
66
65
|
|
|
67
66
|
// 测试 获取数据
|
|
68
|
-
export const DataApiTest = (id: string): Promise<IUser> => {
|
|
67
|
+
export const DataApiTest = (params: { id: string }): Promise<IUser> => {
|
|
69
68
|
return axiosRequest({
|
|
70
69
|
url: '/auth/user-info',
|
|
71
70
|
method: 'get',
|
|
72
|
-
params
|
|
73
|
-
id
|
|
74
|
-
}
|
|
71
|
+
params
|
|
75
72
|
})
|
|
76
73
|
}
|
|
77
74
|
|
|
78
75
|
// 测试 获取全量数据
|
|
79
|
-
export const FullDataApiTest = (id: string): Promise<
|
|
76
|
+
export const FullDataApiTest = (params: { id: string }): Promise<IFullResponse<IUser>> => {
|
|
80
77
|
return axiosRequest({
|
|
81
78
|
url: '/auth/user-info',
|
|
82
79
|
method: 'get',
|
|
83
|
-
params
|
|
84
|
-
id
|
|
85
|
-
},
|
|
80
|
+
params,
|
|
86
81
|
returnFullResponse: true // 需要返回完整响应数据时使用该选项
|
|
87
82
|
})
|
|
88
83
|
}
|
|
@@ -104,19 +99,18 @@ export const NoNeedAuthApi = () => {
|
|
|
104
99
|
return axiosRequest({
|
|
105
100
|
url: '/auth/no',
|
|
106
101
|
method: 'post',
|
|
107
|
-
noAuth: true
|
|
102
|
+
noAuth: true // 是否需要权限,默认为 false
|
|
108
103
|
})
|
|
109
104
|
}
|
|
110
105
|
|
|
111
106
|
/**
|
|
112
107
|
* 测试 无权限
|
|
113
|
-
* @param showErrorMsg 是否显示错误信息
|
|
114
108
|
*/
|
|
115
109
|
export const NoAuthApi = (showErrorMsg: boolean) => {
|
|
116
110
|
return axiosRequest({
|
|
117
111
|
url: '/auth/no',
|
|
118
112
|
method: 'post',
|
|
119
|
-
showErrorMsg
|
|
113
|
+
showErrorMsg // 是否显示错误信息,默认为 true
|
|
120
114
|
})
|
|
121
115
|
}
|
|
122
116
|
|
|
@@ -137,7 +131,7 @@ export const EditProjectApi = (data: EditProject) => {
|
|
|
137
131
|
return axiosRequest({
|
|
138
132
|
url: '/demos/save',
|
|
139
133
|
method: 'post',
|
|
140
|
-
data: objectToFormData(data) //
|
|
134
|
+
data: objectToFormData(data) // 请求体如果为 formData 类型,使用 objectToFormData 方法转换
|
|
141
135
|
})
|
|
142
136
|
}
|
|
143
137
|
|
|
@@ -155,7 +149,7 @@ export const UpdateProjectApi = (data: Project) => {
|
|
|
155
149
|
/**
|
|
156
150
|
* 删除数据
|
|
157
151
|
*/
|
|
158
|
-
export const DeleteProjectApi = (id:
|
|
152
|
+
export const DeleteProjectApi = (id: number) => {
|
|
159
153
|
return axiosRequest({
|
|
160
154
|
url: `/demos/delete/${id}`,
|
|
161
155
|
method: 'delete'
|
|
@@ -164,11 +158,11 @@ export const DeleteProjectApi = (id: string) => {
|
|
|
164
158
|
/**
|
|
165
159
|
* 列表数据
|
|
166
160
|
*/
|
|
167
|
-
export const ProjectListApi = (
|
|
161
|
+
export const ProjectListApi = (params?: ProjectQuery): Promise<IPageTableData<Project>> => {
|
|
168
162
|
return axiosRequest({
|
|
169
163
|
url: '/demos/table',
|
|
170
164
|
method: 'get',
|
|
171
|
-
|
|
165
|
+
params
|
|
172
166
|
})
|
|
173
167
|
}
|
|
174
168
|
|
|
@@ -203,3 +197,17 @@ export const ExportApi = (data: Record<string, unknown>): Promise<Blob> => {
|
|
|
203
197
|
data
|
|
204
198
|
})
|
|
205
199
|
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* axios 方式下载文件
|
|
203
|
+
* @param uniqueFileName 文件唯一名称(列表中一般是在 item.attachmentDocument/imageDocument.attachments[].uniqueFileName)
|
|
204
|
+
* @returns Blob
|
|
205
|
+
*/
|
|
206
|
+
export const FileApi = (uniqueFileName: string): Promise<Blob> => {
|
|
207
|
+
return axiosRequest({
|
|
208
|
+
url: '/files/' + uniqueFileName,
|
|
209
|
+
method: 'get',
|
|
210
|
+
responseType: 'blob', // 响应类型为 blob
|
|
211
|
+
showErrorMsg: false // 不显示错误信息
|
|
212
|
+
})
|
|
213
|
+
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @Desc. : axios 网络请求实例
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import type { IBusinessRequest,
|
|
9
|
+
import type { IBusinessRequest, IFullResponse } from '@jnrs/shared'
|
|
10
10
|
import { createAxiosInstance } from '@jnrs/shared/request'
|
|
11
11
|
import { useMockStore } from '@jnrs/vue-core/pinia'
|
|
12
12
|
import { useAuthStore } from '@/stores'
|
|
@@ -32,7 +32,7 @@ const axiosInstance = createAxiosInstance({
|
|
|
32
32
|
* @param options 请求配置项
|
|
33
33
|
* @returns Promise<T> 响应数据
|
|
34
34
|
*/
|
|
35
|
-
const axiosRequest = <T =
|
|
35
|
+
const axiosRequest = <T = IFullResponse>(options: IBusinessRequest): Promise<T> => {
|
|
36
36
|
if (!axiosInstance) {
|
|
37
37
|
throw new Error('请先调用 createRequest 初始化 axios 实例')
|
|
38
38
|
}
|