Browse Source

Merge branch 'master' of ssh://gitlab.frkj.cc:222/php/zhjwxt

wangzeyan
王泽彦 11 months ago
parent
commit
892fb4c0c8
  1. 2
      admin/.env.development
  2. 1
      admin/.env.production
  3. 2
      admin/auto-imports.d.ts
  4. 8
      admin/components.d.ts
  5. 30
      admin/src/app/api/customer_resources.ts
  6. 23
      admin/src/app/api/departments.ts
  7. 4
      admin/src/app/api/lesson_course_teaching.ts
  8. 27
      admin/src/app/api/six_speed.ts
  9. 12
      admin/src/app/api/sys.ts
  10. 12
      admin/src/app/lang/zh-cn/children_like.children_like.json
  11. 74
      admin/src/app/lang/zh-cn/customer_resources.customer_resources.json
  12. 26
      admin/src/app/lang/zh-cn/departments.departments.json
  13. 12
      admin/src/app/lang/zh-cn/future_ontent.future_ontent.json
  14. 12
      admin/src/app/lang/zh-cn/instructional_material.instructional_material.json
  15. 12
      admin/src/app/lang/zh-cn/lesson_course_teaching.lesson_course_teaching.json
  16. 12
      admin/src/app/lang/zh-cn/physical_testing.physical_testing.json
  17. 12
      admin/src/app/lang/zh-cn/professional_skills.professional_skills.json
  18. 62
      admin/src/app/lang/zh-cn/six_speed.six_speed.json
  19. 295
      admin/src/app/views/binding_personnel/binding_personnel.vue
  20. 89
      admin/src/app/views/children_like/children_like.vue
  21. 13
      admin/src/app/views/children_like/components/Jump-lesson-library-edit.vue
  22. 13
      admin/src/app/views/children_like/components/en-course-teaching-edit.vue
  23. 13
      admin/src/app/views/children_like/components/lesson-course-teaching-edit.vue
  24. 1111
      admin/src/app/views/customer_resources/components/customer-resources-edit.vue
  25. 542
      admin/src/app/views/customer_resources/customer_resources.vue
  26. 242
      admin/src/app/views/departments/components/departments-edit.vue
  27. 292
      admin/src/app/views/departments/departments.vue
  28. 13
      admin/src/app/views/future_ontent/components/Jump-lesson-library-edit.vue
  29. 13
      admin/src/app/views/future_ontent/components/en-course-teaching-edit.vue
  30. 13
      admin/src/app/views/future_ontent/components/lesson-course-teaching-edit.vue
  31. 86
      admin/src/app/views/future_ontent/future_ontent.vue
  32. 13
      admin/src/app/views/instructional_material/components/Jump-lesson-library-edit.vue
  33. 13
      admin/src/app/views/instructional_material/components/basketball-course-teaching-edit.vue
  34. 13
      admin/src/app/views/instructional_material/components/en-course-teaching-edit.vue
  35. 13
      admin/src/app/views/instructional_material/components/lesson-course-teaching-edit.vue
  36. 99
      admin/src/app/views/instructional_material/instructional_material.vue
  37. 21
      admin/src/app/views/lesson_course_teaching/components/Jump-lesson-library-edit.vue
  38. 21
      admin/src/app/views/lesson_course_teaching/components/basketball-course-teaching-edit.vue
  39. 21
      admin/src/app/views/lesson_course_teaching/components/en-course-teaching-edit.vue
  40. 21
      admin/src/app/views/lesson_course_teaching/components/lesson-course-teaching-edit.vue
  41. 21
      admin/src/app/views/lesson_course_teaching/components/ninja-teaching-edit.vue
  42. 21
      admin/src/app/views/lesson_course_teaching/components/physical-teaching-edit.vue
  43. 21
      admin/src/app/views/lesson_course_teaching/components/security-teaching-edit.vue
  44. 21
      admin/src/app/views/lesson_course_teaching/components/strengthen-course-teaching-edit.vue
  45. 192
      admin/src/app/views/lesson_course_teaching/lesson_course_teaching.vue
  46. 13
      admin/src/app/views/physical_testing/components/Jump-lesson-library-edit.vue
  47. 13
      admin/src/app/views/physical_testing/components/basketball-course-teaching-edit.vue
  48. 13
      admin/src/app/views/physical_testing/components/en-course-teaching-edit.vue
  49. 13
      admin/src/app/views/physical_testing/components/lesson-course-teaching-edit.vue
  50. 115
      admin/src/app/views/physical_testing/physical_testing.vue
  51. 13
      admin/src/app/views/professional_skills/components/Jump-lesson-library-edit.vue
  52. 13
      admin/src/app/views/professional_skills/components/basketball-course-teaching-edit.vue
  53. 13
      admin/src/app/views/professional_skills/components/en-course-teaching-edit.vue
  54. 13
      admin/src/app/views/professional_skills/components/lesson-course-teaching-edit.vue
  55. 13
      admin/src/app/views/professional_skills/components/ninja-teaching-edit.vue
  56. 13
      admin/src/app/views/professional_skills/components/security-teaching-edit.vue
  57. 13
      admin/src/app/views/professional_skills/components/strengthen-course-teaching-edit.vue
  58. 196
      admin/src/app/views/professional_skills/professional_skills.vue
  59. 684
      admin/src/app/views/six_speed/components/six-speed-edit.vue
  60. 586
      admin/src/app/views/six_speed/six_speed.vue
  61. 46
      niucloud/app/adminapi/controller/customer_resources/CustomerResources.php
  62. 72
      niucloud/app/adminapi/controller/lesson_course_teaching/LessonCourseTeaching.php
  63. 34
      niucloud/app/adminapi/controller/six_speed/SixSpeed.php
  64. 4
      niucloud/app/adminapi/route/customer_resources.php
  65. 2
      niucloud/app/adminapi/route/lesson_course_teaching.php
  66. 5
      niucloud/app/adminapi/route/six_speed.php
  67. 44
      niucloud/app/api/controller/apiController/Common.php
  68. 26
      niucloud/app/api/controller/apiController/Personnel.php
  69. 36
      niucloud/app/api/controller/apiController/teachingResearch.php
  70. 40
      niucloud/app/api/route/route.php
  71. 28
      niucloud/app/common.php
  72. 6
      niucloud/app/model/customer_resources/CustomerResources.php
  73. 184
      niucloud/app/model/six_speed/SixSpeed.php
  74. 151
      niucloud/app/service/admin/customer_resources/CustomerResourcesService.php
  75. 26
      niucloud/app/service/admin/lesson_course_teaching/LessonCourseTeachingService.php
  76. 16
      niucloud/app/service/admin/six_speed/SixSpeedService.php
  77. 4
      niucloud/app/service/admin/upload/UploadService.php
  78. 52
      niucloud/app/service/api/apiService/PersonnelService.php
  79. 8
      niucloud/app/validate/six_speed/SixSpeed.php

2
admin/.env.development

@ -1,5 +1,5 @@
# api请求地址
VITE_APP_BASE_URL='http://146.56.228.75:20024/adminapi/'
VITE_APP_BASE_URL='http://zhjwxt.cc/adminapi/'
# 图片服务器地址
VITE_IMG_DOMAIN=''

1
admin/.env.production

@ -1,5 +1,6 @@
# api请求地址
VITE_APP_BASE_URL='http://146.56.228.75:20024/adminapi/'
# VITE_APP_BASE_URL='https://zh.hnhbty.cn/adminapi/'
# 图片服务器地址
VITE_IMG_DOMAIN=''

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']
}

8
admin/components.d.ts

