From 04eac394df26d483765ce9d51bf69282e0cc7272 Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: Wed, 10 Jul 2024 17:32:02 +0800
Subject: [PATCH] 提交
---
src/views/onlineEducation/classHourBatch/components/chooseStudent.vue | 187 ++++++
src/api/onlineEducation/courseManage.js | 9
src/views/onlineEducation/courseManage/components/courseManageDialog.vue | 12
src/api/onlineEducation/batch.js | 93 +++
src/views/onlineEducation/systemManage/company/index.vue | 15
src/router/index.js | 14
src/views/onlineEducation/classHourBatch/components/batchDialog.vue | 290 +++++++++
src/views/onlineEducation/groupExams/components/examDialog.vue | 400 +++++++++++++
src/views/onlineEducation/classHourBatch/index.vue | 153 ++++
src/views/onlineEducation/classHourBatch/components/handleStudent.vue | 168 +++++
src/views/onlineEducation/systemManage/company/components/companyDialog.vue | 20
src/views/onlineEducation/groupExams/index.vue | 139 ++++
src/views/onlineEducation/questionBankManagement/questionManage/components/questionDialog.vue | 55 +
src/api/onlineEducation/exam.js | 93 +++
src/views/onlineEducation/classHourBatch/components/classHourChange.vue | 103 +++
15 files changed, 1,721 insertions(+), 30 deletions(-)
diff --git a/src/api/onlineEducation/batch.js b/src/api/onlineEducation/batch.js
new file mode 100644
index 0000000..e2a0fa5
--- /dev/null
+++ b/src/api/onlineEducation/batch.js
@@ -0,0 +1,93 @@
+import request from '@/utils/request'
+
+export function getBatch(param) {
+ return request({
+ url: '/course-phase/list',
+ method: 'get',
+ params: param
+ })
+}
+
+export function addBatch(data) {
+ return request({
+ url: '/course-phase',
+ method: 'post',
+ data: data
+ })
+}
+
+
+export function editBatch(params) {
+ return request({
+ url: `/course-phase`,
+ method: 'put',
+ data: params
+ })
+}
+
+
+export function delBatch(userId) {
+ return request({
+ url: '/course-phase/' + userId,
+ method: 'delete'
+ })
+}
+
+export function checkBatchName(data) {
+ return request({
+ url: '/course-phase/checkNameUnique',
+ method: 'post',
+ data: data
+ })
+}
+
+//批次与学员关系
+ //批次下的学员列表(分页)
+export function getBatchStudent(param) {
+ return request({
+ url: '/phase-student/list',
+ method: 'get',
+ params: param
+ })
+}
+ // 校验学员是否已存在
+export function checkStudentUnique(data) {
+ return request({
+ url: '/phase-student/checkStudentUnique',
+ method: 'post',
+ data: data
+ })
+}
+// 批量新增学员
+export function batchAddStudent(data) {
+ return request({
+ url: '/phase-student/batchAdd',
+ method: 'post',
+ data: data
+ })
+}
+// 批量删除学员
+export function batchDelStudent(data) {
+ return request({
+ url: '/phase-student/batchDelete',
+ method: 'delete',
+ data: data
+ })
+}
+
+// 批量删除学员
+export function delBatchStu(userId) {
+ return request({
+ url: '/phase-student/' + userId,
+ method: 'delete'
+ })
+}
+
+//企业课时变更记录列表(分页)
+export function getCompanyPeriod(param) {
+ return request({
+ url: '/company-period/list',
+ method: 'get',
+ params: param
+ })
+}
diff --git a/src/api/onlineEducation/courseManage.js b/src/api/onlineEducation/courseManage.js
index 0024c74..bfa8431 100644
--- a/src/api/onlineEducation/courseManage.js
+++ b/src/api/onlineEducation/courseManage.js
@@ -16,6 +16,15 @@
})
}
+export function getApproveCourse(params) {
+ return request({
+ url: '/course/approvelist',
+ method: 'get',
+ params: params
+ })
+}
+
+
export function addCourse(data) {
return request({
url: '/course',
diff --git a/src/api/onlineEducation/exam.js b/src/api/onlineEducation/exam.js
new file mode 100644
index 0000000..3292d01
--- /dev/null
+++ b/src/api/onlineEducation/exam.js
@@ -0,0 +1,93 @@
+import request from '@/utils/request'
+
+export function getExam(param) {
+ return request({
+ url: '/exam-paper/list',
+ method: 'get',
+ params: param
+ })
+}
+
+export function addExam(data) {
+ return request({
+ url: '/exam-paper',
+ method: 'post',
+ data: data
+ })
+}
+
+
+export function editExam(params) {
+ return request({
+ url: `/exam-paper`,
+ method: 'put',
+ data: params
+ })
+}
+
+
+export function delExam(userId) {
+ return request({
+ url: '/exam-paper/' + userId,
+ method: 'delete'
+ })
+}
+
+export function checkExamName(data) {
+ return request({
+ url: '/exam-paper/checkNameUnique',
+ method: 'post',
+ data: data
+ })
+}
+
+//批次与学员关系
+//批次下的学员列表(分页)
+// export function getBatchStudent(param) {
+// return request({
+// url: '/phase-student/list',
+// method: 'get',
+// params: param
+// })
+// }
+// // 校验学员是否已存在
+// export function checkStudentUnique(data) {
+// return request({
+// url: '/phase-student/checkStudentUnique',
+// method: 'post',
+// data: data
+// })
+// }
+// // 批量新增学员
+// export function batchAddStudent(data) {
+// return request({
+// url: '/phase-student/batchAdd',
+// method: 'post',
+// data: data
+// })
+// }
+// // 批量删除学员
+// export function batchDelStudent(data) {
+// return request({
+// url: '/phase-student/batchDelete',
+// method: 'delete',
+// data: data
+// })
+// }
+//
+// // 批量删除学员
+// export function delBatchStu(userId) {
+// return request({
+// url: '/phase-student/' + userId,
+// method: 'delete'
+// })
+// }
+//
+// //企业课时变更记录列表(分页)
+// export function getCompanyPeriod(param) {
+// return request({
+// url: '/company-period/list',
+// method: 'get',
+// params: param
+// })
+// }
diff --git a/src/router/index.js b/src/router/index.js
index dd3cb3e..b5e29b4 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -62,6 +62,20 @@
path: '/chapters',
component: () => import('@/views/onlineEducation/courseManage/courseChapters/index.vue'),
name: 'Chapters',
+ meta: { title: '章节',icon: 'form', affix: true }
+ }
+ ]
+ },
+ {
+ path: '/chooseStu',
+ component: Layout,
+ redirect: '/chooseStu',
+ children: [
+ {
+ path: '/chooseStu',
+ component: () => import('@/views/onlineEducation/classHourBatch/components/handleStudent.vue'),
+ name: 'ChooseStu',
+ meta: { title: '批次学员',icon: 'form', affix: true }
}
]
},
diff --git a/src/views/onlineEducation/classHourBatch/components/batchDialog.vue b/src/views/onlineEducation/classHourBatch/components/batchDialog.vue
new file mode 100644
index 0000000..1ae956a
--- /dev/null
+++ b/src/views/onlineEducation/classHourBatch/components/batchDialog.vue
@@ -0,0 +1,290 @@
+<template>
+ <div class="notice">
+ <el-dialog
+ v-model="dialogVisible"
+ :title="title"
+ width="500px"
+ :before-close="handleClose"
+ >
+ <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
new file mode 100644
index 0000000..f7752af
--- /dev/null
+++ b/src/views/onlineEducation/classHourBatch/components/chooseStudent.vue
@@ -0,0 +1,187 @@
+<template>
+ <div class="notice">
+ <el-dialog
+ v-model="dialogVisible"
+ :title="title"
+ width="50%"
+ :before-close="handleClose"
+ >
+ <!-- 表格数据 -->
+ <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} from "@/api/onlineEducation/questionBank";
+import {getStudent} 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,
+ queryParams: {
+ pageNum: 1,
+ pageSize: 10
+ },
+ dataList: [],
+ totalItems: 0, // 总数据条数,从后端接口获取
+ phaseId: null,
+ chooseStu: [],
+ companyId: null,
+ selectRowKeys: []
+
+})
+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 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 () => {
+ 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.total = 0
+ state.queryParams ={
+ pageNum: 1,
+ pageSize: 10
+ }
+}
+const handleSelectionChange = (val) => {
+
+ console.log("选中的行", val)
+ state.chooseStu = val.map(item => {
+ return {
+ companyId: item.companyId,
+ createId:item.createId,
+ phaseId:state.phaseId,
+ studentId: item.id
+ }
+ })
+}
+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/classHourChange.vue b/src/views/onlineEducation/classHourBatch/components/classHourChange.vue
new file mode 100644
index 0000000..51d6e63
--- /dev/null
+++ b/src/views/onlineEducation/classHourBatch/components/classHourChange.vue
@@ -0,0 +1,103 @@
+<template>
+ <div class="notice">
+ <el-dialog
+ v-model="dialogVisible"
+ :title="state.title"
+ width="50%"
+ :before-close="handleClose"
+ >
+ <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="modifyPeriod" align="center" />
+ <el-table-column label="变动后剩余(分)" prop="remainPeriod" 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
+ },
+ total: 0,
+ title: ''
+})
+
+const openDialog = async (value) => {
+ state.title = '课时余量变动明细'
+ dialogVisible.value = true;
+ await getList()
+}
+const getList = async () => {
+ state.loading = true
+ const res = await getCompanyPeriod(state.queryParams)
+ if(res.code == 200){
+ state.dataList = res.data.list
+ 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
new file mode 100644
index 0000000..a937f6b
--- /dev/null
+++ b/src/views/onlineEducation/classHourBatch/components/handleStudent.vue
@@ -0,0 +1,168 @@
+<template>
+ <div class="app-container">
+ <div style="margin-bottom: 10px;display: flex;align-items: center;justify-content: space-between">
+ <el-button
+ type="primary"
+ plain
+ icon="Plus"
+ @click="openDialog()"
+ >选择学员</el-button>
+ <el-button
+ type="danger"
+ plain
+ icon="Delete"
+ @click="handleDeleteBatch"
+ >批量删除</el-button>
+ </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" />
+ <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} from 'vue-router'
+const route = useRoute()
+
+
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const dialogRef = ref();
+const tableRef = ref();
+const data = reactive({
+ queryParams: {
+ pageId: null,
+ phaseId: null,
+ pageNum: 1,
+ pageSize: 10,
+ },
+ total: 0,
+ dataList: [],
+ isAdmin: false,
+ chooseStu: []
+
+});
+
+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;
+ }
+ const val = JSON.parse(route.query.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() {
+ proxy.resetForm("roleRef");
+}
+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('数据删除成功')
+ await getList()
+ }else{
+ ElMessage.warning(res.message)
+ }
+ })
+}
+
+</script>
diff --git a/src/views/onlineEducation/classHourBatch/index.vue b/src/views/onlineEducation/classHourBatch/index.vue
index a0120ed..af6dc53 100644
--- a/src/views/onlineEducation/classHourBatch/index.vue
+++ b/src/views/onlineEducation/classHourBatch/index.vue
@@ -1,12 +1,151 @@
<template>
-<div>课时批次</div>
+ <div class="app-container">
+ <div style="margin-bottom: 10px;display: flex;align-items: center;justify-content: space-between">
+ <el-button
+ type="primary"
+ plain
+ icon="Plus"
+ @click="openDialog('add',{})"
+ >新增批次</el-button>
+ <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="" align="center" />
+ <el-table-column label="完成率" prop="" 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 {useRouter} from 'vue-router'
+const router = useRouter()
+import {delQuestionBank, getQuestionBank} from "@/api/onlineEducation/questionBank";
+import {delBatch, getBatch} from "@/api/onlineEducation/batch";
+
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const dialogRef = ref();
+const classHourRef = ref();
+const data = reactive({
+ queryParams: {
+ pageNum: 1,
+ pageSize: 10,
+ },
+ total: 0,
+ dataList: [],
+ isAdmin: false,
+ companyName: '',
+ remainPeriod: null
+
+});
+
+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.remainPeriod = userInfo.remainPeriod ? (userInfo.remainPeriod /60).toFixed(2).replace(/\.00$/, ''):''
+ data.isAdmin = false;
+ data.companyName = userInfo.companyName
+ }
+ 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$/, '') + '分钟':''
+ }
+ })
+ 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 delBatch(val.id)
+ if(res.code == 200){
+ ElMessage.success('数据删除成功')
+ await getList()
+ }else{
+ ElMessage.warning(res.message)
+ }
+ })
+}
+const toStuChoose = (val) => {
+ const v = JSON.stringify(val)
+ router.push({ path: "/chooseStu", query: { val: v } });
+}
+
+const openDetail = () => {
+ classHourRef.value.openDialog()
+}
</script>
-
-
-
-<style scoped lang="scss">
-
-</style>
diff --git a/src/views/onlineEducation/courseManage/components/courseManageDialog.vue b/src/views/onlineEducation/courseManage/components/courseManageDialog.vue
index 9d397ac..6b78067 100644
--- a/src/views/onlineEducation/courseManage/components/courseManageDialog.vue
+++ b/src/views/onlineEducation/courseManage/components/courseManageDialog.vue
@@ -16,6 +16,7 @@
<!-- </el-select>-->
<el-cascader
ref="classifyRef"
+ style="width: 100%"
v-model="state.form.categoryId"
:options="state.classifyList"
:props="state.props"
@@ -24,11 +25,11 @@
@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="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>
@@ -299,6 +300,7 @@
logo: '',
companyId: null
}
+ state.imgList = []
}
defineExpose({
openDialog
diff --git a/src/views/onlineEducation/groupExams/components/examDialog.vue b/src/views/onlineEducation/groupExams/components/examDialog.vue
new file mode 100644
index 0000000..e2ec21c
--- /dev/null
+++ b/src/views/onlineEducation/groupExams/components/examDialog.vue
@@ -0,0 +1,400 @@
+<template>
+ <div class="notice">
+ <el-dialog
+ v-model="dialogVisible"
+ width="800px"
+ :before-close="handleClose"
+ >
+ <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"></el-input> 题
+ </div>
+ <div style="margin-left: 20px">
+ 每题:<el-input style="max-width: 40px"></el-input> 分
+ </div>
+ </div>
+ <div class="group" >
+ <div>
+ 共 <span style="max-width: 30px">xxx</span> 分
+ </div>
+ <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="radio" >
+ <el-radio :label="1" style="max-width: 30px">随机</el-radio>
+ <el-radio :label="2">默认</el-radio>
+ </el-radio-group>
+ </div>
+ </div>
+ <div style="display: flex">
+ <div class="group">
+ <div>
+ 多选:<el-input style="max-width: 40px"></el-input> 题
+ </div>
+ <div style="margin-left: 20px">
+ 每题:<el-input style="max-width: 40px"></el-input> 分
+ </div>
+ </div>
+ <div class="group" >
+ <div>
+ 共 <span style="max-width: 30px">xxx</span> 分
+ </div>
+ <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="radio" >
+ <el-radio :label="1" style="max-width: 30px">随机</el-radio>
+ <el-radio :label="2">默认</el-radio>
+ </el-radio-group>
+ </div>
+ </div>
+ <div style="display: flex">
+ <div class="group">
+ <div>
+ 判断:<el-input style="max-width: 40px"></el-input> 题
+ </div>
+ <div style="margin-left: 20px">
+ 每题:<el-input style="max-width: 40px"></el-input> 分
+ </div>
+ </div>
+ <div class="group" >
+ <div>
+ 共 <span style="max-width: 30px">xxx</span> 分
+ </div>
+ <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="radio" >
+ <el-radio :label="1" style="max-width: 30px">随机</el-radio>
+ <el-radio :label="2">默认</el-radio>
+ </el-radio-group>
+ </div>
+ </div>
+ <span class="group" style="margin-bottom: 10px">共计:xxx分</span>
+ <div style="display: flex;justify-content: space-between;align-items: center">
+ <el-form-item label="合格分数:" prop="">
+ <el-input-number v-model="num" :min="1" :max="10" style="margin-right: 10px" /> (大于等于)
+ </el-form-item>
+ <el-form-item label="限制时长:" prop="">
+ <el-input v-model="num1" style="max-width: 200px" >
+ <template #append>分钟</template>
+ </el-input>
+ </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 {checkExamName} 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 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
+ },
+ formRules: {
+ name: [{required: true, trigger: "blur", validator: validateName}],
+ categoryId: [{required: true, message: '请选择课程分类', trigger: 'blur'}],
+ },
+ classifyList: [],
+ isAdmin: false,
+ props: {
+ checkStrictly: true,
+ },
+ bankListSingle: [],
+ bankSinglePageNum: 1, // 当前页码
+ bankSinglePageSize: 10, // 每页显示的数量
+ hasMoreItemsSingle: null, // 是否还有更多选项
+})
+
+const openDialog = async (type, value) => {
+ await getClassifyList();
+ await loadMoreBankData()
+ 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 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 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的值哦,需要赋值的话自己去赋值哦
+}
+
+const handleClose = () => {
+ busRef.value.clearValidate();
+ reset();
+ dialogVisible.value = false;
+ emit("getList")
+
+}
+const reset = () => {
+ state.form = {
+ id: '',
+ name: '',
+ categoryId: null,
+ companyName: '',
+ companyId: null
+ }
+}
+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)
+ }
+}
+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 70px;
+ }
+}
+
+</style>
diff --git a/src/views/onlineEducation/groupExams/index.vue b/src/views/onlineEducation/groupExams/index.vue
index 60bea94..03fca18 100644
--- a/src/views/onlineEducation/groupExams/index.vue
+++ b/src/views/onlineEducation/groupExams/index.vue
@@ -1,12 +1,137 @@
<template>
-<div>组卷考试分配</div>
+ <div class="app-container">
+ <div style="margin-bottom: 10px;display: flex;align-items: center;justify-content: space-between">
+ <el-button
+ type="primary"
+ plain
+ @click="openDialog('add',{})"
+ >开始组卷考试</el-button>
+ </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" />
+ <el-table-column label="合格人数" prop="" align="center" />
+ <el-table-column label="平均分数" prop="" align="center" />
+ <el-table-column label="合格率" prop="" align="center" />
+ <el-table-column label="限制时长" prop="limitTime" 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"
+ />
+ <exam-dialog ref="dialogRef" @getList=getList></exam-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 examDialog from './components/examDialog.vue'
+// import classHourChange from './components/classHourChange.vue'
+import Cookies from "js-cookie";
+import {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";
+
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const dialogRef = ref();
+const classHourRef = ref();
+const data = reactive({
+ queryParams: {
+ pageNum: 1,
+ pageSize: 10,
+ },
+ total: 0,
+ dataList: [],
+ isAdmin: false,
+ companyName: '',
+ remainPeriod: null
+
+});
+
+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;
+ data.companyName = userInfo.companyName
+ }
+ await getList()
+})
+onUnmounted(()=>{
+
+})
+
+const getList = async () => {
+ loading.value = true
+ const res = await getExam(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() {
+ proxy.resetForm("roleRef");
+}
+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 v = JSON.stringify(val)
+ router.push({ path: "/chooseStu", query: { val: v } });
+}
+
+const openDetail = () => {
+ classHourRef.value.openDialog()
+}
</script>
-
-
-
-<style scoped lang="scss">
-
-</style>
diff --git a/src/views/onlineEducation/questionBankManagement/questionManage/components/questionDialog.vue b/src/views/onlineEducation/questionBankManagement/questionManage/components/questionDialog.vue
index c24f4c6..b92fe7d 100644
--- a/src/views/onlineEducation/questionBankManagement/questionManage/components/questionDialog.vue
+++ b/src/views/onlineEducation/questionBankManagement/questionManage/components/questionDialog.vue
@@ -352,6 +352,61 @@
bankId: null,
answer: ''
}
+ state.singleQuestion= {
+ analyze: '',
+ items: [
+ {
+ prefix:"A",
+ content: ''
+ },
+ {
+ prefix:"B",
+ content: ''
+ },
+ {
+ prefix:"C",
+ content: ''
+ },
+ {
+ prefix:"D",
+ content: ''
+ },
+ ]
+ }
+ state.judgeQuestion= {
+ analyze: '',
+ items: [
+ {
+ prefix:"A",
+ content: '是'
+ },
+ {
+ prefix:"B",
+ content: '否'
+ },
+ ]
+ }
+ state. multiQuestion= {
+ analyze: '',
+ items: [
+ {
+ prefix:"A",
+ content: ''
+ },
+ {
+ prefix:"B",
+ content: ''
+ },
+ {
+ prefix:"C",
+ content: ''
+ },
+ {
+ prefix:"D",
+ content: ''
+ },
+ ]
+ },
state.bankPageNum = 1;
state.bankPageSize = 10;
state.bankList = []
diff --git a/src/views/onlineEducation/systemManage/company/components/companyDialog.vue b/src/views/onlineEducation/systemManage/company/components/companyDialog.vue
index cd50548..51a91d4 100644
--- a/src/views/onlineEducation/systemManage/company/components/companyDialog.vue
+++ b/src/views/onlineEducation/systemManage/company/components/companyDialog.vue
@@ -8,33 +8,39 @@
>
<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"></el-input>
+ <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" ></el-input>
+ <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"></el-input>
+ <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" ></el-input>
+ <el-input v-model.trim="state.form.phone" placeholder="请输入联系电话"></el-input>
</el-form-item>
- <el-form-item label="当前剩余课时(分):" prop="remainPeriod" v-if="title!=='分配课时'">
+ <el-form-item label="当前剩余课时(秒):" prop="remainPeriod" v-if="title!=='分配课时'">
<el-input
+ placeholder="请输入剩余课时"
v-model.trim="state.form.remainPeriod"
@input="state.form.remainPeriod= state.form.remainPeriod.replace(/[^0-9]/g,'')">
+ <template #append v-if="state.form.remainPeriod"><span>{{(state.form.remainPeriod /60).toFixed(2).replace(/\.00$/, '') + '分钟'}}</span></template>
</el-input>
</el-form-item>
- <el-form-item label="累计已用课时(分):" prop="spendPeriod" v-if="title!=='分配课时'">
+ <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-form-item label="总课时(秒):" prop="totalPeriod">
<el-input
+ placeholder="请输入总课时"
v-model.trim="state.form.totalPeriod"
@input="state.form.totalPeriod = state.form.totalPeriod.replace(/[^0-9]/g,'')">
+ <template #append v-if="state.form.totalPeriod"><span>{{(state.form.totalPeriod /60).toFixed(2).replace(/\.00$/, '') + '分钟'}}</span></template>
</el-input>
</el-form-item>
</el-form>
diff --git a/src/views/onlineEducation/systemManage/company/index.vue b/src/views/onlineEducation/systemManage/company/index.vue
index abdef60..cbb5355 100644
--- a/src/views/onlineEducation/systemManage/company/index.vue
+++ b/src/views/onlineEducation/systemManage/company/index.vue
@@ -15,9 +15,9 @@
<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="remainPeriod" align="center" width="150"/>
- <el-table-column label="累计已用课时(分)" prop="spendPeriod" align="center" width="150"/>
- <el-table-column label="总课时(分)" prop="totalPeriod" align="center"/>
+ <el-table-column label="当前剩余课时(分)" prop="remainPeriodMin" align="center" width="150"/>
+ <el-table-column label="累计已用课时(分)" prop="spendPeriodMin" align="center" width="150"/>
+ <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">查看详情</el-button>
@@ -76,7 +76,14 @@
loading.value = true
const res = await getCompany(data.queryParams)
if(res.code == 200){
- data.dataList = res.data.list
+ data.dataList = res.data.list.map(item => {
+ return{
+ ...item,
+ remainPeriodMin: item.remainPeriod ?(item.remainPeriod /60).toFixed(2).replace(/\.00$/, '') + '分钟':'',
+ spendPeriodMin:item.spendPeriod ?(item.spendPeriod /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)
--
Gitblit v1.9.2