瀏覽代碼

Merge branch 'master' into luohl

* master:
  学生端
  ~
  ~
  缺考修改
luohailiang 2 年之前
父節點
當前提交
c3080ded0b

src/assets/ksfx/examIcon.png → public/images/examIcon.png


src/assets/ksfx/examPreview.png → public/images/examPreview.png


二進制
public/images/pentagramIcon.png


二進制
public/images/searchBtnIcon.png


+ 15 - 8
src/components/leftSiderStu/index.vue

@@ -1,30 +1,37 @@
 <template>
   <div class="leftSideMenu">
-    <div class="singleSider" v-for="(item,index) in siderList" :key="index" :class="{'activeIn':props.StuLeftMenuNum==index}" @click="handleClick(index)">{{ item }}</div>
+    <div class="singleSider" v-for="(item,index) in siderList" :key="index" :class="{'activeIn':num==index}" @click="handleClick(index)">{{ item }}</div>
   </div>
 </template>
 
 <script lang="ts" setup>
-import { defineProps } from 'vue';
 import { useRouter } from "vue-router";
 const router = useRouter();
-const props = defineProps(['StuLeftMenuNum'])
+import { defineProps} from 'vue';
+const props = defineProps(['StuLeftMenuNum','ykjId']);
+
 
-let siderList=["试题分析","我的试卷","个人成绩单"]
-let num = ref(0);
 
+let siderList=["试题分析","我的试卷","个人成绩单"]
+let num = ref(props.StuLeftMenuNum);
 
 const handleClick = (index) => {
   num.value = index;
   switch (index) {
     case 0:
-      router.push('stu_stfx');
+    router.push(
+      { name: 'ksfx-stu_stfx-ykj_id', params: { ykj_id: props.ykjId } }
+      )
       break;
     case 1:
-      router.push('stu_wdsj');
+      router.push(
+        { name: 'ksfx-stu_wdsj-ykj_id', params: { ykj_id: props.ykjId } }
+      );
       break;
     case 2:
-      router.push('stu_grcjd');
+    router.push(
+        { name: 'ksfx-stu_grcjd-ykj_id', params: { ykj_id: props.ykjId } }
+      );
       break;
   }
 }

+ 42 - 12
src/components/step/link/bjqk.vue

@@ -45,14 +45,43 @@ async function handleQuery() {
   }
 }
 
