create-jnrs-vue 2.0.2 → 2.0.4

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.
Files changed (50) hide show
  1. package/jnrs-vue/components.d.ts +1 -0
  2. package/jnrs-vue/package.json +4 -4
  3. package/jnrs-vue/src/api/examples/playground.ts +51 -0
  4. package/jnrs-vue/src/api/examples/portfolio-management/portfolio.ts +10 -10
  5. package/jnrs-vue/src/api/examples/portfolio-management/program.ts +5 -5
  6. package/jnrs-vue/src/api/examples/portfolio-management/project.ts +4 -4
  7. package/jnrs-vue/src/api/examples/program-management/index.ts +5 -5
  8. package/jnrs-vue/src/api/examples/program-management/sub-project.ts +4 -4
  9. package/jnrs-vue/src/api/examples/project-management/index.ts +19 -51
  10. package/jnrs-vue/src/api/examples/project-management/manager.ts +1 -1
  11. package/jnrs-vue/src/components/common/DictSelector.vue +70 -0
  12. package/jnrs-vue/src/components/common/DictTag.vue +8 -2
  13. package/jnrs-vue/src/utils/index.ts +1 -1
  14. package/jnrs-vue/src/views/examples/playground/RequestPage.vue +97 -38
  15. package/jnrs-vue/src/views/examples/playground/index.vue +203 -63
  16. package/jnrs-vue/src/views/examples/portfolio-management/programList/editDialog.vue +10 -0
  17. package/jnrs-vue/src/views/examples/portfolio-management/programList/index.vue +1 -1
  18. package/jnrs-vue/src/views/examples/portfolio-management/projectList/editDialog.vue +12 -9
  19. package/jnrs-vue/src/views/examples/program-management/mainPage/editDialog.vue +15 -19
  20. package/jnrs-vue/src/views/examples/program-management/subPage/editDialog.vue +15 -19
  21. package/jnrs-vue/src/views/examples/project-management/EditDialog.vue +54 -24
  22. package/jnrs-vue/src/views/examples/project-management/index.vue +4 -18
  23. package/jnrs-vue/viteMockServe/auth.mock.ts +41 -0
  24. package/jnrs-vue/viteMockServe/details.mock.ts +12 -0
  25. package/jnrs-vue/viteMockServe/dict.mock.ts +21 -0
  26. package/jnrs-vue/viteMockServe/index.ts +22 -370
  27. package/jnrs-vue/viteMockServe/manager.mock.ts +12 -0
  28. package/jnrs-vue/viteMockServe/portfolio-program.mock.ts +36 -0
  29. package/jnrs-vue/viteMockServe/portfolio-project.mock.ts +28 -0
  30. package/jnrs-vue/viteMockServe/portfolio.mock.ts +109 -0
  31. package/jnrs-vue/viteMockServe/program.mock.ts +45 -0
  32. package/jnrs-vue/viteMockServe/project.mock.ts +58 -0
  33. package/jnrs-vue/viteMockServe/role.mock.ts +12 -0
  34. package/jnrs-vue/viteMockServe/sub-project.mock.ts +34 -0
  35. package/package.json +1 -1
  36. package/jnrs-vue/src/api/business/index.ts +0 -69
  37. package/jnrs-vue/src/utils/field.ts +0 -73
  38. package/jnrs-vue/src/views/businessPlayground/EditDialog.vue +0 -137
  39. package/jnrs-vue/src/views/businessPlayground/index.vue +0 -90
  40. package/jnrs-vue/viteMockServe/json/tableRes.json +0 -390
  41. /package/jnrs-vue/viteMockServe/json/{loginResAdmin.json → auth-login-admin.json} +0 -0
  42. /package/jnrs-vue/viteMockServe/json/{loginResUser.json → auth-login-user.json} +0 -0
  43. /package/jnrs-vue/viteMockServe/json/{detailsRes.json → details.json} +0 -0
  44. /package/jnrs-vue/viteMockServe/json/{dictItemRes.json → dict-detail.json} +0 -0
  45. /package/jnrs-vue/viteMockServe/json/{dictRes.json → dict-list.json} +0 -0
  46. /package/jnrs-vue/viteMockServe/json/{managerRes.json → manager-list.json} +0 -0
  47. /package/jnrs-vue/viteMockServe/json/{programListRes.json → program-list.json} +0 -0
  48. /package/jnrs-vue/viteMockServe/json/{projectListRes.json → project-list.json} +0 -0
  49. /package/jnrs-vue/viteMockServe/json/{roleRes.json → role-list.json} +0 -0
  50. /package/jnrs-vue/viteMockServe/json/{subProjectListRes.json → sub-project-list.json} +0 -0