@ -10,7 +10,6 @@ declare module '@vue/runtime-core' {
Attachment: typeof import('./src/components/upload-attachment/attachment.vue')['default']
DiyLink: typeof import('./src/components/diy-link/index.vue')['default']
Editor: typeof import('./src/components/editor/index.vue')['default']
ElAlert: typeof import('element-plus/es')['ElAlert']
ElAside: typeof import('element-plus/es')['ElAside']
ElAvatar: typeof import('element-plus/es')['ElAvatar']
ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
@ -40,17 +39,13 @@ declare module '@vue/runtime-core' {
ElMenu: typeof import('element-plus/es')['ElMenu']
ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
ElOption: typeof import('element-plus/es')['ElOption']
ElPageHeader: typeof import('element-plus/es')['ElPageHeader']
ElPagination: typeof import('element-plus/es')['ElPagination']
ElPopover: typeof import('element-plus/es')['ElPopover']
ElRadio: typeof import('element-plus/es')['ElRadio']
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
ElResult: typeof import('element-plus/es')['ElResult']
ElRow: typeof import('element-plus/es')['ElRow']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSelect: typeof import('element-plus/es')['ElSelect']
ElStep: typeof import('element-plus/es')['ElStep']
ElSteps: typeof import('element-plus/es')['ElSteps']
ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
ElSwitch: typeof import('element-plus/es')['ElSwitch']
ElTable: typeof import('element-plus/es')['ElTable']
@ -58,10 +53,7 @@ declare module '@vue/runtime-core' {
ElTabPane: typeof import('element-plus/es')['ElTabPane']
ElTabs: typeof import('element-plus/es')['ElTabs']
ElTag: typeof import('element-plus/es')['ElTag']
ElTimeline: typeof import('element-plus/es')['ElTimeline']
ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem']
ElTooltip: typeof import('element-plus/es')['ElTooltip']
ElTree: typeof import('element-plus/es')['ElTree']
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
ElUpload: typeof import('element-plus/es')['ElUpload']
ExportSure: typeof import('./src/components/export-sure/index.vue')['default']

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

@ -1,5 +1,9 @@
import request from '@/utils/request'
// USER_CODE_BEGIN -- customer_resources
/**
*
@ -7,7 +11,7 @@ import request from '@/utils/request'
* @returns
*/
export function getCustomerResourcesList(params: Record<string, any>) {
return request.get(`customer_resources/customer_resources`, { params })
return request.get(`customer_resources/customer_resources`, {params})
}
/**
@ -16,7 +20,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}`);
}
/**
@ -25,10 +29,7 @@ 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 })
}
/**
@ -38,11 +39,7 @@ 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 })
}
/**
@ -51,14 +48,13 @@ 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>) {
return request.get('customer_resources/campus_all', { params })
export function getWithPersonnelList(params: Record<string,any>){
return request.get('customer_resources/personnel_all', {params})
}export function getWithCampusList(params: Record<string,any>){
return request.get('customer_resources/campus_all', {params})
}
// USER_CODE_END -- customer_resources

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

@ -7,7 +7,7 @@ import request from '@/utils/request'
* @returns
*/
export function getDepartmentsList(params: Record<string, any>) {
return request.get(`departments/departments`, { params })
return request.get(`departments/departments`, {params})
}
/**
@ -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,10 +25,7 @@ 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 })
}
/**
@ -38,10 +35,7 @@ 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 })
}
/**
@ -50,14 +44,11 @@ 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>) {
return request.get('departments/departments_all', { params })
export function getWithDepartmentsList(params: Record<string,any>){
return request.get('departments/departments_all', {params})
}
// USER_CODE_END -- departments

4
admin/src/app/api/lesson_course_teaching.ts

@ -233,6 +233,10 @@ export function getLessonCourseTeachingInfo(id: number) {
return request.get(`lesson_course_teaching/lesson_course_teaching/${id}`);
}
export function setBindingModule(params: Record<string, any>) {
return request.put(`lesson_course_teaching/binding_module/${params.id}`, params)
}
/**
*
* @param id

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

@ -1,5 +1,7 @@
import request from '@/utils/request'
// USER_CODE_BEGIN -- six_speed
/**
*
@ -7,7 +9,7 @@ import request from '@/utils/request'
* @returns
*/
export function getSixSpeedList(params: Record<string, any>) {
return request.get(`six_speed/six_speed`, { params })
return request.get(`six_speed/six_speed`, {params})
}
/**
@ -16,7 +18,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,10 +27,7 @@ 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 })
}
/**
@ -38,10 +37,7 @@ 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 })
}
/**
@ -50,10 +46,13 @@ 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 })
}
export function getWithPersonnelList(params: Record<string,any>){
return request.get('six_speed/personnel_all', {params})
}export function getWithCustomerResourcesList(params: Record<string,any>){
return request.get('six_speed/customer_resources_all', {params})
}
// USER_CODE_END -- six_speed

12
admin/src/app/api/sys.ts

@ -720,3 +720,15 @@ export function deleteExport(id: number) {
export function getInstallConfig() {
return request.get('sys/install/config')
}
//业绩配置
export function getYjpzConfig() {
return request.get('sys/get_yjpz_config')
}
export function yjpzConfig(params: Record<string, any>) {
return request.post(`sys/yjpz_config`, params)
}

12
admin/src/app/lang/zh-cn/children_like.children_like.json

@ -23,5 +23,15 @@
"addJumpLessonLibrary":"添加套圈游戏",
"updateJumpLessonLibrary":"编辑套圈游戏",
"addEnTeachingLibrary":"添加鼓励方式",
"editEnTeachingLibrary":"编辑鼓励方式"
"editEnTeachingLibrary":"编辑鼓励方式",
"addBindingPersonnel":"添加绑定人员",
"userName":"姓名",
"userPhone":"电话",
"userStatus":"状态",
"userCreateTime":"创建时间",
"userUpdateTime":"更新时间",
"bindingModule": "绑定模块",
"url1": "图片上传",
"url2": "文件上传",
"url3": "视频上传"
}

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

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

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

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

12
admin/src/app/lang/zh-cn/future_ontent.future_ontent.json

@ -23,5 +23,15 @@
"addJumpLessonLibrary":"添加训练视频",
"updateJumpLessonLibrary":"编辑训练视频",
"addEnTeachingLibrary":"添加课后作业",
"editEnTeachingLibrary":"编辑课后作业"
"editEnTeachingLibrary":"编辑课后作业",
"addBindingPersonnel":"添加绑定人员",
"userName":"姓名",
"userPhone":"电话",
"userStatus":"状态",
"userCreateTime":"创建时间",
"userUpdateTime":"更新时间",
"bindingModule": "绑定模块",
"url1": "图片上传",
"url2": "文件上传",
"url3": "视频上传"
}

12
admin/src/app/lang/zh-cn/instructional_material.instructional_material.json

@ -25,6 +25,16 @@
"addEnTeachingLibrary":"添加趣味游戏库",
"editEnTeachingLibrary":"编辑趣味游戏库",
"addBasketballTeachingLibrary":"添加放松动作库",
"editBasketballTeachingLibrary":"编辑放松动作库"
"editBasketballTeachingLibrary":"编辑放松动作库",
"addBindingPersonnel":"添加绑定人员",
"userName":"姓名",
"userPhone":"电话",
"userStatus":"状态",
"userCreateTime":"创建时间",
"userUpdateTime":"更新时间",
"bindingModule": "绑定模块",
"url1": "图片上传",
"url2": "文件上传",
"url3": "视频上传"
}

12
admin/src/app/lang/zh-cn/lesson_course_teaching.lesson_course_teaching.json

@ -33,5 +33,15 @@
"addSecurityTeachingLibrary":"添加少儿安防教案库",
"editSecurityTeachingLibrary":"编辑少儿安防教案库",
"addPhysicalTeachingLibrary":"添加体能教案库",
"editPhysicalTeachingLibrary":"编辑体能教案库"
"editPhysicalTeachingLibrary":"编辑体能教案库",
"addBindingPersonnel":"添加绑定人员",
"userName":"姓名",
"userPhone":"电话",
"userStatus":"状态",
"userCreateTime":"创建时间",
"userUpdateTime":"更新时间",
"bindingModule": "绑定模块",
"url1": "图片上传",
"url2": "文件上传",
"url3": "视频上传"
}

12
admin/src/app/lang/zh-cn/physical_testing.physical_testing.json

@ -25,5 +25,15 @@
"addEnTeachingLibrary":"添加3-6岁体测讲解—解读",
"editEnTeachingLibrary":"编辑3-6岁体测讲解—解读",
"addBasketballTeachingLibrary":"添加7+岁体测讲解—解读",
"editBasketballTeachingLibrary":"编辑7+岁体测讲解—解读"
"editBasketballTeachingLibrary":"编辑7+岁体测讲解—解读",
"addBindingPersonnel":"添加绑定人员",
"userName":"姓名",
"userPhone":"电话",
"userStatus":"状态",
"userCreateTime":"创建时间",
"userUpdateTime":"更新时间",
"bindingModule": "绑定模块",
"url1": "图片上传",
"url2": "文件上传",
"url3": "视频上传"
}

12
admin/src/app/lang/zh-cn/professional_skills.professional_skills.json

@ -31,5 +31,15 @@
"addNinjaTeachingLibrary":"添加安防动作",
"editNinjaTeachingLibrary":"编辑安防动作",
"addSecurityTeachingLibrary":"添加标准化动作",
"editSecurityTeachingLibrary":"编辑标准化动作"
"editSecurityTeachingLibrary":"编辑标准化动作",
"addBindingPersonnel":"添加绑定人员",
"userName":"姓名",
"userPhone":"电话",
"userStatus":"状态",
"userCreateTime":"创建时间",
"userUpdateTime":"更新时间",
"bindingModule": "绑定模块",
"url1": "图片上传",
"url2": "文件上传",
"url3": "视频上传"
}

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

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

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

@ -0,0 +1,295 @@
<template>
<el-dialog v-model="showDialog" :title="t('addBindingPersonnel')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true">
<el-form :inline="true" :model="lessonCourseTeachingTable.searchParam" ref="searchFormRef">
<el-form-item :label="t('userName')" prop="title">
<el-input v-model="lessonCourseTeachingTable.searchParam.name" :placeholder="t('userName')" />
</el-form-item>
<el-form-item :label="t('userPhone')" prop="status">
<el-input v-model="lessonCourseTeachingTable.searchParam.phone" :placeholder="t('userPhone')" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadLessonCourseTeachingList()">{{ t('search') }}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
</el-form-item>
</el-form>
<div class="mt-[10px]">
<el-table :data="lessonCourseTeachingTable.data" size="large" v-loading="lessonCourseTeachingTable.loading" @selection-change="handleSelectionChange">
<template #empty>
<span>{{ !lessonCourseTeachingTable.loading ? t('emptyData') : '' }}</span>
</template>
<el-table-column type="selection" width="55" />
<el-table-column prop="name" :label="t('userName')" min-width="70" :show-overflow-tooltip="true"/>
<el-table-column prop="phone" :label="t('userPhone')" min-width="120" :show-overflow-tooltip="true"/>
<el-table-column :label="t('userStatus')" min-width="100" align="center" :show-overflow-tooltip="true">
<template #default="{ row }">
<div v-if="row.status == 1">待审核</div>
<div v-if="row.status == 2">已审核</div>
<div v-if="row.status == 3">已禁用</div>
</template>
</el-table-column>
<el-table-column prop="create_time" :label="t('userCreateTime')" min-width="150" :show-overflow-tooltip="true"/>
<el-table-column prop="update_time" :label="t('userUpdateTime')" min-width="150" :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, 1)">{{ t('delete') }}</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="lessonCourseTeachingTable.page" v-model:page-size="lessonCourseTeachingTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="lessonCourseTeachingTable.total"
@size-change="loadLessonCourseTeachingList()" @current-change="loadLessonCourseTeachingList" />
</div>
</div>
<!-- <el-form-item :label="t('bindingModule')" style="margin-top: 15px;">-->
<!-- <el-select class="w-[280px]" v-model="binding_module" clearable :placeholder="t('bindingModule')">-->
<!-- <el-option label="课程教学大纲" value="1" />-->
<!-- <el-option label="跳绳教案库" value="2" />-->
<!-- <el-option label="增高教案库" value="3" />-->
<!-- <el-option label="篮球教案库" value="4" />-->
<!-- <el-option label="强化教案库" value="5" />-->
<!-- <el-option label="空中忍者教案库" value="6" />-->
<!-- <el-option label="少儿安防教案库" value="7" />-->
<!-- <el-option label="体能教案库" value="8" />-->
<!-- <el-option label="热身动作库" value="9" />-->
<!-- <el-option label="体能动作库" value="10" />-->
<!-- <el-option label="趣味游戏库" value="11" />-->
<!-- <el-option label="放松动作库" value="12" />-->
<!-- <el-option label="训练内容" value="13" />-->
<!-- <el-option label="训练视频" value="14" />-->
<!-- <el-option label="课后作业" value="15" />-->
<!-- <el-option label="优秀一堂课" value="16" />-->
<!-- <el-option label="空中忍者" value="17" />-->
<!-- <el-option label="篮球动作" value="18" />-->
<!-- <el-option label="跳绳动作" value="19" />-->
<!-- <el-option label="跑酷动作" value="20" />-->
<!-- <el-option label="安防动作" value="21" />-->
<!-- <el-option label="标准化动作" value="22" />-->
<!-- <el-option label="3-6岁体测" value="23" />-->
<!-- <el-option label="7+体测" value="24" />-->
<!-- <el-option label="3-6岁体测讲解—解读" value="25" />-->
<!-- <el-option label="7+岁体测讲解—解读" value="26" />-->
<!-- <el-option label="互动游戏" value="27" />-->
<!-- <el-option label="套圈游戏" value="28" />-->
<!-- <el-option label="鼓励方式" value="29" />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<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>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import {
addLessonCourseTeaching,
editLessonCourseTeaching,
getLessonCourseTeachingInfo,
getLessonCourseTeachingList,
getWithPersonnelDataList,
setBindingModule
} from '@/app/api/lesson_course_teaching'
let showDialog = ref(false)
const loading = ref(false)
let lessonCourseTeachingTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam:{
"name":"",
"phone":""
}
})
const multipleSelection = ref<[]>([])
const binding_module = ref('')
const handleSelectionChange = (val: []) => {
multipleSelection.value = val
}
const loadLessonCourseTeachingList = (page: number = 1) => {
lessonCourseTeachingTable.loading = true
lessonCourseTeachingTable.page = page
getWithPersonnelDataList({
page: lessonCourseTeachingTable.page,
limit: lessonCourseTeachingTable.limit,
...lessonCourseTeachingTable.searchParam
}).then(res => {
lessonCourseTeachingTable.loading = false
lessonCourseTeachingTable.data = res.data.data
lessonCourseTeachingTable.total = res.data.total
}).catch(() => {
lessonCourseTeachingTable.loading = false
})
}
loadLessonCourseTeachingList()
const resetForm = (page: number = 1) => {
lessonCourseTeachingTable.searchParam.name = ''
lessonCourseTeachingTable.searchParam.phone = ''
loadLessonCourseTeachingList()
}
/**
* 表单数据
*/
const initialFormData = {
id: '',
title: '',
image: '',
type: '',
content: '',
status: ''
// user_permission: [],
}
const formData: Record<string, any> = reactive({ ...initialFormData })
const formRef = ref<FormInstance>()
//
const formRules = computed(() => {
return {
title: [
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' },
]
,
image: [
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' },
]
,
type: [
{ required: true, message: t('typePlaceholder'), trigger: 'blur' },
]
,
content: [
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' },
]
,
status: [
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' },
]
}
})
const emit = defineEmits(['complete'])
/**
* 确认
* @param formEl
*/
const confirm = async (formEl: FormInstance | undefined) => {
let data = {
id: BindingId.value,
user_permission: multipleSelection.value.map(item => item.sys_user_id).join(','),
user_permission_name: multipleSelection.value.map(item => item.name).join(','),
table_type: binding_module.value,
}
setBindingModule(data).then(res => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
loading.value = false
})
}
//
let typeList = ref([])
const typeDictList = async () => {
typeList.value = await (await useDictionary('material_type')).data.dictionary
}
typeDictList();
watch(() => typeList.value, () => { formData.type = typeList.value[0].value })
let statusList = ref([])
const statusDictList = async () => {
statusList.value = await (await useDictionary('course_status')).data.dictionary
}
statusDictList();
watch(() => statusList.value, () => { formData.status = statusList.value[0].value })
const userPermissionList = ref([] as any[])
const BindingId = ref(undefined)
const setUserPermissionList = async () => {
userPermissionList.value = await (await getWithPersonnelDataList({})).data
}
setUserPermissionList()
const setFormData = async (row: any = null) => {
BindingId.value = row.id
binding_module.value = row.table_type
}
//
const mobileVerify = (rule: any, value: any, callback: any) => {
if (value && !/^1[3-9]\d{9}$/.test(value)) {
callback(new Error(t('generateMobile')))
} else {
callback()
}
}
//
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)) {
callback(new Error(t('generateIdCard')))
} else {
callback()
}
}
//
const emailVerify = (rule: any, value: any, callback: any) => {
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) {
callback(new Error(t('generateEmail')))
} else {
callback()
}
}
//
const numberVerify = (rule: any, value: any, callback: any) => {
if (!Number.isInteger(value)) {
callback(new Error(t('generateNumber')))
} else {
callback()
}
}
defineExpose({
showDialog,
setFormData
})
</script>
<style lang="scss" scoped></style>
<style lang="scss">
.diy-dialog-wrap .el-form-item__label{
height: auto !important;
}
</style>

89
admin/src/app/views/children_like/children_like.vue

@ -72,10 +72,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 27)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -159,10 +160,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editJumpLessonLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 28)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -246,10 +248,12 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editEnTeachingLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 29)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -265,6 +269,7 @@
</el-tab-pane>
</el-tabs>
</el-card>
<binding-personnel ref="BindingPersonnelDialog" @complete="loadLessonCourseTeachingList" />
</div>
</template>
@ -279,6 +284,7 @@ import Edit from '@/app/views/children_like/components/lesson-course-teaching-ed
import EditJump from '@/app/views/children_like/components/Jump-lesson-library-edit.vue'
import EditEn from '@/app/views/children_like/components/en-course-teaching-edit.vue'
import { useRoute } from 'vue-router'
import bindingPersonnel from '@/app/views/binding_personnel/binding_personnel.vue'
const route = useRoute()
const pageName = route.meta.title;
const active = 'CourseSyllabus'
@ -294,7 +300,7 @@ let lessonCourseTeachingTable = reactive({
"status":"",
"create_time":[],
"update_time":[],
table_type: 27
"table_type": 27
}
})
let JumpLessonLibraryTable = reactive({
@ -308,7 +314,7 @@ let JumpLessonLibraryTable = reactive({
"status":"",
"create_time":[],
"update_time":[],
table_type: 28
"table_type": 28
}
})
let EnTeachingLibraryTable = reactive({
@ -322,7 +328,7 @@ let EnTeachingLibraryTable = reactive({
"status":"",
"create_time":[],
"update_time":[],
table_type: 29
"table_type": 29
}
})
@ -347,7 +353,12 @@ const editLessonCourseTeachingDialog: Record<string, any> | null = ref(null)
const editJumpLessonLibraryDialog: Record<string, any> | null = ref(null)
const editEnTeachingLibraryDialog: Record<string, any> | null = ref(null)
const editBasketballTeachingLibraryDialog: Record<string, any> | null = ref(null)
const BindingPersonnelDialog: Record<string, any> | null = ref(null)
const addBindingPersonnel = (row) => {
BindingPersonnelDialog.value.setFormData(row)
BindingPersonnelDialog.value.showDialog = true
}
/**
* 获取课程教学大纲列表
*/
@ -500,52 +511,34 @@ const resetForm = (formEl: FormInstance | undefined, type: number) => {
if (!formEl) return
formEl.resetFields()
if (type === 27) {
lessonCourseTeachingTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": [],
table_type: 27
}
})
lessonCourseTeachingTable.searchParam.title = ''
lessonCourseTeachingTable.searchParam.status = ''
lessonCourseTeachingTable.searchParam.create_time = ''
lessonCourseTeachingTable.searchParam.update_time = ''
lessonCourseTeachingTable.page = 1
lessonCourseTeachingTable.limit = 10
lessonCourseTeachingTable.data = []
lessonCourseTeachingTable.table_type = 27
loadLessonCourseTeachingList()
} else if (type === 28) {
JumpLessonLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": [],
table_type: 28
}
})
JumpLessonLibraryTable.searchParam.title = ''
JumpLessonLibraryTable.searchParam.status = ''
JumpLessonLibraryTable.searchParam.create_time = ''
JumpLessonLibraryTable.searchParam.update_time = ''
JumpLessonLibraryTable.page = 1
JumpLessonLibraryTable.limit = 10
JumpLessonLibraryTable.data = []
JumpLessonLibraryTable.table_type = 28
loadJumpLessonLibraryList()
} else if (type === 29) {
EnTeachingLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": [],
table_type: 29
}
})
EnTeachingLibraryTable.searchParam.title = ''
EnTeachingLibraryTable.searchParam.status = ''
EnTeachingLibraryTable.searchParam.create_time = ''
EnTeachingLibraryTable.searchParam.update_time = ''
EnTeachingLibraryTable.page = 1
EnTeachingLibraryTable.limit = 10
EnTeachingLibraryTable.data = []
EnTeachingLibraryTable.table_type = 29
loadEnTeachingLibraryList()
}
}

13
admin/src/app/views/children_like/components/Jump-lesson-library-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -139,6 +151,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

13
admin/src/app/views/children_like/components/en-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -133,6 +145,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

13
admin/src/app/views/children_like/components/lesson-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -134,6 +146,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

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

File diff suppressed because it is too large

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