-function handleClickSign(id?: string) {
-  request({
-    url: '/yzy/kcgl/onekey2fill',
-    data: {
-      ze_id: _ykl_lc_.ze_id,
-      stuid: id,
-    },
-  }).then((res) => {
+function handleClickSign(row?: any) {
+  let req
+  if (row) {
+    if (['3', '4'].includes(row.dtk.statue)) {
+      req = request({
+        url: '/yzy/kcgl/onekey2fill',
+        data: {
+          ze_id: _ykl_lc_.ze_id,
+          stuid: row.user_id,
+        },
+      })
+    }
+    else if (['1', '2', '5'].includes(row.dtk.statue)) {
+      req = request({
+        url: '/yzy/kcgl/cancel_qk',
+        data: {
+          ysk_id: row.dtk.ysk_id,
+        },
+      })
+    }
+    else {
+      return ElMessage({
+        message: '正常的试卷,不应该参与按钮状态',
+        type: 'error',
+        grouping: true,
+      })
+    }
+  }
+  else {
+    req = request({
+      url: '/yzy/kcgl/onekey2fill',
+      data: {
+        ze_id: _ykl_lc_.ze_id,
+      },
+    })
+  }
+  req.then((res) => {
     if (res.code === '1') {
       ElMessage({
         message: res.msg,
@@ -71,7 +100,7 @@ function handleClickSign(id?: string) {
   }).catch((err) => {
     console.error(err)
     ElMessage({
-      message: '标记缺考失败',
+      message: '操作失败',
       type: 'success',
       grouping: true,
     })
@@ -107,10 +136,11 @@ function handleClickSign(id?: string) {
       <el-table-column prop="name" label="操作" width="120">
         <template #default="{ row }">
           <el-button
-            :type="row.dtk.ysk_id === '0' ? 'primary' : 'danger'" size="small"
-            @click="handleClickSign(row.user_id)"
+            :type="['3', '4'].includes(row.dtk.statue) ? 'primary' : 'danger'" size="small"
+            @click="handleClickSign(row)"
           >
-            {{ row.dtk.ysk_id === '0' ? '标记为缺考' : '取消标记缺考' }}
+            {{ ['3', '4'].includes(row.dtk.statue) ? '标记为缺考' : ['1', '2', '5'].includes(row.dtk.statue) ? '取消标记缺考' : '错误'
+            }}
           </el-button>
         </template>
       </el-table-column>

+ 84 - 37
src/pages/ksfx/cjfx_cjd/[ykj_id].vue

@@ -7,13 +7,9 @@
       <div class="w-188">
         <leftSider :activeIndex="activeIndex" :ykjId="ykjId"  @parentClick="parentClick"/>
       </div>
-
       <div class="w-942 p-4 blueBg">
-
         <div class="flex items-center">
-
           <optionSelect  @optionClick="optionClick" />
-
         </div>
         <div class="mt-4 exportBtn">
           <el-button color="#003eee" type="primary" size="large" @click="exportBtn">导出</el-button>
@@ -73,6 +69,29 @@
 
         </div>
 
+
+        <!-- 优化的图标结构 -->
+        <el-table :data="tableMicData" border style="width: 100%">
+        <el-table-column  prop="name"  align="center"  label="年级"> </el-table-column>
+        <!-- 循环1级表头 -->
+        <template v-for="(item, index) in tableMicTitle" :key="index">
+          <el-table-column align="center"  :label="item" >
+            <!-- 循环2级表头 -->
+            <template   v-for="items in tableMicLabel"  :key="items.key">
+              <el-table-column :label="items.label" width="100" align="center">
+                <template v-for="(i,index) in items.type"  :key="index" slot-scope="scope">
+
+                  <div>
+                    {{ scope.row.type[index][items.key] }}
+                  </div>
+                </template>
+              </el-table-column>
+            </template>
+          </el-table-column>
+        </template>
+      </el-table>
+
+
       </div>
     </div>
 
@@ -88,22 +107,10 @@
 }
 </route>
 <script lang="ts" setup>
-import {ksjh_detail,cjfx_cjd_list } from '../apiItem';
+import {cjfx_cjd_list } from '../apiItem';
 import {user} from "~/store";
 const route = useRoute();
 
-let normal_school = ref();
-let normal_subject = ref();
-let normal_classroom = ref();
-
-
-let school_list = ref([]);
-
-let classroom_list =ref([]) ;
-let subject_list = ref([]);
-let schoolAndClass = ref([]);
-
-
 
 
 // 侧边栏点击
@@ -125,12 +132,6 @@ let listTitleShow = ref({
       "fs": "分数",
       "bp": "班排",
       "np": "年排",
-    },
-    {
-      "subTitle": "数学",
-      "fs": "分数",
-      "bp": "班排",
-      "np": "年排",
     }
   ]
 });
@@ -145,13 +146,7 @@ let listShow = ref([
         "fs": "87.45",
         "bp": "1",
         "np": "1",
-      },
-      {
-        "subTitle": "数学",
-        "fs": "87.45",
-        "bp": "1",
-        "np": "1",
-      },
+      }
 
     ]
   },
@@ -160,9 +155,57 @@ let listShow = ref([
 
 ykjId.value = route.params.ykj_id;
 
+const tableMicTitle = ref();
+const tableMicLabel=ref([
+  {
+    label: "R%",
+    key: "mgan",
+  },
+  {
+    label: "S%",
+    key: "naiyao",
+  },
+  {
+    label: "I%",
+    key: "zjie",
+  },
+]);
+const tableMicData = ref(
+  [{
+    name: "asd",
+    type: [
+      { tab: "肺炎克雷伯", mgan: "1", naiyao: "2", zjie: "3" },
+      { tab: "铜绿假", mgan: "4", naiyao: "5", zjie: "6" },
+      { tab: "鲍式不动杆菌", mgan: "9", naiyao: "8", zjie: "7" },
+    ],
+  },
+  {
+    name: "asd2",
+    type: [
+      { tab: "肺炎克雷伯", mgan: "11", naiyao: "12", zjie: "13" },
+      { tab: "铜绿假", mgan: "21", naiyao: "22", zjie: "23" },
+      { tab: "鲍式不动杆菌", mgan: "1", naiyao: "2", zjie: "33" },
+    ],
+    }]
+);
+
 onMounted(() => {
   initData();
+
+  //循环+去重
+  aa();
+
 })
+const aa = () => {
+  let tableMicTitle_temp: Iterable<any>|null|undefined = [];
+  tableMicData.value.forEach(o=>{
+    o.type.forEach(item => {
+      tableMicTitle_temp.push(item.tab)
+     })
+  })
+  tableMicTitle.value = [...new Set(tableMicTitle_temp)]
+}
+
 
 const school_id = ref("");
 const grade_id = ref("");
@@ -230,7 +273,7 @@ const exportBtn = () => {
 
 .listMain {
   max-height: 600px;
-  overflow-y: auto;
+  overflow: auto;
 }
 
 .listMain_title {
@@ -241,26 +284,30 @@ const exportBtn = () => {
 }
 
 .singleT {
-  flex: 1;
+  // flex: 1;
+  // width: fit-content;
   line-height: 74px;
-  width: fit-content;
+  width:100px;
   text-align: center;
 }
 
 .singleD {
-  flex: 1;
+  // flex: 1;
+  width:100px;
 }
 
 .singleTSec {
-  width: fit-content;
-  flex: 1;
+  // width: fit-content;
+  // flex: 1;
+  width:100px;
   line-height: 60px;
   text-align: center;
 }
 
 .singleDSec {
-  flex: 1;
+  // flex: 1;
   line-height: 60px;
+  width:200px;
 }
 
 .secFullWidth {

+ 42 - 11
src/pages/ksfx/cjfx_jstj/[ykj_id].vue

@@ -11,18 +11,20 @@
       <div class="w-1012px p-4 blueBg">
 
         <div class="flex items-center">
-
           <optionSelect  @optionClick="optionClick" />
-
-
         </div>
+
+        <div class="w-270px searchBtn" @click="handleSearch">
+            <el-input v-model="searchVal" class="w-50 mt-2 h-auto" placeholder="请输入搜索内容" />
+          <div class="w-26px h-26px rounded searchBtnIcon">
+            <img src="/images/searchBtnIcon.png" alt="">
+          </div>
+          </div>
         <div class="flex justify-between mt-4 exportBtn">
           <div>
             <el-button color="#003eee" type="primary" size="large" @click="exportBtn">导出</el-button>
           </div>
-          <div>
-            <el-input v-model="searchVal" class="w-50 m-2" placeholder="请输入搜索内容" :prefix-icon="Search" />
-          </div>
+
 
         </div>
 
@@ -46,7 +48,7 @@
           </el-table>
 
           <div class="mt-4" >
-            <el-pagination background layout="prev, pager, next " :total="1000" style="justify-content: right;" />
+            <el-pagination background layout="prev, pager, next " :total="totalPage" style="justify-content: right;" />
           </div>
 
         </div>
@@ -71,7 +73,7 @@ import {cjfx_jstj_list } from '../apiItem';
 const route = useRoute();
 import { user } from "~/store";
 
-let searchVal = $ref('');
+
 
 const activeIndex =ref('1-5');
 const ykjId = ref();
@@ -80,9 +82,9 @@ const parentClick = (val: string) => {
   ykjId.value = route.params.ykj_id;
 }
 
-
+let searchVal = ref('');
 const tableData = ref([]);
-
+const totalPage = ref();
 ykjId.value = route.params.ykj_id;
 onMounted(() => {
   initData();
@@ -96,17 +98,24 @@ const initData =() => {
     school_id:school_id.value,
     cm_id: grade_id.value,
     xueke_id: xueke_id.value,
-    jh_id:route.params.ykj_id
+    jh_id: route.params.ykj_id,
+    keyword:searchVal.value,
   }
   cjfx_jstj_list(transObj)
     .then(res => {
       if (res.code == "1") {
         tableData.value = res.data.data.tableData;
+        totalPage.value = res.data.data.tableData.length;
       }
     })
   .catch(error=>{console.log(error)})
 }
 
+//搜索
+const handleSearch = () => {
+  initData();
+}
+
 //option筛选
 const optionClick = (val: any, marke: any) => {
   if (marke == "scholl") {
@@ -131,6 +140,9 @@ const exportBtn = () => {
 
 <style lang="scss" scoped>
 @import '@/styles/ksfx.css';
+::v-deep .el-input__wrapper{
+  height:40px;
+}
 ::v-deep .el-sub-menu__title {
   background: #003eee;
   color: #fff;
@@ -209,4 +221,23 @@ const exportBtn = () => {
 .singleTSecDif {
   background-color: #fff;
 }
+
+.searchBtn{
+  position:relative;
+}
+.searchBtnIcon{
+  background-color: #0040EE;
+  position:absolute;
+  right:2%;
+  top:50%;
+  z-index:12;
+  transform: translate(0,-9px);
+  text-align:center;
+  cursor: pointer;
+}
+.searchBtnIcon img{
+  width:60%;
+  height:60%;
+  display:inline-block;
+}
 </style>

+ 66 - 23
src/pages/ksfx/cjfx_slyf/[ykj_id].vue

@@ -12,7 +12,12 @@
 
         <div class="flex items-center">
           <optionSelect  @optionClick="optionClick" />
-
+        </div>
+        <div class="w-270px  searchBtn" @click="handleSearch">
+          <el-input v-model="searchVal" class="w-50 mt-2 h-auto" placeholder="请输入搜索内容" />
+          <div class="w-26px h-26px rounded searchBtnIcon">
+            <img src="/images/searchBtnIcon.png" alt="">
+          </div>
         </div>
         <div class="flex justify-between mt-4 exportBtn">
           <div>
@@ -56,22 +61,26 @@
       <!-- dialog  -->
       <el-dialog v-model="dialogTableVisible" title="校三率一分" style="width: 90%;">
         <el-table :data="tableData" style="width: 100%;">
-            <el-table-column prop="xx" label="学校" show-overflow-tooltip width="200" />
-            <el-table-column prop="bj" label="班级" width="120" />
-            <el-table-column prop="pm" label="排名" />
-            <el-table-column prop="pjf" label="平均分" />
-            <el-table-column prop="ykrs" label="应考人数" />
-            <el-table-column prop="skrs" label="实考人数" />
-            <el-table-column prop="zgf" label="最高分" />
-            <el-table-column prop="yxrs" label="优秀人数" />
-            <el-table-column prop="yxl" label="优秀率" />
-            <el-table-column prop="jgrs" label="及格人数" />
-            <el-table-column prop="jgl" label="及格率" />
-            <el-table-column prop="dfrs" label="低分人数" />
-            <el-table-column prop="dfl" label="低分率" />
-            <el-table-column prop="nd" label="难度" />
-            <el-table-column prop="qfd" label="区分度" />
-            <el-table-column prop="bzc" label="标椎差" />
+            <el-table-column prop="xx" label="学校" show-overflow-tooltip />
+            <el-table-column prop="ksrs" label="考试人数"/>
+            <el-table-column prop="skrs" label="实考人数"/>
+            <el-table-column prop="zgf" label="最高分"/>
+            <el-table-column prop="pjf" label="平均分"/>
+            <el-table-column prop="pjfpm" label="平均分排名"/>
+            <el-table-column prop="pjfdf" label="平均分(得分)"/>
+            <el-table-column prop="yxl" label="优秀率"/>
+            <el-table-column prop="yxlpm" label="优秀率排名"/>
+            <el-table-column prop="yxldf" label="优秀率得分(30%)"/>
+            <el-table-column prop="jgl" label="及格率"/>
+            <el-table-column prop="jglpm" label="及格率排名"/>
+            <el-table-column prop="jgldf" label="及格率得分(30%)"/>
+            <el-table-column prop="dfrs" label="低分人数"/>
+            <el-table-column prop="dfl" label="低分率"/>
+            <el-table-column prop="zdf" label="总得分(100)"/>
+            <el-table-column prop="zpm" label="总排名"/>
+            <el-table-column prop="nd" label="难度"/>
+            <el-table-column prop="qfd" label="区分度"/>
+            <el-table-column prop="bzc" label="标准差 "/>
         </el-table>
         <template #footer>
           <span class="dialog-footer">
@@ -107,13 +116,17 @@ const parentClick = (val) => {
   ykjId.value = route.params.ykj_id;
 }
 
+const searchVal = ref();
+
+
 const tableData = ref([]);
+const totalPage = ref();
+const pageNum = ref(0);
 ykjId.value = route.params.ykj_id;
 
 onMounted(() => {
   initData()
 })
-const totalPage = ref();
 
 const school_id = ref("");
 const grade_id = ref("");
@@ -124,7 +137,11 @@ const initData =() => {
     school_id:school_id.value,
     cm_id: grade_id.value,
     xueke_id: xueke_id.value,
-    jh_id:route.params.ykj_id
+    jh_id: route.params.ykj_id,
+    yscjd_rkjs: user.value.user_id,
+    keyword:searchVal.value,
+    page: pageNum.value,
+    limit:10,
   }
   cjfx_slyf_list(transObj)
     .then(res => {
@@ -147,11 +164,16 @@ const optionClick = (val: any, marke: any) => {
   }
   initData();
 }
-
+//搜索
+const handleSearch = () => {
+  initData();
+}
 //重置
 const restBtn = () => {
-  normal_teacher = "";
-
+  school_id.value = '';
+  grade_id.value ='';
+  xueke_id.value = '';
+  initData();
 }
 //导出
 const exportBtn = () => {
@@ -160,7 +182,6 @@ const exportBtn = () => {
   window.open(fullUrl,'_blank')
 }
 
-
 //弹出框
 const dialogTableVisible = ref(false)
 const openDialog = () => {
@@ -171,6 +192,9 @@ const openDialog = () => {
 
 
 <style lang="scss" scoped>
+::v-deep .el-input__wrapper{
+  height:40px;
+}
 ::v-deep .el-sub-menu__title {
   background: #003eee;
   color: #fff;
@@ -235,4 +259,23 @@ const openDialog = () => {
   text-align: center;
 }
 
+.searchBtn{
+  position:relative;
+}
+.searchBtnIcon{
+  background-color: #0040EE;
+  position:absolute;
+  right:2%;
+  top:50%;
+  z-index:12;
+  transform: translate(0,-9px);
+  text-align:center;
+  cursor: pointer;
+}
+.searchBtnIcon img{
+  width:60%;
+  height:60%;
+  display:inline-block;
+}
+
 </style>

+ 26 - 33
src/pages/ksfx/ksfx.vue

@@ -10,22 +10,22 @@
         placeholder="请输入检索内容"
       >
         <template #append>
-          <el-button :icon="Search" />
+          <el-button :icon="Search" @click="handleSearch" />
         </template>
       </el-input>
       </div>
       <div class="min-h-600px groupExamMian">
         <div class="demo-collapse">
-          <el-collapse v-model="activeNames" >
+          <el-collapse v-model="activeNames" accordion>
             <el-collapse-item :name="index + 1" v-for="(item, index) in examArrlist" :key="index"
               :class="{ 'bg-cusblue': (index+1) % 2 == 0 }">
               <template #title>
                 <div class="w-full h-60px flex flex-row justify-between examSingleT">
-                  <div>{{ item.examN }}</div>
-                  <div>参考人数:??</div>
-                  <div>满分:??</div>
-                  <div>最高分:??</div>
-                  <div class="singleColor">考试分析</div>
+                  <div style="width:62%;">{{ item.examN }}</div>
+                  <div style="width:10%;">参考人数:{{ item.attendExamNum }}</div>
+                  <div style="width:10%;">满分:{{ item.fullScore }}</div>
+                  <div style="width:10%;">最高分:{{item.maxScore}}</div>
+                  <div class="singleColor" style="width:8%; text-align:right;">考试分析</div>
                 </div>
 
               </template>
@@ -34,9 +34,9 @@
 
                 <div class="px-90px py-10px flex flex-row justify-start flex-wrap  examList" v-if="item.examPaperList">
                   <div class="h-149px p-5px mt-10px flex flex-row justify-start examListSingle"
-                    v-for="(secItem, secIndex) in item.examPaperList" :key="secIndex" @click="linkTo('stu_stfx')">
+                    v-for="(secItem, secIndex) in item.examPaperList" :key="secIndex" @click="linkTo(item)">
                     <div class="w-2/5 relative examListSingle_left">
-                      <img :src="examIcon" class="w-full h-full" alt="">
+                      <img src="/images/examIcon.png" class="w-full h-full" alt="">
                       <div class="w-full absolute top-0 left-0 text-right text-red-500 text-3xl font-bold pr-2 scoreNum"
                         v-if="secItem.scoreN != 0">{{ secItem.scoreN }}</div>
                       <div class=" absolute top-7px left-0 text-3xl font-bold  lockExam" v-else>
@@ -46,7 +46,7 @@
                           secItem.subName }}</div>
                     </div>
                     <div class="w-3/5 py-5px px-10px examListSingle_right">
-                      <p class="h-1/4">学科:{{ secItem.scoreN }}</p>
+                      <p class="h-1/4">学科:{{ secItem.subName }}</p>
                       <p class="h-1/4">总分:{{ secItem.scoreN }}</p>
                       <p class="h-1/4">客观题:{{ secItem.ObjectiveQuestion }}</p>
                       <p class="h-1/4">主观题:{{ secItem.SubjectiveQuestions }}</p>
@@ -76,7 +76,6 @@
 </route>
 <script setup>
 import { InfoFilled,Search } from '@element-plus/icons-vue';
-import examIcon from '@/assets/ksfx/examIcon.png';
 import { student_ksfx_list, ksjh_list } from "@/pages/ksfx/apiItem";
 
 import { useRouter } from "vue-router";
@@ -85,7 +84,7 @@ const router = useRouter();
 
 
 const searchValue = ref('');
-const activeNames = ref(['1']);
+const activeNames = ref([1]);
 const scoreMarkSwitch = ref(true);
 
 let examArrlist = ref();
@@ -95,51 +94,45 @@ onMounted(() => {
 });
 //初始化
 const initData = () => {
-  //接口模拟
-  // let transObj1 = {
-  //   sm_id: 267,
-  //   ykj_kslx: 7,
-  // }
-
-  // ksjh_list(transObj1)
-  //   .then(res => {
-  //     if (res.code == "1") {
-  //       console.log(res, "887878");
-  //       examArrlist.value = res.data.page_data;
-
-  //     }
-  //   })
-  //   .catch(error => { console.log(error) })
-
   let transObj = {
     xueke_id: '',
     grade_id: '',
-    school_id: ''
+    school_id: '',
+    keyword:searchValue.value,
   }
   student_ksfx_list(transObj)
     .then(res => {
       if (res.code == "1") {
-        console.log(res,"8989")
         examArrlist.value = res.data.data.examArrlist;
       }
     })
     .catch(error => { console.log(error) })
 }
+
+//搜索
+const handleSearch = () => {
+  initData();
+}
+
 //跳转
 const linkTo = (item) => {
-  router.push(item);
+  router.push({ name: 'ksfx-stu_stfx-ykj_id', params: { ykj_id: item.ykj_id } });
 }
 
 </script>
 
 <style lang="scss" scoped>
 @import '@/styles/ksfx.css';
-
-::v-deep .el-collapse-item__header {
+:deep(.el-collapse-item__header){
   height: 60px;
   border: 1px dashed grey;
   background-color: #F1F7FF;
 }
+// ::v-deep .el-collapse-item__header {
+//   height: 60px;
+//   border: 1px dashed grey;
+//   background-color: #F1F7FF;
+// }
 .searchInput{
   padding-left:80%;
 }

+ 2 - 1
src/pages/ksfx/sjfx_kgtfx/[ykj_id].vue

@@ -121,7 +121,8 @@ const initData = () => {
   let transObj = {
     xueke_id: '',
     grade_id: '',
-    school_id: ''
+    school_id: '',
+    jh_id:route.params.ykj_id
   }
   cjfx_kgtfx_list(transObj)
     .then(res => {

+ 8 - 18
src/pages/ksfx/stu_grcjd.vue

@@ -2,18 +2,11 @@
   <div class="stu_grcjd">
     <div class="w-1200px m-auto flex flex-row justify-between">
       <div class="w-188px h-full" style="background-color: #fff;">
-        <leftSiderStu :StuLeftMenuNum="StuLeftMenuNum" />
+        <leftSiderStu :StuLeftMenuNum="StuLeftMenuNum" :ykjId="ykjId" />
       </div>
 
       <div class="w-1012px p-4 blueBg">
 
-        <div class="flex mt-20px items-center">
-          <el-select class="mr-10px" v-model="normal_subject" placeholder="请选择学科" size="large">
-            <el-option label="全部" value="0" />
-            <el-option v-for="item in subject_list" :key="item.value" :label="item.label" :value="item.value" />
-          </el-select>
-        </div>
-
         <div class="flex justify-between mt-4 exportBtn">
           <div>
             <el-button color="#003eee" type="primary" size="large" @click="exportBtn">导出</el-button>
@@ -60,25 +53,22 @@ import {student_grcjd_list} from "@/pages/ksfx/apiItem";
 import { useRouter } from "vue-router";
 import { skeletonProps } from 'element-plus';
 const router = useRouter();
+import {user} from "~/store";
+const route = useRoute();
 
 let StuLeftMenuNum = 2;
 
-let normal_subject = $ref("");
-let subject_list = [{
-  value: '1',
-  label: '语文'
-}, {
-  value: '2',
-  label: '数学'
-}]
 
 const tableData =ref([])
-
+const ykjId = ref();
 //导出
 const exportBtn = () => {
-  console.log("导出")
+  let prefixedUrl = window.GLOBAL_CONFIG.web_pc;
+  let fullUrl = prefixedUrl + '/openapi/echart/user_score.php?api=xls&token=' + user.value.token;
+  window.open(fullUrl,'_blank')
 }
 
+ykjId.value = route.params.ykj_id;
 onMounted(() => {
   initData();
 })

+ 0 - 108
src/pages/ksfx/stu_stfx.vue

@@ -1,108 +0,0 @@
-<template>
-  <div class="stu_stfx">
-    <div class="w-1200px h-600px m-auto flex flex-row justify-between">
-      <div class="w-188px h-full" style="background-color: #fff;">
-        <leftSiderStu :StuLeftMenuNum="StuLeftMenuNum" />
-      </div>
-
-      <div class="w-1012px p-4 blueBg">
-
-        <div class="flex mt-20px items-center">
-          <el-select class="mr-10px" v-model="normal_subject" placeholder="请选择学科" size="large">
-            <el-option label="全部" value="0" />
-            <el-option v-for="item in subject_list" :key="item.value" :label="item.label" :value="item.value" />
-          </el-select>
-        </div>
-
-        <div class="flex justify-between mt-4 exportBtn">
-          <div>
-            <el-button color="#003eee" type="primary" size="large" @click="exportBtn">导出</el-button>
-          </div>
-        </div>
-
-        <div class="h-auto mt-9px listMain">
-          <el-table :data="tableData" style="width: 100%" height="auto">
-
-            <el-table-column prop="xk" label="学科" />
-            <el-table-column prop="tm" label="题目" />
-            <el-table-column prop="lx" label="类型" />
-            <el-table-column prop="nd" label="难度" />
-            <el-table-column prop="df" label="得分" />
-            <el-table-column prop="grdf" label="个人得分" />
-
-            <el-table-column label="得分率" fixed="right">
-              <el-table-column prop="gr" label="个人" />
-              <el-table-column prop="bj" label="班级" />
-              <el-table-column prop="bj" label="年级" />
-              <el-table-column prop="ztks" label="整体考试"/>
-            </el-table-column>
-
-          </el-table>
-
-        </div>
-
-      </div>
-
-    </div>
-  </div>
-</template>
-
-<script setup lang="ts">
-import {student_stfx_list} from "@/pages/ksfx/apiItem";
-import { useRouter } from "vue-router";
-const router = useRouter();
-
-let StuLeftMenuNum = 0;
-
-let normal_subject = $ref("");
-let subject_list = [{
-  value: '1',
-  label: '语文'
-}, {
-  value: '2',
-  label: '数学'
-}]
-
-const tableData = ref([]);
-onMounted(() => {
-  initData()
-})
-
-const initData = () => {
-  let transObj = {
-    xueke_id: '',
-    grade_id: '',
-    school_id:''
-  }
-  student_stfx_list(transObj)
-    .then(res => {
-      if (res.code == "1") {
-        tableData.value = res.data.data.tableData;
-      }
-    })
-    .catch(error => { console.log(error) });
-}
-
-//导出
-const exportBtn = () => {
-  console.log("导出")
-}
-
-</script>
-
-<style scoped>
-@import '@/styles/ksfx.css';
-.singleT {
-  flex: 1;
-  font-size: 16px;
-  line-height: 74px;
-  width: fit-content;
-  text-align: center;
-  background: #003eee;
-}
-.secFullWidth{
-  flex: 1;
-  width: fit-content;
-}
-
-</style>

+ 144 - 0
src/pages/ksfx/stu_stfx/[ykj_id].vue

@@ -0,0 +1,144 @@
+<template>
+  <div class="stu_stfx">
+    <NavHeader />
+    <bread-crumb />
+
+    <div class="w-1200px h-600px m-auto flex flex-row justify-between">
+      <div class="w-188px h-full" style="background-color: #fff;">
+        <leftSiderStu  :StuLeftMenuNum="StuLeftMenuNum" :ykjId="ykjId" />
+      </div>
+
+      <div class="w-1012px p-4 blueBg">
+
+        <div class="flex mt-20px items-center">
+          <el-select class="mr-10px" v-model="normal_subject" placeholder="请选择学科" size="large" @change="handleSelect">
+            <el-option label="全部" value="0" />
+            <el-option v-for="item in subject_list" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+        </div>
+
+        <div class="flex justify-between mt-4 exportBtn">
+          <div>
+            <el-button color="#003eee" type="primary" size="large" @click="exportBtn">导出</el-button>
+          </div>
+        </div>
+
+        <div class="h-auto mt-9px listMain">
+          <el-table :data="tableData" style="width: 100%" height="auto">
+
+            <el-table-column prop="xk" label="学科" ></el-table-column>
+            <el-table-column prop="tm" label="题目" ></el-table-column>
+            <el-table-column prop="lx" label="类型" ></el-table-column>
+            <el-table-column prop="nd" label="难度" ></el-table-column>
+            <el-table-column prop="df" label="得分" ></el-table-column>
+            <el-table-column prop="grdf" label="个人得分" ></el-table-column>
+
+            <el-table-column label="得分率" fixed="right">
+              <el-table-column prop="gr" label="个人" ></el-table-column>
+              <el-table-column prop="bj" label="班级" ></el-table-column>
+              <el-table-column prop="bj" label="年级" ></el-table-column>
+              <el-table-column prop="ztks" label="整体考试"></el-table-column>
+            </el-table-column>
+          </el-table>
+        </div>
+
+      </div>
+
+    </div>
+    <commonFooter />
+  </div>
+</template>
+
+<script setup lang="ts">
+import { useRouter } from "vue-router";
+import {ksjh_detail,student_stfx_list} from "@/pages/ksfx/apiItem";
+import {user} from "~/store";
+const route = useRoute();
+
+const ykjId = ref();
+
+
+const StuLeftMenuNum = ref(0);
+
+const normal_subject = ref();
+const subject_list = ref([])
+
+const tableData = ref([]);
+const xueke_id = ref(0);
+
+ykjId.value = route.params.ykj_id;
+onMounted(() => {
+  initOption();
+  initData()
+})
+
+// 初始化选项列表
+const initOption = () => {
+  let transObj = {
+    ykj_id:route.params.ykj_id,
+  }
+  ksjh_detail(transObj)
+    .then(res => {
+      if (res.code == "1") {
+        //初始化联考学校
+        let allLc = res.data.one_info.lc_filter;
+        let temp_xueke: { value: any; label: any; }[] = [];
+        allLc.forEach((item: { ze_id: any; ykl_lc: string; }) => {
+          temp_xueke.push({
+            value: item.ze_id,
+            label: item.ze_xueke_name
+          })
+        })
+        subject_list.value = temp_xueke;
+
+      }
+    })
+    .catch(error => { console.log(error) })
+}
+
+//初始化数据
+const initData = () => {
+  let transObj = {
+    xueke_id: xueke_id.value,
+    jh_id:route.params.ykj_id,
+  }
+  student_stfx_list(transObj)
+    .then(res => {
+      if (res.code == "1") {
+        tableData.value = res.data.data.tableData;
+      }
+    })
+    .catch(error => { console.log(error) });
+}
+
+//导出
+const exportBtn = () => {
+  let prefixedUrl = window.GLOBAL_CONFIG.web_pc;
+  let fullUrl = prefixedUrl + '/openapi/echart/shiti_data.php?api=xls&token=' + user.value.token;
+  window.open(fullUrl,'_blank')
+}
+
+//学科选择
+const handleSelect = (value) => {
+  xueke_id.value = value;
+  initData();
+}
+
+</script>
+
+<style scoped>
+@import '@/styles/ksfx.css';
+.singleT {
+  flex: 1;
+  font-size: 16px;
+  line-height: 74px;
+  width: fit-content;
+  text-align: center;
+  background: #003eee;
+}
+.secFullWidth{
+  flex: 1;
+  width: fit-content;
+}
+
+</style>

+ 0 - 125
src/pages/ksfx/stu_wdsj.vue

@@ -1,125 +0,0 @@
-<template>
-  <div class="stu_stfx">
-    <div class="w-1200px m-auto flex flex-row justify-between">
-      <div class="w-188px h-full" style="background-color: #fff;">
-        <leftSiderStu :StuLeftMenuNum="StuLeftMenuNum" />
-      </div>
-
-      <div class="w-1012px p-12 blueBg">
-
-        <div class="flex my-20px items-center">
-          <el-select class="mr-10px" v-model="normal_subject" placeholder="请选择学科" size="large">
-            <el-option label="全部" value="0" />
-            <el-option v-for="item in subject_list" :key="item.value" :label="item.label" :value="item.value" />
-          </el-select>
-        </div>
-
-
-        <swiper :slidesPerView="1" :spaceBetween="30" :loop="true" :centeredSlides="true"
-        :pagination="{	clickable: true}"
-        :autoplay="{
-          delay: 2500,
-          disableOnInteraction: false
-        }"
-        :navigation="true"
-        :modules="modules"
-        class="mySwiper"
-      >
-			<swiper-slide class="mainSwiper" v-for="(item,index) in imgArr" :key="index" @click="clickCurrent(item)">
-          <img :src="item" srcset="">
-        </swiper-slide>
-      </swiper>
-
-      </div>
-
-    </div>
-
-    <!-- dialog弹出框 -->
-    <el-dialog
-        v-model="dialogVisible"
-        title="试卷预览"
-        width="70%"
-        :before-close="handleClose"
-      >
-        <span class="dialogShow">
-          <img :src="examIcon" alt="">
-        </span>
-      </el-dialog>
-    </div>
-</template>
-
-<script lang="ts" setup>
-import examIcon from '@/assets/ksfx/examPreview.png';
-import { useRouter } from "vue-router";
-const router = useRouter();
-import { student_wdsj_list } from "~/pages/process/api";
-import { ElMessageBox } from 'element-plus'
-
-let StuLeftMenuNum = 1;
-
-let normal_subject = $ref("");
-let subject_list = [{
-  value: '1',
-  label: '语文'
-}, {
-  value: '2',
-  label: '数学'
-}]
-
-const imgArr = ref(["src/assets/ksfx/examPreview.png", "src/assets/ksfx/examPreview.png"]);
-
-import { Swiper, SwiperSlide } from 'swiper/vue'; // swiper所需组件
-// 这是分页器和对应方法,swiper好像在6的时候就已经分离了分页器和一些其他工具
-import { Autoplay, Navigation, Pagination, A11y } from 'swiper';
-// 引入swiper样式,对应css 如果使用less或者css只需要把scss改为对应的即可
-import 'swiper/css';
-import 'swiper/css/navigation';
-import 'swiper/css/pagination';
-//默认滑动效果(这里面注释掉的可以不要)
-// const onSwiper = swiper => {
-// 	console.log(swiper);
-// };
-// const onSlideChange = e => {
-// 	// swiper切换的时候执行的方法
-// 	console.log('slide change', e.activeIndex);
-// };
-// setup语法糖只需要这样创建一个变量就可以正常使用分页器和对应功能,如果没有这个数组则无法使用对应功能
-const modules = [Autoplay, Pagination, Navigation, A11y];
-
-const clickCurrent = (item) => {
-  console.log(item, "87878");
-  dialogVisible.value = true;
-}
-
-
-
-const dialogVisible = ref(false)
-
-const handleClose = (done: () => void) => {
-  ElMessageBox.confirm('确定要关闭吗?')
-    .then(() => {
-      done()
-    })
-    .catch(() => {
-      // catch error
-    })
-}
-
-
-</script>
-
-<style scoped>
-@import '@/styles/ksfx.css';
-.mainSwiper{
-  text-align: center;
-  img{
-    display:inline-block;
-  }
-}
-.dialogShow{
-  img{
-    width:100%;
-    display:inline-block;
-  }
-}
-</style>

+ 191 - 0
src/pages/ksfx/stu_wdsj/[ykj_id].vue

@@ -0,0 +1,191 @@
+<template>
+  <div class="stu_stfx">
+    <NavHeader />
+    <bread-crumb />
+
+    <div class="w-1200px m-auto flex flex-row justify-between">
+      <div class="w-188px h-full" style="background-color: #fff;">
+        <leftSiderStu :StuLeftMenuNum="StuLeftMenuNum" :ykjId="ykjId" />
+      </div>
+
+      <div class="w-1012px p-12 blueBg">
+
+        <div class="w-full flex flex-row flex-wrap">
+          <div class="w-1/4 text-center mb-8 cursor-pointer singlePart" v-for="(item, index) in imgArr" :key="index"
+            @click="clickCurrent(item.allFullExamSJ)">
+            <div class="p-4 picIn">
+              <img :src="item.thumbImg" alt="" />
+            </div>
+            <p>{{ item.examTitle }}</p>
+          </div>
+        </div>
+
+        <div class="demo-pagination-block">
+          <el-pagination v-model:current-page="currentPage4" v-model:page-size="pageSize4"
+            :page-sizes="[12, 12*2, 12*3, 12*4]" :small="small" :disabled="disabled" background
+            layout="total, sizes, prev, pager, next, jumper" :total="48" @size-change="handleSizeChange"
+            @current-change="handleCurrentChange" style="justify-content: right;" />
+        </div>
+
+      </div>
+
+    </div>
+
+    <!-- dialog弹出框 -->
+    <el-dialog v-model="dialogVisible" title="试卷预览" width="70%">
+      <span class="dialogShow">
+
+        <swiper :slidesPerView="1" :spaceBetween="30" :loop="true" :centeredSlides="true"
+          :pagination="{ clickable: true }" :autoplay="{
+            delay: 2500,
+            disableOnInteraction: false
+          }" :navigation="true" :modules="modules" class="mySwiper">
+          <swiper-slide class="mainSwiper" v-for="(secItem, ind) in dialogShow" :key="ind">
+            <img :src="secItem">
+          </swiper-slide>
+        </swiper>
+      </span>
+    </el-dialog>
+
+    <commonFooter />
+  </div>
+</template>
+<route lang="json">
+  {
+    "meta": {
+      "title": "考试分析",
+      "breadcrumb": true
+    }
+  }
+  </route>
+<script lang="ts" setup>
+import { useRouter } from "vue-router";
+import { student_wdsj_list } from "@/pages/ksfx/apiItem";
+import {user} from "~/store";
+const route = useRoute();
+
+import { Swiper, SwiperSlide } from 'swiper/vue'; // swiper所需组件
+// 这是分页器和对应方法,swiper好像在6的时候就已经分离了分页器和一些其他工具
+import { Autoplay, Navigation, Pagination, A11y } from 'swiper';
+// 引入swiper样式,对应css 如果使用less或者css只需要把scss改为对应的即可
+import 'swiper/css';
+import 'swiper/css/navigation';
+import 'swiper/css/pagination';
+//默认滑动效果(这里面注释掉的可以不要)
+// const onSwiper = swiper => {
+// 	console.log(swiper);
+// };
+// const onSlideChange = e => {
+// 	// swiper切换的时候执行的方法
+// 	console.log('slide change', e.activeIndex);
+// };
+// setup语法糖只需要这样创建一个变量就可以正常使用分页器和对应功能,如果没有这个数组则无法使用对应功能
+const modules = [Autoplay, Pagination, Navigation, A11y];
+
+
+let StuLeftMenuNum = 1;
+const imgArr = ref(
+  [
+    {
+      thumbImg: "/images/examPreview.png",
+      examTitle: "苏州工艺教具设计",
+      allFullExamSJ: ["/images/examPreview.png", "/images/examPreview.png"]
+    },
+    {
+      thumbImg: "/images/examPreview.png",
+      examTitle: "语文",
+      allFullExamSJ: ["/images/examPreview.png", "/images/examPreview.png"]
+    },
+    {
+      thumbImg: "/images/examPreview.png",
+      examTitle: "苏州工艺教具设计",
+      allFullExamSJ: ["/images/examPreview.png", "/images/examPreview.png"]
+    },
+    {
+      thumbImg: "/images/examPreview.png",
+      examTitle: "苏州工艺教具设计",
+      allFullExamSJ: ["/images/examPreview.png", "/images/examPreview.png"]
+    },
+    {
+      thumbImg: "/images/examPreview.png",
+      examTitle: "苏州工艺教具设计",
+      allFullExamSJ: ["/images/examPreview.png", "/images/examPreview.png"]
+    },
+  ]
+);
+const dialogVisible = ref(false)
+const dialogShow = ref([]);
+
+const ykjId = ref();
+
+ykjId.value = route.params.ykj_id;
+
+onMounted(() => {
+  // initData()
+})
+
+const initData = () => {
+  let transObj = {
+    xueke_id: '',
+    grade_id: '',
+    school_id:''
+  }
+  student_wdsj_list(transObj)
+    .then(res => {
+      if (res.code == "1") {
+
+      }
+    })
+    .catch(error => { console.log(error) });
+}
+
+// 点击单独试卷弹出(dialog弹出)
+const clickCurrent = (item) => {
+  dialogVisible.value = true;
+  dialogShow.value = item;
+}
+
+const small = ref(false)
+const disabled = ref(false)
+const currentPage4 = ref(1)
+const pageSize4 = ref(12)
+
+const handleSizeChange = (val: number) => {
+  console.log(`${val} items per page`)
+}
+const handleCurrentChange = (val: number) => {
+  console.log(`current page: ${val}`)
+}
+
+</script>
+
+<style scoped>
+@import '@/styles/ksfx.css';
+:deep(.el-pagination.is-background .el-pager li.is-active){
+  background-color:#0148E5;
+}
+.mainSwiper {
+  text-align: center;
+}
+
+.mainSwiper img {
+  display: inline-block;
+}
+
+.dialogShow img {
+  width: 100%;
+  display: inline-block;
+}
+
+.picIn img {
+  width: 100%;
+  height: 100%;
+}
+
+.demo-pagination-block + .demo-pagination-block {
+  margin-top: 10px;
+}
+.demo-pagination-block .demonstration {
+  margin-bottom: 16px;
+}
+</style>

+ 1 - 1
src/pages/step/[id].vue

@@ -492,7 +492,7 @@ const TaskEventMap: { [key: string]: () => void } = {
   },
   '压缩包上传情况': () => {
     // todo: 需调整【压缩包】上传情况
-    routerPush(`/process/paper-scan/${ykl_lc.ze_id}`)
+    routerPush(`/process/ysb/${ykl_lc.ykl_id}/${ykl_lc.ze_id}`)
     handleCompleteTaskAuto()
   },
   '答题卡二次扫描': () => {

+ 6 - 25
src/styles/ksfx.css

@@ -1,46 +1,27 @@
-::v-deep .el-sub-menu__title {
+:deep(.el-sub-menu__title){
   background: #003eee;
   color: #fff;
 }
-
-::v-deep .el-table__header thead tr th {
-  background: #003eee !important;
+:deep(.el-table__header thead tr th){
+ background: #003eee !important;
   color: #fff;
   height: 50px;
   line-height: 50px;
   font-weight: normal;
 }
-
-::v-deep .el-table__header thead tr th:first-child {
+:deep(.el-table__header thead tr th:first-child){
   border-top-left-radius: 9px;
 }
-
-::v-deep .el-table__body tbody .el-table__row td {
+:deep(.el-table__body tbody .el-table__row td){
   background-color: transparent;
 }
-
-::v-deep .el-dialog__footer {
+:deep(.el-dialog__footer){
   text-align: center;
 }
 
 
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 .normalTit{
   width: 158px;
   height: 42px;