Browse Source

接口

wangzeyan
李双庆 11 months ago
parent
commit
ecd975f312
  1. 2
      admin/auto-imports.d.ts
  2. 23
      admin/src/app/api/attendance.ts
  3. 21
      admin/src/app/api/campus.ts
  4. 31
      admin/src/app/api/campus_person_role.ts
  5. 19
      admin/src/app/api/class.ts
  6. 20
      admin/src/app/api/communication_records.ts
  7. 19
      admin/src/app/api/contract.ts
  8. 19
      admin/src/app/api/course.ts
  9. 21
      admin/src/app/api/course_schedule.ts
  10. 27
      admin/src/app/api/customer_resource_changes.ts
  11. 26
      admin/src/app/api/customer_resources.ts
  12. 17
      admin/src/app/api/departments.ts
  13. 19
      admin/src/app/api/exam_answers.ts
  14. 19
      admin/src/app/api/exam_papers.ts
  15. 19
      admin/src/app/api/exam_questions.ts
  16. 19
      admin/src/app/api/exam_records.ts
  17. 21
      admin/src/app/api/market_performance.ts
  18. 19
      admin/src/app/api/order_table.ts
  19. 20
      admin/src/app/api/performance_records.ts
  20. 24
      admin/src/app/api/person_course_schedule.ts
  21. 21
      admin/src/app/api/physical_test.ts
  22. 19
      admin/src/app/api/reimbursement.ts
  23. 19
      admin/src/app/api/resource_sharing.ts
  24. 19
      admin/src/app/api/salary.ts
  25. 21
      admin/src/app/api/service.ts
  26. 19
      admin/src/app/api/six_speed.ts
  27. 32
      admin/src/app/api/six_speed_modification_log.ts
  28. 19
      admin/src/app/api/stat_hour.ts
  29. 20
      admin/src/app/api/student_course_usage.ts
  30. 19
      admin/src/app/api/student_courses.ts
  31. 19
      admin/src/app/api/user_feedback.ts
  32. 10
      admin/src/app/api/venue.ts
  33. 2
      admin/src/app/lang/zh-cn/departments.departments.json
  34. 4
      admin/src/app/lang/zh-cn/exam_questions.exam_questions.json
  35. 2
      admin/src/app/lang/zh-cn/exam_questions.exam_questions_edit.json
  36. 18
      admin/src/app/lang/zh-cn/venue.venue.json
  37. 219
      admin/src/app/views/attendance/attendance.vue
  38. 175
      admin/src/app/views/attendance/components/attendance-edit.vue
  39. 138
      admin/src/app/views/campus/campus.vue
  40. 34
      admin/src/app/views/campus/components/campus-edit.vue
  41. 163
      admin/src/app/views/campus_person_role/campus_person_role.vue
  42. 103
      admin/src/app/views/campus_person_role/components/campus-person-role-edit.vue
  43. 287
      admin/src/app/views/class/class.vue
  44. 196
      admin/src/app/views/class/components/class-edit.vue
  45. 286
      admin/src/app/views/communication_records/communication_records.vue
  46. 209
      admin/src/app/views/communication_records/components/communication-records-edit.vue
  47. 159
      admin/src/app/views/contract/components/contract-edit.vue
  48. 191
      admin/src/app/views/contract/contract.vue
  49. 175
      admin/src/app/views/course/components/course-edit.vue
  50. 210
      admin/src/app/views/course/course.vue
  51. 175
      admin/src/app/views/course_schedule/components/course-schedule-edit.vue
  52. 233
      admin/src/app/views/course_schedule/course_schedule.vue
  53. 144
      admin/src/app/views/customer_resource_changes/components/customer-resource-changes-edit.vue
  54. 186
      admin/src/app/views/customer_resource_changes/customer_resource_changes.vue
  55. 352
      admin/src/app/views/customer_resources/components/customer-resources-edit.vue
  56. 185
      admin/src/app/views/customer_resources/customer_resources.vue
  57. 88
      admin/src/app/views/departments/components/departments-edit.vue
  58. 122
      admin/src/app/views/departments/departments.vue
  59. 108
      admin/src/app/views/exam_answers/components/exam-answers-edit.vue
  60. 159
      admin/src/app/views/exam_answers/exam_answers.vue
  61. 98
      admin/src/app/views/exam_papers/components/exam-papers-edit.vue
  62. 127
      admin/src/app/views/exam_papers/exam_papers.vue
  63. 303
      admin/src/app/views/exam_questions/exam_questions.vue
  64. 251
      admin/src/app/views/exam_questions/exam_questions_edit.vue
  65. 130
      admin/src/app/views/exam_records/components/exam-records-edit.vue
  66. 177
      admin/src/app/views/exam_records/exam_records.vue
  67. 96
      admin/src/app/views/market_performance/components/market-performance-edit.vue
  68. 124
      admin/src/app/views/market_performance/market_performance.vue
  69. 220
      admin/src/app/views/order_table/components/order-table-edit.vue
  70. 302
      admin/src/app/views/order_table/order_table.vue
  71. 144
      admin/src/app/views/performance_records/components/performance-records-edit.vue
  72. 191
      admin/src/app/views/performance_records/performance_records.vue
  73. 112
      admin/src/app/views/person_course_schedule/components/person-course-schedule-edit.vue
  74. 163
      admin/src/app/views/person_course_schedule/person_course_schedule.vue
  75. 270
      admin/src/app/views/physical_test/components/physical-test-edit.vue
  76. 371
      admin/src/app/views/physical_test/physical_test.vue
  77. 119
      admin/src/app/views/reimbursement/components/reimbursement-edit.vue
  78. 168
      admin/src/app/views/reimbursement/reimbursement.vue
  79. 108
      admin/src/app/views/resource_sharing/components/resource-sharing-edit.vue
  80. 163
      admin/src/app/views/resource_sharing/resource_sharing.vue
  81. 209
      admin/src/app/views/salary/components/salary-edit.vue
  82. 271
      admin/src/app/views/salary/salary.vue
  83. 198
      admin/src/app/views/service/components/service-edit.vue
  84. 224
      admin/src/app/views/service/service.vue
  85. 243
      admin/src/app/views/six_speed/components/six-speed-edit.vue
  86. 307
      admin/src/app/views/six_speed/six_speed.vue
  87. 124
      admin/src/app/views/six_speed_modification_log/components/six-speed-modification-log-edit.vue
  88. 140
      admin/src/app/views/six_speed_modification_log/six_speed_modification_log.vue
  89. 403
      admin/src/app/views/stat_hour/components/stat-hour-edit.vue
  90. 591
      admin/src/app/views/stat_hour/stat_hour.vue
  91. 94
      admin/src/app/views/student_course_usage/components/student-course-usage-edit.vue
  92. 141
      admin/src/app/views/student_course_usage/student_course_usage.vue
  93. 119
      admin/src/app/views/student_courses/components/student-courses-edit.vue
  94. 172
      admin/src/app/views/student_courses/student_courses.vue
  95. 98
      admin/src/app/views/user_feedback/components/user-feedback-edit.vue
  96. 132
      admin/src/app/views/user_feedback/user_feedback.vue
  97. 227
      admin/src/app/views/venue/components/venue-edit.vue
  98. 100
      admin/src/app/views/venue/venue.vue
  99. 22
      admin/src/app/views/yjpz_config/yjpz_config.vue
  100. 364
      admin/src/components/TencentMapPicker.vue

2
admin/auto-imports.d.ts

@ -1,5 +1,5 @@
// Generated by 'unplugin-auto-import'
export {}
declare global {
const ElNotification: typeof import('element-plus/es')['ElNotification']
}

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

@ -1,9 +1,5 @@
import request from '@/utils/request'
// USER_CODE_BEGIN -- attendance
/**
*
@ -20,7 +16,7 @@ export function getAttendanceList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -1,7 +1,5 @@
import request from '@/utils/request'
// USER_CODE_BEGIN -- campus
/**
*
@ -18,7 +16,7 @@ export function getCampusList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -1,9 +1,5 @@
import request from '@/utils/request'
// USER_CODE_BEGIN -- campus_person_role
/**
*
@ -20,7 +16,7 @@ export function getCampusPersonRoleList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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,16 +51,22 @@ export function editCampusPersonRole(params: Record<string, any>) {
* @returns
*/
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>) {
return request.get('campus_person_role/campus_all', { params })
}export function getWithPersonnelList(params: Record<string,any>){
}
export function getWithPersonnelList(params: Record<string, any>) {
return request.get('campus_person_role/personnel_all', { params })
}export function getWithSysRoleList(params: Record<string,any>){
}
export function getWithSysRoleList(params: Record<string, any>) {
return request.get('campus_person_role/sys_role_all', { params })
}export function getWithDepartmentsList(params: Record<string,any>){
}
export function getWithDepartmentsList(params: Record<string, any>) {
return request.get('campus_person_role/departments_all', { params })
}

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

@ -16,7 +16,7 @@ export function getClassList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -16,7 +16,7 @@ export function getCommunicationRecordsList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -16,7 +16,7 @@ export function getContractList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -16,7 +16,7 @@ export function getCourseList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -1,7 +1,5 @@
import request from '@/utils/request'
// USER_CODE_BEGIN -- course_schedule
/**
*
@ -18,7 +16,7 @@ export function getCourseScheduleList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -7,7 +7,9 @@ import request from '@/utils/request'
* @returns
*/
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
*/
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
*/
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
*/
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
*/
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

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