@ -1,311 +1,231 @@
<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">
{{ t('addCustomerResources') }}
</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-form-item :label="t('name')" prop="name">
<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-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-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table
:data="customerResourcesTable.data"
size="large"
v-loading="customerResourcesTable.loading"
>
<template #empty>
<span>{{
!customerResourcesTable.loading ? t('emptyData') : ''
}}</span>
</template>
<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>
</div>
</template>
</el-table-column>
<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="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"
>
<template #default="{ row }">
<div v-for="(item, index) in genderList">
<div v-if="item.value == row.gender">{{ item.name }}</div>
</div>
</template>
</el-table-column>
<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
: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>
</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"
/>
</div>
</div>
<edit
ref="editCustomerResourcesDialog"
@complete="loadCustomerResourcesList"
/>
</el-card>
</div>
</template>
<script lang="ts" setup>
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 { 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
let customerResourcesTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
name: '',
phone_number: '',
},
})
const searchFormRef = ref<FormInstance>()
//
const selectData = ref<any[]>([])
//
const sourceList = ref([] as any[])
const sourceDictList = async () => {
sourceList.value = await (await useDictionary('source')).data.dictionary
}
sourceDictList()
const source_channelList = ref([] as any[])
const source_channelDictList = async () => {
source_channelList.value = await (
await useDictionary('SourceChannel')
).data.dictionary
}
source_channelDictList()
const genderList = ref([] as any[])
const genderDictList = async () => {
genderList.value = await (await useDictionary('zy_sex')).data.dictionary
}
genderDictList()
const purchasing_powerList = ref([] as any[])
const purchasing_powerDictList = async () => {
purchasing_powerList.value = await (
await useDictionary('customer_purchasing_power')
).data.dictionary
}
purchasing_powerDictList()
const cognitive_ideaList = ref([] as any[])
const cognitive_ideaDictList = async () => {
cognitive_ideaList.value = await (
await useDictionary('cognitive_concept')
).data.dictionary
}
cognitive_ideaDictList()
const initial_intentList = ref([] as any[])
const initial_intentDictList = async () => {
initial_intentList.value = await (
await useDictionary('preliminarycustomerintention')
).data.dictionary
}
initial_intentDictList()
const statusList = ref([] as any[])
const statusDictList = async () => {
statusList.value = await (await useDictionary('kh_status')).data.dictionary
}
statusDictList()
/**
* 获取客户资源列表
*/
const loadCustomerResourcesList = (page: number = 1) => {
customerResourcesTable.loading = true
customerResourcesTable.page = page
getCustomerResourcesList({
page: customerResourcesTable.page,
limit: customerResourcesTable.limit,
...customerResourcesTable.searchParam,
})
.then((res) => {
customerResourcesTable.loading = false
customerResourcesTable.data = res.data.data
customerResourcesTable.total = res.data.total
})
.catch(() => {
customerResourcesTable.loading = false
})
}
loadCustomerResourcesList()
const editCustomerResourcesDialog: Record<string, any> | null = ref(null)
/**
* 添加客户资源
*/
const addEvent = () => {
editCustomerResourcesDialog.value.setFormData()
editCustomerResourcesDialog.value.showDialog = true
}
/**
* 编辑客户资源
* @param data
*/
const editEvent = (data: any) => {
editCustomerResourcesDialog.value.setFormData(data)
editCustomerResourcesDialog.value.showDialog = true
}
/**
* 删除客户资源
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('customerResourcesDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}).then(() => {
deleteCustomerResources(id)
.then(() => {
loadCustomerResourcesList()
})
.catch(() => {})
})
}
const campusList = ref([])
const setCampusList = async () => {
campusList.value = await (await getWithCampusList({})).data
}
setCampusList()
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
loadCustomerResourcesList()
}
</script>
<style lang="scss" scoped>
/* 多行超出隐藏 */
.multi-hidden {
word-break: break-all;
text-overflow: ellipsis;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
</style>
<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">
{{ t('addCustomerResources') }}
</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-form-item :label="t('name')" prop="name">
<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-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-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<el-table :data="customerResourcesTable.data" size="large" v-loading="customerResourcesTable.loading">
<template #empty>
<span>{{ !customerResourcesTable.loading ? t('emptyData') : '' }}</span>
</template>
<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>
</div>
</template>
</el-table-column>
<el-table-column prop="consultant_name" :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="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">
<template #default="{ row }">
<div v-for="(item, index) in genderList">
<div v-if="item.value == row.gender">{{ item.name }}</div>
</div>
</template>
</el-table-column>
<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 :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>
</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" />
</div>
</div>
<edit ref="editCustomerResourcesDialog" @complete="loadCustomerResourcesList" />
</el-card>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getCustomerResourcesList, deleteCustomerResources, getWithPersonnelList, 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;
let customerResourcesTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam:{
"name":"",
"phone_number":""
}
})
const searchFormRef = ref<FormInstance>()
//
const selectData = ref<any[]>([])
//
const sourceList = ref([] as any[])
const sourceDictList = async () => {
sourceList.value = await (await useDictionary('source')).data.dictionary
}
sourceDictList();
const source_channelList = ref([] as any[])
const source_channelDictList = async () => {
source_channelList.value = await (await useDictionary('SourceChannel')).data.dictionary
}
source_channelDictList();
const genderList = ref([] as any[])
const genderDictList = async () => {
genderList.value = await (await useDictionary('zy_sex')).data.dictionary
}
genderDictList();
const purchasing_powerList = ref([] as any[])
const purchasing_powerDictList = async () => {
purchasing_powerList.value = await (await useDictionary('customer_purchasing_power')).data.dictionary
}
purchasing_powerDictList();
const cognitive_ideaList = ref([] as any[])
const cognitive_ideaDictList = async () => {
cognitive_ideaList.value = await (await useDictionary('cognitive_concept')).data.dictionary
}
cognitive_ideaDictList();
const initial_intentList = ref([] as any[])
const initial_intentDictList = async () => {
initial_intentList.value = await (await useDictionary('preliminarycustomerintention')).data.dictionary
}
initial_intentDictList();
const statusList = ref([] as any[])
const statusDictList = async () => {
statusList.value = await (await useDictionary('kh_status')).data.dictionary
}
statusDictList();
/**
* 获取客户资源列表
*/
const loadCustomerResourcesList = (page: number = 1) => {
customerResourcesTable.loading = true
customerResourcesTable.page = page
getCustomerResourcesList({
page: customerResourcesTable.page,
limit: customerResourcesTable.limit,
...customerResourcesTable.searchParam
}).then(res => {
customerResourcesTable.loading = false
customerResourcesTable.data = res.data.data
customerResourcesTable.total = res.data.total
}).catch(() => {
customerResourcesTable.loading = false
})
}
loadCustomerResourcesList()
const editCustomerResourcesDialog: Record<string, any> | null = ref(null)
/**
* 添加客户资源
*/
const addEvent = () => {
editCustomerResourcesDialog.value.setFormData()
editCustomerResourcesDialog.value.showDialog = true
}
/**
* 编辑客户资源
* @param data
*/
const editEvent = (data: any) => {
editCustomerResourcesDialog.value.setFormData(data)
editCustomerResourcesDialog.value.showDialog = true
}
/**
* 删除客户资源
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('customerResourcesDeleteTips'), t('warning'),
{
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteCustomerResources(id).then(() => {
loadCustomerResourcesList()
}).catch(() => {
})
})
}
const consultantList = ref([])
const setConsultantList = async () => {
consultantList.value = await (await getWithPersonnelList({})).data
}
setConsultantList()
const campusList = ref([])
const setCampusList = async () => {
campusList.value = await (await getWithCampusList({})).data
}
setCampusList()
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
loadCustomerResourcesList()
}
</script>
<style lang="scss" scoped>
/* 多行超出隐藏 */
.multi-hidden {
word-break: break-all;
text-overflow: ellipsis;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
</style>

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

@ -1,58 +1,33 @@
<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-form-item :label="t('departmentName')" prop="department_name">
<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-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in parentDepartmentIdList"
:key="index"
:label="item['department_name']"
:value="item['id']"
/>
</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
>
</span>
</template>
</el-dialog>
<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-form-item>
<el-form-item :label="t('parentDepartmentId')" >
<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"
:key="index"
:label="item['department_name']"
:value="item['id']"
/>
</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>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
@ -60,12 +35,7 @@ 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)
@ -74,9 +44,9 @@ const loading = ref(false)
* 表单数据
*/
const initialFormData = {
id: '',
department_name: '',
parent_department_id: '',
id: '',
department_name: '',
parent_department_id: '',
}
const formData: Record<string, any> = reactive({ ...initialFormData })
@ -84,22 +54,18 @@ const formRef = ref<FormInstance>()
//
const formRules = computed(() => {
return {
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' },
]
}
})
const emit = defineEmits(['complete'])
@ -109,98 +75,92 @@ const emit = defineEmits(['complete'])
* @param formEl
*/
const confirm = async (formEl: FormInstance | undefined) => {
if (loading.value || !formEl) return
let save = formData.id ? editDepartments : addDepartments
await formEl.validate(async (valid) => {
if (valid) {
loading.value = true
let data = formData
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
})
.catch((err) => {
loading.value = false
})
}
})
if (loading.value || !formEl) return
let save = formData.id ? editDepartments : addDepartments
await formEl.validate(async (valid) => {
if (valid) {
loading.value = true
let data = formData
save(data).then(res => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
loading.value = false
})
}
})
}
//
const parentDepartmentIdList = ref([] as any[])
const setParentDepartmentIdList = async () => {
parentDepartmentIdList.value = await (await getWithDepartmentsList({})).data
}
setParentDepartmentIdList()
const parentDepartmentIdList = ref([] as any[])
const setParentDepartmentIdList = async () => {
parentDepartmentIdList.value = await (await getWithDepartmentsList({})).data
}
setParentDepartmentIdList()
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
const data = await (await getDepartmentsInfo(row.id)).data
if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key]
})
}
loading.value = false
Object.assign(formData, initialFormData)
loading.value = true
if(row){
const data = await (await getDepartmentsInfo(row.id)).data
if (data) Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key]
})
}
loading.value = false
}
//
const mobileVerify = (rule: any, value: any, callback: any) => {
if (value && !/^1[3-9]\d{9}$/.test(value)) {
callback(new Error(t('generateMobile')))
} else {
callback()
}
if (value && !/^1[3-9]\d{9}$/.test(value)) {
callback(new Error(t('generateMobile')))
} else {
callback()
}
}
//
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
)
) {
callback(new Error(t('generateIdCard')))
} else {
callback()
}
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()
}
}
//
const emailVerify = (rule: any, value: any, callback: any) => {
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) {
callback(new Error(t('generateEmail')))
} else {
callback()
}
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) {
callback(new Error(t('generateEmail')))
} else {
callback()
}
}
//
const numberVerify = (rule: any, value: any, callback: any) => {
if (!Number.isInteger(value)) {
callback(new Error(t('generateNumber')))
} else {
callback()
}
if (!Number.isInteger(value)) {
callback(new Error(t('generateNumber')))
} else {
callback()
}
}
defineExpose({
showDialog,
setFormData,
showDialog,
setFormData
})
</script>
<style lang="scss" scoped></style>
<style lang="scss">
.diy-dialog-wrap .el-form-item__label {
height: auto !important;
.diy-dialog-wrap .el-form-item__label{
height: auto !important;
}
</style>

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

@ -1,140 +1,93 @@
<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">
{{ t('addDepartments') }}
</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-form-item :label="t('departmentName')" prop="department_name">
<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-option
v-for="(item, index) in parentDepartmentIdList"
:key="index"
:label="item['department_name']"
:value="item['id']"
/>
</el-select>
</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-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<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
: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>
</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"
/>
</div>
</div>
<edit ref="editDepartmentsDialog" @complete="loadDepartmentsList" />
</el-card>
</div>
<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">
{{ t('addDepartments') }}
</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-form-item :label="t('departmentName')" prop="department_name">
<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-option
v-for="(item, index) in parentDepartmentIdList"
:key="index"
:label="item['department_name']"
:value="item['id']"
/>
</el-select>
</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-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<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="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>
</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" />
</div>
</div>
<edit ref="editDepartmentsDialog" @complete="loadDepartmentsList" />
</el-card>
</div>
</template>
<script lang="ts" setup>
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 { 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,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
department_name: '',
parent_department_id: '',
},
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam:{
"department_name":"",
"parent_department_id":""
}
})
const searchFormRef = ref<FormInstance>()
@ -143,26 +96,25 @@ const searchFormRef = ref<FormInstance>()
const selectData = ref<any[]>([])
//
/**
* 获取部门列表
*/
const loadDepartmentsList = (page: number = 1) => {
departmentsTable.loading = true
departmentsTable.page = page
getDepartmentsList({
page: departmentsTable.page,
limit: departmentsTable.limit,
...departmentsTable.searchParam,
})
.then((res) => {
departmentsTable.loading = false
departmentsTable.data = res.data.data
departmentsTable.total = res.data.total
})
.catch(() => {
departmentsTable.loading = false
departmentsTable.loading = true
departmentsTable.page = page
getDepartmentsList({
page: departmentsTable.page,
limit: departmentsTable.limit,
...departmentsTable.searchParam
}).then(res => {
departmentsTable.loading = false
departmentsTable.data = res.data.data
departmentsTable.total = res.data.total
}).catch(() => {
departmentsTable.loading = false
})
}
loadDepartmentsList()
@ -173,8 +125,8 @@ const editDepartmentsDialog: Record<string, any> | null = ref(null)
* 添加部门
*/
const addEvent = () => {
editDepartmentsDialog.value.setFormData()
editDepartmentsDialog.value.showDialog = true
editDepartmentsDialog.value.setFormData()
editDepartmentsDialog.value.showDialog = true
}
/**
@ -182,48 +134,50 @@ const addEvent = () => {
* @param data
*/
const editEvent = (data: any) => {
editDepartmentsDialog.value.setFormData(data)
editDepartmentsDialog.value.showDialog = true
editDepartmentsDialog.value.setFormData(data)
editDepartmentsDialog.value.showDialog = true
}
/**
* 删除部门
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('departmentsDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}).then(() => {
deleteDepartments(id)
.then(() => {
loadDepartmentsList()
})
.catch(() => {})
})
ElMessageBox.confirm(t('departmentsDeleteTips'), t('warning'),
{
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteDepartments(id).then(() => {
loadDepartmentsList()
}).catch(() => {
})
})
}
const parentDepartmentIdList = ref([])
const setParentDepartmentIdList = async () => {
parentDepartmentIdList.value = await (await getWithDepartmentsList({})).data
}
setParentDepartmentIdList()
const parentDepartmentIdList = ref([])
const setParentDepartmentIdList = async () => {
parentDepartmentIdList.value = await (await getWithDepartmentsList({})).data
}
setParentDepartmentIdList()
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
loadDepartmentsList()
if (!formEl) return
formEl.resetFields()
loadDepartmentsList()
}
</script>
<style lang="scss" scoped>
/* 多行超出隐藏 */
.multi-hidden {
word-break: break-all;
text-overflow: ellipsis;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
word-break: break-all;
text-overflow: ellipsis;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
</style>

13
admin/src/app/views/future_ontent/components/Jump-lesson-library-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -139,6 +151,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

13
admin/src/app/views/future_ontent/components/en-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -133,6 +145,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

13
admin/src/app/views/future_ontent/components/lesson-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -134,6 +146,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

86
admin/src/app/views/future_ontent/future_ontent.vue

@ -72,10 +72,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 13)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -159,10 +160,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editJumpLessonLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 14)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -246,10 +248,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editEnTeachingLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 15)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -265,12 +268,9 @@
</el-tab-pane>
</el-tabs>
</el-card>
<binding-personnel ref="BindingPersonnelDialog" @complete="loadLessonCourseTeachingList" />
</div>
</template>
addPublicLibraryList editPublicLibraryList
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
@ -282,6 +282,7 @@ import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/future_ontent/components/lesson-course-teaching-edit.vue'
import EditJump from '@/app/views/future_ontent/components/Jump-lesson-library-edit.vue'
import EditEn from '@/app/views/future_ontent/components/en-course-teaching-edit.vue'
import bindingPersonnel from '@/app/views/binding_personnel/binding_personnel.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
@ -350,7 +351,12 @@ statusDictList();
const editLessonCourseTeachingDialog: Record<string, any> | null = ref(null)
const editJumpLessonLibraryDialog: Record<string, any> | null = ref(null)
const editEnTeachingLibraryDialog: Record<string, any> | null = ref(null)
const BindingPersonnelDialog: Record<string, any> | null = ref(null)
const addBindingPersonnel = (row) => {
BindingPersonnelDialog.value.setFormData(row)
BindingPersonnelDialog.value.showDialog = true
}
/**
* 获取课程教学大纲列表
*/
@ -503,52 +509,34 @@ const resetForm = (formEl: FormInstance | undefined, type: number) => {
if (!formEl) return
formEl.resetFields()
if (type === 13) {
lessonCourseTeachingTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": [],
"table_type":13
}
})
lessonCourseTeachingTable.searchParam.title = ''
lessonCourseTeachingTable.searchParam.status = ''
lessonCourseTeachingTable.searchParam.create_time = ''
lessonCourseTeachingTable.searchParam.update_time = ''
lessonCourseTeachingTable.page = 1
lessonCourseTeachingTable.limit = 10
lessonCourseTeachingTable.data = []
lessonCourseTeachingTable.table_type = 13
loadLessonCourseTeachingList()
} else if (type === 14) {
JumpLessonLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": [],
"table_type":14
}
})
JumpLessonLibraryTable.searchParam.title = ''
JumpLessonLibraryTable.searchParam.status = ''
JumpLessonLibraryTable.searchParam.create_time = ''
JumpLessonLibraryTable.searchParam.update_time = ''
JumpLessonLibraryTable.page = 1
JumpLessonLibraryTable.limit = 10
JumpLessonLibraryTable.data = []
JumpLessonLibraryTable.table_type = 14
loadJumpLessonLibraryList()
} else if (type === 15) {
EnTeachingLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": [],
"table_type":15
}
})
EnTeachingLibraryTable.searchParam.title = ''
EnTeachingLibraryTable.searchParam.status = ''
EnTeachingLibraryTable.searchParam.create_time = ''
EnTeachingLibraryTable.searchParam.update_time = ''
EnTeachingLibraryTable.page = 1
EnTeachingLibraryTable.limit = 10
EnTeachingLibraryTable.data = []
EnTeachingLibraryTable.table_type = 15
loadEnTeachingLibraryList()
}
}

