Explorar o código

Merge branch 'master' into luohl

* master:
  swipe
  ....
  学生端
  .....
  总体分析 试题分析
  分数段统计 平均分离差分析 教师统计 总体分析
luohailiang %!s(int64=2) %!d(string=hai) anos
pai
achega
74566b7bb3

+ 4 - 0
components.d.ts

@@ -11,10 +11,13 @@ declare module '@vue/runtime-core' {
   export interface GlobalComponents {
     BreadCrumb: typeof import('./src/components/BreadCrumb/index.vue')['default']
     CommonFooter: typeof import('./src/components/commonFooter/index.vue')['default']
+    copy: typeof import('./src/components/leftSider copy/index.vue')['default']
     ElAvatar: typeof import('element-plus/es')['ElAvatar']
     ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
     ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
     ElButton: typeof import('element-plus/es')['ElButton']
+    ElCollapse: typeof import('element-plus/es')['ElCollapse']
+    ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem']
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
     ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
     ElDialog: typeof import('element-plus/es')['ElDialog']
@@ -35,6 +38,7 @@ declare module '@vue/runtime-core' {
     ElTable: typeof import('element-plus/es')['ElTable']
     ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
     LeftSider: typeof import('./src/components/leftSider/index.vue')['default']
+    LeftSiderStu: typeof import('./src/components/leftSiderStu/index.vue')['default']
     NavHeader: typeof import('./src/components/NavHeader/index.vue')['default']
     RouterLink: typeof import('vue-router')['RouterLink']
     RouterView: typeof import('vue-router')['RouterView']

+ 2 - 0
package.json

@@ -18,7 +18,9 @@
     "element-plus": "^2.3.2",
     "pinia": "^2.0.34",
     "sass": "^1.62.0",
+    "swiper": "^9.2.3",
     "vue": "^3.2.47",
+    "vue-awesome-swiper": "^5.0.1",
     "vue-router": "^4.0.13"
   },
   "devDependencies": {

+ 25 - 0
pnpm-lock.yaml

@@ -20,6 +20,7 @@ specifiers:
   pnpm: ^8.1.0
   sass: ^1.62.0
   simple-git-hooks: ^2.8.1
+  swiper: ^9.2.3
   taze: ^0.9.1
   typescript: ^5.0.2
   unplugin-auto-import: ^0.15.2
@@ -30,6 +31,7 @@ specifiers:
   vite-plugin-windicss: ^1.8.10
   vitest: ^0.29.8
   vue: ^3.2.47
+  vue-awesome-swiper: ^5.0.1
   vue-router: ^4.0.13
   vue-tsc: ^1.2.0
   windicss: ^3.5.6
@@ -40,7 +42,9 @@ dependencies:
   element-plus: 2.3.3_vue@3.2.47
   pinia: 2.0.34_dtjfskxukdxv24psui2m5c75zy
   sass: 1.62.0
+  swiper: 9.2.3
   vue: 3.2.47
+  vue-awesome-swiper: 5.0.1_swiper@9.2.3+vue@3.2.47
   vue-router: 4.0.13_vue@3.2.47
 
 devDependencies:
@@ -5012,6 +5016,10 @@ packages:
     resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==}
     dev: true
 
+  /ssr-window/4.0.2:
+    resolution: {integrity: sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==}
+    dev: false
+
   /ssri/9.0.1:
     resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==}
     engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
@@ -5149,6 +5157,13 @@ packages:
     engines: {node: '>= 0.4'}
     dev: true
 
+  /swiper/9.2.3:
+    resolution: {integrity: sha512-hxqcjIsYPP1fv+KIXPqGywl6ik8RBp0y0i9+TOIh55ca6SpZ5FrgNJ4QXPhsl6mlSBMEYPmh5zOKtZpI8zpWeQ==}
+    engines: {node: '>= 4.7.0'}
+    dependencies:
+      ssr-window: 4.0.2
+    dev: false
+
   /symbol-tree/3.2.4:
     resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
     dev: true
@@ -5704,6 +5719,16 @@ packages:
       - terser
     dev: true
 
+  /vue-awesome-swiper/5.0.1_swiper@9.2.3+vue@3.2.47:
+    resolution: {integrity: sha512-mWjFJzUqA4lG+DmsmibvMpoiBnl+IH2SSeiiQ3i5M0t1y9FknTxnGT0DsMb2YdJLgjYMEK3sYOWzqgLnZMH8Lg==}
+    peerDependencies:
+      swiper: ^7.0.0  || ^8.0.0
+      vue: 3.x
+    dependencies:
+      swiper: 9.2.3
+      vue: 3.2.47
+    dev: false
+
   /vue-demi/0.13.11_vue@3.2.47:
     resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==}
     engines: {node: '>=12'}

BIN=BIN
src/assets/ksfx/downIcon.png


BIN=BIN
src/assets/ksfx/examIcon.png


BIN=BIN
src/assets/ksfx/upIcon.png


+ 2 - 0
src/components/leftSider/index.vue

@@ -39,9 +39,11 @@ import { useRouter } from "vue-router";
 const router = useRouter();
 import { Document, Location, Setting} from '@element-plus/icons-vue';
 
+//开启
 const handleOpen = (key: string, keyPath: string[]) => {
   console.log(key, keyPath)
 }
+
 const handleClose = (key: string, keyPath: string[]) => {
   console.log(key, keyPath)
 }

+ 35 - 0
src/components/leftSiderStu/index.vue

@@ -0,0 +1,35 @@
+<template>
+  <div class="leftSideMenu">
+    <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 { useRouter } from "vue-router";
+const router = useRouter();
+
+let siderList=["试题分析","我的试卷","个人成绩单"]
+let num = ref(0);
+
+const handleClick = (item) => {
+  num.value = item;
+}
+
+</script>
+
+<style lang="scss" scoped>
+.leftSideMenu{
+  background-color: #fff;
+}
+.singleSider{
+  height: 45px;
+  line-height: 45px;
+  text-align: center;
+  cursor: pointer;
+}
+.activeIn{
+  color: #0148E5;
+  background-color:#F5F8FF;
+  border-right:3px solid #0148E5;
+}
+</style>

+ 2 - 5
src/pages/cjfx/cjfx_cjd.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="cjfxCjd">
+  <div class="cjfx_cjd">
     <NavHeader />
     <bread-crumb />
 
@@ -89,7 +89,7 @@
 <route lang="json">
 {
   "meta": {
-    "title": "成绩分析",
+    "title": "考试分析",
     "breadcrumb": true
   }
 }
@@ -149,8 +149,6 @@ let listTitleShow = {
   ]
 }
 