@ -1,13 +1,5 @@
import request from '@/utils/request'
// USER_CODE_BEGIN -- customer_resources
/**
*
@ -24,7 +16,7 @@ export function getCustomerResourcesList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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,7 +51,10 @@ export function editCustomerResources(params: Record<string, any>) {
* @returns
*/
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>) {

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

@ -16,7 +16,7 @@ export function getDepartmentsList(params: Record<string, any>) {
* @returns
*/
export function getDepartmentsInfo(id: number) {
return request.get(`departments/departments/${id}`);
return request.get(`departments/departments/${id}`)
}
/**
@ -25,7 +25,10 @@ export function getDepartmentsInfo(id: number) {
* @returns
*/
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,
})
}
/**
@ -35,7 +38,10 @@ export function addDepartments(params: Record<string, any>) {
* @returns
*/
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,
})
}
/**
@ -44,7 +50,10 @@ export function editDepartments(params: Record<string, any>) {
* @returns
*/
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>) {

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

@ -16,7 +16,7 @@ export function getExamAnswersList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -16,7 +16,7 @@ export function getExamPapersList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -16,7 +16,7 @@ export function getExamQuestionsList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -16,7 +16,7 @@ export function getExamRecordsList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -16,7 +16,7 @@ export function getMarketPerformanceList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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,12 +51,16 @@ export function editMarketPerformance(params: Record<string, any>) {
* @returns
*/
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>) {
return request.get('market_performance/personnel_all', { params })
}export function getWithCampusList(params: Record<string,any>){
}
export function getWithCampusList(params: Record<string, any>) {
return request.get('market_performance/campus_all', { params })
}

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

@ -16,7 +16,7 @@ export function getOrderTableList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -16,7 +16,7 @@ export function getPerformanceRecordsList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -7,7 +7,9 @@ import request from '@/utils/request'
* @returns
*/
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
*/
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
*/
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
*/
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
*/
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

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

@ -1,7 +1,5 @@
import request from '@/utils/request'
// USER_CODE_BEGIN -- physical_test
/**
*
@ -18,7 +16,7 @@ export function getPhysicalTestList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -16,7 +16,7 @@ export function getReimbursementList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -16,7 +16,7 @@ export function getResourceSharingList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -16,7 +16,7 @@ export function getSalaryList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -1,7 +1,5 @@
import request from '@/utils/request'
// USER_CODE_BEGIN -- service
/**
*
@ -18,7 +16,7 @@ export function getServiceList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -16,7 +16,7 @@ export function getSixSpeedList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -1,9 +1,5 @@
import request from '@/utils/request'
// USER_CODE_BEGIN -- six_speed_modification_log
/**
*
@ -11,7 +7,9 @@ import request from '@/utils/request'
* @returns
*/
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
*/
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
*/
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
*/
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,12 +56,16 @@ export function editSixSpeedModificationLog(params: Record<string, any>) {
* @returns
*/
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>) {
return request.get('six_speed_modification_log/campus_all', { params })
}export function getWithPersonnelList(params: Record<string,any>){
}
export function getWithPersonnelList(params: Record<string, any>) {
return request.get('six_speed_modification_log/personnel_all', { params })
}

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

@ -16,7 +16,7 @@ export function getStatHourList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -16,7 +16,7 @@ export function getStudentCourseUsageList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -16,7 +16,7 @@ export function getStudentCoursesList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -16,7 +16,7 @@ export function getUserFeedbackList(params: Record<string, any>) {
* @returns
*/
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
*/
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
*/
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
*/
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

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

@ -1,5 +1,11 @@
import request from '@/utils/request'
// USER_CODE_BEGIN -- venue
/**
*
@ -47,6 +53,8 @@ export function deleteVenue(id: number) {
return request.delete(`venue/venue/${id}`, { showErrorMessage: true, showSuccessMessage: true })
}
export function getWithCampusList(params: Record<string,any>){
return request.get('venue/campus_all', {params})
}
// USER_CODE_END -- venue

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

@ -5,8 +5,6 @@
"departmentNamePlaceholder": "请输入部门名称",
"parentDepartmentId": "上级部门ID",
"parentDepartmentIdPlaceholder": "全部",
"createdAt":"创建时间",
"updatedAt":"修改时间",
"addDepartments": "添加部门",
"updateDepartments": "编辑部门",
"departmentsDeleteTips": "确定要删除该数据吗?",

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

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

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

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

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

@ -1,8 +1,6 @@
{
"id":"场地编号",
"idPlaceholder":"请输入场地编号",
"campusId":"校区ID",
"campusIdPlaceholder":"请输入校区ID",
"campusId":"校区",
"campusIdPlaceholder":"全部",
"venueName":"场地名称",
"venueNamePlaceholder":"请输入场地名称",
"capacity":"场地可容纳人数上限",
@ -11,12 +9,12 @@
"availabilityStatusPlaceholder":"请输入场地可用状态",
"timeRangeType":"场地可用时间范围类型",
"timeRangeTypePlaceholder":"请输入场地可用时间范围类型",
"timeRangeStart":"范围类型的开始时间",
"timeRangeStartPlaceholder":"请输入范围类型的开始时间",
"timeRangeEnd":"范围类型的结束时间",
"timeRangeEndPlaceholder":"请输入范围类型的结束时间",
"fixedTimeRanges":"固定时间范围类型的可用时间, 存储为JSON数组",
"fixedTimeRangesPlaceholder":"请输入固定时间范围类型的可用时间, 存储为JSON数组",
"fixedTimeRanges":"时间范围",
"fixedTimeRangesPlaceholder":"请输入时间范围",
"createdAt":"创建时间",
"createdAtPlaceholder":"请输入创建时间",
"updatedAt":"修改时间",
"updatedAtPlaceholder":"请输入修改时间",
"addVenue":"添加场地",
"updateVenue":"编辑场地",
"venueDeleteTips":"确定要删除该数据吗?",

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,82 +8,190 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="attendanceTable.searchParam" ref="searchFormRef">
<el-card
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-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 :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 :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 :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 :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 :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 :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 :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 :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 :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-button type="primary" @click="loadAttendanceList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadAttendanceList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !attendanceTable.loading ? t('emptyData') : '' }}</span>
</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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="attendanceTable.page" v-model:page-size="attendanceTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="attendanceTable.total"
@size-change="loadAttendanceList()" @current-change="loadAttendanceList" />
<el-pagination
v-model:current-page="attendanceTable.page"
v-model:page-size="attendanceTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="attendanceTable.total"
@size-change="loadAttendanceList()"
@current-change="loadAttendanceList"
/>
</div>
</div>
@ -103,7 +210,7 @@ import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/attendance/components/attendance-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let attendanceTable = reactive({
page: 1,
@ -112,17 +219,17 @@ let attendanceTable = reactive({
loading: true,
data: [],
searchParam: {
"campus_id":"",
"staff_id":"",
"attendance_date":"",
"check_in_time":"",
"check_out_time":"",
"status":"",
"remarks":"",
"created_at":"",
"updated_at":"",
"coordinate":""
}
campus_id: '',
staff_id: '',
attendance_date: '',
check_in_time: '',
check_out_time: '',
status: '',
remarks: '',
created_at: '',
updated_at: '',
coordinate: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -132,7 +239,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取考勤列表
*/
@ -143,12 +249,14 @@ const loadAttendanceList = (page: number = 1) => {
getAttendanceList({
page: attendanceTable.page,
limit: attendanceTable.limit,
...attendanceTable.searchParam
}).then(res => {
...attendanceTable.searchParam,
})
.then((res) => {
attendanceTable.loading = false
attendanceTable.data = res.data.data
attendanceTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
attendanceTable.loading = false
})
}
@ -177,22 +285,19 @@ const editEvent = (data: any) => {
* 删除考勤
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('attendanceDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('attendanceDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteAttendance(id).then(() => {
}).then(() => {
deleteAttendance(id)
.then(() => {
loadAttendanceList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

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

@ -1,54 +1,119 @@
<template>
<el-dialog 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-dialog
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-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 :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 :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 :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 :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 :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 :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 :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 :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 :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>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -59,7 +124,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -89,54 +158,42 @@ const formRules = computed(() => {
return {
campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
]
,
],
staff_id: [
{ required: true, message: t('staffIdPlaceholder'), trigger: 'blur' },
]
,
],
attendance_date: [
{ required: true, message: t('attendanceDatePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('attendanceDatePlaceholder'),
trigger: 'blur',
},
],
check_in_time: [
{ required: true, message: t('checkInTimePlaceholder'), trigger: 'blur' },
]
,
],
check_out_time: [
{ required: true, message: t('checkOutTimePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('checkOutTimePlaceholder'),
trigger: 'blur',
},
],
status: [
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' },
]
,
],
remarks: [
{ required: true, message: t('remarksPlaceholder'), trigger: 'blur' },
]
,
],
created_at: [
{ required: true, message: t('createdAtPlaceholder'), trigger: 'blur' },
]
,
],
updated_at: [
{ required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' },
]
,
],
coordinate: [
{ required: true, message: t('coordinatePlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -156,11 +213,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -169,14 +228,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
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]
})
}
@ -194,7 +252,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -221,7 +284,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,17 +8,35 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="campusTable.searchParam" ref="searchFormRef">
<el-card
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-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 :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 :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
v-for="(item, index) in campus_statusList"
@ -31,43 +48,85 @@
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadCampusList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadCampusList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !campusTable.loading ? t('emptyData') : '' }}</span>
</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 }">
<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>
</template>
</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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="campusTable.page" v-model:page-size="campusTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="campusTable.total"
@size-change="loadCampusList()" @current-change="loadCampusList" />
<el-pagination
v-model:current-page="campusTable.page"
v-model:page-size="campusTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="campusTable.total"
@size-change="loadCampusList()"
@current-change="loadCampusList"
/>
</div>
</div>
@ -86,7 +145,7 @@ import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/campus/components/campus-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let campusTable = reactive({
page: 1,
@ -95,10 +154,10 @@ let campusTable = reactive({
loading: true,
data: [],
searchParam: {
"campus_name":"",
"campus_address":"",
"campus_status":""
}
campus_name: '',
campus_address: '',
campus_status: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -109,9 +168,11 @@ const selectData = ref<any[]>([])
//
const campus_statusList = ref([] as any[])
const campus_statusDictList = async () => {
campus_statusList.value = await (await useDictionary('campus_status')).data.dictionary
campus_statusList.value = await (
await useDictionary('campus_status')
).data.dictionary
}
campus_statusDictList();
campus_statusDictList()
/**
* 获取校区列表
@ -123,12 +184,14 @@ const loadCampusList = (page: number = 1) => {
getCampusList({
page: campusTable.page,
limit: campusTable.limit,
...campusTable.searchParam
}).then(res => {
...campusTable.searchParam,
})
.then((res) => {
campusTable.loading = false
campusTable.data = res.data.data
campusTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
campusTable.loading = false
})
}
@ -157,22 +220,19 @@ const editEvent = (data: any) => {
* 删除校区
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('campusDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('campusDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteCampus(id).then(() => {
}).then(() => {
deleteCampus(id)
.then(() => {
loadCampusList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

34
admin/src/app/views/campus/components/campus-edit.vue

@ -23,21 +23,31 @@
/>
</el-form-item>
<el-form-item :label="t('campusAddress')">
<el-input
v-model="formData.campus_address"
clearable
:placeholder="t('campusAddressPlaceholder')"
class="input-width"
/>
</el-form-item>
<!-- <el-form-item :label="t('campusAddress')">-->
<!-- <el-input-->
<!-- v-model="formData.campus_address"-->
<!-- clearable-->
<!-- :placeholder="t('campusAddressPlaceholder')"-->
<!-- class="input-width"-->
<!-- />-->
<!-- </el-form-item>-->
<el-form-item :label="t('campusPreviewImage')">
<upload-image v-model="formData.campus_preview_image" />
</el-form-item>
<el-form-item :label="t('campusCoordinates')">
<TencentMapPicker v-model="formData.campus_coordinates" />
<el-button @click="showMapPicker">
{{
formData.campus_coordinates?.address ||
t('campusCoordinatesPlaceholder')
}}</el-button
>
<TencentMapPicker
ref="mapPickerRef"
v-model="formData.campus_coordinates"
v-model:visible="showMapPickerVisible"
/>
</el-form-item>
<el-form-item :label="t('campusIntroduction')">
@ -99,7 +109,11 @@ const initialFormData = {
const formData: Record<string, any> = reactive({ ...initialFormData })
const formRef = ref<FormInstance>()
const mapPickerRef = ref()
const showMapPickerVisible = ref(false)
const showMapPicker = () => {
showMapPickerVisible.value = true
}
//
const formRules = computed(() => {
return {

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,11 +8,22 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="campusPersonRoleTable.searchParam" ref="searchFormRef">
<el-card
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-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
v-for="(item, index) in campusIdList"
:key="index"
@ -23,9 +33,13 @@
</el-select>
</el-form-item>
<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
v-for="(item, index) in personIdList"
:key="index"
@ -35,9 +49,13 @@
</el-select>
</el-form-item>
<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
v-for="(item, index) in roleIdList"
:key="index"
@ -47,9 +65,13 @@
</el-select>
</el-form-item>
<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
v-for="(item, index) in deptIdList"
:key="index"
@ -60,41 +82,86 @@
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadCampusPersonRoleList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadCampusPersonRoleList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !campusPersonRoleTable.loading ? t('emptyData') : '' }}</span>
<span>{{
!campusPersonRoleTable.loading ? t('emptyData') : ''
}}</span>
</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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="campusPersonRoleTable.page" v-model:page-size="campusPersonRoleTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="campusPersonRoleTable.total"
@size-change="loadCampusPersonRoleList()" @current-change="loadCampusPersonRoleList" />
<el-pagination
v-model:current-page="campusPersonRoleTable.page"
v-model:page-size="campusPersonRoleTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="campusPersonRoleTable.total"
@size-change="loadCampusPersonRoleList()"
@current-change="loadCampusPersonRoleList"
/>
</div>
</div>
<edit ref="editCampusPersonRoleDialog" @complete="loadCampusPersonRoleList" />
<edit
ref="editCampusPersonRoleDialog"
@complete="loadCampusPersonRoleList"
/>
</el-card>
</div>
</template>
@ -103,13 +170,20 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
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 { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/campus_person_role/components/campus-person-role-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let campusPersonRoleTable = reactive({
page: 1,
@ -118,11 +192,11 @@ let campusPersonRoleTable = reactive({
loading: true,
data: [],
searchParam: {
"campus_id":"",
"person_id":"",
"role_id":"",
"dept_id":""
}
campus_id: '',
person_id: '',
role_id: '',
dept_id: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -132,7 +206,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取角色关系列表
*/
@ -143,12 +216,14 @@ const loadCampusPersonRoleList = (page: number = 1) => {
getCampusPersonRoleList({
page: campusPersonRoleTable.page,
limit: campusPersonRoleTable.limit,
...campusPersonRoleTable.searchParam
}).then(res => {
...campusPersonRoleTable.searchParam,
})
.then((res) => {
campusPersonRoleTable.loading = false
campusPersonRoleTable.data = res.data.data
campusPersonRoleTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
campusPersonRoleTable.loading = false
})
}
@ -177,21 +252,19 @@ const editEvent = (data: any) => {
* 删除角色关系
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('campusPersonRoleDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('campusPersonRoleDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteCampusPersonRole(id).then(() => {
}).then(() => {
deleteCampusPersonRole(id)
.then(() => {
loadCampusPersonRoleList()
}).catch(() => {
})
.catch(() => {})
})
}
const campusIdList = ref([])
const setCampusIdList = async () => {
campusIdList.value = await (await getWithCampusList({})).data

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

@ -1,8 +1,28 @@
<template>
<el-dialog 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-dialog
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-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
v-for="(item, index) in campusIdList"
@ -14,7 +34,12 @@
</el-form-item>
<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
v-for="(item, index) in personIdList"
@ -26,7 +51,12 @@
</el-form-item>
<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
v-for="(item, index) in roleIdList"
@ -38,7 +68,12 @@
</el-form-item>
<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
v-for="(item, index) in deptIdList"
@ -48,15 +83,17 @@
/>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -67,7 +104,15 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -91,24 +136,16 @@ const formRules = computed(() => {
return {
campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
]
,
],
person_id: [
{ required: true, message: t('personIdPlaceholder'), trigger: 'blur' },
]
,
],
role_id: [
{ required: true, message: t('roleIdPlaceholder'), trigger: 'blur' },
]
,
],
dept_id: [
{ required: true, message: t('deptIdPlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -128,11 +165,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -141,8 +180,6 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const campusIdList = ref([] as any[])
const setCampusIdList = async () => {
campusIdList.value = await (await getWithCampusList({})).data
@ -168,7 +205,8 @@ const setFormData = async (row: any = null) => {
loading.value = true
if (row) {
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]
})
}
@ -186,7 +224,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -213,7 +256,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,97 +8,229 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="classTable.searchParam" ref="searchFormRef">
<el-card
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-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 :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 :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 :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 :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 :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 :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 :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 :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 :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 :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 :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 :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-button type="primary" @click="loadClassList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadClassList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !classTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="campus_id" :label="t('campusId')" 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="class_name" :label="t('className')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="head_coach" :label="t('headCoach')" min-width="120" :show-overflow-tooltip="true"/>
<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">
<el-table-column
prop="campus_id"
:label="t('campusId')"
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="class_name"
:label="t('className')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="head_coach"
:label="t('headCoach')"
min-width="120"
:show-overflow-tooltip="true"
/>
<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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="classTable.page" v-model:page-size="classTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="classTable.total"
@size-change="loadClassList()" @current-change="loadClassList" />
<el-pagination
v-model:current-page="classTable.page"
v-model:page-size="classTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="classTable.total"
@size-change="loadClassList()"
@current-change="loadClassList"
/>
</div>
</div>
@ -118,7 +249,7 @@ import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/class/components/class-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let classTable = reactive({
page: 1,
@ -127,20 +258,20 @@ let classTable = reactive({
loading: true,
data: [],
searchParam: {
"campus_id":"",
"campus_name":"",
"class_name":"",
"head_coach":"",
"age_group":"",
"class_type":"",
"assistant_coach":"",
"created_at":"",
"updated_at":"",
"deleted_at":"",
"status":"",
"sort_order":"",
"remarks":""
}
campus_id: '',
campus_name: '',
class_name: '',
head_coach: '',
age_group: '',
class_type: '',
assistant_coach: '',
created_at: '',
updated_at: '',
deleted_at: '',
status: '',
sort_order: '',
remarks: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -150,7 +281,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取班级列表
*/
@ -161,12 +291,14 @@ const loadClassList = (page: number = 1) => {
getClassList({
page: classTable.page,
limit: classTable.limit,
...classTable.searchParam
}).then(res => {
...classTable.searchParam,
})
.then((res) => {
classTable.loading = false
classTable.data = res.data.data
classTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
classTable.loading = false
})
}
@ -195,22 +327,19 @@ const editEvent = (data: any) => {
* 删除班级
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('classDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('classDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteClass(id).then(() => {
}).then(() => {
deleteClass(id)
.then(() => {
loadClassList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

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

@ -1,66 +1,146 @@
<template>
<el-dialog 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-dialog
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-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 :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 :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 :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 :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 :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 :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 :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 :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 :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 :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 :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 :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>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -104,69 +184,47 @@ const formRules = computed(() => {
return {
campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
]
,
],
campus_name: [
{ required: true, message: t('campusNamePlaceholder'), trigger: 'blur' },
]
,
],
class_name: [
{ required: true, message: t('classNamePlaceholder'), trigger: 'blur' },
]
,
],
head_coach: [
{ required: true, message: t('headCoachPlaceholder'), trigger: 'blur' },
]
,
],
age_group: [
{ required: true, message: t('ageGroupPlaceholder'), trigger: 'blur' },
]
,
],
class_type: [
{ required: true, message: t('classTypePlaceholder'), trigger: 'blur' },
]
,
],
assistant_coach: [
{ required: true, message: t('assistantCoachPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('assistantCoachPlaceholder'),
trigger: 'blur',
},
],
created_at: [
{ required: true, message: t('createdAtPlaceholder'), trigger: 'blur' },
]
,
],
updated_at: [
{ required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' },
]
,
],
deleted_at: [
{ required: true, message: t('deletedAtPlaceholder'), trigger: 'blur' },
]
,
],
status: [
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' },
]
,
],
sort_order: [
{ required: true, message: t('sortOrderPlaceholder'), trigger: 'blur' },
]
,
],
remarks: [
{ required: true, message: t('remarksPlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -186,11 +244,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -199,14 +259,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
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]
})
}
@ -224,7 +283,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -251,7 +315,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,91 +8,223 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="communicationRecordsTable.searchParam" ref="searchFormRef">
<el-card
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-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 :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 :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 :label="t('communicationType')" prop="communication_type">
<el-input v-model="communicationRecordsTable.searchParam.communication_type" :placeholder="t('communicationTypePlaceholder')" />
<el-form-item
:label="t('communicationType')"
prop="communication_type"
>
<el-input
v-model="communicationRecordsTable.searchParam.communication_type"
:placeholder="t('communicationTypePlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('communicationResult')" prop="communication_result">
<el-input v-model="communicationRecordsTable.searchParam.communication_result" :placeholder="t('communicationResultPlaceholder')" />
<el-form-item
:label="t('communicationResult')"
prop="communication_result"
>
<el-input
v-model="
communicationRecordsTable.searchParam.communication_result
"
:placeholder="t('communicationResultPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('communicationTime')" prop="communication_time">
<el-input v-model="communicationRecordsTable.searchParam.communication_time" :placeholder="t('communicationTimePlaceholder')" />
<el-form-item
:label="t('communicationTime')"
prop="communication_time"
>
<el-input
v-model="communicationRecordsTable.searchParam.communication_time"
:placeholder="t('communicationTimePlaceholder')"
/>
</el-form-item>
<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 :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 :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 :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 :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-button type="primary" @click="loadCommunicationRecordsList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadCommunicationRecordsList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !communicationRecordsTable.loading ? t('emptyData') : '' }}</span>
<span>{{
!communicationRecordsTable.loading ? t('emptyData') : ''
}}</span>
</template>
<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_type" :label="t('resourceType')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column 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">
<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_type"
:label="t('resourceType')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="communicationRecordsTable.page" v-model:page-size="communicationRecordsTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="communicationRecordsTable.total"
@size-change="loadCommunicationRecordsList()" @current-change="loadCommunicationRecordsList" />
<el-pagination
v-model:current-page="communicationRecordsTable.page"
v-model:page-size="communicationRecordsTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="communicationRecordsTable.total"
@size-change="loadCommunicationRecordsList()"
@current-change="loadCommunicationRecordsList"
/>
</div>
</div>
<edit ref="editCommunicationRecordsDialog" @complete="loadCommunicationRecordsList" />
<edit
ref="editCommunicationRecordsDialog"
@complete="loadCommunicationRecordsList"
/>
</el-card>
</div>
</template>
@ -102,13 +233,16 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
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 { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/communication_records/components/communication-records-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let communicationRecordsTable = reactive({
page: 1,
@ -117,18 +251,18 @@ let communicationRecordsTable = reactive({
loading: true,
data: [],
searchParam: {
"staff_id":"",
"resource_id":"",
"resource_type":"",
"communication_type":"",
"communication_result":"",
"communication_time":"",
"remarks":"",
"tag":"",
"business_id":"",
"created_at":"",
"updated_at":""
}
staff_id: '',
resource_id: '',
resource_type: '',
communication_type: '',
communication_result: '',
communication_time: '',
remarks: '',
tag: '',
business_id: '',
created_at: '',
updated_at: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -138,7 +272,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取沟通记录列表
*/
@ -149,12 +282,14 @@ const loadCommunicationRecordsList = (page: number = 1) => {
getCommunicationRecordsList({
page: communicationRecordsTable.page,
limit: communicationRecordsTable.limit,
...communicationRecordsTable.searchParam
}).then(res => {
...communicationRecordsTable.searchParam,
})
.then((res) => {
communicationRecordsTable.loading = false
communicationRecordsTable.data = res.data.data
communicationRecordsTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
communicationRecordsTable.loading = false
})
}
@ -183,22 +318,19 @@ const editEvent = (data: any) => {
* 删除沟通记录
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('communicationRecordsDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('communicationRecordsDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteCommunicationRecords(id).then(() => {
}).then(() => {
deleteCommunicationRecords(id)
.then(() => {
loadCommunicationRecordsList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

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

@ -1,58 +1,135 @@
<template>
<el-dialog 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-dialog
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-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 :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 :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 :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 :label="t('communicationResult')" prop="communication_result">
<el-input v-model="formData.communication_result" clearable :placeholder="t('communicationResultPlaceholder')" class="input-width" />
<el-form-item
: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 :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 :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 :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 :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 :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 :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>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -63,7 +140,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -94,59 +175,51 @@ const formRules = computed(() => {
return {
staff_id: [
{ required: true, message: t('staffIdPlaceholder'), trigger: 'blur' },
]
,
],
resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
]
,
],
resource_type: [
{ required: true, message: t('resourceTypePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('resourceTypePlaceholder'),
trigger: 'blur',
},
],
communication_type: [
{ required: true, message: t('communicationTypePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('communicationTypePlaceholder'),
trigger: 'blur',
},
],
communication_result: [
{ required: true, message: t('communicationResultPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('communicationResultPlaceholder'),
trigger: 'blur',
},
],
communication_time: [
{ required: true, message: t('communicationTimePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('communicationTimePlaceholder'),
trigger: 'blur',
},
],
remarks: [
{ 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: [
{ required: true, message: t('businessIdPlaceholder'), trigger: 'blur' },
]
,
],
created_at: [
{ required: true, message: t('createdAtPlaceholder'), trigger: 'blur' },
]
,
],
updated_at: [
{ required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -166,11 +239,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -179,14 +254,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
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]
})
}
@ -204,7 +278,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -231,7 +310,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,46 +1,101 @@
<template>
<el-dialog 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-dialog
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-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 :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 :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 :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 :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 :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 :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 :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>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -78,45 +133,45 @@ const formRef = ref<FormInstance>()
const formRules = computed(() => {
return {
contract_name: [
{ required: true, message: t('contractNamePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('contractNamePlaceholder'),
trigger: 'blur',
},
],
contract_template: [
{ required: true, message: t('contractTemplatePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('contractTemplatePlaceholder'),
trigger: 'blur',
},
],
contract_status: [
{ required: true, message: t('contractStatusPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('contractStatusPlaceholder'),
trigger: 'blur',
},
],
contract_type: [
{ required: true, message: t('contractTypePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('contractTypePlaceholder'),
trigger: 'blur',
},
],
remarks: [
{ required: true, message: t('remarksPlaceholder'), trigger: 'blur' },
]
,
],
created_at: [
{ required: true, message: t('createdAtPlaceholder'), trigger: 'blur' },
]
,
],
updated_at: [
{ required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' },
]
,
],
deleted_at: [
{ required: true, message: t('deletedAtPlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -136,11 +191,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -149,14 +206,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
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]
})
}
@ -174,7 +230,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -201,7 +262,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,72 +8,164 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="contractTable.searchParam" ref="searchFormRef">
<el-card
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-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 :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 :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 :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 :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 :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 :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 :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-button type="primary" @click="loadContractList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadContractList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !contractTable.loading ? t('emptyData') : '' }}</span>
</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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="contractTable.page" v-model:page-size="contractTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="contractTable.total"
@size-change="loadContractList()" @current-change="loadContractList" />
<el-pagination
v-model:current-page="contractTable.page"
v-model:page-size="contractTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="contractTable.total"
@size-change="loadContractList()"
@current-change="loadContractList"
/>
</div>
</div>
@ -93,7 +184,7 @@ import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/contract/components/contract-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let contractTable = reactive({
page: 1,
@ -102,15 +193,15 @@ let contractTable = reactive({
loading: true,
data: [],
searchParam: {
"contract_name":"",
"contract_template":"",
"contract_status":"",
"contract_type":"",
"remarks":"",
"created_at":"",
"updated_at":"",
"deleted_at":""
}
contract_name: '',
contract_template: '',
contract_status: '',
contract_type: '',
remarks: '',
created_at: '',
updated_at: '',
deleted_at: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -120,7 +211,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取合同列表
*/
@ -131,12 +221,14 @@ const loadContractList = (page: number = 1) => {
getContractList({
page: contractTable.page,
limit: contractTable.limit,
...contractTable.searchParam
}).then(res => {
...contractTable.searchParam,
})
.then((res) => {
contractTable.loading = false
contractTable.data = res.data.data
contractTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
contractTable.loading = false
})
}
@ -165,22 +257,19 @@ const editEvent = (data: any) => {
* 删除合同
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('contractDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('contractDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteContract(id).then(() => {
}).then(() => {
deleteContract(id)
.then(() => {
loadContractList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

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

@ -1,50 +1,113 @@
<template>
<el-dialog 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-dialog
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-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 :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 :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 :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 :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
: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 :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 :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 :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 :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>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -84,49 +147,47 @@ const formRules = computed(() => {
return {
course_name: [
{ required: true, message: t('courseNamePlaceholder'), trigger: 'blur' },
]
,
],
course_type: [
{ required: true, message: t('courseTypePlaceholder'), trigger: 'blur' },
]
,
],
duration: [
{ required: true, message: t('durationPlaceholder'), trigger: 'blur' },
]
,
],
session_count: [
{ required: true, message: t('sessionCountPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('sessionCountPlaceholder'),
trigger: 'blur',
},
],
single_session_count: [
{ required: true, message: t('singleSessionCountPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('singleSessionCountPlaceholder'),
trigger: 'blur',
},
],
price: [
{ required: true, message: t('pricePlaceholder'), trigger: 'blur' },
]
,
],
internal_reminder: [
{ required: true, message: t('internalReminderPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('internalReminderPlaceholder'),
trigger: 'blur',
},
],
customer_reminder: [
{ required: true, message: t('customerReminderPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('customerReminderPlaceholder'),
trigger: 'blur',
},
],
remarks: [
{ required: true, message: t('remarksPlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -146,11 +207,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -159,14 +222,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
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]
})
}
@ -184,7 +246,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -211,7 +278,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,77 +8,180 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="courseTable.searchParam" ref="searchFormRef">
<el-card
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-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 :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 :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 :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 :label="t('singleSessionCount')" prop="single_session_count">
<el-input v-model="courseTable.searchParam.single_session_count" :placeholder="t('singleSessionCountPlaceholder')" />
<el-form-item
: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 :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 :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 :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 :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-button type="primary" @click="loadCourseList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadCourseList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !courseTable.loading ? t('emptyData') : '' }}</span>
</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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="courseTable.page" v-model:page-size="courseTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="courseTable.total"
@size-change="loadCourseList()" @current-change="loadCourseList" />
<el-pagination
v-model:current-page="courseTable.page"
v-model:page-size="courseTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="courseTable.total"
@size-change="loadCourseList()"
@current-change="loadCourseList"
/>
</div>
</div>
@ -98,7 +200,7 @@ import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/course/components/course-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let courseTable = reactive({
page: 1,
@ -107,16 +209,16 @@ let courseTable = reactive({
loading: true,
data: [],
searchParam: {
"course_name":"",
"course_type":"",
"duration":"",
"session_count":"",
"single_session_count":"",
"price":"",
"internal_reminder":"",
"customer_reminder":"",
"remarks":""
}
course_name: '',
course_type: '',
duration: '',
session_count: '',
single_session_count: '',
price: '',
internal_reminder: '',
customer_reminder: '',
remarks: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -126,7 +228,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取课程列表
*/
@ -137,12 +238,14 @@ const loadCourseList = (page: number = 1) => {
getCourseList({
page: courseTable.page,
limit: courseTable.limit,
...courseTable.searchParam
}).then(res => {
...courseTable.searchParam,
})
.then((res) => {
courseTable.loading = false
courseTable.data = res.data.data
courseTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
courseTable.loading = false
})
}
@ -171,22 +274,19 @@ const editEvent = (data: any) => {
* 删除课程
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('courseDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('courseDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteCourse(id).then(() => {
}).then(() => {
deleteCourse(id)
.then(() => {
loadCourseList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

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

@ -1,54 +1,119 @@
<template>
<el-dialog 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-dialog
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-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 :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 :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 :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 :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 :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 :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 :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 :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 :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>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -59,7 +124,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -89,54 +158,42 @@ const formRules = computed(() => {
return {
campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
]
,
],
venue_id: [
{ required: true, message: t('venueIdPlaceholder'), trigger: 'blur' },
]
,
],
course_date: [
{ required: true, message: t('courseDatePlaceholder'), trigger: 'blur' },
]
,
],
time_slot: [
{ required: true, message: t('timeSlotPlaceholder'), trigger: 'blur' },
]
,
],
course_id: [
{ required: true, message: t('courseIdPlaceholder'), trigger: 'blur' },
]
,
],
coach_id: [
{ required: true, message: t('coachIdPlaceholder'), trigger: 'blur' },
]
,
],
participants: [
{ required: true, message: t('participantsPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('participantsPlaceholder'),
trigger: 'blur',
},
],
student_ids: [
{ required: true, message: t('studentIdsPlaceholder'), trigger: 'blur' },
]
,
],
available_capacity: [
{ required: true, message: t('availableCapacityPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('availableCapacityPlaceholder'),
trigger: 'blur',
},
],
status: [
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -156,11 +213,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -169,14 +228,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
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]
})
}
@ -194,7 +252,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -221,7 +284,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,82 +8,195 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="courseScheduleTable.searchParam" ref="searchFormRef">
<el-card
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-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 :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 :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 :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 :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 :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 :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 :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 :label="t('availableCapacity')" prop="available_capacity">
<el-input v-model="courseScheduleTable.searchParam.available_capacity" :placeholder="t('availableCapacityPlaceholder')" />
<el-form-item
:label="t('availableCapacity')"
prop="available_capacity"
>
<el-input
v-model="courseScheduleTable.searchParam.available_capacity"
:placeholder="t('availableCapacityPlaceholder')"
/>
</el-form-item>
<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-button type="primary" @click="loadCourseScheduleList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadCourseScheduleList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !courseScheduleTable.loading ? t('emptyData') : '' }}</span>
<span>{{
!courseScheduleTable.loading ? t('emptyData') : ''
}}</span>
</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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="courseScheduleTable.page" v-model:page-size="courseScheduleTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="courseScheduleTable.total"
@size-change="loadCourseScheduleList()" @current-change="loadCourseScheduleList" />
<el-pagination
v-model:current-page="courseScheduleTable.page"
v-model:page-size="courseScheduleTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="courseScheduleTable.total"
@size-change="loadCourseScheduleList()"
@current-change="loadCourseScheduleList"
/>
</div>
</div>
@ -97,13 +209,16 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
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 { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/course_schedule/components/course-schedule-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let courseScheduleTable = reactive({
page: 1,
@ -112,17 +227,17 @@ let courseScheduleTable = reactive({
loading: true,
data: [],
searchParam: {
"campus_id":"",
"venue_id":"",
"course_date":"",
"time_slot":"",
"course_id":"",
"coach_id":"",
"participants":"",
"student_ids":"",
"available_capacity":"",
"status":""
}
campus_id: '',
venue_id: '',
course_date: '',
time_slot: '',
course_id: '',
coach_id: '',
participants: '',
student_ids: '',
available_capacity: '',
status: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -132,7 +247,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取课程安排列表
*/
@ -143,12 +257,14 @@ const loadCourseScheduleList = (page: number = 1) => {
getCourseScheduleList({
page: courseScheduleTable.page,
limit: courseScheduleTable.limit,
...courseScheduleTable.searchParam
}).then(res => {
...courseScheduleTable.searchParam,
})
.then((res) => {
courseScheduleTable.loading = false
courseScheduleTable.data = res.data.data
courseScheduleTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
courseScheduleTable.loading = false
})
}
@ -177,22 +293,19 @@ const editEvent = (data: any) => {
* 删除课程安排
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('courseScheduleDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('courseScheduleDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteCourseSchedule(id).then(() => {
}).then(() => {
deleteCourseSchedule(id)
.then(() => {
loadCourseScheduleList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

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

@ -1,38 +1,90 @@
<template>
<el-dialog v-model="showDialog" :title="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-dialog
v-model="showDialog"
:title="
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 :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 :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 :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 :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 :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>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -43,7 +95,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -68,35 +124,31 @@ const formRef = ref<FormInstance>()
const formRules = computed(() => {
return {
customer_resource_id: [
{ required: true, message: t('customerResourceIdPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('customerResourceIdPlaceholder'),
trigger: 'blur',
},
],
operator_id: [
{ required: true, message: t('operatorIdPlaceholder'), trigger: 'blur' },
]
,
],
campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
]
,
],
modified_fields: [
{ required: true, message: t('modifiedFieldsPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('modifiedFieldsPlaceholder'),
trigger: 'blur',
},
],
old_values: [
{ required: true, message: t('oldValuesPlaceholder'), trigger: 'blur' },
]
,
],
new_values: [
{ required: true, message: t('newValuesPlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -108,7 +160,9 @@ const emit = defineEmits(['complete'])
*/
const confirm = async (formEl: FormInstance | undefined) => {
if (loading.value || !formEl) return
let save = formData.id ? editCustomerResourceChanges : addCustomerResourceChanges
let save = formData.id
? editCustomerResourceChanges
: addCustomerResourceChanges
await formEl.validate(async (valid) => {
if (valid) {
@ -116,11 +170,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -129,14 +185,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
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]
})
}
@ -154,7 +209,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -181,7 +241,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,66 +8,154 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<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-card
class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<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 :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 :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 :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 :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 :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-button type="primary" @click="loadCustomerResourceChangesList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button
type="primary"
@click="loadCustomerResourceChangesList()"
>{{ t('search') }}</el-button
>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !customerResourceChangesTable.loading ? t('emptyData') : '' }}</span>
<span>{{
!customerResourceChangesTable.loading ? t('emptyData') : ''
}}</span>
</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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="customerResourceChangesTable.page" v-model:page-size="customerResourceChangesTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="customerResourceChangesTable.total"
@size-change="loadCustomerResourceChangesList()" @current-change="loadCustomerResourceChangesList" />
<el-pagination
v-model:current-page="customerResourceChangesTable.page"
v-model:page-size="customerResourceChangesTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="customerResourceChangesTable.total"
@size-change="loadCustomerResourceChangesList()"
@current-change="loadCustomerResourceChangesList"
/>
</div>
</div>
<edit ref="editCustomerResourceChangesDialog" @complete="loadCustomerResourceChangesList" />
<edit
ref="editCustomerResourceChangesDialog"
@complete="loadCustomerResourceChangesList"
/>
</el-card>
</div>
</template>
@ -77,13 +164,16 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
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 { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/customer_resource_changes/components/customer-resource-changes-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let customerResourceChangesTable = reactive({
page: 1,
@ -92,13 +182,13 @@ let customerResourceChangesTable = reactive({
loading: true,
data: [],
searchParam: {
"customer_resource_id":"",
"operator_id":"",
"campus_id":"",
"modified_fields":"",
"old_values":"",
"new_values":""
}
customer_resource_id: '',
operator_id: '',
campus_id: '',
modified_fields: '',
old_values: '',
new_values: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -108,7 +198,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取客户资源表变更记录列表
*/
@ -119,12 +208,14 @@ const loadCustomerResourceChangesList = (page: number = 1) => {
getCustomerResourceChangesList({
page: customerResourceChangesTable.page,
limit: customerResourceChangesTable.limit,
...customerResourceChangesTable.searchParam
}).then(res => {
...customerResourceChangesTable.searchParam,
})
.then((res) => {
customerResourceChangesTable.loading = false
customerResourceChangesTable.data = res.data.data
customerResourceChangesTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
customerResourceChangesTable.loading = false
})
}
@ -153,22 +244,19 @@ const editEvent = (data: any) => {
* 删除客户资源表变更记录
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('customerResourceChangesDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('customerResourceChangesDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteCustomerResourceChanges(id).then(() => {
}).then(() => {
deleteCustomerResourceChanges(id)
.then(() => {
loadCustomerResourceChangesList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

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

@ -1,8 +1,28 @@
<template>
<el-dialog 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-dialog
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-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
v-for="(item, index) in sourceList"
@ -14,7 +34,12 @@
</el-form-item>
<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
v-for="(item, index) in source_channelList"
@ -26,15 +51,32 @@
</el-form-item>
<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 :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 :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
v-for="(item, index) in genderList"
@ -46,14 +88,31 @@
</el-form-item>
<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 :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 :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
v-for="(item, index) in purchasing_powerList"
@ -65,7 +124,12 @@
</el-form-item>
<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
v-for="(item, index) in cognitive_ideaList"
@ -76,26 +140,46 @@
</el-select>
</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
class="flex-1 !flex"
v-model="formData.optional_class_time"
clearable
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="t('optionalClassTimePlaceholder')">
:placeholder="t('optionalClassTimePlaceholder')"
>
</el-date-picker>
</el-form-item>
<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 :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 :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
v-for="(item, index) in initial_intentList"
@ -107,7 +191,12 @@
</el-form-item>
<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
v-for="(item, index) in campusList"
@ -119,7 +208,12 @@
</el-form-item>
<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
v-for="(item, index) in statusList"
@ -129,15 +223,17 @@
/>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -148,7 +244,12 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -183,90 +284,83 @@ const formRules = computed(() => {
return {
source: [
{ required: true, message: t('sourcePlaceholder'), trigger: 'blur' },
]
,
],
source_channel: [
{ required: true, message: t('sourceChannelPlaceholder'), trigger: 'blur' },
]
,
name: [
{ required: true, message: t('namePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('sourceChannelPlaceholder'),
trigger: 'blur',
},
],
name: [{ required: true, message: t('namePlaceholder'), trigger: 'blur' }],
age: [
{ required: true, message: t('agePlaceholder'), trigger: 'blur' },
{
validator: (rule: any, value: number, callback: any) => {
if (value === undefined || value === null || value === '') {
callback();
callback()
} else if (value < 3 || value > 80) {
callback(new Error(t('generateBetween')));
callback(new Error(t('generateBetween')))
} else {
callback();
callback()
}
},
trigger: 'blur'
}
]
,
trigger: 'blur',
},
],
gender: [
{ required: true, message: t('genderPlaceholder'), trigger: 'blur' },
]
,
],
phone_number: [
{ required: true, message: t('phoneNumberPlaceholder'), trigger: 'blur' },
]
,
],
demand: [
{ required: true, message: t('demandPlaceholder'), trigger: 'blur' },
]
,
],
purchasing_power: [
{ required: true, message: t('purchasingPowerPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('purchasingPowerPlaceholder'),
trigger: 'blur',
},
],
cognitive_idea: [
{ required: true, message: t('cognitiveIdeaPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('cognitiveIdeaPlaceholder'),
trigger: 'blur',
},
],
optional_class_time: [
{ required: true, message: t('optionalClassTimePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('optionalClassTimePlaceholder'),
trigger: 'blur',
},
],
distance: [
{ required: true, message: t('distancePlaceholder'), trigger: 'blur' },
]
,
],
decision_maker: [
{ required: true, message: t('decisionMakerPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('decisionMakerPlaceholder'),
trigger: 'blur',
},
],
initial_intent: [
{ required: true, message: t('initialIntentPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('initialIntentPlaceholder'),
trigger: 'blur',
},
],
campus: [
{ required: true, message: t('campusPlaceholder'), trigger: 'blur' },
]
,
],
status: [
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -286,11 +380,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -302,45 +398,87 @@ const confirm = async (formEl: FormInstance | undefined) => {
const sourceDictList = async () => {
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([])
const source_channelDictList = async () => {
source_channelList.value = await (await useDictionary('SourceChannel')).data.dictionary
source_channelList.value = await (
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([])
const genderDictList = async () => {
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([])
const purchasing_powerDictList = async () => {
purchasing_powerList.value = await (await useDictionary('customer_purchasing_power')).data.dictionary
purchasing_powerList.value = await (
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([])
const cognitive_ideaDictList = async () => {
cognitive_ideaList.value = await (await useDictionary('cognitive_concept')).data.dictionary
cognitive_ideaList.value = await (
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([])
const initial_intentDictList = async () => {
initial_intentList.value = await (await useDictionary('preliminarycustomerintention')).data.dictionary
initial_intentList.value = await (
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([])
const statusDictList = async () => {
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 setCampusList = async () => {
@ -352,7 +490,8 @@ const setFormData = async (row: any = null) => {
loading.value = true
if (row) {
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]
})
}
@ -370,7 +509,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -397,7 +541,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,27 +8,56 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="customerResourcesTable.searchParam" ref="searchFormRef">
<el-card
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-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 :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-button type="primary" @click="loadCustomerResourcesList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadCustomerResourcesList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !customerResourcesTable.loading ? t('emptyData') : '' }}</span>
<span>{{
!customerResourcesTable.loading ? t('emptyData') : ''
}}</span>
</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 }">
<div v-for="(item, index) in sourceList">
<div v-if="item.value == row.source">{{ item.name }}</div>
@ -37,13 +65,33 @@
</template>
</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 }">
<div v-for="(item, index) in genderList">
<div v-if="item.value == row.gender">{{ item.name }}</div>
@ -51,26 +99,51 @@
</template>
</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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="customerResourcesTable.page" v-model:page-size="customerResourcesTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="customerResourcesTable.total"
@size-change="loadCustomerResourcesList()" @current-change="loadCustomerResourcesList" />
<el-pagination
v-model:current-page="customerResourcesTable.page"
v-model:page-size="customerResourcesTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="customerResourcesTable.total"
@size-change="loadCustomerResourcesList()"
@current-change="loadCustomerResourcesList"
/>
</div>
</div>
<edit ref="editCustomerResourcesDialog" @complete="loadCustomerResourcesList" />
<edit
ref="editCustomerResourcesDialog"
@complete="loadCustomerResourcesList"
/>
</el-card>
</div>
</template>
@ -79,13 +152,17 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
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 { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/customer_resources/components/customer-resources-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let customerResourcesTable = reactive({
page: 1,
@ -94,9 +171,9 @@ let customerResourcesTable = reactive({
loading: true,
data: [],
searchParam: {
"name":"",
"phone_number":""
}
name: '',
phone_number: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -109,37 +186,45 @@ const selectData = ref<any[]>([])
const sourceDictList = async () => {
sourceList.value = await (await useDictionary('source')).data.dictionary
}
sourceDictList();
sourceDictList()
const source_channelList = ref([] as any[])
const source_channelDictList = async () => {
source_channelList.value = await (await useDictionary('SourceChannel')).data.dictionary
source_channelList.value = await (
await useDictionary('SourceChannel')
).data.dictionary
}
source_channelDictList();
source_channelDictList()
const genderList = ref([] as any[])
const genderDictList = async () => {
genderList.value = await (await useDictionary('zy_sex')).data.dictionary
}
genderDictList();
genderDictList()
const purchasing_powerList = ref([] as any[])
const purchasing_powerDictList = async () => {
purchasing_powerList.value = await (await useDictionary('customer_purchasing_power')).data.dictionary
purchasing_powerList.value = await (
await useDictionary('customer_purchasing_power')
).data.dictionary
}
purchasing_powerDictList();
purchasing_powerDictList()
const cognitive_ideaList = ref([] as any[])
const cognitive_ideaDictList = async () => {
cognitive_ideaList.value = await (await useDictionary('cognitive_concept')).data.dictionary
cognitive_ideaList.value = await (
await useDictionary('cognitive_concept')
).data.dictionary
}
cognitive_ideaDictList();
cognitive_ideaDictList()
const initial_intentList = ref([] as any[])
const initial_intentDictList = async () => {
initial_intentList.value = await (await useDictionary('preliminarycustomerintention')).data.dictionary
initial_intentList.value = await (
await useDictionary('preliminarycustomerintention')
).data.dictionary
}
initial_intentDictList();
initial_intentDictList()
const statusList = ref([] as any[])
const statusDictList = async () => {
statusList.value = await (await useDictionary('kh_status')).data.dictionary
}
statusDictList();
statusDictList()
/**
* 获取客户资源列表
@ -151,12 +236,14 @@ const loadCustomerResourcesList = (page: number = 1) => {
getCustomerResourcesList({
page: customerResourcesTable.page,
limit: customerResourcesTable.limit,
...customerResourcesTable.searchParam
}).then(res => {
...customerResourcesTable.searchParam,
})
.then((res) => {
customerResourcesTable.loading = false
customerResourcesTable.data = res.data.data
customerResourcesTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
customerResourcesTable.loading = false
})
}
@ -185,21 +272,19 @@ const editEvent = (data: any) => {
* 删除客户资源
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('customerResourcesDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('customerResourcesDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteCustomerResources(id).then(() => {
}).then(() => {
deleteCustomerResources(id)
.then(() => {
loadCustomerResourcesList()
}).catch(() => {
})
.catch(() => {})
})
}
const campusList = ref([])
const setCampusList = async () => {
campusList.value = await (await getWithCampusList({})).data

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

@ -1,12 +1,35 @@
<template>
<el-dialog 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-dialog
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-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 :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
v-for="(item, index) in parentDepartmentIdList"
@ -16,15 +39,17 @@
/>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -35,7 +60,12 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -56,15 +86,19 @@ const formRef = ref<FormInstance>()
const formRules = computed(() => {
return {
department_name: [
{ required: true, message: t('departmentNamePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('departmentNamePlaceholder'),
trigger: 'blur',
},
],
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
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -97,8 +133,6 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const parentDepartmentIdList = ref([] as any[])
const setParentDepartmentIdList = async () => {
parentDepartmentIdList.value = await (await getWithDepartmentsList({})).data
@ -109,7 +143,8 @@ const setFormData = async (row: any = null) => {
loading.value = true
if (row) {
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]
})
}
@ -127,7 +162,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -154,7 +194,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,14 +8,32 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="departmentsTable.searchParam" ref="searchFormRef">
<el-card
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-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 :label="t('parentDepartmentId')" prop="parent_department_id">
<el-select class="w-[280px]" v-model="departmentsTable.searchParam.parent_department_id" clearable :placeholder="t('parentDepartmentIdPlaceholder')">
<el-form-item
: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
v-for="(item, index) in parentDepartmentIdList"
:key="index"
@ -27,37 +44,63 @@
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadDepartmentsList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadDepartmentsList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !departmentsTable.loading ? t('emptyData') : '' }}</span>
</template>
<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="created_at" :label="t('createdAt')" 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="updated_at" :label="t('updatedAt')" 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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="departmentsTable.page" v-model:page-size="departmentsTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="departmentsTable.total"
@size-change="loadDepartmentsList()" @current-change="loadDepartmentsList" />
<el-pagination
v-model:current-page="departmentsTable.page"
v-model:page-size="departmentsTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="departmentsTable.total"
@size-change="loadDepartmentsList()"
@current-change="loadDepartmentsList"
/>
</div>
</div>
@ -70,13 +113,17 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
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 { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/departments/components/departments-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let departmentsTable = reactive({
page: 1,
@ -85,9 +132,9 @@ let departmentsTable = reactive({
loading: true,
data: [],
searchParam: {
"department_name":"",
"parent_department_id":""
}
department_name: '',
parent_department_id: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -97,7 +144,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取部门列表
*/
@ -108,12 +154,14 @@ const loadDepartmentsList = (page: number = 1) => {
getDepartmentsList({
page: departmentsTable.page,
limit: departmentsTable.limit,
...departmentsTable.searchParam
}).then(res => {
...departmentsTable.searchParam,
})
.then((res) => {
departmentsTable.loading = false
departmentsTable.data = res.data.data
departmentsTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
departmentsTable.loading = false
})
}
@ -142,21 +190,19 @@ const editEvent = (data: any) => {
* 删除部门
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('departmentsDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('departmentsDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteDepartments(id).then(() => {
}).then(() => {
deleteDepartments(id)
.then(() => {
loadDepartmentsList()
}).catch(() => {
})
.catch(() => {})
})
}
const parentDepartmentIdList = ref([])
const setParentDepartmentIdList = async () => {
parentDepartmentIdList.value = await (await getWithDepartmentsList({})).data

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

@ -1,34 +1,74 @@
<template>
<el-dialog 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-dialog
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-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 :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 :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 :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 :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>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -39,7 +79,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -64,29 +108,19 @@ const formRules = computed(() => {
return {
campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
]
,
],
user_id: [
{ required: true, message: t('userIdPlaceholder'), trigger: 'blur' },
]
,
],
question_id: [
{ required: true, message: t('questionIdPlaceholder'), trigger: 'blur' },
]
,
],
answer: [
{ required: true, message: t('answerPlaceholder'), trigger: 'blur' },
]
,
],
is_correct: [
{ required: true, message: t('isCorrectPlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -106,11 +140,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -119,14 +155,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
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]
})
}
@ -144,7 +179,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -171,7 +211,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,57 +8,125 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="examAnswersTable.searchParam" ref="searchFormRef">
<el-card
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-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 :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 :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 :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 :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-button type="primary" @click="loadExamAnswersList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadExamAnswersList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !examAnswersTable.loading ? t('emptyData') : '' }}</span>
</template>
<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="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">
<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="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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="examAnswersTable.page" v-model:page-size="examAnswersTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="examAnswersTable.total"
@size-change="loadExamAnswersList()" @current-change="loadExamAnswersList" />
<el-pagination
v-model:current-page="examAnswersTable.page"
v-model:page-size="examAnswersTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="examAnswersTable.total"
@size-change="loadExamAnswersList()"
@current-change="loadExamAnswersList"
/>
</div>
</div>
@ -78,7 +145,7 @@ import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/exam_answers/components/exam-answers-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let examAnswersTable = reactive({
page: 1,
@ -87,12 +154,12 @@ let examAnswersTable = reactive({
loading: true,
data: [],
searchParam: {
"campus_id":"",
"user_id":"",
"question_id":"",
"answer":"",
"is_correct":""
}
campus_id: '',
user_id: '',
question_id: '',
answer: '',
is_correct: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -102,7 +169,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取答题记录列表
*/
@ -113,12 +179,14 @@ const loadExamAnswersList = (page: number = 1) => {
getExamAnswersList({
page: examAnswersTable.page,
limit: examAnswersTable.limit,
...examAnswersTable.searchParam
}).then(res => {
...examAnswersTable.searchParam,
})
.then((res) => {
examAnswersTable.loading = false
examAnswersTable.data = res.data.data
examAnswersTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
examAnswersTable.loading = false
})
}
@ -147,22 +215,19 @@ const editEvent = (data: any) => {
* 删除答题记录
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('examAnswersDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('examAnswersDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteExamAnswers(id).then(() => {
}).then(() => {
deleteExamAnswers(id)
.then(() => {
loadExamAnswersList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

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

@ -1,26 +1,56 @@
<template>
<el-dialog 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-dialog
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-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 :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 :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>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -31,7 +61,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -53,20 +87,22 @@ const formRef = ref<FormInstance>()
const formRules = computed(() => {
return {
selection_mode: [
{ required: true, message: t('selectionModePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('selectionModePlaceholder'),
trigger: 'blur',
},
],
total_score: [
{ required: true, message: t('totalScorePlaceholder'), trigger: 'blur' },
]
,
],
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
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -99,14 +137,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
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]
})
}
@ -124,7 +161,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -151,7 +193,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,47 +8,99 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="examPapersTable.searchParam" ref="searchFormRef">
<el-card
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-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 :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 :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-button type="primary" @click="loadExamPapersList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadExamPapersList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !examPapersTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="selection_mode" :label="t('selectionMode')" min-width="120" :show-overflow-tooltip="true"/>
<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">
<el-table-column
prop="selection_mode"
:label="t('selectionMode')"
min-width="120"
:show-overflow-tooltip="true"
/>
<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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="examPapersTable.page" v-model:page-size="examPapersTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="examPapersTable.total"
@size-change="loadExamPapersList()" @current-change="loadExamPapersList" />
<el-pagination
v-model:current-page="examPapersTable.page"
v-model:page-size="examPapersTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="examPapersTable.total"
@size-change="loadExamPapersList()"
@current-change="loadExamPapersList"
/>
</div>
</div>
@ -68,7 +119,7 @@ import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/exam_papers/components/exam-papers-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let examPapersTable = reactive({
page: 1,
@ -77,10 +128,10 @@ let examPapersTable = reactive({
loading: true,
data: [],
searchParam: {
"selection_mode":"",
"total_score":"",
"passing_score":""
}
selection_mode: '',
total_score: '',
passing_score: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -90,7 +141,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取试卷列表
*/
@ -101,12 +151,14 @@ const loadExamPapersList = (page: number = 1) => {
getExamPapersList({
page: examPapersTable.page,
limit: examPapersTable.limit,
...examPapersTable.searchParam
}).then(res => {
...examPapersTable.searchParam,
})
.then((res) => {
examPapersTable.loading = false
examPapersTable.data = res.data.data
examPapersTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
examPapersTable.loading = false
})
}
@ -135,22 +187,19 @@ const editEvent = (data: any) => {
* 删除试卷
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('examPapersDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('examPapersDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteExamPapers(id).then(() => {
}).then(() => {
deleteExamPapers(id)
.then(() => {
loadExamPapersList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,96 +8,233 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="examQuestionsTable.searchParam" ref="searchFormRef">
<el-card
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-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 :label="t('questionContentType')" prop="question_content_type">
<el-input v-model="examQuestionsTable.searchParam.question_content_type" :placeholder="t('questionContentTypePlaceholder')" />
<el-form-item
: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 :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 :label="t('optionAContentType')" prop="option_a_content_type">
<el-input v-model="examQuestionsTable.searchParam.option_a_content_type" :placeholder="t('optionAContentTypePlaceholder')" />
<el-form-item
: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 :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 :label="t('optionBContentType')" prop="option_b_content_type">
<el-input v-model="examQuestionsTable.searchParam.option_b_content_type" :placeholder="t('optionBContentTypePlaceholder')" />
<el-form-item
: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 :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 :label="t('optionCContentType')" prop="option_c_content_type">
<el-input v-model="examQuestionsTable.searchParam.option_c_content_type" :placeholder="t('optionCContentTypePlaceholder')" />
<el-form-item
: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 :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 :label="t('optionDContentType')" prop="option_d_content_type">
<el-input v-model="examQuestionsTable.searchParam.option_d_content_type" :placeholder="t('optionDContentTypePlaceholder')" />
<el-form-item
: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 :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 :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-button type="primary" @click="loadExamQuestionsList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadExamQuestionsList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !examQuestionsTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="question_type" :label="t('questionType')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="question_content_type" :label="t('questionContentType')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="question_content" :label="t('questionContent')" min-width="120" :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 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">
<el-table-column
prop="question_type"
:label="t('questionType')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="question_content_type"
:label="t('questionContentType')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="question_content"
:label="t('questionContent')"
min-width="120"
: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
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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="examQuestionsTable.page" v-model:page-size="examQuestionsTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="examQuestionsTable.total"
@size-change="loadExamQuestionsList()" @current-change="loadExamQuestionsList" />
<el-pagination
v-model:current-page="examQuestionsTable.page"
v-model:page-size="examQuestionsTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="examQuestionsTable.total"
@size-change="loadExamQuestionsList()"
@current-change="loadExamQuestionsList"
/>
</div>
</div>
</el-card>
</div>
</template>
@ -107,13 +243,16 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
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 { ElMessageBox, FormInstance } from 'element-plus'
import { useRouter } from 'vue-router'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let examQuestionsTable = reactive({
page: 1,
@ -122,19 +261,19 @@ let examQuestionsTable = reactive({
loading: true,
data: [],
searchParam: {
"question_type":"",
"question_content_type":"",
"question_content":"",
"option_a_content_type":"",
"option_a_content":"",
"option_b_content_type":"",
"option_b_content":"",
"option_c_content_type":"",
"option_c_content":"",
"option_d_content_type":"",
"option_d_content":"",
"correct_answer":""
}
question_type: '',
question_content_type: '',
question_content: '',
option_a_content_type: '',
option_a_content: '',
option_b_content_type: '',
option_b_content: '',
option_c_content_type: '',
option_c_content: '',
option_d_content_type: '',
option_d_content: '',
correct_answer: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -144,7 +283,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取试题列表
*/
@ -155,12 +293,14 @@ const loadExamQuestionsList = (page: number = 1) => {
getExamQuestionsList({
page: examQuestionsTable.page,
limit: examQuestionsTable.limit,
...examQuestionsTable.searchParam
}).then(res => {
...examQuestionsTable.searchParam,
})
.then((res) => {
examQuestionsTable.loading = false
examQuestionsTable.data = res.data.data
examQuestionsTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
examQuestionsTable.loading = false
})
}
@ -187,22 +327,19 @@ const editEvent = (data: any) => {
* 删除试题
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('examQuestionsDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('examQuestionsDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteExamQuestions(id).then(() => {
}).then(() => {
deleteExamQuestions(id)
.then(() => {
loadExamQuestionsList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

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

@ -9,60 +9,130 @@
<span class="right">{{ pageName }}</span>
</div>
<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-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 :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
: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 :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 :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 :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 :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 :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 :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 :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 :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 :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 :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>
</el-card>
<div class="fixed-footer-wrap">
<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>
</div>
</div>
@ -74,16 +144,18 @@ import { ref, reactive, computed, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
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'
const route = useRoute()
const id:number = parseInt(route.query.id);
const id: number = parseInt(route.query.id)
const loading = ref(false)
const pageName = route.meta.title
/**
* 表单数据
*/
@ -111,7 +183,7 @@ const setFormData = async (id:number = 0) => {
if (data[key] != undefined) formData[key] = data[key]
})
}
if(id) setFormData(id);
if (id) setFormData(id)
const formRef = ref<FormInstance>()
//
@ -119,71 +191,93 @@ const selectData = ref<any[]>([])
//
//
const formRules = computed(() => {
return {
question_type: [
{ required: true, message: t('questionTypePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('questionTypePlaceholder'),
trigger: 'blur',
},
],
question_content_type: [
{ required: true, message: t('questionContentTypePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('questionContentTypePlaceholder'),
trigger: 'blur',
},
],
question_content: [
{ required: true, message: t('questionContentPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('questionContentPlaceholder'),
trigger: 'blur',
},
],
option_a_content_type: [
{ required: true, message: t('optionAContentTypePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('optionAContentTypePlaceholder'),
trigger: 'blur',
},
],
option_a_content: [
{ required: true, message: t('optionAContentPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('optionAContentPlaceholder'),
trigger: 'blur',
},
],
option_b_content_type: [
{ required: true, message: t('optionBContentTypePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('optionBContentTypePlaceholder'),
trigger: 'blur',
},
],
option_b_content: [
{ required: true, message: t('optionBContentPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('optionBContentPlaceholder'),
trigger: 'blur',
},
],
option_c_content_type: [
{ required: true, message: t('optionCContentTypePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('optionCContentTypePlaceholder'),
trigger: 'blur',
},
],
option_c_content: [
{ required: true, message: t('optionCContentPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('optionCContentPlaceholder'),
trigger: 'blur',
},
],
option_d_content_type: [
{ required: true, message: t('optionDContentTypePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('optionDContentTypePlaceholder'),
trigger: 'blur',
},
],
option_d_content: [
{ required: true, message: t('optionDContentPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('optionDContentPlaceholder'),
trigger: 'blur',
},
],
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
const save = id ? editExamQuestions : addExamQuestions
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
history.back()
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
})
}
@ -217,7 +312,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -233,7 +333,6 @@ const emailVerify = (rule: any, value: any, callback: any) => {
}
}
//
const numberVerify = (rule: any, value: any, callback: any) => {
if (!Number.isInteger(value)) {

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

@ -1,42 +1,92 @@
<template>
<el-dialog 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-dialog
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-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 :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 :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 :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 :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 :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 :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>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -47,7 +97,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -74,39 +128,25 @@ const formRules = computed(() => {
return {
campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
]
,
],
user_id: [
{ required: true, message: t('userIdPlaceholder'), trigger: 'blur' },
]
,
],
paper_id: [
{ required: true, message: t('paperIdPlaceholder'), trigger: 'blur' },
]
,
],
score: [
{ required: true, message: t('scorePlaceholder'), trigger: 'blur' },
]
,
],
status: [
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' },
]
,
],
start_time: [
{ required: true, message: t('startTimePlaceholder'), trigger: 'blur' },
]
,
],
end_time: [
{ required: true, message: t('endTimePlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -126,11 +166,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -139,14 +181,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
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]
})
}
@ -164,7 +205,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -191,7 +237,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,67 +8,151 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="examRecordsTable.searchParam" ref="searchFormRef">
<el-card
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-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 :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 :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 :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 :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 :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 :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-button type="primary" @click="loadExamRecordsList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadExamRecordsList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !examRecordsTable.loading ? t('emptyData') : '' }}</span>
</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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="examRecordsTable.page" v-model:page-size="examRecordsTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="examRecordsTable.total"
@size-change="loadExamRecordsList()" @current-change="loadExamRecordsList" />
<el-pagination
v-model:current-page="examRecordsTable.page"
v-model:page-size="examRecordsTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="examRecordsTable.total"
@size-change="loadExamRecordsList()"
@current-change="loadExamRecordsList"
/>
</div>
</div>
@ -88,7 +171,7 @@ import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/exam_records/components/exam-records-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let examRecordsTable = reactive({
page: 1,
@ -97,14 +180,14 @@ let examRecordsTable = reactive({
loading: true,
data: [],
searchParam: {
"campus_id":"",
"user_id":"",
"paper_id":"",
"score":"",
"status":"",
"start_time":"",
"end_time":""
}
campus_id: '',
user_id: '',
paper_id: '',
score: '',
status: '',
start_time: '',
end_time: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -114,7 +197,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取考试记录列表
*/
@ -125,12 +207,14 @@ const loadExamRecordsList = (page: number = 1) => {
getExamRecordsList({
page: examRecordsTable.page,
limit: examRecordsTable.limit,
...examRecordsTable.searchParam
}).then(res => {
...examRecordsTable.searchParam,
})
.then((res) => {
examRecordsTable.loading = false
examRecordsTable.data = res.data.data
examRecordsTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
examRecordsTable.loading = false
})
}
@ -159,22 +243,19 @@ const editEvent = (data: any) => {
* 删除考试记录
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('examRecordsDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('examRecordsDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteExamRecords(id).then(() => {
}).then(() => {
deleteExamRecords(id)
.then(() => {
loadExamRecordsList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

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

@ -1,8 +1,28 @@
<template>
<el-dialog v-model="showDialog" :title="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-dialog
v-model="showDialog"
:title="
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-select
class="input-width"
v-model="formData.personnel_id"
clearable
:placeholder="t('personnelIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in personnelIdList"
@ -14,7 +34,12 @@
</el-form-item>
<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
v-for="(item, index) in campusIdList"
@ -26,17 +51,24 @@
</el-form-item>
<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>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -47,7 +79,13 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -70,19 +108,17 @@ const formRules = computed(() => {
return {
personnel_id: [
{ required: true, message: t('personnelIdPlaceholder'), trigger: 'blur' },
]
,
],
campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
]
,
],
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
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -115,8 +153,6 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const personnelIdList = ref([] as any[])
const setPersonnelIdList = async () => {
personnelIdList.value = await (await getWithPersonnelList({})).data
@ -132,7 +168,8 @@ const setFormData = async (row: any = null) => {
loading.value = true
if (row) {
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]
})
}
@ -150,7 +187,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -177,7 +219,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<!-- <el-button type="primary" @click="addEvent">
@ -9,11 +8,22 @@
</el-button> -->
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="marketPerformanceTable.searchParam" ref="searchFormRef">
<el-card
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-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
v-for="(item, index) in campusIdList"
:key="index"
@ -23,26 +33,59 @@
</el-select>
</el-form-item>
<el-form-item :label="t('performanceAmount')" prop="performance_amount">
<el-input v-model="marketPerformanceTable.searchParam.performance_amount" :placeholder="t('performanceAmountPlaceholder')" />
<el-form-item
:label="t('performanceAmount')"
prop="performance_amount"
>
<el-input
v-model="marketPerformanceTable.searchParam.performance_amount"
:placeholder="t('performanceAmountPlaceholder')"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadMarketPerformanceList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadMarketPerformanceList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !marketPerformanceTable.loading ? t('emptyData') : '' }}</span>
<span>{{
!marketPerformanceTable.loading ? t('emptyData') : ''
}}</span>
</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">
<template #default="{ row }">
@ -50,16 +93,23 @@
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
</template>
</el-table-column> -->
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="marketPerformanceTable.page" v-model:page-size="marketPerformanceTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="marketPerformanceTable.total"
@size-change="loadMarketPerformanceList()" @current-change="loadMarketPerformanceList" />
<el-pagination
v-model:current-page="marketPerformanceTable.page"
v-model:page-size="marketPerformanceTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="marketPerformanceTable.total"
@size-change="loadMarketPerformanceList()"
@current-change="loadMarketPerformanceList"
/>
</div>
</div>
<edit ref="editMarketPerformanceDialog" @complete="loadMarketPerformanceList" />
<edit
ref="editMarketPerformanceDialog"
@complete="loadMarketPerformanceList"
/>
</el-card>
</div>
</template>
@ -68,13 +118,18 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
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 { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/market_performance/components/market-performance-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let marketPerformanceTable = reactive({
page: 1,
@ -83,9 +138,9 @@ let marketPerformanceTable = reactive({
loading: true,
data: [],
searchParam: {
"campus_id":"",
"performance_amount":""
}
campus_id: '',
performance_amount: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -95,7 +150,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取市场绩效列表
*/
@ -106,12 +160,14 @@ const loadMarketPerformanceList = (page: number = 1) => {
getMarketPerformanceList({
page: marketPerformanceTable.page,
limit: marketPerformanceTable.limit,
...marketPerformanceTable.searchParam
}).then(res => {
...marketPerformanceTable.searchParam,
})
.then((res) => {
marketPerformanceTable.loading = false
marketPerformanceTable.data = res.data.data
marketPerformanceTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
marketPerformanceTable.loading = false
})
}
@ -140,21 +196,19 @@ const editEvent = (data: any) => {
* 删除市场绩效
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('marketPerformanceDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('marketPerformanceDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteMarketPerformance(id).then(() => {
}).then(() => {
deleteMarketPerformance(id)
.then(() => {
loadMarketPerformanceList()
}).catch(() => {
})
.catch(() => {})
})
}
const personnelIdList = ref([])
const setPersonnelIdList = async () => {
personnelIdList.value = await (await getWithPersonnelList({})).data

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

@ -1,66 +1,146 @@
<template>
<el-dialog 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-dialog
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-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 :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 :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 :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 :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 :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 :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 :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 :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 :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 :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 :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 :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>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -71,7 +151,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -104,69 +188,59 @@ const formRules = computed(() => {
return {
payment_id: [
{ required: true, message: t('paymentIdPlaceholder'), trigger: 'blur' },
]
,
],
order_status: [
{ required: true, message: t('orderStatusPlaceholder'), trigger: 'blur' },
]
,
],
payment_type: [
{ required: true, message: t('paymentTypePlaceholder'), trigger: 'blur' },
]
,
],
order_amount: [
{ required: true, message: t('orderAmountPlaceholder'), trigger: 'blur' },
]
,
],
course_id: [
{ required: true, message: t('courseIdPlaceholder'), trigger: 'blur' },
]
,
],
class_id: [
{ required: true, message: t('classIdPlaceholder'), trigger: 'blur' },
]
,
],
staff_id: [
{ required: true, message: t('staffIdPlaceholder'), trigger: 'blur' },
]
,
],
resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
]
,
],
after_sales_status: [
{ required: true, message: t('afterSalesStatusPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('afterSalesStatusPlaceholder'),
trigger: 'blur',
},
],
after_sales_reason: [
{ required: true, message: t('afterSalesReasonPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('afterSalesReasonPlaceholder'),
trigger: 'blur',
},
],
after_sales_time: [
{ required: true, message: t('afterSalesTimePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('afterSalesTimePlaceholder'),
trigger: 'blur',
},
],
payment_time: [
{ required: true, message: t('paymentTimePlaceholder'), trigger: 'blur' },
]
,
],
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
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -199,14 +275,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
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]
})
}
@ -224,7 +299,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -251,7 +331,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,97 +8,238 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="orderTableTable.searchParam" ref="searchFormRef">
<el-card
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-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 :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 :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 :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 :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 :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 :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 :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 :label="t('afterSalesStatus')" prop="after_sales_status">
<el-input v-model="orderTableTable.searchParam.after_sales_status" :placeholder="t('afterSalesStatusPlaceholder')" />
<el-form-item
: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 :label="t('afterSalesReason')" prop="after_sales_reason">
<el-input v-model="orderTableTable.searchParam.after_sales_reason" :placeholder="t('afterSalesReasonPlaceholder')" />
<el-form-item
: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 :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 :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 :label="t('subscriptionPaymentTime')" prop="subscription_payment_time">
<el-input v-model="orderTableTable.searchParam.subscription_payment_time" :placeholder="t('subscriptionPaymentTimePlaceholder')" />
<el-form-item
: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-button type="primary" @click="loadOrderTableList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadOrderTableList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !orderTableTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="payment_id" :label="t('paymentId')" 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="payment_type" :label="t('paymentType')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="order_amount" :label="t('orderAmount')" 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="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">
<el-table-column
prop="payment_id"
:label="t('paymentId')"
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="payment_type"
:label="t('paymentType')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="order_amount"
:label="t('orderAmount')"
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="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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="orderTableTable.page" v-model:page-size="orderTableTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="orderTableTable.total"
@size-change="loadOrderTableList()" @current-change="loadOrderTableList" />
<el-pagination
v-model:current-page="orderTableTable.page"
v-model:page-size="orderTableTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="orderTableTable.total"
@size-change="loadOrderTableList()"
@current-change="loadOrderTableList"
/>
</div>
</div>
@ -118,7 +258,7 @@ import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/order_table/components/order-table-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let orderTableTable = reactive({
page: 1,
@ -127,20 +267,20 @@ let orderTableTable = reactive({
loading: true,
data: [],
searchParam: {
"payment_id":"",
"order_status":"",
"payment_type":"",
"order_amount":"",
"course_id":"",
"class_id":"",
"staff_id":"",
"resource_id":"",
"after_sales_status":"",
"after_sales_reason":"",
"after_sales_time":"",
"payment_time":"",
"subscription_payment_time":""
}
payment_id: '',
order_status: '',
payment_type: '',
order_amount: '',
course_id: '',
class_id: '',
staff_id: '',
resource_id: '',
after_sales_status: '',
after_sales_reason: '',
after_sales_time: '',
payment_time: '',
subscription_payment_time: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -150,7 +290,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取订单列表
*/
@ -161,12 +300,14 @@ const loadOrderTableList = (page: number = 1) => {
getOrderTableList({
page: orderTableTable.page,
limit: orderTableTable.limit,
...orderTableTable.searchParam
}).then(res => {
...orderTableTable.searchParam,
})
.then((res) => {
orderTableTable.loading = false
orderTableTable.data = res.data.data
orderTableTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
orderTableTable.loading = false
})
}
@ -195,22 +336,19 @@ const editEvent = (data: any) => {
* 删除订单
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('orderTableDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('orderTableDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteOrderTable(id).then(() => {
}).then(() => {
deleteOrderTable(id)
.then(() => {
loadOrderTableList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

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

@ -1,42 +1,94 @@
<template>
<el-dialog 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-dialog
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-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 :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 :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 :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 :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 :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 :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>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -47,7 +99,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -74,39 +130,33 @@ const formRules = computed(() => {
return {
staff_id: [
{ required: true, message: t('staffIdPlaceholder'), trigger: 'blur' },
]
,
],
resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
]
,
],
order_id: [
{ required: true, message: t('orderIdPlaceholder'), trigger: 'blur' },
]
,
],
order_status: [
{ required: true, message: t('orderStatusPlaceholder'), trigger: 'blur' },
]
,
],
performance_type: [
{ required: true, message: t('performanceTypePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('performanceTypePlaceholder'),
trigger: 'blur',
},
],
performance_value: [
{ required: true, message: t('performanceValuePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('performanceValuePlaceholder'),
trigger: 'blur',
},
],
remarks: [
{ required: true, message: t('remarksPlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -126,11 +176,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -139,14 +191,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
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]
})
}
@ -164,7 +215,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -191,7 +247,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

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

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,71 +8,160 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="performanceRecordsTable.searchParam" ref="searchFormRef">
<el-card
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-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 :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 :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 :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 :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 :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 :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-button type="primary" @click="loadPerformanceRecordsList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadPerformanceRecordsList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<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>
<span>{{ !performanceRecordsTable.loading ? t('emptyData') : '' }}</span>
<span>{{
!performanceRecordsTable.loading ? t('emptyData') : ''
}}</span>
</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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="performanceRecordsTable.page" v-model:page-size="performanceRecordsTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="performanceRecordsTable.total"
@size-change="loadPerformanceRecordsList()" @current-change="loadPerformanceRecordsList" />
<el-pagination
v-model:current-page="performanceRecordsTable.page"
v-model:page-size="performanceRecordsTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="performanceRecordsTable.total"
@size-change="loadPerformanceRecordsList()"
@current-change="loadPerformanceRecordsList"
/>
</div>
</div>
<edit ref="editPerformanceRecordsDialog" @complete="loadPerformanceRecordsList" />
<edit
ref="editPerformanceRecordsDialog"
@complete="loadPerformanceRecordsList"
/>
</el-card>
</div>
</template>
@ -82,13 +170,16 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
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 { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/performance_records/components/performance-records-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let performanceRecordsTable = reactive({
page: 1,
@ -97,14 +188,14 @@ let performanceRecordsTable = reactive({
loading: true,
data: [],
searchParam: {
"staff_id":"",
"resource_id":"",
"order_id":"",
"order_status":"",
"performance_type":"",
"performance_value":"",
"remarks":""
}
staff_id: '',
resource_id: '',
order_id: '',
order_status: '',
performance_type: '',
performance_value: '',
remarks: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -114,7 +205,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取绩效记录列表
*/
@ -125,12 +215,14 @@ const loadPerformanceRecordsList = (page: number = 1) => {
getPerformanceRecordsList({
page: performanceRecordsTable.page,
limit: performanceRecordsTable.limit,
...performanceRecordsTable.searchParam
}).then(res => {
...performanceRecordsTable.searchParam,
})
.then((res) => {
performanceRecordsTable.loading = false
performanceRecordsTable.data = res.data.data
performanceRecordsTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
performanceRecordsTable.loading = false
})
}
@ -159,22 +251,19 @@ const editEvent = (data: any) => {
* 删除绩效记录
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('performanceRecordsDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('performanceRecordsDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deletePerformanceRecords(id).then(() => {
}).then(() => {
deletePerformanceRecords(id)
.then(() => {
loadPerformanceRecordsList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

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

@ -1,34 +1,78 @@
<template>
<el-dialog 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-dialog
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-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 :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 :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 :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 :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>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -39,7 +83,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
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)
const loading = ref(false)
@ -64,29 +112,19 @@ const formRules = computed(() => {
return {
person_id: [
{ required: true, message: t('personIdPlaceholder'), trigger: 'blur' },
]
,
],
person_type: [
{ required: true, message: t('personTypePlaceholder'), trigger: 'blur' },
]
,
],
schedule_id: [
{ required: true, message: t('scheduleIdPlaceholder'), trigger: 'blur' },
]
,
],
course_date: [
{ required: true, message: t('courseDatePlaceholder'), trigger: 'blur' },
]
,
],
time_slot: [
{ required: true, message: t('timeSlotPlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -106,11 +144,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -119,14 +159,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
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]
})
}
@ -144,7 +183,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -171,7 +215,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

163
admin/src/app/views/person_course_schedule/person_course_schedule.vue

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,61 +8,134 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="personCourseScheduleTable.searchParam" ref="searchFormRef">
<el-card
class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="personCourseScheduleTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('personId')" prop="person_id">
<el-input v-model="personCourseScheduleTable.searchParam.person_id" :placeholder="t('personIdPlaceholder')" />
<el-input
v-model="personCourseScheduleTable.searchParam.person_id"
:placeholder="t('personIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('personType')" prop="person_type">
<el-input v-model="personCourseScheduleTable.searchParam.person_type" :placeholder="t('personTypePlaceholder')" />
<el-input
v-model="personCourseScheduleTable.searchParam.person_type"
:placeholder="t('personTypePlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('scheduleId')" prop="schedule_id">
<el-input v-model="personCourseScheduleTable.searchParam.schedule_id" :placeholder="t('scheduleIdPlaceholder')" />
<el-input
v-model="personCourseScheduleTable.searchParam.schedule_id"
:placeholder="t('scheduleIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('courseDate')" prop="course_date">
<el-input v-model="personCourseScheduleTable.searchParam.course_date" :placeholder="t('courseDatePlaceholder')" />
<el-input
v-model="personCourseScheduleTable.searchParam.course_date"
:placeholder="t('courseDatePlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('timeSlot')" prop="time_slot">
<el-input v-model="personCourseScheduleTable.searchParam.time_slot" :placeholder="t('timeSlotPlaceholder')" />
<el-input
v-model="personCourseScheduleTable.searchParam.time_slot"
:placeholder="t('timeSlotPlaceholder')"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadPersonCourseScheduleList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadPersonCourseScheduleList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="personCourseScheduleTable.data" size="large" v-loading="personCourseScheduleTable.loading">
<el-table
:data="personCourseScheduleTable.data"
size="large"
v-loading="personCourseScheduleTable.loading"
>
<template #empty>
<span>{{ !personCourseScheduleTable.loading ? t('emptyData') : '' }}</span>
<span>{{
!personCourseScheduleTable.loading ? t('emptyData') : ''
}}</span>
</template>
<el-table-column prop="person_id" :label="t('personId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="person_id"
:label="t('personId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="person_type" :label="t('personType')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="person_type"
:label="t('personType')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="schedule_id" :label="t('scheduleId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="schedule_id"
:label="t('scheduleId')"
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 :label="t('operation')" fixed="right" min-width="120">
<el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="personCourseScheduleTable.page" v-model:page-size="personCourseScheduleTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="personCourseScheduleTable.total"
@size-change="loadPersonCourseScheduleList()" @current-change="loadPersonCourseScheduleList" />
<el-pagination
v-model:current-page="personCourseScheduleTable.page"
v-model:page-size="personCourseScheduleTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="personCourseScheduleTable.total"
@size-change="loadPersonCourseScheduleList()"
@current-change="loadPersonCourseScheduleList"
/>
</div>
</div>
<edit ref="editPersonCourseScheduleDialog" @complete="loadPersonCourseScheduleList" />
<edit
ref="editPersonCourseScheduleDialog"
@complete="loadPersonCourseScheduleList"
/>
</el-card>
</div>
</template>
@ -72,13 +144,16 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getPersonCourseScheduleList, deletePersonCourseSchedule } from '@/app/api/person_course_schedule'
import {
getPersonCourseScheduleList,
deletePersonCourseSchedule,
} from '@/app/api/person_course_schedule'
import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/person_course_schedule/components/person-course-schedule-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let personCourseScheduleTable = reactive({
page: 1,
@ -87,12 +162,12 @@ let personCourseScheduleTable = reactive({
loading: true,
data: [],
searchParam: {
"person_id":"",
"person_type":"",
"schedule_id":"",
"course_date":"",
"time_slot":""
}
person_id: '',
person_type: '',
schedule_id: '',
course_date: '',
time_slot: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -102,7 +177,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取人员与课程安排关系列表
*/
@ -113,12 +187,14 @@ const loadPersonCourseScheduleList = (page: number = 1) => {
getPersonCourseScheduleList({
page: personCourseScheduleTable.page,
limit: personCourseScheduleTable.limit,
...personCourseScheduleTable.searchParam
}).then(res => {
...personCourseScheduleTable.searchParam,
})
.then((res) => {
personCourseScheduleTable.loading = false
personCourseScheduleTable.data = res.data.data
personCourseScheduleTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
personCourseScheduleTable.loading = false
})
}
@ -147,22 +223,19 @@ const editEvent = (data: any) => {
* 删除人员与课程安排关系
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('personCourseScheduleDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('personCourseScheduleDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deletePersonCourseSchedule(id).then(() => {
}).then(() => {
deletePersonCourseSchedule(id)
.then(() => {
loadPersonCourseScheduleList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

270
admin/src/app/views/physical_test/components/physical-test-edit.vue

@ -1,82 +1,182 @@
<template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updatePhysicalTest') : t('addPhysicalTest')" 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-dialog
v-model="showDialog"
:title="formData.id ? t('updatePhysicalTest') : t('addPhysicalTest')"
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('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 :label="t('studentId')" prop="student_id">
<el-input v-model="formData.student_id" clearable :placeholder="t('studentIdPlaceholder')" class="input-width" />
<el-input
v-model="formData.student_id"
clearable
:placeholder="t('studentIdPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('height')" prop="height">
<el-input v-model="formData.height" clearable :placeholder="t('heightPlaceholder')" class="input-width" />
<el-input
v-model="formData.height"
clearable
:placeholder="t('heightPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('weight')" prop="weight">
<el-input v-model="formData.weight" clearable :placeholder="t('weightPlaceholder')" class="input-width" />
<el-input
v-model="formData.weight"
clearable
:placeholder="t('weightPlaceholder')"
class="input-width"
/>
</el-form-item>
<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 :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 :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 :label="t('seatedForwardBend')">
<el-input v-model="formData.seated_forward_bend" clearable :placeholder="t('seatedForwardBendPlaceholder')" class="input-width" />
<el-input
v-model="formData.seated_forward_bend"
clearable
:placeholder="t('seatedForwardBendPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('sitUps')">
<el-input v-model="formData.sit_ups" clearable :placeholder="t('sitUpsPlaceholder')" class="input-width" />
<el-input
v-model="formData.sit_ups"
clearable
:placeholder="t('sitUpsPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('pushUps')">
<el-input v-model="formData.push_ups" clearable :placeholder="t('pushUpsPlaceholder')" class="input-width" />
<el-input
v-model="formData.push_ups"
clearable
:placeholder="t('pushUpsPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('flamingoBalance')">
<el-input v-model="formData.flamingo_balance" clearable :placeholder="t('flamingoBalancePlaceholder')" class="input-width" />
<el-input
v-model="formData.flamingo_balance"
clearable
:placeholder="t('flamingoBalancePlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('thirtySecJump')">
<el-input v-model="formData.thirty_sec_jump" clearable :placeholder="t('thirtySecJumpPlaceholder')" class="input-width" />
<el-input
v-model="formData.thirty_sec_jump"
clearable
:placeholder="t('thirtySecJumpPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('standingLongJump')">
<el-input v-model="formData.standing_long_jump" clearable :placeholder="t('standingLongJumpPlaceholder')" class="input-width" />
<el-input
v-model="formData.standing_long_jump"
clearable
:placeholder="t('standingLongJumpPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('agilityRun')">
<el-input v-model="formData.agility_run" clearable :placeholder="t('agilityRunPlaceholder')" class="input-width" />
<el-input
v-model="formData.agility_run"
clearable
:placeholder="t('agilityRunPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('balanceBeam')">
<el-input v-model="formData.balance_beam" clearable :placeholder="t('balanceBeamPlaceholder')" class="input-width" />
<el-input
v-model="formData.balance_beam"
clearable
:placeholder="t('balanceBeamPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('tennisThrow')">
<el-input v-model="formData.tennis_throw" clearable :placeholder="t('tennisThrowPlaceholder')" class="input-width" />
<el-input
v-model="formData.tennis_throw"
clearable
:placeholder="t('tennisThrowPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('tenMeterShuttleRun')">
<el-input v-model="formData.ten_meter_shuttle_run" clearable :placeholder="t('tenMeterShuttleRunPlaceholder')" class="input-width" />
<el-input
v-model="formData.ten_meter_shuttle_run"
clearable
:placeholder="t('tenMeterShuttleRunPlaceholder')"
class="input-width"
/>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -87,7 +187,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import { addPhysicalTest, editPhysicalTest, getPhysicalTestInfo } from '@/app/api/physical_test'
import {
addPhysicalTest,
editPhysicalTest,
getPhysicalTestInfo,
} from '@/app/api/physical_test'
let showDialog = ref(false)
const loading = ref(false)
@ -124,89 +228,75 @@ const formRules = computed(() => {
return {
resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
]
,
],
student_id: [
{ required: true, message: t('studentIdPlaceholder'), trigger: 'blur' },
]
,
],
height: [
{ required: true, message: t('heightPlaceholder'), trigger: 'blur' },
]
,
],
weight: [
{ required: true, message: t('weightPlaceholder'), trigger: 'blur' },
]
,
],
coach_id: [
{ required: true, message: t('coachIdPlaceholder'), trigger: 'blur' },
]
,
],
created_at: [
{ required: true, message: t('createdAtPlaceholder'), trigger: 'blur' },
]
,
],
updated_at: [
{ required: true, message: t('updatedAtPlaceholder'), trigger: 'blur' },
]
,
],
seated_forward_bend: [
{ required: true, message: t('seatedForwardBendPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('seatedForwardBendPlaceholder'),
trigger: 'blur',
},
],
sit_ups: [
{ required: true, message: t('sitUpsPlaceholder'), trigger: 'blur' },
]
,
],
push_ups: [
{ required: true, message: t('pushUpsPlaceholder'), trigger: 'blur' },
]
,
],
flamingo_balance: [
{ required: true, message: t('flamingoBalancePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('flamingoBalancePlaceholder'),
trigger: 'blur',
},
],
thirty_sec_jump: [
{ required: true, message: t('thirtySecJumpPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('thirtySecJumpPlaceholder'),
trigger: 'blur',
},
],
standing_long_jump: [
{ required: true, message: t('standingLongJumpPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('standingLongJumpPlaceholder'),
trigger: 'blur',
},
],
agility_run: [
{ required: true, message: t('agilityRunPlaceholder'), trigger: 'blur' },
]
,
],
balance_beam: [
{ required: true, message: t('balanceBeamPlaceholder'), trigger: 'blur' },
]
,
],
tennis_throw: [
{ required: true, message: t('tennisThrowPlaceholder'), trigger: 'blur' },
]
,
],
ten_meter_shuttle_run: [
{ required: true, message: t('tenMeterShuttleRunPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('tenMeterShuttleRunPlaceholder'),
trigger: 'blur',
},
],
}
})
@ -226,11 +316,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -239,14 +331,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
const data = await (await getPhysicalTestInfo(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]
})
}
@ -264,7 +355,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -291,7 +387,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

371
admin/src/app/views/physical_test/physical_test.vue

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,117 +8,290 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="physicalTestTable.searchParam" ref="searchFormRef">
<el-card
class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="physicalTestTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('resourceId')" prop="resource_id">
<el-input v-model="physicalTestTable.searchParam.resource_id" :placeholder="t('resourceIdPlaceholder')" />
<el-input
v-model="physicalTestTable.searchParam.resource_id"
:placeholder="t('resourceIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('studentId')" prop="student_id">
<el-input v-model="physicalTestTable.searchParam.student_id" :placeholder="t('studentIdPlaceholder')" />
<el-input
v-model="physicalTestTable.searchParam.student_id"
:placeholder="t('studentIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('height')" prop="height">
<el-input v-model="physicalTestTable.searchParam.height" :placeholder="t('heightPlaceholder')" />
<el-input
v-model="physicalTestTable.searchParam.height"
:placeholder="t('heightPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('weight')" prop="weight">
<el-input v-model="physicalTestTable.searchParam.weight" :placeholder="t('weightPlaceholder')" />
<el-input
v-model="physicalTestTable.searchParam.weight"
:placeholder="t('weightPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('coachId')" prop="coach_id">
<el-input v-model="physicalTestTable.searchParam.coach_id" :placeholder="t('coachIdPlaceholder')" />
<el-input
v-model="physicalTestTable.searchParam.coach_id"
:placeholder="t('coachIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('createdAt')" prop="created_at">
<el-input v-model="physicalTestTable.searchParam.created_at" :placeholder="t('createdAtPlaceholder')" />
<el-input
v-model="physicalTestTable.searchParam.created_at"
:placeholder="t('createdAtPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('updatedAt')" prop="updated_at">
<el-input v-model="physicalTestTable.searchParam.updated_at" :placeholder="t('updatedAtPlaceholder')" />
<el-input
v-model="physicalTestTable.searchParam.updated_at"
:placeholder="t('updatedAtPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('seatedForwardBend')" prop="seated_forward_bend">
<el-input v-model="physicalTestTable.searchParam.seated_forward_bend" :placeholder="t('seatedForwardBendPlaceholder')" />
<el-form-item
:label="t('seatedForwardBend')"
prop="seated_forward_bend"
>
<el-input
v-model="physicalTestTable.searchParam.seated_forward_bend"
:placeholder="t('seatedForwardBendPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('sitUps')" prop="sit_ups">
<el-input v-model="physicalTestTable.searchParam.sit_ups" :placeholder="t('sitUpsPlaceholder')" />
<el-input
v-model="physicalTestTable.searchParam.sit_ups"
:placeholder="t('sitUpsPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('pushUps')" prop="push_ups">
<el-input v-model="physicalTestTable.searchParam.push_ups" :placeholder="t('pushUpsPlaceholder')" />
<el-input
v-model="physicalTestTable.searchParam.push_ups"
:placeholder="t('pushUpsPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('flamingoBalance')" prop="flamingo_balance">
<el-input v-model="physicalTestTable.searchParam.flamingo_balance" :placeholder="t('flamingoBalancePlaceholder')" />
<el-input
v-model="physicalTestTable.searchParam.flamingo_balance"
:placeholder="t('flamingoBalancePlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('thirtySecJump')" prop="thirty_sec_jump">
<el-input v-model="physicalTestTable.searchParam.thirty_sec_jump" :placeholder="t('thirtySecJumpPlaceholder')" />
<el-input
v-model="physicalTestTable.searchParam.thirty_sec_jump"
:placeholder="t('thirtySecJumpPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('standingLongJump')" prop="standing_long_jump">
<el-input v-model="physicalTestTable.searchParam.standing_long_jump" :placeholder="t('standingLongJumpPlaceholder')" />
<el-form-item
:label="t('standingLongJump')"
prop="standing_long_jump"
>
<el-input
v-model="physicalTestTable.searchParam.standing_long_jump"
:placeholder="t('standingLongJumpPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('agilityRun')" prop="agility_run">
<el-input v-model="physicalTestTable.searchParam.agility_run" :placeholder="t('agilityRunPlaceholder')" />
<el-input
v-model="physicalTestTable.searchParam.agility_run"
:placeholder="t('agilityRunPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('balanceBeam')" prop="balance_beam">
<el-input v-model="physicalTestTable.searchParam.balance_beam" :placeholder="t('balanceBeamPlaceholder')" />
<el-input
v-model="physicalTestTable.searchParam.balance_beam"
:placeholder="t('balanceBeamPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('tennisThrow')" prop="tennis_throw">
<el-input v-model="physicalTestTable.searchParam.tennis_throw" :placeholder="t('tennisThrowPlaceholder')" />
<el-input
v-model="physicalTestTable.searchParam.tennis_throw"
:placeholder="t('tennisThrowPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('tenMeterShuttleRun')" prop="ten_meter_shuttle_run">
<el-input v-model="physicalTestTable.searchParam.ten_meter_shuttle_run" :placeholder="t('tenMeterShuttleRunPlaceholder')" />
<el-form-item
:label="t('tenMeterShuttleRun')"
prop="ten_meter_shuttle_run"
>
<el-input
v-model="physicalTestTable.searchParam.ten_meter_shuttle_run"
:placeholder="t('tenMeterShuttleRunPlaceholder')"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadPhysicalTestList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadPhysicalTestList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="physicalTestTable.data" size="large" v-loading="physicalTestTable.loading">
<el-table
:data="physicalTestTable.data"
size="large"
v-loading="physicalTestTable.loading"
>
<template #empty>
<span>{{ !physicalTestTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="resource_id" :label="t('resourceId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="student_id" :label="t('studentId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="height" :label="t('height')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="weight" :label="t('weight')" 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="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="seated_forward_bend" :label="t('seatedForwardBend')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="sit_ups" :label="t('sitUps')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="push_ups" :label="t('pushUps')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="flamingo_balance" :label="t('flamingoBalance')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="thirty_sec_jump" :label="t('thirtySecJump')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="standing_long_jump" :label="t('standingLongJump')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="agility_run" :label="t('agilityRun')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="balance_beam" :label="t('balanceBeam')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="tennis_throw" :label="t('tennisThrow')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="ten_meter_shuttle_run" :label="t('tenMeterShuttleRun')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column
prop="resource_id"
:label="t('resourceId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="student_id"
:label="t('studentId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="height"
:label="t('height')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="weight"
:label="t('weight')"
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="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="seated_forward_bend"
:label="t('seatedForwardBend')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="sit_ups"
:label="t('sitUps')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="push_ups"
:label="t('pushUps')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="flamingo_balance"
:label="t('flamingoBalance')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="thirty_sec_jump"
:label="t('thirtySecJump')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="standing_long_jump"
:label="t('standingLongJump')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="agility_run"
:label="t('agilityRun')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="balance_beam"
:label="t('balanceBeam')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="tennis_throw"
:label="t('tennisThrow')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="ten_meter_shuttle_run"
:label="t('tenMeterShuttleRun')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="physicalTestTable.page" v-model:page-size="physicalTestTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="physicalTestTable.total"
@size-change="loadPhysicalTestList()" @current-change="loadPhysicalTestList" />
<el-pagination
v-model:current-page="physicalTestTable.page"
v-model:page-size="physicalTestTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="physicalTestTable.total"
@size-change="loadPhysicalTestList()"
@current-change="loadPhysicalTestList"
/>
</div>
</div>
@ -132,13 +304,16 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getPhysicalTestList, deletePhysicalTest } from '@/app/api/physical_test'
import {
getPhysicalTestList,
deletePhysicalTest,
} from '@/app/api/physical_test'
import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/physical_test/components/physical-test-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let physicalTestTable = reactive({
page: 1,
@ -147,24 +322,24 @@ let physicalTestTable = reactive({
loading: true,
data: [],
searchParam: {
"resource_id":"",
"student_id":"",
"height":"",
"weight":"",
"coach_id":"",
"created_at":"",
"updated_at":"",
"seated_forward_bend":"",
"sit_ups":"",
"push_ups":"",
"flamingo_balance":"",
"thirty_sec_jump":"",
"standing_long_jump":"",
"agility_run":"",
"balance_beam":"",
"tennis_throw":"",
"ten_meter_shuttle_run":""
}
resource_id: '',
student_id: '',
height: '',
weight: '',
coach_id: '',
created_at: '',
updated_at: '',
seated_forward_bend: '',
sit_ups: '',
push_ups: '',
flamingo_balance: '',
thirty_sec_jump: '',
standing_long_jump: '',
agility_run: '',
balance_beam: '',
tennis_throw: '',
ten_meter_shuttle_run: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -174,7 +349,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取体测列表
*/
@ -185,12 +359,14 @@ const loadPhysicalTestList = (page: number = 1) => {
getPhysicalTestList({
page: physicalTestTable.page,
limit: physicalTestTable.limit,
...physicalTestTable.searchParam
}).then(res => {
...physicalTestTable.searchParam,
})
.then((res) => {
physicalTestTable.loading = false
physicalTestTable.data = res.data.data
physicalTestTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
physicalTestTable.loading = false
})
}
@ -219,22 +395,19 @@ const editEvent = (data: any) => {
* 删除体测
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('physicalTestDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('physicalTestDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deletePhysicalTest(id).then(() => {
}).then(() => {
deletePhysicalTest(id)
.then(() => {
loadPhysicalTestList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

119
admin/src/app/views/reimbursement/components/reimbursement-edit.vue

@ -1,38 +1,83 @@
<template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateReimbursement') : t('addReimbursement')" 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-dialog
v-model="showDialog"
:title="formData.id ? t('updateReimbursement') : t('addReimbursement')"
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('applicantId')" prop="applicant_id">
<el-input v-model="formData.applicant_id" clearable :placeholder="t('applicantIdPlaceholder')" class="input-width" />
<el-input
v-model="formData.applicant_id"
clearable
:placeholder="t('applicantIdPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('amount')" prop="amount">
<el-input v-model="formData.amount" clearable :placeholder="t('amountPlaceholder')" class="input-width" />
<el-input
v-model="formData.amount"
clearable
:placeholder="t('amountPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('description')" prop="description">
<el-input v-model="formData.description" clearable :placeholder="t('descriptionPlaceholder')" class="input-width" />
<el-input
v-model="formData.description"
clearable
:placeholder="t('descriptionPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('receiptUrl')">
<el-input v-model="formData.receipt_url" clearable :placeholder="t('receiptUrlPlaceholder')" class="input-width" />
<el-input
v-model="formData.receipt_url"
clearable
:placeholder="t('receiptUrlPlaceholder')"
class="input-width"
/>
</el-form-item>
<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 :label="t('processId')" prop="process_id">
<el-input v-model="formData.process_id" clearable :placeholder="t('processIdPlaceholder')" class="input-width" />
<el-input
v-model="formData.process_id"
clearable
:placeholder="t('processIdPlaceholder')"
class="input-width"
/>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -43,7 +88,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import { addReimbursement, editReimbursement, getReimbursementInfo } from '@/app/api/reimbursement'
import {
addReimbursement,
editReimbursement,
getReimbursementInfo,
} from '@/app/api/reimbursement'
let showDialog = ref(false)
const loading = ref(false)
@ -69,34 +118,22 @@ const formRules = computed(() => {
return {
applicant_id: [
{ required: true, message: t('applicantIdPlaceholder'), trigger: 'blur' },
]
,
],
amount: [
{ required: true, message: t('amountPlaceholder'), trigger: 'blur' },
]
,
],
description: [
{ required: true, message: t('descriptionPlaceholder'), trigger: 'blur' },
]
,
],
receipt_url: [
{ required: true, message: t('receiptUrlPlaceholder'), trigger: 'blur' },
]
,
],
status: [
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' },
]
,
],
process_id: [
{ required: true, message: t('processIdPlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -116,11 +153,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -129,14 +168,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
const data = await (await getReimbursementInfo(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]
})
}
@ -154,7 +192,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -181,7 +224,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

168
admin/src/app/views/reimbursement/reimbursement.vue

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,62 +8,138 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="reimbursementTable.searchParam" ref="searchFormRef">
<el-card
class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="reimbursementTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('applicantId')" prop="applicant_id">
<el-input v-model="reimbursementTable.searchParam.applicant_id" :placeholder="t('applicantIdPlaceholder')" />
<el-input
v-model="reimbursementTable.searchParam.applicant_id"
:placeholder="t('applicantIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('amount')" prop="amount">
<el-input v-model="reimbursementTable.searchParam.amount" :placeholder="t('amountPlaceholder')" />
<el-input
v-model="reimbursementTable.searchParam.amount"
:placeholder="t('amountPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('description')" prop="description">
<el-input v-model="reimbursementTable.searchParam.description" :placeholder="t('descriptionPlaceholder')" />
<el-input
v-model="reimbursementTable.searchParam.description"
:placeholder="t('descriptionPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('receiptUrl')" prop="receipt_url">
<el-input v-model="reimbursementTable.searchParam.receipt_url" :placeholder="t('receiptUrlPlaceholder')" />
<el-input
v-model="reimbursementTable.searchParam.receipt_url"
:placeholder="t('receiptUrlPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('status')" prop="status">
<el-input v-model="reimbursementTable.searchParam.status" :placeholder="t('statusPlaceholder')" />
<el-input
v-model="reimbursementTable.searchParam.status"
:placeholder="t('statusPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('processId')" prop="process_id">
<el-input v-model="reimbursementTable.searchParam.process_id" :placeholder="t('processIdPlaceholder')" />
<el-input
v-model="reimbursementTable.searchParam.process_id"
:placeholder="t('processIdPlaceholder')"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadReimbursementList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadReimbursementList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="reimbursementTable.data" size="large" v-loading="reimbursementTable.loading">
<el-table
:data="reimbursementTable.data"
size="large"
v-loading="reimbursementTable.loading"
>
<template #empty>
<span>{{ !reimbursementTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="applicant_id" :label="t('applicantId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="applicant_id"
:label="t('applicantId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="amount" :label="t('amount')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="amount"
:label="t('amount')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="description" :label="t('description')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="description"
:label="t('description')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="receipt_url" :label="t('receiptUrl')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="receipt_url"
:label="t('receiptUrl')"
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="process_id" :label="t('processId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="process_id"
:label="t('processId')"
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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="reimbursementTable.page" v-model:page-size="reimbursementTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="reimbursementTable.total"
@size-change="loadReimbursementList()" @current-change="loadReimbursementList" />
<el-pagination
v-model:current-page="reimbursementTable.page"
v-model:page-size="reimbursementTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="reimbursementTable.total"
@size-change="loadReimbursementList()"
@current-change="loadReimbursementList"
/>
</div>
</div>
@ -77,13 +152,16 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getReimbursementList, deleteReimbursement } from '@/app/api/reimbursement'
import {
getReimbursementList,
deleteReimbursement,
} from '@/app/api/reimbursement'
import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/reimbursement/components/reimbursement-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let reimbursementTable = reactive({
page: 1,
@ -92,13 +170,13 @@ let reimbursementTable = reactive({
loading: true,
data: [],
searchParam: {
"applicant_id":"",
"amount":"",
"description":"",
"receipt_url":"",
"status":"",
"process_id":""
}
applicant_id: '',
amount: '',
description: '',
receipt_url: '',
status: '',
process_id: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -108,7 +186,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取报销记录列表
*/
@ -119,12 +196,14 @@ const loadReimbursementList = (page: number = 1) => {
getReimbursementList({
page: reimbursementTable.page,
limit: reimbursementTable.limit,
...reimbursementTable.searchParam
}).then(res => {
...reimbursementTable.searchParam,
})
.then((res) => {
reimbursementTable.loading = false
reimbursementTable.data = res.data.data
reimbursementTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
reimbursementTable.loading = false
})
}
@ -153,22 +232,19 @@ const editEvent = (data: any) => {
* 删除报销记录
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('reimbursementDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('reimbursementDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteReimbursement(id).then(() => {
}).then(() => {
deleteReimbursement(id)
.then(() => {
loadReimbursementList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

108
admin/src/app/views/resource_sharing/components/resource-sharing-edit.vue

@ -1,34 +1,74 @@
<template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateResourceSharing') : t('addResourceSharing')" 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-dialog
v-model="showDialog"
:title="formData.id ? t('updateResourceSharing') : t('addResourceSharing')"
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('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 :label="t('userId')">
<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 :label="t('roleId')">
<el-input v-model="formData.role_id" clearable :placeholder="t('roleIdPlaceholder')" class="input-width" />
<el-input
v-model="formData.role_id"
clearable
:placeholder="t('roleIdPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('sharedBy')" prop="shared_by">
<el-input v-model="formData.shared_by" clearable :placeholder="t('sharedByPlaceholder')" class="input-width" />
<el-input
v-model="formData.shared_by"
clearable
:placeholder="t('sharedByPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('sharedAt')">
<el-input v-model="formData.shared_at" clearable :placeholder="t('sharedAtPlaceholder')" class="input-width" />
<el-input
v-model="formData.shared_at"
clearable
:placeholder="t('sharedAtPlaceholder')"
class="input-width"
/>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -39,7 +79,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import { addResourceSharing, editResourceSharing, getResourceSharingInfo } from '@/app/api/resource_sharing'
import {
addResourceSharing,
editResourceSharing,
getResourceSharingInfo,
} from '@/app/api/resource_sharing'
let showDialog = ref(false)
const loading = ref(false)
@ -64,29 +108,19 @@ const formRules = computed(() => {
return {
resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
]
,
],
user_id: [
{ required: true, message: t('userIdPlaceholder'), trigger: 'blur' },
]
,
],
role_id: [
{ required: true, message: t('roleIdPlaceholder'), trigger: 'blur' },
]
,
],
shared_by: [
{ required: true, message: t('sharedByPlaceholder'), trigger: 'blur' },
]
,
],
shared_at: [
{ required: true, message: t('sharedAtPlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -106,11 +140,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -119,14 +155,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
const data = await (await getResourceSharingInfo(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]
})
}
@ -144,7 +179,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -171,7 +211,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

163
admin/src/app/views/resource_sharing/resource_sharing.vue

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,61 +8,134 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="resourceSharingTable.searchParam" ref="searchFormRef">
<el-card
class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="resourceSharingTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('resourceId')" prop="resource_id">
<el-input v-model="resourceSharingTable.searchParam.resource_id" :placeholder="t('resourceIdPlaceholder')" />
<el-input
v-model="resourceSharingTable.searchParam.resource_id"
:placeholder="t('resourceIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('userId')" prop="user_id">
<el-input v-model="resourceSharingTable.searchParam.user_id" :placeholder="t('userIdPlaceholder')" />
<el-input
v-model="resourceSharingTable.searchParam.user_id"
:placeholder="t('userIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('roleId')" prop="role_id">
<el-input v-model="resourceSharingTable.searchParam.role_id" :placeholder="t('roleIdPlaceholder')" />
<el-input
v-model="resourceSharingTable.searchParam.role_id"
:placeholder="t('roleIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('sharedBy')" prop="shared_by">
<el-input v-model="resourceSharingTable.searchParam.shared_by" :placeholder="t('sharedByPlaceholder')" />
<el-input
v-model="resourceSharingTable.searchParam.shared_by"
:placeholder="t('sharedByPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('sharedAt')" prop="shared_at">
<el-input v-model="resourceSharingTable.searchParam.shared_at" :placeholder="t('sharedAtPlaceholder')" />
<el-input
v-model="resourceSharingTable.searchParam.shared_at"
:placeholder="t('sharedAtPlaceholder')"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadResourceSharingList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadResourceSharingList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="resourceSharingTable.data" size="large" v-loading="resourceSharingTable.loading">
<el-table
:data="resourceSharingTable.data"
size="large"
v-loading="resourceSharingTable.loading"
>
<template #empty>
<span>{{ !resourceSharingTable.loading ? t('emptyData') : '' }}</span>
<span>{{
!resourceSharingTable.loading ? t('emptyData') : ''
}}</span>
</template>
<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="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="role_id" :label="t('roleId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="role_id"
:label="t('roleId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="shared_by" :label="t('sharedBy')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="shared_by"
:label="t('sharedBy')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="shared_at" :label="t('sharedAt')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="shared_at"
:label="t('sharedAt')"
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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="resourceSharingTable.page" v-model:page-size="resourceSharingTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="resourceSharingTable.total"
@size-change="loadResourceSharingList()" @current-change="loadResourceSharingList" />
<el-pagination
v-model:current-page="resourceSharingTable.page"
v-model:page-size="resourceSharingTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="resourceSharingTable.total"
@size-change="loadResourceSharingList()"
@current-change="loadResourceSharingList"
/>
</div>
</div>
<edit ref="editResourceSharingDialog" @complete="loadResourceSharingList" />
<edit
ref="editResourceSharingDialog"
@complete="loadResourceSharingList"
/>
</el-card>
</div>
</template>
@ -72,13 +144,16 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getResourceSharingList, deleteResourceSharing } from '@/app/api/resource_sharing'
import {
getResourceSharingList,
deleteResourceSharing,
} from '@/app/api/resource_sharing'
import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/resource_sharing/components/resource-sharing-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let resourceSharingTable = reactive({
page: 1,
@ -87,12 +162,12 @@ let resourceSharingTable = reactive({
loading: true,
data: [],
searchParam: {
"resource_id":"",
"user_id":"",
"role_id":"",
"shared_by":"",
"shared_at":""
}
resource_id: '',
user_id: '',
role_id: '',
shared_by: '',
shared_at: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -102,7 +177,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取资源共享列表
*/
@ -113,12 +187,14 @@ const loadResourceSharingList = (page: number = 1) => {
getResourceSharingList({
page: resourceSharingTable.page,
limit: resourceSharingTable.limit,
...resourceSharingTable.searchParam
}).then(res => {
...resourceSharingTable.searchParam,
})
.then((res) => {
resourceSharingTable.loading = false
resourceSharingTable.data = res.data.data
resourceSharingTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
resourceSharingTable.loading = false
})
}
@ -147,22 +223,19 @@ const editEvent = (data: any) => {
* 删除资源共享
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('resourceSharingDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('resourceSharingDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteResourceSharing(id).then(() => {
}).then(() => {
deleteResourceSharing(id)
.then(() => {
loadResourceSharingList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

209
admin/src/app/views/salary/components/salary-edit.vue

@ -1,62 +1,137 @@
<template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateSalary') : t('addSalary')" 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-dialog
v-model="showDialog"
:title="formData.id ? t('updateSalary') : t('addSalary')"
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-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 :label="t('baseSalary')" prop="base_salary">
<el-input v-model="formData.base_salary" clearable :placeholder="t('baseSalaryPlaceholder')" class="input-width" />
<el-input
v-model="formData.base_salary"
clearable
:placeholder="t('baseSalaryPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('performanceBonus')" prop="performance_bonus">
<el-input v-model="formData.performance_bonus" clearable :placeholder="t('performanceBonusPlaceholder')" class="input-width" />
<el-input
v-model="formData.performance_bonus"
clearable
:placeholder="t('performanceBonusPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('deductions')" prop="deductions">
<el-input v-model="formData.deductions" clearable :placeholder="t('deductionsPlaceholder')" class="input-width" />
<el-input
v-model="formData.deductions"
clearable
:placeholder="t('deductionsPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('otherSubsidies')">
<el-input v-model="formData.other_subsidies" clearable :placeholder="t('otherSubsidiesPlaceholder')" class="input-width" />
<el-input
v-model="formData.other_subsidies"
clearable
:placeholder="t('otherSubsidiesPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('netSalary')">
<el-input v-model="formData.net_salary" clearable :placeholder="t('netSalaryPlaceholder')" class="input-width" />
<el-input
v-model="formData.net_salary"
clearable
:placeholder="t('netSalaryPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('paymentStatus')" prop="payment_status">
<el-input v-model="formData.payment_status" clearable :placeholder="t('paymentStatusPlaceholder')" class="input-width" />
<el-input
v-model="formData.payment_status"
clearable
:placeholder="t('paymentStatusPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('paymentMethod')">
<el-input v-model="formData.payment_method" clearable :placeholder="t('paymentMethodPlaceholder')" class="input-width" />
<el-input
v-model="formData.payment_method"
clearable
:placeholder="t('paymentMethodPlaceholder')"
class="input-width"
/>
</el-form-item>
<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 :label="t('salaryMonth')" prop="salary_month">
<el-input v-model="formData.salary_month" clearable :placeholder="t('salaryMonthPlaceholder')" class="input-width" />
<el-input
v-model="formData.salary_month"
clearable
:placeholder="t('salaryMonthPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('departmentId')">
<el-input v-model="formData.department_id" clearable :placeholder="t('departmentIdPlaceholder')" class="input-width" />
<el-input
v-model="formData.department_id"
clearable
:placeholder="t('departmentIdPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('processId')">
<el-input v-model="formData.process_id" clearable :placeholder="t('processIdPlaceholder')" class="input-width" />
<el-input
v-model="formData.process_id"
clearable
:placeholder="t('processIdPlaceholder')"
class="input-width"
/>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -99,64 +174,60 @@ const formRules = computed(() => {
return {
staff_id: [
{ required: true, message: t('staffIdPlaceholder'), trigger: 'blur' },
]
,
],
base_salary: [
{ required: true, message: t('baseSalaryPlaceholder'), trigger: 'blur' },
]
,
],
performance_bonus: [
{ required: true, message: t('performanceBonusPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('performanceBonusPlaceholder'),
trigger: 'blur',
},
],
deductions: [
{ required: true, message: t('deductionsPlaceholder'), trigger: 'blur' },
]
,
],
other_subsidies: [
{ required: true, message: t('otherSubsidiesPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('otherSubsidiesPlaceholder'),
trigger: 'blur',
},
],
net_salary: [
{ required: true, message: t('netSalaryPlaceholder'), trigger: 'blur' },
]
,
],
payment_status: [
{ required: true, message: t('paymentStatusPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('paymentStatusPlaceholder'),
trigger: 'blur',
},
],
payment_method: [
{ required: true, message: t('paymentMethodPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('paymentMethodPlaceholder'),
trigger: 'blur',
},
],
remarks: [
{ required: true, message: t('remarksPlaceholder'), trigger: 'blur' },
]
,
],
salary_month: [
{ required: true, message: t('salaryMonthPlaceholder'), trigger: 'blur' },
]
,
],
department_id: [
{ required: true, message: t('departmentIdPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('departmentIdPlaceholder'),
trigger: 'blur',
},
],
process_id: [
{ required: true, message: t('processIdPlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -176,11 +247,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -189,14 +262,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
const data = await (await getSalaryInfo(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]
})
}
@ -214,7 +286,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -241,7 +318,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

271
admin/src/app/views/salary/salary.vue

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,92 +8,216 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="salaryTable.searchParam" ref="searchFormRef">
<el-card
class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="salaryTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('staffId')" prop="staff_id">
<el-input v-model="salaryTable.searchParam.staff_id" :placeholder="t('staffIdPlaceholder')" />
<el-input
v-model="salaryTable.searchParam.staff_id"
:placeholder="t('staffIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('baseSalary')" prop="base_salary">
<el-input v-model="salaryTable.searchParam.base_salary" :placeholder="t('baseSalaryPlaceholder')" />
<el-input
v-model="salaryTable.searchParam.base_salary"
:placeholder="t('baseSalaryPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('performanceBonus')" prop="performance_bonus">
<el-input v-model="salaryTable.searchParam.performance_bonus" :placeholder="t('performanceBonusPlaceholder')" />
<el-input
v-model="salaryTable.searchParam.performance_bonus"
:placeholder="t('performanceBonusPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('deductions')" prop="deductions">
<el-input v-model="salaryTable.searchParam.deductions" :placeholder="t('deductionsPlaceholder')" />
<el-input
v-model="salaryTable.searchParam.deductions"
:placeholder="t('deductionsPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('otherSubsidies')" prop="other_subsidies">
<el-input v-model="salaryTable.searchParam.other_subsidies" :placeholder="t('otherSubsidiesPlaceholder')" />
<el-input
v-model="salaryTable.searchParam.other_subsidies"
:placeholder="t('otherSubsidiesPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('netSalary')" prop="net_salary">
<el-input v-model="salaryTable.searchParam.net_salary" :placeholder="t('netSalaryPlaceholder')" />
<el-input
v-model="salaryTable.searchParam.net_salary"
:placeholder="t('netSalaryPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('paymentStatus')" prop="payment_status">
<el-input v-model="salaryTable.searchParam.payment_status" :placeholder="t('paymentStatusPlaceholder')" />
<el-input
v-model="salaryTable.searchParam.payment_status"
:placeholder="t('paymentStatusPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('paymentMethod')" prop="payment_method">
<el-input v-model="salaryTable.searchParam.payment_method" :placeholder="t('paymentMethodPlaceholder')" />
<el-input
v-model="salaryTable.searchParam.payment_method"
:placeholder="t('paymentMethodPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('remarks')" prop="remarks">
<el-input v-model="salaryTable.searchParam.remarks" :placeholder="t('remarksPlaceholder')" />
<el-input
v-model="salaryTable.searchParam.remarks"
:placeholder="t('remarksPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('salaryMonth')" prop="salary_month">
<el-input v-model="salaryTable.searchParam.salary_month" :placeholder="t('salaryMonthPlaceholder')" />
<el-input
v-model="salaryTable.searchParam.salary_month"
:placeholder="t('salaryMonthPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('departmentId')" prop="department_id">
<el-input v-model="salaryTable.searchParam.department_id" :placeholder="t('departmentIdPlaceholder')" />
<el-input
v-model="salaryTable.searchParam.department_id"
:placeholder="t('departmentIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('processId')" prop="process_id">
<el-input v-model="salaryTable.searchParam.process_id" :placeholder="t('processIdPlaceholder')" />
<el-input
v-model="salaryTable.searchParam.process_id"
:placeholder="t('processIdPlaceholder')"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadSalaryList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadSalaryList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="salaryTable.data" size="large" v-loading="salaryTable.loading">
<el-table
:data="salaryTable.data"
size="large"
v-loading="salaryTable.loading"
>
<template #empty>
<span>{{ !salaryTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="staff_id" :label="t('staffId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="base_salary" :label="t('baseSalary')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="performance_bonus" :label="t('performanceBonus')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="deductions" :label="t('deductions')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="other_subsidies" :label="t('otherSubsidies')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="net_salary" :label="t('netSalary')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="payment_status" :label="t('paymentStatus')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="payment_method" :label="t('paymentMethod')" 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="salary_month" :label="t('salaryMonth')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="department_id" :label="t('departmentId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="process_id" :label="t('processId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column
prop="staff_id"
:label="t('staffId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="base_salary"
:label="t('baseSalary')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="performance_bonus"
:label="t('performanceBonus')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="deductions"
:label="t('deductions')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="other_subsidies"
:label="t('otherSubsidies')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="net_salary"
:label="t('netSalary')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="payment_status"
:label="t('paymentStatus')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="payment_method"
:label="t('paymentMethod')"
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="salary_month"
:label="t('salaryMonth')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="department_id"
:label="t('departmentId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="process_id"
:label="t('processId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="salaryTable.page" v-model:page-size="salaryTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="salaryTable.total"
@size-change="loadSalaryList()" @current-change="loadSalaryList" />
<el-pagination
v-model:current-page="salaryTable.page"
v-model:page-size="salaryTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="salaryTable.total"
@size-change="loadSalaryList()"
@current-change="loadSalaryList"
/>
</div>
</div>
@ -113,7 +236,7 @@ import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/salary/components/salary-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let salaryTable = reactive({
page: 1,
@ -122,19 +245,19 @@ let salaryTable = reactive({
loading: true,
data: [],
searchParam: {
"staff_id":"",
"base_salary":"",
"performance_bonus":"",
"deductions":"",
"other_subsidies":"",
"net_salary":"",
"payment_status":"",
"payment_method":"",
"remarks":"",
"salary_month":"",
"department_id":"",
"process_id":""
}
staff_id: '',
base_salary: '',
performance_bonus: '',
deductions: '',
other_subsidies: '',
net_salary: '',
payment_status: '',
payment_method: '',
remarks: '',
salary_month: '',
department_id: '',
process_id: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -144,7 +267,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取工资列表
*/
@ -155,12 +277,14 @@ const loadSalaryList = (page: number = 1) => {
getSalaryList({
page: salaryTable.page,
limit: salaryTable.limit,
...salaryTable.searchParam
}).then(res => {
...salaryTable.searchParam,
})
.then((res) => {
salaryTable.loading = false
salaryTable.data = res.data.data
salaryTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
salaryTable.loading = false
})
}
@ -189,22 +313,19 @@ const editEvent = (data: any) => {
* 删除工资
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('salaryDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('salaryDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteSalary(id).then(() => {
}).then(() => {
deleteSalary(id)
.then(() => {
loadSalaryList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

198
admin/src/app/views/service/components/service-edit.vue

@ -1,54 +1,122 @@
<template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateService') : t('addService')" 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-dialog
v-model="showDialog"
:title="formData.id ? t('updateService') : t('addService')"
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('serviceName')" prop="service_name">
<el-input v-model="formData.service_name" clearable :placeholder="t('serviceNamePlaceholder')" class="input-width" />
<el-input
v-model="formData.service_name"
clearable
:placeholder="t('serviceNamePlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('previewImageUrl')">
<el-input v-model="formData.preview_image_url" clearable :placeholder="t('previewImageUrlPlaceholder')" class="input-width" />
<el-input
v-model="formData.preview_image_url"
clearable
:placeholder="t('previewImageUrlPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('description')" prop="description">
<el-input v-model="formData.description" clearable :placeholder="t('descriptionPlaceholder')" class="input-width" />
<el-input
v-model="formData.description"
clearable
:placeholder="t('descriptionPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('serviceType')" prop="service_type">
<el-input v-model="formData.service_type" clearable :placeholder="t('serviceTypePlaceholder')" class="input-width" />
<el-input
v-model="formData.service_type"
clearable
:placeholder="t('serviceTypePlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('executionRules')" prop="execution_rules">
<el-input v-model="formData.execution_rules" clearable :placeholder="t('executionRulesPlaceholder')" class="input-width" />
<el-input
v-model="formData.execution_rules"
clearable
:placeholder="t('executionRulesPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('staffReminder')" prop="staff_reminder">
<el-input v-model="formData.staff_reminder" clearable :placeholder="t('staffReminderPlaceholder')" class="input-width" />
<el-input
v-model="formData.staff_reminder"
clearable
:placeholder="t('staffReminderPlaceholder')"
class="input-width"
/>
</el-form-item>
<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 :label="t('customerConfirmation')" prop="customer_confirmation">
<el-input v-model="formData.customer_confirmation" clearable :placeholder="t('customerConfirmationPlaceholder')" class="input-width" />
<el-form-item
:label="t('customerConfirmation')"
prop="customer_confirmation"
>
<el-input
v-model="formData.customer_confirmation"
clearable
:placeholder="t('customerConfirmationPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('customerFeedback')">
<el-input v-model="formData.customer_feedback" clearable :placeholder="t('customerFeedbackPlaceholder')" class="input-width" />
<el-input
v-model="formData.customer_feedback"
clearable
:placeholder="t('customerFeedbackPlaceholder')"
class="input-width"
/>
</el-form-item>
<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>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -89,54 +157,58 @@ const formRules = computed(() => {
return {
service_name: [
{ required: true, message: t('serviceNamePlaceholder'), trigger: 'blur' },
]
,
],
preview_image_url: [
{ required: true, message: t('previewImageUrlPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('previewImageUrlPlaceholder'),
trigger: 'blur',
},
],
description: [
{ required: true, message: t('descriptionPlaceholder'), trigger: 'blur' },
]
,
],
service_type: [
{ required: true, message: t('serviceTypePlaceholder'), trigger: 'blur' },
]
,
],
execution_rules: [
{ required: true, message: t('executionRulesPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('executionRulesPlaceholder'),
trigger: 'blur',
},
],
staff_reminder: [
{ required: true, message: t('staffReminderPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('staffReminderPlaceholder'),
trigger: 'blur',
},
],
customer_reminder: [
{ required: true, message: t('customerReminderPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('customerReminderPlaceholder'),
trigger: 'blur',
},
],
customer_confirmation: [
{ required: true, message: t('customerConfirmationPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('customerConfirmationPlaceholder'),
trigger: 'blur',
},
],
customer_feedback: [
{ required: true, message: t('customerFeedbackPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('customerFeedbackPlaceholder'),
trigger: 'blur',
},
],
status: [
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -156,11 +228,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -169,14 +243,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
const data = await (await getServiceInfo(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]
})
}
@ -194,7 +267,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -221,7 +299,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

224
admin/src/app/views/service/service.vue

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,82 +8,193 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="serviceTable.searchParam" ref="searchFormRef">
<el-card
class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="serviceTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('serviceName')" prop="service_name">
<el-input v-model="serviceTable.searchParam.service_name" :placeholder="t('serviceNamePlaceholder')" />
<el-input
v-model="serviceTable.searchParam.service_name"
:placeholder="t('serviceNamePlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('previewImageUrl')" prop="preview_image_url">
<el-input v-model="serviceTable.searchParam.preview_image_url" :placeholder="t('previewImageUrlPlaceholder')" />
<el-input
v-model="serviceTable.searchParam.preview_image_url"
:placeholder="t('previewImageUrlPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('description')" prop="description">
<el-input v-model="serviceTable.searchParam.description" :placeholder="t('descriptionPlaceholder')" />
<el-input
v-model="serviceTable.searchParam.description"
:placeholder="t('descriptionPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('serviceType')" prop="service_type">
<el-input v-model="serviceTable.searchParam.service_type" :placeholder="t('serviceTypePlaceholder')" />
<el-input
v-model="serviceTable.searchParam.service_type"
:placeholder="t('serviceTypePlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('executionRules')" prop="execution_rules">
<el-input v-model="serviceTable.searchParam.execution_rules" :placeholder="t('executionRulesPlaceholder')" />
<el-input
v-model="serviceTable.searchParam.execution_rules"
:placeholder="t('executionRulesPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('staffReminder')" prop="staff_reminder">
<el-input v-model="serviceTable.searchParam.staff_reminder" :placeholder="t('staffReminderPlaceholder')" />
<el-input
v-model="serviceTable.searchParam.staff_reminder"
:placeholder="t('staffReminderPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('customerReminder')" prop="customer_reminder">
<el-input v-model="serviceTable.searchParam.customer_reminder" :placeholder="t('customerReminderPlaceholder')" />
<el-input
v-model="serviceTable.searchParam.customer_reminder"
:placeholder="t('customerReminderPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('customerConfirmation')" prop="customer_confirmation">
<el-input v-model="serviceTable.searchParam.customer_confirmation" :placeholder="t('customerConfirmationPlaceholder')" />
<el-form-item
:label="t('customerConfirmation')"
prop="customer_confirmation"
>
<el-input
v-model="serviceTable.searchParam.customer_confirmation"
:placeholder="t('customerConfirmationPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('customerFeedback')" prop="customer_feedback">
<el-input v-model="serviceTable.searchParam.customer_feedback" :placeholder="t('customerFeedbackPlaceholder')" />
<el-input
v-model="serviceTable.searchParam.customer_feedback"
:placeholder="t('customerFeedbackPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('status')" prop="status">
<el-input v-model="serviceTable.searchParam.status" :placeholder="t('statusPlaceholder')" />
<el-input
v-model="serviceTable.searchParam.status"
:placeholder="t('statusPlaceholder')"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadServiceList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadServiceList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="serviceTable.data" size="large" v-loading="serviceTable.loading">
<el-table
:data="serviceTable.data"
size="large"
v-loading="serviceTable.loading"
>
<template #empty>
<span>{{ !serviceTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="service_name" :label="t('serviceName')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="service_name"
:label="t('serviceName')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="preview_image_url" :label="t('previewImageUrl')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="preview_image_url"
:label="t('previewImageUrl')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="description" :label="t('description')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="description"
:label="t('description')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="service_type" :label="t('serviceType')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="service_type"
:label="t('serviceType')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="execution_rules" :label="t('executionRules')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="execution_rules"
:label="t('executionRules')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="staff_reminder" :label="t('staffReminder')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="staff_reminder"
:label="t('staffReminder')"
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="customer_confirmation" :label="t('customerConfirmation')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="customer_confirmation"
:label="t('customerConfirmation')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="customer_feedback" :label="t('customerFeedback')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="customer_feedback"
:label="t('customerFeedback')"
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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="serviceTable.page" v-model:page-size="serviceTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="serviceTable.total"
@size-change="loadServiceList()" @current-change="loadServiceList" />
<el-pagination
v-model:current-page="serviceTable.page"
v-model:page-size="serviceTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="serviceTable.total"
@size-change="loadServiceList()"
@current-change="loadServiceList"
/>
</div>
</div>
@ -103,7 +213,7 @@ import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/service/components/service-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let serviceTable = reactive({
page: 1,
@ -112,17 +222,17 @@ let serviceTable = reactive({
loading: true,
data: [],
searchParam: {
"service_name":"",
"preview_image_url":"",
"description":"",
"service_type":"",
"execution_rules":"",
"staff_reminder":"",
"customer_reminder":"",
"customer_confirmation":"",
"customer_feedback":"",
"status":""
}
service_name: '',
preview_image_url: '',
description: '',
service_type: '',
execution_rules: '',
staff_reminder: '',
customer_reminder: '',
customer_confirmation: '',
customer_feedback: '',
status: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -132,7 +242,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取服务列表
*/
@ -143,12 +252,14 @@ const loadServiceList = (page: number = 1) => {
getServiceList({
page: serviceTable.page,
limit: serviceTable.limit,
...serviceTable.searchParam
}).then(res => {
...serviceTable.searchParam,
})
.then((res) => {
serviceTable.loading = false
serviceTable.data = res.data.data
serviceTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
serviceTable.loading = false
})
}
@ -177,22 +288,19 @@ const editEvent = (data: any) => {
* 删除服务
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('serviceDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('serviceDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteService(id).then(() => {
}).then(() => {
deleteService(id)
.then(() => {
loadServiceList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

243
admin/src/app/views/six_speed/components/six-speed-edit.vue

@ -1,66 +1,149 @@
<template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateSixSpeed') : t('addSixSpeed')" 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-dialog
v-model="showDialog"
:title="formData.id ? t('updateSixSpeed') : t('addSixSpeed')"
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('purchasePower')" prop="purchase_power">
<el-input v-model="formData.purchase_power" clearable :placeholder="t('purchasePowerPlaceholder')" class="input-width" />
<el-input
v-model="formData.purchase_power"
clearable
:placeholder="t('purchasePowerPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('conceptAwareness')" prop="concept_awareness">
<el-input v-model="formData.concept_awareness" clearable :placeholder="t('conceptAwarenessPlaceholder')" class="input-width" />
<el-input
v-model="formData.concept_awareness"
clearable
:placeholder="t('conceptAwarenessPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('preferredClassTime')" prop="preferred_class_time">
<el-input v-model="formData.preferred_class_time" clearable :placeholder="t('preferredClassTimePlaceholder')" class="input-width" />
<el-form-item
:label="t('preferredClassTime')"
prop="preferred_class_time"
>
<el-input
v-model="formData.preferred_class_time"
clearable
:placeholder="t('preferredClassTimePlaceholder')"
class="input-width"
/>
</el-form-item>
<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 :label="t('communication')" prop="communication">
<el-input v-model="formData.communication" clearable :placeholder="t('communicationPlaceholder')" class="input-width" />
<el-input
v-model="formData.communication"
clearable
:placeholder="t('communicationPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('promisedVisitTime')" prop="promised_visit_time">
<el-input v-model="formData.promised_visit_time" clearable :placeholder="t('promisedVisitTimePlaceholder')" class="input-width" />
<el-input
v-model="formData.promised_visit_time"
clearable
:placeholder="t('promisedVisitTimePlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('actualVisitTime')">
<el-input v-model="formData.actual_visit_time" clearable :placeholder="t('actualVisitTimePlaceholder')" class="input-width" />
<el-input
v-model="formData.actual_visit_time"
clearable
:placeholder="t('actualVisitTimePlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('callIntent')" prop="call_intent">
<el-input v-model="formData.call_intent" clearable :placeholder="t('callIntentPlaceholder')" class="input-width" />
<el-input
v-model="formData.call_intent"
clearable
:placeholder="t('callIntentPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('firstVisitStatus')">
<el-input v-model="formData.first_visit_status" clearable :placeholder="t('firstVisitStatusPlaceholder')" class="input-width" />
<el-input
v-model="formData.first_visit_status"
clearable
:placeholder="t('firstVisitStatusPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('secondVisitStatus')">
<el-input v-model="formData.second_visit_status" clearable :placeholder="t('secondVisitStatusPlaceholder')" class="input-width" />
<el-input
v-model="formData.second_visit_status"
clearable
:placeholder="t('secondVisitStatusPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('isClosed')" prop="is_closed">
<el-input v-model="formData.is_closed" clearable :placeholder="t('isClosedPlaceholder')" class="input-width" />
<el-input
v-model="formData.is_closed"
clearable
:placeholder="t('isClosedPlaceholder')"
class="input-width"
/>
</el-form-item>
<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 :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>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -103,70 +186,76 @@ const formRef = ref<FormInstance>()
const formRules = computed(() => {
return {
purchase_power: [
{ required: true, message: t('purchasePowerPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('purchasePowerPlaceholder'),
trigger: 'blur',
},
],
concept_awareness: [
{ required: true, message: t('conceptAwarenessPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('conceptAwarenessPlaceholder'),
trigger: 'blur',
},
],
preferred_class_time: [
{ required: true, message: t('preferredClassTimePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('preferredClassTimePlaceholder'),
trigger: 'blur',
},
],
distance: [
{ required: true, message: t('distancePlaceholder'), trigger: 'blur' },
]
,
],
communication: [
{ required: true, message: t('communicationPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('communicationPlaceholder'),
trigger: 'blur',
},
],
promised_visit_time: [
{ required: true, message: t('promisedVisitTimePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('promisedVisitTimePlaceholder'),
trigger: 'blur',
},
],
actual_visit_time: [
{ required: true, message: t('actualVisitTimePlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('actualVisitTimePlaceholder'),
trigger: 'blur',
},
],
call_intent: [
{ required: true, message: t('callIntentPlaceholder'), trigger: 'blur' },
]
,
],
first_visit_status: [
{ required: true, message: t('firstVisitStatusPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('firstVisitStatusPlaceholder'),
trigger: 'blur',
},
],
second_visit_status: [
{ required: true, message: t('secondVisitStatusPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('secondVisitStatusPlaceholder'),
trigger: 'blur',
},
],
is_closed: [
{ required: true, message: t('isClosedPlaceholder'), trigger: 'blur' },
]
,
],
staff_id: [
{ required: true, message: t('staffIdPlaceholder'), trigger: 'blur' },
]
,
],
resource_id: [
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -186,11 +275,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -199,14 +290,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
const data = await (await getSixSpeedInfo(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]
})
}
@ -224,7 +314,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -251,7 +346,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

307
admin/src/app/views/six_speed/six_speed.vue

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,97 +8,241 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="sixSpeedTable.searchParam" ref="searchFormRef">
<el-card
class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="sixSpeedTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('purchasePower')" prop="purchase_power">
<el-input v-model="sixSpeedTable.searchParam.purchase_power" :placeholder="t('purchasePowerPlaceholder')" />
<el-input
v-model="sixSpeedTable.searchParam.purchase_power"
:placeholder="t('purchasePowerPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('conceptAwareness')" prop="concept_awareness">
<el-input v-model="sixSpeedTable.searchParam.concept_awareness" :placeholder="t('conceptAwarenessPlaceholder')" />
<el-input
v-model="sixSpeedTable.searchParam.concept_awareness"
:placeholder="t('conceptAwarenessPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('preferredClassTime')" prop="preferred_class_time">
<el-input v-model="sixSpeedTable.searchParam.preferred_class_time" :placeholder="t('preferredClassTimePlaceholder')" />
<el-form-item
:label="t('preferredClassTime')"
prop="preferred_class_time"
>
<el-input
v-model="sixSpeedTable.searchParam.preferred_class_time"
:placeholder="t('preferredClassTimePlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('distance')" prop="distance">
<el-input v-model="sixSpeedTable.searchParam.distance" :placeholder="t('distancePlaceholder')" />
<el-input
v-model="sixSpeedTable.searchParam.distance"
:placeholder="t('distancePlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('communication')" prop="communication">
<el-input v-model="sixSpeedTable.searchParam.communication" :placeholder="t('communicationPlaceholder')" />
<el-input
v-model="sixSpeedTable.searchParam.communication"
:placeholder="t('communicationPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('promisedVisitTime')" prop="promised_visit_time">
<el-input v-model="sixSpeedTable.searchParam.promised_visit_time" :placeholder="t('promisedVisitTimePlaceholder')" />
<el-form-item
:label="t('promisedVisitTime')"
prop="promised_visit_time"
>
<el-input
v-model="sixSpeedTable.searchParam.promised_visit_time"
:placeholder="t('promisedVisitTimePlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('actualVisitTime')" prop="actual_visit_time">
<el-input v-model="sixSpeedTable.searchParam.actual_visit_time" :placeholder="t('actualVisitTimePlaceholder')" />
<el-input
v-model="sixSpeedTable.searchParam.actual_visit_time"
:placeholder="t('actualVisitTimePlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('callIntent')" prop="call_intent">
<el-input v-model="sixSpeedTable.searchParam.call_intent" :placeholder="t('callIntentPlaceholder')" />
<el-input
v-model="sixSpeedTable.searchParam.call_intent"
:placeholder="t('callIntentPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('firstVisitStatus')" prop="first_visit_status">
<el-input v-model="sixSpeedTable.searchParam.first_visit_status" :placeholder="t('firstVisitStatusPlaceholder')" />
<el-form-item
:label="t('firstVisitStatus')"
prop="first_visit_status"
>
<el-input
v-model="sixSpeedTable.searchParam.first_visit_status"
:placeholder="t('firstVisitStatusPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('secondVisitStatus')" prop="second_visit_status">
<el-input v-model="sixSpeedTable.searchParam.second_visit_status" :placeholder="t('secondVisitStatusPlaceholder')" />
<el-form-item
:label="t('secondVisitStatus')"
prop="second_visit_status"
>
<el-input
v-model="sixSpeedTable.searchParam.second_visit_status"
:placeholder="t('secondVisitStatusPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('isClosed')" prop="is_closed">
<el-input v-model="sixSpeedTable.searchParam.is_closed" :placeholder="t('isClosedPlaceholder')" />
<el-input
v-model="sixSpeedTable.searchParam.is_closed"
:placeholder="t('isClosedPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('staffId')" prop="staff_id">
<el-input v-model="sixSpeedTable.searchParam.staff_id" :placeholder="t('staffIdPlaceholder')" />
<el-input
v-model="sixSpeedTable.searchParam.staff_id"
:placeholder="t('staffIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('resourceId')" prop="resource_id">
<el-input v-model="sixSpeedTable.searchParam.resource_id" :placeholder="t('resourceIdPlaceholder')" />
<el-input
v-model="sixSpeedTable.searchParam.resource_id"
:placeholder="t('resourceIdPlaceholder')"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadSixSpeedList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadSixSpeedList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="sixSpeedTable.data" size="large" v-loading="sixSpeedTable.loading">
<el-table
:data="sixSpeedTable.data"
size="large"
v-loading="sixSpeedTable.loading"
>
<template #empty>
<span>{{ !sixSpeedTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="purchase_power" :label="t('purchasePower')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="concept_awareness" :label="t('conceptAwareness')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="preferred_class_time" :label="t('preferredClassTime')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="distance" :label="t('distance')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="communication" :label="t('communication')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="promised_visit_time" :label="t('promisedVisitTime')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="actual_visit_time" :label="t('actualVisitTime')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="call_intent" :label="t('callIntent')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="first_visit_status" :label="t('firstVisitStatus')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="second_visit_status" :label="t('secondVisitStatus')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="is_closed" :label="t('isClosed')" 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 :label="t('operation')" fixed="right" min-width="120">
<el-table-column
prop="purchase_power"
:label="t('purchasePower')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="concept_awareness"
:label="t('conceptAwareness')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="preferred_class_time"
:label="t('preferredClassTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="distance"
:label="t('distance')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="communication"
:label="t('communication')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="promised_visit_time"
:label="t('promisedVisitTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="actual_visit_time"
:label="t('actualVisitTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="call_intent"
:label="t('callIntent')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="first_visit_status"
:label="t('firstVisitStatus')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="second_visit_status"
:label="t('secondVisitStatus')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="is_closed"
:label="t('isClosed')"
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
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="sixSpeedTable.page" v-model:page-size="sixSpeedTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="sixSpeedTable.total"
@size-change="loadSixSpeedList()" @current-change="loadSixSpeedList" />
<el-pagination
v-model:current-page="sixSpeedTable.page"
v-model:page-size="sixSpeedTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="sixSpeedTable.total"
@size-change="loadSixSpeedList()"
@current-change="loadSixSpeedList"
/>
</div>
</div>
@ -118,7 +261,7 @@ import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/six_speed/components/six-speed-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let sixSpeedTable = reactive({
page: 1,
@ -127,20 +270,20 @@ let sixSpeedTable = reactive({
loading: true,
data: [],
searchParam: {
"purchase_power":"",
"concept_awareness":"",
"preferred_class_time":"",
"distance":"",
"communication":"",
"promised_visit_time":"",
"actual_visit_time":"",
"call_intent":"",
"first_visit_status":"",
"second_visit_status":"",
"is_closed":"",
"staff_id":"",
"resource_id":""
}
purchase_power: '',
concept_awareness: '',
preferred_class_time: '',
distance: '',
communication: '',
promised_visit_time: '',
actual_visit_time: '',
call_intent: '',
first_visit_status: '',
second_visit_status: '',
is_closed: '',
staff_id: '',
resource_id: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -150,7 +293,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取六一速列表
*/
@ -161,12 +303,14 @@ const loadSixSpeedList = (page: number = 1) => {
getSixSpeedList({
page: sixSpeedTable.page,
limit: sixSpeedTable.limit,
...sixSpeedTable.searchParam
}).then(res => {
...sixSpeedTable.searchParam,
})
.then((res) => {
sixSpeedTable.loading = false
sixSpeedTable.data = res.data.data
sixSpeedTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
sixSpeedTable.loading = false
})
}
@ -195,22 +339,19 @@ const editEvent = (data: any) => {
* 删除六一速
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('sixSpeedDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('sixSpeedDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteSixSpeed(id).then(() => {
}).then(() => {
deleteSixSpeed(id)
.then(() => {
loadSixSpeedList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

124
admin/src/app/views/six_speed_modification_log/components/six-speed-modification-log-edit.vue

@ -1,8 +1,30 @@
<template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateSixSpeedModificationLog') : t('addSixSpeedModificationLog')" 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-dialog
v-model="showDialog"
:title="
formData.id
? t('updateSixSpeedModificationLog')
: t('addSixSpeedModificationLog')
"
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-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
v-for="(item, index) in campusIdList"
@ -14,7 +36,12 @@
</el-form-item>
<el-form-item :label="t('staffId')" prop="staff_id">
<el-select class="input-width" v-model="formData.staff_id" clearable :placeholder="t('staffIdPlaceholder')">
<el-select
class="input-width"
v-model="formData.staff_id"
clearable
:placeholder="t('staffIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in staffIdList"
@ -26,25 +53,42 @@
</el-form-item>
<el-form-item :label="t('modifiedField')" prop="modified_field">
<el-input v-model="formData.modified_field" clearable :placeholder="t('modifiedFieldPlaceholder')" class="input-width" />
<el-input
v-model="formData.modified_field"
clearable
:placeholder="t('modifiedFieldPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('oldValue')">
<el-input v-model="formData.old_value" clearable :placeholder="t('oldValuePlaceholder')" class="input-width" />
<el-input
v-model="formData.old_value"
clearable
:placeholder="t('oldValuePlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('newValue')">
<el-input v-model="formData.new_value" clearable :placeholder="t('newValuePlaceholder')" class="input-width" />
<el-input
v-model="formData.new_value"
clearable
:placeholder="t('newValuePlaceholder')"
class="input-width"
/>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -55,7 +99,13 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import { addSixSpeedModificationLog, editSixSpeedModificationLog, getSixSpeedModificationLogInfo, getWithCampusList, getWithPersonnelList } from '@/app/api/six_speed_modification_log'
import {
addSixSpeedModificationLog,
editSixSpeedModificationLog,
getSixSpeedModificationLogInfo,
getWithCampusList,
getWithPersonnelList,
} from '@/app/api/six_speed_modification_log'
let showDialog = ref(false)
const loading = ref(false)
@ -80,29 +130,23 @@ const formRules = computed(() => {
return {
campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
]
,
],
staff_id: [
{ required: true, message: t('staffIdPlaceholder'), trigger: 'blur' },
]
,
],
modified_field: [
{ required: true, message: t('modifiedFieldPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('modifiedFieldPlaceholder'),
trigger: 'blur',
},
],
old_value: [
{ required: true, message: t('oldValuePlaceholder'), trigger: 'blur' },
]
,
],
new_value: [
{ required: true, message: t('newValuePlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -114,7 +158,9 @@ const emit = defineEmits(['complete'])
*/
const confirm = async (formEl: FormInstance | undefined) => {
if (loading.value || !formEl) return
let save = formData.id ? editSixSpeedModificationLog : addSixSpeedModificationLog
let save = formData.id
? editSixSpeedModificationLog
: addSixSpeedModificationLog
await formEl.validate(async (valid) => {
if (valid) {
@ -122,11 +168,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -135,8 +183,6 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const campusIdList = ref([] as any[])
const setCampusIdList = async () => {
campusIdList.value = await (await getWithCampusList({})).data
@ -152,7 +198,8 @@ const setFormData = async (row: any = null) => {
loading.value = true
if (row) {
const data = await (await getSixSpeedModificationLogInfo(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]
})
}
@ -170,7 +217,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -197,7 +249,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

140
admin/src/app/views/six_speed_modification_log/six_speed_modification_log.vue

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,11 +8,22 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="sixSpeedModificationLogTable.searchParam" ref="searchFormRef">
<el-card
class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="sixSpeedModificationLogTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('campusId')" prop="campus_id">
<el-select class="w-[280px]" v-model="sixSpeedModificationLogTable.searchParam.campus_id" clearable :placeholder="t('campusIdPlaceholder')">
<el-select
class="w-[280px]"
v-model="sixSpeedModificationLogTable.searchParam.campus_id"
clearable
:placeholder="t('campusIdPlaceholder')"
>
<el-option
v-for="(item, index) in campusIdList"
:key="index"
@ -24,43 +34,95 @@
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadSixSpeedModificationLogList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button
type="primary"
@click="loadSixSpeedModificationLogList()"
>{{ t('search') }}</el-button
>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="sixSpeedModificationLogTable.data" size="large" v-loading="sixSpeedModificationLogTable.loading">
<el-table
:data="sixSpeedModificationLogTable.data"
size="large"
v-loading="sixSpeedModificationLogTable.loading"
>
<template #empty>
<span>{{ !sixSpeedModificationLogTable.loading ? t('emptyData') : '' }}</span>
<span>{{
!sixSpeedModificationLogTable.loading ? t('emptyData') : ''
}}</span>
</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="staff_id_name" :label="t('staffId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="staff_id_name"
:label="t('staffId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="modified_field" :label="t('modifiedField')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="modified_field"
:label="t('modifiedField')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="old_value" :label="t('oldValue')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="old_value"
:label="t('oldValue')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="new_value" :label="t('newValue')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="new_value"
:label="t('newValue')"
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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="sixSpeedModificationLogTable.page" v-model:page-size="sixSpeedModificationLogTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="sixSpeedModificationLogTable.total"
@size-change="loadSixSpeedModificationLogList()" @current-change="loadSixSpeedModificationLogList" />
<el-pagination
v-model:current-page="sixSpeedModificationLogTable.page"
v-model:page-size="sixSpeedModificationLogTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="sixSpeedModificationLogTable.total"
@size-change="loadSixSpeedModificationLogList()"
@current-change="loadSixSpeedModificationLogList"
/>
</div>
</div>
<edit ref="editSixSpeedModificationLogDialog" @complete="loadSixSpeedModificationLogList" />
<edit
ref="editSixSpeedModificationLogDialog"
@complete="loadSixSpeedModificationLogList"
/>
</el-card>
</div>
</template>
@ -69,13 +131,18 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getSixSpeedModificationLogList, deleteSixSpeedModificationLog, getWithCampusList, getWithPersonnelList } from '@/app/api/six_speed_modification_log'
import {
getSixSpeedModificationLogList,
deleteSixSpeedModificationLog,
getWithCampusList,
getWithPersonnelList,
} from '@/app/api/six_speed_modification_log'
import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/six_speed_modification_log/components/six-speed-modification-log-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let sixSpeedModificationLogTable = reactive({
page: 1,
@ -84,8 +151,8 @@ let sixSpeedModificationLogTable = reactive({
loading: true,
data: [],
searchParam: {
"campus_id":""
}
campus_id: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -95,7 +162,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取六一速修改记录列表
*/
@ -106,12 +172,14 @@ const loadSixSpeedModificationLogList = (page: number = 1) => {
getSixSpeedModificationLogList({
page: sixSpeedModificationLogTable.page,
limit: sixSpeedModificationLogTable.limit,
...sixSpeedModificationLogTable.searchParam
}).then(res => {
...sixSpeedModificationLogTable.searchParam,
})
.then((res) => {
sixSpeedModificationLogTable.loading = false
sixSpeedModificationLogTable.data = res.data.data
sixSpeedModificationLogTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
sixSpeedModificationLogTable.loading = false
})
}
@ -140,21 +208,19 @@ const editEvent = (data: any) => {
* 删除六一速修改记录
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('sixSpeedModificationLogDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('sixSpeedModificationLogDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteSixSpeedModificationLog(id).then(() => {
}).then(() => {
deleteSixSpeedModificationLog(id)
.then(() => {
loadSixSpeedModificationLogList()
}).catch(() => {
})
.catch(() => {})
})
}
const campusIdList = ref([])
const setCampusIdList = async () => {
campusIdList.value = await (await getWithCampusList({})).data

403
admin/src/app/views/stat_hour/components/stat-hour-edit.vue

@ -1,142 +1,317 @@
<template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateStatHour') : t('addStatHour')" 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-dialog
v-model="showDialog"
:title="formData.id ? t('updateStatHour') : t('addStatHour')"
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('addon')" prop="addon">
<el-input v-model="formData.addon" clearable :placeholder="t('addonPlaceholder')" class="input-width" />
<el-input
v-model="formData.addon"
clearable
:placeholder="t('addonPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('field')" prop="field">
<el-input v-model="formData.field" clearable :placeholder="t('fieldPlaceholder')" class="input-width" />
<el-input
v-model="formData.field"
clearable
:placeholder="t('fieldPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('fieldTotal')" prop="field_total">
<el-input v-model="formData.field_total" clearable :placeholder="t('fieldTotalPlaceholder')" class="input-width" />
<el-input
v-model="formData.field_total"
clearable
:placeholder="t('fieldTotalPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('year')" prop="year">
<el-input v-model="formData.year" clearable :placeholder="t('yearPlaceholder')" class="input-width" />
<el-input
v-model="formData.year"
clearable
:placeholder="t('yearPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('month')" prop="month">
<el-input v-model="formData.month" clearable :placeholder="t('monthPlaceholder')" class="input-width" />
<el-input
v-model="formData.month"
clearable
:placeholder="t('monthPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('day')" prop="day">
<el-input v-model="formData.day" clearable :placeholder="t('dayPlaceholder')" class="input-width" />
<el-input
v-model="formData.day"
clearable
:placeholder="t('dayPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('startTime')" prop="start_time">
<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 :label="t('lastTime')" prop="last_time">
<el-input v-model="formData.last_time" clearable :placeholder="t('lastTimePlaceholder')" class="input-width" />
<el-input
v-model="formData.last_time"
clearable
:placeholder="t('lastTimePlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour0')" prop="hour_0">
<el-input v-model="formData.hour_0" clearable :placeholder="t('hour0Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_0"
clearable
:placeholder="t('hour0Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour1')" prop="hour_1">
<el-input v-model="formData.hour_1" clearable :placeholder="t('hour1Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_1"
clearable
:placeholder="t('hour1Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour2')" prop="hour_2">
<el-input v-model="formData.hour_2" clearable :placeholder="t('hour2Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_2"
clearable
:placeholder="t('hour2Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour3')" prop="hour_3">
<el-input v-model="formData.hour_3" clearable :placeholder="t('hour3Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_3"
clearable
:placeholder="t('hour3Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour4')" prop="hour_4">
<el-input v-model="formData.hour_4" clearable :placeholder="t('hour4Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_4"
clearable
:placeholder="t('hour4Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour5')" prop="hour_5">
<el-input v-model="formData.hour_5" clearable :placeholder="t('hour5Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_5"
clearable
:placeholder="t('hour5Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour6')" prop="hour_6">
<el-input v-model="formData.hour_6" clearable :placeholder="t('hour6Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_6"
clearable
:placeholder="t('hour6Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour7')" prop="hour_7">
<el-input v-model="formData.hour_7" clearable :placeholder="t('hour7Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_7"
clearable
:placeholder="t('hour7Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour8')" prop="hour_8">
<el-input v-model="formData.hour_8" clearable :placeholder="t('hour8Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_8"
clearable
:placeholder="t('hour8Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour9')" prop="hour_9">
<el-input v-model="formData.hour_9" clearable :placeholder="t('hour9Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_9"
clearable
:placeholder="t('hour9Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour10')" prop="hour_10">
<el-input v-model="formData.hour_10" clearable :placeholder="t('hour10Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_10"
clearable
:placeholder="t('hour10Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour11')" prop="hour_11">
<el-input v-model="formData.hour_11" clearable :placeholder="t('hour11Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_11"
clearable
:placeholder="t('hour11Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour12')" prop="hour_12">
<el-input v-model="formData.hour_12" clearable :placeholder="t('hour12Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_12"
clearable
:placeholder="t('hour12Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour13')" prop="hour_13">
<el-input v-model="formData.hour_13" clearable :placeholder="t('hour13Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_13"
clearable
:placeholder="t('hour13Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour14')" prop="hour_14">
<el-input v-model="formData.hour_14" clearable :placeholder="t('hour14Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_14"
clearable
:placeholder="t('hour14Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour15')" prop="hour_15">
<el-input v-model="formData.hour_15" clearable :placeholder="t('hour15Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_15"
clearable
:placeholder="t('hour15Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour16')" prop="hour_16">
<el-input v-model="formData.hour_16" clearable :placeholder="t('hour16Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_16"
clearable
:placeholder="t('hour16Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour17')" prop="hour_17">
<el-input v-model="formData.hour_17" clearable :placeholder="t('hour17Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_17"
clearable
:placeholder="t('hour17Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour18')" prop="hour_18">
<el-input v-model="formData.hour_18" clearable :placeholder="t('hour18Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_18"
clearable
:placeholder="t('hour18Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour19')" prop="hour_19">
<el-input v-model="formData.hour_19" clearable :placeholder="t('hour19Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_19"
clearable
:placeholder="t('hour19Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour20')" prop="hour_20">
<el-input v-model="formData.hour_20" clearable :placeholder="t('hour20Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_20"
clearable
:placeholder="t('hour20Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour21')" prop="hour_21">
<el-input v-model="formData.hour_21" clearable :placeholder="t('hour21Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_21"
clearable
:placeholder="t('hour21Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour22')" prop="hour_22">
<el-input v-model="formData.hour_22" clearable :placeholder="t('hour22Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_22"
clearable
:placeholder="t('hour22Placeholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('hour23')" prop="hour_23">
<el-input v-model="formData.hour_23" clearable :placeholder="t('hour23Placeholder')" class="input-width" />
<el-input
v-model="formData.hour_23"
clearable
:placeholder="t('hour23Placeholder')"
class="input-width"
/>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -199,164 +374,96 @@ const formRules = computed(() => {
return {
addon: [
{ required: true, message: t('addonPlaceholder'), trigger: 'blur' },
]
,
],
field: [
{ required: true, message: t('fieldPlaceholder'), trigger: 'blur' },
]
,
],
field_total: [
{ required: true, message: t('fieldTotalPlaceholder'), trigger: 'blur' },
]
,
year: [
{ required: true, message: t('yearPlaceholder'), trigger: 'blur' },
]
,
],
year: [{ required: true, message: t('yearPlaceholder'), trigger: 'blur' }],
month: [
{ required: true, message: t('monthPlaceholder'), trigger: 'blur' },
]
,
day: [
{ required: true, message: t('dayPlaceholder'), trigger: 'blur' },
]
,
],
day: [{ required: true, message: t('dayPlaceholder'), trigger: 'blur' }],
start_time: [
{ required: true, message: t('startTimePlaceholder'), trigger: 'blur' },
]
,
],
last_time: [
{ required: true, message: t('lastTimePlaceholder'), trigger: 'blur' },
]
,
],
hour_0: [
{ required: true, message: t('hour0Placeholder'), trigger: 'blur' },
]
,
],
hour_1: [
{ required: true, message: t('hour1Placeholder'), trigger: 'blur' },
]
,
],
hour_2: [
{ required: true, message: t('hour2Placeholder'), trigger: 'blur' },
]
,
],
hour_3: [
{ required: true, message: t('hour3Placeholder'), trigger: 'blur' },
]
,
],
hour_4: [
{ required: true, message: t('hour4Placeholder'), trigger: 'blur' },
]
,
],
hour_5: [
{ required: true, message: t('hour5Placeholder'), trigger: 'blur' },
]
,
],
hour_6: [
{ required: true, message: t('hour6Placeholder'), trigger: 'blur' },
]
,
],
hour_7: [
{ required: true, message: t('hour7Placeholder'), trigger: 'blur' },
]
,
],
hour_8: [
{ required: true, message: t('hour8Placeholder'), trigger: 'blur' },
]
,
],
hour_9: [
{ required: true, message: t('hour9Placeholder'), trigger: 'blur' },
]
,
],
hour_10: [
{ required: true, message: t('hour10Placeholder'), trigger: 'blur' },
]
,
],
hour_11: [
{ required: true, message: t('hour11Placeholder'), trigger: 'blur' },
]
,
],
hour_12: [
{ required: true, message: t('hour12Placeholder'), trigger: 'blur' },
]
,
],
hour_13: [
{ required: true, message: t('hour13Placeholder'), trigger: 'blur' },
]
,
],
hour_14: [
{ required: true, message: t('hour14Placeholder'), trigger: 'blur' },
]
,
],
hour_15: [
{ required: true, message: t('hour15Placeholder'), trigger: 'blur' },
]
,
],
hour_16: [
{ required: true, message: t('hour16Placeholder'), trigger: 'blur' },
]
,
],
hour_17: [
{ required: true, message: t('hour17Placeholder'), trigger: 'blur' },
]
,
],
hour_18: [
{ required: true, message: t('hour18Placeholder'), trigger: 'blur' },
]
,
],
hour_19: [
{ required: true, message: t('hour19Placeholder'), trigger: 'blur' },
]
,
],
hour_20: [
{ required: true, message: t('hour20Placeholder'), trigger: 'blur' },
]
,
],
hour_21: [
{ required: true, message: t('hour21Placeholder'), trigger: 'blur' },
]
,
],
hour_22: [
{ required: true, message: t('hour22Placeholder'), trigger: 'blur' },
]
,
],
hour_23: [
{ required: true, message: t('hour23Placeholder'), trigger: 'blur' },
]
,
],
}
})
@ -376,11 +483,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -389,14 +498,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
const data = await (await getStatHourInfo(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]
})
}
@ -414,7 +522,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -441,7 +554,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

591
admin/src/app/views/stat_hour/stat_hour.vue

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,192 +8,476 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="statHourTable.searchParam" ref="searchFormRef">
<el-card
class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="statHourTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('addon')" prop="addon">
<el-input v-model="statHourTable.searchParam.addon" :placeholder="t('addonPlaceholder')" />
<el-input
v-model="statHourTable.searchParam.addon"
:placeholder="t('addonPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('field')" prop="field">
<el-input v-model="statHourTable.searchParam.field" :placeholder="t('fieldPlaceholder')" />
<el-input
v-model="statHourTable.searchParam.field"
:placeholder="t('fieldPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('fieldTotal')" prop="field_total">
<el-input v-model="statHourTable.searchParam.field_total" :placeholder="t('fieldTotalPlaceholder')" />
<el-input
v-model="statHourTable.searchParam.field_total"
:placeholder="t('fieldTotalPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('year')" prop="year">
<el-input v-model="statHourTable.searchParam.year" :placeholder="t('yearPlaceholder')" />
<el-input
v-model="statHourTable.searchParam.year"
:placeholder="t('yearPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('month')" prop="month">
<el-input v-model="statHourTable.searchParam.month" :placeholder="t('monthPlaceholder')" />
<el-input
v-model="statHourTable.searchParam.month"
:placeholder="t('monthPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('day')" prop="day">
<el-input v-model="statHourTable.searchParam.day" :placeholder="t('dayPlaceholder')" />
<el-input
v-model="statHourTable.searchParam.day"
:placeholder="t('dayPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('startTime')" prop="start_time">
<el-input v-model="statHourTable.searchParam.start_time" :placeholder="t('startTimePlaceholder')" />
<el-input
v-model="statHourTable.searchParam.start_time"
:placeholder="t('startTimePlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('lastTime')" prop="last_time">
<el-input v-model="statHourTable.searchParam.last_time" :placeholder="t('lastTimePlaceholder')" />
<el-input
v-model="statHourTable.searchParam.last_time"
:placeholder="t('lastTimePlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('hour0')" prop="hour_0">
<el-input v-model="statHourTable.searchParam.hour_0" :placeholder="t('hour0Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_0"
:placeholder="t('hour0Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour1')" prop="hour_1">
<el-input v-model="statHourTable.searchParam.hour_1" :placeholder="t('hour1Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_1"
:placeholder="t('hour1Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour2')" prop="hour_2">
<el-input v-model="statHourTable.searchParam.hour_2" :placeholder="t('hour2Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_2"
:placeholder="t('hour2Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour3')" prop="hour_3">
<el-input v-model="statHourTable.searchParam.hour_3" :placeholder="t('hour3Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_3"
:placeholder="t('hour3Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour4')" prop="hour_4">
<el-input v-model="statHourTable.searchParam.hour_4" :placeholder="t('hour4Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_4"
:placeholder="t('hour4Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour5')" prop="hour_5">
<el-input v-model="statHourTable.searchParam.hour_5" :placeholder="t('hour5Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_5"
:placeholder="t('hour5Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour6')" prop="hour_6">
<el-input v-model="statHourTable.searchParam.hour_6" :placeholder="t('hour6Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_6"
:placeholder="t('hour6Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour7')" prop="hour_7">
<el-input v-model="statHourTable.searchParam.hour_7" :placeholder="t('hour7Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_7"
:placeholder="t('hour7Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour8')" prop="hour_8">
<el-input v-model="statHourTable.searchParam.hour_8" :placeholder="t('hour8Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_8"
:placeholder="t('hour8Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour9')" prop="hour_9">
<el-input v-model="statHourTable.searchParam.hour_9" :placeholder="t('hour9Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_9"
:placeholder="t('hour9Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour10')" prop="hour_10">
<el-input v-model="statHourTable.searchParam.hour_10" :placeholder="t('hour10Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_10"
:placeholder="t('hour10Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour11')" prop="hour_11">
<el-input v-model="statHourTable.searchParam.hour_11" :placeholder="t('hour11Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_11"
:placeholder="t('hour11Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour12')" prop="hour_12">
<el-input v-model="statHourTable.searchParam.hour_12" :placeholder="t('hour12Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_12"
:placeholder="t('hour12Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour13')" prop="hour_13">
<el-input v-model="statHourTable.searchParam.hour_13" :placeholder="t('hour13Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_13"
:placeholder="t('hour13Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour14')" prop="hour_14">
<el-input v-model="statHourTable.searchParam.hour_14" :placeholder="t('hour14Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_14"
:placeholder="t('hour14Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour15')" prop="hour_15">
<el-input v-model="statHourTable.searchParam.hour_15" :placeholder="t('hour15Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_15"
:placeholder="t('hour15Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour16')" prop="hour_16">
<el-input v-model="statHourTable.searchParam.hour_16" :placeholder="t('hour16Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_16"
:placeholder="t('hour16Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour17')" prop="hour_17">
<el-input v-model="statHourTable.searchParam.hour_17" :placeholder="t('hour17Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_17"
:placeholder="t('hour17Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour18')" prop="hour_18">
<el-input v-model="statHourTable.searchParam.hour_18" :placeholder="t('hour18Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_18"
:placeholder="t('hour18Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour19')" prop="hour_19">
<el-input v-model="statHourTable.searchParam.hour_19" :placeholder="t('hour19Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_19"
:placeholder="t('hour19Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour20')" prop="hour_20">
<el-input v-model="statHourTable.searchParam.hour_20" :placeholder="t('hour20Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_20"
:placeholder="t('hour20Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour21')" prop="hour_21">
<el-input v-model="statHourTable.searchParam.hour_21" :placeholder="t('hour21Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_21"
:placeholder="t('hour21Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour22')" prop="hour_22">
<el-input v-model="statHourTable.searchParam.hour_22" :placeholder="t('hour22Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_22"
:placeholder="t('hour22Placeholder')"
/>
</el-form-item>
<el-form-item :label="t('hour23')" prop="hour_23">
<el-input v-model="statHourTable.searchParam.hour_23" :placeholder="t('hour23Placeholder')" />
<el-input
v-model="statHourTable.searchParam.hour_23"
:placeholder="t('hour23Placeholder')"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadStatHourList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadStatHourList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="statHourTable.data" size="large" v-loading="statHourTable.loading">
<el-table
:data="statHourTable.data"
size="large"
v-loading="statHourTable.loading"
>
<template #empty>
<span>{{ !statHourTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="addon" :label="t('addon')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="field" :label="t('field')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="field_total" :label="t('fieldTotal')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="year" :label="t('year')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="month" :label="t('month')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="day" :label="t('day')" 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="last_time" :label="t('lastTime')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_0" :label="t('hour0')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_1" :label="t('hour1')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_2" :label="t('hour2')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_3" :label="t('hour3')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_4" :label="t('hour4')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_5" :label="t('hour5')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_6" :label="t('hour6')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_7" :label="t('hour7')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_8" :label="t('hour8')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_9" :label="t('hour9')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_10" :label="t('hour10')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_11" :label="t('hour11')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_12" :label="t('hour12')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_13" :label="t('hour13')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_14" :label="t('hour14')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_15" :label="t('hour15')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_16" :label="t('hour16')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_17" :label="t('hour17')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_18" :label="t('hour18')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_19" :label="t('hour19')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_20" :label="t('hour20')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_21" :label="t('hour21')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_22" :label="t('hour22')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="hour_23" :label="t('hour23')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column
prop="addon"
:label="t('addon')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="field"
:label="t('field')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="field_total"
:label="t('fieldTotal')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="year"
:label="t('year')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="month"
:label="t('month')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="day"
:label="t('day')"
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="last_time"
:label="t('lastTime')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_0"
:label="t('hour0')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_1"
:label="t('hour1')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_2"
:label="t('hour2')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_3"
:label="t('hour3')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_4"
:label="t('hour4')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_5"
:label="t('hour5')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_6"
:label="t('hour6')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_7"
:label="t('hour7')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_8"
:label="t('hour8')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_9"
:label="t('hour9')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_10"
:label="t('hour10')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_11"
:label="t('hour11')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_12"
:label="t('hour12')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_13"
:label="t('hour13')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_14"
:label="t('hour14')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_15"
:label="t('hour15')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_16"
:label="t('hour16')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_17"
:label="t('hour17')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_18"
:label="t('hour18')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_19"
:label="t('hour19')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_20"
:label="t('hour20')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_21"
:label="t('hour21')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_22"
:label="t('hour22')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="hour_23"
:label="t('hour23')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="statHourTable.page" v-model:page-size="statHourTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="statHourTable.total"
@size-change="loadStatHourList()" @current-change="loadStatHourList" />
<el-pagination
v-model:current-page="statHourTable.page"
v-model:page-size="statHourTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="statHourTable.total"
@size-change="loadStatHourList()"
@current-change="loadStatHourList"
/>
</div>
</div>
@ -213,7 +496,7 @@ import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/stat_hour/components/stat-hour-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let statHourTable = reactive({
page: 1,
@ -222,39 +505,39 @@ let statHourTable = reactive({
loading: true,
data: [],
searchParam: {
"addon":"",
"field":"",
"field_total":"",
"year":"",
"month":"",
"day":"",
"start_time":"",
"last_time":"",
"hour_0":"",
"hour_1":"",
"hour_2":"",
"hour_3":"",
"hour_4":"",
"hour_5":"",
"hour_6":"",
"hour_7":"",
"hour_8":"",
"hour_9":"",
"hour_10":"",
"hour_11":"",
"hour_12":"",
"hour_13":"",
"hour_14":"",
"hour_15":"",
"hour_16":"",
"hour_17":"",
"hour_18":"",
"hour_19":"",
"hour_20":"",
"hour_21":"",
"hour_22":"",
"hour_23":""
}
addon: '',
field: '',
field_total: '',
year: '',
month: '',
day: '',
start_time: '',
last_time: '',
hour_0: '',
hour_1: '',
hour_2: '',
hour_3: '',
hour_4: '',
hour_5: '',
hour_6: '',
hour_7: '',
hour_8: '',
hour_9: '',
hour_10: '',
hour_11: '',
hour_12: '',
hour_13: '',
hour_14: '',
hour_15: '',
hour_16: '',
hour_17: '',
hour_18: '',
hour_19: '',
hour_20: '',
hour_21: '',
hour_22: '',
hour_23: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -264,7 +547,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取小时统计列表
*/
@ -275,12 +557,14 @@ const loadStatHourList = (page: number = 1) => {
getStatHourList({
page: statHourTable.page,
limit: statHourTable.limit,
...statHourTable.searchParam
}).then(res => {
...statHourTable.searchParam,
})
.then((res) => {
statHourTable.loading = false
statHourTable.data = res.data.data
statHourTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
statHourTable.loading = false
})
}
@ -309,22 +593,19 @@ const editEvent = (data: any) => {
* 删除小时统计
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('statHourDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('statHourDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteStatHour(id).then(() => {
}).then(() => {
deleteStatHour(id)
.then(() => {
loadStatHourList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

94
admin/src/app/views/student_course_usage/components/student-course-usage-edit.vue

@ -1,26 +1,58 @@
<template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateStudentCourseUsage') : t('addStudentCourseUsage')" 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-dialog
v-model="showDialog"
:title="
formData.id ? t('updateStudentCourseUsage') : t('addStudentCourseUsage')
"
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('studentCourseId')" prop="student_course_id">
<el-input v-model="formData.student_course_id" clearable :placeholder="t('studentCourseIdPlaceholder')" class="input-width" />
<el-input
v-model="formData.student_course_id"
clearable
:placeholder="t('studentCourseIdPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('usedHours')" prop="used_hours">
<el-input v-model="formData.used_hours" clearable :placeholder="t('usedHoursPlaceholder')" class="input-width" />
<el-input
v-model="formData.used_hours"
clearable
:placeholder="t('usedHoursPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('usageDate')" prop="usage_date">
<el-input v-model="formData.usage_date" clearable :placeholder="t('usageDatePlaceholder')" class="input-width" />
<el-input
v-model="formData.usage_date"
clearable
:placeholder="t('usageDatePlaceholder')"
class="input-width"
/>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -31,7 +63,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import { addStudentCourseUsage, editStudentCourseUsage, getStudentCourseUsageInfo } from '@/app/api/student_course_usage'
import {
addStudentCourseUsage,
editStudentCourseUsage,
getStudentCourseUsageInfo,
} from '@/app/api/student_course_usage'
let showDialog = ref(false)
const loading = ref(false)
@ -53,20 +89,18 @@ const formRef = ref<FormInstance>()
const formRules = computed(() => {
return {
student_course_id: [
{ required: true, message: t('studentCourseIdPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('studentCourseIdPlaceholder'),
trigger: 'blur',
},
],
used_hours: [
{ required: true, message: t('usedHoursPlaceholder'), trigger: 'blur' },
]
,
],
usage_date: [
{ required: true, message: t('usageDatePlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -86,11 +120,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -99,14 +135,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
const data = await (await getStudentCourseUsageInfo(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]
})
}
@ -124,7 +159,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -151,7 +191,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

141
admin/src/app/views/student_course_usage/student_course_usage.vue

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,51 +8,108 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="studentCourseUsageTable.searchParam" ref="searchFormRef">
<el-card
class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="studentCourseUsageTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('studentCourseId')" prop="student_course_id">
<el-input v-model="studentCourseUsageTable.searchParam.student_course_id" :placeholder="t('studentCourseIdPlaceholder')" />
<el-input
v-model="studentCourseUsageTable.searchParam.student_course_id"
:placeholder="t('studentCourseIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('usedHours')" prop="used_hours">
<el-input v-model="studentCourseUsageTable.searchParam.used_hours" :placeholder="t('usedHoursPlaceholder')" />
<el-input
v-model="studentCourseUsageTable.searchParam.used_hours"
:placeholder="t('usedHoursPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('usageDate')" prop="usage_date">
<el-input v-model="studentCourseUsageTable.searchParam.usage_date" :placeholder="t('usageDatePlaceholder')" />
<el-input
v-model="studentCourseUsageTable.searchParam.usage_date"
:placeholder="t('usageDatePlaceholder')"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadStudentCourseUsageList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadStudentCourseUsageList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="studentCourseUsageTable.data" size="large" v-loading="studentCourseUsageTable.loading">
<el-table
:data="studentCourseUsageTable.data"
size="large"
v-loading="studentCourseUsageTable.loading"
>
<template #empty>
<span>{{ !studentCourseUsageTable.loading ? t('emptyData') : '' }}</span>
<span>{{
!studentCourseUsageTable.loading ? t('emptyData') : ''
}}</span>
</template>
<el-table-column prop="student_course_id" :label="t('studentCourseId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="used_hours" :label="t('usedHours')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="usage_date" :label="t('usageDate')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column
prop="student_course_id"
:label="t('studentCourseId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="used_hours"
:label="t('usedHours')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="usage_date"
:label="t('usageDate')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="studentCourseUsageTable.page" v-model:page-size="studentCourseUsageTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="studentCourseUsageTable.total"
@size-change="loadStudentCourseUsageList()" @current-change="loadStudentCourseUsageList" />
<el-pagination
v-model:current-page="studentCourseUsageTable.page"
v-model:page-size="studentCourseUsageTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="studentCourseUsageTable.total"
@size-change="loadStudentCourseUsageList()"
@current-change="loadStudentCourseUsageList"
/>
</div>
</div>
<edit ref="editStudentCourseUsageDialog" @complete="loadStudentCourseUsageList" />
<edit
ref="editStudentCourseUsageDialog"
@complete="loadStudentCourseUsageList"
/>
</el-card>
</div>
</template>
@ -62,13 +118,16 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getStudentCourseUsageList, deleteStudentCourseUsage } from '@/app/api/student_course_usage'
import {
getStudentCourseUsageList,
deleteStudentCourseUsage,
} from '@/app/api/student_course_usage'
import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/student_course_usage/components/student-course-usage-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let studentCourseUsageTable = reactive({
page: 1,
@ -77,10 +136,10 @@ let studentCourseUsageTable = reactive({
loading: true,
data: [],
searchParam: {
"student_course_id":"",
"used_hours":"",
"usage_date":""
}
student_course_id: '',
used_hours: '',
usage_date: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -90,7 +149,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取学员课时消费记录列表
*/
@ -101,12 +159,14 @@ const loadStudentCourseUsageList = (page: number = 1) => {
getStudentCourseUsageList({
page: studentCourseUsageTable.page,
limit: studentCourseUsageTable.limit,
...studentCourseUsageTable.searchParam
}).then(res => {
...studentCourseUsageTable.searchParam,
})
.then((res) => {
studentCourseUsageTable.loading = false
studentCourseUsageTable.data = res.data.data
studentCourseUsageTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
studentCourseUsageTable.loading = false
})
}
@ -135,22 +195,19 @@ const editEvent = (data: any) => {
* 删除学员课时消费记录
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('studentCourseUsageDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('studentCourseUsageDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteStudentCourseUsage(id).then(() => {
}).then(() => {
deleteStudentCourseUsage(id)
.then(() => {
loadStudentCourseUsageList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

119
admin/src/app/views/student_courses/components/student-courses-edit.vue

@ -1,38 +1,83 @@
<template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateStudentCourses') : t('addStudentCourses')" 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-dialog
v-model="showDialog"
:title="formData.id ? t('updateStudentCourses') : t('addStudentCourses')"
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('studentId')" prop="student_id">
<el-input v-model="formData.student_id" clearable :placeholder="t('studentIdPlaceholder')" class="input-width" />
<el-input
v-model="formData.student_id"
clearable
:placeholder="t('studentIdPlaceholder')"
class="input-width"
/>
</el-form-item>
<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 :label="t('totalHours')" prop="total_hours">
<el-input v-model="formData.total_hours" clearable :placeholder="t('totalHoursPlaceholder')" class="input-width" />
<el-input
v-model="formData.total_hours"
clearable
:placeholder="t('totalHoursPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('giftHours')">
<el-input v-model="formData.gift_hours" clearable :placeholder="t('giftHoursPlaceholder')" class="input-width" />
<el-input
v-model="formData.gift_hours"
clearable
:placeholder="t('giftHoursPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('startDate')" prop="start_date">
<el-input v-model="formData.start_date" clearable :placeholder="t('startDatePlaceholder')" class="input-width" />
<el-input
v-model="formData.start_date"
clearable
:placeholder="t('startDatePlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('endDate')" prop="end_date">
<el-input v-model="formData.end_date" clearable :placeholder="t('endDatePlaceholder')" class="input-width" />
<el-input
v-model="formData.end_date"
clearable
:placeholder="t('endDatePlaceholder')"
class="input-width"
/>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -43,7 +88,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import { addStudentCourses, editStudentCourses, getStudentCoursesInfo } from '@/app/api/student_courses'
import {
addStudentCourses,
editStudentCourses,
getStudentCoursesInfo,
} from '@/app/api/student_courses'
let showDialog = ref(false)
const loading = ref(false)
@ -69,34 +118,22 @@ const formRules = computed(() => {
return {
student_id: [
{ required: true, message: t('studentIdPlaceholder'), trigger: 'blur' },
]
,
],
course_id: [
{ required: true, message: t('courseIdPlaceholder'), trigger: 'blur' },
]
,
],
total_hours: [
{ required: true, message: t('totalHoursPlaceholder'), trigger: 'blur' },
]
,
],
gift_hours: [
{ required: true, message: t('giftHoursPlaceholder'), trigger: 'blur' },
]
,
],
start_date: [
{ required: true, message: t('startDatePlaceholder'), trigger: 'blur' },
]
,
],
end_date: [
{ required: true, message: t('endDatePlaceholder'), trigger: 'blur' },
]
,
],
}
})
@ -116,11 +153,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -129,14 +168,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
const data = await (await getStudentCoursesInfo(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]
})
}
@ -154,7 +192,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -181,7 +224,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

172
admin/src/app/views/student_courses/student_courses.vue

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,62 +8,140 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="studentCoursesTable.searchParam" ref="searchFormRef">
<el-card
class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="studentCoursesTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('studentId')" prop="student_id">
<el-input v-model="studentCoursesTable.searchParam.student_id" :placeholder="t('studentIdPlaceholder')" />
<el-input
v-model="studentCoursesTable.searchParam.student_id"
:placeholder="t('studentIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('courseId')" prop="course_id">
<el-input v-model="studentCoursesTable.searchParam.course_id" :placeholder="t('courseIdPlaceholder')" />
<el-input
v-model="studentCoursesTable.searchParam.course_id"
:placeholder="t('courseIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('totalHours')" prop="total_hours">
<el-input v-model="studentCoursesTable.searchParam.total_hours" :placeholder="t('totalHoursPlaceholder')" />
<el-input
v-model="studentCoursesTable.searchParam.total_hours"
:placeholder="t('totalHoursPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('giftHours')" prop="gift_hours">
<el-input v-model="studentCoursesTable.searchParam.gift_hours" :placeholder="t('giftHoursPlaceholder')" />
<el-input
v-model="studentCoursesTable.searchParam.gift_hours"
:placeholder="t('giftHoursPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('startDate')" prop="start_date">
<el-input v-model="studentCoursesTable.searchParam.start_date" :placeholder="t('startDatePlaceholder')" />
<el-input
v-model="studentCoursesTable.searchParam.start_date"
:placeholder="t('startDatePlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('endDate')" prop="end_date">
<el-input v-model="studentCoursesTable.searchParam.end_date" :placeholder="t('endDatePlaceholder')" />
<el-input
v-model="studentCoursesTable.searchParam.end_date"
:placeholder="t('endDatePlaceholder')"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadStudentCoursesList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadStudentCoursesList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="studentCoursesTable.data" size="large" v-loading="studentCoursesTable.loading">
<el-table
:data="studentCoursesTable.data"
size="large"
v-loading="studentCoursesTable.loading"
>
<template #empty>
<span>{{ !studentCoursesTable.loading ? t('emptyData') : '' }}</span>
<span>{{
!studentCoursesTable.loading ? t('emptyData') : ''
}}</span>
</template>
<el-table-column prop="student_id" :label="t('studentId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="student_id"
:label="t('studentId')"
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="total_hours" :label="t('totalHours')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="total_hours"
:label="t('totalHours')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="gift_hours" :label="t('giftHours')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="gift_hours"
:label="t('giftHours')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="start_date" :label="t('startDate')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="start_date"
:label="t('startDate')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column prop="end_date" :label="t('endDate')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column
prop="end_date"
:label="t('endDate')"
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 }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="studentCoursesTable.page" v-model:page-size="studentCoursesTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="studentCoursesTable.total"
@size-change="loadStudentCoursesList()" @current-change="loadStudentCoursesList" />
<el-pagination
v-model:current-page="studentCoursesTable.page"
v-model:page-size="studentCoursesTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="studentCoursesTable.total"
@size-change="loadStudentCoursesList()"
@current-change="loadStudentCoursesList"
/>
</div>
</div>
@ -77,13 +154,16 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getStudentCoursesList, deleteStudentCourses } from '@/app/api/student_courses'
import {
getStudentCoursesList,
deleteStudentCourses,
} from '@/app/api/student_courses'
import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/student_courses/components/student-courses-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let studentCoursesTable = reactive({
page: 1,
@ -92,13 +172,13 @@ let studentCoursesTable = reactive({
loading: true,
data: [],
searchParam: {
"student_id":"",
"course_id":"",
"total_hours":"",
"gift_hours":"",
"start_date":"",
"end_date":""
}
student_id: '',
course_id: '',
total_hours: '',
gift_hours: '',
start_date: '',
end_date: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -108,7 +188,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取学员课程列表
*/
@ -119,12 +198,14 @@ const loadStudentCoursesList = (page: number = 1) => {
getStudentCoursesList({
page: studentCoursesTable.page,
limit: studentCoursesTable.limit,
...studentCoursesTable.searchParam
}).then(res => {
...studentCoursesTable.searchParam,
})
.then((res) => {
studentCoursesTable.loading = false
studentCoursesTable.data = res.data.data
studentCoursesTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
studentCoursesTable.loading = false
})
}
@ -153,22 +234,19 @@ const editEvent = (data: any) => {
* 删除学员课程
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('studentCoursesDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('studentCoursesDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteStudentCourses(id).then(() => {
}).then(() => {
deleteStudentCourses(id)
.then(() => {
loadStudentCoursesList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

98
admin/src/app/views/user_feedback/components/user-feedback-edit.vue

@ -1,26 +1,56 @@
<template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateUserFeedback') : t('addUserFeedback')" 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-dialog
v-model="showDialog"
:title="formData.id ? t('updateUserFeedback') : t('addUserFeedback')"
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('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 :label="t('feedbackText')" prop="feedback_text">
<el-input v-model="formData.feedback_text" clearable :placeholder="t('feedbackTextPlaceholder')" class="input-width" />
<el-input
v-model="formData.feedback_text"
clearable
:placeholder="t('feedbackTextPlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('attachmentUrl')">
<el-input v-model="formData.attachment_url" clearable :placeholder="t('attachmentUrlPlaceholder')" class="input-width" />
<el-input
v-model="formData.attachment_url"
clearable
:placeholder="t('attachmentUrlPlaceholder')"
class="input-width"
/>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -31,7 +61,11 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import { addUserFeedback, editUserFeedback, getUserFeedbackInfo } from '@/app/api/user_feedback'
import {
addUserFeedback,
editUserFeedback,
getUserFeedbackInfo,
} from '@/app/api/user_feedback'
let showDialog = ref(false)
const loading = ref(false)
@ -54,19 +88,21 @@ const formRules = computed(() => {
return {
user_id: [
{ required: true, message: t('userIdPlaceholder'), trigger: 'blur' },
]
,
],
feedback_text: [
{ required: true, message: t('feedbackTextPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('feedbackTextPlaceholder'),
trigger: 'blur',
},
],
attachment_url: [
{ required: true, message: t('attachmentUrlPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('attachmentUrlPlaceholder'),
trigger: 'blur',
},
],
}
})
@ -86,11 +122,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -99,14 +137,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
const data = await (await getUserFeedbackInfo(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]
})
}
@ -124,7 +161,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -151,7 +193,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

132
admin/src/app/views/user_feedback/user_feedback.vue

@ -1,7 +1,6 @@
<template>
<div class="main-container">
<el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addEvent">
@ -9,47 +8,99 @@
</el-button>
</div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="userFeedbackTable.searchParam" ref="searchFormRef">
<el-card
class="box-card !border-none my-[10px] table-search-wrap"
shadow="never"
>
<el-form
:inline="true"
:model="userFeedbackTable.searchParam"
ref="searchFormRef"
>
<el-form-item :label="t('userId')" prop="user_id">
<el-input v-model="userFeedbackTable.searchParam.user_id" :placeholder="t('userIdPlaceholder')" />
<el-input
v-model="userFeedbackTable.searchParam.user_id"
:placeholder="t('userIdPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('feedbackText')" prop="feedback_text">
<el-input v-model="userFeedbackTable.searchParam.feedback_text" :placeholder="t('feedbackTextPlaceholder')" />
<el-input
v-model="userFeedbackTable.searchParam.feedback_text"
:placeholder="t('feedbackTextPlaceholder')"
/>
</el-form-item>
<el-form-item :label="t('attachmentUrl')" prop="attachment_url">
<el-input v-model="userFeedbackTable.searchParam.attachment_url" :placeholder="t('attachmentUrlPlaceholder')" />
<el-input
v-model="userFeedbackTable.searchParam.attachment_url"
:placeholder="t('attachmentUrlPlaceholder')"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadUserFeedbackList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
<el-button type="primary" @click="loadUserFeedbackList()">{{
t('search')
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{
t('reset')
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="userFeedbackTable.data" size="large" v-loading="userFeedbackTable.loading">
<el-table
:data="userFeedbackTable.data"
size="large"
v-loading="userFeedbackTable.loading"
>
<template #empty>
<span>{{ !userFeedbackTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="user_id" :label="t('userId')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="feedback_text" :label="t('feedbackText')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="attachment_url" :label="t('attachmentUrl')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column
prop="user_id"
:label="t('userId')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="feedback_text"
:label="t('feedbackText')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="attachment_url"
:label="t('attachmentUrl')"
min-width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
:label="t('operation')"
fixed="right"
min-width="120"
>
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="editEvent(row)">{{
t('edit')
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{
t('delete')
}}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="userFeedbackTable.page" v-model:page-size="userFeedbackTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="userFeedbackTable.total"
@size-change="loadUserFeedbackList()" @current-change="loadUserFeedbackList" />
<el-pagination
v-model:current-page="userFeedbackTable.page"
v-model:page-size="userFeedbackTable.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="userFeedbackTable.total"
@size-change="loadUserFeedbackList()"
@current-change="loadUserFeedbackList"
/>
</div>
</div>
@ -62,13 +113,16 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getUserFeedbackList, deleteUserFeedback } from '@/app/api/user_feedback'
import {
getUserFeedbackList,
deleteUserFeedback,
} from '@/app/api/user_feedback'
import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/user_feedback/components/user-feedback-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
const pageName = route.meta.title
let userFeedbackTable = reactive({
page: 1,
@ -77,10 +131,10 @@ let userFeedbackTable = reactive({
loading: true,
data: [],
searchParam: {
"user_id":"",
"feedback_text":"",
"attachment_url":""
}
user_id: '',
feedback_text: '',
attachment_url: '',
},
})
const searchFormRef = ref<FormInstance>()
@ -90,7 +144,6 @@ const selectData = ref<any[]>([])
//
/**
* 获取用户反馈信息列表
*/
@ -101,12 +154,14 @@ const loadUserFeedbackList = (page: number = 1) => {
getUserFeedbackList({
page: userFeedbackTable.page,
limit: userFeedbackTable.limit,
...userFeedbackTable.searchParam
}).then(res => {
...userFeedbackTable.searchParam,
})
.then((res) => {
userFeedbackTable.loading = false
userFeedbackTable.data = res.data.data
userFeedbackTable.total = res.data.total
}).catch(() => {
})
.catch(() => {
userFeedbackTable.loading = false
})
}
@ -135,22 +190,19 @@ const editEvent = (data: any) => {
* 删除用户反馈信息
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('userFeedbackDeleteTips'), t('warning'),
{
ElMessageBox.confirm(t('userFeedbackDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteUserFeedback(id).then(() => {
}).then(() => {
deleteUserFeedback(id)
.then(() => {
loadUserFeedbackList()
}).catch(() => {
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()

227
admin/src/app/views/venue/components/venue-edit.vue

@ -1,46 +1,110 @@
<template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateVenue') : t('addVenue')" 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-dialog
v-model="showDialog"
:title="formData.id ? t('updateVenue') : t('addVenue')"
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-input v-model="formData.campus_id" clearable :placeholder="t('campusIdPlaceholder')" class="input-width" />
<el-select
class="input-width"
v-model="formData.campus_id"
clearable
:placeholder="t('campusIdPlaceholder')"
>
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in campusIdList"
:key="index"
:label="item['campus_name']"
:value="item['id']"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('venueName')" prop="venue_name">
<el-input v-model="formData.venue_name" clearable :placeholder="t('venueNamePlaceholder')" class="input-width" />
<el-input
v-model="formData.venue_name"
clearable
:placeholder="t('venueNamePlaceholder')"
class="input-width"
/>
</el-form-item>
<el-form-item :label="t('capacity')" prop="capacity">
<el-input v-model="formData.capacity" clearable :placeholder="t('capacityPlaceholder')" class="input-width" />
<el-input-number
v-model="formData.capacity"
clearable
:placeholder="t('capacityPlaceholder')"
class="input-width"
:min="1"
max="500"
/>
</el-form-item>
<el-form-item :label="t('availabilityStatus')" prop="availability_status">
<el-input v-model="formData.availability_status" clearable :placeholder="t('availabilityStatusPlaceholder')" class="input-width" />
<el-radio-group
v-model="formData.availability_status"
:placeholder="t('availabilityStatusPlaceholder')"
>
<!-- <el-radio-->
<!-- v-for="(item, index) in availability_statusList"-->
<!-- :key="index"-->
<!-- :label="item.value"-->
<!-- >-->
<!-- {{ item.name }}-->
<!-- </el-radio>-->
<el-radio label="1">可用</el-radio>
<el-radio label="2">不可用</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="t('timeRangeType')" prop="time_range_type">
<el-input v-model="formData.time_range_type" clearable :placeholder="t('timeRangeTypePlaceholder')" class="input-width" />
<el-radio-group
v-model="formData.time_range_type"
:placeholder="t('timeRangeTypePlaceholder')"
>
<el-radio
v-for="(item, index) in time_range_typeList"
:key="index"
:label="item.value"
>
{{ item.name }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="t('timeRangeStart')" >
<el-input v-model="formData.time_range_start" clearable :placeholder="t('timeRangeStartPlaceholder')" class="input-width" />
<el-form-item :label="t('fixedTimeRanges')" class="input-width">
<el-date-picker
class="flex-1 !flex"
v-model="formData.fixed_time_ranges"
clearable
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="t('fixedTimeRangesPlaceholder')"
>
</el-date-picker>
</el-form-item>
<el-form-item :label="t('timeRangeEnd')" >
<el-input v-model="formData.time_range_end" clearable :placeholder="t('timeRangeEndPlaceholder')" class="input-width" />
</el-form-item>
<el-form-item :label="t('fixedTimeRanges')" >
<el-input v-model="formData.fixed_time_ranges" clearable :placeholder="t('fixedTimeRangesPlaceholder')" class="input-width" />
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
t('confirm')
}}</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>{{ t('confirm') }}</el-button
>
</span>
</template>
</el-dialog>
@ -51,7 +115,12 @@ import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import { addVenue, editVenue, getVenueInfo } from '@/app/api/venue'
import {
addVenue,
editVenue,
getVenueInfo,
getWithCampusList,
} from '@/app/api/venue'
let showDialog = ref(false)
const loading = ref(false)
@ -66,8 +135,6 @@ const initialFormData = {
capacity: '',
availability_status: '',
time_range_type: '',
time_range_start: '',
time_range_end: '',
fixed_time_ranges: '',
}
const formData: Record<string, any> = reactive({ ...initialFormData })
@ -79,44 +146,43 @@ const formRules = computed(() => {
return {
campus_id: [
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' },
]
,
],
venue_name: [
{ required: true, message: t('venueNamePlaceholder'), trigger: 'blur' },
]
,
],
capacity: [
{ required: true, message: t('capacityPlaceholder'), trigger: 'blur' },
]
,
{
validator: (rule: any, value: string, callback: any) => {
if (value && !/^\d{1,500}$/.test(value)) {
callback(new Error(t('generateBetween')))
} else {
callback()
}
},
},
],
availability_status: [
{ required: true, message: t('availabilityStatusPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('availabilityStatusPlaceholder'),
trigger: 'blur',
},
],
time_range_type: [
{ required: true, message: t('timeRangeTypePlaceholder'), trigger: 'blur' },
]
,
time_range_start: [
{ required: true, message: t('timeRangeStartPlaceholder'), trigger: 'blur' },
]
,
time_range_end: [
{ required: true, message: t('timeRangeEndPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('timeRangeTypePlaceholder'),
trigger: 'blur',
},
],
fixed_time_ranges: [
{ required: true, message: t('fixedTimeRangesPlaceholder'), trigger: 'blur' },
]
,
{
required: true,
message: t('fixedTimeRangesPlaceholder'),
trigger: 'blur',
},
],
}
})
@ -136,11 +202,13 @@ const confirm = async (formEl: FormInstance | undefined) => {
let data = formData
save(data).then(res => {
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
})
.catch((err) => {
loading.value = false
})
}
@ -148,15 +216,45 @@ const confirm = async (formEl: FormInstance | undefined) => {
}
//
let availability_statusList = ref([])
const availability_statusDictList = async () => {
availability_statusList.value = await (
await useDictionary('SiteStatus')
).data.dictionary
}
availability_statusDictList()
watch(
() => availability_statusList.value,
() => {
formData.availability_status = availability_statusList.value[0].value
}
)
let time_range_typeList = ref([])
const time_range_typeDictList = async () => {
time_range_typeList.value = await (
await useDictionary('ALLOTTED_TIME')
).data.dictionary
}
time_range_typeDictList()
watch(
() => time_range_typeList.value,
() => {
formData.time_range_type = time_range_typeList.value[0].value
}
)
const campusIdList = ref([] as any[])
const setCampusIdList = async () => {
campusIdList.value = await (await getWithCampusList({})).data
}
setCampusIdList()
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
const data = await (await getVenueInfo(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]
})
}
@ -174,7 +272,12 @@ const mobileVerify = (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')))
} else {
callback()
@ -201,7 +304,7 @@ const numberVerify = (rule: any, value: any, callback: any) => {
defineExpose({
showDialog,
setFormData
setFormData,
})
</script>

100
admin/src/app/views/venue/venue.vue

@ -11,30 +11,57 @@
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="venueTable.searchParam" ref="searchFormRef">
<el-form-item :label="t('campusId')" prop="campus_id">
<el-input v-model="venueTable.searchParam.campus_id" :placeholder="t('campusIdPlaceholder')" />
<el-select class="w-[280px]" v-model="venueTable.searchParam.campus_id" clearable :placeholder="t('campusIdPlaceholder')">
<el-option
v-for="(item, index) in campusIdList"
:key="index"
:label="item['campus_name']"
:value="item['id']"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('venueName')" prop="venue_name">
<el-input v-model="venueTable.searchParam.venue_name" :placeholder="t('venueNamePlaceholder')" />
</el-form-item>
<el-form-item :label="t('capacity')" prop="capacity">
<el-input v-model="venueTable.searchParam.capacity" :placeholder="t('capacityPlaceholder')" />
</el-form-item>
<el-form-item :label="t('availabilityStatus')" prop="availability_status">
<el-input v-model="venueTable.searchParam.availability_status" :placeholder="t('availabilityStatusPlaceholder')" />
<el-select class="w-[280px]" v-model="venueTable.searchParam.availability_status" clearable :placeholder="t('availabilityStatusPlaceholder')">
<el-option label="全部" value=""></el-option>
<el-option
v-for="(item, index) in availability_statusList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('timeRangeType')" prop="time_range_type">
<el-input v-model="venueTable.searchParam.time_range_type" :placeholder="t('timeRangeTypePlaceholder')" />
<el-select class="w-[280px]" v-model="venueTable.searchParam.time_range_type" clearable :placeholder="t('timeRangeTypePlaceholder')">
<el-option label="全部" value=""></el-option>
<el-option
v-for="(item, index) in time_range_typeList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('timeRangeStart')" prop="time_range_start">
<el-input v-model="venueTable.searchParam.time_range_start" :placeholder="t('timeRangeStartPlaceholder')" />
</el-form-item>
<el-form-item :label="t('timeRangeEnd')" prop="time_range_end">
<el-input v-model="venueTable.searchParam.time_range_end" :placeholder="t('timeRangeEndPlaceholder')" />
<el-form-item :label="t('createdAt')" prop="created_at">
<el-date-picker v-model="venueTable.searchParam.created_at" type="datetimerange" format="YYYY-MM-DD hh:mm:ss"
:start-placeholder="t('startDate')" :end-placeholder="t('endDate')" />
</el-form-item>
<el-form-item :label="t('fixedTimeRanges')" prop="fixed_time_ranges">
<el-input v-model="venueTable.searchParam.fixed_time_ranges" :placeholder="t('fixedTimeRangesPlaceholder')" />
<el-form-item :label="t('updatedAt')" prop="updated_at">
<el-date-picker v-model="venueTable.searchParam.updated_at" type="datetimerange" format="YYYY-MM-DD hh:mm:ss"
:start-placeholder="t('startDate')" :end-placeholder="t('endDate')" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadVenueList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
@ -47,21 +74,31 @@
<template #empty>
<span>{{ !venueTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column prop="campus_id" :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="venue_name" :label="t('venueName')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="capacity" :label="t('capacity')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="availability_status" :label="t('availabilityStatus')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column prop="time_range_type" :label="t('timeRangeType')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column :label="t('availabilityStatus')" min-width="180" align="center" :show-overflow-tooltip="true">
<template #default="{ row }">
<div v-for="(item, index) in availability_statusList">
<div v-if="item.value == row.availability_status">{{ item.name }}</div>
</div>
</template>
</el-table-column>
<el-table-column prop="time_range_start" :label="t('timeRangeStart')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column :label="t('timeRangeType')" min-width="180" align="center" :show-overflow-tooltip="true">
<template #default="{ row }">
<div v-for="(item, index) in time_range_typeList">
<div v-if="item.value == row.time_range_type">{{ item.name }}</div>
</div>
</template>
</el-table-column>
<el-table-column prop="time_range_end" :label="t('timeRangeEnd')" 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="fixed_time_ranges" :label="t('fixedTimeRanges')" 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 }">
@ -87,7 +124,7 @@
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getVenueList, deleteVenue } from '@/app/api/venue'
import { getVenueList, deleteVenue, getWithCampusList } from '@/app/api/venue'
import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/venue/components/venue-edit.vue'
@ -107,9 +144,8 @@ let venueTable = reactive({
"capacity":"",
"availability_status":"",
"time_range_type":"",
"time_range_start":"",
"time_range_end":"",
"fixed_time_ranges":""
"created_at":"",
"updated_at":""
}
})
@ -119,7 +155,16 @@ const searchFormRef = ref<FormInstance>()
const selectData = ref<any[]>([])
//
const availability_statusList = ref([] as any[])
const availability_statusDictList = async () => {
availability_statusList.value = await (await useDictionary('SiteStatus')).data.dictionary
}
availability_statusDictList();
const time_range_typeList = ref([] as any[])
const time_range_typeDictList = async () => {
time_range_typeList.value = await (await useDictionary('ALLOTTED_TIME')).data.dictionary
}
time_range_typeDictList();
/**
* 获取场地列表
@ -180,6 +225,11 @@ const deleteEvent = (id: number) => {
}
const campusIdList = ref([])
const setCampusIdList = async () => {
campusIdList.value = await (await getWithCampusList({})).data
}
setCampusIdList()
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return

22
admin/src/app/views/yjpz_config/yjpz_config.vue

@ -15,31 +15,29 @@
:label="day.label"
:prop="`priceRules.${day.key}`"
>
<span style="margin: 0 8px;">每个</span>
<span style="margin: 0 8px">每个</span>
<el-input
v-model.number="formData.priceRules[day.key].basePrice"
placeholder="请输入"
class="input-width"
clearable
/>
<span style="margin: 0 8px;"> 超过</span>
<span style="margin: 0 8px"> 超过</span>
<el-input
v-model.number="formData.priceRules[day.key].limitCount"
placeholder="请输入"
class="input-width"
clearable
/>
<span style="margin: 0 8px;"></span>
<span style="margin: 0 8px"></span>
<el-input
v-model.number="formData.priceRules[day.key].extraPrice"
placeholder="请输入"
class="input-width"
clearable
/>
<span style="margin-left: 4px;"></span>
<span style="margin-left: 4px"></span>
</el-form-item>
</el-form>
</el-card>
@ -57,7 +55,6 @@ import { t } from '@/lang'
import { FormInstance, FormRules } from 'element-plus'
import { yjpzConfig, getYjpzConfig } from '@/app/api/sys'
const loading = ref(true)
const formData = reactive({
priceRules: {
@ -68,7 +65,7 @@ const formData = reactive({
fri: { basePrice: 0, limitCount: 0, extraPrice: 0 },
sat: { basePrice: 0, limitCount: 0, extraPrice: 0 },
sun: { basePrice: 0, limitCount: 0, extraPrice: 0 },
}
},
})
const weekDays = [
@ -83,25 +80,22 @@ const weekDays = [
const formRules = reactive<FormRules>({})
const setFormData = async () => {
const data = await (await getYjpzConfig()).data
formData['priceRules'] = data;
formData['priceRules'] = data
loading.value = false
}
setFormData();
setFormData()
const onSave = async () => {
yjpzConfig(formData)
.then(() => {
loading.value = true
setFormData();
setFormData()
})
.catch(() => {
loading.value = false
})
}
</script>
<style lang="scss" scoped></style>

364
admin/src/components/TencentMapPicker.vue

@ -1,12 +1,19 @@
<template>
<el-dialog
v-model="dialogVisible"
:title="t('mapPickerTitle')"
title="位置选择"
width="800px"
:before-close="handleClose"
:close-on-click-modal="false"
:close-on-press-escape="false"
:show-close="false"
>
<div class="map-container" id="container"></div>
<div class="map-container" id="container">
<div
v-if="!props.modelValue.lat || !props.modelValue.lng"
class="map-placeholder"
></div>
</div>
<div class="address-search">
<el-select
v-model="province"
@ -46,11 +53,13 @@
:value="item.id"
/>
</el-select>
<el-input
v-model="detailAddress"
:placeholder="t('detailAddressPlaceholder')"
/>
<el-button type="primary" @click="handleAddressSearch">{{ t('search') }}</el-button>
<el-input v-model="detailAddress" placeholder="输入地区" />
<el-button
type="primary"
@click="handleAddressSearch"
:disabled="!province || !city || !district"
>{{ t('search') }}</el-button
>
</div>
<template #footer>
<span class="dialog-footer">
@ -64,11 +73,13 @@
</template>
<script lang="ts" setup>
import { ref, onMounted, watch } from 'vue'
import { getAreaListByPid, getAreaByCode } from '@/app/api/sys'
import { createMarker, latLngToAddress, addressToLatLng } from '@/utils/qqmap'
import { ref, onMounted, watch, computed, nextTick, onBeforeUnmount } from 'vue'
import { ElMessage } from 'element-plus'
import { getAreaListByPid } from '@/app/api/sys'
import { createMarker, addressToLatLng } from '@/utils/qqmap'
import { t } from '@/lang'
// ====================== Props ======================
const props = defineProps({
modelValue: {
type: Object,
@ -78,62 +89,263 @@ const props = defineProps({
address: '',
}),
},
placeholder: {
type: String,
default: t('mapPickerPlaceholder'),
},
visible: {
type: Boolean,
default: false,
},
})
const emit = defineEmits(['update:visible', 'update:modelValue', 'confirm'])
// ====================== ======================
const dialogVisible = computed({
get() {
return props.visible
},
set(value) {
emit('update:visible', value)
},
})
const emit = defineEmits(['update:modelValue', 'confirm'])
//
let map: any = null
let marker: any = null
const mapKey = ref('YOUR_API_KEY') // API Key
let mapScript: HTMLScriptElement | null = null
let resizeTimer: number | null = null
//
const province = ref('')
const city = ref('')
const district = ref('')
const detailAddress = ref('')
const provinceList = ref<any[]>([])
const cityList = ref<any[]>([])
const districtList = ref<any[]>([])
// ====================== ======================
onMounted(() => {
// SDK
const preloadScript = document.createElement('script')
preloadScript.src = `https://map.qq.com/api/gljs?key= ${mapKey.value}`
document.head.appendChild(preloadScript)
})
// ====================== ======================
watch(
dialogVisible,
async (newVal) => {
if (newVal) {
try {
//
cleanupMap()
// DOM
await nextTick()
//
const container = document.getElementById('container')
if (!container) throw new Error('地图容器未找到')
// SDK
await loadMapSDK()
//
initMap()
//
const res = await getAreaListByPid(0)
provinceList.value = res.data
//
if (props.modelValue.address) {
await parseAndSetAddress(props.modelValue.address)
}
const dialogVisible = ref(false)
// resize
bindResizeListener()
} catch (error) {
handleError(error)
}
} else {
cleanupMap()
}
},
{ immediate: true }
)
// ====================== ======================
const handleClose = (done: () => void) => {
done()
}
const handleConfirm = () => {
if (!props.modelValue.lat || !props.modelValue.lng) {
ElMessage.warning(t('mapPickerWarning'))
return
}
//
const provinceName = province.value
? provinceList.value.find((p) => p.id === province.value)?.name || ''
: ''
const cityName = city.value
? cityList.value.find((c) => c.id === city.value)?.name || ''
: ''
const districtName = district.value
? districtList.value.find((d) => d.id === district.value)?.name || ''
: ''
const fullAddress = `${provinceName}${cityName}${districtName}${detailAddress.value}`
emit('confirm', {
lat: props.modelValue.lat,
lng: props.modelValue.lng,
address: detailAddress.value
address: fullAddress,
})
dialogVisible.value = false
}
//
let map: any
let marker: any
const mapKey = ref('')
//
const parseAndSetAddress = async (address: string) => {
//
const { provinceName, cityName, districtName, detail } = parseAddress(address)
detailAddress.value = detail
//
const province = ref('')
const city = ref('')
const district = ref('')
const detailAddress = ref('')
const provinceList = ref<any[]>([])
const cityList = ref<any[]>([])
const districtList = ref<any[]>([])
// 1.
if (provinceName) {
const provinceItem = provinceList.value.find((p) =>
p.name.includes(provinceName)
)
if (provinceItem) {
province.value = provinceItem.id
//
onMounted(() => {
const mapScript = document.createElement('script')
mapKey.value = 'IZQBZ-3UHEU-WTCVD-2464U-I5N4V-ZFFU3'
// 2.
const cityRes = await getAreaListByPid(province.value)
cityList.value = cityRes.data
if (cityName) {
const cityItem = cityList.value.find((c) => c.name.includes(cityName))
if (cityItem) {
city.value = cityItem.id
// 3.
const districtRes = await getAreaListByPid(city.value)
districtList.value = districtRes.data
if (districtName) {
const districtItem = districtList.value.find((d) =>
d.name.includes(districtName)
)
if (districtItem) {
district.value = districtItem.id
}
}
}
}
}
}
//
handleAddressSearch()
}
//
const parseAddress = (address: string) => {
let provinceName = ''
let cityName = ''
let districtName = ''
let detail = address
// //
const provinceMatch = address.match(/^([^省市自治区]+[省市区]|[^市]+市)/)
if (provinceMatch) {
provinceName = provinceMatch[0]
detail = address.slice(provinceName.length)
}
//
const cityMatch = detail.match(/^([^市区]+市)/)
if (cityMatch) {
cityName = cityMatch[0]
detail = detail.slice(cityName.length)
}
// /
const districtMatch = detail.match(/^([^区县]+[区县])/)
if (districtMatch) {
districtName = districtMatch[0]
detail = detail.slice(districtName.length)
}
return {
provinceName,
cityName,
districtName,
detail: detail.trim() || '',
}
}
// ====================== ======================
const cleanupMap = () => {
if (mapScript) {
document.body.removeChild(mapScript)
mapScript = null
}
if (map) {
map.destroy()
map = null
}
marker = null
if (resizeTimer) {
clearTimeout(resizeTimer)
resizeTimer = null
}
window.removeEventListener('resize', handleResize)
}
const loadMapSDK = (): Promise<void> => {
return new Promise((resolve, reject) => {
mapKey.value = 'AKTBZ-OGICT-E5NXQ-LGEGK-H5AJ5-M2BOX'
mapScript = document.createElement('script')
mapScript.type = 'text/javascript'
mapScript.src =
'https://map.qq.com/api/gljs?libraries=tools,service&v=1.exp&key=IZQBZ-3UHEU-WTCVD-2464U-I5N4V-ZFFU3'
document.body.appendChild(mapScript)
mapScript.src = `https://map.qq.com/api/gljs?libraries=tools ,service&v=1.exp&key=${mapKey.value}`
mapScript.onload = () => {
setTimeout(() => {
initMap()
}, 500)
if ((window as any).TMap) {
resolve()
} else {
reject(new Error('TMap未定义'))
}
}
//
getAreaListByPid(0).then((res) => {
provinceList.value = res.data
})
mapScript.onerror = (error) => {
reject(error)
}
document.body.appendChild(mapScript)
})
}
const initMap = () => {
const container = document.getElementById('container')
if (!(window as any).TMap || !container) {
throw new Error('地图SDK未加载或容器不存在')
}
const TMap = (window as any).TMap
const center = new TMap.LatLng(39.90403, 116.407526)
const center = new TMap.LatLng(20.029077, 110.366367)
map = new TMap.Map('container', {
center,
zoom: 12,
@ -155,20 +367,37 @@ const initMap = () => {
})
}
//
const handleProvinceChange = (val: string) => {
getAreaListByPid(val).then((res) => {
const bindResizeListener = () => {
window.addEventListener('resize', handleResize)
}
const handleResize = () => {
if (resizeTimer) clearTimeout(resizeTimer)
resizeTimer = setTimeout(() => {
map?.setSize()
}, 300)
}
// ====================== ======================
const handleProvinceChange = async (val: string) => {
try {
const res = await getAreaListByPid(val)
cityList.value = res.data
city.value = ''
district.value = ''
})
} catch (error) {
handleError(error)
}
}
const handleCityChange = (val: string) => {
getAreaListByPid(val).then((res) => {
const handleCityChange = async (val: string) => {
try {
const res = await getAreaListByPid(val)
districtList.value = res.data
district.value = ''
})
} catch (error) {
handleError(error)
}
}
const handleDistrictChange = (val: string) => {
@ -176,7 +405,8 @@ const handleDistrictChange = (val: string) => {
}
//
const handleAddressSearch = () => {
const handleAddressSearch = async () => {
try {
const address = [
province.value
? provinceList.value.find((p) => p.id === province.value)?.name
@ -188,8 +418,11 @@ const handleAddressSearch = () => {
detailAddress.value,
].join('')
addressToLatLng({ mapKey: mapKey.value, address }).then(
({ message, result }) => {
const { message, result } = await addressToLatLng({
mapKey: mapKey.value,
address,
})
if (message == 'Success' || message == 'query ok') {
const latLng = new (window as any).TMap.LatLng(
result.location.lat,
@ -206,17 +439,25 @@ const handleAddressSearch = () => {
address: detailAddress.value,
})
}
} catch (error) {
handleError(error)
}
)
}
// ====================== ======================
const handleError = (error: any) => {
console.error('地图组件错误:', error)
ElMessage.error(t('mapLoadFailed'))
dialogVisible.value = false
}
//
watch(
() => props.modelValue,
(newVal) => {
if (newVal.lat && newVal.lng) {
if (newVal.lat && newVal.lng && map) {
const latLng = new (window as any).TMap.LatLng(newVal.lat, newVal.lng)
map?.setCenter(latLng)
map.setCenter(latLng)
marker?.updateGeometries({
id: 'center',
position: latLng,
@ -225,6 +466,10 @@ watch(
},
{ immediate: true }
)
onBeforeUnmount(() => {
cleanupMap()
})
</script>
<style scoped>
@ -239,10 +484,21 @@ watch(
height: 400px;
border: 1px solid #dcdfe6;
border-radius: 4px;
position: relative;
}
.map-placeholder {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: #909399;
font-size: 14px;
}
.address-search {
display: flex;
gap: 8px;
margin-top: 20px;
}
</style>

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

Loading…
Cancel
Save