13
admin/src/app/views/instructional_material/components/Jump-lesson-library-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -138,6 +150,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

13
admin/src/app/views/instructional_material/components/basketball-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -133,6 +145,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

13
admin/src/app/views/instructional_material/components/en-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -132,6 +144,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

13
admin/src/app/views/instructional_material/components/lesson-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -134,6 +146,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

99
admin/src/app/views/instructional_material/instructional_material.vue

@ -72,10 +72,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="updateActionLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 9)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -158,10 +159,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editJumpLessonLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 10)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -245,10 +247,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editEnTeachingLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 11)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -332,10 +335,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editBasketballTeachingLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 12)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -351,6 +355,7 @@
</el-tab-pane>
</el-tabs>
</el-card>
<binding-personnel ref="BindingPersonnelDialog" @complete="loadLessonCourseTeachingList" />
</div>
</template>
@ -366,6 +371,7 @@ import Edit from '@/app/views/instructional_material/components/lesson-course-te
import EditJump from '@/app/views/instructional_material/components/Jump-lesson-library-edit.vue'
import EditEn from '@/app/views/instructional_material/components/en-course-teaching-edit.vue'
import EditBasketball from '@/app/views/instructional_material/components/basketball-course-teaching-edit.vue'
import bindingPersonnel from '@/app/views/binding_personnel/binding_personnel.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
@ -446,7 +452,12 @@ const editJumpLessonLibraryDialog: Record<string, any> | null = ref(null)
const editEnTeachingLibraryDialog: Record<string, any> | null = ref(null)
const editBasketballTeachingLibraryDialog: Record<string, any> | null = ref(null)
const editStrengthenTeachingLibraryDialog: Record<string, any> | null = ref(null)
const BindingPersonnelDialog: Record<string, any> | null = ref(null)
const addBindingPersonnel = (row) => {
BindingPersonnelDialog.value.setFormData(row)
BindingPersonnelDialog.value.showDialog = true
}
/**
* 获取热身动作库列表
*/
@ -637,64 +648,40 @@ const resetForm = (formEl: FormInstance | undefined, type: number) => {
if (!formEl) return
formEl.resetFields()
if (type === 9) {
ActionLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": []
}
})
ActionLibraryTable.searchParam.title = ''
ActionLibraryTable.searchParam.status = ''
ActionLibraryTable.searchParam.create_time = ''
ActionLibraryTable.searchParam.update_time = ''
ActionLibraryTable.page = 1
ActionLibraryTable.limit = 10
ActionLibraryTable.data = []
loadActionLibraryList()
} else if (type === 10) {
JumpLessonLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": []
}
})
JumpLessonLibraryTable.searchParam.title = ''
JumpLessonLibraryTable.searchParam.status = ''
JumpLessonLibraryTable.searchParam.create_time = ''
JumpLessonLibraryTable.searchParam.update_time = ''
JumpLessonLibraryTable.page = 1
JumpLessonLibraryTable.limit = 10
JumpLessonLibraryTable.data = []
loadJumpLessonLibraryList()
} else if (type === 11) {
EnTeachingLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": []
}
})
EnTeachingLibraryTable.searchParam.title = ''
EnTeachingLibraryTable.searchParam.status = ''
EnTeachingLibraryTable.searchParam.create_time = ''
EnTeachingLibraryTable.searchParam.update_time = ''
EnTeachingLibraryTable.page = 1
EnTeachingLibraryTable.limit = 10
EnTeachingLibraryTable.data = []
loadEnTeachingLibraryList()
} else if (type === 12) {
BasketballTeachingLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": []
}
})
BasketballTeachingLibraryTable.searchParam.title = ''
BasketballTeachingLibraryTable.searchParam.status = ''
BasketballTeachingLibraryTable.searchParam.create_time = ''
BasketballTeachingLibraryTable.searchParam.update_time = ''
BasketballTeachingLibraryTable.page = 1
BasketballTeachingLibraryTable.limit = 10
BasketballTeachingLibraryTable.data = []
loadBasketballTeachingLibraryList()
}
}

21
admin/src/app/views/lesson_course_teaching/components/Jump-lesson-library-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -137,6 +149,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false
@ -161,10 +174,10 @@ const confirm = async (formEl: FormInstance | undefined) => {
const userPermissionList = ref([] as any[])
const setUserPermissionList = async () => {
userPermissionList.value = await (await getWithPersonnelDataList({})).data
}
setUserPermissionList()
// const setUserPermissionList = async () => {
// userPermissionList.value = await (await getWithPersonnelDataList({})).data
// }
// setUserPermissionList()
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true

21
admin/src/app/views/lesson_course_teaching/components/basketball-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -133,6 +145,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false
@ -157,10 +170,10 @@ const confirm = async (formEl: FormInstance | undefined) => {
const userPermissionList = ref([] as any[])
const setUserPermissionList = async () => {
userPermissionList.value = await (await getWithPersonnelDataList({})).data
}
setUserPermissionList()
// const setUserPermissionList = async () => {
// userPermissionList.value = await (await getWithPersonnelDataList({})).data
// }
// setUserPermissionList()
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true

21
admin/src/app/views/lesson_course_teaching/components/en-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -132,6 +144,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false
@ -156,10 +169,10 @@ const confirm = async (formEl: FormInstance | undefined) => {
const userPermissionList = ref([] as any[])
const setUserPermissionList = async () => {
userPermissionList.value = await (await getWithPersonnelDataList({})).data
}
setUserPermissionList()
// const setUserPermissionList = async () => {
// userPermissionList.value = await (await getWithPersonnelDataList({})).data
// }
// setUserPermissionList()
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true

21
admin/src/app/views/lesson_course_teaching/components/lesson-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -133,6 +145,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false
@ -157,10 +170,10 @@ const confirm = async (formEl: FormInstance | undefined) => {
const userPermissionList = ref([] as any[])
const setUserPermissionList = async () => {
userPermissionList.value = await (await getWithPersonnelDataList({})).data
}
setUserPermissionList()
// const setUserPermissionList = async () => {
// userPermissionList.value = await (await getWithPersonnelDataList({})).data
// }
// setUserPermissionList()
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true

21
admin/src/app/views/lesson_course_teaching/components/ninja-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -133,6 +145,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false
@ -157,10 +170,10 @@ const confirm = async (formEl: FormInstance | undefined) => {
const userPermissionList = ref([] as any[])
const setUserPermissionList = async () => {
userPermissionList.value = await (await getWithPersonnelDataList({})).data
}
setUserPermissionList()
// const setUserPermissionList = async () => {
// userPermissionList.value = await (await getWithPersonnelDataList({})).data
// }
// setUserPermissionList()
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true

21
admin/src/app/views/lesson_course_teaching/components/physical-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -133,6 +145,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false
@ -157,10 +170,10 @@ const confirm = async (formEl: FormInstance | undefined) => {
const userPermissionList = ref([] as any[])
const setUserPermissionList = async () => {
userPermissionList.value = await (await getWithPersonnelDataList({})).data
}
setUserPermissionList()
// const setUserPermissionList = async () => {
// userPermissionList.value = await (await getWithPersonnelDataList({})).data
// }
// setUserPermissionList()
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true

21
admin/src/app/views/lesson_course_teaching/components/security-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -133,6 +145,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false
@ -157,10 +170,10 @@ const confirm = async (formEl: FormInstance | undefined) => {
const userPermissionList = ref([] as any[])
const setUserPermissionList = async () => {
userPermissionList.value = await (await getWithPersonnelDataList({})).data
}
setUserPermissionList()
// const setUserPermissionList = async () => {
// userPermissionList.value = await (await getWithPersonnelDataList({})).data
// }
// setUserPermissionList()
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true

21
admin/src/app/views/lesson_course_teaching/components/strengthen-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -132,6 +144,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false
@ -156,10 +169,10 @@ const confirm = async (formEl: FormInstance | undefined) => {
const userPermissionList = ref([] as any[])
const setUserPermissionList = async () => {
userPermissionList.value = await (await getWithPersonnelDataList({})).data
}
setUserPermissionList()
// const setUserPermissionList = async () => {
// userPermissionList.value = await (await getWithPersonnelDataList({})).data
// }
// setUserPermissionList()
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true

192
admin/src/app/views/lesson_course_teaching/lesson_course_teaching.vue

@ -72,10 +72,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 1)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -159,10 +160,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editJumpLessonLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 2)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -246,10 +248,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editEnTeachingLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 3)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -333,10 +336,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editBasketballTeachingLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 4)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -420,10 +424,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editStrengthenTeachingLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 5)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -507,10 +512,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editNinjaTeachingLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 6)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -594,10 +600,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editSecurityTeachingLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 7)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -681,10 +688,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editPhysicalTeachingLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 8)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -700,6 +708,7 @@
</el-tab-pane>
</el-tabs>
</el-card>
<binding-personnel ref="BindingPersonnelDialog" @complete="loadLessonCourseTeachingList" />
</div>
</template>
@ -718,6 +727,7 @@ import EditStrengthen from '@/app/views/lesson_course_teaching/components/streng
import EditNinja from '@/app/views/lesson_course_teaching/components/ninja-teaching-edit.vue'
import EditSecurity from '@/app/views/lesson_course_teaching/components/security-teaching-edit.vue'
import EditPhysical from '@/app/views/lesson_course_teaching/components/physical-teaching-edit.vue'
import bindingPersonnel from '@/app/views/binding_personnel/binding_personnel.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title;
@ -852,6 +862,12 @@ const editStrengthenTeachingLibraryDialog: Record<string, any> | null = ref(null
const editNinjaTeachingLibraryDialog: Record<string, any> | null = ref(null)
const editSecurityTeachingLibraryDialog: Record<string, any> | null = ref(null)
const editPhysicalTeachingLibraryDialog: Record<string, any> | null = ref(null)
const BindingPersonnelDialog: Record<string, any> | null = ref(null)
const addBindingPersonnel = (row) => {
BindingPersonnelDialog.value.setFormData(row)
BindingPersonnelDialog.value.showDialog = true
}
/**
* 获取课程教学大纲列表
@ -1205,124 +1221,76 @@ const resetForm = (formEl: FormInstance | undefined, type: number) => {
if (!formEl) return
formEl.resetFields()
if (type === 1) {
lessonCourseTeachingTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": []
}
})
lessonCourseTeachingTable.searchParam.title = ''
lessonCourseTeachingTable.searchParam.status = ''
lessonCourseTeachingTable.searchParam.create_time = ''
lessonCourseTeachingTable.searchParam.update_time = ''
lessonCourseTeachingTable.page = 1
lessonCourseTeachingTable.limit = 10
lessonCourseTeachingTable.data = []
loadLessonCourseTeachingList()
} else if (type === 2) {
JumpLessonLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": []
}
})
JumpLessonLibraryTable.searchParam.title = ''
JumpLessonLibraryTable.searchParam.status = ''
JumpLessonLibraryTable.searchParam.create_time = ''
JumpLessonLibraryTable.searchParam.update_time = ''
JumpLessonLibraryTable.page = 1
JumpLessonLibraryTable.limit = 10
JumpLessonLibraryTable.data = []
loadJumpLessonLibraryList()
} else if (type === 3) {
EnTeachingLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": []
}
})
EnTeachingLibraryTable.searchParam.title = ''
EnTeachingLibraryTable.searchParam.status = ''
EnTeachingLibraryTable.searchParam.create_time = ''
EnTeachingLibraryTable.searchParam.update_time = ''
EnTeachingLibraryTable.page = 1
EnTeachingLibraryTable.limit = 10
EnTeachingLibraryTable.data = []
loadEnTeachingLibraryList()
} else if (type === 4) {
BasketballTeachingLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": []
}
})
BasketballTeachingLibraryTable.searchParam.title = ''
BasketballTeachingLibraryTable.searchParam.status = ''
BasketballTeachingLibraryTable.searchParam.create_time = ''
BasketballTeachingLibraryTable.searchParam.update_time = ''
BasketballTeachingLibraryTable.page = 1
BasketballTeachingLibraryTable.limit = 10
BasketballTeachingLibraryTable.data = []
loadBasketballTeachingLibraryList()
} else if (type === 5) {
StrengTeachingLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": []
}
})
StrengTeachingLibraryTable.searchParam.title = ''
StrengTeachingLibraryTable.searchParam.status = ''
StrengTeachingLibraryTable.searchParam.create_time = ''
StrengTeachingLibraryTable.searchParam.update_time = ''
StrengTeachingLibraryTable.page = 1
StrengTeachingLibraryTable.limit = 10
StrengTeachingLibraryTable.data = []
loadStrengthenTeachingLibraryList()
} else if (type === 6) {
NinjaTeachingLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": []
}
})
NinjaTeachingLibraryTable.searchParam.title = ''
NinjaTeachingLibraryTable.searchParam.status = ''
NinjaTeachingLibraryTable.searchParam.create_time = ''
NinjaTeachingLibraryTable.searchParam.update_time = ''
NinjaTeachingLibraryTable.page = 1
NinjaTeachingLibraryTable.limit = 10
NinjaTeachingLibraryTable.data = []
loadStrengthenTeachingLibraryList()
} else if (type === 7) {
SecurityTeachingLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": []
}
})
SecurityTeachingLibraryTable.searchParam.title = ''
SecurityTeachingLibraryTable.searchParam.status = ''
SecurityTeachingLibraryTable.searchParam.create_time = ''
SecurityTeachingLibraryTable.searchParam.update_time = ''
SecurityTeachingLibraryTable.page = 1
SecurityTeachingLibraryTable.limit = 10
SecurityTeachingLibraryTable.data = []
loadStrengthenTeachingLibraryList()
} else if (type === 8) {
PhysicalTeachingLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": []
}
})
PhysicalTeachingLibraryTable.searchParam.title = ''
PhysicalTeachingLibraryTable.searchParam.status = ''
PhysicalTeachingLibraryTable.searchParam.create_time = ''
PhysicalTeachingLibraryTable.searchParam.update_time = ''
PhysicalTeachingLibraryTable.page = 1
PhysicalTeachingLibraryTable.limit = 10
PhysicalTeachingLibraryTable.data = []
loadStrengthenTeachingLibraryList()
}
}

13
admin/src/app/views/physical_testing/components/Jump-lesson-library-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -139,6 +151,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

13
admin/src/app/views/physical_testing/components/basketball-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -134,6 +146,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

13
admin/src/app/views/physical_testing/components/en-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -133,6 +145,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

13
admin/src/app/views/physical_testing/components/lesson-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -134,6 +146,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

115
admin/src/app/views/physical_testing/physical_testing.vue

@ -72,10 +72,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 23)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -159,10 +160,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editJumpLessonLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 24)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -246,10 +248,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editEnTeachingLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 25)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -333,10 +336,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editBasketballTeachingLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 26)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -352,6 +356,7 @@
</el-tab-pane>
</el-tabs>
</el-card>
<binding-personnel ref="BindingPersonnelDialog" @complete="loadLessonCourseTeachingList" />
</div>
</template>
@ -367,6 +372,7 @@ import EditJump from '@/app/views/physical_testing/components/Jump-lesson-librar
import EditEn from '@/app/views/physical_testing/components/en-course-teaching-edit.vue'
import EditBasketball from '@/app/views/physical_testing/components/basketball-course-teaching-edit.vue'
import { useRoute } from 'vue-router'
import bindingPersonnel from '@/app/views/binding_personnel/binding_personnel.vue'
const route = useRoute()
const pageName = route.meta.title;
const active = 'CourseSyllabus'
@ -382,7 +388,7 @@ let lessonCourseTeachingTable = reactive({
"status":"",
"create_time":[],
"update_time":[],
table_type: 23
"table_type": 23
}
})
let JumpLessonLibraryTable = reactive({
@ -396,7 +402,7 @@ let JumpLessonLibraryTable = reactive({
"status":"",
"create_time":[],
"update_time":[],
table_type: 24
"table_type": 24
}
})
let EnTeachingLibraryTable = reactive({
@ -410,7 +416,7 @@ let EnTeachingLibraryTable = reactive({
"status":"",
"create_time":[],
"update_time":[],
table_type: 25
"table_type": 25
}
})
let BasketballTeachingLibraryTable = reactive({
@ -424,7 +430,7 @@ let BasketballTeachingLibraryTable = reactive({
"status":"",
"create_time":[],
"update_time":[],
table_type: 26
"table_type": 26
}
})
@ -449,7 +455,12 @@ const editLessonCourseTeachingDialog: Record<string, any> | null = ref(null)
const editJumpLessonLibraryDialog: Record<string, any> | null = ref(null)
const editEnTeachingLibraryDialog: Record<string, any> | null = ref(null)
const editBasketballTeachingLibraryDialog: Record<string, any> | null = ref(null)
const BindingPersonnelDialog: Record<string, any> | null = ref(null)
const addBindingPersonnel = (row) => {
BindingPersonnelDialog.value.setFormData(row)
BindingPersonnelDialog.value.showDialog = true
}
/**
* 获取课程教学大纲列表
*/
@ -644,68 +655,44 @@ const resetForm = (formEl: FormInstance | undefined, type: number) => {
if (!formEl) return
formEl.resetFields()
if (type === 23) {
lessonCourseTeachingTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": [],
table_type: 23
}
})
lessonCourseTeachingTable.searchParam.title = ''
lessonCourseTeachingTable.searchParam.status = ''
lessonCourseTeachingTable.searchParam.create_time = ''
lessonCourseTeachingTable.searchParam.update_time = ''
lessonCourseTeachingTable.page = 1
lessonCourseTeachingTable.limit = 10
lessonCourseTeachingTable.data = []
lessonCourseTeachingTable.table_type = 23
loadLessonCourseTeachingList()
} else if (type === 24) {
JumpLessonLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": [],
table_type: 24
}
})
JumpLessonLibraryTable.searchParam.title = ''
JumpLessonLibraryTable.searchParam.status = ''
JumpLessonLibraryTable.searchParam.create_time = ''
JumpLessonLibraryTable.searchParam.update_time = ''
JumpLessonLibraryTable.page = 1
JumpLessonLibraryTable.limit = 10
JumpLessonLibraryTable.data = []
JumpLessonLibraryTable.table_type = 24
loadJumpLessonLibraryList()
} else if (type === 25) {
EnTeachingLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": [],
table_type: 25
}
})
EnTeachingLibraryTable.searchParam.title = ''
EnTeachingLibraryTable.searchParam.status = ''
EnTeachingLibraryTable.searchParam.create_time = ''
EnTeachingLibraryTable.searchParam.update_time = ''
EnTeachingLibraryTable.page = 1
EnTeachingLibraryTable.limit = 10
EnTeachingLibraryTable.data = []
EnTeachingLibraryTable.table_type = 25
loadEnTeachingLibraryList()
} else if (type === 26) {
BasketballTeachingLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": [],
table_type: 26
}
})
BasketballTeachingLibraryTable.searchParam.title = ''
BasketballTeachingLibraryTable.searchParam.status = ''
BasketballTeachingLibraryTable.searchParam.create_time = ''
BasketballTeachingLibraryTable.searchParam.update_time = ''
BasketballTeachingLibraryTable.page = 1
BasketballTeachingLibraryTable.limit = 10
BasketballTeachingLibraryTable.data = []
BasketballTeachingLibraryTable.table_type = 26
loadBasketballTeachingLibraryList()
}
}

