1309 changed files with 11665 additions and 66555 deletions
@ -1,8 +1,8 @@ |
|||
# api请求地址 |
|||
VITE_APP_BASE_URL='http://146.56.228.75:20021/adminapi/' |
|||
VITE_APP_BASE_URL='http://zhjw.cc/adminapi/' |
|||
|
|||
# 图片服务器地址 |
|||
VITE_IMG_DOMAIN='' |
|||
VITE_IMG_DOMAIN='http://zhjw.cc' |
|||
|
|||
# 请求时header中token的参数名 |
|||
VITE_REQUEST_HEADER_TOKEN_KEY='token' |
|||
@ -1,8 +1,8 @@ |
|||
# api请求地址 |
|||
VITE_APP_BASE_URL='http://146.56.228.75:20021/adminapi/' |
|||
VITE_APP_BASE_URL='http://zhjw.cc/adminapi/' |
|||
|
|||
# 图片服务器地址 |
|||
VITE_IMG_DOMAIN='http://146.56.228.75:20021' |
|||
VITE_IMG_DOMAIN='http://zhjw.cc' |
|||
|
|||
# 请求时header中token的参数名 |
|||
VITE_REQUEST_HEADER_TOKEN_KEY='token' |
|||
|
|||
@ -1,5 +1,5 @@ |
|||
// Generated by 'unplugin-auto-import'
|
|||
export {} |
|||
declare global { |
|||
|
|||
const ElNotification: typeof import('element-plus/es')['ElNotification'] |
|||
} |
|||
|
|||
@ -0,0 +1,58 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
// USER_CODE_BEGIN -- campuses
|
|||
/** |
|||
* 获取校区管理列表 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function getCampusesList(params: Record<string, any>) { |
|||
return request.get(`zhjw/campuses`, {params}) |
|||
} |
|||
|
|||
/** |
|||
* 获取校区管理详情 |
|||
* @param id 校区管理id |
|||
* @returns |
|||
*/ |
|||
export function getCampusesInfo(id: number) { |
|||
return request.get(`zhjw/campuses/${id}`); |
|||
} |
|||
|
|||
/** |
|||
* 添加校区管理 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function addCampuses(params: Record<string, any>) { |
|||
return request.post('zhjw/campuses', params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 编辑校区管理 |
|||
* @param id |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function editCampuses(params: Record<string, any>) { |
|||
return request.put(`zhjw/campuses/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 删除校区管理 |
|||
* @param id |
|||
* @returns |
|||
*/ |
|||
export function deleteCampuses(id: number) { |
|||
return request.delete(`zhjw/campuses/${id}`, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
|
|||
|
|||
// USER_CODE_END -- campuses
|
|||
@ -0,0 +1,58 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
// USER_CODE_BEGIN -- classes
|
|||
/** |
|||
* 获取班级管理列表 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function getClassesList(params: Record<string, any>) { |
|||
return request.get(`zhjw/classes`, {params}) |
|||
} |
|||
|
|||
/** |
|||
* 获取班级管理详情 |
|||
* @param id 班级管理id |
|||
* @returns |
|||
*/ |
|||
export function getClassesInfo(id: number) { |
|||
return request.get(`zhjw/classes/${id}`); |
|||
} |
|||
|
|||
/** |
|||
* 添加班级管理 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function addClasses(params: Record<string, any>) { |
|||
return request.post('zhjw/classes', params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 编辑班级管理 |
|||
* @param id |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function editClasses(params: Record<string, any>) { |
|||
return request.put(`zhjw/classes/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 删除班级管理 |
|||
* @param id |
|||
* @returns |
|||
*/ |
|||
export function deleteClasses(id: number) { |
|||
return request.delete(`zhjw/classes/${id}`, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
export function getWithVenuesList(params: Record<string,any>){ |
|||
return request.get('zhjw/venues_all', {params}) |
|||
} |
|||
|
|||
// USER_CODE_END -- classes
|
|||
@ -0,0 +1,54 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
|
|||
|
|||
// USER_CODE_BEGIN -- courses
|
|||
/** |
|||
* 获取课程管理列表 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function getCoursesList(params: Record<string, any>) { |
|||
return request.get(`zhjw/courses`, {params}) |
|||
} |
|||
|
|||
/** |
|||
* 获取课程管理详情 |
|||
* @param id 课程管理id |
|||
* @returns |
|||
*/ |
|||
export function getCoursesInfo(id: number) { |
|||
return request.get(`zhjw/courses/${id}`); |
|||
} |
|||
|
|||
/** |
|||
* 添加课程管理 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function addCourses(params: Record<string, any>) { |
|||
return request.post('zhjw/courses', params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 编辑课程管理 |
|||
* @param id |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function editCourses(params: Record<string, any>) { |
|||
return request.put(`zhjw/courses/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 删除课程管理 |
|||
* @param id |
|||
* @returns |
|||
*/ |
|||
export function deleteCourses(id: number) { |
|||
return request.delete(`zhjw/courses/${id}`, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
|
|||
|
|||
// USER_CODE_END -- courses
|
|||
@ -0,0 +1,58 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
// USER_CODE_BEGIN -- roles
|
|||
/** |
|||
* 获取角色管理列表 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function getRolesList(params: Record<string, any>) { |
|||
return request.get(`zhjw/roles`, {params}) |
|||
} |
|||
|
|||
/** |
|||
* 获取角色管理详情 |
|||
* @param id 角色管理id |
|||
* @returns |
|||
*/ |
|||
export function getRolesInfo(id: number) { |
|||
return request.get(`zhjw/roles/${id}`); |
|||
} |
|||
|
|||
/** |
|||
* 添加角色管理 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function addRoles(params: Record<string, any>) { |
|||
return request.post('zhjw/roles', params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 编辑角色管理 |
|||
* @param id |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function editRoles(params: Record<string, any>) { |
|||
return request.put(`zhjw/roles/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 删除角色管理 |
|||
* @param id |
|||
* @returns |
|||
*/ |
|||
export function deleteRoles(id: number) { |
|||
return request.delete(`zhjw/roles/${id}`, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
|
|||
|
|||
// USER_CODE_END -- roles
|
|||
@ -0,0 +1,56 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
|
|||
|
|||
// USER_CODE_BEGIN -- staff
|
|||
/** |
|||
* 获取人员管理列表 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function getStaffList(params: Record<string, any>) { |
|||
return request.get(`zhjw/staff`, {params}) |
|||
} |
|||
|
|||
/** |
|||
* 获取人员管理详情 |
|||
* @param id 人员管理id |
|||
* @returns |
|||
*/ |
|||
export function getStaffInfo(id: number) { |
|||
return request.get(`zhjw/staff/${id}`); |
|||
} |
|||
|
|||
/** |
|||
* 添加人员管理 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function addStaff(params: Record<string, any>) { |
|||
return request.post('zhjw/staff', params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 编辑人员管理 |
|||
* @param id |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function editStaff(params: Record<string, any>) { |
|||
return request.put(`zhjw/staff/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 删除人员管理 |
|||
* @param id |
|||
* @returns |
|||
*/ |
|||
export function deleteStaff(id: number) { |
|||
return request.delete(`zhjw/staff/${id}`, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
export function getWithRolesList(params: Record<string,any>){ |
|||
return request.get('zhjw/roles_all', {params}) |
|||
} |
|||
|
|||
// USER_CODE_END -- staff
|
|||
@ -0,0 +1,58 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
// USER_CODE_BEGIN -- timetables
|
|||
/** |
|||
* 获取课表管理列表 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function getTimetablesList(params: Record<string, any>) { |
|||
return request.get(`zhjw/timetables`, {params}) |
|||
} |
|||
|
|||
/** |
|||
* 获取课表管理详情 |
|||
* @param id 课表管理id |
|||
* @returns |
|||
*/ |
|||
export function getTimetablesInfo(id: number) { |
|||
return request.get(`zhjw/timetables/${id}`); |
|||
} |
|||
|
|||
/** |
|||
* 添加课表管理 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function addTimetables(params: Record<string, any>) { |
|||
return request.post('zhjw/timetables', params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 编辑课表管理 |
|||
* @param id |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function editTimetables(params: Record<string, any>) { |
|||
return request.put(`zhjw/timetables/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 删除课表管理 |
|||
* @param id |
|||
* @returns |
|||
*/ |
|||
export function deleteTimetables(id: number) { |
|||
return request.delete(`zhjw/timetables/${id}`, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
export function getWithClassesList(params: Record<string,any>){ |
|||
return request.get('zhjw/classes_all', {params}) |
|||
} |
|||
|
|||
// USER_CODE_END -- timetables
|
|||
@ -0,0 +1,58 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
// USER_CODE_BEGIN -- venues
|
|||
/** |
|||
* 获取场地管理列表 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function getVenuesList(params: Record<string, any>) { |
|||
return request.get(`zhjw/venues`, {params}) |
|||
} |
|||
|
|||
/** |
|||
* 获取场地管理详情 |
|||
* @param id 场地管理id |
|||
* @returns |
|||
*/ |
|||
export function getVenuesInfo(id: number) { |
|||
return request.get(`zhjw/venues/${id}`); |
|||
} |
|||
|
|||
/** |
|||
* 添加场地管理 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function addVenues(params: Record<string, any>) { |
|||
return request.post('zhjw/venues', params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 编辑场地管理 |
|||
* @param id |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function editVenues(params: Record<string, any>) { |
|||
return request.put(`zhjw/venues/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 删除场地管理 |
|||
* @param id |
|||
* @returns |
|||
*/ |
|||
export function deleteVenues(id: number) { |
|||
return request.delete(`zhjw/venues/${id}`, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
export function getWithCampusesList(params: Record<string,any>){ |
|||
return request.get('zhjw/campuses_all', {params}) |
|||
} |
|||
|
|||
// USER_CODE_END -- venues
|
|||
@ -0,0 +1,19 @@ |
|||
{ |
|||
"name":"校区名称", |
|||
"namePlaceholder":"请输入校区名称", |
|||
"coordinate":"坐标地址", |
|||
"coordinatePlaceholder":"请输入坐标地址", |
|||
"address":"校区地址", |
|||
"addressPlaceholder":"请输入校区地址", |
|||
"contactPerson":"联系人", |
|||
"contactPersonPlaceholder":"请输入联系人", |
|||
"contactPhone":"联系电话", |
|||
"contactPhonePlaceholder":"请输入联系电话", |
|||
"status":"状态", |
|||
"statusPlaceholder":"请输入状态", |
|||
"addCampuses":"添加校区管理", |
|||
"updateCampuses":"编辑校区管理", |
|||
"campusesDeleteTips":"确定要删除该数据吗?", |
|||
"startDate":"请选择开始时间", |
|||
"endDate":"请选择结束时间" |
|||
} |
|||
@ -0,0 +1,21 @@ |
|||
{ |
|||
"name":"校区名称", |
|||
"coordinate":"坐标地址", |
|||
"address":"校区地址", |
|||
"contactPerson":"联系人", |
|||
"contactPhone":"联系电话", |
|||
"status":"状态", |
|||
"thumbnail":"缩略图", |
|||
"description":"校区描述", |
|||
"namePlaceholder":"请输入校区名称", |
|||
"coordinatePlaceholder":"请输入坐标地址", |
|||
"addressPlaceholder":"请输入校区地址", |
|||
"contactPersonPlaceholder":"请输入联系人", |
|||
"contactPhonePlaceholder":"请输入联系电话", |
|||
"statusPlaceholder":"请输入状态", |
|||
"thumbnailPlaceholder":"请上传缩略图", |
|||
"descriptionPlaceholder":"请输入校区描述", |
|||
"addCampuses":"添加校区管理", |
|||
"updateCampuses":"编辑校区管理", |
|||
"campusesDeleteTips":"确定要删除该校区管理吗?" |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
{ |
|||
"venueId":"所属场地", |
|||
"venueIdPlaceholder":"全部", |
|||
"name":"班级名称", |
|||
"namePlaceholder":"请输入班级名称", |
|||
"maxStudents":"最大学员数", |
|||
"maxStudentsPlaceholder":"请输入最大学员数", |
|||
"startDate":"开班时间", |
|||
"startDatePlaceholder":"请输入开班时间", |
|||
"endDate":"结班时间", |
|||
"endDatePlaceholder":"请输入结班时间", |
|||
"status":"状态", |
|||
"statusPlaceholder":"请输入状态", |
|||
"addClasses":"添加班级管理", |
|||
"updateClasses":"编辑班级管理", |
|||
"classesDeleteTips":"确定要删除该数据吗?", |
|||
"startDate":"请选择开始时间", |
|||
"endDate":"请选择结束时间" |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
{ |
|||
"venueId":"所属场地", |
|||
"thumbnail":"缩略图", |
|||
"name":"班级名称", |
|||
"maxStudents":"最大学员数", |
|||
"startDate":"开班时间", |
|||
"endDate":"结班时间", |
|||
"status":"状态", |
|||
"venueIdPlaceholder":"请输入所属场地", |
|||
"thumbnailPlaceholder":"请上传缩略图", |
|||
"namePlaceholder":"请输入班级名称", |
|||
"maxStudentsPlaceholder":"请输入最大学员数", |
|||
"startDatePlaceholder":"请选择开班时间", |
|||
"endDatePlaceholder":"请选择结班时间", |
|||
"statusPlaceholder":"请输入状态", |
|||
"addClasses":"添加班级管理", |
|||
"updateClasses":"编辑班级管理", |
|||
"classesDeleteTips":"确定要删除该班级管理吗?" |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
{ |
|||
"name":"课程名称", |
|||
"namePlaceholder":"请输入课程名称", |
|||
"description":"课程描述", |
|||
"descriptionPlaceholder":"请输入课程描述", |
|||
"targetGroup":"适合人群", |
|||
"targetGroupPlaceholder":"请输入适合人群", |
|||
"duration":"课时数", |
|||
"tastePrice":"体验价格", |
|||
"tastePricePlaceholder":"请输入体验价格", |
|||
"price":"正式价格", |
|||
"pricePlaceholder":"请输入正式价格", |
|||
"isAutomaticSigning":"是否自动签约", |
|||
"isAutomaticSigningPlaceholder":"请输入是否自动签约", |
|||
"status":"状态", |
|||
"statusPlaceholder":"请输入状态", |
|||
"addCourses":"添加课程管理", |
|||
"updateCourses":"编辑课程管理", |
|||
"coursesDeleteTips":"确定要删除该数据吗?", |
|||
"startDate":"请选择开始时间", |
|||
"endDate":"请选择结束时间" |
|||
} |
|||
@ -0,0 +1,25 @@ |
|||
{ |
|||
"name":"课程名称", |
|||
"description":"课程描述", |
|||
"thumbnail":"缩略图", |
|||
"targetGroup":"适合人群", |
|||
"duration":"课时数", |
|||
"tastePrice":"体验价格", |
|||
"price":"正式价格", |
|||
"isAutomaticSigning":"是否自动签约", |
|||
"automaticSigningTime":"自动签约", |
|||
"status":"状态", |
|||
"namePlaceholder":"请输入课程名称", |
|||
"descriptionPlaceholder":"请输入课程描述", |
|||
"thumbnailPlaceholder":"请上传缩略图", |
|||
"targetGroupPlaceholder":"请输入适合人群", |
|||
"durationPlaceholder":"请输入课时数", |
|||
"tastePricePlaceholder":"请输入体验价格", |
|||
"pricePlaceholder":"请输入正式价格", |
|||
"isAutomaticSigningPlaceholder":"请输入是否自动签约", |
|||
"automaticSigningTimePlaceholder":"请输入自动签约", |
|||
"statusPlaceholder":"请输入状态", |
|||
"addCourses":"添加课程管理", |
|||
"updateCourses":"编辑课程管理", |
|||
"coursesDeleteTips":"确定要删除该课程管理吗?" |
|||
} |
|||
@ -0,0 +1,10 @@ |
|||
{ |
|||
"id":"ID", |
|||
"name":"角色名称", |
|||
"namePlaceholder":"请输入角色名称", |
|||
"addRoles":"添加角色管理", |
|||
"updateRoles":"编辑角色管理", |
|||
"rolesDeleteTips":"确定要删除该数据吗?", |
|||
"startDate":"请选择开始时间", |
|||
"endDate":"请选择结束时间" |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
{ |
|||
"name":"角色名称", |
|||
"permissions":"数据权限配置", |
|||
"description":"角色描述", |
|||
"namePlaceholder":"请输入角色名称", |
|||
"permissionsPlaceholder":"请输入数据权限配置", |
|||
"descriptionPlaceholder":"请输入角色描述", |
|||
"addRoles":"添加角色管理", |
|||
"updateRoles":"编辑角色管理", |
|||
"rolesDeleteTips":"确定要删除该角色管理吗?" |
|||
} |
|||
@ -0,0 +1,21 @@ |
|||
{ |
|||
"name":"姓名", |
|||
"namePlaceholder":"请输入姓名", |
|||
"gender":"性别", |
|||
"genderPlaceholder":"请输入性别", |
|||
"phone":"联系方式", |
|||
"phonePlaceholder":"请输入联系方式", |
|||
"email":"邮箱", |
|||
"emailPlaceholder":"请输入邮箱", |
|||
"position":"职位", |
|||
"positionPlaceholder":"请输入职位", |
|||
"status":"状态", |
|||
"statusPlaceholder":"请输入状态", |
|||
"roleId":"角色关系", |
|||
"roleIdPlaceholder":"全部", |
|||
"addStaff":"添加人员管理", |
|||
"updateStaff":"编辑人员管理", |
|||
"staffDeleteTips":"确定要删除该数据吗?", |
|||
"startDate":"请选择开始时间", |
|||
"endDate":"请选择结束时间" |
|||
} |
|||
@ -0,0 +1,21 @@ |
|||
{ |
|||
"name":"姓名", |
|||
"header":"头像", |
|||
"gender":"性别", |
|||
"phone":"联系方式", |
|||
"email":"邮箱", |
|||
"position":"职位", |
|||
"status":"状态", |
|||
"roleId":"角色关系", |
|||
"namePlaceholder":"请输入姓名", |
|||
"headerPlaceholder":"请上传头像", |
|||
"genderPlaceholder":"请输入性别", |
|||
"phonePlaceholder":"请输入联系方式", |
|||
"emailPlaceholder":"请输入邮箱", |
|||
"positionPlaceholder":"请输入职位", |
|||
"statusPlaceholder":"请输入状态", |
|||
"roleIdPlaceholder":"请输入角色关系", |
|||
"addStaff":"添加人员管理", |
|||
"updateStaff":"编辑人员管理", |
|||
"staffDeleteTips":"确定要删除该人员管理吗?" |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
{ |
|||
"classId":"所属班级", |
|||
"classIdPlaceholder":"全部", |
|||
"cycle":"周期", |
|||
"cyclePlaceholder":"请输入周期", |
|||
"addTimetables":"添加课表管理", |
|||
"updateTimetables":"编辑课表管理", |
|||
"timetablesDeleteTips":"确定要删除该数据吗?", |
|||
"startDate":"请选择开始时间", |
|||
"endDate":"请选择结束时间" |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
{ |
|||
"classId":"所属班级", |
|||
"scheduleJson":"排课详情", |
|||
"cycle":"周期", |
|||
"classIdPlaceholder":"请输入所属班级", |
|||
"scheduleJsonPlaceholder":"请输入排课详情", |
|||
"cyclePlaceholder":"请输入周期", |
|||
"addTimetables":"添加课表管理", |
|||
"updateTimetables":"编辑课表管理", |
|||
"timetablesDeleteTips":"确定要删除该课表管理吗?" |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
{ |
|||
"campusId":"所属校区", |
|||
"campusIdPlaceholder":"全部", |
|||
"name":"场地名称", |
|||
"namePlaceholder":"请输入场地名称", |
|||
"type":"场地类型", |
|||
"typePlaceholder":"请输入场地类型", |
|||
"capacity":"容纳人数", |
|||
"capacityPlaceholder":"请输入容纳人数", |
|||
"availableTime":"可用时间段", |
|||
"availableTimePlaceholder":"请输入可用时间段", |
|||
"status":"状态", |
|||
"statusPlaceholder":"请输入状态", |
|||
"addVenues":"添加场地管理", |
|||
"updateVenues":"编辑场地管理", |
|||
"venuesDeleteTips":"确定要删除该数据吗?", |
|||
"startDate":"请选择开始时间", |
|||
"endDate":"请选择结束时间" |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
{ |
|||
"campusId":"所属校区", |
|||
"name":"场地名称", |
|||
"thumbnail":"缩略图", |
|||
"type":"场地类型", |
|||
"capacity":"容纳人数", |
|||
"availableTime":"可用时间段", |
|||
"status":"状态", |
|||
"campusIdPlaceholder":"请选择所属校区", |
|||
"namePlaceholder":"请输入场地名称", |
|||
"thumbnailPlaceholder":"请上传缩略图", |
|||
"typePlaceholder":"请输入场地类型", |
|||
"capacityPlaceholder":"请输入容纳人数", |
|||
"availableTimePlaceholder":"请输入可用时间段", |
|||
"statusPlaceholder":"请输入状态", |
|||
"addVenues":"添加场地管理", |
|||
"updateVenues":"编辑场地管理", |
|||
"venuesDeleteTips":"确定要删除该场地管理吗?" |
|||
} |
|||
@ -0,0 +1,207 @@ |
|||
<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('addCampuses') }} |
|||
</el-button> |
|||
</div> |
|||
|
|||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> |
|||
<el-form :inline="true" :model="campusesTable.searchParam" ref="searchFormRef"> |
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="campusesTable.searchParam.name" :placeholder="t('namePlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('coordinate')" prop="coordinate"> |
|||
<el-input v-model="campusesTable.searchParam.coordinate" :placeholder="t('coordinatePlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('address')" prop="address"> |
|||
<el-input v-model="campusesTable.searchParam.address" :placeholder="t('addressPlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('contactPerson')" prop="contact_person"> |
|||
<el-input v-model="campusesTable.searchParam.contact_person" :placeholder="t('contactPersonPlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('contactPhone')" prop="contact_phone"> |
|||
<el-input v-model="campusesTable.searchParam.contact_phone" :placeholder="t('contactPhonePlaceholder')" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-select class="w-[280px]" v-model="campusesTable.searchParam.status" clearable :placeholder="t('statusPlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button type="primary" @click="loadCampusesList()">{{ 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="campusesTable.data" size="large" v-loading="campusesTable.loading"> |
|||
<template #empty> |
|||
<span>{{ !campusesTable.loading ? t('emptyData') : '' }}</span> |
|||
</template> |
|||
<el-table-column prop="name" :label="t('name')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="coordinate" :label="t('coordinate')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="address" :label="t('address')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="contact_person" :label="t('contactPerson')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="contact_phone" :label="t('contactPhone')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column :label="t('status')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in statusList"> |
|||
<div v-if="item.value == row.status">{{ 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="campusesTable.page" v-model:page-size="campusesTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" :total="campusesTable.total" |
|||
@size-change="loadCampusesList()" @current-change="loadCampusesList" /> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
</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 { getCampusesList, deleteCampuses } from '@/addon/zhjw/api/campuses' |
|||
import { img } from '@/utils/common' |
|||
import { ElMessageBox,FormInstance } from 'element-plus' |
|||
import { useRouter } from 'vue-router' |
|||
import { useRoute } from 'vue-router' |
|||
const route = useRoute() |
|||
const pageName = route.meta.title; |
|||
|
|||
let campusesTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam:{ |
|||
"name":"", |
|||
"coordinate":"", |
|||
"address":"", |
|||
"contact_person":"", |
|||
"contact_phone":"", |
|||
"status":"" |
|||
} |
|||
}) |
|||
|
|||
const searchFormRef = ref<FormInstance>() |
|||
|
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
const statusList = ref([] as any[]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('is_radio')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
|
|||
/** |
|||
* 获取校区管理列表 |
|||
*/ |
|||
const loadCampusesList = (page: number = 1) => { |
|||
campusesTable.loading = true |
|||
campusesTable.page = page |
|||
|
|||
getCampusesList({ |
|||
page: campusesTable.page, |
|||
limit: campusesTable.limit, |
|||
...campusesTable.searchParam |
|||
}).then(res => { |
|||
campusesTable.loading = false |
|||
campusesTable.data = res.data.data |
|||
campusesTable.total = res.data.total |
|||
}).catch(() => { |
|||
campusesTable.loading = false |
|||
}) |
|||
} |
|||
loadCampusesList() |
|||
|
|||
const router = useRouter() |
|||
|
|||
/** |
|||
* 添加校区管理 |
|||
*/ |
|||
const addEvent = () => { |
|||
router.push('/campuses/campuses_edit') |
|||
} |
|||
|
|||
/** |
|||
* 编辑校区管理 |
|||
* @param data |
|||
*/ |
|||
const editEvent = (data: any) => { |
|||
router.push('/campuses/campuses_edit?id='+data.id) |
|||
} |
|||
|
|||
/** |
|||
* 删除校区管理 |
|||
*/ |
|||
const deleteEvent = (id: number) => { |
|||
ElMessageBox.confirm(t('campusesDeleteTips'), t('warning'), |
|||
{ |
|||
confirmButtonText: t('confirm'), |
|||
cancelButtonText: t('cancel'), |
|||
type: 'warning', |
|||
} |
|||
).then(() => { |
|||
deleteCampuses(id).then(() => { |
|||
loadCampusesList() |
|||
}).catch(() => { |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
|
|||
|
|||
const resetForm = (formEl: FormInstance | undefined) => { |
|||
if (!formEl) return |
|||
formEl.resetFields() |
|||
loadCampusesList() |
|||
} |
|||
</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> |
|||
@ -0,0 +1,221 @@ |
|||
<template> |
|||
<div class="main-container"> |
|||
<div class="detail-head"> |
|||
<div class="left" @click="back()"> |
|||
<span class="iconfont iconxiangzuojiantou !text-xs"></span> |
|||
<span class="ml-[1px]">{{t('returnToPreviousPage')}}</span> |
|||
</div> |
|||
<span class="adorn">|</span> |
|||
<span class="right">{{ pageName }}</span> |
|||
</div> |
|||
<el-card class="box-card !border-none" shadow="never"> |
|||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"> |
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="formData.name" clearable :placeholder="t('namePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('coordinate')" prop="coordinate"> |
|||
<el-input v-model="formData.coordinate" clearable :placeholder="t('coordinatePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('address')" prop="address"> |
|||
<el-input v-model="formData.address" clearable :placeholder="t('addressPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('contactPerson')" prop="contact_person"> |
|||
<el-input v-model="formData.contact_person" clearable :placeholder="t('contactPersonPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('contactPhone')" prop="contact_phone"> |
|||
<el-input v-model="formData.contact_phone" clearable :placeholder="t('contactPhonePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group v-model="formData.status" :placeholder="t('statusPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('thumbnail')"> |
|||
<upload-image v-model="formData.thumbnail" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('description')" prop="description"> |
|||
<el-input v-model="formData.description" clearable :placeholder="t('descriptionPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
</el-form> |
|||
</el-card> |
|||
<div class="fixed-footer-wrap"> |
|||
<div class="fixed-footer"> |
|||
<el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button> |
|||
<el-button @click="back()">{{ t('cancel') }}</el-button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { t } from '@/lang' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { getCampusesInfo,addCampuses,editCampuses } from '@/addon/zhjw/api/campuses'; |
|||
import { useRoute } from 'vue-router' |
|||
|
|||
const route = useRoute() |
|||
const id:number = parseInt(route.query.id); |
|||
const loading = ref(false) |
|||
const pageName = route.meta.title |
|||
|
|||
|
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: 0, |
|||
name: '', |
|||
coordinate: '', |
|||
address: '', |
|||
contact_person: '', |
|||
contact_phone: '', |
|||
status: '', |
|||
thumbnail: '', |
|||
description: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const setFormData = async (id:number = 0) => { |
|||
Object.assign(formData, initialFormData) |
|||
const data = await (await getCampusesInfo(id)).data |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
if(id) setFormData(id); |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('is_radio')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
watch(() => statusList.value, () => { formData.status = statusList.value[0].value }) |
|||
|
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
name: [ |
|||
{ required: true, message: t('namePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
coordinate: [ |
|||
{ required: true, message: t('coordinatePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
address: [ |
|||
{ required: true, message: t('addressPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
contact_person: [ |
|||
{ required: true, message: t('contactPersonPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
contact_phone: [ |
|||
{ required: true, message: t('contactPhonePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
thumbnail: [ |
|||
{ required: true, message: t('thumbnailPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
description: [ |
|||
{ required: true, message: t('descriptionPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const onSave = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
let data = formData |
|||
|
|||
const save = id ? editCampuses : addCampuses |
|||
save(data).then(res => { |
|||
loading.value = false |
|||
history.back() |
|||
}).catch(err => { |
|||
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() |
|||
} |
|||
} |
|||
const back = () => { |
|||
history.back() |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
@ -0,0 +1,225 @@ |
|||
<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('addClasses') }} |
|||
</el-button> |
|||
</div> |
|||
|
|||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> |
|||
<el-form :inline="true" :model="classesTable.searchParam" ref="searchFormRef"> |
|||
|
|||
<el-form-item :label="t('venueId')" prop="venue_id"> |
|||
<el-select class="w-[280px]" v-model="classesTable.searchParam.venue_id" clearable :placeholder="t('venueIdPlaceholder')"> |
|||
<el-option |
|||
v-for="(item, index) in venueIdList" |
|||
:key="index" |
|||
:label="item['name']" |
|||
:value="item['id']" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="classesTable.searchParam.name" :placeholder="t('namePlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('maxStudents')" prop="max_students"> |
|||
<el-input v-model="classesTable.searchParam.max_students" :placeholder="t('maxStudentsPlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('startDate')" prop="start_date"> |
|||
<el-date-picker v-model="classesTable.searchParam.start_date" type="datetimerange" format="YYYY-MM-DD hh:mm:ss" |
|||
:start-placeholder="t('startDate')" :end-placeholder="t('endDate')" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('endDate')" prop="end_date"> |
|||
<el-date-picker v-model="classesTable.searchParam.end_date" type="datetimerange" format="YYYY-MM-DD hh:mm:ss" |
|||
:start-placeholder="t('startDate')" :end-placeholder="t('endDate')" /> |
|||
</el-form-item> |
|||
|
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-select class="w-[280px]" v-model="classesTable.searchParam.status" clearable :placeholder="t('statusPlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button type="primary" @click="loadClassesList()">{{ 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="classesTable.data" size="large" v-loading="classesTable.loading"> |
|||
<template #empty> |
|||
<span>{{ !classesTable.loading ? t('emptyData') : '' }}</span> |
|||
</template> |
|||
<el-table-column prop="venue_id_name" :label="t('venueId')" 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="max_students" :label="t('maxStudents')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="start_date" :label="t('startDate')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="end_date" :label="t('endDate')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column :label="t('status')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in statusList"> |
|||
<div v-if="item.value == row.status">{{ 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="classesTable.page" v-model:page-size="classesTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" :total="classesTable.total" |
|||
@size-change="loadClassesList()" @current-change="loadClassesList" /> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
</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 { getClassesList, deleteClasses, getWithVenuesList } from '@/addon/zhjw/api/classes' |
|||
import { img } from '@/utils/common' |
|||
import { ElMessageBox,FormInstance } from 'element-plus' |
|||
import { useRouter } from 'vue-router' |
|||
import { useRoute } from 'vue-router' |
|||
const route = useRoute() |
|||
const pageName = route.meta.title; |
|||
|
|||
let classesTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam:{ |
|||
"venue_id":"", |
|||
"name":"", |
|||
"max_students":"", |
|||
"start_date":"", |
|||
"end_date":"", |
|||
"status":"" |
|||
} |
|||
}) |
|||
|
|||
const searchFormRef = ref<FormInstance>() |
|||
|
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
const statusList = ref([] as any[]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('bj_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
|
|||
/** |
|||
* 获取班级管理列表 |
|||
*/ |
|||
const loadClassesList = (page: number = 1) => { |
|||
classesTable.loading = true |
|||
classesTable.page = page |
|||
|
|||
getClassesList({ |
|||
page: classesTable.page, |
|||
limit: classesTable.limit, |
|||
...classesTable.searchParam |
|||
}).then(res => { |
|||
classesTable.loading = false |
|||
classesTable.data = res.data.data |
|||
classesTable.total = res.data.total |
|||
}).catch(() => { |
|||
classesTable.loading = false |
|||
}) |
|||
} |
|||
loadClassesList() |
|||
|
|||
const router = useRouter() |
|||
|
|||
/** |
|||
* 添加班级管理 |
|||
*/ |
|||
const addEvent = () => { |
|||
router.push('/classes/classes_edit') |
|||
} |
|||
|
|||
/** |
|||
* 编辑班级管理 |
|||
* @param data |
|||
*/ |
|||
const editEvent = (data: any) => { |
|||
router.push('/classes/classes_edit?id='+data.id) |
|||
} |
|||
|
|||
/** |
|||
* 删除班级管理 |
|||
*/ |
|||
const deleteEvent = (id: number) => { |
|||
ElMessageBox.confirm(t('classesDeleteTips'), t('warning'), |
|||
{ |
|||
confirmButtonText: t('confirm'), |
|||
cancelButtonText: t('cancel'), |
|||
type: 'warning', |
|||
} |
|||
).then(() => { |
|||
deleteClasses(id).then(() => { |
|||
loadClassesList() |
|||
}).catch(() => { |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
|
|||
const venueIdList = ref([]) |
|||
const setVenueIdList = async () => { |
|||
venueIdList.value = await (await getWithVenuesList({})).data |
|||
} |
|||
setVenueIdList() |
|||
|
|||
const resetForm = (formEl: FormInstance | undefined) => { |
|||
if (!formEl) return |
|||
formEl.resetFields() |
|||
loadClassesList() |
|||
} |
|||
</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> |
|||
@ -0,0 +1,236 @@ |
|||
<template> |
|||
<div class="main-container"> |
|||
<div class="detail-head"> |
|||
<div class="left" @click="back()"> |
|||
<span class="iconfont iconxiangzuojiantou !text-xs"></span> |
|||
<span class="ml-[1px]">{{t('returnToPreviousPage')}}</span> |
|||
</div> |
|||
<span class="adorn">|</span> |
|||
<span class="right">{{ pageName }}</span> |
|||
</div> |
|||
<el-card class="box-card !border-none" shadow="never"> |
|||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"> |
|||
|
|||
<el-form-item :label="t('venueId')" prop="venue_id"> |
|||
<el-radio-group v-model="formData.venue_id" :placeholder="t('venueIdPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in venueIdList" |
|||
:key="index" |
|||
:label="item['id']"> |
|||
{{ item['name'] }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('thumbnail')"> |
|||
<upload-image v-model="formData.thumbnail" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="formData.name" clearable :placeholder="t('namePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('maxStudents')" prop="max_students"> |
|||
<el-input v-model="formData.max_students" clearable :placeholder="t('maxStudentsPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('startDate')" prop="start_date" class="input-width"> |
|||
<el-date-picker |
|||
class="flex-1 !flex" |
|||
v-model="formData.start_date" |
|||
clearable |
|||
type="datetime" |
|||
value-format="YYYY-MM-DD HH:mm:ss" |
|||
:placeholder="t('startDatePlaceholder')"> |
|||
</el-date-picker> |
|||
</el-form-item> |
|||
<el-form-item :label="t('endDate')" prop="end_date" class="input-width"> |
|||
<el-date-picker |
|||
class="flex-1 !flex" |
|||
v-model="formData.end_date" |
|||
clearable |
|||
type="datetime" |
|||
value-format="YYYY-MM-DD HH:mm:ss" |
|||
:placeholder="t('endDatePlaceholder')"> |
|||
</el-date-picker> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group v-model="formData.status" :placeholder="t('statusPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
</el-form> |
|||
</el-card> |
|||
<div class="fixed-footer-wrap"> |
|||
<div class="fixed-footer"> |
|||
<el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button> |
|||
<el-button @click="back()">{{ t('cancel') }}</el-button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { t } from '@/lang' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { getClassesInfo,addClasses,editClasses, getWithVenuesList } from '@/addon/zhjw/api/classes'; |
|||
import { useRoute } from 'vue-router' |
|||
|
|||
const route = useRoute() |
|||
const id:number = parseInt(route.query.id); |
|||
const loading = ref(false) |
|||
const pageName = route.meta.title |
|||
|
|||
|
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: 0, |
|||
venue_id: '', |
|||
thumbnail: '', |
|||
name: '', |
|||
max_students: 0, |
|||
start_date: '', |
|||
end_date: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const setFormData = async (id:number = 0) => { |
|||
Object.assign(formData, initialFormData) |
|||
const data = await (await getClassesInfo(id)).data |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
if(id) setFormData(id); |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('bj_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
watch(() => statusList.value, () => { formData.status = statusList.value[0].value }) |
|||
|
|||
|
|||
const venueIdList = ref([] as any[]) |
|||
const setVenueIdList = async () => { |
|||
venueIdList.value = await (await getWithVenuesList({})).data |
|||
} |
|||
setVenueIdList() |
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
venue_id: [ |
|||
{ required: true, message: t('venueIdPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
thumbnail: [ |
|||
{ required: true, message: t('thumbnailPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
name: [ |
|||
{ required: true, message: t('namePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
max_students: [ |
|||
{ required: true, message: t('maxStudentsPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
start_date: [ |
|||
{ required: true, message: t('startDatePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
end_date: [ |
|||
{ required: true, message: t('endDatePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const onSave = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
let data = formData |
|||
|
|||
const save = id ? editClasses : addClasses |
|||
save(data).then(res => { |
|||
loading.value = false |
|||
history.back() |
|||
}).catch(err => { |
|||
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() |
|||
} |
|||
} |
|||
const back = () => { |
|||
history.back() |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
@ -0,0 +1,249 @@ |
|||
<template> |
|||
<el-dialog v-model="showDialog" :title="formData.id ? t('updateClasses') : t('addClasses')" 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('venueId')" prop="venue_id"> |
|||
<el-select class="input-width" v-model="formData.venue_id" clearable :placeholder="t('venueIdPlaceholder')"> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in venueIdList" |
|||
:key="index" |
|||
:label="item['name']" |
|||
:value="item['id']" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('thumbnail')"> |
|||
<upload-image v-model="formData.thumbnail" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('timetableId')" prop="timetable_id"> |
|||
<el-input v-model="formData.timetable_id" clearable :placeholder="t('timetableIdPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="formData.name" clearable :placeholder="t('namePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('maxStudents')" prop="max_students"> |
|||
<el-input v-model="formData.max_students" clearable :placeholder="t('maxStudentsPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('startDate')" prop="start_date" class="input-width"> |
|||
<el-date-picker |
|||
class="flex-1 !flex" |
|||
v-model="formData.start_date" |
|||
clearable |
|||
type="datetime" |
|||
value-format="YYYY-MM-DD HH:mm:ss" |
|||
:placeholder="t('startDatePlaceholder')"> |
|||
</el-date-picker> |
|||
</el-form-item> |
|||
<el-form-item :label="t('endDate')" prop="end_date" class="input-width"> |
|||
<el-date-picker |
|||
class="flex-1 !flex" |
|||
v-model="formData.end_date" |
|||
clearable |
|||
type="datetime" |
|||
value-format="YYYY-MM-DD HH:mm:ss" |
|||
:placeholder="t('endDatePlaceholder')"> |
|||
</el-date-picker> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group v-model="formData.status" :placeholder="t('statusPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</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 { addClasses, editClasses, getClassesInfo, getWithVenuesList } from '@/addon/zhjw/api/classes' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
venue_id: '', |
|||
thumbnail: '', |
|||
timetable_id: '', |
|||
name: '', |
|||
max_students: '', |
|||
start_date: '', |
|||
end_date: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
venue_id: [ |
|||
{ required: true, message: t('venueIdPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
thumbnail: [ |
|||
{ required: true, message: t('thumbnailPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
timetable_id: [ |
|||
{ required: true, message: t('timetableIdPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
name: [ |
|||
{ required: true, message: t('namePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
max_students: [ |
|||
{ required: true, message: t('maxStudentsPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
start_date: [ |
|||
{ required: true, message: t('startDatePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
end_date: [ |
|||
{ required: true, message: t('endDatePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editClasses : addClasses |
|||
|
|||
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 statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('bj_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
watch(() => statusList.value, () => { formData.status = statusList.value[0].value }) |
|||
|
|||
|
|||
const venueIdList = ref([] as any[]) |
|||
const setVenueIdList = async () => { |
|||
venueIdList.value = await (await getWithVenuesList({})).data |
|||
} |
|||
setVenueIdList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if(row){ |
|||
const data = await (await getClassesInfo(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> |
|||
@ -0,0 +1,255 @@ |
|||
<template> |
|||
<el-dialog v-model="showDialog" :title="formData.id ? t('updateCourses') : t('addCourses')" 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('name')" prop="name"> |
|||
<el-input v-model="formData.name" clearable :placeholder="t('namePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('description')" prop="description"> |
|||
<editor v-model="formData.description" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('thumbnail')"> |
|||
<upload-image v-model="formData.thumbnail" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('targetGroup')" prop="target_group"> |
|||
<el-input v-model="formData.target_group" clearable :placeholder="t('targetGroupPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('duration')" prop="duration"> |
|||
<el-input v-model="formData.duration" clearable :placeholder="t('durationPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('tastePrice')" prop="taste_price"> |
|||
<el-input v-model="formData.taste_price" clearable :placeholder="t('tastePricePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('price')" prop="price"> |
|||
<el-input v-model="formData.price" clearable :placeholder="t('pricePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('isAutomaticSigning')" prop="is_automatic_signing"> |
|||
<el-radio-group v-model="formData.is_automatic_signing" :placeholder="t('isAutomaticSigningPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in is_automatic_signingList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('automaticSigningTime')" prop="automatic_signing_time"> |
|||
<el-input v-model="formData.automatic_signing_time" clearable :placeholder="t('automaticSigningTimePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group v-model="formData.status" :placeholder="t('statusPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</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 { addCourses, editCourses, getCoursesInfo } from '@/addon/zhjw/api/courses' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
name: '', |
|||
description: '', |
|||
thumbnail: '', |
|||
target_group: '', |
|||
duration: '', |
|||
taste_price: '', |
|||
price: '', |
|||
is_automatic_signing: '', |
|||
automatic_signing_time: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
name: [ |
|||
{ required: true, message: t('namePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
description: [ |
|||
{ required: true, message: t('descriptionPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
thumbnail: [ |
|||
{ required: true, message: t('thumbnailPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
target_group: [ |
|||
{ required: true, message: t('targetGroupPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
duration: [ |
|||
{ required: true, message: t('durationPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
taste_price: [ |
|||
{ required: true, message: t('tastePricePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
price: [ |
|||
{ required: true, message: t('pricePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
is_automatic_signing: [ |
|||
{ required: true, message: t('isAutomaticSigningPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
automatic_signing_time: [ |
|||
{ required: true, message: t('automaticSigningTimePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editCourses : addCourses |
|||
|
|||
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 is_automatic_signingList = ref([]) |
|||
const is_automatic_signingDictList = async () => { |
|||
is_automatic_signingList.value = await (await useDictionary('is_radio')).data.dictionary |
|||
} |
|||
is_automatic_signingDictList(); |
|||
watch(() => is_automatic_signingList.value, () => { formData.is_automatic_signing = is_automatic_signingList.value[0].value }) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('config_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
watch(() => statusList.value, () => { formData.status = statusList.value[0].value }) |
|||
|
|||
|
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if(row){ |
|||
const data = await (await getCoursesInfo(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> |
|||
@ -0,0 +1,233 @@ |
|||
<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('addCourses') }} |
|||
</el-button> |
|||
</div> |
|||
|
|||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> |
|||
<el-form :inline="true" :model="coursesTable.searchParam" ref="searchFormRef"> |
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="coursesTable.searchParam.name" :placeholder="t('namePlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('targetGroup')" prop="target_group"> |
|||
<el-input v-model="coursesTable.searchParam.target_group" :placeholder="t('targetGroupPlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('tastePrice')" prop="taste_price"> |
|||
<el-input v-model="coursesTable.searchParam.taste_price" :placeholder="t('tastePricePlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('price')" prop="price"> |
|||
<el-input v-model="coursesTable.searchParam.price" :placeholder="t('pricePlaceholder')" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('isAutomaticSigning')" prop="is_automatic_signing"> |
|||
<el-select class="w-[280px]" v-model="coursesTable.searchParam.is_automatic_signing" clearable :placeholder="t('isAutomaticSigningPlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in is_automatic_signingList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-select class="w-[280px]" v-model="coursesTable.searchParam.status" clearable :placeholder="t('statusPlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button type="primary" @click="loadCoursesList()">{{ 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="coursesTable.data" size="large" v-loading="coursesTable.loading"> |
|||
<template #empty> |
|||
<span>{{ !coursesTable.loading ? t('emptyData') : '' }}</span> |
|||
</template> |
|||
<el-table-column prop="name" :label="t('name')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="description" :label="t('description')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="target_group" :label="t('targetGroup')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="duration" :label="t('duration')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="taste_price" :label="t('tastePrice')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="price" :label="t('price')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column :label="t('isAutomaticSigning')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in is_automatic_signingList"> |
|||
<div v-if="item.value == row.is_automatic_signing">{{ item.name }}</div> |
|||
</div> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column :label="t('status')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in statusList"> |
|||
<div v-if="item.value == row.status">{{ 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="coursesTable.page" v-model:page-size="coursesTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" :total="coursesTable.total" |
|||
@size-change="loadCoursesList()" @current-change="loadCoursesList" /> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
</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 { getCoursesList, deleteCourses } from '@/addon/zhjw/api/courses' |
|||
import { img } from '@/utils/common' |
|||
import { ElMessageBox,FormInstance } from 'element-plus' |
|||
import { useRouter } from 'vue-router' |
|||
import { useRoute } from 'vue-router' |
|||
const route = useRoute() |
|||
const pageName = route.meta.title; |
|||
|
|||
let coursesTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam:{ |
|||
"name":"", |
|||
"description":"", |
|||
"target_group":"", |
|||
"taste_price":"", |
|||
"price":"", |
|||
"is_automatic_signing":"", |
|||
"status":"" |
|||
} |
|||
}) |
|||
|
|||
const searchFormRef = ref<FormInstance>() |
|||
|
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
const is_automatic_signingList = ref([] as any[]) |
|||
const is_automatic_signingDictList = async () => { |
|||
is_automatic_signingList.value = await (await useDictionary('is_radio')).data.dictionary |
|||
} |
|||
is_automatic_signingDictList(); |
|||
const statusList = ref([] as any[]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('config_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
|
|||
/** |
|||
* 获取课程管理列表 |
|||
*/ |
|||
const loadCoursesList = (page: number = 1) => { |
|||
coursesTable.loading = true |
|||
coursesTable.page = page |
|||
|
|||
getCoursesList({ |
|||
page: coursesTable.page, |
|||
limit: coursesTable.limit, |
|||
...coursesTable.searchParam |
|||
}).then(res => { |
|||
coursesTable.loading = false |
|||
coursesTable.data = res.data.data |
|||
coursesTable.total = res.data.total |
|||
}).catch(() => { |
|||
coursesTable.loading = false |
|||
}) |
|||
} |
|||
loadCoursesList() |
|||
|
|||
const router = useRouter() |
|||
|
|||
/** |
|||
* 添加课程管理 |
|||
*/ |
|||
const addEvent = () => { |
|||
router.push('/courses/courses_edit') |
|||
} |
|||
|
|||
/** |
|||
* 编辑课程管理 |
|||
* @param data |
|||
*/ |
|||
const editEvent = (data: any) => { |
|||
router.push('/courses/courses_edit?id='+data.id) |
|||
} |
|||
|
|||
/** |
|||
* 删除课程管理 |
|||
*/ |
|||
const deleteEvent = (id: number) => { |
|||
ElMessageBox.confirm(t('coursesDeleteTips'), t('warning'), |
|||
{ |
|||
confirmButtonText: t('confirm'), |
|||
cancelButtonText: t('cancel'), |
|||
type: 'warning', |
|||
} |
|||
).then(() => { |
|||
deleteCourses(id).then(() => { |
|||
loadCoursesList() |
|||
}).catch(() => { |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
|
|||
|
|||
const resetForm = (formEl: FormInstance | undefined) => { |
|||
if (!formEl) return |
|||
formEl.resetFields() |
|||
loadCoursesList() |
|||
} |
|||
</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> |
|||
@ -0,0 +1,252 @@ |
|||
<template> |
|||
<div class="main-container"> |
|||
<div class="detail-head"> |
|||
<div class="left" @click="back()"> |
|||
<span class="iconfont iconxiangzuojiantou !text-xs"></span> |
|||
<span class="ml-[1px]">{{t('returnToPreviousPage')}}</span> |
|||
</div> |
|||
<span class="adorn">|</span> |
|||
<span class="right">{{ pageName }}</span> |
|||
</div> |
|||
<el-card class="box-card !border-none" shadow="never"> |
|||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"> |
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="formData.name" clearable :placeholder="t('namePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('description')" prop="description"> |
|||
<editor v-model="formData.description" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('thumbnail')"> |
|||
<upload-image v-model="formData.thumbnail" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('targetGroup')" prop="target_group"> |
|||
<el-input v-model="formData.target_group" clearable :placeholder="t('targetGroupPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('duration')" prop="duration"> |
|||
<el-input v-model="formData.duration" clearable :placeholder="t('durationPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('tastePrice')" prop="taste_price"> |
|||
<el-input v-model="formData.taste_price" clearable :placeholder="t('tastePricePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('price')" prop="price"> |
|||
<el-input v-model="formData.price" clearable :placeholder="t('pricePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('isAutomaticSigning')" prop="is_automatic_signing"> |
|||
<el-radio-group v-model="formData.is_automatic_signing" :placeholder="t('isAutomaticSigningPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in is_automatic_signingList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('automaticSigningTime')" prop="automatic_signing_time"> |
|||
<el-input v-model="formData.automatic_signing_time" clearable :placeholder="t('automaticSigningTimePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group v-model="formData.status" :placeholder="t('statusPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
</el-form> |
|||
</el-card> |
|||
<div class="fixed-footer-wrap"> |
|||
<div class="fixed-footer"> |
|||
<el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button> |
|||
<el-button @click="back()">{{ t('cancel') }}</el-button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { t } from '@/lang' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { getCoursesInfo,addCourses,editCourses } from '@/addon/zhjw/api/courses'; |
|||
import { useRoute } from 'vue-router' |
|||
|
|||
const route = useRoute() |
|||
const id:number = parseInt(route.query.id); |
|||
const loading = ref(false) |
|||
const pageName = route.meta.title |
|||
|
|||
|
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: 0, |
|||
name: '', |
|||
description: '', |
|||
thumbnail: '', |
|||
target_group: '', |
|||
duration: '', |
|||
taste_price: '', |
|||
price: '', |
|||
is_automatic_signing: '', |
|||
automatic_signing_time: 0, |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const setFormData = async (id:number = 0) => { |
|||
Object.assign(formData, initialFormData) |
|||
const data = await (await getCoursesInfo(id)).data |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
if(id) setFormData(id); |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
let is_automatic_signingList = ref([]) |
|||
const is_automatic_signingDictList = async () => { |
|||
is_automatic_signingList.value = await (await useDictionary('is_radio')).data.dictionary |
|||
} |
|||
is_automatic_signingDictList(); |
|||
watch(() => is_automatic_signingList.value, () => { formData.is_automatic_signing = is_automatic_signingList.value[0].value }) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('config_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
watch(() => statusList.value, () => { formData.status = statusList.value[0].value }) |
|||
|
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
name: [ |
|||
{ required: true, message: t('namePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
description: [ |
|||
{ required: true, message: t('descriptionPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
thumbnail: [ |
|||
{ required: true, message: t('thumbnailPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
target_group: [ |
|||
{ required: true, message: t('targetGroupPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
duration: [ |
|||
{ required: true, message: t('durationPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
taste_price: [ |
|||
{ required: true, message: t('tastePricePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
price: [ |
|||
{ required: true, message: t('pricePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
is_automatic_signing: [ |
|||
{ required: true, message: t('isAutomaticSigningPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
automatic_signing_time: [ |
|||
{ required: true, message: t('automaticSigningTimePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const onSave = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
let data = formData |
|||
|
|||
const save = id ? editCourses : addCourses |
|||
save(data).then(res => { |
|||
loading.value = false |
|||
history.back() |
|||
}).catch(err => { |
|||
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() |
|||
} |
|||
} |
|||
const back = () => { |
|||
history.back() |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
@ -0,0 +1,179 @@ |
|||
<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('addRoles') }} |
|||
</el-button> |
|||
</div> |
|||
|
|||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> |
|||
<el-form :inline="true" :model="rolesTable.searchParam" ref="searchFormRef"> |
|||
|
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-select class="w-[280px]" v-model="rolesTable.searchParam.name" clearable :placeholder="t('namePlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in nameList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button type="primary" @click="loadRolesList()">{{ 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="rolesTable.data" size="large" v-loading="rolesTable.loading"> |
|||
<template #empty> |
|||
<span>{{ !rolesTable.loading ? t('emptyData') : '' }}</span> |
|||
</template> |
|||
<el-table-column prop="id" :label="t('id')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column :label="t('name')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in nameList"> |
|||
<div v-if="item.value == row.name">{{ 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="rolesTable.page" v-model:page-size="rolesTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" :total="rolesTable.total" |
|||
@size-change="loadRolesList()" @current-change="loadRolesList" /> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
</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 { getRolesList, deleteRoles } from '@/addon/zhjw/api/roles' |
|||
import { img } from '@/utils/common' |
|||
import { ElMessageBox,FormInstance } from 'element-plus' |
|||
import { useRouter } from 'vue-router' |
|||
import { useRoute } from 'vue-router' |
|||
const route = useRoute() |
|||
const pageName = route.meta.title; |
|||
|
|||
let rolesTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam:{ |
|||
"name":"" |
|||
} |
|||
}) |
|||
|
|||
const searchFormRef = ref<FormInstance>() |
|||
|
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
const nameList = ref([] as any[]) |
|||
const nameDictList = async () => { |
|||
nameList.value = await (await useDictionary('roles_name')).data.dictionary |
|||
} |
|||
nameDictList(); |
|||
|
|||
/** |
|||
* 获取角色管理列表 |
|||
*/ |
|||
const loadRolesList = (page: number = 1) => { |
|||
rolesTable.loading = true |
|||
rolesTable.page = page |
|||
|
|||
getRolesList({ |
|||
page: rolesTable.page, |
|||
limit: rolesTable.limit, |
|||
...rolesTable.searchParam |
|||
}).then(res => { |
|||
rolesTable.loading = false |
|||
rolesTable.data = res.data.data |
|||
rolesTable.total = res.data.total |
|||
}).catch(() => { |
|||
rolesTable.loading = false |
|||
}) |
|||
} |
|||
loadRolesList() |
|||
|
|||
const router = useRouter() |
|||
|
|||
/** |
|||
* 添加角色管理 |
|||
*/ |
|||
const addEvent = () => { |
|||
router.push('/roles/roles_edit') |
|||
} |
|||
|
|||
/** |
|||
* 编辑角色管理 |
|||
* @param data |
|||
*/ |
|||
const editEvent = (data: any) => { |
|||
router.push('/roles/roles_edit?id='+data.id) |
|||
} |
|||
|
|||
/** |
|||
* 删除角色管理 |
|||
*/ |
|||
const deleteEvent = (id: number) => { |
|||
ElMessageBox.confirm(t('rolesDeleteTips'), t('warning'), |
|||
{ |
|||
confirmButtonText: t('confirm'), |
|||
cancelButtonText: t('cancel'), |
|||
type: 'warning', |
|||
} |
|||
).then(() => { |
|||
deleteRoles(id).then(() => { |
|||
loadRolesList() |
|||
}).catch(() => { |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
|
|||
|
|||
const resetForm = (formEl: FormInstance | undefined) => { |
|||
if (!formEl) return |
|||
formEl.resetFields() |
|||
loadRolesList() |
|||
} |
|||
</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> |
|||
@ -0,0 +1,171 @@ |
|||
<template> |
|||
<div class="main-container"> |
|||
<div class="detail-head"> |
|||
<div class="left" @click="back()"> |
|||
<span class="iconfont iconxiangzuojiantou !text-xs"></span> |
|||
<span class="ml-[1px]">{{t('returnToPreviousPage')}}</span> |
|||
</div> |
|||
<span class="adorn">|</span> |
|||
<span class="right">{{ pageName }}</span> |
|||
</div> |
|||
<el-card class="box-card !border-none" shadow="never"> |
|||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"> |
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-radio-group v-model="formData.name" :placeholder="t('namePlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in nameList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('permissions')" prop="permissions"> |
|||
<el-input v-model="formData.permissions" clearable :placeholder="t('permissionsPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('description')" > |
|||
<el-input v-model="formData.description" clearable :placeholder="t('descriptionPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
</el-form> |
|||
</el-card> |
|||
<div class="fixed-footer-wrap"> |
|||
<div class="fixed-footer"> |
|||
<el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button> |
|||
<el-button @click="back()">{{ t('cancel') }}</el-button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { t } from '@/lang' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { getRolesInfo,addRoles,editRoles } from '@/addon/zhjw/api/roles'; |
|||
import { useRoute } from 'vue-router' |
|||
|
|||
const route = useRoute() |
|||
const id:number = parseInt(route.query.id); |
|||
const loading = ref(false) |
|||
const pageName = route.meta.title |
|||
|
|||
|
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: 0, |
|||
name: '', |
|||
permissions: '', |
|||
description: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const setFormData = async (id:number = 0) => { |
|||
Object.assign(formData, initialFormData) |
|||
const data = await (await getRolesInfo(id)).data |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
if(id) setFormData(id); |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
let nameList = ref([]) |
|||
const nameDictList = async () => { |
|||
nameList.value = await (await useDictionary('roles_name')).data.dictionary |
|||
} |
|||
nameDictList(); |
|||
watch(() => nameList.value, () => { formData.name = nameList.value[0].value }) |
|||
|
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
name: [ |
|||
{ required: true, message: t('namePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
permissions: [ |
|||
{ required: true, message: t('permissionsPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
description: [ |
|||
{ required: true, message: t('descriptionPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const onSave = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
let data = formData |
|||
|
|||
const save = id ? editRoles : addRoles |
|||
save(data).then(res => { |
|||
loading.value = false |
|||
history.back() |
|||
}).catch(err => { |
|||
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() |
|||
} |
|||
} |
|||
const back = () => { |
|||
history.back() |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
@ -0,0 +1,248 @@ |
|||
<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('addStaff') }} |
|||
</el-button> |
|||
</div> |
|||
|
|||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> |
|||
<el-form :inline="true" :model="staffTable.searchParam" ref="searchFormRef"> |
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="staffTable.searchParam.name" :placeholder="t('namePlaceholder')" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('gender')" prop="gender"> |
|||
<el-select class="w-[280px]" v-model="staffTable.searchParam.gender" clearable :placeholder="t('genderPlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in genderList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('phone')" prop="phone"> |
|||
<el-input v-model="staffTable.searchParam.phone" :placeholder="t('phonePlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('email')" prop="email"> |
|||
<el-input v-model="staffTable.searchParam.email" :placeholder="t('emailPlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('position')" prop="position"> |
|||
<el-input v-model="staffTable.searchParam.position" :placeholder="t('positionPlaceholder')" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-select class="w-[280px]" v-model="staffTable.searchParam.status" clearable :placeholder="t('statusPlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
|
|||
<el-form-item :label="t('roleId')" prop="role_id"> |
|||
<el-select class="w-[280px]" v-model="staffTable.searchParam.role_id" clearable :placeholder="t('roleIdPlaceholder')"> |
|||
<el-option |
|||
v-for="(item, index) in roleIdList" |
|||
:key="index" |
|||
:label="item['description']" |
|||
:value="item['id']" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button type="primary" @click="loadStaffList()">{{ 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="staffTable.data" size="large" v-loading="staffTable.loading"> |
|||
<template #empty> |
|||
<span>{{ !staffTable.loading ? t('emptyData') : '' }}</span> |
|||
</template> |
|||
<el-table-column prop="name" :label="t('name')" 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" :label="t('phone')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="email" :label="t('email')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="position" :label="t('position')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column :label="t('status')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in statusList"> |
|||
<div v-if="item.value == row.status">{{ item.name }}</div> |
|||
</div> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column prop="role_id_name" :label="t('roleId')" 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="staffTable.page" v-model:page-size="staffTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" :total="staffTable.total" |
|||
@size-change="loadStaffList()" @current-change="loadStaffList" /> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
</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 { getStaffList, deleteStaff, getWithRolesList } from '@/addon/zhjw/api/staff' |
|||
import { img } from '@/utils/common' |
|||
import { ElMessageBox,FormInstance } from 'element-plus' |
|||
import { useRouter } from 'vue-router' |
|||
import { useRoute } from 'vue-router' |
|||
const route = useRoute() |
|||
const pageName = route.meta.title; |
|||
|
|||
let staffTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam:{ |
|||
"name":"", |
|||
"gender":"", |
|||
"phone":"", |
|||
"email":"", |
|||
"position":"", |
|||
"status":"", |
|||
"role_id":"" |
|||
} |
|||
}) |
|||
|
|||
const searchFormRef = ref<FormInstance>() |
|||
|
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
const genderList = ref([] as any[]) |
|||
const genderDictList = async () => { |
|||
genderList.value = await (await useDictionary('sex')).data.dictionary |
|||
} |
|||
genderDictList(); |
|||
const statusList = ref([] as any[]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('zz_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
|
|||
/** |
|||
* 获取人员管理列表 |
|||
*/ |
|||
const loadStaffList = (page: number = 1) => { |
|||
staffTable.loading = true |
|||
staffTable.page = page |
|||
|
|||
getStaffList({ |
|||
page: staffTable.page, |
|||
limit: staffTable.limit, |
|||
...staffTable.searchParam |
|||
}).then(res => { |
|||
staffTable.loading = false |
|||
staffTable.data = res.data.data |
|||
staffTable.total = res.data.total |
|||
}).catch(() => { |
|||
staffTable.loading = false |
|||
}) |
|||
} |
|||
loadStaffList() |
|||
|
|||
const router = useRouter() |
|||
|
|||
/** |
|||
* 添加人员管理 |
|||
*/ |
|||
const addEvent = () => { |
|||
router.push('/staff/staff_edit') |
|||
} |
|||
|
|||
/** |
|||
* 编辑人员管理 |
|||
* @param data |
|||
*/ |
|||
const editEvent = (data: any) => { |
|||
router.push('/staff/staff_edit?id='+data.id) |
|||
} |
|||
|
|||
/** |
|||
* 删除人员管理 |
|||
*/ |
|||
const deleteEvent = (id: number) => { |
|||
ElMessageBox.confirm(t('staffDeleteTips'), t('warning'), |
|||
{ |
|||
confirmButtonText: t('confirm'), |
|||
cancelButtonText: t('cancel'), |
|||
type: 'warning', |
|||
} |
|||
).then(() => { |
|||
deleteStaff(id).then(() => { |
|||
loadStaffList() |
|||
}).catch(() => { |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
|
|||
const roleIdList = ref([]) |
|||
const setRoleIdList = async () => { |
|||
roleIdList.value = await (await getWithRolesList({})).data |
|||
} |
|||
setRoleIdList() |
|||
|
|||
const resetForm = (formEl: FormInstance | undefined) => { |
|||
if (!formEl) return |
|||
formEl.resetFields() |
|||
loadStaffList() |
|||
} |
|||
</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> |
|||
@ -0,0 +1,246 @@ |
|||
<template> |
|||
<div class="main-container"> |
|||
<div class="detail-head"> |
|||
<div class="left" @click="back()"> |
|||
<span class="iconfont iconxiangzuojiantou !text-xs"></span> |
|||
<span class="ml-[1px]">{{t('returnToPreviousPage')}}</span> |
|||
</div> |
|||
<span class="adorn">|</span> |
|||
<span class="right">{{ pageName }}</span> |
|||
</div> |
|||
<el-card class="box-card !border-none" shadow="never"> |
|||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"> |
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="formData.name" clearable :placeholder="t('namePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('header')"> |
|||
<upload-image v-model="formData.header" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('gender')" prop="gender"> |
|||
<el-radio-group v-model="formData.gender" :placeholder="t('genderPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in genderList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('phone')" prop="phone"> |
|||
<el-input v-model="formData.phone" clearable :placeholder="t('phonePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('email')" prop="email"> |
|||
<el-input v-model="formData.email" clearable :placeholder="t('emailPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('position')" prop="position"> |
|||
<el-input v-model="formData.position" clearable :placeholder="t('positionPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group v-model="formData.status" :placeholder="t('statusPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
|
|||
<el-form-item :label="t('roleId')" prop="role_id"> |
|||
<el-radio-group v-model="formData.role_id" :placeholder="t('roleIdPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in roleIdList" |
|||
:key="index" |
|||
:label="item['id']"> |
|||
{{ item['description'] }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
</el-form> |
|||
</el-card> |
|||
<div class="fixed-footer-wrap"> |
|||
<div class="fixed-footer"> |
|||
<el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button> |
|||
<el-button @click="back()">{{ t('cancel') }}</el-button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { t } from '@/lang' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { getStaffInfo,addStaff,editStaff, getWithRolesList } from '@/addon/zhjw/api/staff'; |
|||
import { useRoute } from 'vue-router' |
|||
|
|||
const route = useRoute() |
|||
const id:number = parseInt(route.query.id); |
|||
const loading = ref(false) |
|||
const pageName = route.meta.title |
|||
|
|||
|
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: 0, |
|||
name: '', |
|||
header: '', |
|||
gender: '', |
|||
phone: '', |
|||
email: '', |
|||
position: '', |
|||
status: '', |
|||
role_id: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const setFormData = async (id:number = 0) => { |
|||
Object.assign(formData, initialFormData) |
|||
const data = await (await getStaffInfo(id)).data |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
if(id) setFormData(id); |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
let genderList = ref([]) |
|||
const genderDictList = async () => { |
|||
genderList.value = await (await useDictionary('sex')).data.dictionary |
|||
} |
|||
genderDictList(); |
|||
watch(() => genderList.value, () => { formData.gender = genderList.value[0].value }) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('zz_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
watch(() => statusList.value, () => { formData.status = statusList.value[0].value }) |
|||
|
|||
|
|||
const roleIdList = ref([] as any[]) |
|||
const setRoleIdList = async () => { |
|||
roleIdList.value = await (await getWithRolesList({})).data |
|||
} |
|||
setRoleIdList() |
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
name: [ |
|||
{ required: true, message: t('namePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
header: [ |
|||
{ required: true, message: t('headerPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
gender: [ |
|||
{ required: true, message: t('genderPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
phone: [ |
|||
{ required: true, message: t('phonePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
email: [ |
|||
{ required: true, message: t('emailPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
position: [ |
|||
{ required: true, message: t('positionPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
role_id: [ |
|||
{ required: true, message: t('roleIdPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const onSave = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
let data = formData |
|||
|
|||
const save = id ? editStaff : addStaff |
|||
save(data).then(res => { |
|||
loading.value = false |
|||
history.back() |
|||
}).catch(err => { |
|||
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() |
|||
} |
|||
} |
|||
const back = () => { |
|||
history.back() |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
@ -0,0 +1,187 @@ |
|||
<template> |
|||
<el-dialog v-model="showDialog" :title="formData.id ? t('updateTimetables') : t('addTimetables')" 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('classId')" prop="class_id"> |
|||
<el-radio-group v-model="formData.class_id" :placeholder="t('classIdPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in classIdList" |
|||
:key="index" |
|||
:label="item['id']"> |
|||
{{ item['name'] }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('scheduleJson')" prop="schedule_json"> |
|||
<el-input v-model="formData.schedule_json" clearable :placeholder="t('scheduleJsonPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('cycle')" prop="cycle"> |
|||
<el-radio-group v-model="formData.cycle" :placeholder="t('cyclePlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in cycleList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</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 { addTimetables, editTimetables, getTimetablesInfo, getWithClassesList } from '@/addon/zhjw/api/timetables' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
class_id: '', |
|||
schedule_json: '', |
|||
cycle: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
class_id: [ |
|||
{ required: true, message: t('classIdPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
schedule_json: [ |
|||
{ required: true, message: t('scheduleJsonPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
cycle: [ |
|||
{ required: true, message: t('cyclePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editTimetables : addTimetables |
|||
|
|||
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 cycleList = ref([]) |
|||
const cycleDictList = async () => { |
|||
cycleList.value = await (await useDictionary('cycle')).data.dictionary |
|||
} |
|||
cycleDictList(); |
|||
watch(() => cycleList.value, () => { formData.cycle = cycleList.value[0].value }) |
|||
|
|||
|
|||
const classIdList = ref([] as any[]) |
|||
const setClassIdList = async () => { |
|||
classIdList.value = await (await getWithClassesList({})).data |
|||
} |
|||
setClassIdList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if(row){ |
|||
const data = await (await getTimetablesInfo(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> |
|||
@ -0,0 +1,197 @@ |
|||
<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('addTimetables') }} |
|||
</el-button> |
|||
</div> |
|||
|
|||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> |
|||
<el-form :inline="true" :model="timetablesTable.searchParam" ref="searchFormRef"> |
|||
|
|||
<el-form-item :label="t('classId')" prop="class_id"> |
|||
<el-select class="w-[280px]" v-model="timetablesTable.searchParam.class_id" clearable :placeholder="t('classIdPlaceholder')"> |
|||
<el-option |
|||
v-for="(item, index) in classIdList" |
|||
:key="index" |
|||
:label="item['name']" |
|||
:value="item['id']" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
|
|||
<el-form-item :label="t('cycle')" prop="cycle"> |
|||
<el-select class="w-[280px]" v-model="timetablesTable.searchParam.cycle" clearable :placeholder="t('cyclePlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in cycleList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button type="primary" @click="loadTimetablesList()">{{ 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="timetablesTable.data" size="large" v-loading="timetablesTable.loading"> |
|||
<template #empty> |
|||
<span>{{ !timetablesTable.loading ? t('emptyData') : '' }}</span> |
|||
</template> |
|||
<el-table-column prop="class_id_name" :label="t('classId')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column :label="t('cycle')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in cycleList"> |
|||
<div v-if="item.value == row.cycle">{{ 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="timetablesTable.page" v-model:page-size="timetablesTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" :total="timetablesTable.total" |
|||
@size-change="loadTimetablesList()" @current-change="loadTimetablesList" /> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
</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 { getTimetablesList, deleteTimetables, getWithClassesList } from '@/addon/zhjw/api/timetables' |
|||
import { img } from '@/utils/common' |
|||
import { ElMessageBox,FormInstance } from 'element-plus' |
|||
import { useRouter } from 'vue-router' |
|||
import { useRoute } from 'vue-router' |
|||
const route = useRoute() |
|||
const pageName = route.meta.title; |
|||
|
|||
let timetablesTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam:{ |
|||
"class_id":"", |
|||
"cycle":"" |
|||
} |
|||
}) |
|||
|
|||
const searchFormRef = ref<FormInstance>() |
|||
|
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
const cycleList = ref([] as any[]) |
|||
const cycleDictList = async () => { |
|||
cycleList.value = await (await useDictionary('cycle')).data.dictionary |
|||
} |
|||
cycleDictList(); |
|||
|
|||
/** |
|||
* 获取课表管理列表 |
|||
*/ |
|||
const loadTimetablesList = (page: number = 1) => { |
|||
timetablesTable.loading = true |
|||
timetablesTable.page = page |
|||
|
|||
getTimetablesList({ |
|||
page: timetablesTable.page, |
|||
limit: timetablesTable.limit, |
|||
...timetablesTable.searchParam |
|||
}).then(res => { |
|||
timetablesTable.loading = false |
|||
timetablesTable.data = res.data.data |
|||
timetablesTable.total = res.data.total |
|||
}).catch(() => { |
|||
timetablesTable.loading = false |
|||
}) |
|||
} |
|||
loadTimetablesList() |
|||
|
|||
const router = useRouter() |
|||
|
|||
/** |
|||
* 添加课表管理 |
|||
*/ |
|||
const addEvent = () => { |
|||
router.push('/timetables/timetables_edit') |
|||
} |
|||
|
|||
/** |
|||
* 编辑课表管理 |
|||
* @param data |
|||
*/ |
|||
const editEvent = (data: any) => { |
|||
router.push('/timetables/timetables_edit?id='+data.id) |
|||
} |
|||
|
|||
/** |
|||
* 删除课表管理 |
|||
*/ |
|||
const deleteEvent = (id: number) => { |
|||
ElMessageBox.confirm(t('timetablesDeleteTips'), t('warning'), |
|||
{ |
|||
confirmButtonText: t('confirm'), |
|||
cancelButtonText: t('cancel'), |
|||
type: 'warning', |
|||
} |
|||
).then(() => { |
|||
deleteTimetables(id).then(() => { |
|||
loadTimetablesList() |
|||
}).catch(() => { |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
|
|||
const classIdList = ref([]) |
|||
const setClassIdList = async () => { |
|||
classIdList.value = await (await getWithClassesList({})).data |
|||
} |
|||
setClassIdList() |
|||
|
|||
const resetForm = (formEl: FormInstance | undefined) => { |
|||
if (!formEl) return |
|||
formEl.resetFields() |
|||
loadTimetablesList() |
|||
} |
|||
</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> |
|||
@ -0,0 +1,184 @@ |
|||
<template> |
|||
<div class="main-container"> |
|||
<div class="detail-head"> |
|||
<div class="left" @click="back()"> |
|||
<span class="iconfont iconxiangzuojiantou !text-xs"></span> |
|||
<span class="ml-[1px]">{{t('returnToPreviousPage')}}</span> |
|||
</div> |
|||
<span class="adorn">|</span> |
|||
<span class="right">{{ pageName }}</span> |
|||
</div> |
|||
<el-card class="box-card !border-none" shadow="never"> |
|||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"> |
|||
|
|||
<el-form-item :label="t('classId')" prop="class_id"> |
|||
<el-radio-group v-model="formData.class_id" :placeholder="t('classIdPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in classIdList" |
|||
:key="index" |
|||
:label="item['id']"> |
|||
{{ item['name'] }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('scheduleJson')" prop="schedule_json"> |
|||
<el-input v-model="formData.schedule_json" clearable :placeholder="t('scheduleJsonPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('cycle')" prop="cycle"> |
|||
<el-radio-group v-model="formData.cycle" :placeholder="t('cyclePlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in cycleList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
</el-form> |
|||
</el-card> |
|||
<div class="fixed-footer-wrap"> |
|||
<div class="fixed-footer"> |
|||
<el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button> |
|||
<el-button @click="back()">{{ t('cancel') }}</el-button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { t } from '@/lang' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { getTimetablesInfo,addTimetables,editTimetables, getWithClassesList } from '@/addon/zhjw/api/timetables'; |
|||
import { useRoute } from 'vue-router' |
|||
|
|||
const route = useRoute() |
|||
const id:number = parseInt(route.query.id); |
|||
const loading = ref(false) |
|||
const pageName = route.meta.title |
|||
|
|||
|
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: 0, |
|||
class_id: '', |
|||
schedule_json: '', |
|||
cycle: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const setFormData = async (id:number = 0) => { |
|||
Object.assign(formData, initialFormData) |
|||
const data = await (await getTimetablesInfo(id)).data |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
if(id) setFormData(id); |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
let cycleList = ref([]) |
|||
const cycleDictList = async () => { |
|||
cycleList.value = await (await useDictionary('cycle')).data.dictionary |
|||
} |
|||
cycleDictList(); |
|||
watch(() => cycleList.value, () => { formData.cycle = cycleList.value[0].value }) |
|||
|
|||
|
|||
const classIdList = ref([] as any[]) |
|||
const setClassIdList = async () => { |
|||
classIdList.value = await (await getWithClassesList({})).data |
|||
} |
|||
setClassIdList() |
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
class_id: [ |
|||
{ required: true, message: t('classIdPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
schedule_json: [ |
|||
{ required: true, message: t('scheduleJsonPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
cycle: [ |
|||
{ required: true, message: t('cyclePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const onSave = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
let data = formData |
|||
|
|||
const save = id ? editTimetables : addTimetables |
|||
save(data).then(res => { |
|||
loading.value = false |
|||
history.back() |
|||
}).catch(err => { |
|||
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() |
|||
} |
|||
} |
|||
const back = () => { |
|||
history.back() |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
@ -0,0 +1,242 @@ |
|||
<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('addVenues') }} |
|||
</el-button> |
|||
</div> |
|||
|
|||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> |
|||
<el-form :inline="true" :model="venuesTable.searchParam" ref="searchFormRef"> |
|||
|
|||
<el-form-item :label="t('campusId')" prop="campus_id"> |
|||
<el-select class="w-[280px]" v-model="venuesTable.searchParam.campus_id" clearable :placeholder="t('campusIdPlaceholder')"> |
|||
<el-option |
|||
v-for="(item, index) in campusIdList" |
|||
:key="index" |
|||
:label="item['name']" |
|||
:value="item['id']" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="venuesTable.searchParam.name" :placeholder="t('namePlaceholder')" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select class="w-[280px]" v-model="venuesTable.searchParam.type" clearable :placeholder="t('typePlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('capacity')" prop="capacity"> |
|||
<el-input v-model="venuesTable.searchParam.capacity" :placeholder="t('capacityPlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('availableTime')" prop="available_time"> |
|||
<el-input v-model="venuesTable.searchParam.available_time" :placeholder="t('availableTimePlaceholder')" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-select class="w-[280px]" v-model="venuesTable.searchParam.status" clearable :placeholder="t('statusPlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button type="primary" @click="loadVenuesList()">{{ 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="venuesTable.data" size="large" v-loading="venuesTable.loading"> |
|||
<template #empty> |
|||
<span>{{ !venuesTable.loading ? t('emptyData') : '' }}</span> |
|||
</template> |
|||
<el-table-column prop="campus_id_name" :label="t('campusId')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="name" :label="t('name')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column :label="t('type')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in typeList"> |
|||
<div v-if="item.value == row.type">{{ item.name }}</div> |
|||
</div> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column prop="capacity" :label="t('capacity')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="available_time" :label="t('availableTime')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column :label="t('status')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in statusList"> |
|||
<div v-if="item.value == row.status">{{ 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="venuesTable.page" v-model:page-size="venuesTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" :total="venuesTable.total" |
|||
@size-change="loadVenuesList()" @current-change="loadVenuesList" /> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
</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 { getVenuesList, deleteVenues, getWithCampusesList } from '@/addon/zhjw/api/venues' |
|||
import { img } from '@/utils/common' |
|||
import { ElMessageBox,FormInstance } from 'element-plus' |
|||
import { useRouter } from 'vue-router' |
|||
import { useRoute } from 'vue-router' |
|||
const route = useRoute() |
|||
const pageName = route.meta.title; |
|||
|
|||
let venuesTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam:{ |
|||
"campus_id":"", |
|||
"name":"", |
|||
"type":"", |
|||
"capacity":"", |
|||
"available_time":"", |
|||
"status":"" |
|||
} |
|||
}) |
|||
|
|||
const searchFormRef = ref<FormInstance>() |
|||
|
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
const typeList = ref([] as any[]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('cd_type')).data.dictionary |
|||
} |
|||
typeDictList(); |
|||
const statusList = ref([] as any[]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('cd_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
|
|||
/** |
|||
* 获取场地管理列表 |
|||
*/ |
|||
const loadVenuesList = (page: number = 1) => { |
|||
venuesTable.loading = true |
|||
venuesTable.page = page |
|||
|
|||
getVenuesList({ |
|||
page: venuesTable.page, |
|||
limit: venuesTable.limit, |
|||
...venuesTable.searchParam |
|||
}).then(res => { |
|||
venuesTable.loading = false |
|||
venuesTable.data = res.data.data |
|||
venuesTable.total = res.data.total |
|||
}).catch(() => { |
|||
venuesTable.loading = false |
|||
}) |
|||
} |
|||
loadVenuesList() |
|||
|
|||
const router = useRouter() |
|||
|
|||
/** |
|||
* 添加场地管理 |
|||
*/ |
|||
const addEvent = () => { |
|||
router.push('/venues/venues_edit') |
|||
} |
|||
|
|||
/** |
|||
* 编辑场地管理 |
|||
* @param data |
|||
*/ |
|||
const editEvent = (data: any) => { |
|||
router.push('/venues/venues_edit?id='+data.id) |
|||
} |
|||
|
|||
/** |
|||
* 删除场地管理 |
|||
*/ |
|||
const deleteEvent = (id: number) => { |
|||
ElMessageBox.confirm(t('venuesDeleteTips'), t('warning'), |
|||
{ |
|||
confirmButtonText: t('confirm'), |
|||
cancelButtonText: t('cancel'), |
|||
type: 'warning', |
|||
} |
|||
).then(() => { |
|||
deleteVenues(id).then(() => { |
|||
loadVenuesList() |
|||
}).catch(() => { |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
|
|||
const campusIdList = ref([]) |
|||
const setCampusIdList = async () => { |
|||
campusIdList.value = await (await getWithCampusesList({})).data |
|||
} |
|||
setCampusIdList() |
|||
|
|||
const resetForm = (formEl: FormInstance | undefined) => { |
|||
if (!formEl) return |
|||
formEl.resetFields() |
|||
loadVenuesList() |
|||
} |
|||
</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> |
|||
@ -0,0 +1,236 @@ |
|||
<template> |
|||
<div class="main-container"> |
|||
<div class="detail-head"> |
|||
<div class="left" @click="back()"> |
|||
<span class="iconfont iconxiangzuojiantou !text-xs"></span> |
|||
<span class="ml-[1px]">{{t('returnToPreviousPage')}}</span> |
|||
</div> |
|||
<span class="adorn">|</span> |
|||
<span class="right">{{ pageName }}</span> |
|||
</div> |
|||
<el-card class="box-card !border-none" shadow="never"> |
|||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"> |
|||
<el-form-item :label="t('campusId')" prop="campus_id"> |
|||
<el-select class="input-width" v-model="formData.campus_id" clearable :placeholder="t('campusIdPlaceholder')"> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in campusIdList" |
|||
:key="index" |
|||
:label="item['name']" |
|||
:value="item['id']" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="formData.name" clearable :placeholder="t('namePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('thumbnail')"> |
|||
<upload-image v-model="formData.thumbnail" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-radio-group v-model="formData.type" :placeholder="t('typePlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in typeList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('capacity')" prop="capacity"> |
|||
<el-input v-model="formData.capacity" clearable :placeholder="t('capacityPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('availableTime')" prop="available_time"> |
|||
<el-input v-model="formData.available_time" clearable :placeholder="t('availableTimePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group v-model="formData.status" :placeholder="t('statusPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
</el-form> |
|||
</el-card> |
|||
<div class="fixed-footer-wrap"> |
|||
<div class="fixed-footer"> |
|||
<el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button> |
|||
<el-button @click="back()">{{ t('cancel') }}</el-button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { t } from '@/lang' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { getVenuesInfo,addVenues,editVenues, getWithCampusesList } from '@/addon/zhjw/api/venues'; |
|||
import { useRoute } from 'vue-router' |
|||
|
|||
const route = useRoute() |
|||
const id:number = parseInt(route.query.id); |
|||
const loading = ref(false) |
|||
const pageName = route.meta.title |
|||
|
|||
|
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: 0, |
|||
campus_id: '', |
|||
name: '', |
|||
thumbnail: '', |
|||
type: '', |
|||
capacity: 0, |
|||
available_time: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const setFormData = async (id:number = 0) => { |
|||
Object.assign(formData, initialFormData) |
|||
const data = await (await getVenuesInfo(id)).data |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
if(id) setFormData(id); |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('cd_type')).data.dictionary |
|||
} |
|||
typeDictList(); |
|||
watch(() => typeList.value, () => { formData.type = typeList.value[0].value }) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('cd_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
watch(() => statusList.value, () => { formData.status = statusList.value[0].value }) |
|||
|
|||
|
|||
const campusIdList = ref([] as any[]) |
|||
const setCampusIdList = async () => { |
|||
campusIdList.value = await (await getWithCampusesList({})).data |
|||
} |
|||
setCampusIdList() |
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
campus_id: [ |
|||
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
name: [ |
|||
{ required: true, message: t('namePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
thumbnail: [ |
|||
{ required: true, message: t('thumbnailPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
type: [ |
|||
{ required: true, message: t('typePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
capacity: [ |
|||
{ required: true, message: t('capacityPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
available_time: [ |
|||
{ required: true, message: t('availableTimePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const onSave = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
let data = formData |
|||
|
|||
const save = id ? editVenues : addVenues |
|||
save(data).then(res => { |
|||
loading.value = false |
|||
history.back() |
|||
}).catch(err => { |
|||
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() |
|||
} |
|||
} |
|||
const back = () => { |
|||
history.back() |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
@ -1 +1 @@ |
|||
APP_DEBUG = true
[APP]
DEFAULT_TIMEZONE = Asia/Shanghai
AUTH_KEY = ymektwfaxgsdigfpbnjoruhczasdvhql
PRODUCT_KEY = {product_key}
[DATABASE]
TYPE = mysql
HOSTNAME = 127.0.0.1
DATABASE = school_oa
USERNAME = root
PASSWORD = root
HOSTPORT = 3306
PREFIX = school_
CHARSET = utf8mb4
DEBUG = false
[REDIS]
REDIS_HOSTNAME = 127.0.0.1
PORT = 6379
REDIS_PASSWORD =
SELECT = 0
[QUEUE]
state = false
[LANG]
default_lang = zh-cn
[SYSTEM]
ADMIN_TOKEN_NAME = token
API_TOKEN_NAME = token
ADMIN_TOKEN_EXPIRE_TIME = 604800
API_TOKEN_EXPIRE_TIME = 86400
LANG_NAME = lang
CHANNEL_NAME = channel
ADMIN_DOMAIN =
WAP_DOMAIN =
WEB_DOMAIN =
[NIUCLOUD]
code =
secret = |
|||
APP_DEBUG = true
[APP]
DEFAULT_TIMEZONE = Asia/Shanghai
AUTH_KEY = ymektwfaxgsdigfpbnjoruhczasdvhql
PRODUCT_KEY = {product_key}
[DATABASE]
TYPE = mysql
HOSTNAME = 146.56.228.75
DATABASE = school_oa
USERNAME = school_oa
PASSWORD = xseii2aBWjmSSBpB
HOSTPORT = 3306
PREFIX = school_
CHARSET = utf8mb4
DEBUG = false
[REDIS]
REDIS_HOSTNAME = 127.0.0.1
PORT = 6379
REDIS_PASSWORD =
SELECT = 0
[QUEUE]
state = false
[LANG]
default_lang = zh-cn
[SYSTEM]
ADMIN_TOKEN_NAME = token
API_TOKEN_NAME = token
ADMIN_TOKEN_EXPIRE_TIME = 604800
API_TOKEN_EXPIRE_TIME = 86400
LANG_NAME = lang
CHANNEL_NAME = channel
ADMIN_DOMAIN =
WAP_DOMAIN =
WEB_DOMAIN =
[NIUCLOUD]
code =
secret = |
|||
@ -0,0 +1,58 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
// USER_CODE_BEGIN -- campuses
|
|||
/** |
|||
* 获取校区管理列表 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function getCampusesList(params: Record<string, any>) { |
|||
return request.get(`zhjw/campuses`, {params}) |
|||
} |
|||
|
|||
/** |
|||
* 获取校区管理详情 |
|||
* @param id 校区管理id |
|||
* @returns |
|||
*/ |
|||
export function getCampusesInfo(id: number) { |
|||
return request.get(`zhjw/campuses/${id}`); |
|||
} |
|||
|
|||
/** |
|||
* 添加校区管理 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function addCampuses(params: Record<string, any>) { |
|||
return request.post('zhjw/campuses', params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 编辑校区管理 |
|||
* @param id |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function editCampuses(params: Record<string, any>) { |
|||
return request.put(`zhjw/campuses/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 删除校区管理 |
|||
* @param id |
|||
* @returns |
|||
*/ |
|||
export function deleteCampuses(id: number) { |
|||
return request.delete(`zhjw/campuses/${id}`, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
|
|||
|
|||
// USER_CODE_END -- campuses
|
|||
@ -0,0 +1,58 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
// USER_CODE_BEGIN -- classes
|
|||
/** |
|||
* 获取班级管理列表 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function getClassesList(params: Record<string, any>) { |
|||
return request.get(`zhjw/classes`, {params}) |
|||
} |
|||
|
|||
/** |
|||
* 获取班级管理详情 |
|||
* @param id 班级管理id |
|||
* @returns |
|||
*/ |
|||
export function getClassesInfo(id: number) { |
|||
return request.get(`zhjw/classes/${id}`); |
|||
} |
|||
|
|||
/** |
|||
* 添加班级管理 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function addClasses(params: Record<string, any>) { |
|||
return request.post('zhjw/classes', params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 编辑班级管理 |
|||
* @param id |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function editClasses(params: Record<string, any>) { |
|||
return request.put(`zhjw/classes/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 删除班级管理 |
|||
* @param id |
|||
* @returns |
|||
*/ |
|||
export function deleteClasses(id: number) { |
|||
return request.delete(`zhjw/classes/${id}`, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
export function getWithVenuesList(params: Record<string,any>){ |
|||
return request.get('zhjw/venues_all', {params}) |
|||
} |
|||
|
|||
// USER_CODE_END -- classes
|
|||
@ -0,0 +1,54 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
|
|||
|
|||
// USER_CODE_BEGIN -- courses
|
|||
/** |
|||
* 获取课程管理列表 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function getCoursesList(params: Record<string, any>) { |
|||
return request.get(`zhjw/courses`, {params}) |
|||
} |
|||
|
|||
/** |
|||
* 获取课程管理详情 |
|||
* @param id 课程管理id |
|||
* @returns |
|||
*/ |
|||
export function getCoursesInfo(id: number) { |
|||
return request.get(`zhjw/courses/${id}`); |
|||
} |
|||
|
|||
/** |
|||
* 添加课程管理 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function addCourses(params: Record<string, any>) { |
|||
return request.post('zhjw/courses', params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 编辑课程管理 |
|||
* @param id |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function editCourses(params: Record<string, any>) { |
|||
return request.put(`zhjw/courses/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 删除课程管理 |
|||
* @param id |
|||
* @returns |
|||
*/ |
|||
export function deleteCourses(id: number) { |
|||
return request.delete(`zhjw/courses/${id}`, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
|
|||
|
|||
// USER_CODE_END -- courses
|
|||
@ -0,0 +1,58 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
// USER_CODE_BEGIN -- roles
|
|||
/** |
|||
* 获取角色管理列表 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function getRolesList(params: Record<string, any>) { |
|||
return request.get(`zhjw/roles`, {params}) |
|||
} |
|||
|
|||
/** |
|||
* 获取角色管理详情 |
|||
* @param id 角色管理id |
|||
* @returns |
|||
*/ |
|||
export function getRolesInfo(id: number) { |
|||
return request.get(`zhjw/roles/${id}`); |
|||
} |
|||
|
|||
/** |
|||
* 添加角色管理 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function addRoles(params: Record<string, any>) { |
|||
return request.post('zhjw/roles', params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 编辑角色管理 |
|||
* @param id |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function editRoles(params: Record<string, any>) { |
|||
return request.put(`zhjw/roles/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 删除角色管理 |
|||
* @param id |
|||
* @returns |
|||
*/ |
|||
export function deleteRoles(id: number) { |
|||
return request.delete(`zhjw/roles/${id}`, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
|
|||
|
|||
// USER_CODE_END -- roles
|
|||
@ -0,0 +1,56 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
|
|||
|
|||
// USER_CODE_BEGIN -- staff
|
|||
/** |
|||
* 获取人员管理列表 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function getStaffList(params: Record<string, any>) { |
|||
return request.get(`zhjw/staff`, {params}) |
|||
} |
|||
|
|||
/** |
|||
* 获取人员管理详情 |
|||
* @param id 人员管理id |
|||
* @returns |
|||
*/ |
|||
export function getStaffInfo(id: number) { |
|||
return request.get(`zhjw/staff/${id}`); |
|||
} |
|||
|
|||
/** |
|||
* 添加人员管理 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function addStaff(params: Record<string, any>) { |
|||
return request.post('zhjw/staff', params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 编辑人员管理 |
|||
* @param id |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function editStaff(params: Record<string, any>) { |
|||
return request.put(`zhjw/staff/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 删除人员管理 |
|||
* @param id |
|||
* @returns |
|||
*/ |
|||
export function deleteStaff(id: number) { |
|||
return request.delete(`zhjw/staff/${id}`, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
export function getWithRolesList(params: Record<string,any>){ |
|||
return request.get('zhjw/roles_all', {params}) |
|||
} |
|||
|
|||
// USER_CODE_END -- staff
|
|||
@ -0,0 +1,58 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
// USER_CODE_BEGIN -- timetables
|
|||
/** |
|||
* 获取课表管理列表 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function getTimetablesList(params: Record<string, any>) { |
|||
return request.get(`zhjw/timetables`, {params}) |
|||
} |
|||
|
|||
/** |
|||
* 获取课表管理详情 |
|||
* @param id 课表管理id |
|||
* @returns |
|||
*/ |
|||
export function getTimetablesInfo(id: number) { |
|||
return request.get(`zhjw/timetables/${id}`); |
|||
} |
|||
|
|||
/** |
|||
* 添加课表管理 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function addTimetables(params: Record<string, any>) { |
|||
return request.post('zhjw/timetables', params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 编辑课表管理 |
|||
* @param id |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function editTimetables(params: Record<string, any>) { |
|||
return request.put(`zhjw/timetables/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 删除课表管理 |
|||
* @param id |
|||
* @returns |
|||
*/ |
|||
export function deleteTimetables(id: number) { |
|||
return request.delete(`zhjw/timetables/${id}`, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
export function getWithClassesList(params: Record<string,any>){ |
|||
return request.get('zhjw/classes_all', {params}) |
|||
} |
|||
|
|||
// USER_CODE_END -- timetables
|
|||
@ -0,0 +1,58 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
// USER_CODE_BEGIN -- venues
|
|||
/** |
|||
* 获取场地管理列表 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function getVenuesList(params: Record<string, any>) { |
|||
return request.get(`zhjw/venues`, {params}) |
|||
} |
|||
|
|||
/** |
|||
* 获取场地管理详情 |
|||
* @param id 场地管理id |
|||
* @returns |
|||
*/ |
|||
export function getVenuesInfo(id: number) { |
|||
return request.get(`zhjw/venues/${id}`); |
|||
} |
|||
|
|||
/** |
|||
* 添加场地管理 |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function addVenues(params: Record<string, any>) { |
|||
return request.post('zhjw/venues', params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 编辑场地管理 |
|||
* @param id |
|||
* @param params |
|||
* @returns |
|||
*/ |
|||
export function editVenues(params: Record<string, any>) { |
|||
return request.put(`zhjw/venues/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
/** |
|||
* 删除场地管理 |
|||
* @param id |
|||
* @returns |
|||
*/ |
|||
export function deleteVenues(id: number) { |
|||
return request.delete(`zhjw/venues/${id}`, { showErrorMessage: true, showSuccessMessage: true }) |
|||
} |
|||
|
|||
export function getWithCampusesList(params: Record<string,any>){ |
|||
return request.get('zhjw/campuses_all', {params}) |
|||
} |
|||
|
|||
// USER_CODE_END -- venues
|
|||
@ -0,0 +1,19 @@ |
|||
{ |
|||
"name":"校区名称", |
|||
"namePlaceholder":"请输入校区名称", |
|||
"coordinate":"坐标地址", |
|||
"coordinatePlaceholder":"请输入坐标地址", |
|||
"address":"校区地址", |
|||
"addressPlaceholder":"请输入校区地址", |
|||
"contactPerson":"联系人", |
|||
"contactPersonPlaceholder":"请输入联系人", |
|||
"contactPhone":"联系电话", |
|||
"contactPhonePlaceholder":"请输入联系电话", |
|||
"status":"状态", |
|||
"statusPlaceholder":"请输入状态", |
|||
"addCampuses":"添加校区管理", |
|||
"updateCampuses":"编辑校区管理", |
|||
"campusesDeleteTips":"确定要删除该数据吗?", |
|||
"startDate":"请选择开始时间", |
|||
"endDate":"请选择结束时间" |
|||
} |
|||
@ -0,0 +1,21 @@ |
|||
{ |
|||
"name":"校区名称", |
|||
"coordinate":"坐标地址", |
|||
"address":"校区地址", |
|||
"contactPerson":"联系人", |
|||
"contactPhone":"联系电话", |
|||
"status":"状态", |
|||
"thumbnail":"缩略图", |
|||
"description":"校区描述", |
|||
"namePlaceholder":"请输入校区名称", |
|||
"coordinatePlaceholder":"请输入坐标地址", |
|||
"addressPlaceholder":"请输入校区地址", |
|||
"contactPersonPlaceholder":"请输入联系人", |
|||
"contactPhonePlaceholder":"请输入联系电话", |
|||
"statusPlaceholder":"请输入状态", |
|||
"thumbnailPlaceholder":"请上传缩略图", |
|||
"descriptionPlaceholder":"请输入校区描述", |
|||
"addCampuses":"添加校区管理", |
|||
"updateCampuses":"编辑校区管理", |
|||
"campusesDeleteTips":"确定要删除该校区管理吗?" |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
{ |
|||
"venueId":"所属场地", |
|||
"venueIdPlaceholder":"全部", |
|||
"name":"班级名称", |
|||
"namePlaceholder":"请输入班级名称", |
|||
"maxStudents":"最大学员数", |
|||
"maxStudentsPlaceholder":"请输入最大学员数", |
|||
"startDate":"开班时间", |
|||
"startDatePlaceholder":"请输入开班时间", |
|||
"endDate":"结班时间", |
|||
"endDatePlaceholder":"请输入结班时间", |
|||
"status":"状态", |
|||
"statusPlaceholder":"请输入状态", |
|||
"addClasses":"添加班级管理", |
|||
"updateClasses":"编辑班级管理", |
|||
"classesDeleteTips":"确定要删除该数据吗?", |
|||
"startDate":"请选择开始时间", |
|||
"endDate":"请选择结束时间" |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
{ |
|||
"venueId":"所属场地", |
|||
"thumbnail":"缩略图", |
|||
"name":"班级名称", |
|||
"maxStudents":"最大学员数", |
|||
"startDate":"开班时间", |
|||
"endDate":"结班时间", |
|||
"status":"状态", |
|||
"venueIdPlaceholder":"请输入所属场地", |
|||
"thumbnailPlaceholder":"请上传缩略图", |
|||
"namePlaceholder":"请输入班级名称", |
|||
"maxStudentsPlaceholder":"请输入最大学员数", |
|||
"startDatePlaceholder":"请选择开班时间", |
|||
"endDatePlaceholder":"请选择结班时间", |
|||
"statusPlaceholder":"请输入状态", |
|||
"addClasses":"添加班级管理", |
|||
"updateClasses":"编辑班级管理", |
|||
"classesDeleteTips":"确定要删除该班级管理吗?" |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
{ |
|||
"name":"课程名称", |
|||
"namePlaceholder":"请输入课程名称", |
|||
"description":"课程描述", |
|||
"descriptionPlaceholder":"请输入课程描述", |
|||
"targetGroup":"适合人群", |
|||
"targetGroupPlaceholder":"请输入适合人群", |
|||
"duration":"课时数", |
|||
"tastePrice":"体验价格", |
|||
"tastePricePlaceholder":"请输入体验价格", |
|||
"price":"正式价格", |
|||
"pricePlaceholder":"请输入正式价格", |
|||
"isAutomaticSigning":"是否自动签约", |
|||
"isAutomaticSigningPlaceholder":"请输入是否自动签约", |
|||
"status":"状态", |
|||
"statusPlaceholder":"请输入状态", |
|||
"addCourses":"添加课程管理", |
|||
"updateCourses":"编辑课程管理", |
|||
"coursesDeleteTips":"确定要删除该数据吗?", |
|||
"startDate":"请选择开始时间", |
|||
"endDate":"请选择结束时间" |
|||
} |
|||
@ -0,0 +1,25 @@ |
|||
{ |
|||
"name":"课程名称", |
|||
"description":"课程描述", |
|||
"thumbnail":"缩略图", |
|||
"targetGroup":"适合人群", |
|||
"duration":"课时数", |
|||
"tastePrice":"体验价格", |
|||
"price":"正式价格", |
|||
"isAutomaticSigning":"是否自动签约", |
|||
"automaticSigningTime":"自动签约", |
|||
"status":"状态", |
|||
"namePlaceholder":"请输入课程名称", |
|||
"descriptionPlaceholder":"请输入课程描述", |
|||
"thumbnailPlaceholder":"请上传缩略图", |
|||
"targetGroupPlaceholder":"请输入适合人群", |
|||
"durationPlaceholder":"请输入课时数", |
|||
"tastePricePlaceholder":"请输入体验价格", |
|||
"pricePlaceholder":"请输入正式价格", |
|||
"isAutomaticSigningPlaceholder":"请输入是否自动签约", |
|||
"automaticSigningTimePlaceholder":"请输入自动签约", |
|||
"statusPlaceholder":"请输入状态", |
|||
"addCourses":"添加课程管理", |
|||
"updateCourses":"编辑课程管理", |
|||
"coursesDeleteTips":"确定要删除该课程管理吗?" |
|||
} |
|||
@ -0,0 +1,10 @@ |
|||
{ |
|||
"id":"ID", |
|||
"name":"角色名称", |
|||
"namePlaceholder":"请输入角色名称", |
|||
"addRoles":"添加角色管理", |
|||
"updateRoles":"编辑角色管理", |
|||
"rolesDeleteTips":"确定要删除该数据吗?", |
|||
"startDate":"请选择开始时间", |
|||
"endDate":"请选择结束时间" |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
{ |
|||
"name":"角色名称", |
|||
"permissions":"数据权限配置", |
|||
"description":"角色描述", |
|||
"namePlaceholder":"请输入角色名称", |
|||
"permissionsPlaceholder":"请输入数据权限配置", |
|||
"descriptionPlaceholder":"请输入角色描述", |
|||
"addRoles":"添加角色管理", |
|||
"updateRoles":"编辑角色管理", |
|||
"rolesDeleteTips":"确定要删除该角色管理吗?" |
|||
} |
|||
@ -0,0 +1,21 @@ |
|||
{ |
|||
"name":"姓名", |
|||
"namePlaceholder":"请输入姓名", |
|||
"gender":"性别", |
|||
"genderPlaceholder":"请输入性别", |
|||
"phone":"联系方式", |
|||
"phonePlaceholder":"请输入联系方式", |
|||
"email":"邮箱", |
|||
"emailPlaceholder":"请输入邮箱", |
|||
"position":"职位", |
|||
"positionPlaceholder":"请输入职位", |
|||
"status":"状态", |
|||
"statusPlaceholder":"请输入状态", |
|||
"roleId":"角色关系", |
|||
"roleIdPlaceholder":"全部", |
|||
"addStaff":"添加人员管理", |
|||
"updateStaff":"编辑人员管理", |
|||
"staffDeleteTips":"确定要删除该数据吗?", |
|||
"startDate":"请选择开始时间", |
|||
"endDate":"请选择结束时间" |
|||
} |
|||
@ -0,0 +1,21 @@ |
|||
{ |
|||
"name":"姓名", |
|||
"header":"头像", |
|||
"gender":"性别", |
|||
"phone":"联系方式", |
|||
"email":"邮箱", |
|||
"position":"职位", |
|||
"status":"状态", |
|||
"roleId":"角色关系", |
|||
"namePlaceholder":"请输入姓名", |
|||
"headerPlaceholder":"请上传头像", |
|||
"genderPlaceholder":"请输入性别", |
|||
"phonePlaceholder":"请输入联系方式", |
|||
"emailPlaceholder":"请输入邮箱", |
|||
"positionPlaceholder":"请输入职位", |
|||
"statusPlaceholder":"请输入状态", |
|||
"roleIdPlaceholder":"请输入角色关系", |
|||
"addStaff":"添加人员管理", |
|||
"updateStaff":"编辑人员管理", |
|||
"staffDeleteTips":"确定要删除该人员管理吗?" |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
{ |
|||
"classId":"所属班级", |
|||
"classIdPlaceholder":"全部", |
|||
"cycle":"周期", |
|||
"cyclePlaceholder":"请输入周期", |
|||
"addTimetables":"添加课表管理", |
|||
"updateTimetables":"编辑课表管理", |
|||
"timetablesDeleteTips":"确定要删除该数据吗?", |
|||
"startDate":"请选择开始时间", |
|||
"endDate":"请选择结束时间" |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
{ |
|||
"classId":"所属班级", |
|||
"scheduleJson":"排课详情", |
|||
"cycle":"周期", |
|||
"classIdPlaceholder":"请输入所属班级", |
|||
"scheduleJsonPlaceholder":"请输入排课详情", |
|||
"cyclePlaceholder":"请输入周期", |
|||
"addTimetables":"添加课表管理", |
|||
"updateTimetables":"编辑课表管理", |
|||
"timetablesDeleteTips":"确定要删除该课表管理吗?" |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
{ |
|||
"campusId":"所属校区", |
|||
"campusIdPlaceholder":"全部", |
|||
"name":"场地名称", |
|||
"namePlaceholder":"请输入场地名称", |
|||
"type":"场地类型", |
|||
"typePlaceholder":"请输入场地类型", |
|||
"capacity":"容纳人数", |
|||
"capacityPlaceholder":"请输入容纳人数", |
|||
"availableTime":"可用时间段", |
|||
"availableTimePlaceholder":"请输入可用时间段", |
|||
"status":"状态", |
|||
"statusPlaceholder":"请输入状态", |
|||
"addVenues":"添加场地管理", |
|||
"updateVenues":"编辑场地管理", |
|||
"venuesDeleteTips":"确定要删除该数据吗?", |
|||
"startDate":"请选择开始时间", |
|||
"endDate":"请选择结束时间" |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
{ |
|||
"campusId":"所属校区", |
|||
"name":"场地名称", |
|||
"thumbnail":"缩略图", |
|||
"type":"场地类型", |
|||
"capacity":"容纳人数", |
|||
"availableTime":"可用时间段", |
|||
"status":"状态", |
|||
"campusIdPlaceholder":"请选择所属校区", |
|||
"namePlaceholder":"请输入场地名称", |
|||
"thumbnailPlaceholder":"请上传缩略图", |
|||
"typePlaceholder":"请输入场地类型", |
|||
"capacityPlaceholder":"请输入容纳人数", |
|||
"availableTimePlaceholder":"请输入可用时间段", |
|||
"statusPlaceholder":"请输入状态", |
|||
"addVenues":"添加场地管理", |
|||
"updateVenues":"编辑场地管理", |
|||
"venuesDeleteTips":"确定要删除该场地管理吗?" |
|||
} |
|||
@ -0,0 +1,207 @@ |
|||
<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('addCampuses') }} |
|||
</el-button> |
|||
</div> |
|||
|
|||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> |
|||
<el-form :inline="true" :model="campusesTable.searchParam" ref="searchFormRef"> |
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="campusesTable.searchParam.name" :placeholder="t('namePlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('coordinate')" prop="coordinate"> |
|||
<el-input v-model="campusesTable.searchParam.coordinate" :placeholder="t('coordinatePlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('address')" prop="address"> |
|||
<el-input v-model="campusesTable.searchParam.address" :placeholder="t('addressPlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('contactPerson')" prop="contact_person"> |
|||
<el-input v-model="campusesTable.searchParam.contact_person" :placeholder="t('contactPersonPlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('contactPhone')" prop="contact_phone"> |
|||
<el-input v-model="campusesTable.searchParam.contact_phone" :placeholder="t('contactPhonePlaceholder')" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-select class="w-[280px]" v-model="campusesTable.searchParam.status" clearable :placeholder="t('statusPlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button type="primary" @click="loadCampusesList()">{{ 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="campusesTable.data" size="large" v-loading="campusesTable.loading"> |
|||
<template #empty> |
|||
<span>{{ !campusesTable.loading ? t('emptyData') : '' }}</span> |
|||
</template> |
|||
<el-table-column prop="name" :label="t('name')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="coordinate" :label="t('coordinate')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="address" :label="t('address')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="contact_person" :label="t('contactPerson')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="contact_phone" :label="t('contactPhone')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column :label="t('status')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in statusList"> |
|||
<div v-if="item.value == row.status">{{ 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="campusesTable.page" v-model:page-size="campusesTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" :total="campusesTable.total" |
|||
@size-change="loadCampusesList()" @current-change="loadCampusesList" /> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
</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 { getCampusesList, deleteCampuses } from '@/addon/zhjw/api/campuses' |
|||
import { img } from '@/utils/common' |
|||
import { ElMessageBox,FormInstance } from 'element-plus' |
|||
import { useRouter } from 'vue-router' |
|||
import { useRoute } from 'vue-router' |
|||
const route = useRoute() |
|||
const pageName = route.meta.title; |
|||
|
|||
let campusesTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam:{ |
|||
"name":"", |
|||
"coordinate":"", |
|||
"address":"", |
|||
"contact_person":"", |
|||
"contact_phone":"", |
|||
"status":"" |
|||
} |
|||
}) |
|||
|
|||
const searchFormRef = ref<FormInstance>() |
|||
|
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
const statusList = ref([] as any[]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('is_radio')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
|
|||
/** |
|||
* 获取校区管理列表 |
|||
*/ |
|||
const loadCampusesList = (page: number = 1) => { |
|||
campusesTable.loading = true |
|||
campusesTable.page = page |
|||
|
|||
getCampusesList({ |
|||
page: campusesTable.page, |
|||
limit: campusesTable.limit, |
|||
...campusesTable.searchParam |
|||
}).then(res => { |
|||
campusesTable.loading = false |
|||
campusesTable.data = res.data.data |
|||
campusesTable.total = res.data.total |
|||
}).catch(() => { |
|||
campusesTable.loading = false |
|||
}) |
|||
} |
|||
loadCampusesList() |
|||
|
|||
const router = useRouter() |
|||
|
|||
/** |
|||
* 添加校区管理 |
|||
*/ |
|||
const addEvent = () => { |
|||
router.push('/campuses/campuses_edit') |
|||
} |
|||
|
|||
/** |
|||
* 编辑校区管理 |
|||
* @param data |
|||
*/ |
|||
const editEvent = (data: any) => { |
|||
router.push('/campuses/campuses_edit?id='+data.id) |
|||
} |
|||
|
|||
/** |
|||
* 删除校区管理 |
|||
*/ |
|||
const deleteEvent = (id: number) => { |
|||
ElMessageBox.confirm(t('campusesDeleteTips'), t('warning'), |
|||
{ |
|||
confirmButtonText: t('confirm'), |
|||
cancelButtonText: t('cancel'), |
|||
type: 'warning', |
|||
} |
|||
).then(() => { |
|||
deleteCampuses(id).then(() => { |
|||
loadCampusesList() |
|||
}).catch(() => { |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
|
|||
|
|||
const resetForm = (formEl: FormInstance | undefined) => { |
|||
if (!formEl) return |
|||
formEl.resetFields() |
|||
loadCampusesList() |
|||
} |
|||
</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> |
|||
@ -0,0 +1,221 @@ |
|||
<template> |
|||
<div class="main-container"> |
|||
<div class="detail-head"> |
|||
<div class="left" @click="back()"> |
|||
<span class="iconfont iconxiangzuojiantou !text-xs"></span> |
|||
<span class="ml-[1px]">{{t('returnToPreviousPage')}}</span> |
|||
</div> |
|||
<span class="adorn">|</span> |
|||
<span class="right">{{ pageName }}</span> |
|||
</div> |
|||
<el-card class="box-card !border-none" shadow="never"> |
|||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"> |
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="formData.name" clearable :placeholder="t('namePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('coordinate')" prop="coordinate"> |
|||
<el-input v-model="formData.coordinate" clearable :placeholder="t('coordinatePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('address')" prop="address"> |
|||
<el-input v-model="formData.address" clearable :placeholder="t('addressPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('contactPerson')" prop="contact_person"> |
|||
<el-input v-model="formData.contact_person" clearable :placeholder="t('contactPersonPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('contactPhone')" prop="contact_phone"> |
|||
<el-input v-model="formData.contact_phone" clearable :placeholder="t('contactPhonePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group v-model="formData.status" :placeholder="t('statusPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('thumbnail')"> |
|||
<upload-image v-model="formData.thumbnail" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('description')" prop="description"> |
|||
<el-input v-model="formData.description" clearable :placeholder="t('descriptionPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
</el-form> |
|||
</el-card> |
|||
<div class="fixed-footer-wrap"> |
|||
<div class="fixed-footer"> |
|||
<el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button> |
|||
<el-button @click="back()">{{ t('cancel') }}</el-button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { t } from '@/lang' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { getCampusesInfo,addCampuses,editCampuses } from '@/addon/zhjw/api/campuses'; |
|||
import { useRoute } from 'vue-router' |
|||
|
|||
const route = useRoute() |
|||
const id:number = parseInt(route.query.id); |
|||
const loading = ref(false) |
|||
const pageName = route.meta.title |
|||
|
|||
|
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: 0, |
|||
name: '', |
|||
coordinate: '', |
|||
address: '', |
|||
contact_person: '', |
|||
contact_phone: '', |
|||
status: '', |
|||
thumbnail: '', |
|||
description: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const setFormData = async (id:number = 0) => { |
|||
Object.assign(formData, initialFormData) |
|||
const data = await (await getCampusesInfo(id)).data |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
if(id) setFormData(id); |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('is_radio')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
watch(() => statusList.value, () => { formData.status = statusList.value[0].value }) |
|||
|
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
name: [ |
|||
{ required: true, message: t('namePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
coordinate: [ |
|||
{ required: true, message: t('coordinatePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
address: [ |
|||
{ required: true, message: t('addressPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
contact_person: [ |
|||
{ required: true, message: t('contactPersonPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
contact_phone: [ |
|||
{ required: true, message: t('contactPhonePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
thumbnail: [ |
|||
{ required: true, message: t('thumbnailPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
description: [ |
|||
{ required: true, message: t('descriptionPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const onSave = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
let data = formData |
|||
|
|||
const save = id ? editCampuses : addCampuses |
|||
save(data).then(res => { |
|||
loading.value = false |
|||
history.back() |
|||
}).catch(err => { |
|||
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() |
|||
} |
|||
} |
|||
const back = () => { |
|||
history.back() |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
@ -0,0 +1,225 @@ |
|||
<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('addClasses') }} |
|||
</el-button> |
|||
</div> |
|||
|
|||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> |
|||
<el-form :inline="true" :model="classesTable.searchParam" ref="searchFormRef"> |
|||
|
|||
<el-form-item :label="t('venueId')" prop="venue_id"> |
|||
<el-select class="w-[280px]" v-model="classesTable.searchParam.venue_id" clearable :placeholder="t('venueIdPlaceholder')"> |
|||
<el-option |
|||
v-for="(item, index) in venueIdList" |
|||
:key="index" |
|||
:label="item['name']" |
|||
:value="item['id']" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="classesTable.searchParam.name" :placeholder="t('namePlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('maxStudents')" prop="max_students"> |
|||
<el-input v-model="classesTable.searchParam.max_students" :placeholder="t('maxStudentsPlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('startDate')" prop="start_date"> |
|||
<el-date-picker v-model="classesTable.searchParam.start_date" type="datetimerange" format="YYYY-MM-DD hh:mm:ss" |
|||
:start-placeholder="t('startDate')" :end-placeholder="t('endDate')" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('endDate')" prop="end_date"> |
|||
<el-date-picker v-model="classesTable.searchParam.end_date" type="datetimerange" format="YYYY-MM-DD hh:mm:ss" |
|||
:start-placeholder="t('startDate')" :end-placeholder="t('endDate')" /> |
|||
</el-form-item> |
|||
|
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-select class="w-[280px]" v-model="classesTable.searchParam.status" clearable :placeholder="t('statusPlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button type="primary" @click="loadClassesList()">{{ 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="classesTable.data" size="large" v-loading="classesTable.loading"> |
|||
<template #empty> |
|||
<span>{{ !classesTable.loading ? t('emptyData') : '' }}</span> |
|||
</template> |
|||
<el-table-column prop="venue_id_name" :label="t('venueId')" 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="max_students" :label="t('maxStudents')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="start_date" :label="t('startDate')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="end_date" :label="t('endDate')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column :label="t('status')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in statusList"> |
|||
<div v-if="item.value == row.status">{{ 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="classesTable.page" v-model:page-size="classesTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" :total="classesTable.total" |
|||
@size-change="loadClassesList()" @current-change="loadClassesList" /> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
</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 { getClassesList, deleteClasses, getWithVenuesList } from '@/addon/zhjw/api/classes' |
|||
import { img } from '@/utils/common' |
|||
import { ElMessageBox,FormInstance } from 'element-plus' |
|||
import { useRouter } from 'vue-router' |
|||
import { useRoute } from 'vue-router' |
|||
const route = useRoute() |
|||
const pageName = route.meta.title; |
|||
|
|||
let classesTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam:{ |
|||
"venue_id":"", |
|||
"name":"", |
|||
"max_students":"", |
|||
"start_date":"", |
|||
"end_date":"", |
|||
"status":"" |
|||
} |
|||
}) |
|||
|
|||
const searchFormRef = ref<FormInstance>() |
|||
|
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
const statusList = ref([] as any[]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('bj_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
|
|||
/** |
|||
* 获取班级管理列表 |
|||
*/ |
|||
const loadClassesList = (page: number = 1) => { |
|||
classesTable.loading = true |
|||
classesTable.page = page |
|||
|
|||
getClassesList({ |
|||
page: classesTable.page, |
|||
limit: classesTable.limit, |
|||
...classesTable.searchParam |
|||
}).then(res => { |
|||
classesTable.loading = false |
|||
classesTable.data = res.data.data |
|||
classesTable.total = res.data.total |
|||
}).catch(() => { |
|||
classesTable.loading = false |
|||
}) |
|||
} |
|||
loadClassesList() |
|||
|
|||
const router = useRouter() |
|||
|
|||
/** |
|||
* 添加班级管理 |
|||
*/ |
|||
const addEvent = () => { |
|||
router.push('/classes/classes_edit') |
|||
} |
|||
|
|||
/** |
|||
* 编辑班级管理 |
|||
* @param data |
|||
*/ |
|||
const editEvent = (data: any) => { |
|||
router.push('/classes/classes_edit?id='+data.id) |
|||
} |
|||
|
|||
/** |
|||
* 删除班级管理 |
|||
*/ |
|||
const deleteEvent = (id: number) => { |
|||
ElMessageBox.confirm(t('classesDeleteTips'), t('warning'), |
|||
{ |
|||
confirmButtonText: t('confirm'), |
|||
cancelButtonText: t('cancel'), |
|||
type: 'warning', |
|||
} |
|||
).then(() => { |
|||
deleteClasses(id).then(() => { |
|||
loadClassesList() |
|||
}).catch(() => { |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
|
|||
const venueIdList = ref([]) |
|||
const setVenueIdList = async () => { |
|||
venueIdList.value = await (await getWithVenuesList({})).data |
|||
} |
|||
setVenueIdList() |
|||
|
|||
const resetForm = (formEl: FormInstance | undefined) => { |
|||
if (!formEl) return |
|||
formEl.resetFields() |
|||
loadClassesList() |
|||
} |
|||
</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> |
|||
@ -0,0 +1,236 @@ |
|||
<template> |
|||
<div class="main-container"> |
|||
<div class="detail-head"> |
|||
<div class="left" @click="back()"> |
|||
<span class="iconfont iconxiangzuojiantou !text-xs"></span> |
|||
<span class="ml-[1px]">{{t('returnToPreviousPage')}}</span> |
|||
</div> |
|||
<span class="adorn">|</span> |
|||
<span class="right">{{ pageName }}</span> |
|||
</div> |
|||
<el-card class="box-card !border-none" shadow="never"> |
|||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"> |
|||
|
|||
<el-form-item :label="t('venueId')" prop="venue_id"> |
|||
<el-radio-group v-model="formData.venue_id" :placeholder="t('venueIdPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in venueIdList" |
|||
:key="index" |
|||
:label="item['id']"> |
|||
{{ item['name'] }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('thumbnail')"> |
|||
<upload-image v-model="formData.thumbnail" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="formData.name" clearable :placeholder="t('namePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('maxStudents')" prop="max_students"> |
|||
<el-input v-model="formData.max_students" clearable :placeholder="t('maxStudentsPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('startDate')" prop="start_date" class="input-width"> |
|||
<el-date-picker |
|||
class="flex-1 !flex" |
|||
v-model="formData.start_date" |
|||
clearable |
|||
type="datetime" |
|||
value-format="YYYY-MM-DD HH:mm:ss" |
|||
:placeholder="t('startDatePlaceholder')"> |
|||
</el-date-picker> |
|||
</el-form-item> |
|||
<el-form-item :label="t('endDate')" prop="end_date" class="input-width"> |
|||
<el-date-picker |
|||
class="flex-1 !flex" |
|||
v-model="formData.end_date" |
|||
clearable |
|||
type="datetime" |
|||
value-format="YYYY-MM-DD HH:mm:ss" |
|||
:placeholder="t('endDatePlaceholder')"> |
|||
</el-date-picker> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group v-model="formData.status" :placeholder="t('statusPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
</el-form> |
|||
</el-card> |
|||
<div class="fixed-footer-wrap"> |
|||
<div class="fixed-footer"> |
|||
<el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button> |
|||
<el-button @click="back()">{{ t('cancel') }}</el-button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { t } from '@/lang' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { getClassesInfo,addClasses,editClasses, getWithVenuesList } from '@/addon/zhjw/api/classes'; |
|||
import { useRoute } from 'vue-router' |
|||
|
|||
const route = useRoute() |
|||
const id:number = parseInt(route.query.id); |
|||
const loading = ref(false) |
|||
const pageName = route.meta.title |
|||
|
|||
|
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: 0, |
|||
venue_id: '', |
|||
thumbnail: '', |
|||
name: '', |
|||
max_students: 0, |
|||
start_date: '', |
|||
end_date: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const setFormData = async (id:number = 0) => { |
|||
Object.assign(formData, initialFormData) |
|||
const data = await (await getClassesInfo(id)).data |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
if(id) setFormData(id); |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('bj_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
watch(() => statusList.value, () => { formData.status = statusList.value[0].value }) |
|||
|
|||
|
|||
const venueIdList = ref([] as any[]) |
|||
const setVenueIdList = async () => { |
|||
venueIdList.value = await (await getWithVenuesList({})).data |
|||
} |
|||
setVenueIdList() |
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
venue_id: [ |
|||
{ required: true, message: t('venueIdPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
thumbnail: [ |
|||
{ required: true, message: t('thumbnailPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
name: [ |
|||
{ required: true, message: t('namePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
max_students: [ |
|||
{ required: true, message: t('maxStudentsPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
start_date: [ |
|||
{ required: true, message: t('startDatePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
end_date: [ |
|||
{ required: true, message: t('endDatePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const onSave = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
let data = formData |
|||
|
|||
const save = id ? editClasses : addClasses |
|||
save(data).then(res => { |
|||
loading.value = false |
|||
history.back() |
|||
}).catch(err => { |
|||
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() |
|||
} |
|||
} |
|||
const back = () => { |
|||
history.back() |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
@ -0,0 +1,249 @@ |
|||
<template> |
|||
<el-dialog v-model="showDialog" :title="formData.id ? t('updateClasses') : t('addClasses')" 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('venueId')" prop="venue_id"> |
|||
<el-select class="input-width" v-model="formData.venue_id" clearable :placeholder="t('venueIdPlaceholder')"> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in venueIdList" |
|||
:key="index" |
|||
:label="item['name']" |
|||
:value="item['id']" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('thumbnail')"> |
|||
<upload-image v-model="formData.thumbnail" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('timetableId')" prop="timetable_id"> |
|||
<el-input v-model="formData.timetable_id" clearable :placeholder="t('timetableIdPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="formData.name" clearable :placeholder="t('namePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('maxStudents')" prop="max_students"> |
|||
<el-input v-model="formData.max_students" clearable :placeholder="t('maxStudentsPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('startDate')" prop="start_date" class="input-width"> |
|||
<el-date-picker |
|||
class="flex-1 !flex" |
|||
v-model="formData.start_date" |
|||
clearable |
|||
type="datetime" |
|||
value-format="YYYY-MM-DD HH:mm:ss" |
|||
:placeholder="t('startDatePlaceholder')"> |
|||
</el-date-picker> |
|||
</el-form-item> |
|||
<el-form-item :label="t('endDate')" prop="end_date" class="input-width"> |
|||
<el-date-picker |
|||
class="flex-1 !flex" |
|||
v-model="formData.end_date" |
|||
clearable |
|||
type="datetime" |
|||
value-format="YYYY-MM-DD HH:mm:ss" |
|||
:placeholder="t('endDatePlaceholder')"> |
|||
</el-date-picker> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group v-model="formData.status" :placeholder="t('statusPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</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 { addClasses, editClasses, getClassesInfo, getWithVenuesList } from '@/addon/zhjw/api/classes' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
venue_id: '', |
|||
thumbnail: '', |
|||
timetable_id: '', |
|||
name: '', |
|||
max_students: '', |
|||
start_date: '', |
|||
end_date: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
venue_id: [ |
|||
{ required: true, message: t('venueIdPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
thumbnail: [ |
|||
{ required: true, message: t('thumbnailPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
timetable_id: [ |
|||
{ required: true, message: t('timetableIdPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
name: [ |
|||
{ required: true, message: t('namePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
max_students: [ |
|||
{ required: true, message: t('maxStudentsPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
start_date: [ |
|||
{ required: true, message: t('startDatePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
end_date: [ |
|||
{ required: true, message: t('endDatePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editClasses : addClasses |
|||
|
|||
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 statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('bj_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
watch(() => statusList.value, () => { formData.status = statusList.value[0].value }) |
|||
|
|||
|
|||
const venueIdList = ref([] as any[]) |
|||
const setVenueIdList = async () => { |
|||
venueIdList.value = await (await getWithVenuesList({})).data |
|||
} |
|||
setVenueIdList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if(row){ |
|||
const data = await (await getClassesInfo(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> |
|||
@ -0,0 +1,255 @@ |
|||
<template> |
|||
<el-dialog v-model="showDialog" :title="formData.id ? t('updateCourses') : t('addCourses')" 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('name')" prop="name"> |
|||
<el-input v-model="formData.name" clearable :placeholder="t('namePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('description')" prop="description"> |
|||
<editor v-model="formData.description" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('thumbnail')"> |
|||
<upload-image v-model="formData.thumbnail" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('targetGroup')" prop="target_group"> |
|||
<el-input v-model="formData.target_group" clearable :placeholder="t('targetGroupPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('duration')" prop="duration"> |
|||
<el-input v-model="formData.duration" clearable :placeholder="t('durationPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('tastePrice')" prop="taste_price"> |
|||
<el-input v-model="formData.taste_price" clearable :placeholder="t('tastePricePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('price')" prop="price"> |
|||
<el-input v-model="formData.price" clearable :placeholder="t('pricePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('isAutomaticSigning')" prop="is_automatic_signing"> |
|||
<el-radio-group v-model="formData.is_automatic_signing" :placeholder="t('isAutomaticSigningPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in is_automatic_signingList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('automaticSigningTime')" prop="automatic_signing_time"> |
|||
<el-input v-model="formData.automatic_signing_time" clearable :placeholder="t('automaticSigningTimePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group v-model="formData.status" :placeholder="t('statusPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</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 { addCourses, editCourses, getCoursesInfo } from '@/addon/zhjw/api/courses' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
name: '', |
|||
description: '', |
|||
thumbnail: '', |
|||
target_group: '', |
|||
duration: '', |
|||
taste_price: '', |
|||
price: '', |
|||
is_automatic_signing: '', |
|||
automatic_signing_time: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
name: [ |
|||
{ required: true, message: t('namePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
description: [ |
|||
{ required: true, message: t('descriptionPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
thumbnail: [ |
|||
{ required: true, message: t('thumbnailPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
target_group: [ |
|||
{ required: true, message: t('targetGroupPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
duration: [ |
|||
{ required: true, message: t('durationPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
taste_price: [ |
|||
{ required: true, message: t('tastePricePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
price: [ |
|||
{ required: true, message: t('pricePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
is_automatic_signing: [ |
|||
{ required: true, message: t('isAutomaticSigningPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
automatic_signing_time: [ |
|||
{ required: true, message: t('automaticSigningTimePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editCourses : addCourses |
|||
|
|||
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 is_automatic_signingList = ref([]) |
|||
const is_automatic_signingDictList = async () => { |
|||
is_automatic_signingList.value = await (await useDictionary('is_radio')).data.dictionary |
|||
} |
|||
is_automatic_signingDictList(); |
|||
watch(() => is_automatic_signingList.value, () => { formData.is_automatic_signing = is_automatic_signingList.value[0].value }) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('config_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
watch(() => statusList.value, () => { formData.status = statusList.value[0].value }) |
|||
|
|||
|
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if(row){ |
|||
const data = await (await getCoursesInfo(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> |
|||
@ -0,0 +1,233 @@ |
|||
<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('addCourses') }} |
|||
</el-button> |
|||
</div> |
|||
|
|||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> |
|||
<el-form :inline="true" :model="coursesTable.searchParam" ref="searchFormRef"> |
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="coursesTable.searchParam.name" :placeholder="t('namePlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('targetGroup')" prop="target_group"> |
|||
<el-input v-model="coursesTable.searchParam.target_group" :placeholder="t('targetGroupPlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('tastePrice')" prop="taste_price"> |
|||
<el-input v-model="coursesTable.searchParam.taste_price" :placeholder="t('tastePricePlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('price')" prop="price"> |
|||
<el-input v-model="coursesTable.searchParam.price" :placeholder="t('pricePlaceholder')" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('isAutomaticSigning')" prop="is_automatic_signing"> |
|||
<el-select class="w-[280px]" v-model="coursesTable.searchParam.is_automatic_signing" clearable :placeholder="t('isAutomaticSigningPlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in is_automatic_signingList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-select class="w-[280px]" v-model="coursesTable.searchParam.status" clearable :placeholder="t('statusPlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button type="primary" @click="loadCoursesList()">{{ 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="coursesTable.data" size="large" v-loading="coursesTable.loading"> |
|||
<template #empty> |
|||
<span>{{ !coursesTable.loading ? t('emptyData') : '' }}</span> |
|||
</template> |
|||
<el-table-column prop="name" :label="t('name')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="description" :label="t('description')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="target_group" :label="t('targetGroup')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="duration" :label="t('duration')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="taste_price" :label="t('tastePrice')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="price" :label="t('price')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column :label="t('isAutomaticSigning')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in is_automatic_signingList"> |
|||
<div v-if="item.value == row.is_automatic_signing">{{ item.name }}</div> |
|||
</div> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column :label="t('status')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in statusList"> |
|||
<div v-if="item.value == row.status">{{ 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="coursesTable.page" v-model:page-size="coursesTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" :total="coursesTable.total" |
|||
@size-change="loadCoursesList()" @current-change="loadCoursesList" /> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
</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 { getCoursesList, deleteCourses } from '@/addon/zhjw/api/courses' |
|||
import { img } from '@/utils/common' |
|||
import { ElMessageBox,FormInstance } from 'element-plus' |
|||
import { useRouter } from 'vue-router' |
|||
import { useRoute } from 'vue-router' |
|||
const route = useRoute() |
|||
const pageName = route.meta.title; |
|||
|
|||
let coursesTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam:{ |
|||
"name":"", |
|||
"description":"", |
|||
"target_group":"", |
|||
"taste_price":"", |
|||
"price":"", |
|||
"is_automatic_signing":"", |
|||
"status":"" |
|||
} |
|||
}) |
|||
|
|||
const searchFormRef = ref<FormInstance>() |
|||
|
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
const is_automatic_signingList = ref([] as any[]) |
|||
const is_automatic_signingDictList = async () => { |
|||
is_automatic_signingList.value = await (await useDictionary('is_radio')).data.dictionary |
|||
} |
|||
is_automatic_signingDictList(); |
|||
const statusList = ref([] as any[]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('config_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
|
|||
/** |
|||
* 获取课程管理列表 |
|||
*/ |
|||
const loadCoursesList = (page: number = 1) => { |
|||
coursesTable.loading = true |
|||
coursesTable.page = page |
|||
|
|||
getCoursesList({ |
|||
page: coursesTable.page, |
|||
limit: coursesTable.limit, |
|||
...coursesTable.searchParam |
|||
}).then(res => { |
|||
coursesTable.loading = false |
|||
coursesTable.data = res.data.data |
|||
coursesTable.total = res.data.total |
|||
}).catch(() => { |
|||
coursesTable.loading = false |
|||
}) |
|||
} |
|||
loadCoursesList() |
|||
|
|||
const router = useRouter() |
|||
|
|||
/** |
|||
* 添加课程管理 |
|||
*/ |
|||
const addEvent = () => { |
|||
router.push('/courses/courses_edit') |
|||
} |
|||
|
|||
/** |
|||
* 编辑课程管理 |
|||
* @param data |
|||
*/ |
|||
const editEvent = (data: any) => { |
|||
router.push('/courses/courses_edit?id='+data.id) |
|||
} |
|||
|
|||
/** |
|||
* 删除课程管理 |
|||
*/ |
|||
const deleteEvent = (id: number) => { |
|||
ElMessageBox.confirm(t('coursesDeleteTips'), t('warning'), |
|||
{ |
|||
confirmButtonText: t('confirm'), |
|||
cancelButtonText: t('cancel'), |
|||
type: 'warning', |
|||
} |
|||
).then(() => { |
|||
deleteCourses(id).then(() => { |
|||
loadCoursesList() |
|||
}).catch(() => { |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
|
|||
|
|||
const resetForm = (formEl: FormInstance | undefined) => { |
|||
if (!formEl) return |
|||
formEl.resetFields() |
|||
loadCoursesList() |
|||
} |
|||
</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> |
|||
@ -0,0 +1,252 @@ |
|||
<template> |
|||
<div class="main-container"> |
|||
<div class="detail-head"> |
|||
<div class="left" @click="back()"> |
|||
<span class="iconfont iconxiangzuojiantou !text-xs"></span> |
|||
<span class="ml-[1px]">{{t('returnToPreviousPage')}}</span> |
|||
</div> |
|||
<span class="adorn">|</span> |
|||
<span class="right">{{ pageName }}</span> |
|||
</div> |
|||
<el-card class="box-card !border-none" shadow="never"> |
|||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"> |
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="formData.name" clearable :placeholder="t('namePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('description')" prop="description"> |
|||
<editor v-model="formData.description" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('thumbnail')"> |
|||
<upload-image v-model="formData.thumbnail" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('targetGroup')" prop="target_group"> |
|||
<el-input v-model="formData.target_group" clearable :placeholder="t('targetGroupPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('duration')" prop="duration"> |
|||
<el-input v-model="formData.duration" clearable :placeholder="t('durationPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('tastePrice')" prop="taste_price"> |
|||
<el-input v-model="formData.taste_price" clearable :placeholder="t('tastePricePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('price')" prop="price"> |
|||
<el-input v-model="formData.price" clearable :placeholder="t('pricePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('isAutomaticSigning')" prop="is_automatic_signing"> |
|||
<el-radio-group v-model="formData.is_automatic_signing" :placeholder="t('isAutomaticSigningPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in is_automatic_signingList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('automaticSigningTime')" prop="automatic_signing_time"> |
|||
<el-input v-model="formData.automatic_signing_time" clearable :placeholder="t('automaticSigningTimePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group v-model="formData.status" :placeholder="t('statusPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
</el-form> |
|||
</el-card> |
|||
<div class="fixed-footer-wrap"> |
|||
<div class="fixed-footer"> |
|||
<el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button> |
|||
<el-button @click="back()">{{ t('cancel') }}</el-button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { t } from '@/lang' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { getCoursesInfo,addCourses,editCourses } from '@/addon/zhjw/api/courses'; |
|||
import { useRoute } from 'vue-router' |
|||
|
|||
const route = useRoute() |
|||
const id:number = parseInt(route.query.id); |
|||
const loading = ref(false) |
|||
const pageName = route.meta.title |
|||
|
|||
|
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: 0, |
|||
name: '', |
|||
description: '', |
|||
thumbnail: '', |
|||
target_group: '', |
|||
duration: '', |
|||
taste_price: '', |
|||
price: '', |
|||
is_automatic_signing: '', |
|||
automatic_signing_time: 0, |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const setFormData = async (id:number = 0) => { |
|||
Object.assign(formData, initialFormData) |
|||
const data = await (await getCoursesInfo(id)).data |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
if(id) setFormData(id); |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
let is_automatic_signingList = ref([]) |
|||
const is_automatic_signingDictList = async () => { |
|||
is_automatic_signingList.value = await (await useDictionary('is_radio')).data.dictionary |
|||
} |
|||
is_automatic_signingDictList(); |
|||
watch(() => is_automatic_signingList.value, () => { formData.is_automatic_signing = is_automatic_signingList.value[0].value }) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('config_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
watch(() => statusList.value, () => { formData.status = statusList.value[0].value }) |
|||
|
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
name: [ |
|||
{ required: true, message: t('namePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
description: [ |
|||
{ required: true, message: t('descriptionPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
thumbnail: [ |
|||
{ required: true, message: t('thumbnailPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
target_group: [ |
|||
{ required: true, message: t('targetGroupPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
duration: [ |
|||
{ required: true, message: t('durationPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
taste_price: [ |
|||
{ required: true, message: t('tastePricePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
price: [ |
|||
{ required: true, message: t('pricePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
is_automatic_signing: [ |
|||
{ required: true, message: t('isAutomaticSigningPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
automatic_signing_time: [ |
|||
{ required: true, message: t('automaticSigningTimePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const onSave = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
let data = formData |
|||
|
|||
const save = id ? editCourses : addCourses |
|||
save(data).then(res => { |
|||
loading.value = false |
|||
history.back() |
|||
}).catch(err => { |
|||
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() |
|||
} |
|||
} |
|||
const back = () => { |
|||
history.back() |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
@ -0,0 +1,179 @@ |
|||
<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('addRoles') }} |
|||
</el-button> |
|||
</div> |
|||
|
|||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> |
|||
<el-form :inline="true" :model="rolesTable.searchParam" ref="searchFormRef"> |
|||
|
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-select class="w-[280px]" v-model="rolesTable.searchParam.name" clearable :placeholder="t('namePlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in nameList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button type="primary" @click="loadRolesList()">{{ 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="rolesTable.data" size="large" v-loading="rolesTable.loading"> |
|||
<template #empty> |
|||
<span>{{ !rolesTable.loading ? t('emptyData') : '' }}</span> |
|||
</template> |
|||
<el-table-column prop="id" :label="t('id')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column :label="t('name')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in nameList"> |
|||
<div v-if="item.value == row.name">{{ 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="rolesTable.page" v-model:page-size="rolesTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" :total="rolesTable.total" |
|||
@size-change="loadRolesList()" @current-change="loadRolesList" /> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
</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 { getRolesList, deleteRoles } from '@/addon/zhjw/api/roles' |
|||
import { img } from '@/utils/common' |
|||
import { ElMessageBox,FormInstance } from 'element-plus' |
|||
import { useRouter } from 'vue-router' |
|||
import { useRoute } from 'vue-router' |
|||
const route = useRoute() |
|||
const pageName = route.meta.title; |
|||
|
|||
let rolesTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam:{ |
|||
"name":"" |
|||
} |
|||
}) |
|||
|
|||
const searchFormRef = ref<FormInstance>() |
|||
|
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
const nameList = ref([] as any[]) |
|||
const nameDictList = async () => { |
|||
nameList.value = await (await useDictionary('roles_name')).data.dictionary |
|||
} |
|||
nameDictList(); |
|||
|
|||
/** |
|||
* 获取角色管理列表 |
|||
*/ |
|||
const loadRolesList = (page: number = 1) => { |
|||
rolesTable.loading = true |
|||
rolesTable.page = page |
|||
|
|||
getRolesList({ |
|||
page: rolesTable.page, |
|||
limit: rolesTable.limit, |
|||
...rolesTable.searchParam |
|||
}).then(res => { |
|||
rolesTable.loading = false |
|||
rolesTable.data = res.data.data |
|||
rolesTable.total = res.data.total |
|||
}).catch(() => { |
|||
rolesTable.loading = false |
|||
}) |
|||
} |
|||
loadRolesList() |
|||
|
|||
const router = useRouter() |
|||
|
|||
/** |
|||
* 添加角色管理 |
|||
*/ |
|||
const addEvent = () => { |
|||
router.push('/roles/roles_edit') |
|||
} |
|||
|
|||
/** |
|||
* 编辑角色管理 |
|||
* @param data |
|||
*/ |
|||
const editEvent = (data: any) => { |
|||
router.push('/roles/roles_edit?id='+data.id) |
|||
} |
|||
|
|||
/** |
|||
* 删除角色管理 |
|||
*/ |
|||
const deleteEvent = (id: number) => { |
|||
ElMessageBox.confirm(t('rolesDeleteTips'), t('warning'), |
|||
{ |
|||
confirmButtonText: t('confirm'), |
|||
cancelButtonText: t('cancel'), |
|||
type: 'warning', |
|||
} |
|||
).then(() => { |
|||
deleteRoles(id).then(() => { |
|||
loadRolesList() |
|||
}).catch(() => { |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
|
|||
|
|||
const resetForm = (formEl: FormInstance | undefined) => { |
|||
if (!formEl) return |
|||
formEl.resetFields() |
|||
loadRolesList() |
|||
} |
|||
</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> |
|||
@ -0,0 +1,171 @@ |
|||
<template> |
|||
<div class="main-container"> |
|||
<div class="detail-head"> |
|||
<div class="left" @click="back()"> |
|||
<span class="iconfont iconxiangzuojiantou !text-xs"></span> |
|||
<span class="ml-[1px]">{{t('returnToPreviousPage')}}</span> |
|||
</div> |
|||
<span class="adorn">|</span> |
|||
<span class="right">{{ pageName }}</span> |
|||
</div> |
|||
<el-card class="box-card !border-none" shadow="never"> |
|||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"> |
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-radio-group v-model="formData.name" :placeholder="t('namePlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in nameList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('permissions')" prop="permissions"> |
|||
<el-input v-model="formData.permissions" clearable :placeholder="t('permissionsPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('description')" > |
|||
<el-input v-model="formData.description" clearable :placeholder="t('descriptionPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
</el-form> |
|||
</el-card> |
|||
<div class="fixed-footer-wrap"> |
|||
<div class="fixed-footer"> |
|||
<el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button> |
|||
<el-button @click="back()">{{ t('cancel') }}</el-button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { t } from '@/lang' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { getRolesInfo,addRoles,editRoles } from '@/addon/zhjw/api/roles'; |
|||
import { useRoute } from 'vue-router' |
|||
|
|||
const route = useRoute() |
|||
const id:number = parseInt(route.query.id); |
|||
const loading = ref(false) |
|||
const pageName = route.meta.title |
|||
|
|||
|
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: 0, |
|||
name: '', |
|||
permissions: '', |
|||
description: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const setFormData = async (id:number = 0) => { |
|||
Object.assign(formData, initialFormData) |
|||
const data = await (await getRolesInfo(id)).data |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
if(id) setFormData(id); |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
let nameList = ref([]) |
|||
const nameDictList = async () => { |
|||
nameList.value = await (await useDictionary('roles_name')).data.dictionary |
|||
} |
|||
nameDictList(); |
|||
watch(() => nameList.value, () => { formData.name = nameList.value[0].value }) |
|||
|
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
name: [ |
|||
{ required: true, message: t('namePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
permissions: [ |
|||
{ required: true, message: t('permissionsPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
description: [ |
|||
{ required: true, message: t('descriptionPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const onSave = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
let data = formData |
|||
|
|||
const save = id ? editRoles : addRoles |
|||
save(data).then(res => { |
|||
loading.value = false |
|||
history.back() |
|||
}).catch(err => { |
|||
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() |
|||
} |
|||
} |
|||
const back = () => { |
|||
history.back() |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
@ -0,0 +1,248 @@ |
|||
<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('addStaff') }} |
|||
</el-button> |
|||
</div> |
|||
|
|||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> |
|||
<el-form :inline="true" :model="staffTable.searchParam" ref="searchFormRef"> |
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="staffTable.searchParam.name" :placeholder="t('namePlaceholder')" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('gender')" prop="gender"> |
|||
<el-select class="w-[280px]" v-model="staffTable.searchParam.gender" clearable :placeholder="t('genderPlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in genderList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('phone')" prop="phone"> |
|||
<el-input v-model="staffTable.searchParam.phone" :placeholder="t('phonePlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('email')" prop="email"> |
|||
<el-input v-model="staffTable.searchParam.email" :placeholder="t('emailPlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('position')" prop="position"> |
|||
<el-input v-model="staffTable.searchParam.position" :placeholder="t('positionPlaceholder')" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-select class="w-[280px]" v-model="staffTable.searchParam.status" clearable :placeholder="t('statusPlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
|
|||
<el-form-item :label="t('roleId')" prop="role_id"> |
|||
<el-select class="w-[280px]" v-model="staffTable.searchParam.role_id" clearable :placeholder="t('roleIdPlaceholder')"> |
|||
<el-option |
|||
v-for="(item, index) in roleIdList" |
|||
:key="index" |
|||
:label="item['description']" |
|||
:value="item['id']" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button type="primary" @click="loadStaffList()">{{ 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="staffTable.data" size="large" v-loading="staffTable.loading"> |
|||
<template #empty> |
|||
<span>{{ !staffTable.loading ? t('emptyData') : '' }}</span> |
|||
</template> |
|||
<el-table-column prop="name" :label="t('name')" 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" :label="t('phone')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="email" :label="t('email')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="position" :label="t('position')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column :label="t('status')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in statusList"> |
|||
<div v-if="item.value == row.status">{{ item.name }}</div> |
|||
</div> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column prop="role_id_name" :label="t('roleId')" 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="staffTable.page" v-model:page-size="staffTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" :total="staffTable.total" |
|||
@size-change="loadStaffList()" @current-change="loadStaffList" /> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
</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 { getStaffList, deleteStaff, getWithRolesList } from '@/addon/zhjw/api/staff' |
|||
import { img } from '@/utils/common' |
|||
import { ElMessageBox,FormInstance } from 'element-plus' |
|||
import { useRouter } from 'vue-router' |
|||
import { useRoute } from 'vue-router' |
|||
const route = useRoute() |
|||
const pageName = route.meta.title; |
|||
|
|||
let staffTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam:{ |
|||
"name":"", |
|||
"gender":"", |
|||
"phone":"", |
|||
"email":"", |
|||
"position":"", |
|||
"status":"", |
|||
"role_id":"" |
|||
} |
|||
}) |
|||
|
|||
const searchFormRef = ref<FormInstance>() |
|||
|
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
const genderList = ref([] as any[]) |
|||
const genderDictList = async () => { |
|||
genderList.value = await (await useDictionary('sex')).data.dictionary |
|||
} |
|||
genderDictList(); |
|||
const statusList = ref([] as any[]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('zz_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
|
|||
/** |
|||
* 获取人员管理列表 |
|||
*/ |
|||
const loadStaffList = (page: number = 1) => { |
|||
staffTable.loading = true |
|||
staffTable.page = page |
|||
|
|||
getStaffList({ |
|||
page: staffTable.page, |
|||
limit: staffTable.limit, |
|||
...staffTable.searchParam |
|||
}).then(res => { |
|||
staffTable.loading = false |
|||
staffTable.data = res.data.data |
|||
staffTable.total = res.data.total |
|||
}).catch(() => { |
|||
staffTable.loading = false |
|||
}) |
|||
} |
|||
loadStaffList() |
|||
|
|||
const router = useRouter() |
|||
|
|||
/** |
|||
* 添加人员管理 |
|||
*/ |
|||
const addEvent = () => { |
|||
router.push('/staff/staff_edit') |
|||
} |
|||
|
|||
/** |
|||
* 编辑人员管理 |
|||
* @param data |
|||
*/ |
|||
const editEvent = (data: any) => { |
|||
router.push('/staff/staff_edit?id='+data.id) |
|||
} |
|||
|
|||
/** |
|||
* 删除人员管理 |
|||
*/ |
|||
const deleteEvent = (id: number) => { |
|||
ElMessageBox.confirm(t('staffDeleteTips'), t('warning'), |
|||
{ |
|||
confirmButtonText: t('confirm'), |
|||
cancelButtonText: t('cancel'), |
|||
type: 'warning', |
|||
} |
|||
).then(() => { |
|||
deleteStaff(id).then(() => { |
|||
loadStaffList() |
|||
}).catch(() => { |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
|
|||
const roleIdList = ref([]) |
|||
const setRoleIdList = async () => { |
|||
roleIdList.value = await (await getWithRolesList({})).data |
|||
} |
|||
setRoleIdList() |
|||
|
|||
const resetForm = (formEl: FormInstance | undefined) => { |
|||
if (!formEl) return |
|||
formEl.resetFields() |
|||
loadStaffList() |
|||
} |
|||
</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> |
|||
@ -0,0 +1,246 @@ |
|||
<template> |
|||
<div class="main-container"> |
|||
<div class="detail-head"> |
|||
<div class="left" @click="back()"> |
|||
<span class="iconfont iconxiangzuojiantou !text-xs"></span> |
|||
<span class="ml-[1px]">{{t('returnToPreviousPage')}}</span> |
|||
</div> |
|||
<span class="adorn">|</span> |
|||
<span class="right">{{ pageName }}</span> |
|||
</div> |
|||
<el-card class="box-card !border-none" shadow="never"> |
|||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"> |
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="formData.name" clearable :placeholder="t('namePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('header')"> |
|||
<upload-image v-model="formData.header" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('gender')" prop="gender"> |
|||
<el-radio-group v-model="formData.gender" :placeholder="t('genderPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in genderList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('phone')" prop="phone"> |
|||
<el-input v-model="formData.phone" clearable :placeholder="t('phonePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('email')" prop="email"> |
|||
<el-input v-model="formData.email" clearable :placeholder="t('emailPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('position')" prop="position"> |
|||
<el-input v-model="formData.position" clearable :placeholder="t('positionPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group v-model="formData.status" :placeholder="t('statusPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
|
|||
<el-form-item :label="t('roleId')" prop="role_id"> |
|||
<el-radio-group v-model="formData.role_id" :placeholder="t('roleIdPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in roleIdList" |
|||
:key="index" |
|||
:label="item['id']"> |
|||
{{ item['description'] }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
</el-form> |
|||
</el-card> |
|||
<div class="fixed-footer-wrap"> |
|||
<div class="fixed-footer"> |
|||
<el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button> |
|||
<el-button @click="back()">{{ t('cancel') }}</el-button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { t } from '@/lang' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { getStaffInfo,addStaff,editStaff, getWithRolesList } from '@/addon/zhjw/api/staff'; |
|||
import { useRoute } from 'vue-router' |
|||
|
|||
const route = useRoute() |
|||
const id:number = parseInt(route.query.id); |
|||
const loading = ref(false) |
|||
const pageName = route.meta.title |
|||
|
|||
|
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: 0, |
|||
name: '', |
|||
header: '', |
|||
gender: '', |
|||
phone: '', |
|||
email: '', |
|||
position: '', |
|||
status: '', |
|||
role_id: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const setFormData = async (id:number = 0) => { |
|||
Object.assign(formData, initialFormData) |
|||
const data = await (await getStaffInfo(id)).data |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
if(id) setFormData(id); |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
let genderList = ref([]) |
|||
const genderDictList = async () => { |
|||
genderList.value = await (await useDictionary('sex')).data.dictionary |
|||
} |
|||
genderDictList(); |
|||
watch(() => genderList.value, () => { formData.gender = genderList.value[0].value }) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('zz_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
watch(() => statusList.value, () => { formData.status = statusList.value[0].value }) |
|||
|
|||
|
|||
const roleIdList = ref([] as any[]) |
|||
const setRoleIdList = async () => { |
|||
roleIdList.value = await (await getWithRolesList({})).data |
|||
} |
|||
setRoleIdList() |
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
name: [ |
|||
{ required: true, message: t('namePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
header: [ |
|||
{ required: true, message: t('headerPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
gender: [ |
|||
{ required: true, message: t('genderPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
phone: [ |
|||
{ required: true, message: t('phonePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
email: [ |
|||
{ required: true, message: t('emailPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
position: [ |
|||
{ required: true, message: t('positionPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
role_id: [ |
|||
{ required: true, message: t('roleIdPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const onSave = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
let data = formData |
|||
|
|||
const save = id ? editStaff : addStaff |
|||
save(data).then(res => { |
|||
loading.value = false |
|||
history.back() |
|||
}).catch(err => { |
|||
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() |
|||
} |
|||
} |
|||
const back = () => { |
|||
history.back() |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
@ -0,0 +1,187 @@ |
|||
<template> |
|||
<el-dialog v-model="showDialog" :title="formData.id ? t('updateTimetables') : t('addTimetables')" 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('classId')" prop="class_id"> |
|||
<el-radio-group v-model="formData.class_id" :placeholder="t('classIdPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in classIdList" |
|||
:key="index" |
|||
:label="item['id']"> |
|||
{{ item['name'] }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('scheduleJson')" prop="schedule_json"> |
|||
<el-input v-model="formData.schedule_json" clearable :placeholder="t('scheduleJsonPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('cycle')" prop="cycle"> |
|||
<el-radio-group v-model="formData.cycle" :placeholder="t('cyclePlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in cycleList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</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 { addTimetables, editTimetables, getTimetablesInfo, getWithClassesList } from '@/addon/zhjw/api/timetables' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
class_id: '', |
|||
schedule_json: '', |
|||
cycle: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
class_id: [ |
|||
{ required: true, message: t('classIdPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
schedule_json: [ |
|||
{ required: true, message: t('scheduleJsonPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
cycle: [ |
|||
{ required: true, message: t('cyclePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editTimetables : addTimetables |
|||
|
|||
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 cycleList = ref([]) |
|||
const cycleDictList = async () => { |
|||
cycleList.value = await (await useDictionary('cycle')).data.dictionary |
|||
} |
|||
cycleDictList(); |
|||
watch(() => cycleList.value, () => { formData.cycle = cycleList.value[0].value }) |
|||
|
|||
|
|||
const classIdList = ref([] as any[]) |
|||
const setClassIdList = async () => { |
|||
classIdList.value = await (await getWithClassesList({})).data |
|||
} |
|||
setClassIdList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if(row){ |
|||
const data = await (await getTimetablesInfo(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> |
|||
@ -0,0 +1,197 @@ |
|||
<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('addTimetables') }} |
|||
</el-button> |
|||
</div> |
|||
|
|||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> |
|||
<el-form :inline="true" :model="timetablesTable.searchParam" ref="searchFormRef"> |
|||
|
|||
<el-form-item :label="t('classId')" prop="class_id"> |
|||
<el-select class="w-[280px]" v-model="timetablesTable.searchParam.class_id" clearable :placeholder="t('classIdPlaceholder')"> |
|||
<el-option |
|||
v-for="(item, index) in classIdList" |
|||
:key="index" |
|||
:label="item['name']" |
|||
:value="item['id']" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
|
|||
<el-form-item :label="t('cycle')" prop="cycle"> |
|||
<el-select class="w-[280px]" v-model="timetablesTable.searchParam.cycle" clearable :placeholder="t('cyclePlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in cycleList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button type="primary" @click="loadTimetablesList()">{{ 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="timetablesTable.data" size="large" v-loading="timetablesTable.loading"> |
|||
<template #empty> |
|||
<span>{{ !timetablesTable.loading ? t('emptyData') : '' }}</span> |
|||
</template> |
|||
<el-table-column prop="class_id_name" :label="t('classId')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column :label="t('cycle')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in cycleList"> |
|||
<div v-if="item.value == row.cycle">{{ 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="timetablesTable.page" v-model:page-size="timetablesTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" :total="timetablesTable.total" |
|||
@size-change="loadTimetablesList()" @current-change="loadTimetablesList" /> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
</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 { getTimetablesList, deleteTimetables, getWithClassesList } from '@/addon/zhjw/api/timetables' |
|||
import { img } from '@/utils/common' |
|||
import { ElMessageBox,FormInstance } from 'element-plus' |
|||
import { useRouter } from 'vue-router' |
|||
import { useRoute } from 'vue-router' |
|||
const route = useRoute() |
|||
const pageName = route.meta.title; |
|||
|
|||
let timetablesTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam:{ |
|||
"class_id":"", |
|||
"cycle":"" |
|||
} |
|||
}) |
|||
|
|||
const searchFormRef = ref<FormInstance>() |
|||
|
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
const cycleList = ref([] as any[]) |
|||
const cycleDictList = async () => { |
|||
cycleList.value = await (await useDictionary('cycle')).data.dictionary |
|||
} |
|||
cycleDictList(); |
|||
|
|||
/** |
|||
* 获取课表管理列表 |
|||
*/ |
|||
const loadTimetablesList = (page: number = 1) => { |
|||
timetablesTable.loading = true |
|||
timetablesTable.page = page |
|||
|
|||
getTimetablesList({ |
|||
page: timetablesTable.page, |
|||
limit: timetablesTable.limit, |
|||
...timetablesTable.searchParam |
|||
}).then(res => { |
|||
timetablesTable.loading = false |
|||
timetablesTable.data = res.data.data |
|||
timetablesTable.total = res.data.total |
|||
}).catch(() => { |
|||
timetablesTable.loading = false |
|||
}) |
|||
} |
|||
loadTimetablesList() |
|||
|
|||
const router = useRouter() |
|||
|
|||
/** |
|||
* 添加课表管理 |
|||
*/ |
|||
const addEvent = () => { |
|||
router.push('/timetables/timetables_edit') |
|||
} |
|||
|
|||
/** |
|||
* 编辑课表管理 |
|||
* @param data |
|||
*/ |
|||
const editEvent = (data: any) => { |
|||
router.push('/timetables/timetables_edit?id='+data.id) |
|||
} |
|||
|
|||
/** |
|||
* 删除课表管理 |
|||
*/ |
|||
const deleteEvent = (id: number) => { |
|||
ElMessageBox.confirm(t('timetablesDeleteTips'), t('warning'), |
|||
{ |
|||
confirmButtonText: t('confirm'), |
|||
cancelButtonText: t('cancel'), |
|||
type: 'warning', |
|||
} |
|||
).then(() => { |
|||
deleteTimetables(id).then(() => { |
|||
loadTimetablesList() |
|||
}).catch(() => { |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
|
|||
const classIdList = ref([]) |
|||
const setClassIdList = async () => { |
|||
classIdList.value = await (await getWithClassesList({})).data |
|||
} |
|||
setClassIdList() |
|||
|
|||
const resetForm = (formEl: FormInstance | undefined) => { |
|||
if (!formEl) return |
|||
formEl.resetFields() |
|||
loadTimetablesList() |
|||
} |
|||
</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> |
|||
@ -0,0 +1,184 @@ |
|||
<template> |
|||
<div class="main-container"> |
|||
<div class="detail-head"> |
|||
<div class="left" @click="back()"> |
|||
<span class="iconfont iconxiangzuojiantou !text-xs"></span> |
|||
<span class="ml-[1px]">{{t('returnToPreviousPage')}}</span> |
|||
</div> |
|||
<span class="adorn">|</span> |
|||
<span class="right">{{ pageName }}</span> |
|||
</div> |
|||
<el-card class="box-card !border-none" shadow="never"> |
|||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"> |
|||
|
|||
<el-form-item :label="t('classId')" prop="class_id"> |
|||
<el-radio-group v-model="formData.class_id" :placeholder="t('classIdPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in classIdList" |
|||
:key="index" |
|||
:label="item['id']"> |
|||
{{ item['name'] }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('scheduleJson')" prop="schedule_json"> |
|||
<el-input v-model="formData.schedule_json" clearable :placeholder="t('scheduleJsonPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('cycle')" prop="cycle"> |
|||
<el-radio-group v-model="formData.cycle" :placeholder="t('cyclePlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in cycleList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
</el-form> |
|||
</el-card> |
|||
<div class="fixed-footer-wrap"> |
|||
<div class="fixed-footer"> |
|||
<el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button> |
|||
<el-button @click="back()">{{ t('cancel') }}</el-button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { t } from '@/lang' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { getTimetablesInfo,addTimetables,editTimetables, getWithClassesList } from '@/addon/zhjw/api/timetables'; |
|||
import { useRoute } from 'vue-router' |
|||
|
|||
const route = useRoute() |
|||
const id:number = parseInt(route.query.id); |
|||
const loading = ref(false) |
|||
const pageName = route.meta.title |
|||
|
|||
|
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: 0, |
|||
class_id: '', |
|||
schedule_json: '', |
|||
cycle: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const setFormData = async (id:number = 0) => { |
|||
Object.assign(formData, initialFormData) |
|||
const data = await (await getTimetablesInfo(id)).data |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
if(id) setFormData(id); |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
let cycleList = ref([]) |
|||
const cycleDictList = async () => { |
|||
cycleList.value = await (await useDictionary('cycle')).data.dictionary |
|||
} |
|||
cycleDictList(); |
|||
watch(() => cycleList.value, () => { formData.cycle = cycleList.value[0].value }) |
|||
|
|||
|
|||
const classIdList = ref([] as any[]) |
|||
const setClassIdList = async () => { |
|||
classIdList.value = await (await getWithClassesList({})).data |
|||
} |
|||
setClassIdList() |
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
class_id: [ |
|||
{ required: true, message: t('classIdPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
schedule_json: [ |
|||
{ required: true, message: t('scheduleJsonPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
cycle: [ |
|||
{ required: true, message: t('cyclePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const onSave = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
let data = formData |
|||
|
|||
const save = id ? editTimetables : addTimetables |
|||
save(data).then(res => { |
|||
loading.value = false |
|||
history.back() |
|||
}).catch(err => { |
|||
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() |
|||
} |
|||
} |
|||
const back = () => { |
|||
history.back() |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
@ -0,0 +1,242 @@ |
|||
<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('addVenues') }} |
|||
</el-button> |
|||
</div> |
|||
|
|||
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> |
|||
<el-form :inline="true" :model="venuesTable.searchParam" ref="searchFormRef"> |
|||
|
|||
<el-form-item :label="t('campusId')" prop="campus_id"> |
|||
<el-select class="w-[280px]" v-model="venuesTable.searchParam.campus_id" clearable :placeholder="t('campusIdPlaceholder')"> |
|||
<el-option |
|||
v-for="(item, index) in campusIdList" |
|||
:key="index" |
|||
:label="item['name']" |
|||
:value="item['id']" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="venuesTable.searchParam.name" :placeholder="t('namePlaceholder')" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select class="w-[280px]" v-model="venuesTable.searchParam.type" clearable :placeholder="t('typePlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('capacity')" prop="capacity"> |
|||
<el-input v-model="venuesTable.searchParam.capacity" :placeholder="t('capacityPlaceholder')" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('availableTime')" prop="available_time"> |
|||
<el-input v-model="venuesTable.searchParam.available_time" :placeholder="t('availableTimePlaceholder')" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-select class="w-[280px]" v-model="venuesTable.searchParam.status" clearable :placeholder="t('statusPlaceholder')"> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button type="primary" @click="loadVenuesList()">{{ 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="venuesTable.data" size="large" v-loading="venuesTable.loading"> |
|||
<template #empty> |
|||
<span>{{ !venuesTable.loading ? t('emptyData') : '' }}</span> |
|||
</template> |
|||
<el-table-column prop="campus_id_name" :label="t('campusId')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="name" :label="t('name')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column :label="t('type')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in typeList"> |
|||
<div v-if="item.value == row.type">{{ item.name }}</div> |
|||
</div> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column prop="capacity" :label="t('capacity')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column prop="available_time" :label="t('availableTime')" min-width="120" :show-overflow-tooltip="true"/> |
|||
|
|||
<el-table-column :label="t('status')" min-width="180" align="center" :show-overflow-tooltip="true"> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in statusList"> |
|||
<div v-if="item.value == row.status">{{ 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="venuesTable.page" v-model:page-size="venuesTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" :total="venuesTable.total" |
|||
@size-change="loadVenuesList()" @current-change="loadVenuesList" /> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
</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 { getVenuesList, deleteVenues, getWithCampusesList } from '@/addon/zhjw/api/venues' |
|||
import { img } from '@/utils/common' |
|||
import { ElMessageBox,FormInstance } from 'element-plus' |
|||
import { useRouter } from 'vue-router' |
|||
import { useRoute } from 'vue-router' |
|||
const route = useRoute() |
|||
const pageName = route.meta.title; |
|||
|
|||
let venuesTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam:{ |
|||
"campus_id":"", |
|||
"name":"", |
|||
"type":"", |
|||
"capacity":"", |
|||
"available_time":"", |
|||
"status":"" |
|||
} |
|||
}) |
|||
|
|||
const searchFormRef = ref<FormInstance>() |
|||
|
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
const typeList = ref([] as any[]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('cd_type')).data.dictionary |
|||
} |
|||
typeDictList(); |
|||
const statusList = ref([] as any[]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('cd_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
|
|||
/** |
|||
* 获取场地管理列表 |
|||
*/ |
|||
const loadVenuesList = (page: number = 1) => { |
|||
venuesTable.loading = true |
|||
venuesTable.page = page |
|||
|
|||
getVenuesList({ |
|||
page: venuesTable.page, |
|||
limit: venuesTable.limit, |
|||
...venuesTable.searchParam |
|||
}).then(res => { |
|||
venuesTable.loading = false |
|||
venuesTable.data = res.data.data |
|||
venuesTable.total = res.data.total |
|||
}).catch(() => { |
|||
venuesTable.loading = false |
|||
}) |
|||
} |
|||
loadVenuesList() |
|||
|
|||
const router = useRouter() |
|||
|
|||
/** |
|||
* 添加场地管理 |
|||
*/ |
|||
const addEvent = () => { |
|||
router.push('/venues/venues_edit') |
|||
} |
|||
|
|||
/** |
|||
* 编辑场地管理 |
|||
* @param data |
|||
*/ |
|||
const editEvent = (data: any) => { |
|||
router.push('/venues/venues_edit?id='+data.id) |
|||
} |
|||
|
|||
/** |
|||
* 删除场地管理 |
|||
*/ |
|||
const deleteEvent = (id: number) => { |
|||
ElMessageBox.confirm(t('venuesDeleteTips'), t('warning'), |
|||
{ |
|||
confirmButtonText: t('confirm'), |
|||
cancelButtonText: t('cancel'), |
|||
type: 'warning', |
|||
} |
|||
).then(() => { |
|||
deleteVenues(id).then(() => { |
|||
loadVenuesList() |
|||
}).catch(() => { |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
|
|||
const campusIdList = ref([]) |
|||
const setCampusIdList = async () => { |
|||
campusIdList.value = await (await getWithCampusesList({})).data |
|||
} |
|||
setCampusIdList() |
|||
|
|||
const resetForm = (formEl: FormInstance | undefined) => { |
|||
if (!formEl) return |
|||
formEl.resetFields() |
|||
loadVenuesList() |
|||
} |
|||
</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> |
|||
@ -0,0 +1,236 @@ |
|||
<template> |
|||
<div class="main-container"> |
|||
<div class="detail-head"> |
|||
<div class="left" @click="back()"> |
|||
<span class="iconfont iconxiangzuojiantou !text-xs"></span> |
|||
<span class="ml-[1px]">{{t('returnToPreviousPage')}}</span> |
|||
</div> |
|||
<span class="adorn">|</span> |
|||
<span class="right">{{ pageName }}</span> |
|||
</div> |
|||
<el-card class="box-card !border-none" shadow="never"> |
|||
<el-form :model="formData" label-width="90px" ref="formRef" :rules="formRules" class="page-form"> |
|||
<el-form-item :label="t('campusId')" prop="campus_id"> |
|||
<el-select class="input-width" v-model="formData.campus_id" clearable :placeholder="t('campusIdPlaceholder')"> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in campusIdList" |
|||
:key="index" |
|||
:label="item['name']" |
|||
:value="item['id']" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('name')" prop="name"> |
|||
<el-input v-model="formData.name" clearable :placeholder="t('namePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('thumbnail')"> |
|||
<upload-image v-model="formData.thumbnail" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-radio-group v-model="formData.type" :placeholder="t('typePlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in typeList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('capacity')" prop="capacity"> |
|||
<el-input v-model="formData.capacity" clearable :placeholder="t('capacityPlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('availableTime')" prop="available_time"> |
|||
<el-input v-model="formData.available_time" clearable :placeholder="t('availableTimePlaceholder')" class="input-width" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group v-model="formData.status" :placeholder="t('statusPlaceholder')"> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" :label="item.value"> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
</el-form> |
|||
</el-card> |
|||
<div class="fixed-footer-wrap"> |
|||
<div class="fixed-footer"> |
|||
<el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button> |
|||
<el-button @click="back()">{{ t('cancel') }}</el-button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { t } from '@/lang' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { getVenuesInfo,addVenues,editVenues, getWithCampusesList } from '@/addon/zhjw/api/venues'; |
|||
import { useRoute } from 'vue-router' |
|||
|
|||
const route = useRoute() |
|||
const id:number = parseInt(route.query.id); |
|||
const loading = ref(false) |
|||
const pageName = route.meta.title |
|||
|
|||
|
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: 0, |
|||
campus_id: '', |
|||
name: '', |
|||
thumbnail: '', |
|||
type: '', |
|||
capacity: 0, |
|||
available_time: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const setFormData = async (id:number = 0) => { |
|||
Object.assign(formData, initialFormData) |
|||
const data = await (await getVenuesInfo(id)).data |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
if(id) setFormData(id); |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('cd_type')).data.dictionary |
|||
} |
|||
typeDictList(); |
|||
watch(() => typeList.value, () => { formData.type = typeList.value[0].value }) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await (await useDictionary('cd_status')).data.dictionary |
|||
} |
|||
statusDictList(); |
|||
watch(() => statusList.value, () => { formData.status = statusList.value[0].value }) |
|||
|
|||
|
|||
const campusIdList = ref([] as any[]) |
|||
const setCampusIdList = async () => { |
|||
campusIdList.value = await (await getWithCampusesList({})).data |
|||
} |
|||
setCampusIdList() |
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
campus_id: [ |
|||
{ required: true, message: t('campusIdPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
name: [ |
|||
{ required: true, message: t('namePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
thumbnail: [ |
|||
{ required: true, message: t('thumbnailPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
type: [ |
|||
{ required: true, message: t('typePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
capacity: [ |
|||
{ required: true, message: t('capacityPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
available_time: [ |
|||
{ required: true, message: t('availableTimePlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
|
|||
] |
|||
, |
|||
} |
|||
}) |
|||
|
|||
const onSave = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
let data = formData |
|||
|
|||
const save = id ? editVenues : addVenues |
|||
save(data).then(res => { |
|||
loading.value = false |
|||
history.back() |
|||
}).catch(err => { |
|||
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() |
|||
} |
|||
} |
|||
const back = () => { |
|||
history.back() |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
@ -0,0 +1,104 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace addon\zhjw\app\adminapi\controller\campuses; |
|||
|
|||
use core\base\BaseAdminController; |
|||
use addon\zhjw\app\service\admin\campuses\CampusesService; |
|||
|
|||
|
|||
/** |
|||
* 校区管理控制器 |
|||
* Class Campuses |
|||
* @package addon\zhjw\app\adminapi\controller\campuses |
|||
*/ |
|||
class Campuses extends BaseAdminController |
|||
{ |
|||
/** |
|||
* 获取校区管理列表 |
|||
* @return \think\Response |
|||
*/ |
|||
public function lists(){ |
|||
$data = $this->request->params([ |
|||
["name",""], |
|||
["coordinate",""], |
|||
["address",""], |
|||
["contact_person",""], |
|||
["contact_phone",""], |
|||
["status",""] |
|||
]); |
|||
return success((new CampusesService())->getPage($data)); |
|||
} |
|||
|
|||
/** |
|||
* 校区管理详情 |
|||
* @param int $id |
|||
* @return \think\Response |
|||
*/ |
|||
public function info(int $id){ |
|||
return success((new CampusesService())->getInfo($id)); |
|||
} |
|||
|
|||
/** |
|||
* 添加校区管理 |
|||
* @return \think\Response |
|||
*/ |
|||
public function add(){ |
|||
$data = $this->request->params([ |
|||
["name",""], |
|||
["coordinate",""], |
|||
["address",""], |
|||
["contact_person",""], |
|||
["contact_phone",""], |
|||
["status",""], |
|||
["thumbnail",""], |
|||
["description",""], |
|||
|
|||
]); |
|||
$this->validate($data, 'addon\zhjw\app\validate\campuses\Campuses.add'); |
|||
$id = (new CampusesService())->add($data); |
|||
return success('ADD_SUCCESS', ['id' => $id]); |
|||
} |
|||
|
|||
/** |
|||
* 校区管理编辑 |
|||
* @param $id 校区管理id |
|||
* @return \think\Response |
|||
*/ |
|||
public function edit(int $id){ |
|||
$data = $this->request->params([ |
|||
["name",""], |
|||
["coordinate",""], |
|||
["address",""], |
|||
["contact_person",""], |
|||
["contact_phone",""], |
|||
["status",""], |
|||
["thumbnail",""], |
|||
["description",""], |
|||
|
|||
]); |
|||
$this->validate($data, 'addon\zhjw\app\validate\campuses\Campuses.edit'); |
|||
(new CampusesService())->edit($id, $data); |
|||
return success('EDIT_SUCCESS'); |
|||
} |
|||
|
|||
/** |
|||
* 校区管理删除 |
|||
* @param $id 校区管理id |
|||
* @return \think\Response |
|||
*/ |
|||
public function del(int $id){ |
|||
(new CampusesService())->del($id); |
|||
return success('DELETE_SUCCESS'); |
|||
} |
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,104 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace addon\zhjw\app\adminapi\controller\classes; |
|||
|
|||
use core\base\BaseAdminController; |
|||
use addon\zhjw\app\service\admin\classes\ClassesService; |
|||
|
|||
|
|||
/** |
|||
* 班级管理控制器 |
|||
* Class Classes |
|||
* @package addon\zhjw\app\adminapi\controller\classes |
|||
*/ |
|||
class Classes extends BaseAdminController |
|||
{ |
|||
/** |
|||
* 获取班级管理列表 |
|||
* @return \think\Response |
|||
*/ |
|||
public function lists(){ |
|||
$data = $this->request->params([ |
|||
["venue_id",""], |
|||
["name",""], |
|||
["max_students",""], |
|||
["start_date",""], |
|||
["end_date",""], |
|||
["status",""] |
|||
]); |
|||
return success((new ClassesService())->getPage($data)); |
|||
} |
|||
|
|||
/** |
|||
* 班级管理详情 |
|||
* @param int $id |
|||
* @return \think\Response |
|||
*/ |
|||
public function info(int $id){ |
|||
return success((new ClassesService())->getInfo($id)); |
|||
} |
|||
|
|||
/** |
|||
* 添加班级管理 |
|||
* @return \think\Response |
|||
*/ |
|||
public function add(){ |
|||
$data = $this->request->params([ |
|||
["venue_id",0], |
|||
["thumbnail",""], |
|||
["name",""], |
|||
["max_students",0], |
|||
["start_date","2025-03-06 14:21:58"], |
|||
["end_date","2025-03-06 14:21:58"], |
|||
["status",""] |
|||
]); |
|||
$this->validate($data, 'addon\zhjw\app\validate\classes\Classes.add'); |
|||
$id = (new ClassesService())->add($data); |
|||
return success('ADD_SUCCESS', ['id' => $id]); |
|||
} |
|||
|
|||
/** |
|||
* 班级管理编辑 |
|||
* @param $id 班级管理id |
|||
* @return \think\Response |
|||
*/ |
|||
public function edit(int $id){ |
|||
$data = $this->request->params([ |
|||
["venue_id",0], |
|||
["thumbnail",""], |
|||
["name",""], |
|||
["max_students",0], |
|||
["start_date","2025-03-06 14:21:58"], |
|||
["end_date","2025-03-06 14:21:58"], |
|||
["status",""] |
|||
]); |
|||
$this->validate($data, 'addon\zhjw\app\validate\classes\Classes.edit'); |
|||
(new ClassesService())->edit($id, $data); |
|||
return success('EDIT_SUCCESS'); |
|||
} |
|||
|
|||
/** |
|||
* 班级管理删除 |
|||
* @param $id 班级管理id |
|||
* @return \think\Response |
|||
*/ |
|||
public function del(int $id){ |
|||
(new ClassesService())->del($id); |
|||
return success('DELETE_SUCCESS'); |
|||
} |
|||
|
|||
|
|||
public function getVenuesAll(){ |
|||
return success(( new ClassesService())->getVenuesAll()); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,107 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace addon\zhjw\app\adminapi\controller\courses; |
|||
|
|||
use core\base\BaseAdminController; |
|||
use addon\zhjw\app\service\admin\courses\CoursesService; |
|||
|
|||
|
|||
/** |
|||
* 课程管理控制器 |
|||
* Class Courses |
|||
* @package addon\zhjw\app\adminapi\controller\courses |
|||
*/ |
|||
class Courses extends BaseAdminController |
|||
{ |
|||
/** |
|||
* 获取课程管理列表 |
|||
* @return \think\Response |
|||
*/ |
|||
public function lists(){ |
|||
$data = $this->request->params([ |
|||
["name",""], |
|||
["description",""], |
|||
["target_group",""], |
|||
["taste_price",""], |
|||
["price",""], |
|||
["is_automatic_signing",""], |
|||
["status",""] |
|||
]); |
|||
return success((new CoursesService())->getPage($data)); |
|||
} |
|||
|
|||
/** |
|||
* 课程管理详情 |
|||
* @param int $id |
|||
* @return \think\Response |
|||
*/ |
|||
public function info(int $id){ |
|||
return success((new CoursesService())->getInfo($id)); |
|||
} |
|||
|
|||
/** |
|||
* 添加课程管理 |
|||
* @return \think\Response |
|||
*/ |
|||
public function add(){ |
|||
$data = $this->request->params([ |
|||
["name",""], |
|||
["description",""], |
|||
["thumbnail",""], |
|||
["target_group",""], |
|||
["duration",""], |
|||
["taste_price",0.00], |
|||
["price",0.00], |
|||
["is_automatic_signing",""], |
|||
["automatic_signing_time",0], |
|||
["status",""] |
|||
]); |
|||
$this->validate($data, 'addon\zhjw\app\validate\courses\Courses.add'); |
|||
$id = (new CoursesService())->add($data); |
|||
return success('ADD_SUCCESS', ['id' => $id]); |
|||
} |
|||
|
|||
/** |
|||
* 课程管理编辑 |
|||
* @param $id 课程管理id |
|||
* @return \think\Response |
|||
*/ |
|||
public function edit(int $id){ |
|||
$data = $this->request->params([ |
|||
["name",""], |
|||
["description",""], |
|||
["thumbnail",""], |
|||
["target_group",""], |
|||
["duration",""], |
|||
["taste_price",0.00], |
|||
["price",0.00], |
|||
["is_automatic_signing",""], |
|||
["automatic_signing_time",0], |
|||
["status",""] |
|||
]); |
|||
$this->validate($data, 'addon\zhjw\app\validate\courses\Courses.edit'); |
|||
(new CoursesService())->edit($id, $data); |
|||
return success('EDIT_SUCCESS'); |
|||
} |
|||
|
|||
/** |
|||
* 课程管理删除 |
|||
* @param $id 课程管理id |
|||
* @return \think\Response |
|||
*/ |
|||
public function del(int $id){ |
|||
(new CoursesService())->del($id); |
|||
return success('DELETE_SUCCESS'); |
|||
} |
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,87 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace addon\zhjw\app\adminapi\controller\roles; |
|||
|
|||
use core\base\BaseAdminController; |
|||
use addon\zhjw\app\service\admin\roles\RolesService; |
|||
|
|||
|
|||
/** |
|||
* 角色管理控制器 |
|||
* Class Roles |
|||
* @package addon\zhjw\app\adminapi\controller\roles |
|||
*/ |
|||
class Roles extends BaseAdminController |
|||
{ |
|||
/** |
|||
* 获取角色管理列表 |
|||
* @return \think\Response |
|||
*/ |
|||
public function lists(){ |
|||
$data = $this->request->params([ |
|||
["name",""] |
|||
]); |
|||
return success((new RolesService())->getPage($data)); |
|||
} |
|||
|
|||
/** |
|||
* 角色管理详情 |
|||
* @param int $id |
|||
* @return \think\Response |
|||
*/ |
|||
public function info(int $id){ |
|||
return success((new RolesService())->getInfo($id)); |
|||
} |
|||
|
|||
/** |
|||
* 添加角色管理 |
|||
* @return \think\Response |
|||
*/ |
|||
public function add(){ |
|||
$data = $this->request->params([ |
|||
["name",""], |
|||
["permissions",""], |
|||
["description",""] |
|||
]); |
|||
$this->validate($data, 'addon\zhjw\app\validate\roles\Roles.add'); |
|||
$id = (new RolesService())->add($data); |
|||
return success('ADD_SUCCESS', ['id' => $id]); |
|||
} |
|||
|
|||
/** |
|||
* 角色管理编辑 |
|||
* @param $id 角色管理id |
|||
* @return \think\Response |
|||
*/ |
|||
public function edit(int $id){ |
|||
$data = $this->request->params([ |
|||
["name",""], |
|||
["permissions",""], |
|||
["description",""] |
|||
]); |
|||
$this->validate($data, 'addon\zhjw\app\validate\roles\Roles.edit'); |
|||
(new RolesService())->edit($id, $data); |
|||
return success('EDIT_SUCCESS'); |
|||
} |
|||
|
|||
/** |
|||
* 角色管理删除 |
|||
* @param $id 角色管理id |
|||
* @return \think\Response |
|||
*/ |
|||
public function del(int $id){ |
|||
(new RolesService())->del($id); |
|||
return success('DELETE_SUCCESS'); |
|||
} |
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,107 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace addon\zhjw\app\adminapi\controller\staff; |
|||
|
|||
use core\base\BaseAdminController; |
|||
use addon\zhjw\app\service\admin\staff\StaffService; |
|||
|
|||
|
|||
/** |
|||
* 人员管理控制器 |
|||
* Class Staff |
|||
* @package addon\zhjw\app\adminapi\controller\staff |
|||
*/ |
|||
class Staff extends BaseAdminController |
|||
{ |
|||
/** |
|||
* 获取人员管理列表 |
|||
* @return \think\Response |
|||
*/ |
|||
public function lists(){ |
|||
$data = $this->request->params([ |
|||
["name",""], |
|||
["gender",""], |
|||
["phone",""], |
|||
["email",""], |
|||
["position",""], |
|||
["status",""], |
|||
["role_id",""] |
|||
]); |
|||
return success((new StaffService())->getPage($data)); |
|||
} |
|||
|
|||
/** |
|||
* 人员管理详情 |
|||
* @param int $id |
|||
* @return \think\Response |
|||
*/ |
|||
public function info(int $id){ |
|||
return success((new StaffService())->getInfo($id)); |
|||
} |
|||
|
|||
/** |
|||
* 添加人员管理 |
|||
* @return \think\Response |
|||
*/ |
|||
public function add(){ |
|||
$data = $this->request->params([ |
|||
["name",""], |
|||
["header",""], |
|||
["gender",""], |
|||
["phone",""], |
|||
["email",""], |
|||
["position",""], |
|||
["status",""], |
|||
["role_id",0] |
|||
]); |
|||
$this->validate($data, 'addon\zhjw\app\validate\staff\Staff.add'); |
|||
$id = (new StaffService())->add($data); |
|||
return success('ADD_SUCCESS', ['id' => $id]); |
|||
} |
|||
|
|||
/** |
|||
* 人员管理编辑 |
|||
* @param $id 人员管理id |
|||
* @return \think\Response |
|||
*/ |
|||
public function edit(int $id){ |
|||
$data = $this->request->params([ |
|||
["name",""], |
|||
["header",""], |
|||
["gender",""], |
|||
["phone",""], |
|||
["email",""], |
|||
["position",""], |
|||
["status",""], |
|||
["role_id",0] |
|||
]); |
|||
$this->validate($data, 'addon\zhjw\app\validate\staff\Staff.edit'); |
|||
(new StaffService())->edit($id, $data); |
|||
return success('EDIT_SUCCESS'); |
|||
} |
|||
|
|||
/** |
|||
* 人员管理删除 |
|||
* @param $id 人员管理id |
|||
* @return \think\Response |
|||
*/ |
|||
public function del(int $id){ |
|||
(new StaffService())->del($id); |
|||
return success('DELETE_SUCCESS'); |
|||
} |
|||
|
|||
|
|||
public function getRolesAll(){ |
|||
return success(( new StaffService())->getRolesAll()); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,92 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace addon\zhjw\app\adminapi\controller\timetables; |
|||
|
|||
use core\base\BaseAdminController; |
|||
use addon\zhjw\app\service\admin\timetables\TimetablesService; |
|||
|
|||
|
|||
/** |
|||
* 课表管理控制器 |
|||
* Class Timetables |
|||
* @package addon\zhjw\app\adminapi\controller\timetables |
|||
*/ |
|||
class Timetables extends BaseAdminController |
|||
{ |
|||
/** |
|||
* 获取课表管理列表 |
|||
* @return \think\Response |
|||
*/ |
|||
public function lists(){ |
|||
$data = $this->request->params([ |
|||
["class_id",""], |
|||
["cycle",""] |
|||
]); |
|||
return success((new TimetablesService())->getPage($data)); |
|||
} |
|||
|
|||
/** |
|||
* 课表管理详情 |
|||
* @param int $id |
|||
* @return \think\Response |
|||
*/ |
|||
public function info(int $id){ |
|||
return success((new TimetablesService())->getInfo($id)); |
|||
} |
|||
|
|||
/** |
|||
* 添加课表管理 |
|||
* @return \think\Response |
|||
*/ |
|||
public function add(){ |
|||
$data = $this->request->params([ |
|||
["class_id",0], |
|||
["schedule_json",""], |
|||
["cycle",""] |
|||
]); |
|||
$this->validate($data, 'addon\zhjw\app\validate\timetables\Timetables.add'); |
|||
$id = (new TimetablesService())->add($data); |
|||
return success('ADD_SUCCESS', ['id' => $id]); |
|||
} |
|||
|
|||
/** |
|||
* 课表管理编辑 |
|||
* @param $id 课表管理id |
|||
* @return \think\Response |
|||
*/ |
|||
public function edit(int $id){ |
|||
$data = $this->request->params([ |
|||
["class_id",0], |
|||
["schedule_json",""], |
|||
["cycle",""] |
|||
]); |
|||
$this->validate($data, 'addon\zhjw\app\validate\timetables\Timetables.edit'); |
|||
(new TimetablesService())->edit($id, $data); |
|||
return success('EDIT_SUCCESS'); |
|||
} |
|||
|
|||
/** |
|||
* 课表管理删除 |
|||
* @param $id 课表管理id |
|||
* @return \think\Response |
|||
*/ |
|||
public function del(int $id){ |
|||
(new TimetablesService())->del($id); |
|||
return success('DELETE_SUCCESS'); |
|||
} |
|||
|
|||
|
|||
public function getClassesAll(){ |
|||
return success(( new TimetablesService())->getClassesAll()); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,104 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace addon\zhjw\app\adminapi\controller\venues; |
|||
|
|||
use core\base\BaseAdminController; |
|||
use addon\zhjw\app\service\admin\venues\VenuesService; |
|||
|
|||
|
|||
/** |
|||
* 场地管理控制器 |
|||
* Class Venues |
|||
* @package addon\zhjw\app\adminapi\controller\venues |
|||
*/ |
|||
class Venues extends BaseAdminController |
|||
{ |
|||
/** |
|||
* 获取场地管理列表 |
|||
* @return \think\Response |
|||
*/ |
|||
public function lists(){ |
|||
$data = $this->request->params([ |
|||
["campus_id",""], |
|||
["name",""], |
|||
["type",""], |
|||
["capacity",""], |
|||
["available_time",""], |
|||
["status",""] |
|||
]); |
|||
return success((new VenuesService())->getPage($data)); |
|||
} |
|||
|
|||
/** |
|||
* 场地管理详情 |
|||
* @param int $id |
|||
* @return \think\Response |
|||
*/ |
|||
public function info(int $id){ |
|||
return success((new VenuesService())->getInfo($id)); |
|||
} |
|||
|
|||
/** |
|||
* 添加场地管理 |
|||
* @return \think\Response |
|||
*/ |
|||
public function add(){ |
|||
$data = $this->request->params([ |
|||
["campus_id",0], |
|||
["name",""], |
|||
["thumbnail",""], |
|||
["type",""], |
|||
["capacity",0], |
|||
["available_time",""], |
|||
["status",""] |
|||
]); |
|||
$this->validate($data, 'addon\zhjw\app\validate\venues\Venues.add'); |
|||
$id = (new VenuesService())->add($data); |
|||
return success('ADD_SUCCESS', ['id' => $id]); |
|||
} |
|||
|
|||
/** |
|||
* 场地管理编辑 |
|||
* @param $id 场地管理id |
|||
* @return \think\Response |
|||
*/ |
|||
public function edit(int $id){ |
|||
$data = $this->request->params([ |
|||
["campus_id",0], |
|||
["name",""], |
|||
["thumbnail",""], |
|||
["type",""], |
|||
["capacity",0], |
|||
["available_time",""], |
|||
["status",""] |
|||
]); |
|||
$this->validate($data, 'addon\zhjw\app\validate\venues\Venues.edit'); |
|||
(new VenuesService())->edit($id, $data); |
|||
return success('EDIT_SUCCESS'); |
|||
} |
|||
|
|||
/** |
|||
* 场地管理删除 |
|||
* @param $id 场地管理id |
|||
* @return \think\Response |
|||
*/ |
|||
public function del(int $id){ |
|||
(new VenuesService())->del($id); |
|||
return success('DELETE_SUCCESS'); |
|||
} |
|||
|
|||
|
|||
public function getCampusesAll(){ |
|||
return success(( new VenuesService())->getCampusesAll()); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,130 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace addon\zhjw\app\model\campuses; |
|||
|
|||
use core\base\BaseModel; |
|||
use think\model\concern\SoftDelete; |
|||
use think\model\relation\HasMany; |
|||
use think\model\relation\HasOne; |
|||
|
|||
/** |
|||
* 校区管理模型 |
|||
* Class Campuses |
|||
* @package addon\zhjw\app\model\campuses |
|||
*/ |
|||
class Campuses extends BaseModel |
|||
{ |
|||
|
|||
use SoftDelete; |
|||
|
|||
/** |
|||
* 数据表主键 |
|||
* @var string |
|||
*/ |
|||
protected $pk = 'id'; |
|||
|
|||
/** |
|||
* 模型名称 |
|||
* @var string |
|||
*/ |
|||
protected $name = 'campuses'; |
|||
|
|||
/** |
|||
* 定义软删除标记字段. |
|||
* @var string |
|||
*/ |
|||
protected $deleteTime = 'is_deleted'; |
|||
|
|||
/** |
|||
* 定义软删除字段的默认值. |
|||
* @var int |
|||
*/ |
|||
protected $defaultSoftDelete = 0; |
|||
|
|||
/** |
|||
* 搜索器:校区管理校区名称 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchNameAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("name", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:校区管理坐标地址 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchCoordinateAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("coordinate", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:校区管理校区地址 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchAddressAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("address", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:校区管理联系人 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchContactPersonAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("contact_person", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:校区管理联系电话 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchContactPhoneAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("contact_phone", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:校区管理状态 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchStatusAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("status", $value); |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,136 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace addon\zhjw\app\model\classes; |
|||
|
|||
use core\base\BaseModel; |
|||
use think\model\concern\SoftDelete; |
|||
use think\model\relation\HasMany; |
|||
use think\model\relation\HasOne; |
|||
|
|||
use addon\zhjw\app\model\venues\Venues; |
|||
|
|||
/** |
|||
* 班级管理模型 |
|||
* Class Classes |
|||
* @package addon\zhjw\app\model\classes |
|||
*/ |
|||
class Classes extends BaseModel |
|||
{ |
|||
|
|||
use SoftDelete; |
|||
|
|||
/** |
|||
* 数据表主键 |
|||
* @var string |
|||
*/ |
|||
protected $pk = 'id'; |
|||
|
|||
/** |
|||
* 模型名称 |
|||
* @var string |
|||
*/ |
|||
protected $name = 'classes'; |
|||
|
|||
/** |
|||
* 定义软删除标记字段. |
|||
* @var string |
|||
*/ |
|||
protected $deleteTime = 'is_deleted'; |
|||
|
|||
/** |
|||
* 定义软删除字段的默认值. |
|||
* @var int |
|||
*/ |
|||
protected $defaultSoftDelete = 0; |
|||
|
|||
/** |
|||
* 搜索器:班级管理所属场地 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchVenueIdAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("venue_id", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:班级管理班级名称 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchNameAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("name", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:班级管理最大学员数 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchMaxStudentsAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("max_students", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:班级管理开班时间 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchStartDateAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("start_date", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:班级管理结班时间 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchEndDateAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("end_date", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:班级管理状态 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchStatusAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("status", $value); |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
public function venues(){ |
|||
return $this->hasOne(Venues::class, 'id', 'venue_id')->joinType('left')->withField('name,id')->bind(['venue_id_name'=>'name']); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,142 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace addon\zhjw\app\model\courses; |
|||
|
|||
use core\base\BaseModel; |
|||
use think\model\concern\SoftDelete; |
|||
use think\model\relation\HasMany; |
|||
use think\model\relation\HasOne; |
|||
|
|||
/** |
|||
* 课程管理模型 |
|||
* Class Courses |
|||
* @package addon\zhjw\app\model\courses |
|||
*/ |
|||
class Courses extends BaseModel |
|||
{ |
|||
|
|||
use SoftDelete; |
|||
|
|||
/** |
|||
* 数据表主键 |
|||
* @var string |
|||
*/ |
|||
protected $pk = 'id'; |
|||
|
|||
/** |
|||
* 模型名称 |
|||
* @var string |
|||
*/ |
|||
protected $name = 'courses'; |
|||
|
|||
/** |
|||
* 定义软删除标记字段. |
|||
* @var string |
|||
*/ |
|||
protected $deleteTime = 'is_deleted'; |
|||
|
|||
/** |
|||
* 定义软删除字段的默认值. |
|||
* @var int |
|||
*/ |
|||
protected $defaultSoftDelete = 0; |
|||
|
|||
/** |
|||
* 搜索器:课程管理课程名称 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchNameAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("name", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:课程管理课程描述 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchDescriptionAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("description", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:课程管理适合人群 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchTargetGroupAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("target_group", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:课程管理体验价格 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchTastePriceAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("taste_price", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:课程管理正式价格 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchPriceAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("price", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:课程管理是否自动签约 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchIsAutomaticSigningAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("is_automatic_signing", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:课程管理状态 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchStatusAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("status", $value); |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,70 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace addon\zhjw\app\model\roles; |
|||
|
|||
use core\base\BaseModel; |
|||
use think\model\concern\SoftDelete; |
|||
use think\model\relation\HasMany; |
|||
use think\model\relation\HasOne; |
|||
|
|||
/** |
|||
* 角色管理模型 |
|||
* Class Roles |
|||
* @package addon\zhjw\app\model\roles |
|||
*/ |
|||
class Roles extends BaseModel |
|||
{ |
|||
|
|||
use SoftDelete; |
|||
|
|||
/** |
|||
* 数据表主键 |
|||
* @var string |
|||
*/ |
|||
protected $pk = 'id'; |
|||
|
|||
/** |
|||
* 模型名称 |
|||
* @var string |
|||
*/ |
|||
protected $name = 'roles'; |
|||
|
|||
/** |
|||
* 定义软删除标记字段. |
|||
* @var string |
|||
*/ |
|||
protected $deleteTime = 'is_deleted'; |
|||
|
|||
/** |
|||
* 定义软删除字段的默认值. |
|||
* @var int |
|||
*/ |
|||
protected $defaultSoftDelete = 0; |
|||
|
|||
/** |
|||
* 搜索器:角色管理角色名称 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchNameAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("name", $value); |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,148 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace addon\zhjw\app\model\staff; |
|||
|
|||
use core\base\BaseModel; |
|||
use think\model\concern\SoftDelete; |
|||
use think\model\relation\HasMany; |
|||
use think\model\relation\HasOne; |
|||
|
|||
use addon\zhjw\app\model\roles\Roles; |
|||
|
|||
/** |
|||
* 人员管理模型 |
|||
* Class Staff |
|||
* @package addon\zhjw\app\model\staff |
|||
*/ |
|||
class Staff extends BaseModel |
|||
{ |
|||
|
|||
use SoftDelete; |
|||
|
|||
/** |
|||
* 数据表主键 |
|||
* @var string |
|||
*/ |
|||
protected $pk = 'id'; |
|||
|
|||
/** |
|||
* 模型名称 |
|||
* @var string |
|||
*/ |
|||
protected $name = 'staff'; |
|||
|
|||
/** |
|||
* 定义软删除标记字段. |
|||
* @var string |
|||
*/ |
|||
protected $deleteTime = 'is_deleted'; |
|||
|
|||
/** |
|||
* 定义软删除字段的默认值. |
|||
* @var int |
|||
*/ |
|||
protected $defaultSoftDelete = 0; |
|||
|
|||
/** |
|||
* 搜索器:人员管理姓名 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchNameAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("name", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:人员管理性别 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchGenderAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("gender", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:人员管理联系方式 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchPhoneAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("phone", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:人员管理邮箱 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchEmailAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("email", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:人员管理职位 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchPositionAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("position", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:人员管理状态 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchStatusAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("status", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:人员管理角色关系 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchRoleIdAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("role_id", $value); |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
public function roles(){ |
|||
return $this->hasOne(Roles::class, 'id', 'role_id')->joinType('left')->withField('description,id')->bind(['role_id_name'=>'description']); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,88 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace addon\zhjw\app\model\timetables; |
|||
|
|||
use core\base\BaseModel; |
|||
use think\model\concern\SoftDelete; |
|||
use think\model\relation\HasMany; |
|||
use think\model\relation\HasOne; |
|||
|
|||
use addon\zhjw\app\model\classes\Classes; |
|||
|
|||
/** |
|||
* 课表管理模型 |
|||
* Class Timetables |
|||
* @package addon\zhjw\app\model\timetables |
|||
*/ |
|||
class Timetables extends BaseModel |
|||
{ |
|||
|
|||
use SoftDelete; |
|||
|
|||
/** |
|||
* 数据表主键 |
|||
* @var string |
|||
*/ |
|||
protected $pk = 'id'; |
|||
|
|||
/** |
|||
* 模型名称 |
|||
* @var string |
|||
*/ |
|||
protected $name = 'timetables'; |
|||
|
|||
/** |
|||
* 定义软删除标记字段. |
|||
* @var string |
|||
*/ |
|||
protected $deleteTime = 'is_deleted'; |
|||
|
|||
/** |
|||
* 定义软删除字段的默认值. |
|||
* @var int |
|||
*/ |
|||
protected $defaultSoftDelete = 0; |
|||
|
|||
/** |
|||
* 搜索器:课表管理所属班级 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchClassIdAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("class_id", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:课表管理周期 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchCycleAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("cycle", $value); |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
public function classes(){ |
|||
return $this->hasOne(Classes::class, 'id', 'class_id')->joinType('left')->withField('name,id')->bind(['class_id_name'=>'name']); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,136 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace addon\zhjw\app\model\venues; |
|||
|
|||
use core\base\BaseModel; |
|||
use think\model\concern\SoftDelete; |
|||
use think\model\relation\HasMany; |
|||
use think\model\relation\HasOne; |
|||
|
|||
use addon\zhjw\app\model\campuses\Campuses; |
|||
|
|||
/** |
|||
* 场地管理模型 |
|||
* Class Venues |
|||
* @package addon\zhjw\app\model\venues |
|||
*/ |
|||
class Venues extends BaseModel |
|||
{ |
|||
|
|||
use SoftDelete; |
|||
|
|||
/** |
|||
* 数据表主键 |
|||
* @var string |
|||
*/ |
|||
protected $pk = 'id'; |
|||
|
|||
/** |
|||
* 模型名称 |
|||
* @var string |
|||
*/ |
|||
protected $name = 'venues'; |
|||
|
|||
/** |
|||
* 定义软删除标记字段. |
|||
* @var string |
|||
*/ |
|||
protected $deleteTime = 'is_deleted'; |
|||
|
|||
/** |
|||
* 定义软删除字段的默认值. |
|||
* @var int |
|||
*/ |
|||
protected $defaultSoftDelete = 0; |
|||
|
|||
/** |
|||
* 搜索器:场地管理所属校区 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchCampusIdAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("campus_id", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:场地管理场地名称 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchNameAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("name", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:场地管理场地类型 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchTypeAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("type", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:场地管理容纳人数 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchCapacityAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("capacity", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:场地管理可用时间段 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchAvailableTimeAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("available_time", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:场地管理状态 |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchStatusAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("status", $value); |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
public function campuses(){ |
|||
return $this->hasOne(Campuses::class, 'id', 'campus_id')->joinType('left')->withField('name,id')->bind(['campus_id_name'=>'name']); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,100 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace addon\zhjw\app\service\admin\campuses; |
|||
|
|||
use addon\zhjw\app\model\campuses\Campuses; |
|||
|
|||
use core\base\BaseAdminService; |
|||
|
|||
|
|||
/** |
|||
* 校区管理服务层 |
|||
* Class CampusesService |
|||
* @package addon\zhjw\app\service\admin\campuses |
|||
*/ |
|||
class CampusesService extends BaseAdminService |
|||
{ |
|||
public function __construct() |
|||
{ |
|||
parent::__construct(); |
|||
$this->model = new Campuses(); |
|||
} |
|||
|
|||
/** |
|||
* 获取校区管理列表 |
|||
* @param array $where |
|||
* @return array |
|||
*/ |
|||
public function getPage(array $where = []) |
|||
{ |
|||
$field = 'id,name,coordinate,address,contact_person,contact_phone,status,thumbnail,description,is_deleted,created_by,created_role,created_time,updated_by,updated_role,updated_time'; |
|||
$order = 'id desc'; |
|||
|
|||
$search_model = $this->model->withSearch(["name","coordinate","address","contact_person","contact_phone","status"], $where)->field($field)->order($order); |
|||
$list = $this->pageQuery($search_model); |
|||
return $list; |
|||
} |
|||
|
|||
/** |
|||
* 获取校区管理信息 |
|||
* @param int $id |
|||
* @return array |
|||
*/ |
|||
public function getInfo(int $id) |
|||
{ |
|||
$field = 'id,name,coordinate,address,contact_person,contact_phone,status,thumbnail,description,is_deleted,created_by,created_role,created_time,updated_by,updated_role,updated_time'; |
|||
|
|||
$info = $this->model->field($field)->where([['id', "=", $id]])->findOrEmpty()->toArray(); |
|||
$info['status'] = strval($info['status']); |
|||
return $info; |
|||
} |
|||
|
|||
/** |
|||
* 添加校区管理 |
|||
* @param array $data |
|||
* @return mixed |
|||
*/ |
|||
public function add(array $data) |
|||
{ |
|||
$res = $this->model->create($data); |
|||
return $res->id; |
|||
|
|||
} |
|||
|
|||
/** |
|||
* 校区管理编辑 |
|||
* @param int $id |
|||
* @param array $data |
|||
* @return bool |
|||
*/ |
|||
public function edit(int $id, array $data) |
|||
{ |
|||
|
|||
$this->model->where([['id', '=', $id]])->update($data); |
|||
return true; |
|||
} |
|||
|
|||
/** |
|||
* 删除校区管理 |
|||
* @param int $id |
|||
* @return bool |
|||
*/ |
|||
public function del(int $id) |
|||
{ |
|||
$model = $this->model->where([['id', '=', $id]])->find(); |
|||
$res = $model->delete(); |
|||
return $res; |
|||
} |
|||
|
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,106 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace addon\zhjw\app\service\admin\classes; |
|||
|
|||
use addon\zhjw\app\model\classes\Classes; |
|||
use addon\zhjw\app\model\venues\Venues; |
|||
|
|||
use core\base\BaseAdminService; |
|||
|
|||
|
|||
/** |
|||
* 班级管理服务层 |
|||
* Class ClassesService |
|||
* @package addon\zhjw\app\service\admin\classes |
|||
*/ |
|||
class ClassesService extends BaseAdminService |
|||
{ |
|||
public function __construct() |
|||
{ |
|||
parent::__construct(); |
|||
$this->model = new Classes(); |
|||
} |
|||
|
|||
/** |
|||
* 获取班级管理列表 |
|||
* @param array $where |
|||
* @return array |
|||
*/ |
|||
public function getPage(array $where = []) |
|||
{ |
|||
$field = 'id,is_deleted,created_by,created_role,created_time,updated_by,updated_role,updated_time,venue_id,thumbnail,name,max_students,start_date,end_date,status'; |
|||
$order = 'id desc'; |
|||
|
|||
$search_model = $this->model->withSearch(["venue_id","name","max_students","start_date","end_date","status"], $where)->with(['venues'])->field($field)->order($order); |
|||
$list = $this->pageQuery($search_model); |
|||
return $list; |
|||
} |
|||
|
|||
/** |
|||
* 获取班级管理信息 |
|||
* @param int $id |
|||
* @return array |
|||
*/ |
|||
public function getInfo(int $id) |
|||
{ |
|||
$field = 'id,is_deleted,created_by,created_role,created_time,updated_by,updated_role,updated_time,venue_id,thumbnail,name,max_students,start_date,end_date,status'; |
|||
|
|||
$info = $this->model->field($field)->where([['id', "=", $id]])->with(['venues'])->findOrEmpty()->toArray(); |
|||
$info['status'] = strval($info['status']); |
|||
return $info; |
|||
} |
|||
|
|||
/** |
|||
* 添加班级管理 |
|||
* @param array $data |
|||
* @return mixed |
|||
*/ |
|||
public function add(array $data) |
|||
{ |
|||
$res = $this->model->create($data); |
|||
return $res->id; |
|||
|
|||
} |
|||
|
|||
/** |
|||
* 班级管理编辑 |
|||
* @param int $id |
|||
* @param array $data |
|||
* @return bool |
|||
*/ |
|||
public function edit(int $id, array $data) |
|||
{ |
|||
|
|||
$this->model->where([['id', '=', $id]])->update($data); |
|||
return true; |
|||
} |
|||
|
|||
/** |
|||
* 删除班级管理 |
|||
* @param int $id |
|||
* @return bool |
|||
*/ |
|||
public function del(int $id) |
|||
{ |
|||
$model = $this->model->where([['id', '=', $id]])->find(); |
|||
$res = $model->delete(); |
|||
return $res; |
|||
} |
|||
|
|||
|
|||
public function getVenuesAll(){ |
|||
$venuesModel = new Venues(); |
|||
return $venuesModel->select()->toArray(); |
|||
} |
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,101 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace addon\zhjw\app\service\admin\courses; |
|||
|
|||
use addon\zhjw\app\model\courses\Courses; |
|||
|
|||
use core\base\BaseAdminService; |
|||
|
|||
|
|||
/** |
|||
* 课程管理服务层 |
|||
* Class CoursesService |
|||
* @package addon\zhjw\app\service\admin\courses |
|||
*/ |
|||
class CoursesService extends BaseAdminService |
|||
{ |
|||
public function __construct() |
|||
{ |
|||
parent::__construct(); |
|||
$this->model = new Courses(); |
|||
} |
|||
|
|||
/** |
|||
* 获取课程管理列表 |
|||
* @param array $where |
|||
* @return array |
|||
*/ |
|||
public function getPage(array $where = []) |
|||
{ |
|||
$field = 'id,is_deleted,created_by,created_role,created_time,updated_by,updated_role,updated_time,name,description,thumbnail,target_group,duration,taste_price,price,is_automatic_signing,automatic_signing_time,status'; |
|||
$order = 'id desc'; |
|||
|
|||
$search_model = $this->model->withSearch(["name","description","target_group","taste_price","price","is_automatic_signing","status"], $where)->field($field)->order($order); |
|||
$list = $this->pageQuery($search_model); |
|||
return $list; |
|||
} |
|||
|
|||
/** |
|||
* 获取课程管理信息 |
|||
* @param int $id |
|||
* @return array |
|||
*/ |
|||
public function getInfo(int $id) |
|||
{ |
|||
$field = 'id,is_deleted,created_by,created_role,created_time,updated_by,updated_role,updated_time,name,description,thumbnail,target_group,duration,taste_price,price,is_automatic_signing,automatic_signing_time,status'; |
|||
|
|||
$info = $this->model->field($field)->where([['id', "=", $id]])->findOrEmpty()->toArray(); |
|||
$info['is_automatic_signing'] = strval($info['is_automatic_signing']); |
|||
$info['status'] = strval($info['status']); |
|||
return $info; |
|||
} |
|||
|
|||
/** |
|||
* 添加课程管理 |
|||
* @param array $data |
|||
* @return mixed |
|||
*/ |
|||
public function add(array $data) |
|||
{ |
|||
$res = $this->model->create($data); |
|||
return $res->id; |
|||
|
|||
} |
|||
|
|||
/** |
|||
* 课程管理编辑 |
|||
* @param int $id |
|||
* @param array $data |
|||
* @return bool |
|||
*/ |
|||
public function edit(int $id, array $data) |
|||
{ |
|||
|
|||
$this->model->where([['id', '=', $id]])->update($data); |
|||
return true; |
|||
} |
|||
|
|||
/** |
|||
* 删除课程管理 |
|||
* @param int $id |
|||
* @return bool |
|||
*/ |
|||
public function del(int $id) |
|||
{ |
|||
$model = $this->model->where([['id', '=', $id]])->find(); |
|||
$res = $model->delete(); |
|||
return $res; |
|||
} |
|||
|
|||
|
|||
|
|||
} |
|||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue