From c644a5afed704b804d23e97a0434491c55abc400 Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: Fri, 18 Jul 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