@@ -9,7 +9,7 @@ import type { FormInstance, FormRules } from 'element-plus'
9
9
  import { ref, nextTick } from 'vue'
10
10
  import { ElMessage } from 'element-plus'
11
11
  import { objectMatchAssign, verifyNumberGtZero } from '@jnrs/shared'
12
- import { getDictList, extractFieldId } from '@/utils'
12
+ import { extractFieldId } from '@/utils'
13
13
  import {
14
14
  type SubProject,
15
15
  type AddSubProject,
@@ -19,6 +19,7 @@ import {
19
19
  } from '@/api/examples/program-management/sub-project'
20
20
  import { JnDialog } from '@jnrs/vue-core/components'
21
21
  import SelectManager from '@/components/select/SelectManager.vue'
22
+ import DictSelector from '@/components/common/DictSelector.vue'
22
23
 
23
24
  const emit = defineEmits<{
24
25
  success: []
@@ -28,6 +29,7 @@ const loading = ref(false)
28
29
  const editDialogRef = ref()
29
30
  const ruleFormRef = ref<FormInstance>()
30
31
  const currentProgramId = ref<string | undefined>(undefined)
32
+ const editingRow = ref<{ code?: number; name?: string } | null>(null)
31
33
  const ruleForm = ref<AddSubProject | UpdateSubProject>({
32
34
  id: '',
33
35
  programId: undefined,
@@ -56,6 +58,7 @@ const rules = ref<FormRules>({
56
58
 
57
59
  // 打开弹窗
58
60
  const open = (programId: string | undefined, row?: SubProject) => {
61
+ editingRow.value = row ? { code: row.code, name: row.name } : null
59
62
  currentProgramId.value = programId
60
63
  editDialogRef.value.open()
61
64
  nextTick(() => {
@@ -132,6 +135,14 @@ defineExpose({
132
135
  <template>
133
136
  <!-- 编辑弹窗 -->
134
137
  <JnDialog ref="editDialogRef" title="子项目" width="600px">
138
+ <el-alert v-if="editingRow" type="info" :closable="false" show-icon>
139
+ <template #title>
140
+ 当前编辑:子项目编码
141
+ <strong>{{ editingRow.code }}</strong>
142
+ | 子项目名称
143
+ <strong>{{ editingRow.name }}</strong>
144
+ </template>
145
+ </el-alert>
135
146
  <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="auto" v-loading="loading">
136
147
  <el-form-item prop="id"></el-form-item>
137
148
  <el-form-item label="子项目编码" prop="code">
@@ -148,14 +159,7 @@ defineExpose({
148
159
  <el-input v-model.trim="ruleForm.name" maxlength="20" show-word-limit style="width: 100%" />
149
160
  </el-form-item>
150
161
  <el-form-item label="项目类型" prop="projectType">
151
- <el-select v-model="ruleForm.projectType" filterable placeholder="">
152
- <el-option
153
- :label="item.label"
154
- :value="item.value"
155
- v-for="item in getDictList('projectType')"
156
- :key="item.value"
157
- />
158
- </el-select>
162
+ <DictSelector v-model="ruleForm.projectType" dictName="projectType" />
159
163
  </el-form-item>
160
164
  <el-form-item label="负责人" prop="managerId">
161
165
  <SelectManager
@@ -181,18 +185,10 @@ defineExpose({
181
185
  </el-input-number>
182
186
  </el-form-item>
183
187
  <el-form-item label="计划开始时间" prop="plannedStartDate">
184
- <el-date-picker
185
- v-model="ruleForm.plannedStartDate"
186
- value-format="YYYY-MM-DD"
187
- style="width: 220px"
188
- />
188
+ <el-date-picker v-model="ruleForm.plannedStartDate" value-format="YYYY-MM-DD" style="width: 220px" />
189
189
  </el-form-item>
190
190
  <el-form-item label="计划完成时间" prop="plannedFinishDate">
191
- <el-date-picker
192
- v-model="ruleForm.plannedFinishDate"
193
- value-format="YYYY-MM-DD"
194
- style="width: 220px"
195
- />
191
+ <el-date-picker v-model="ruleForm.plannedFinishDate" value-format="YYYY-MM-DD" style="width: 220px" />
196
192
  </el-form-item>
197
193
  </el-form>
198
194
  <template #footer>
@@ -2,7 +2,7 @@
2
2
  @Author : TanRui
3
3
  @WeChat : Tan578853789
4
4
  @Title : 项目编辑组件
5
- @File : /agentic/crud/EditDialog.vue
5
+ @File : /examples/project-management/EditDialog.vue
6
6
  @Date : 2026/01/01
7
7
  @Desc. : 该页面为增删改查类业务功能的页面模板,包含了常见的功能如表单控件、components/common 通用功能组件、导入导出、图片附件、附件上传等功能。开发者可以在此基础上进行修改和扩展,以适应具体的业务需求。
8
8
  -->
@@ -12,17 +12,19 @@ import type { FormInstance, FormRules } from 'element-plus'
12
12
  import { ref, nextTick } from 'vue'
13
13
  import { ElMessage } from 'element-plus'
14
14
  import { objectMatchAssign, verifyNumberGtZero } from '@jnrs/shared'
15
- import { getDictList, downloadFile, extractFieldId } from '@/utils'
15
+ import { downloadFile, extractFieldId } from '@/utils'
16
16
  import { useDateRangeField } from '@/composables/useDateRangeField'
17
17
  import {
18
18
  type Project,
19
19
  type AddProject,
20
20
  type UpdateProject,
21
21
  addProjectApi,
22
- editProjectApi
22
+ editProjectApi,
23
+ getProjectByIdApi
23
24
  } from '@/api/examples/project-management'
24
25
  import { JnDialog, JnFileUpload } from '@jnrs/vue-core/components'
25
26
  import SelectManager from '@/components/select/SelectManager.vue'
27
+ import DictSelector from '@/components/common/DictSelector.vue'
26
28
 
27
29
  const emit = defineEmits<{
28
30
  success: []
@@ -31,6 +33,7 @@ const emit = defineEmits<{
31
33
  const loading = ref(false)
32
34
  const editDialogRef = ref()
33
35
  const ruleFormRef = ref<FormInstance>()
36
+ const editingRow = ref<{ code?: number; name?: string } | null>(null)
34
37
  const ruleForm = ref<AddProject | UpdateProject>({
35
38
  id: '',
36
39
  code: 0,
@@ -65,22 +68,48 @@ const rules = ref<FormRules>({
65
68
  })
66
69
 
67
70
  // 打开弹窗
68
- const open = (row?: Project) => {
71
+ const open = async (row?: Project) => {
72
+ editingRow.value = row ? { code: row.code, name: row.name } : null
69
73
  editDialogRef.value.open()
70
- nextTick(() => {
74
+ nextTick(async () => {
71
75
  handleReset()
72
- ruleForm.value = objectMatchAssign(ruleForm.value, row)
73
- if (row && row.managerId && row.managerName) {
74
- ruleForm.value.managerId = {
75
- id: row.managerId,
76
- name: row.managerName
76
+ if (row?.id) {
77
+ // 编辑模式:通过 API 获取最新详情
78
+ loading.value = true
79
+ try {
80
+ const detail = await getProjectByIdApi(row.id)
81
+ ruleForm.value = objectMatchAssign(ruleForm.value, detail)
82
+ if (detail.managerId && detail.managerName) {
83
+ ruleForm.value.managerId = {
84
+ id: detail.managerId,
85
+ name: detail.managerName
86
+ }
87
+ }
88
+ if (detail.pmoManagerId && detail.pmoManagerName) {
89
+ ruleForm.value.pmoManagerId = detail.pmoManagerId.map((item, index) => ({
90
+ id: item,
91
+ name: detail.pmoManagerName[index] || ''
92
+ }))
93
+ }
94
+ } catch (error) {
95
+ console.error(error)
96
+ } finally {
97
+ loading.value = false
98
+ }
99
+ } else {
100
+ ruleForm.value = objectMatchAssign(ruleForm.value, row)
101
+ if (row && row.managerId && row.managerName) {
102
+ ruleForm.value.managerId = {
103
+ id: row.managerId,
104
+ name: row.managerName
105
+ }
106
+ }
107
+ if (row && row.pmoManagerId && row.pmoManagerName) {
108
+ ruleForm.value.pmoManagerId = row.pmoManagerId.map((item, index) => ({
109
+ id: item,
110
+ name: row.pmoManagerName[index] || ''
111
+ }))
77
112
  }
78
- }
79
- if (row && row.pmoManagerId && row.pmoManagerName) {
80
- ruleForm.value.pmoManagerId = row.pmoManagerId.map((item, index) => ({
81
- id: item,
82
- name: row.pmoManagerName[index] || ''
83
- }))
84
113
  }
85
114
  })
86
115
  }
@@ -143,6 +172,14 @@ defineExpose({
143
172
  <template>
144
173
  <!-- 编辑弹窗 -->
145
174
  <JnDialog ref="editDialogRef" title="项目管理" width="800px">
175
+ <el-alert v-if="editingRow" type="info" :closable="false" show-icon>
176
+ <template #title>
177
+ 当前编辑:项目编号
178
+ <strong>{{ editingRow.code }}</strong>
179
+ | 项目名称
180
+ <strong>{{ editingRow.name }}</strong>
181
+ </template>
182
+ </el-alert>
146
183
  <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="auto" v-loading="loading">
147
184
  <el-form-item prop="id"></el-form-item>
148
185
  <el-form-item label="项目编号" prop="code">
@@ -159,14 +196,7 @@ defineExpose({
159
196
  <el-input v-model.trim="ruleForm.name" maxlength="20" show-word-limit style="width: 100%" />
160
197
  </el-form-item>
161
198
  <el-form-item label="项目类型" prop="projectType">
162
- <el-select v-model="ruleForm.projectType" filterable placeholder="">
163
- <el-option
164
- :label="item.label"
165
- :value="item.value"
166
- v-for="item in getDictList('projectType')"
167
- :key="item.value"
168
- />
169
- </el-select>
199
+ <DictSelector v-model="ruleForm.projectType" dictName="projectType" />
170
200
  </el-form-item>
171
201
  <el-form-item label="项目经理" prop="managerId">
172
202
  <SelectManager
@@ -2,7 +2,7 @@
2
2
  @Author : TanRui
3
3
  @WeChat : Tan578853789
4
4
  @Title : 项目管理
5
- @File : /agentic/crud/index.vue
5
+ @File : /examples/project-management/index.vue
6
6
  @Date : 2026/01/01
7
7
  @Desc. : 该页面为增删改查类业务功能的页面模板,包含了常见的功能和组件使用示例,如表格、分页、查询条件、编辑弹窗、图片和附件预览等。开发者可以在此基础上进行修改和扩展,以适应具体的业务需求。
8
8
  -->
@@ -14,7 +14,6 @@ import { Plus } from '@element-plus/icons-vue'
14
14
  import { useRoute } from '@jnrs/vue-core/router'
15
15
  import { dateFormatsToObject } from '@jnrs/shared'
16
16
  import { debounce } from '@jnrs/shared/lodash'
17
- import { getDictList } from '@/utils'
18
17
  import { showDeleteConfirm } from '@/utils/common'
19
18
  import {
20
19
  type Project,
@@ -32,6 +31,7 @@ import ImageView from '@/components/common/ImageView.vue'
32
31
  import PdfView from '@/components/common/PdfView.vue'
33
32
  import DictTag from '@/components/common/DictTag.vue'
34
33
  import SelectManager from '@/components/select/SelectManager.vue'
34
+ import DictSelector from '@/components/common/DictSelector.vue'
35
35
  import EditDialog from './EditDialog.vue'
36
36
  import { useDateRangeField } from '@/composables/useDateRangeField'
37
37
 
@@ -184,14 +184,7 @@ onActivated(() => {
184
184
  <el-input v-model="queryForm.code" clearable style="width: 150px" />
185
185
  </el-form-item>
186
186
  <el-form-item label="项目类型" prop="projectType">
187
- <el-select v-model="queryForm.projectType" filterable placeholder="" clearable style="width: 100px">
188
- <el-option
189
- :label="item.label"
190
- :value="item.value"
191
- v-for="item in getDictList('projectType')"
192
- :key="item.value"
193
- />
194
- </el-select>
187
+ <DictSelector v-model="queryForm.projectType" dictName="projectType" width="100px" />
195
188
  </el-form-item>
196
189
  <el-form-item label="项目经理" prop="managerId">
197
190
  <SelectManager
@@ -287,14 +280,7 @@ onActivated(() => {
287
280
  </el-table-column>
288
281
  <el-table-column prop="projectStatus" label="状态" width="120" align="center" sortable>
289
282
  <template #default="{ row }">
290
- <el-select v-model="row.projectStatus" filterable placeholder="">
291
- <el-option
292
- :label="item.label"
293
- :value="item.value"
294
- v-for="item in getDictList('projectStatus')"
295
- :key="item.value"
296
- />
297
- </el-select>
283
+ <DictSelector v-model="row.projectStatus" dictName="projectStatus" width="100px" />
298
284
  </template>
299
285
  </el-table-column>
300
286
  <el-table-column prop="description" label="描述" min-width="200" show-overflow-tooltip />
@@ -0,0 +1,41 @@
1
+ import loginResAdmin from './json/auth-login-admin.json'
2
+ import loginResUser from './json/auth-login-user.json'
3
+
4
+ interface LoginResponseParams {
5
+ body: {
6
+ account?: string
7
+ [key: string]: unknown
8
+ }
9
+ }
10
+
11
+ interface UserInfoResponseParams {
12
+ headers: {
13
+ authorization?: string
14
+ [key: string]: unknown
15
+ }
16
+ }
17
+
18
+ export default [
19
+ // 登录
20
+ {
21
+ url: '/api/mock/auth/login',
22
+ method: 'post',
23
+ response: (opt: LoginResponseParams) => {
24
+ if (opt.body.account === 'admin') {
25
+ return loginResAdmin
26
+ }
27
+ return loginResUser
28
+ }
29
+ },
30
+ // 获取个人信息
31
+ {
32
+ url: '/api/mock/auth/user-info',
33
+ method: 'get',
34
+ response: (opt: UserInfoResponseParams) => {
35
+ if ((opt.headers.authorization ?? '').includes('admin')) {
36
+ return loginResAdmin
37
+ }
38
+ return loginResUser
39
+ }
40
+ }
41
+ ]
@@ -0,0 +1,12 @@
1
+ import detailsRes from './json/details.json'
2
+
3
+ export default [
4
+ // 获取数据详情
5
+ {
6
+ url: '/api/mock/details',
7
+ method: 'get',
8
+ response: () => {
9
+ return detailsRes
10
+ }
11
+ }
12
+ ]
@@ -0,0 +1,21 @@
1
+ import dictRes from './json/dict-list.json'
2
+ import dictItemRes from './json/dict-detail.json'
3
+
4
+ export default [
5
+ // 获取字典
6
+ {
7
+ url: '/api/mock/dict-manager',
8
+ method: 'get',
9
+ response: () => {
10
+ return dictRes
11
+ }
12
+ },
13
+ // 获取单个字典
14
+ {
15
+ url: /\/api\/mock\/dict-manager\/detail\/\d+/,
16
+ method: 'get',
17
+ response: () => {
18
+ return dictItemRes
19
+ }
20
+ }
21
+ ]