-
-
 let listShow = [
   {
     kh: "2345443211",
@@ -265,7 +263,6 @@ let listShow = [
 }
 
 .listMain_title {
-
   font-size: 16px;
   color: #fff;
   background: #003eee;

+ 53 - 88
src/pages/cjfx/cjfx_fsdtj.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="cjfxCjd">
+  <div class="cjfx_fsdtj">
     <NavHeader />
     <bread-crumb />
 
@@ -35,31 +35,17 @@
 
         </div>
 
-        <div class="h-200 mt-9px overflow-x-auto listMain" id="listMain"></div>
+        <div class="h-150px mt-20px overflow-x-auto echartData" id="echartData"></div>
 
-        <div class="h-auto">
-           <div class="h-50px flex flex-wrap flex-grow justify-between rounded px-4 listMain_title">
-            <div class="singleT" v-for="(item,index) in listTitleShow" :key="index">{{item}}</div>
+        <div class="w-980px h-auto tableList">
+           <div class="h-50px rounded flex flex-nowrap tableList_title">
+            <div class="w-11/12 bg-opacity-0 singleT"></div>
+            <div class="w-11/12 singleT" v-for="(item,index) in classArr" :key="index">{{item}}</div>
           </div>
 
-          <div class="h-200px flex flex-wrap flex-grow justify-between px-4" v-for="(item,index) in listShow" :key="index">
-            <div class="singleTSec" >{{ item.xx }}</div>
-            <div class="singleTSec">{{ item.bj }}</div>
-            <div class="singleTSec">{{ item.pm }}</div>
-
-            <div class="singleTSec" >{{ item.pjf }}</div>
-            <div class="singleTSec">{{ item.ykrs }}</div>
-            <div class="singleTSec">{{ item.skrs }}</div>
-            <div class="singleTSec" >{{ item.zgf }}</div>
-            <div class="singleTSec">{{ item.yxrs }}</div>
-            <div class="singleTSec">{{ item.yxl}}</div>
-            <div class="singleTSec" >{{ item.jgrs }}</div>
-            <div class="singleTSec">{{ item.dfrs }}</div>
-            <div class="singleTSec">{{ item.dfl }}</div>
-            <div class="singleTSec" >{{ item.nd }}</div>
-            <div class="singleTSec">{{ item.qfd }}</div>
-            <div class="singleTSec">{{ item.bzc }}</div>
-
+          <div class="h-auto flex flex-nowrap tableList_content" v-for="(item,index) in classBaseInfoArr" :key="index">
+            <div class="w-11/12 h-60px rounded  mt-2px  singleTSec singleTSecDif" >{{ item.period }}</div>
+            <div class="w-11/12 h-60px mt-2px singleTSec " v-for="(secItem,index) in item.detailNum">{{ secItem }}</div>
           </div>
         </div>
 
@@ -76,7 +62,7 @@
 <route lang="json">
 {
   "meta": {
-    "title": "成绩分析",
+    "title": "考试分析",
     "breadcrumb": true
   }
 }
@@ -126,8 +112,11 @@ onMounted(() => {
 })
 
 const initChart = () => {
-  var myChart = echarts.init(document.getElementById('listMain'));
+  var myChart = echarts.init(document.getElementById('echartData'));
   myChart.setOption({
+    title: {
+      text: '人数',
+    },
     grid: {
       left: '3%',
       right: '4%',
@@ -168,69 +157,37 @@ const initChart = () => {
 }
 
 
+let classArr = [
+  "初一(1)班",
+  "初一(2)班",
+  "初一(3)班",
+  "初一(4)班",
+  "初一(5)班",
+  "初一(6)班",
+  "初一(7)班",
+  "初一(8)班",
+  "初一(9)班",
 
+];
 
-
-let listTitleShow = {
-  xx: "学校",
-  bj: "班级",
-  pm: "排名",
-  pjf: "平均分",
-  ykrs: "应考人数",
-  skrs: "实考人数",
-  zgf: "最高分",
-  yxrs: "优秀人数",
-  yxl: "优秀率",
-  jgrs: "及格人数",
-  jgl: "及格率",
-  dfrs: "低分人数",
-  dfl: "低分率",
-  nd: "难度",
-  qfd: "区分度",
-  bzc: "标椎差",
-}
-let listShow = [
+let classBaseInfoArr = [
   {
-    xx: "总体",
-    bj: "初一(2)班",
-    pm: "1",
-    pjf: "87.45",
-    ykrs: "123",
-    skrs: "123",
-    zgf: "123",
-    yxrs: "98",
-    yxl: "89%",
-    jgrs: "98",
-    jgl: "89%",
-    dfrs: "23",
-    dfl: "90%",
-    nd: "0.92",
-    qfd: "0.92",
-    bzc: "87.45",
-
+    period: "[0-10]",
+    detailNum:["13","13","13","13","13","13","13","13","13"]
   },
   {
-    xx: "临沂市蒙阴县乡镇小学",
-    bj: "初一(2)班名",
-    pm: "1",
-    pjf: "87.45",
-    ykrs: "123",
-    skrs: "123",
-    zgf: "123",
-    yxrs: "98",
-    yxl: "89%",
-    jgrs: "98",
-    jgl: "89%",
-    dfrs: "23",
-    dfl: "90%",
-    nd: "0.92",
-    qfd: "0.92",
-    bzc: "87.45",
+    period: "[10-20]",
+    detailNum:["13","13","13","13","13","13","13","13","13"]
   },
-
-]
-
-
+  {
+    period: "[20-30]",
+    detailNum:["13","13","13","13","13","13","13","13","13"]
+  },
+  {
+    period: "[30-40]",
+    detailNum:["13","13","13","13","13","13","13","13","13"]
+  }
+];
 
 
 </script>
@@ -275,24 +232,28 @@ let listShow = [
   color: #fff;
 }
 
-.listMain {
-  overflow-y: auto;
+.tableList {
+  overflow-x: scroll;
 }
 
-.listMain_title {
+.tableList_title {
   font-size: 14px;
   color: #fff;
-  background: #003eee;
-  overflow-y: auto;
 }
 
 .singleT {
   flex: 1;
+  font-size: 14px;
   line-height: 50px;
-  width: fit-content;
+  // width: fit-content;
   text-align: center;
+  background: #003eee;
+}
+.singleT:first-child{
+  background-color: transparent!important;
 }
 
+
 .singleD {
   flex: 1;
 }
@@ -303,4 +264,8 @@ let listShow = [
   line-height: 60px;
   text-align: center;
 }
+.singleTSecDif{
+  color: #fff;
+  background-color: #6897FF;
+}
 </style>

+ 304 - 0
src/pages/ksfx/cjfx_jstj.vue

@@ -0,0 +1,304 @@
+<template>
+  <div class="cjfx_jstj">
+    <NavHeader />
+    <bread-crumb />
+
+    <div class="w-1200px m-auto flex flex-row justify-between">
+      <div class="w-188px">
+        <leftSider />
+      </div>
+
+      <div class="w-1012px p-4 blueBg">
+
+        <div class="flex 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>
+
+
+          <el-select class="mr-10px" v-model="normal_school" placeholder="请选择学校" size="large">
+            <el-option label="全部" value="0" />
+            <el-option v-for="item in school_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">导出</el-button>
+          </div>
+          <div>
+            <el-input v-model="searchVal" class="w-50 m-2" placeholder="Type something" :prefix-icon="Search" />
+          </div>
+
+        </div>
+
+        <div class="h-200 mt-20px ">
+          <el-table :data="tableData" style="width: 100%">
+            <el-table-column prop="xx" label="学校" show-overflow-tooltip width="200" />
+            <el-table-column prop="js" label="教师" width="120" />
+            <el-table-column prop="xk" label="学科" />
+            <el-table-column prop="pm" label="排名" />
+            <el-table-column prop="xpm" label="校排名" />
+            <el-table-column prop="bj" label="班级" show-overflow-tooltip width="300" />
+            <el-table-column prop="pjf" 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>
+
+          <div class="mt-4" >
+            <el-pagination background layout="prev, pager, next " :total="1000" style="justify-content: right;" />
+          </div>
+
+        </div>
+
+      </div>
+
+
+
+
+    </div>
+
+    <commonFooter />
+  </div>
+</template>
+<route lang="json">
+{
+  "meta": {
+    "title": "考试分析",
+    "breadcrumb": true
+  }
+}
+</route>
+<script lang="ts" setup>
+import * as echarts from 'echarts';
+import { Calendar, Search } from '@element-plus/icons-vue';
+
+import { useRouter } from "vue-router";
+const router = useRouter();
+
+
+let normal_subject = $ref("");
+let normal_school = $ref("");
+let normal_teacher = $ref("");
+let searchVal = $ref('');
+
+let subject_list = [{
+  value: '1',
+  label: '语文'
+}, {
+  value: '2',
+  label: '数学'
+}]
+
+
+let school_list = [{
+  value: '1',
+  label: '学校1'
+}, {
+  value: '2',
+  label: '学校2'
+}]
+
+onMounted(() => {
+})
+
+
+
+
+let classArr = [
+  "学校",
+  "平均分",
+  "总均分",
+  "均分差离",
+];
+
+let classBaseInfoArr = [
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf: 12,
+    zjf: 12,
+    jflc: 1,
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf: 12,
+    zjf: 12,
+    jflc: 1,
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf: 12,
+    zjf: 12,
+    jflc: 1,
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf: 12,
+    zjf: 12,
+    jflc: 1,
+  },
+];
+
+const tableData = [
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    js: "热巴",
+    xk: "语文",
+    pm: "1",
+    xpm: "23",
+    bj: "初一(2)班、初一(3)班初一(4)班",
+    pjf: "123.23",
+    skrs: "1234",
+    zgf:"132.22",
+    yxrs:"2637",
+    yxl:"23.34%",
+    jgrs: "4323",
+    jgl:'23.34%',
+    dfrs:"23.43%",
+    dfl:"23.34%",
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    js: "热巴",
+    xk: "语文",
+    pm: "1",
+    xpm: "23",
+    bj: "初一(2)班、初一(3)班初一(4)班",
+    pjf: "123.23",
+    skrs: "1234",
+    zgf:"132.22",
+    yxrs:"2637",
+    yxl:"23.34%",
+    jgrs: "4323",
+    jgl:'23.34%',
+    dfrs:"23.43%",
+    dfl:"23.34%",
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    js: "热巴",
+    xk: "语文",
+    pm: "1",
+    xpm: "23",
+    bj: "初一(2)班、初一(3)班初一(4)班",
+    pjf: "123.23",
+    skrs: "1234",
+    zgf:"132.22",
+    yxrs:"2637",
+    yxl:"23.34%",
+    jgrs: "4323",
+    jgl:'23.34%',
+    dfrs:"23.43%",
+    dfl:"23.34%",
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    js: "热巴",
+    xk: "语文",
+    pm: "1",
+    xpm: "23",
+    bj: "初一(2)班、初一(3)班初一(4)班",
+    pjf: "123.23",
+    skrs: "1234",
+    zgf:"132.22",
+    yxrs:"2637",
+    yxl:"23.34%",
+    jgrs: "4323",
+    jgl:'23.34%',
+    dfrs:"23.43%",
+    dfl:"23.34%",
+  }
+]
+
+</script>
+
+
+<style lang="scss" scoped>
+@import '@/styles/ksfx.css';
+::v-deep .el-sub-menu__title {
+  background: #003eee;
+  color: #fff;
+}
+
+::v-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 {
+  border-top-left-radius: 9px;
+}
+
+::v-deep .el-table__body tbody .el-table__row td {
+  background-color: transparent;
+}
+
+::v-deep .el-dialog__footer {
+  text-align: center;
+}
+
+.blueBg {
+  background: #F1F7FF;
+}
+
+.whiteBG {
+  background: #fff;
+}
+
+.singlepart {
+  background-color: rgba($color: #ffffff, $alpha: 0.2);
+  color: #fff;
+}
+
+.tableList {
+  overflow-x: scroll;
+}
+
+.tableList_title {
+  font-size: 14px;
+  color: #fff;
+}
+
+.singleT {
+  flex: 1;
+  font-size: 14px;
+  line-height: 50px;
+  width: fit-content;
+  text-align: center;
+  background: #003eee;
+}
+
+.singleT:first-child {
+  border-top-left-radius: 5px;
+}
+
+.singleT:last-child {
+  border-top-right-radius: 5px;
+}
+
+.singleD {
+  flex: 1;
+}
+
+.singleTSec {
+  width: fit-content;
+  flex: 1;
+  line-height: 60px;
+  text-align: center;
+}
+
+.singleTSecDif {
+  background-color: #fff;
+}
+</style>

+ 279 - 0
src/pages/ksfx/cjfx_pjflcfx.vue

@@ -0,0 +1,279 @@
+<template>
+  <div class="cjfx_pjflcfx">
+    <NavHeader />
+    <bread-crumb />
+
+    <div class="w-1200px m-auto flex flex-row justify-between">
+      <div class="w-188px">
+        <leftSider />
+      </div>
+
+      <div class="w-1012px p-4 blueBg">
+
+        <div class="flex 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>
+
+
+          <el-select class="mr-10px" v-model="normal_school" placeholder="请选择学校" size="large">
+            <el-option label="全部" value="0" />
+            <el-option v-for="item in school_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">导出</el-button>
+          </div>
+
+        </div>
+
+        <div class="h-150 mt-20px overflow-x-auto echartData" id="echartData"></div>
+
+        <div class="w-full h-auto tableList">
+           <div class="h-50px rounded flex flex-nowrap tableList_title">
+            <div class="singleT" v-for="(item,index) in classArr" :key="index">{{item}}</div>
+          </div>
+
+          <div class="h-auto flex flex-nowrap tableList_content" v-for="(item,index) in classBaseInfoArr" :key="index">
+            <div class="h-60px rounded  mt-2px  singleTSec " :class="{'singleTSecDif':index%2==1}">{{ item.xx }}</div>
+            <div class="h-60px rounded  mt-2px  singleTSec " :class="{'singleTSecDif':index%2==1}">{{ item.pjf }}</div>
+            <div class="h-60px rounded  mt-2px  singleTSec " :class="{'singleTSecDif':index%2==1}">{{ item.zjf }}</div>
+            <div class="h-60px rounded  mt-2px  singleTSec " :class="{'singleTSecDif':index%2==1}">{{ item.jflc }}</div>
+          </div>
+        </div>
+
+      </div>
+
+
+
+
+    </div>
+
+    <commonFooter />
+  </div>
+</template>
+<route lang="json">
+{
+  "meta": {
+    "title": "考试分析",
+    "breadcrumb": true
+  }
+}
+</route>
+<script lang="ts" setup>
+import * as echarts from 'echarts';
+
+import { useRouter } from "vue-router";
+const router = useRouter();
+
+let normal_subject = $ref("");
+let normal_school = $ref("");
+let normal_teacher = $ref("");
+
+
+let subject_list = [{
+  value: '1',
+  label: '语文'
+}, {
+  value: '2',
+  label: '数学'
+}]
+
+
+let school_list = [{
+  value: '1',
+  label: '学校1'
+}, {
+  value: '2',
+  label: '学校2'
+}]
+
+onMounted(() => {
+  initChart()
+})
+
+const initChart = () => {
+  const colors=['#9CFF68','#FE6868']
+  var myChart = echarts.init(document.getElementById('echartData'));
+  myChart.setOption({
+  title: {
+    text: '平均分',
+  },
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'shadow'
+    }
+  },
+  grid: {
+    left: '3%',
+    right: '4%',
+    bottom: '3%',
+    containLabel: true
+  },
+  xAxis: [
+    {
+      type: 'category',
+      axisTick: {
+        show: false
+      },
+      data: ['蒙阴县市级中小学', '蒙阴县市级中小学', '蒙阴县市级中小学', '蒙阴县市级中小学', '蒙阴县市级中小学', '蒙阴县市级中小学', '蒙阴县市级中小学']
+    }
+  ],
+  yAxis: [
+    {
+      type: 'value'
+    }
+
+  ],
+  series: [
+
+    {
+      name: 'Income',
+      type: 'bar',
+      stack: 'Total',
+      label: {
+        show: true
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      data: [1.23, 1.23, 1.23, 1.23, 1.23, 1.23, 1.23]
+    },
+    {
+      name: 'Expenses',
+      type: 'bar',
+      stack: 'Total',
+      label: {
+        show: true,
+        position: 'left'
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      data: [-1.23, -1.23, -1.23, -1.23, -1.23, -1.23, -1.23]
+    }
+  ]
+});
+}
+
+
+let classArr = [
+  "学校",
+  "平均分",
+  "总均分",
+  "均分差离",
+];
+
+let classBaseInfoArr = [
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf:12,
+    zjf:12,
+    jflc:1,
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf:12,
+    zjf:12,
+    jflc:1,
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf:12,
+    zjf:12,
+    jflc:1,
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf:12,
+    zjf:12,
+    jflc:1,
+  },
+];
+
+
+</script>
+
+
+<style lang="scss" scoped>
+::v-deep .el-sub-menu__title {
+  background: #003eee;
+  color: #fff;
+}
+
+::v-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 {
+  border-top-left-radius: 9px;
+}
+
+::v-deep .el-table__body tbody .el-table__row td {
+  background-color: transparent;
+}
+
+::v-deep .el-dialog__footer {
+  text-align: center;
+}
+
+.blueBg {
+  background: #F1F7FF;
+}
+
+.whiteBG {
+  background: #fff;
+}
+
+.singlepart {
+  background-color: rgba($color: #ffffff, $alpha: 0.2);
+  color: #fff;
+}
+
+.tableList {
+  overflow-x: scroll;
+}
+
+.tableList_title {
+  font-size: 14px;
+  color: #fff;
+}
+
+.singleT {
+  flex: 1;
+  font-size: 14px;
+  line-height: 50px;
+  width: fit-content;
+  text-align: center;
+  background: #003eee;
+}
+.singleT:first-child{
+  border-top-left-radius: 5px;
+}
+.singleT:last-child{
+  border-top-right-radius: 5px;
+}
+
+.singleD {
+  flex: 1;
+}
+
+.singleTSec {
+  width: fit-content;
+  flex: 1;
+  line-height: 60px;
+  text-align: center;
+}
+.singleTSecDif{
+  background-color: #fff;
+}
+</style>

+ 2 - 2
src/pages/cjfx/cjfx_slyf.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="cjfxCjd">
+  <div class="cjfx_slyf">
     <NavHeader />
     <bread-crumb />
 
@@ -130,7 +130,7 @@
 <route lang="json">
 {
   "meta": {
-    "title": "成绩分析",
+    "title": "考试分析",
     "breadcrumb": true
   }
 }

+ 13 - 0
src/pages/ksfx/index.vue

@@ -0,0 +1,13 @@
+<template>
+  <div>
+    成绩分析主页
+  </div>
+</template>
+
+<script setup lang="ts">
+
+</script>
+
+<style scoped>
+
+</style>

+ 404 - 0
src/pages/ksfx/sjfx_kgtfx.vue

@@ -0,0 +1,404 @@
+<template>
+  <div class="sjfx_kgtfx">
+    <NavHeader />
+    <bread-crumb />
+
+    <div class="w-1200px m-auto flex flex-row justify-between">
+      <div class="w-188px">
+        <leftSider />
+      </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>
+
+          <el-select class="mr-10px" v-model="normal_school" placeholder="请选择学校" size="large">
+            <el-option label="全部" value="0" />
+            <el-option v-for="item in school_list" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+
+
+        </div>
+
+
+        <div class="h-auto mt-20px">
+
+          <div class="normalTit">
+            <span>客观题分析</span>
+          </div>
+          <div class="mt-4 exportBtn" style="text-align: right;">
+            <el-button color="#003eee" type="primary" size="large" @click="openDialog">详情</el-button>
+        </div>
+          <div class="w-full h-388px flex">
+            <div class=" w-1/2 h-full left_chart"  id="barChart"></div>
+            <div class=" w-1/2 h-full right_chart" id="circleChart"></div>
+          </div>
+
+
+        </div>
+
+      </div>
+
+    </div>
+
+    <commonFooter />
+
+      <!-- dialog  -->
+      <el-dialog v-model="dialogTableVisible" title="" style="width: 90%;">
+       <div class="mainShow">
+          <div class="mainShow_single" v-for="(item,index) in dialogArr " :key="index">
+            <p>{{ item.option }}<span>({{ item.stuNum }})</span>人:</p>
+            <ul class="flex flex-wrap">
+              <li v-for="(secItem,secIndex) in item.detail" :key="secIndex">
+                <span>{{secItem.stuSchool  }}</span>
+                <span>{{ secItem.classRomm }}</span>
+                <span>{{ secItem.stuName }}</span>
+              </li>
+            </ul>
+          </div>
+       </div>
+        <template #footer>
+          <span class="dialog-footer">
+            <el-button type="primary" color="#003eee" @click="dialogTableVisible = false">关闭</el-button>
+          </span>
+        </template>
+      </el-dialog>
+
+  </div>
+</template>
+<route lang="json">
+{
+  "meta": {
+    "title": "考试分析",
+    "breadcrumb": true
+  }
+}
+</route>
+<script lang="ts" setup>
+import * as echarts from 'echarts';
+
+import { Calendar, Search } from '@element-plus/icons-vue';
+
+import { useRouter } from "vue-router";
+import { skeletonProps } from 'element-plus';
+const router = useRouter();
+
+
+let normal_subject = $ref("");
+let normal_school = $ref("");
+let normal_teacher = $ref("");
+
+let subject_list = [{
+  value: '1',
+  label: '语文'
+}, {
+  value: '2',
+  label: '数学'
+}]
+
+
+let school_list = [{
+  value: '1',
+  label: '学校1'
+}, {
+  value: '2',
+  label: '学校2'
+}]
+
+
+
+
+onMounted(() => {
+  initbarChart();
+  initcircleChart();
+
+})
+const initbarChart = () => {
+  var myChart = echarts.init(document.getElementById('barChart'));
+  myChart.setOption({
+    title: {
+      text: '人数',
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      data: ['选项A', '选项B', '选项C', '选项D']
+    },
+    yAxis: {
+      type: 'value',
+      axisTick: {
+        show: false
+      },
+    },
+    series: [
+      {
+        type: 'bar',
+        barWidth: '40',
+        itemStyle: {
+          normal: {
+            barBorderRadius: [20, 20, 0, 0],
+            color: '#6897FF',
+            label: {
+              show: true, //开启显示
+              position: 'top', //在上方显示
+              textStyle: { //数值样式
+                color: 'black',
+                fontSize: 16
+              }
+            }
+          }
+        },
+        data: [120,200,200,150],
+      }
+    ]
+  });
+}
+const initcircleChart = () => {
+  var myChart = echarts.init(document.getElementById('circleChart'));
+  myChart.setOption({
+  tooltip: {
+    trigger: 'item'
+  },
+  legend: {
+    itemWidth: 10,
+    itemHeight: 10,
+    itemGap: 40,
+    icon: "circle",
+    orient: 'vertical',
+    textStyle: {
+      fontSize: 12,
+      color: '#171721'
+    },
+    x: 'right',
+    y: 'center'
+  },
+  series: [
+    {
+      name: '客观题分析',
+      type: 'pie',
+      radius: ['40%', '70%'],
+      avoidLabelOverlap: false,
+      label: {
+        show: false,
+        position: 'center'
+      },
+      emphasis: {
+        label: {
+          show: true,
+          fontSize: 40,
+          fontWeight: 'bold'
+        }
+      },
+      labelLine: {
+        show: false
+      },
+      data: [
+        { value: 1048, name: '选项A' },
+        { value: 735, name: '选项B' },
+        { value: 580, name: '选项C' },
+        { value: 484, name: '选项D' },
+      ]
+    }
+  ]
+});
+}
+
+const dialogTableVisible = ref(false)
+const openDialog = () => {
+  dialogTableVisible.value = true;
+}
+
+
+
+let classArr = [
+  "学校",
+  "平均分",
+  "总均分",
+  "均分差离",
+];
+
+let classBaseInfoArr = [
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf: 12,
+    zjf: 12,
+    jflc: 1,
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf: 12,
+    zjf: 12,
+    jflc: 1,
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf: 12,
+    zjf: 12,
+    jflc: 1,
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf: 12,
+    zjf: 12,
+    jflc: 1,
+  },
+];
+
+
+
+
+let dialogArr = [
+  {
+    option: "选项A",
+    stuNum: 23,
+    detail: [
+      {
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },
+      {
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },{
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },
+      {
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },
+      {
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },{
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },
+      {
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },
+      {
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },{
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },
+      {
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },
+      {
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },{
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },
+      {
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },
+      {
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },{
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      }
+    ]
+  },
+  {
+    option: "选项B",
+    stuNum: 23,
+    detail: [
+      {
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },
+      {
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },{
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      }
+    ]
+  },
+  {
+    option: "选项C",
+    stuNum: 23,
+    detail: [
+      {
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },
+      {
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },{
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      }
+    ]
+  },
+  {
+    option: "选项D",
+    stuNum: 23,
+    detail: [
+      {
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },
+      {
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      },{
+        stuSchool: "苏州小学",
+        classRomm: "初一(2)班",
+        stuName:"张大大",
+      }
+    ]
+  }
+]
+
+</script>
+
+
+<style lang="scss" scoped>
+@import '@/styles/ksfx.css';
+
+</style>

+ 297 - 0
src/pages/ksfx/sjfx_ztfx.vue

@@ -0,0 +1,297 @@
+<template>
+  <div class="cjfx_jstj">
+    <NavHeader />
+    <bread-crumb />
+
+    <div class="w-1200px m-auto flex flex-row justify-between">
+      <div class="w-188px">
+        <leftSider />
+      </div>
+
+      <div class="w-1012px p-4 blueBg">
+
+        <div class="w-full py-8 marstReview">
+          <div class="normalTit">
+            <span>整体成绩分析</span>
+          </div>
+
+          <el-table :data="tableDataZtcjfx" style="width: 100%">
+            <el-table-column prop="mx" label="满分" show-overflow-tooltip />
+            <el-table-column prop="pjf" label="平均分" width="120" />
+            <el-table-column prop="ykrs" label="应考人数" />
+            <el-table-column prop="skrs" label="实考人数" />
+            <el-table-column prop="nd" label="难度" />
+            <el-table-column prop="qfd" label="区分度"/>
+            <el-table-column prop="bzc" label="标准差" />
+            <el-table-column prop="qkrs" label="缺考人数" />
+            <el-table-column prop="zgf" label="最高分" />
+            <el-table-column prop="zdf" label="最低分" />
+            <el-table-column prop="gfzjf" label="高分组均分" width="100" />
+            <el-table-column prop="zfzjf" label="中分组均分" width="100" />
+            <el-table-column prop="dfzjf" label="低分组均分" width="100" />
+          </el-table>
+        </div>
+
+        <div class="flex mt-20px items-center">
+          <el-select class="mr-10px" v-model="normal_school" placeholder="请选择学校" size="large">
+            <el-option label="全部" value="0" />
+            <el-option v-for="item in school_list" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+
+          <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>
+
+          <el-select class="mr-10px" v-model="normal_classroom" placeholder="请选择班级" size="large">
+            <el-option label="全部" value="0" />
+            <el-option v-for="item in classroom_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">导出</el-button>
+          </div>
+
+        </div>
+
+        <div class="h-auto mt-20px">
+          <div class="normalTit">
+            <span>题目分析</span>
+          </div>
+
+          <el-table :data="tableDataTmfx" style="width: 100%">
+            <el-table-column prop="tm" label="题目" />
+            <el-table-column prop="tmlx" label="题目类型" />
+            <el-table-column prop="mf" label="满分" />
+            <el-table-column prop="pjf" label="平均分" />
+            <el-table-column prop="nd" label="难度" />
+            <el-table-column prop="qfd" label="区分度"  />
+            <el-table-column prop="bzc" label="标准差" />
+            <el-table-column prop="gfzjf" label="高分组均分" />
+            <el-table-column prop="zdzjf" label="中等组均分" />
+            <el-table-column prop="dfzjf" label="低分组均分" />
+          </el-table>
+
+        </div>
+
+        <div class="h-auto mt-20px ">
+          <div class="normalTit">
+            <span>整体成绩分析</span>
+          </div>
+          <el-table :data="tableData" style="width: 100%">
+            <el-table-column prop="xm" label="姓名" show-overflow-tooltip width="100" />
+            <el-table-column prop="xh" label="学号" show-overflow-tooltip width="100" />
+            <el-table-column prop="bj" label="班级" show-overflow-tooltip width="100" />
+            <el-table-column prop="zf" label="总分" />
+            <el-table-column prop="fir_0" label="1" />
+            <el-table-column prop="fir_1" label="2"  />
+            <el-table-column prop="fir_2" label="17-19" />
+            <el-table-column prop="sec_0" label="1" />
+            <el-table-column prop="sec_1" label="2"  />
+            <el-table-column prop="sec_2" label="17-19" />
+            <el-table-column prop="thr_0" label="1" />
+            <el-table-column prop="thr_1" label="2"  />
+            <el-table-column prop="thr_2" label="17-19" />
+
+          </el-table>
+
+        </div>
+
+      </div>
+
+    </div>
+
+    <commonFooter />
+  </div>
+</template>
+<route lang="json">
+{
+  "meta": {
+    "title": "考试分析",
+    "breadcrumb": true
+  }
+}
+</route>
+<script lang="ts" setup>
+import * as echarts from 'echarts';
+import { Calendar, Search } from '@element-plus/icons-vue';
+
+import { useRouter } from "vue-router";
+import { skeletonProps } from 'element-plus';
+const router = useRouter();
+
+
+let normal_subject = $ref("");
+let normal_school = $ref("");
+let normal_teacher = $ref("");
+let normal_classroom = $ref("");
+
+let subject_list = [{
+  value: '1',
+  label: '语文'
+}, {
+  value: '2',
+  label: '数学'
+}]
+
+
+let school_list = [{
+  value: '1',
+  label: '学校1'
+}, {
+  value: '2',
+  label: '学校2'
+}]
+
+let classroom_list = [{
+  value: '1',
+  label: '英语'
+}, {
+  value: '2',
+  label: '体育'
+}, {
+  value: '3',
+  label: '音乐'
+}
+];
+
+
+onMounted(() => {
+
+})
+
+const tableDataZtcjfx = [{
+  mx:122,
+  pjf:87.45,
+  ykrs:123,
+  skrs:123,
+  nd:0.54,
+  qfd:0.54,
+  bzc:0.54,
+  qkrs:32,
+  zgf:125,
+  zdf:123,
+  gfzjf:125,
+  zfzjf:136,
+  dfzjf:87.45
+   
+}]
+
+
+
+let classArr = [
+  "学校",
+  "平均分",
+  "总均分",
+  "均分差离",
+];
+
+let classBaseInfoArr = [
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf: 12,
+    zjf: 12,
+    jflc: 1,
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf: 12,
+    zjf: 12,
+    jflc: 1,
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf: 12,
+    zjf: 12,
+    jflc: 1,
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf: 12,
+    zjf: 12,
+    jflc: 1,
+  },
+];
+
+const tableDataTmfx = [
+  {
+    tm:1,
+    tmlx:"单选",
+    mf:23,
+    pjf:12,
+    nd:0.54,
+    qfd:0.54,
+    bzc:0.54,
+    gfzjf:0.13,
+    zdzjf:0.13,
+    dfzjf:0.13,
+  },
+  {
+    tm:1,
+    tmlx:"多选",
+    mf:23,
+    pjf:12,
+    nd:0.54,
+    qfd:0.54,
+    bzc:0.54,
+    gfzjf:0.13,
+    zdzjf:0.13,
+    dfzjf:0.13,
+  },
+  {
+    tm:1,
+    tmlx:"主观题",
+    mf:23,
+    pjf:12,
+    nd:0.54,
+    qfd:0.54,
+    bzc:0.54,
+    gfzjf:0.13,
+    zdzjf:0.13,
+    dfzjf:0.13,
+  },
+
+];
+
+
+const tableData = [
+  {
+    xm: "迪丽热巴",
+    xh: "123456789",
+    bj: "初一(2)班",
+    zf: "123",
+    fir_0: "2.5",
+    fir_1: "2.5",
+    fir_2: "2.5",
+    sec_0: "2.5",
+    sec_1: "2.5",
+    sec_2: "2.5",
+    thr_0: "2.5",
+    thr_1: "2.5",
+    thr_2: "2.5",
+  },
+  {
+    xm: "迪丽热巴",
+    xh: "123456789",
+    bj: "初一(2)班",
+    zf: "123",
+    fir_0: "2.5",
+    fir_1: "2.5",
+    fir_2: "2.5",
+    sec_0: "2.5",
+    sec_1: "2.5",
+    sec_2: "2.5",
+    thr_0: "2.5",
+    thr_1: "2.5",
+    thr_2: "2.5",
+  },
+]
+
+</script>
+
+
+<style lang="scss" scoped>
+@import '@/styles/ksfx.css';
+
+</style>

+ 233 - 0
src/pages/ksfx/stu_grcjd.vue

@@ -0,0 +1,233 @@
+<template>
+  <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 />
+      </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">导出</el-button>
+          </div>
+        </div>
+
+        <div class="h-auto mt-9px listMain">
+          <el-table :data="tableData" style="width: 100%" height="250">
+            <el-table-column prop="km" label="科目" />
+            <el-table-column prop="mf" label="满分" />
+            <el-table-column prop="cj" label="成绩" />
+
+            <el-table-column label="班级" fixed="right">
+              <el-table-column prop="bj_pjf" label="平均分" />
+              <el-table-column prop="bj_zgf" label="最高分"  />
+            </el-table-column>
+
+            <el-table-column label="年级" fixed="right">
+              <el-table-column prop="nj_pjf" label="平均分" />
+              <el-table-column prop="nj_zgf" label="最高分"  />
+            </el-table-column>
+
+            <el-table-column label="整体考试" fixed="right">
+              <el-table-column prop="ztks_pjf" label="平均分" />
+              <el-table-column prop="ztks_zgf" label="最高分"  />
+            </el-table-column>
+
+          </el-table>
+
+        </div>
+
+        <div class="h-450px mt-20px echartData" id="echartData"></div>
+
+      </div>
+
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import * as echarts from 'echarts';
+import { useRouter } from "vue-router";
+import { skeletonProps } from 'element-plus';
+const router = useRouter();
+
+let normal_subject = $ref("");
+
+let subject_list = [{
+  value: '1',
+  label: '语文'
+}, {
+  value: '2',
+  label: '数学'
+}]
+
+const tableData = [
+  {
+    km: '语文',
+    mf: '1',
+    cj: '选择题',
+
+    bj_pjf:120,
+    bj_zgf:120,
+    nj_pjf:120,
+    nj_zgf:120,
+    ztks_pjf:120,
+    ztks_zgf:120,
+
+   bj_pjf:120,
+    bj_zgf:120,
+    nj_pjf:120,
+    nj_zgf:120,
+    ztks_pjf:120,
+    ztks_zgf:120,
+  },
+  {
+    km: '语文',
+    mf: '1',
+    cj: '选择题',
+
+   bj_pjf:120,
+    bj_zgf:120,
+    nj_pjf:120,
+    nj_zgf:120,
+    ztks_pjf:120,
+    ztks_zgf:120,
+  },
+  {
+    km: '语文',
+    mf: '1',
+    cj: '选择题',
+
+   bj_pjf:120,
+    bj_zgf:120,
+    nj_pjf:120,
+    nj_zgf:120,
+    ztks_pjf:120,
+    ztks_zgf:120,
+  },
+  {
+    km: '语文',
+    mf: '1',
+    cj: '选择题',
+
+   bj_pjf:120,
+    bj_zgf:120,
+    nj_pjf:120,
+    nj_zgf:120,
+    ztks_pjf:120,
+    ztks_zgf:120,
+  },
+  {
+    km: '语文',
+    mf: '1',
+    cj: '选择题',
+
+   bj_pjf:120,
+    bj_zgf:120,
+    nj_pjf:120,
+    nj_zgf:120,
+    ztks_pjf:120,
+    ztks_zgf:120,
+  },
+  {
+    km: '语文',
+    mf: '1',
+    cj: '选择题',
+
+   bj_pjf:120,
+    bj_zgf:120,
+    nj_pjf:120,
+    nj_zgf:120,
+    ztks_pjf:120,
+    ztks_zgf:120,
+  },
+  {
+    km: '语文',
+    mf: '1',
+    cj: '选择题',
+
+   bj_pjf:120,
+    bj_zgf:120,
+    nj_pjf:120,
+    nj_zgf:120,
+    ztks_pjf:120,
+    ztks_zgf:120,
+  },
+]
+
+onMounted(() => {
+  initChart()
+})
+
+const initChart = () => {
+  var myChart = echarts.init(document.getElementById('echartData'));
+  myChart.setOption({
+    title: {
+      text: '得分率(%)',
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      data: ['语文', '语文', '语文', '语文', '语文', '语文', '语文']
+    },
+    yAxis: {
+      type: 'value',
+      axisTick: {
+        show: false
+      },
+    },
+    series: [
+      {
+        type: 'bar',
+        barWidth: '40',
+        itemStyle: {
+          normal: {
+            barBorderRadius: [20, 20, 0, 0],
+            color: '#6897FF',
+            label: {
+              show: true, //开启显示
+              position: 'top', //在上方显示
+              textStyle: { //数值样式
+                color: 'black',
+                fontSize: 16
+              }
+            }
+          }
+        },
+        data: [120,200,200,150,80,70,110,130],
+      }
+    ]
+  });
+}
+
+</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>

+ 231 - 0
src/pages/ksfx/stu_ksfx.vue

@@ -0,0 +1,231 @@
+<template>
+  <div class="">
+    <NavHeader />
+    <bread-crumb />
+    <div class="w-1200px m-auto h-auto mastMain">
+      <div class="searchInput"></div>
+      <div class="groupExamMian">
+
+        <div class="demo-collapse">
+          <el-collapse accordion>
+            <el-collapse-item :name="index+1" v-for="(item, index) in examArrlist" :key="index" :class="{ 'bg-cusblue': index % 2 == 0 }">
+              <template #title>
+                <div class="w-full h-60px flex flex-row justify-between examSingleT" >
+                  <div>{{ item.examN }}</div>
+                  <div>参考人数:{{ item.attendExamNum }}</div>
+                  <div>满分:{{ item.fullScore }}</div>
+                  <div>最高分:{{ item.maxScore }}</div>
+                  <div>考试分析</div>
+                </div>
+              </template>
+              <div>
+                <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')">
+              <div class="w-2/5 relative examListSingle_left">
+                <img :src="examIcon" 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="w-full absolute top-0 left-0 text-right text-red-500 text-3xl font-bold pr-2 lockExam" v-else>
+                  缺考</div>
+                <div class="w-full absolute left-0 bottom-2 text-center text-red-500 text-2xl font-bold subjectName">{{
+                  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.scoreN }}</p>
+                <p class="h-1/4">客观题:{{ secItem.ObjectiveQuestion }}</p>
+                <p class="h-1/4">主观题:{{ secItem.SubjectiveQuestions }}</p>
+              </div>
+            </div>
+          </div>
+              </div>
+            </el-collapse-item>
+
+          </el-collapse>
+        </div>
+
+
+
+
+
+
+
+        <!-- <div class="examSingle" v-for="(item, index) in examArrlist" :key="index">
+          <div class="h-60px flex flex-row justify-between examSingleT" :class="{ 'bg-cusblue': index % 2 == 0 }">
+            <div>{{ item.examN }}</div>
+            <div>参考人数:{{ item.attendExamNum }}</div>
+            <div>满分:{{ item.fullScore }}</div>
+            <div>最高分:{{ item.maxScore }}</div>
+            <div class="text-blue-500">考试分析</div>
+          </div>
+          <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')">
+              <div class="w-2/5 relative examListSingle_left">
+                <img :src="examIcon" 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="w-full absolute top-0 left-0 text-right text-red-500 text-3xl font-bold pr-2 lockExam" v-else>
+                  缺考</div>
+                <div class="w-full absolute left-0 bottom-2 text-center text-red-500 text-2xl font-bold subjectName">{{
+                  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.scoreN }}</p>
+                <p class="h-1/4">客观题:{{ secItem.ObjectiveQuestion }}</p>
+                <p class="h-1/4">主观题:{{ secItem.SubjectiveQuestions }}</p>
+              </div>
+            </div>
+          </div>
+
+        </div> -->
+
+      </div>
+    </div>
+    <commonFooter />
+  </div>
+</template>
+<route lang="json">
+{
+  "meta": {
+    "title": "考试分析",
+    "breadcrumb": true
+  }
+}
+</route>
+<script setup>
+import { InfoFilled } from '@element-plus/icons-vue'
+import examIcon from '@/assets/ksfx/examIcon.png'
+import { useRouter } from "vue-router";
+import { skeletonProps } from 'element-plus';
+const router = useRouter();
+
+
+const scoreMarkSwitch = $ref(true);
+
+let examArrlist = [
+  {
+    examN: "2022-2023年下学期九年级月考",
+    attendExamNum: 1234,
+    fullScore: 180,
+    maxScore: 164,
+    examPaperList: [
+      {
+        scoreN: 99,
+        subName: "语文",
+        ObjectiveQuestion: 66,
+        SubjectiveQuestions: 33
+      },
+      {
+        scoreN: 0,
+        subName: "数学",
+        ObjectiveQuestion: 0,
+        SubjectiveQuestions: 0
+      },
+      {
+        scoreN: 99,
+        subName: "语文",
+        ObjectiveQuestion: 66,
+        SubjectiveQuestions: 33
+      },
+      {
+        scoreN: 0,
+        subName: "数学",
+        ObjectiveQuestion: 0,
+        SubjectiveQuestions: 0
+      },
+      {
+        scoreN: 99,
+        subName: "语文",
+        ObjectiveQuestion: 66,
+        SubjectiveQuestions: 33
+      }
+    ]
+  },
+  {
+    examN: "2022-2023年下学期九年级月考",
+    attendExamNum: 1234,
+    fullScore: 180,
+    maxScore: 164,
+    examPaperList: [
+      {
+        scoreN: 99,
+        subName: "语文",
+        ObjectiveQuestion: 66,
+        SubjectiveQuestions: 33
+      },
+      {
+        scoreN: 0,
+        subName: "数学",
+        ObjectiveQuestion: 0,
+        SubjectiveQuestions: 0
+      },
+      {
+        scoreN: 99,
+        subName: "语文",
+        ObjectiveQuestion: 66,
+        SubjectiveQuestions: 33
+      },
+      {
+        scoreN: 0,
+        subName: "数学",
+        ObjectiveQuestion: 0,
+        SubjectiveQuestions: 0
+      },
+      {
+        scoreN: 99,
+        subName: "语文",
+        ObjectiveQuestion: 66,
+        SubjectiveQuestions: 33
+      }
+    ]
+  },
+
+]
+
+const linkTo = (item) => {
+  router.push({ name: item });
+}
+
+</script>
+
+<style lang="scss" scoped>
+@import '@/styles/ksfx.css';
+
+::v-deep .el-collapse-item__header{
+  height: 60px;
+  border: 1px dashed grey;
+  background-color:#F1F7FF;
+}
+.mastMain {
+  background-color: #ffffff;
+  box-sizing: border-box;
+  padding: 2px;
+}
+
+.bg-cusblue {
+  background-color: #F1F7FF;
+}
+
+.examSingleT {
+  line-height: 60px;
+  box-sizing: border-box;
+  padding: 0 30px;
+}
+
+.examListSingle {
+  width: 24%;
+  background: #ffffff;
+  border: 2px solid #0148e5;
+  border-radius: 10px;
+  margin-right: 1%;
+  cursor: pointer;
+}
+
+.examListSingle:last-child {
+  margin-right: 0 !important;
+}
+
+.examListSingle_left {}</style>

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

@@ -0,0 +1,174 @@
+<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 />
+      </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">导出</el-button>
+          </div>
+        </div>
+
+        <div class="h-auto mt-9px listMain">
+          <el-table :data="tableData" style="width: 100%" height="250">
+            <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 { useRouter } from "vue-router";
+import { skeletonProps } from 'element-plus';
+const router = useRouter();
+
+let normal_subject = $ref("");
+
+let subject_list = [{
+  value: '1',
+  label: '语文'
+}, {
+  value: '2',
+  label: '数学'
+}]
+
+const tableData = [
+  {
+   xk: '语文',
+    tm: '1',
+    lx: '选择题',
+    nd: '5',
+    df: '12',
+    grdf: '12',
+
+    gr: '23%',
+    bj: '23%',
+    nj: '23%',
+    ztks:'23%',
+  },
+  {
+   xk: '语文',
+    tm: '1',
+    lx: '选择题',
+    nd: '5',
+    df: '12',
+    grdf: '12',
+
+    gr: '23%',
+    bj: '23%',
+    nj: '23%',
+    ztks:'23%',
+  },
+  {
+   xk: '语文',
+    tm: '1',
+    lx: '选择题',
+    nd: '5',
+    df: '12',
+    grdf: '12',
+
+    gr: '23%',
+    bj: '23%',
+    nj: '23%',
+    ztks:'23%',
+  },
+  {
+   xk: '语文',
+    tm: '1',
+    lx: '选择题',
+    nd: '5',
+    df: '12',
+    grdf: '12',
+
+    gr: '23%',
+    bj: '23%',
+    nj: '23%',
+    ztks:'23%',
+  },
+  {
+   xk: '语文',
+    tm: '1',
+    lx: '选择题',
+    nd: '5',
+    df: '12',
+    grdf: '12',
+
+    gr: '23%',
+    bj: '23%',
+    nj: '23%',
+    ztks:'23%',
+  },
+  {
+   xk: '语文',
+    tm: '1',
+    lx: '选择题',
+    nd: '5',
+    df: '12',
+    grdf: '12',
+
+    gr: '23%',
+    bj: '23%',
+    nj: '23%',
+    ztks:'23%',
+  },
+  {
+   xk: '语文',
+    tm: '1',
+    lx: '选择题',
+    nd: '5',
+    df: '12',
+    grdf: '12',
+
+    gr: '23%',
+    bj: '23%',
+    nj: '23%',
+    ztks:'23%',
+  },
+]
+</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>

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

@@ -0,0 +1,167 @@
+<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 />
+      </div>
+
+      <div class="w-1012px p-4 blueBg">
+
+        <swiper :modules="modules" :pagination="{ clickable: true }">
+          <swiper-slide>Slide 1</swiper-slide>
+          <swiper-slide>Slide 2</swiper-slide>
+          <swiper-slide>Slide 3</swiper-slide>
+        </swiper>
+
+
+
+
+
+      </div>
+
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { useRouter } from "vue-router";
+import { skeletonProps } from 'element-plus';
+const router = useRouter();
+
+
+
+import SwiperClass, { Pagination } from 'Swiper'
+import { Swiper, SwiperSlide } from 'vue-awesome-swiper'
+
+  // import swiper module styles
+import 'swiper/css'
+import 'swiper/css/pagination'
+
+const modules = [Pagination];
+
+
+
+
+
+let normal_subject = $ref("");
+
+let subject_list = [{
+  value: '1',
+  label: '语文'
+}, {
+  value: '2',
+  label: '数学'
+}]
+
+const tableData = [
+  {
+   xk: '语文',
+    tm: '1',
+    lx: '选择题',
+    nd: '5',
+    df: '12',
+    grdf: '12',
+
+    gr: '23%',
+    bj: '23%',
+    nj: '23%',
+    ztks:'23%',
+  },
+  {
+   xk: '语文',
+    tm: '1',
+    lx: '选择题',
+    nd: '5',
+    df: '12',
+    grdf: '12',
+
+    gr: '23%',
+    bj: '23%',
+    nj: '23%',
+    ztks:'23%',
+  },
+  {
+   xk: '语文',
+    tm: '1',
+    lx: '选择题',
+    nd: '5',
+    df: '12',
+    grdf: '12',
+
+    gr: '23%',
+    bj: '23%',
+    nj: '23%',
+    ztks:'23%',
+  },
+  {
+   xk: '语文',
+    tm: '1',
+    lx: '选择题',
+    nd: '5',
+    df: '12',
+    grdf: '12',
+
+    gr: '23%',
+    bj: '23%',
+    nj: '23%',
+    ztks:'23%',
+  },
+  {
+   xk: '语文',
+    tm: '1',
+    lx: '选择题',
+    nd: '5',
+    df: '12',
+    grdf: '12',
+
+    gr: '23%',
+    bj: '23%',
+    nj: '23%',
+    ztks:'23%',
+  },
+  {
+   xk: '语文',
+    tm: '1',
+    lx: '选择题',
+    nd: '5',
+    df: '12',
+    grdf: '12',
+
+    gr: '23%',
+    bj: '23%',
+    nj: '23%',
+    ztks:'23%',
+  },
+  {
+   xk: '语文',
+    tm: '1',
+    lx: '选择题',
+    nd: '5',
+    df: '12',
+    grdf: '12',
+
+    gr: '23%',
+    bj: '23%',
+    nj: '23%',
+    ztks:'23%',
+  },
+]
+</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>

+ 173 - 0
src/styles/ksfx.css

@@ -0,0 +1,173 @@
+::v-deep .el-sub-menu__title {
+  background: #003eee;
+  color: #fff;
+}
+
+::v-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 {
+  border-top-left-radius: 9px;
+}
+
+::v-deep .el-table__body tbody .el-table__row td {
+  background-color: transparent;
+}
+
+::v-deep .el-dialog__footer {
+  text-align: center;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+.normalTit{
+  width: 158px;
+  height: 42px;
+  margin: 0 auto 10px auto;
+  background: #ffffff;
+  border: 1px solid #dbe7ec;
+  border-radius: 6px;
+  box-sizing: border-box;
+  padding:9px 6px;
+  text-align: center;
+  span{
+    font-size: 16px;
+    font-family: PingFang SC, PingFang SC-Medium;
+    font-weight: 500;
+    color: #000000;
+    background: #e2eaf9;
+    border-radius: 4px;
+    padding: 5px 15px;
+  }
+}
+.marstReview{
+  border-bottom: 1px solid #dee8ff;
+}
+.blueBg {
+  background: #F1F7FF;
+}
+
+.whiteBG {
+  background: #fff;
+}
+
+.singlepart {
+  background-color: rgba($color: #ffffff, $alpha: 0.2);
+  color: #fff;
+}
+
+.tableList {
+  overflow-x: scroll;
+}
+
+.tableList_title {
+  font-size: 14px;
+  color: #fff;
+}
+
+.listMain {
+  max-height: 600px;
+  overflow-y: auto;
+}
+
+.listMain_title {
+  font-size: 16px;
+  color: #fff;
+  background: #003eee;
+  overflow-y: auto;
+}
+
+.singleT {
+  flex: 1;
+  font-size: 14px;
+  line-height: 50px;
+  width: fit-content;
+  text-align: center;
+  background: #003eee;
+}
+
+.singleT:first-child {
+  border-top-left-radius: 5px;
+}
+
+.singleT:last-child {
+  border-top-right-radius: 5px;
+}
+
+.singleD {
+  flex: 1;
+}
+
+.singleTSec {
+  width: fit-content;
+  flex: 1;
+  line-height: 60px;
+  text-align: center;
+}
+
+.singleTSecDif {
+  background-color: #fff;
+  border-right: 1px solid #dee8ff;
+}
+.left_chart{
+  border-right: 1px solid #dee8ff;
+}
+.left_chart,right_chart{
+   width: fit-content;
+  flex: 1;
+}
+
+.mainShow_single {
+  margin-bottom:30px;
+}
+.mainShow_single:last-child {
+  margin-bottom:0!important;
+}
+.mainShow_single p{
+  font-size: 14px;
+  font-family: PingFang SC, PingFang SC-Regular;
+  font-weight: bold;
+  text-align: left;
+  color: #000000;
+  letter-spacing: -0.01px;
+  margin-bottom:10px;
+}
+.mainShow_single ul{
+  display:flex;
+}
+.mainShow_single ul li{
+  font-size: 14px;
+  font-family: PingFang SC, PingFang SC-Regular;
+  font-weight: 400;
+  text-align: left;
+  color: #000000;
+  letter-spacing: -0.01px;
+  margin-right:10px;
+  margin-bottom: 10px;
+  border: 1px dashed #414141;
+  padding: 5px;
+}
+.mainShow_single ul li span{
+  margin-right: 5px;
+}