From 7ff622307191ded044715b19ea32e2b88a057554 Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: Tue, 16 Jul 2024 17:17:19 +0800
Subject: [PATCH] bug修改
---
src/layout/components/Navbar.vue | 12 +
src/views/onlineEducation/courseManage/index.vue | 2
src/views/onlineEducation/questionBankManagement/questionManage/components/questionDialog.vue | 229 +++++++++-----------------------
src/views/onlineEducation/systemManage/user/components/userDialog.vue | 173 +++++++++++++++++-------
4 files changed, 198 insertions(+), 218 deletions(-)
diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue
index f75f237..3c87756 100644
--- a/src/layout/components/Navbar.vue
+++ b/src/layout/components/Navbar.vue
@@ -24,9 +24,10 @@
</template>
<div class="avatar-container">
<el-dropdown @command="handleCommand" class="right-menu-item hover-effect" trigger="click">
- <div class="avatar-wrapper">
+ <div class="avatar-wrapper" style="display: flex;align-items: center">
<!-- <img :src="userStore.avatar" class="user-avatar" />-->
- <img src="../../assets/images/avator.png" class="user-avatar" />
+ <img src="../../assets/images/avator.png" class="user-avatar" />
+ <span>{{userName}}</span>
<el-icon><caret-bottom /></el-icon>
</div>
<template #dropdown>
@@ -83,9 +84,11 @@
const regRef = ref(null)
const superRef = ref();
const userInfo = ref();
+const userName = ref('')
onMounted(()=>{
if(getToken()){
userInfo.value = JSON.parse(Cookies.get('userInfo'))
+ userName.value = userInfo.value.username
console.log("userInfo",userInfo.value )
}
// getState();
@@ -214,6 +217,7 @@
height: 100%;
line-height: 50px;
display: flex;
+ align-items: center;
&:focus {
outline: none;
@@ -241,7 +245,7 @@
margin-right: 40px;
.avatar-wrapper {
- margin-top: 5px;
+ margin-top: 15px;
position: relative;
.user-avatar {
@@ -249,13 +253,13 @@
width: 40px;
height: 40px;
border-radius: 10px;
+ margin-right: 15px;
}
i {
cursor: pointer;
position: absolute;
right: -20px;
- top: 25px;
font-size: 12px;
}
}
diff --git a/src/views/onlineEducation/courseManage/index.vue b/src/views/onlineEducation/courseManage/index.vue
index b87d702..b191239 100644
--- a/src/views/onlineEducation/courseManage/index.vue
+++ b/src/views/onlineEducation/courseManage/index.vue
@@ -11,7 +11,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="logo" align="center" >
+ <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
diff --git a/src/views/onlineEducation/questionBankManagement/questionManage/components/questionDialog.vue b/src/views/onlineEducation/questionBankManagement/questionManage/components/questionDialog.vue
index b92fe7d..a4a5ab9 100644
--- a/src/views/onlineEducation/questionBankManagement/questionManage/components/questionDialog.vue
+++ b/src/views/onlineEducation/questionBankManagement/questionManage/components/questionDialog.vue
@@ -40,60 +40,31 @@
<el-input v-model.trim="state.form.title" type="textarea" placeholder="请输入题目内容"></el-input>
</el-form-item>
<el-form-item label="选项:" prop="content">
- <div v-if="state.form.questionType === 1" style="width: 100%">
- <div v-for="(item,index) in 4" :key="index" >
- <div style="display: flex;">
- <span>{{item ===1 ? 'A':item ===2 ? 'B' : item ===3 ? 'C' : 'D'}}</span>
- <el-input type="textarea" v-model="state.singleQuestion.items[index].content" placeholder="请输入选项内容" style="width: 100%;margin-left: 20px;margin-bottom: 10px"></el-input>
+ <div style="display: flex;flex-direction: column;width: 100%">
+ <el-button 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 type="textarea" v-model="state.optionItem.items[index].content" placeholder="请输入选项内容" style="width: 100%;margin-left: 20px;margin-bottom: 10px"></el-input>
+ <Delete style="width: 15px; height: 15px; margin-left: 8px;color: #ed5565" @click="delOption(index)" />
</div>
- </div>
- <div style="display: flex">
- <span style="width: 50px">解析:</span>
- <el-input type="textarea" v-model="state.singleQuestion.analyze" placeholder="请输入题目解析" style="width: 100%;margin-bottom: 10px"></el-input>
- </div>
- </div>
- <div v-else-if="state.form.questionType === 2" style="width: 100%">
- <div v-for="(item,index) in 4" :key="index" >
- <div style="display: flex;">
- <span>{{item ===1 ? 'A':item ===2 ? 'B' : item ===3 ? 'C' : 'D'}}</span>
- <el-input type="textarea" v-model="state.multiQuestion.items[index].content" placeholder="请输入选项内容" style="width: 100%;margin-left: 20px;margin-bottom: 10px"></el-input>
- </div>
- </div>
- <div style="display: flex">
- <span style="width: 50px">解析:</span>
- <el-input type="textarea" v-model="state.multiQuestion.analyze" placeholder="请输入题目解析" style="width: 100%;margin-bottom: 10px"></el-input>
- </div>
- </div>
- <div v-else style="width: 100%">
- <div v-for="(item,index) in 2" :key="index" >
- <div style="display: flex;">
- <span>{{item ===1 ? 'A': 'B'}}</span>
- <el-input v-model="state.judgeQuestion.items[index].content" style="width: 100%;margin-left: 20px;margin-bottom: 10px" disabled></el-input>
- </div>
- </div>
- <div style="display: flex">
- <span style="width: 50px">解析:</span>
- <el-input type="textarea" v-model="state.judgeQuestion.analyze" placeholder="请输入题目解析" style="width: 100%;margin-bottom: 10px"></el-input>
</div>
</div>
</el-form-item>
+ <el-form-item label="解析:" prop="answer">
+ <el-input type="textarea" v-model="state.optionItem.analyze" placeholder="请输入题目解析" style="width: 100%;margin-bottom: 10px"></el-input>
+ </el-form-item>
<el-form-item label="正确答案:" prop="answer">
- <el-radio-group v-model="state.form.answer" v-if="state.form.questionType === 1">
- <el-radio :label="'A'">A</el-radio>
- <el-radio :label="'B'">B</el-radio>
- <el-radio :label="'C'">C</el-radio>
- <el-radio :label="'D'">D</el-radio>
+ <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" @change="changeCheckBox">
- <el-checkbox label="A"></el-checkbox>
- <el-checkbox label="B"></el-checkbox>
- <el-checkbox label="C"></el-checkbox>
- <el-checkbox label="D"></el-checkbox>
+ <el-checkbox-group v-model="state.checkList" v-if="state.form.questionType === 2" style="display: flex" >
+ <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-radio-group v-model="state.form.answer" v-if="state.form.questionType === 3">
- <el-radio :label="'A'">A</el-radio>
- <el-radio :label="'B'">B</el-radio>
- </el-radio-group>
</el-form-item>
</el-form>
<template #footer>
@@ -108,6 +79,7 @@
<script setup>
import {reactive, ref, toRefs} from 'vue'
import {ElMessage} from "element-plus";
+import {Delete} from "@element-plus/icons-vue";
import {
getClassification
@@ -135,7 +107,7 @@
form: {
id: '',
title: '',
- questionType: 1,
+ questionType: null,
bankName: '',
bankId: null,
answer: ''
@@ -166,60 +138,9 @@
name: '判断题'
}
],
- singleQuestion: {
+ optionItem: {
analyze: '',
- items: [
- {
- prefix:"A",
- content: ''
- },
- {
- prefix:"B",
- content: ''
- },
- {
- prefix:"C",
- content: ''
- },
- {
- prefix:"D",
- content: ''
- },
- ]
- },
- judgeQuestion: {
- analyze: '',
- items: [
- {
- prefix:"A",
- content: '是'
- },
- {
- prefix:"B",
- content: '否'
- },
- ]
- },
- multiQuestion: {
- analyze: '',
- items: [
- {
- prefix:"A",
- content: ''
- },
- {
- prefix:"B",
- content: ''
- },
- {
- prefix:"C",
- content: ''
- },
- {
- prefix:"D",
- content: ''
- },
- ]
+ items: []
},
checkList: [],
bankList: [],
@@ -239,6 +160,19 @@
})
}
+const addOption = () => {
+
+ const obj = {
+ prefix:"",
+ content: ''
+ }
+ state.optionItem.items.push(obj)
+
+}
+const delOption = (val) => {
+ state.optionItem.items.splice(val,1)
+ console.log(" state.optionItem.items.", state.optionItem.items)
+}
const openDialog = async (type, value) => {
await loadMoreBankData();
const userInfo = JSON.parse(Cookies.get('userInfo'))
@@ -257,12 +191,8 @@
const res = await getQuestionById(value.id)
if(res.code === 200){
state.form = res.data
- if(res.data.questionType === 1){
- state.singleQuestion = JSON.parse(res.data.content)
- }else if(res.data.questionType === 3) {
- state.judgeQuestion = JSON.parse(res.data.content)
- }else {
- state.multiQuestion = JSON.parse(res.data.content)
+ state.optionItem = JSON.parse(res.data.content)
+ if(res.data.questionType === 2){
state.checkList = res.data.answer.split(',')
}
}else{
@@ -300,7 +230,19 @@
if(title.value === '新增'){
const {id,bankName, ...data} = JSON.parse(JSON.stringify(state.form))
data.answer = data.questionType === 1 || data.questionType === 3 ? data.answer : state.checkList.join(',')
- data.content = data.questionType === 1 ? JSON.stringify(state.singleQuestion) : data.questionType === 2 ? JSON.stringify(state.multiQuestion) : JSON.stringify(state.judgeQuestion)
+ // data.content = data.questionType === 1 ? JSON.stringify(state.singleQuestion) : data.questionType === 2 ? JSON.stringify(state.multiQuestion) : JSON.stringify(state.judgeQuestion)
+ 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
+ }
+ )
console.log('state.form',data)
const res = await addQuestion(data)
if(res.code === 200){
@@ -318,7 +260,19 @@
}else if(title.value === '编辑'){
const {bankName,...data} = JSON.parse(JSON.stringify(state.form))
data.answer = data.questionType === 1 || data.questionType === 3 ? data.answer : state.checkList.join(',')
- data.content = data.questionType === 1 ? JSON.stringify(state.singleQuestion) : data.questionType === 2 ? JSON.stringify(state.multiQuestion) : JSON.stringify(state.judgeQuestion)
+ // data.content = data.questionType === 1 ? JSON.stringify(state.singleQuestion) : data.questionType === 2 ? JSON.stringify(state.multiQuestion) : JSON.stringify(state.judgeQuestion)
+ 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
+ }
+ )
const res = await editQuestion(data)
if(res.code === 200){
ElMessage({
@@ -347,66 +301,15 @@
state.form = {
id: '',
title: '',
- questionType: 1,
+ questionType: null,
bankName: '',
bankId: null,
answer: ''
}
- state.singleQuestion= {
+ state.optionItem = {
analyze: '',
- items: [
- {
- prefix:"A",
- content: ''
- },
- {
- prefix:"B",
- content: ''
- },
- {
- prefix:"C",
- content: ''
- },
- {
- prefix:"D",
- content: ''
- },
- ]
+ items: []
}
- state.judgeQuestion= {
- analyze: '',
- items: [
- {
- prefix:"A",
- content: '是'
- },
- {
- prefix:"B",
- content: '否'
- },
- ]
- }
- state. multiQuestion= {
- analyze: '',
- items: [
- {
- prefix:"A",
- content: ''
- },
- {
- prefix:"B",
- content: ''
- },
- {
- prefix:"C",
- content: ''
- },
- {
- prefix:"D",
- content: ''
- },
- ]
- },
state.bankPageNum = 1;
state.bankPageSize = 10;
state.bankList = []
diff --git a/src/views/onlineEducation/systemManage/user/components/userDialog.vue b/src/views/onlineEducation/systemManage/user/components/userDialog.vue
index 7ef7401..aa3512e 100644
--- a/src/views/onlineEducation/systemManage/user/components/userDialog.vue
+++ b/src/views/onlineEducation/systemManage/user/components/userDialog.vue
@@ -31,30 +31,50 @@
<el-form-item label="用户类型:" v-if="state.title !== '修改密码'">
<el-radio-group v-model="state.form.userType" :disabled="disabled" @change="changeType">
<el-radio :label="0" v-if="state.isAdmin">管理员</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 :label="1" v-if="state.isAdmin">企业级</el-radio>
+ <el-radio :label="2" v-if="!state.isAdmin">部门级</el-radio>
+ <el-radio :label="3" v-if="!state.isAdmin">车间(岗位)级</el-radio>
+ <el-radio :label="4" v-if="state.isAdmin">其他</el-radio>
</el-radio-group>
</el-form-item>
- <el-form-item label="选择所属父级账号:" prop="companyId" v-if="state.title !== '修改密码' && state.form.userType !== 0">
- <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 label="选择上级企业:" prop="companyName" v-if="state.title !== '修改密码' && state.form.userType !== 0">
+ <el-select
+ v-if="state.isAdmin"
+ v-model="state.form.companyName"
+ filterable
+ 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-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-input v-else disabled style="width: 45%" v-model="state.form.companyName"></el-input>
<scorllSelect
:disabled="disabled"
@@ -135,6 +155,38 @@
}
}
}
+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: '',
@@ -152,7 +204,8 @@
},
formRules:{
name: [{ required: true, message: '请输入公司、部门或者车间岗位名称', trigger: 'blur' }],
- username: [{ 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' }],
@@ -192,10 +245,13 @@
}
if(type !== 'view' && type !== 'pwd'){
- await getCompanyList('open')
+ if(state.isAdmin){
+ // await getCompanyList('open')
+ }
}
state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : type ==='pwd' ? '修改密码' : '查看' ;
if(type === 'edit' || type === 'view') {
+ startUsername.value = value.username
if( type === 'view'){
disabled.value = true;
}
@@ -222,31 +278,47 @@
}
const finshed = ref(false)
-const getCompanyList = async (type)=>{
- if (type === 'open' && state.pageNum !== 1) {
- } else {
+const loading = ref(false)
+const getCompanyList = async (val)=>{
+ if(val != ""){
+ loading.value = true;
const queryParams = {
- pageNum: state.pageNum,
- pageSize: state.pageSize,
+ name: val
}
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;
- }
+ loading.value = false;
+ state.companyList = res.data.list
} else {
ElMessage.warning(res.message)
}
- console.log("state.companyList",state.companyList)
}
+
+ // 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();
@@ -301,6 +373,7 @@
scrollRef.value.getList(param,'change');
}
const changeType = () => {
+ state.companyList = [];
if(state.isAdmin){
state.form.companyId = null;
state.form.companyName = '';
@@ -337,16 +410,16 @@
superRef.value.resetFields()
dialogVisible.value = false;
}
-//触底函数
-const loadMore = () => {
- console.log(' 触底了');
- // 防抖处理
- setTimeout(() => {
- if (finshed.value) return //值为true,则代表没有数据了
- state.pageNum += 1
- getCompanyList('')
- }, 500)
-}
+// //触底函数
+// const loadMore = () => {
+// console.log(' 触底了');
+// // 防抖处理
+// setTimeout(() => {
+// if (finshed.value) return //值为true,则代表没有数据了
+// state.pageNum += 1
+// getCompanyList('')
+// }, 500)
+// }
const selectValue = (val) => {
state.form.parentId = null;
--
Gitblit v1.9.2