From c644a5afed704b804d23e97a0434491c55abc400 Mon Sep 17 00:00:00 2001 From: zhouwx <1175765986@qq.com> Date: 星期五, 18 七月 2025 17:29:42 +0800 Subject: [PATCH] 修改 --- src/views/work/onlineEducation/people/index.vue | 5 /dev/null | 179 -------------------------------------------- src/views/work/onlineEducation/groupExams/components/examDialog.vue | 2 src/views/work/onlineEducation/groupExams/components/examChooseStudent.vue | 4 src/views/work/onlineEducation/people/components/stuDialog.vue | 17 ++-- src/views/work/onlineEducation/groupExams/components/student.vue | 2 src/views/work/onlineEducation/classHourBatch/components/chooseStudent.vue | 4 src/views/build/conpanyFunctionConsult/staffManage/staffRegister/components/staffDialog.vue | 4 src/views/work/onlineEducation/classHourBatch/index.vue | 2 src/views/work/onlineEducation/groupExams/index.vue | 2 10 files changed, 22 insertions(+), 199 deletions(-) diff --git a/src/views/build/conpanyFunctionConsult/staffManage/staffRegister/components/staffDialog.vue b/src/views/build/conpanyFunctionConsult/staffManage/staffRegister/components/staffDialog.vue index a3a7a50..bb793d3 100644 --- a/src/views/build/conpanyFunctionConsult/staffManage/staffRegister/components/staffDialog.vue +++ b/src/views/build/conpanyFunctionConsult/staffManage/staffRegister/components/staffDialog.vue @@ -207,7 +207,7 @@ const validateUserPhone = (rule, value, callback)=>{ if(value === ''){ - callback() + callback(new Error('请输入手机号')) }else{ if(!verifyPhone(value)){ callback(new Error('手机号格式有误')) @@ -304,7 +304,7 @@ username: [{ required: true, message: '请选择用户名', trigger: 'blur' }], password: [{ required: true, validator: validatePwd, trigger: 'blur' }], confirmPassword: [{ required: true, validator: equalToPassword, trigger: 'blur' }], - phone: [{ validator: validateUserPhone, trigger: 'blur' }], + phone: [{ validator: validateUserPhone,required: true, trigger: 'blur' }], userType: [{ required: true, message: '请选择用户类型', trigger: 'blur' }], // idCard: [{ validator: verifyId, trigger: 'blur' }], entryTime: [{ required: true, message: '请选择入职时间', trigger: 'blur' }], diff --git a/src/views/onlineEducation/classHourBatch/components/batchDialog.vue b/src/views/onlineEducation/classHourBatch/components/batchDialog.vue deleted file mode 100644 index ac2a8ee..0000000 --- a/src/views/onlineEducation/classHourBatch/components/batchDialog.vue +++ /dev/null @@ -1,292 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - :title="title" - width="500px" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" > - <el-form-item label="所属公司:" prop="companyName" v-if="!state.isAdmin"> - <el-input v-model.trim="state.form.companyName" disabled></el-input> - </el-form-item> - <el-form-item label="批次名称:" prop="name"> - <el-input v-model.trim="state.form.name" placeholder="请输入批次名称"></el-input> - </el-form-item> - <el-form-item label="培训级别:" prop="level" > - <el-select v-model="state.form.level" placeholder="请选择培训级别" style="width: 100%"> - <el-option - v-for="item in state.levelList" - :key="item.id" - :label="item.name" - style="width: 100%" - :value="item.id"> - </el-option> - </el-select> - </el-form-item> - <el-form-item label="归属课程:" prop="courseName"> - <el-select - v-model="state.form.courseName" - style="width: 100%" - v-loadMoreNew:[reselect]="handleScroll" - :popper-class="reselect.name" - @change="selectValue" - class="item-width" - placeholder="请选择课程" - > - <el-option - v-for="item in state.courseList" - :key="item.id" - :label="item.name" - :value="item.name" - /> - </el-select> - </el-form-item> - </el-form> - <template #footer> - <span class="dialog-footer"> - <el-button @click="handleClose" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> - </span> - </template> - </el-dialog> - </div> -</template> -<script setup> -import {reactive, ref, toRefs} from 'vue' -import {ElMessage} from "element-plus"; - -import { - getClassification -} from "@/api/onlineEducation/courseClass"; -import { - addCourse, - checkCourseName, - editCourse, - getApproveCourse, - getCourse, - getCourseById -} from "@/api/onlineEducation/courseManage"; -import {getToken} from "@/utils/auth"; -import {delPic, getBannerById} from "@/api/onlineEducation/banner"; -import Cookies from "js-cookie"; -import { - addQuestionBank, - checkQuestionBankName, - editQuestionBank, - getQuestionBank -} from "@/api/onlineEducation/questionBank"; -import {addBatch, checkBatchName, editBatch} from "@/api/onlineEducation/batch"; - -const dialogVisible = ref(false); -const title = ref(""); -const busRef = ref(); -const length = ref() -const emit = defineEmits(["getList"]); -const startUsername = ref(''); -const classifyRef = ref(null) -const reselect = reactive({ - name: 'course1' -}) -const validateName = (rule, value, callback)=>{ - if(value === ''){ - callback(new Error('请输入批次名称')) - }else if(title.value === '编辑' && value === startUsername.value){ - callback() - }else{ - let param = {} - if(title.value === '新增') { - param = { - name:value - } - }else if(title.value === '编辑'){ - param = { - name:value, - id: state.form.id - } - } - checkBatchName(param).then((res)=>{ - if(res.data == false){ - callback(new Error('批次名称已被占用,请更换其他名称')) - }else{ - callback() - } - }) - } -} -const state = reactive({ - form: { - id: '', - name: '', - courseId: null, - companyName: '', - courseName: '', - companyId: null, - level: null - }, - formRules: { - companyName:[{required: true,message: '', trigger: 'blur'}], - name: [{required: true, trigger: "blur", validator: validateName}], - courseName: [{required: true, message: '请选择课程', trigger: 'blur'}], - level: [{required: true, message: '请选择培训级别', trigger: 'blur'}], - }, - classifyList: [], - isAdmin: false, - levelList: [ - { - id: 1, - name: '公司级 ' - }, - { - id: 2, - name: '部门级' - }, - { - id: 3, - name: '车间级' - }, - { - id: 4, - name: '其他' - }, - ], - courseList: [], - courseNum: 1, - courseSize: 10, - hasMoreItems: null, // 是否还有更多选项 - -}) - -const openDialog = async (type, value) => { - await loadMoreCourseData(); - const userInfo = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo) - if(userInfo.userType === 0){ - state.isAdmin = true; - state.form.companyName = '' - state.form.companyId = null - }else { - state.isAdmin = false; - state.form.companyName = userInfo.companyName - state.form.companyId = userInfo.companyId - } - title.value = type === 'addFirst' || type === 'add' ? '新增' : type ==='edit' ? '编辑' : '' ; - if(type === 'edit') { - startUsername.value = value.name; - state.form = value; - } - dialogVisible.value = true; -} -const handleScroll = () => { - if(state.courseNum >= state.hasMoreItems) return - state.courseNum++; - loadMoreCourseData() -} - -const selectValue = (val) => { - state.courseList.forEach(item => { - if(item.name === val){ - state.form.courseId = item.id - } - }) -} -const loadMoreCourseData = async () => { - const queryParams = { - pageNum: state.courseNum, - pageSize: state.courseSize, - } - const res = await getApproveCourse(queryParams) - if (res.code == 200) { - state.hasMoreItems = res.data.totalPage - const data = res.data.list.filter(item => item.status == 0) - state.courseList = state.courseList.concat(data) - }else{ - ElMessage.warning(res.message) - } -} - -const onSubmit = async () => { - if(state.isAdmin){ - ElMessage({ - type: 'warning', - message: '管理员暂无权限' - }); - return; - } - const valid = await busRef.value.validate(); - if(valid){ - if(title.value === '新增'){ - const {id,courseName,companyName, ...data} = JSON.parse(JSON.stringify(state.form)) - const res = await addBatch(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '新增成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - }else if(title.value === '编辑'){ - const {courseName,companyName,...data} = JSON.parse(JSON.stringify(state.form)) - const res = await editBatch(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '编辑成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - } - } -} - -const handleClose = () => { - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - emit("getList") - -} -const reset = () => { - state.form = { - id: '', - name: '', - courseId: null, - companyName: '', - companyId: null, - level: null, - courseName: '' - } - state.courseNum = 1; - state.courseSize = 10; - state.courseList = [] -} -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } -} -</style> diff --git a/src/views/onlineEducation/classHourBatch/components/chooseStudent.vue b/src/views/onlineEducation/classHourBatch/components/chooseStudent.vue deleted file mode 100644 index 8d097ba..0000000 --- a/src/views/onlineEducation/classHourBatch/components/chooseStudent.vue +++ /dev/null @@ -1,302 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - :title="title" - width="800px" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <el-checkbox v-model="state.DisableSelection" style="margin-left: 30px;margin-bottom: 10px;font-weight: 600" @change="changeChecked">一键全选</el-checkbox> - <div style="display: flex;justify-content: space-between"> - - <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" > - <el-form-item > -<!-- <el-checkbox v-model="state.DisableSelection">一键全选</el-checkbox>--> - </el-form-item> - <el-form-item label="姓名:" > - <el-input v-model="state.queryParams.name" placeholder="请输入姓名"></el-input> - </el-form-item> - <el-form-item label="职务:" > - <el-input v-model="state.queryParams.duty" placeholder="请输入职务"></el-input> - </el-form-item> - <el-form-item > - <el-button - type="primary" - @click="getList" - >查询</el-button> - <el-button - type="primary" - plain - @click="resetQuery" - >重置</el-button> - </el-form-item> - </el-form> - </div> - <!-- 表格数据 --> - <el-table - ref="tableRef" - v-loading="state.allLoading" - :data="state.dataList" - :border="true" - :row-key="getRowKey" - @selection-change="handleSelectionChange" - v-model="state.selectRowKeys" - :header-cell-class-name="cellClass" - > - <el-table-column type="selection" :reserve-selection="true" width="55" align="center" :selectable="selectable" /> -<!-- <el-table-column label="序号" type="index" align="center" width="80" />--> - <el-table-column label="工号" prop="empno" align="center" width="60" /> - <el-table-column label="姓名" prop="name" align="center" /> - <el-table-column label="性别" prop="sex" align="center" > - <template #default="scope"> - <span>{{scope.row.sex == 0 ? '男':'女'}}</span> - </template> - </el-table-column> - <el-table-column label="手机号" prop="phone" align="center" width="130"/> - <el-table-column label="身份证" prop="idNo" align="center" width="200" :show-overflow-tooltip="true"/> -<!-- <el-table-column label="创建人" prop="createBy" align="center"/>--> - <el-table-column label="工作岗位" prop="post" align="center"/> - <el-table-column label="职务" prop="duty" align="center"/> -<!-- <el-table-column label="一人一档" prop="duty" align="center" width="120">--> -<!-- <template #default="scope">--> -<!-- <el-button link type="primary">培训考试记录</el-button>--> -<!-- </template>--> -<!-- </el-table-column>--> - </el-table> - - <pagination - v-show="state.total> 0" - :total="state.total" - v-model:page="state.queryParams.pageNum" - v-model:limit="state.queryParams.pageSize" - @pagination="getList" - /> - <template #footer> - <span class="dialog-footer"> - <el-button @click="handleClose" size="default">取 消</el-button> - <el-button type="primary" v-if="state.allLoading && state.DisableSelection " disabled>全选加载中</el-button> - <el-button type="primary" v-else @click="onSubmit" size="default" v-preReClick>确认</el-button> - </span> - </template> - </el-dialog> - </div> -</template> -<script setup> -import {nextTick, reactive, ref, toRefs} from 'vue' -import {ElMessage} from "element-plus"; -import Cookies from "js-cookie"; -import {addQuestionBank, checkQuestionBankName, editQuestionBank} from "@/api/onlineEducation/questionBank"; -import {getStudent, getStudentAll} from "@/api/onlineEducation/student"; -import {batchAddStudent} from "@/api/onlineEducation/batch"; - -const dialogVisible = ref(false); -const title = ref(""); -const tableRef = ref(); -const length = ref() -const emit = defineEmits(["getList"]); -const startUsername = ref(''); -const classifyRef = ref(null) -const state = reactive({ - form: [], - isAdmin: false, - total: 0, - disabled:true, - queryParams: { - pageNum: 1, - pageSize: 10, - name: '', - duty: '' - }, - dataList: [], - totalItems: 0, // 总数据条数,从后端接口获取 - phaseId: null, - chooseStu: [], - companyId: null, - selectRowKeys: [], - DisableSelection:false, - allStuList: [], - allLoading: false - -}) -const loading = ref(false); - -const getRowKey = (row) => { - return row.id -} -const openDialog = async (data) => { - // state.selectRowKeys = [10,11] - state.phaseId = data.queryParams.phaseId - title.value = '学员选择'; - dialogVisible.value = true; - await getAllStudent() - await getList() - -} - -const getList = async () => { - loading.value = true - const res = await getStudent(state.queryParams) - if(res.code == 200){ - state.dataList = res.data.list - state.total = res.data.total - // await nextTick(() => { - // const currentIds = state.dataList.map(row => row.id) - // const selectIds = state.selectRowKeys.filter(id => currentIds.includes(id)) - // state.dataList.forEach(row => { - // if (selectIds.includes(row.id)) { - // tableRef.value.toggleRowSelection(row, true); - // } - // }) - // }); - }else{ - ElMessage.warning(res.message) - } - loading.value = false -} - -const onSubmit = async () => { - console.log('state.chooseStu',state.chooseStu) - const res = await batchAddStudent(state.chooseStu) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '新增成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - reset(); - dialogVisible.value = false; -} - -const handleClose = () => { - reset(); - dialogVisible.value = false; - emit("getList") -} -const reset = () => { - state.form = { - id: '', - name: '', - categoryId: null, - companyName: '', - companyId: null - } - - tableRef.value.clearSelection(); - state.dataList = [] - state.allStuList = [] - state.total = 0 - state.DisableSelection = false - state.queryParams ={ - pageNum: 1, - pageSize: 10, - name: '', - duty: '' - - } -} -const handleSelectionChange = (val) => { - state.chooseStu = val.map(item => { - return { - companyId: item.companyId, - createId:item.createId, - phaseId:state.phaseId, - studentId: item.id - } - }) -} -const resetQuery = () => { - state.form = { - id: '', - name: '', - categoryId: null, - companyName: '', - companyId: null - } - tableRef.value.clearSelection(); - state.dataList = [] - state.allStuList = [] - state.total = 0 - state.DisableSelection = false - state.queryParams ={ - pageNum: 1, - pageSize: 10, - name: '', - duty: '' - - } - getList() -} -const selectable = (row,rowIndex) => { - if(state.DisableSelection){ - }else { - return true - } - -} -const cellClass = (row) => { - if (state.DisableSelection) { - if(row.columnIndex == 0){ - return "DisableSelection" - } - - } -} - -const changeChecked = (val) => { - tableRef.value.clearSelection(); - if(val){ - state.chooseStu= state.allStuList.map(item => { - return { - companyId: item.companyId, - createId:item.createId, - phaseId:state.phaseId, - studentId: item.id - } - }) - }else { - state.chooseStu = [] - } -} -const getAllStudent = async () => { - state.allLoading = true - const res = await getStudentAll() - if(res.code == 200){ - state.allStuList = res.data - state.allLoading = false - }else{ - ElMessage.warning(res.message) - } -} - -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } - - :deep(.el-table .DisableSelection .cell .el-checkbox__inner){ - display: none; - position: relative; - } - :deep(.el-table .DisableSelection .cell:before){ - content: ""; - position: absolute; - } -} -</style> diff --git a/src/views/onlineEducation/classHourBatch/components/classHourChange.vue b/src/views/onlineEducation/classHourBatch/components/classHourChange.vue deleted file mode 100644 index 37c0b64..0000000 --- a/src/views/onlineEducation/classHourBatch/components/classHourChange.vue +++ /dev/null @@ -1,113 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - :title="state.title" - width="50%" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <el-table v-loading="state.loading" :data="state.dataList" :border="true"> - <el-table-column label="创建时间" prop="createTime" align="center" width="180" /> - <el-table-column label="变动来源" prop="origin" align="center" /> - <el-table-column label="变动情况" prop="modifyPeriodMin" align="center" /> - <el-table-column label="变动后剩余" prop="remainPeriodMin" align="center" /> -<!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">--> -<!-- <template #default="scope">--> -<!-- <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>--> -<!-- </template>--> -<!-- </el-table-column>--> - </el-table> - <pagination - v-show="state.total > 0" - :total="state.total" - v-model:page="state.queryParams.pageNum" - v-model:limit="state.queryParams.pageSize" - @pagination="getList" - /> - </el-dialog> - </div> -</template> -<script setup> -import {reactive, ref, toRefs} from 'vue' -import {ElMessage} from "element-plus"; - -import { - getClassification -} from "@/api/onlineEducation/courseClass"; -import {addCourse, checkCourseName, editCourse, getCourseById} from "@/api/onlineEducation/courseManage"; -import {getToken} from "@/utils/auth"; -import {delPic, getBannerById} from "@/api/onlineEducation/banner"; -import Cookies from "js-cookie"; -import {addQuestionBank, checkQuestionBankName, editQuestionBank} from "@/api/onlineEducation/questionBank"; -import {getBatch, getCompanyPeriod} from "@/api/onlineEducation/batch"; - -const dialogVisible = ref(false); -const title = ref(""); -const busRef = ref(); -const length = ref() -const emit = defineEmits(["getList"]); -const startUsername = ref(''); -const classifyRef = ref(null) - -const state = reactive({ - loading: false, - dataList: [], - queryParams: { - pageNum: 1, - pageSize: 10, - companyId: null - }, - total: 0, - title: '' -}) - -const openDialog = async (value) => { - state.title = '课时余量变动明细' - dialogVisible.value = true; - state.queryParams.companyId = value - await getList() -} -const getList = async () => { - state.loading = true - const res = await getCompanyPeriod(state.queryParams) - if(res.code == 200){ - state.dataList = res.data.list.map(item => { - return { - ...item, - modifyPeriodMin: item.modifyPeriod ? item.modifyPeriod >0 ?'新增 '+(item.modifyPeriod /60).toFixed(2).replace(/\.00$/, '')+'分钟':'减少 '+ (Math.abs(item.modifyPeriod /60)).toFixed(2).replace(/\.00$/, '')+'分钟' : '', - remainPeriodMin: item.remainPeriod ? (item.remainPeriod /60).toFixed(2).replace(/\.00$/, '')+'分钟' : '' - } - }) - state.total = res.data.total - }else{ - ElMessage.warning(res.message) - } - state.loading = false -} - -const handleClose = () => { - dialogVisible.value = false; - emit("getList") - -} - -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } -} -</style> diff --git a/src/views/onlineEducation/classHourBatch/components/handleStudent.vue b/src/views/onlineEducation/classHourBatch/components/handleStudent.vue deleted file mode 100644 index a27a75e..0000000 --- a/src/views/onlineEducation/classHourBatch/components/handleStudent.vue +++ /dev/null @@ -1,227 +0,0 @@ -<template> - <div class="app-container"> - <div style="display: flex;justify-content: space-between"> - <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" > - <el-form-item> - <el-button - type="primary" - plain - icon="Plus" - @click="openDialog()" - >选择学员</el-button> - </el-form-item> - <el-form-item label="学生姓名:" > - <el-input v-model="data.queryParams.studentName" placeholder="请输入学生姓名"></el-input> - </el-form-item> - <el-form-item > - <el-button - type="primary" - @click="getList" - >查询</el-button> - <el-button - type="primary" - plain - @click="reset" - >重置</el-button> - </el-form-item> - </el-form> - <div> - <el-button - type="danger" - plain - icon="Delete" - @click="handleDeleteBatch" - >批量删除</el-button> - <el-button - type="primary" - plain - @click="back" - >返回</el-button> - </div> - - </div> - <!-- 表格数据 --> - <el-table ref="tableRef" v-loading="loading" :data="dataList" :border="true" :row-key="getRowKey" @selection-change="handleSelectionChange"> - <el-table-column type="selection" :reserve-selection="true" width="55" align="center" /> - <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="批次名称" prop="phaseName" align="center" /> - <el-table-column label="学员名称" prop="studentName" align="center" /> - <el-table-column label="手机号" prop="studentPhone" align="center" /> - <el-table-column label="总进度" prop="totalProgress" align="center" > - <template #default="scope"> - <el-progress - v-if="scope.row.totalProgress>=0" - :text-inside="true" - :stroke-width="24" - :percentage="scope.row.totalProgress" - :status="scope.row.totalProgress <= 50 ? 'exception' : scope.row.totalProgress > 50 && scope.row.totalProgress <= 80 ? 'warning':'success'" - /> - </template> - </el-table-column> - <el-table-column label="开始学习时间" prop="startTime" align="center" /> - <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180"> - <template #default="scope"> - <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> - </template> - </el-table-column> - </el-table> - - <pagination - v-show="total > 0" - :total="total" - v-model:page="queryParams.pageNum" - v-model:limit="queryParams.pageSize" - @pagination="getList" - /> - - <choose-stu-dialog ref="dialogRef" @getList=getList></choose-stu-dialog> - </div> -</template> - -<script setup> -import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; -import {ElMessage, ElMessageBox} from "element-plus"; -import chooseStuDialog from './chooseStudent.vue' -import Cookies from "js-cookie"; -import {delQuestionBank, getQuestionBank} from "@/api/onlineEducation/questionBank"; -import {batchDelStudent, delBatchStu, getBatchStudent} from "@/api/onlineEducation/batch"; -import {useRoute, useRouter} from 'vue-router' -const route = useRoute() - - -const { proxy } = getCurrentInstance(); -const loading = ref(false); -const dialogRef = ref(); -const tableRef = ref(); -const router = useRouter(); -const data = reactive({ - queryParams: { - pageId: null, - phaseId: null, - pageNum: 1, - pageSize: 10, - studentName: '' - }, - total: 0, - dataList: [], - isAdmin: false, - chooseStu: [] - -}); - -const { queryParams, total, dataList } = toRefs(data); - -const backValue = ref() -onMounted(async ()=>{ - const userInfo = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo) - if(userInfo.userType === 0){ - data.isAdmin = true; - }else { - data.isAdmin = false; - } - const val = JSON.parse(route.query.val) - backValue.value = val - // data.queryParams.pageId = val.id - data.queryParams.phaseId = val.id - await getList() -}) -onUnmounted(()=>{ - -}) - -const getRowKey = (row) => { - return row.id -} -const getList = async () => { - loading.value = true - const res = await getBatchStudent(data.queryParams) - if(res.code == 200){ - data.dataList = res.data.list - data.total = res.data.total - }else{ - ElMessage.warning(res.message) - } - loading.value = false -} - -const openDialog = () => { - dialogRef.value.openDialog(data); -} - -/** 重置新增的表单以及其他数据 */ -function reset() { - data.queryParams = { - pageNum: 1, - pageSize: 10, - studentName: '', - phaseId: data.queryParams.phaseId, - pageId: data.queryParams.pageId - } - - getList() -} -const handleSelectionChange = (val) => { - - console.log("选中的行", val) - data.chooseStu = val.map(item => item.id) -} -const handleDelete = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await delBatchStu(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - tableRef.value.clearSelection(); - }else{ - ElMessage.warning(res.message) - } - }) -} -const handleDeleteBatch = () => { - if(data.chooseStu && data.chooseStu.length <=0){ - ElMessage.warning('请选择要删除的学员'); - return false; - } - ElMessageBox.confirm( - '确定删除选择的所有数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - // const param = { - // phaseStudentIds: data.chooseStu - // } - const res = await batchDelStudent(data.chooseStu) - if(res.code == 200){ - ElMessage.success('数据删除成功') - tableRef.value.clearSelection(); - await getList() - }else{ - ElMessage.warning(res.message) - } - }) -} -const back = () => { - - const obj = { - pageNum: backValue.value.pageNum, - pageSize: backValue.value.pageSize, - } - const v = JSON.stringify(obj) - router.push({ path: "/class", query: { val: v } }); -} - - -</script> diff --git a/src/views/onlineEducation/classHourBatch/index.vue b/src/views/onlineEducation/classHourBatch/index.vue deleted file mode 100644 index d264e80..0000000 --- a/src/views/onlineEducation/classHourBatch/index.vue +++ /dev/null @@ -1,224 +0,0 @@ -<template> - <div class="app-container"> - <div style="display: flex;justify-content: space-between"> - <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" > - <el-form-item> - <el-button - type="primary" - plain - icon="Plus" - @click="openDialog('add',{})" - >新增批次</el-button> - </el-form-item> - <el-form-item label="批次名称:" > - <el-input v-model="data.queryParams.name" placeholder="请输入批次名称"></el-input> - </el-form-item> - <el-form-item label="批次级别:" > - <el-select - v-model="data.queryParams.level" - class="w100" - style="max-width: 180px" - clearable - size="default" - > - <el-option v-for="item in data.levelList" :key="item.id" :label="item.name" :value="item.id"></el-option> - </el-select> - </el-form-item> - <el-form-item > - <el-button - type="primary" - @click="getList" - >查询</el-button> - <el-button - type="primary" - plain - @click="reset" - >重置</el-button> - </el-form-item> - </el-form> - <span v-if="!data.isAdmin" style="font-size: 19px;font-weight: 600;margin-right: 20px"> - {{data.companyName}},您的企业当前系统可用课时总计 - <span style="font-size: 19px;font-weight: 600;color: #1ab394">{{data.remainPeriod}}</span> 分钟。<span @click="openDetail" style="cursor: pointer; font-size: 19px;font-weight: 600;color: #1890ff">[明细]</span> - </span> - </div> - <!-- 表格数据 --> - <el-table v-loading="loading" :data="dataList" :border="true"> - <el-table-column label="批次编号" prop="code" align="center" width="135" /> - <el-table-column label="创建时间" prop="createTime" align="center" width="120" /> - <el-table-column label="批次名称" prop="name" align="center" /> - <el-table-column label="创建企业" prop="companyName" align="center" /> - <el-table-column label="批次级别" prop="level" align="center" > - <template #default="scope"> - <span>{{scope.row.level === 1 ? '公司级' : scope.row.level === 2 ? '部门级' : scope.row.level === 3 ? '车间级' : '其他' }}</span> - </template> - </el-table-column> - <el-table-column label="课程" prop="courseName" align="center" /> - <el-table-column label="学习人数" prop="studentCount" align="center" /> - <el-table-column label="总课时" prop="coursePeriodNum" align="center" /> - <el-table-column label="已完成人数" prop="finishCount" align="center" /> - <el-table-column label="完成率" prop="finishRate" align="center" /> - <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180"> - <template #default="scope"> - <el-button link type="primary" @click="toStuChoose(scope.row)">学生数据</el-button> - <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> - <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> - </template> - </el-table-column> - </el-table> - - <pagination - v-show="total > 0" - :total="total" - v-model:page="queryParams.pageNum" - v-model:limit="queryParams.pageSize" - @pagination="getList" - /> - <batch-dialog ref="dialogRef" @getList=getList></batch-dialog> - <class-hour-change ref="classHourRef" @getList=getList></class-hour-change> - </div> -</template> - -<script setup> -import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; -import {ElMessage, ElMessageBox} from "element-plus"; -import batchDialog from './components/batchDialog.vue' -import classHourChange from './components/classHourChange.vue' -import Cookies from "js-cookie"; -import {useRoute, useRouter} from 'vue-router' -const router = useRouter() -import {delQuestionBank, getQuestionBank} from "@/api/onlineEducation/questionBank"; -import {delBatch, getBatch} from "@/api/onlineEducation/batch"; -const route = useRoute() - -const { proxy } = getCurrentInstance(); -const loading = ref(false); -const dialogRef = ref(); -const classHourRef = ref(); -const data = reactive({ - queryParams: { - name: '', - level: null, - pageNum: 1, - pageSize: 10, - }, - total: 0, - dataList: [], - isAdmin: false, - companyName: '', - remainPeriod: null, - companyId: null, - levelList: [ - { - id: 1, - name: '公司级 ' - }, - { - id: 2, - name: '部门级' - }, - { - id: 3, - name: '车间级' - }, - { - id: 4, - name: '其他' - }, - ], - -}); - -const { queryParams, total, dataList } = toRefs(data); - -onMounted(async ()=>{ - if(route.query.val){ - const val = JSON.parse(route.query.val) - if(val){ - data.queryParams.pageNum = val.pageNum; - data.queryParams.pageSize = val.pageSize; - } - } - - const userInfo = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo) - if(userInfo.userType === 0){ - data.isAdmin = true; - }else { - data.remainPeriod = userInfo.remainPeriod ? (userInfo.remainPeriod /60).toFixed(2).replace(/\.00$/, ''):'' - data.isAdmin = false; - data.companyName = userInfo.companyName - data.companyId = userInfo.companyId - } - await getList() -}) -onUnmounted(()=>{ - -}) - -const getList = async () => { - loading.value = true - const res = await getBatch(data.queryParams) - if(res.code == 200){ - data.dataList = res.data.list.map(item => { - return { - ...item, - coursePeriodNum: item.coursePeriod ? (item.coursePeriod /60).toFixed(2).replace(/\.00$/, '') + '分钟':'', - finishRate: item.finishCount ? item.finishCount ===0 && item.studentCount ===0 ? '0%': (item.finishCount / item.studentCount).toFixed(2) *100 + '%' : '' - } - }) - data.total = res.data.total - }else{ - ElMessage.warning(res.message) - } - loading.value = false -} - -const openDialog = (type, value) => { - dialogRef.value.openDialog(type, value); -} - -/** 重置新增的表单以及其他数据 */ -function reset() { - data.queryParams = { - name: '', - level: null, - pageNum: 1, - pageSize: 10, - } - getList() -} -const handleDelete = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await delBatch(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }) -} -const toStuChoose = (val) => { - const obj = { - pageNum: data.queryParams.pageNum, - pageSize: data.queryParams.pageSize, - id: val.id - } - // val.pageNum = data.queryParams.pageNum; - // val.pageSize = data.queryParams.pageSize - const v = JSON.stringify(obj) - router.push({ path: "/chooseStu", query: { val: v } }); -} - -const openDetail = () => { - classHourRef.value.openDialog(data.companyId) -} -</script> diff --git a/src/views/onlineEducation/count/index.vue b/src/views/onlineEducation/count/index.vue deleted file mode 100644 index 8dd1a9e..0000000 --- a/src/views/onlineEducation/count/index.vue +++ /dev/null @@ -1,232 +0,0 @@ -<template> - <div class="app-container"> - <div> - <el-form style="display: flex;flex-wrap: wrap"> - <el-form-item label="企业:" v-if="state.isAdmin"> - <el-select - v-model="state.queryParams.companyName" - filterable - remote - @change="selectValue" - reserve-keyword - placeholder="请输入企业名称" - remote-show-suffix - :remote-method="getCompanyList" - :loading="loadingCompany" - style="width: 240px" - > - <el-option - v-for="item in state.companyList" - :key="item.id" - :label="item.name" - :value="item.name" - /> - </el-select> - </el-form-item> - <el-form-item label="时间范围:" style="margin-left: 20px"> - <el-date-picker - v-model="searchTime" - type="daterange" - @change="changeTime" - range-separator="至" - start-placeholder="开始日期" - end-placeholder="结束日期" - format="YYYY-MM-DD" - /> - </el-form-item> - <el-form-item style="margin-left: 50px"> - <el-radio-group v-model="state.queryParams.type"> - <el-radio :label="1">线上教育</el-radio> - <el-radio :label="2">线下教育</el-radio> -<!-- <el-radio :label="null">全部</el-radio>--> - </el-radio-group> - </el-form-item> - <el-form-item> - <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button> - <el-button plain @click="reset">重置</el-button> - </el-form-item> - - </el-form> - </div> - <!-- 表格数据 --> - <el-table v-loading="loading" :data="state.dataList" :border="true" row-key="id"> - <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="企业名称" prop="companyName" align="center" /> - <el-table-column label="企业编号" prop="companyCode" align="center" /> - <el-table-column label="总批次/人数" prop="sort" align="center" > - <template #default="scope"> - <span>{{scope.row.phaseStudentCount && scope.row.phaseCount ? scope.row.phaseCount + '/' +scope.row.phaseStudentCount:''}}</span> - </template> - </el-table-column> - <el-table-column label="三级" prop="sort" align="center" > - <template #default="scope"> - <span>{{scope.row.level3StudentCount && scope.row.level3PhaseCount ? scope.row.level3PhaseCount+ '/' +scope.row.level3StudentCount:''}}</span> - </template> - </el-table-column> - <el-table-column label="二级" prop="sort" align="center" > - <template #default="scope"> - <span>{{scope.row.level2StudentCount && scope.row.level2PhaseCount ? scope.row.level2PhaseCount+ '/' +scope.row.level2StudentCount:''}}</span> - </template> - </el-table-column> - <el-table-column label="一级" prop="sort" align="center" > - <template #default="scope"> - <span>{{scope.row.level1StudentCount && scope.row.level1PhaseCount ? scope.row.level1PhaseCount+ '/' +scope.row.level1StudentCount:''}}</span> - </template> - </el-table-column> - <el-table-column label="考试人次" prop="paperStudentCount" align="center" /> - <el-table-column label="合格人次" prop="passStudentCount" align="center" /> - <el-table-column label="合格率" prop="passRate" align="center" /> - </el-table> - <pagination - v-show="state.total > 0" - :total="state.total" - v-model:page="state.queryParams.pageNum" - v-model:limit="state.queryParams.pageSize" - @pagination="getList" - /> - - </div> -</template> - -<script setup> -import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue"; -import {ElMessage, ElMessageBox} from "element-plus"; -import moment from "moment"; - -import {delClassification, getClassification} from "@/api/onlineEducation/courseClass"; -import {getCompany} from "@/api/onlineEducation/company"; -import {getCompanyCount} from "@/api/onlineEducation/count"; -import Cookies from "js-cookie"; -const { proxy } = getCurrentInstance(); -const loading = ref(false); -const areaRef = ref(); -const searchTime = ref([]); -const state = reactive({ - queryParams: { - companyId: '', - type: null, - endTime: '', - startTime: '', - pageNum: 1, - pageSize: 10, - }, - total: 0, - dataList: [ - ], - companyList: [], - pageNum: 1, - pageSize: 10, - isAdmin: false -}); - -//页面加载 -onMounted(() => { - setDate(); - const userInfo = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo) - state.isAdmin = userInfo.userType === 0; - // if(state.isAdmin){ - // getCompanyList(); - // } - - getList(); - -}); -const getList = async () => { - loading.value = true; - const res = await getCompanyCount(state.queryParams); - if(res.code === 200){ - state.dataList = res.data.list.map(item => { - return { - ...item, - passRate: item.passStudentCount && item.paperStudentCount ? (item.passStudentCount / item.paperStudentCount).toFixed(2) *100 + '%': item.passStudentCount == 0 && item.paperStudentCount == 0? '0%': '' - - } - }) - state.total = res.data.total - }else{ - ElMessage.warning(res.message) - } - loading.value = false; -} -const selectValue = (val) => { - state.companyList.forEach(item => { - if(item.name === val){ - state.queryParams.companyId = item.id - } - }) -} - -const finshed = ref(false) -const loadingCompany = ref(false) -const getCompanyList = async (val)=>{ - if(val != ""){ - loadingCompany.value = true; - const queryParams = { - name: val - } - const res = await getCompany(queryParams) - if (res.code == 200) { - loadingCompany.value = false; - state.companyList = res.data.list - - } else { - ElMessage.warning(res.message) - } - } -} -//触底函数 -// const loadMore = () => { -// console.log(' 触底了'); -// // 防抖处理 -// setTimeout(() => { -// if (finshed.value) return //值为true,则代表没有数据了 -// state.pageNum += 1 -// // getCompanyList('') -// }, 500) -// } -const setDate = () => { - - const end = new Date(); - const start = new Date(); - start.setTime(start.getTime() - 3600 * 1000 * 24 * 7); - const sTime = moment(start).format('YYYY-MM-DD') - const eTime = moment(end).format('YYYY-MM-DD') - searchTime.value = [sTime,eTime]; - state.queryParams.startTime = searchTime.value[0]+' 00:00:00' - state.queryParams.endTime = searchTime.value[1]+' 00:00:00' -} -const changeTime=(value)=>{ - console.log('11',searchTime.value) - if(!value){ - state.queryParams.endTime = "" - state.queryParams.startTime = "" - } - searchTime.value[0]=moment(searchTime.value[0]).format('YYYY-MM-DD') - searchTime.value[1]=moment(searchTime.value[1]).format('YYYY-MM-DD') -} -const searchClick = () => { - if(searchTime.value && searchTime.value.length>0){ - state.queryParams.startTime = searchTime.value[0] + ' 00:00:00' - state.queryParams.endTime = searchTime.value[1] + ' 00:00:00' - } - getList(); -} - -/** 重置新增的表单以及其他数据 */ -function reset() { - state.queryParams = { - companyId: '', - type: null, - endTime: '', - startTime: '', - pageNum: 1, - pageSize: 10, - } - searchTime.value = []; - state.companyList = []; - getList(); -} - - -</script> diff --git a/src/views/onlineEducation/courseManage/components/courseManageDialog.vue b/src/views/onlineEducation/courseManage/components/courseManageDialog.vue deleted file mode 100644 index 7725903..0000000 --- a/src/views/onlineEducation/courseManage/components/courseManageDialog.vue +++ /dev/null @@ -1,328 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - :title="title" - width="500px" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" > - <el-form-item label="课程名称:" prop="name"> - <el-input v-model.trim="state.form.name" placeholder="请输入课程名称"></el-input> - </el-form-item> - <el-form-item label="课程分类:" prop="categoryId" > -<!-- <el-select clearable v-model="state.form.categoryId" style="width: 100%" placeholder="请选择课程分类" @change="changeType">--> -<!-- <el-option v-for="item in state.classifyList" :key="item" :label="item.name" :value="item.id" />--> -<!-- </el-select>--> - <el-cascader - ref="classifyRef" - style="width: 100%" - v-model="state.form.categoryId" - :options="state.classifyList" - :props="state.props" - clearable - :show-all-levels="false" - @change="handleChange" - /> - </el-form-item> -<!-- <el-form-item label="要求课时:" prop="period">--> -<!-- <el-input v-model="state.form.period" placeholder="请输入要求课时">--> -<!-- <template #append>分钟</template>--> -<!-- </el-input>--> -<!-- </el-form-item>--> - <el-form-item label="提交单位:" prop="companyName" > - <el-input v-model="state.form.companyName" disabled/> - </el-form-item> - <el-form-item label="封面:"> - <el-upload accept="image/*" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" :limit='state.imgLimit' v-model:file-list="state.imgList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)" > - <el-icon><Plus /></el-icon> - <template #tip> - <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传1张</div> - </template> - </el-upload> - </el-form-item> - </el-form> - <template #footer> - <span class="dialog-footer"> - <el-button @click="handleClose" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> - </span> - </template> - </el-dialog> - </div> -</template> -<script setup> -import {reactive, ref, toRefs} from 'vue' -import Editor from "@/components/Editor/index.vue"; -import {ElMessage} from "element-plus"; -import {addNotice} from "@/api/backManage/notice"; -import {addDict, editDict, getDictDetail} from "@/api/backManage/evaluate"; -import {addCompany, checkName, distributeCompany, editCompany} from "@/api/onlineEducation/company"; -import {verifyPhone} from "@/utils/validate"; -import { - addClassification, - checkClassName, - editClassification, - getClassification -} from "@/api/onlineEducation/courseClass"; -import {addCourse, checkCourseName, editCourse, getCourseById} from "@/api/onlineEducation/courseManage"; -import {getToken} from "@/utils/auth"; -import {delPic, getBannerById} from "@/api/onlineEducation/banner"; -import Cookies from "js-cookie"; - -const dialogVisible = ref(false); -const title = ref(""); -const busRef = ref(); -const length = ref() -const emit = defineEmits(["getList"]); -const startUsername = ref(''); -const classifyRef = ref(null) - -const validateName = (rule, value, callback)=>{ - if(value === ''){ - callback(new Error('请输入课程名称')) - }else if(title.value === '编辑' && value === startUsername.value){ - callback() - }else{ - let param = {} - if(title.value === '新增') { - param = { - name:value - } - }else if(title.value === '编辑'){ - param = { - name:value, - id: state.form.id - } - } - checkCourseName(param).then((res)=>{ - if(res.data == false){ - callback(new Error('课程名称已被占用,请更换其他名称')) - }else{ - callback() - } - }) - } -} -const state = reactive({ - form: { - id: '', - name: '', - categoryId: null, - period: null, - logo: '', - companyId: null - }, - formRules: { - name: [{required: true, trigger: "blur", validator: validateName}], - categoryId: [{required: true, message: '请选择课程分类', trigger: 'blur'}], - period: [{required: true, message: '请输入要求课时', trigger: 'blur'}], - }, - classifyList: [], - uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', - header: { - Authorization: getToken() - }, - imgLimit: 1, - imgList: [], - isAdmin: false, - props: { - checkStrictly: true, - } -}) - -const openDialog = async (type, value) => { - await getClassifyList(); - const userInfo = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo) - if(userInfo.userType === 0){ - state.isAdmin = true; - state.form.companyName = '公开课' - state.form.companyId = null - }else { - state.isAdmin = false; - state.form.companyName = userInfo.companyName - state.form.companyId = userInfo.companyId - } - title.value = type === 'addFirst' || type === 'add' ? '新增' : type ==='edit' ? '编辑' : '' ; - if(type === 'edit') { - const res = await getCourseById(value.id); - if(res.code === 200){ - state.form = res.data - state.form.companyName = res.data.companyName ? res.data.companyName : '公开课' - console.log("11",res.data) - if(res.data.logo) { - const obj = { - url: import.meta.env.VITE_APP_BASE_API + "/" + res.data.logo, - name: '' - } - state.imgList = [obj] - } - }else{ - ElMessage.warning(res.message) - } - startUsername.value = value.username; - }else if(type === 'add' && value ){ - state.form.parentId = value.id - } - dialogVisible.value = true; -} -const getClassifyList = async () => { - const res = await getClassification(); - if(res.code === 200){ - state.classifyList = recursion(res.data) - }else{ - ElMessage.warning(res.message) - } -} -const recursion = (data) => { - let tmp = [] - for (let i = 0; i < data.length; i++) { - let item = data[i] - // children为空 - if (item.children&& item.children.length==0) { - tmp.push({ - value: item.id, - label: item.name - }) - // 有children - } else { - tmp.push({ - value: item.id, - label: item.name, - children:recursion(item.children) - }) - } - } - return tmp; -} -const handleAvatarSuccess = (res, uploadFile) => { - if(res.code == 200){ - state.form.logo = res.data.path - }else{ - state.imgList = [] - ElMessage({ - type: 'warning', - message: '文件上传失败' - }) - } -} -const handleChange = ()=> { - console.log("label====",classifyRef.value.getCheckedNodes()[0].value) - state.form.categoryId = classifyRef.value.getCheckedNodes()[0].value - // 我这里只是打印了一下label的值哦,需要赋值的话自己去赋值哦 - if (classifyRef.value.popperVisible) { - classifyRef.value.togglePopperVisible() - } -} - - -const showTip =()=>{ - ElMessage({ - type: 'warning', - message: '超出文件上传数量' - }); -} -const picSize = async (rawFile) => { - if(rawFile.size / 1024 / 1024 > 5){ - ElMessage({ - type: 'warning', - message: '文件大小不能超过5M' - }); - return false - } -}; -const handleRemove = async (file, uploadFiles) => { - let path = state.form.logo; - await delPic({path: path}).then(res => { - if(res.code == 200){ - // ElMessage({ - // type: 'success', - // message: '文件已删除' - // }) - state.form.logo = '' - }else{ - ElMessage({ - type: 'warning', - message: res.message - }) - } - }).catch(() => { - state.form.imgUrl = '' - }); -} -const onSubmit = async () => { - const valid = await busRef.value.validate(); - if(valid){ - if(title.value === '新增'){ - const {id, ...data} = JSON.parse(JSON.stringify(state.form)) - const res = await addCourse(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '新增成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - }else if(title.value === '编辑'){ - const {...data} = JSON.parse(JSON.stringify(state.form)) - const res = await editCourse(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '编辑成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - } - } -} - -const handleClose = () => { - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - emit("getList") - -} -const reset = () => { - state.form = { - id: '', - name: '', - categoryId: null, - period: null, - logo: '', - companyId: null - } - state.imgList = [] -} -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } -} -</style> diff --git a/src/views/onlineEducation/courseManage/courseChapters/components/chapterDialog.vue b/src/views/onlineEducation/courseManage/courseChapters/components/chapterDialog.vue deleted file mode 100644 index ae5c0f5..0000000 --- a/src/views/onlineEducation/courseManage/courseChapters/components/chapterDialog.vue +++ /dev/null @@ -1,253 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - :title="title" - width="550px" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="100px" > - <el-form-item label="章名称:" prop="name"> - <el-input v-model.trim="state.form.name" maxlength="100" show-word-limit :disabled="!state.isFirst"></el-input> - </el-form-item> - <el-form-item label="节名称:" prop="chapter.name" v-if="!state.isFirst"> - <el-input v-model.trim="state.chapter.name"></el-input> - </el-form-item> - <el-form-item label="资源:" v-if="!state.isFirst"> - <div style="display: flex;align-items: center; width: 100%;justify-content: space-between;"> - <el-input v-model.trim="state.chapter.resourceName" disabled style="width: 80%"></el-input> - <el-button type="primary" style="margin-left: 20px" plain size="default" @click="openResource">选择资源</el-button> - </div> - - </el-form-item> - - <el-form-item label="排序:" prop="sort" > - <el-input-number v-model="state.form.sort" /> - </el-form-item> - </el-form> - <template #footer> - <span class="dialog-footer"> - <el-button @click="handleClose" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> - </span> - </template> - </el-dialog> - <courseDialog ref="courseRef" @choose-res="choosedResource" ></courseDialog> - </div> -</template> -<script setup> -import {reactive, ref, toRefs} from 'vue' -import Editor from "@/components/Editor/index.vue"; -import {ElMessage} from "element-plus"; -import {addNotice} from "@/api/backManage/notice"; -import {addDict, editDict, getDictDetail} from "@/api/backManage/evaluate"; -import {addCompany, checkName, distributeCompany, editCompany} from "@/api/onlineEducation/company"; -import {verifyPhone} from "@/utils/validate"; -import {addClassification, checkClassName, editClassification} from "@/api/onlineEducation/courseClass"; -import courseDialog from './chooseResource.vue' -import { - addChapter, - addChapterPeriod, - checkChapterName, - editChapter, - editChapterPeriod -} from "@/api/onlineEducation/chapters"; - -const dialogVisible = ref(false); -const title = ref(""); -const busRef = ref(); -const courseRef = ref() -const length = ref() -const emit = defineEmits(["getList"]); -const startUsername = ref(''); -const startUsernamePeriod = ref(''); - - -const validateName = (rule, value, callback)=>{ - if(value === ''){ - callback(new Error('请输入章名称')) - }else if(title.value === '编辑' && value === startUsername.value || title.value === '新增' && value === startUsername.value){ - callback() - }else{ - let param = {} - if(title.value === '新增') { - param = { - name:value, - courseId: state.form.courseId - } - }else if(title.value === '编辑'){ - param = { - name:value, - id: state.form.id, - courseId: state.form.courseId - } - } - checkChapterName(param).then((res)=>{ - if(res.data == false){ - callback(new Error('名称已被占用,请更换其他名称')) - }else{ - callback() - } - }) - } -} -const state = reactive({ - form: { - id: '', - name: '', - sort: 0, - courseId: null, - chapterPeriods: [] - }, - formRules:{ - name: [{ required: true, trigger: "blur", validator: validateName }], - }, - isFirst: true, - chapter: {} -}) - -const openDialog = async (type, value) => { - length.value = value.listLength - state.form.courseId = value.courseId - title.value = type === 'addFirst' || type === 'add' ? '新增' : type ==='edit' ? '编辑' : '' ; - if(type === 'edit') { - if(!value.chapterId){ - state.isFirst = true; - startUsername.value = value.name; - state.form = value; - state.form.sort = value.sort; - }else { - state.isFirst = false; - startUsernamePeriod.value = value.name; - state.chapter = value; - state.form.name = value.capterName; - startUsername.value = value.capterName; - state.chapter.resourceName = value.resource.name - } - - }else if(type === 'add' && value ){ - startUsername.value = value.name; - state.chapter.chapterId = value.id; - state.chapter.courseId = value.courseId; - state.form.name = value.name - state.isFirst = false; - }else { - state.isFirst = true; - } - dialogVisible.value = true; -} -const choosedResource = (val) => { - state.chapter.resourceName = val.name - state.chapter.resourceId = val.id -} - -const onSubmit = async () => { - const valid = await busRef.value.validate(); - if(valid){ - if(title.value === '新增'){ - if(state.chapter.chapterId){ - const {id, ...data} = JSON.parse(JSON.stringify(state.chapter)) - data.sort = state.form.sort - const res = await addChapterPeriod(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '新增成功' - }); - }else{ - ElMessage.warning(res.message) - } - }else{ - const {id, ...data} = JSON.parse(JSON.stringify(state.form)) - const res = await addChapter(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '新增成功' - }); - }else{ - ElMessage.warning(res.message) - } - } - - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - }else if(title.value === '编辑'){ - if(state.chapter.chapterId){ - const {...data} = JSON.parse(JSON.stringify(state.chapter)) - data.sort = state.form.sort - const res = await editChapterPeriod(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '编辑成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - }else { - const {...data} = JSON.parse(JSON.stringify(state.form)) - const res = await editChapter(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '编辑成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - } - - } - } -} - -const handleClose = () => { - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - emit("getList") -} -const openResource = () => { - courseRef.value.openDialog() -} -const reset = () => { - state.form = { - id: '', - name: '', - sort: 0, - courseId: null, - chapterPeriods: [] - } - state.chapter={} -} -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } -} -</style> diff --git a/src/views/onlineEducation/courseManage/courseChapters/components/chooseResource.vue b/src/views/onlineEducation/courseManage/courseChapters/components/chooseResource.vue deleted file mode 100644 index 3c1a371..0000000 --- a/src/views/onlineEducation/courseManage/courseChapters/components/chooseResource.vue +++ /dev/null @@ -1,133 +0,0 @@ -<template> - <div class="app-container"> - <el-dialog - v-model="dialogVisible" - title="选择资源" - width="600px" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <div style="margin-bottom: 10px"> - <el-form> - <el-form-item label="资源名称"> - <el-input style="width: 20%" v-model="data.queryParams.name "></el-input> - <el-button type="primary" style="margin-left: 30px" @click="getList">查询</el-button> - <el-button plain @click="reset">重置</el-button> - <el-button type="primary" @click="openResource">资源上传</el-button> - </el-form-item> - </el-form> - </div> - <!-- 表格数据 --> - <el-table v-loading="loading" :data="dataList" :border="true"> - <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="资源名称" prop="name" align="center" /> - <el-table-column label="资源类型" prop="resourceType" align="center" > - <template #default="scope"> - <span>{{scope.row.resourceType == 1 ? '视频':scope.row.resourceType == 2 ? '音频':'文档'}}</span> - </template> - </el-table-column> - <el-table-column label="上传时间" prop="createTime" align="center" /> - <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > - <template #default="scope"> - <el-button link type="primary" @click="choose(scope.row)">选择</el-button> - </template> - </el-table-column> - </el-table> - - <pagination - v-show="total > 0" - :total="total" - v-model:page="queryParams.pageNum" - v-model:limit="queryParams.pageSize" - @pagination="getList" - /> - </el-dialog> - <resource-dialog ref="resourceRef" @getList="getList"></resource-dialog> - </div> -</template> - -<script setup> -import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; -import {ElMessage, ElMessageBox} from "element-plus"; -import resourceDialog from '@/views/onlineEducation/courseManage/courseResource/componets/resourceDialog.vue' -import {checkResourceName, delResource, getResource} from "@/api/onlineEducation/courseResource"; -import {checkName} from "@/api/onlineEducation/company"; -const { proxy } = getCurrentInstance(); -const loading = ref(false); -const emit = defineEmits(["chooseRes"]); -const dialogRef = ref(); -const resourceRef = ref() -const data = reactive({ - queryParams: { - pageNum: 1, - pageSize: 10, - name: '' - }, - total: 0, - dataList: [] -}); - -const dialogVisible = ref(false); -const { queryParams, total, dataList } = toRefs(data); - -onMounted(()=>{ - -}) - -onUnmounted(()=>{ - -}) - -const openDialog = async () => { - await getList() - dialogVisible.value = true; -} - -const handleClose = () => { - dialogVisible.value = false; -} -const getList = async () => { - loading.value = true - const res = await getResource(data.queryParams) - if(res.code == 200){ - data.dataList = res.data.list.map(item => { - return{ - ...item, - sizeMB: Number((item.resourceSize /1024 /1024).toFixed(2))+'MB' - } - }) - console.log("ddd",data.dataList) - data.total = res.data.total - }else{ - ElMessage.warning(res.message) - } - loading.value = false -} - -const openResource = () => { - resourceRef.value.openDialog('add',{}) -} - -const choose = (value) => { - console.log("co",value) - emit('chooseRes',value) - dialogVisible.value = false - // dialogRef.value.openDialog(type, value); -} -defineExpose({ - openDialog -}); - - -/** 重置新增的表单以及其他数据 */ -function reset() { - data.queryParams = { - pageNum: 1, - pageSize: 10, - name: '' - } - getList() -} - -</script> diff --git a/src/views/onlineEducation/courseManage/courseChapters/index.vue b/src/views/onlineEducation/courseManage/courseChapters/index.vue deleted file mode 100644 index a5a54d8..0000000 --- a/src/views/onlineEducation/courseManage/courseChapters/index.vue +++ /dev/null @@ -1,166 +0,0 @@ -<template> - <div class="app-container"> - <div style="margin-bottom: 10px;display:flex;justify-content: space-between;align-items: center"> - <el-button type="success" plain @click="openDialog('addFirst',{courseId: data.courseId})" :disabled="disabled">章添加</el-button> - <el-button type="primary" plain @click="back">返回</el-button> - </div> - <!-- 表格数据 --> - <el-table v-loading="loading" :data="dataList" :border="true" row-key="id" :tree-props="{ children: 'chapterPeriods' }"> - <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="章节名称" > - <template #default="scope"> - <span>{{scope.row.name}}</span> - <span v-if="scope.row.chapterId" style="font-size: 14px;margin-left: 5px">【{{scope.row.resource.resourceType === 1 ? '视频:':scope.row.resource.resourceType === 2 ? '音频:':'文档:'}}{{scope.row.resource.name}}】| {{scope.row.timeFormat}}</span> - </template> - </el-table-column> - <el-table-column label="排序" prop="sort" align="center" width="80" /> - <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="250" > - <template #default="scope"> - <el-button type="success" plain @click="openDialog('add',scope.row)" v-if="!scope.row.chapterId" :disabled="disabled">节添加</el-button> - <el-button type="primary" plain @click="openDialog('edit',scope.row)" :disabled="disabled">编辑</el-button> - <el-button type="danger" plain @click="handleDelete(scope.row)" :disabled="disabled">删除</el-button> - </template> - </el-table-column> - </el-table> - <chapters-dialog ref="areaRef" @getList="getList"></chapters-dialog> - </div> -</template> - -<script setup> -import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue"; -import {ElMessage, ElMessageBox} from "element-plus"; -import chaptersDialog from "./components/chapterDialog.vue" -import {delArea, getArea} from "@/api/backManage/area"; -import {getDictList} from "@/api/backManage/evaluate"; -import {delMonitor} from "@/api/sysUsers"; -import {useRoute,useRouter} from 'vue-router' -import {delClassification, getClassification} from "@/api/onlineEducation/courseClass"; -import {delChapter, delPeriod, getChapters} from "@/api/onlineEducation/chapters"; -import Cookies from "js-cookie"; -const { proxy } = getCurrentInstance(); -const route = useRoute() -const router = useRouter(); -const loading = ref(false); -const areaRef = ref(); -const cityList = ref([]) -const data = reactive({ - queryParams: { - name: '', - }, - total: 0, - dataList: [ - ], - courseId: '' -}); - -const { queryParams, total, dataList } = toRefs(data); -const backValue = ref() -const disabled = ref(false) -//页面加载 -onMounted(() => { - backValue.value = JSON.parse(route.query.val) - const userInfo = JSON.parse(Cookies.get('userInfo')) - if((backValue.value.state === 2 || backValue.value.state === 1 ) && userInfo.userType == 1){ - disabled.value = true; - } - data.courseId = backValue.value.id - console.log("rou",data.courseId) - getList(); -}); -const getList = async () => { - loading.value = true; - const param = { - courseId: data.courseId - } - const res = await getChapters(param); - if(res.code === 200){ - dataList.value = res.data.map(item => { - return { - ...item, - chapterPeriods: item.chapterPeriods.map(r => { - return { - ...r, - timeFormat: r.resource.resourceType === 1 || r.resource.resourceType === 2 ? secondsToTime(r.resource.resourceLength) : r.resource.docPage + '页' - } - }) - - } - }) - }else{ - ElMessage.warning(res.message) - } - loading.value = false; - console.log('dataList.value',dataList.value) -} -const secondsToTime = (seconds) => { - const hours = Math.floor(seconds / 3600); - const minutes = Math.floor((seconds % 3600) / 60); - const secs = seconds % 60; - - return [ - hours, - hours > 0 ? pad(minutes) : minutes, - pad(secs) - ].join(':'); -} -const pad = (number) => { - return (number < 10 ? '0' : '') + number; -} - -const openDialog = (type, value) => { - dataList.value.forEach(item => { - if(item.id == value.chapterId){ - value.capterName = item.name - } - }) - areaRef.value.openDialog(type, value); -} - -/** 重置新增的表单以及其他数据 */ -function reset() { - data.queryParams.name = ''; - data.queryParams.pageNum = 1; - getList(); -} -const handleDelete = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - if(!val.chapterId){ - const res = await delChapter(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }else { - const res = await delPeriod(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - } - - }) -} -const back = () => { - - const obj = { - pageNum: backValue.value.pageNum, - pageSize: backValue.value.pageSize, - } - const v = JSON.stringify(obj) - router.push({ path: "/courseManage/course", query: { val: v } }); -} - - -</script> diff --git a/src/views/onlineEducation/courseManage/courseResource/componets/resourceDialog.vue b/src/views/onlineEducation/courseManage/courseResource/componets/resourceDialog.vue deleted file mode 100644 index 1936140..0000000 --- a/src/views/onlineEducation/courseManage/courseResource/componets/resourceDialog.vue +++ /dev/null @@ -1,351 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - :title="title" - width="550px" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="130px" > - <el-form-item label="资源名称:" prop="name" > - <el-input v-model.trim="state.form.name" placeholder="请输入资源名称"></el-input> - </el-form-item> - <el-form-item label="资源类型:" prop="resourceType" > - <el-select - @change="changeType" - v-model="state.form.resourceType" - placeholder="请选择资源类型" - size="default" - style="width: 100%" - - > - <el-option - v-for="item in state.typeList" - :key="item.id" - :label="item.name" - :value="item.id" - /> - </el-select> - </el-form-item> - <el-form-item label="资源时长(秒):" prop="resourceLength" v-if="(state.form.resourceType == 1 || state.form.resourceType == 2)&& state.form.resourceLength"> - <el-input - :disabled="state.form.resourceLength!=0" - v-model="state.form.resourceLength" - style="width: 100%" - placeholder="请输入资源时长(秒)" - > - <template #append>秒</template> - </el-input> - </el-form-item> - <el-form-item label="文档页数:" prop="docPage" v-if="state.form.resourceType == 3 && state.form.docPage "> - <el-input - :disabled="state.form.docPage!=0" - v-model="state.form.docPage" - style="width: 100%" - placeholder="请输入文档页数:" - > - <template #append>页</template> - </el-input> - </el-form-item> - - <el-form-item label="资源上传:"> - <file-upload ref="fileRef" :responseType="state.form.resourceType" @getFile="getFile"></file-upload> - </el-form-item> - - </el-form> - <template #footer> - <span class="dialog-footer"> - <el-button @click="handleClose" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> - </span> - </template> - </el-dialog> - </div> -</template> -<script setup> -import {nextTick, reactive, ref, toRefs} from 'vue' -import Editor from "@/components/Editor/index.vue"; -import {ElMessage} from "element-plus"; -import {addNotice} from "@/api/backManage/notice"; -import {addDict, editDict, getDictDetail} from "@/api/backManage/evaluate"; -import {addCompany, checkName, distributeCompany, editCompany} from "@/api/onlineEducation/company"; -import {verifyPhone} from "@/utils/validate"; -import {addBanner, delPic, editBanner, getBannerById} from "@/api/onlineEducation/banner"; -import {getToken} from "@/utils/auth"; -import {getUserById} from "@/api/onlineEducation/user"; -import {addResource, checkResourceName, editResource, getResourceById} from "@/api/onlineEducation/courseResource"; -import fileUpload from '@/views/components/upload.vue' -import Cookies from "js-cookie"; - -const dialogVisible = ref(false); -const title = ref(""); -const fileRef = ref(); -const busRef = ref(); -const length = ref() -const emit = defineEmits(["getList"]); -const startUsername = ref(''); -const startPhone = ref(''); - -const validateName = (rule, value, callback)=>{ - if(value === ''){ - callback(new Error('请输入资源名称')) - }else if(title.value === '资源编辑' && value === startUsername.value){ - callback() - }else{ - let param = {} - if(title.value === '资源新增') { - param = { - name:value, - } - }else if(title.value === '资源编辑'){ - param = { - name:value, - id: state.form.id - } - } - checkResourceName(param).then((res)=>{ - if(res.data == false){ - callback(new Error('资源名称已被占用,请更换其他名称')) - }else{ - callback() - } - }) - } -} - -const state = reactive({ - form: { - id: '', - name: '', - mediaType: '', - resourceType: null, - companyId: null, - resourcePath:'', - md5: '', - resourceSize: null, - resourceLength: '', - docPage: null, - originName: '' - }, - formRules:{ - name: [{ required: true, trigger: "blur", validator: validateName }], - resourceType:[{ required: true, message: '请选择资源类型', trigger: 'blur' }], - resourceLength: [{ required: true, trigger: "blur", message: '请输入资源时长(秒)' }], - }, - uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', - header: { - Authorization:getToken() - }, - imgLimit: 1, - imgList: [], - typeList: [ - { - id: 1, - name: '视频' - }, - { - id: 2, - name: '音频' - }, - { - id: 3, - name: '文档' - }, - ] -}) -const handleChange = (file, fileLists) => { - state.form.file = file.raw; - console.log(file); - // 这里把数组置空是为了每次只能上传一个文件,以防报错 - state.imgList = []; - state.form.mediaType = file.raw.type -} -const handleAvatarSuccess = (response, file, fileList) => { - if(response.code == 200){ - if(file && file.raw){ - state.form.mediaType = file.raw.type - } - state.form.file = file - }else{ - state.imgList = [] - ElMessage({ - type: 'warning', - message: '文件上传失败' - }) - } -} -const showTip =()=>{ - ElMessage({ - type: 'warning', - message: '超出文件上传数量' - }); -} -const picSize = async (rawFile) => { - if(rawFile.size / 1024 / 1024 > 5){ - ElMessage({ - type: 'warning', - message: '文件大小不能超过5M' - }); - return false - } -}; -const handleRemove = async (file, uploadFiles) => { - let path = state.form.imgUrl; - await delPic({path: path}).then(res => { - if(res.code == 200){ - // ElMessage({ - // type: 'success', - // message: '文件已删除' - // }) - state.form.imgUrl = '' - }else{ - ElMessage({ - type: 'warning', - message: res.message - }) - } - }).catch(() => { - state.form.imgUrl = '' - }); -} - -const openDialog = async (type, value) => { - length.value = value.listLength - title.value = type === 'add' ? '资源新增' : type ==='edit' ? '资源编辑' : '' ; - if(type === 'edit') { - const res = await getResourceById(value.id); - if(res.code === 200){ - state.form = res.data - }else{ - ElMessage.warning(res.message) - } - } - dialogVisible.value = true; - if(type === 'edit') { - await nextTick(() => { - fileRef.value.open(state.form); - }) - } -} -const getFile = (val) => { - - if(val.md5 != ''){ - state.form.md5 = val.md5 - state.form.resourcePath = val.resourcePath - state.form.mediaType = val.mediaType - state.form.resourceSize = val.resourceSize - state.form.docPage = val.docPage - state.form.resourceLength = val.resourceLength - state.form.originName = val.originName - } else if( val.md5 == ''){ - state.form.resourceType = '' - - } else { - ElMessage({ - type: 'warning', - message: '请上传题库资源' - }); - } -} - -const changeType = (val) => { - state.form.md5 = '' - state.form.resourcePath = '' - state.form.mediaType ='' - state.form.resourceSize = null - state.form.docPage = null - state.form.resourceLength = null - state.form.originName = '' - fileRef.value.changeType(val); -} -const onSubmit = async () => { - const valid = await busRef.value.validate(); - if(valid){ - if(state.form.resourcePath == ''){ - ElMessage.warning('请上传资源') - return - } - if(title.value === '资源新增'){ - const {id,...data} = JSON.parse(JSON.stringify(state.form)) - const res = await addResource(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '新增成功' - }); - }else{ - ElMessage.warning(res.message) - } - dialogVisible.value = false; - emit("getList") - busRef.value.clearValidate(); - fileRef.value.dispose(); - reset(); - - - }else if(title.value === '资源编辑'){ - const {...data} = JSON.parse(JSON.stringify(state.form)) - const res = await editResource(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '编辑成功' - }); - }else{ - ElMessage.warning(res.message) - } - dialogVisible.value = false; - emit("getList") - busRef.value.clearValidate(); - fileRef.value.dispose(); - reset(); - - - } - } -} - -const handleClose = () => { - dialogVisible.value = false; - fileRef.value.dispose(); - busRef.value.clearValidate(); - reset(); - - emit("getList") - -} -const reset = () => { - state.form = { - id: '', - name: '', - mediaType: '', - resourceType: null, - companyId: null, - resourcePath:'', - md5: '', - resourceSize: null, - resourceLength: '', - docPage: null, - originName: '' - } -} -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } -} -</style> diff --git a/src/views/onlineEducation/courseManage/courseResource/componets/viewVideo.vue b/src/views/onlineEducation/courseManage/courseResource/componets/viewVideo.vue deleted file mode 100644 index 9bf03d4..0000000 --- a/src/views/onlineEducation/courseManage/courseResource/componets/viewVideo.vue +++ /dev/null @@ -1,139 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - :title="title" - width="50%" - :before-close="handleClose" - center - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <div style="text-align: center" v-if="showVideo"> - <video ref="videoPlayer" class="video-js" style="margin: auto auto"></video> - </div> - </el-dialog> - </div> -</template> -<script setup> -import { ElMessage } from "element-plus"; -import videojs from "video.js" -import { computed, nextTick, onMounted, onUnmounted,ref,reactive,watch } from "vue"; -import SparkMD5 from "spark-md5"; -import pLimit from 'p-limit' -const emit = defineEmits(["getFile"]); - -const dialogVisible = ref(false); -const title = ref(""); -const state = reactive({ - -}) -const videoPlayer = ref(null) -const myPlayer = ref(null) -const resourcePath = ref() -const showVideo = ref(false) - -const getVideo = () => { - nextTick(() => { - console.log("111111",videoPlayer.value) - myPlayer.value = videojs(videoPlayer.value, { - poster: "",//视频封面 - controls: true,//视频控件 - autoplay:true,//自动播放 - sources: [ - { - src: resourcePath.value ? resourcePath.value : '', - // src:'', - type: 'application/x-mpegURL', - } - ], - controlBar: { - remainingTimeDisplay: { - displayNegative: false - } - }, - playbackRates: [0.5, 1, 1.5, 2]//设置播放速度 - }, onPlayerReady) - }); -} -const onPlayerReady = () => { - myPlayer.value.log("play.....") - bindVideoEvents() -} -// 绑定事件 -const bindVideoEvents = () => { - if (!myPlayer.value) return - myPlayer.value.on('play', onPlay) - myPlayer.value.on('pause', onPause) - myPlayer.value.on('ended', onEnded) - myPlayer.value.on('timeupdate', onTimeupdate) - myPlayer.value.on('loadedmetadata', onLoadedmetadata) - myPlayer.value.on('fullscreenchange', onFullscreenchange) - myPlayer.value.on('error', err => { - console.log('视频加载发生错误', err) - }) -} -const openDialog = async (value) => { - dialogVisible.value = true; - showVideo.value = true; - resourcePath.value = value.resourcePath - title.value = value.name - getVideo(); -} - -const handleClose = () => { - // if(myPlayer.value){ - // myPlayer.value.dispose(); - // resourcePath.value = '' - // } - showVideo.value = false; - resourcePath.value = ''; - dialogVisible.value = false; - emit("getList") - -} -const onPlay = () => { - console.log('播放视频') -} -const onPause = () => { - console.log('暂停播放') -} -const onEnded = () => {} -const onTimeupdate = () => { - console.log('播放位置已更改时,播放时间更新') -} -// 全屏切换 -const onFullscreenchange = () => { - console.log('全屏状态改变') -} -// 元数据加载完成 -const onLoadedmetadata = () => { - console.log('元数据加载完成') - -} -const dispose = () => { - resourcePath.value = '' -} - -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.video-js) { - width: 500px; - height: 500px; - } - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } -} -</style> diff --git a/src/views/onlineEducation/courseManage/courseResource/index.vue b/src/views/onlineEducation/courseManage/courseResource/index.vue deleted file mode 100644 index c4ae811..0000000 --- a/src/views/onlineEducation/courseManage/courseResource/index.vue +++ /dev/null @@ -1,173 +0,0 @@ -<template> - <div class="app-container"> - <div style="display: flex;justify-content: space-between"> - <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" > - <el-form-item> - <el-button - type="primary" - plain - icon="Plus" - @click="openDialog('add',{})" - >新增</el-button> - </el-form-item> - <el-form-item label="资源名称:" > - <el-input v-model="data.queryParams.name" placeholder="请输入资源名称"></el-input> - </el-form-item> - <el-form-item > - <el-button - type="primary" - @click="getList" - >查询</el-button> - <el-button - type="primary" - plain - @click="reset" - >重置</el-button> - </el-form-item> - </el-form> - </div> - <!-- 表格数据 --> - <el-table v-loading="loading" :data="dataList" :border="true"> - <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="资源名称" prop="name" align="center" > - <template #default="scope"> - <div style="display:flex;align-items: center;justify-content: center"> - <span >{{scope.row.name}}</span> - <VideoPlay v-if="scope.row.resourceType === 1" style="width: 1em; height: 1em; margin-left: 3px;cursor: pointer" @click="openVideo(scope.row)" /> - </div> - </template> - </el-table-column> - <el-table-column label="资源大小" prop="sizeMB" align="center" > - </el-table-column> - <el-table-column label="资源类型" prop="resourceType" align="center" > - <template #default="scope"> - <div style="display: flex;flex-direction: column"> - <span>{{scope.row.resourceType == 1 ? '视频':scope.row.resourceType == 2 ? '音频':'文档'}}</span> - <span style="font-size: 14px">{{scope.row.timeFormat}}</span> - </div> - - </template> - </el-table-column> - <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > - <template #default="scope"> - <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> - <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> - </template> - </el-table-column> - </el-table> - - <pagination - v-show="total > 0" - :total="total" - v-model:page="queryParams.pageNum" - v-model:limit="queryParams.pageSize" - @pagination="getList" - /> - <resource-dialog ref="dialogRef" @getList="getList"></resource-dialog> - <viewVideo ref="videoRef" @getList="getList"></viewVideo> - </div> -</template> - -<script setup> -import {getCurrentInstance, nextTick, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; -import {ElMessage, ElMessageBox} from "element-plus"; -import resourceDialog from './componets/resourceDialog.vue' -import viewVideo from './componets/viewVideo.vue' -import {checkResourceName, delResource, getResource} from "@/api/onlineEducation/courseResource"; -import {checkName} from "@/api/onlineEducation/company"; -import {VideoPlay} from "@element-plus/icons-vue"; -const { proxy } = getCurrentInstance(); -const loading = ref(false); -const dialogRef = ref(); -const videoRef = ref(); - -const data = reactive({ - queryParams: { - pageNum: 1, - pageSize: 10, - name: '' - }, - total: 0, - dataList: [] -}); - -const { queryParams, total, dataList } = toRefs(data); - -onMounted(()=>{ - getList() -}) - -onUnmounted(()=>{ - -}) - -const getList = async () => { - loading.value = true - const res = await getResource(data.queryParams) - if(res.code == 200){ - data.dataList = res.data.list.map(item => { - return{ - ...item, - sizeMB: Number((item.resourceSize /1024 /1024).toFixed(2))+'MB', - timeFormat: item.resourceType === 1 || item.resourceType === 2 ? secondsToTime(item.resourceLength) : item.docPage + '页' - } - }) - console.log("ddd",data.dataList) - data.total = res.data.total - }else{ - ElMessage.warning(res.message) - } - loading.value = false -} - -const openDialog = (type, value) => { - dialogRef.value.openDialog(type, value); -} -const openVideo = (value) => { - videoRef.value.openDialog(value); -} - -const secondsToTime = (seconds) => { - const hours = Math.floor(seconds / 3600); - const minutes = Math.floor((seconds % 3600) / 60); - const secs = seconds % 60; - - return [ - hours, - hours > 0 ? pad(minutes) : minutes, - pad(secs) - ].join(':'); -} -const pad = (number) => { - return (number < 10 ? '0' : '') + number; -} -/** 重置新增的表单以及其他数据 */ -function reset() { - data.queryParams = { - pageNum: 1, - pageSize: 10, - name: '' - } - getList() -} -const handleDelete = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await delResource(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }) -} - -</script> diff --git a/src/views/onlineEducation/courseManage/index.vue b/src/views/onlineEducation/courseManage/index.vue deleted file mode 100644 index b573590..0000000 --- a/src/views/onlineEducation/courseManage/index.vue +++ /dev/null @@ -1,381 +0,0 @@ -<template> - <div class="app-container"> - <div style="display: flex;justify-content: space-between"> - <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" > - <el-form-item> - <el-button - type="primary" - plain - icon="Plus" - @click="openDialog('add',{})" - >新增</el-button> - </el-form-item> - <el-form-item label="课程名称:" > - <el-input v-model="data.queryParams.name" placeholder="请输入课程名称"></el-input> - </el-form-item> - <el-form-item label="审核状态:" > - <el-select v-model="data.queryParams.state" placeholder="请选择审核状态" clearable> - <el-option - v-for="item in data.stateList" - :key="item.id" - :label="item.name" - :value="item.id"> - </el-option> - </el-select> - </el-form-item> - <el-form-item > - <el-button - type="primary" - @click="getList" - >查询</el-button> - <el-button - type="primary" - plain - @click="reset" - >重置</el-button> - </el-form-item> - </el-form> - </div> - <!-- 表格数据 --> - <el-table v-loading="loading" :data="dataList" :border="true"> - <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="封面" prop="logo" align="center" width="130"> - <template #default="scope"> - <div class="demo-image__preview" v-if="scope.row.logo && scope.row.logo.length>0"> - <el-image - style="width: 100px; height: 100px" - :src= "scope.row.logo[0]" - :zoom-rate="1.2" - :max-scale="7" - :min-scale="0.2" - :preview-src-list="scope.row.logo" - :initial-index="0" - fit="cover" - :preview-teleported=true - /> - </div> - </template> - </el-table-column> - <el-table-column label="课程名称" prop="name" align="center" /> - <el-table-column label="课程分类" prop="categoryName" align="center" /> - <el-table-column label="要求课时" prop="period" align="center" > - <template #default="scope"> - <span>{{ scope.row.period?(scope.row.period/60).toFixed(2).replace(/\.00$/, '') + '分钟':'' }}</span> - </template> - </el-table-column> - <el-table-column label="提交单位" prop="companyName" align="center" /> - <el-table-column label="审核状态" prop="state" align="center" > - <template #default="scope"> - <el-tooltip - v-if="scope.row.state == 3 && scope.row.message !=''" - class="box-item" - effect="dark" - :content="scope.row.message" - placement="top" - > - <span>审批不通过</span> - </el-tooltip> - <span v-else>{{scope.row.state == 0?'待提交':scope.row.state == 1?'待审核':scope.row.state == 2?'审批通过':'审批不通过'}}</span> - </template> - </el-table-column> - <el-table-column label="创建时间" prop="createTime" align="center" width="180" /> - <el-table-column label="状态" prop="status" align="center" > - - <template #default="scope" v-if="data.isAdmin"> - <el-switch - v-if="scope.row.state == 2" - v-model="scope.row.status" - :active-value="0" - :inactive-value="1" - inline-prompt - active-text="正常" - inactive-text="停用" - @change="switchStatus($event,scope.row)" - /> - <span v-else>--</span> - </template> - <template #default="scope" v-else> - <span v-if="scope.row.state == 2">{{scope.row.status == 1? '停用' : '正常'}}</span> - <span v-else>--</span> - </template> - </el-table-column> - <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="240"> - <template #default="scope"> - <div v-if="data.isAdmin"> - <div v-if="scope.row.state !== 3"> - <el-button link type="primary" v-if="scope.row.state == 1" @click="openApprove(scope.row)">审核</el-button> - <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> - <el-button link type="primary" @click="toChapters(scope.row)">章节</el-button> - <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> - </div> - <div v-else><el-button link type="primary" @click="toChapters(scope.row)">章节</el-button></div> - </div> - <div v-else-if="!data.isAdmin"> - <div v-if="scope.row.state !== 2"> - <el-button link type="primary" v-if="scope.row.state == 0 || scope.row.state == 3" @click="submitApprove(scope.row)">提交审核</el-button> - <el-button link type="primary" v-if="scope.row.state == 1" @click="submitApprove(scope.row)">取消审核</el-button> - <el-button link type="primary" v-if="scope.row.state !== 1" @click="openDialog('edit',scope.row)" >编辑</el-button> - <el-button link type="primary" @click="toChapters(scope.row)">章节</el-button> - <el-button link type="danger" v-if="scope.row.state !== 1" @click="handleDelete(scope.row)">删除</el-button> - </div> - <div v-else> - <el-button link type="primary" @click="toChapters(scope.row)">章节</el-button> - </div> - - </div> -<!-- <div v-if="scope.row.state == 2">--> -<!-- <div v-if="data.isAdmin">--> -<!-- <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>--> -<!-- <el-button link type="primary" @click="toChapters(scope.row)">章节</el-button>--> -<!-- <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>--> -<!-- </div>--> -<!-- <div v-else><el-button link type="primary" @click="toChapters(scope.row)">章节</el-button></div>--> -<!-- </div>--> -<!-- <div v-else-if="scope.row.state == 1" >--> -<!-- <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>--> -<!-- <el-button link type="primary" v-if="data.isAdmin" @click="openApprove(scope.row)">审核</el-button>--> -<!-- <el-button link type="primary" @click="toChapters(scope.row)">章节</el-button>--> -<!-- <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>--> -<!-- </div>--> -<!-- <div v-else-if="scope.row.state == 3" >--> -<!-- <div v-if="data.isAdmin">--</div>--> -<!-- <div v-else>--> -<!-- <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>--> -<!-- <el-button link type="primary" @click="submitApprove(scope.row)">提交审核</el-button>--> -<!-- <el-button link type="primary" @click="toChapters(scope.row)">章节</el-button>--> -<!-- <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>--> -<!-- </div>--> -<!-- </div>--> - </template> - </el-table-column> - </el-table> - - <pagination - v-show="total > 0" - :total="total" - v-model:page="queryParams.pageNum" - v-model:limit="queryParams.pageSize" - @pagination="getList" - /> - <course-manage-dialog ref="dialogRef" @getList=getList></course-manage-dialog> - <el-dialog v-model="data.appDialog" title="审批课程" width="30%" center align-center> - <el-form> - <el-form-item label="审批课程:"> - <el-radio-group v-model="data.appoveForm.state" style="width: 100%"> - <el-radio :label="2" size="large" border>通过</el-radio> - <el-radio :label="3" size="large" border>驳回</el-radio> - </el-radio-group> - </el-form-item> - <el-form-item label="审批意见:" v-if="data.appoveForm.state == 3"> - <el-input v-model="data.appoveForm.message" type="textarea" maxlength="50" show-word-limit placeholder="请输入审批意见"></el-input> - </el-form-item> - </el-form> - <template #footer> - <span class="dialog-footer"> - <el-button @click="data.appDialog = false">取消</el-button> - <el-button type="primary" @click="confirmApproval">确认</el-button> - </span> - </template> - </el-dialog> - </div> -</template> - -<script setup> -import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; - -import {ElMessage, ElMessageBox} from "element-plus"; -import {delCompany, getCompany} from "@/api/onlineEducation/company"; -import courseManageDialog from './components/courseManageDialog.vue' -import {delBanner, getBanner} from "@/api/onlineEducation/banner"; -import {useRoute, useRouter} from 'vue-router' -import Cookies from "js-cookie"; -import {changeCourseStatus, delCourse, doCourse, getCourse} from "@/api/onlineEducation/courseManage"; -const { proxy } = getCurrentInstance(); -const router = useRouter() -const loading = ref(false); -const dialogRef = ref(); -const route = useRoute() -const data = reactive({ - queryParams: { - pageNum: 1, - pageSize: 10, - name: '', - state: null - }, - total: 0, - dataList: [], - isAdmin: false, - appDialog: false, - appoveForm: { - id: null, - state: null, - message: '' - }, - stateList: [ - { - id: 0, - name: '待提交' - }, - { - id: 1, - name: '待审核' - }, - { - id: 2, - name: '审批通过' - }, - { - id: 3, - name: '审批不通过' - }, - ] -}); - -const { queryParams, total, dataList } = toRefs(data); - -onMounted(async ()=>{ - if(route.query.val){ - const val = JSON.parse(route.query.val) - if(val){ - data.queryParams.pageNum = val.pageNum; - data.queryParams.pageSize = val.pageSize; - } - } - const userInfo = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo) - if(userInfo.userType === 0){ - data.isAdmin = true; - }else { - data.isAdmin = false; - } - await getList() -}) - -onUnmounted(()=>{ - -}) - -const getList = async () => { - loading.value = true - const res = await getCourse(data.queryParams) - if(res.code == 200){ - data.dataList = res.data.list.map(item => { - return { - ...item, - logo: item.logo ?[import.meta.env.VITE_APP_BASE_API + "/" + item.logo] : [], - companyName: item.companyName ? item.companyName : '公开课' - } - }) - console.log("ddd",data.dataList) - data.total = res.data.total - }else{ - ElMessage.warning(res.message) - } - loading.value = false -} - -const openDialog = (type, value) => { - dialogRef.value.openDialog(type, value); -} - -/** 重置新增的表单以及其他数据 */ -function reset() { - data.queryParams = { - pageNum: 1, - pageSize: 10, - name: '', - state: null - } - getList() -} -const handleDelete = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await delCourse(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }) -} -const switchStatus = (e,val) => { - ElMessageBox.confirm( - '确定修改该课程当前状态?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await changeCourseStatus({id: val.id,status: e}) - if(res.code == 200){ - ElMessage.success('状态修改成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }) - .catch(() => { - getList() - }) - -} -const openApprove = (val) => { - data.appoveForm = { - id: null, - state: null, - message: '' - } - data.appoveForm.id = val.id - data.appDialog = true -} -const confirmApproval = async () =>{ - if(data.appoveForm.state !== null){ - const res = await doCourse(data.appoveForm) - if(res.code == 200){ - ElMessage.success('审批成功') - await getList() - data.appDialog = false - }else{ - ElMessage.warning(res.message) - } - } -} -const submitApprove = async (val) => { - let param = { - companyId: val.companyId, - id: val.id, - state: null - } - //取消审批 - if(val.state == 1){ - param.state = 0 - }else { - param.state = 1 - } - const res = await doCourse(param) - if(res.code == 200){ - ElMessage.success('操作成功') - await getList() - }else{ - ElMessage.warning(res.message) - } -} -const toChapters = (val) => { - val.pageNum = data.queryParams.pageNum; - val.pageSize = data.queryParams.pageSize - const v = JSON.stringify(val) - router.push({ path: "/chapters", query: { val: v } }); -} - -</script> diff --git a/src/views/onlineEducation/groupExams/components/correctExam.vue b/src/views/onlineEducation/groupExams/components/correctExam.vue deleted file mode 100644 index 3bb2a83..0000000 --- a/src/views/onlineEducation/groupExams/components/correctExam.vue +++ /dev/null @@ -1,402 +0,0 @@ -<template> - <div class="app-container"> - <div style="display: flex;justify-content: flex-end;margin-bottom: 10px"> - <div> - <el-button - type="primary" - plain - @click="back" - >返回</el-button> - </div> - </div> - <div class="paper-contain"> - <div class="paper-left"> - <div class="left-content"> - <el-card style="height: 80%;overflow-y: auto"> - <div> - <span style="font-size: 20px">{{data.form.examPaper.name}}</span> - <div class="examInfo"> - <span>得分:{{data.form.score}} / {{data.form.totalScore}}</span> - <span>学生:{{data.form.student.name}}</span> - <el-divider style="margin-top: 10px" /> - </div> - <div v-if="data.form.questions && data.form.questions.length>0" style="display: flex;flex-wrap: wrap;line-height: 40px"> - <div v-for="(item,index) in data.form.questions" :key="index" style="margin-right: 5px"> - <el-tag size="large" style="cursor: pointer" effect="light" :type="item.studentAnswer.passed == 0 ? 'danger' :item.studentAnswer.passed == 1?'success': 'warning'" @click="toView(index+1)">{{index+1}}</el-tag> - </div> - <el-divider /> - </div> - <div style="display: flex;justify-content: center;"> - <el-button type="primary" @click="submitExam" v-if="data.queryParams.state != 2">提交批改</el-button> - </div> - </div> - </el-card> - </div> - </div> - <div class="paper-right"> - <div style="height: 100%"> - <el-card> - <div style="display: flex;flex-direction: column;margin: 0 30px" > - <div v-if="data.singleList && data.singleList.length >0"> - <span style="font-size: 18px;font-weight: 600">单选题</span> - - <div v-for="(item,index) in data.singleList" :key="index" style="margin-left: 15px;margin-top: 10px"> - <div style="display: flex;flex-direction: column;"> - <div style="margin-top: 10px;display: flex;align-items: center"> - <span style="font-size: 15px" :id="index+1">{{index+1}}.</span> - <span style="margin-left: 10px;font-size: 16px">{{item.title}}</span> - </div> - <div style="display: flex;margin-top: 15px;margin-left: 25px"> - <div v-for="single in item.content.items" :class="{toRed : item.studentAnswer.answer == single.prefix}"> - <span style="font-size: 15px;margin-right: 5px">{{single.prefix}}.</span> - <span style="font-size: 15px;margin-right: 20px">{{single.content}}</span> - </div> - </div> - <div style="display: flex;flex-direction: column;margin-left: 25px;margin-top: 20px;font-size: 14px;line-height: 25px"> - <div style="display: flex"> - <span>结果:</span> - <el-tag size="small" :type="item.studentAnswer.passed == 0 ? 'danger' :item.studentAnswer.passed == 1?'success': 'warning'">{{item.studentAnswer.passed == 0 ? '错误' :item.studentAnswer.passed == 1? '正确' :'待批改' }}</el-tag> - </div> - <span>分数:{{data.form.examPaper.singleScore}}</span> - <span>解析:{{item.content.analyze}}</span> - <span>正确答案:{{item.answer}}</span> - - </div> - <el-divider /> - </div> - </div> - </div> - </div> - <div style="display: flex;flex-direction: column;margin: 0 30px" > - <div v-if="data.multiList && data.multiList.length >0"> - <span style="font-size: 18px;font-weight: 600">多选题</span> - <div v-for="(item,index) in data.multiList" :key="index" style="margin-left: 15px;margin-top: 10px"> - <div style="display: flex;flex-direction: column;"> - <div style="margin-top: 10px;display: flex;align-items: center"> - <span style="font-size: 15px" :id="data.singleList.length + index+1">{{data.singleList.length + index+1}}.</span> - <span style="margin-left: 10px;font-size: 16px">{{item.title}}</span> - </div> - <div style="display: flex;margin-top: 15px;margin-left: 25px"> - <div v-for="single in item.content.items" :class="{toRed : item.studentAnswer.answerArr.includes(single.prefix)}"> - <span style="font-size: 15px;margin-right: 5px">{{single.prefix}}.</span> - <span style="font-size: 15px;margin-right: 20px">{{single.content}}</span> - </div> - </div> - <div style="display: flex;flex-direction: column;margin-left: 25px;margin-top: 20px;font-size: 14px;line-height: 25px"> - <div style="display: flex"> - <span>结果:</span> - <el-tag size="small" :type="item.studentAnswer.passed == 0 ? 'danger' :item.studentAnswer.passed == 1?'success': 'warning'">{{item.studentAnswer.passed == 0 ? '错误' :item.studentAnswer.passed == 1? '正确' :'待批改' }}</el-tag> - </div> - <span>分数:{{data.form.examPaper.multiScore}}</span> - <span>解析:{{item.content.analyze}}</span> - <span>正确答案:{{item.answer}}</span> - - </div> - <el-divider /> - </div> - </div> - </div> - </div> - <div style="display: flex;flex-direction: column;margin: 0 30px" > - <div v-if="data.judgeList && data.judgeList.length >0"> - <span style="font-size: 18px;font-weight: 600">判断题</span> - <div v-for="(item,index) in data.judgeList" :key="index" style="margin-left: 15px;margin-top: 10px"> - <div style="display: flex;flex-direction: column;"> - <div style="margin-top: 10px;display: flex;align-items: center"> - <span style="font-size: 15px" :id="data.singleList.length+data.multiList.length + index+1">{{data.singleList.length+data.multiList.length + index+1}}.</span> - <span style="margin-left: 10px;font-size: 16px">{{item.title}}</span> - </div> - <div style="display: flex;margin-top: 15px;margin-left: 25px"> - <div v-for="single in item.content.items" :class="{toRed : item.studentAnswer.answer == single.prefix}"> - <span style="font-size: 15px;margin-right: 5px">{{single.prefix}}.</span> - <span style="font-size: 15px;margin-right: 20px">{{single.content}}</span> - </div> - </div> - <div style="display: flex;flex-direction: column;margin-left: 25px;margin-top: 20px;font-size: 14px;line-height: 25px"> - <div style="display: flex"> - <span>结果:</span> - <el-tag size="small" :type="item.studentAnswer.passed == 0 ? 'danger' :item.studentAnswer.passed == 1?'success': 'warning'">{{item.studentAnswer.passed == 0 ? '错误' :item.studentAnswer.passed == 1? '正确' :'待批改' }}</el-tag> - </div> - <span>分数:{{data.form.examPaper.judgeScore}}</span> - <span>解析:{{item.content.analyze}}</span> - <span>正确答案:{{item.answer}}</span> - </div> - <el-divider /> - </div> - </div> - </div> - </div> - <div style="display: flex;flex-direction: column;margin: 0 30px" > - <div v-if="data.easyList && data.easyList.length >0"> - <span style="font-size: 18px;font-weight: 600">简答题</span> - <div v-for="(item,index) in data.easyList" :key="index" style="margin-left: 15px;margin-top: 10px"> - <div style="display: flex;flex-direction: column;"> - <div style="margin-top: 10px;display: flex;align-items: center"> - <span style="font-size: 15px" :id="data.singleList.length + data.multiList.length + data.judgeList.length + index+1">{{data.singleList.length + data.multiList.length + data.judgeList.length + index+1}}.</span> - <span style="margin-left: 10px;font-size: 16px">{{item.title}}</span> - </div> - <div style="display: flex;margin-top: 15px;margin-left: 30px"> - <span style="font-weight: 600">{{item.studentAnswer.answer}}</span> - </div> - <div style="display: flex;flex-direction: column;margin-left: 25px;margin-top: 20px;font-size: 14px;line-height: 25px"> - <div style="display: flex"> - <span>结果:</span> - <el-tag size="small" :type="item.studentAnswer.passed == 0 ? 'danger' :item.studentAnswer.passed == 1?'success': 'warning'">{{item.studentAnswer.passed == 0 ? '错误' :item.studentAnswer.passed == 1? '正确' :'待批改' }}</el-tag> - </div> - <span>分数:{{data.form.examPaper.easyScore}}</span> - <span>解析:{{item.content.analyze}}</span> - <span>正确答案:{{item.answer}}</span> - <div style="display: flex;align-items: center;margin-top: 5px" v-if="item.studentAnswer.passed == 2"> - <span style="color: #EAB308">批改:</span> - <el-input-number v-model="item.score" :min="0" :max="data.form.examPaper.easyScore" :step="1" /> - </div> - <div style="display: flex;align-items: center;margin-top: 5px" v-else> - <span style="color: #EAB308">得分:</span> - <el-input-number v-model="item.studentAnswer.score" :min="0" :max="data.form.examPaper.easyScore" :step="1" disabled /> - </div> - - </div> - <el-divider /> - </div> - </div> - </div> - </div> - </el-card> - </div> - </div> - <el-backtop target=""></el-backtop> - </div> - </div> -</template> -<script setup> -import {onMounted, reactive, ref} from "vue"; -import Cookies from "js-cookie"; -import {useRoute, useRouter} from "vue-router"; -import {getClassification} from "@/api/onlineEducation/courseClass"; -import {ElMessage, ElMessageBox} from "element-plus"; -import {doConfirmExam, getPaperStu} from "@/api/onlineEducation/exam"; -import {removeToken} from "@/utils/auth"; -import {isRelogin} from "@/utils/request"; -const route = useRoute() -const router = useRouter(); - -const backValue = ref() -const data = reactive({ - queryParams: { - id: null, - paperId: null, - pageNum: 1, - pageSize: 10, - state: null, - }, - form: { - id: null, - paperId: null, - studentId: null, - examPaper: {}, - questions: [], - student: {} - }, - singleList:[], - judgeList: [], - multiList:[], - easyList: [], -}); -onMounted(async ()=>{ - const val = JSON.parse(route.query.val) - backValue.value = val - data.queryParams.paperId = val.paperId - data.queryParams.id = val.id - data.queryParams.state = val.state - await getStuPaper() -}) - -const getStuPaper = async () => { - const param = { - paperStudentId: data.queryParams.id - } - const res = await getPaperStu(param); - if(res.code === 200){ - data.form = res.data - data.form.totalScore = res.data.examPaper.judgeNum * res.data.examPaper.judgeScore + res.data.examPaper.multiNum * res.data.examPaper.multiScore + res.data.examPaper.singleNum * res.data.examPaper.singleScore+ res.data.examPaper.easyNum * res.data.examPaper.easyScore - reduceData(); - }else{ - ElMessage.warning(res.message) - } -} -const reduceData = () => { - let result = data.form.questions.reduce((a, b) => { - if (a[b.questionType]) { - a[b.questionType].push(b); - } else { - a[b.questionType] = [b]; - } - return a; - }, {}); - for (const resultKey in result) { - if(resultKey == 1){ - data.singleList.push(result[resultKey]) - - }else if(resultKey == 2){ - data.multiList.push(result[resultKey]) - }else if(resultKey == 3){ - data.judgeList.push(result[resultKey]) - }else { - data.easyList.push(result[resultKey]) - } - } - if(data.singleList && data.singleList.length>0){ - data.singleList = JSON.parse(JSON.stringify(data.singleList[0])).map(item => { - return { - ...item, - content: JSON.parse(item.content) - } - }) - } - if(data.judgeList && data.judgeList.length>0){ - data.judgeList = JSON.parse(JSON.stringify(data.judgeList[0])).map(item => { - return { - ...item, - content: JSON.parse(item.content), - } - }) - } - if(data.multiList && data.multiList.length>0){ - data.multiList = JSON.parse(JSON.stringify(data.multiList[0])).map(item => { - return { - ...item, - content: JSON.parse(item.content), - studentAnswer: { - answerArr:item.studentAnswer.answer?item.studentAnswer.answer.split(','):[], - answer: item.studentAnswer.answer, - id: item.studentAnswer.id, - paperId: item.studentAnswer.paperId, - passed: item.studentAnswer.passed, - questionId: item.studentAnswer.questionId, - score: item.studentAnswer.score, - studentId: item.studentAnswer.studentId, - } - } - }) - } - if(data.easyList && data.easyList.length>0){ - data.easyList = JSON.parse(JSON.stringify(data.easyList[0])).map(item => { - return { - ...item, - content: JSON.parse(item.content) - } - }) - } -} -const back = () => { - const obj = { - type: 'exam', - paperId: data.queryParams.paperId, - pageNum: backValue.value.pageNum, - pageSize: backValue.value.pageSize, - } - const v = JSON.stringify(obj) - router.push({ path: "/examStu", query: { val: v } }); -} -const submitExam = async() => { - const questions = data.easyList.map(item => { - return { - questionId: item.id, - score: item.score, - } - }) - questions.forEach(item => { - if(item.score == '' || item.score == null){ - ElMessage.warning('有未批改题目'); - return; - } - }) - const param = { - id:data.form.id, - paperId: data.form.paperId, - studentId: data.form.studentId, - questions: questions - } - - const res = await doConfirmExam(param); - if(res.code === 200){ - await getStuPaper() - await ElMessageBox.alert(`试卷得分:${data.form.score}分`, '考试结果', { - confirmButtonText: '关闭', - callback: async () => { - // back() - }, - }) - }else{ - ElMessage.warning(res.message) - } - console.log('简答',param) - -} -const toView = (data) => { - document?.getElementById(data)?.scrollIntoView({ - behavior: "smooth", //smooth:平滑,auto:直接定位 - block: "center", - inline: "center", - }); -} - -</script> - -<style scoped lang="scss"> -.app-container { - .paper-contain { - display: flex; - flex-direction: row; - //background-color: #eff3f7; - height: 100%; - } - - .paper-left { - width: 270px; - height: 100%; - - .left-content { - width: 270px; - height: 100%; - position: fixed; - z-index: 999; - } - } - - .paper-right { - flex: 1; - //background-color: #fff; - margin-left: 20px - } - - :deep(.el-tag--large) { - width: 32px - } - ::-webkit-scrollbar { - width: 5px; - height: 5px; - background-color: #e7e7e7; - opacity: 0; - } - ::-webkit-scrollbar-track { - border-radius: 10px; - background-color: #ffffff; - } - ::-webkit-scrollbar-thumb { - border-radius: 10px; - /*-webkit-box-shadow: inset 0 0 6px rgba(154,154,154,.3);*/ - background-color: #e7e7e7; - } -} -.examInfo{ - font-size: 15px; - margin-top: 20px; - display: flex; - flex-direction: column; - line-height: 25px; -} -.toRed{ - color: #3b4cf6; -} -</style> diff --git a/src/views/onlineEducation/groupExams/components/examChooseStudent.vue b/src/views/onlineEducation/groupExams/components/examChooseStudent.vue deleted file mode 100644 index 76ae610..0000000 --- a/src/views/onlineEducation/groupExams/components/examChooseStudent.vue +++ /dev/null @@ -1,285 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - :title="title" - width="800px" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <div style="margin-bottom: 10px;margin-left: 30px"> - <el-checkbox v-model="state.bindBatchStu" @change="changeBind">绑定批次人员</el-checkbox> - <el-select - v-if="state.bindBatchStu" - multiple - collapse-tags - collapse-tags-tooltip - v-model="state.form.phaseIds" - style="width: 160px;margin: 0 20px" - v-loadMoreNew:[reselectExam]="handleScroll" - :popper-class="reselectExam.name" - class="item-width" - placeholder="请选择批次" - > - <el-option - v-for="item in state.batchList" - :key="item.id" - :label="item.name" - :value="item.id" - /> - </el-select> - </div> - <div> - <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" > - <el-form-item > - <!-- <el-checkbox v-model="state.DisableSelection">一键全选</el-checkbox>--> - </el-form-item> - <el-form-item label="姓名:" > - <el-input v-model="state.queryParams.name" placeholder="请输入姓名"></el-input> - </el-form-item> - <el-form-item label="职务:" > - <el-input v-model="state.queryParams.duty" placeholder="请输入职务"></el-input> - </el-form-item> - <el-form-item > - <el-button - type="primary" - @click="getList" - >查询</el-button> - <el-button - type="primary" - plain - @click="resetQuery" - >重置</el-button> - </el-form-item> - </el-form> - </div> - - <!-- 表格数据 --> - <el-table - ref="tableRef" - v-loading="loading" - :data="state.dataList" - :border="true" - :row-key="getRowKey" - @selection-change="handleSelectionChange" - v-model="state.selectRowKeys" - > - <el-table-column type="selection" :reserve-selection="true" width="55" align="center" /> -<!-- <el-table-column label="序号" type="index" align="center" width="80" />--> - <el-table-column label="工号" prop="empno" align="center" width="60" /> - <el-table-column label="姓名" prop="name" align="center" /> - <el-table-column label="性别" prop="sex" align="center" > - <template #default="scope"> - <span>{{scope.row.sex == 0 ? '男':'女'}}</span> - </template> - </el-table-column> - <el-table-column label="手机号" prop="phone" align="center" width="130"/> - <el-table-column label="身份证" prop="idNo" align="center" width="200" :show-overflow-tooltip="true"/> -<!-- <el-table-column label="创建人" prop="createBy" align="center"/>--> - <el-table-column label="工作岗位" prop="post" align="center"/> - <el-table-column label="职务" prop="duty" align="center"/> -<!-- <el-table-column label="一人一档" prop="duty" align="center" width="120">--> -<!-- <template #default="scope">--> -<!-- <el-button link type="primary">培训考试记录</el-button>--> -<!-- </template>--> -<!-- </el-table-column>--> - </el-table> - - <pagination - v-show="state.total> 0" - :total="state.total" - v-model:page="state.queryParams.pageNum" - v-model:limit="state.queryParams.pageSize" - @pagination="getList" - /> - <template #footer> - <span class="dialog-footer"> - <el-button @click="handleClose" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> - </span> - </template> - </el-dialog> - </div> -</template> -<script setup> -import {nextTick, reactive, ref, toRefs} from 'vue' -import {ElMessage} from "element-plus"; -import Cookies from "js-cookie"; -import { - addQuestionBank, - checkQuestionBankName, - editQuestionBank, - getQuestionBank -} from "@/api/onlineEducation/questionBank"; -import {getStudent} from "@/api/onlineEducation/student"; -import {batchAddStudent, getBatch} from "@/api/onlineEducation/batch"; -import {examAddStudent} from "@/api/onlineEducation/exam"; - -const dialogVisible = ref(false); -const title = ref(""); -const tableRef = ref(); -const length = ref() -const emit = defineEmits(["getList"]); -const startUsername = ref(''); -const classifyRef = ref(null) -const state = reactive({ - form: { - paperId: null, - phaseIds: [], - studentIds: [] - }, - isAdmin: false, - total: 0, - queryParams: { - pageNum: 1, - pageSize: 10, - name: '', - duty: '' - }, - dataList: [], - totalItems: 0, // 总数据条数,从后端接口获取 - phaseId: null, - chooseStu: [], - companyId: null, - selectRowKeys: [], - batchList: [], - batchPageNum: 1, // 当前页码 - batchPageSize: 10, // 每页显示的数量 - hasMoreItemsBatch: null, // 是否还有更多选项 - bindBatchStu: false - -}) -const loading = ref(false); - -const reselectExam = reactive({ - name: 'ExamBatch' -}) -const getRowKey = (row) => { - return row.id -} -const openDialog = async (data) => { - // state.selectRowKeys = [10,11] - - state.form.paperId = data.queryParams.paperId - title.value = '学员选择'; - dialogVisible.value = true; - await getList() - await loadMoreBatchData() -} - -const getList = async () => { - loading.value = true - const res = await getStudent(state.queryParams) - if(res.code == 200){ - state.dataList = res.data.list - state.total = res.data.total - // await nextTick(() => { - // const currentIds = state.dataList.map(row => row.id) - // const selectIds = state.selectRowKeys.filter(id => currentIds.includes(id)) - // state.dataList.forEach(row => { - // if (selectIds.includes(row.id)) { - // tableRef.value.toggleRowSelection(row, true); - // } - // }) - // }); - }else{ - ElMessage.warning(res.message) - } - loading.value = false -} - -const onSubmit = async () => { - const res = await examAddStudent(state.form) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '新增成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - reset(); - dialogVisible.value = false; -} - -const handleClose = () => { - reset(); - dialogVisible.value = false; - emit("getList") -} -const reset = () => { - state.form = { - paperId: null, - phaseIds: [], - studentIds: [] - } - state.bindBatchStu = false; - state.batchList = []; - state.batchPageNum = 1; - state.batchPageSize = 10; - state.hasMoreItemsBatch = null; - tableRef.value.clearSelection(); - state.dataList = [] - state.total = 0 - state.queryParams ={ - pageNum: 1, - pageSize: 10 - } -} -const handleSelectionChange = (val) => { - state.form.studentIds = val.map(item => item.id) - console.log("选中的行", state.form.studentIds) -} - -const handleScroll = () => { - if(state.batchPageNum >= state.hasMoreItemsBatch) return - state.batchPageNum++; - loadMoreBatchData() -} -const loadMoreBatchData = async () => { - console.log(' Bank'); - const queryParams = { - pageNum: state.batchPageNum, - pageSize: state.batchPageSize, - } - const res = await getBatch(queryParams) - if (res.code == 200) { - state.hasMoreItemsBatch = res.data.totalPage - const data = res.data - state.batchList = state.batchList.concat(data.list) - }else{ - ElMessage.warning(res.message) - } -} -const changeBind = (val) => { - console.log('vv',val) -} -const resetQuery = () => { - state.queryParams ={ - pageNum: 1, - pageSize: 10, - name: '', - duty: '' - } - getList() -} -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } -} -</style> diff --git a/src/views/onlineEducation/groupExams/components/examDialog.vue b/src/views/onlineEducation/groupExams/components/examDialog.vue deleted file mode 100644 index 8af519d..0000000 --- a/src/views/onlineEducation/groupExams/components/examDialog.vue +++ /dev/null @@ -1,745 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - width="800px" - :before-close="handleClose" - destroy-on-close - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" > - <span style="font-size: 20px;font-weight: 800;margin-left: 20px">考试配置</span> - <div style="margin: 20px 20px"> - <el-form-item label="考试名称:" prop="name"> - <el-input v-model.trim="state.form.name" placeholder="请输入考试名称"></el-input> - </el-form-item> - <el-form-item label="课程分类:" prop="categoryId" > - <el-cascader - style="width: 100%" - ref="classifyRef" - v-model="state.form.categoryId" - :options="state.classifyList" - :props="state.props" - clearable - :show-all-levels="false" - @change="handleChange" - /> - </el-form-item> - </div> - <span style="font-size: 20px;font-weight: 800;margin-left: 20px">组卷信息</span> - <div style="display: flex"> - <div class="group"> - <div> - 单选:<el-input style="max-width: 40px" v-model.trim="state.form.singleNum"></el-input> 题 - </div> - <div style="margin-left: 20px"> - 每题:<el-input style="max-width: 40px" v-model.trim="state.form.singleScore"></el-input> 分 - </div> - </div> - <div class="group" > - <div> - 共 - <span style="max-width: 30px" v-show="state.form.singleNum && state.form.singleScore">{{state.form.singleNum * state.form.singleScore}}</span> -<!-- <span v-else></span>--> - 分 - </div> - <el-select - clearable - v-model="state.form.singleBankName" - filterable - remote - reserve-keyword - placeholder="请输入单选题库" - remote-show-suffix - :remote-method="getBankList" - style="width: 160px;margin: 0 20px" - @change="selectSingleValue" - > - <el-option - v-for="item in state.bankList" - :key="item.id" - :label="item.name" - :value="item.name" - /> - </el-select> -<!-- <el-select--> -<!-- clearable--> -<!-- v-model="state.form.singleBankId"--> -<!-- style="width: 160px;margin: 0 20px"--> -<!-- v-loadMoreNew:[reselectSingle]="handleScroll"--> -<!-- :popper-class="reselectSingle.name"--> -<!-- class="item-width"--> -<!-- placeholder="请选择单选题题库"--> -<!-- >--> -<!-- <el-option--> -<!-- v-for="item in state.bankListSingle"--> -<!-- :key="item.id"--> -<!-- :label="item.name"--> -<!-- :value="item.id"--> -<!-- />--> -<!-- </el-select>--> - <el-radio-group v-model="state.form.singleMethod" > - <el-radio :label="1" style="max-width: 30px">随机</el-radio> - <el-radio :label="2" style="max-width: 30px">顺序</el-radio> - </el-radio-group > - <el-radio-group v-model="state.form.singleRebuild" style="margin-left: 30px" > - <el-radio :label="1" v-if="title === '编辑'" style="max-width: 30px">重新出题</el-radio> - </el-radio-group> - </div> - </div> - <div style="display: flex"> - <div class="group"> - <div> - 多选:<el-input style="max-width: 40px" v-model="state.form.multiNum"></el-input> 题 - </div> - <div style="margin-left: 20px"> - 每题:<el-input style="max-width: 40px" v-model="state.form.multiScore"></el-input> 分 - </div> - </div> - <div class="group" > - <div > - 共 - <span style="max-width: 30px" v-show="state.form.multiNum && state.form.multiScore">{{state.form.multiNum * state.form.multiScore}}</span> -<!-- <span v-else></span>--> - 分 - </div> - <el-select - clearable - v-model="state.form.multiBankName" - filterable - remote - reserve-keyword - placeholder="请输入多选题库" - remote-show-suffix - :remote-method="getBankList" - style="width: 160px;margin: 0 20px" - @change="selectMultiValue" - > - <el-option - v-for="item in state.bankList" - :key="item.id" - :label="item.name" - :value="item.name" - /> - </el-select> -<!-- <el-select--> -<!-- clearable--> -<!-- v-model="state.form.multiBankId"--> -<!-- style="width: 160px;margin: 0 20px"--> -<!-- v-loadMoreNew:[reselectSingle]="handleScroll"--> -<!-- :popper-class="reselectSingle.name"--> -<!-- class="item-width"--> -<!-- placeholder="请选择多选题题库"--> -<!-- >--> -<!-- <el-option--> -<!-- v-for="item in state.bankListSingle"--> -<!-- :key="item.id"--> -<!-- :label="item.name"--> -<!-- :value="item.id"--> -<!-- />--> -<!-- </el-select>--> - <el-radio-group v-model="state.form.multiMethod" > - <el-radio :label="1" style="max-width: 30px">随机</el-radio> - <el-radio :label="2" style="max-width: 30px">顺序</el-radio> - </el-radio-group> - <el-radio-group v-model="state.form.multiRebuild" style="margin-left: 30px" > - <el-radio :label="1" v-if="title === '编辑'" style="max-width: 30px">重新出题</el-radio> - </el-radio-group> - </div> - </div> - <div style="display: flex"> - <div class="group"> - <div> - 判断:<el-input style="max-width: 40px" v-model="state.form.judgeNum"></el-input> 题 - </div> - <div style="margin-left: 20px"> - 每题:<el-input style="max-width: 40px" v-model="state.form.judgeScore"></el-input> 分 - </div> - </div> - <div class="group" > - <div> - 共 - <span style="max-width: 30px" v-show="state.form.judgeNum && state.form.judgeScore">{{state.form.judgeNum * state.form.judgeScore}}</span> -<!-- <span v-else></span>--> - 分 - </div> - <el-select - clearable - v-model="state.form.judgeBankName" - filterable - remote - reserve-keyword - placeholder="请输入判断题库" - remote-show-suffix - :remote-method="getBankList" - style="width: 160px;margin: 0 20px" - @change="selectJudgeValue" - > - <el-option - v-for="item in state.bankList" - :key="item.id" - :label="item.name" - :value="item.name" - /> - </el-select> -<!-- <el-select--> -<!-- clearable--> -<!-- v-model="state.form.judgeBankId"--> -<!-- style="width: 160px;margin: 0 20px"--> -<!-- v-loadMoreNew:[reselectSingle]="handleScroll"--> -<!-- :popper-class="reselectSingle.name"--> -<!-- class="item-width"--> -<!-- placeholder="请选择判断题题库"--> -<!-- >--> -<!-- <el-option--> -<!-- v-for="item in state.bankListSingle"--> -<!-- :key="item.id"--> -<!-- :label="item.name"--> -<!-- :value="item.id"--> -<!-- />--> -<!-- </el-select>--> - <el-radio-group v-model="state.form.judgeMethod" > - <el-radio :label="1" style="max-width: 30px">随机</el-radio> - <el-radio :label="2" style="max-width: 30px">顺序</el-radio> - </el-radio-group> - <el-radio-group v-model="state.form.judgeRebuild" style="margin-left: 30px" > - <el-radio :label="1" v-if="title === '编辑'" style="max-width: 30px">重新出题</el-radio> - </el-radio-group> - </div> - </div> - <div style="display: flex"> - <div class="group"> - <div> - 简答:<el-input style="max-width: 40px" v-model="state.form.easyNum"></el-input> 题 - </div> - <div style="margin-left: 20px"> - 每题:<el-input style="max-width: 40px" v-model="state.form.easyScore"></el-input> 分 - </div> - </div> - <div class="group" > - <div> - 共 - <span style="max-width: 30px" v-show="state.form.easyNum && state.form.easyScore">{{state.form.easyNum * state.form.easyScore}}</span> - <!-- <span v-else></span>--> - 分 - </div> - <el-select - clearable - v-model="state.form.easyBankName" - filterable - remote - reserve-keyword - placeholder="请输入简答题库" - remote-show-suffix - :remote-method="getBankList" - style="width: 160px;margin: 0 20px" - @change="selectEasyValue" - > - <el-option - v-for="item in state.bankList" - :key="item.id" - :label="item.name" - :value="item.name" - /> - </el-select> -<!-- <el-select--> -<!-- clearable--> -<!-- v-model="state.form.easyBankId"--> -<!-- style="width: 160px;margin: 0 20px"--> -<!-- v-loadMoreNew:[reselectSingle]="handleScroll"--> -<!-- :popper-class="reselectSingle.name"--> -<!-- class="item-width"--> -<!-- placeholder="请选择简答题题库"--> -<!-- >--> -<!-- <el-option--> -<!-- v-for="item in state.bankListSingle"--> -<!-- :key="item.id"--> -<!-- :label="item.name"--> -<!-- :value="item.id"--> -<!-- />--> -<!-- </el-select>--> - <el-radio-group v-model="state.form.easyMethod" > - <el-radio :label="1" style="max-width: 30px">随机</el-radio> - <el-radio :label="2" style="max-width: 30px">顺序</el-radio> - </el-radio-group> - <el-radio-group v-model="state.form.easyRebuild" style="margin-left: 30px" > - <el-radio :label="1" v-if="title === '编辑'" style="max-width: 30px">重新出题</el-radio> - </el-radio-group> - </div> - </div> - <span class="group" style="margin-bottom: 20px">共计: - {{state.form.judgeNum * state.form.judgeScore+state.form.multiNum * state.form.multiScore+state.form.singleNum * state.form.singleScore+state.form.easyNum * state.form.easyScore}} - 分</span> - <div style="display: flex;justify-content: space-between;align-items: center"> - <el-form-item label="合格分数:" prop="passScore"> - <el-input-number v-model="state.form.passScore" :min="1" :max="1000" style="margin-right: 10px" /> (大于等于) - </el-form-item> - <el-form-item label="限制时长:" prop="limitTime"> - <el-input v-model="state.form.limitTime" style="max-width: 200px" :disabled="state.form.limited === 0"> - <template #append>分钟</template> - </el-input> - - </el-form-item> - - </div> - <div style="display: flex;justify-content: space-between;align-items: center"> - <el-form-item label="是否限制考试时长:" prop="limited" style="margin-left: 60px"> - <el-radio-group v-model="state.form.limited" @change="changeLimit" > - <el-radio :label="0" style="max-width: 30px">否</el-radio> - <el-radio :label="1">是</el-radio> - </el-radio-group> - </el-form-item> - <el-form-item label="考试截止时间:" prop="deadline" style="margin-left: 60px"> - <el-date-picker - v-model="state.form.deadline" - type="date" - placeholder="请选择截止时间" - format="YYYY-MM-DD" - value-format="YYYY-MM-DD 23:59:59" - /> - </el-form-item> - </div> - - </el-form> - <template #footer> - <span class="dialog-footer"> - <el-button @click="handleClose" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> - </span> - </template> - </el-dialog> - </div> -</template> -<script setup> -import {reactive, ref, toRefs} from 'vue' -import {ElMessage} from "element-plus"; - -import { - getClassification -} from "@/api/onlineEducation/courseClass"; -import {addCourse, checkCourseName, editCourse, getCourseById} from "@/api/onlineEducation/courseManage"; -import {getToken} from "@/utils/auth"; -import {delPic, getBannerById} from "@/api/onlineEducation/banner"; -import Cookies from "js-cookie"; -import { - addQuestionBank, - checkQuestionBankName, - editQuestionBank, - getQuestionBank -} from "@/api/onlineEducation/questionBank"; -import {addExam, checkExamName, editExam, getExamStudent, getPaper} from "@/api/onlineEducation/exam"; -import Student from "@/views/onlineEducation/groupExams/components/student.vue"; - -const dialogVisible = ref(false); -const title = ref(""); -const busRef = ref(); -const length = ref() -const emit = defineEmits(["getList"]); -const startUsername = ref(''); -const classifyRef = ref(null) - -const validateName = (rule, value, callback)=>{ - if(value === ''){ - callback(new Error('请输入考试名称')) - }else if(title.value === '编辑' && value === startUsername.value){ - callback() - }else{ - let param = {} - if(title.value === '新增') { - param = { - name:value - } - }else if(title.value === '编辑'){ - param = { - name:value, - id: state.form.id - } - } - checkExamName(param).then((res)=>{ - if(res.data == false){ - callback(new Error('考试名称已被占用,请更换其他名称')) - }else{ - callback() - } - }) - } -} -const reselectSingle = reactive({ - name: 'Single' -}) -const state = reactive({ - form: { - id: '', - name: '', - categoryId: null, - companyName: '', - companyId: null, - judgeBankId: null, - judgeMethod: 1, - judgeNum: null, - judgeScore: null, - multiBankId: null, - multiMethod: 1, - multiNum: null, - multiScore: null, - singleBankId: null, - singleMethod: 1, - singleNum: null, - singleScore: null, - limited: 1, - limitTime: null, - passScore: null, - judgeRebuild: null, - multiRebuild: null, - singleRebuild: null, - easyRebuild: null, - deadline: '', - easyNum: null, - easyScore: null, - easyBankId: null, - easyMethod: 1, - easyBankName: '', - singleBankName:'', - multiBankName: '', - judgeBankName: '' - - }, - formRules: { - name: [{required: true, trigger: "blur", validator: validateName}], - categoryId: [{required: true, message: '请选择课程分类', trigger: 'blur'}], - limited: [{required: true, message: '请选择是否限制考试时长', trigger: 'blur'}], - limitTime: [{required: true, message: '请输入考试限制时长', trigger: 'blur'}], - passScore: [{required: true, message: '请输入合格分数', trigger: 'blur'}], - deadline: [{required: true, message: '请选择考试截止时间', trigger: 'blur'}] - }, - classifyList: [], - isAdmin: false, - props: { - checkStrictly: true, - }, - bankListSingle: [], - bankSinglePageNum: 1, // 当前页码 - bankSinglePageSize: 10, // 每页显示的数量 - hasMoreItemsSingle: null, // 是否还有更多选项 - initSingleBankName: '', - initMultiBankName: '', - initJudgeBankName: '', - initEasyBankName: '', -}) - -const openDialog = async (type, value) => { - await getClassifyList(); - await getBankList(''); - const userInfo = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo) - if(userInfo.userType === 0){ - state.isAdmin = true; - state.form.companyName = '' - state.form.companyId = null - }else { - state.isAdmin = false; - state.form.companyName = userInfo.companyName - state.form.companyId = userInfo.companyId - } - title.value = type === 'addFirst' || type === 'add' ? '新增' : type ==='edit' ? '编辑' : '' ; - if(type === 'edit') { - const res = await getPaper(value.id) - if(res.code == 200){ - state.form = res.data - state.form.easyNum = state.form.easyNum ? state.form.easyNum: null - state.form.easyScore = state.form.easyScore ? state.form.easyScore: null - state.form.singleNum = state.form.singleNum ? state.form.singleNum: null - state.form.singleScore = state.form.singleScore ? state.form.singleScore: null - state.form.multiNum = state.form.multiNum ? state.form.multiNum: null - state.form.multiScore = state.form.multiScore ? state.form.multiScore: null - state.form.judgeNum = state.form.judgeNum ? state.form.judgeNum: null - state.form.judgeScore = state.form.judgeScore ? state.form.judgeScore: null - startUsername.value = value.name; - state.initSingleBankName = state.form.singleBankName; - state.initMultiBankName= state.form.multiBankName; - state.initJudgeBankName= state.form.judgeBankName; - state.initEasyBankName= state.form.easyBankName; - }else{ - ElMessage.warning(res.message) - } - - }else if(type === 'add' && value ){ - state.form.parentId = value.id - } - dialogVisible.value = true; -} - -const onSubmit = async () => { - // if(state.isAdmin){ - // ElMessage({ - // type: 'warning', - // message: '管理员暂无权限' - // }); - // return; - // } - const total = state.form.judgeNum * state.form.judgeScore+state.form.multiNum * state.form.multiScore+state.form.singleNum * state.form.singleScore+state.form.easyNum * state.form.easyScore - if(state.form.passScore > total){ - ElMessage({ - type: 'warning', - message: '合格分数不能大于总分' - }); - return; - } - // if(!(state.form.judgeBankId || state.form.multiBankId || state.form.singleBankId)){ - // ElMessage({ - // type: 'warning', - // message: '请选择题库' - // }); - // return; - // } - const valid = await busRef.value.validate(); - if(valid){ - if(title.value === '新增'){ - const {id, ...data} = JSON.parse(JSON.stringify(state.form)) - const res = await addExam(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '新增成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - }else if(title.value === '编辑'){ - const {...data} = JSON.parse(JSON.stringify(state.form)) - const res = await editExam(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '编辑成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - } - } -} -const getClassifyList = async () => { - const res = await getClassification(); - if(res.code === 200){ - state.classifyList = recursion(res.data) - }else{ - ElMessage.warning(res.message) - } -} -const recursion = (data) => { - let tmp = [] - for (let i = 0; i < data.length; i++) { - let item = data[i] - // children为空 - if (item.children&& item.children.length==0) { - tmp.push({ - value: item.id, - label: item.name - }) - // 有children - } else { - tmp.push({ - value: item.id, - label: item.name, - children:recursion(item.children) - }) - } - } - return tmp; -} -const handleChange = ()=> { - console.log("label====",classifyRef.value.getCheckedNodes()[0].value) - state.form.categoryId = classifyRef.value.getCheckedNodes()[0].value - // 我这里只是打印了一下label的值哦,需要赋值的话自己去赋值哦 - if (classifyRef.value.popperVisible) { - classifyRef.value.togglePopperVisible() - } -} - -const handleClose = () => { - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - emit("getList") - -} -const reset = () => { - state.form = { - id: '', - name: '', - categoryId: null, - companyName: '', - companyId: null, - judgeBankId: null, - judgeMethod: 1, - judgeNum: null, - judgeScore: null, - multiBankId: null, - multiMethod: 1, - multiNum: null, - multiScore: null, - singleBankId: null, - singleMethod: 1, - singleNum: null, - singleScore: null, - limited: 1, - limitTime: null, - passScore: null, - judgeRebuild: null, - multiRebuild: null, - singleRebuild: null, - easyRebuild: null, - easyNum: null, - easyScore: null, - easyBankId: null, - easyMethod: 1, - deadline: '', - easyBankName: '', - singleBankName:'', - multiBankName: '', - judgeBankName: '' - - } - state.bankListSingle = []; - state.bankSinglePageNum = 1; - state.bankSinglePageSize = 10; -} -const handleScroll = () => { - if(state.bankSinglePageNum >= state.hasMoreItemsSingle) return - state.bankSinglePageNum++; - loadMoreBankData() - -} -const loadMoreBankData = async () => { - console.log(' Bank'); - const queryParams = { - pageNum: state.bankSinglePageNum, - pageSize: state.bankSinglePageSize, - } - const res = await getQuestionBank(queryParams) - if (res.code == 200) { - state.hasMoreItemsSingle = res.data.totalPage - const data = res.data - state.bankListSingle = state.bankListSingle.concat(data.list) - }else{ - ElMessage.warning(res.message) - } -} - -const getBankList = async (val)=>{ - if(val != ""){ - const queryParams = { - name: val - } - const res = await getQuestionBank(queryParams) - if (res.code == 200) { - state.bankList = res.data.list - - } else { - ElMessage.warning(res.message) - } - }else { - const queryParams = { - pageNum: 1, - pageSize: 10 - } - const res = await getQuestionBank(queryParams) - if (res.code == 200) { - state.bankList = res.data.list - } else { - ElMessage.warning(res.message) - } - } -} -const selectSingleValue = (val) => { - if(val != state.initSingleBankName){ - state.form.singleRebuild = 1; - }else { - state.form.singleRebuild = 0; - } - state.bankList.forEach(item => { - if(item.name === val){ - state.form.singleBankId = item.id - } - }) -} -const selectMultiValue = (val) => { - if(val != state.initMultiBankName){ - state.form.multiRebuild = 1; - }else { - state.form.multiRebuild = 0; - } - state.bankList.forEach(item => { - if(item.name === val){ - state.form.multiBankId = item.id - } - }) -} -const selectJudgeValue = (val) => { - if(val != state.initJudgeBankName){ - state.form.judgeRebuild = 1; - }else { - state.form.judgeRebuild = 0; - } - state.bankList.forEach(item => { - if(item.name === val){ - state.form.judgeBankId = item.id - } - }) -} -const selectEasyValue = (val) => { - if(val != state.initEasyBankName){ - state.form.easyRebuild = 1; - }else { - state.form.easyRebuild = 0; - } - state.bankList.forEach(item => { - if(item.name === val){ - state.form.easyBankId = item.id - } - }) -} - -const changeLimit = (val) => { - state.form.limitTime = null - if(val === 0) { - state.form.limitTime = 0 - } - -} -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } - .group{ - display: flex; - align-items:center; - font-size: 15px; - font-weight: 700; - margin: 20px 0 0 35px; - } -} - -</style> diff --git a/src/views/onlineEducation/groupExams/components/student.vue b/src/views/onlineEducation/groupExams/components/student.vue deleted file mode 100644 index e44bda8..0000000 --- a/src/views/onlineEducation/groupExams/components/student.vue +++ /dev/null @@ -1,294 +0,0 @@ -<template> - <div class="app-container"> - <div style="display: flex;justify-content: space-between"> - <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" > - <el-form-item> - <el-button - type="primary" - plain - icon="Plus" - @click="openDialog()" - >选择学员</el-button> - </el-form-item> - <el-form-item label="学生姓名:" > - <el-input v-model="data.queryParams.studentName" placeholder="请输入学生姓名"></el-input> - </el-form-item> - <el-form-item label="试卷状态:" > - <el-select - v-model="data.queryParams.state" - class="w100" - style="max-width: 180px" - clearable - size="default" - > - <el-option v-for="item in data.completeList" :key="item.id" :label="item.name" :value="item.id"></el-option> - </el-select> - </el-form-item> - <el-form-item > - <el-button - type="primary" - @click="getList" - >查询</el-button> - <el-button - type="primary" - plain - @click="reset" - >重置</el-button> - </el-form-item> - </el-form> - <div> - <el-button - type="danger" - plain - icon="Delete" - @click="handleDeleteBatch" - >批量删除</el-button> - <el-button - type="primary" - plain - @click="back" - >返回</el-button> - </div> - - </div> - <!-- 表格数据 --> - <el-table ref="tableRef" v-loading="loading" :data="dataList" :border="true" :row-key="getRowKey" @selection-change="handleSelectionChange"> - <el-table-column type="selection" :reserve-selection="true" width="55" align="center" /> - <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="试卷名称" align="center" > - <template #default="scope"> - <span>{{scope.row.examPaper.name}}</span> - </template> - </el-table-column> - <el-table-column label="学员名称" prop="studentName" align="center" > - <template #default="scope"> - <span>{{scope.row.student.name}}</span> - </template> - </el-table-column> - <el-table-column label="手机号" prop="studentPhone" align="center" > - <template #default="scope"> - <span>{{scope.row.student.phone}}</span> - </template> - </el-table-column> - <el-table-column label="试卷状态" prop="state" align="center" > - <template #default="scope"> - <span>{{scope.row.state ===0 ? '待考试' : scope.row.state ===1 ? '待批阅':'批阅完成'}}</span> - </template> - </el-table-column> -<!-- <el-table-column label="考试是否完成" prop="completed" align="center" >--> -<!-- <template #default="scope">--> -<!-- <span>{{scope.row.completed ===0 ? '未完成' : '已完成'}}</span>--> -<!-- </template>--> -<!-- </el-table-column>--> - <el-table-column label="成绩" prop="score" align="center" > - <template #default="scope"> - <span>{{scope.row.state ===0 || scope.row.state ===1 ? '--' : scope.row.score}}</span> - </template> - </el-table-column> - <el-table-column label="是否合格" prop="passed" align="center" > - <template #default="scope"> - <span>{{scope.row.state ===0 || scope.row.state ===1 ? '--' : scope.row.passed === 0 ? '不合格' : '合格'}}</span> - </template> - </el-table-column> - <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180"> - <template #default="scope"> - <el-button link type="primary" @click="correct(scope.row)" v-if="scope.row.state != 0">批阅</el-button> - <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> - </template> - </el-table-column> - </el-table> - - <pagination - v-show="total > 0" - :total="total" - v-model:page="queryParams.pageNum" - v-model:limit="queryParams.pageSize" - @pagination="getList" - /> - - <exam-choose-student ref="dialogRef" @getList=getList></exam-choose-student> - </div> -</template> - -<script setup> -import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; -import {ElMessage, ElMessageBox} from "element-plus"; -import Cookies from "js-cookie"; -import {delQuestionBank, getQuestionBank} from "@/api/onlineEducation/questionBank"; -import {batchDelStudent, delBatchStu, getBatchStudent} from "@/api/onlineEducation/batch"; -import {useRoute, useRouter} from 'vue-router' -import {delExamStu, examDelStudent, getExamStudent} from "@/api/onlineEducation/exam"; -import ExamChooseStudent from "@/views/onlineEducation/groupExams/components/examChooseStudent.vue"; -const route = useRoute() -const router = useRouter(); - -const { proxy } = getCurrentInstance(); -const loading = ref(false); -const dialogRef = ref(); -const tableRef = ref(); -const data = reactive({ - queryParams: { - paperId: null, - studentName: '', - state: null, - pageNum: 1, - pageSize: 10, - }, - total: 0, - dataList: [], - isAdmin: false, - chooseStu: [], - completeList: [ - { - id: 0, - name: '待考试' - }, - { - id: 1, - name: '待批阅' - }, - { - id: 2, - name: '批阅完成' - }, - ] - -}); - -const { queryParams, total, dataList } = toRefs(data); - -const backValue = ref() -onMounted(async ()=>{ - - if(route.query.val){ - const val = JSON.parse(route.query.val) - if(val.type == 'index'){ - data.queryParams.pageNum = val.pageNum; - data.queryParams.pageSize = val.pageSize; - data.queryParams.paperId = val.id - }else { - data.queryParams.paperId = val.paperId - data.queryParams.pageNum = val.pageNum; - data.queryParams.pageSize = val.pageSize; - } - } - const userInfo = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo) - if(userInfo.userType === 0){ - data.isAdmin = true; - }else { - data.isAdmin = false; - } - await getList() -}) -onUnmounted(()=>{ - -}) - -const getRowKey = (row) => { - return row.id -} - -const back = () => { - // router.push("/group"); - - const obj = { - - pageNum: data.queryParams.pageNum, - pageSize: data.queryParams.pageSize, - } - const v = JSON.stringify(obj) - router.push({ path: "/group", query: { val: v } }); -} -const getList = async () => { - loading.value = true - const res = await getExamStudent(data.queryParams) - if(res.code == 200){ - data.dataList = res.data.list - data.total = res.data.total - }else{ - ElMessage.warning(res.message) - } - loading.value = false -} - -const openDialog = () => { - dialogRef.value.openDialog(data); -} - -/** 重置新增的表单以及其他数据 */ -function reset() { - data.queryParams = { - paperId: data.queryParams.paperId, - studentName: '', - state: null, - pageNum: 1, - pageSize: 10, - } - getList() -} -const handleSelectionChange = (val) => { - - console.log("选中的行", val) - data.chooseStu = val.map(item => item.id) -} - -const correct = (val) => { - const obj = { - id: val.id, - paperId: data.queryParams.paperId, - pageNum: data.queryParams.pageNum, - pageSize: data.queryParams.pageSize, - state: val.state - } - const v = JSON.stringify(obj) - router.push({ path: "/correctExam", query: { val: v } }); -} -const handleDelete = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await delExamStu(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - tableRef.value.clearSelection(); - }else{ - ElMessage.warning(res.message) - } - }) -} -const handleDeleteBatch = () => { - if(data.chooseStu && data.chooseStu.length <=0){ - ElMessage.warning('请选择要删除的学员'); - return false; - } - ElMessageBox.confirm( - '确定删除选择的所有数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - // const param = { - // phaseStudentIds: data.chooseStu - // } - const res = await examDelStudent(data.chooseStu) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }) -} - -</script> diff --git a/src/views/onlineEducation/groupExams/components/viewExamQuestion.vue b/src/views/onlineEducation/groupExams/components/viewExamQuestion.vue deleted file mode 100644 index 36d6a69..0000000 --- a/src/views/onlineEducation/groupExams/components/viewExamQuestion.vue +++ /dev/null @@ -1,213 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - title="试卷预览" - width="50%" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <el-card style="height: 500px;overflow: scroll"> - <div style="display: flex;flex-direction: column;margin: 0 30px" > - <div v-if="state.singleList && state.singleList.length >0"> - <span style="font-size: 18px;font-weight: 600">单选题</span> - <div v-for="(item,index) in state.singleList" :key="index" style="margin-left: 15px;margin-top: 10px"> - <div style="display: flex;flex-direction: column;"> - <div style="margin-top: 10px;display: flex"> - <span style="font-size: 15px">题目{{index+1}}:</span> - <span style="margin-left: 10px;font-size: 16px">{{item.title}}</span> - </div> - <div style="display: flex;margin-left: 10%;margin-top: 15px"> - <div v-for="single in item.content.items"> - <span style="font-size: 15px;margin-right: 5px">{{single.prefix}}</span> - <span style="font-size: 15px;margin-right: 20px">{{single.content}}</span> - </div> - </div> - <el-divider /> - </div> - </div> - </div> - </div> - <div style="display: flex;flex-direction: column;margin: 30px 30px" > - <div v-if="state.multiList && state.multiList.length >0"> - <span style="font-size: 18px;font-weight: 600">多选题</span> - <div v-for="(item,index) in state.multiList" :key="index" style="margin-left: 15px;margin-top: 10px"> - <div style="display: flex;flex-direction: column;"> - <div style="margin-top: 10px;display: flex"> - <span style="font-size: 15px">题目{{index+1}}:</span> - <span style="margin-left: 10px;font-size: 16px">{{item.title}}</span> - </div> - <div style="display: flex;margin-left: 10%;margin-top: 15px"> - <div v-for="single in item.content.items"> - <span style="font-size: 15px;margin-right: 5px">{{single.prefix}}</span> - <span style="font-size: 15px;margin-right: 20px">{{single.content}}</span> - </div> - </div> - <el-divider /> - </div> - </div> - </div> - </div> - <div style="display: flex;flex-direction: column;margin: 0 30px" > - <div v-if="state.judgeList && state.judgeList.length >0"> - <span style="font-size: 18px;font-weight: 600">判断题</span> - <div v-for="(item,index) in state.judgeList" :key="index" style="margin-left: 15px;margin-top: 10px"> - <div style="display: flex;flex-direction: column;"> - <div style="margin-top: 10px;display: flex"> - <span style="font-size: 15px">题目{{index+1}}:</span> - <span style="margin-left: 10px;font-size: 16px">{{item.title}}</span> - </div> - <div style="display: flex;margin-left: 10%;margin-top: 15px"> - <div v-for="single in item.content.items"> - <span style="font-size: 15px;margin-right: 5px">{{single.prefix}}</span> - <span style="font-size: 15px;margin-right: 20px">{{single.content}}</span> - </div> - </div> - <el-divider /> - </div> - </div> - </div> - </div> - <div style="display: flex;flex-direction: column;margin: 0 30px" > - <div v-if="state.easyList && state.easyList.length >0"> - <span style="font-size: 18px;font-weight: 600">简答</span> - <div v-for="(item,index) in state.easyList" :key="index" style="margin-left: 15px;margin-top: 10px"> - <div style="display: flex;flex-direction: column;"> - <div style="margin-top: 10px;display: flex"> - <span style="font-size: 15px">题目{{index+1}}:</span> - <span style="margin-left: 10px;font-size: 16px">{{item.title}}</span> - </div> - <el-divider /> - </div> - </div> - </div> - </div> - </el-card> - </el-dialog> - </div> -</template> -<script setup> -import {reactive, ref, toRefs} from 'vue' -import {ElMessage} from "element-plus"; -import {getPaper} from "@/api/onlineEducation/exam"; -const dialogVisible = ref(false); -const title = ref(""); -const busRef = ref(); -const length = ref() -const emit = defineEmits(["getList"]); -const startUsername = ref(''); - -const state = reactive({ - form: { - id: '', - name: '', - categoryId: null, - companyName: '', - companyId: null - }, - questionList: [], - singleList:[], - judgeList: [], - multiList:[], - easyList: [] -}) - -const openDialog = async (value) => { - console.log('111',value) - dialogVisible.value = true; - const res = await getPaper(value.id) - if(res.code == 200){ - let result = res.data.questions.reduce((a, b) => { - if (a[b.questionType]) { - a[b.questionType].push(b); - } else { - a[b.questionType] = [b]; - } - return a; - }, {}); - for (const resultKey in result) { - if(resultKey == 1){ - state.singleList.push(result[resultKey]) - - }else if(resultKey == 2){ - state.multiList.push(result[resultKey]) - }else if(resultKey == 3){ - state.judgeList.push(result[resultKey]) - }else { - state.easyList.push(result[resultKey]) - } - } - if(state.singleList && state.singleList.length>0){ - state.singleList = JSON.parse(JSON.stringify(state.singleList[0])).map(item => { - return { - ...item, - content: JSON.parse(item.content) - } - }) - } - if(state.judgeList && state.judgeList.length>0){ - state.judgeList = JSON.parse(JSON.stringify(state.judgeList[0])).map(item => { - return { - ...item, - content: JSON.parse(item.content) - } - }) - } - if(state.multiList && state.multiList.length>0){ - state.multiList = JSON.parse(JSON.stringify(state.multiList[0])).map(item => { - return { - ...item, - content: JSON.parse(item.content) - } - }) - } - if(state.easyList && state.easyList.length>0){ - state.easyList = JSON.parse(JSON.stringify(state.easyList[0])).map(item => { - return { - ...item, - content: JSON.parse(item.content) - } - }) - } - }else{ - ElMessage.warning(res.message) - } - - console.log('state.singleList',state.multiList) -} - -const handleClose = () => { - state.singleList = []; - state.multiList = []; - state.judgeList = []; - state.easyList = []; - dialogVisible.value = false; - emit("getList") - -} -const reset = () => { - -} -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - - :deep( .el-divider--horizontal) { - margin: 15px 0; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } -} -</style> diff --git a/src/views/onlineEducation/groupExams/index.vue b/src/views/onlineEducation/groupExams/index.vue deleted file mode 100644 index 96c9c6b..0000000 --- a/src/views/onlineEducation/groupExams/index.vue +++ /dev/null @@ -1,266 +0,0 @@ -<template> - <div class="app-container"> - <div style="display: flex;justify-content: space-between"> - <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" > - <el-form-item> - <el-button - type="primary" - plain - @click="openDialog('add',{})" - >开始组卷考试</el-button> - </el-form-item> - <el-form-item label="考试名称:" > - <el-input v-model="data.queryParams.name" placeholder="请输入考试名称"></el-input> - </el-form-item> - <el-form-item label="科目/类别:" > - <el-cascader - style="width: 100%" - ref="classifyRef" - v-model="data.queryParams.categoryId" - :options="data.classifyList" - :props="data.props" - clearable - :show-all-levels="false" - @change="handleChange" - /> - </el-form-item> - <el-form-item > - <el-button - type="primary" - @click="getList" - >查询</el-button> - <el-button - type="primary" - plain - @click="reset" - >重置</el-button> - </el-form-item> - </el-form> - </div> - <!-- 表格数据 --> - <el-table v-loading="loading" :data="dataList" :border="true"> - <el-table-column label="编号" prop="code" align="center" width="135" /> - <el-table-column label="考试名称" prop="name" align="center" /> - <el-table-column label="企业名称" prop="companyName" align="center" /> - <el-table-column label="创建账户" prop="createBy" align="center" /> - <el-table-column label="科目/类别" prop="categoryName" align="center" /> - <el-table-column label="完成人数/总人数" prop="" align="center" width="135"> - <template #default="scope"> - <span>{{scope.row.paperStudentInfoVO.finishCount}}/{{scope.row.paperStudentInfoVO.studentCount}}</span> - </template> - </el-table-column> - <el-table-column label="合格人数" prop="" align="center"> - <template #default="scope"> - <span>{{scope.row.paperStudentInfoVO.passStudentCount}}</span> - </template> - </el-table-column> - <el-table-column label="平均分数" prop="" align="center" > - <template #default="scope"> - <span>{{scope.row.paperStudentInfoVO.avgScore}}</span> - </template> - </el-table-column> - <el-table-column label="合格分/总分" prop="" align="center" width="120" > - <template #default="scope"> - <span>{{scope.row.passScore}}/{{scope.row.judgeNum * scope.row.judgeScore + scope.row.multiNum * scope.row.multiScore + scope.row.singleNum * scope.row.singleScore+ scope.row.easyNum * scope.row.easyScore}}</span> - </template> - </el-table-column> - <el-table-column label="合格率" prop="passRate" align="center" /> - <el-table-column label="限制时长/分钟" prop="limitTime" align="center" width="120" > - <template #default="scope"> - <span v-if="scope.row.limitTime == 0">不限时</span> - <span v-else>{{scope.row.limitTime}}</span> - </template> - </el-table-column> - <el-table-column label="考试截止时间" prop="deadlineNum" align="center" width="120" > - </el-table-column> - <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="260"> - <template #default="scope"> - <el-button link type="primary" @click="viewQuestion(scope.row)">预览</el-button> - <el-button link type="primary" @click="toStuChoose(scope.row)">学生数据</el-button> - <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> - <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> - </template> - </el-table-column> - </el-table> - - <pagination - v-show="total > 0" - :total="total" - v-model:page="queryParams.pageNum" - v-model:limit="queryParams.pageSize" - @pagination="getList" - /> - <exam-dialog ref="dialogRef" @getList=getList></exam-dialog> - - <exam-question ref="questionRef" @getList=getList></exam-question> - </div> -</template> - -<script setup> -import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; -import {ElMessage, ElMessageBox} from "element-plus"; -import examDialog from './components/examDialog.vue' -import examQuestion from './components/viewExamQuestion.vue' -import Cookies from "js-cookie"; -import {useRoute, useRouter} from 'vue-router' -const router = useRouter() -import {delQuestionBank, getQuestionBank} from "@/api/onlineEducation/questionBank"; -import {delBatch, getBatch} from "@/api/onlineEducation/batch"; -import {delExam, getExam} from "@/api/onlineEducation/exam"; -import {getClassification} from "@/api/onlineEducation/courseClass"; -const route = useRoute() - -const { proxy } = getCurrentInstance(); -const loading = ref(false); -const dialogRef = ref(); -const questionRef = ref(); -const classifyRef = ref(null) -const data = reactive({ - queryParams: { - name:'', - categoryId: null, - pageNum: 1, - pageSize: 10, - }, - total: 0, - dataList: [], - isAdmin: false, - companyName: '', - remainPeriod: null, - categoryList: [], - props: { - checkStrictly: true, - }, - -}); - -const { queryParams, total, dataList } = toRefs(data); - -onMounted(async ()=>{ - if(route.query.val){ - const val = JSON.parse(route.query.val) - if(val){ - data.queryParams.pageNum = val.pageNum; - data.queryParams.pageSize = val.pageSize; - } - } - const userInfo = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo) - if(userInfo.userType === 0){ - data.isAdmin = true; - }else { - data.isAdmin = false; - data.companyName = userInfo.companyName - } - await getClassifyList(); - await getList() -}) -onUnmounted(()=>{ - -}) - -const getList = async () => { - loading.value = true - const res = await getExam(data.queryParams) - if(res.code == 200){ - data.dataList = res.data.list.map(item => { - return { - ...item, - passRate: item.paperStudentInfoVO.passStudentCount ===0 && item.paperStudentInfoVO.studentCount ===0 ? '0%': (item.paperStudentInfoVO.passStudentCount / item.paperStudentInfoVO.studentCount).toFixed(2) *100 + '%', - deadlineNum: item.deadline ? item.deadline.slice(0,10) : '' - } - }) - - data.total = res.data.total - }else{ - ElMessage.warning(res.message) - } - loading.value = false -} - -const openDialog = (type, value) => { - dialogRef.value.openDialog(type, value); -} - -/** 重置新增的表单以及其他数据 */ -function reset() { - data.queryParams = { - name:'', - categoryId: null, - pageNum: 1, - pageSize: 10, - } - getList() -} -const handleDelete = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await delExam(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }) -} -const toStuChoose = (val) => { - const obj = { - pageNum: data.queryParams.pageNum, - pageSize: data.queryParams.pageSize, - id: val.id, - type: 'index' - } - // val.pageNum = data.queryParams.pageNum; - // val.pageSize = data.queryParams.pageSize - const v = JSON.stringify(obj) - router.push({ path: "/examStu", query: { val: v } }); -} -const viewQuestion = (val) => { - questionRef.value.openDialog(val) -} -const handleChange = ()=> { - console.log("label====",classifyRef.value.getCheckedNodes()[0].value) - data.queryParams.categoryId = classifyRef.value.getCheckedNodes()[0].value - // 我这里只是打印了一下label的值哦,需要赋值的话自己去赋值哦 - if (classifyRef.value.popperVisible) { - classifyRef.value.togglePopperVisible() - } -} -const getClassifyList = async () => { - const res = await getClassification(); - if(res.code === 200){ - data.classifyList = recursion(res.data) - }else{ - ElMessage.warning(res.message) - } -} -const recursion = (data) => { - let tmp = [] - for (let i = 0; i < data.length; i++) { - let item = data[i] - // children为空 - if (item.children&& item.children.length==0) { - tmp.push({ - value: item.id, - label: item.name - }) - // 有children - } else { - tmp.push({ - value: item.id, - label: item.name, - children:recursion(item.children) - }) - } - } - return tmp; -} -</script> diff --git a/src/views/onlineEducation/offlineEducation/components/recordDialog.vue b/src/views/onlineEducation/offlineEducation/components/recordDialog.vue deleted file mode 100644 index b887e2a..0000000 --- a/src/views/onlineEducation/offlineEducation/components/recordDialog.vue +++ /dev/null @@ -1,334 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - :title="state.title" - width="550px" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="180px" > - <el-form-item label="企业名称:" prop="companyName" > - <el-select - v-if="state.isAdmin" - v-model="state.form.companyName" - style="width: 100%" - v-loadMoreNew:[reselect]="handleScroll" - :popper-class="reselect.name" - @change="selectCompany" - class="item-width" - > - <el-option - v-for="item in state.companyList" - :key="item.id" - :label="item.name" - :value="item.name" - /> - </el-select> - - <el-input v-else v-model.trim="state.form.companyName" disabled ></el-input> - </el-form-item> - <el-form-item label="计划名称:" prop="planName" > - <el-input v-model.trim="state.form.planName" placeholder="请输入计划名称"></el-input> - </el-form-item> - <el-form-item label="学员:" prop="studentName" > - <el-select - v-model="state.form.studentName" - style="width: 100%" - v-loadMoreNew:[reselectStu]="handleScrollStu" - :popper-class="reselectStu.name" - class="m-2" - @change="selectValue" - placeholder="请选择学生" - popper-class="more_select_dropdown" - > - <el-option - v-for="item in state.studentList" - :key="item.id" - :label="item.name" - :value="item.name" - /> - </el-select> - </el-form-item> - <el-form-item label="课程名称:" prop="courseName" > - <el-input v-model.trim="state.form.courseName" :disabled="disabled" placeholder="请输入课程名称" ></el-input> - </el-form-item> - <el-form-item label="培训等级:" prop="level" > - <el-input v-model.trim="state.form.level" :disabled="disabled" placeholder="请输入培训等级" ></el-input> - </el-form-item> - <el-form-item label="要求课时(分):" prop="period" > - <el-input v-model.trim="state.form.period" :disabled="disabled" placeholder="请输入要求课时(分)" ></el-input> - </el-form-item> - <el-form-item label="实际课时(分):" prop="actualPeriod" > - <el-input v-model.trim="state.form.actualPeriod" :disabled="disabled" placeholder="请输入实际课时(分)" ></el-input> - </el-form-item> - <el-form-item label="考试成绩:" prop="score" > - <el-input v-model.trim="state.form.score" :disabled="disabled" placeholder="请输入考试成绩" ></el-input> - </el-form-item> - <el-form-item label="是否合格:" prop="passed" > - <el-radio-group v-model="state.form.passed" :disabled="disabled"> - <el-radio :label="0">不合格</el-radio> - <el-radio :label="1">合格</el-radio> - </el-radio-group> - </el-form-item> - </el-form> - <template #footer v-if="state.title !='查看'"> - <span class="dialog-footer"> - <el-button @click="handleClose" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> - </span> - </template> - </el-dialog> - </div> -</template> -<script setup> -import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue' -import { View } from "@element-plus/icons-vue"; -import scorllSelect from '@/components/scrollSelect/index.vue' -import {ElMessage, ElMessageBox} from "element-plus"; -import {verifyPhone, verifyPwd, verifyUsername} from "@/utils/validate"; -import { checkUserName, checkPhone } from "@/api/login" -import {getStudent, resetPwd} from "@/api/onlineEducation/student" -import {Base64} from "js-base64" -import Cookies from "js-cookie"; -import {addStudent, checkStuIdNo, checkStuPhone, editStudent} from "@/api/onlineEducation/student"; -import {addRecord, editRecord} from "@/api/onlineEducation/examRecord"; -import {getCompany} from "@/api/onlineEducation/company"; - -const emit = defineEmits(["getList"]); -const dialogVisible = ref(false) -const superRef = ref(null) -const scrollRef = ref(null) -const reselect = reactive({ - name: 'company' -}) -const reselectStu = reactive({ - name: 'student' -}) - -const state = reactive({ - title: '', - form: { - id: null, - companyName: '', - planName: '', - studentId: '', - level: '', - period: '', - actualPeriod: '', - score: null, - passed: 0, - studentName: '', - courseName: '', - companyId: null - - }, - formRules:{ - companyName: [{ required: true, message: '请输入企业名称', trigger: 'blur' }], - planName: [{ required: true, message: '请输入计划名称', trigger: 'blur' }], - studentName: [{ required: true, message: '请选择学员', trigger: 'blur' }], - level: [{ required: true, message: '请输入培训等级', trigger: 'blur' }], - period: [{ required: true, message: '请输入要求课时(分)', trigger: 'blur' }], - actualPeriod: [{ required: true, message: '实际课时(分)', trigger: 'blur' }], - score: [{ required: true, message: '请输入考试成绩', trigger: 'blur' }], - }, - isAdmin: false, - studentList: [], - stuPageNum: 1, // 当前页码 - stuPageSize: 10, // 每页显示的数量 - hasMoreStu: null, // 是否还有更多选项 - pageNum: 1, - pageSize: 10, - companyList: [], - companyPageNum: 1, // 当前页码 - companyPageSize: 10, // 每页显示的数量 - hasMoreItems: null, // 是否还有更多选项 - -}) -onMounted(() => { - -}); - -const disabled = ref(false); -const openDialog = async (type, value) => { - await loadMoreStuData(); - if(state.isAdmin){ - await loadMoreCompanyData(); - } - const userInfo = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo) - if(userInfo.userType === 0){ - state.isAdmin = true; - state.form.userType = 0; - }else { - state.isAdmin = false; - state.form.companyId = userInfo.companyId; - state.form.companyName = userInfo.companyName; - state.form.userType = 1; - } - - state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : type ==='pwd' ? '修改密码' : '查看' ; - if(type === 'edit' || type === 'view') { - if( type === 'view'){ - disabled.value = true; - } - state.form = value - // state.form.studentName = value.company.name; - console.log("ba",state.form) - } - if(type == 'pwd'){ - state.form.id = value.id - } - dialogVisible.value = true -} -const onSubmit = async () => { - const valid = await superRef.value.validate(); - if(valid){ - if(state.title == '新增'){ - const {id,...data} = state.form - const res = await addRecord(data) - if(res.code == 200){ - ElMessage.success(res.message) - emit('getList') - handleClose() - dialogVisible.value = false; - }else{ - ElMessage.warning(res.message) - } - }else if(state.title == '编辑'){ - const {id, name, phone, sex, companyId, empno, post, duty, idNo} = state.form - const data = {id, name, phone, sex, companyId, empno, post, duty, idNo} - const res = await editRecord(data) - if(res.code == 200){ - ElMessage.success(res.message) - emit('getList') - handleClose() - }else{ - ElMessage.warning(res.message) - } - }else{ - const {id,password} = state.form - const data = {id,password} - data.password = Base64.encode(data.password) - const res = await resetPwd(data) - if(res.code == 200){ - ElMessage.success(res.message) - emit('getList') - handleClose() - }else{ - ElMessage.warning(res.message) - } - } - } -} - -const handleClose = () => { - state.form = { - id: null, - companyName: '', - planName: '', - studentId: '', - level: '', - period: '', - actualPeriod: '', - score: null, - passed: 0, - studentName: '', - courseName: '', - companyId: null - - } - state.companyPageNum = 1; - state.companyPageSize = 10; - state.companyList = []; - state.stuPageNum = 1; - state.stuPageSize = 10; - state.studentList = []; - superRef.value.clearValidate(); - superRef.value.resetFields() - dialogVisible.value = false; -} - -const selectValue = (val) => { - state.studentList.forEach(item => { - if(item.name === val){ - state.form.studentId = item.id - } - }) -} - -const selectCompany = (val) => { - state.companyList.forEach(item => { - if(item.name === val){ - state.form.companyId = item.id - } - }) -} - - - -const handleScrollStu = () => { - console.log(' student',state.hasMoreStu); - if(state.stuPageNum >= state.hasMoreStu) return - state.stuPageNum++; - loadMoreStuData() - -} -const loadMoreStuData = async () => { - const queryParams = { - pageNum: state.stuPageNum, - pageSize: state.stuPageSize, - } - const res = await getStudent(queryParams) - if (res.code == 200) { - state.hasMoreStu = res.data.totalPage - const data = res.data - state.studentList = state.studentList.concat(data.list) - }else{ - ElMessage.warning(res.message) - } -} - -const handleScroll = () => { - console.log(' Company',state.hasMoreItems); - if(state.companyPageNum >= state.hasMoreItems) return - state.companyPageNum++; - loadMoreCompanyData() - -} -const loadMoreCompanyData = async () => { - const queryParams = { - pageNum: state.companyPageNum, - pageSize: state.companyPageSize, - } - const res = await getCompany(queryParams) - if (res.code == 200) { - state.hasMoreItems = res.data.totalPage - const data = res.data - state.companyList = state.companyList.concat(data.list) - }else{ - ElMessage.warning(res.message) - } -} - - - -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } -} -</style> diff --git a/src/views/onlineEducation/offlineEducation/index.vue b/src/views/onlineEducation/offlineEducation/index.vue deleted file mode 100644 index 89abc80..0000000 --- a/src/views/onlineEducation/offlineEducation/index.vue +++ /dev/null @@ -1,180 +0,0 @@ -<template> - <div class="app-container"> - <div style="display: flex;justify-content: space-between"> - <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" > - <el-form-item> - <el-button - type="primary" - plain - icon="Plus" - @click="openDialog('add',{})" - >新增登记</el-button> - </el-form-item> - <el-form-item label="企业名称:" > - <el-input v-model="data.queryParams.companyName" placeholder="请输入企业名称"></el-input> - </el-form-item> - <el-form-item label="课程名称:" > - <el-input v-model="data.queryParams.courseName" placeholder="请输入课程名称"></el-input> - </el-form-item> - <el-form-item > - <el-button - type="primary" - @click="getList" - >查询</el-button> - <el-button - type="primary" - plain - @click="reset" - >重置</el-button> - </el-form-item> - </el-form> - </div> -<!-- <div style="margin-bottom: 10px">--> -<!-- <el-button--> -<!-- type="primary"--> -<!-- @click="openDialog('add',{})"--> -<!-- >新增登记</el-button>--> -<!-- <el-button--> -<!-- type="primary"--> -<!-- plain--> -<!-- >批量导入</el-button>--> -<!-- </div>--> - <!-- 表格数据 --> - <el-table v-loading="loading" :data="dataList" :border="true"> - <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="企业名称" prop="companyName" align="center" /> - <el-table-column label="计划名称" prop="planName" align="center" /> - <el-table-column label="学员姓名" prop="studentName" align="center"> - <template #default="scope"> - <span>{{scope.row.student.name}}</span> - </template> - </el-table-column> -<!-- <el-table-column label="性别" prop="sex" align="center" >--> -<!-- <template #default="scope">--> -<!-- <span>{{scope.row.sex == 0 ? '男':'女'}}</span>--> -<!-- </template>--> -<!-- </el-table-column>--> - <el-table-column label="身份证号" prop="idNo" align="center" width="200" :show-overflow-tooltip="true"> - <template #default="scope"> - <span>{{scope.row.student.idNo}}</span> - </template> - </el-table-column> - <el-table-column label="课程名称" prop="courseName" align="center"/> - <el-table-column label="培训等级" prop="level" align="center"> - <template #default="scope"> - <span>{{scope.row.sex == 1 ? '公司级':scope.row.sex == 2 ? '部门级' : '车间级'}}</span> - </template> - </el-table-column> - <el-table-column label="要求课时(分)" prop="period" align="center"/> - <el-table-column label="实际课时(分)" prop="actualPeriod" align="center"/> - <el-table-column label="考试成绩" prop="score" align="center"/> - <el-table-column label="是否合格" prop="passed" align="center"> - <template #default="scope"> - <span>{{scope.row.passed == 0 ? '不合格':'合格'}}</span> - </template> - </el-table-column> - </el-table> - - <pagination - v-show="total > 0" - :total="total" - v-model:page="queryParams.pageNum" - v-model:limit="queryParams.pageSize" - @pagination="getList" - /> - - <record-dialog ref="dialogRef" @getList=getList></record-dialog> - </div> -</template> - -<script setup> -import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; -import {ElMessage, ElMessageBox} from "element-plus"; -import {delCompany, getCompany} from "@/api/onlineEducation/company"; -import recordDialog from "./components/recordDialog.vue" -import {delUser, getUser} from "@/api/onlineEducation/user"; -import Cookies from "js-cookie"; -import {delStudent, getStudent} from "@/api/onlineEducation/student"; -import {getRecord} from "@/api/onlineEducation/examRecord"; - - -const { proxy } = getCurrentInstance(); -const loading = ref(false); -const dialogRef = ref(); -const data = reactive({ - queryParams: { - companyName: '', - courseName: '', - pageNum: 1, - pageSize: 10, - }, - total: 0, - dataList: [], - isAdmin: false - -}); - -const { queryParams, total, dataList } = toRefs(data); - -onMounted(async ()=>{ - const userInfo = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo) - if(userInfo.userType === 0){ - data.isAdmin = true; - }else { - data.isAdmin = false; - } - await getList() -}) -onUnmounted(()=>{ - -}) - -const getList = async () => { - loading.value = true - const res = await getRecord(data.queryParams) - if(res.code == 200){ - data.dataList = res.data.list - data.total = res.data.total - }else{ - ElMessage.warning(res.message) - } - loading.value = false -} - -const openDialog = (type, value) => { - dialogRef.value.openDialog(type, value); - -} - -/** 重置新增的表单以及其他数据 */ -function reset() { - data.queryParams = { - companyName: '', - courseName: '', - pageNum: 1, - pageSize: 10, - } - getList() -} -const handleDelete = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await delStudent(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }) -} - -</script> diff --git a/src/views/onlineEducation/people/components/stuDialog.vue b/src/views/onlineEducation/people/components/stuDialog.vue deleted file mode 100644 index 8976689..0000000 --- a/src/views/onlineEducation/people/components/stuDialog.vue +++ /dev/null @@ -1,411 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - :title="state.title" - width="550px" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="180px" > - <el-form-item label="企业:" prop="companyName" v-if="state.title !== '修改密码'"> - <el-input v-model.trim="state.form.companyName" disabled></el-input> - </el-form-item> - <el-form-item label="姓名:" prop="name" v-if="state.title !== '修改密码'"> - <el-input v-model.trim="state.form.name" :disabled="disabled" placeholder="请输入姓名" ></el-input> - </el-form-item> - <el-form-item label="性别:" prop="sex" v-if="state.title !== '修改密码'"> - <el-radio-group v-model="state.form.sex" :disabled="disabled"> - <el-radio :label="0">男</el-radio> - <el-radio :label="1">女</el-radio> - </el-radio-group> - </el-form-item> - <el-form-item label="身份证号:" prop="idNo" v-if="state.title !== '修改密码'"> - <el-input v-model.trim="state.form.idNo" maxlength="18" :disabled="disabled" placeholder="请输入身份证号" ></el-input> - </el-form-item> - <el-form-item label="手机号(登录用户名):" prop="phone" v-if="state.title !== '修改密码'" > - <el-input v-model.trim="state.form.phone" :maxlength="11" :disabled="disabled" placeholder="请输入手机号"></el-input> - </el-form-item> - <el-form-item label="密码:" prop="password" v-if="state.title == '新增' || state.title == '修改密码'"> - <el-input v-model.trim="state.form.password" type="password" show-password placeholder="请输入密码"></el-input> - </el-form-item> - <el-form-item label="重复密码:" prop="confirmPassword" v-if="state.title == '新增' || state.title == '修改密码'"> - <el-input v-model.trim="state.form.confirmPassword" type="password" show-password placeholder="请输入确认密码"></el-input> - </el-form-item> - <el-form-item label="所属部门账号:" prop="createBy" v-if="state.title !== '修改密码' && (currentUserType === 1 || currentUserType === 4)"> - <el-select - clearable - v-model="state.form.createBy" - filterable - remote - @change="selectValue" - reserve-keyword - placeholder="请输入部门账号名称" - remote-show-suffix - :remote-method="getDeptUserList" - :loading="loading" - style="width: 100%" - > - <el-option - v-for="item in state.deptUserList" - :key="item.id" - :label="item.name" - :value="item.name" - /> - </el-select> - </el-form-item> - <el-form-item label="工号:" prop="empno" v-if="state.title !== '修改密码'"> - <el-input v-model.trim="state.form.empno" :disabled="disabled" placeholder="请输入工号" ></el-input> - </el-form-item> - <el-form-item label="岗位:" prop="post" v-if="state.title !== '修改密码'"> - <el-input v-model.trim="state.form.post" :disabled="disabled" placeholder="请输入岗位" ></el-input> - </el-form-item> - <el-form-item label="职务:" prop="duty" v-if="state.title !== '修改密码'"> - <el-input v-model.trim="state.form.duty" :disabled="disabled" placeholder="请输入职务" ></el-input> - </el-form-item> - </el-form> - <template #footer v-if="state.title !='查看'"> - <span class="dialog-footer"> - <el-button @click="handleClose" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> - </span> - </template> - </el-dialog> - </div> -</template> -<script setup> -import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue' -import { View } from "@element-plus/icons-vue"; -import scorllSelect from '@/components/scrollSelect/index.vue' -import {ElMessage, ElMessageBox} from "element-plus"; -import {verifyPhone, verifyPwd, verifyUsername} from "@/utils/validate"; -import { checkUserName, checkPhone } from "@/api/login" -import {changeCompany, resetPwd} from "@/api/onlineEducation/student" -import {Base64} from "js-base64" -import Cookies from "js-cookie"; -import {addStudent, checkStuIdNo, checkStuPhone, editStudent} from "@/api/onlineEducation/student"; -import {getCompany} from "@/api/onlineEducation/company"; -import {getUser} from "@/api/onlineEducation/user"; -const emit = defineEmits(["getList"]); -const dialogVisible = ref(false) -const superRef = ref(null) -const scrollRef = ref(null) - - - -const equalToPassword = (rule, value, callback) => { - if (state.form.password !== value) { - callback(new Error("两次输入的密码不一致")); - } else { - callback(); - } -}; - -const validateUserPhone = (rule, value, callback)=>{ - if(value === ''){ - callback(new Error('请输入手机号')) - }else if(state.title === '编辑' && value === startPhone.value){ - callback() - } else if(!verifyPhone(value)){ - callback(new Error('手机号格式有误')) - }else{ - let param = {} - if(state.title === '新增') { - param = { - phone:value - } - }else if(state.title === '编辑'){ - param = { - phone:value, - id: state.form.id - } - } - checkStuPhone(param).then((res)=>{ - if(res.data == false){ - callback(new Error('手机号已被占用,请更换其他手机号')) - }else{ - callback() - } - }) - } -} - -let validatePwd = (rule, value, callback)=>{ - if(value === ''){ - callback(new Error('请输入密码')) - }else{ - if(!verifyPwd(value)){ - callback(new Error('密码须包含字母、数字、特殊字符,长度在6-16之间')) - }else{ - callback() - } - } -} -let validateIdNo = (rule, value, callback)=>{ - if(value === ''){ - callback(new Error('请输入身份证号')) - }else if(state.title === '编辑' && value === startIdNo.value){ - callback() - }else{ - let param = {} - if(state.title === '新增') { - param = { - idNo:value - } - }else if(state.title === '编辑'){ - param = { - idNo:value, - id: state.form.id - } - } - checkStuIdNo(param).then((res)=>{ - if(res.data.status == 1){ - callback(new Error('身份证号在该企业已被占用,请更换其他身份证号')) - }else if(res.data.status == 2){ - if(state.title == '新增'){ - ElMessageBox.confirm( - `该人员 ${state.form.name} (身份证号: ${state.form.idNo} )与 ${res.data.companyName} 已经绑定,确定将该人员的责任归属变更到贵公企业?`, - '提示', - { - confirmButtonText: '确认', - cancelButtonText: '取消', - type: 'warning', - icon: '' - } - ) - .then(() => { - const param = { - companyId: state.form.companyId, - studentId: res.data.studentId - } - changeCompany(param).then((res) => { - if(res.code == 200){ - ElMessage({ - type: 'success', - message: '变更成功', - }) - emit('getList') - handleClose() - - callback() - }else { - ElMessage.warning(res.message) - } - }) - }) - }else { - callback(new Error('身份证号在其他企业已被占用,请更换身份证号')) - } - }else { - callback() - } - }) - } -} - - -const state = reactive({ - title: '', - form: { - id: null, - name: '', - phone: '', - password: '', - confirmPassword: '', - sex: 0, - companyId: null, - empno: '', - post: '', - duty: '', - idNo: '', - createId: null, - createBy: '', - userType: null - - }, - formRules:{ - name: [{ required: true, message: '请输入姓名', trigger: 'blur' }], - password: [{ required: true, validator: validatePwd, trigger: 'blur' }], - confirmPassword: [{ required: true, validator: equalToPassword, trigger: 'blur' }], - phone: [{ required: true, validator: validateUserPhone, trigger: 'blur' }], - idNo: [{ required: true, validator: validateIdNo, trigger: 'blur' }], - createBy: [{ required: true, message: '请输入所属部门名称', trigger: 'blur' }], - - }, - isAdmin: false, - deptUserList: [] - -}) -const startPhone = ref(''); -const startIdNo = ref(''); -const UisMounted = ref(false); -onMounted(() => { - UisMounted.value = true; - -}); - -const currentUserType = ref(null) -const disabled = ref(false); -const openDialog = async (type, value) => { - const userInfo = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo) - currentUserType.value = userInfo.userType - if(userInfo.userType === 0){ - state.isAdmin = true; - state.form.userType = 0; - }else { - state.isAdmin = false; - state.form.companyId = userInfo.companyId; - state.form.companyName = userInfo.companyName; - state.form.userType = userInfo.userType; - } - if(userInfo.userType === 1 || userInfo.userType === 4) { - await getDeptUserList("") - }else if(userInfo.userType === 2){ - state.form.createId = userInfo.id - state.form.createBy = userInfo.name - } - state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : type ==='pwd' ? '修改密码' : '查看' ; - if(type === 'edit' || type === 'view') { - if( type === 'view'){ - disabled.value = true; - } - startPhone.value = value.phone - startIdNo.value = value.idNo - state.form = JSON.parse(JSON.stringify(value)) - state.form.companyName = value.company.name; - console.log("ba",state.form) - } - if(type == 'pwd'){ - state.form.id = value.id - } - dialogVisible.value = true -} -const onSubmit = async () => { - const valid = await superRef.value.validate(); - if(valid){ - if(state.title == '新增'){ - const {confirmPassword,id,...data} = state.form - data.password = Base64.encode(data.password) - const res = await addStudent(data) - if(res.code == 200){ - ElMessage.success(res.message) - emit('getList') - handleClose() - dialogVisible.value = false; - }else{ - ElMessage.warning(res.message) - } - }else if(state.title == '编辑'){ - const {id, name, phone, sex, companyId, empno, post, duty, idNo,createId,createBy} = state.form - const data = {id, name, phone, sex, companyId, empno, post, duty, idNo,createId,createBy} - const res = await editStudent(data) - if(res.code == 200){ - ElMessage.success(res.message) - emit('getList') - handleClose() - }else{ - ElMessage.warning(res.message) - } - }else{ - const {id,password} = state.form - const data = {id,password} - data.password = Base64.encode(data.password) - const res = await resetPwd(data) - if(res.code == 200){ - ElMessage.success(res.message) - emit('getList') - handleClose() - }else{ - ElMessage.warning(res.message) - } - } - } -} -const handleClose = () => { - state.form = { - id: null, - name: '', - phone: '', - password: '', - confirmPassword: '', - sex: 0, - companyId: null, - empno: '', - post: '', - duty: '', - idNo: '', - createId: null, - createBy: '', - userType: null - } - superRef.value.clearValidate(); - superRef.value.resetFields() - dialogVisible.value = false; -} - - -const selectValue = (val) => { - // state.form.parentId = null; - // state.form.parentName = null; - state.deptUserList.forEach(item => { - if(item.name === val){ - state.form.createId = item.id - } - }) -} - -const loading = ref(false) -const getDeptUserList = async (val)=>{ - let param = {} - if(val != ""){ - param = { - name: val, - userType: 2, - companyId: state.form.companyId - } - }else { - param = { - pageNum: 1, - pageSize: 10, - userType: 2, - companyId: state.form.companyId - } - } - loading.value = true; - const res = await getUser(param) - if (res.code == 200) { - loading.value = false; - state.deptUserList = res.data.list.map(item => { - return { - ...item, - name: item.name + ' ('+ item.username +') ' - } - }) - - } else { - ElMessage.warning(res.message) - } -} - - - -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } -} -</style> diff --git a/src/views/onlineEducation/people/components/trainRecord.vue b/src/views/onlineEducation/people/components/trainRecord.vue deleted file mode 100644 index e868866..0000000 --- a/src/views/onlineEducation/people/components/trainRecord.vue +++ /dev/null @@ -1,98 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - title="培训考试记录" - width="50%" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <el-table v-loading="state.loading" :data="state.dataList" :border="true"> - <el-table-column label="序号" type="index" align="center" width="80" /> -<!-- <el-table-column label="学生姓名" prop="stuName" align="center" />--> - <el-table-column label="培训名称" prop="name" align="center" > - <template #default="scope"> - {{scope.row.trainType == 1 ? scope.row.name : ''}} - </template> - </el-table-column> - <el-table-column label="考试名称" prop="name" align="center" > - <template #default="scope"> - {{scope.row.trainType == 2 ? scope.row.name : ''}} - </template> - </el-table-column> - <el-table-column label="所在公司" prop="companyName" align="center"/> - </el-table> - </el-dialog> - </div> -</template> -<script setup> -import {reactive, ref, toRefs} from 'vue' -import {ElMessage} from "element-plus"; - -import { - getClassification -} from "@/api/onlineEducation/courseClass"; -import {addCourse, checkCourseName, editCourse, getCourseById} from "@/api/onlineEducation/courseManage"; -import {getToken} from "@/utils/auth"; -import {delPic, getBannerById} from "@/api/onlineEducation/banner"; -import Cookies from "js-cookie"; -import {addQuestionBank, checkQuestionBankName, editQuestionBank} from "@/api/onlineEducation/questionBank"; -import {getStudent, getStuTrainRecord} from "@/api/onlineEducation/student"; - -const dialogVisible = ref(false); -const title = ref(""); -const busRef = ref(); -const length = ref() -const emit = defineEmits(["getList"]); -const state = reactive({ - loading: false, - dataList: [] -}) - -const openDialog = async (value) => { - state.loading = true - const param = { - studentId: value.id - } - const res = await getStuTrainRecord(param) - if(res.code == 200){ - state.dataList = res.data.map(item => { - return{ - ...item, - stuName: value.name - } - }) - state.loading = false - console.log(state.dataList,'state.dataList') - }else{ - ElMessage.warning(res.message) - } - - dialogVisible.value = true; -} - -const handleClose = () => { - dialogVisible.value = false; - emit("getList") - -} - -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } -} -</style> diff --git a/src/views/onlineEducation/people/index.vue b/src/views/onlineEducation/people/index.vue deleted file mode 100644 index 91ccbc4..0000000 --- a/src/views/onlineEducation/people/index.vue +++ /dev/null @@ -1,177 +0,0 @@ -<template> - <div class="app-container"> - <div style="display: flex;justify-content: space-between"> - <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" > - <el-form-item> - <el-button - type="primary" - plain - icon="Plus" - @click="openDialog('add',{})" - >新增</el-button> - </el-form-item> - <el-form-item label="姓名:" > - <el-input v-model="data.queryParams.name" placeholder="请输入姓名"></el-input> - </el-form-item> - <el-form-item > - <el-button - type="primary" - @click="getList" - >查询</el-button> - <el-button - type="primary" - plain - @click="reset" - >重置</el-button> - </el-form-item> - </el-form> - </div> - <!-- 表格数据 --> - <el-table v-loading="loading" :data="dataList" :border="true"> - <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="工号" prop="empno" align="center" /> - <el-table-column label="姓名" prop="name" align="center" /> - <el-table-column label="性别" prop="sex" align="center" > - <template #default="scope"> - <span>{{scope.row.sex == 0 ? '男':'女'}}</span> - </template> - </el-table-column> - <el-table-column label="手机号" prop="phone" align="center" width="130"/> - <el-table-column label="身份证" prop="idNo" align="center" width="200" :show-overflow-tooltip="true"/> - <el-table-column label="创建人" prop="createBy" align="center"> - <template #default="scope"> - <span>{{scope.row.createUser.name}}</span> - </template> - </el-table-column> - <el-table-column label="工作岗位" prop="post" align="center"/> - <el-table-column label="职务" prop="duty" align="center"/> - <el-table-column label="一人一档" prop="duty" align="center" width="120"> - <template #default="scope"> - <el-button link type="primary" @click="openRecord(scope.row)">培训考试记录</el-button> - </template> - </el-table-column> - <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180"> - <template #default="scope"> - <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> - <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> - <el-button link type="primary" @click="openDialog('pwd',scope.row)">修改密码</el-button> - </template> - </el-table-column> - </el-table> - - <pagination - v-show="total > 0" - :total="total" - v-model:page="queryParams.pageNum" - v-model:limit="queryParams.pageSize" - @pagination="getList" - /> - - <stu-dialog ref="dialogRef" @getList=getList></stu-dialog> - <record ref="recordRef" @getList=getList></record> - </div> -</template> - -<script setup> -import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; -import {ElMessage, ElMessageBox} from "element-plus"; -import {delCompany, getCompany} from "@/api/onlineEducation/company"; -import stuDialog from "./components/stuDialog.vue" -import record from './components/trainRecord.vue' -import {delUser, getUser} from "@/api/onlineEducation/user"; -import Cookies from "js-cookie"; -import {delStudent, getStudent} from "@/api/onlineEducation/student"; - - -const { proxy } = getCurrentInstance(); -const loading = ref(false); -const dialogRef = ref(); -const recordRef =ref(); -const data = reactive({ - queryParams: { - pageNum: 1, - pageSize: 10, - name: '' - }, - total: 0, - dataList: [], - isAdmin: false - -}); - -const { queryParams, total, dataList } = toRefs(data); -const userType = ref() -onMounted(async ()=>{ - const userInfo = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo) - userType.value = userInfo.userType - if(userInfo.userType === 0){ - data.isAdmin = true; - }else { - data.isAdmin = false; - } - await getList() -}) -onUnmounted(()=>{ - -}) - -const getList = async () => { - loading.value = true - const res = await getStudent(data.queryParams) - if(res.code == 200){ - data.dataList = res.data.list - data.total = res.data.total - }else{ - ElMessage.warning(res.message) - } - loading.value = false -} - -const openDialog = (type, value) => { - if(type == 'add' && data.isAdmin){ - ElMessage.warning('监管部门请联系企业创建企业学员') - } - // else if(userType.value !== 3 && (type == 'add' || type == 'edit')) { - // ElMessage.warning(' 只有车间级用户才能新增和编辑') - // } - else{ - dialogRef.value.openDialog(type, value); - } - - -} - -/** 重置新增的表单以及其他数据 */ -function reset() { - data.queryParams = { - pageNum: 1, - pageSize: 10, - name: '' - } - getList() -} -const handleDelete = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await delStudent(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }) -} -const openRecord = (val) => { - recordRef.value.openDialog(val) -} - -</script> diff --git a/src/views/onlineEducation/questionBankManagement/components/questionBankDialog.vue b/src/views/onlineEducation/questionBankManagement/components/questionBankDialog.vue deleted file mode 100644 index 6c4431a..0000000 --- a/src/views/onlineEducation/questionBankManagement/components/questionBankDialog.vue +++ /dev/null @@ -1,247 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - :title="title" - width="500px" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" > - <el-form-item label="所属公司:" prop="companyName" v-if="!state.isAdmin"> - <el-input v-model.trim="state.form.companyName" disabled></el-input> - </el-form-item> - <el-form-item label="题库名称:" prop="name"> - <el-input v-model.trim="state.form.name" placeholder="请输入题库名称"></el-input> - </el-form-item> - <el-form-item label="课程分类:" prop="categoryId" > - <el-cascader - style="width: 100%" - ref="classifyRef" - v-model="state.form.categoryId" - :options="state.classifyList" - :props="state.props" - clearable - :show-all-levels="false" - @change="handleChange" - /> - </el-form-item> - </el-form> - <template #footer> - <span class="dialog-footer"> - <el-button @click="handleClose" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> - </span> - </template> - </el-dialog> - </div> -</template> -<script setup> -import {reactive, ref, toRefs} from 'vue' -import {ElMessage} from "element-plus"; - -import { - getClassification -} from "@/api/onlineEducation/courseClass"; -import {addCourse, checkCourseName, editCourse, getCourseById} from "@/api/onlineEducation/courseManage"; -import {getToken} from "@/utils/auth"; -import {delPic, getBannerById} from "@/api/onlineEducation/banner"; -import Cookies from "js-cookie"; -import {addQuestionBank, checkQuestionBankName, editQuestionBank} from "@/api/onlineEducation/questionBank"; - -const dialogVisible = ref(false); -const title = ref(""); -const busRef = ref(); -const length = ref() -const emit = defineEmits(["getList"]); -const startUsername = ref(''); -const classifyRef = ref(null) - -const validateName = (rule, value, callback)=>{ - if(value === ''){ - callback(new Error('请输入题库名称')) - }else if(title.value === '编辑' && value === startUsername.value){ - callback() - }else{ - let param = {} - if(title.value === '新增') { - param = { - name:value - } - }else if(title.value === '编辑'){ - param = { - name:value, - id: state.form.id - } - } - checkQuestionBankName(param).then((res)=>{ - if(res.data == false){ - callback(new Error('题库名称已被占用,请更换其他名称')) - }else{ - callback() - } - }) - } -} -const state = reactive({ - form: { - id: '', - name: '', - categoryId: null, - companyName: '', - companyId: null - }, - formRules: { - name: [{required: true, trigger: "blur", validator: validateName}], - categoryId: [{required: true, message: '请选择课程分类', trigger: 'blur'}], - }, - classifyList: [], - isAdmin: false, - props: { - checkStrictly: true, - } -}) - -const openDialog = async (type, value) => { - await getClassifyList(); - const userInfo = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo) - if(userInfo.userType === 0){ - state.isAdmin = true; - state.form.companyName = '' - state.form.companyId = null - }else { - state.isAdmin = false; - state.form.companyName = userInfo.companyName - state.form.companyId = userInfo.companyId - } - title.value = type === 'addFirst' || type === 'add' ? '新增' : type ==='edit' ? '编辑' : '' ; - if(type === 'edit') { - state.form.id = value.id - state.form.name = value.name - state.form.categoryId = value.categoryId - startUsername.value = value.name; - }else if(type === 'add' && value ){ - state.form.parentId = value.id - } - dialogVisible.value = true; -} -const getClassifyList = async () => { - const res = await getClassification(); - if(res.code === 200){ - state.classifyList = recursion(res.data) - }else{ - ElMessage.warning(res.message) - } -} -const recursion = (data) => { - let tmp = [] - for (let i = 0; i < data.length; i++) { - let item = data[i] - // children为空 - if (item.children&& item.children.length==0) { - tmp.push({ - value: item.id, - label: item.name - }) - // 有children - } else { - tmp.push({ - value: item.id, - label: item.name, - children:recursion(item.children) - }) - } - } - return tmp; -} - -const CascaderRef = ref() -const handleChange = ()=> { - console.log("label====",classifyRef.value.getCheckedNodes()[0].value) - state.form.categoryId = classifyRef.value.getCheckedNodes()[0].value - // 我这里只是打印了一下label的值哦,需要赋值的话自己去赋值哦 - if (classifyRef.value.popperVisible) { - classifyRef.value.togglePopperVisible() - } -} - -const onSubmit = async () => { - // if(state.isAdmin){ - // ElMessage({ - // type: 'warning', - // message: '管理员暂无权限' - // }); - // return; - // } - const valid = await busRef.value.validate(); - if(valid){ - if(title.value === '新增'){ - const {id, ...data} = JSON.parse(JSON.stringify(state.form)) - const res = await addQuestionBank(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '新增成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - }else if(title.value === '编辑'){ - const {...data} = JSON.parse(JSON.stringify(state.form)) - const res = await editQuestionBank(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '编辑成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - } - } -} - -const handleClose = () => { - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - emit("getList") - -} -const reset = () => { - state.form = { - id: '', - name: '', - categoryId: null, - companyName: '', - companyId: null - } -} -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } -} -</style> diff --git a/src/views/onlineEducation/questionBankManagement/index.vue b/src/views/onlineEducation/questionBankManagement/index.vue deleted file mode 100644 index 2371948..0000000 --- a/src/views/onlineEducation/questionBankManagement/index.vue +++ /dev/null @@ -1,141 +0,0 @@ -<template> - <div class="app-container"> - <div style="display: flex;justify-content: space-between"> - <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" > - <el-form-item> - <el-button - type="primary" - plain - icon="Plus" - @click="openDialog('add',{})" - >新增</el-button> - </el-form-item> - <el-form-item label="题库名称:" > - <el-input v-model="data.queryParams.name" placeholder="请输入题库名称"></el-input> - </el-form-item> - <el-form-item > - <el-button - type="primary" - @click="getList" - >查询</el-button> - <el-button - type="primary" - plain - @click="reset" - >重置</el-button> - </el-form-item> - </el-form> - </div> - <!-- 表格数据 --> - <el-table v-loading="loading" :data="dataList" :border="true"> - <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="题库名称" prop="name" align="center" /> - <el-table-column label="分类名称" prop="categoryName" align="center" /> - <el-table-column label="单选题数量" prop="singleCount" align="center" /> - <el-table-column label="多选题数量" prop="multiCount" align="center" /> - <el-table-column label="判断题数量" prop="judgeCount" align="center" /> - <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180"> - <template #default="scope"> - <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> - <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> - </template> - </el-table-column> - </el-table> - - <pagination - v-show="total > 0" - :total="total" - v-model:page="queryParams.pageNum" - v-model:limit="queryParams.pageSize" - @pagination="getList" - /> - - <question-bank-dialog ref="dialogRef" @getList=getList></question-bank-dialog> - </div> -</template> - -<script setup> -import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; -import {ElMessage, ElMessageBox} from "element-plus"; -import questionBankDialog from './components/questionBankDialog.vue' -import Cookies from "js-cookie"; -import {delQuestionBank, getQuestionBank} from "@/api/onlineEducation/questionBank"; - - -const { proxy } = getCurrentInstance(); -const loading = ref(false); -const dialogRef = ref(); -const data = reactive({ - queryParams: { - pageNum: 1, - pageSize: 10, - name: '' - }, - total: 0, - dataList: [], - isAdmin: false - -}); - -const { queryParams, total, dataList } = toRefs(data); - -onMounted(async ()=>{ - const userInfo = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo) - if(userInfo.userType === 0){ - data.isAdmin = true; - }else { - data.isAdmin = false; - } - await getList() -}) -onUnmounted(()=>{ - -}) - -const getList = async () => { - loading.value = true - const res = await getQuestionBank(data.queryParams) - if(res.code == 200){ - data.dataList = res.data.list - data.total = res.data.total - }else{ - ElMessage.warning(res.message) - } - loading.value = false -} - -const openDialog = (type, value) => { - dialogRef.value.openDialog(type, value); -} - -/** 重置新增的表单以及其他数据 */ -function reset() { - data.queryParams = { - pageNum: 1, - pageSize: 10, - name: '' - } - getList() -} -const handleDelete = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await delQuestionBank(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }) -} - -</script> diff --git a/src/views/onlineEducation/questionBankManagement/questionManage/components/questionDialog.vue b/src/views/onlineEducation/questionBankManagement/questionManage/components/questionDialog.vue deleted file mode 100644 index a7ec521..0000000 --- a/src/views/onlineEducation/questionBankManagement/questionManage/components/questionDialog.vue +++ /dev/null @@ -1,426 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - :title="title" - width="750px" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" > - <el-form-item label="题目类型:" prop="questionType"> - <el-select v-model="state.form.questionType" placeholder="请选择题型" style="width: 100%" @change="changeType"> - <el-option - v-for="item in state.questionTypeList" - :key="item.id" - :label="item.name" - style="width: 100%" - :value="item.id"> - </el-option> - </el-select> - </el-form-item> - <el-form-item label="归属题库:" prop="bankName"> - <el-select - clearable - v-model="state.form.bankName" - filterable - remote - reserve-keyword - placeholder="请输入题库名称" - remote-show-suffix - :remote-method="getBankList" - style="width: 100%" - @change="selectValue" - > - <el-option - v-for="item in state.bankList" - :key="item.id" - :label="item.name" - :value="item.name" - /> - </el-select> -<!-- <el-select--> -<!-- v-model="state.form.bankName"--> -<!-- style="width: 100%"--> -<!-- v-loadMoreNew:[reselect]="handleScroll"--> -<!-- :popper-class="reselect.name"--> -<!-- @change="selectValue"--> -<!-- class="item-width"--> -<!-- placeholder="请选择题库"--> -<!-- >--> -<!-- <el-option--> -<!-- v-for="item in state.bankList"--> -<!-- :key="item.id"--> -<!-- :label="item.name"--> -<!-- :value="item.name"--> -<!-- />--> -<!-- </el-select>--> - </el-form-item> - <el-form-item label="题目内容:" prop="title"> - <el-input v-model.trim="state.form.title" type="textarea" placeholder="请输入题目内容"></el-input> - </el-form-item> - <el-form-item label="选项:" prop="content" v-if="state.form.questionType != 4"> - <div style="display: flex;flex-direction: column;width: 100%"> - <el-button :disabled="state.form.questionType ===3 || state.form.questionType==null " type="primary" @click="addOption" size="default" style="width: 65px;margin-bottom: 15px">添加</el-button> - <div v-for="(item,index) in state.optionItem.items" :key="index" style="width: 100%"> - <div style="display: flex;align-items: center"> - <span>{{String.fromCharCode(index + 65)}}</span> - <el-input :disabled="state.form.questionType ===3" type="textarea" v-model="state.optionItem.items[index].content" placeholder="请输入选项内容" style="width: 100%;margin-left: 20px;margin-bottom: 10px"></el-input> - <Delete v-if="state.form.questionType !==3" style="width: 15px; height: 15px; margin-left: 8px;color: #ed5565" @click="delOption(index)" /> - </div> - </div> - </div> - </el-form-item> - - <el-form-item label="正确答案:" prop="answer"> - <el-radio-group v-model="state.form.answer" v-if="state.form.questionType === 1 || state.form.questionType === 3"> - <div v-for="(item,index) in state.optionItem.items"> - <el-radio :label="String.fromCharCode(index + 65)" style="margin-left: 20px">{{String.fromCharCode(index + 65)}}</el-radio> - </div> - </el-radio-group> - <el-checkbox-group v-model="state.checkList" v-if="state.form.questionType === 2" style="display: flex" @change="changeCheck"> - <div v-for="(item,index) in state.optionItem.items"> - <el-checkbox :label="String.fromCharCode(index + 65)" style="margin-left: 20px;">{{String.fromCharCode(index + 65)}}</el-checkbox> - </div> - </el-checkbox-group> - <el-input v-if="state.form.questionType === 4" v-model="state.form.answer" type="textarea" placeholder="请输入正确答案"></el-input> - </el-form-item> - <el-form-item label="解析:" > - <el-input type="textarea" v-model="state.optionItem.analyze" placeholder="请输入题目解析" style="width: 100%;margin-bottom: 10px"></el-input> - </el-form-item> - </el-form> - <template #footer> - <span class="dialog-footer"> - <el-button @click="handleClose" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> - </span> - </template> - </el-dialog> - </div> -</template> -<script setup> -import {reactive, ref, toRefs} from 'vue' -import {ElMessage} from "element-plus"; -import {Delete} from "@element-plus/icons-vue"; - -import { - getClassification -} from "@/api/onlineEducation/courseClass"; -import {addCourse, checkCourseName, editCourse, getCourseById} from "@/api/onlineEducation/courseManage"; -import {getToken} from "@/utils/auth"; -import {delPic, getBannerById} from "@/api/onlineEducation/banner"; -import Cookies from "js-cookie"; -import { - addQuestionBank, - checkQuestionBankName, - editQuestionBank, - getQuestionBank -} from "@/api/onlineEducation/questionBank"; -import {addQuestion, editQuestion, getQuestionById} from "@/api/onlineEducation/question"; - -const dialogVisible = ref(false); -const title = ref(""); -const busRef = ref(); -const length = ref() -const emit = defineEmits(["getList"]); -const startUsername = ref(''); -const classifyRef = ref(null) -const state = reactive({ - form: { - id: '', - title: '', - questionType: null, - bankName: '', - bankId: null, - answer: '' - }, - formRules: { - - questionType: [{required: true, trigger: "blur", message: '请选择题目类型'}], - bankName: [{required: true, trigger: "blur", message: '请选择归属题库'}], - title: [{required: true, trigger: "blur", message: '请输入题目内容'}], - answer: [{required: true, trigger: "blur", message: '请选择正确答案'}], - }, - classifyList: [], - isAdmin: false, - props: { - checkStrictly: true, - }, - questionTypeList: [ - { - id: 1, - name: '单选题' - }, - { - id: 2, - name: '多选题' - }, - { - id: 3, - name: '判断题' - }, - // { - // id: 4, - // name: '简答题' - // } - ], - optionItem: { - analyze: '', - items: [] - }, - checkList: [], - bankList: [], - bankPageNum: 1, // 当前页码 - bankPageSize: 10, // 每页显示的数量 - hasMoreItems: null, // 是否还有更多选项 - -}) -const reselect = reactive({ - name: 'bank1' -}) -const selectValue = (val) => { - state.bankList.forEach(item => { - if(item.name === val){ - state.form.bankId = item.id - } - }) -} -const changeCheck = (val) => { - console.log('val',val) - state.form.answer = val.join(',') -} - -const addOption = () => { - - const obj = { - prefix:"", - content: '' - } - state.optionItem.items.push(obj) - -} -const delOption = (val) => { - state.optionItem.items.splice(val,1) - state.form.answer = '' - console.log(" state.optionItem.items.", state.optionItem.items) -} -const openDialog = async (type, value) => { - await getBankList(''); - const userInfo = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo) - if(userInfo.userType === 0){ - state.isAdmin = true; - state.form.companyName = '' - state.form.companyId = null - }else { - state.isAdmin = false; - state.form.companyName = userInfo.companyName - state.form.companyId = userInfo.companyId - } - title.value = type === 'addFirst' || type === 'add' ? '新增' : type ==='edit' ? '编辑' : '' ; - if(type === 'edit') { - const res = await getQuestionById(value.id) - if(res.code === 200){ - state.form = res.data - state.optionItem = JSON.parse(res.data.content) - if(res.data.questionType === 2){ - state.checkList = res.data.answer.split(',') - } - }else{ - ElMessage.warning(res.message) - } - } - dialogVisible.value = true; -} - -const getBankList = async (val)=>{ - if(val != ""){ - const queryParams = { - name: val - } - const res = await getQuestionBank(queryParams) - if (res.code == 200) { - state.bankList = res.data.list - - } else { - ElMessage.warning(res.message) - } - }else { - const queryParams = { - pageNum: 1, - pageSize: 10 - } - const res = await getQuestionBank(queryParams) - if (res.code == 200) { - state.bankList = res.data.list - } else { - ElMessage.warning(res.message) - } - } -} - -const handleScroll = () => { - if(state.bankPageNum >= state.hasMoreItems) return - state.bankPageNum++; - loadMoreBankData() - -} -const loadMoreBankData = async () => { - const queryParams = { - pageNum: state.bankPageNum, - pageSize: state.bankPageSize, - } - const res = await getQuestionBank(queryParams) - if (res.code == 200) { - state.hasMoreItems = res.data.totalPage - const data = res.data - state.bankList = state.bankList.concat(data.list) - }else{ - ElMessage.warning(res.message) - } -} - - -const onSubmit = async () => { - console.log(" state.form", state.form) - const valid = await busRef.value.validate(); - if(valid){ - if(title.value === '新增'){ - const {id,bankName, ...data} = JSON.parse(JSON.stringify(state.form)) - data.answer = data.questionType === 1 || data.questionType === 3 || data.questionType === 4? data.answer : state.checkList.join(',') - if(data.questionType !== 4){ - const options = state.optionItem.items.map((op,index) => { - return { - prefix: String.fromCharCode(index + 65), - content: op.content, - } - }) - data.content = JSON.stringify( - { - analyze: state.optionItem.analyze, - items: options - } - ) - }else { - data.content = JSON.stringify( - { - analyze: state.optionItem.analyze, - }) - } - console.log('state.form',data) - const res = await addQuestion(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '新增成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - }else if(title.value === '编辑'){ - const {bankName,...data} = JSON.parse(JSON.stringify(state.form)) - data.answer = data.questionType === 1 || data.questionType === 3 || data.questionType === 4 ? data.answer : state.checkList.join(',') - if(data.questionType !== 4){ - const options = state.optionItem.items.map((op,index) => { - return { - prefix: String.fromCharCode(index + 65), - content: op.content, - } - }) - data.content = JSON.stringify( - { - analyze: state.optionItem.analyze, - items: options - } - ) - }else { - data.content = JSON.stringify( - { - analyze: state.optionItem.analyze, - }) - } - const res = await editQuestion(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '编辑成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - } - } -} -const changeType = () => { - state.optionItem = { - analyze: '', - items: [] - } - if(state.form.questionType === 3) { - state.optionItem.items = [ - { - prefix: 'A', - content: '是' - - }, - { - prefix: 'B', - content: '否' - } - ] - } - - -} -const handleClose = () => { - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - emit("getList") - -} -const reset = () => { - state.form = { - id: '', - title: '', - questionType: null, - bankName: '', - bankId: null, - answer: '' - } - state.optionItem = { - analyze: '', - items: [] - } - state.bankPageNum = 1; - state.bankPageSize = 10; - state.bankList = [] - state.checkList = [] -} -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } -} -</style> diff --git a/src/views/onlineEducation/questionBankManagement/questionManage/index.vue b/src/views/onlineEducation/questionBankManagement/questionManage/index.vue deleted file mode 100644 index 0d506f8..0000000 --- a/src/views/onlineEducation/questionBankManagement/questionManage/index.vue +++ /dev/null @@ -1,278 +0,0 @@ -<template> - <div class="app-container"> - <div> - <el-form :model="data.queryParams" ref="queryRef" :inline="true" > - <el-form-item> - <el-button - type="primary" - plain - icon="Plus" - @click="openDialog('add',{})" - >新增</el-button> - </el-form-item> - <el-form-item label="题型:"> - <el-select v-model="data.queryParams.questionType" placeholder="请选择题型" clearable> - <el-option - v-for="item in data.questionTypeList" - :key="item.id" - :label="item.name" - :value="item.id"> - </el-option> - </el-select> - </el-form-item> - <el-form-item label="题目内容:" > - <el-input - - v-model="data.queryParams.title" - placeholder="请输入题目内容" - clearable - style="width: 200px" - /> - </el-form-item> - <el-form-item label="题库:" > - <el-select - clearable - v-model="data.queryParams.bankId" - filterable - remote - reserve-keyword - placeholder="请输入题库名称" - remote-show-suffix - :remote-method="getBankList" - style="width: 200px" - > - <el-option - v-for="item in data.bankList" - :key="item.id" - :label="item.name" - :value="item.id" - /> - </el-select> -<!-- <el-select--> -<!-- clearable--> -<!-- v-model="data.queryParams.bankId"--> -<!-- style="width: 200px"--> -<!-- v-loadMoreNew:[reselect]="handleScroll"--> -<!-- :popper-class="reselect.name"--> -<!-- class="item-width"--> -<!-- placeholder="请选择题库"--> -<!-- >--> -<!-- <el-option--> -<!-- v-for="item in data.bankList"--> -<!-- :key="item.id"--> -<!-- :label="item.name"--> -<!-- :value="item.id"--> -<!-- />--> -<!-- </el-select>--> - </el-form-item> - <el-form-item> - <el-button type="primary" @click="handleQuery">查询</el-button> - <el-button @click="resetQuery">重置</el-button> - </el-form-item> - </el-form> - - </div> - <!-- 表格数据 --> - <el-table v-loading="loading" :data="data.dataList" :border="true"> - <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="所属题库" prop="bankName" align="center" /> - <el-table-column label="题目类型" prop="questionType" align="center" > - <template #default="scope"> - <span>{{scope.row.questionType === 1 ? '单选题' : scope.row.questionType === 2 ? '多选题' : scope.row.questionType === 3 ? '判断题': '简答题'}}</span> - </template> - </el-table-column> - <el-table-column label="题目内容" prop="title" align="center" /> - <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180"> - <template #default="scope"> - <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> - <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> - </template> - </el-table-column> - </el-table> - - <pagination - v-show="data.total > 0" - :total="data.total" - v-model:page="data.queryParams.pageNum" - v-model:limit="data.queryParams.pageSize" - @pagination="getList" - /> - - <question-dialog ref="dialogRef" @getList=getList></question-dialog> - </div> -</template> - -<script setup> -import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; -import {ElMessage, ElMessageBox} from "element-plus"; -import questionDialog from './components/questionDialog.vue' -import Cookies from "js-cookie"; -import {delQuestion, getQuestion} from "@/api/onlineEducation/question"; -import {getQuestionBank} from "@/api/onlineEducation/questionBank"; -import {getCompany} from "@/api/onlineEducation/company"; - - -const { proxy } = getCurrentInstance(); -const loading = ref(false); -const dialogRef = ref(); -const data = reactive({ - queryParams: { - pageNum: 1, - pageSize: 10, - questionType: null, - title: '', - bankId: null - }, - total: 0, - dataList: [], - isAdmin: false, - questionTypeList: [ - { - id: 1, - name: '单选题' - }, - { - id: 2, - name: '多选题' - }, - { - id: 3, - name: '判断题' - }, - // { - // id: 4, - // name: '简答题' - // } - ], - bankList: [], - bankPageNum: 1, // 当前页码 - bankPageSize: 10, // 每页显示的数量 - hasMoreItems: null, // 是否还有更多选项 - - -}) -const reselect = reactive({ - name: 'bank' -}) - -onMounted(async ()=>{ - const userInfo = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo) - if(userInfo.userType === 0){ - data.isAdmin = true; - }else { - data.isAdmin = false; - } - await getList() - await getBankList("") -}) - -onUnmounted(()=>{ - -}) - -const getList = async () => { - console.log(' list'); - loading.value = true - const res = await getQuestion(data.queryParams) - if(res.code == 200){ - data.dataList = res.data.list - data.total = res.data.total - }else{ - ElMessage.warning(res.message) - } - loading.value = false -} - -// const handleScroll = () => { -// -// if(data.bankPageNum >= data.hasMoreItems) return -// data.bankPageNum++; -// loadMoreBankData() -// -// } -// const loadMoreBankData = async () => { -// console.log(' Bank'); -// const queryParams = { -// pageNum: data.bankPageNum, -// pageSize: data.bankPageSize, -// } -// const res = await getQuestionBank(queryParams) -// if (res.code == 200) { -// data.hasMoreItems = res.data.totalPage -// const state = res.data -// data.bankList = data.bankList.concat(state.list) -// }else{ -// ElMessage.warning(res.message) -// } -// } -const getBankList = async (val)=>{ - if(val != ""){ - const queryParams = { - name: val - } - const res = await getQuestionBank(queryParams) - if (res.code == 200) { - data.bankList = res.data.list - - } else { - ElMessage.warning(res.message) - } - }else { - const queryParams = { - pageNum: 1, - pageSize: 10 - } - const res = await getQuestionBank(queryParams) - if (res.code == 200) { - data.bankList = res.data.list - } else { - ElMessage.warning(res.message) - } - } -} - -const handleQuery = () => { - data.queryParams.pageNum = 1; - getList(); -} -const resetQuery = () => { - data.queryParams = { - pageNum: 1, - pageSize: 10, - questionType: null, - title: '', - bankId: null - } - getList(); -} - -const openDialog = (type, value) => { - dialogRef.value.openDialog(type, value); -} - -/** 重置新增的表单以及其他数据 */ -function reset() { - proxy.resetForm("roleRef"); -} -const handleDelete = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await delQuestion(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }) -} - -</script> diff --git a/src/views/onlineEducation/systemManage/banner/components/bannerDialog.vue b/src/views/onlineEducation/systemManage/banner/components/bannerDialog.vue deleted file mode 100644 index 58310ba..0000000 --- a/src/views/onlineEducation/systemManage/banner/components/bannerDialog.vue +++ /dev/null @@ -1,240 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - :title="title" - width="550px" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="100px" > - <el-form-item label="标题:" prop="title" > - <el-input v-model.trim="state.form.title"></el-input> - </el-form-item> - <el-form-item prop="imgUrl" label="图片:"> - <el-upload accept="image/*" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" :limit='state.imgLimit' v-model:file-list="state.imgList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)" > - <el-icon><Plus /></el-icon> - <template #tip> - <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传1张</div> - </template> - </el-upload> - </el-form-item> - <el-form-item label="地址:" prop="webUrl"> - <el-input v-model.trim="state.form.webUrl"></el-input> - </el-form-item> - <el-form-item label="跳转方式:" prop="carouselTarget" > - <el-radio-group v-model="state.form.carouselTarget" > - <el-radio :label="0">新窗口打开</el-radio> - <el-radio :label="1">内部打开</el-radio> - </el-radio-group> - </el-form-item> -<!-- <el-form-item label="排序:" prop="sort" >--> -<!-- <el-input-number v-model="state.form.sort" />--> -<!-- </el-form-item>--> - <el-form-item label="状态" prop="status" > - <el-switch - v-model="state.form.status" - class="ml-2" - /> - </el-form-item> - </el-form> - <template #footer> - <span class="dialog-footer"> - <el-button @click="handleClose" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> - </span> - </template> - </el-dialog> - </div> -</template> -<script setup> -import {reactive, ref, toRefs} from 'vue' -import Editor from "@/components/Editor/index.vue"; -import {ElMessage} from "element-plus"; -import {addNotice} from "@/api/backManage/notice"; -import {addDict, editDict, getDictDetail} from "@/api/backManage/evaluate"; -import {addCompany, checkName, distributeCompany, editCompany} from "@/api/onlineEducation/company"; -import {verifyPhone} from "@/utils/validate"; -import {addBanner, delPic, editBanner, getBannerById} from "@/api/onlineEducation/banner"; -import {getToken} from "@/utils/auth"; -import {getUserById} from "@/api/onlineEducation/user"; - -const dialogVisible = ref(false); -const title = ref(""); -const busRef = ref(); -const length = ref() -const emit = defineEmits(["getList"]); -const startUsername = ref(''); -const startPhone = ref(''); -const state = reactive({ - form: { - id: '', - title: '', - imgUrl: '', - webUrl: '', - carouselTarget: 0, - // sort: 0, - status: true, - }, - formRules:{ - title: [{ required: true, message: '请输入广告标题', trigger: 'blur' }], - imgUrl: [{ required: true, message: '请上传图片', trigger: 'blur' }], - webUrl: [{ required: true, message: '请输入地址', trigger: 'blur' }], - }, - uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', - header: { - Authorization:getToken() - }, - imgLimit: 1, - imgList: [] -}) - -const handleAvatarSuccess = (res, uploadFile) => { - if(res.code == 200){ - state.form.imgUrl = res.data.path - }else{ - state.imgList = [] - ElMessage({ - type: 'warning', - message: '文件上传失败' - }) - } -} -const showTip =()=>{ - ElMessage({ - type: 'warning', - message: '超出文件上传数量' - }); -} -const picSize = async (rawFile) => { - if(rawFile.size / 1024 / 1024 > 5){ - ElMessage({ - type: 'warning', - message: '文件大小不能超过5M' - }); - return false - } -}; -const handleRemove = async (file, uploadFiles) => { - let path = state.form.imgUrl; - await delPic({path: path}).then(res => { - if(res.code == 200){ - // ElMessage({ - // type: 'success', - // message: '文件已删除' - // }) - state.form.imgUrl = '' - }else{ - ElMessage({ - type: 'warning', - message: res.message - }) - } - }).catch(() => { - state.form.imgUrl = '' - }); -} - -const openDialog = async (type, value) => { - length.value = value.listLength - title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '' ; - if(type === 'edit') { - const res = await getBannerById(value.id); - if(res.code === 200){ - state.form = res.data - console.log("11",res.data) - state.form.carouselTarget = parseInt(res.data.carouselTarget) - state.form.status = res.data.status == 0 - if(res.data.imgUrl) { - const obj = { - url: import.meta.env.VITE_APP_BASE_API + "/" + res.data.imgUrl, - name: '' - } - state.imgList = [obj] - } - console.log('imgList',state.imgList) - }else{ - ElMessage.warning(res.message) - } - - } - dialogVisible.value = true; -} - -const onSubmit = async () => { - const valid = await busRef.value.validate(); - if(valid){ - if(title.value === '新增'){ - const {id, ...data} = JSON.parse(JSON.stringify(state.form)) - data.status = data.status ? 0 : 1 - const res = await addBanner(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '新增成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - }else if(title.value === '编辑'){ - const {...data} = JSON.parse(JSON.stringify(state.form)) - data.status = data.status ? 0 : 1 - const res = await editBanner(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '编辑成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - } - } -} - -const handleClose = () => { - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - emit("getList") - -} -const reset = () => { - state.form = { - id: '', - title: '', - imgUrl: '', - webUrl: '', - carouselTarget: 0, - // sort: 0, - status: true, - } - state.imgList = [] -} -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } -} -</style> diff --git a/src/views/onlineEducation/systemManage/banner/components/newPage.vue b/src/views/onlineEducation/systemManage/banner/components/newPage.vue deleted file mode 100644 index d0ecd77..0000000 --- a/src/views/onlineEducation/systemManage/banner/components/newPage.vue +++ /dev/null @@ -1,20 +0,0 @@ -<template> - <div class="notice"> - <iframe name="bottom" :src="state.url" style="width: 100%; height: 850px;margin-top: 6px;border: lightgrey 1px solid"></iframe> - </div> -</template> -<script setup> -import {onMounted, reactive, ref, toRefs} from 'vue' -const route = useRoute(); -const state = reactive({ - url:'' -}) - -onMounted(()=>{ - state.url = route.query.url; -}) -</script> - -<style scoped lang="scss"> - -</style> diff --git a/src/views/onlineEducation/systemManage/banner/index.vue b/src/views/onlineEducation/systemManage/banner/index.vue deleted file mode 100644 index 2dc5f4b..0000000 --- a/src/views/onlineEducation/systemManage/banner/index.vue +++ /dev/null @@ -1,152 +0,0 @@ -<template> - <div class="app-container"> - <div style="margin-bottom: 10px"> - <el-button - type="primary" - plain - icon="Plus" - @click="openDialog('add',{})" - >新增</el-button> - </div> - <!-- 表格数据 --> - <el-table v-loading="loading" :data="dataList" :border="true"> - <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="标题" prop="title" align="center" /> - <el-table-column label="图片" prop="imgUrl" align="center" > - <template #default="scope"> - <div class="demo-image__preview" v-if="scope.row.imgUrl && scope.row.imgUrl.length>0"> - <el-image - style="width: 100px; height: 100px" - :src= "scope.row.imgUrl[0]" - :zoom-rate="1.2" - :max-scale="7" - :min-scale="0.2" - :preview-src-list="scope.row.imgUrl" - :initial-index="0" - fit="cover" - :preview-teleported=true - /> - </div> - </template> - </el-table-column> - <el-table-column label="地址" prop="webUrl" align="center" > - <template #default="scope"> - <span style="color:#1890ff; cursor: pointer" @click="openUrl(scope.row)">{{scope.row.webUrl}}</span> - </template> - </el-table-column> - <el-table-column label="跳转方式" prop="carouselTarget" align="center" > - <template #default="scope"> - <span>{{scope.row.carouselTarget == 0 ? '新窗口打开' : '内部打开' }}</span> - </template> - </el-table-column> -<!-- <el-table-column label="排序" prop="sort" align="center"/>--> - <el-table-column label="状态" prop="status" align="center" width="150"/> - <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > - <template #default="scope"> - <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> - <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> - </template> - </el-table-column> - </el-table> - - <pagination - v-show="total > 0" - :total="total" - v-model:page="queryParams.pageNum" - v-model:limit="queryParams.pageSize" - @pagination="getList" - /> - <banner-dialog ref="dialogRef" @getList=getList></banner-dialog> - </div> -</template> - -<script setup> -import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; -import {ElMessage, ElMessageBox} from "element-plus"; -import {delCompany, getCompany} from "@/api/onlineEducation/company"; -import bannerDialog from './components/bannerDialog.vue' -import {delBanner, getBanner} from "@/api/onlineEducation/banner"; -import router from "@/router"; -const { proxy } = getCurrentInstance(); -const loading = ref(false); -const dialogRef = ref(); -const data = reactive({ - queryParams: { - pageNum: 1, - pageSize: 10, - }, - total: 0, - dataList: [] -}); - -const { queryParams, total, dataList } = toRefs(data); - -onMounted(()=>{ - getList() -}) - -onUnmounted(()=>{ - -}) - -const getList = async () => { - loading.value = true - const res = await getBanner(data.queryParams) - if(res.code == 200){ - data.dataList = res.data.list.map(item => { - return { - ...item, - status: item.status === 0 ? '正常' : '停用', - imgUrl: item.imgUrl ?[import.meta.env.VITE_APP_BASE_API + "/" + item.imgUrl] : [] - } - }) - console.log("ddd",data.dataList) - data.total = res.data.total - }else{ - ElMessage.warning(res.message) - } - loading.value = false -} - -const openDialog = (type, value) => { - dialogRef.value.openDialog(type, value); -} - -/** 重置新增的表单以及其他数据 */ -function reset() { - proxy.resetForm("roleRef"); -} -const handleDelete = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await delBanner(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }) -} - -const openUrl = (val) => { - let fixedUrl = ''; - if(val.webUrl.indexOf("http") != -1){ - fixedUrl = val.webUrl - }else{ - fixedUrl = "http://" +val.webUrl; - } - if(val.carouselTarget == 0){ - window.open(fixedUrl, '_blank') - }else { - router.push({ path: "/newPage", query: { url: fixedUrl } }); - } -} -</script> diff --git a/src/views/onlineEducation/systemManage/company/components/companyDialog.vue b/src/views/onlineEducation/systemManage/company/components/companyDialog.vue deleted file mode 100644 index c42b43d..0000000 --- a/src/views/onlineEducation/systemManage/company/components/companyDialog.vue +++ /dev/null @@ -1,245 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - :title="title" - width="500px" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" > - <el-form-item label="企业信用代码:" prop="creditCode" v-if="title!=='分配课时'"> - <el-input v-model.trim="state.form.creditCode" placeholder="请输入企业信用代码"></el-input> - </el-form-item> - <el-form-item label="企业名称:" prop="name" v-if="title!=='分配课时'"> - <el-input v-model.trim="state.form.name" placeholder="请输入企业名称"></el-input> - </el-form-item> - <el-form-item label="负责人:" prop="major" v-if="title!=='分配课时'"> - <el-input v-model.trim="state.form.major" placeholder="请输入负责人"></el-input> - </el-form-item> - <el-form-item label="联系电话:" prop="phone" v-if="title!=='分配课时'"> - <el-input v-model.trim="state.form.phone" placeholder="请输入联系电话"></el-input> - </el-form-item> - <el-form-item label="当前剩余课时:" prop="remainPeriod" v-if="title!=='分配课时' && title==='编辑'"> - <el-input - placeholder="请输入剩余课时" - v-model.trim="state.form.remainPeriod" - @input="state.form.remainPeriod= state.form.remainPeriod.replace(/[^0-9]/g,'')"> - <template #append >分钟</template> - </el-input> - </el-form-item> -<!-- <el-form-item label="累计已用课时(秒):" prop="spendPeriod" v-if="title!=='分配课时'">--> -<!-- <el-input--> -<!-- placeholder="请输入已用课时"--> -<!-- v-model.trim="state.form.spendPeriod"--> -<!-- @input="state.form.spendPeriod= state.form.spendPeriod.replace(/[^0-9]/g,'')">--> -<!-- <template #append v-if="state.form.spendPeriod"><span>{{(state.form.spendPeriod /60).toFixed(2).replace(/\.00$/, '') + '分钟'}}</span></template>--> -<!-- </el-input>--> -<!-- </el-form-item>--> - <el-form-item label="总课时:" prop="totalPeriod"> - <el-input - :disabled="title === '编辑'" - placeholder="请输入总课时" - v-model.trim="state.form.totalPeriod" - maxlength="10" - @input="state.form.totalPeriod = state.form.totalPeriod.replace(/[^0-9]/g,'')"> - <template #append >分钟</template> - </el-input> - </el-form-item> - </el-form> - <template #footer> - <span class="dialog-footer"> - <el-button @click="handleClose" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> - </span> - </template> - </el-dialog> - </div> -</template> -<script setup> -import {reactive, ref, toRefs} from 'vue' -import Editor from "@/components/Editor/index.vue"; -import {ElMessage} from "element-plus"; -import {addNotice} from "@/api/backManage/notice"; -import {addDict, editDict, getDictDetail} from "@/api/backManage/evaluate"; -import {addCompany, checkName, distributeCompany, editCompany} from "@/api/onlineEducation/company"; -import {verifyPhone} from "@/utils/validate"; - -const dialogVisible = ref(false); -const title = ref(""); -const busRef = ref(); -const length = ref() -const emit = defineEmits(["getList"]); -const startUsername = ref(''); -const startPhone = ref(''); - -const validateName = (rule, value, callback)=>{ - if(value === ''){ - callback(new Error('请输入企业名称')) - }else if(title.value === '编辑' && value === startUsername.value){ - callback() - }else{ - let param = {} - if(title.value === '新增') { - param = { - name:value - } - }else if(title.value === '编辑'){ - param = { - name:value, - id: state.form.id - } - } - checkName(param).then((res)=>{ - if(res.data == false){ - callback(new Error('企业名称已被占用,请更换其他名称')) - }else{ - callback() - } - }) - } -} -const validatePhone = (rule, value, callback)=>{ - if(value === ''){ - callback(new Error('请输入手机号')) - }else if(title.value === '编辑' && value == startPhone.value){ - callback() - } else{ - if(!verifyPhone(value)){ - callback(new Error('手机号格式有误')) - }else { - callback() - } - } -} -const state = reactive({ - form: { - id: '', - creditCode: '', - name: '', - major: '', - phone: '', - remainPeriod: '', - spendPeriod: '', - totalPeriod: '' - }, - formRules:{ - creditCode: [{ required: true, message: '请输入企业信用代码', trigger: 'blur' }], - major:[{ required: true, message: '请输入负责人', trigger: 'blur' }], - remainPeriod:[{ required: true, message: '请输入剩余课时', trigger: 'blur' }], - spendPeriod:[{ required: true, message: '请输入已用课时', trigger: 'blur' }], - totalPeriod:[{ required: true, message: '请输入总课时', trigger: 'blur' }], - name: [{ required: true, trigger: "blur", validator: validateName }], - phone:[{ required: true, trigger: "blur", validator: validatePhone }], - }, -}) - - -const openDialog = async (type, value) => { - length.value = value.listLength - title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '分配课时' ; - if(type === 'edit' || type === 'distribute') { - state.form = JSON.parse(JSON.stringify(value)); - state.form.totalPeriod = value.totalPeriod / 60; - state.form.remainPeriod = value.remainPeriod/60; - startUsername.value = value.username - startPhone.value = value.phone - } - dialogVisible.value = true; -} - -const onSubmit = async () => { - const valid = await busRef.value.validate(); - if(valid){ - if(title.value === '新增'){ - const {id, ...data} = JSON.parse(JSON.stringify(state.form)) - data.totalPeriod = data.totalPeriod * 60 - data.remainPeriod = data.remainPeriod * 60 - const res = await addCompany(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '新增成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - }else if(title.value === '编辑'){ - const {...data} = JSON.parse(JSON.stringify(state.form)) - data.totalPeriod = data.totalPeriod * 60 - data.remainPeriod = data.remainPeriod * 60 - const res = await editCompany(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '编辑成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - }else if(title.value === '分配课时') { - const {creditCode,name,major,phone,remainPeriod,spendPeriod,...data} = JSON.parse(JSON.stringify(state.form)) - data.totalPeriod = data.totalPeriod * 60 - const res = await distributeCompany(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - } - } -} - -const handleClose = () => { - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - emit("getList") - -} -const reset = () => { - state.form = { - id: '', - creditCode: '', - name: '', - major: '', - phone: '', - remainPeriod: '', - spendPeriod: '', - totalPeriod: '' - } -} -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } -} -</style> diff --git a/src/views/onlineEducation/systemManage/company/index.vue b/src/views/onlineEducation/systemManage/company/index.vue deleted file mode 100644 index b3ef373..0000000 --- a/src/views/onlineEducation/systemManage/company/index.vue +++ /dev/null @@ -1,154 +0,0 @@ -<template> - <div class="app-container"> - <div style="display: flex;justify-content: space-between"> - <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" > - <el-form-item> - <el-button - type="primary" - plain - icon="Plus" - @click="openDialog('add',{})" - >新增</el-button> - </el-form-item> - <el-form-item label="企业名称:" > - <el-input v-model="data.queryParams.name" placeholder="请输入企业名称"></el-input> - </el-form-item> - <el-form-item > - <el-button - type="primary" - @click="getList" - >查询</el-button> - <el-button - type="primary" - plain - @click="reset" - >重置</el-button> - </el-form-item> - </el-form> - </div> - <!-- 表格数据 --> - <el-table v-loading="loading" :data="dataList" :border="true"> - <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="企业信用代码" prop="creditCode" align="center" /> - <el-table-column label="企业名称" prop="name" align="center" /> - <el-table-column label="负责人" prop="major" align="center" /> - <el-table-column label="联系电话" prop="phone" align="center"/> - <el-table-column label="当前剩余课时(分)" prop="remainPeriodMin" align="center" width="150" /> - <el-table-column label="累计已用课时(分)" prop="spendPeriodMin" align="center" width="150"> - <template #default="scope"> - <span>{{((scope.row.totalPeriod -scope.row.remainPeriod)/60).toFixed(2).replace(/\.00$/, '') + '分钟' }}</span> - </template> - </el-table-column> - <el-table-column label="总课时(分)" prop="totalPeriodMin" align="center"/> - <el-table-column label="课时变动详情" align="center" class-name="small-padding fixed-width" > - <template #default="scope"> - <el-button link type="primary" @click="openDetail(scope.row)">查看详情</el-button> - </template> - </el-table-column> - <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200" > - <template #default="scope"> - <el-button link type="primary" @click="openDialog('distribute',scope.row)">分配课时</el-button> - <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> - <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> - </template> - </el-table-column> - </el-table> - - <pagination - v-show="total > 0" - :total="total" - v-model:page="queryParams.pageNum" - v-model:limit="queryParams.pageSize" - @pagination="getList" - /> - - <company-dialog ref="dialogRef" @getList=getList></company-dialog> - <class-hour-change ref="classHourRef" @getList=getList></class-hour-change> - </div> -</template> - -<script setup> -import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; -import {ElMessage, ElMessageBox} from "element-plus"; -import {delCompany, getCompany} from "@/api/onlineEducation/company"; -import companyDialog from "./components/companyDialog.vue"; -import classHourChange from '@/views/onlineEducation/classHourBatch/components/classHourChange.vue' - -const { proxy } = getCurrentInstance(); -const loading = ref(false); -const dialogRef = ref(); -const data = reactive({ - queryParams: { - pageNum: 1, - pageSize: 10, - name: '' - }, - total: 0, - dataList: [] -}); - -const { queryParams, total, dataList } = toRefs(data); -const classHourRef = ref(); -onMounted(()=>{ - getList() -}) - -onUnmounted(()=>{ - -}) - -const getList = async () => { - loading.value = true - const res = await getCompany(data.queryParams) - if(res.code == 200){ - data.dataList = res.data.list.map(item => { - return{ - ...item, - remainPeriodMin: item.remainPeriod ?(item.remainPeriod /60).toFixed(2).replace(/\.00$/, '') + '分钟':'', - totalPeriodMin:item.totalPeriod ?(item.totalPeriod /60).toFixed(2).replace(/\.00$/, '') + '分钟':'', - } - }) - data.total = res.data.total - }else{ - ElMessage.warning(res.message) - } - loading.value = false -} - -const openDialog = (type, value) => { - dialogRef.value.openDialog(type, value); -} - -/** 重置新增的表单以及其他数据 */ -function reset() { - data.queryParams = { - pageNum: 1, - pageSize: 10, - name: '' - } - getList() -} -const handleDelete = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await delCompany(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }) -} - -const openDetail = (val) => { - classHourRef.value.openDialog(val.id) -} -</script> diff --git a/src/views/onlineEducation/systemManage/courseClassification/components/courseClassDialog.vue b/src/views/onlineEducation/systemManage/courseClassification/components/courseClassDialog.vue deleted file mode 100644 index 6f12434..0000000 --- a/src/views/onlineEducation/systemManage/courseClassification/components/courseClassDialog.vue +++ /dev/null @@ -1,189 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - :title="title" - width="500px" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" > - <el-form-item label="上级分类:" prop="name" v-if="!state.isFirst"> - <el-input v-model.trim="state.form.parentName" disabled></el-input> - </el-form-item> - <el-form-item label="名称:" prop="name"> - <el-input v-model.trim="state.form.name"></el-input> - </el-form-item> - <el-form-item label="排序:" prop="sort" > - <el-input-number v-model="state.form.sort" /> - </el-form-item> - <el-form-item label="状态" prop="status" > - <el-switch - v-model="state.form.status" - class="ml-2" - /> - </el-form-item> - </el-form> - <template #footer> - <span class="dialog-footer"> - <el-button @click="handleClose" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> - </span> - </template> - </el-dialog> - </div> -</template> -<script setup> -import {reactive, ref, toRefs} from 'vue' -import Editor from "@/components/Editor/index.vue"; -import {ElMessage} from "element-plus"; -import {addNotice} from "@/api/backManage/notice"; -import {addDict, editDict, getDictDetail} from "@/api/backManage/evaluate"; -import {addCompany, checkName, distributeCompany, editCompany} from "@/api/onlineEducation/company"; -import {verifyPhone} from "@/utils/validate"; -import {addClassification, checkClassName, editClassification} from "@/api/onlineEducation/courseClass"; - -const dialogVisible = ref(false); -const title = ref(""); -const busRef = ref(); -const length = ref() -const emit = defineEmits(["getList"]); -const startUsername = ref(''); - -const validateName = (rule, value, callback)=>{ - if(value === ''){ - callback(new Error('请输入课程分类名称')) - }else if(title.value === '编辑' && value === startUsername.value){ - callback() - }else{ - let param = {} - if(title.value === '新增') { - param = { - name:value - } - }else if(title.value === '编辑'){ - param = { - name:value, - id: state.form.id - } - } - checkClassName(param).then((res)=>{ - if(res.data == false){ - callback(new Error('课程分类名称已被占用,请更换其他名称')) - }else{ - callback() - } - }) - } -} -const state = reactive({ - form: { - id: '', - name: '', - parentName: '', - sort: 0, - parentId: null, - status: true - }, - formRules:{ - name: [{ required: true, trigger: "blur", validator: validateName }], - }, - isFirst: true -}) - -const openDialog = async (type, value) => { - length.value = value.listLength - title.value = type === 'addFirst' || type === 'add' ? '新增' : type ==='edit' ? '编辑' : '' ; - if(type === 'edit') { - state.isFirst = true; - state.form = value; - state.form.status = value.status == 0; - state.form.sort = value.sort; - state.form.parentId = value.parentId; - state.form.parentName = value.name; - startUsername.value = value.username; - }else if(type === 'add' && value ){ - state.isFirst = false; - state.form.parentId = value.id; - state.form.parentName = value.name; - }else { - state.isFirst = true; - } - dialogVisible.value = true; -} - -const onSubmit = async () => { - const valid = await busRef.value.validate(); - if(valid){ - if(title.value === '新增'){ - const {id, ...data} = JSON.parse(JSON.stringify(state.form)) - data.status = data.status ? 0 : 1 - const res = await addClassification(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '新增成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - }else if(title.value === '编辑'){ - const {...data} = JSON.parse(JSON.stringify(state.form)) - data.status = data.status ? 0 : 1 - const res = await editClassification(data) - if(res.code === 200){ - ElMessage({ - type: 'success', - message: '编辑成功' - }); - }else{ - ElMessage.warning(res.message) - } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - } - } -} - -const handleClose = () => { - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; - emit("getList") - -} -const reset = () => { - state.form = { - id: '', - name: '', - parentName: '', - sort: 0, - parentId: null, - status: true - } -} -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } -} -</style> diff --git a/src/views/onlineEducation/systemManage/courseClassification/index.vue b/src/views/onlineEducation/systemManage/courseClassification/index.vue deleted file mode 100644 index a3234ac..0000000 --- a/src/views/onlineEducation/systemManage/courseClassification/index.vue +++ /dev/null @@ -1,116 +0,0 @@ -<template> - <div class="app-container"> - <div> - <el-form style="display: flex;flex-wrap: wrap"> - <el-form-item> - <el-button type="primary" plain @click="openDialog('addFirst',{})" icon="Plus"> 添加</el-button> - </el-form-item> - </el-form> - </div> -<!-- <div style="margin-bottom: 10px">--> -<!-- <el-form>--> -<!-- <el-form-item label="分类名称">--> -<!-- <el-input style="width: 20%" v-model="data.queryParams.name "></el-input>--> -<!-- <el-button type="primary" style="margin-left: 30px" @click="getList">查询</el-button>--> -<!-- <el-button plain @click="reset">重置</el-button>--> -<!-- <el-button type="success" plain @click="openDialog('addFirst',{})">添加</el-button>--> -<!-- </el-form-item>--> - -<!-- </el-form>--> -<!-- </div>--> - <!-- 表格数据 --> - <el-table v-loading="loading" :data="dataList" :border="true" row-key="id"> - <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="名称" > - <template #default="scope"> - <span>{{scope.row.name}}</span> - </template> - </el-table-column> - <el-table-column label="排序" prop="sort" align="center" width="80" /> - <el-table-column label="状态" prop="status" align="center" width="80"> - <template #default="scope"> - <span>{{scope.row.status ==0 ? '正常' : '停用'}}</span> - </template> - </el-table-column> - <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="250" > - <template #default="scope"> - <el-button type="success" plain @click="openDialog('add',scope.row)">添加</el-button> - <el-button type="primary" plain @click="openDialog('edit',scope.row)">编辑</el-button> - <el-button type="danger" plain @click="handleDelete(scope.row.id)">删除</el-button> - </template> - </el-table-column> - </el-table> - <class-dialog ref="areaRef" @getList="getList"></class-dialog> - </div> -</template> - -<script setup> -import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue"; -import {ElMessage, ElMessageBox} from "element-plus"; -import classDialog from "./components/courseClassDialog.vue" -import {delArea, getArea} from "@/api/backManage/area"; -import {getDictList} from "@/api/backManage/evaluate"; -import {delMonitor} from "@/api/sysUsers"; -import {delClassification, getClassification} from "@/api/onlineEducation/courseClass"; -const { proxy } = getCurrentInstance(); -const loading = ref(false); -const areaRef = ref(); -const cityList = ref([]) -const data = reactive({ - queryParams: { - name: '', - }, - total: 0, - dataList: [ - ] -}); - -const { queryParams, total, dataList } = toRefs(data); - -//页面加载 -onMounted(() => { - getList(); -}); -const getList = async () => { - loading.value = true; - const res = await getClassification(data.queryParams); - if(res.code === 200){ - dataList.value = res.data - }else{ - ElMessage.warning(res.message) - } - loading.value = false; -} - -const openDialog = (type, value) => { - areaRef.value.openDialog(type, value); -} - -/** 重置新增的表单以及其他数据 */ -function reset() { - data.queryParams.name = ''; - data.queryParams.pageNum = 1; - getList(); -} -const handleDelete = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await delClassification(val) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }) -} - - -</script> diff --git a/src/views/onlineEducation/systemManage/user/components/userDialog.vue b/src/views/onlineEducation/systemManage/user/components/userDialog.vue deleted file mode 100644 index 8e3c00f..0000000 --- a/src/views/onlineEducation/systemManage/user/components/userDialog.vue +++ /dev/null @@ -1,560 +0,0 @@ -<template> - <div class="notice"> - <el-dialog - v-model="dialogVisible" - :title="state.title" - width="700px" - :before-close="handleClose" - :close-on-press-escape="false" - :close-on-click-modal="false" - > - <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" > - <el-form-item label="用户名:" prop="username" v-if="state.title !== '修改密码'"> - <el-input v-model.trim="state.form.username" :disabled="state.title =='编辑' || state.title =='查看'" placeholder="请输入用户名" ></el-input> - </el-form-item> - <el-form-item label="名称:" prop="name" v-if="state.title !== '修改密码'"> - <el-input v-model.trim="state.form.name" :disabled="disabled" placeholder="请输入公司、部门或者车间岗位名"></el-input> - </el-form-item> - <el-form-item label="性别:" prop="sex" v-if="state.title !== '修改密码'"> - <el-radio-group v-model="state.form.sex" :disabled="disabled"> - <el-radio :label="0">男</el-radio> - <el-radio :label="1">女</el-radio> - </el-radio-group> - </el-form-item> - <el-form-item label="密码:" prop="password" v-if="state.title == '新增' || state.title == '修改密码'"> - <el-input v-model.trim="state.form.password" type="password" show-password placeholder="请输入密码"></el-input> - </el-form-item> - <el-form-item label="重复密码:" prop="confirmPassword" v-if="state.title == '新增' || state.title == '修改密码'"> - <el-input v-model.trim="state.form.confirmPassword" type="password" show-password placeholder="请输入确认密码"></el-input> - </el-form-item> - <el-form-item label="手机号:" prop="phone" v-if="state.title !== '修改密码'" > - <el-input v-model.trim="state.form.phone" :maxlength="11" :disabled="disabled" placeholder="请输入手机号"></el-input> - </el-form-item> - <el-form-item label="用户类型:" v-if="state.title !== '修改密码'" prop="userType"> - <el-radio-group v-model="state.form.userType" :disabled="disabled" @change="changeType" v-if="state.title == '新增'"> - <el-radio :label="0" v-if="state.currentUserType == 0">管理员</el-radio> - <el-radio :label="1" v-if="state.currentUserType == 0 ">企业级</el-radio> - <el-radio :label="2" v-if="state.currentUserType == 1 ">部门级</el-radio> - <el-radio :label="3" v-if="!state.isAdmin">车间(岗位)级</el-radio> - <el-radio :label="4" v-if="state.currentUserType == 0">其他</el-radio> - </el-radio-group> - <span v-else-if="state.title == '查看'">{{state.currentUserType === 0 ? '管理员' : state.currentUserType === 1 ? '企业级' : state.currentUserType === 2 ? '部门级' : state.currentUserType === 3 ? '车间级' :'其他'}}</span> - <span v-else-if="state.title == '编辑'">{{state.form.userType === 0 ? '管理员' : state.form.userType === 1 ? '企业级' : state.form.userType === 2 ? '部门级' : state.form.userType === 3 ? '车间级' :'其他'}}</span> - <!-- <el-radio-group v-model="state.form.userType" :disabled="disabled" @change="changeType" v-else-if="state.title == '编辑'">--> -<!-- <el-radio :label="0" v-if="state.currentUserType == 0">管理员</el-radio>--> -<!-- <el-radio :label="1" >企业级</el-radio>--> -<!-- <el-radio :label="2" >部门级</el-radio>--> -<!-- <el-radio :label="3" >车间(岗位)级</el-radio>--> -<!-- <el-radio :label="4" >其他</el-radio>--> -<!-- </el-radio-group>--> - </el-form-item> - <el-form-item label="所属企业:" prop="companyName" v-if="state.title !== '修改密码' && showCompany"> - <el-select - clearable - v-if="state.isAdmin" - v-model="state.form.companyName" - filterable - :disabled="disabled || state.title =='编辑'" - remote - @change="selectValue" - reserve-keyword - placeholder="请输入企业名称" - remote-show-suffix - :remote-method="getCompanyList" - :loading="loading" - style="width: 240px" - > - <el-option - v-for="item in state.companyList" - :key="item.id" - :label="item.name" - :value="item.name" - /> - </el-select> - <el-input v-else disabled style="width: 45%" v-model="state.form.companyName"></el-input> -<!-- <el-select--> -<!-- v-if="state.isAdmin"--> -<!-- v-model="state.form.companyName"--> -<!-- @change="selectValue"--> -<!-- style="width: 45%"--> -<!-- v-loadMore="loadMore"--> -<!-- class="m-2"--> -<!-- placeholder="请选择所属企业"--> -<!-- popper-class="more_select_dropdown"--> -<!-- >--> -<!-- <el-option--> -<!-- v-for="item in state.companyList"--> -<!-- :key="item.id"--> -<!-- :label="item.name"--> -<!-- :value="item.name"--> -<!-- />--> -<!-- </el-select>--> - - - </el-form-item> - <el-form-item label="所属上级账号:" prop="companyName" v-if="showChild"> - <scorllSelect - :disabled="disabled || state.title =='编辑'" - ref="scrollRef" - v-model="state.form.parentName" - @getval = "getSelectUser" - placeholder="请选择" - clearable - style="width: 45%;" - filterable - remote - searchKey="username" - :methods="getUser"> - </scorllSelect> - </el-form-item> - </el-form> - <template #footer v-if="state.title !='查看'"> - <span class="dialog-footer"> - <el-button @click="handleClose" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> - </span> - </template> - </el-dialog> - </div> -</template> -<script setup> -import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue' -import { View } from "@element-plus/icons-vue"; -import scorllSelect from '@/components/scrollSelect/index.vue' -import {ElMessage} from "element-plus"; -import {verifyPhone, verifyPwd, verifyUsername} from "@/utils/validate"; -import { checkUserName, checkPhone } from "@/api/login" -import {addUser, editUser, getUserById, resetPwd} from "@/api/onlineEducation/user" -import {Base64} from "js-base64" -import {getCompany} from "@/api/onlineEducation/company"; -import {get} from "@vueuse/core"; -import {getUser} from "@/api/onlineEducation/user"; -import {debounce} from "@/utils"; -import Cookies from "js-cookie"; - -const emit = defineEmits(["getList"]); -const dialogVisible = ref(false) -const superRef = ref(null) -const scrollRef = ref(null) - - -const equalToPassword = (rule, value, callback) => { - if (state.form.password !== value) { - callback(new Error("两次输入的密码不一致")); - } else { - callback(); - } -}; - -const validateUserPhone = (rule, value, callback)=>{ - if(value === ''){ - callback(new Error('请输入手机号')) - }else{ - if(!verifyPhone(value)){ - callback(new Error('手机号格式有误')) - }else{ - callback() - } - } -} - -let validatePwd = (rule, value, callback)=>{ - if(value === ''){ - callback(new Error('请输入密码')) - }else{ - if(!verifyPwd(value)){ - callback(new Error('密码须包含字母、数字、特殊字符,长度在6-16之间')) - }else{ - callback() - } - } -} -const startUsername = ref(''); -const validateUsername = (rule, value, callback)=>{ - if(value === ''){ - callback(new Error('请输入用户名')) - }else if(state.title == '编辑' && value == startUsername.value){ - callback() - }else{ - if(!verifyUsername(value)){ - callback(new Error('用户名须使用字母或数字,长度在5-16之间')) - }else{ - let param = {} - if(state.title=='新增/注册') { - param = { - username:value - } - }else if(state.title=='编辑'){ - param = { - username:value, - id: state.registerForm.id - } - } - callback() - // checkUserName(param).then((res)=>{ - // if(res.data == false){ - // callback(new Error('用户名已被占用,请更换其他用户名')) - // }else{ - // callback() - // } - // }) - } - } -} - -const state = reactive({ - title: '', - form: { - id: null, - name: '', - phone: '', - password: '', - confirmPassword: '', - username: '', - userType: null, - sex: 0, - companyId: null, - parentId: null - }, - formRules:{ - name: [{ required: true, message: '请输入公司、部门或者车间岗位名称', trigger: 'blur' }], - companyName: [{ required: true, message: '请选择上级企业', trigger: 'blur' }], - username: [{ required: true, trigger: "blur", validator: validateUsername }], - password: [{ required: true, validator: validatePwd, trigger: 'blur' }], - confirmPassword: [{ required: true, validator: equalToPassword, trigger: 'blur' }], - phone: [{ required: true, validator: validateUserPhone, trigger: 'blur' }], - userType: [{ required: true, message: '请选择用户类型', trigger: 'blur' }], - }, - companyList: [], - userList: [ - - ], - keyword:'', - - pageNum: 1, - pageSize: 10, - cloading:false, - totlePage: 0, - userParam: {}, - isAdmin: false, - currentUserType: null - -}) -const UisMounted = ref(false); -onMounted(() => { - UisMounted.value = true; - -}); -const showCompany = ref(false) -const showChild = ref(false) -const disabled = ref(false); -const userInfo = ref() -const openDialog = async (type, value) => { - userInfo.value = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo.value) - state.currentUserType = userInfo.value.userType - if(state.currentUserType === 0){ - state.isAdmin = true; - }else { - state.isAdmin = false; - state.form.companyId = userInfo.value.companyId; - state.form.companyName = userInfo.value.companyName; - } - - if(type !== 'view' && type !== 'pwd'){ - // if(state.isAdmin){ - // await getCompanyList("") - // } - } - state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : type ==='pwd' ? '修改密码' : '查看' ; - if(type === 'edit' || type === 'view') { - startUsername.value = value.username - if( type === 'view'){ - disabled.value = true; - } - const res = await getUserById(value.id); - if(res.code === 200){ - state.form = res.data - if(res.data.userType === 3){ - showCompany.value = true; - showChild.value = true - }else if(res.data.userType === 2 || res.data.userType === 1 || res.data.userType === 4){ - showCompany.value = true; - showChild.value = false; - } - if(res.data.userType === 3){ - if(!res.data.parentId){ - state.form.parentId = '' - state.form.parentName = '无上级账号' - } - } - } - } - if(type == 'pwd'){ - state.form.id = value.id - } - dialogVisible.value = true - if(type === 'edit' && state.form && (state.form.userType === 2||state.form.userType === 3)){ - await nextTick(() => { - // doGetUser() - }) - } -} - -const finshed = ref(false) -const loading = ref(false) - -const getCompanyList = async (val)=>{ - if(val != ""){ - loading.value = true; - const queryParams = { - name: val - } - const res = await getCompany(queryParams) - if (res.code == 200) { - loading.value = false; - state.companyList = res.data.list - - } else { - ElMessage.warning(res.message) - } - }else { - loading.value = true; - const queryParams = { - pageNum: 1, - pageSize: 10 - } - const res = await getCompany(queryParams) - if (res.code == 200) { - loading.value = false; - state.companyList = res.data.list - - } else { - ElMessage.warning(res.message) - } - } - - // if (type === 'open' && state.pageNum !== 1) { - // } else { - // const queryParams = { - // pageNum: state.pageNum, - // pageSize: state.pageSize, - // } - // const res = await getCompany(queryParams) - // if (res.code == 200) { - // if (res.data.pageNum === state.pageNum) { - // finshed.value = false; - // if (state.pageNum == 1) { - // state.companyList = res.data.list - // } else { - // state.companyList = state.companyList.concat(res.data.list) - // } - // } else { - // finshed.value = true; - // } - // - // } else { - // ElMessage.warning(res.message) - // } - // console.log("state.companyList",state.companyList) - // } -} -const onSubmit = async () => { - const valid = await superRef.value.validate(); - if(valid){ - if((state.form.userType ===1 && state.form.companyId ===null) || ((state.form.userType ===2 ||state.form.userType ===3) && (state.form.parentId ===null ||state.form.companyId===null))){ - ElMessage.warning('请选择所属父级账号') - return; - } - if(state.title == '新增'){ - const {confirmPassword,id,...data} = state.form - data.password = Base64.encode(data.password) - const res = await addUser(data) - if(res.code == 200){ - ElMessage.success(res.message) - emit('getList') - handleClose() - dialogVisible.value = false; - }else{ - ElMessage.warning(res.message) - } - }else if(state.title == '编辑'){ - const {confirmPassword,...data} = state.form - data.password = Base64.encode(data.password) - const param = { - name: data.name, - sex:data.sex, - phone: data.phone, - id:data.id, - companyId: data.companyId, - userType:data.userType, - username:data.username, - password: data.password, - parentId: data.parentId - - } - - const res = await editUser(param) - if(res.code == 200){ - ElMessage.success(res.message) - emit('getList') - handleClose() - }else{ - ElMessage.warning(res.message) - } - }else{ - const {id,password} = state.form - const data = {id,password} - data.password = Base64.encode(data.password) - const res = await resetPwd(data) - if(res.code == 200){ - ElMessage.success(res.message) - emit('getList') - handleClose() - }else{ - ElMessage.warning(res.message) - } - } - } -} -const doGetUser = () => { - const param = { - userType: state.form.userType-1, - companyId: state.form.companyId, - } - scrollRef.value.getList(param,'change'); -} -const changeType = async (val) => { - state.companyList = []; - if(state.isAdmin && val !=0){ - await getCompanyList("") - } - state.form.parentId = null; - state.form.parentName = ''; - state.form.companyId = null; - state.form.companyName = ''; - //当前是管理员级用户 - if(state.currentUserType === 0){ - if(state.form.userType === 0){ - showCompany.value = false; - showChild.value = false; - }else { - showCompany.value = true; - showChild.value = false; - } - } - //当前是企业级/其他用户选择部门 - if((state.currentUserType === 1 && state.form.userType === 2) || (state.currentUserType === 4 && state.form.userType === 2)){ - state.form.parentId = userInfo.value.id; - state.form.companyName = userInfo.value.companyName - state.form.companyId = userInfo.value.companyId; - showChild.value = false; - showCompany.value = true; - - } //当前是企业级/其他用户选择车间 - else if((state.currentUserType === 1 && state.form.userType === 3) || (state.currentUserType === 4 && state.form.userType === 3)){ - state.form.companyName = userInfo.value.companyName - state.form.companyId = userInfo.value.companyId; - showCompany.value = true; - showChild.value = true; - const param = { - userType: 2, - companyId: state.form.companyId, - } - nextTick(() => { - scrollRef.value.getList(param,'change'); - }) - } - //当前是部门级选择车间 - if((state.currentUserType === 2 && state.form.userType === 3)){ - state.form.parentId = userInfo.value.id; - state.form.companyName = userInfo.value.companyName - state.form.companyId = userInfo.value.companyId; - showCompany.value = true; - showChild.value = false; - } - // if(state.isAdmin){ - // state.form.companyId = null; - // state.form.companyName = ''; - // } - // state.form.parentId = null; - // state.form.parentName = ''; - // if(state.form.userType === 2 || state.form.userType === 3 ){ - // const param = { - // userType: state.form.userType-1, - // companyId: state.form.companyId, - // } - // scrollRef.value.getList(param,'change'); - // } -} - -const handleClose = () => { - state.form = { - id: null, - name: '', - phone: '', - password: '', - confirmPassword: '', - username: '', - userType: null, - sex: 0, - companyId: null, - parentId: null - } - showCompany.value = false; - showChild.value = false; - state.userList = []; - state.companyList = []; - state.pageNum = 1; - state.pageSize = 10; - superRef.value.clearValidate(); - superRef.value.resetFields() - dialogVisible.value = false; -} -// //触底函数 -// const loadMore = () => { -// console.log(' 触底了'); -// // 防抖处理 -// setTimeout(() => { -// if (finshed.value) return //值为true,则代表没有数据了 -// state.pageNum += 1 -// getCompanyList('') -// }, 500) -// } - -const selectValue = (val) => { - state.form.parentId = null; - state.form.parentName = null; - state.companyList.forEach(item => { - if(item.name === val){ - state.form.companyId = item.id - } - }) -} -const getSelectUser = (val) => { - console.log("valllllllll",val) - state.form.parentId = val; -} - - - - - -defineExpose({ - openDialog -}); - -</script> - -<style scoped lang="scss"> -.notice{ - :deep(.el-form .el-form-item__label) { - font-size: 15px; - } - .file { - display: flex; - flex-direction: column; - align-items: flex-start; - } -} -</style> diff --git a/src/views/onlineEducation/systemManage/user/index.vue b/src/views/onlineEducation/systemManage/user/index.vue deleted file mode 100644 index 4bc7af5..0000000 --- a/src/views/onlineEducation/systemManage/user/index.vue +++ /dev/null @@ -1,179 +0,0 @@ -<template> - <div class="app-container"> - <div style="display: flex;justify-content: space-between"> - <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" > - <el-form-item> - <el-button - type="primary" - plain - icon="Plus" - @click="openDialog('add',{})" - >新增</el-button> - </el-form-item> - <el-form-item label="用户名:" > - <el-input v-model="data.queryParams.username" placeholder="请输入用户名"></el-input> - </el-form-item> - <el-form-item label="用户类型:" > - <el-select v-model="data.queryParams.userType" placeholder="请选择" clearable> - <el-option - v-for="item in data.userTypeList" - :key="item.id" - :label="item.name" - :value="item.id"> - </el-option> - </el-select> - </el-form-item> - <el-form-item > - <el-button - type="primary" - @click="getList" - >查询</el-button> - <el-button - type="primary" - plain - @click="reset" - >重置</el-button> - </el-form-item> - </el-form> - </div> - <!-- 表格数据 --> - <el-table v-loading="loading" :data="dataList" :border="true"> - <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="用户名" prop="username" align="center" /> - <el-table-column label="名称" prop="name" align="center" /> - <el-table-column label="手机号" prop="phone" align="center"/> - <el-table-column label="用户类型" prop="userTypeName" align="center" width="150" /> - <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > - <template #default="scope"> - <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> - <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> - <el-button link type="primary" @click="openDialog('pwd',scope.row)">修改密码</el-button> - </template> - </el-table-column> - </el-table> - - <pagination - v-show="total > 0" - :total="total" - v-model:page="queryParams.pageNum" - v-model:limit="queryParams.pageSize" - @pagination="getList" - /> - - <user-dialog ref="dialogRef" @getList=getList></user-dialog> - </div> -</template> - -<script setup> -import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; -import {ElMessage, ElMessageBox} from "element-plus"; -import {delCompany, getCompany} from "@/api/onlineEducation/company"; -import userDialog from './components/userDialog.vue' -import {delUser, getUser} from "@/api/onlineEducation/user"; -import Cookies from "js-cookie"; - - -const { proxy } = getCurrentInstance(); -const loading = ref(false); -const dialogRef = ref(); -const data = reactive({ - queryParams: { - pageNum: 1, - pageSize: 10, - username: '', - userType: null - }, - total: 0, - dataList: [], - userTypeList: [ - { - id: 0, - name: '管理员' - }, - { - id: 1, - name: '企业级' - }, - { - id: 2, - name: '部门级' - }, - { - id: 3, - name: '车间(岗位)级别' - }, - { - id: 4, - name: '其他' - }, - ] - -}); - -const { queryParams, total, dataList } = toRefs(data); -const userInfo = ref() -onMounted(()=>{ - userInfo.value = JSON.parse(Cookies.get('userInfo')) - getList() -}) - -onUnmounted(()=>{ - -}) - -const getList = async () => { - loading.value = true - const res = await getUser(data.queryParams) - if(res.code == 200){ - data.dataList = res.data.list.map(item => { - return { - ...item, - userTypeName: item.userType === 0 ? '管理员' : item.userType === 1 ? '企业级' : item.userType === 2 ? '部门级' : item.userType === 3 ? '车间级' :'其他' - } - }) - data.total = res.data.total - }else{ - ElMessage.warning(res.message) - } - loading.value = false -} - -const openDialog = (type, value) => { - if(userInfo.value.userType === 3){ - ElMessage.warning('车间级用户不能新增') - return; - } - dialogRef.value.openDialog(type, value); -} - -/** 重置新增的表单以及其他数据 */ -function reset() { - data.queryParams = { - pageNum: 1, - pageSize: 10, - username: '', - userType: null - } - getList() -} -const handleDelete = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await delUser(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }) -} - -</script> diff --git a/src/views/work/onlineEducation/classHourBatch/components/chooseStudent.vue b/src/views/work/onlineEducation/classHourBatch/components/chooseStudent.vue index 8d097ba..79233da 100644 --- a/src/views/work/onlineEducation/classHourBatch/components/chooseStudent.vue +++ b/src/views/work/onlineEducation/classHourBatch/components/chooseStudent.vue @@ -47,7 +47,7 @@ > <el-table-column type="selection" :reserve-selection="true" width="55" align="center" :selectable="selectable" /> <!-- <el-table-column label="序号" type="index" align="center" width="80" />--> - <el-table-column label="工号" prop="empno" align="center" width="60" /> +<!-- <el-table-column label="工号" prop="empno" align="center" width="60" />--> <el-table-column label="姓名" prop="name" align="center" /> <el-table-column label="性别" prop="sex" align="center" > <template #default="scope"> @@ -57,7 +57,7 @@ <el-table-column label="手机号" prop="phone" align="center" width="130"/> <el-table-column label="身份证" prop="idNo" align="center" width="200" :show-overflow-tooltip="true"/> <!-- <el-table-column label="创建人" prop="createBy" align="center"/>--> - <el-table-column label="工作岗位" prop="post" align="center"/> +<!-- <el-table-column label="工作岗位" prop="post" align="center"/>--> <el-table-column label="职务" prop="duty" align="center"/> <!-- <el-table-column label="一人一档" prop="duty" align="center" width="120">--> <!-- <template #default="scope">--> diff --git a/src/views/work/onlineEducation/classHourBatch/index.vue b/src/views/work/onlineEducation/classHourBatch/index.vue index d264e80..301884b 100644 --- a/src/views/work/onlineEducation/classHourBatch/index.vue +++ b/src/views/work/onlineEducation/classHourBatch/index.vue @@ -59,7 +59,7 @@ <el-table-column label="完成率" prop="finishRate" align="center" /> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180"> <template #default="scope"> - <el-button link type="primary" @click="toStuChoose(scope.row)">学生数据</el-button> + <el-button link type="primary" @click="toStuChoose(scope.row)">人员数据</el-button> <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> </template> diff --git a/src/views/work/onlineEducation/groupExams/components/examChooseStudent.vue b/src/views/work/onlineEducation/groupExams/components/examChooseStudent.vue index 76ae610..1935394 100644 --- a/src/views/work/onlineEducation/groupExams/components/examChooseStudent.vue +++ b/src/views/work/onlineEducation/groupExams/components/examChooseStudent.vue @@ -67,7 +67,7 @@ > <el-table-column type="selection" :reserve-selection="true" width="55" align="center" /> <!-- <el-table-column label="序号" type="index" align="center" width="80" />--> - <el-table-column label="工号" prop="empno" align="center" width="60" /> +<!-- <el-table-column label="工号" prop="empno" align="center" width="60" />--> <el-table-column label="姓名" prop="name" align="center" /> <el-table-column label="性别" prop="sex" align="center" > <template #default="scope"> @@ -77,7 +77,7 @@ <el-table-column label="手机号" prop="phone" align="center" width="130"/> <el-table-column label="身份证" prop="idNo" align="center" width="200" :show-overflow-tooltip="true"/> <!-- <el-table-column label="创建人" prop="createBy" align="center"/>--> - <el-table-column label="工作岗位" prop="post" align="center"/> +<!-- <el-table-column label="工作岗位" prop="post" align="center"/>--> <el-table-column label="职务" prop="duty" align="center"/> <!-- <el-table-column label="一人一档" prop="duty" align="center" width="120">--> <!-- <template #default="scope">--> diff --git a/src/views/work/onlineEducation/groupExams/components/examDialog.vue b/src/views/work/onlineEducation/groupExams/components/examDialog.vue index 8af519d..2ad1634 100644 --- a/src/views/work/onlineEducation/groupExams/components/examDialog.vue +++ b/src/views/work/onlineEducation/groupExams/components/examDialog.vue @@ -329,7 +329,7 @@ getQuestionBank } from "@/api/onlineEducation/questionBank"; import {addExam, checkExamName, editExam, getExamStudent, getPaper} from "@/api/onlineEducation/exam"; -import Student from "@/views/onlineEducation/groupExams/components/student.vue"; +import Student from "@/views/work/onlineEducation/groupExams/components/student.vue"; const dialogVisible = ref(false); const title = ref(""); diff --git a/src/views/work/onlineEducation/groupExams/components/student.vue b/src/views/work/onlineEducation/groupExams/components/student.vue index e44bda8..02b7973 100644 --- a/src/views/work/onlineEducation/groupExams/components/student.vue +++ b/src/views/work/onlineEducation/groupExams/components/student.vue @@ -118,7 +118,7 @@ import {batchDelStudent, delBatchStu, getBatchStudent} from "@/api/onlineEducation/batch"; import {useRoute, useRouter} from 'vue-router' import {delExamStu, examDelStudent, getExamStudent} from "@/api/onlineEducation/exam"; -import ExamChooseStudent from "@/views/onlineEducation/groupExams/components/examChooseStudent.vue"; +import ExamChooseStudent from "@/views/work/onlineEducation/groupExams/components/examChooseStudent.vue"; const route = useRoute() const router = useRouter(); diff --git a/src/views/work/onlineEducation/groupExams/index.vue b/src/views/work/onlineEducation/groupExams/index.vue index 96c9c6b..38fd8ca 100644 --- a/src/views/work/onlineEducation/groupExams/index.vue +++ b/src/views/work/onlineEducation/groupExams/index.vue @@ -76,7 +76,7 @@ <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="260"> <template #default="scope"> <el-button link type="primary" @click="viewQuestion(scope.row)">预览</el-button> - <el-button link type="primary" @click="toStuChoose(scope.row)">学生数据</el-button> + <el-button link type="primary" @click="toStuChoose(scope.row)">人员数据</el-button> <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> </template> diff --git a/src/views/work/onlineEducation/people/components/stuDialog.vue b/src/views/work/onlineEducation/people/components/stuDialog.vue index 2b87294..e2680ad 100644 --- a/src/views/work/onlineEducation/people/components/stuDialog.vue +++ b/src/views/work/onlineEducation/people/components/stuDialog.vue @@ -69,12 +69,12 @@ /> </el-select> </el-form-item> - <el-form-item label="工号:" prop="empno" v-if="state.title !== '修改密码'"> - <el-input v-model.trim="state.form.empno" :disabled="disabled" placeholder="请输入工号" ></el-input> - </el-form-item> - <el-form-item label="岗位:" prop="post" v-if="state.title !== '修改密码'"> - <el-input v-model.trim="state.form.post" :disabled="disabled" placeholder="请输入岗位" ></el-input> - </el-form-item> +<!-- <el-form-item label="工号:" prop="empno" v-if="state.title !== '修改密码'">--> +<!-- <el-input v-model.trim="state.form.empno" :disabled="disabled" placeholder="请输入工号" ></el-input>--> +<!-- </el-form-item>--> +<!-- <el-form-item label="岗位:" prop="post" v-if="state.title !== '修改密码'">--> +<!-- <el-input v-model.trim="state.form.post" :disabled="disabled" placeholder="请输入岗位" ></el-input>--> +<!-- </el-form-item>--> <el-form-item label="职务:" prop="duty" v-if="state.title !== '修改密码'"> <el-input v-model.trim="state.form.duty" :disabled="disabled" placeholder="请输入职务" ></el-input> </el-form-item> @@ -159,7 +159,8 @@ } let validateIdNo = (rule, value, callback)=>{ if(value === ''){ - callback(new Error('请输入身份证号')) + // callback(new Error('请输入身份证号')) + callback() }else if(state.title === '编辑' && value === startIdNo.value){ callback() }else{ @@ -245,7 +246,7 @@ password: [{ required: true, validator: validatePwd, trigger: 'blur' }], confirmPassword: [{ required: true, validator: equalToPassword, trigger: 'blur' }], phone: [{ required: true, validator: validateUserPhone, trigger: 'blur' }], - idNo: [{ required: true, validator: validateIdNo, trigger: 'blur' }], + idNo: [{ validator: validateIdNo, trigger: 'blur' }], // createBy: [{ required: true, message: '请输入所属部门名称', trigger: 'blur' }], }, diff --git a/src/views/work/onlineEducation/people/index.vue b/src/views/work/onlineEducation/people/index.vue index c48a4a1..f1b1971 100644 --- a/src/views/work/onlineEducation/people/index.vue +++ b/src/views/work/onlineEducation/people/index.vue @@ -29,7 +29,7 @@ <!-- 表格数据 --> <el-table v-loading="loading" :data="dataList" :border="true"> <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="工号" prop="empno" align="center" /> +<!-- <el-table-column label="工号" prop="empno" align="center" />--> <el-table-column label="姓名" prop="name" align="center" /> <el-table-column label="性别" prop="sex" align="center" > <template #default="scope"> @@ -43,7 +43,8 @@ <!-- <span>{{scope.row.createUser.name}}</span>--> <!-- </template>--> <!-- </el-table-column>--> - <el-table-column label="工作岗位" prop="post" align="center"/> +<!-- <el-table-column label="工作岗位" prop="post" align="center"/>--> + <el-table-column label="部门" prop="deptName" align="center"/> <el-table-column label="职务" prop="duty" align="center"/> <el-table-column label="一人一档" prop="duty" align="center" width="120"> <template #default="scope"> -- Gitblit v1.9.2