13
admin/src/app/views/professional_skills/components/Jump-lesson-library-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -139,6 +151,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

13
admin/src/app/views/professional_skills/components/basketball-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -134,6 +146,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

13
admin/src/app/views/professional_skills/components/en-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -133,6 +145,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

13
admin/src/app/views/professional_skills/components/lesson-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -134,6 +146,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

13
admin/src/app/views/professional_skills/components/ninja-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -134,6 +146,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

13
admin/src/app/views/professional_skills/components/security-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -134,6 +146,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

13
admin/src/app/views/professional_skills/components/strengthen-course-teaching-edit.vue

@ -21,6 +21,18 @@
</el-select>
</el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3">
<upload-image v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url2')" v-if="formData.type == 2">
<upload-file v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('url3')" v-if="formData.type == 1">
<upload-video v-model="formData.url" />
</el-form-item>
<el-form-item :label="t('content')" prop="content">
<editor v-model="formData.content" />
</el-form-item>
@ -133,6 +145,7 @@ const confirm = async (formEl: FormInstance | undefined) => {
save(data).then(res => {
loading.value = false
showDialog.value = false
formData.url = ''
emit('complete')
}).catch(err => {
loading.value = false

196
admin/src/app/views/professional_skills/professional_skills.vue

@ -72,10 +72,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 16)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -159,10 +160,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editJumpLessonLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 17)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -246,10 +248,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editEnTeachingLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 18)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -333,10 +336,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editBasketballTeachingLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 19)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -420,10 +424,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editStrengthenTeachingLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 20)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -507,10 +512,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editNinjaTeachingLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 21)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -594,10 +600,11 @@
</template>
</el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-table-column :label="t('operation')" fixed="right" min-width="180">
<template #default="{ row }">
<el-button type="primary" link @click="editSecurityTeachingLibrary(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id, 22)">{{ t('delete') }}</el-button>
<el-button type="primary" link @click="addBindingPersonnel(row)">{{ t('addBindingPersonnel') }}</el-button>
</template>
</el-table-column>
@ -613,6 +620,7 @@
</el-tab-pane>
</el-tabs>
</el-card>
<binding-personnel ref="BindingPersonnelDialog" @complete="loadLessonCourseTeachingList" />
</div>
</template>
@ -632,6 +640,7 @@ import EditNinja from '@/app/views/professional_skills/components/ninja-teaching
import EditSecurity from '@/app/views/professional_skills/components/security-teaching-edit.vue'
import EditPhysical from '@/app/views/professional_skills/components/physical-teaching-edit.vue'
import { useRoute } from 'vue-router'
import bindingPersonnel from '@/app/views/binding_personnel/binding_personnel.vue'
const route = useRoute()
const pageName = route.meta.title;
const active = 'CourseSyllabus'
@ -647,7 +656,7 @@ let lessonCourseTeachingTable = reactive({
"status":"",
"create_time":[],
"update_time":[],
table_type: 16
"table_type": 16
}
})
let JumpLessonLibraryTable = reactive({
@ -661,7 +670,7 @@ let JumpLessonLibraryTable = reactive({
"status":"",
"create_time":[],
"update_time":[],
table_type: 17
"table_type": 17
}
})
let EnTeachingLibraryTable = reactive({
@ -675,7 +684,7 @@ let EnTeachingLibraryTable = reactive({
"status":"",
"create_time":[],
"update_time":[],
table_type: 18
"table_type": 18
}
})
let BasketballTeachingLibraryTable = reactive({
@ -689,7 +698,7 @@ let BasketballTeachingLibraryTable = reactive({
"status":"",
"create_time":[],
"update_time":[],
table_type: 19
"table_type": 19
}
})
let StrengTeachingLibraryTable = reactive({
@ -703,7 +712,7 @@ let StrengTeachingLibraryTable = reactive({
"status":"",
"create_time":[],
"update_time":[],
table_type: 20
"table_type": 20
}
})
let NinjaTeachingLibraryTable = reactive({
@ -717,7 +726,7 @@ let NinjaTeachingLibraryTable = reactive({
"status":"",
"create_time":[],
"update_time":[],
table_type: 21
"table_type": 21
}
})
let SecurityTeachingLibraryTable = reactive({
@ -731,7 +740,7 @@ let SecurityTeachingLibraryTable = reactive({
"status":"",
"create_time":[],
"update_time":[],
table_type: 22
"table_type": 22
}
})
@ -759,7 +768,12 @@ const editBasketballTeachingLibraryDialog: Record<string, any> | null = ref(null
const editStrengthenTeachingLibraryDialog: Record<string, any> | null = ref(null)
const editNinjaTeachingLibraryDialog: Record<string, any> | null = ref(null)
const editSecurityTeachingLibraryDialog: Record<string, any> | null = ref(null)
const BindingPersonnelDialog: Record<string, any> | null = ref(null)
const addBindingPersonnel = (row) => {
BindingPersonnelDialog.value.setFormData(row)
BindingPersonnelDialog.value.showDialog = true
}
/**
* 获取课程教学大纲列表
*/
@ -1072,116 +1086,74 @@ const resetForm = (formEl: FormInstance | undefined, type: number) => {
if (!formEl) return
formEl.resetFields()
if (type === 16) {
lessonCourseTeachingTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": [],
table_type: 16
}
})
lessonCourseTeachingTable.searchParam.title = ''
lessonCourseTeachingTable.searchParam.status = ''
lessonCourseTeachingTable.searchParam.create_time = ''
lessonCourseTeachingTable.searchParam.update_time = ''
lessonCourseTeachingTable.page = 1
lessonCourseTeachingTable.limit = 10
lessonCourseTeachingTable.data = []
lessonCourseTeachingTable.table_type = 16
loadLessonCourseTeachingList()
} else if (type === 17) {
JumpLessonLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": [],
table_type: 17
}
})
JumpLessonLibraryTable.searchParam.title = ''
JumpLessonLibraryTable.searchParam.status = ''
JumpLessonLibraryTable.searchParam.create_time = ''
JumpLessonLibraryTable.searchParam.update_time = ''
JumpLessonLibraryTable.page = 1
JumpLessonLibraryTable.limit = 10
JumpLessonLibraryTable.data = []
JumpLessonLibraryTable.table_type = 17
loadJumpLessonLibraryList()
} else if (type === 18) {
EnTeachingLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": [],
table_type: 18
}
})
EnTeachingLibraryTable.searchParam.title = ''
EnTeachingLibraryTable.searchParam.status = ''
EnTeachingLibraryTable.searchParam.create_time = ''
EnTeachingLibraryTable.searchParam.update_time = ''
EnTeachingLibraryTable.page = 1
EnTeachingLibraryTable.limit = 10
EnTeachingLibraryTable.data = []
EnTeachingLibraryTable.table_type = 18
loadEnTeachingLibraryList()
} else if (type === 19) {
BasketballTeachingLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": [],
table_type: 19
}
})
BasketballTeachingLibraryTable.searchParam.title = ''
BasketballTeachingLibraryTable.searchParam.status = ''
BasketballTeachingLibraryTable.searchParam.create_time = ''
BasketballTeachingLibraryTable.searchParam.update_time = ''
BasketballTeachingLibraryTable.page = 1
BasketballTeachingLibraryTable.limit = 10
BasketballTeachingLibraryTable.data = []
BasketballTeachingLibraryTable.table_type = 19
loadBasketballTeachingLibraryList()
} else if (type === 20) {
StrengTeachingLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": [],
table_type: 20
}
})
StrengTeachingLibraryTable.searchParam.title = ''
StrengTeachingLibraryTable.searchParam.status = ''
StrengTeachingLibraryTable.searchParam.create_time = ''
StrengTeachingLibraryTable.searchParam.update_time = ''
StrengTeachingLibraryTable.page = 1
StrengTeachingLibraryTable.limit = 10
StrengTeachingLibraryTable.data = []
StrengTeachingLibraryTable.table_type = 20
loadStrengthenTeachingLibraryList()
} else if (type === 21) {
NinjaTeachingLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": [],
table_type: 21
}
})
NinjaTeachingLibraryTable.searchParam.title = ''
NinjaTeachingLibraryTable.searchParam.status = ''
NinjaTeachingLibraryTable.searchParam.create_time = ''
NinjaTeachingLibraryTable.searchParam.update_time = ''
NinjaTeachingLibraryTable.page = 1
NinjaTeachingLibraryTable.limit = 10
NinjaTeachingLibraryTable.data = []
NinjaTeachingLibraryTable.table_type = 21
loadStrengthenTeachingLibraryList()
} else if (type === 22) {
SecurityTeachingLibraryTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
"title": "",
"status": "",
"create_time": [],
"update_time": [],
table_type: 22
}
})
SecurityTeachingLibraryTable.searchParam.title = ''
SecurityTeachingLibraryTable.searchParam.status = ''
SecurityTeachingLibraryTable.searchParam.create_time = ''
SecurityTeachingLibraryTable.searchParam.update_time = ''
SecurityTeachingLibraryTable.page = 1
SecurityTeachingLibraryTable.limit = 10
SecurityTeachingLibraryTable.data = []
SecurityTeachingLibraryTable.table_type = 22
loadStrengthenTeachingLibraryList()
}
}

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

@ -1,358 +1,326 @@
<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-form-item :label="t('purchasePower')" prop="purchase_power">
<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-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>
<el-form-item :label="t('distance')" prop="distance">
<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-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-form-item>
<el-form-item :label="t('actualVisitTime')">
<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-form-item>
<el-form-item :label="t('firstVisitStatus')">
<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-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-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-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-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
>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import { addSixSpeed, editSixSpeed, getSixSpeedInfo } from '@/app/api/six_speed'
let showDialog = ref(false)
const loading = ref(false)
/**
* 表单数据
*/
const initialFormData = {
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 formData: Record<string, any> = reactive({ ...initialFormData })
const formRef = ref<FormInstance>()
//
const formRules = computed(() => {
return {
purchase_power: [
{
required: true,
message: t('purchasePowerPlaceholder'),
trigger: 'blur',
},
],
concept_awareness: [
{
required: true,
message: t('conceptAwarenessPlaceholder'),
trigger: 'blur',
},
],
preferred_class_time: [
{
required: true,
message: t('preferredClassTimePlaceholder'),
trigger: 'blur',
},
],
distance: [
{ required: true, message: t('distancePlaceholder'), trigger: 'blur' },
],
communication: [
{
required: true,
message: t('communicationPlaceholder'),
trigger: 'blur',
},
],
promised_visit_time: [
{
required: true,
message: t('promisedVisitTimePlaceholder'),
trigger: 'blur',
},
],
actual_visit_time: [
{
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',
},
],
second_visit_status: [
{
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' },
],
}
})
const emit = defineEmits(['complete'])
/**
* 确认
* @param formEl
*/
const confirm = async (formEl: FormInstance | undefined) => {
if (loading.value || !formEl) return
let save = formData.id ? editSixSpeed : addSixSpeed
await formEl.validate(async (valid) => {
if (valid) {
loading.value = true
let data = formData
save(data)
.then((res) => {
loading.value = false
showDialog.value = false
emit('complete')
})
.catch((err) => {
loading.value = false
})
}
})
}
//
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[key] != undefined) formData[key] = data[key]
})
}
loading.value = false
}
//
const mobileVerify = (rule: any, value: any, callback: any) => {
if (value && !/^1[3-9]\d{9}$/.test(value)) {
callback(new Error(t('generateMobile')))
} else {
callback()
}
}
//
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
)
) {
callback(new Error(t('generateIdCard')))
} else {
callback()
}
}
//
const emailVerify = (rule: any, value: any, callback: any) => {
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) {
callback(new Error(t('generateEmail')))
} else {
callback()
}
}
//
const numberVerify = (rule: any, value: any, callback: any) => {
if (!Number.isInteger(value)) {
callback(new Error(t('generateNumber')))
} else {
callback()
}
}
defineExpose({
showDialog,
setFormData,
})
</script>
<style lang="scss" scoped></style>
<style lang="scss">
.diy-dialog-wrap .el-form-item__label {
height: auto !important;
}
</style>
<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-form-item :label="t('purchasePower')" prop="purchase_power">
<el-select class="input-width" v-model="formData.purchase_power" clearable :placeholder="t('purchasePowerPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in purchase_powerList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('conceptAwareness')" prop="concept_awareness">
<el-select class="input-width" v-model="formData.concept_awareness" clearable :placeholder="t('conceptAwarenessPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in concept_awarenessList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('preferredClassTime')" prop="preferred_class_time" class="input-width">
<el-date-picker
class="flex-1 !flex"
v-model="formData.preferred_class_time"
clearable
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="t('preferredClassTimePlaceholder')">
</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-form-item>
<el-form-item :label="t('communication')" prop="communication">
<el-input v-model="formData.communication" type="textarea" rows="4" clearable :placeholder="t('communicationPlaceholder')" class="input-width"/>
</el-form-item>
<el-form-item :label="t('promisedVisitTime')" prop="promised_visit_time" class="input-width">
<el-date-picker
class="flex-1 !flex"
v-model="formData.promised_visit_time"
clearable
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="t('promisedVisitTimePlaceholder')">
</el-date-picker>
</el-form-item>
<el-form-item :label="t('actualVisitTime')" class="input-width">
<el-date-picker
class="flex-1 !flex"
v-model="formData.actual_visit_time"
clearable
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="t('actualVisitTimePlaceholder')">
</el-date-picker>
</el-form-item>
<el-form-item :label="t('callIntent')" prop="call_intent">
<el-select class="input-width" v-model="formData.call_intent" clearable :placeholder="t('callIntentPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in call_intentList"
:key="index"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('firstVisitStatus')" >
<el-input v-model="formData.first_visit_status" type="textarea" rows="4" clearable :placeholder="t('firstVisitStatusPlaceholder')" class="input-width"/>
</el-form-item>
<el-form-item :label="t('secondVisitStatus')" >
<el-input v-model="formData.second_visit_status" type="textarea" rows="4" clearable :placeholder="t('secondVisitStatusPlaceholder')" class="input-width"/>
</el-form-item>
<el-form-item :label="t('isClosed')" prop="is_closed">
<el-select class="input-width" v-model="formData.is_closed" clearable :placeholder="t('isClosedPlaceholder')">
<el-option label="请选择" value=""></el-option>
<el-option
v-for="(item, index) in is_closedList"
:key="index"
:label="item.name"
:value="item.value"
/>
</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>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang'
import type { FormInstance } from 'element-plus'
import { addSixSpeed, editSixSpeed, getSixSpeedInfo, getWithPersonnelList, getWithCustomerResourcesList } from '@/app/api/six_speed'
let showDialog = ref(false)
const loading = ref(false)
/**
* 表单数据
*/
const initialFormData = {
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: '',
}
const formData: Record<string, any> = reactive({ ...initialFormData })
const formRef = ref<FormInstance>()
//
const formRules = computed(() => {
return {
purchase_power: [
{ required: true, message: t('purchasePowerPlaceholder'), trigger: 'blur' },
]
,
concept_awareness: [
{ required: true, message: t('conceptAwarenessPlaceholder'), trigger: 'blur' },
]
,
preferred_class_time: [
{ required: true, message: t('preferredClassTimePlaceholder'), trigger: 'blur' },
]
,
distance: [
{ required: true, message: t('distancePlaceholder'), trigger: 'blur' },
]
,
communication: [
{ required: true, message: t('communicationPlaceholder'), trigger: 'blur' },
]
,
promised_visit_time: [
{ required: true, message: t('promisedVisitTimePlaceholder'), trigger: 'blur' },
]
,
actual_visit_time: [
{ 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' },
]
,
second_visit_status: [
{ required: true, message: t('secondVisitStatusPlaceholder'), trigger: 'blur' },
]
,
is_closed: [
{ required: true, message: t('isClosedPlaceholder'), trigger: 'blur' },
]
,
}
})
const emit = defineEmits(['complete'])
/**
* 确认
* @param formEl
*/
const confirm = async (formEl: FormInstance | undefined) => {
if (loading.value || !formEl) return
let save = formData.id ? editSixSpeed : addSixSpeed
await formEl.validate(async (valid) => {
if (valid) {
loading.value = true
let data = formData
save(data).then(res => {
loading.value = false
showDialog.value = false
emit('complete')
}).catch(err => {
loading.value = false
})
}
})
}
//
let purchase_powerList = ref([])
const purchase_powerDictList = async () => {
purchase_powerList.value = await (await useDictionary('customer_purchasing_power')).data.dictionary
}
purchase_powerDictList();
watch(() => purchase_powerList.value, () => { formData.purchase_power = purchase_powerList.value[0].value })
let concept_awarenessList = ref([])
const concept_awarenessDictList = async () => {
concept_awarenessList.value = await (await useDictionary('cognitive_concept')).data.dictionary
}
concept_awarenessDictList();
watch(() => concept_awarenessList.value, () => { formData.concept_awareness = concept_awarenessList.value[0].value })
let call_intentList = ref([])
const call_intentDictList = async () => {
call_intentList.value = await (await useDictionary('preliminarycustomerintention')).data.dictionary
}
call_intentDictList();
watch(() => call_intentList.value, () => { formData.call_intent = call_intentList.value[0].value })
let is_closedList = ref([])
const is_closedDictList = async () => {
is_closedList.value = await (await useDictionary('global_true_or_false')).data.dictionary
}
is_closedDictList();
watch(() => is_closedList.value, () => { formData.is_closed = is_closedList.value[0].value })
const staffIdList = ref([] as any[])
const setStaffIdList = async () => {
staffIdList.value = await (await getWithPersonnelList({})).data
}
setStaffIdList()
const resourceIdList = ref([] as any[])
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data
}
setResourceIdList()
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[key] != undefined) formData[key] = data[key]
})
}
loading.value = false
}
//
const mobileVerify = (rule: any, value: any, callback: any) => {
if (value && !/^1[3-9]\d{9}$/.test(value)) {
callback(new Error(t('generateMobile')))
} else {
callback()
}
}
//
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)) {
callback(new Error(t('generateIdCard')))
} else {
callback()
}
}
//
const emailVerify = (rule: any, value: any, callback: any) => {
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) {
callback(new Error(t('generateEmail')))
} else {
callback()
}
}
//
const numberVerify = (rule: any, value: any, callback: any) => {
if (!Number.isInteger(value)) {
callback(new Error(t('generateNumber')))
} else {
callback()
}
}
defineExpose({
showDialog,
setFormData
})
</script>
<style lang="scss" scoped></style>
<style lang="scss">
.diy-dialog-wrap .el-form-item__label{
height: auto !important;
}
</style>

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

@ -1,372 +1,214 @@
<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">
{{ t('addSixSpeed') }}
</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-form-item :label="t('purchasePower')" prop="purchase_power">
<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-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>
<el-form-item :label="t('distance')" prop="distance">
<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-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>
<el-form-item :label="t('actualVisitTime')" prop="actual_visit_time">
<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-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>
<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-form-item>
<el-form-item :label="t('staffId')" prop="staff_id">
<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-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-form-item>
</el-form>
</el-card>
<div class="mt-[10px]">
<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"
>
<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>
</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"
/>
</div>
</div>
<edit ref="editSixSpeedDialog" @complete="loadSixSpeedList" />
</el-card>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getSixSpeedList, deleteSixSpeed } from '@/app/api/six_speed'
import { img } from '@/utils/common'
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
let sixSpeedTable = reactive({
page: 1,
limit: 10,
total: 0,
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: '',
},
})
const searchFormRef = ref<FormInstance>()
//
const selectData = ref<any[]>([])
//
/**
* 获取六一速列表
*/
const loadSixSpeedList = (page: number = 1) => {
sixSpeedTable.loading = true
sixSpeedTable.page = page
getSixSpeedList({
page: sixSpeedTable.page,
limit: sixSpeedTable.limit,
...sixSpeedTable.searchParam,
})
.then((res) => {
sixSpeedTable.loading = false
sixSpeedTable.data = res.data.data
sixSpeedTable.total = res.data.total
})
.catch(() => {
sixSpeedTable.loading = false
})
}
loadSixSpeedList()
const editSixSpeedDialog: Record<string, any> | null = ref(null)
/**
* 添加六一速
*/
const addEvent = () => {
editSixSpeedDialog.value.setFormData()
editSixSpeedDialog.value.showDialog = true
}
/**
* 编辑六一速
* @param data
*/
const editEvent = (data: any) => {
editSixSpeedDialog.value.setFormData(data)
editSixSpeedDialog.value.showDialog = true
}
/**
* 删除六一速
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('sixSpeedDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}).then(() => {
deleteSixSpeed(id)
.then(() => {
loadSixSpeedList()
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
loadSixSpeedList()
}
</script>
<style lang="scss" scoped>
/* 多行超出隐藏 */
.multi-hidden {
word-break: break-all;
text-overflow: ellipsis;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
</style>
<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">
{{ t('addSixSpeed') }}
</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-form-item>
<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">
<template #empty>
<span>{{ !sixSpeedTable.loading ? t('emptyData') : '' }}</span>
</template>
<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 :label="t('callIntent')" min-width="180" align="center" :show-overflow-tooltip="true">
<template #default="{ row }">
<div v-for="(item, index) in call_intentList">
<div v-if="item.value == row.call_intent">{{ item.name }}</div>
</div>
</template>
</el-table-column>
<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 :label="t('isClosed')" min-width="180" align="center" :show-overflow-tooltip="true">
<template #default="{ row }">
<div v-for="(item, index) in is_closedList">
<div v-if="item.value == row.is_closed">{{ item.name }}</div>
</div>
</template>
</el-table-column>
<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>
</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" />
</div>
</div>
<edit ref="editSixSpeedDialog" @complete="loadSixSpeedList" />
</el-card>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getSixSpeedList, deleteSixSpeed, getWithPersonnelList, getWithCustomerResourcesList } from '@/app/api/six_speed'
import { img } from '@/utils/common'
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;
let sixSpeedTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam:{
}
})
const searchFormRef = ref<FormInstance>()
//
const selectData = ref<any[]>([])
//
const purchase_powerList = ref([] as any[])
const purchase_powerDictList = async () => {
purchase_powerList.value = await (await useDictionary('customer_purchasing_power')).data.dictionary
}
purchase_powerDictList();
const concept_awarenessList = ref([] as any[])
const concept_awarenessDictList = async () => {
concept_awarenessList.value = await (await useDictionary('cognitive_concept')).data.dictionary
}
concept_awarenessDictList();
const call_intentList = ref([] as any[])
const call_intentDictList = async () => {
call_intentList.value = await (await useDictionary('preliminarycustomerintention')).data.dictionary
}
call_intentDictList();
const is_closedList = ref([] as any[])
const is_closedDictList = async () => {
is_closedList.value = await (await useDictionary('global_true_or_false')).data.dictionary
}
is_closedDictList();
/**
* 获取六一速列表
*/
const loadSixSpeedList = (page: number = 1) => {
sixSpeedTable.loading = true
sixSpeedTable.page = page
getSixSpeedList({
page: sixSpeedTable.page,
limit: sixSpeedTable.limit,
...sixSpeedTable.searchParam
}).then(res => {
sixSpeedTable.loading = false
sixSpeedTable.data = res.data.data
sixSpeedTable.total = res.data.total
}).catch(() => {
sixSpeedTable.loading = false
})
}
loadSixSpeedList()
const editSixSpeedDialog: Record<string, any> | null = ref(null)
/**
* 添加六一速
*/
const addEvent = () => {
editSixSpeedDialog.value.setFormData()
editSixSpeedDialog.value.showDialog = true
}
/**
* 编辑六一速
* @param data
*/
const editEvent = (data: any) => {
editSixSpeedDialog.value.setFormData(data)
editSixSpeedDialog.value.showDialog = true
}
/**
* 删除六一速
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('sixSpeedDeleteTips'), t('warning'),
{
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteSixSpeed(id).then(() => {
loadSixSpeedList()
}).catch(() => {
})
})
}
const staffIdList = ref([])
const setStaffIdList = async () => {
staffIdList.value = await (await getWithPersonnelList({})).data
}
setStaffIdList()
const resourceIdList = ref([])
const setResourceIdList = async () => {
resourceIdList.value = await (await getWithCustomerResourcesList({})).data
}
setResourceIdList()
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
loadSixSpeedList()
}
</script>
<style lang="scss" scoped>
/* 多行超出隐藏 */
.multi-hidden {
word-break: break-all;
text-overflow: ellipsis;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
</style>

46
niucloud/app/adminapi/controller/customer_resources/CustomerResources.php

@ -64,13 +64,23 @@ class CustomerResources extends BaseAdminController
["initial_intent",""],
["campus",""],
["status",""],
["create_year_month",date("Y-m")],
["create_date",date("Y-m-d")]
]);
["create_year_month",date("Y-m")],
["create_date",date("Y-m-d")],
["purchase_power",""],
["concept_awareness",""],
["preferred_class_time",""],
["distance_tow",""],
["communication",""],
["promised_visit_time",""],
["actual_visit_time",""],
["call_intent",""],
["first_visit_status",""],
["second_visit_status",""],
["is_closed",""]
]);
$this->validate($data, 'app\validate\customer_resources\CustomerResources.add');
$id = (new CustomerResourcesService())->add($data);
return success('ADD_SUCCESS', ['id' => $id]);
return (new CustomerResourcesService())->add($data);
}
/**
@ -94,11 +104,27 @@ class CustomerResources extends BaseAdminController
["decision_maker",""],
["initial_intent",""],
["campus",""],
["status",""]
["status",""],
["create_year_month",date("Y-m")],
["create_date",date("Y-m-d")],
["purchase_power",""],
["concept_awareness",""],
["preferred_class_time",""],
["distance_tow",""],
["communication",""],
["promised_visit_time",""],
["actual_visit_time",""],
["call_intent",""],
["first_visit_status",""],
["second_visit_status",""],
["is_closed",""]
]);
$this->validate($data, 'app\validate\customer_resources\CustomerResources.edit');
(new CustomerResourcesService())->edit($id, $data);
return success('EDIT_SUCCESS');
return (new CustomerResourcesService())->edit($id, $data);
}
/**
@ -112,6 +138,10 @@ class CustomerResources extends BaseAdminController
}
public function getPersonnelAll(){
return success(( new CustomerResourcesService())->getPersonnelAll());
}
public function getCampusAll(){
return success(( new CustomerResourcesService())->getCampusAll());
}

72
niucloud/app/adminapi/controller/lesson_course_teaching/LessonCourseTeaching.php

@ -49,7 +49,8 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["table_type",1]
["table_type",1],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.add');
$id = (new LessonCourseTeachingService())->add($data);
@ -68,6 +69,7 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.edit');
(new LessonCourseTeachingService())->edit($id, $data);
@ -101,7 +103,8 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["table_type",2]
["table_type",2],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.add');
$id = (new LessonCourseTeachingService())->jumpAdd($data);
@ -120,6 +123,7 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.edit');
(new LessonCourseTeachingService())->jumpEdit($id, $data);
@ -154,7 +158,8 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["table_type",3]
["table_type",3],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.add');
$id = (new LessonCourseTeachingService())->enAdd($data);
@ -173,6 +178,7 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.edit');
(new LessonCourseTeachingService())->enEdit($id, $data);
@ -207,7 +213,8 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["table_type",4]
["table_type",4],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.add');
$id = (new LessonCourseTeachingService())->basketballAdd($data);
@ -226,6 +233,7 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.edit');
(new LessonCourseTeachingService())->basketballEdit($id, $data);
@ -260,7 +268,8 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["table_type",5]
["table_type",5],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.add');
$id = (new LessonCourseTeachingService())->strengAdd($data);
@ -279,6 +288,7 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.edit');
(new LessonCourseTeachingService())->strengEdit($id, $data);
@ -312,7 +322,8 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["table_type",6]
["table_type",6],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.add');
$id = (new LessonCourseTeachingService())->ninjaAdd($data);
@ -331,6 +342,7 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.edit');
(new LessonCourseTeachingService())->ninjaEdit($id, $data);
@ -364,7 +376,8 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["table_type",7]
["table_type",7],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.add');
$id = (new LessonCourseTeachingService())->securityAdd($data);
@ -383,6 +396,7 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.edit');
(new LessonCourseTeachingService())->securityEdit($id, $data);
@ -417,7 +431,8 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["table_type",8]
["table_type",8],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.add');
$id = (new LessonCourseTeachingService())->physicalAdd($data);
@ -436,6 +451,7 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.edit');
(new LessonCourseTeachingService())->physicalEdit($id, $data);
@ -469,7 +485,8 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["table_type",9]
["table_type",9],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.add');
$id = (new LessonCourseTeachingService())->actionAdd($data);
@ -488,6 +505,7 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.edit');
(new LessonCourseTeachingService())->actionEdit($id, $data);
@ -521,7 +539,8 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["table_type",10]
["table_type",10],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.add');
$id = (new LessonCourseTeachingService())->fitnessAdd($data);
@ -540,6 +559,7 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.edit');
(new LessonCourseTeachingService())->fitnessEdit($id, $data);
@ -573,7 +593,8 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["table_type",11]
["table_type",11],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.add');
$id = (new LessonCourseTeachingService())->gamesAdd($data);
@ -592,6 +613,7 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.edit');
(new LessonCourseTeachingService())->gamesEdit($id, $data);
@ -625,7 +647,8 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["table_type",12]
["table_type",12],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.add');
$id = (new LessonCourseTeachingService())->relaxationAdd($data);
@ -644,6 +667,7 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.edit');
(new LessonCourseTeachingService())->relaxationEdit($id, $data);
@ -669,7 +693,8 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["table_type",0]
["table_type",0],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.add');
$id = (new LessonCourseTeachingService())->publicAdd($data);
@ -682,12 +707,27 @@ class LessonCourseTeaching extends BaseAdminController
["type",0],
["content",""],
["status",0],
["url",'']
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.edit');
(new LessonCourseTeachingService())->publicEdit($id, $data);
return success('EDIT_SUCCESS');
}
public function setBindingModule(int $id){
$data = $this->request->params([
["user_permission",""],
["user_permission_name",""],
["table_type",0],
["id",0],
]);
$this->validate($data, 'app\validate\lesson_course_teaching\LessonCourseTeaching.add');
$id = (new LessonCourseTeachingService())->bindingModuleAdd($id, $data);
return success('ADD_SUCCESS', ['id' => $id]);
}
/**
@ -712,7 +752,11 @@ class LessonCourseTeaching extends BaseAdminController
public function getPersonnelDataAll(){
return success(( new LessonCourseTeachingService())->getPersonnelDataAll());
$data = $this->request->params([
["name",""],
["phone",""]
]);
return success((new LessonCourseTeachingService())->getPersonnelDataAll($data));
}
}

34
niucloud/app/adminapi/controller/six_speed/SixSpeed.php

@ -28,19 +28,7 @@ class SixSpeed extends BaseAdminController
*/
public function lists(){
$data = $this->request->params([
["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",""]
]);
return success((new SixSpeedService())->getPage($data));
}
@ -65,14 +53,12 @@ class SixSpeed extends BaseAdminController
["preferred_class_time",""],
["distance",""],
["communication",""],
["promised_visit_time","2025-05-16 17:57:14"],
["actual_visit_time","2025-05-16 17:57:14"],
["promised_visit_time","2025-05-18 16:21:59"],
["actual_visit_time","2025-05-18 16:21:59"],
["call_intent",""],
["first_visit_status",""],
["second_visit_status",""],
["is_closed",0],
["staff_id",0],
["resource_id",0],
]);
$this->validate($data, 'app\validate\six_speed\SixSpeed.add');
@ -92,14 +78,12 @@ class SixSpeed extends BaseAdminController
["preferred_class_time",""],
["distance",""],
["communication",""],
["promised_visit_time","2025-05-16 17:57:14"],
["actual_visit_time","2025-05-16 17:57:14"],
["promised_visit_time","2025-05-18 16:21:59"],
["actual_visit_time","2025-05-18 16:21:59"],
["call_intent",""],
["first_visit_status",""],
["second_visit_status",""],
["is_closed",0],
["staff_id",0],
["resource_id",0],
]);
$this->validate($data, 'app\validate\six_speed\SixSpeed.edit');
@ -118,4 +102,12 @@ class SixSpeed extends BaseAdminController
}
public function getPersonnelAll(){
return success(( new SixSpeedService())->getPersonnelAll());
}
public function getCustomerResourcesAll(){
return success(( new SixSpeedService())->getCustomerResourcesAll());
}
}

