From 7ff622307191ded044715b19ea32e2b88a057554 Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: 星期二, 16 七月 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