فهرست منبع

修改问卷参数,添加接口请求

lm 1 ماه پیش
والد
کامیت
0049705112

+ 56 - 0
src/api/surveyManagement.ts

@@ -0,0 +1,56 @@
+import request from '../utils/request.js'
+let teacherPrefix = import.meta.env.VITE_API_TEACHER_PRE 
+
+// 查询 问卷列表
+export const getQuestionnaireListApi = (data:any) => {
+    return request({
+        url: `${teacherPrefix}/api/v1/assessment/teacherAssessmentList`,
+        method: 'post',
+        data
+    })
+}
+
+
+// 新增问卷
+export const addQuestionnaireApi = (data:any) => {
+    return request({
+        url: `${teacherPrefix}/api/v1/assessment/addTeacherAssessments`,
+        method: 'post',
+        data
+    })
+}
+
+// 编辑问卷
+export const editQuestionnaireApi = (data:any) => {
+    return request({
+        url: `${teacherPrefix}/api/v1/assessment/modifyTeacherAssessments`,
+        method: 'post',
+        data
+    })
+}
+
+
+// 删除问卷
+export const deleteQuestionnaireApi = (id:any) => {
+    return request({
+        url: `${teacherPrefix}/api/v1/assessment/delTeacherAssessments/${id}`,
+        method: 'get',
+    })
+}
+
+// 查询问卷 详情
+export const getQuestionnaireDetailApi = (id:any) => {
+    return request({
+        url: `${teacherPrefix}/api/v1/assessment/teacherAssessmentDetail/${id}`,
+        method: 'get',
+    })
+}
+
+
+// 复制问卷
+export const copyQuestionnaireApi = (id:any) => {
+    return request({
+        url: `${teacherPrefix}/api/v1/assessment/assessmentCopyData/${id}`,
+        method: 'get',
+    })
+}

+ 6 - 6
src/components/QuestionTypeShow.vue

@@ -33,15 +33,15 @@
 
     <!-- 评价(分)题 4 -->
     <template v-else-if="Number(questionType) === 4 ">
-        <ul class="num_score" v-if="Number(scoreReviewType) === 0 && Number(titleScore)">
-            <li v-for="value in Number(titleScore)">
+        <ul class="num_score" v-if="Number(evaluationType) === 0 && Number(questionScore)">
+            <li v-for="value in Number(questionScore)">
                 {{ value }}分
             </li>
         </ul>
-        <div class="star_score" v-else-if="Number(scoreReviewType) === 1 && Number(titleScore)">
+        <div class="star_score" v-else-if="Number(evaluationType) === 1 && Number(questionScore)">
             非常不满意
             <el-rate size="large" 
-                :max="Number(titleScore)" 
+                :max="Number(questionScore)" 
                 clearable />
             非常满意
         </div>