4
niucloud/app/adminapi/route/customer_resources.php

@ -18,6 +18,8 @@ use app\adminapi\middleware\AdminLog;
// USER_CODE_BEGIN -- customer_resources
Route::group('customer_resources', function () {
@ -33,6 +35,8 @@ Route::group('customer_resources', function () {
//删除客户资源
Route::delete('customer_resources/:id', 'customer_resources.CustomerResources/del');
Route::get('personnel_all','customer_resources.CustomerResources/getPersonnelAll');
Route::get('campus_all','customer_resources.CustomerResources/getCampusAll');
})->middleware([

2
niucloud/app/adminapi/route/lesson_course_teaching.php

@ -107,6 +107,8 @@ Route::group('lesson_course_teaching', function () {
Route::post('public_library', 'lesson_course_teaching.LessonCourseTeaching/publicAdd');
Route::put('public_library/:id', 'lesson_course_teaching.LessonCourseTeaching/publicEdit');
Route::put('binding_module/:id', 'lesson_course_teaching.LessonCourseTeaching/setBindingModule');
//教研管理详情
Route::get('lesson_course_teaching/:id', 'lesson_course_teaching.LessonCourseTeaching/info');
//删除教研管理

5
niucloud/app/adminapi/route/six_speed.php

@ -14,6 +14,7 @@ use think\facade\Route;
use app\adminapi\middleware\AdminCheckRole;
use app\adminapi\middleware\AdminCheckToken;
use app\adminapi\middleware\AdminLog;
// USER_CODE_BEGIN -- six_speed
Route::group('six_speed', function () {
@ -29,6 +30,10 @@ Route::group('six_speed', function () {
//删除六一速
Route::delete('six_speed/:id', 'six_speed.SixSpeed/del');
Route::get('personnel_all','six_speed.SixSpeed/getPersonnelAll');
Route::get('customer_resources_all','six_speed.SixSpeed/getCustomerResourcesAll');
})->middleware([
AdminCheckToken::class,
AdminCheckRole::class,

44
niucloud/app/api/controller/apiController/Common.php

@ -0,0 +1,44 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\api\controller\apiController;
use app\dict\member\MemberLoginTypeDict;
use app\Request;
use app\service\api\apiService\PersonnelService;
use app\service\api\captcha\CaptchaService;
use app\service\api\login\ConfigService;
use app\service\api\login\LoginService;
use core\base\BaseApiService;
use Exception;
use think\Response;
/**
* 公共控制器相关接口
* Class Personnel
* @package app\api\controller\apiController
*/
class Common extends BaseApiService
{
//员工详情
public function info(Request $request){
//获取员工信息
$where = [
'id'=>$this->member_id,
];
$res = (new PersonnelService())->info($where);
if(!$res){
return fail('账户信息有误');
}
return success($res);
}
}

26
niucloud/app/api/controller/apiController/Personnel.php

@ -39,7 +39,31 @@ class Personnel extends BaseApiService
if(!$res){
return fail('账户信息有误');
}
return success($result);
return success($res);
}
//员工修改
public function edit(Request $request){
$params = $request->all();
$data = [
'head_img'=>$params['head_img'],//头像|绝对地址
'name'=>$params['name'],//姓名
'address'=>$params['address'],//住址
'gender'=>$params['gender'],//性别
'birthday'=>$params['birthday'],//生日
'email'=>$params['email'],//邮箱
'phone'=>$params['phone'],//手机号
'wx'=>$params['wx'],//微信号
];
//获取员工信息
$where = [
'id'=>$this->member_id,
];
$res = (new PersonnelService())->edit($where,$data);
if(!$res['code']){
return fail('操作失败');
}
return success([]);
}
/**

36
niucloud/app/api/controller/apiController/teachingResearch.php

@ -0,0 +1,36 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\api\controller\apiController;
use app\dict\member\MemberLoginTypeDict;
use app\Request;
use app\service\api\apiService\PersonnelService;
use app\service\api\captcha\CaptchaService;
use app\service\api\login\ConfigService;
use app\service\api\login\LoginService;
use core\base\BaseApiService;
use Exception;
use think\Response;
/**
* 公共控制器相关接口
* Class Personnel
* @package app\api\controller\apiController
*/
class teachingResearch extends BaseApiService
{
//教研管理列表
public function list(){
$id = $this->member_id;
dd($id);
}
}

40
niucloud/app/api/route/route.php

@ -174,6 +174,20 @@ Route::group(function() {
Route::group(function() {
//员工登录
Route::post('personnelLogin', 'login.Login/personnelLogin');
})->middleware(ApiChannel::class)
->middleware(ApiPersonnelCheckToken::class)
->middleware(ApiLog::class);
@ -181,8 +195,28 @@ Route::group(function() {
//需要token验证的
Route::group(function() {
//上传图片
Route::post('uploadImage', 'upload.Upload/image');
//员工端详情
Route::get('personnel/info', 'apiController.Personnel/info');
//员工端-修改
Route::post('personnel/edit', 'apiController.Personnel/edit');
})->middleware(ApiChannel::class)
->middleware(ApiPersonnelCheckToken::class, true)
@ -197,8 +231,7 @@ Route::group(function() {
//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓-----用户端相关-----↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
//无需token验证的
Route::group(function() {
//员工登录
Route::post('personnelLogin', 'login.Login/personnelLogin');
// Route::post('personnelLogin', 'login.Login/personnelLogin');
})->middleware(ApiChannel::class)
->middleware(ApiCheckToken::class)
->middleware(ApiLog::class);
@ -206,8 +239,7 @@ Route::group(function() {
//需要token验证的
Route::group(function() {
Route::get('personnel/info', 'apiController.Personnel/info');
// Route::get('personnel/info', 'apiController.Personnel/info');
})->middleware(ApiChannel::class)
->middleware(ApiCheckToken::class, true)

28
niucloud/app/common.php

@ -1046,3 +1046,31 @@ function get_campus_where($user_id){
return $where;
}
function getModifiedFields(array $oldData, array $newData): array
{
$modifiedFields = [];
$oldValues = [];
$newValues = [];
foreach ($newData as $key => $newValue) {
if (!array_key_exists($key, $oldData)) {
continue;
}
if ($oldData[$key] != $newValue) {
$modifiedFields[] = $key;
$oldValues[$key] = $oldData[$key];
$newValues[$key] = $newValue;
}
}
return [
'is_save' => !empty($modifiedFields),
'modified_fields' => json_encode($modifiedFields, JSON_UNESCAPED_UNICODE),
'old_values' => json_encode($oldValues, JSON_UNESCAPED_UNICODE),
'new_values' => json_encode($newValues, JSON_UNESCAPED_UNICODE),
];
}

6
niucloud/app/model/customer_resources/CustomerResources.php

@ -16,6 +16,8 @@ use think\model\concern\SoftDelete;
use think\model\relation\HasMany;
use think\model\relation\HasOne;
use app\model\personnel\Personnel;
use app\model\campus\Campus;
/**
@ -81,6 +83,10 @@ class CustomerResources extends BaseModel
public function personnel(){
return $this->hasOne(Personnel::class, 'id', 'consultant')->joinType('left')->withField('name,id')->bind(['consultant_name'=>'name']);
}
public function campus(){
return $this->hasOne(Campus::class, 'id', 'campus')->joinType('left')->withField('campus_name,id')->bind(['campus_name'=>'campus_name']);
}

184
niucloud/app/model/six_speed/SixSpeed.php

@ -16,6 +16,10 @@ use think\model\concern\SoftDelete;
use think\model\relation\HasMany;
use think\model\relation\HasOne;
use app\model\personnel\Personnel;
use app\model\customer_resources\CustomerResources;
/**
* 六一速模型
* Class SixSpeed
@ -50,177 +54,17 @@ class SixSpeed extends BaseModel
*/
protected $defaultSoftDelete = 0;
/**
* 搜索器:六一速编号
* @param $value
* @param $data
*/
public function searchIdAttr($query, $value, $data)
{
if ($value) {
$query->where("id", $value);
}
}
/**
* 搜索器:六一速需求购买力
* @param $value
* @param $data
*/
public function searchPurchasePowerAttr($query, $value, $data)
{
if ($value) {
$query->where("purchase_power", $value);
}
}
/**
* 搜索器:六一速认知理念
* @param $value
* @param $data
*/
public function searchConceptAwarenessAttr($query, $value, $data)
{
if ($value) {
$query->where("concept_awareness", $value);
}
}
/**
* 搜索器:六一速可选上课时间
* @param $value
* @param $data
*/
public function searchPreferredClassTimeAttr($query, $value, $data)
{
if ($value) {
$query->where("preferred_class_time", $value);
}
}
/**
* 搜索器:六一速距离
* @param $value
* @param $data
*/
public function searchDistanceAttr($query, $value, $data)
{
if ($value) {
$query->where("distance", $value);
}
}
/**
* 搜索器:六一速沟通备注
* @param $value
* @param $data
*/
public function searchCommunicationAttr($query, $value, $data)
{
if ($value) {
$query->where("communication", $value);
}
}
/**
* 搜索器:六一速承诺到访时间
* @param $value
* @param $data
*/
public function searchPromisedVisitTimeAttr($query, $value, $data)
{
if ($value) {
$query->where("promised_visit_time", $value);
}
}
/**
* 搜索器:六一速实际到访时间
* @param $value
* @param $data
*/
public function searchActualVisitTimeAttr($query, $value, $data)
{
if ($value) {
$query->where("actual_visit_time", $value);
}
}
/**
* 搜索器:六一速电话后的意向程度: low-低, medium-中, high-高
* @param $value
* @param $data
*/
public function searchCallIntentAttr($query, $value, $data)
{
if ($value) {
$query->where("call_intent", $value);
}
}
/**
* 搜索器:六一速一访情况
* @param $value
* @param $data
*/
public function searchFirstVisitStatusAttr($query, $value, $data)
{
if ($value) {
$query->where("first_visit_status", $value);
}
}
/**
* 搜索器:六一速二访情况
* @param $value
* @param $data
*/
public function searchSecondVisitStatusAttr($query, $value, $data)
{
if ($value) {
$query->where("second_visit_status", $value);
}
}
/**
* 搜索器:六一速是否关单: 1-是, 0-否
* @param $value
* @param $data
*/
public function searchIsClosedAttr($query, $value, $data)
{
if ($value) {
$query->where("is_closed", $value);
}
}
/**
* 搜索器:六一速人员ID
* @param $value
* @param $data
*/
public function searchStaffIdAttr($query, $value, $data)
{
if ($value) {
$query->where("staff_id", $value);
}
}
/**
* 搜索器:六一速资源ID
* @param $value
* @param $data
*/
public function searchResourceIdAttr($query, $value, $data)
{
if ($value) {
$query->where("resource_id", $value);
}
public function personnel(){
return $this->hasOne(Personnel::class, 'id', 'staff_id')->joinType('left')->withField('name,id')->bind(['staff_id_name'=>'name']);
}
public function customerResources(){
return $this->hasOne(CustomerResources::class, 'id', 'resource_id')->joinType('left')->withField('name,id')->bind(['resource_id_name'=>'name']);
}
}

151
niucloud/app/service/admin/customer_resources/CustomerResourcesService.php

@ -11,9 +11,13 @@
namespace app\service\admin\customer_resources;
use app\model\customer_resource_changes\CustomerResourceChanges;
use app\model\customer_resources\CustomerResources;
use app\model\personnel\Personnel;
use app\model\campus\Campus;
use app\model\six_speed\SixSpeed;
use app\model\six_speed_modification_log\SixSpeedModificationLog;
use core\base\BaseAdminService;
@ -40,7 +44,7 @@ class CustomerResourcesService extends BaseAdminService
$field = 'id,create_year_month,create_date,source,source_channel,consultant,name,age,gender,phone_number,demand,purchasing_power,cognitive_idea,optional_class_time,distance,decision_maker,initial_intent,campus,created_at,updated_at,deleted_at,status';
$order = 'id desc';
$search_model = $this->model->where(get_campus_where($this->uid))->withSearch(["name","phone_number"], $where)->with(['campus'])->field($field)->order($order);
$search_model = $this->model->withSearch(["name","phone_number"], $where)->with(['personnel'])->field($field)->order($order);
$list = $this->pageQuery($search_model);
return $list;
}
@ -54,7 +58,12 @@ class CustomerResourcesService extends BaseAdminService
{
$field = 'id,create_year_month,create_date,source,source_channel,consultant,name,age,gender,phone_number,demand,purchasing_power,cognitive_idea,optional_class_time,distance,decision_maker,initial_intent,campus,created_at,updated_at,deleted_at,status';
$info = $this->model->field($field)->where([['id', "=", $id]])->findOrEmpty()->toArray();
$info = $this->model->field($field)->where([['id', "=", $id]])->with(['personnel'])->findOrEmpty()->toArray();
$sixSpeed = new SixSpeed();
$data = $sixSpeed->where(['resource_id' => $id])->field("*,distance as distance_tow")->findOrEmpty()->toArray();
$info = $info+$data;
return $info;
}
@ -65,9 +74,41 @@ class CustomerResourcesService extends BaseAdminService
*/
public function add(array $data)
{
$data['consultant'] = $this->username;
$personnel = new Personnel();
$data['consultant'] = $personnel->where(['sys_user_id' => $this->uid])->value("id");
if(!$data['consultant']){
return fail("操作失败");
}
$sixSpeed = new SixSpeed();
$res = $this->model->create($data);
return $res->id;
if($data['purchase_power']){
$six_id = $sixSpeed->where(['resource_id' => $res->id])->value("id");
$data['staff_id'] = $data['consultant'];
$field = [
'purchase_power' => $data['purchase_power'],
'concept_awareness' => $data['concept_awareness'],
'preferred_class_time' => $data['preferred_class_time'],
'distance' => $data['distance_tow'],
'communication' => $data['communication'],
'promised_visit_time' => $data['promised_visit_time'],
'actual_visit_time' => $data['actual_visit_time'],
'call_intent' => $data['call_intent'],
'first_visit_status' => $data['first_visit_status'],
'second_visit_status' => $data['second_visit_status'],
'is_closed' => $data['is_closed'],
'staff_id' => $data['staff_id'],
'resource_id' => $res->id
];
if($six_id){
$sixSpeed->where(['resource_id' => $res->id])->update($field);
}else{
$sixSpeed->insert($field);
}
}
return success("操作成功");
}
@ -75,14 +116,101 @@ class CustomerResourcesService extends BaseAdminService
* 客户资源编辑
* @param int $id
* @param array $data
* @return bool
*/
public function edit(int $id, array $data)
{
$data['consultant'] = $this->username;
$this->model->where([['id', '=', $id]])->update($data);
return true;
$personnel = new Personnel();
// $data['consultant'] = $personnel->where(['sys_user_id' => $this->uid])->value("id");
// if(!$data['consultant']){
// return fail("操作失败");
// }
$data['consultant'] = 1;
$res = $this->model->where([['id', '=', $id]])->findOrEmpty()->toArray();
$this->model->where([['id', '=', $id]])->update([
'source' => $data['source'],
'source_channel' => $data['source_channel'],
'consultant' => $data['consultant'],
'name' => $data['name'],
'age' => $data['age'],
'gender' => $data['gender'],
'phone_number' => $data['phone_number'],
'demand' => $data['demand'],
'purchasing_power' => $data['purchasing_power'],
'cognitive_idea' => $data['cognitive_idea'],
'optional_class_time' => $data['optional_class_time'],
'distance' => $data['distance'],
'decision_maker' => $data['decision_maker'],
'initial_intent' => $data['initial_intent'],
'campus' => $data['campus'],
'status' => $data['status'],
'create_year_month' => $data['create_year_month'],
'create_date' => $data['create_date']
]);
$resources_save = getModifiedFields($res,$data);
$customerResourceChanges = new CustomerResourceChanges();
if($resources_save['is_save']){
$customerResourceChanges->insert([
'customer_resource_id' => $id,
'operator_id' => $data['consultant'],
'campus_id' => $data['campus'],
'modified_fields' => $resources_save['modified_fields'],
'old_values' => $resources_save['old_values'],
'new_values' => $resources_save['new_values']
]);
}
$sixSpeed = new SixSpeed();
if($data['purchase_power']){
$sixSpeedModificationLog = new SixSpeedModificationLog();
$six_id = $sixSpeed->where(['resource_id' => $id])->value("id");
$data['staff_id'] = $data['consultant'];
$field = [
'purchase_power' => $data['purchase_power'],
'concept_awareness' => $data['concept_awareness'],
'preferred_class_time' => $data['preferred_class_time'],
'distance' => $data['distance_tow'],
'communication' => $data['communication'],
'promised_visit_time' => $data['promised_visit_time'],
'actual_visit_time' => $data['actual_visit_time'],
'call_intent' => $data['call_intent'],
'first_visit_status' => $data['first_visit_status'],
'second_visit_status' => $data['second_visit_status'],
'is_closed' => $data['is_closed'],
'staff_id' => $data['staff_id'],
'resource_id' => $id
];
if($six_id){
$six_log = $sixSpeed->where(['resource_id' => $id])->findOrEmpty()->toArray();
$six_save = getModifiedFields($six_log,$field);
if($six_save['is_save']){
$sixSpeedModificationLog->insert([
'customer_resource_id' => $id,
'operator_id' => $data['consultant'],
'campus_id' => $data['campus'],
'modified_field' => $six_save['modified_fields'],
'old_value' => $six_save['old_values'],
'new_value' => $six_save['new_values']
]);
}
$sixSpeed->where(['resource_id' => $id])->update($field);
}else{
$sixSpeed->insert($field);
}
}
return success("操作成功");
}
/**
@ -98,6 +226,11 @@ class CustomerResourcesService extends BaseAdminService
}
public function getPersonnelAll(){
$personnelModel = new Personnel();
return $personnelModel->select()->toArray();
}
public function getCampusAll(){
$campusModel = new Campus();
return $campusModel->select()->toArray();

26
niucloud/app/service/admin/lesson_course_teaching/LessonCourseTeachingService.php

@ -598,6 +598,11 @@ class LessonCourseTeachingService extends BaseAdminService
}
public function bindingModuleAdd(int $id, array $data)
{
$this->model->where([['id', '=', $id]])->update($data);
return true;
}
/**
* 获取教研管理信息
* @param int $id
@ -605,10 +610,10 @@ class LessonCourseTeachingService extends BaseAdminService
*/
public function getInfo(int $id)
{
$field = 'id,title,image,type,content,status,create_time,update_time,delete_time,table_type,user_permission';
$field = 'id,title,image,type,content,status,create_time,update_time,delete_time,table_type,user_permission,url';
$info = $this->model->field($field)->where([['id', "=", $id]])->with(['personnelData'])->findOrEmpty()->toArray();
$info['status'] = strval($info['status']);
$info['type'] = strval($info['type']);
return $info;
}
@ -625,9 +630,22 @@ class LessonCourseTeachingService extends BaseAdminService
}
public function getPersonnelDataAll(){
public function getPersonnelDataAll(array $where = []){
$personnelDataModel = new PersonnelData();
return $personnelDataModel->where('is_sys_user',1)->select()->toArray();
$field = 'id,name,gender,phone,status,status,sys_user_id,create_time,update_time';
$order = 'id desc';
$whereArr = [];
if (!empty($where['name'])) {
$whereArr[] = ['name','like',"'%'".$where['name']."'%'"];
}
if (!empty($where['phone'])) {
$whereArr[] = ['phone','like',"'%'".$where['phone']."'%'"];
}
$search_model = $personnelDataModel->where('is_sys_user', 1)->where($whereArr)->field($field)->order($order);
$list = $this->pageQuery($search_model);
return $list;
}

16
niucloud/app/service/admin/six_speed/SixSpeedService.php

@ -12,6 +12,8 @@
namespace app\service\admin\six_speed;
use app\model\six_speed\SixSpeed;
use app\model\personnel\Personnel;
use app\model\customer_resources\CustomerResources;
use core\base\BaseAdminService;
@ -39,7 +41,7 @@ class SixSpeedService extends BaseAdminService
$field = '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,created_at,updated_at,deleted_at';
$order = 'id desc';
$search_model = $this->model->withSearch(["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"], $where)->field($field)->order($order);
$search_model = $this->model->withSearch([], $where)->with(['personnel','customerResources'])->field($field)->order($order);
$list = $this->pageQuery($search_model);
return $list;
}
@ -53,7 +55,7 @@ class SixSpeedService extends BaseAdminService
{
$field = '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,created_at,updated_at,deleted_at';
$info = $this->model->field($field)->where([['id', "=", $id]])->findOrEmpty()->toArray();
$info = $this->model->field($field)->where([['id', "=", $id]])->with(['personnel','customerResources'])->findOrEmpty()->toArray();
return $info;
}
@ -95,5 +97,15 @@ class SixSpeedService extends BaseAdminService
}
public function getPersonnelAll(){
$personnelModel = new Personnel();
return $personnelModel->select()->toArray();
}
public function getCustomerResourcesAll(){
$customerResourcesModel = new CustomerResources();
return $customerResourcesModel->select()->toArray();
}
}

4
niucloud/app/service/admin/upload/UploadService.php

@ -61,8 +61,8 @@ class UploadService extends BaseAdminService
* @throws Exception
*/
public function document($file, string $type){
if(!in_array($type, FileDict::getSceneType()))
throw new UploadFileException('UPLOAD_TYPE_ERROR');
// if(!in_array($type, FileDict::getSceneType()))
// throw new UploadFileException('UPLOAD_TYPE_ERROR');
$dir = $this->root_path.'/document/'.$type.'/'.date('Ym').'/'.date('d');
$core_upload_service = new CoreUploadService();
return $core_upload_service->document($file, $type, $dir, StorageDict::LOCAL);

52
niucloud/app/service/api/apiService/PersonnelService.php

@ -12,8 +12,10 @@
namespace app\service\api\apiService;
use app\model\campus_person_role\CampusPersonRole;
use app\model\departments\Departments;
use app\model\member\Member;
use app\model\personnel\Personnel;
use app\model\sys\SysRole;
use app\service\core\member\CoreMemberService;
use core\base\BaseApiService;
use core\exception\ApiException;
@ -43,20 +45,64 @@ class PersonnelService extends BaseApiService
//查询部门信息
$campus_person_role = CampusPersonRole::where('person_id',$where['id'])->select()->toArray();
$role_id = array_column($campus_person_role, 'role_id');
$dept_id = array_column($campus_person_role, 'dept_id');
$role_id = array_unique(array_column($campus_person_role, 'role_id'));
$dept_id = array_unique(array_column($campus_person_role, 'dept_id'));
//查询用户角色
$role_name_arr = SysRole::whereIn('role_id',$role_id)->column('role_name');
$role_name_str = implode(',',$role_name_arr);//
//查询部门
$department_name_arr = Departments::whereIn('id',$dept_id)->column('department_name');
$department_name_str = implode(',',$department_name_arr);
if($res){
$res = $res->toArray();
$res['role_name_str'] = $role_name_str;
$res['department_name_str'] = $department_name_str;
}else{
$res = [];
return $res;
}
return $res;
}
//员工信息-修改
public function edit(array $where,array $data){
$data['update_time'] = date('Y-m-d H:i:s');
if(!$where){
return [
'code'=>0,
'msg'=>'查询条件不能为空'
];
}
$model = $this->model;
if(!empty($where['id'])){
$model = $model->where('id',$where['id']);
}
$res = $model->update($data);//员工信息
if($res){
$res = [
'code'=>1,
'msg'=>'操作成功'
];
}else{
$res = [
'code'=>0,
'msg'=>'操作失败'
];
}
return $res;
}
/**
* 获取会员的模型对象(todo 慎用!!! 现主要用于登录)
* @param array $data

8
niucloud/app/validate/six_speed/SixSpeed.php

@ -28,8 +28,6 @@ class SixSpeed extends BaseValidate
'promised_visit_time' => 'require',
'call_intent' => 'require',
'is_closed' => 'require',
'staff_id' => 'require',
'resource_id' => 'require',
];
protected $message = [
@ -41,13 +39,11 @@ class SixSpeed extends BaseValidate
'promised_visit_time.require' => ['common_validate.require', ['promised_visit_time']],
'call_intent.require' => ['common_validate.require', ['call_intent']],
'is_closed.require' => ['common_validate.require', ['is_closed']],
'staff_id.require' => ['common_validate.require', ['staff_id']],
'resource_id.require' => ['common_validate.require', ['resource_id']],
];
protected $scene = [
"add" => ['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'],
"edit" => ['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']
"add" => ['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'],
"edit" => ['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']
];
}

Loading…
Cancel
Save