Browse Source

格式化代码

yuhongzhe
王泽彦 11 months ago
parent
commit
1878528709
  1. 6
      admin/components.d.ts
  2. 25
      admin/src/app/api/attendance.ts
  3. 23
      admin/src/app/api/campus.ts
  4. 43
      admin/src/app/api/campus_person_role.ts
  5. 21
      admin/src/app/api/class.ts
  6. 22
      admin/src/app/api/communication_records.ts
  7. 21
      admin/src/app/api/contract.ts
  8. 21
      admin/src/app/api/course.ts
  9. 23
      admin/src/app/api/course_schedule.ts
  10. 27
      admin/src/app/api/customer_resource_changes.ts
  11. 32
      admin/src/app/api/customer_resources.ts
  12. 25
      admin/src/app/api/departments.ts
  13. 21
      admin/src/app/api/exam_answers.ts
  14. 21
      admin/src/app/api/exam_papers.ts
  15. 21
      admin/src/app/api/exam_questions.ts
  16. 21
      admin/src/app/api/exam_records.ts
  17. 29
      admin/src/app/api/market_performance.ts
  18. 21
      admin/src/app/api/order_table.ts
  19. 22
      admin/src/app/api/performance_records.ts
  20. 24
      admin/src/app/api/person_course_schedule.ts
  21. 23
      admin/src/app/api/physical_test.ts
  22. 21
      admin/src/app/api/reimbursement.ts
  23. 21
      admin/src/app/api/resource_sharing.ts
  24. 21
      admin/src/app/api/salary.ts
  25. 23
      admin/src/app/api/service.ts
  26. 21
      admin/src/app/api/six_speed.ts
  27. 38
      admin/src/app/api/six_speed_modification_log.ts
  28. 21
      admin/src/app/api/stat_hour.ts
  29. 22
      admin/src/app/api/student_course_usage.ts
  30. 21
      admin/src/app/api/student_courses.ts
  31. 21
      admin/src/app/api/user_feedback.ts
  32. 21
      admin/src/app/api/venue.ts
  33. 54
      admin/src/app/lang/zh-cn/attendance.attendance.json
  34. 36
      admin/src/app/lang/zh-cn/campus.campus.json
  35. 30
      admin/src/app/lang/zh-cn/campus_person_role.campus_person_role.json
  36. 66
      admin/src/app/lang/zh-cn/class.class.json
  37. 58
      admin/src/app/lang/zh-cn/communication_records.communication_records.json
  38. 46
      admin/src/app/lang/zh-cn/contract.contract.json
  39. 50
      admin/src/app/lang/zh-cn/course.course.json
  40. 54
      admin/src/app/lang/zh-cn/course_schedule.course_schedule.json
  41. 38
      admin/src/app/lang/zh-cn/customer_resource_changes.customer_resource_changes.json
  42. 72
      admin/src/app/lang/zh-cn/customer_resources.customer_resources.json
  43. 22
      admin/src/app/lang/zh-cn/departments.departments.json
  44. 34
      admin/src/app/lang/zh-cn/exam_answers.exam_answers.json
  45. 26
      admin/src/app/lang/zh-cn/exam_papers.exam_papers.json
  46. 4
      admin/src/app/lang/zh-cn/exam_questions.exam_questions.json
  47. 2
      admin/src/app/lang/zh-cn/exam_questions.exam_questions_edit.json
  48. 42
      admin/src/app/lang/zh-cn/exam_records.exam_records.json
  49. 22
      admin/src/app/lang/zh-cn/market_performance.market_performance.json
  50. 66
      admin/src/app/lang/zh-cn/order_table.order_table.json
  51. 42
      admin/src/app/lang/zh-cn/performance_records.performance_records.json
  52. 34
      admin/src/app/lang/zh-cn/person_course_schedule.person_course_schedule.json
  53. 82
      admin/src/app/lang/zh-cn/physical_test.physical_test.json
  54. 38
      admin/src/app/lang/zh-cn/reimbursement.reimbursement.json
  55. 34
      admin/src/app/lang/zh-cn/resource_sharing.resource_sharing.json
  56. 62
      admin/src/app/lang/zh-cn/salary.salary.json
  57. 54
      admin/src/app/lang/zh-cn/service.service.json
  58. 66
      admin/src/app/lang/zh-cn/six_speed.six_speed.json
  59. 34
      admin/src/app/lang/zh-cn/six_speed_modification_log.six_speed_modification_log.json
  60. 142
      admin/src/app/lang/zh-cn/stat_hour.stat_hour.json
  61. 26
      admin/src/app/lang/zh-cn/student_course_usage.student_course_usage.json
  62. 38
      admin/src/app/lang/zh-cn/student_courses.student_courses.json
  63. 26
      admin/src/app/lang/zh-cn/user_feedback.user_feedback.json
  64. 46
      admin/src/app/lang/zh-cn/venue.venue.json
  65. 227
      admin/src/app/views/attendance/attendance.vue
  66. 191
      admin/src/app/views/attendance/components/attendance-edit.vue
  67. 152
      admin/src/app/views/campus/campus.vue
  68. 203
      admin/src/app/views/campus_person_role/campus_person_role.vue
  69. 141
      admin/src/app/views/campus_person_role/components/campus-person-role-edit.vue
  70. 295
      admin/src/app/views/class/class.vue
  71. 208
      admin/src/app/views/class/components/class-edit.vue
  72. 294
      admin/src/app/views/communication_records/communication_records.vue
  73. 223
      admin/src/app/views/communication_records/components/communication-records-edit.vue
  74. 171
      admin/src/app/views/contract/components/contract-edit.vue
  75. 199
      admin/src/app/views/contract/contract.vue
  76. 181
      admin/src/app/views/course/components/course-edit.vue
  77. 218
      admin/src/app/views/course/course.vue
  78. 179
      admin/src/app/views/course_schedule/components/course-schedule-edit.vue
  79. 241
      admin/src/app/views/course_schedule/course_schedule.vue
  80. 148
      admin/src/app/views/customer_resource_changes/components/customer-resource-changes-edit.vue
  81. 194
      admin/src/app/views/customer_resource_changes/customer_resource_changes.vue
  82. 394
      admin/src/app/views/customer_resources/components/customer-resources-edit.vue
  83. 243
      admin/src/app/views/customer_resources/customer_resources.vue
  84. 102
      admin/src/app/views/departments/components/departments-edit.vue
  85. 134
      admin/src/app/views/departments/departments.vue
  86. 116
      admin/src/app/views/exam_answers/components/exam-answers-edit.vue
  87. 167
      admin/src/app/views/exam_answers/exam_answers.vue
  88. 102
      admin/src/app/views/exam_papers/components/exam-papers-edit.vue
  89. 135
      admin/src/app/views/exam_papers/exam_papers.vue
  90. 313
      admin/src/app/views/exam_questions/exam_questions.vue
  91. 271
      admin/src/app/views/exam_questions/exam_questions_edit.vue
  92. 142
      admin/src/app/views/exam_records/components/exam-records-edit.vue
  93. 185
      admin/src/app/views/exam_records/exam_records.vue
  94. 122
      admin/src/app/views/market_performance/components/market-performance-edit.vue
  95. 148
      admin/src/app/views/market_performance/market_performance.vue
  96. 234
      admin/src/app/views/order_table/components/order-table-edit.vue
  97. 310
      admin/src/app/views/order_table/order_table.vue
  98. 154
      admin/src/app/views/performance_records/components/performance-records-edit.vue
  99. 199
      admin/src/app/views/performance_records/performance_records.vue
  100. 116
      admin/src/app/views/person_course_schedule/components/person-course-schedule-edit.vue

6
admin/components.d.ts

@ -10,7 +10,6 @@ declare module '@vue/runtime-core' {
Attachment: typeof import('./src/components/upload-attachment/attachment.vue')['default'] Attachment: typeof import('./src/components/upload-attachment/attachment.vue')['default']
DiyLink: typeof import('./src/components/diy-link/index.vue')['default'] DiyLink: typeof import('./src/components/diy-link/index.vue')['default']
Editor: typeof import('./src/components/editor/index.vue')['default'] Editor: typeof import('./src/components/editor/index.vue')['default']
ElAlert: typeof import('element-plus/es')['ElAlert']
ElAside: typeof import('element-plus/es')['ElAside'] ElAside: typeof import('element-plus/es')['ElAside']
ElAvatar: typeof import('element-plus/es')['ElAvatar'] ElAvatar: typeof import('element-plus/es')['ElAvatar']
ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb'] ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
@ -18,7 +17,6 @@ declare module '@vue/runtime-core' {
ElButton: typeof import('element-plus/es')['ElButton'] ElButton: typeof import('element-plus/es')['ElButton']
ElCard: typeof import('element-plus/es')['ElCard'] ElCard: typeof import('element-plus/es')['ElCard']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
ElCol: typeof import('element-plus/es')['ElCol'] ElCol: typeof import('element-plus/es')['ElCol']
ElColorPicker: typeof import('element-plus/es')['ElColorPicker'] ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider'] ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
@ -29,7 +27,6 @@ declare module '@vue/runtime-core' {
ElDropdown: typeof import('element-plus/es')['ElDropdown'] ElDropdown: typeof import('element-plus/es')['ElDropdown']
ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
ElEmpty: typeof import('element-plus/es')['ElEmpty']
ElForm: typeof import('element-plus/es')['ElForm'] ElForm: typeof import('element-plus/es')['ElForm']
ElFormItem: typeof import('element-plus/es')['ElFormItem'] ElFormItem: typeof import('element-plus/es')['ElFormItem']
ElHeader: typeof import('element-plus/es')['ElHeader'] ElHeader: typeof import('element-plus/es')['ElHeader']
@ -38,18 +35,15 @@ declare module '@vue/runtime-core' {
ElImageViewer: typeof import('element-plus/es')['ElImageViewer'] ElImageViewer: typeof import('element-plus/es')['ElImageViewer']
ElInput: typeof import('element-plus/es')['ElInput'] ElInput: typeof import('element-plus/es')['ElInput']
ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
ElLink: typeof import('element-plus/es')['ElLink']
ElMain: typeof import('element-plus/es')['ElMain'] ElMain: typeof import('element-plus/es')['ElMain']
ElMenu: typeof import('element-plus/es')['ElMenu'] ElMenu: typeof import('element-plus/es')['ElMenu']
ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
ElOption: typeof import('element-plus/es')['ElOption'] ElOption: typeof import('element-plus/es')['ElOption']
ElOptionGroup: typeof import('element-plus/es')['ElOptionGroup']
ElPageHeader: typeof import('element-plus/es')['ElPageHeader'] ElPageHeader: typeof import('element-plus/es')['ElPageHeader']
ElPagination: typeof import('element-plus/es')['ElPagination'] ElPagination: typeof import('element-plus/es')['ElPagination']
ElPopover: typeof import('element-plus/es')['ElPopover'] ElPopover: typeof import('element-plus/es')['ElPopover']
ElRadio: typeof import('element-plus/es')['ElRadio'] ElRadio: typeof import('element-plus/es')['ElRadio']
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
ElResult: typeof import('element-plus/es')['ElResult']
ElRow: typeof import('element-plus/es')['ElRow'] ElRow: typeof import('element-plus/es')['ElRow']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSelect: typeof import('element-plus/es')['ElSelect'] ElSelect: typeof import('element-plus/es')['ElSelect']

25
admin/src/app/api/attendance.ts

@ -1,9 +1,5 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- attendance // USER_CODE_BEGIN -- attendance
/** /**
* *
@ -11,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getAttendanceList(params: Record<string, any>) { export function getAttendanceList(params: Record<string, any>) {
return request.get(`attendance/attendance`, {params}) return request.get(`attendance/attendance`, { params })
} }
/** /**
@ -20,7 +16,7 @@ export function getAttendanceList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getAttendanceInfo(id: number) { export function getAttendanceInfo(id: number) {
return request.get(`attendance/attendance/${id}`); return request.get(`attendance/attendance/${id}`)
} }
/** /**
@ -29,7 +25,10 @@ export function getAttendanceInfo(id: number) {
* @returns * @returns
*/ */
export function addAttendance(params: Record<string, any>) { export function addAttendance(params: Record<string, any>) {
return request.post('attendance/attendance', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('attendance/attendance', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -39,7 +38,10 @@ export function addAttendance(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editAttendance(params: Record<string, any>) { export function editAttendance(params: Record<string, any>) {
return request.put(`attendance/attendance/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`attendance/attendance/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -48,9 +50,10 @@ export function editAttendance(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteAttendance(id: number) { export function deleteAttendance(id: number) {
return request.delete(`attendance/attendance/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`attendance/attendance/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- attendance // USER_CODE_END -- attendance

23
admin/src/app/api/campus.ts

@ -1,7 +1,5 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- campus // USER_CODE_BEGIN -- campus
/** /**
* *
@ -9,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getCampusList(params: Record<string, any>) { export function getCampusList(params: Record<string, any>) {
return request.get(`campus/campus`, {params}) return request.get(`campus/campus`, { params })
} }
/** /**
@ -18,7 +16,7 @@ export function getCampusList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getCampusInfo(id: number) { export function getCampusInfo(id: number) {
return request.get(`campus/campus/${id}`); return request.get(`campus/campus/${id}`)
} }
/** /**
@ -27,7 +25,10 @@ export function getCampusInfo(id: number) {
* @returns * @returns
*/ */
export function addCampus(params: Record<string, any>) { export function addCampus(params: Record<string, any>) {
return request.post('campus/campus', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('campus/campus', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -37,7 +38,10 @@ export function addCampus(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editCampus(params: Record<string, any>) { export function editCampus(params: Record<string, any>) {
return request.put(`campus/campus/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`campus/campus/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -46,9 +50,10 @@ export function editCampus(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteCampus(id: number) { export function deleteCampus(id: number) {
return request.delete(`campus/campus/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`campus/campus/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- campus // USER_CODE_END -- campus

43
admin/src/app/api/campus_person_role.ts

@ -1,9 +1,5 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- campus_person_role // USER_CODE_BEGIN -- campus_person_role
/** /**
* *
@ -11,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getCampusPersonRoleList(params: Record<string, any>) { export function getCampusPersonRoleList(params: Record<string, any>) {
return request.get(`campus_person_role/campus_person_role`, {params}) return request.get(`campus_person_role/campus_person_role`, { params })
} }
/** /**
@ -20,7 +16,7 @@ export function getCampusPersonRoleList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getCampusPersonRoleInfo(id: number) { export function getCampusPersonRoleInfo(id: number) {
return request.get(`campus_person_role/campus_person_role/${id}`); return request.get(`campus_person_role/campus_person_role/${id}`)
} }
/** /**
@ -29,7 +25,10 @@ export function getCampusPersonRoleInfo(id: number) {
* @returns * @returns
*/ */
export function addCampusPersonRole(params: Record<string, any>) { export function addCampusPersonRole(params: Record<string, any>) {
return request.post('campus_person_role/campus_person_role', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('campus_person_role/campus_person_role', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -39,7 +38,11 @@ export function addCampusPersonRole(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editCampusPersonRole(params: Record<string, any>) { export function editCampusPersonRole(params: Record<string, any>) {
return request.put(`campus_person_role/campus_person_role/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(
`campus_person_role/campus_person_role/${params.id}`,
params,
{ showErrorMessage: true, showSuccessMessage: true }
)
} }
/** /**
@ -48,17 +51,23 @@ export function editCampusPersonRole(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteCampusPersonRole(id: number) { export function deleteCampusPersonRole(id: number) {
return request.delete(`campus_person_role/campus_person_role/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`campus_person_role/campus_person_role/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
export function getWithCampusList(params: Record<string,any>){ export function getWithCampusList(params: Record<string, any>) {
return request.get('campus_person_role/campus_all', {params}) return request.get('campus_person_role/campus_all', { params })
}export function getWithPersonnelList(params: Record<string,any>){ }
return request.get('campus_person_role/personnel_all', {params}) export function getWithPersonnelList(params: Record<string, any>) {
}export function getWithSysRoleList(params: Record<string,any>){ return request.get('campus_person_role/personnel_all', { params })
return request.get('campus_person_role/sys_role_all', {params}) }
}export function getWithDepartmentsList(params: Record<string,any>){ export function getWithSysRoleList(params: Record<string, any>) {
return request.get('campus_person_role/departments_all', {params}) return request.get('campus_person_role/sys_role_all', { params })
}
export function getWithDepartmentsList(params: Record<string, any>) {
return request.get('campus_person_role/departments_all', { params })
} }
// USER_CODE_END -- campus_person_role // USER_CODE_END -- campus_person_role

21
admin/src/app/api/class.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getClassList(params: Record<string, any>) { export function getClassList(params: Record<string, any>) {
return request.get(`class/class`, {params}) return request.get(`class/class`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getClassList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getClassInfo(id: number) { export function getClassInfo(id: number) {
return request.get(`class/class/${id}`); return request.get(`class/class/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getClassInfo(id: number) {
* @returns * @returns
*/ */
export function addClass(params: Record<string, any>) { export function addClass(params: Record<string, any>) {
return request.post('class/class', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('class/class', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,10 @@ export function addClass(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editClass(params: Record<string, any>) { export function editClass(params: Record<string, any>) {
return request.put(`class/class/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`class/class/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -44,9 +50,10 @@ export function editClass(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteClass(id: number) { export function deleteClass(id: number) {
return request.delete(`class/class/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`class/class/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- class // USER_CODE_END -- class

22
admin/src/app/api/communication_records.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getCommunicationRecordsList(params: Record<string, any>) { export function getCommunicationRecordsList(params: Record<string, any>) {
return request.get(`communication_records/communication_records`, {params}) return request.get(`communication_records/communication_records`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getCommunicationRecordsList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getCommunicationRecordsInfo(id: number) { export function getCommunicationRecordsInfo(id: number) {
return request.get(`communication_records/communication_records/${id}`); return request.get(`communication_records/communication_records/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getCommunicationRecordsInfo(id: number) {
* @returns * @returns
*/ */
export function addCommunicationRecords(params: Record<string, any>) { export function addCommunicationRecords(params: Record<string, any>) {
return request.post('communication_records/communication_records', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('communication_records/communication_records', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,11 @@ export function addCommunicationRecords(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editCommunicationRecords(params: Record<string, any>) { export function editCommunicationRecords(params: Record<string, any>) {
return request.put(`communication_records/communication_records/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(
`communication_records/communication_records/${params.id}`,
params,
{ showErrorMessage: true, showSuccessMessage: true }
)
} }
/** /**
@ -44,9 +51,10 @@ export function editCommunicationRecords(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteCommunicationRecords(id: number) { export function deleteCommunicationRecords(id: number) {
return request.delete(`communication_records/communication_records/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`communication_records/communication_records/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- communication_records // USER_CODE_END -- communication_records

21
admin/src/app/api/contract.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getContractList(params: Record<string, any>) { export function getContractList(params: Record<string, any>) {
return request.get(`contract/contract`, {params}) return request.get(`contract/contract`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getContractList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getContractInfo(id: number) { export function getContractInfo(id: number) {
return request.get(`contract/contract/${id}`); return request.get(`contract/contract/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getContractInfo(id: number) {
* @returns * @returns
*/ */
export function addContract(params: Record<string, any>) { export function addContract(params: Record<string, any>) {
return request.post('contract/contract', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('contract/contract', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,10 @@ export function addContract(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editContract(params: Record<string, any>) { export function editContract(params: Record<string, any>) {
return request.put(`contract/contract/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`contract/contract/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -44,9 +50,10 @@ export function editContract(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteContract(id: number) { export function deleteContract(id: number) {
return request.delete(`contract/contract/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`contract/contract/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- contract // USER_CODE_END -- contract

21
admin/src/app/api/course.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getCourseList(params: Record<string, any>) { export function getCourseList(params: Record<string, any>) {
return request.get(`course/course`, {params}) return request.get(`course/course`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getCourseList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getCourseInfo(id: number) { export function getCourseInfo(id: number) {
return request.get(`course/course/${id}`); return request.get(`course/course/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getCourseInfo(id: number) {
* @returns * @returns
*/ */
export function addCourse(params: Record<string, any>) { export function addCourse(params: Record<string, any>) {
return request.post('course/course', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('course/course', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,10 @@ export function addCourse(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editCourse(params: Record<string, any>) { export function editCourse(params: Record<string, any>) {
return request.put(`course/course/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`course/course/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -44,9 +50,10 @@ export function editCourse(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteCourse(id: number) { export function deleteCourse(id: number) {
return request.delete(`course/course/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`course/course/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- course // USER_CODE_END -- course

23
admin/src/app/api/course_schedule.ts

@ -1,7 +1,5 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- course_schedule // USER_CODE_BEGIN -- course_schedule
/** /**
* *
@ -9,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getCourseScheduleList(params: Record<string, any>) { export function getCourseScheduleList(params: Record<string, any>) {
return request.get(`course_schedule/course_schedule`, {params}) return request.get(`course_schedule/course_schedule`, { params })
} }
/** /**
@ -18,7 +16,7 @@ export function getCourseScheduleList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getCourseScheduleInfo(id: number) { export function getCourseScheduleInfo(id: number) {
return request.get(`course_schedule/course_schedule/${id}`); return request.get(`course_schedule/course_schedule/${id}`)
} }
/** /**
@ -27,7 +25,10 @@ export function getCourseScheduleInfo(id: number) {
* @returns * @returns
*/ */
export function addCourseSchedule(params: Record<string, any>) { export function addCourseSchedule(params: Record<string, any>) {
return request.post('course_schedule/course_schedule', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('course_schedule/course_schedule', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -37,7 +38,10 @@ export function addCourseSchedule(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editCourseSchedule(params: Record<string, any>) { export function editCourseSchedule(params: Record<string, any>) {
return request.put(`course_schedule/course_schedule/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`course_schedule/course_schedule/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -46,9 +50,10 @@ export function editCourseSchedule(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteCourseSchedule(id: number) { export function deleteCourseSchedule(id: number) {
return request.delete(`course_schedule/course_schedule/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`course_schedule/course_schedule/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- course_schedule // USER_CODE_END -- course_schedule

27
admin/src/app/api/customer_resource_changes.ts

@ -7,7 +7,9 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getCustomerResourceChangesList(params: Record<string, any>) { export function getCustomerResourceChangesList(params: Record<string, any>) {
return request.get(`customer_resource_changes/customer_resource_changes`, {params}) return request.get(`customer_resource_changes/customer_resource_changes`, {
params,
})
} }
/** /**
@ -16,7 +18,9 @@ export function getCustomerResourceChangesList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getCustomerResourceChangesInfo(id: number) { export function getCustomerResourceChangesInfo(id: number) {
return request.get(`customer_resource_changes/customer_resource_changes/${id}`); return request.get(
`customer_resource_changes/customer_resource_changes/${id}`
)
} }
/** /**
@ -25,7 +29,11 @@ export function getCustomerResourceChangesInfo(id: number) {
* @returns * @returns
*/ */
export function addCustomerResourceChanges(params: Record<string, any>) { export function addCustomerResourceChanges(params: Record<string, any>) {
return request.post('customer_resource_changes/customer_resource_changes', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post(
'customer_resource_changes/customer_resource_changes',
params,
{ showErrorMessage: true, showSuccessMessage: true }
)
} }
/** /**
@ -35,7 +43,11 @@ export function addCustomerResourceChanges(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editCustomerResourceChanges(params: Record<string, any>) { export function editCustomerResourceChanges(params: Record<string, any>) {
return request.put(`customer_resource_changes/customer_resource_changes/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(
`customer_resource_changes/customer_resource_changes/${params.id}`,
params,
{ showErrorMessage: true, showSuccessMessage: true }
)
} }
/** /**
@ -44,9 +56,10 @@ export function editCustomerResourceChanges(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteCustomerResourceChanges(id: number) { export function deleteCustomerResourceChanges(id: number) {
return request.delete(`customer_resource_changes/customer_resource_changes/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(
`customer_resource_changes/customer_resource_changes/${id}`,
{ showErrorMessage: true, showSuccessMessage: true }
)
} }
// USER_CODE_END -- customer_resource_changes // USER_CODE_END -- customer_resource_changes

32
admin/src/app/api/customer_resources.ts

@ -1,13 +1,5 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- customer_resources // USER_CODE_BEGIN -- customer_resources
/** /**
* *
@ -15,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getCustomerResourcesList(params: Record<string, any>) { export function getCustomerResourcesList(params: Record<string, any>) {
return request.get(`customer_resources/customer_resources`, {params}) return request.get(`customer_resources/customer_resources`, { params })
} }
/** /**
@ -24,7 +16,7 @@ export function getCustomerResourcesList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getCustomerResourcesInfo(id: number) { export function getCustomerResourcesInfo(id: number) {
return request.get(`customer_resources/customer_resources/${id}`); return request.get(`customer_resources/customer_resources/${id}`)
} }
/** /**
@ -33,7 +25,10 @@ export function getCustomerResourcesInfo(id: number) {
* @returns * @returns
*/ */
export function addCustomerResources(params: Record<string, any>) { export function addCustomerResources(params: Record<string, any>) {
return request.post('customer_resources/customer_resources', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('customer_resources/customer_resources', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -43,7 +38,11 @@ export function addCustomerResources(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editCustomerResources(params: Record<string, any>) { export function editCustomerResources(params: Record<string, any>) {
return request.put(`customer_resources/customer_resources/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(
`customer_resources/customer_resources/${params.id}`,
params,
{ showErrorMessage: true, showSuccessMessage: true }
)
} }
/** /**
@ -52,11 +51,14 @@ export function editCustomerResources(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteCustomerResources(id: number) { export function deleteCustomerResources(id: number) {
return request.delete(`customer_resources/customer_resources/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`customer_resources/customer_resources/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
export function getWithCampusList(params: Record<string,any>){ export function getWithCampusList(params: Record<string, any>) {
return request.get('customer_resources/campus_all', {params}) return request.get('customer_resources/campus_all', { params })
} }
// USER_CODE_END -- customer_resources // USER_CODE_END -- customer_resources

25
admin/src/app/api/departments.ts

@ -1,7 +1,5 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- departments // USER_CODE_BEGIN -- departments
/** /**
* *
@ -9,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getDepartmentsList(params: Record<string, any>) { export function getDepartmentsList(params: Record<string, any>) {
return request.get(`departments/departments`, {params}) return request.get(`departments/departments`, { params })
} }
/** /**
@ -18,7 +16,7 @@ export function getDepartmentsList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getDepartmentsInfo(id: number) { export function getDepartmentsInfo(id: number) {
return request.get(`departments/departments/${id}`); return request.get(`departments/departments/${id}`)
} }
/** /**
@ -27,7 +25,10 @@ export function getDepartmentsInfo(id: number) {
* @returns * @returns
*/ */
export function addDepartments(params: Record<string, any>) { export function addDepartments(params: Record<string, any>) {
return request.post('departments/departments', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('departments/departments', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -37,7 +38,10 @@ export function addDepartments(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editDepartments(params: Record<string, any>) { export function editDepartments(params: Record<string, any>) {
return request.put(`departments/departments/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`departments/departments/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -46,11 +50,14 @@ export function editDepartments(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteDepartments(id: number) { export function deleteDepartments(id: number) {
return request.delete(`departments/departments/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`departments/departments/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
export function getWithDepartmentsList(params: Record<string,any>){ export function getWithDepartmentsList(params: Record<string, any>) {
return request.get('departments/departments_all', {params}) return request.get('departments/departments_all', { params })
} }
// USER_CODE_END -- departments // USER_CODE_END -- departments

21
admin/src/app/api/exam_answers.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getExamAnswersList(params: Record<string, any>) { export function getExamAnswersList(params: Record<string, any>) {
return request.get(`exam_answers/exam_answers`, {params}) return request.get(`exam_answers/exam_answers`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getExamAnswersList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getExamAnswersInfo(id: number) { export function getExamAnswersInfo(id: number) {
return request.get(`exam_answers/exam_answers/${id}`); return request.get(`exam_answers/exam_answers/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getExamAnswersInfo(id: number) {
* @returns * @returns
*/ */
export function addExamAnswers(params: Record<string, any>) { export function addExamAnswers(params: Record<string, any>) {
return request.post('exam_answers/exam_answers', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('exam_answers/exam_answers', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,10 @@ export function addExamAnswers(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editExamAnswers(params: Record<string, any>) { export function editExamAnswers(params: Record<string, any>) {
return request.put(`exam_answers/exam_answers/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`exam_answers/exam_answers/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -44,9 +50,10 @@ export function editExamAnswers(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteExamAnswers(id: number) { export function deleteExamAnswers(id: number) {
return request.delete(`exam_answers/exam_answers/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`exam_answers/exam_answers/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- exam_answers // USER_CODE_END -- exam_answers

21
admin/src/app/api/exam_papers.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getExamPapersList(params: Record<string, any>) { export function getExamPapersList(params: Record<string, any>) {
return request.get(`exam_papers/exam_papers`, {params}) return request.get(`exam_papers/exam_papers`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getExamPapersList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getExamPapersInfo(id: number) { export function getExamPapersInfo(id: number) {
return request.get(`exam_papers/exam_papers/${id}`); return request.get(`exam_papers/exam_papers/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getExamPapersInfo(id: number) {
* @returns * @returns
*/ */
export function addExamPapers(params: Record<string, any>) { export function addExamPapers(params: Record<string, any>) {
return request.post('exam_papers/exam_papers', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('exam_papers/exam_papers', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,10 @@ export function addExamPapers(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editExamPapers(params: Record<string, any>) { export function editExamPapers(params: Record<string, any>) {
return request.put(`exam_papers/exam_papers/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`exam_papers/exam_papers/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -44,9 +50,10 @@ export function editExamPapers(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteExamPapers(id: number) { export function deleteExamPapers(id: number) {
return request.delete(`exam_papers/exam_papers/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`exam_papers/exam_papers/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- exam_papers // USER_CODE_END -- exam_papers

21
admin/src/app/api/exam_questions.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getExamQuestionsList(params: Record<string, any>) { export function getExamQuestionsList(params: Record<string, any>) {
return request.get(`exam_questions/exam_questions`, {params}) return request.get(`exam_questions/exam_questions`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getExamQuestionsList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getExamQuestionsInfo(id: number) { export function getExamQuestionsInfo(id: number) {
return request.get(`exam_questions/exam_questions/${id}`); return request.get(`exam_questions/exam_questions/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getExamQuestionsInfo(id: number) {
* @returns * @returns
*/ */
export function addExamQuestions(params: Record<string, any>) { export function addExamQuestions(params: Record<string, any>) {
return request.post('exam_questions/exam_questions', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('exam_questions/exam_questions', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,10 @@ export function addExamQuestions(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editExamQuestions(params: Record<string, any>) { export function editExamQuestions(params: Record<string, any>) {
return request.put(`exam_questions/exam_questions/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`exam_questions/exam_questions/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -44,9 +50,10 @@ export function editExamQuestions(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteExamQuestions(id: number) { export function deleteExamQuestions(id: number) {
return request.delete(`exam_questions/exam_questions/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`exam_questions/exam_questions/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- exam_questions // USER_CODE_END -- exam_questions

21
admin/src/app/api/exam_records.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getExamRecordsList(params: Record<string, any>) { export function getExamRecordsList(params: Record<string, any>) {
return request.get(`exam_records/exam_records`, {params}) return request.get(`exam_records/exam_records`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getExamRecordsList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getExamRecordsInfo(id: number) { export function getExamRecordsInfo(id: number) {
return request.get(`exam_records/exam_records/${id}`); return request.get(`exam_records/exam_records/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getExamRecordsInfo(id: number) {
* @returns * @returns
*/ */
export function addExamRecords(params: Record<string, any>) { export function addExamRecords(params: Record<string, any>) {
return request.post('exam_records/exam_records', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('exam_records/exam_records', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,10 @@ export function addExamRecords(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editExamRecords(params: Record<string, any>) { export function editExamRecords(params: Record<string, any>) {
return request.put(`exam_records/exam_records/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`exam_records/exam_records/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -44,9 +50,10 @@ export function editExamRecords(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteExamRecords(id: number) { export function deleteExamRecords(id: number) {
return request.delete(`exam_records/exam_records/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`exam_records/exam_records/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- exam_records // USER_CODE_END -- exam_records

29
admin/src/app/api/market_performance.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getMarketPerformanceList(params: Record<string, any>) { export function getMarketPerformanceList(params: Record<string, any>) {
return request.get(`market_performance/market_performance`, {params}) return request.get(`market_performance/market_performance`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getMarketPerformanceList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getMarketPerformanceInfo(id: number) { export function getMarketPerformanceInfo(id: number) {
return request.get(`market_performance/market_performance/${id}`); return request.get(`market_performance/market_performance/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getMarketPerformanceInfo(id: number) {
* @returns * @returns
*/ */
export function addMarketPerformance(params: Record<string, any>) { export function addMarketPerformance(params: Record<string, any>) {
return request.post('market_performance/market_performance', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('market_performance/market_performance', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,11 @@ export function addMarketPerformance(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editMarketPerformance(params: Record<string, any>) { export function editMarketPerformance(params: Record<string, any>) {
return request.put(`market_performance/market_performance/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(
`market_performance/market_performance/${params.id}`,
params,
{ showErrorMessage: true, showSuccessMessage: true }
)
} }
/** /**
@ -44,13 +51,17 @@ export function editMarketPerformance(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteMarketPerformance(id: number) { export function deleteMarketPerformance(id: number) {
return request.delete(`market_performance/market_performance/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`market_performance/market_performance/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
export function getWithPersonnelList(params: Record<string,any>){ export function getWithPersonnelList(params: Record<string, any>) {
return request.get('market_performance/personnel_all', {params}) return request.get('market_performance/personnel_all', { params })
}export function getWithCampusList(params: Record<string,any>){ }
return request.get('market_performance/campus_all', {params}) export function getWithCampusList(params: Record<string, any>) {
return request.get('market_performance/campus_all', { params })
} }
// USER_CODE_END -- market_performance // USER_CODE_END -- market_performance

21
admin/src/app/api/order_table.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getOrderTableList(params: Record<string, any>) { export function getOrderTableList(params: Record<string, any>) {
return request.get(`order_table/order_table`, {params}) return request.get(`order_table/order_table`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getOrderTableList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getOrderTableInfo(id: number) { export function getOrderTableInfo(id: number) {
return request.get(`order_table/order_table/${id}`); return request.get(`order_table/order_table/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getOrderTableInfo(id: number) {
* @returns * @returns
*/ */
export function addOrderTable(params: Record<string, any>) { export function addOrderTable(params: Record<string, any>) {
return request.post('order_table/order_table', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('order_table/order_table', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,10 @@ export function addOrderTable(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editOrderTable(params: Record<string, any>) { export function editOrderTable(params: Record<string, any>) {
return request.put(`order_table/order_table/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`order_table/order_table/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -44,9 +50,10 @@ export function editOrderTable(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteOrderTable(id: number) { export function deleteOrderTable(id: number) {
return request.delete(`order_table/order_table/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`order_table/order_table/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- order_table // USER_CODE_END -- order_table

22
admin/src/app/api/performance_records.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getPerformanceRecordsList(params: Record<string, any>) { export function getPerformanceRecordsList(params: Record<string, any>) {
return request.get(`performance_records/performance_records`, {params}) return request.get(`performance_records/performance_records`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getPerformanceRecordsList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getPerformanceRecordsInfo(id: number) { export function getPerformanceRecordsInfo(id: number) {
return request.get(`performance_records/performance_records/${id}`); return request.get(`performance_records/performance_records/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getPerformanceRecordsInfo(id: number) {
* @returns * @returns
*/ */
export function addPerformanceRecords(params: Record<string, any>) { export function addPerformanceRecords(params: Record<string, any>) {
return request.post('performance_records/performance_records', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('performance_records/performance_records', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,11 @@ export function addPerformanceRecords(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editPerformanceRecords(params: Record<string, any>) { export function editPerformanceRecords(params: Record<string, any>) {
return request.put(`performance_records/performance_records/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(
`performance_records/performance_records/${params.id}`,
params,
{ showErrorMessage: true, showSuccessMessage: true }
)
} }
/** /**
@ -44,9 +51,10 @@ export function editPerformanceRecords(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deletePerformanceRecords(id: number) { export function deletePerformanceRecords(id: number) {
return request.delete(`performance_records/performance_records/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`performance_records/performance_records/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- performance_records // USER_CODE_END -- performance_records

24
admin/src/app/api/person_course_schedule.ts

@ -7,7 +7,9 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getPersonCourseScheduleList(params: Record<string, any>) { export function getPersonCourseScheduleList(params: Record<string, any>) {
return request.get(`person_course_schedule/person_course_schedule`, {params}) return request.get(`person_course_schedule/person_course_schedule`, {
params,
})
} }
/** /**
@ -16,7 +18,7 @@ export function getPersonCourseScheduleList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getPersonCourseScheduleInfo(id: number) { export function getPersonCourseScheduleInfo(id: number) {
return request.get(`person_course_schedule/person_course_schedule/${id}`); return request.get(`person_course_schedule/person_course_schedule/${id}`)
} }
/** /**
@ -25,7 +27,10 @@ export function getPersonCourseScheduleInfo(id: number) {
* @returns * @returns
*/ */
export function addPersonCourseSchedule(params: Record<string, any>) { export function addPersonCourseSchedule(params: Record<string, any>) {
return request.post('person_course_schedule/person_course_schedule', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('person_course_schedule/person_course_schedule', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +40,11 @@ export function addPersonCourseSchedule(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editPersonCourseSchedule(params: Record<string, any>) { export function editPersonCourseSchedule(params: Record<string, any>) {
return request.put(`person_course_schedule/person_course_schedule/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(
`person_course_schedule/person_course_schedule/${params.id}`,
params,
{ showErrorMessage: true, showSuccessMessage: true }
)
} }
/** /**
@ -44,9 +53,10 @@ export function editPersonCourseSchedule(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deletePersonCourseSchedule(id: number) { export function deletePersonCourseSchedule(id: number) {
return request.delete(`person_course_schedule/person_course_schedule/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`person_course_schedule/person_course_schedule/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- person_course_schedule // USER_CODE_END -- person_course_schedule

23
admin/src/app/api/physical_test.ts

@ -1,7 +1,5 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- physical_test // USER_CODE_BEGIN -- physical_test
/** /**
* *
@ -9,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getPhysicalTestList(params: Record<string, any>) { export function getPhysicalTestList(params: Record<string, any>) {
return request.get(`physical_test/physical_test`, {params}) return request.get(`physical_test/physical_test`, { params })
} }
/** /**
@ -18,7 +16,7 @@ export function getPhysicalTestList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getPhysicalTestInfo(id: number) { export function getPhysicalTestInfo(id: number) {
return request.get(`physical_test/physical_test/${id}`); return request.get(`physical_test/physical_test/${id}`)
} }
/** /**
@ -27,7 +25,10 @@ export function getPhysicalTestInfo(id: number) {
* @returns * @returns
*/ */
export function addPhysicalTest(params: Record<string, any>) { export function addPhysicalTest(params: Record<string, any>) {
return request.post('physical_test/physical_test', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('physical_test/physical_test', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -37,7 +38,10 @@ export function addPhysicalTest(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editPhysicalTest(params: Record<string, any>) { export function editPhysicalTest(params: Record<string, any>) {
return request.put(`physical_test/physical_test/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`physical_test/physical_test/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -46,9 +50,10 @@ export function editPhysicalTest(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deletePhysicalTest(id: number) { export function deletePhysicalTest(id: number) {
return request.delete(`physical_test/physical_test/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`physical_test/physical_test/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- physical_test // USER_CODE_END -- physical_test

21
admin/src/app/api/reimbursement.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getReimbursementList(params: Record<string, any>) { export function getReimbursementList(params: Record<string, any>) {
return request.get(`reimbursement/reimbursement`, {params}) return request.get(`reimbursement/reimbursement`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getReimbursementList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getReimbursementInfo(id: number) { export function getReimbursementInfo(id: number) {
return request.get(`reimbursement/reimbursement/${id}`); return request.get(`reimbursement/reimbursement/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getReimbursementInfo(id: number) {
* @returns * @returns
*/ */
export function addReimbursement(params: Record<string, any>) { export function addReimbursement(params: Record<string, any>) {
return request.post('reimbursement/reimbursement', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('reimbursement/reimbursement', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,10 @@ export function addReimbursement(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editReimbursement(params: Record<string, any>) { export function editReimbursement(params: Record<string, any>) {
return request.put(`reimbursement/reimbursement/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`reimbursement/reimbursement/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -44,9 +50,10 @@ export function editReimbursement(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteReimbursement(id: number) { export function deleteReimbursement(id: number) {
return request.delete(`reimbursement/reimbursement/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`reimbursement/reimbursement/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- reimbursement // USER_CODE_END -- reimbursement

21
admin/src/app/api/resource_sharing.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getResourceSharingList(params: Record<string, any>) { export function getResourceSharingList(params: Record<string, any>) {
return request.get(`resource_sharing/resource_sharing`, {params}) return request.get(`resource_sharing/resource_sharing`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getResourceSharingList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getResourceSharingInfo(id: number) { export function getResourceSharingInfo(id: number) {
return request.get(`resource_sharing/resource_sharing/${id}`); return request.get(`resource_sharing/resource_sharing/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getResourceSharingInfo(id: number) {
* @returns * @returns
*/ */
export function addResourceSharing(params: Record<string, any>) { export function addResourceSharing(params: Record<string, any>) {
return request.post('resource_sharing/resource_sharing', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('resource_sharing/resource_sharing', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,10 @@ export function addResourceSharing(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editResourceSharing(params: Record<string, any>) { export function editResourceSharing(params: Record<string, any>) {
return request.put(`resource_sharing/resource_sharing/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`resource_sharing/resource_sharing/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -44,9 +50,10 @@ export function editResourceSharing(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteResourceSharing(id: number) { export function deleteResourceSharing(id: number) {
return request.delete(`resource_sharing/resource_sharing/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`resource_sharing/resource_sharing/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- resource_sharing // USER_CODE_END -- resource_sharing

21
admin/src/app/api/salary.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getSalaryList(params: Record<string, any>) { export function getSalaryList(params: Record<string, any>) {
return request.get(`salary/salary`, {params}) return request.get(`salary/salary`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getSalaryList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getSalaryInfo(id: number) { export function getSalaryInfo(id: number) {
return request.get(`salary/salary/${id}`); return request.get(`salary/salary/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getSalaryInfo(id: number) {
* @returns * @returns
*/ */
export function addSalary(params: Record<string, any>) { export function addSalary(params: Record<string, any>) {
return request.post('salary/salary', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('salary/salary', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,10 @@ export function addSalary(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editSalary(params: Record<string, any>) { export function editSalary(params: Record<string, any>) {
return request.put(`salary/salary/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`salary/salary/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -44,9 +50,10 @@ export function editSalary(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteSalary(id: number) { export function deleteSalary(id: number) {
return request.delete(`salary/salary/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`salary/salary/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- salary // USER_CODE_END -- salary

23
admin/src/app/api/service.ts

@ -1,7 +1,5 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- service // USER_CODE_BEGIN -- service
/** /**
* *
@ -9,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getServiceList(params: Record<string, any>) { export function getServiceList(params: Record<string, any>) {
return request.get(`service/service`, {params}) return request.get(`service/service`, { params })
} }
/** /**
@ -18,7 +16,7 @@ export function getServiceList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getServiceInfo(id: number) { export function getServiceInfo(id: number) {
return request.get(`service/service/${id}`); return request.get(`service/service/${id}`)
} }
/** /**
@ -27,7 +25,10 @@ export function getServiceInfo(id: number) {
* @returns * @returns
*/ */
export function addService(params: Record<string, any>) { export function addService(params: Record<string, any>) {
return request.post('service/service', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('service/service', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -37,7 +38,10 @@ export function addService(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editService(params: Record<string, any>) { export function editService(params: Record<string, any>) {
return request.put(`service/service/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`service/service/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -46,9 +50,10 @@ export function editService(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteService(id: number) { export function deleteService(id: number) {
return request.delete(`service/service/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`service/service/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- service // USER_CODE_END -- service

21
admin/src/app/api/six_speed.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getSixSpeedList(params: Record<string, any>) { export function getSixSpeedList(params: Record<string, any>) {
return request.get(`six_speed/six_speed`, {params}) return request.get(`six_speed/six_speed`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getSixSpeedList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getSixSpeedInfo(id: number) { export function getSixSpeedInfo(id: number) {
return request.get(`six_speed/six_speed/${id}`); return request.get(`six_speed/six_speed/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getSixSpeedInfo(id: number) {
* @returns * @returns
*/ */
export function addSixSpeed(params: Record<string, any>) { export function addSixSpeed(params: Record<string, any>) {
return request.post('six_speed/six_speed', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('six_speed/six_speed', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,10 @@ export function addSixSpeed(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editSixSpeed(params: Record<string, any>) { export function editSixSpeed(params: Record<string, any>) {
return request.put(`six_speed/six_speed/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`six_speed/six_speed/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -44,9 +50,10 @@ export function editSixSpeed(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteSixSpeed(id: number) { export function deleteSixSpeed(id: number) {
return request.delete(`six_speed/six_speed/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`six_speed/six_speed/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- six_speed // USER_CODE_END -- six_speed

38
admin/src/app/api/six_speed_modification_log.ts

@ -1,9 +1,5 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- six_speed_modification_log // USER_CODE_BEGIN -- six_speed_modification_log
/** /**
* *
@ -11,7 +7,9 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getSixSpeedModificationLogList(params: Record<string, any>) { export function getSixSpeedModificationLogList(params: Record<string, any>) {
return request.get(`six_speed_modification_log/six_speed_modification_log`, {params}) return request.get(`six_speed_modification_log/six_speed_modification_log`, {
params,
})
} }
/** /**
@ -20,7 +18,9 @@ export function getSixSpeedModificationLogList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getSixSpeedModificationLogInfo(id: number) { export function getSixSpeedModificationLogInfo(id: number) {
return request.get(`six_speed_modification_log/six_speed_modification_log/${id}`); return request.get(
`six_speed_modification_log/six_speed_modification_log/${id}`
)
} }
/** /**
@ -29,7 +29,11 @@ export function getSixSpeedModificationLogInfo(id: number) {
* @returns * @returns
*/ */
export function addSixSpeedModificationLog(params: Record<string, any>) { export function addSixSpeedModificationLog(params: Record<string, any>) {
return request.post('six_speed_modification_log/six_speed_modification_log', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post(
'six_speed_modification_log/six_speed_modification_log',
params,
{ showErrorMessage: true, showSuccessMessage: true }
)
} }
/** /**
@ -39,7 +43,11 @@ export function addSixSpeedModificationLog(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editSixSpeedModificationLog(params: Record<string, any>) { export function editSixSpeedModificationLog(params: Record<string, any>) {
return request.put(`six_speed_modification_log/six_speed_modification_log/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(
`six_speed_modification_log/six_speed_modification_log/${params.id}`,
params,
{ showErrorMessage: true, showSuccessMessage: true }
)
} }
/** /**
@ -48,13 +56,17 @@ export function editSixSpeedModificationLog(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteSixSpeedModificationLog(id: number) { export function deleteSixSpeedModificationLog(id: number) {
return request.delete(`six_speed_modification_log/six_speed_modification_log/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(
`six_speed_modification_log/six_speed_modification_log/${id}`,
{ showErrorMessage: true, showSuccessMessage: true }
)
} }
export function getWithCampusList(params: Record<string,any>){ export function getWithCampusList(params: Record<string, any>) {
return request.get('six_speed_modification_log/campus_all', {params}) return request.get('six_speed_modification_log/campus_all', { params })
}export function getWithPersonnelList(params: Record<string,any>){ }
return request.get('six_speed_modification_log/personnel_all', {params}) export function getWithPersonnelList(params: Record<string, any>) {
return request.get('six_speed_modification_log/personnel_all', { params })
} }
// USER_CODE_END -- six_speed_modification_log // USER_CODE_END -- six_speed_modification_log

21
admin/src/app/api/stat_hour.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getStatHourList(params: Record<string, any>) { export function getStatHourList(params: Record<string, any>) {
return request.get(`stat_hour/stat_hour`, {params}) return request.get(`stat_hour/stat_hour`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getStatHourList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getStatHourInfo(id: number) { export function getStatHourInfo(id: number) {
return request.get(`stat_hour/stat_hour/${id}`); return request.get(`stat_hour/stat_hour/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getStatHourInfo(id: number) {
* @returns * @returns
*/ */
export function addStatHour(params: Record<string, any>) { export function addStatHour(params: Record<string, any>) {
return request.post('stat_hour/stat_hour', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('stat_hour/stat_hour', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,10 @@ export function addStatHour(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editStatHour(params: Record<string, any>) { export function editStatHour(params: Record<string, any>) {
return request.put(`stat_hour/stat_hour/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`stat_hour/stat_hour/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -44,9 +50,10 @@ export function editStatHour(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteStatHour(id: number) { export function deleteStatHour(id: number) {
return request.delete(`stat_hour/stat_hour/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`stat_hour/stat_hour/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- stat_hour // USER_CODE_END -- stat_hour

22
admin/src/app/api/student_course_usage.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getStudentCourseUsageList(params: Record<string, any>) { export function getStudentCourseUsageList(params: Record<string, any>) {
return request.get(`student_course_usage/student_course_usage`, {params}) return request.get(`student_course_usage/student_course_usage`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getStudentCourseUsageList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getStudentCourseUsageInfo(id: number) { export function getStudentCourseUsageInfo(id: number) {
return request.get(`student_course_usage/student_course_usage/${id}`); return request.get(`student_course_usage/student_course_usage/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getStudentCourseUsageInfo(id: number) {
* @returns * @returns
*/ */
export function addStudentCourseUsage(params: Record<string, any>) { export function addStudentCourseUsage(params: Record<string, any>) {
return request.post('student_course_usage/student_course_usage', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('student_course_usage/student_course_usage', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,11 @@ export function addStudentCourseUsage(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editStudentCourseUsage(params: Record<string, any>) { export function editStudentCourseUsage(params: Record<string, any>) {
return request.put(`student_course_usage/student_course_usage/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(
`student_course_usage/student_course_usage/${params.id}`,
params,
{ showErrorMessage: true, showSuccessMessage: true }
)
} }
/** /**
@ -44,9 +51,10 @@ export function editStudentCourseUsage(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteStudentCourseUsage(id: number) { export function deleteStudentCourseUsage(id: number) {
return request.delete(`student_course_usage/student_course_usage/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`student_course_usage/student_course_usage/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- student_course_usage // USER_CODE_END -- student_course_usage

21
admin/src/app/api/student_courses.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getStudentCoursesList(params: Record<string, any>) { export function getStudentCoursesList(params: Record<string, any>) {
return request.get(`student_courses/student_courses`, {params}) return request.get(`student_courses/student_courses`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getStudentCoursesList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getStudentCoursesInfo(id: number) { export function getStudentCoursesInfo(id: number) {
return request.get(`student_courses/student_courses/${id}`); return request.get(`student_courses/student_courses/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getStudentCoursesInfo(id: number) {
* @returns * @returns
*/ */
export function addStudentCourses(params: Record<string, any>) { export function addStudentCourses(params: Record<string, any>) {
return request.post('student_courses/student_courses', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('student_courses/student_courses', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,10 @@ export function addStudentCourses(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editStudentCourses(params: Record<string, any>) { export function editStudentCourses(params: Record<string, any>) {
return request.put(`student_courses/student_courses/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`student_courses/student_courses/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -44,9 +50,10 @@ export function editStudentCourses(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteStudentCourses(id: number) { export function deleteStudentCourses(id: number) {
return request.delete(`student_courses/student_courses/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`student_courses/student_courses/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- student_courses // USER_CODE_END -- student_courses

21
admin/src/app/api/user_feedback.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getUserFeedbackList(params: Record<string, any>) { export function getUserFeedbackList(params: Record<string, any>) {
return request.get(`user_feedback/user_feedback`, {params}) return request.get(`user_feedback/user_feedback`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getUserFeedbackList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getUserFeedbackInfo(id: number) { export function getUserFeedbackInfo(id: number) {
return request.get(`user_feedback/user_feedback/${id}`); return request.get(`user_feedback/user_feedback/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getUserFeedbackInfo(id: number) {
* @returns * @returns
*/ */
export function addUserFeedback(params: Record<string, any>) { export function addUserFeedback(params: Record<string, any>) {
return request.post('user_feedback/user_feedback', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('user_feedback/user_feedback', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,10 @@ export function addUserFeedback(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editUserFeedback(params: Record<string, any>) { export function editUserFeedback(params: Record<string, any>) {
return request.put(`user_feedback/user_feedback/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`user_feedback/user_feedback/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -44,9 +50,10 @@ export function editUserFeedback(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteUserFeedback(id: number) { export function deleteUserFeedback(id: number) {
return request.delete(`user_feedback/user_feedback/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`user_feedback/user_feedback/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- user_feedback // USER_CODE_END -- user_feedback

21
admin/src/app/api/venue.ts

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getVenueList(params: Record<string, any>) { export function getVenueList(params: Record<string, any>) {
return request.get(`venue/venue`, {params}) return request.get(`venue/venue`, { params })
} }
/** /**
@ -16,7 +16,7 @@ export function getVenueList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getVenueInfo(id: number) { export function getVenueInfo(id: number) {
return request.get(`venue/venue/${id}`); return request.get(`venue/venue/${id}`)
} }
/** /**
@ -25,7 +25,10 @@ export function getVenueInfo(id: number) {
* @returns * @returns
*/ */
export function addVenue(params: Record<string, any>) { export function addVenue(params: Record<string, any>) {
return request.post('venue/venue', params, { showErrorMessage: true, showSuccessMessage: true }) return request.post('venue/venue', params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -35,7 +38,10 @@ export function addVenue(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editVenue(params: Record<string, any>) { export function editVenue(params: Record<string, any>) {
return request.put(`venue/venue/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) return request.put(`venue/venue/${params.id}`, params, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -44,9 +50,10 @@ export function editVenue(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteVenue(id: number) { export function deleteVenue(id: number) {
return request.delete(`venue/venue/${id}`, { showErrorMessage: true, showSuccessMessage: true }) return request.delete(`venue/venue/${id}`, {
showErrorMessage: true,
showSuccessMessage: true,
})
} }
// USER_CODE_END -- venue // USER_CODE_END -- venue

54
admin/src/app/lang/zh-cn/attendance.attendance.json

@ -1,29 +1,29 @@
{ {
"id":"考勤编号", "id": "考勤编号",
"idPlaceholder":"请输入考勤编号", "idPlaceholder": "请输入考勤编号",
"campusId":"校区ID", "campusId": "校区ID",
"campusIdPlaceholder":"请输入校区ID", "campusIdPlaceholder": "请输入校区ID",
"staffId":"人员ID", "staffId": "人员ID",
"staffIdPlaceholder":"请输入人员ID", "staffIdPlaceholder": "请输入人员ID",
"attendanceDate":"考勤日期", "attendanceDate": "考勤日期",
"attendanceDatePlaceholder":"请输入考勤日期", "attendanceDatePlaceholder": "请输入考勤日期",
"checkInTime":"签到时间", "checkInTime": "签到时间",
"checkInTimePlaceholder":"请输入签到时间", "checkInTimePlaceholder": "请输入签到时间",
"checkOutTime":"签退时间", "checkOutTime": "签退时间",
"checkOutTimePlaceholder":"请输入签退时间", "checkOutTimePlaceholder": "请输入签退时间",
"status":"考勤状态", "status": "考勤状态",
"statusPlaceholder":"请输入考勤状态", "statusPlaceholder": "请输入考勤状态",
"remarks":"备注", "remarks": "备注",
"remarksPlaceholder":"请输入备注", "remarksPlaceholder": "请输入备注",
"createdAt":"创建时间", "createdAt": "创建时间",
"createdAtPlaceholder":"请输入创建时间", "createdAtPlaceholder": "请输入创建时间",
"updatedAt":"修改时间", "updatedAt": "修改时间",
"updatedAtPlaceholder":"请输入修改时间", "updatedAtPlaceholder": "请输入修改时间",
"coordinate":"坐标", "coordinate": "坐标",
"coordinatePlaceholder":"请输入坐标", "coordinatePlaceholder": "请输入坐标",
"addAttendance":"添加考勤", "addAttendance": "添加考勤",
"updateAttendance":"编辑考勤", "updateAttendance": "编辑考勤",
"attendanceDeleteTips":"确定要删除该数据吗?", "attendanceDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

36
admin/src/app/lang/zh-cn/campus.campus.json

@ -1,20 +1,20 @@
{ {
"campusName":"校区名称", "campusName": "校区名称",
"campusNamePlaceholder":"请输入校区名称", "campusNamePlaceholder": "请输入校区名称",
"campusAddress":"校区地址", "campusAddress": "校区地址",
"campusAddressPlaceholder":"请输入校区地址", "campusAddressPlaceholder": "请输入校区地址",
"campusPreviewImage":"校区banner", "campusPreviewImage": "校区banner",
"campusPreviewImagePlaceholder":"请选择图片", "campusPreviewImagePlaceholder": "请选择图片",
"campusCoordinates":"校区位置", "campusCoordinates": "校区位置",
"campusCoordinatesPlaceholder":"请选择校区位置", "campusCoordinatesPlaceholder": "请选择校区位置",
"campusIntroduction":"校区介绍", "campusIntroduction": "校区介绍",
"campusIntroductionPlaceholder":"请输入校区介绍", "campusIntroductionPlaceholder": "请输入校区介绍",
"campusStatus":"校区状态", "campusStatus": "校区状态",
"campusStatusPlaceholder":"请输入校区状态", "campusStatusPlaceholder": "请输入校区状态",
"createTime":"校区创建时间", "createTime": "校区创建时间",
"addCampus":"添加校区", "addCampus": "添加校区",
"updateCampus":"编辑校区", "updateCampus": "编辑校区",
"campusDeleteTips":"确定要删除该数据吗?", "campusDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

30
admin/src/app/lang/zh-cn/campus_person_role.campus_person_role.json

@ -1,17 +1,17 @@
{ {
"id":"关系编号", "id": "关系编号",
"idPlaceholder":"请输入关系编号", "idPlaceholder": "请输入关系编号",
"campusId":"校区", "campusId": "校区",
"campusIdPlaceholder":"全部", "campusIdPlaceholder": "全部",
"personId":"人员", "personId": "人员",
"personIdPlaceholder":"全部", "personIdPlaceholder": "全部",
"roleId":"角色", "roleId": "角色",
"roleIdPlaceholder":"全部", "roleIdPlaceholder": "全部",
"deptId":"部门表", "deptId": "部门表",
"deptIdPlaceholder":"全部", "deptIdPlaceholder": "全部",
"addCampusPersonRole":"添加角色关系", "addCampusPersonRole": "添加角色关系",
"updateCampusPersonRole":"编辑角色关系", "updateCampusPersonRole": "编辑角色关系",
"campusPersonRoleDeleteTips":"确定要删除该数据吗?", "campusPersonRoleDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

66
admin/src/app/lang/zh-cn/class.class.json

@ -1,35 +1,35 @@
{ {
"id":"班级编号", "id": "班级编号",
"idPlaceholder":"请输入班级编号", "idPlaceholder": "请输入班级编号",
"campusId":"校区ID", "campusId": "校区ID",
"campusIdPlaceholder":"请输入校区ID", "campusIdPlaceholder": "请输入校区ID",
"campusName":"校区名称", "campusName": "校区名称",
"campusNamePlaceholder":"请输入校区名称", "campusNamePlaceholder": "请输入校区名称",
"className":"班级名称", "className": "班级名称",
"classNamePlaceholder":"请输入班级名称", "classNamePlaceholder": "请输入班级名称",
"headCoach":"班级主教练", "headCoach": "班级主教练",
"headCoachPlaceholder":"请输入班级主教练", "headCoachPlaceholder": "请输入班级主教练",
"ageGroup":"班级授课年龄段", "ageGroup": "班级授课年龄段",
"ageGroupPlaceholder":"请输入班级授课年龄段", "ageGroupPlaceholder": "请输入班级授课年龄段",
"classType":"班级类型", "classType": "班级类型",
"classTypePlaceholder":"请输入班级类型", "classTypePlaceholder": "请输入班级类型",
"assistantCoach":"班级助教", "assistantCoach": "班级助教",
"assistantCoachPlaceholder":"请输入班级助教", "assistantCoachPlaceholder": "请输入班级助教",
"createdAt":"创建时间", "createdAt": "创建时间",
"createdAtPlaceholder":"请输入创建时间", "createdAtPlaceholder": "请输入创建时间",
"updatedAt":"修改时间", "updatedAt": "修改时间",
"updatedAtPlaceholder":"请输入修改时间", "updatedAtPlaceholder": "请输入修改时间",
"deletedAt":"逻辑删除时间", "deletedAt": "逻辑删除时间",
"deletedAtPlaceholder":"请输入逻辑删除时间", "deletedAtPlaceholder": "请输入逻辑删除时间",
"status":"班级状态", "status": "班级状态",
"statusPlaceholder":"请输入班级状态", "statusPlaceholder": "请输入班级状态",
"sortOrder":"班级排序", "sortOrder": "班级排序",
"sortOrderPlaceholder":"请输入班级排序", "sortOrderPlaceholder": "请输入班级排序",
"remarks":"班级备注", "remarks": "班级备注",
"remarksPlaceholder":"请输入班级备注", "remarksPlaceholder": "请输入班级备注",
"addClass":"添加班级", "addClass": "添加班级",
"updateClass":"编辑班级", "updateClass": "编辑班级",
"classDeleteTips":"确定要删除该数据吗?", "classDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

58
admin/src/app/lang/zh-cn/communication_records.communication_records.json

@ -1,31 +1,31 @@
{ {
"id":"沟通记录编号", "id": "沟通记录编号",
"idPlaceholder":"请输入沟通记录编号", "idPlaceholder": "请输入沟通记录编号",
"staffId":"员工ID", "staffId": "员工ID",
"staffIdPlaceholder":"请输入员工ID", "staffIdPlaceholder": "请输入员工ID",
"resourceId":"资源ID", "resourceId": "资源ID",
"resourceIdPlaceholder":"请输入资源ID", "resourceIdPlaceholder": "请输入资源ID",
"resourceType":"资源类型(如设备、文件、系统等)", "resourceType": "资源类型(如设备、文件、系统等)",
"resourceTypePlaceholder":"请输入资源类型(如设备、文件、系统等)", "resourceTypePlaceholder": "请输入资源类型(如设备、文件、系统等)",
"communicationType":"沟通类型: phone-电话, email-邮件, meeting-会议, other-其他", "communicationType": "沟通类型: phone-电话, email-邮件, meeting-会议, other-其他",
"communicationTypePlaceholder":"请输入沟通类型: phone-电话, email-邮件, meeting-会议, other-其他", "communicationTypePlaceholder": "请输入沟通类型: phone-电话, email-邮件, meeting-会议, other-其他",
"communicationResult":"沟通结果: success-成功, failure-失败, pending-待定", "communicationResult": "沟通结果: success-成功, failure-失败, pending-待定",
"communicationResultPlaceholder":"请输入沟通结果: success-成功, failure-失败, pending-待定", "communicationResultPlaceholder": "请输入沟通结果: success-成功, failure-失败, pending-待定",
"communicationTime":"沟通时间", "communicationTime": "沟通时间",
"communicationTimePlaceholder":"请输入沟通时间", "communicationTimePlaceholder": "请输入沟通时间",
"remarks":"备注", "remarks": "备注",
"remarksPlaceholder":"请输入备注", "remarksPlaceholder": "请输入备注",
"tag":"标签: high-高, medium-中, low-低", "tag": "标签: high-高, medium-中, low-低",
"tagPlaceholder":"请输入标签: high-高, medium-中, low-低", "tagPlaceholder": "请输入标签: high-高, medium-中, low-低",
"businessId":"关联的业务ID", "businessId": "关联的业务ID",
"businessIdPlaceholder":"请输入关联的业务ID", "businessIdPlaceholder": "请输入关联的业务ID",
"createdAt":"创建时间", "createdAt": "创建时间",
"createdAtPlaceholder":"请输入创建时间", "createdAtPlaceholder": "请输入创建时间",
"updatedAt":"修改时间", "updatedAt": "修改时间",
"updatedAtPlaceholder":"请输入修改时间", "updatedAtPlaceholder": "请输入修改时间",
"addCommunicationRecords":"添加沟通记录", "addCommunicationRecords": "添加沟通记录",
"updateCommunicationRecords":"编辑沟通记录", "updateCommunicationRecords": "编辑沟通记录",
"communicationRecordsDeleteTips":"确定要删除该数据吗?", "communicationRecordsDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

46
admin/src/app/lang/zh-cn/contract.contract.json

@ -1,25 +1,25 @@
{ {
"id":"合同编号", "id": "合同编号",
"idPlaceholder":"请输入合同编号", "idPlaceholder": "请输入合同编号",
"contractName":"合同名称", "contractName": "合同名称",
"contractNamePlaceholder":"请输入合同名称", "contractNamePlaceholder": "请输入合同名称",
"contractTemplate":"合同模板", "contractTemplate": "合同模板",
"contractTemplatePlaceholder":"请输入合同模板", "contractTemplatePlaceholder": "请输入合同模板",
"contractStatus":"合同状态", "contractStatus": "合同状态",
"contractStatusPlaceholder":"请输入合同状态", "contractStatusPlaceholder": "请输入合同状态",
"contractType":"合同类型", "contractType": "合同类型",
"contractTypePlaceholder":"请输入合同类型", "contractTypePlaceholder": "请输入合同类型",
"remarks":"合同备注", "remarks": "合同备注",
"remarksPlaceholder":"请输入合同备注", "remarksPlaceholder": "请输入合同备注",
"createdAt":"创建时间", "createdAt": "创建时间",
"createdAtPlaceholder":"请输入创建时间", "createdAtPlaceholder": "请输入创建时间",
"updatedAt":"修改时间", "updatedAt": "修改时间",
"updatedAtPlaceholder":"请输入修改时间", "updatedAtPlaceholder": "请输入修改时间",
"deletedAt":"逻辑删除时间", "deletedAt": "逻辑删除时间",
"deletedAtPlaceholder":"请输入逻辑删除时间", "deletedAtPlaceholder": "请输入逻辑删除时间",
"addContract":"添加合同", "addContract": "添加合同",
"updateContract":"编辑合同", "updateContract": "编辑合同",
"contractDeleteTips":"确定要删除该数据吗?", "contractDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

50
admin/src/app/lang/zh-cn/course.course.json

@ -1,27 +1,27 @@
{ {
"id":"课程编号", "id": "课程编号",
"idPlaceholder":"请输入课程编号", "idPlaceholder": "请输入课程编号",
"courseName":"课程名称", "courseName": "课程名称",
"courseNamePlaceholder":"请输入课程名称", "courseNamePlaceholder": "请输入课程名称",
"courseType":"课程类型", "courseType": "课程类型",
"courseTypePlaceholder":"请输入课程类型", "courseTypePlaceholder": "请输入课程类型",
"duration":"课程时长", "duration": "课程时长",
"durationPlaceholder":"请输入课程时长", "durationPlaceholder": "请输入课程时长",
"sessionCount":"课时数量", "sessionCount": "课时数量",
"sessionCountPlaceholder":"请输入课时数量", "sessionCountPlaceholder": "请输入课时数量",
"singleSessionCount":"单次逍客数量", "singleSessionCount": "单次逍客数量",
"singleSessionCountPlaceholder":"请输入单次逍客数量", "singleSessionCountPlaceholder": "请输入单次逍客数量",
"price":"课程价格", "price": "课程价格",
"pricePlaceholder":"请输入课程价格", "pricePlaceholder": "请输入课程价格",
"internalReminder":"内部提醒课时", "internalReminder": "内部提醒课时",
"internalReminderPlaceholder":"请输入内部提醒课时", "internalReminderPlaceholder": "请输入内部提醒课时",
"customerReminder":"客户提醒课时", "customerReminder": "客户提醒课时",
"customerReminderPlaceholder":"请输入客户提醒课时", "customerReminderPlaceholder": "请输入客户提醒课时",
"remarks":"课程备注", "remarks": "课程备注",
"remarksPlaceholder":"请输入课程备注", "remarksPlaceholder": "请输入课程备注",
"addCourse":"添加课程", "addCourse": "添加课程",
"updateCourse":"编辑课程", "updateCourse": "编辑课程",
"courseDeleteTips":"确定要删除该数据吗?", "courseDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

54
admin/src/app/lang/zh-cn/course_schedule.course_schedule.json

@ -1,29 +1,29 @@
{ {
"id":"课程安排编号", "id": "课程安排编号",
"idPlaceholder":"请输入课程安排编号", "idPlaceholder": "请输入课程安排编号",
"campusId":"校区ID", "campusId": "校区ID",
"campusIdPlaceholder":"请输入校区ID", "campusIdPlaceholder": "请输入校区ID",
"venueId":"场地ID", "venueId": "场地ID",
"venueIdPlaceholder":"请输入场地ID", "venueIdPlaceholder": "请输入场地ID",
"courseDate":"上课日期", "courseDate": "上课日期",
"courseDatePlaceholder":"请输入上课日期", "courseDatePlaceholder": "请输入上课日期",
"timeSlot":"上课时段", "timeSlot": "上课时段",
"timeSlotPlaceholder":"请输入上课时段", "timeSlotPlaceholder": "请输入上课时段",
"courseId":"课程ID", "courseId": "课程ID",
"courseIdPlaceholder":"请输入课程ID", "courseIdPlaceholder": "请输入课程ID",
"coachId":"上课教练ID", "coachId": "上课教练ID",
"coachIdPlaceholder":"请输入上课教练ID", "coachIdPlaceholder": "请输入上课教练ID",
"participants":"参与人员列表", "participants": "参与人员列表",
"participantsPlaceholder":"请输入参与人员列表", "participantsPlaceholder": "请输入参与人员列表",
"studentIds":"上课学生列表", "studentIds": "上课学生列表",
"studentIdsPlaceholder":"请输入上课学生列表", "studentIdsPlaceholder": "请输入上课学生列表",
"availableCapacity":"根据场地容量判断的可安排学员位置数量", "availableCapacity": "根据场地容量判断的可安排学员位置数量",
"availableCapacityPlaceholder":"请输入根据场地容量判断的可安排学员位置数量", "availableCapacityPlaceholder": "请输入根据场地容量判断的可安排学员位置数量",
"status":"课程状态:", "status": "课程状态:",
"statusPlaceholder":"请输入课程状态:", "statusPlaceholder": "请输入课程状态:",
"addCourseSchedule":"添加课程安排", "addCourseSchedule": "添加课程安排",
"updateCourseSchedule":"编辑课程安排", "updateCourseSchedule": "编辑课程安排",
"courseScheduleDeleteTips":"确定要删除该数据吗?", "courseScheduleDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

38
admin/src/app/lang/zh-cn/customer_resource_changes.customer_resource_changes.json

@ -1,21 +1,21 @@
{ {
"id":"修改编号", "id": "修改编号",
"idPlaceholder":"请输入修改编号", "idPlaceholder": "请输入修改编号",
"customerResourceId":"客户资源的ID", "customerResourceId": "客户资源的ID",
"customerResourceIdPlaceholder":"请输入客户资源的ID", "customerResourceIdPlaceholder": "请输入客户资源的ID",
"operatorId":"操作人的ID", "operatorId": "操作人的ID",
"operatorIdPlaceholder":"请输入操作人的ID", "operatorIdPlaceholder": "请输入操作人的ID",
"campusId":"操作校区的ID", "campusId": "操作校区的ID",
"campusIdPlaceholder":"请输入操作校区的ID", "campusIdPlaceholder": "请输入操作校区的ID",
"modifiedFields":"修改的哪些字段", "modifiedFields": "修改的哪些字段",
"modifiedFieldsPlaceholder":"请输入修改的哪些字段", "modifiedFieldsPlaceholder": "请输入修改的哪些字段",
"oldValues":"修改前的值", "oldValues": "修改前的值",
"oldValuesPlaceholder":"请输入修改前的值", "oldValuesPlaceholder": "请输入修改前的值",
"newValues":"修改后的值", "newValues": "修改后的值",
"newValuesPlaceholder":"请输入修改后的值", "newValuesPlaceholder": "请输入修改后的值",
"addCustomerResourceChanges":"添加客户资源表变更记录", "addCustomerResourceChanges": "添加客户资源表变更记录",
"updateCustomerResourceChanges":"编辑客户资源表变更记录", "updateCustomerResourceChanges": "编辑客户资源表变更记录",
"customerResourceChangesDeleteTips":"确定要删除该数据吗?", "customerResourceChangesDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

72
admin/src/app/lang/zh-cn/customer_resources.customer_resources.json

@ -1,38 +1,38 @@
{ {
"source":"来源", "source": "来源",
"sourcePlaceholder":"请输入来源", "sourcePlaceholder": "请输入来源",
"sourceChannel":"来源渠道", "sourceChannel": "来源渠道",
"sourceChannelPlaceholder":"请输入来源渠道", "sourceChannelPlaceholder": "请输入来源渠道",
"consultant":"顾问", "consultant": "顾问",
"name":"姓名", "name": "姓名",
"namePlaceholder":"请输入姓名", "namePlaceholder": "请输入姓名",
"age":"年龄", "age": "年龄",
"agePlaceholder":"请输入年龄", "agePlaceholder": "请输入年龄",
"gender":"性别", "gender": "性别",
"genderPlaceholder":"请输入性别", "genderPlaceholder": "请输入性别",
"phoneNumber":"联系电话", "phoneNumber": "联系电话",
"phoneNumberPlaceholder":"请输入联系电话", "phoneNumberPlaceholder": "请输入联系电话",
"demand":"需求", "demand": "需求",
"demandPlaceholder":"请输入需求", "demandPlaceholder": "请输入需求",
"purchasingPower":"购买力", "purchasingPower": "购买力",
"purchasingPowerPlaceholder":"请输入购买力", "purchasingPowerPlaceholder": "请输入购买力",
"cognitiveIdea":"认知理念", "cognitiveIdea": "认知理念",
"cognitiveIdeaPlaceholder":"请输入认知理念", "cognitiveIdeaPlaceholder": "请输入认知理念",
"optionalClassTime":"可选上课时间", "optionalClassTime": "可选上课时间",
"optionalClassTimePlaceholder":"请输入可选上课时间", "optionalClassTimePlaceholder": "请输入可选上课时间",
"distance":"距离", "distance": "距离",
"distancePlaceholder":"请输入距离", "distancePlaceholder": "请输入距离",
"decisionMaker":"决策人", "decisionMaker": "决策人",
"decisionMakerPlaceholder":"请输入决策人", "decisionMakerPlaceholder": "请输入决策人",
"initialIntent":"客户初步意向度", "initialIntent": "客户初步意向度",
"initialIntentPlaceholder":"请输入客户初步意向度", "initialIntentPlaceholder": "请输入客户初步意向度",
"campus":"所属校区", "campus": "所属校区",
"campusPlaceholder":"请输入所属校区", "campusPlaceholder": "请输入所属校区",
"status":"客户状态", "status": "客户状态",
"statusPlaceholder":"请输入客户状态", "statusPlaceholder": "请输入客户状态",
"addCustomerResources":"添加客户资源", "addCustomerResources": "添加客户资源",
"updateCustomerResources":"编辑客户资源", "updateCustomerResources": "编辑客户资源",
"customerResourcesDeleteTips":"确定要删除该数据吗?", "customerResourcesDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

22
admin/src/app/lang/zh-cn/departments.departments.json

@ -1,13 +1,13 @@
{ {
"id":"部门编号", "id": "部门编号",
"idPlaceholder":"请输入部门编号", "idPlaceholder": "请输入部门编号",
"departmentName":"部门名称", "departmentName": "部门名称",
"departmentNamePlaceholder":"请输入部门名称", "departmentNamePlaceholder": "请输入部门名称",
"parentDepartmentId":"上级部门ID", "parentDepartmentId": "上级部门ID",
"parentDepartmentIdPlaceholder":"全部", "parentDepartmentIdPlaceholder": "全部",
"addDepartments":"添加部门", "addDepartments": "添加部门",
"updateDepartments":"编辑部门", "updateDepartments": "编辑部门",
"departmentsDeleteTips":"确定要删除该数据吗?", "departmentsDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

34
admin/src/app/lang/zh-cn/exam_answers.exam_answers.json

@ -1,19 +1,19 @@
{ {
"id":"答题记录编号", "id": "答题记录编号",
"idPlaceholder":"请输入答题记录编号", "idPlaceholder": "请输入答题记录编号",
"campusId":"校区ID", "campusId": "校区ID",
"campusIdPlaceholder":"请输入校区ID", "campusIdPlaceholder": "请输入校区ID",
"userId":"人员ID", "userId": "人员ID",
"userIdPlaceholder":"请输入人员ID", "userIdPlaceholder": "请输入人员ID",
"questionId":"试题ID", "questionId": "试题ID",
"questionIdPlaceholder":"请输入试题ID", "questionIdPlaceholder": "请输入试题ID",
"answer":"用户答案", "answer": "用户答案",
"answerPlaceholder":"请输入用户答案", "answerPlaceholder": "请输入用户答案",
"isCorrect":"是否正确", "isCorrect": "是否正确",
"isCorrectPlaceholder":"请输入是否正确", "isCorrectPlaceholder": "请输入是否正确",
"addExamAnswers":"添加答题记录", "addExamAnswers": "添加答题记录",
"updateExamAnswers":"编辑答题记录", "updateExamAnswers": "编辑答题记录",
"examAnswersDeleteTips":"确定要删除该数据吗?", "examAnswersDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

26
admin/src/app/lang/zh-cn/exam_papers.exam_papers.json

@ -1,15 +1,15 @@
{ {
"id":"试卷编号", "id": "试卷编号",
"idPlaceholder":"请输入试卷编号", "idPlaceholder": "请输入试卷编号",
"selectionMode":"题目选择模式: random-随机主题, manual-自选题目", "selectionMode": "题目选择模式: random-随机主题, manual-自选题目",
"selectionModePlaceholder":"请输入题目选择模式: random-随机主题, manual-自选题目", "selectionModePlaceholder": "请输入题目选择模式: random-随机主题, manual-自选题目",
"totalScore":"总分", "totalScore": "总分",
"totalScorePlaceholder":"请输入总分", "totalScorePlaceholder": "请输入总分",
"passingScore":"合格分数", "passingScore": "合格分数",
"passingScorePlaceholder":"请输入合格分数", "passingScorePlaceholder": "请输入合格分数",
"addExamPapers":"添加试卷", "addExamPapers": "添加试卷",
"updateExamPapers":"编辑试卷", "updateExamPapers": "编辑试卷",
"examPapersDeleteTips":"确定要删除该数据吗?", "examPapersDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

4
admin/src/app/lang/zh-cn/exam_questions.exam_questions.json

@ -23,8 +23,8 @@
"optionDContentTypePlaceholder":"请输入选项D类型: text-文本, image-图片", "optionDContentTypePlaceholder":"请输入选项D类型: text-文本, image-图片",
"optionDContent":"选项D内容(如果是图片则存储URL)", "optionDContent":"选项D内容(如果是图片则存储URL)",
"optionDContentPlaceholder":"请输入选项D内容(如果是图片则存储URL)", "optionDContentPlaceholder":"请输入选项D内容(如果是图片则存储URL)",
"correctAnswer":"正确答案(如果是多选,答案格式为如"A,B,D")", "correctAnswer":"正确答案(如果是多选,答案格式为如A,B,D)",
"correctAnswerPlaceholder":"请输入正确答案(如果是多选,答案格式为如"A,B,D")", "correctAnswerPlaceholder":"请输入正确答案(如果是多选,答案格式为如A,B,D)",
"addExamQuestions":"添加试题", "addExamQuestions":"添加试题",
"updateExamQuestions":"编辑试题", "updateExamQuestions":"编辑试题",
"examQuestionsDeleteTips":"确定要删除该数据吗?", "examQuestionsDeleteTips":"确定要删除该数据吗?",

2
admin/src/app/lang/zh-cn/exam_questions.exam_questions_edit.json

@ -10,7 +10,7 @@
"optionCContent":"选项C内容(如果是图片则存储URL)", "optionCContent":"选项C内容(如果是图片则存储URL)",
"optionDContentType":"选项D类型: text-文本, image-图片", "optionDContentType":"选项D类型: text-文本, image-图片",
"optionDContent":"选项D内容(如果是图片则存储URL)", "optionDContent":"选项D内容(如果是图片则存储URL)",
"correctAnswer":"正确答案(如果是多选,答案格式为如"A,B,D")", "correctAnswer":"正确答案(如果是多选,答案格式为如A,B,D)",
"questionTypePlaceholder":"请输入题型: single_choice-单选, multiple_choice-多选, true_false-判断", "questionTypePlaceholder":"请输入题型: single_choice-单选, multiple_choice-多选, true_false-判断",
"questionContentTypePlaceholder":"请输入题干类型: text-文本, image-图片", "questionContentTypePlaceholder":"请输入题干类型: text-文本, image-图片",
"questionContentPlaceholder":"请输入题干内容(如果是图片则存储URL)", "questionContentPlaceholder":"请输入题干内容(如果是图片则存储URL)",

42
admin/src/app/lang/zh-cn/exam_records.exam_records.json

@ -1,23 +1,23 @@
{ {
"id":"记录编号", "id": "记录编号",
"idPlaceholder":"请输入记录编号", "idPlaceholder": "请输入记录编号",
"campusId":"校区ID", "campusId": "校区ID",
"campusIdPlaceholder":"请输入校区ID", "campusIdPlaceholder": "请输入校区ID",
"userId":"人员ID", "userId": "人员ID",
"userIdPlaceholder":"请输入人员ID", "userIdPlaceholder": "请输入人员ID",
"paperId":"试卷ID", "paperId": "试卷ID",
"paperIdPlaceholder":"请输入试卷ID", "paperIdPlaceholder": "请输入试卷ID",
"score":"得分", "score": "得分",
"scorePlaceholder":"请输入得分", "scorePlaceholder": "请输入得分",
"status":"考试状态: in_progress-进行中, completed-已完成", "status": "考试状态: in_progress-进行中, completed-已完成",
"statusPlaceholder":"请输入考试状态: in_progress-进行中, completed-已完成", "statusPlaceholder": "请输入考试状态: in_progress-进行中, completed-已完成",
"startTime":"考试开始时间", "startTime": "考试开始时间",
"startTimePlaceholder":"请输入考试开始时间", "startTimePlaceholder": "请输入考试开始时间",
"endTime":"考试结束时间", "endTime": "考试结束时间",
"endTimePlaceholder":"请输入考试结束时间", "endTimePlaceholder": "请输入考试结束时间",
"addExamRecords":"添加考试记录", "addExamRecords": "添加考试记录",
"updateExamRecords":"编辑考试记录", "updateExamRecords": "编辑考试记录",
"examRecordsDeleteTips":"确定要删除该数据吗?", "examRecordsDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

22
admin/src/app/lang/zh-cn/market_performance.market_performance.json

@ -1,13 +1,13 @@
{ {
"personnelId":"人员", "personnelId": "人员",
"personnelIdPlaceholder":"请输入人员", "personnelIdPlaceholder": "请输入人员",
"campusId":"校区", "campusId": "校区",
"campusIdPlaceholder":"全部", "campusIdPlaceholder": "全部",
"performanceAmount":"绩效金额", "performanceAmount": "绩效金额",
"performanceAmountPlaceholder":"请输入绩效金额", "performanceAmountPlaceholder": "请输入绩效金额",
"addMarketPerformance":"添加市场绩效", "addMarketPerformance": "添加市场绩效",
"updateMarketPerformance":"编辑市场绩效", "updateMarketPerformance": "编辑市场绩效",
"marketPerformanceDeleteTips":"确定要删除该数据吗?", "marketPerformanceDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

66
admin/src/app/lang/zh-cn/order_table.order_table.json

@ -1,35 +1,35 @@
{ {
"id":"订单编号", "id": "订单编号",
"idPlaceholder":"请输入订单编号", "idPlaceholder": "请输入订单编号",
"paymentId":"支付编号", "paymentId": "支付编号",
"paymentIdPlaceholder":"请输入支付编号", "paymentIdPlaceholder": "请输入支付编号",
"orderStatus":"订单状态: pending-待支付, paid-已支付", "orderStatus": "订单状态: pending-待支付, paid-已支付",
"orderStatusPlaceholder":"请输入订单状态: pending-待支付, paid-已支付", "orderStatusPlaceholder": "请输入订单状态: pending-待支付, paid-已支付",
"paymentType":"付款类型: cash-现金支付, scan_code-扫码支付, subscription-订阅支付", "paymentType": "付款类型: cash-现金支付, scan_code-扫码支付, subscription-订阅支付",
"paymentTypePlaceholder":"请输入付款类型: cash-现金支付, scan_code-扫码支付, subscription-订阅支付", "paymentTypePlaceholder": "请输入付款类型: cash-现金支付, scan_code-扫码支付, subscription-订阅支付",
"orderAmount":"订单金额", "orderAmount": "订单金额",
"orderAmountPlaceholder":"请输入订单金额", "orderAmountPlaceholder": "请输入订单金额",
"courseId":"课程ID", "courseId": "课程ID",
"courseIdPlaceholder":"请输入课程ID", "courseIdPlaceholder": "请输入课程ID",
"classId":"班级ID", "classId": "班级ID",
"classIdPlaceholder":"请输入班级ID", "classIdPlaceholder": "请输入班级ID",
"staffId":"人员ID", "staffId": "人员ID",
"staffIdPlaceholder":"请输入人员ID", "staffIdPlaceholder": "请输入人员ID",
"resourceId":"资源ID", "resourceId": "资源ID",
"resourceIdPlaceholder":"请输入资源ID", "resourceIdPlaceholder": "请输入资源ID",
"afterSalesStatus":"售后状态", "afterSalesStatus": "售后状态",
"afterSalesStatusPlaceholder":"请输入售后状态", "afterSalesStatusPlaceholder": "请输入售后状态",
"afterSalesReason":"售后原因", "afterSalesReason": "售后原因",
"afterSalesReasonPlaceholder":"请输入售后原因", "afterSalesReasonPlaceholder": "请输入售后原因",
"afterSalesTime":"售后时间", "afterSalesTime": "售后时间",
"afterSalesTimePlaceholder":"请输入售后时间", "afterSalesTimePlaceholder": "请输入售后时间",
"paymentTime":"支付时间", "paymentTime": "支付时间",
"paymentTimePlaceholder":"请输入支付时间", "paymentTimePlaceholder": "请输入支付时间",
"subscriptionPaymentTime":"订阅支付生成时间", "subscriptionPaymentTime": "订阅支付生成时间",
"subscriptionPaymentTimePlaceholder":"请输入订阅支付生成时间", "subscriptionPaymentTimePlaceholder": "请输入订阅支付生成时间",
"addOrderTable":"添加订单", "addOrderTable": "添加订单",
"updateOrderTable":"编辑订单", "updateOrderTable": "编辑订单",
"orderTableDeleteTips":"确定要删除该数据吗?", "orderTableDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

42
admin/src/app/lang/zh-cn/performance_records.performance_records.json

@ -1,23 +1,23 @@
{ {
"id":"绩效编号", "id": "绩效编号",
"idPlaceholder":"请输入绩效编号", "idPlaceholder": "请输入绩效编号",
"staffId":"员工ID", "staffId": "员工ID",
"staffIdPlaceholder":"请输入员工ID", "staffIdPlaceholder": "请输入员工ID",
"resourceId":"资源ID", "resourceId": "资源ID",
"resourceIdPlaceholder":"请输入资源ID", "resourceIdPlaceholder": "请输入资源ID",
"orderId":"订单ID", "orderId": "订单ID",
"orderIdPlaceholder":"请输入订单ID", "orderIdPlaceholder": "请输入订单ID",
"orderStatus":"订单状态: pending-待处理, completed-已完成, cancelled-已取消", "orderStatus": "订单状态: pending-待处理, completed-已完成, cancelled-已取消",
"orderStatusPlaceholder":"请输入订单状态: pending-待处理, completed-已完成, cancelled-已取消", "orderStatusPlaceholder": "请输入订单状态: pending-待处理, completed-已完成, cancelled-已取消",
"performanceType":"绩效类型: sales-销售绩效, marketing-市场绩效, other-其他", "performanceType": "绩效类型: sales-销售绩效, marketing-市场绩效, other-其他",
"performanceTypePlaceholder":"请输入绩效类型: sales-销售绩效, marketing-市场绩效, other-其他", "performanceTypePlaceholder": "请输入绩效类型: sales-销售绩效, marketing-市场绩效, other-其他",
"performanceValue":"绩效金额或分值", "performanceValue": "绩效金额或分值",
"performanceValuePlaceholder":"请输入绩效金额或分值", "performanceValuePlaceholder": "请输入绩效金额或分值",
"remarks":"备注", "remarks": "备注",
"remarksPlaceholder":"请输入备注", "remarksPlaceholder": "请输入备注",
"addPerformanceRecords":"添加绩效记录", "addPerformanceRecords": "添加绩效记录",
"updatePerformanceRecords":"编辑绩效记录", "updatePerformanceRecords": "编辑绩效记录",
"performanceRecordsDeleteTips":"确定要删除该数据吗?", "performanceRecordsDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

34
admin/src/app/lang/zh-cn/person_course_schedule.person_course_schedule.json

@ -1,19 +1,19 @@
{ {
"id":"关系编号", "id": "关系编号",
"idPlaceholder":"请输入关系编号", "idPlaceholder": "请输入关系编号",
"personId":"人员或资源ID", "personId": "人员或资源ID",
"personIdPlaceholder":"请输入人员或资源ID", "personIdPlaceholder": "请输入人员或资源ID",
"personType":"人员类型: student-正式学员, customer_resource-客户资源", "personType": "人员类型: student-正式学员, customer_resource-客户资源",
"personTypePlaceholder":"请输入人员类型: student-正式学员, customer_resource-客户资源", "personTypePlaceholder": "请输入人员类型: student-正式学员, customer_resource-客户资源",
"scheduleId":"课程安排ID", "scheduleId": "课程安排ID",
"scheduleIdPlaceholder":"请输入课程安排ID", "scheduleIdPlaceholder": "请输入课程安排ID",
"courseDate":"上课日期", "courseDate": "上课日期",
"courseDatePlaceholder":"请输入上课日期", "courseDatePlaceholder": "请输入上课日期",
"timeSlot":"上课时段", "timeSlot": "上课时段",
"timeSlotPlaceholder":"请输入上课时段", "timeSlotPlaceholder": "请输入上课时段",
"addPersonCourseSchedule":"添加人员与课程安排关系", "addPersonCourseSchedule": "添加人员与课程安排关系",
"updatePersonCourseSchedule":"编辑人员与课程安排关系", "updatePersonCourseSchedule": "编辑人员与课程安排关系",
"personCourseScheduleDeleteTips":"确定要删除该数据吗?", "personCourseScheduleDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

82
admin/src/app/lang/zh-cn/physical_test.physical_test.json

@ -1,43 +1,43 @@
{ {
"id":"体测编号", "id": "体测编号",
"idPlaceholder":"请输入体测编号", "idPlaceholder": "请输入体测编号",
"resourceId":"资源ID", "resourceId": "资源ID",
"resourceIdPlaceholder":"请输入资源ID", "resourceIdPlaceholder": "请输入资源ID",
"studentId":"学员ID", "studentId": "学员ID",
"studentIdPlaceholder":"请输入学员ID", "studentIdPlaceholder": "请输入学员ID",
"height":"身高", "height": "身高",
"heightPlaceholder":"请输入身高", "heightPlaceholder": "请输入身高",
"weight":"体重", "weight": "体重",
"weightPlaceholder":"请输入体重", "weightPlaceholder": "请输入体重",
"coachId":"教练ID", "coachId": "教练ID",
"coachIdPlaceholder":"请输入教练ID", "coachIdPlaceholder": "请输入教练ID",
"createdAt":"创建时间", "createdAt": "创建时间",
"createdAtPlaceholder":"请输入创建时间", "createdAtPlaceholder": "请输入创建时间",
"updatedAt":"修改时间", "updatedAt": "修改时间",
"updatedAtPlaceholder":"请输入修改时间", "updatedAtPlaceholder": "请输入修改时间",
"seatedForwardBend":"坐位体前屈", "seatedForwardBend": "坐位体前屈",
"seatedForwardBendPlaceholder":"请输入坐位体前屈", "seatedForwardBendPlaceholder": "请输入坐位体前屈",
"sitUps":"仰卧卷腹", "sitUps": "仰卧卷腹",
"sitUpsPlaceholder":"请输入仰卧卷腹", "sitUpsPlaceholder": "请输入仰卧卷腹",
"pushUps":"九十度仰卧撑", "pushUps": "九十度仰卧撑",
"pushUpsPlaceholder":"请输入九十度仰卧撑", "pushUpsPlaceholder": "请输入九十度仰卧撑",
"flamingoBalance":"火烈鸟平衡测试", "flamingoBalance": "火烈鸟平衡测试",
"flamingoBalancePlaceholder":"请输入火烈鸟平衡测试", "flamingoBalancePlaceholder": "请输入火烈鸟平衡测试",
"thirtySecJump":"三十秒双脚连续跳", "thirtySecJump": "三十秒双脚连续跳",
"thirtySecJumpPlaceholder":"请输入三十秒双脚连续跳", "thirtySecJumpPlaceholder": "请输入三十秒双脚连续跳",
"standingLongJump":"立定跳远", "standingLongJump": "立定跳远",
"standingLongJumpPlaceholder":"请输入立定跳远", "standingLongJumpPlaceholder": "请输入立定跳远",
"agilityRun":"4乘10m灵敏折返跑", "agilityRun": "4乘10m灵敏折返跑",
"agilityRunPlaceholder":"请输入4乘10m灵敏折返跑", "agilityRunPlaceholder": "请输入4乘10m灵敏折返跑",
"balanceBeam":"走平衡木", "balanceBeam": "走平衡木",
"balanceBeamPlaceholder":"请输入走平衡木", "balanceBeamPlaceholder": "请输入走平衡木",
"tennisThrow":"网球掷远", "tennisThrow": "网球掷远",
"tennisThrowPlaceholder":"请输入网球掷远", "tennisThrowPlaceholder": "请输入网球掷远",
"tenMeterShuttleRun":"十米往返跑", "tenMeterShuttleRun": "十米往返跑",
"tenMeterShuttleRunPlaceholder":"请输入十米往返跑", "tenMeterShuttleRunPlaceholder": "请输入十米往返跑",
"addPhysicalTest":"添加体测", "addPhysicalTest": "添加体测",
"updatePhysicalTest":"编辑体测", "updatePhysicalTest": "编辑体测",
"physicalTestDeleteTips":"确定要删除该数据吗?", "physicalTestDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

38
admin/src/app/lang/zh-cn/reimbursement.reimbursement.json

@ -1,21 +1,21 @@
{ {
"id":"报销编号", "id": "报销编号",
"idPlaceholder":"请输入报销编号", "idPlaceholder": "请输入报销编号",
"applicantId":"申请人ID", "applicantId": "申请人ID",
"applicantIdPlaceholder":"请输入申请人ID", "applicantIdPlaceholder": "请输入申请人ID",
"amount":"报销金额", "amount": "报销金额",
"amountPlaceholder":"请输入报销金额", "amountPlaceholder": "请输入报销金额",
"description":"报销描述", "description": "报销描述",
"descriptionPlaceholder":"请输入报销描述", "descriptionPlaceholder": "请输入报销描述",
"receiptUrl":"发票或收据URL", "receiptUrl": "发票或收据URL",
"receiptUrlPlaceholder":"请输入发票或收据URL", "receiptUrlPlaceholder": "请输入发票或收据URL",
"status":"状态", "status": "状态",
"statusPlaceholder":"请输入状态", "statusPlaceholder": "请输入状态",
"processId":"关联的审批流程ID", "processId": "关联的审批流程ID",
"processIdPlaceholder":"请输入关联的审批流程ID", "processIdPlaceholder": "请输入关联的审批流程ID",
"addReimbursement":"添加报销记录", "addReimbursement": "添加报销记录",
"updateReimbursement":"编辑报销记录", "updateReimbursement": "编辑报销记录",
"reimbursementDeleteTips":"确定要删除该数据吗?", "reimbursementDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

34
admin/src/app/lang/zh-cn/resource_sharing.resource_sharing.json

@ -1,19 +1,19 @@
{ {
"id":"共享记录编号", "id": "共享记录编号",
"idPlaceholder":"请输入共享记录编号", "idPlaceholder": "请输入共享记录编号",
"resourceId":"资源ID", "resourceId": "资源ID",
"resourceIdPlaceholder":"请输入资源ID", "resourceIdPlaceholder": "请输入资源ID",
"userId":"用户ID(可为空)", "userId": "用户ID(可为空)",
"userIdPlaceholder":"请输入用户ID(可为空)", "userIdPlaceholder": "请输入用户ID(可为空)",
"roleId":"角色ID(可为空)", "roleId": "角色ID(可为空)",
"roleIdPlaceholder":"请输入角色ID(可为空)", "roleIdPlaceholder": "请输入角色ID(可为空)",
"sharedBy":"共享人ID", "sharedBy": "共享人ID",
"sharedByPlaceholder":"请输入共享人ID", "sharedByPlaceholder": "请输入共享人ID",
"sharedAt":"共享时间", "sharedAt": "共享时间",
"sharedAtPlaceholder":"请输入共享时间", "sharedAtPlaceholder": "请输入共享时间",
"addResourceSharing":"添加资源共享", "addResourceSharing": "添加资源共享",
"updateResourceSharing":"编辑资源共享", "updateResourceSharing": "编辑资源共享",
"resourceSharingDeleteTips":"确定要删除该数据吗?", "resourceSharingDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

62
admin/src/app/lang/zh-cn/salary.salary.json

@ -1,33 +1,33 @@
{ {
"id":"工资编号", "id": "工资编号",
"idPlaceholder":"请输入工资编号", "idPlaceholder": "请输入工资编号",
"staffId":"员工ID", "staffId": "员工ID",
"staffIdPlaceholder":"请输入员工ID", "staffIdPlaceholder": "请输入员工ID",
"baseSalary":"底薪", "baseSalary": "底薪",
"baseSalaryPlaceholder":"请输入底薪", "baseSalaryPlaceholder": "请输入底薪",
"performanceBonus":"绩效", "performanceBonus": "绩效",
"performanceBonusPlaceholder":"请输入绩效", "performanceBonusPlaceholder": "请输入绩效",
"deductions":"扣款", "deductions": "扣款",
"deductionsPlaceholder":"请输入扣款", "deductionsPlaceholder": "请输入扣款",
"otherSubsidies":"其他补贴", "otherSubsidies": "其他补贴",
"otherSubsidiesPlaceholder":"请输入其他补贴", "otherSubsidiesPlaceholder": "请输入其他补贴",
"netSalary":"实发工资", "netSalary": "实发工资",
"netSalaryPlaceholder":"请输入实发工资", "netSalaryPlaceholder": "请输入实发工资",
"paymentStatus":"发放状态", "paymentStatus": "发放状态",
"paymentStatusPlaceholder":"请输入发放状态", "paymentStatusPlaceholder": "请输入发放状态",
"paymentMethod":"发放方式", "paymentMethod": "发放方式",
"paymentMethodPlaceholder":"请输入发放方式", "paymentMethodPlaceholder": "请输入发放方式",
"remarks":"备注", "remarks": "备注",
"remarksPlaceholder":"请输入备注", "remarksPlaceholder": "请输入备注",
"salaryMonth":"工资月份", "salaryMonth": "工资月份",
"salaryMonthPlaceholder":"请输入工资月份", "salaryMonthPlaceholder": "请输入工资月份",
"departmentId":"部门ID", "departmentId": "部门ID",
"departmentIdPlaceholder":"请输入部门ID", "departmentIdPlaceholder": "请输入部门ID",
"processId":"关联的审批流程ID", "processId": "关联的审批流程ID",
"processIdPlaceholder":"请输入关联的审批流程ID", "processIdPlaceholder": "请输入关联的审批流程ID",
"addSalary":"添加工资", "addSalary": "添加工资",
"updateSalary":"编辑工资", "updateSalary": "编辑工资",
"salaryDeleteTips":"确定要删除该数据吗?", "salaryDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

54
admin/src/app/lang/zh-cn/service.service.json

@ -1,29 +1,29 @@
{ {
"id":"服务编号", "id": "服务编号",
"idPlaceholder":"请输入服务编号", "idPlaceholder": "请输入服务编号",
"serviceName":"服务名称", "serviceName": "服务名称",
"serviceNamePlaceholder":"请输入服务名称", "serviceNamePlaceholder": "请输入服务名称",
"previewImageUrl":"服务预览图URL", "previewImageUrl": "服务预览图URL",
"previewImageUrlPlaceholder":"请输入服务预览图URL", "previewImageUrlPlaceholder": "请输入服务预览图URL",
"description":"服务描述", "description": "服务描述",
"descriptionPlaceholder":"请输入服务描述", "descriptionPlaceholder": "请输入服务描述",
"serviceType":"服务类型", "serviceType": "服务类型",
"serviceTypePlaceholder":"请输入服务类型", "serviceTypePlaceholder": "请输入服务类型",
"executionRules":"服务执行规则", "executionRules": "服务执行规则",
"executionRulesPlaceholder":"请输入服务执行规则", "executionRulesPlaceholder": "请输入服务执行规则",
"staffReminder":"是否员工提醒: 1-是, 0-否", "staffReminder": "是否员工提醒: 1-是, 0-否",
"staffReminderPlaceholder":"请输入是否员工提醒: 1-是, 0-否", "staffReminderPlaceholder": "请输入是否员工提醒: 1-是, 0-否",
"customerReminder":"是否客户提醒: 1-是, 0-否", "customerReminder": "是否客户提醒: 1-是, 0-否",
"customerReminderPlaceholder":"请输入是否客户提醒: 1-是, 0-否", "customerReminderPlaceholder": "请输入是否客户提醒: 1-是, 0-否",
"customerConfirmation":"是否客户确认: 1-是, 0-否", "customerConfirmation": "是否客户确认: 1-是, 0-否",
"customerConfirmationPlaceholder":"请输入是否客户确认: 1-是, 0-否", "customerConfirmationPlaceholder": "请输入是否客户确认: 1-是, 0-否",
"customerFeedback":"客户反馈内容", "customerFeedback": "客户反馈内容",
"customerFeedbackPlaceholder":"请输入客户反馈内容", "customerFeedbackPlaceholder": "请输入客户反馈内容",
"status":"状态", "status": "状态",
"statusPlaceholder":"请输入状态", "statusPlaceholder": "请输入状态",
"addService":"添加服务", "addService": "添加服务",
"updateService":"编辑服务", "updateService": "编辑服务",
"serviceDeleteTips":"确定要删除该数据吗?", "serviceDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

66
admin/src/app/lang/zh-cn/six_speed.six_speed.json

@ -1,35 +1,35 @@
{ {
"id":"编号", "id": "编号",
"idPlaceholder":"请输入编号", "idPlaceholder": "请输入编号",
"purchasePower":"需求购买力", "purchasePower": "需求购买力",
"purchasePowerPlaceholder":"请输入需求购买力", "purchasePowerPlaceholder": "请输入需求购买力",
"conceptAwareness":"认知理念", "conceptAwareness": "认知理念",
"conceptAwarenessPlaceholder":"请输入认知理念", "conceptAwarenessPlaceholder": "请输入认知理念",
"preferredClassTime":"可选上课时间", "preferredClassTime": "可选上课时间",
"preferredClassTimePlaceholder":"请输入可选上课时间", "preferredClassTimePlaceholder": "请输入可选上课时间",
"distance":"距离", "distance": "距离",
"distancePlaceholder":"请输入距离", "distancePlaceholder": "请输入距离",
"communication":"沟通备注", "communication": "沟通备注",
"communicationPlaceholder":"请输入沟通备注", "communicationPlaceholder": "请输入沟通备注",
"promisedVisitTime":"承诺到访时间", "promisedVisitTime": "承诺到访时间",
"promisedVisitTimePlaceholder":"请输入承诺到访时间", "promisedVisitTimePlaceholder": "请输入承诺到访时间",
"actualVisitTime":"实际到访时间", "actualVisitTime": "实际到访时间",
"actualVisitTimePlaceholder":"请输入实际到访时间", "actualVisitTimePlaceholder": "请输入实际到访时间",
"callIntent":"电话后的意向程度: low-低, medium-中, high-高", "callIntent": "电话后的意向程度: low-低, medium-中, high-高",
"callIntentPlaceholder":"请输入电话后的意向程度: low-低, medium-中, high-高", "callIntentPlaceholder": "请输入电话后的意向程度: low-低, medium-中, high-高",
"firstVisitStatus":"一访情况", "firstVisitStatus": "一访情况",
"firstVisitStatusPlaceholder":"请输入一访情况", "firstVisitStatusPlaceholder": "请输入一访情况",
"secondVisitStatus":"二访情况", "secondVisitStatus": "二访情况",
"secondVisitStatusPlaceholder":"请输入二访情况", "secondVisitStatusPlaceholder": "请输入二访情况",
"isClosed":"是否关单: 1-是, 0-否", "isClosed": "是否关单: 1-是, 0-否",
"isClosedPlaceholder":"请输入是否关单: 1-是, 0-否", "isClosedPlaceholder": "请输入是否关单: 1-是, 0-否",
"staffId":"人员ID", "staffId": "人员ID",
"staffIdPlaceholder":"请输入人员ID", "staffIdPlaceholder": "请输入人员ID",
"resourceId":"资源ID", "resourceId": "资源ID",
"resourceIdPlaceholder":"请输入资源ID", "resourceIdPlaceholder": "请输入资源ID",
"addSixSpeed":"添加六一速", "addSixSpeed": "添加六一速",
"updateSixSpeed":"编辑六一速", "updateSixSpeed": "编辑六一速",
"sixSpeedDeleteTips":"确定要删除该数据吗?", "sixSpeedDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

34
admin/src/app/lang/zh-cn/six_speed_modification_log.six_speed_modification_log.json

@ -1,19 +1,19 @@
{ {
"id":"编号", "id": "编号",
"idPlaceholder":"请输入编号", "idPlaceholder": "请输入编号",
"campusId":"校区", "campusId": "校区",
"campusIdPlaceholder":"全部", "campusIdPlaceholder": "全部",
"staffId":"人员", "staffId": "人员",
"staffIdPlaceholder":"请输入人员", "staffIdPlaceholder": "请输入人员",
"modifiedField":"修改的字段", "modifiedField": "修改的字段",
"modifiedFieldPlaceholder":"请输入修改的字段", "modifiedFieldPlaceholder": "请输入修改的字段",
"oldValue":"修改前的值", "oldValue": "修改前的值",
"oldValuePlaceholder":"请输入修改前的值", "oldValuePlaceholder": "请输入修改前的值",
"newValue":"修改后的值", "newValue": "修改后的值",
"newValuePlaceholder":"请输入修改后的值", "newValuePlaceholder": "请输入修改后的值",
"addSixSpeedModificationLog":"添加六一速修改记录", "addSixSpeedModificationLog": "添加六一速修改记录",
"updateSixSpeedModificationLog":"编辑六一速修改记录", "updateSixSpeedModificationLog": "编辑六一速修改记录",
"sixSpeedModificationLogDeleteTips":"确定要删除该数据吗?", "sixSpeedModificationLogDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

142
admin/src/app/lang/zh-cn/stat_hour.stat_hour.json

@ -1,73 +1,73 @@
{ {
"id":"", "id": "",
"idPlaceholder":"请输入", "idPlaceholder": "请输入",
"addon":"插件", "addon": "插件",
"addonPlaceholder":"请输入插件", "addonPlaceholder": "请输入插件",
"field":"统计字段", "field": "统计字段",
"fieldPlaceholder":"请输入统计字段", "fieldPlaceholder": "请输入统计字段",
"fieldTotal":"总计", "fieldTotal": "总计",
"fieldTotalPlaceholder":"请输入总计", "fieldTotalPlaceholder": "请输入总计",
"year":"年", "year": "年",
"yearPlaceholder":"请输入年", "yearPlaceholder": "请输入年",
"month":"月", "month": "月",
"monthPlaceholder":"请输入月", "monthPlaceholder": "请输入月",
"day":"天", "day": "天",
"dayPlaceholder":"请输入天", "dayPlaceholder": "请输入天",
"startTime":"当日开始时间戳", "startTime": "当日开始时间戳",
"startTimePlaceholder":"请输入当日开始时间戳", "startTimePlaceholder": "请输入当日开始时间戳",
"lastTime":"最后执行时间", "lastTime": "最后执行时间",
"lastTimePlaceholder":"请输入最后执行时间", "lastTimePlaceholder": "请输入最后执行时间",
"hour0":"", "hour0": "",
"hour0Placeholder":"请输入", "hour0Placeholder": "请输入",
"hour1":"", "hour1": "",
"hour1Placeholder":"请输入", "hour1Placeholder": "请输入",
"hour2":"", "hour2": "",
"hour2Placeholder":"请输入", "hour2Placeholder": "请输入",
"hour3":"", "hour3": "",
"hour3Placeholder":"请输入", "hour3Placeholder": "请输入",
"hour4":"", "hour4": "",
"hour4Placeholder":"请输入", "hour4Placeholder": "请输入",
"hour5":"", "hour5": "",
"hour5Placeholder":"请输入", "hour5Placeholder": "请输入",
"hour6":"", "hour6": "",
"hour6Placeholder":"请输入", "hour6Placeholder": "请输入",
"hour7":"", "hour7": "",
"hour7Placeholder":"请输入", "hour7Placeholder": "请输入",
"hour8":"", "hour8": "",
"hour8Placeholder":"请输入", "hour8Placeholder": "请输入",
"hour9":"", "hour9": "",
"hour9Placeholder":"请输入", "hour9Placeholder": "请输入",
"hour10":"", "hour10": "",
"hour10Placeholder":"请输入", "hour10Placeholder": "请输入",
"hour11":"", "hour11": "",
"hour11Placeholder":"请输入", "hour11Placeholder": "请输入",
"hour12":"", "hour12": "",
"hour12Placeholder":"请输入", "hour12Placeholder": "请输入",
"hour13":"", "hour13": "",
"hour13Placeholder":"请输入", "hour13Placeholder": "请输入",
"hour14":"", "hour14": "",
"hour14Placeholder":"请输入", "hour14Placeholder": "请输入",
"hour15":"", "hour15": "",
"hour15Placeholder":"请输入", "hour15Placeholder": "请输入",
"hour16":"", "hour16": "",
"hour16Placeholder":"请输入", "hour16Placeholder": "请输入",
"hour17":"", "hour17": "",
"hour17Placeholder":"请输入", "hour17Placeholder": "请输入",
"hour18":"", "hour18": "",
"hour18Placeholder":"请输入", "hour18Placeholder": "请输入",
"hour19":"", "hour19": "",
"hour19Placeholder":"请输入", "hour19Placeholder": "请输入",
"hour20":"", "hour20": "",
"hour20Placeholder":"请输入", "hour20Placeholder": "请输入",
"hour21":"", "hour21": "",
"hour21Placeholder":"请输入", "hour21Placeholder": "请输入",
"hour22":"", "hour22": "",
"hour22Placeholder":"请输入", "hour22Placeholder": "请输入",
"hour23":"", "hour23": "",
"hour23Placeholder":"请输入", "hour23Placeholder": "请输入",
"addStatHour":"添加小时统计", "addStatHour": "添加小时统计",
"updateStatHour":"编辑小时统计", "updateStatHour": "编辑小时统计",
"statHourDeleteTips":"确定要删除该数据吗?", "statHourDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

26
admin/src/app/lang/zh-cn/student_course_usage.student_course_usage.json

@ -1,15 +1,15 @@
{ {
"id":"记录编号", "id": "记录编号",
"idPlaceholder":"请输入记录编号", "idPlaceholder": "请输入记录编号",
"studentCourseId":"学员课程ID(关联到student_courses表)", "studentCourseId": "学员课程ID(关联到student_courses表)",
"studentCourseIdPlaceholder":"请输入学员课程ID(关联到student_courses表)", "studentCourseIdPlaceholder": "请输入学员课程ID(关联到student_courses表)",
"usedHours":"本次使用的课时数", "usedHours": "本次使用的课时数",
"usedHoursPlaceholder":"请输入本次使用的课时数", "usedHoursPlaceholder": "请输入本次使用的课时数",
"usageDate":"课时使用日期", "usageDate": "课时使用日期",
"usageDatePlaceholder":"请输入课时使用日期", "usageDatePlaceholder": "请输入课时使用日期",
"addStudentCourseUsage":"添加学员课时消费记录", "addStudentCourseUsage": "添加学员课时消费记录",
"updateStudentCourseUsage":"编辑学员课时消费记录", "updateStudentCourseUsage": "编辑学员课时消费记录",
"studentCourseUsageDeleteTips":"确定要删除该数据吗?", "studentCourseUsageDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

38
admin/src/app/lang/zh-cn/student_courses.student_courses.json

@ -1,21 +1,21 @@
{ {
"id":"记录编号", "id": "记录编号",
"idPlaceholder":"请输入记录编号", "idPlaceholder": "请输入记录编号",
"studentId":"学员ID", "studentId": "学员ID",
"studentIdPlaceholder":"请输入学员ID", "studentIdPlaceholder": "请输入学员ID",
"courseId":"课程ID", "courseId": "课程ID",
"courseIdPlaceholder":"请输入课程ID", "courseIdPlaceholder": "请输入课程ID",
"totalHours":"总正式课时数", "totalHours": "总正式课时数",
"totalHoursPlaceholder":"请输入总正式课时数", "totalHoursPlaceholder": "请输入总正式课时数",
"giftHours":"赠送课时数", "giftHours": "赠送课时数",
"giftHoursPlaceholder":"请输入赠送课时数", "giftHoursPlaceholder": "请输入赠送课时数",
"startDate":"课程开始日期", "startDate": "课程开始日期",
"startDatePlaceholder":"请输入课程开始日期", "startDatePlaceholder": "请输入课程开始日期",
"endDate":"课程结束日期", "endDate": "课程结束日期",
"endDatePlaceholder":"请输入课程结束日期", "endDatePlaceholder": "请输入课程结束日期",
"addStudentCourses":"添加学员课程", "addStudentCourses": "添加学员课程",
"updateStudentCourses":"编辑学员课程", "updateStudentCourses": "编辑学员课程",
"studentCoursesDeleteTips":"确定要删除该数据吗?", "studentCoursesDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

26
admin/src/app/lang/zh-cn/user_feedback.user_feedback.json

@ -1,15 +1,15 @@
{ {
"id":"反馈编号", "id": "反馈编号",
"idPlaceholder":"请输入反馈编号", "idPlaceholder": "请输入反馈编号",
"userId":"用户ID", "userId": "用户ID",
"userIdPlaceholder":"请输入用户ID", "userIdPlaceholder": "请输入用户ID",
"feedbackText":"反馈内容", "feedbackText": "反馈内容",
"feedbackTextPlaceholder":"请输入反馈内容", "feedbackTextPlaceholder": "请输入反馈内容",
"attachmentUrl":"附件URL(OSS对象存储)", "attachmentUrl": "附件URL(OSS对象存储)",
"attachmentUrlPlaceholder":"请输入附件URL(OSS对象存储)", "attachmentUrlPlaceholder": "请输入附件URL(OSS对象存储)",
"addUserFeedback":"添加用户反馈信息", "addUserFeedback": "添加用户反馈信息",
"updateUserFeedback":"编辑用户反馈信息", "updateUserFeedback": "编辑用户反馈信息",
"userFeedbackDeleteTips":"确定要删除该数据吗?", "userFeedbackDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

46
admin/src/app/lang/zh-cn/venue.venue.json

@ -1,25 +1,25 @@
{ {
"id":"场地编号", "id": "场地编号",
"idPlaceholder":"请输入场地编号", "idPlaceholder": "请输入场地编号",
"campusId":"校区ID", "campusId": "校区ID",
"campusIdPlaceholder":"请输入校区ID", "campusIdPlaceholder": "请输入校区ID",
"venueName":"场地名称", "venueName": "场地名称",
"venueNamePlaceholder":"请输入场地名称", "venueNamePlaceholder": "请输入场地名称",
"capacity":"场地可容纳人数上限", "capacity": "场地可容纳人数上限",
"capacityPlaceholder":"请输入场地可容纳人数上限", "capacityPlaceholder": "请输入场地可容纳人数上限",
"availabilityStatus":"场地可用状态", "availabilityStatus": "场地可用状态",
"availabilityStatusPlaceholder":"请输入场地可用状态", "availabilityStatusPlaceholder": "请输入场地可用状态",
"timeRangeType":"场地可用时间范围类型", "timeRangeType": "场地可用时间范围类型",
"timeRangeTypePlaceholder":"请输入场地可用时间范围类型", "timeRangeTypePlaceholder": "请输入场地可用时间范围类型",
"timeRangeStart":"范围类型的开始时间", "timeRangeStart": "范围类型的开始时间",
"timeRangeStartPlaceholder":"请输入范围类型的开始时间", "timeRangeStartPlaceholder": "请输入范围类型的开始时间",
"timeRangeEnd":"范围类型的结束时间", "timeRangeEnd": "范围类型的结束时间",
"timeRangeEndPlaceholder":"请输入范围类型的结束时间", "timeRangeEndPlaceholder": "请输入范围类型的结束时间",
"fixedTimeRanges":"固定时间范围类型的可用时间, 存储为JSON数组", "fixedTimeRanges": "固定时间范围类型的可用时间, 存储为JSON数组",
"fixedTimeRangesPlaceholder":"请输入固定时间范围类型的可用时间, 存储为JSON数组", "fixedTimeRangesPlaceholder": "请输入固定时间范围类型的可用时间, 存储为JSON数组",
"addVenue":"添加场地", "addVenue": "添加场地",
"updateVenue":"编辑场地", "updateVenue": "编辑场地",
"venueDeleteTips":"确定要删除该数据吗?", "venueDeleteTips": "确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate": "请选择开始时间",
"endDate":"请选择结束时间" "endDate": "请选择结束时间"
} }

227
admin/src/app/views/attendance/attendance.vue

@ -1,90 +1,197 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addAttendance') }} {{ t('addAttendance') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="attendanceTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="attendanceTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-input v-model="attendanceTable.searchParam.campus_id" :placeholder="t('campusIdPlaceholder')" /> <el-input
v-model="attendanceTable.searchParam.campus_id"
:placeholder="t('campusIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('staffId')" prop="staff_id"> <el-form-item :label="t('staffId')" prop="staff_id">
<el-input v-model="attendanceTable.searchParam.staff_id" :placeholder="t('staffIdPlaceholder')" /> <el-input
v-model="attendanceTable.searchParam.staff_id"
:placeholder="t('staffIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('attendanceDate')" prop="attendance_date"> <el-form-item :label="t('attendanceDate')" prop="attendance_date">
<el-input v-model="attendanceTable.searchParam.attendance_date" :placeholder="t('attendanceDatePlaceholder')" /> <el-input
v-model="attendanceTable.searchParam.attendance_date"
:placeholder="t('attendanceDatePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('checkInTime')" prop="check_in_time"> <el-form-item :label="t('checkInTime')" prop="check_in_time">
<el-input v-model="attendanceTable.searchParam.check_in_time" :placeholder="t('checkInTimePlaceholder')" /> <el-input
v-model="attendanceTable.searchParam.check_in_time"
:placeholder="t('checkInTimePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('checkOutTime')" prop="check_out_time"> <el-form-item :label="t('checkOutTime')" prop="check_out_time">
<el-input v-model="attendanceTable.searchParam.check_out_time" :placeholder="t('checkOutTimePlaceholder')" /> <el-input
v-model="attendanceTable.searchParam.check_out_time"
:placeholder="t('checkOutTimePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('status')" prop="status"> <el-form-item :label="t('status')" prop="status">
<el-input v-model="attendanceTable.searchParam.status" :placeholder="t('statusPlaceholder')" /> <el-input
v-model="attendanceTable.searchParam.status"
:placeholder="t('statusPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('remarks')" prop="remarks"> <el-form-item :label="t('remarks')" prop="remarks">
<el-input v-model="attendanceTable.searchParam.remarks" :placeholder="t('remarksPlaceholder')" /> <el-input
v-model="attendanceTable.searchParam.remarks"
:placeholder="t('remarksPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('createdAt')" prop="created_at"> <el-form-item :label="t('createdAt')" prop="created_at">
<el-input v-model="attendanceTable.searchParam.created_at" :placeholder="t('createdAtPlaceholder')" /> <el-input
v-model="attendanceTable.searchParam.created_at"
:placeholder="t('createdAtPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('updatedAt')" prop="updated_at"> <el-form-item :label="t('updatedAt')" prop="updated_at">
<el-input v-model="attendanceTable.searchParam.updated_at" :placeholder="t('updatedAtPlaceholder')" /> <el-input
v-model="attendanceTable.searchParam.updated_at"
:placeholder="t('updatedAtPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('coordinate')" prop="coordinate"> <el-form-item :label="t('coordinate')" prop="coordinate">
<el-input v-model="attendanceTable.searchParam.coordinate" :placeholder="t('coordinatePlaceholder')" /> <el-input
v-model="attendanceTable.searchParam.coordinate"
:placeholder="t('coordinatePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadAttendanceList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadAttendanceList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="attendanceTable.data" size="large" v-loading="attendanceTable.loading"> <el-table
:data="attendanceTable.data"
size="large"
v-loading="attendanceTable.loading"
>
<template #empty> <template #empty>
<span>{{ !attendanceTable.loading ? t('emptyData') : '' }}</span> <span>{{ !attendanceTable.loading ? t('emptyData') : '' }}</span>
</template> </template>
<el-table-column prop="campus_id" :label="t('campusId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="campus_id"
:label="t('campusId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="staff_id" :label="t('staffId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="staff_id"
:label="t('staffId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="attendance_date" :label="t('attendanceDate')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="attendance_date"
:label="t('attendanceDate')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="check_in_time" :label="t('checkInTime')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="check_in_time"
:label="t('checkInTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="check_out_time" :label="t('checkOutTime')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="check_out_time"
:label="t('checkOutTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="status" :label="t('status')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="status"
:label="t('status')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="remarks" :label="t('remarks')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="remarks"
:label="t('remarks')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="created_at" :label="t('createdAt')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="created_at"
:label="t('createdAt')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="updated_at" :label="t('updatedAt')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="updated_at"
:label="t('updatedAt')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="coordinate" :label="t('coordinate')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="coordinate"
:label="t('coordinate')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="attendanceTable.page" v-model:page-size="attendanceTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="attendanceTable.total" v-model:current-page="attendanceTable.page"
@size-change="loadAttendanceList()" @current-change="loadAttendanceList" /> v-model:page-size="attendanceTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="attendanceTable.total"
@size-change="loadAttendanceList()"
@current-change="loadAttendanceList"
/>
</div> </div>
</div> </div>
@ -99,11 +206,11 @@ import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getAttendanceList, deleteAttendance } from '@/app/api/attendance' import { getAttendanceList, deleteAttendance } from '@/app/api/attendance'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/attendance/components/attendance-edit.vue' import Edit from '@/app/views/attendance/components/attendance-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let attendanceTable = reactive({ let attendanceTable = reactive({
page: 1, page: 1,
@ -111,18 +218,18 @@ let attendanceTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"campus_id":"", campus_id: '',
"staff_id":"", staff_id: '',
"attendance_date":"", attendance_date: '',
"check_in_time":"", check_in_time: '',
"check_out_time":"", check_out_time: '',
"status":"", status: '',
"remarks":"", remarks: '',
"created_at":"", created_at: '',
"updated_at":"", updated_at: '',
"coordinate":"" coordinate: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -132,7 +239,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取考勤列表 * 获取考勤列表
*/ */
@ -143,12 +249,14 @@ const loadAttendanceList = (page: number = 1) => {
getAttendanceList({ getAttendanceList({
page: attendanceTable.page, page: attendanceTable.page,
limit: attendanceTable.limit, limit: attendanceTable.limit,
...attendanceTable.searchParam ...attendanceTable.searchParam,
}).then(res => { })
.then((res) => {
attendanceTable.loading = false attendanceTable.loading = false
attendanceTable.data = res.data.data attendanceTable.data = res.data.data
attendanceTable.total = res.data.total attendanceTable.total = res.data.total
}).catch(() => { })
.catch(() => {
attendanceTable.loading = false attendanceTable.loading = false
}) })
} }
@ -177,22 +285,19 @@ const editEvent = (data: any) => {
* 删除考勤 * 删除考勤
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('attendanceDeleteTips'), t('warning'), ElMessageBox.confirm(t('attendanceDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteAttendance(id)
deleteAttendance(id).then(() => { .then(() => {
loadAttendanceList() loadAttendanceList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
@ -209,5 +314,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

191
admin/src/app/views/attendance/components/attendance-edit.vue

@ -1,54 +1,119 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateAttendance') : t('addAttendance')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="formData.id ? t('updateAttendance') : t('addAttendance')"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-input v-model="formData.campus_id" clearable :placeholder="t('campusIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.campus_id"
clearable
:placeholder="t('campusIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('staffId')" prop="staff_id"> <el-form-item :label="t('staffId')" prop="staff_id">
<el-input v-model="formData.staff_id" clearable :placeholder="t('staffIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.staff_id"
clearable
:placeholder="t('staffIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('attendanceDate')" prop="attendance_date"> <el-form-item :label="t('attendanceDate')" prop="attendance_date">
<el-input v-model="formData.attendance_date" clearable :placeholder="t('attendanceDatePlaceholder')" class="input-width" /> <el-input
v-model="formData.attendance_date"
clearable
:placeholder="t('attendanceDatePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('checkInTime')" > <el-form-item :label="t('checkInTime')">
<el-input v-model="formData.check_in_time" clearable :placeholder="t('checkInTimePlaceholder')" class="input-width" /> <el-input
v-model="formData.check_in_time"
clearable
:placeholder="t('checkInTimePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('checkOutTime')" > <el-form-item :label="t('checkOutTime')">
<el-input v-model="formData.check_out_time" clearable :placeholder="t('checkOutTimePlaceholder')" class="input-width" /> <el-input
v-model="formData.check_out_time"
clearable
:placeholder="t('checkOutTimePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('status')" prop="status"> <el-form-item :label="t('status')" prop="status">
<el-input v-model="formData.status" clearable :placeholder="t('statusPlaceholder')" class="input-width" /> <el-input
v-model="formData.status"
clearable
:placeholder="t('statusPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('remarks')" > <el-form-item :label="t('remarks')">
<el-input v-model="formData.remarks" clearable :placeholder="t('remarksPlaceholder')" class="input-width" /> <el-input
v-model="formData.remarks"
clearable
:placeholder="t('remarksPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('createdAt')" > <el-form-item :label="t('createdAt')">
<el-input v-model="formData.created_at" clearable :placeholder="t('createdAtPlaceholder')" class="input-width" /> <el-input
v-model="formData.created_at"
clearable
:placeholder="t('createdAtPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('updatedAt')" > <el-form-item :label="t('updatedAt')">
<el-input v-model="formData.updated_at" clearable :placeholder="t('updatedAtPlaceholder')" class="input-width" /> <el-input
v-model="formData.updated_at"
clearable
:placeholder="t('updatedAtPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('coordinate')" > <el-form-item :label="t('coordinate')">
<el-input v-model="formData.coordinate" clearable :placeholder="t('coordinatePlaceholder')" class="input-width" /> <el-input
v-model="formData.coordinate"
clearable
:placeholder="t('coordinatePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -59,7 +124,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addAttendance, editAttendance, getAttendanceInfo } from '@/app/api/attendance' import {
addAttendance,
editAttendance,
getAttendanceInfo,
} from '@/app/api/attendance'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -89,54 +158,42 @@ const formRules = computed(() => {
return { return {
campus_id: [ campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
],
]
,
staff_id: [ staff_id: [
{ required: true, message: t('staffIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('staffIdPlaceholder'), trigger: 'blur' },
],
]
,
attendance_date: [ attendance_date: [
{ required: true, message: t('attendanceDatePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('attendanceDatePlaceholder'),
, trigger: 'blur',
},
],
check_in_time: [ check_in_time: [
{ required: true, message: t('checkInTimePlaceholder'), trigger: 'blur' }, { required: true, message: t('checkInTimePlaceholder'), trigger: 'blur' },
],
]
,
check_out_time: [ check_out_time: [
{ required: true, message: t('checkOutTimePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('checkOutTimePlaceholder'),
, trigger: 'blur',
},
],
status: [ status: [
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, { required: true, message: t('statusPlaceholder'), trigger: 'blur' },
],
]
,
remarks: [ remarks: [
{ required: true, message: t('remarksPlaceholder'), trigger: 'blur' }, { required: true, message: t('remarksPlaceholder'), trigger: 'blur' },
],
]
,
created_at: [ created_at: [
{ required: true, message: t('createdAtPlaceholder'), trigger: 'blur' }, { required: true, message: t('createdAtPlaceholder'), trigger: 'blur' },
],
]
,
updated_at: [ updated_at: [
{ required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' }, { required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' },
],
]
,
coordinate: [ coordinate: [
{ required: true, message: t('coordinatePlaceholder'), trigger: 'blur' }, { required: true, message: t('coordinatePlaceholder'), trigger: 'blur' },
],
]
,
} }
}) })
@ -156,11 +213,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -169,14 +228,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if(row){ if (row) {
const data = await (await getAttendanceInfo(row.id)).data const data = await (await getAttendanceInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -194,7 +252,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -221,13 +284,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label{ .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

152
admin/src/app/views/campus/campus.vue

@ -1,25 +1,42 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addCampus') }} {{ t('addCampus') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="campusTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="campusTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('campusName')" prop="campus_name"> <el-form-item :label="t('campusName')" prop="campus_name">
<el-input v-model="campusTable.searchParam.campus_name" :placeholder="t('campusNamePlaceholder')" /> <el-input
v-model="campusTable.searchParam.campus_name"
:placeholder="t('campusNamePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('campusAddress')" prop="campus_address"> <el-form-item :label="t('campusAddress')" prop="campus_address">
<el-input v-model="campusTable.searchParam.campus_address" :placeholder="t('campusAddressPlaceholder')" /> <el-input
v-model="campusTable.searchParam.campus_address"
:placeholder="t('campusAddressPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('campusStatus')" prop="campus_status"> <el-form-item :label="t('campusStatus')" prop="campus_status">
<el-select class="w-[280px]" v-model="campusTable.searchParam.campus_status" clearable :placeholder="t('campusStatusPlaceholder')"> <el-select
class="w-[280px]"
v-model="campusTable.searchParam.campus_status"
clearable
:placeholder="t('campusStatusPlaceholder')"
>
<el-option label="全部" value=""></el-option> <el-option label="全部" value=""></el-option>
<el-option <el-option
v-for="(item, index) in campus_statusList" v-for="(item, index) in campus_statusList"
@ -31,43 +48,85 @@
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadCampusList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadCampusList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="campusTable.data" size="large" v-loading="campusTable.loading"> <el-table
:data="campusTable.data"
size="large"
v-loading="campusTable.loading"
>
<template #empty> <template #empty>
<span>{{ !campusTable.loading ? t('emptyData') : '' }}</span> <span>{{ !campusTable.loading ? t('emptyData') : '' }}</span>
</template> </template>
<el-table-column prop="campus_name" :label="t('campusName')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="campus_name"
:label="t('campusName')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="campus_address" :label="t('campusAddress')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="campus_address"
:label="t('campusAddress')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('campusStatus')" min-width="180" align="center" :show-overflow-tooltip="true"> <el-table-column
:label="t('campusStatus')"
min-width="180"
align="center"
:show-overflow-tooltip="true"
>
<template #default="{ row }"> <template #default="{ row }">
<div v-for="(item, index) in campus_statusList"> <div v-for="(item, index) in campus_statusList">
<div v-if="item.value == row.campus_status">{{ item.name }}</div> <div v-if="item.value == row.campus_status">
{{ item.name }}
</div>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="create_time" :label="t('createTime')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="create_time"
:label="t('createTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="campusTable.page" v-model:page-size="campusTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="campusTable.total" v-model:current-page="campusTable.page"
@size-change="loadCampusList()" @current-change="loadCampusList" /> v-model:page-size="campusTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="campusTable.total"
@size-change="loadCampusList()"
@current-change="loadCampusList"
/>
</div> </div>
</div> </div>
@ -82,11 +141,11 @@ import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getCampusList, deleteCampus } from '@/app/api/campus' import { getCampusList, deleteCampus } from '@/app/api/campus'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/campus/components/campus-edit.vue' import Edit from '@/app/views/campus/components/campus-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let campusTable = reactive({ let campusTable = reactive({
page: 1, page: 1,
@ -94,11 +153,11 @@ let campusTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"campus_name":"", campus_name: '',
"campus_address":"", campus_address: '',
"campus_status":"" campus_status: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -107,11 +166,13 @@ const searchFormRef = ref<FormInstance>()
const selectData = ref<any[]>([]) const selectData = ref<any[]>([])
// //
const campus_statusList = ref([] as any[]) const campus_statusList = ref([] as any[])
const campus_statusDictList = async () => { const campus_statusDictList = async () => {
campus_statusList.value = await (await useDictionary('campus_status')).data.dictionary campus_statusList.value = await (
} await useDictionary('campus_status')
campus_statusDictList(); ).data.dictionary
}
campus_statusDictList()
/** /**
* 获取校区列表 * 获取校区列表
@ -123,12 +184,14 @@ const loadCampusList = (page: number = 1) => {
getCampusList({ getCampusList({
page: campusTable.page, page: campusTable.page,
limit: campusTable.limit, limit: campusTable.limit,
...campusTable.searchParam ...campusTable.searchParam,
}).then(res => { })
.then((res) => {
campusTable.loading = false campusTable.loading = false
campusTable.data = res.data.data campusTable.data = res.data.data
campusTable.total = res.data.total campusTable.total = res.data.total
}).catch(() => { })
.catch(() => {
campusTable.loading = false campusTable.loading = false
}) })
} }
@ -157,22 +220,19 @@ const editEvent = (data: any) => {
* 删除校区 * 删除校区
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('campusDeleteTips'), t('warning'), ElMessageBox.confirm(t('campusDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteCampus(id)
deleteCampus(id).then(() => { .then(() => {
loadCampusList() loadCampusList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
@ -189,5 +249,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

203
admin/src/app/views/campus_person_role/campus_person_role.vue

@ -1,19 +1,29 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addCampusPersonRole') }} {{ t('addCampusPersonRole') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="campusPersonRoleTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="campusPersonRoleTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-select class="w-[280px]" v-model="campusPersonRoleTable.searchParam.campus_id" clearable :placeholder="t('campusIdPlaceholder')"> <el-select
class="w-[280px]"
v-model="campusPersonRoleTable.searchParam.campus_id"
clearable
:placeholder="t('campusIdPlaceholder')"
>
<el-option <el-option
v-for="(item, index) in campusIdList" v-for="(item, index) in campusIdList"
:key="index" :key="index"
@ -23,9 +33,13 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('personId')" prop="person_id"> <el-form-item :label="t('personId')" prop="person_id">
<el-select class="w-[280px]" v-model="campusPersonRoleTable.searchParam.person_id" clearable :placeholder="t('personIdPlaceholder')"> <el-select
class="w-[280px]"
v-model="campusPersonRoleTable.searchParam.person_id"
clearable
:placeholder="t('personIdPlaceholder')"
>
<el-option <el-option
v-for="(item, index) in personIdList" v-for="(item, index) in personIdList"
:key="index" :key="index"
@ -35,9 +49,13 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('roleId')" prop="role_id"> <el-form-item :label="t('roleId')" prop="role_id">
<el-select class="w-[280px]" v-model="campusPersonRoleTable.searchParam.role_id" clearable :placeholder="t('roleIdPlaceholder')"> <el-select
class="w-[280px]"
v-model="campusPersonRoleTable.searchParam.role_id"
clearable
:placeholder="t('roleIdPlaceholder')"
>
<el-option <el-option
v-for="(item, index) in roleIdList" v-for="(item, index) in roleIdList"
:key="index" :key="index"
@ -47,9 +65,13 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('deptId')" prop="dept_id"> <el-form-item :label="t('deptId')" prop="dept_id">
<el-select class="w-[280px]" v-model="campusPersonRoleTable.searchParam.dept_id" clearable :placeholder="t('deptIdPlaceholder')"> <el-select
class="w-[280px]"
v-model="campusPersonRoleTable.searchParam.dept_id"
clearable
:placeholder="t('deptIdPlaceholder')"
>
<el-option <el-option
v-for="(item, index) in deptIdList" v-for="(item, index) in deptIdList"
:key="index" :key="index"
@ -60,41 +82,86 @@
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadCampusPersonRoleList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadCampusPersonRoleList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="campusPersonRoleTable.data" size="large" v-loading="campusPersonRoleTable.loading"> <el-table
:data="campusPersonRoleTable.data"
size="large"
v-loading="campusPersonRoleTable.loading"
>
<template #empty> <template #empty>
<span>{{ !campusPersonRoleTable.loading ? t('emptyData') : '' }}</span> <span>{{
!campusPersonRoleTable.loading ? t('emptyData') : ''
}}</span>
</template> </template>
<el-table-column prop="campus_id_name" :label="t('campusId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="campus_id_name"
:label="t('campusId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="person_id_name" :label="t('personId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="person_id_name"
:label="t('personId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="role_id_name" :label="t('roleId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="role_id_name"
:label="t('roleId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="dept_id_name" :label="t('deptId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="dept_id_name"
:label="t('deptId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="campusPersonRoleTable.page" v-model:page-size="campusPersonRoleTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="campusPersonRoleTable.total" v-model:current-page="campusPersonRoleTable.page"
@size-change="loadCampusPersonRoleList()" @current-change="loadCampusPersonRoleList" /> v-model:page-size="campusPersonRoleTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="campusPersonRoleTable.total"
@size-change="loadCampusPersonRoleList()"
@current-change="loadCampusPersonRoleList"
/>
</div> </div>
</div> </div>
<edit ref="editCampusPersonRoleDialog" @complete="loadCampusPersonRoleList" /> <edit
ref="editCampusPersonRoleDialog"
@complete="loadCampusPersonRoleList"
/>
</el-card> </el-card>
</div> </div>
</template> </template>
@ -103,13 +170,20 @@
import { reactive, ref, watch } from 'vue' import { reactive, ref, watch } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getCampusPersonRoleList, deleteCampusPersonRole, getWithCampusList, getWithPersonnelList, getWithSysRoleList, getWithDepartmentsList } from '@/app/api/campus_person_role' import {
getCampusPersonRoleList,
deleteCampusPersonRole,
getWithCampusList,
getWithPersonnelList,
getWithSysRoleList,
getWithDepartmentsList,
} from '@/app/api/campus_person_role'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/campus_person_role/components/campus-person-role-edit.vue' import Edit from '@/app/views/campus_person_role/components/campus-person-role-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let campusPersonRoleTable = reactive({ let campusPersonRoleTable = reactive({
page: 1, page: 1,
@ -117,12 +191,12 @@ let campusPersonRoleTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"campus_id":"", campus_id: '',
"person_id":"", person_id: '',
"role_id":"", role_id: '',
"dept_id":"" dept_id: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -132,7 +206,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取角色关系列表 * 获取角色关系列表
*/ */
@ -143,12 +216,14 @@ const loadCampusPersonRoleList = (page: number = 1) => {
getCampusPersonRoleList({ getCampusPersonRoleList({
page: campusPersonRoleTable.page, page: campusPersonRoleTable.page,
limit: campusPersonRoleTable.limit, limit: campusPersonRoleTable.limit,
...campusPersonRoleTable.searchParam ...campusPersonRoleTable.searchParam,
}).then(res => { })
.then((res) => {
campusPersonRoleTable.loading = false campusPersonRoleTable.loading = false
campusPersonRoleTable.data = res.data.data campusPersonRoleTable.data = res.data.data
campusPersonRoleTable.total = res.data.total campusPersonRoleTable.total = res.data.total
}).catch(() => { })
.catch(() => {
campusPersonRoleTable.loading = false campusPersonRoleTable.loading = false
}) })
} }
@ -177,41 +252,39 @@ const editEvent = (data: any) => {
* 删除角色关系 * 删除角色关系
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('campusPersonRoleDeleteTips'), t('warning'), ElMessageBox.confirm(t('campusPersonRoleDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteCampusPersonRole(id)
deleteCampusPersonRole(id).then(() => { .then(() => {
loadCampusPersonRoleList() loadCampusPersonRoleList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const campusIdList = ref([])
const campusIdList = ref([]) const setCampusIdList = async () => {
const setCampusIdList = async () => {
campusIdList.value = await (await getWithCampusList({})).data campusIdList.value = await (await getWithCampusList({})).data
} }
setCampusIdList() setCampusIdList()
const personIdList = ref([]) const personIdList = ref([])
const setPersonIdList = async () => { const setPersonIdList = async () => {
personIdList.value = await (await getWithPersonnelList({})).data personIdList.value = await (await getWithPersonnelList({})).data
} }
setPersonIdList() setPersonIdList()
const roleIdList = ref([]) const roleIdList = ref([])
const setRoleIdList = async () => { const setRoleIdList = async () => {
roleIdList.value = await (await getWithSysRoleList({})).data roleIdList.value = await (await getWithSysRoleList({})).data
} }
setRoleIdList() setRoleIdList()
const deptIdList = ref([]) const deptIdList = ref([])
const setDeptIdList = async () => { const setDeptIdList = async () => {
deptIdList.value = await (await getWithDepartmentsList({})).data deptIdList.value = await (await getWithDepartmentsList({})).data
} }
setDeptIdList() setDeptIdList()
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
@ -229,5 +302,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

141
admin/src/app/views/campus_person_role/components/campus-person-role-edit.vue

@ -1,8 +1,28 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateCampusPersonRole') : t('addCampusPersonRole')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="
formData.id ? t('updateCampusPersonRole') : t('addCampusPersonRole')
"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-select class="input-width" v-model="formData.campus_id" clearable :placeholder="t('campusIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.campus_id"
clearable
:placeholder="t('campusIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in campusIdList" v-for="(item, index) in campusIdList"
@ -14,7 +34,12 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('personId')" prop="person_id"> <el-form-item :label="t('personId')" prop="person_id">
<el-select class="input-width" v-model="formData.person_id" clearable :placeholder="t('personIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.person_id"
clearable
:placeholder="t('personIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in personIdList" v-for="(item, index) in personIdList"
@ -26,7 +51,12 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('roleId')" prop="role_id"> <el-form-item :label="t('roleId')" prop="role_id">
<el-select class="input-width" v-model="formData.role_id" clearable :placeholder="t('roleIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.role_id"
clearable
:placeholder="t('roleIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in roleIdList" v-for="(item, index) in roleIdList"
@ -37,8 +67,13 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('deptId')" > <el-form-item :label="t('deptId')">
<el-select class="input-width" v-model="formData.dept_id" clearable :placeholder="t('deptIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.dept_id"
clearable
:placeholder="t('deptIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in deptIdList" v-for="(item, index) in deptIdList"
@ -48,15 +83,17 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -67,7 +104,15 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addCampusPersonRole, editCampusPersonRole, getCampusPersonRoleInfo, getWithCampusList, getWithPersonnelList, getWithSysRoleList, getWithDepartmentsList } from '@/app/api/campus_person_role' import {
addCampusPersonRole,
editCampusPersonRole,
getCampusPersonRoleInfo,
getWithCampusList,
getWithPersonnelList,
getWithSysRoleList,
getWithDepartmentsList,
} from '@/app/api/campus_person_role'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -91,24 +136,16 @@ const formRules = computed(() => {
return { return {
campus_id: [ campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
],
]
,
person_id: [ person_id: [
{ required: true, message: t('personIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('personIdPlaceholder'), trigger: 'blur' },
],
]
,
role_id: [ role_id: [
{ required: true, message: t('roleIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('roleIdPlaceholder'), trigger: 'blur' },
],
]
,
dept_id: [ dept_id: [
{ required: true, message: t('deptIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('deptIdPlaceholder'), trigger: 'blur' },
],
]
,
} }
}) })
@ -128,11 +165,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -141,34 +180,33 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const campusIdList = ref([] as any[])
const setCampusIdList = async () => {
const campusIdList = ref([] as any[])
const setCampusIdList = async () => {
campusIdList.value = await (await getWithCampusList({})).data campusIdList.value = await (await getWithCampusList({})).data
} }
setCampusIdList() setCampusIdList()
const personIdList = ref([] as any[]) const personIdList = ref([] as any[])
const setPersonIdList = async () => { const setPersonIdList = async () => {
personIdList.value = await (await getWithPersonnelList({})).data personIdList.value = await (await getWithPersonnelList({})).data
} }
setPersonIdList() setPersonIdList()
const roleIdList = ref([] as any[]) const roleIdList = ref([] as any[])
const setRoleIdList = async () => { const setRoleIdList = async () => {
roleIdList.value = await (await getWithSysRoleList({})).data roleIdList.value = await (await getWithSysRoleList({})).data
} }
setRoleIdList() setRoleIdList()
const deptIdList = ref([] as any[]) const deptIdList = ref([] as any[])
const setDeptIdList = async () => { const setDeptIdList = async () => {
deptIdList.value = await (await getWithDepartmentsList({})).data deptIdList.value = await (await getWithDepartmentsList({})).data
} }
setDeptIdList() setDeptIdList()
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if(row){ if (row) {
const data = await (await getCampusPersonRoleInfo(row.id)).data const data = await (await getCampusPersonRoleInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -186,7 +224,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -213,13 +256,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label{ .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

295
admin/src/app/views/class/class.vue

@ -1,105 +1,236 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addClass') }} {{ t('addClass') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="classTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="classTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-input v-model="classTable.searchParam.campus_id" :placeholder="t('campusIdPlaceholder')" /> <el-input
v-model="classTable.searchParam.campus_id"
:placeholder="t('campusIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('campusName')" prop="campus_name"> <el-form-item :label="t('campusName')" prop="campus_name">
<el-input v-model="classTable.searchParam.campus_name" :placeholder="t('campusNamePlaceholder')" /> <el-input
v-model="classTable.searchParam.campus_name"
:placeholder="t('campusNamePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('className')" prop="class_name"> <el-form-item :label="t('className')" prop="class_name">
<el-input v-model="classTable.searchParam.class_name" :placeholder="t('classNamePlaceholder')" /> <el-input
v-model="classTable.searchParam.class_name"
:placeholder="t('classNamePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('headCoach')" prop="head_coach"> <el-form-item :label="t('headCoach')" prop="head_coach">
<el-input v-model="classTable.searchParam.head_coach" :placeholder="t('headCoachPlaceholder')" /> <el-input
v-model="classTable.searchParam.head_coach"
:placeholder="t('headCoachPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('ageGroup')" prop="age_group"> <el-form-item :label="t('ageGroup')" prop="age_group">
<el-input v-model="classTable.searchParam.age_group" :placeholder="t('ageGroupPlaceholder')" /> <el-input
v-model="classTable.searchParam.age_group"
:placeholder="t('ageGroupPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('classType')" prop="class_type"> <el-form-item :label="t('classType')" prop="class_type">
<el-input v-model="classTable.searchParam.class_type" :placeholder="t('classTypePlaceholder')" /> <el-input
v-model="classTable.searchParam.class_type"
:placeholder="t('classTypePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('assistantCoach')" prop="assistant_coach"> <el-form-item :label="t('assistantCoach')" prop="assistant_coach">
<el-input v-model="classTable.searchParam.assistant_coach" :placeholder="t('assistantCoachPlaceholder')" /> <el-input
v-model="classTable.searchParam.assistant_coach"
:placeholder="t('assistantCoachPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('createdAt')" prop="created_at"> <el-form-item :label="t('createdAt')" prop="created_at">
<el-input v-model="classTable.searchParam.created_at" :placeholder="t('createdAtPlaceholder')" /> <el-input
v-model="classTable.searchParam.created_at"
:placeholder="t('createdAtPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('updatedAt')" prop="updated_at"> <el-form-item :label="t('updatedAt')" prop="updated_at">
<el-input v-model="classTable.searchParam.updated_at" :placeholder="t('updatedAtPlaceholder')" /> <el-input
v-model="classTable.searchParam.updated_at"
:placeholder="t('updatedAtPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('deletedAt')" prop="deleted_at"> <el-form-item :label="t('deletedAt')" prop="deleted_at">
<el-input v-model="classTable.searchParam.deleted_at" :placeholder="t('deletedAtPlaceholder')" /> <el-input
v-model="classTable.searchParam.deleted_at"
:placeholder="t('deletedAtPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('status')" prop="status"> <el-form-item :label="t('status')" prop="status">
<el-input v-model="classTable.searchParam.status" :placeholder="t('statusPlaceholder')" /> <el-input
v-model="classTable.searchParam.status"
:placeholder="t('statusPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('sortOrder')" prop="sort_order"> <el-form-item :label="t('sortOrder')" prop="sort_order">
<el-input v-model="classTable.searchParam.sort_order" :placeholder="t('sortOrderPlaceholder')" /> <el-input
v-model="classTable.searchParam.sort_order"
:placeholder="t('sortOrderPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('remarks')" prop="remarks"> <el-form-item :label="t('remarks')" prop="remarks">
<el-input v-model="classTable.searchParam.remarks" :placeholder="t('remarksPlaceholder')" /> <el-input
v-model="classTable.searchParam.remarks"
:placeholder="t('remarksPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadClassList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadClassList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="classTable.data" size="large" v-loading="classTable.loading"> <el-table
:data="classTable.data"
size="large"
v-loading="classTable.loading"
>
<template #empty> <template #empty>
<span>{{ !classTable.loading ? t('emptyData') : '' }}</span> <span>{{ !classTable.loading ? t('emptyData') : '' }}</span>
</template> </template>
<el-table-column prop="campus_id" :label="t('campusId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="campus_id"
<el-table-column prop="campus_name" :label="t('campusName')" min-width="120" :show-overflow-tooltip="true"/> :label="t('campusId')"
min-width="120"
<el-table-column prop="class_name" :label="t('className')" min-width="120" :show-overflow-tooltip="true"/> :show-overflow-tooltip="true"
/>
<el-table-column prop="head_coach" :label="t('headCoach')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
<el-table-column prop="age_group" :label="t('ageGroup')" min-width="120" :show-overflow-tooltip="true"/> prop="campus_name"
:label="t('campusName')"
<el-table-column prop="class_type" :label="t('classType')" min-width="120" :show-overflow-tooltip="true"/> min-width="120"
:show-overflow-tooltip="true"
<el-table-column prop="assistant_coach" :label="t('assistantCoach')" min-width="120" :show-overflow-tooltip="true"/> />
<el-table-column prop="created_at" :label="t('createdAt')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="class_name"
<el-table-column prop="updated_at" :label="t('updatedAt')" min-width="120" :show-overflow-tooltip="true"/> :label="t('className')"
min-width="120"
<el-table-column prop="deleted_at" :label="t('deletedAt')" min-width="120" :show-overflow-tooltip="true"/> :show-overflow-tooltip="true"
/>
<el-table-column prop="status" :label="t('status')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
<el-table-column prop="sort_order" :label="t('sortOrder')" min-width="120" :show-overflow-tooltip="true"/> prop="head_coach"
:label="t('headCoach')"
<el-table-column prop="remarks" :label="t('remarks')" min-width="120" :show-overflow-tooltip="true"/> min-width="120"
:show-overflow-tooltip="true"
<el-table-column :label="t('operation')" fixed="right" min-width="120"> />
<el-table-column
prop="age_group"
:label="t('ageGroup')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="class_type"
:label="t('classType')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="assistant_coach"
:label="t('assistantCoach')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="created_at"
:label="t('createdAt')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="updated_at"
:label="t('updatedAt')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="deleted_at"
:label="t('deletedAt')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="status"
:label="t('status')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="sort_order"
:label="t('sortOrder')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="remarks"
:label="t('remarks')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="classTable.page" v-model:page-size="classTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="classTable.total" v-model:current-page="classTable.page"
@size-change="loadClassList()" @current-change="loadClassList" /> v-model:page-size="classTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="classTable.total"
@size-change="loadClassList()"
@current-change="loadClassList"
/>
</div> </div>
</div> </div>
@ -114,11 +245,11 @@ import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getClassList, deleteClass } from '@/app/api/class' import { getClassList, deleteClass } from '@/app/api/class'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/class/components/class-edit.vue' import Edit from '@/app/views/class/components/class-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let classTable = reactive({ let classTable = reactive({
page: 1, page: 1,
@ -126,21 +257,21 @@ let classTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"campus_id":"", campus_id: '',
"campus_name":"", campus_name: '',
"class_name":"", class_name: '',
"head_coach":"", head_coach: '',
"age_group":"", age_group: '',
"class_type":"", class_type: '',
"assistant_coach":"", assistant_coach: '',
"created_at":"", created_at: '',
"updated_at":"", updated_at: '',
"deleted_at":"", deleted_at: '',
"status":"", status: '',
"sort_order":"", sort_order: '',
"remarks":"" remarks: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -150,7 +281,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取班级列表 * 获取班级列表
*/ */
@ -161,12 +291,14 @@ const loadClassList = (page: number = 1) => {
getClassList({ getClassList({
page: classTable.page, page: classTable.page,
limit: classTable.limit, limit: classTable.limit,
...classTable.searchParam ...classTable.searchParam,
}).then(res => { })
.then((res) => {
classTable.loading = false classTable.loading = false
classTable.data = res.data.data classTable.data = res.data.data
classTable.total = res.data.total classTable.total = res.data.total
}).catch(() => { })
.catch(() => {
classTable.loading = false classTable.loading = false
}) })
} }
@ -195,22 +327,19 @@ const editEvent = (data: any) => {
* 删除班级 * 删除班级
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('classDeleteTips'), t('warning'), ElMessageBox.confirm(t('classDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteClass(id)
deleteClass(id).then(() => { .then(() => {
loadClassList() loadClassList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
@ -227,5 +356,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

208
admin/src/app/views/class/components/class-edit.vue

@ -1,66 +1,146 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateClass') : t('addClass')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="formData.id ? t('updateClass') : t('addClass')"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-input v-model="formData.campus_id" clearable :placeholder="t('campusIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.campus_id"
clearable
:placeholder="t('campusIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('campusName')" prop="campus_name"> <el-form-item :label="t('campusName')" prop="campus_name">
<el-input v-model="formData.campus_name" clearable :placeholder="t('campusNamePlaceholder')" class="input-width" /> <el-input
v-model="formData.campus_name"
clearable
:placeholder="t('campusNamePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('className')" prop="class_name"> <el-form-item :label="t('className')" prop="class_name">
<el-input v-model="formData.class_name" clearable :placeholder="t('classNamePlaceholder')" class="input-width" /> <el-input
v-model="formData.class_name"
clearable
:placeholder="t('classNamePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('headCoach')" prop="head_coach"> <el-form-item :label="t('headCoach')" prop="head_coach">
<el-input v-model="formData.head_coach" clearable :placeholder="t('headCoachPlaceholder')" class="input-width" /> <el-input
v-model="formData.head_coach"
clearable
:placeholder="t('headCoachPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('ageGroup')" prop="age_group"> <el-form-item :label="t('ageGroup')" prop="age_group">
<el-input v-model="formData.age_group" clearable :placeholder="t('ageGroupPlaceholder')" class="input-width" /> <el-input
v-model="formData.age_group"
clearable
:placeholder="t('ageGroupPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('classType')" prop="class_type"> <el-form-item :label="t('classType')" prop="class_type">
<el-input v-model="formData.class_type" clearable :placeholder="t('classTypePlaceholder')" class="input-width" /> <el-input
v-model="formData.class_type"
clearable
:placeholder="t('classTypePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('assistantCoach')" prop="assistant_coach"> <el-form-item :label="t('assistantCoach')" prop="assistant_coach">
<el-input v-model="formData.assistant_coach" clearable :placeholder="t('assistantCoachPlaceholder')" class="input-width" /> <el-input
v-model="formData.assistant_coach"
clearable
:placeholder="t('assistantCoachPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('createdAt')" > <el-form-item :label="t('createdAt')">
<el-input v-model="formData.created_at" clearable :placeholder="t('createdAtPlaceholder')" class="input-width" /> <el-input
v-model="formData.created_at"
clearable
:placeholder="t('createdAtPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('updatedAt')" > <el-form-item :label="t('updatedAt')">
<el-input v-model="formData.updated_at" clearable :placeholder="t('updatedAtPlaceholder')" class="input-width" /> <el-input
v-model="formData.updated_at"
clearable
:placeholder="t('updatedAtPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('deletedAt')" > <el-form-item :label="t('deletedAt')">
<el-input v-model="formData.deleted_at" clearable :placeholder="t('deletedAtPlaceholder')" class="input-width" /> <el-input
v-model="formData.deleted_at"
clearable
:placeholder="t('deletedAtPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('status')" prop="status"> <el-form-item :label="t('status')" prop="status">
<el-input v-model="formData.status" clearable :placeholder="t('statusPlaceholder')" class="input-width" /> <el-input
v-model="formData.status"
clearable
:placeholder="t('statusPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('sortOrder')" prop="sort_order"> <el-form-item :label="t('sortOrder')" prop="sort_order">
<el-input v-model="formData.sort_order" clearable :placeholder="t('sortOrderPlaceholder')" class="input-width" /> <el-input
v-model="formData.sort_order"
clearable
:placeholder="t('sortOrderPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('remarks')" > <el-form-item :label="t('remarks')">
<el-input v-model="formData.remarks" clearable :placeholder="t('remarksPlaceholder')" class="input-width" /> <el-input
v-model="formData.remarks"
clearable
:placeholder="t('remarksPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -104,69 +184,47 @@ const formRules = computed(() => {
return { return {
campus_id: [ campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
],
]
,
campus_name: [ campus_name: [
{ required: true, message: t('campusNamePlaceholder'), trigger: 'blur' }, { required: true, message: t('campusNamePlaceholder'), trigger: 'blur' },
],
]
,
class_name: [ class_name: [
{ required: true, message: t('classNamePlaceholder'), trigger: 'blur' }, { required: true, message: t('classNamePlaceholder'), trigger: 'blur' },
],
]
,
head_coach: [ head_coach: [
{ required: true, message: t('headCoachPlaceholder'), trigger: 'blur' }, { required: true, message: t('headCoachPlaceholder'), trigger: 'blur' },
],
]
,
age_group: [ age_group: [
{ required: true, message: t('ageGroupPlaceholder'), trigger: 'blur' }, { required: true, message: t('ageGroupPlaceholder'), trigger: 'blur' },
],
]
,
class_type: [ class_type: [
{ required: true, message: t('classTypePlaceholder'), trigger: 'blur' }, { required: true, message: t('classTypePlaceholder'), trigger: 'blur' },
],
]
,
assistant_coach: [ assistant_coach: [
{ required: true, message: t('assistantCoachPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('assistantCoachPlaceholder'),
, trigger: 'blur',
},
],
created_at: [ created_at: [
{ required: true, message: t('createdAtPlaceholder'), trigger: 'blur' }, { required: true, message: t('createdAtPlaceholder'), trigger: 'blur' },
],
]
,
updated_at: [ updated_at: [
{ required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' }, { required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' },
],
]
,
deleted_at: [ deleted_at: [
{ required: true, message: t('deletedAtPlaceholder'), trigger: 'blur' }, { required: true, message: t('deletedAtPlaceholder'), trigger: 'blur' },
],
]
,
status: [ status: [
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, { required: true, message: t('statusPlaceholder'), trigger: 'blur' },
],
]
,
sort_order: [ sort_order: [
{ required: true, message: t('sortOrderPlaceholder'), trigger: 'blur' }, { required: true, message: t('sortOrderPlaceholder'), trigger: 'blur' },
],
]
,
remarks: [ remarks: [
{ required: true, message: t('remarksPlaceholder'), trigger: 'blur' }, { required: true, message: t('remarksPlaceholder'), trigger: 'blur' },
],
]
,
} }
}) })
@ -186,11 +244,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -199,14 +259,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if(row){ if (row) {
const data = await (await getClassInfo(row.id)).data const data = await (await getClassInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -224,7 +283,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -251,13 +315,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label{ .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

294
admin/src/app/views/communication_records/communication_records.vue

@ -1,99 +1,230 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addCommunicationRecords') }} {{ t('addCommunicationRecords') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="communicationRecordsTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="communicationRecordsTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('staffId')" prop="staff_id"> <el-form-item :label="t('staffId')" prop="staff_id">
<el-input v-model="communicationRecordsTable.searchParam.staff_id" :placeholder="t('staffIdPlaceholder')" /> <el-input
v-model="communicationRecordsTable.searchParam.staff_id"
:placeholder="t('staffIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('resourceId')" prop="resource_id"> <el-form-item :label="t('resourceId')" prop="resource_id">
<el-input v-model="communicationRecordsTable.searchParam.resource_id" :placeholder="t('resourceIdPlaceholder')" /> <el-input
v-model="communicationRecordsTable.searchParam.resource_id"
:placeholder="t('resourceIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('resourceType')" prop="resource_type"> <el-form-item :label="t('resourceType')" prop="resource_type">
<el-input v-model="communicationRecordsTable.searchParam.resource_type" :placeholder="t('resourceTypePlaceholder')" /> <el-input
v-model="communicationRecordsTable.searchParam.resource_type"
:placeholder="t('resourceTypePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('communicationType')" prop="communication_type"> <el-form-item
<el-input v-model="communicationRecordsTable.searchParam.communication_type" :placeholder="t('communicationTypePlaceholder')" /> :label="t('communicationType')"
prop="communication_type"
>
<el-input
v-model="communicationRecordsTable.searchParam.communication_type"
:placeholder="t('communicationTypePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('communicationResult')" prop="communication_result"> <el-form-item
<el-input v-model="communicationRecordsTable.searchParam.communication_result" :placeholder="t('communicationResultPlaceholder')" /> :label="t('communicationResult')"
prop="communication_result"
>
<el-input
v-model="
communicationRecordsTable.searchParam.communication_result
"
:placeholder="t('communicationResultPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('communicationTime')" prop="communication_time"> <el-form-item
<el-input v-model="communicationRecordsTable.searchParam.communication_time" :placeholder="t('communicationTimePlaceholder')" /> :label="t('communicationTime')"
prop="communication_time"
>
<el-input
v-model="communicationRecordsTable.searchParam.communication_time"
:placeholder="t('communicationTimePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('remarks')" prop="remarks"> <el-form-item :label="t('remarks')" prop="remarks">
<el-input v-model="communicationRecordsTable.searchParam.remarks" :placeholder="t('remarksPlaceholder')" /> <el-input
v-model="communicationRecordsTable.searchParam.remarks"
:placeholder="t('remarksPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('tag')" prop="tag"> <el-form-item :label="t('tag')" prop="tag">
<el-input v-model="communicationRecordsTable.searchParam.tag" :placeholder="t('tagPlaceholder')" /> <el-input
v-model="communicationRecordsTable.searchParam.tag"
:placeholder="t('tagPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('businessId')" prop="business_id"> <el-form-item :label="t('businessId')" prop="business_id">
<el-input v-model="communicationRecordsTable.searchParam.business_id" :placeholder="t('businessIdPlaceholder')" /> <el-input
v-model="communicationRecordsTable.searchParam.business_id"
:placeholder="t('businessIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('createdAt')" prop="created_at"> <el-form-item :label="t('createdAt')" prop="created_at">
<el-input v-model="communicationRecordsTable.searchParam.created_at" :placeholder="t('createdAtPlaceholder')" /> <el-input
v-model="communicationRecordsTable.searchParam.created_at"
:placeholder="t('createdAtPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('updatedAt')" prop="updated_at"> <el-form-item :label="t('updatedAt')" prop="updated_at">
<el-input v-model="communicationRecordsTable.searchParam.updated_at" :placeholder="t('updatedAtPlaceholder')" /> <el-input
v-model="communicationRecordsTable.searchParam.updated_at"
:placeholder="t('updatedAtPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadCommunicationRecordsList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadCommunicationRecordsList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="communicationRecordsTable.data" size="large" v-loading="communicationRecordsTable.loading"> <el-table
:data="communicationRecordsTable.data"
size="large"
v-loading="communicationRecordsTable.loading"
>
<template #empty> <template #empty>
<span>{{ !communicationRecordsTable.loading ? t('emptyData') : '' }}</span> <span>{{
!communicationRecordsTable.loading ? t('emptyData') : ''
}}</span>
</template> </template>
<el-table-column prop="staff_id" :label="t('staffId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="staff_id"
<el-table-column prop="resource_id" :label="t('resourceId')" min-width="120" :show-overflow-tooltip="true"/> :label="t('staffId')"
min-width="120"
<el-table-column prop="resource_type" :label="t('resourceType')" min-width="120" :show-overflow-tooltip="true"/> :show-overflow-tooltip="true"
/>
<el-table-column prop="communication_type" :label="t('communicationType')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
<el-table-column prop="communication_result" :label="t('communicationResult')" min-width="120" :show-overflow-tooltip="true"/> prop="resource_id"
:label="t('resourceId')"
<el-table-column prop="communication_time" :label="t('communicationTime')" min-width="120" :show-overflow-tooltip="true"/> min-width="120"
:show-overflow-tooltip="true"
<el-table-column prop="remarks" :label="t('remarks')" min-width="120" :show-overflow-tooltip="true"/> />
<el-table-column prop="tag" :label="t('tag')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="resource_type"
<el-table-column prop="business_id" :label="t('businessId')" min-width="120" :show-overflow-tooltip="true"/> :label="t('resourceType')"
min-width="120"
<el-table-column prop="created_at" :label="t('createdAt')" min-width="120" :show-overflow-tooltip="true"/> :show-overflow-tooltip="true"
/>
<el-table-column prop="updated_at" :label="t('updatedAt')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
<el-table-column :label="t('operation')" fixed="right" min-width="120"> prop="communication_type"
:label="t('communicationType')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="communication_result"
:label="t('communicationResult')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="communication_time"
:label="t('communicationTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="remarks"
:label="t('remarks')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="tag"
:label="t('tag')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="business_id"
:label="t('businessId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="created_at"
:label="t('createdAt')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="updated_at"
:label="t('updatedAt')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="communicationRecordsTable.page" v-model:page-size="communicationRecordsTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="communicationRecordsTable.total" v-model:current-page="communicationRecordsTable.page"
@size-change="loadCommunicationRecordsList()" @current-change="loadCommunicationRecordsList" /> v-model:page-size="communicationRecordsTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="communicationRecordsTable.total"
@size-change="loadCommunicationRecordsList()"
@current-change="loadCommunicationRecordsList"
/>
</div> </div>
</div> </div>
<edit ref="editCommunicationRecordsDialog" @complete="loadCommunicationRecordsList" /> <edit
ref="editCommunicationRecordsDialog"
@complete="loadCommunicationRecordsList"
/>
</el-card> </el-card>
</div> </div>
</template> </template>
@ -102,13 +233,16 @@
import { reactive, ref, watch } from 'vue' import { reactive, ref, watch } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getCommunicationRecordsList, deleteCommunicationRecords } from '@/app/api/communication_records' import {
getCommunicationRecordsList,
deleteCommunicationRecords,
} from '@/app/api/communication_records'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/communication_records/components/communication-records-edit.vue' import Edit from '@/app/views/communication_records/components/communication-records-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let communicationRecordsTable = reactive({ let communicationRecordsTable = reactive({
page: 1, page: 1,
@ -116,19 +250,19 @@ let communicationRecordsTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"staff_id":"", staff_id: '',
"resource_id":"", resource_id: '',
"resource_type":"", resource_type: '',
"communication_type":"", communication_type: '',
"communication_result":"", communication_result: '',
"communication_time":"", communication_time: '',
"remarks":"", remarks: '',
"tag":"", tag: '',
"business_id":"", business_id: '',
"created_at":"", created_at: '',
"updated_at":"" updated_at: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -138,7 +272,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取沟通记录列表 * 获取沟通记录列表
*/ */
@ -149,12 +282,14 @@ const loadCommunicationRecordsList = (page: number = 1) => {
getCommunicationRecordsList({ getCommunicationRecordsList({
page: communicationRecordsTable.page, page: communicationRecordsTable.page,
limit: communicationRecordsTable.limit, limit: communicationRecordsTable.limit,
...communicationRecordsTable.searchParam ...communicationRecordsTable.searchParam,
}).then(res => { })
.then((res) => {
communicationRecordsTable.loading = false communicationRecordsTable.loading = false
communicationRecordsTable.data = res.data.data communicationRecordsTable.data = res.data.data
communicationRecordsTable.total = res.data.total communicationRecordsTable.total = res.data.total
}).catch(() => { })
.catch(() => {
communicationRecordsTable.loading = false communicationRecordsTable.loading = false
}) })
} }
@ -183,22 +318,19 @@ const editEvent = (data: any) => {
* 删除沟通记录 * 删除沟通记录
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('communicationRecordsDeleteTips'), t('warning'), ElMessageBox.confirm(t('communicationRecordsDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteCommunicationRecords(id)
deleteCommunicationRecords(id).then(() => { .then(() => {
loadCommunicationRecordsList() loadCommunicationRecordsList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
@ -215,5 +347,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

223
admin/src/app/views/communication_records/components/communication-records-edit.vue

@ -1,58 +1,135 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateCommunicationRecords') : t('addCommunicationRecords')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="
formData.id
? t('updateCommunicationRecords')
: t('addCommunicationRecords')
"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('staffId')" prop="staff_id"> <el-form-item :label="t('staffId')" prop="staff_id">
<el-input v-model="formData.staff_id" clearable :placeholder="t('staffIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.staff_id"
clearable
:placeholder="t('staffIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('resourceId')" prop="resource_id"> <el-form-item :label="t('resourceId')" prop="resource_id">
<el-input v-model="formData.resource_id" clearable :placeholder="t('resourceIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.resource_id"
clearable
:placeholder="t('resourceIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('resourceType')" prop="resource_type"> <el-form-item :label="t('resourceType')" prop="resource_type">
<el-input v-model="formData.resource_type" clearable :placeholder="t('resourceTypePlaceholder')" class="input-width" /> <el-input
v-model="formData.resource_type"
clearable
:placeholder="t('resourceTypePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('communicationType')" prop="communication_type"> <el-form-item :label="t('communicationType')" prop="communication_type">
<el-input v-model="formData.communication_type" clearable :placeholder="t('communicationTypePlaceholder')" class="input-width" /> <el-input
v-model="formData.communication_type"
clearable
:placeholder="t('communicationTypePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('communicationResult')" prop="communication_result"> <el-form-item
<el-input v-model="formData.communication_result" clearable :placeholder="t('communicationResultPlaceholder')" class="input-width" /> :label="t('communicationResult')"
prop="communication_result"
>
<el-input
v-model="formData.communication_result"
clearable
:placeholder="t('communicationResultPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('communicationTime')" prop="communication_time"> <el-form-item :label="t('communicationTime')" prop="communication_time">
<el-input v-model="formData.communication_time" clearable :placeholder="t('communicationTimePlaceholder')" class="input-width" /> <el-input
v-model="formData.communication_time"
clearable
:placeholder="t('communicationTimePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('remarks')" > <el-form-item :label="t('remarks')">
<el-input v-model="formData.remarks" clearable :placeholder="t('remarksPlaceholder')" class="input-width" /> <el-input
v-model="formData.remarks"
clearable
:placeholder="t('remarksPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('tag')" > <el-form-item :label="t('tag')">
<el-input v-model="formData.tag" clearable :placeholder="t('tagPlaceholder')" class="input-width" /> <el-input
v-model="formData.tag"
clearable
:placeholder="t('tagPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('businessId')" > <el-form-item :label="t('businessId')">
<el-input v-model="formData.business_id" clearable :placeholder="t('businessIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.business_id"
clearable
:placeholder="t('businessIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('createdAt')" > <el-form-item :label="t('createdAt')">
<el-input v-model="formData.created_at" clearable :placeholder="t('createdAtPlaceholder')" class="input-width" /> <el-input
v-model="formData.created_at"
clearable
:placeholder="t('createdAtPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('updatedAt')" > <el-form-item :label="t('updatedAt')">
<el-input v-model="formData.updated_at" clearable :placeholder="t('updatedAtPlaceholder')" class="input-width" /> <el-input
v-model="formData.updated_at"
clearable
:placeholder="t('updatedAtPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -63,7 +140,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addCommunicationRecords, editCommunicationRecords, getCommunicationRecordsInfo } from '@/app/api/communication_records' import {
addCommunicationRecords,
editCommunicationRecords,
getCommunicationRecordsInfo,
} from '@/app/api/communication_records'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -94,59 +175,51 @@ const formRules = computed(() => {
return { return {
staff_id: [ staff_id: [
{ required: true, message: t('staffIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('staffIdPlaceholder'), trigger: 'blur' },
],
]
,
resource_id: [ resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
],
]
,
resource_type: [ resource_type: [
{ required: true, message: t('resourceTypePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('resourceTypePlaceholder'),
, trigger: 'blur',
},
],
communication_type: [ communication_type: [
{ required: true, message: t('communicationTypePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('communicationTypePlaceholder'),
, trigger: 'blur',
},
],
communication_result: [ communication_result: [
{ required: true, message: t('communicationResultPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('communicationResultPlaceholder'),
, trigger: 'blur',
},
],
communication_time: [ communication_time: [
{ required: true, message: t('communicationTimePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('communicationTimePlaceholder'),
, trigger: 'blur',
},
],
remarks: [ remarks: [
{ required: true, message: t('remarksPlaceholder'), trigger: 'blur' }, { required: true, message: t('remarksPlaceholder'), trigger: 'blur' },
],
] tag: [{ required: true, message: t('tagPlaceholder'), trigger: 'blur' }],
,
tag: [
{ required: true, message: t('tagPlaceholder'), trigger: 'blur' },
]
,
business_id: [ business_id: [
{ required: true, message: t('businessIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('businessIdPlaceholder'), trigger: 'blur' },
],
]
,
created_at: [ created_at: [
{ required: true, message: t('createdAtPlaceholder'), trigger: 'blur' }, { required: true, message: t('createdAtPlaceholder'), trigger: 'blur' },
],
]
,
updated_at: [ updated_at: [
{ required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' }, { required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' },
],
]
,
} }
}) })
@ -166,11 +239,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -179,14 +254,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if(row){ if (row) {
const data = await (await getCommunicationRecordsInfo(row.id)).data const data = await (await getCommunicationRecordsInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -204,7 +278,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -231,13 +310,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label{ .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

171
admin/src/app/views/contract/components/contract-edit.vue

@ -1,46 +1,101 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateContract') : t('addContract')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="formData.id ? t('updateContract') : t('addContract')"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('contractName')" prop="contract_name"> <el-form-item :label="t('contractName')" prop="contract_name">
<el-input v-model="formData.contract_name" clearable :placeholder="t('contractNamePlaceholder')" class="input-width" /> <el-input
v-model="formData.contract_name"
clearable
:placeholder="t('contractNamePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('contractTemplate')" prop="contract_template"> <el-form-item :label="t('contractTemplate')" prop="contract_template">
<el-input v-model="formData.contract_template" clearable :placeholder="t('contractTemplatePlaceholder')" class="input-width" /> <el-input
v-model="formData.contract_template"
clearable
:placeholder="t('contractTemplatePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('contractStatus')" prop="contract_status"> <el-form-item :label="t('contractStatus')" prop="contract_status">
<el-input v-model="formData.contract_status" clearable :placeholder="t('contractStatusPlaceholder')" class="input-width" /> <el-input
v-model="formData.contract_status"
clearable
:placeholder="t('contractStatusPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('contractType')" prop="contract_type"> <el-form-item :label="t('contractType')" prop="contract_type">
<el-input v-model="formData.contract_type" clearable :placeholder="t('contractTypePlaceholder')" class="input-width" /> <el-input
v-model="formData.contract_type"
clearable
:placeholder="t('contractTypePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('remarks')" > <el-form-item :label="t('remarks')">
<el-input v-model="formData.remarks" clearable :placeholder="t('remarksPlaceholder')" class="input-width" /> <el-input
v-model="formData.remarks"
clearable
:placeholder="t('remarksPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('createdAt')" > <el-form-item :label="t('createdAt')">
<el-input v-model="formData.created_at" clearable :placeholder="t('createdAtPlaceholder')" class="input-width" /> <el-input
v-model="formData.created_at"
clearable
:placeholder="t('createdAtPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('updatedAt')" > <el-form-item :label="t('updatedAt')">
<el-input v-model="formData.updated_at" clearable :placeholder="t('updatedAtPlaceholder')" class="input-width" /> <el-input
v-model="formData.updated_at"
clearable
:placeholder="t('updatedAtPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('deletedAt')" > <el-form-item :label="t('deletedAt')">
<el-input v-model="formData.deleted_at" clearable :placeholder="t('deletedAtPlaceholder')" class="input-width" /> <el-input
v-model="formData.deleted_at"
clearable
:placeholder="t('deletedAtPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -78,45 +133,45 @@ const formRef = ref<FormInstance>()
const formRules = computed(() => { const formRules = computed(() => {
return { return {
contract_name: [ contract_name: [
{ required: true, message: t('contractNamePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('contractNamePlaceholder'),
, trigger: 'blur',
},
],
contract_template: [ contract_template: [
{ required: true, message: t('contractTemplatePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('contractTemplatePlaceholder'),
, trigger: 'blur',
},
],
contract_status: [ contract_status: [
{ required: true, message: t('contractStatusPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('contractStatusPlaceholder'),
, trigger: 'blur',
},
],
contract_type: [ contract_type: [
{ required: true, message: t('contractTypePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('contractTypePlaceholder'),
, trigger: 'blur',
},
],
remarks: [ remarks: [
{ required: true, message: t('remarksPlaceholder'), trigger: 'blur' }, { required: true, message: t('remarksPlaceholder'), trigger: 'blur' },
],
]
,
created_at: [ created_at: [
{ required: true, message: t('createdAtPlaceholder'), trigger: 'blur' }, { required: true, message: t('createdAtPlaceholder'), trigger: 'blur' },
],
]
,
updated_at: [ updated_at: [
{ required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' }, { required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' },
],
]
,
deleted_at: [ deleted_at: [
{ required: true, message: t('deletedAtPlaceholder'), trigger: 'blur' }, { required: true, message: t('deletedAtPlaceholder'), trigger: 'blur' },
],
]
,
} }
}) })
@ -136,11 +191,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -149,14 +206,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if(row){ if (row) {
const data = await (await getContractInfo(row.id)).data const data = await (await getContractInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -174,7 +230,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -201,13 +262,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label{ .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

199
admin/src/app/views/contract/contract.vue

@ -1,80 +1,171 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addContract') }} {{ t('addContract') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="contractTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="contractTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('contractName')" prop="contract_name"> <el-form-item :label="t('contractName')" prop="contract_name">
<el-input v-model="contractTable.searchParam.contract_name" :placeholder="t('contractNamePlaceholder')" /> <el-input
v-model="contractTable.searchParam.contract_name"
:placeholder="t('contractNamePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('contractTemplate')" prop="contract_template"> <el-form-item :label="t('contractTemplate')" prop="contract_template">
<el-input v-model="contractTable.searchParam.contract_template" :placeholder="t('contractTemplatePlaceholder')" /> <el-input
v-model="contractTable.searchParam.contract_template"
:placeholder="t('contractTemplatePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('contractStatus')" prop="contract_status"> <el-form-item :label="t('contractStatus')" prop="contract_status">
<el-input v-model="contractTable.searchParam.contract_status" :placeholder="t('contractStatusPlaceholder')" /> <el-input
v-model="contractTable.searchParam.contract_status"
:placeholder="t('contractStatusPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('contractType')" prop="contract_type"> <el-form-item :label="t('contractType')" prop="contract_type">
<el-input v-model="contractTable.searchParam.contract_type" :placeholder="t('contractTypePlaceholder')" /> <el-input
v-model="contractTable.searchParam.contract_type"
:placeholder="t('contractTypePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('remarks')" prop="remarks"> <el-form-item :label="t('remarks')" prop="remarks">
<el-input v-model="contractTable.searchParam.remarks" :placeholder="t('remarksPlaceholder')" /> <el-input
v-model="contractTable.searchParam.remarks"
:placeholder="t('remarksPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('createdAt')" prop="created_at"> <el-form-item :label="t('createdAt')" prop="created_at">
<el-input v-model="contractTable.searchParam.created_at" :placeholder="t('createdAtPlaceholder')" /> <el-input
v-model="contractTable.searchParam.created_at"
:placeholder="t('createdAtPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('updatedAt')" prop="updated_at"> <el-form-item :label="t('updatedAt')" prop="updated_at">
<el-input v-model="contractTable.searchParam.updated_at" :placeholder="t('updatedAtPlaceholder')" /> <el-input
v-model="contractTable.searchParam.updated_at"
:placeholder="t('updatedAtPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('deletedAt')" prop="deleted_at"> <el-form-item :label="t('deletedAt')" prop="deleted_at">
<el-input v-model="contractTable.searchParam.deleted_at" :placeholder="t('deletedAtPlaceholder')" /> <el-input
v-model="contractTable.searchParam.deleted_at"
:placeholder="t('deletedAtPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadContractList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadContractList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="contractTable.data" size="large" v-loading="contractTable.loading"> <el-table
:data="contractTable.data"
size="large"
v-loading="contractTable.loading"
>
<template #empty> <template #empty>
<span>{{ !contractTable.loading ? t('emptyData') : '' }}</span> <span>{{ !contractTable.loading ? t('emptyData') : '' }}</span>
</template> </template>
<el-table-column prop="contract_name" :label="t('contractName')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="contract_name"
:label="t('contractName')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="contract_template" :label="t('contractTemplate')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="contract_template"
:label="t('contractTemplate')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="contract_status" :label="t('contractStatus')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="contract_status"
:label="t('contractStatus')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="contract_type" :label="t('contractType')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="contract_type"
:label="t('contractType')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="remarks" :label="t('remarks')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="remarks"
:label="t('remarks')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="created_at" :label="t('createdAt')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="created_at"
:label="t('createdAt')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="updated_at" :label="t('updatedAt')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="updated_at"
:label="t('updatedAt')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="deleted_at" :label="t('deletedAt')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="deleted_at"
:label="t('deletedAt')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="contractTable.page" v-model:page-size="contractTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="contractTable.total" v-model:current-page="contractTable.page"
@size-change="loadContractList()" @current-change="loadContractList" /> v-model:page-size="contractTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="contractTable.total"
@size-change="loadContractList()"
@current-change="loadContractList"
/>
</div> </div>
</div> </div>
@ -89,11 +180,11 @@ import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getContractList, deleteContract } from '@/app/api/contract' import { getContractList, deleteContract } from '@/app/api/contract'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/contract/components/contract-edit.vue' import Edit from '@/app/views/contract/components/contract-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let contractTable = reactive({ let contractTable = reactive({
page: 1, page: 1,
@ -101,16 +192,16 @@ let contractTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"contract_name":"", contract_name: '',
"contract_template":"", contract_template: '',
"contract_status":"", contract_status: '',
"contract_type":"", contract_type: '',
"remarks":"", remarks: '',
"created_at":"", created_at: '',
"updated_at":"", updated_at: '',
"deleted_at":"" deleted_at: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -120,7 +211,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取合同列表 * 获取合同列表
*/ */
@ -131,12 +221,14 @@ const loadContractList = (page: number = 1) => {
getContractList({ getContractList({
page: contractTable.page, page: contractTable.page,
limit: contractTable.limit, limit: contractTable.limit,
...contractTable.searchParam ...contractTable.searchParam,
}).then(res => { })
.then((res) => {
contractTable.loading = false contractTable.loading = false
contractTable.data = res.data.data contractTable.data = res.data.data
contractTable.total = res.data.total contractTable.total = res.data.total
}).catch(() => { })
.catch(() => {
contractTable.loading = false contractTable.loading = false
}) })
} }
@ -165,22 +257,19 @@ const editEvent = (data: any) => {
* 删除合同 * 删除合同
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('contractDeleteTips'), t('warning'), ElMessageBox.confirm(t('contractDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteContract(id)
deleteContract(id).then(() => { .then(() => {
loadContractList() loadContractList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
@ -197,5 +286,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

181
admin/src/app/views/course/components/course-edit.vue

@ -1,50 +1,113 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateCourse') : t('addCourse')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="formData.id ? t('updateCourse') : t('addCourse')"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('courseName')" prop="course_name"> <el-form-item :label="t('courseName')" prop="course_name">
<el-input v-model="formData.course_name" clearable :placeholder="t('courseNamePlaceholder')" class="input-width" /> <el-input
v-model="formData.course_name"
clearable
:placeholder="t('courseNamePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('courseType')" prop="course_type"> <el-form-item :label="t('courseType')" prop="course_type">
<el-input v-model="formData.course_type" clearable :placeholder="t('courseTypePlaceholder')" class="input-width" /> <el-input
v-model="formData.course_type"
clearable
:placeholder="t('courseTypePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('duration')" prop="duration"> <el-form-item :label="t('duration')" prop="duration">
<el-input v-model="formData.duration" clearable :placeholder="t('durationPlaceholder')" class="input-width" /> <el-input
v-model="formData.duration"
clearable
:placeholder="t('durationPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('sessionCount')" prop="session_count"> <el-form-item :label="t('sessionCount')" prop="session_count">
<el-input v-model="formData.session_count" clearable :placeholder="t('sessionCountPlaceholder')" class="input-width" /> <el-input
v-model="formData.session_count"
clearable
:placeholder="t('sessionCountPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('singleSessionCount')" prop="single_session_count"> <el-form-item
<el-input v-model="formData.single_session_count" clearable :placeholder="t('singleSessionCountPlaceholder')" class="input-width" /> :label="t('singleSessionCount')"
prop="single_session_count"
>
<el-input
v-model="formData.single_session_count"
clearable
:placeholder="t('singleSessionCountPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('price')" prop="price"> <el-form-item :label="t('price')" prop="price">
<el-input v-model="formData.price" clearable :placeholder="t('pricePlaceholder')" class="input-width" /> <el-input
v-model="formData.price"
clearable
:placeholder="t('pricePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('internalReminder')" prop="internal_reminder"> <el-form-item :label="t('internalReminder')" prop="internal_reminder">
<el-input v-model="formData.internal_reminder" clearable :placeholder="t('internalReminderPlaceholder')" class="input-width" /> <el-input
v-model="formData.internal_reminder"
clearable
:placeholder="t('internalReminderPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('customerReminder')" prop="customer_reminder"> <el-form-item :label="t('customerReminder')" prop="customer_reminder">
<el-input v-model="formData.customer_reminder" clearable :placeholder="t('customerReminderPlaceholder')" class="input-width" /> <el-input
v-model="formData.customer_reminder"
clearable
:placeholder="t('customerReminderPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('remarks')" > <el-form-item :label="t('remarks')">
<el-input v-model="formData.remarks" clearable :placeholder="t('remarksPlaceholder')" class="input-width" /> <el-input
v-model="formData.remarks"
clearable
:placeholder="t('remarksPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -84,49 +147,47 @@ const formRules = computed(() => {
return { return {
course_name: [ course_name: [
{ required: true, message: t('courseNamePlaceholder'), trigger: 'blur' }, { required: true, message: t('courseNamePlaceholder'), trigger: 'blur' },
],
]
,
course_type: [ course_type: [
{ required: true, message: t('courseTypePlaceholder'), trigger: 'blur' }, { required: true, message: t('courseTypePlaceholder'), trigger: 'blur' },
],
]
,
duration: [ duration: [
{ required: true, message: t('durationPlaceholder'), trigger: 'blur' }, { required: true, message: t('durationPlaceholder'), trigger: 'blur' },
],
]
,
session_count: [ session_count: [
{ required: true, message: t('sessionCountPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('sessionCountPlaceholder'),
, trigger: 'blur',
},
],
single_session_count: [ single_session_count: [
{ required: true, message: t('singleSessionCountPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('singleSessionCountPlaceholder'),
, trigger: 'blur',
},
],
price: [ price: [
{ required: true, message: t('pricePlaceholder'), trigger: 'blur' }, { required: true, message: t('pricePlaceholder'), trigger: 'blur' },
],
]
,
internal_reminder: [ internal_reminder: [
{ required: true, message: t('internalReminderPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('internalReminderPlaceholder'),
, trigger: 'blur',
},
],
customer_reminder: [ customer_reminder: [
{ required: true, message: t('customerReminderPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('customerReminderPlaceholder'),
, trigger: 'blur',
},
],
remarks: [ remarks: [
{ required: true, message: t('remarksPlaceholder'), trigger: 'blur' }, { required: true, message: t('remarksPlaceholder'), trigger: 'blur' },
],
]
,
} }
}) })
@ -146,11 +207,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -159,14 +222,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if(row){ if (row) {
const data = await (await getCourseInfo(row.id)).data const data = await (await getCourseInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -184,7 +246,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -211,13 +278,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label{ .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

218
admin/src/app/views/course/course.vue

@ -1,85 +1,187 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addCourse') }} {{ t('addCourse') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="courseTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="courseTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('courseName')" prop="course_name"> <el-form-item :label="t('courseName')" prop="course_name">
<el-input v-model="courseTable.searchParam.course_name" :placeholder="t('courseNamePlaceholder')" /> <el-input
v-model="courseTable.searchParam.course_name"
:placeholder="t('courseNamePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('courseType')" prop="course_type"> <el-form-item :label="t('courseType')" prop="course_type">
<el-input v-model="courseTable.searchParam.course_type" :placeholder="t('courseTypePlaceholder')" /> <el-input
v-model="courseTable.searchParam.course_type"
:placeholder="t('courseTypePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('duration')" prop="duration"> <el-form-item :label="t('duration')" prop="duration">
<el-input v-model="courseTable.searchParam.duration" :placeholder="t('durationPlaceholder')" /> <el-input
v-model="courseTable.searchParam.duration"
:placeholder="t('durationPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('sessionCount')" prop="session_count"> <el-form-item :label="t('sessionCount')" prop="session_count">
<el-input v-model="courseTable.searchParam.session_count" :placeholder="t('sessionCountPlaceholder')" /> <el-input
v-model="courseTable.searchParam.session_count"
:placeholder="t('sessionCountPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('singleSessionCount')" prop="single_session_count"> <el-form-item
<el-input v-model="courseTable.searchParam.single_session_count" :placeholder="t('singleSessionCountPlaceholder')" /> :label="t('singleSessionCount')"
prop="single_session_count"
>
<el-input
v-model="courseTable.searchParam.single_session_count"
:placeholder="t('singleSessionCountPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('price')" prop="price"> <el-form-item :label="t('price')" prop="price">
<el-input v-model="courseTable.searchParam.price" :placeholder="t('pricePlaceholder')" /> <el-input
v-model="courseTable.searchParam.price"
:placeholder="t('pricePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('internalReminder')" prop="internal_reminder"> <el-form-item :label="t('internalReminder')" prop="internal_reminder">
<el-input v-model="courseTable.searchParam.internal_reminder" :placeholder="t('internalReminderPlaceholder')" /> <el-input
v-model="courseTable.searchParam.internal_reminder"
:placeholder="t('internalReminderPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('customerReminder')" prop="customer_reminder"> <el-form-item :label="t('customerReminder')" prop="customer_reminder">
<el-input v-model="courseTable.searchParam.customer_reminder" :placeholder="t('customerReminderPlaceholder')" /> <el-input
v-model="courseTable.searchParam.customer_reminder"
:placeholder="t('customerReminderPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('remarks')" prop="remarks"> <el-form-item :label="t('remarks')" prop="remarks">
<el-input v-model="courseTable.searchParam.remarks" :placeholder="t('remarksPlaceholder')" /> <el-input
v-model="courseTable.searchParam.remarks"
:placeholder="t('remarksPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadCourseList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadCourseList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="courseTable.data" size="large" v-loading="courseTable.loading"> <el-table
:data="courseTable.data"
size="large"
v-loading="courseTable.loading"
>
<template #empty> <template #empty>
<span>{{ !courseTable.loading ? t('emptyData') : '' }}</span> <span>{{ !courseTable.loading ? t('emptyData') : '' }}</span>
</template> </template>
<el-table-column prop="course_name" :label="t('courseName')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="course_name"
:label="t('courseName')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="course_type" :label="t('courseType')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="course_type"
:label="t('courseType')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="duration" :label="t('duration')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="duration"
:label="t('duration')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="session_count" :label="t('sessionCount')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="session_count"
:label="t('sessionCount')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="single_session_count" :label="t('singleSessionCount')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="single_session_count"
:label="t('singleSessionCount')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="price" :label="t('price')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="price"
:label="t('price')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="internal_reminder" :label="t('internalReminder')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="internal_reminder"
:label="t('internalReminder')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="customer_reminder" :label="t('customerReminder')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="customer_reminder"
:label="t('customerReminder')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="remarks" :label="t('remarks')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="remarks"
:label="t('remarks')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="courseTable.page" v-model:page-size="courseTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="courseTable.total" v-model:current-page="courseTable.page"
@size-change="loadCourseList()" @current-change="loadCourseList" /> v-model:page-size="courseTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="courseTable.total"
@size-change="loadCourseList()"
@current-change="loadCourseList"
/>
</div> </div>
</div> </div>
@ -94,11 +196,11 @@ import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getCourseList, deleteCourse } from '@/app/api/course' import { getCourseList, deleteCourse } from '@/app/api/course'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/course/components/course-edit.vue' import Edit from '@/app/views/course/components/course-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let courseTable = reactive({ let courseTable = reactive({
page: 1, page: 1,
@ -106,17 +208,17 @@ let courseTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"course_name":"", course_name: '',
"course_type":"", course_type: '',
"duration":"", duration: '',
"session_count":"", session_count: '',
"single_session_count":"", single_session_count: '',
"price":"", price: '',
"internal_reminder":"", internal_reminder: '',
"customer_reminder":"", customer_reminder: '',
"remarks":"" remarks: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -126,7 +228,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取课程列表 * 获取课程列表
*/ */
@ -137,12 +238,14 @@ const loadCourseList = (page: number = 1) => {
getCourseList({ getCourseList({
page: courseTable.page, page: courseTable.page,
limit: courseTable.limit, limit: courseTable.limit,
...courseTable.searchParam ...courseTable.searchParam,
}).then(res => { })
.then((res) => {
courseTable.loading = false courseTable.loading = false
courseTable.data = res.data.data courseTable.data = res.data.data
courseTable.total = res.data.total courseTable.total = res.data.total
}).catch(() => { })
.catch(() => {
courseTable.loading = false courseTable.loading = false
}) })
} }
@ -171,22 +274,19 @@ const editEvent = (data: any) => {
* 删除课程 * 删除课程
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('courseDeleteTips'), t('warning'), ElMessageBox.confirm(t('courseDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteCourse(id)
deleteCourse(id).then(() => { .then(() => {
loadCourseList() loadCourseList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
@ -203,5 +303,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

179
admin/src/app/views/course_schedule/components/course-schedule-edit.vue

@ -1,54 +1,119 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateCourseSchedule') : t('addCourseSchedule')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="formData.id ? t('updateCourseSchedule') : t('addCourseSchedule')"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-input v-model="formData.campus_id" clearable :placeholder="t('campusIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.campus_id"
clearable
:placeholder="t('campusIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('venueId')" prop="venue_id"> <el-form-item :label="t('venueId')" prop="venue_id">
<el-input v-model="formData.venue_id" clearable :placeholder="t('venueIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.venue_id"
clearable
:placeholder="t('venueIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('courseDate')" prop="course_date"> <el-form-item :label="t('courseDate')" prop="course_date">
<el-input v-model="formData.course_date" clearable :placeholder="t('courseDatePlaceholder')" class="input-width" /> <el-input
v-model="formData.course_date"
clearable
:placeholder="t('courseDatePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('timeSlot')" prop="time_slot"> <el-form-item :label="t('timeSlot')" prop="time_slot">
<el-input v-model="formData.time_slot" clearable :placeholder="t('timeSlotPlaceholder')" class="input-width" /> <el-input
v-model="formData.time_slot"
clearable
:placeholder="t('timeSlotPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('courseId')" prop="course_id"> <el-form-item :label="t('courseId')" prop="course_id">
<el-input v-model="formData.course_id" clearable :placeholder="t('courseIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.course_id"
clearable
:placeholder="t('courseIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('coachId')" prop="coach_id"> <el-form-item :label="t('coachId')" prop="coach_id">
<el-input v-model="formData.coach_id" clearable :placeholder="t('coachIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.coach_id"
clearable
:placeholder="t('coachIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('participants')" prop="participants"> <el-form-item :label="t('participants')" prop="participants">
<el-input v-model="formData.participants" clearable :placeholder="t('participantsPlaceholder')" class="input-width" /> <el-input
v-model="formData.participants"
clearable
:placeholder="t('participantsPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('studentIds')" prop="student_ids"> <el-form-item :label="t('studentIds')" prop="student_ids">
<el-input v-model="formData.student_ids" clearable :placeholder="t('studentIdsPlaceholder')" class="input-width" /> <el-input
v-model="formData.student_ids"
clearable
:placeholder="t('studentIdsPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('availableCapacity')" prop="available_capacity"> <el-form-item :label="t('availableCapacity')" prop="available_capacity">
<el-input v-model="formData.available_capacity" clearable :placeholder="t('availableCapacityPlaceholder')" class="input-width" /> <el-input
v-model="formData.available_capacity"
clearable
:placeholder="t('availableCapacityPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('status')" prop="status"> <el-form-item :label="t('status')" prop="status">
<el-input v-model="formData.status" clearable :placeholder="t('statusPlaceholder')" class="input-width" /> <el-input
v-model="formData.status"
clearable
:placeholder="t('statusPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -59,7 +124,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addCourseSchedule, editCourseSchedule, getCourseScheduleInfo } from '@/app/api/course_schedule' import {
addCourseSchedule,
editCourseSchedule,
getCourseScheduleInfo,
} from '@/app/api/course_schedule'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -89,54 +158,42 @@ const formRules = computed(() => {
return { return {
campus_id: [ campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
],
]
,
venue_id: [ venue_id: [
{ required: true, message: t('venueIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('venueIdPlaceholder'), trigger: 'blur' },
],
]
,
course_date: [ course_date: [
{ required: true, message: t('courseDatePlaceholder'), trigger: 'blur' }, { required: true, message: t('courseDatePlaceholder'), trigger: 'blur' },
],
]
,
time_slot: [ time_slot: [
{ required: true, message: t('timeSlotPlaceholder'), trigger: 'blur' }, { required: true, message: t('timeSlotPlaceholder'), trigger: 'blur' },
],
]
,
course_id: [ course_id: [
{ required: true, message: t('courseIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('courseIdPlaceholder'), trigger: 'blur' },
],
]
,
coach_id: [ coach_id: [
{ required: true, message: t('coachIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('coachIdPlaceholder'), trigger: 'blur' },
],
]
,
participants: [ participants: [
{ required: true, message: t('participantsPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('participantsPlaceholder'),
, trigger: 'blur',
},
],
student_ids: [ student_ids: [
{ required: true, message: t('studentIdsPlaceholder'), trigger: 'blur' }, { required: true, message: t('studentIdsPlaceholder'), trigger: 'blur' },
],
]
,
available_capacity: [ available_capacity: [
{ required: true, message: t('availableCapacityPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('availableCapacityPlaceholder'),
, trigger: 'blur',
},
],
status: [ status: [
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, { required: true, message: t('statusPlaceholder'), trigger: 'blur' },
],
]
,
} }
}) })
@ -156,11 +213,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -169,14 +228,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if(row){ if (row) {
const data = await (await getCourseScheduleInfo(row.id)).data const data = await (await getCourseScheduleInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -194,7 +252,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -221,13 +284,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label{ .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

241
admin/src/app/views/course_schedule/course_schedule.vue

@ -1,90 +1,202 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addCourseSchedule') }} {{ t('addCourseSchedule') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="courseScheduleTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="courseScheduleTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-input v-model="courseScheduleTable.searchParam.campus_id" :placeholder="t('campusIdPlaceholder')" /> <el-input
v-model="courseScheduleTable.searchParam.campus_id"
:placeholder="t('campusIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('venueId')" prop="venue_id"> <el-form-item :label="t('venueId')" prop="venue_id">
<el-input v-model="courseScheduleTable.searchParam.venue_id" :placeholder="t('venueIdPlaceholder')" /> <el-input
v-model="courseScheduleTable.searchParam.venue_id"
:placeholder="t('venueIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('courseDate')" prop="course_date"> <el-form-item :label="t('courseDate')" prop="course_date">
<el-input v-model="courseScheduleTable.searchParam.course_date" :placeholder="t('courseDatePlaceholder')" /> <el-input
v-model="courseScheduleTable.searchParam.course_date"
:placeholder="t('courseDatePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('timeSlot')" prop="time_slot"> <el-form-item :label="t('timeSlot')" prop="time_slot">
<el-input v-model="courseScheduleTable.searchParam.time_slot" :placeholder="t('timeSlotPlaceholder')" /> <el-input
v-model="courseScheduleTable.searchParam.time_slot"
:placeholder="t('timeSlotPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('courseId')" prop="course_id"> <el-form-item :label="t('courseId')" prop="course_id">
<el-input v-model="courseScheduleTable.searchParam.course_id" :placeholder="t('courseIdPlaceholder')" /> <el-input
v-model="courseScheduleTable.searchParam.course_id"
:placeholder="t('courseIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('coachId')" prop="coach_id"> <el-form-item :label="t('coachId')" prop="coach_id">
<el-input v-model="courseScheduleTable.searchParam.coach_id" :placeholder="t('coachIdPlaceholder')" /> <el-input
v-model="courseScheduleTable.searchParam.coach_id"
:placeholder="t('coachIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('participants')" prop="participants"> <el-form-item :label="t('participants')" prop="participants">
<el-input v-model="courseScheduleTable.searchParam.participants" :placeholder="t('participantsPlaceholder')" /> <el-input
v-model="courseScheduleTable.searchParam.participants"
:placeholder="t('participantsPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('studentIds')" prop="student_ids"> <el-form-item :label="t('studentIds')" prop="student_ids">
<el-input v-model="courseScheduleTable.searchParam.student_ids" :placeholder="t('studentIdsPlaceholder')" /> <el-input
v-model="courseScheduleTable.searchParam.student_ids"
:placeholder="t('studentIdsPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('availableCapacity')" prop="available_capacity"> <el-form-item
<el-input v-model="courseScheduleTable.searchParam.available_capacity" :placeholder="t('availableCapacityPlaceholder')" /> :label="t('availableCapacity')"
prop="available_capacity"
>
<el-input
v-model="courseScheduleTable.searchParam.available_capacity"
:placeholder="t('availableCapacityPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('status')" prop="status"> <el-form-item :label="t('status')" prop="status">
<el-input v-model="courseScheduleTable.searchParam.status" :placeholder="t('statusPlaceholder')" /> <el-input
v-model="courseScheduleTable.searchParam.status"
:placeholder="t('statusPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadCourseScheduleList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadCourseScheduleList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="courseScheduleTable.data" size="large" v-loading="courseScheduleTable.loading"> <el-table
:data="courseScheduleTable.data"
size="large"
v-loading="courseScheduleTable.loading"
>
<template #empty> <template #empty>
<span>{{ !courseScheduleTable.loading ? t('emptyData') : '' }}</span> <span>{{
!courseScheduleTable.loading ? t('emptyData') : ''
}}</span>
</template> </template>
<el-table-column prop="campus_id" :label="t('campusId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="campus_id"
:label="t('campusId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="venue_id" :label="t('venueId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="venue_id"
:label="t('venueId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="course_date" :label="t('courseDate')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="course_date"
:label="t('courseDate')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="time_slot" :label="t('timeSlot')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="time_slot"
:label="t('timeSlot')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="course_id" :label="t('courseId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="course_id"
:label="t('courseId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="coach_id" :label="t('coachId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="coach_id"
:label="t('coachId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="participants" :label="t('participants')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="participants"
:label="t('participants')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="student_ids" :label="t('studentIds')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="student_ids"
:label="t('studentIds')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="available_capacity" :label="t('availableCapacity')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="available_capacity"
:label="t('availableCapacity')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="status" :label="t('status')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="status"
:label="t('status')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="courseScheduleTable.page" v-model:page-size="courseScheduleTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="courseScheduleTable.total" v-model:current-page="courseScheduleTable.page"
@size-change="loadCourseScheduleList()" @current-change="loadCourseScheduleList" /> v-model:page-size="courseScheduleTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="courseScheduleTable.total"
@size-change="loadCourseScheduleList()"
@current-change="loadCourseScheduleList"
/>
</div> </div>
</div> </div>
@ -97,13 +209,16 @@
import { reactive, ref, watch } from 'vue' import { reactive, ref, watch } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getCourseScheduleList, deleteCourseSchedule } from '@/app/api/course_schedule' import {
getCourseScheduleList,
deleteCourseSchedule,
} from '@/app/api/course_schedule'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/course_schedule/components/course-schedule-edit.vue' import Edit from '@/app/views/course_schedule/components/course-schedule-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let courseScheduleTable = reactive({ let courseScheduleTable = reactive({
page: 1, page: 1,
@ -111,18 +226,18 @@ let courseScheduleTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"campus_id":"", campus_id: '',
"venue_id":"", venue_id: '',
"course_date":"", course_date: '',
"time_slot":"", time_slot: '',
"course_id":"", course_id: '',
"coach_id":"", coach_id: '',
"participants":"", participants: '',
"student_ids":"", student_ids: '',
"available_capacity":"", available_capacity: '',
"status":"" status: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -132,7 +247,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取课程安排列表 * 获取课程安排列表
*/ */
@ -143,12 +257,14 @@ const loadCourseScheduleList = (page: number = 1) => {
getCourseScheduleList({ getCourseScheduleList({
page: courseScheduleTable.page, page: courseScheduleTable.page,
limit: courseScheduleTable.limit, limit: courseScheduleTable.limit,
...courseScheduleTable.searchParam ...courseScheduleTable.searchParam,
}).then(res => { })
.then((res) => {
courseScheduleTable.loading = false courseScheduleTable.loading = false
courseScheduleTable.data = res.data.data courseScheduleTable.data = res.data.data
courseScheduleTable.total = res.data.total courseScheduleTable.total = res.data.total
}).catch(() => { })
.catch(() => {
courseScheduleTable.loading = false courseScheduleTable.loading = false
}) })
} }
@ -177,22 +293,19 @@ const editEvent = (data: any) => {
* 删除课程安排 * 删除课程安排
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('courseScheduleDeleteTips'), t('warning'), ElMessageBox.confirm(t('courseScheduleDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteCourseSchedule(id)
deleteCourseSchedule(id).then(() => { .then(() => {
loadCourseScheduleList() loadCourseScheduleList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
@ -209,5 +322,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

148
admin/src/app/views/customer_resource_changes/components/customer-resource-changes-edit.vue

@ -1,38 +1,90 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateCustomerResourceChanges') : t('addCustomerResourceChanges')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
<el-form-item :label="t('customerResourceId')" prop="customer_resource_id"> :title="
<el-input v-model="formData.customer_resource_id" clearable :placeholder="t('customerResourceIdPlaceholder')" class="input-width" /> formData.id
? t('updateCustomerResourceChanges')
: t('addCustomerResourceChanges')
"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item
:label="t('customerResourceId')"
prop="customer_resource_id"
>
<el-input
v-model="formData.customer_resource_id"
clearable
:placeholder="t('customerResourceIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('operatorId')" prop="operator_id"> <el-form-item :label="t('operatorId')" prop="operator_id">
<el-input v-model="formData.operator_id" clearable :placeholder="t('operatorIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.operator_id"
clearable
:placeholder="t('operatorIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-input v-model="formData.campus_id" clearable :placeholder="t('campusIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.campus_id"
clearable
:placeholder="t('campusIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('modifiedFields')" prop="modified_fields"> <el-form-item :label="t('modifiedFields')" prop="modified_fields">
<el-input v-model="formData.modified_fields" clearable :placeholder="t('modifiedFieldsPlaceholder')" class="input-width" /> <el-input
v-model="formData.modified_fields"
clearable
:placeholder="t('modifiedFieldsPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('oldValues')" prop="old_values"> <el-form-item :label="t('oldValues')" prop="old_values">
<el-input v-model="formData.old_values" clearable :placeholder="t('oldValuesPlaceholder')" class="input-width" /> <el-input
v-model="formData.old_values"
clearable
:placeholder="t('oldValuesPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('newValues')" prop="new_values"> <el-form-item :label="t('newValues')" prop="new_values">
<el-input v-model="formData.new_values" clearable :placeholder="t('newValuesPlaceholder')" class="input-width" /> <el-input
v-model="formData.new_values"
clearable
:placeholder="t('newValuesPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -43,7 +95,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addCustomerResourceChanges, editCustomerResourceChanges, getCustomerResourceChangesInfo } from '@/app/api/customer_resource_changes' import {
addCustomerResourceChanges,
editCustomerResourceChanges,
getCustomerResourceChangesInfo,
} from '@/app/api/customer_resource_changes'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -68,35 +124,31 @@ const formRef = ref<FormInstance>()
const formRules = computed(() => { const formRules = computed(() => {
return { return {
customer_resource_id: [ customer_resource_id: [
{ required: true, message: t('customerResourceIdPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('customerResourceIdPlaceholder'),
, trigger: 'blur',
},
],
operator_id: [ operator_id: [
{ required: true, message: t('operatorIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('operatorIdPlaceholder'), trigger: 'blur' },
],
]
,
campus_id: [ campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
],
]
,
modified_fields: [ modified_fields: [
{ required: true, message: t('modifiedFieldsPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('modifiedFieldsPlaceholder'),
, trigger: 'blur',
},
],
old_values: [ old_values: [
{ required: true, message: t('oldValuesPlaceholder'), trigger: 'blur' }, { required: true, message: t('oldValuesPlaceholder'), trigger: 'blur' },
],
]
,
new_values: [ new_values: [
{ required: true, message: t('newValuesPlaceholder'), trigger: 'blur' }, { required: true, message: t('newValuesPlaceholder'), trigger: 'blur' },
],
]
,
} }
}) })
@ -108,7 +160,9 @@ const emit = defineEmits(['complete'])
*/ */
const confirm = async (formEl: FormInstance | undefined) => { const confirm = async (formEl: FormInstance | undefined) => {
if (loading.value || !formEl) return if (loading.value || !formEl) return
let save = formData.id ? editCustomerResourceChanges : addCustomerResourceChanges let save = formData.id
? editCustomerResourceChanges
: addCustomerResourceChanges
await formEl.validate(async (valid) => { await formEl.validate(async (valid) => {
if (valid) { if (valid) {
@ -116,11 +170,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -129,14 +185,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if(row){ if (row) {
const data = await (await getCustomerResourceChangesInfo(row.id)).data const data = await (await getCustomerResourceChangesInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -154,7 +209,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -181,13 +241,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label{ .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

194
admin/src/app/views/customer_resource_changes/customer_resource_changes.vue

@ -1,74 +1,161 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addCustomerResourceChanges') }} {{ t('addCustomerResourceChanges') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="customerResourceChangesTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
<el-form-item :label="t('customerResourceId')" prop="customer_resource_id"> shadow="never"
<el-input v-model="customerResourceChangesTable.searchParam.customer_resource_id" :placeholder="t('customerResourceIdPlaceholder')" /> >
<el-form
:inline="true"
:model="customerResourceChangesTable.searchParam"
ref="searchFormRef"
>
<el-form-item
:label="t('customerResourceId')"
prop="customer_resource_id"
>
<el-input
v-model="
customerResourceChangesTable.searchParam.customer_resource_id
"
:placeholder="t('customerResourceIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('operatorId')" prop="operator_id"> <el-form-item :label="t('operatorId')" prop="operator_id">
<el-input v-model="customerResourceChangesTable.searchParam.operator_id" :placeholder="t('operatorIdPlaceholder')" /> <el-input
v-model="customerResourceChangesTable.searchParam.operator_id"
:placeholder="t('operatorIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-input v-model="customerResourceChangesTable.searchParam.campus_id" :placeholder="t('campusIdPlaceholder')" /> <el-input
v-model="customerResourceChangesTable.searchParam.campus_id"
:placeholder="t('campusIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('modifiedFields')" prop="modified_fields"> <el-form-item :label="t('modifiedFields')" prop="modified_fields">
<el-input v-model="customerResourceChangesTable.searchParam.modified_fields" :placeholder="t('modifiedFieldsPlaceholder')" /> <el-input
v-model="customerResourceChangesTable.searchParam.modified_fields"
:placeholder="t('modifiedFieldsPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('oldValues')" prop="old_values"> <el-form-item :label="t('oldValues')" prop="old_values">
<el-input v-model="customerResourceChangesTable.searchParam.old_values" :placeholder="t('oldValuesPlaceholder')" /> <el-input
v-model="customerResourceChangesTable.searchParam.old_values"
:placeholder="t('oldValuesPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('newValues')" prop="new_values"> <el-form-item :label="t('newValues')" prop="new_values">
<el-input v-model="customerResourceChangesTable.searchParam.new_values" :placeholder="t('newValuesPlaceholder')" /> <el-input
v-model="customerResourceChangesTable.searchParam.new_values"
:placeholder="t('newValuesPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadCustomerResourceChangesList()">{{ t('search') }}</el-button> <el-button
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> type="primary"
@click="loadCustomerResourceChangesList()"
>{{ t('search') }}</el-button
>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="customerResourceChangesTable.data" size="large" v-loading="customerResourceChangesTable.loading"> <el-table
:data="customerResourceChangesTable.data"
size="large"
v-loading="customerResourceChangesTable.loading"
>
<template #empty> <template #empty>
<span>{{ !customerResourceChangesTable.loading ? t('emptyData') : '' }}</span> <span>{{
!customerResourceChangesTable.loading ? t('emptyData') : ''
}}</span>
</template> </template>
<el-table-column prop="customer_resource_id" :label="t('customerResourceId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="customer_resource_id"
:label="t('customerResourceId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="operator_id" :label="t('operatorId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="operator_id"
:label="t('operatorId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="campus_id" :label="t('campusId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="campus_id"
:label="t('campusId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="modified_fields" :label="t('modifiedFields')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="modified_fields"
:label="t('modifiedFields')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="old_values" :label="t('oldValues')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="old_values"
:label="t('oldValues')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="new_values" :label="t('newValues')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="new_values"
:label="t('newValues')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="customerResourceChangesTable.page" v-model:page-size="customerResourceChangesTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="customerResourceChangesTable.total" v-model:current-page="customerResourceChangesTable.page"
@size-change="loadCustomerResourceChangesList()" @current-change="loadCustomerResourceChangesList" /> v-model:page-size="customerResourceChangesTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="customerResourceChangesTable.total"
@size-change="loadCustomerResourceChangesList()"
@current-change="loadCustomerResourceChangesList"
/>
</div> </div>
</div> </div>
<edit ref="editCustomerResourceChangesDialog" @complete="loadCustomerResourceChangesList" /> <edit
ref="editCustomerResourceChangesDialog"
@complete="loadCustomerResourceChangesList"
/>
</el-card> </el-card>
</div> </div>
</template> </template>
@ -77,13 +164,16 @@
import { reactive, ref, watch } from 'vue' import { reactive, ref, watch } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getCustomerResourceChangesList, deleteCustomerResourceChanges } from '@/app/api/customer_resource_changes' import {
getCustomerResourceChangesList,
deleteCustomerResourceChanges,
} from '@/app/api/customer_resource_changes'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/customer_resource_changes/components/customer-resource-changes-edit.vue' import Edit from '@/app/views/customer_resource_changes/components/customer-resource-changes-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let customerResourceChangesTable = reactive({ let customerResourceChangesTable = reactive({
page: 1, page: 1,
@ -91,14 +181,14 @@ let customerResourceChangesTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"customer_resource_id":"", customer_resource_id: '',
"operator_id":"", operator_id: '',
"campus_id":"", campus_id: '',
"modified_fields":"", modified_fields: '',
"old_values":"", old_values: '',
"new_values":"" new_values: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -108,7 +198,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取客户资源表变更记录列表 * 获取客户资源表变更记录列表
*/ */
@ -119,12 +208,14 @@ const loadCustomerResourceChangesList = (page: number = 1) => {
getCustomerResourceChangesList({ getCustomerResourceChangesList({
page: customerResourceChangesTable.page, page: customerResourceChangesTable.page,
limit: customerResourceChangesTable.limit, limit: customerResourceChangesTable.limit,
...customerResourceChangesTable.searchParam ...customerResourceChangesTable.searchParam,
}).then(res => { })
.then((res) => {
customerResourceChangesTable.loading = false customerResourceChangesTable.loading = false
customerResourceChangesTable.data = res.data.data customerResourceChangesTable.data = res.data.data
customerResourceChangesTable.total = res.data.total customerResourceChangesTable.total = res.data.total
}).catch(() => { })
.catch(() => {
customerResourceChangesTable.loading = false customerResourceChangesTable.loading = false
}) })
} }
@ -153,22 +244,19 @@ const editEvent = (data: any) => {
* 删除客户资源表变更记录 * 删除客户资源表变更记录
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('customerResourceChangesDeleteTips'), t('warning'), ElMessageBox.confirm(t('customerResourceChangesDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteCustomerResourceChanges(id)
deleteCustomerResourceChanges(id).then(() => { .then(() => {
loadCustomerResourceChangesList() loadCustomerResourceChangesList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
@ -185,5 +273,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

394
admin/src/app/views/customer_resources/components/customer-resources-edit.vue

@ -1,8 +1,28 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateCustomerResources') : t('addCustomerResources')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="
formData.id ? t('updateCustomerResources') : t('addCustomerResources')
"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('source')" prop="source"> <el-form-item :label="t('source')" prop="source">
<el-select class="input-width" v-model="formData.source" clearable :placeholder="t('sourcePlaceholder')"> <el-select
class="input-width"
v-model="formData.source"
clearable
:placeholder="t('sourcePlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in sourceList" v-for="(item, index) in sourceList"
@ -14,7 +34,12 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('sourceChannel')" v-if="formData.source == 1"> <el-form-item :label="t('sourceChannel')" v-if="formData.source == 1">
<el-select class="input-width" v-model="formData.source_channel" clearable :placeholder="t('sourceChannelPlaceholder')"> <el-select
class="input-width"
v-model="formData.source_channel"
clearable
:placeholder="t('sourceChannelPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in source_channelList" v-for="(item, index) in source_channelList"
@ -26,15 +51,32 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('name')" prop="name"> <el-form-item :label="t('name')" prop="name">
<el-input v-model="formData.name" clearable :placeholder="t('namePlaceholder')" class="input-width" /> <el-input
v-model="formData.name"
clearable
:placeholder="t('namePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('age')" prop="age"> <el-form-item :label="t('age')" prop="age">
<el-input-number v-model="formData.age" clearable :placeholder="t('agePlaceholder')" class="input-width" :min = "3" :max = "80" /> <el-input-number
v-model="formData.age"
clearable
:placeholder="t('agePlaceholder')"
class="input-width"
:min="3"
:max="80"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('gender')" prop="gender"> <el-form-item :label="t('gender')" prop="gender">
<el-select class="input-width" v-model="formData.gender" clearable :placeholder="t('genderPlaceholder')"> <el-select
class="input-width"
v-model="formData.gender"
clearable
:placeholder="t('genderPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in genderList" v-for="(item, index) in genderList"
@ -46,14 +88,31 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('phoneNumber')" prop="phone_number"> <el-form-item :label="t('phoneNumber')" prop="phone_number">
<el-input v-model="formData.phone_number" clearable :placeholder="t('phoneNumberPlaceholder')" class="input-width" /> <el-input
v-model="formData.phone_number"
clearable
:placeholder="t('phoneNumberPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('demand')" prop="demand"> <el-form-item :label="t('demand')" prop="demand">
<el-input v-model="formData.demand" type="textarea" rows="4" clearable :placeholder="t('demandPlaceholder')" class="input-width"/> <el-input
v-model="formData.demand"
type="textarea"
rows="4"
clearable
:placeholder="t('demandPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('purchasingPower')" prop="purchasing_power"> <el-form-item :label="t('purchasingPower')" prop="purchasing_power">
<el-select class="input-width" v-model="formData.purchasing_power" clearable :placeholder="t('purchasingPowerPlaceholder')"> <el-select
class="input-width"
v-model="formData.purchasing_power"
clearable
:placeholder="t('purchasingPowerPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in purchasing_powerList" v-for="(item, index) in purchasing_powerList"
@ -65,7 +124,12 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('cognitiveIdea')" prop="cognitive_idea"> <el-form-item :label="t('cognitiveIdea')" prop="cognitive_idea">
<el-select class="input-width" v-model="formData.cognitive_idea" clearable :placeholder="t('cognitiveIdeaPlaceholder')"> <el-select
class="input-width"
v-model="formData.cognitive_idea"
clearable
:placeholder="t('cognitiveIdeaPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in cognitive_ideaList" v-for="(item, index) in cognitive_ideaList"
@ -76,26 +140,46 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionalClassTime')" prop="optional_class_time" class="input-width"> <el-form-item
:label="t('optionalClassTime')"
prop="optional_class_time"
class="input-width"
>
<el-date-picker <el-date-picker
class="flex-1 !flex" class="flex-1 !flex"
v-model="formData.optional_class_time" v-model="formData.optional_class_time"
clearable clearable
type="datetime" type="datetime"
value-format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="t('optionalClassTimePlaceholder')"> :placeholder="t('optionalClassTimePlaceholder')"
>
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item :label="t('distance')" prop="distance"> <el-form-item :label="t('distance')" prop="distance">
<el-input v-model="formData.distance" clearable :placeholder="t('distancePlaceholder')" class="input-width" /> <el-input
v-model="formData.distance"
clearable
:placeholder="t('distancePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('decisionMaker')" prop="decision_maker"> <el-form-item :label="t('decisionMaker')" prop="decision_maker">
<el-input v-model="formData.decision_maker" clearable :placeholder="t('decisionMakerPlaceholder')" class="input-width" /> <el-input
v-model="formData.decision_maker"
clearable
:placeholder="t('decisionMakerPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('initialIntent')" prop="initial_intent"> <el-form-item :label="t('initialIntent')" prop="initial_intent">
<el-select class="input-width" v-model="formData.initial_intent" clearable :placeholder="t('initialIntentPlaceholder')"> <el-select
class="input-width"
v-model="formData.initial_intent"
clearable
:placeholder="t('initialIntentPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in initial_intentList" v-for="(item, index) in initial_intentList"
@ -107,7 +191,12 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('campus')" prop="campus"> <el-form-item :label="t('campus')" prop="campus">
<el-select class="input-width" v-model="formData.campus" clearable :placeholder="t('campusPlaceholder')"> <el-select
class="input-width"
v-model="formData.campus"
clearable
:placeholder="t('campusPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in campusList" v-for="(item, index) in campusList"
@ -119,7 +208,12 @@
</el-form-item> </el-form-item>
<el-form-item :label="t('status')" prop="status"> <el-form-item :label="t('status')" prop="status">
<el-select class="input-width" v-model="formData.status" clearable :placeholder="t('statusPlaceholder')"> <el-select
class="input-width"
v-model="formData.status"
clearable
:placeholder="t('statusPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in statusList" v-for="(item, index) in statusList"
@ -129,15 +223,17 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -148,7 +244,12 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addCustomerResources, editCustomerResources, getCustomerResourcesInfo, getWithCampusList } from '@/app/api/customer_resources' import {
addCustomerResources,
editCustomerResources,
getCustomerResourcesInfo,
getWithCampusList,
} from '@/app/api/customer_resources'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -183,90 +284,83 @@ const formRules = computed(() => {
return { return {
source: [ source: [
{ required: true, message: t('sourcePlaceholder'), trigger: 'blur' }, { required: true, message: t('sourcePlaceholder'), trigger: 'blur' },
],
]
,
source_channel: [ source_channel: [
{ required: true, message: t('sourceChannelPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('sourceChannelPlaceholder'),
, trigger: 'blur',
name: [ },
{ required: true, message: t('namePlaceholder'), trigger: 'blur' }, ],
name: [{ required: true, message: t('namePlaceholder'), trigger: 'blur' }],
] age: [
,
age: [
{ required: true, message: t('agePlaceholder'), trigger: 'blur' }, { required: true, message: t('agePlaceholder'), trigger: 'blur' },
{ {
validator: (rule: any, value: number, callback: any) => { validator: (rule: any, value: number, callback: any) => {
if (value === undefined || value === null || value === '') { if (value === undefined || value === null || value === '') {
callback(); callback()
} else if (value < 3 || value > 80) { } else if (value < 3 || value > 80) {
callback(new Error(t('generateBetween'))); callback(new Error(t('generateBetween')))
} else { } else {
callback(); callback()
} }
}, },
trigger: 'blur' trigger: 'blur',
} },
] ],
,
gender: [ gender: [
{ required: true, message: t('genderPlaceholder'), trigger: 'blur' }, { required: true, message: t('genderPlaceholder'), trigger: 'blur' },
],
]
,
phone_number: [ phone_number: [
{ required: true, message: t('phoneNumberPlaceholder'), trigger: 'blur' }, { required: true, message: t('phoneNumberPlaceholder'), trigger: 'blur' },
],
]
,
demand: [ demand: [
{ required: true, message: t('demandPlaceholder'), trigger: 'blur' }, { required: true, message: t('demandPlaceholder'), trigger: 'blur' },
],
]
,
purchasing_power: [ purchasing_power: [
{ required: true, message: t('purchasingPowerPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('purchasingPowerPlaceholder'),
, trigger: 'blur',
},
],
cognitive_idea: [ cognitive_idea: [
{ required: true, message: t('cognitiveIdeaPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('cognitiveIdeaPlaceholder'),
, trigger: 'blur',
},
],
optional_class_time: [ optional_class_time: [
{ required: true, message: t('optionalClassTimePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('optionalClassTimePlaceholder'),
, trigger: 'blur',
},
],
distance: [ distance: [
{ required: true, message: t('distancePlaceholder'), trigger: 'blur' }, { required: true, message: t('distancePlaceholder'), trigger: 'blur' },
],
]
,
decision_maker: [ decision_maker: [
{ required: true, message: t('decisionMakerPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('decisionMakerPlaceholder'),
, trigger: 'blur',
},
],
initial_intent: [ initial_intent: [
{ required: true, message: t('initialIntentPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('initialIntentPlaceholder'),
, trigger: 'blur',
},
],
campus: [ campus: [
{ required: true, message: t('campusPlaceholder'), trigger: 'blur' }, { required: true, message: t('campusPlaceholder'), trigger: 'blur' },
],
]
,
status: [ status: [
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, { required: true, message: t('statusPlaceholder'), trigger: 'blur' },
],
]
,
} }
}) })
@ -286,11 +380,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -298,61 +394,104 @@ const confirm = async (formEl: FormInstance | undefined) => {
} }
// //
let sourceList = ref([]) let sourceList = ref([])
const sourceDictList = async () => { const sourceDictList = async () => {
sourceList.value = await (await useDictionary('source')).data.dictionary sourceList.value = await (await useDictionary('source')).data.dictionary
}
sourceDictList()
watch(
() => sourceList.value,
() => {
formData.source = sourceList.value[0].value
} }
sourceDictList(); )
watch(() => sourceList.value, () => { formData.source = sourceList.value[0].value }) let source_channelList = ref([])
let source_channelList = ref([]) const source_channelDictList = async () => {
const source_channelDictList = async () => { source_channelList.value = await (
source_channelList.value = await (await useDictionary('SourceChannel')).data.dictionary await useDictionary('SourceChannel')
).data.dictionary
}
source_channelDictList()
watch(
() => source_channelList.value,
() => {
formData.source_channel = source_channelList.value[0].value
} }
source_channelDictList(); )
watch(() => source_channelList.value, () => { formData.source_channel = source_channelList.value[0].value }) let genderList = ref([])
let genderList = ref([]) const genderDictList = async () => {
const genderDictList = async () => {
genderList.value = await (await useDictionary('zy_sex')).data.dictionary genderList.value = await (await useDictionary('zy_sex')).data.dictionary
}
genderDictList()
watch(
() => genderList.value,
() => {
formData.gender = genderList.value[0].value
} }
genderDictList(); )
watch(() => genderList.value, () => { formData.gender = genderList.value[0].value }) let purchasing_powerList = ref([])
let purchasing_powerList = ref([]) const purchasing_powerDictList = async () => {
const purchasing_powerDictList = async () => { purchasing_powerList.value = await (
purchasing_powerList.value = await (await useDictionary('customer_purchasing_power')).data.dictionary await useDictionary('customer_purchasing_power')
).data.dictionary
}
purchasing_powerDictList()
watch(
() => purchasing_powerList.value,
() => {
formData.purchasing_power = purchasing_powerList.value[0].value
} }
purchasing_powerDictList(); )
watch(() => purchasing_powerList.value, () => { formData.purchasing_power = purchasing_powerList.value[0].value }) let cognitive_ideaList = ref([])
let cognitive_ideaList = ref([]) const cognitive_ideaDictList = async () => {
const cognitive_ideaDictList = async () => { cognitive_ideaList.value = await (
cognitive_ideaList.value = await (await useDictionary('cognitive_concept')).data.dictionary await useDictionary('cognitive_concept')
).data.dictionary
}
cognitive_ideaDictList()
watch(
() => cognitive_ideaList.value,
() => {
formData.cognitive_idea = cognitive_ideaList.value[0].value
} }
cognitive_ideaDictList(); )
watch(() => cognitive_ideaList.value, () => { formData.cognitive_idea = cognitive_ideaList.value[0].value }) let initial_intentList = ref([])
let initial_intentList = ref([]) const initial_intentDictList = async () => {
const initial_intentDictList = async () => { initial_intentList.value = await (
initial_intentList.value = await (await useDictionary('preliminarycustomerintention')).data.dictionary await useDictionary('preliminarycustomerintention')
).data.dictionary
}
initial_intentDictList()
watch(
() => initial_intentList.value,
() => {
formData.initial_intent = initial_intentList.value[0].value
} }
initial_intentDictList(); )
watch(() => initial_intentList.value, () => { formData.initial_intent = initial_intentList.value[0].value }) let statusList = ref([])
let statusList = ref([]) const statusDictList = async () => {
const statusDictList = async () => {
statusList.value = await (await useDictionary('kh_status')).data.dictionary statusList.value = await (await useDictionary('kh_status')).data.dictionary
}
statusDictList()
watch(
() => statusList.value,
() => {
formData.status = statusList.value[0].value
} }
statusDictList(); )
watch(() => statusList.value, () => { formData.status = statusList.value[0].value })
const campusList = ref([] as any[])
const campusList = ref([] as any[]) const setCampusList = async () => {
const setCampusList = async () => {
campusList.value = await (await getWithCampusList({})).data campusList.value = await (await getWithCampusList({})).data
} }
setCampusList() setCampusList()
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if(row){ if (row) {
const data = await (await getCustomerResourcesInfo(row.id)).data const data = await (await getCustomerResourcesInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -370,7 +509,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -397,13 +541,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label{ .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

243
admin/src/app/views/customer_resources/customer_resources.vue

@ -1,35 +1,63 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addCustomerResources') }} {{ t('addCustomerResources') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="customerResourcesTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="customerResourcesTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('name')" prop="name"> <el-form-item :label="t('name')" prop="name">
<el-input v-model="customerResourcesTable.searchParam.name" :placeholder="t('namePlaceholder')" /> <el-input
v-model="customerResourcesTable.searchParam.name"
:placeholder="t('namePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('phoneNumber')" prop="phone_number"> <el-form-item :label="t('phoneNumber')" prop="phone_number">
<el-input v-model="customerResourcesTable.searchParam.phone_number" :placeholder="t('phoneNumberPlaceholder')" /> <el-input
v-model="customerResourcesTable.searchParam.phone_number"
:placeholder="t('phoneNumberPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadCustomerResourcesList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadCustomerResourcesList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="customerResourcesTable.data" size="large" v-loading="customerResourcesTable.loading"> <el-table
:data="customerResourcesTable.data"
size="large"
v-loading="customerResourcesTable.loading"
>
<template #empty> <template #empty>
<span>{{ !customerResourcesTable.loading ? t('emptyData') : '' }}</span> <span>{{
!customerResourcesTable.loading ? t('emptyData') : ''
}}</span>
</template> </template>
<el-table-column :label="t('source')" min-width="180" align="center" :show-overflow-tooltip="true"> <el-table-column
:label="t('source')"
min-width="180"
align="center"
:show-overflow-tooltip="true"
>
<template #default="{ row }"> <template #default="{ row }">
<div v-for="(item, index) in sourceList"> <div v-for="(item, index) in sourceList">
<div v-if="item.value == row.source">{{ item.name }}</div> <div v-if="item.value == row.source">{{ item.name }}</div>
@ -37,13 +65,33 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="consultant" :label="t('consultant')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="consultant"
:label="t('consultant')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="name" :label="t('name')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="name"
:label="t('name')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="age" :label="t('age')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="age"
:label="t('age')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('gender')" min-width="180" align="center" :show-overflow-tooltip="true"> <el-table-column
:label="t('gender')"
min-width="180"
align="center"
:show-overflow-tooltip="true"
>
<template #default="{ row }"> <template #default="{ row }">
<div v-for="(item, index) in genderList"> <div v-for="(item, index) in genderList">
<div v-if="item.value == row.gender">{{ item.name }}</div> <div v-if="item.value == row.gender">{{ item.name }}</div>
@ -51,26 +99,51 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="phone_number" :label="t('phoneNumber')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="phone_number"
:label="t('phoneNumber')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="decision_maker" :label="t('decisionMaker')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="decision_maker"
:label="t('decisionMaker')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="customerResourcesTable.page" v-model:page-size="customerResourcesTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="customerResourcesTable.total" v-model:current-page="customerResourcesTable.page"
@size-change="loadCustomerResourcesList()" @current-change="loadCustomerResourcesList" /> v-model:page-size="customerResourcesTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="customerResourcesTable.total"
@size-change="loadCustomerResourcesList()"
@current-change="loadCustomerResourcesList"
/>
</div> </div>
</div> </div>
<edit ref="editCustomerResourcesDialog" @complete="loadCustomerResourcesList" /> <edit
ref="editCustomerResourcesDialog"
@complete="loadCustomerResourcesList"
/>
</el-card> </el-card>
</div> </div>
</template> </template>
@ -79,13 +152,17 @@
import { reactive, ref, watch } from 'vue' import { reactive, ref, watch } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getCustomerResourcesList, deleteCustomerResources, getWithCampusList } from '@/app/api/customer_resources' import {
getCustomerResourcesList,
deleteCustomerResources,
getWithCampusList,
} from '@/app/api/customer_resources'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/customer_resources/components/customer-resources-edit.vue' import Edit from '@/app/views/customer_resources/components/customer-resources-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let customerResourcesTable = reactive({ let customerResourcesTable = reactive({
page: 1, page: 1,
@ -93,10 +170,10 @@ let customerResourcesTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"name":"", name: '',
"phone_number":"" phone_number: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -105,41 +182,49 @@ const searchFormRef = ref<FormInstance>()
const selectData = ref<any[]>([]) const selectData = ref<any[]>([])
// //
const sourceList = ref([] as any[]) const sourceList = ref([] as any[])
const sourceDictList = async () => { const sourceDictList = async () => {
sourceList.value = await (await useDictionary('source')).data.dictionary sourceList.value = await (await useDictionary('source')).data.dictionary
} }
sourceDictList(); sourceDictList()
const source_channelList = ref([] as any[]) const source_channelList = ref([] as any[])
const source_channelDictList = async () => { const source_channelDictList = async () => {
source_channelList.value = await (await useDictionary('SourceChannel')).data.dictionary source_channelList.value = await (
} await useDictionary('SourceChannel')
source_channelDictList(); ).data.dictionary
const genderList = ref([] as any[]) }
const genderDictList = async () => { source_channelDictList()
const genderList = ref([] as any[])
const genderDictList = async () => {
genderList.value = await (await useDictionary('zy_sex')).data.dictionary genderList.value = await (await useDictionary('zy_sex')).data.dictionary
} }
genderDictList(); genderDictList()
const purchasing_powerList = ref([] as any[]) const purchasing_powerList = ref([] as any[])
const purchasing_powerDictList = async () => { const purchasing_powerDictList = async () => {
purchasing_powerList.value = await (await useDictionary('customer_purchasing_power')).data.dictionary purchasing_powerList.value = await (
} await useDictionary('customer_purchasing_power')
purchasing_powerDictList(); ).data.dictionary
const cognitive_ideaList = ref([] as any[]) }
const cognitive_ideaDictList = async () => { purchasing_powerDictList()
cognitive_ideaList.value = await (await useDictionary('cognitive_concept')).data.dictionary const cognitive_ideaList = ref([] as any[])
} const cognitive_ideaDictList = async () => {
cognitive_ideaDictList(); cognitive_ideaList.value = await (
const initial_intentList = ref([] as any[]) await useDictionary('cognitive_concept')
const initial_intentDictList = async () => { ).data.dictionary
initial_intentList.value = await (await useDictionary('preliminarycustomerintention')).data.dictionary }
} cognitive_ideaDictList()
initial_intentDictList(); const initial_intentList = ref([] as any[])
const statusList = ref([] as any[]) const initial_intentDictList = async () => {
const statusDictList = async () => { initial_intentList.value = await (
await useDictionary('preliminarycustomerintention')
).data.dictionary
}
initial_intentDictList()
const statusList = ref([] as any[])
const statusDictList = async () => {
statusList.value = await (await useDictionary('kh_status')).data.dictionary statusList.value = await (await useDictionary('kh_status')).data.dictionary
} }
statusDictList(); statusDictList()
/** /**
* 获取客户资源列表 * 获取客户资源列表
@ -151,12 +236,14 @@ const loadCustomerResourcesList = (page: number = 1) => {
getCustomerResourcesList({ getCustomerResourcesList({
page: customerResourcesTable.page, page: customerResourcesTable.page,
limit: customerResourcesTable.limit, limit: customerResourcesTable.limit,
...customerResourcesTable.searchParam ...customerResourcesTable.searchParam,
}).then(res => { })
.then((res) => {
customerResourcesTable.loading = false customerResourcesTable.loading = false
customerResourcesTable.data = res.data.data customerResourcesTable.data = res.data.data
customerResourcesTable.total = res.data.total customerResourcesTable.total = res.data.total
}).catch(() => { })
.catch(() => {
customerResourcesTable.loading = false customerResourcesTable.loading = false
}) })
} }
@ -185,26 +272,24 @@ const editEvent = (data: any) => {
* 删除客户资源 * 删除客户资源
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('customerResourcesDeleteTips'), t('warning'), ElMessageBox.confirm(t('customerResourcesDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteCustomerResources(id)
deleteCustomerResources(id).then(() => { .then(() => {
loadCustomerResourcesList() loadCustomerResourcesList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const campusList = ref([])
const campusList = ref([]) const setCampusList = async () => {
const setCampusList = async () => {
campusList.value = await (await getWithCampusList({})).data campusList.value = await (await getWithCampusList({})).data
} }
setCampusList() setCampusList()
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
@ -222,5 +307,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

102
admin/src/app/views/departments/components/departments-edit.vue

@ -1,12 +1,35 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateDepartments') : t('addDepartments')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="formData.id ? t('updateDepartments') : t('addDepartments')"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('departmentName')" prop="department_name"> <el-form-item :label="t('departmentName')" prop="department_name">
<el-input v-model="formData.department_name" clearable :placeholder="t('departmentNamePlaceholder')" class="input-width" /> <el-input
v-model="formData.department_name"
clearable
:placeholder="t('departmentNamePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('parentDepartmentId')" > <el-form-item :label="t('parentDepartmentId')">
<el-select class="input-width" v-model="formData.parent_department_id" clearable :placeholder="t('parentDepartmentIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.parent_department_id"
clearable
:placeholder="t('parentDepartmentIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in parentDepartmentIdList" v-for="(item, index) in parentDepartmentIdList"
@ -16,15 +39,17 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -35,7 +60,12 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addDepartments, editDepartments, getDepartmentsInfo, getWithDepartmentsList } from '@/app/api/departments' import {
addDepartments,
editDepartments,
getDepartmentsInfo,
getWithDepartmentsList,
} from '@/app/api/departments'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -56,15 +86,19 @@ const formRef = ref<FormInstance>()
const formRules = computed(() => { const formRules = computed(() => {
return { return {
department_name: [ department_name: [
{ required: true, message: t('departmentNamePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('departmentNamePlaceholder'),
, trigger: 'blur',
},
],
parent_department_id: [ parent_department_id: [
{ required: true, message: t('parentDepartmentIdPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('parentDepartmentIdPlaceholder'),
, trigger: 'blur',
},
],
} }
}) })
@ -84,11 +118,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -97,19 +133,18 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const parentDepartmentIdList = ref([] as any[])
const setParentDepartmentIdList = async () => {
const parentDepartmentIdList = ref([] as any[])
const setParentDepartmentIdList = async () => {
parentDepartmentIdList.value = await (await getWithDepartmentsList({})).data parentDepartmentIdList.value = await (await getWithDepartmentsList({})).data
} }
setParentDepartmentIdList() setParentDepartmentIdList()
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if(row){ if (row) {
const data = await (await getDepartmentsInfo(row.id)).data const data = await (await getDepartmentsInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -127,7 +162,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -154,13 +194,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label{ .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

134
admin/src/app/views/departments/departments.vue

@ -1,22 +1,39 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addDepartments') }} {{ t('addDepartments') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="departmentsTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="departmentsTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('departmentName')" prop="department_name"> <el-form-item :label="t('departmentName')" prop="department_name">
<el-input v-model="departmentsTable.searchParam.department_name" :placeholder="t('departmentNamePlaceholder')" /> <el-input
v-model="departmentsTable.searchParam.department_name"
:placeholder="t('departmentNamePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('parentDepartmentId')" prop="parent_department_id"> <el-form-item
<el-select class="w-[280px]" v-model="departmentsTable.searchParam.parent_department_id" clearable :placeholder="t('parentDepartmentIdPlaceholder')"> :label="t('parentDepartmentId')"
prop="parent_department_id"
>
<el-select
class="w-[280px]"
v-model="departmentsTable.searchParam.parent_department_id"
clearable
:placeholder="t('parentDepartmentIdPlaceholder')"
>
<el-option <el-option
v-for="(item, index) in parentDepartmentIdList" v-for="(item, index) in parentDepartmentIdList"
:key="index" :key="index"
@ -27,33 +44,63 @@
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadDepartmentsList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadDepartmentsList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="departmentsTable.data" size="large" v-loading="departmentsTable.loading"> <el-table
:data="departmentsTable.data"
size="large"
v-loading="departmentsTable.loading"
>
<template #empty> <template #empty>
<span>{{ !departmentsTable.loading ? t('emptyData') : '' }}</span> <span>{{ !departmentsTable.loading ? t('emptyData') : '' }}</span>
</template> </template>
<el-table-column prop="department_name" :label="t('departmentName')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="department_name"
:label="t('departmentName')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="parent_department_id_name" :label="t('parentDepartmentId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="parent_department_id_name"
:label="t('parentDepartmentId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="departmentsTable.page" v-model:page-size="departmentsTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="departmentsTable.total" v-model:current-page="departmentsTable.page"
@size-change="loadDepartmentsList()" @current-change="loadDepartmentsList" /> v-model:page-size="departmentsTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="departmentsTable.total"
@size-change="loadDepartmentsList()"
@current-change="loadDepartmentsList"
/>
</div> </div>
</div> </div>
@ -66,13 +113,17 @@
import { reactive, ref, watch } from 'vue' import { reactive, ref, watch } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getDepartmentsList, deleteDepartments, getWithDepartmentsList } from '@/app/api/departments' import {
getDepartmentsList,
deleteDepartments,
getWithDepartmentsList,
} from '@/app/api/departments'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/departments/components/departments-edit.vue' import Edit from '@/app/views/departments/components/departments-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let departmentsTable = reactive({ let departmentsTable = reactive({
page: 1, page: 1,
@ -80,10 +131,10 @@ let departmentsTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"department_name":"", department_name: '',
"parent_department_id":"" parent_department_id: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -93,7 +144,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取部门列表 * 获取部门列表
*/ */
@ -104,12 +154,14 @@ const loadDepartmentsList = (page: number = 1) => {
getDepartmentsList({ getDepartmentsList({
page: departmentsTable.page, page: departmentsTable.page,
limit: departmentsTable.limit, limit: departmentsTable.limit,
...departmentsTable.searchParam ...departmentsTable.searchParam,
}).then(res => { })
.then((res) => {
departmentsTable.loading = false departmentsTable.loading = false
departmentsTable.data = res.data.data departmentsTable.data = res.data.data
departmentsTable.total = res.data.total departmentsTable.total = res.data.total
}).catch(() => { })
.catch(() => {
departmentsTable.loading = false departmentsTable.loading = false
}) })
} }
@ -138,26 +190,24 @@ const editEvent = (data: any) => {
* 删除部门 * 删除部门
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('departmentsDeleteTips'), t('warning'), ElMessageBox.confirm(t('departmentsDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteDepartments(id)
deleteDepartments(id).then(() => { .then(() => {
loadDepartmentsList() loadDepartmentsList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const parentDepartmentIdList = ref([])
const parentDepartmentIdList = ref([]) const setParentDepartmentIdList = async () => {
const setParentDepartmentIdList = async () => {
parentDepartmentIdList.value = await (await getWithDepartmentsList({})).data parentDepartmentIdList.value = await (await getWithDepartmentsList({})).data
} }
setParentDepartmentIdList() setParentDepartmentIdList()
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
@ -175,5 +225,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

116
admin/src/app/views/exam_answers/components/exam-answers-edit.vue

@ -1,34 +1,74 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateExamAnswers') : t('addExamAnswers')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="formData.id ? t('updateExamAnswers') : t('addExamAnswers')"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-input v-model="formData.campus_id" clearable :placeholder="t('campusIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.campus_id"
clearable
:placeholder="t('campusIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('userId')" prop="user_id"> <el-form-item :label="t('userId')" prop="user_id">
<el-input v-model="formData.user_id" clearable :placeholder="t('userIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.user_id"
clearable
:placeholder="t('userIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('questionId')" prop="question_id"> <el-form-item :label="t('questionId')" prop="question_id">
<el-input v-model="formData.question_id" clearable :placeholder="t('questionIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.question_id"
clearable
:placeholder="t('questionIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('answer')" > <el-form-item :label="t('answer')">
<el-input v-model="formData.answer" clearable :placeholder="t('answerPlaceholder')" class="input-width" /> <el-input
v-model="formData.answer"
clearable
:placeholder="t('answerPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('isCorrect')" > <el-form-item :label="t('isCorrect')">
<el-input v-model="formData.is_correct" clearable :placeholder="t('isCorrectPlaceholder')" class="input-width" /> <el-input
v-model="formData.is_correct"
clearable
:placeholder="t('isCorrectPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -39,7 +79,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addExamAnswers, editExamAnswers, getExamAnswersInfo } from '@/app/api/exam_answers' import {
addExamAnswers,
editExamAnswers,
getExamAnswersInfo,
} from '@/app/api/exam_answers'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -64,29 +108,19 @@ const formRules = computed(() => {
return { return {
campus_id: [ campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
],
]
,
user_id: [ user_id: [
{ required: true, message: t('userIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('userIdPlaceholder'), trigger: 'blur' },
],
]
,
question_id: [ question_id: [
{ required: true, message: t('questionIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('questionIdPlaceholder'), trigger: 'blur' },
],
]
,
answer: [ answer: [
{ required: true, message: t('answerPlaceholder'), trigger: 'blur' }, { required: true, message: t('answerPlaceholder'), trigger: 'blur' },
],
]
,
is_correct: [ is_correct: [
{ required: true, message: t('isCorrectPlaceholder'), trigger: 'blur' }, { required: true, message: t('isCorrectPlaceholder'), trigger: 'blur' },
],
]
,
} }
}) })
@ -106,11 +140,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -119,14 +155,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if(row){ if (row) {
const data = await (await getExamAnswersInfo(row.id)).data const data = await (await getExamAnswersInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -144,7 +179,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -171,13 +211,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label{ .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

167
admin/src/app/views/exam_answers/exam_answers.vue

@ -1,65 +1,132 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addExamAnswers') }} {{ t('addExamAnswers') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="examAnswersTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="examAnswersTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-input v-model="examAnswersTable.searchParam.campus_id" :placeholder="t('campusIdPlaceholder')" /> <el-input
v-model="examAnswersTable.searchParam.campus_id"
:placeholder="t('campusIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('userId')" prop="user_id"> <el-form-item :label="t('userId')" prop="user_id">
<el-input v-model="examAnswersTable.searchParam.user_id" :placeholder="t('userIdPlaceholder')" /> <el-input
v-model="examAnswersTable.searchParam.user_id"
:placeholder="t('userIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('questionId')" prop="question_id"> <el-form-item :label="t('questionId')" prop="question_id">
<el-input v-model="examAnswersTable.searchParam.question_id" :placeholder="t('questionIdPlaceholder')" /> <el-input
v-model="examAnswersTable.searchParam.question_id"
:placeholder="t('questionIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('answer')" prop="answer"> <el-form-item :label="t('answer')" prop="answer">
<el-input v-model="examAnswersTable.searchParam.answer" :placeholder="t('answerPlaceholder')" /> <el-input
v-model="examAnswersTable.searchParam.answer"
:placeholder="t('answerPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('isCorrect')" prop="is_correct"> <el-form-item :label="t('isCorrect')" prop="is_correct">
<el-input v-model="examAnswersTable.searchParam.is_correct" :placeholder="t('isCorrectPlaceholder')" /> <el-input
v-model="examAnswersTable.searchParam.is_correct"
:placeholder="t('isCorrectPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadExamAnswersList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadExamAnswersList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="examAnswersTable.data" size="large" v-loading="examAnswersTable.loading"> <el-table
:data="examAnswersTable.data"
size="large"
v-loading="examAnswersTable.loading"
>
<template #empty> <template #empty>
<span>{{ !examAnswersTable.loading ? t('emptyData') : '' }}</span> <span>{{ !examAnswersTable.loading ? t('emptyData') : '' }}</span>
</template> </template>
<el-table-column prop="campus_id" :label="t('campusId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="campus_id"
<el-table-column prop="user_id" :label="t('userId')" min-width="120" :show-overflow-tooltip="true"/> :label="t('campusId')"
min-width="120"
<el-table-column prop="question_id" :label="t('questionId')" min-width="120" :show-overflow-tooltip="true"/> :show-overflow-tooltip="true"
/>
<el-table-column prop="answer" :label="t('answer')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
<el-table-column prop="is_correct" :label="t('isCorrect')" min-width="120" :show-overflow-tooltip="true"/> prop="user_id"
:label="t('userId')"
<el-table-column :label="t('operation')" fixed="right" min-width="120"> min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="question_id"
:label="t('questionId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="answer"
:label="t('answer')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="is_correct"
:label="t('isCorrect')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="examAnswersTable.page" v-model:page-size="examAnswersTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="examAnswersTable.total" v-model:current-page="examAnswersTable.page"
@size-change="loadExamAnswersList()" @current-change="loadExamAnswersList" /> v-model:page-size="examAnswersTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="examAnswersTable.total"
@size-change="loadExamAnswersList()"
@current-change="loadExamAnswersList"
/>
</div> </div>
</div> </div>
@ -74,11 +141,11 @@ import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getExamAnswersList, deleteExamAnswers } from '@/app/api/exam_answers' import { getExamAnswersList, deleteExamAnswers } from '@/app/api/exam_answers'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/exam_answers/components/exam-answers-edit.vue' import Edit from '@/app/views/exam_answers/components/exam-answers-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let examAnswersTable = reactive({ let examAnswersTable = reactive({
page: 1, page: 1,
@ -86,13 +153,13 @@ let examAnswersTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"campus_id":"", campus_id: '',
"user_id":"", user_id: '',
"question_id":"", question_id: '',
"answer":"", answer: '',
"is_correct":"" is_correct: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -102,7 +169,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取答题记录列表 * 获取答题记录列表
*/ */
@ -113,12 +179,14 @@ const loadExamAnswersList = (page: number = 1) => {
getExamAnswersList({ getExamAnswersList({
page: examAnswersTable.page, page: examAnswersTable.page,
limit: examAnswersTable.limit, limit: examAnswersTable.limit,
...examAnswersTable.searchParam ...examAnswersTable.searchParam,
}).then(res => { })
.then((res) => {
examAnswersTable.loading = false examAnswersTable.loading = false
examAnswersTable.data = res.data.data examAnswersTable.data = res.data.data
examAnswersTable.total = res.data.total examAnswersTable.total = res.data.total
}).catch(() => { })
.catch(() => {
examAnswersTable.loading = false examAnswersTable.loading = false
}) })
} }
@ -147,22 +215,19 @@ const editEvent = (data: any) => {
* 删除答题记录 * 删除答题记录
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('examAnswersDeleteTips'), t('warning'), ElMessageBox.confirm(t('examAnswersDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteExamAnswers(id)
deleteExamAnswers(id).then(() => { .then(() => {
loadExamAnswersList() loadExamAnswersList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
@ -179,5 +244,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

102
admin/src/app/views/exam_papers/components/exam-papers-edit.vue

@ -1,26 +1,56 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateExamPapers') : t('addExamPapers')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="formData.id ? t('updateExamPapers') : t('addExamPapers')"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('selectionMode')" prop="selection_mode"> <el-form-item :label="t('selectionMode')" prop="selection_mode">
<el-input v-model="formData.selection_mode" clearable :placeholder="t('selectionModePlaceholder')" class="input-width" /> <el-input
v-model="formData.selection_mode"
clearable
:placeholder="t('selectionModePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('totalScore')" prop="total_score"> <el-form-item :label="t('totalScore')" prop="total_score">
<el-input v-model="formData.total_score" clearable :placeholder="t('totalScorePlaceholder')" class="input-width" /> <el-input
v-model="formData.total_score"
clearable
:placeholder="t('totalScorePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('passingScore')" prop="passing_score"> <el-form-item :label="t('passingScore')" prop="passing_score">
<el-input v-model="formData.passing_score" clearable :placeholder="t('passingScorePlaceholder')" class="input-width" /> <el-input
v-model="formData.passing_score"
clearable
:placeholder="t('passingScorePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -31,7 +61,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addExamPapers, editExamPapers, getExamPapersInfo } from '@/app/api/exam_papers' import {
addExamPapers,
editExamPapers,
getExamPapersInfo,
} from '@/app/api/exam_papers'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -53,20 +87,22 @@ const formRef = ref<FormInstance>()
const formRules = computed(() => { const formRules = computed(() => {
return { return {
selection_mode: [ selection_mode: [
{ required: true, message: t('selectionModePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('selectionModePlaceholder'),
, trigger: 'blur',
},
],
total_score: [ total_score: [
{ required: true, message: t('totalScorePlaceholder'), trigger: 'blur' }, { required: true, message: t('totalScorePlaceholder'), trigger: 'blur' },
],
]
,
passing_score: [ passing_score: [
{ required: true, message: t('passingScorePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('passingScorePlaceholder'),
, trigger: 'blur',
},
],
} }
}) })
@ -86,11 +122,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -99,14 +137,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if(row){ if (row) {
const data = await (await getExamPapersInfo(row.id)).data const data = await (await getExamPapersInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -124,7 +161,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -151,13 +193,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label{ .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

135
admin/src/app/views/exam_papers/exam_papers.vue

@ -1,55 +1,106 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addExamPapers') }} {{ t('addExamPapers') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="examPapersTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="examPapersTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('selectionMode')" prop="selection_mode"> <el-form-item :label="t('selectionMode')" prop="selection_mode">
<el-input v-model="examPapersTable.searchParam.selection_mode" :placeholder="t('selectionModePlaceholder')" /> <el-input
v-model="examPapersTable.searchParam.selection_mode"
:placeholder="t('selectionModePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('totalScore')" prop="total_score"> <el-form-item :label="t('totalScore')" prop="total_score">
<el-input v-model="examPapersTable.searchParam.total_score" :placeholder="t('totalScorePlaceholder')" /> <el-input
v-model="examPapersTable.searchParam.total_score"
:placeholder="t('totalScorePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('passingScore')" prop="passing_score"> <el-form-item :label="t('passingScore')" prop="passing_score">
<el-input v-model="examPapersTable.searchParam.passing_score" :placeholder="t('passingScorePlaceholder')" /> <el-input
v-model="examPapersTable.searchParam.passing_score"
:placeholder="t('passingScorePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadExamPapersList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadExamPapersList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="examPapersTable.data" size="large" v-loading="examPapersTable.loading"> <el-table
:data="examPapersTable.data"
size="large"
v-loading="examPapersTable.loading"
>
<template #empty> <template #empty>
<span>{{ !examPapersTable.loading ? t('emptyData') : '' }}</span> <span>{{ !examPapersTable.loading ? t('emptyData') : '' }}</span>
</template> </template>
<el-table-column prop="selection_mode" :label="t('selectionMode')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="selection_mode"
<el-table-column prop="total_score" :label="t('totalScore')" min-width="120" :show-overflow-tooltip="true"/> :label="t('selectionMode')"
min-width="120"
<el-table-column prop="passing_score" :label="t('passingScore')" min-width="120" :show-overflow-tooltip="true"/> :show-overflow-tooltip="true"
/>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column
prop="total_score"
:label="t('totalScore')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="passing_score"
:label="t('passingScore')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="examPapersTable.page" v-model:page-size="examPapersTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="examPapersTable.total" v-model:current-page="examPapersTable.page"
@size-change="loadExamPapersList()" @current-change="loadExamPapersList" /> v-model:page-size="examPapersTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="examPapersTable.total"
@size-change="loadExamPapersList()"
@current-change="loadExamPapersList"
/>
</div> </div>
</div> </div>
@ -64,11 +115,11 @@ import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getExamPapersList, deleteExamPapers } from '@/app/api/exam_papers' import { getExamPapersList, deleteExamPapers } from '@/app/api/exam_papers'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/exam_papers/components/exam-papers-edit.vue' import Edit from '@/app/views/exam_papers/components/exam-papers-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let examPapersTable = reactive({ let examPapersTable = reactive({
page: 1, page: 1,
@ -76,11 +127,11 @@ let examPapersTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"selection_mode":"", selection_mode: '',
"total_score":"", total_score: '',
"passing_score":"" passing_score: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -90,7 +141,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取试卷列表 * 获取试卷列表
*/ */
@ -101,12 +151,14 @@ const loadExamPapersList = (page: number = 1) => {
getExamPapersList({ getExamPapersList({
page: examPapersTable.page, page: examPapersTable.page,
limit: examPapersTable.limit, limit: examPapersTable.limit,
...examPapersTable.searchParam ...examPapersTable.searchParam,
}).then(res => { })
.then((res) => {
examPapersTable.loading = false examPapersTable.loading = false
examPapersTable.data = res.data.data examPapersTable.data = res.data.data
examPapersTable.total = res.data.total examPapersTable.total = res.data.total
}).catch(() => { })
.catch(() => {
examPapersTable.loading = false examPapersTable.loading = false
}) })
} }
@ -135,22 +187,19 @@ const editEvent = (data: any) => {
* 删除试卷 * 删除试卷
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('examPapersDeleteTips'), t('warning'), ElMessageBox.confirm(t('examPapersDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteExamPapers(id)
deleteExamPapers(id).then(() => { .then(() => {
loadExamPapersList() loadExamPapersList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
@ -167,5 +216,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

313
admin/src/app/views/exam_questions/exam_questions.vue

@ -1,104 +1,240 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addExamQuestions') }} {{ t('addExamQuestions') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="examQuestionsTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="examQuestionsTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('questionType')" prop="question_type"> <el-form-item :label="t('questionType')" prop="question_type">
<el-input v-model="examQuestionsTable.searchParam.question_type" :placeholder="t('questionTypePlaceholder')" /> <el-input
v-model="examQuestionsTable.searchParam.question_type"
:placeholder="t('questionTypePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('questionContentType')" prop="question_content_type"> <el-form-item
<el-input v-model="examQuestionsTable.searchParam.question_content_type" :placeholder="t('questionContentTypePlaceholder')" /> :label="t('questionContentType')"
prop="question_content_type"
>
<el-input
v-model="examQuestionsTable.searchParam.question_content_type"
:placeholder="t('questionContentTypePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('questionContent')" prop="question_content"> <el-form-item :label="t('questionContent')" prop="question_content">
<el-input v-model="examQuestionsTable.searchParam.question_content" :placeholder="t('questionContentPlaceholder')" /> <el-input
v-model="examQuestionsTable.searchParam.question_content"
:placeholder="t('questionContentPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionAContentType')" prop="option_a_content_type"> <el-form-item
<el-input v-model="examQuestionsTable.searchParam.option_a_content_type" :placeholder="t('optionAContentTypePlaceholder')" /> :label="t('optionAContentType')"
prop="option_a_content_type"
>
<el-input
v-model="examQuestionsTable.searchParam.option_a_content_type"
:placeholder="t('optionAContentTypePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionAContent')" prop="option_a_content"> <el-form-item :label="t('optionAContent')" prop="option_a_content">
<el-input v-model="examQuestionsTable.searchParam.option_a_content" :placeholder="t('optionAContentPlaceholder')" /> <el-input
v-model="examQuestionsTable.searchParam.option_a_content"
:placeholder="t('optionAContentPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionBContentType')" prop="option_b_content_type"> <el-form-item
<el-input v-model="examQuestionsTable.searchParam.option_b_content_type" :placeholder="t('optionBContentTypePlaceholder')" /> :label="t('optionBContentType')"
prop="option_b_content_type"
>
<el-input
v-model="examQuestionsTable.searchParam.option_b_content_type"
:placeholder="t('optionBContentTypePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionBContent')" prop="option_b_content"> <el-form-item :label="t('optionBContent')" prop="option_b_content">
<el-input v-model="examQuestionsTable.searchParam.option_b_content" :placeholder="t('optionBContentPlaceholder')" /> <el-input
v-model="examQuestionsTable.searchParam.option_b_content"
:placeholder="t('optionBContentPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionCContentType')" prop="option_c_content_type"> <el-form-item
<el-input v-model="examQuestionsTable.searchParam.option_c_content_type" :placeholder="t('optionCContentTypePlaceholder')" /> :label="t('optionCContentType')"
prop="option_c_content_type"
>
<el-input
v-model="examQuestionsTable.searchParam.option_c_content_type"
:placeholder="t('optionCContentTypePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionCContent')" prop="option_c_content"> <el-form-item :label="t('optionCContent')" prop="option_c_content">
<el-input v-model="examQuestionsTable.searchParam.option_c_content" :placeholder="t('optionCContentPlaceholder')" /> <el-input
v-model="examQuestionsTable.searchParam.option_c_content"
:placeholder="t('optionCContentPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionDContentType')" prop="option_d_content_type"> <el-form-item
<el-input v-model="examQuestionsTable.searchParam.option_d_content_type" :placeholder="t('optionDContentTypePlaceholder')" /> :label="t('optionDContentType')"
prop="option_d_content_type"
>
<el-input
v-model="examQuestionsTable.searchParam.option_d_content_type"
:placeholder="t('optionDContentTypePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionDContent')" prop="option_d_content"> <el-form-item :label="t('optionDContent')" prop="option_d_content">
<el-input v-model="examQuestionsTable.searchParam.option_d_content" :placeholder="t('optionDContentPlaceholder')" /> <el-input
v-model="examQuestionsTable.searchParam.option_d_content"
:placeholder="t('optionDContentPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('correctAnswer')" prop="correct_answer"> <el-form-item :label="t('correctAnswer')" prop="correct_answer">
<el-input v-model="examQuestionsTable.searchParam.correct_answer" :placeholder="t('correctAnswerPlaceholder')" /> <el-input
v-model="examQuestionsTable.searchParam.correct_answer"
:placeholder="t('correctAnswerPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadExamQuestionsList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadExamQuestionsList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="examQuestionsTable.data" size="large" v-loading="examQuestionsTable.loading"> <el-table
:data="examQuestionsTable.data"
size="large"
v-loading="examQuestionsTable.loading"
>
<template #empty> <template #empty>
<span>{{ !examQuestionsTable.loading ? t('emptyData') : '' }}</span> <span>{{ !examQuestionsTable.loading ? t('emptyData') : '' }}</span>
</template> </template>
<el-table-column prop="question_type" :label="t('questionType')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="question_type"
<el-table-column prop="question_content_type" :label="t('questionContentType')" min-width="120" :show-overflow-tooltip="true"/> :label="t('questionType')"
min-width="120"
<el-table-column prop="question_content" :label="t('questionContent')" min-width="120" :show-overflow-tooltip="true"/> :show-overflow-tooltip="true"
/>
<el-table-column prop="option_a_content_type" :label="t('optionAContentType')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
<el-table-column prop="option_a_content" :label="t('optionAContent')" min-width="120" :show-overflow-tooltip="true"/> prop="question_content_type"
:label="t('questionContentType')"
<el-table-column prop="option_b_content_type" :label="t('optionBContentType')" min-width="120" :show-overflow-tooltip="true"/> min-width="120"
:show-overflow-tooltip="true"
<el-table-column prop="option_b_content" :label="t('optionBContent')" min-width="120" :show-overflow-tooltip="true"/> />
<el-table-column prop="option_c_content_type" :label="t('optionCContentType')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="question_content"
<el-table-column prop="option_c_content" :label="t('optionCContent')" min-width="120" :show-overflow-tooltip="true"/> :label="t('questionContent')"
min-width="120"
<el-table-column prop="option_d_content_type" :label="t('optionDContentType')" min-width="120" :show-overflow-tooltip="true"/> :show-overflow-tooltip="true"
/>
<el-table-column prop="option_d_content" :label="t('optionDContent')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
<el-table-column prop="correct_answer" :label="t('correctAnswer')" min-width="120" :show-overflow-tooltip="true"/> prop="option_a_content_type"
:label="t('optionAContentType')"
<el-table-column :label="t('operation')" fixed="right" min-width="120"> min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="option_a_content"
:label="t('optionAContent')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="option_b_content_type"
:label="t('optionBContentType')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="option_b_content"
:label="t('optionBContent')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="option_c_content_type"
:label="t('optionCContentType')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="option_c_content"
:label="t('optionCContent')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="option_d_content_type"
:label="t('optionDContentType')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="option_d_content"
:label="t('optionDContent')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="correct_answer"
:label="t('correctAnswer')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="examQuestionsTable.page" v-model:page-size="examQuestionsTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="examQuestionsTable.total" v-model:current-page="examQuestionsTable.page"
@size-change="loadExamQuestionsList()" @current-change="loadExamQuestionsList" /> v-model:page-size="examQuestionsTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="examQuestionsTable.total"
@size-change="loadExamQuestionsList()"
@current-change="loadExamQuestionsList"
/>
</div> </div>
</div> </div>
</el-card> </el-card>
</div> </div>
</template> </template>
@ -107,13 +243,16 @@
import { reactive, ref, watch } from 'vue' import { reactive, ref, watch } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getExamQuestionsList, deleteExamQuestions } from '@/app/api/exam_questions' import {
getExamQuestionsList,
deleteExamQuestions,
} from '@/app/api/exam_questions'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let examQuestionsTable = reactive({ let examQuestionsTable = reactive({
page: 1, page: 1,
@ -121,20 +260,20 @@ let examQuestionsTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"question_type":"", question_type: '',
"question_content_type":"", question_content_type: '',
"question_content":"", question_content: '',
"option_a_content_type":"", option_a_content_type: '',
"option_a_content":"", option_a_content: '',
"option_b_content_type":"", option_b_content_type: '',
"option_b_content":"", option_b_content: '',
"option_c_content_type":"", option_c_content_type: '',
"option_c_content":"", option_c_content: '',
"option_d_content_type":"", option_d_content_type: '',
"option_d_content":"", option_d_content: '',
"correct_answer":"" correct_answer: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -144,7 +283,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取试题列表 * 获取试题列表
*/ */
@ -155,12 +293,14 @@ const loadExamQuestionsList = (page: number = 1) => {
getExamQuestionsList({ getExamQuestionsList({
page: examQuestionsTable.page, page: examQuestionsTable.page,
limit: examQuestionsTable.limit, limit: examQuestionsTable.limit,
...examQuestionsTable.searchParam ...examQuestionsTable.searchParam,
}).then(res => { })
.then((res) => {
examQuestionsTable.loading = false examQuestionsTable.loading = false
examQuestionsTable.data = res.data.data examQuestionsTable.data = res.data.data
examQuestionsTable.total = res.data.total examQuestionsTable.total = res.data.total
}).catch(() => { })
.catch(() => {
examQuestionsTable.loading = false examQuestionsTable.loading = false
}) })
} }
@ -180,29 +320,26 @@ const addEvent = () => {
* @param data * @param data
*/ */
const editEvent = (data: any) => { const editEvent = (data: any) => {
router.push('/exam_questions/exam_questions_edit?id='+data.id) router.push('/exam_questions/exam_questions_edit?id=' + data.id)
} }
/** /**
* 删除试题 * 删除试题
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('examQuestionsDeleteTips'), t('warning'), ElMessageBox.confirm(t('examQuestionsDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteExamQuestions(id)
deleteExamQuestions(id).then(() => { .then(() => {
loadExamQuestionsList() loadExamQuestionsList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
@ -219,5 +356,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

271
admin/src/app/views/exam_questions/exam_questions_edit.vue

@ -3,66 +3,136 @@
<div class="detail-head"> <div class="detail-head">
<div class="left" @click="back()"> <div class="left" @click="back()">
<span class="iconfont iconxiangzuojiantou !text-xs"></span> <span class="iconfont iconxiangzuojiantou !text-xs"></span>
<span class="ml-[1px]">{{t('returnToPreviousPage')}}</span> <span class="ml-[1px]">{{ t('returnToPreviousPage') }}</span>
</div> </div>
<span class="adorn">|</span> <span class="adorn">|</span>
<span class="right">{{ pageName }}</span> <span class="right">{{ pageName }}</span>
</div> </div>
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"> <el-form
:model="formData"
label-width="90px"
ref="formRef"
:rules="formRules"
class="page-form"
>
<el-form-item :label="t('questionType')" prop="question_type"> <el-form-item :label="t('questionType')" prop="question_type">
<el-input v-model="formData.question_type" clearable :placeholder="t('questionTypePlaceholder')" class="input-width" /> <el-input
v-model="formData.question_type"
clearable
:placeholder="t('questionTypePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('questionContentType')" prop="question_content_type"> <el-form-item
<el-input v-model="formData.question_content_type" clearable :placeholder="t('questionContentTypePlaceholder')" class="input-width" /> :label="t('questionContentType')"
prop="question_content_type"
>
<el-input
v-model="formData.question_content_type"
clearable
:placeholder="t('questionContentTypePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('questionContent')" prop="question_content"> <el-form-item :label="t('questionContent')" prop="question_content">
<el-input v-model="formData.question_content" clearable :placeholder="t('questionContentPlaceholder')" class="input-width" /> <el-input
v-model="formData.question_content"
clearable
:placeholder="t('questionContentPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionAContentType')" > <el-form-item :label="t('optionAContentType')">
<el-input v-model="formData.option_a_content_type" clearable :placeholder="t('optionAContentTypePlaceholder')" class="input-width" /> <el-input
v-model="formData.option_a_content_type"
clearable
:placeholder="t('optionAContentTypePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionAContent')" > <el-form-item :label="t('optionAContent')">
<el-input v-model="formData.option_a_content" clearable :placeholder="t('optionAContentPlaceholder')" class="input-width" /> <el-input
v-model="formData.option_a_content"
clearable
:placeholder="t('optionAContentPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionBContentType')" > <el-form-item :label="t('optionBContentType')">
<el-input v-model="formData.option_b_content_type" clearable :placeholder="t('optionBContentTypePlaceholder')" class="input-width" /> <el-input
v-model="formData.option_b_content_type"
clearable
:placeholder="t('optionBContentTypePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionBContent')" > <el-form-item :label="t('optionBContent')">
<el-input v-model="formData.option_b_content" clearable :placeholder="t('optionBContentPlaceholder')" class="input-width" /> <el-input
v-model="formData.option_b_content"
clearable
:placeholder="t('optionBContentPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionCContentType')" > <el-form-item :label="t('optionCContentType')">
<el-input v-model="formData.option_c_content_type" clearable :placeholder="t('optionCContentTypePlaceholder')" class="input-width" /> <el-input
v-model="formData.option_c_content_type"
clearable
:placeholder="t('optionCContentTypePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionCContent')" > <el-form-item :label="t('optionCContent')">
<el-input v-model="formData.option_c_content" clearable :placeholder="t('optionCContentPlaceholder')" class="input-width" /> <el-input
v-model="formData.option_c_content"
clearable
:placeholder="t('optionCContentPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionDContentType')" > <el-form-item :label="t('optionDContentType')">
<el-input v-model="formData.option_d_content_type" clearable :placeholder="t('optionDContentTypePlaceholder')" class="input-width" /> <el-input
v-model="formData.option_d_content_type"
clearable
:placeholder="t('optionDContentTypePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('optionDContent')" > <el-form-item :label="t('optionDContent')">
<el-input v-model="formData.option_d_content" clearable :placeholder="t('optionDContentPlaceholder')" class="input-width" /> <el-input
v-model="formData.option_d_content"
clearable
:placeholder="t('optionDContentPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('correctAnswer')" prop="correct_answer"> <el-form-item :label="t('correctAnswer')" prop="correct_answer">
<el-input v-model="formData.correct_answer" clearable :placeholder="t('correctAnswerPlaceholder')" class="input-width" /> <el-input
v-model="formData.correct_answer"
clearable
:placeholder="t('correctAnswerPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="fixed-footer-wrap"> <div class="fixed-footer-wrap">
<div class="fixed-footer"> <div class="fixed-footer">
<el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button> <el-button type="primary" @click="onSave(formRef)">{{
t('save')
}}</el-button>
<el-button @click="back()">{{ t('cancel') }}</el-button> <el-button @click="back()">{{ t('cancel') }}</el-button>
</div> </div>
</div> </div>
@ -74,16 +144,18 @@ import { ref, reactive, computed, watch } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { getExamQuestionsInfo,addExamQuestions,editExamQuestions } from '@/app/api/exam_questions'; import {
getExamQuestionsInfo,
addExamQuestions,
editExamQuestions,
} from '@/app/api/exam_questions'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const id:number = parseInt(route.query.id); const id: number = parseInt(route.query.id)
const loading = ref(false) const loading = ref(false)
const pageName = route.meta.title const pageName = route.meta.title
/** /**
* 表单数据 * 表单数据
*/ */
@ -104,14 +176,14 @@ const initialFormData = {
} }
const formData: Record<string, any> = reactive({ ...initialFormData }) const formData: Record<string, any> = reactive({ ...initialFormData })
const setFormData = async (id:number = 0) => { const setFormData = async (id: number = 0) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
const data = await (await getExamQuestionsInfo(id)).data const data = await (await getExamQuestionsInfo(id)).data
Object.keys(formData).forEach((key: string) => { Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
if(id) setFormData(id); if (id) setFormData(id)
const formRef = ref<FormInstance>() const formRef = ref<FormInstance>()
// //
@ -119,71 +191,93 @@ const selectData = ref<any[]>([])
// //
// //
const formRules = computed(() => { const formRules = computed(() => {
return { return {
question_type: [ question_type: [
{ required: true, message: t('questionTypePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('questionTypePlaceholder'),
, trigger: 'blur',
},
],
question_content_type: [ question_content_type: [
{ required: true, message: t('questionContentTypePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('questionContentTypePlaceholder'),
, trigger: 'blur',
},
],
question_content: [ question_content: [
{ required: true, message: t('questionContentPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('questionContentPlaceholder'),
, trigger: 'blur',
},
],
option_a_content_type: [ option_a_content_type: [
{ required: true, message: t('optionAContentTypePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('optionAContentTypePlaceholder'),
, trigger: 'blur',
},
],
option_a_content: [ option_a_content: [
{ required: true, message: t('optionAContentPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('optionAContentPlaceholder'),
, trigger: 'blur',
},
],
option_b_content_type: [ option_b_content_type: [
{ required: true, message: t('optionBContentTypePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('optionBContentTypePlaceholder'),
, trigger: 'blur',
},
],
option_b_content: [ option_b_content: [
{ required: true, message: t('optionBContentPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('optionBContentPlaceholder'),
, trigger: 'blur',
},
],
option_c_content_type: [ option_c_content_type: [
{ required: true, message: t('optionCContentTypePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('optionCContentTypePlaceholder'),
, trigger: 'blur',
},
],
option_c_content: [ option_c_content: [
{ required: true, message: t('optionCContentPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('optionCContentPlaceholder'),
, trigger: 'blur',
},
],
option_d_content_type: [ option_d_content_type: [
{ required: true, message: t('optionDContentTypePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('optionDContentTypePlaceholder'),
, trigger: 'blur',
},
],
option_d_content: [ option_d_content: [
{ required: true, message: t('optionDContentPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('optionDContentPlaceholder'),
, trigger: 'blur',
},
],
correct_answer: [ correct_answer: [
{ required: true, message: t('correctAnswerPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('correctAnswerPlaceholder'),
, trigger: 'blur',
},
],
} }
}) })
@ -195,13 +289,14 @@ const onSave = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
const save = id ? editExamQuestions : addExamQuestions const save = id ? editExamQuestions : addExamQuestions
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
history.back() history.back()
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
}) })
} }
@ -217,7 +312,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -233,7 +333,6 @@ const emailVerify = (rule: any, value: any, callback: any) => {
} }
} }
// //
const numberVerify = (rule: any, value: any, callback: any) => { const numberVerify = (rule: any, value: any, callback: any) => {
if (!Number.isInteger(value)) { if (!Number.isInteger(value)) {

142
admin/src/app/views/exam_records/components/exam-records-edit.vue

@ -1,42 +1,92 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateExamRecords') : t('addExamRecords')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="formData.id ? t('updateExamRecords') : t('addExamRecords')"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-input v-model="formData.campus_id" clearable :placeholder="t('campusIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.campus_id"
clearable
:placeholder="t('campusIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('userId')" prop="user_id"> <el-form-item :label="t('userId')" prop="user_id">
<el-input v-model="formData.user_id" clearable :placeholder="t('userIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.user_id"
clearable
:placeholder="t('userIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('paperId')" prop="paper_id"> <el-form-item :label="t('paperId')" prop="paper_id">
<el-input v-model="formData.paper_id" clearable :placeholder="t('paperIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.paper_id"
clearable
:placeholder="t('paperIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('score')" > <el-form-item :label="t('score')">
<el-input v-model="formData.score" clearable :placeholder="t('scorePlaceholder')" class="input-width" /> <el-input
v-model="formData.score"
clearable
:placeholder="t('scorePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('status')" > <el-form-item :label="t('status')">
<el-input v-model="formData.status" clearable :placeholder="t('statusPlaceholder')" class="input-width" /> <el-input
v-model="formData.status"
clearable
:placeholder="t('statusPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('startTime')" > <el-form-item :label="t('startTime')">
<el-input v-model="formData.start_time" clearable :placeholder="t('startTimePlaceholder')" class="input-width" /> <el-input
v-model="formData.start_time"
clearable
:placeholder="t('startTimePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('endTime')" > <el-form-item :label="t('endTime')">
<el-input v-model="formData.end_time" clearable :placeholder="t('endTimePlaceholder')" class="input-width" /> <el-input
v-model="formData.end_time"
clearable
:placeholder="t('endTimePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -47,7 +97,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addExamRecords, editExamRecords, getExamRecordsInfo } from '@/app/api/exam_records' import {
addExamRecords,
editExamRecords,
getExamRecordsInfo,
} from '@/app/api/exam_records'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -74,39 +128,25 @@ const formRules = computed(() => {
return { return {
campus_id: [ campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
],
]
,
user_id: [ user_id: [
{ required: true, message: t('userIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('userIdPlaceholder'), trigger: 'blur' },
],
]
,
paper_id: [ paper_id: [
{ required: true, message: t('paperIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('paperIdPlaceholder'), trigger: 'blur' },
],
]
,
score: [ score: [
{ required: true, message: t('scorePlaceholder'), trigger: 'blur' }, { required: true, message: t('scorePlaceholder'), trigger: 'blur' },
],
]
,
status: [ status: [
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, { required: true, message: t('statusPlaceholder'), trigger: 'blur' },
],
]
,
start_time: [ start_time: [
{ required: true, message: t('startTimePlaceholder'), trigger: 'blur' }, { required: true, message: t('startTimePlaceholder'), trigger: 'blur' },
],
]
,
end_time: [ end_time: [
{ required: true, message: t('endTimePlaceholder'), trigger: 'blur' }, { required: true, message: t('endTimePlaceholder'), trigger: 'blur' },
],
]
,
} }
}) })
@ -126,11 +166,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -139,14 +181,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if(row){ if (row) {
const data = await (await getExamRecordsInfo(row.id)).data const data = await (await getExamRecordsInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -164,7 +205,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -191,13 +237,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label{ .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

185
admin/src/app/views/exam_records/exam_records.vue

@ -1,75 +1,158 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addExamRecords') }} {{ t('addExamRecords') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="examRecordsTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="examRecordsTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-input v-model="examRecordsTable.searchParam.campus_id" :placeholder="t('campusIdPlaceholder')" /> <el-input
v-model="examRecordsTable.searchParam.campus_id"
:placeholder="t('campusIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('userId')" prop="user_id"> <el-form-item :label="t('userId')" prop="user_id">
<el-input v-model="examRecordsTable.searchParam.user_id" :placeholder="t('userIdPlaceholder')" /> <el-input
v-model="examRecordsTable.searchParam.user_id"
:placeholder="t('userIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('paperId')" prop="paper_id"> <el-form-item :label="t('paperId')" prop="paper_id">
<el-input v-model="examRecordsTable.searchParam.paper_id" :placeholder="t('paperIdPlaceholder')" /> <el-input
v-model="examRecordsTable.searchParam.paper_id"
:placeholder="t('paperIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('score')" prop="score"> <el-form-item :label="t('score')" prop="score">
<el-input v-model="examRecordsTable.searchParam.score" :placeholder="t('scorePlaceholder')" /> <el-input
v-model="examRecordsTable.searchParam.score"
:placeholder="t('scorePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('status')" prop="status"> <el-form-item :label="t('status')" prop="status">
<el-input v-model="examRecordsTable.searchParam.status" :placeholder="t('statusPlaceholder')" /> <el-input
v-model="examRecordsTable.searchParam.status"
:placeholder="t('statusPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('startTime')" prop="start_time"> <el-form-item :label="t('startTime')" prop="start_time">
<el-input v-model="examRecordsTable.searchParam.start_time" :placeholder="t('startTimePlaceholder')" /> <el-input
v-model="examRecordsTable.searchParam.start_time"
:placeholder="t('startTimePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('endTime')" prop="end_time"> <el-form-item :label="t('endTime')" prop="end_time">
<el-input v-model="examRecordsTable.searchParam.end_time" :placeholder="t('endTimePlaceholder')" /> <el-input
v-model="examRecordsTable.searchParam.end_time"
:placeholder="t('endTimePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadExamRecordsList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadExamRecordsList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="examRecordsTable.data" size="large" v-loading="examRecordsTable.loading"> <el-table
:data="examRecordsTable.data"
size="large"
v-loading="examRecordsTable.loading"
>
<template #empty> <template #empty>
<span>{{ !examRecordsTable.loading ? t('emptyData') : '' }}</span> <span>{{ !examRecordsTable.loading ? t('emptyData') : '' }}</span>
</template> </template>
<el-table-column prop="campus_id" :label="t('campusId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="campus_id"
:label="t('campusId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="user_id" :label="t('userId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="user_id"
:label="t('userId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="paper_id" :label="t('paperId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="paper_id"
:label="t('paperId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="score" :label="t('score')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="score"
:label="t('score')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="status" :label="t('status')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="status"
:label="t('status')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="start_time" :label="t('startTime')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="start_time"
:label="t('startTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="end_time" :label="t('endTime')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="end_time"
:label="t('endTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="examRecordsTable.page" v-model:page-size="examRecordsTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="examRecordsTable.total" v-model:current-page="examRecordsTable.page"
@size-change="loadExamRecordsList()" @current-change="loadExamRecordsList" /> v-model:page-size="examRecordsTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="examRecordsTable.total"
@size-change="loadExamRecordsList()"
@current-change="loadExamRecordsList"
/>
</div> </div>
</div> </div>
@ -84,11 +167,11 @@ import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getExamRecordsList, deleteExamRecords } from '@/app/api/exam_records' import { getExamRecordsList, deleteExamRecords } from '@/app/api/exam_records'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/exam_records/components/exam-records-edit.vue' import Edit from '@/app/views/exam_records/components/exam-records-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let examRecordsTable = reactive({ let examRecordsTable = reactive({
page: 1, page: 1,
@ -96,15 +179,15 @@ let examRecordsTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"campus_id":"", campus_id: '',
"user_id":"", user_id: '',
"paper_id":"", paper_id: '',
"score":"", score: '',
"status":"", status: '',
"start_time":"", start_time: '',
"end_time":"" end_time: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -114,7 +197,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取考试记录列表 * 获取考试记录列表
*/ */
@ -125,12 +207,14 @@ const loadExamRecordsList = (page: number = 1) => {
getExamRecordsList({ getExamRecordsList({
page: examRecordsTable.page, page: examRecordsTable.page,
limit: examRecordsTable.limit, limit: examRecordsTable.limit,
...examRecordsTable.searchParam ...examRecordsTable.searchParam,
}).then(res => { })
.then((res) => {
examRecordsTable.loading = false examRecordsTable.loading = false
examRecordsTable.data = res.data.data examRecordsTable.data = res.data.data
examRecordsTable.total = res.data.total examRecordsTable.total = res.data.total
}).catch(() => { })
.catch(() => {
examRecordsTable.loading = false examRecordsTable.loading = false
}) })
} }
@ -159,22 +243,19 @@ const editEvent = (data: any) => {
* 删除考试记录 * 删除考试记录
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('examRecordsDeleteTips'), t('warning'), ElMessageBox.confirm(t('examRecordsDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteExamRecords(id)
deleteExamRecords(id).then(() => { .then(() => {
loadExamRecordsList() loadExamRecordsList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
@ -191,5 +272,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

122
admin/src/app/views/market_performance/components/market-performance-edit.vue

@ -1,8 +1,28 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateMarketPerformance') : t('addMarketPerformance')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
<el-form-item :label="t('personnelId')" > :title="
<el-select class="input-width" v-model="formData.personnel_id" clearable :placeholder="t('personnelIdPlaceholder')"> formData.id ? t('updateMarketPerformance') : t('addMarketPerformance')
"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('personnelId')">
<el-select
class="input-width"
v-model="formData.personnel_id"
clearable
:placeholder="t('personnelIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in personnelIdList" v-for="(item, index) in personnelIdList"
@ -13,8 +33,13 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('campusId')" > <el-form-item :label="t('campusId')">
<el-select class="input-width" v-model="formData.campus_id" clearable :placeholder="t('campusIdPlaceholder')"> <el-select
class="input-width"
v-model="formData.campus_id"
clearable
:placeholder="t('campusIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in campusIdList" v-for="(item, index) in campusIdList"
@ -25,18 +50,25 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('performanceAmount')" > <el-form-item :label="t('performanceAmount')">
<el-input v-model="formData.performance_amount" clearable :placeholder="t('performanceAmountPlaceholder')" class="input-width" /> <el-input
v-model="formData.performance_amount"
clearable
:placeholder="t('performanceAmountPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -47,7 +79,13 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addMarketPerformance, editMarketPerformance, getMarketPerformanceInfo, getWithPersonnelList, getWithCampusList } from '@/app/api/market_performance' import {
addMarketPerformance,
editMarketPerformance,
getMarketPerformanceInfo,
getWithPersonnelList,
getWithCampusList,
} from '@/app/api/market_performance'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -70,19 +108,17 @@ const formRules = computed(() => {
return { return {
personnel_id: [ personnel_id: [
{ required: true, message: t('personnelIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('personnelIdPlaceholder'), trigger: 'blur' },
],
]
,
campus_id: [ campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
],
]
,
performance_amount: [ performance_amount: [
{ required: true, message: t('performanceAmountPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('performanceAmountPlaceholder'),
, trigger: 'blur',
},
],
} }
}) })
@ -102,11 +138,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -115,24 +153,23 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const personnelIdList = ref([] as any[])
const setPersonnelIdList = async () => {
const personnelIdList = ref([] as any[])
const setPersonnelIdList = async () => {
personnelIdList.value = await (await getWithPersonnelList({})).data personnelIdList.value = await (await getWithPersonnelList({})).data
} }
setPersonnelIdList() setPersonnelIdList()
const campusIdList = ref([] as any[]) const campusIdList = ref([] as any[])
const setCampusIdList = async () => { const setCampusIdList = async () => {
campusIdList.value = await (await getWithCampusList({})).data campusIdList.value = await (await getWithCampusList({})).data
} }
setCampusIdList() setCampusIdList()
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if(row){ if (row) {
const data = await (await getMarketPerformanceInfo(row.id)).data const data = await (await getMarketPerformanceInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -150,7 +187,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -177,13 +219,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label{ .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

148
admin/src/app/views/market_performance/market_performance.vue

@ -1,19 +1,29 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<!-- <el-button type="primary" @click="addEvent"> <!-- <el-button type="primary" @click="addEvent">
{{ t('addMarketPerformance') }} {{ t('addMarketPerformance') }}
</el-button> --> </el-button> -->
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="marketPerformanceTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="marketPerformanceTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('campusId')" prop="campus_id"> <el-form-item :label="t('campusId')" prop="campus_id">
<el-select class="w-[280px]" v-model="marketPerformanceTable.searchParam.campus_id" clearable :placeholder="t('campusIdPlaceholder')"> <el-select
class="w-[280px]"
v-model="marketPerformanceTable.searchParam.campus_id"
clearable
:placeholder="t('campusIdPlaceholder')"
>
<el-option <el-option
v-for="(item, index) in campusIdList" v-for="(item, index) in campusIdList"
:key="index" :key="index"
@ -23,26 +33,59 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('performanceAmount')" prop="performance_amount"> <el-form-item
<el-input v-model="marketPerformanceTable.searchParam.performance_amount" :placeholder="t('performanceAmountPlaceholder')" /> :label="t('performanceAmount')"
prop="performance_amount"
>
<el-input
v-model="marketPerformanceTable.searchParam.performance_amount"
:placeholder="t('performanceAmountPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadMarketPerformanceList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadMarketPerformanceList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="marketPerformanceTable.data" size="large" v-loading="marketPerformanceTable.loading"> <el-table
:data="marketPerformanceTable.data"
size="large"
v-loading="marketPerformanceTable.loading"
>
<template #empty> <template #empty>
<span>{{ !marketPerformanceTable.loading ? t('emptyData') : '' }}</span> <span>{{
!marketPerformanceTable.loading ? t('emptyData') : ''
}}</span>
</template> </template>
<el-table-column prop="personnel_id_name" :label="t('personnelId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="personnel_id_name"
:label="t('personnelId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="campus_id_name" :label="t('campusId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="campus_id_name"
:label="t('campusId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="performance_amount"
:label="t('performanceAmount')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="performance_amount" :label="t('performanceAmount')" min-width="120" :show-overflow-tooltip="true"/>
<!-- <!--
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column :label="t('operation')" fixed="right" min-width="120">
<template #default="{ row }"> <template #default="{ row }">
@ -50,16 +93,23 @@
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> <el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
</template> </template>
</el-table-column> --> </el-table-column> -->
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="marketPerformanceTable.page" v-model:page-size="marketPerformanceTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="marketPerformanceTable.total" v-model:current-page="marketPerformanceTable.page"
@size-change="loadMarketPerformanceList()" @current-change="loadMarketPerformanceList" /> v-model:page-size="marketPerformanceTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="marketPerformanceTable.total"
@size-change="loadMarketPerformanceList()"
@current-change="loadMarketPerformanceList"
/>
</div> </div>
</div> </div>
<edit ref="editMarketPerformanceDialog" @complete="loadMarketPerformanceList" /> <edit
ref="editMarketPerformanceDialog"
@complete="loadMarketPerformanceList"
/>
</el-card> </el-card>
</div> </div>
</template> </template>
@ -68,13 +118,18 @@
import { reactive, ref, watch } from 'vue' import { reactive, ref, watch } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getMarketPerformanceList, deleteMarketPerformance, getWithPersonnelList, getWithCampusList } from '@/app/api/market_performance' import {
getMarketPerformanceList,
deleteMarketPerformance,
getWithPersonnelList,
getWithCampusList,
} from '@/app/api/market_performance'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/market_performance/components/market-performance-edit.vue' import Edit from '@/app/views/market_performance/components/market-performance-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let marketPerformanceTable = reactive({ let marketPerformanceTable = reactive({
page: 1, page: 1,
@ -82,10 +137,10 @@ let marketPerformanceTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"campus_id":"", campus_id: '',
"performance_amount":"" performance_amount: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -95,7 +150,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取市场绩效列表 * 获取市场绩效列表
*/ */
@ -106,12 +160,14 @@ const loadMarketPerformanceList = (page: number = 1) => {
getMarketPerformanceList({ getMarketPerformanceList({
page: marketPerformanceTable.page, page: marketPerformanceTable.page,
limit: marketPerformanceTable.limit, limit: marketPerformanceTable.limit,
...marketPerformanceTable.searchParam ...marketPerformanceTable.searchParam,
}).then(res => { })
.then((res) => {
marketPerformanceTable.loading = false marketPerformanceTable.loading = false
marketPerformanceTable.data = res.data.data marketPerformanceTable.data = res.data.data
marketPerformanceTable.total = res.data.total marketPerformanceTable.total = res.data.total
}).catch(() => { })
.catch(() => {
marketPerformanceTable.loading = false marketPerformanceTable.loading = false
}) })
} }
@ -140,31 +196,29 @@ const editEvent = (data: any) => {
* 删除市场绩效 * 删除市场绩效
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('marketPerformanceDeleteTips'), t('warning'), ElMessageBox.confirm(t('marketPerformanceDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteMarketPerformance(id)
deleteMarketPerformance(id).then(() => { .then(() => {
loadMarketPerformanceList() loadMarketPerformanceList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const personnelIdList = ref([])
const personnelIdList = ref([]) const setPersonnelIdList = async () => {
const setPersonnelIdList = async () => {
personnelIdList.value = await (await getWithPersonnelList({})).data personnelIdList.value = await (await getWithPersonnelList({})).data
} }
setPersonnelIdList() setPersonnelIdList()
const campusIdList = ref([]) const campusIdList = ref([])
const setCampusIdList = async () => { const setCampusIdList = async () => {
campusIdList.value = await (await getWithCampusList({})).data campusIdList.value = await (await getWithCampusList({})).data
} }
setCampusIdList() setCampusIdList()
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
@ -182,5 +236,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

234
admin/src/app/views/order_table/components/order-table-edit.vue

@ -1,66 +1,146 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateOrderTable') : t('addOrderTable')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="formData.id ? t('updateOrderTable') : t('addOrderTable')"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('paymentId')" prop="payment_id"> <el-form-item :label="t('paymentId')" prop="payment_id">
<el-input v-model="formData.payment_id" clearable :placeholder="t('paymentIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.payment_id"
clearable
:placeholder="t('paymentIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('orderStatus')" prop="order_status"> <el-form-item :label="t('orderStatus')" prop="order_status">
<el-input v-model="formData.order_status" clearable :placeholder="t('orderStatusPlaceholder')" class="input-width" /> <el-input
v-model="formData.order_status"
clearable
:placeholder="t('orderStatusPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('paymentType')" prop="payment_type"> <el-form-item :label="t('paymentType')" prop="payment_type">
<el-input v-model="formData.payment_type" clearable :placeholder="t('paymentTypePlaceholder')" class="input-width" /> <el-input
v-model="formData.payment_type"
clearable
:placeholder="t('paymentTypePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('orderAmount')" prop="order_amount"> <el-form-item :label="t('orderAmount')" prop="order_amount">
<el-input v-model="formData.order_amount" clearable :placeholder="t('orderAmountPlaceholder')" class="input-width" /> <el-input
v-model="formData.order_amount"
clearable
:placeholder="t('orderAmountPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('courseId')" prop="course_id"> <el-form-item :label="t('courseId')" prop="course_id">
<el-input v-model="formData.course_id" clearable :placeholder="t('courseIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.course_id"
clearable
:placeholder="t('courseIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('classId')" prop="class_id"> <el-form-item :label="t('classId')" prop="class_id">
<el-input v-model="formData.class_id" clearable :placeholder="t('classIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.class_id"
clearable
:placeholder="t('classIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('staffId')" prop="staff_id"> <el-form-item :label="t('staffId')" prop="staff_id">
<el-input v-model="formData.staff_id" clearable :placeholder="t('staffIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.staff_id"
clearable
:placeholder="t('staffIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('resourceId')" prop="resource_id"> <el-form-item :label="t('resourceId')" prop="resource_id">
<el-input v-model="formData.resource_id" clearable :placeholder="t('resourceIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.resource_id"
clearable
:placeholder="t('resourceIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('afterSalesStatus')" > <el-form-item :label="t('afterSalesStatus')">
<el-input v-model="formData.after_sales_status" clearable :placeholder="t('afterSalesStatusPlaceholder')" class="input-width" /> <el-input
v-model="formData.after_sales_status"
clearable
:placeholder="t('afterSalesStatusPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('afterSalesReason')" > <el-form-item :label="t('afterSalesReason')">
<el-input v-model="formData.after_sales_reason" clearable :placeholder="t('afterSalesReasonPlaceholder')" class="input-width" /> <el-input
v-model="formData.after_sales_reason"
clearable
:placeholder="t('afterSalesReasonPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('afterSalesTime')" > <el-form-item :label="t('afterSalesTime')">
<el-input v-model="formData.after_sales_time" clearable :placeholder="t('afterSalesTimePlaceholder')" class="input-width" /> <el-input
v-model="formData.after_sales_time"
clearable
:placeholder="t('afterSalesTimePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('paymentTime')" > <el-form-item :label="t('paymentTime')">
<el-input v-model="formData.payment_time" clearable :placeholder="t('paymentTimePlaceholder')" class="input-width" /> <el-input
v-model="formData.payment_time"
clearable
:placeholder="t('paymentTimePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('subscriptionPaymentTime')" > <el-form-item :label="t('subscriptionPaymentTime')">
<el-input v-model="formData.subscription_payment_time" clearable :placeholder="t('subscriptionPaymentTimePlaceholder')" class="input-width" /> <el-input
v-model="formData.subscription_payment_time"
clearable
:placeholder="t('subscriptionPaymentTimePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -71,7 +151,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addOrderTable, editOrderTable, getOrderTableInfo } from '@/app/api/order_table' import {
addOrderTable,
editOrderTable,
getOrderTableInfo,
} from '@/app/api/order_table'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -104,69 +188,59 @@ const formRules = computed(() => {
return { return {
payment_id: [ payment_id: [
{ required: true, message: t('paymentIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('paymentIdPlaceholder'), trigger: 'blur' },
],
]
,
order_status: [ order_status: [
{ required: true, message: t('orderStatusPlaceholder'), trigger: 'blur' }, { required: true, message: t('orderStatusPlaceholder'), trigger: 'blur' },
],
]
,
payment_type: [ payment_type: [
{ required: true, message: t('paymentTypePlaceholder'), trigger: 'blur' }, { required: true, message: t('paymentTypePlaceholder'), trigger: 'blur' },
],
]
,
order_amount: [ order_amount: [
{ required: true, message: t('orderAmountPlaceholder'), trigger: 'blur' }, { required: true, message: t('orderAmountPlaceholder'), trigger: 'blur' },
],
]
,
course_id: [ course_id: [
{ required: true, message: t('courseIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('courseIdPlaceholder'), trigger: 'blur' },
],
]
,
class_id: [ class_id: [
{ required: true, message: t('classIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('classIdPlaceholder'), trigger: 'blur' },
],
]
,
staff_id: [ staff_id: [
{ required: true, message: t('staffIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('staffIdPlaceholder'), trigger: 'blur' },
],
]
,
resource_id: [ resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
],
]
,
after_sales_status: [ after_sales_status: [
{ required: true, message: t('afterSalesStatusPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('afterSalesStatusPlaceholder'),
, trigger: 'blur',
},
],
after_sales_reason: [ after_sales_reason: [
{ required: true, message: t('afterSalesReasonPlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('afterSalesReasonPlaceholder'),
, trigger: 'blur',
},
],
after_sales_time: [ after_sales_time: [
{ required: true, message: t('afterSalesTimePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('afterSalesTimePlaceholder'),
, trigger: 'blur',
},
],
payment_time: [ payment_time: [
{ required: true, message: t('paymentTimePlaceholder'), trigger: 'blur' }, { required: true, message: t('paymentTimePlaceholder'), trigger: 'blur' },
],
]
,
subscription_payment_time: [ subscription_payment_time: [
{ required: true, message: t('subscriptionPaymentTimePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('subscriptionPaymentTimePlaceholder'),
, trigger: 'blur',
},
],
} }
}) })
@ -186,11 +260,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -199,14 +275,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if(row){ if (row) {
const data = await (await getOrderTableInfo(row.id)).data const data = await (await getOrderTableInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -224,7 +299,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -251,13 +331,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label{ .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

310
admin/src/app/views/order_table/order_table.vue

@ -1,105 +1,245 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addOrderTable') }} {{ t('addOrderTable') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="orderTableTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="orderTableTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('paymentId')" prop="payment_id"> <el-form-item :label="t('paymentId')" prop="payment_id">
<el-input v-model="orderTableTable.searchParam.payment_id" :placeholder="t('paymentIdPlaceholder')" /> <el-input
v-model="orderTableTable.searchParam.payment_id"
:placeholder="t('paymentIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('orderStatus')" prop="order_status"> <el-form-item :label="t('orderStatus')" prop="order_status">
<el-input v-model="orderTableTable.searchParam.order_status" :placeholder="t('orderStatusPlaceholder')" /> <el-input
v-model="orderTableTable.searchParam.order_status"
:placeholder="t('orderStatusPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('paymentType')" prop="payment_type"> <el-form-item :label="t('paymentType')" prop="payment_type">
<el-input v-model="orderTableTable.searchParam.payment_type" :placeholder="t('paymentTypePlaceholder')" /> <el-input
v-model="orderTableTable.searchParam.payment_type"
:placeholder="t('paymentTypePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('orderAmount')" prop="order_amount"> <el-form-item :label="t('orderAmount')" prop="order_amount">
<el-input v-model="orderTableTable.searchParam.order_amount" :placeholder="t('orderAmountPlaceholder')" /> <el-input
v-model="orderTableTable.searchParam.order_amount"
:placeholder="t('orderAmountPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('courseId')" prop="course_id"> <el-form-item :label="t('courseId')" prop="course_id">
<el-input v-model="orderTableTable.searchParam.course_id" :placeholder="t('courseIdPlaceholder')" /> <el-input
v-model="orderTableTable.searchParam.course_id"
:placeholder="t('courseIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('classId')" prop="class_id"> <el-form-item :label="t('classId')" prop="class_id">
<el-input v-model="orderTableTable.searchParam.class_id" :placeholder="t('classIdPlaceholder')" /> <el-input
v-model="orderTableTable.searchParam.class_id"
:placeholder="t('classIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('staffId')" prop="staff_id"> <el-form-item :label="t('staffId')" prop="staff_id">
<el-input v-model="orderTableTable.searchParam.staff_id" :placeholder="t('staffIdPlaceholder')" /> <el-input
v-model="orderTableTable.searchParam.staff_id"
:placeholder="t('staffIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('resourceId')" prop="resource_id"> <el-form-item :label="t('resourceId')" prop="resource_id">
<el-input v-model="orderTableTable.searchParam.resource_id" :placeholder="t('resourceIdPlaceholder')" /> <el-input
v-model="orderTableTable.searchParam.resource_id"
:placeholder="t('resourceIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('afterSalesStatus')" prop="after_sales_status"> <el-form-item
<el-input v-model="orderTableTable.searchParam.after_sales_status" :placeholder="t('afterSalesStatusPlaceholder')" /> :label="t('afterSalesStatus')"
prop="after_sales_status"
>
<el-input
v-model="orderTableTable.searchParam.after_sales_status"
:placeholder="t('afterSalesStatusPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('afterSalesReason')" prop="after_sales_reason"> <el-form-item
<el-input v-model="orderTableTable.searchParam.after_sales_reason" :placeholder="t('afterSalesReasonPlaceholder')" /> :label="t('afterSalesReason')"
prop="after_sales_reason"
>
<el-input
v-model="orderTableTable.searchParam.after_sales_reason"
:placeholder="t('afterSalesReasonPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('afterSalesTime')" prop="after_sales_time"> <el-form-item :label="t('afterSalesTime')" prop="after_sales_time">
<el-input v-model="orderTableTable.searchParam.after_sales_time" :placeholder="t('afterSalesTimePlaceholder')" /> <el-input
v-model="orderTableTable.searchParam.after_sales_time"
:placeholder="t('afterSalesTimePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('paymentTime')" prop="payment_time"> <el-form-item :label="t('paymentTime')" prop="payment_time">
<el-input v-model="orderTableTable.searchParam.payment_time" :placeholder="t('paymentTimePlaceholder')" /> <el-input
v-model="orderTableTable.searchParam.payment_time"
:placeholder="t('paymentTimePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('subscriptionPaymentTime')" prop="subscription_payment_time"> <el-form-item
<el-input v-model="orderTableTable.searchParam.subscription_payment_time" :placeholder="t('subscriptionPaymentTimePlaceholder')" /> :label="t('subscriptionPaymentTime')"
prop="subscription_payment_time"
>
<el-input
v-model="orderTableTable.searchParam.subscription_payment_time"
:placeholder="t('subscriptionPaymentTimePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadOrderTableList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadOrderTableList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="orderTableTable.data" size="large" v-loading="orderTableTable.loading"> <el-table
:data="orderTableTable.data"
size="large"
v-loading="orderTableTable.loading"
>
<template #empty> <template #empty>
<span>{{ !orderTableTable.loading ? t('emptyData') : '' }}</span> <span>{{ !orderTableTable.loading ? t('emptyData') : '' }}</span>
</template> </template>
<el-table-column prop="payment_id" :label="t('paymentId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="payment_id"
<el-table-column prop="order_status" :label="t('orderStatus')" min-width="120" :show-overflow-tooltip="true"/> :label="t('paymentId')"
min-width="120"
<el-table-column prop="payment_type" :label="t('paymentType')" min-width="120" :show-overflow-tooltip="true"/> :show-overflow-tooltip="true"
/>
<el-table-column prop="order_amount" :label="t('orderAmount')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
<el-table-column prop="course_id" :label="t('courseId')" min-width="120" :show-overflow-tooltip="true"/> prop="order_status"
:label="t('orderStatus')"
<el-table-column prop="class_id" :label="t('classId')" min-width="120" :show-overflow-tooltip="true"/> min-width="120"
:show-overflow-tooltip="true"
<el-table-column prop="staff_id" :label="t('staffId')" min-width="120" :show-overflow-tooltip="true"/> />
<el-table-column prop="resource_id" :label="t('resourceId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="payment_type"
<el-table-column prop="after_sales_status" :label="t('afterSalesStatus')" min-width="120" :show-overflow-tooltip="true"/> :label="t('paymentType')"
min-width="120"
<el-table-column prop="after_sales_reason" :label="t('afterSalesReason')" min-width="120" :show-overflow-tooltip="true"/> :show-overflow-tooltip="true"
/>
<el-table-column prop="after_sales_time" :label="t('afterSalesTime')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
<el-table-column prop="payment_time" :label="t('paymentTime')" min-width="120" :show-overflow-tooltip="true"/> prop="order_amount"
:label="t('orderAmount')"
<el-table-column prop="subscription_payment_time" :label="t('subscriptionPaymentTime')" min-width="120" :show-overflow-tooltip="true"/> min-width="120"
:show-overflow-tooltip="true"
<el-table-column :label="t('operation')" fixed="right" min-width="120"> />
<el-table-column
prop="course_id"
:label="t('courseId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="class_id"
:label="t('classId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="staff_id"
:label="t('staffId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="resource_id"
:label="t('resourceId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="after_sales_status"
:label="t('afterSalesStatus')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="after_sales_reason"
:label="t('afterSalesReason')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="after_sales_time"
:label="t('afterSalesTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="payment_time"
:label="t('paymentTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="subscription_payment_time"
:label="t('subscriptionPaymentTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="orderTableTable.page" v-model:page-size="orderTableTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="orderTableTable.total" v-model:current-page="orderTableTable.page"
@size-change="loadOrderTableList()" @current-change="loadOrderTableList" /> v-model:page-size="orderTableTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="orderTableTable.total"
@size-change="loadOrderTableList()"
@current-change="loadOrderTableList"
/>
</div> </div>
</div> </div>
@ -114,11 +254,11 @@ import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getOrderTableList, deleteOrderTable } from '@/app/api/order_table' import { getOrderTableList, deleteOrderTable } from '@/app/api/order_table'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/order_table/components/order-table-edit.vue' import Edit from '@/app/views/order_table/components/order-table-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let orderTableTable = reactive({ let orderTableTable = reactive({
page: 1, page: 1,
@ -126,21 +266,21 @@ let orderTableTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"payment_id":"", payment_id: '',
"order_status":"", order_status: '',
"payment_type":"", payment_type: '',
"order_amount":"", order_amount: '',
"course_id":"", course_id: '',
"class_id":"", class_id: '',
"staff_id":"", staff_id: '',
"resource_id":"", resource_id: '',
"after_sales_status":"", after_sales_status: '',
"after_sales_reason":"", after_sales_reason: '',
"after_sales_time":"", after_sales_time: '',
"payment_time":"", payment_time: '',
"subscription_payment_time":"" subscription_payment_time: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -150,7 +290,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取订单列表 * 获取订单列表
*/ */
@ -161,12 +300,14 @@ const loadOrderTableList = (page: number = 1) => {
getOrderTableList({ getOrderTableList({
page: orderTableTable.page, page: orderTableTable.page,
limit: orderTableTable.limit, limit: orderTableTable.limit,
...orderTableTable.searchParam ...orderTableTable.searchParam,
}).then(res => { })
.then((res) => {
orderTableTable.loading = false orderTableTable.loading = false
orderTableTable.data = res.data.data orderTableTable.data = res.data.data
orderTableTable.total = res.data.total orderTableTable.total = res.data.total
}).catch(() => { })
.catch(() => {
orderTableTable.loading = false orderTableTable.loading = false
}) })
} }
@ -195,22 +336,19 @@ const editEvent = (data: any) => {
* 删除订单 * 删除订单
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('orderTableDeleteTips'), t('warning'), ElMessageBox.confirm(t('orderTableDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deleteOrderTable(id)
deleteOrderTable(id).then(() => { .then(() => {
loadOrderTableList() loadOrderTableList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
@ -227,5 +365,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

154
admin/src/app/views/performance_records/components/performance-records-edit.vue

@ -1,42 +1,94 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updatePerformanceRecords') : t('addPerformanceRecords')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="
formData.id ? t('updatePerformanceRecords') : t('addPerformanceRecords')
"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('staffId')" prop="staff_id"> <el-form-item :label="t('staffId')" prop="staff_id">
<el-input v-model="formData.staff_id" clearable :placeholder="t('staffIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.staff_id"
clearable
:placeholder="t('staffIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('resourceId')" prop="resource_id"> <el-form-item :label="t('resourceId')" prop="resource_id">
<el-input v-model="formData.resource_id" clearable :placeholder="t('resourceIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.resource_id"
clearable
:placeholder="t('resourceIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('orderId')" > <el-form-item :label="t('orderId')">
<el-input v-model="formData.order_id" clearable :placeholder="t('orderIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.order_id"
clearable
:placeholder="t('orderIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('orderStatus')" > <el-form-item :label="t('orderStatus')">
<el-input v-model="formData.order_status" clearable :placeholder="t('orderStatusPlaceholder')" class="input-width" /> <el-input
v-model="formData.order_status"
clearable
:placeholder="t('orderStatusPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('performanceType')" prop="performance_type"> <el-form-item :label="t('performanceType')" prop="performance_type">
<el-input v-model="formData.performance_type" clearable :placeholder="t('performanceTypePlaceholder')" class="input-width" /> <el-input
v-model="formData.performance_type"
clearable
:placeholder="t('performanceTypePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('performanceValue')" prop="performance_value"> <el-form-item :label="t('performanceValue')" prop="performance_value">
<el-input v-model="formData.performance_value" clearable :placeholder="t('performanceValuePlaceholder')" class="input-width" /> <el-input
v-model="formData.performance_value"
clearable
:placeholder="t('performanceValuePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('remarks')" > <el-form-item :label="t('remarks')">
<el-input v-model="formData.remarks" clearable :placeholder="t('remarksPlaceholder')" class="input-width" /> <el-input
v-model="formData.remarks"
clearable
:placeholder="t('remarksPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -47,7 +99,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addPerformanceRecords, editPerformanceRecords, getPerformanceRecordsInfo } from '@/app/api/performance_records' import {
addPerformanceRecords,
editPerformanceRecords,
getPerformanceRecordsInfo,
} from '@/app/api/performance_records'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -74,39 +130,33 @@ const formRules = computed(() => {
return { return {
staff_id: [ staff_id: [
{ required: true, message: t('staffIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('staffIdPlaceholder'), trigger: 'blur' },
],
]
,
resource_id: [ resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
],
]
,
order_id: [ order_id: [
{ required: true, message: t('orderIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('orderIdPlaceholder'), trigger: 'blur' },
],
]
,
order_status: [ order_status: [
{ required: true, message: t('orderStatusPlaceholder'), trigger: 'blur' }, { required: true, message: t('orderStatusPlaceholder'), trigger: 'blur' },
],
]
,
performance_type: [ performance_type: [
{ required: true, message: t('performanceTypePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('performanceTypePlaceholder'),
, trigger: 'blur',
},
],
performance_value: [ performance_value: [
{ required: true, message: t('performanceValuePlaceholder'), trigger: 'blur' }, {
required: true,
] message: t('performanceValuePlaceholder'),
, trigger: 'blur',
},
],
remarks: [ remarks: [
{ required: true, message: t('remarksPlaceholder'), trigger: 'blur' }, { required: true, message: t('remarksPlaceholder'), trigger: 'blur' },
],
]
,
} }
}) })
@ -126,11 +176,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -139,14 +191,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if(row){ if (row) {
const data = await (await getPerformanceRecordsInfo(row.id)).data const data = await (await getPerformanceRecordsInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -164,7 +215,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -191,13 +247,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label{ .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

199
admin/src/app/views/performance_records/performance_records.vue

@ -1,79 +1,167 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent"> <el-button type="primary" @click="addEvent">
{{ t('addPerformanceRecords') }} {{ t('addPerformanceRecords') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card
<el-form :inline="true" :model="performanceRecordsTable.searchParam" ref="searchFormRef"> class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="performanceRecordsTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('staffId')" prop="staff_id"> <el-form-item :label="t('staffId')" prop="staff_id">
<el-input v-model="performanceRecordsTable.searchParam.staff_id" :placeholder="t('staffIdPlaceholder')" /> <el-input
v-model="performanceRecordsTable.searchParam.staff_id"
:placeholder="t('staffIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('resourceId')" prop="resource_id"> <el-form-item :label="t('resourceId')" prop="resource_id">
<el-input v-model="performanceRecordsTable.searchParam.resource_id" :placeholder="t('resourceIdPlaceholder')" /> <el-input
v-model="performanceRecordsTable.searchParam.resource_id"
:placeholder="t('resourceIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('orderId')" prop="order_id"> <el-form-item :label="t('orderId')" prop="order_id">
<el-input v-model="performanceRecordsTable.searchParam.order_id" :placeholder="t('orderIdPlaceholder')" /> <el-input
v-model="performanceRecordsTable.searchParam.order_id"
:placeholder="t('orderIdPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('orderStatus')" prop="order_status"> <el-form-item :label="t('orderStatus')" prop="order_status">
<el-input v-model="performanceRecordsTable.searchParam.order_status" :placeholder="t('orderStatusPlaceholder')" /> <el-input
v-model="performanceRecordsTable.searchParam.order_status"
:placeholder="t('orderStatusPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('performanceType')" prop="performance_type"> <el-form-item :label="t('performanceType')" prop="performance_type">
<el-input v-model="performanceRecordsTable.searchParam.performance_type" :placeholder="t('performanceTypePlaceholder')" /> <el-input
v-model="performanceRecordsTable.searchParam.performance_type"
:placeholder="t('performanceTypePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('performanceValue')" prop="performance_value"> <el-form-item :label="t('performanceValue')" prop="performance_value">
<el-input v-model="performanceRecordsTable.searchParam.performance_value" :placeholder="t('performanceValuePlaceholder')" /> <el-input
v-model="performanceRecordsTable.searchParam.performance_value"
:placeholder="t('performanceValuePlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('remarks')" prop="remarks"> <el-form-item :label="t('remarks')" prop="remarks">
<el-input v-model="performanceRecordsTable.searchParam.remarks" :placeholder="t('remarksPlaceholder')" /> <el-input
v-model="performanceRecordsTable.searchParam.remarks"
:placeholder="t('remarksPlaceholder')"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadPerformanceRecordsList()">{{ t('search') }}</el-button> <el-button type="primary" @click="loadPerformanceRecordsList()">{{
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button> t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="mt-[10px]"> <div class="mt-[10px]">
<el-table :data="performanceRecordsTable.data" size="large" v-loading="performanceRecordsTable.loading"> <el-table
:data="performanceRecordsTable.data"
size="large"
v-loading="performanceRecordsTable.loading"
>
<template #empty> <template #empty>
<span>{{ !performanceRecordsTable.loading ? t('emptyData') : '' }}</span> <span>{{
!performanceRecordsTable.loading ? t('emptyData') : ''
}}</span>
</template> </template>
<el-table-column prop="staff_id" :label="t('staffId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="staff_id"
:label="t('staffId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="resource_id" :label="t('resourceId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="resource_id"
:label="t('resourceId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="order_id" :label="t('orderId')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="order_id"
:label="t('orderId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="order_status" :label="t('orderStatus')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="order_status"
:label="t('orderStatus')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="performance_type" :label="t('performanceType')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="performance_type"
:label="t('performanceType')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="performance_value" :label="t('performanceValue')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="performance_value"
:label="t('performanceValue')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="remarks" :label="t('remarks')" min-width="120" :show-overflow-tooltip="true"/> <el-table-column
prop="remarks"
:label="t('remarks')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-button type="primary" link @click="editEvent(row)">{{
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="mt-[16px] flex justify-end"> <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="performanceRecordsTable.page" v-model:page-size="performanceRecordsTable.limit" <el-pagination
layout="total, sizes, prev, pager, next, jumper" :total="performanceRecordsTable.total" v-model:current-page="performanceRecordsTable.page"
@size-change="loadPerformanceRecordsList()" @current-change="loadPerformanceRecordsList" /> v-model:page-size="performanceRecordsTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="performanceRecordsTable.total"
@size-change="loadPerformanceRecordsList()"
@current-change="loadPerformanceRecordsList"
/>
</div> </div>
</div> </div>
<edit ref="editPerformanceRecordsDialog" @complete="loadPerformanceRecordsList" /> <edit
ref="editPerformanceRecordsDialog"
@complete="loadPerformanceRecordsList"
/>
</el-card> </el-card>
</div> </div>
</template> </template>
@ -82,13 +170,16 @@
import { reactive, ref, watch } from 'vue' import { reactive, ref, watch } from 'vue'
import { t } from '@/lang' import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { getPerformanceRecordsList, deletePerformanceRecords } from '@/app/api/performance_records' import {
getPerformanceRecordsList,
deletePerformanceRecords,
} from '@/app/api/performance_records'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/performance_records/components/performance-records-edit.vue' import Edit from '@/app/views/performance_records/components/performance-records-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title
let performanceRecordsTable = reactive({ let performanceRecordsTable = reactive({
page: 1, page: 1,
@ -96,15 +187,15 @@ let performanceRecordsTable = reactive({
total: 0, total: 0,
loading: true, loading: true,
data: [], data: [],
searchParam:{ searchParam: {
"staff_id":"", staff_id: '',
"resource_id":"", resource_id: '',
"order_id":"", order_id: '',
"order_status":"", order_status: '',
"performance_type":"", performance_type: '',
"performance_value":"", performance_value: '',
"remarks":"" remarks: '',
} },
}) })
const searchFormRef = ref<FormInstance>() const searchFormRef = ref<FormInstance>()
@ -114,7 +205,6 @@ const selectData = ref<any[]>([])
// //
/** /**
* 获取绩效记录列表 * 获取绩效记录列表
*/ */
@ -125,12 +215,14 @@ const loadPerformanceRecordsList = (page: number = 1) => {
getPerformanceRecordsList({ getPerformanceRecordsList({
page: performanceRecordsTable.page, page: performanceRecordsTable.page,
limit: performanceRecordsTable.limit, limit: performanceRecordsTable.limit,
...performanceRecordsTable.searchParam ...performanceRecordsTable.searchParam,
}).then(res => { })
.then((res) => {
performanceRecordsTable.loading = false performanceRecordsTable.loading = false
performanceRecordsTable.data = res.data.data performanceRecordsTable.data = res.data.data
performanceRecordsTable.total = res.data.total performanceRecordsTable.total = res.data.total
}).catch(() => { })
.catch(() => {
performanceRecordsTable.loading = false performanceRecordsTable.loading = false
}) })
} }
@ -159,22 +251,19 @@ const editEvent = (data: any) => {
* 删除绩效记录 * 删除绩效记录
*/ */
const deleteEvent = (id: number) => { const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('performanceRecordsDeleteTips'), t('warning'), ElMessageBox.confirm(t('performanceRecordsDeleteTips'), t('warning'), {
{
confirmButtonText: t('confirm'), confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'), cancelButtonText: t('cancel'),
type: 'warning', type: 'warning',
} }).then(() => {
).then(() => { deletePerformanceRecords(id)
deletePerformanceRecords(id).then(() => { .then(() => {
loadPerformanceRecordsList() loadPerformanceRecordsList()
}).catch(() => {
}) })
.catch(() => {})
}) })
} }
const resetForm = (formEl: FormInstance | undefined) => { const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
@ -191,5 +280,5 @@ const resetForm = (formEl: FormInstance | undefined) => {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
</style> </style>

116
admin/src/app/views/person_course_schedule/components/person-course-schedule-edit.vue

@ -1,34 +1,78 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updatePersonCourseSchedule') : t('addPersonCourseSchedule')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> v-model="showDialog"
:title="
formData.id
? t('updatePersonCourseSchedule')
: t('addPersonCourseSchedule')
"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-form-item :label="t('personId')" prop="person_id"> <el-form-item :label="t('personId')" prop="person_id">
<el-input v-model="formData.person_id" clearable :placeholder="t('personIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.person_id"
clearable
:placeholder="t('personIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('personType')" prop="person_type"> <el-form-item :label="t('personType')" prop="person_type">
<el-input v-model="formData.person_type" clearable :placeholder="t('personTypePlaceholder')" class="input-width" /> <el-input
v-model="formData.person_type"
clearable
:placeholder="t('personTypePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('scheduleId')" prop="schedule_id"> <el-form-item :label="t('scheduleId')" prop="schedule_id">
<el-input v-model="formData.schedule_id" clearable :placeholder="t('scheduleIdPlaceholder')" class="input-width" /> <el-input
v-model="formData.schedule_id"
clearable
:placeholder="t('scheduleIdPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('courseDate')" prop="course_date"> <el-form-item :label="t('courseDate')" prop="course_date">
<el-input v-model="formData.course_date" clearable :placeholder="t('courseDatePlaceholder')" class="input-width" /> <el-input
v-model="formData.course_date"
clearable
:placeholder="t('courseDatePlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('timeSlot')" prop="time_slot"> <el-form-item :label="t('timeSlot')" prop="time_slot">
<el-input v-model="formData.time_slot" clearable :placeholder="t('timeSlotPlaceholder')" class="input-width" /> <el-input
v-model="formData.time_slot"
clearable
:placeholder="t('timeSlotPlaceholder')"
class="input-width"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{ <el-button
t('confirm') type="primary"
}}</el-button> :loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -39,7 +83,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { addPersonCourseSchedule, editPersonCourseSchedule, getPersonCourseScheduleInfo } from '@/app/api/person_course_schedule' import {
addPersonCourseSchedule,
editPersonCourseSchedule,
getPersonCourseScheduleInfo,
} from '@/app/api/person_course_schedule'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -64,29 +112,19 @@ const formRules = computed(() => {
return { return {
person_id: [ person_id: [
{ required: true, message: t('personIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('personIdPlaceholder'), trigger: 'blur' },
],
]
,
person_type: [ person_type: [
{ required: true, message: t('personTypePlaceholder'), trigger: 'blur' }, { required: true, message: t('personTypePlaceholder'), trigger: 'blur' },
],
]
,
schedule_id: [ schedule_id: [
{ required: true, message: t('scheduleIdPlaceholder'), trigger: 'blur' }, { required: true, message: t('scheduleIdPlaceholder'), trigger: 'blur' },
],
]
,
course_date: [ course_date: [
{ required: true, message: t('courseDatePlaceholder'), trigger: 'blur' }, { required: true, message: t('courseDatePlaceholder'), trigger: 'blur' },
],
]
,
time_slot: [ time_slot: [
{ required: true, message: t('timeSlotPlaceholder'), trigger: 'blur' }, { required: true, message: t('timeSlotPlaceholder'), trigger: 'blur' },
],
]
,
} }
}) })
@ -106,11 +144,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData let data = formData
save(data).then(res => { save(data)
.then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
emit('complete') emit('complete')
}).catch(err => { })
.catch((err) => {
loading.value = false loading.value = false
}) })
} }
@ -119,14 +159,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
// //
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
loading.value = true loading.value = true
if(row){ if (row) {
const data = await (await getPersonCourseScheduleInfo(row.id)).data const data = await (await getPersonCourseScheduleInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => { if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key] if (data[key] != undefined) formData[key] = data[key]
}) })
} }
@ -144,7 +183,12 @@ const mobileVerify = (rule: any, value: any, callback: any) => {
// //
const idCardVerify = (rule: any, value: any, callback: any) => { const idCardVerify = (rule: any, value: any, callback: any) => {
if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) { if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard'))) callback(new Error(t('generateIdCard')))
} else { } else {
callback() callback()
@ -171,13 +215,13 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({ defineExpose({
showDialog, showDialog,
setFormData setFormData,
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label{ .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;
} }
</style> </style>

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save