@@ -69,10 +69,10 @@ const props = defineProps({
     questionSubOptions:{   // 单选/多选 选项列表
         type:[Array<Option>,null],
     },
-    scoreReviewType:{    //评分题 分值的展示形式  0 数字  1 星星
+    evaluationType:{    //评分题 分值的展示形式  0 数字  1 星星
         type:[Number,String,null],
     },
-    titleScore:{   // 评分题 题目的分值
+    questionScore:{   // 评分题 题目的分值
         type:[Number,null]
     }
 

+ 17 - 17
src/components/questionConfig/QuestionConfig.vue

@@ -40,25 +40,25 @@
                 </div>
             </template>
 
-            <template #scoreReviewType="{formData}">
+            <template #evaluationType="{formData}">
                 <div class="score_reviewType">
-                    <el-radio-group v-model="defaultFormData.scoreReviewType">
+                    <el-radio-group v-model="defaultFormData.evaluationType">
                         <el-radio v-for="radioItem in scoreReviewTypeList" :key="radioItem.value" :value="radioItem.value">{{ radioItem.label }}</el-radio>
                     </el-radio-group>
 
-                    <ul class="num_score" v-if="Number(formData.scoreReviewType) === 0 && Number(formData.titleScore)">
-                        <li v-for="value in Number(formData.titleScore)">
+                    <ul class="num_score" v-if="Number(formData.evaluationType) === 0 && Number(formData.questionScore)">
+                        <li v-for="value in Number(formData.questionScore)">
                             {{ value }}分
                         </li>
                     </ul>
-                    <div class="star_score" v-else-if="Number(formData.scoreReviewType) === 1 && Number(formData.titleScore)">
+                    <div class="star_score" v-else-if="Number(formData.evaluationType) === 1 && Number(formData.questionScore)">
                         非常不满意
                         <el-rate size="large" 
                             :model-value="0" 
                             :disabled="true" 
                             disabled-void-color="#c6d1de" 
                             disabled-void-icon="Star" 
-                            :max="Number(formData.titleScore)" 
+                            :max="Number(formData.questionScore)" 
                             clearable />
                         非常满意
                     </div>
@@ -140,12 +140,12 @@ interface Option {
 }
 
 interface FormData {
-    title: String   //题目名称
-    titleScore?: String  //题目分值
+    questionTitleName: String   //题目名称
+    questionScore?: String  //题目分值
     questionType: String   //题目类型
     extraConfig: String[]    // 是否必答 required, 是否横排 isHorizontal
     options: Option[],  //单选/多选 的 选项配置
-    scoreReviewType?:Number,  // 评价题 评分的展示形式
+    evaluationType?:Number,  // 评价题 评分的展示形式
 }
 
 const props = defineProps({
@@ -165,12 +165,12 @@ const formRefDom = ref()
 
 // 试题题目信息 
 const defaultFormData = ref<FormData>({
-    title: '',  
-    titleScore: '',   
+    questionTitleName: '',  
+    questionScore: '',   
     questionType: '', 
     extraConfig: ['required'],  //默认勾选必答题
     options: [],
-    scoreReviewType:0  //默认展示 数字式
+    evaluationType:0  //默认展示 数字式
  })
 
 
@@ -191,12 +191,12 @@ const finalFormItemList = computed(() => {
     return questionFormItemList.value.map(item => {
         const newItem = { ...item }
         // 题目分值仅在 scored 模式显示
-        if (item.key === 'titleScore') {
+        if (item.key === 'questionScore') {
             newItem.hidden = props.displayMode !== 'scored'
         }else if(item.key == 'options'){
             // 评价题  和 问答题 不展示 题目子选项配置
             newItem.hidden = [2,4].includes(Number(defaultFormData.value.questionType))  
-        }else if(item.key == 'scoreReviewType'){
+        }else if(item.key == 'evaluationType'){
             // 评价题 展示评分的格式
             newItem.hidden = Number(defaultFormData.value.questionType) !== 4
         }
@@ -282,12 +282,12 @@ watch(() =>defaultFormData.value.questionType, (newVal,oldVal) => {
     if (newVal !== oldVal) {
         // 清空 除了选项外的表单信息  
         defaultFormData.value = {
-            title: '',  
-            titleScore: '',   
+            questionTitleName: '',  
+            questionScore: '',   
             questionType: newVal, 
             extraConfig: ['required'],  //默认勾选必答题
             options: [],
-            scoreReviewType:0  //默认展示 数字式
+            evaluationType:0  //默认展示 数字式
         }
     }
 }, { immediate: true })

+ 2 - 2
src/components/questionConfig/QuestionnaireBaseForm.vue

@@ -14,8 +14,8 @@ import Form from '@/baseComponents/Form.vue';
 import {questionnaireBaseForm,} from './form'
 
 interface FormItm {
-    questionnaireTitle:String,
-    questionnaireDesc:String
+    assessmentTitle:String,
+    assessmentIllustrate:String
 }
 
 const props = defineProps({

+ 5 - 5
src/components/questionConfig/form.ts

@@ -3,7 +3,7 @@ import { ref } from "vue"
 
 export const questionFormItemList = ref([
     {
-        key: 'title',
+        key: 'questionTitleName',
         label: '题目',
         type: 'input',
         placeholder: '请输入题目',
@@ -21,7 +21,7 @@ export const questionFormItemList = ref([
         className: 'percent_70'
     },
     {
-        key: 'titleScore',
+        key: 'questionScore',
         label: '题目分值',
         type: 'input',
         placeholder: '请输入分值',
@@ -54,7 +54,7 @@ export const questionFormItemList = ref([
     },
 
     {
-        key: 'scoreReviewType',
+        key: 'evaluationType',
         label: '分割',
         type: 'radio',
         selectList: [],
@@ -83,7 +83,7 @@ export const questionFormItemList = ref([
 
 export const questionnaireBaseForm = ref([
      {
-        key: 'questionnaireTitle',
+        key: 'assessmentTitle',
         label: '问卷标题',
         type: 'input',
         placeholder: '请输入问卷标题(限40字)',
@@ -100,7 +100,7 @@ export const questionnaireBaseForm = ref([
         style: {},
     },
     {
-        key: 'questionnaireDesc',
+        key: 'assessmentIllustrate',
         label: '问卷说明',
         type: 'input',
         placeholder: '请输入问卷说明(限100字)',

+ 3 - 1
src/layout/components/header.vue

@@ -7,7 +7,8 @@
     </div>
 
     <ul class="horizontal_nav" v-if="horizontalNavList?.length > 0">
-      <li v-for="navItm in horizontalNavList" @click="router.push(navItm.route)" :class="{active:route.path == navItm.route}" >
+      <li v-for="navItm in horizontalNavList" @click="router.push(navItm.route)" 
+          :class="{active:route.path == navItm.route || navItm.childrenRoute?.includes(route.path)}" >
         {{ navItm.title }}
       </li>
     </ul>
@@ -82,6 +83,7 @@ const route = useRoute()
 interface NavItm {
   title:String,
   route:String,
+  childrenRoute?:Array<NavItm>
 }
 
 const props = defineProps({

+ 11 - 4
src/store/index.ts

@@ -16,19 +16,26 @@ const store = createStore<RootState>({
     horizontalMenuItems:[
       {
         title:'问卷管理',
-        route:`/main`
+        route:`/main`,
+        childrenRoute:[
+          '/main/createQuestionnaire',
+          '/main/previewQuestionnaire'
+        ]
       },
       {
         title:'评价管理',
-        route:`/main/reviewManagement`
+        route:`/main/reviewManagement`,
+        childrenRoute:[]
       },
       {
         title:'评价分析',
-        route:`/main/reviewAnalysis`
+        route:`/main/reviewAnalysis`,
+        childrenRoute:[]
       },
       {
         title:'个人中心',
-        route:`/main/personalCenter`
+        route:`/main/personalCenter`,
+        childrenRoute:[]
       },
     ]
 

+ 16 - 16
src/views/surveyManagement/PreviewQuestionnaire.vue

@@ -12,26 +12,26 @@
         <div class="page_item questionnaire">
             <!-- 问卷头部 -->
             <div class="questionnaire_head">
-                <h1 class="head_title">{{ questionaireMsg?.questionnaireTitle }}</h1>
-                <p class="head_desc">{{ questionaireMsg?.questionnaireDesc }}</p>
+                <h1 class="head_title">{{ questionaireMsg?.assessmentTitle }}</h1>
+                <p class="head_desc">{{ questionaireMsg?.assessmentIllustrate }}</p>
             </div>
 
             <!-- 预览内容列表 -->
             <ul class="question_list">
                 <li
-                    v-for="(item, index) in questionaireMsg?.quetionList"
+                    v-for="(item, index) in questionaireMsg?.questionData"
                     :key="item.id"
                     class="question_card">
                     
                     <!-- 题目行 -->
                     <div class="question_header">
-                        <span class="q_title" :class="{required_mark:isRequired(item)}">{{ index + 1 }}.{{ item.title }}</span>
+                        <span class="q_title" :class="{required_mark:isRequired(item)}">{{ index + 1 }}.{{ item.questionTitleName }}</span>
                         <span class="q_type_tag">[{{ qustionTypeToName(item.questionType) }}]</span>
 
-                        <div class="operation table_row_option">
+                        <!-- <div class="operation table_row_option">
                             <span class="el_button_editor" @click="EditQuestion">编辑</span>
                             <span class="el_button_delete" @click="DeleteQuestion(item)">删除</span>
-                        </div>
+                        </div> -->
                     </div>
 
                     <!-- 题目内容区域 -->
@@ -40,8 +40,8 @@
                             :isHorizontal="item.extraConfig.includes('isHorizontal')"
                             :questionType="Number(item.questionType)"
                             :questionSubOptions="item.options"
-                            :scoreReviewType="Number(item.scoreReviewType)"
-                            :titleScore="Number(item.titleScore)"
+                            :evaluationType="Number(item.evaluationType)"
+                            :questionScore="Number(item.questionScore)"
                         ></QuestionTypeShow>
                     </div>
                 </li>
@@ -68,7 +68,7 @@ const DeleteQuestion = (row)=>{
 
 }
 const EditQuestion = ()=>{
-    
+
 }
 
 onMounted(()=>{
@@ -151,13 +151,13 @@ onMounted(()=>{
                 }
             }
 
-            &:hover{
-                box-shadow: 0px 10px 20px 0px rgba(46,100,250,0.1), 
-                            0px -10px 20px 0px rgba(46,100,250,0.1);
-                .question_header .operation{
-                    display: flex;
-                }
-            }
+            // &:hover{
+            //     box-shadow: 0px 10px 20px 0px rgba(46,100,250,0.1), 
+            //                 0px -10px 20px 0px rgba(46,100,250,0.1);
+            //     .question_header .operation{
+            //         display: flex;
+            //     }
+            // }
         }
     }
 }

+ 12 - 12
src/views/surveyManagement/SurveyManagement.vue

@@ -26,13 +26,13 @@
                     <div class="card_header">
                         <!-- 模拟图片中的文档图标 -->
                         <img src="" alt="" class="card-icon" />
-                        <span class="card_title two_line_ellipsis">{{ quesitonnaire.questionnaireTitle }}</span>
+                        <span class="card_title two_line_ellipsis">{{ quesitonnaire.assessmentTitle }}</span>
                     </div>
 
                     <!-- 中间区域:元数据 (分数、创建人、状态、时间) -->
                     <div class="card_meta">
                         <div class="meta_row">
-                            <span class="score_text">{{ quesitonnaire.totalScore }}分</span>
+                            <span class="score_text">{{ quesitonnaire.assessmentScore }}分</span>
                             <span class="creator_text">管理员</span>
                             <!-- 状态文本:根据 useStatus 动态变色 -->
                             <span :class="['status_text', quesitonnaire.useStatus === 0 ? 'used' : 'unused']">
@@ -98,8 +98,8 @@ import { questionnaireTableColumns } from './table';
 import {useStatusConvert} from './useStatus'
 interface QuestionnaireItm {
     id:Number,
-    questionnaireTitle:String,
-    totalScore:Number|String,
+    assessmentTitle:String,
+    assessmentScore:Number|String,
     createBy:String,
     createTime:String,
     useStatus:Number,   //0 已使用   1 未使用
@@ -124,32 +124,32 @@ const pageSize = ref(20)
 const questionnaireList = ref<QuestionnaireItm[]>([
     {
         id:1,
-        questionnaireTitle: "作业量满意度问卷",
-        totalScore: 100,
+        assessmentTitle: "作业量满意度问卷",
+        assessmentScore: 100,
         createBy: "管理员",
         createTime: "2024-10-08 16:00",
         useStatus: 1 // 未使用
     },
     {
         id:2,
-        questionnaireTitle: "作业量满意度问卷作业量满意度问卷作业量满意度问卷作度问卷作业量满意度问卷作度问卷作业量满意度问卷作度问卷作业量满意度问卷作业量满意度问卷卷...",
-        totalScore: 100,
+        assessmentTitle: "作业量满意度问卷作业量满意度问卷作业量满意度问卷作度问卷作业量满意度问卷作度问卷作业量满意度问卷作度问卷作业量满意度问卷作业量满意度问卷卷...",
+        assessmentScore: 100,
         createBy: "管理员",
         createTime: "2024-10-08 16:00",
         useStatus: 0 // 已使用
     },
     {
         id:3,
-        questionnaireTitle: "作业量满意度问卷",
-        totalScore: 100,
+        assessmentTitle: "作业量满意度问卷",
+        assessmentScore: 100,
         createBy: "管理员",
         createTime: "2024-10-08 16:00",
         useStatus: 1 // 未使用
     },
      {
         id:4,
-        questionnaireTitle: "作业量满意度问卷",
-        totalScore: 100,
+        assessmentTitle: "作业量满意度问卷",
+        assessmentScore: 100,
         createBy: "管理员",
         createTime: "2024-10-08 16:00",
         useStatus: 1 // 未使用

+ 26 - 23
src/views/surveyManagement/createQuestionnaire/CreateQuestionnaire.vue

@@ -56,15 +56,15 @@
                     <li v-for="(question,index) in addedQuestionList" :key="question.id">
                         <div class="question_title" 
                             :class="{required:question.extraConfig.includes('required')}">
-                            {{index + 1}}.{{ question.title }}
+                            {{index + 1}}.{{ question.questionTitleName }}
                             <span class="question_type">[{{ qustionTypeToName(question.questionType) }}]</span>
                         </div>
                         <QuestionTypeShow 
                             :isHorizontal="question.extraConfig.includes('isHorizontal')"
                             :questionType="Number(question.questionType)"
                             :questionSubOptions="question.options"
-                            :scoreReviewType="Number(question.scoreReviewType)"
-                            :titleScore="Number(question.titleScore)"
+                            :evaluationType="Number(question.evaluationType)"
+                            :questionScore="Number(question.questionScore)"
                         ></QuestionTypeShow>
                     </li>
                 </ul>
@@ -98,7 +98,7 @@
                             @dragstart="(e)=>HandleDragStart(e)"
                             @dragend="(e)=>HandleDragEnd(e,question,index)"
                         >
-                        {{ index + 1 }}.{{ question.title }}
+                        {{ index + 1 }}.{{ question.questionTitleName }}
                     </li>
                 </ul>
 
@@ -120,10 +120,11 @@ import { unioformDateTransform } from '@/utils/dateTransform';
 import { useHandleMoveUpAndDown } from '@/baseComponents/useHandleMoveUpAndDown';
 
 import QuestionTypeShow from '@/components/QuestionTypeShow.vue';
-
 import moveUpDownIcon from '@/assets/icon/move_up_down.png'
 
 
+import {addQuestionnaireApi} from '@/api/surveyManagement'
+
 // 题目选项信息 参数
 interface Option {
     label: String
@@ -133,17 +134,17 @@ interface Option {
 // 题目信息 参数
 interface QuestionItm {
     id:Number
-    title: String   //题目名称
-    titleScore?: String | Number  //题目分值
+    questionTitleName: String   //题目名称
+    questionScore?: String | Number  //题目分值
     questionType: String | String   //题目类型
     extraConfig: String[]    // 是否必答 required, 是否横排 isHorizontal
     options: Option[],  //单选/多选 的 选项配置
-    scoreReviewType: Number|String
+    evaluationType: Number|String   // 评分题 的 分值展示形式
 }
 
 interface QuestionnaireInfo {
-    questionnaireTitle:String,
-    questionnaireDesc:String
+    assessmentTitle:String,
+    assessmentIllustrate:String
 }
 
 
@@ -156,19 +157,19 @@ const questionnaireMsg = ref()
 
 // 试卷头基本信息
 const questionnaireInfo = ref<QuestionnaireInfo>({
-    questionnaireTitle:'',
-    questionnaireDesc:''
+    assessmentTitle:'',
+    assessmentIllustrate:''
 })
 // 已经添加的题型
 const addedQuestionList = ref<QuestionItm[]>([
     {
         id:0,
-        title: '测试',   //题目名称
-        titleScore: 20,  //题目分值
+        questionTitleName: '测试',   //题目名称
+        questionScore: 20,  //题目分值
         questionType: '2',   //题目类型
         extraConfig:[],    // 是否必答 required, 是否横排 isHorizontal
         options: [] ,
-        scoreReviewType:''
+        evaluationType:''
     }
 ])
 
@@ -180,12 +181,12 @@ const selectedQuestionGetScore = ref(false)
 // 试卷总分
 const questionTotalScore = computed(()=>{
     return addedQuestionList.value?.reduce((a,b)=>{
-        let aScore =  Number(a.titleScore || 0)
-        let bScore =  Number(b.titleScore || 0)
+        let aScore =  Number(a.questionScore || 0)
+        let bScore =  Number(b.questionScore || 0)
         return {
-            titleScore:aScore + bScore
+            questionScore:aScore + bScore
         }
-    },{titleScore:0}).titleScore
+    },{questionScore:0}).questionScore
 })
 
 
@@ -247,23 +248,25 @@ const SaveQuestionnaire = async ()=>{
     await formRef.validate(async(valid) => {
         if (valid) {
             if(addedQuestionList.value.length > 0){
+
+                // addQuestionnaireApi()
                 /**
                  * 模拟数据
                  */
                 // 模拟保存数据 和页面跳转
                 let questionnaireList = JSON.parse(localStorage.getItem('questionnaireList') || '[]')
-                
+
                 questionnaireMsg.value = {
                     ...(questionnaireInfo.value),
-                    quetionList:addedQuestionList.value,
+                    questionData:addedQuestionList.value,
                     id:Number(questionnaireList[questionnaireList.length - 1]?.id || 0) + 1,
                     createTime:unioformDateTransform(new Date()),
                     createBy:'管理员',
-                    totalScore:questionTotalScore.value,
+                    assessmentScore:questionTotalScore.value,
                     useStatus:1
                 }
                 questionnaireList.push(questionnaireMsg.value)
-                localStorage.setItem('questionnaireList',JSON.stringify(questionnaireList.value || []))
+                localStorage.setItem('questionnaireList',JSON.stringify(questionnaireList || []))
             }else{
                 ElMessage.warning('请添加问卷题目')
             }

+ 2 - 2
src/views/surveyManagement/table.ts

@@ -20,7 +20,7 @@ export const questionnaireTableColumns = ref([
         hidden: false,
     },
     {
-        name: 'questionnaireTitle',
+        name: 'assessmentTitle',
         label: '问卷名称',
         width: '250',
         fixed: '',
@@ -29,7 +29,7 @@ export const questionnaireTableColumns = ref([
         hidden: false,
     },
     {
-        name: 'totalScore',
+        name: 'assessmentScore',
         label: '问卷满分',
         width: '100',
         fixed: '',