lsc 1 year ago
parent
commit
a6f602cf6d
47 changed files with 7122 additions and 2 deletions
  1. 1 1
      dist/index.html
  2. 0 0
      dist/static/css/app.7c1e97cf58d7a9295b378ae7bc2240af.css
  3. 0 0
      dist/static/css/app.7c1e97cf58d7a9295b378ae7bc2240af.css.map
  4. 0 0
      dist/static/css/app.bc77bc8cec5402375e566a6f41cfca1a.css.map
  5. 0 0
      dist/static/js/app.0ca8c307bce6d013c42a.js
  6. 0 0
      dist/static/js/app.0ca8c307bce6d013c42a.js.map
  7. 0 0
      dist/static/js/app.544e9c56d8ba4f6dd674.js
  8. 0 0
      dist/static/js/manifest.3512a67a6213c2df4180.js.map
  9. BIN
      src/assets/icon/new/pe_heart.png
  10. BIN
      src/assets/icon/new/pe_mi.png
  11. BIN
      src/assets/icon/new/pe_time.png
  12. 1 1
      src/components/pages/dataBoard/teacher/index.vue
  13. 95 0
      src/components/pages/dataBoardSies/Pe/cateRank/index.vue
  14. 188 0
      src/components/pages/dataBoardSies/Pe/courseInfo/index.vue
  15. 547 0
      src/components/pages/dataBoardSies/Pe/index.vue
  16. 158 0
      src/components/pages/dataBoardSies/Pe/loginCount/index.vue
  17. 211 0
      src/components/pages/dataBoardSies/Pe/loginTime/index.vue
  18. 172 0
      src/components/pages/dataBoardSies/Pe/studentInfo/index.vue
  19. 190 0
      src/components/pages/dataBoardSies/Pe/studentInfo2/index.vue
  20. 318 0
      src/components/pages/dataBoardSies/Pe/teacherInfo/index.vue
  21. 95 0
      src/components/pages/dataBoardSies/education/cateRank/index.vue
  22. 121 0
      src/components/pages/dataBoardSies/education/courseInfo/index.vue
  23. 419 0
      src/components/pages/dataBoardSies/education/index.vue
  24. 158 0
      src/components/pages/dataBoardSies/education/loginCount/index.vue
  25. 108 0
      src/components/pages/dataBoardSies/education/loginTime/index.vue
  26. 172 0
      src/components/pages/dataBoardSies/education/studentInfo/index.vue
  27. 170 0
      src/components/pages/dataBoardSies/education/studentInfo2/index.vue
  28. 318 0
      src/components/pages/dataBoardSies/education/teacherInfo/index.vue
  29. 135 0
      src/components/pages/dataBoardSies/index.vue
  30. 104 0
      src/components/pages/dataBoardSies/library/cateRank/index.vue
  31. 102 0
      src/components/pages/dataBoardSies/library/cateRank2/index.vue
  32. 121 0
      src/components/pages/dataBoardSies/library/courseInfo/index.vue
  33. 429 0
      src/components/pages/dataBoardSies/library/index.vue
  34. 158 0
      src/components/pages/dataBoardSies/library/loginCount/index.vue
  35. 108 0
      src/components/pages/dataBoardSies/library/loginTime/index.vue
  36. 147 0
      src/components/pages/dataBoardSies/library/studentInfo/index.vue
  37. 170 0
      src/components/pages/dataBoardSies/library/studentInfo2/index.vue
  38. 318 0
      src/components/pages/dataBoardSies/library/teacherInfo/index.vue
  39. 95 0
      src/components/pages/dataBoardSies/school/cateRank/index.vue
  40. 188 0
      src/components/pages/dataBoardSies/school/courseInfo/index.vue
  41. 547 0
      src/components/pages/dataBoardSies/school/index.vue
  42. 158 0
      src/components/pages/dataBoardSies/school/loginCount/index.vue
  43. 211 0
      src/components/pages/dataBoardSies/school/loginTime/index.vue
  44. 172 0
      src/components/pages/dataBoardSies/school/studentInfo/index.vue
  45. 190 0
      src/components/pages/dataBoardSies/school/studentInfo2/index.vue
  46. 318 0
      src/components/pages/dataBoardSies/school/teacherInfo/index.vue
  47. 9 0
      src/router/index.js

+ 1 - 1
dist/index.html

@@ -25,7 +25,7 @@
       height: 100%;
       width: 100%;
       background: #e6eaf0;
-    }</style><link href=./static/css/app.bc77bc8cec5402375e566a6f41cfca1a.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.3512a67a6213c2df4180.js></script><script type=text/javascript src=./static/js/vendor.1b8e037bd3fbbd358d74.js></script><script type=text/javascript src=./static/js/app.544e9c56d8ba4f6dd674.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.7c1e97cf58d7a9295b378ae7bc2240af.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.3512a67a6213c2df4180.js></script><script type=text/javascript src=./static/js/vendor.1b8e037bd3fbbd358d74.js></script><script type=text/javascript src=./static/js/app.0ca8c307bce6d013c42a.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/app.7c1e97cf58d7a9295b378ae7bc2240af.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/app.7c1e97cf58d7a9295b378ae7bc2240af.css.map


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/app.bc77bc8cec5402375e566a6f41cfca1a.css.map


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.0ca8c307bce6d013c42a.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.0ca8c307bce6d013c42a.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.544e9c56d8ba4f6dd674.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/manifest.3512a67a6213c2df4180.js.map


BIN
src/assets/icon/new/pe_heart.png


BIN
src/assets/icon/new/pe_mi.png


BIN
src/assets/icon/new/pe_time.png


+ 1 - 1
src/components/pages/dataBoard/teacher/index.vue

@@ -280,7 +280,7 @@
             </div>
             <div class="teaLeft teaRigth">
               <div>师均时长</div>
-              <div>{{ (loginTime / count).toFixed(0) }}小时</div>
+              <div>{{ loginTime ? (loginTime / count).toFixed(0) : loginTime }}小时</div>
             </div>
           </div>
           <WorkTime

+ 95 - 0
src/components/pages/dataBoardSies/Pe/cateRank/index.vue

@@ -0,0 +1,95 @@
+<template>
+  <div class="data_body">
+    <div style="width: 100%; height: 100%">
+      <el-table :data="tableData" style="width: 100%" :header-cell-style="{ background: '#E0EAFB',color: '#000' }"
+        :row-class-name="tableRowClassName" class="tableClass">
+        <el-table-column label="排行" min-width="50" align="center">
+          <template slot-scope="scope">{{ scope.$index + 1 }}</template>
+        </el-table-column>
+        <el-table-column prop="name" label="类别名称" min-width="80" align="center">
+        </el-table-column>
+        <el-table-column prop="sum" label="课程数量" min-width="80" align="center">
+        </el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    courseNumberArray: {
+      type: Array,
+    },
+  },
+  data() {
+    return {
+      tableData: [
+        // { rank: "1", name: "一年级", sum: "2356" },
+        // { rank: "2", name: "二年级", sum: "2256" },
+        // { rank: "3", name: "三年级", sum: "2156" },
+        // { rank: "4", name: "四年级", sum: "1356" },
+        // { rank: "5", name: "五年级", sum: "1256" },
+        // { rank: "6", name: "六年级", sum: "1056" },
+      ],
+    };
+  },
+  methods: {
+    tableRowClassName({ row, rowIndex }) {
+      if ((rowIndex + 1) % 2 === 0) {
+        return "even_row";
+      } else {
+        return "";
+      }
+    },
+    setArray(array){
+      this.tableData = []
+      for(var i = 0;i<array.length;i++){
+        this.tableData.push({
+          sum:array[i].course,
+          name:array[i].name
+        })
+      }
+      this.tableData = this.tableData.sort(function(a,b){
+        return b.sum - a.sum;
+      })
+    }
+  },
+  watch: {
+    courseNumberArray: {
+      immediate: true,
+      deep: true,
+      handler(newValue, oldValue) {
+        this.setArray(newValue)
+        this.$forceUpdate();
+      },
+    },
+  },
+  mounted() {
+    this.setArray(this.courseNumberArray)
+  },
+};
+</script>
+
+<style scoped>
+.el-table>>>.even_row {
+  background-color: #f2f7ff !important;
+}
+
+.data_body {
+  height: 100%;
+  /* display: flex; */
+  position: relative;
+  border-radius: 5px;
+  /* border: 1px solid #eee; */
+  margin: 0 auto;
+  box-sizing: border-box;
+  padding: 0;
+  width: 95%;
+  background: #fff;
+}
+
+.tableClass >>> td, .tableClass >>> th{
+  padding: 5px 0;
+}
+</style>

+ 188 - 0
src/components/pages/dataBoardSies/Pe/courseInfo/index.vue

@@ -0,0 +1,188 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        courseNumberArray: {
+            type: Array,
+        },
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                data: [],
+            },
+            option: {
+                tooltip: {
+                    trigger: 'axis',
+                    axisPointer: {
+                        // Use axis to trigger tooltip
+                        type: 'shadow' // 'shadow' as default; can also be 'line' or 'shadow'
+                    }
+                },
+                legend: {
+                    bottom: 10
+                },
+                grid: {
+                    left: '5%',
+                    right: '5%',
+                    bottom: '15%',
+                    top: '5%',
+                    containLabel: true
+                },
+                xAxis: [
+                    {
+                        type: 'category',
+                        data: [
+                            '俄罗斯方块',
+                            '单词大作战',
+                            '诗词大会',
+                            '数字王国',
+                            '石头剪刀布',
+                            '123木头人'
+                        ],
+                        axisLine: {
+                            show: false //不显示横轴线
+                        },
+                        axisTick: {
+                            alignWithLabel: true, //柱状图中心是否对齐刻度位置
+                            show: false //不显示刻度
+                        },
+                        axisLabel: {
+                            interval: 0,
+                            formatter: function (value) {
+                                var ret = "";//拼接加\n返回的类目项  
+                                var maxLength = 3;//每项显示文字个数  
+                                var valLength = value.length;//X轴类目项的文字个数  
+                                var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数  
+                                if (rowN > 1)//如果类目项的文字大于5,  
+                                {
+                                    for (var i = 0; i < rowN; i++) {
+                                        var temp = "";//每次截取的字符串  
+                                        var start = i * maxLength;//开始截取的位置  
+                                        var end = start + maxLength;//结束截取的位置  
+                                        //这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧  
+                                        temp = value.substring(start, end) + "\n";
+                                        ret += temp; //凭借最终的字符串  
+                                    }
+                                    return ret;
+                                }
+                                else {
+                                    return value;
+                                }
+                            }
+                        }
+                    }
+                ],
+                yAxis: {
+                    type: 'value'
+                },
+                series: [
+                    {
+                        name: '男生人数',
+                        type: 'bar',
+                        stack: 'total',
+                        barWidth: 20,
+                        label: {
+                            show: true
+                        },
+                        emphasis: {
+                            focus: 'series'
+                        },
+                        data: [320, 302, 301, 334, 390, 330]
+                    },
+                    {
+                        name: '女生人数',
+                        type: 'bar',
+                        stack: 'total',
+                        label: {
+                            show: true
+                        },
+                        emphasis: {
+                            focus: 'series'
+                        },
+                        data: [120, 132, 101, 134, 90, 230]
+                    }
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                // this.option.series[0].data = this.ooption.data.filter(item => item.value !== 0);
+
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setArray(array) {
+            this.ooption = {
+                data: [],
+            }
+            for (var i = 0; i < array.length; i++) {
+                this.ooption.data.push({ value: array[i].course, name: array[i].name })
+            }
+            if (!this.chartObj) {
+                this.setChart(this.ooption);
+            } else {
+                this.option.series[0].data = this.ooption.data;
+                this.chartObj.setOption(this.option);
+            }
+            this.$forceUpdate();
+        },
+    },
+    watch: {
+        courseNumberArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(newValue)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.setArray(this.courseNumberArray)
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 547 - 0
src/components/pages/dataBoardSies/Pe/index.vue

@@ -0,0 +1,547 @@
+<template>
+  <div class="body1" v-loading="isLoading">
+    <!-- 综合数据 -->
+    <div class="left">
+      <div class="top">
+        <div class="titleBox">
+          <div class="title">用户概况</div>
+        </div>
+        <div class="dataBox">
+          <div class="info_box">
+            <div class="info blueBG">
+              <span>用户总数</span>
+              <!-- <span>{{ count }}</span> -->
+              <span>{{ 310 }}</span>
+            </div>
+            <div class="info blueBG">
+              <span>本月运动用户环比</span>
+              <!-- <span>{{ weekCount }}</span> -->
+              <span>{{ "0.9%" }}</span>
+            </div>
+            <div class="info blueBG">
+              <span>运动用户百分比</span>
+              <!-- <span>{{ loginCount }}</span> -->
+              <span>{{ '60%' }}</span>
+            </div>
+            <div class="info blueBG">
+              <span>本月运动用户总数</span>
+              <!-- <span>{{ (loginCount / count).toFixed(0) }}</span> -->
+              <span>{{ 18 }}</span>
+            </div>
+          </div>
+          <loginCount style="height: calc(100% - 140px)" :monthArray="loginCountMonthArray"></loginCount>
+        </div>
+      </div>
+      <div class="bottom">
+        <div class="titleBox">
+          <div class="title">运动时长</div>
+        </div>
+        <div class="dataBox">
+          <div class="info_box">
+            <div class="info blueBG">
+              <span>运动总时长</span>
+              <!-- <span>{{ loginTime.toFixed(0) }}小时</span> -->
+              <span>{{ 1513 }}</span>
+            </div>
+            <div class="info blueBG">
+              <span>人均运动时长</span>
+              <!-- <span>{{ (loginTime / count).toFixed(0) }}小时</span> -->
+              <span>{{ 4 }}</span>
+            </div>
+          </div>
+          <loginTime :yearArray="loginCountYearArray" style="height: calc(100% - 70px)"></loginTime>
+        </div>
+      </div>
+    </div>
+    <div class="center">
+      <div class="top">
+        <div class="titleBox">
+          <div class="title">班级表现</div>
+          <el-select v-model="cType" @change="typeChange" class="selectBox" @focus="setMinWidth" style="width: 150px;">
+            <el-option label="累计积分" value=""></el-option>
+          </el-select>
+        </div>
+        <div class="dataBox">
+          <teacherInfo style="height: calc(100%)" :courseArray="courseArray" @openCourse="openCourse"></teacherInfo>
+        </div>
+      </div>
+      <div class="bottom">
+        <div class="titleBox">
+          <div class="title">学生运动报告</div>
+          <div>
+            <el-select v-model="eva" @change="typeChange2" @focus="setMinWidth" class="selectBox" style="width: 120px;">
+              <el-option label="全部年级" value=""></el-option>
+            </el-select>
+            <el-select v-model="eva" @change="typeChange2" @focus="setMinWidth" class="selectBox" style="width: 120px;">
+              <el-option label="全部班级" value=""></el-option>
+            </el-select>
+          </div>
+        </div>
+        <div class="dataBox">
+          <div class="pe_box">
+            <div class="pe_child">
+              <div class="pe_f ">
+                <div class="pe_img orange_pe"><img src="../../../../assets/icon/new/pe_heart.png" alt=""></div>
+                <span>平均心率(次/分)</span>
+              </div>
+              <div class="pe_s">
+                127
+              </div>
+            </div>
+            <div class="pe_child">
+              <div class="pe_f ">
+                <div class="pe_img red_pe"><img src="../../../../assets/icon/new/pe_heart.png" alt=""></div>
+                <span>平均最大心率(次/分)</span>
+              </div>
+              <div class="pe_s">
+                181
+              </div>
+            </div>
+            <div class="pe_child">
+              <div class="pe_f ">
+                <div class="pe_img blue_pe"><img src="../../../../assets/icon/new/pe_mi.png" alt=""></div>
+                <span>运动密度</span>
+              </div>
+              <div class="pe_s">
+                18.93%
+              </div>
+            </div>
+            <div class="pe_child">
+              <div class="pe_f">
+                <div class="pe_img purple_pe"><img src="../../../../assets/icon/new/pe_time.png" alt=""></div>
+                <span>有效时长(分)</span>
+              </div>
+              <div class="pe_s">
+                10
+              </div>
+            </div>
+          </div>
+          <studentInfo2 style="height: calc(100% - 100px)" :evCourseArray="evCourseArray" :eva="eva"></studentInfo2>
+        </div>
+      </div>
+    </div>
+    <div class="right">
+      <div class="top">
+        <div class="titleBox">
+          <div class="title">运动项目锻炼占比</div>
+
+        </div>
+        <div class="dataBox">
+
+          <courseInfo :courseNumberArray="courseNumberArray" @openCourse="openCourse2"></courseInfo>
+        </div>
+      </div>
+      <div class="bottom">
+        <div class="titleBox">
+          <div class="title">运动合格情况</div>
+        </div>
+        <div class="dataBox">
+          <!-- <studentInfo :evCourseArray="evCourseArray" :eva="eva"></studentInfo> -->
+          <div class="depth_box">
+            <div class="depth">
+              <span>平均心率合格率</span>
+              <div>
+                <el-progress :width="80" type="circle" :percentage="14.6" :stroke-width="5" :format="format"
+                  color="#106BFF"></el-progress>
+              </div>
+            </div>
+            <div class="depth">
+              <span>运动密度合格率</span>
+              <div>
+                <el-progress :width="80" type="circle" :percentage="2.4" :stroke-width="5" :format="format"
+                  color="#106BFF"></el-progress>
+              </div>
+            </div>
+            <div class="depth">
+              <span>有效时长占比</span>
+              <div>
+                <el-progress :width="80" type="circle" :percentage="20" :stroke-width="5" :format="format"
+                  color="#106BFF"></el-progress>
+              </div>
+            </div>
+            <div class="depth">
+              <span>综合合格率</span>
+              <div>
+                <el-progress :width="80" type="circle" :percentage="12.3" :stroke-width="5" :format="format"
+                  color="#106BFF"></el-progress>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import loginCount from "./loginCount";
+import loginTime from "./loginTime";
+import teacherInfo from "./teacherInfo";
+import courseInfo from "./courseInfo";
+import studentInfo from "./studentInfo";
+import studentInfo2 from "./studentInfo2";
+import cateRank from "./cateRank";
+export default {
+  components: {
+    loginCount,
+    loginTime,
+    teacherInfo,
+    courseInfo,
+    studentInfo,
+    studentInfo2,
+    cateRank,
+  },
+  props: {
+    oid: {
+      type: String,
+    },
+    org: {
+      type: String,
+    },
+  },
+  data() {
+    return {
+      isLoading: false,
+      count: 0,
+      loginCount: 0,
+      loginTime: 0,
+      courseCount: 0,
+      teacherCount: 0,
+      loginCountMonthArray: [],
+      weekCount: 0,
+      loginCountYearArray: [],
+      gradeCourse: 0,
+      subjectCourse: 0,
+      courseArray: [],
+      cType: '',
+      gradeArray: [],
+      subjectArray: [],
+      themeArray: [],
+      allArray: [],
+      courseNumberArray: [],
+      typeCount: 0,
+      typeCourseCount: 0,
+      lightJson: {
+        users: 0,
+        teachers: 0,
+        students: 0,
+        upCourseTeachers: 0,
+        gCourseTeachers: 0,
+        upCourseUsers: 0,
+        gCourseUsers: 0,
+        toolUsers: 0,
+        rateUser: 0,
+        upgCourseTeachers: 0,
+        commentUsers: 0,
+      },
+      evArray: [],
+      eva: '',
+      evCourseArray: [],
+      minWidth: 0
+    }
+  },
+  mounted() {
+    this.getData();
+  },
+  methods: {
+    setMinWidth(val) {
+      this.minWidth = val.srcElement.clientWidth
+    },
+    openCourse(classIndex, subIndex) {
+
+    },
+    openCourse2(index) {
+
+    },
+    getData() {
+
+    },
+    typeChange() {
+
+    },
+    typeChange2() {
+
+    },
+    format(percentage) {
+      return percentage + '%';
+    },
+  },
+};
+</script>
+
+
+<style scoped>
+.body1 {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  padding: 20px;
+  box-sizing: border-box;
+  overflow: hidden;
+}
+
+.left {
+  width: calc(100% / 4 * 1);
+  height: 100%;
+}
+
+.left>.top {
+  width: 100%;
+  height: calc(100% / 5 * 2.8 - 20px);
+  background: #fff;
+  border-radius: 5px;
+  margin: 0 0 20px 0;
+}
+
+.left>.bottom {
+  width: 100%;
+  height: calc(100% / 5 * 2.2);
+  background: #fff;
+  border-radius: 5px;
+}
+
+.center {
+  width: calc(100% / 4 * 2 - 40px);
+  height: 100%;
+  margin: 0 20px;
+}
+
+.center>.top {
+  width: 100%;
+  height: calc(100% / 5 * 2.5 - 20px);
+  background: #fff;
+  border-radius: 5px;
+  margin: 0 0 20px 0;
+}
+
+.center>.bottom {
+  width: 100%;
+  height: calc(100% / 5 * 2.5);
+  background: #fff;
+  border-radius: 5px;
+}
+
+.right {
+  width: calc(100% / 4 * 1);
+  height: 100%;
+}
+
+.right>.top {
+  width: 100%;
+  height: calc(100% / 5 * 2.8 - 20px);
+  background: #fff;
+  border-radius: 5px;
+  margin: 0 0 20px 0;
+}
+
+.right>.bottom {
+  width: 100%;
+  height: calc(100% / 5 * 2.2);
+  background: #fff;
+  border-radius: 5px;
+}
+
+.titleBox {
+  height: 40px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 0 15px;
+  width: 100%;
+  box-sizing: border-box;
+}
+
+.titleBox>.title {
+  font-weight: 700;
+}
+
+.dataBox {
+  height: calc(100% - 40px);
+  width: 100%;
+}
+
+.info_box {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: space-between;
+  width: 90%;
+  margin: 0 auto;
+}
+
+.info_box>.info2,
+.info_box>.info3,
+.info_box>.info {
+  width: calc(50% - 10px);
+  display: flex;
+  height: 60px;
+  justify-content: space-between;
+  align-items: center;
+  padding: 0 10px;
+  box-sizing: border-box;
+  margin-bottom: 10px;
+  border-radius: 5px;
+}
+
+.info_box>.info2 {
+  width: calc(100% / 4 - 10px);
+  /* align-items: flex-end; */
+}
+
+.info_box>.info3 {
+  width: 100%;
+  margin-bottom: 5px;
+}
+
+.info_box>.info2>span:nth-child(1),
+.info_box>.info3>span:nth-child(1),
+.info_box>.info>span:nth-child(1) {
+  font-size: 14px;
+  /* margin: 0 0 0 20px; */
+  color: #565e6a;
+  width: 60px;
+  white-space: pre-wrap;
+  word-break: break-all;
+}
+
+.info_box>.info2>span:nth-child(2),
+.info_box>.info3>span:nth-child(2),
+.info_box>.info>span:nth-child(2) {
+  font-size: 24px;
+  /* font-weight: 700; */
+}
+
+.blueBG {
+  background: rgb(243, 248, 253);
+  border: 2px solid rgb(234, 246, 255);
+}
+
+.greenBG {
+  background: linear-gradient(180deg,
+      rgb(211, 246, 228, 0.2) 0%,
+      rgb(23, 196, 105, 0.3) 100%);
+}
+
+.depth_box {
+  display: flex;
+  flex-wrap: wrap;
+  height: 100%;
+  width: 95%;
+  margin: 0 auto;
+  overflow: hidden;
+  justify-content: space-between;
+}
+
+.depth {
+  width: calc(100% / 2 - 10px);
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+}
+
+.depth>span:nth-child(1) {
+  font-size: 14px;
+  font-weight: 700;
+  margin: 0 0 10px;
+}
+
+.depth>div:nth-child(1) {}
+
+.course_box {
+  display: flex;
+  height: 50%;
+  width: 95%;
+  margin: 0 auto;
+}
+
+.course_box .info_box {
+  height: 100%;
+  width: 100px;
+  flex-direction: column;
+  margin: 0;
+  flex-wrap: nowrap;
+}
+
+.course_box_p {
+  width: calc(100% - 100px);
+}
+
+.selectBox {
+  width: 80px;
+  margin-left: 10px;
+}
+
+.selectBox>>>.el-input__inner {
+  height: 30px;
+  line-height: 30px;
+}
+
+.selectBox>>>.el-input__icon {
+  line-height: 30px;
+}
+
+
+.pe_box {
+  display: flex;
+  width: 100%;
+  height: 100px;
+  background: rgb(221, 240, 234);
+  padding: 0 20px;
+  justify-content: space-between;
+  box-sizing: border-box;
+}
+
+.orange_pe {
+  background: rgb(254, 119, 1);
+}
+
+.red_pe {
+  background: rgb(216, 35, 254);
+
+}
+
+.purple_pe {
+  background: rgb(255, 13, 11);
+
+}
+
+.pe_child {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: space-between;
+  padding: 20px 0;
+  height: 100%;
+  box-sizing: border-box;
+}
+
+.pe_f {
+  display: flex;
+  align-items: center;
+  font-size: 13px;
+}
+
+.blue_pe {
+  background: rgb(78, 241, 238);
+
+}
+
+.pe_img {
+  border-radius: 50%;
+  width: 40px;
+  height: 40px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.pe_img>img {
+  width: 60%;
+}
+
+.pe_s {
+  font-weight: 700;
+  color: #5a5a5a;
+}
+</style>

+ 158 - 0
src/components/pages/dataBoardSies/Pe/loginCount/index.vue

@@ -0,0 +1,158 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        monthArray: {
+            type: Array,
+            default: []
+        },
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                xdata: [],
+                teacher: [],
+                student: [],
+            },
+            option: {
+                tooltip: {
+                    trigger: 'axis'
+                },
+                // legend: {
+                //     data: ['老师', '学生'],
+                //     right: '10'
+                // },
+                grid: {
+                    top: '30',
+                    left: '5%',
+                    right: '5%',
+                    bottom: '5%',
+                    containLabel: true
+                },
+                xAxis: {
+                    type: 'category',
+                    boundaryGap: true,
+                    // data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月']
+                    data: []
+                },
+                yAxis: {
+                    type: 'value'
+                },
+                series: [
+                    {
+                        name: '用户',
+                        type: 'line',
+                        // data: [120, 50, 101, 130, 110, 120]
+                        areaStyle: {
+                            color: 'rgb(220, 231, 251)'
+                        },
+                        data: [],
+                        itemStyle: {
+                            normal: {
+                                color: function (params) {
+                                    return "#106bff";
+                                },
+                            },
+                        },
+                    },
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                // this.option.xAxis.data = option.xdata;
+                // this.option.series[0].data = option.teacher;
+                this.option.xAxis.data = ['1月', '2月', '3月', '4月', '5月', '6月', '7月'];
+                this.option.series[0].data = [300, 500, 490, 510, 505, 520, 550];
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+    },
+    watch: {
+        monthArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.ooption = {
+                    xdata: [],
+                    teacher: [],
+                    student: [],
+                }
+                let _array = newValue
+                for (var i = 0; i < _array.length; i++) {
+                    this.ooption.xdata.push(_array[i].Month + '月')
+                    this.ooption.teacher.push(_array[i].teacher)
+                    this.ooption.student.push(_array[i].student)
+                }
+
+                if (!this.chartObj) {
+                    this.setChart(this.ooption);
+                } else {
+                    this.option.xAxis.data = this.ooption.xdata;
+                    this.option.series[0].data = this.ooption.teacher;
+                    this.option.series[1].data = this.ooption.student;
+                    this.chartObj.setOption(this.option);
+                }
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.ooption = {
+            xdata: [],
+            teacher: [],
+            student: [],
+        }
+        let _array = this.monthArray
+        for (var i = 0; i < _array.length; i++) {
+            this.ooption.xdata.push(_array[i].Month + '月')
+            this.ooption.teacher.push(_array[i].teacher)
+            this.ooption.student.push(_array[i].student)
+        }
+        this.setChart(this.ooption);
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 211 - 0
src/components/pages/dataBoardSies/Pe/loginTime/index.vue

@@ -0,0 +1,211 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        yearArray: {
+            type: Array,
+        },
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                xdata: [],
+                sdata: [],
+            },
+            option: {
+                series: [
+                    {
+                        type: 'gauge',
+                        startAngle: 180,
+                        endAngle: 0,
+                        center: ['50%', '75%'],
+                        radius: '150%',
+                        min: 0,
+                        max: 4000,
+                        splitNumber: 8,
+                        axisLine: {
+                            lineStyle: {
+                                width: 10,
+                                color: [
+                                    [0.25, 'rgb(251, 223, 148)'],
+                                    [0.5, 'rgb(145, 208, 237)'],
+                                    [0.75, 'rgb(68, 96, 193)'],
+                                    [1, 'rgb(240, 141, 158)']
+                                ]
+                            }
+                        },
+                        pointer: {
+                            icon: 'path://M12.8,0.7l12,40.1H0.7L12.8,0.7z',
+                            length: '12%',
+                            width: 12,
+                            offsetCenter: [0, '-60%'],
+                            itemStyle: {
+                                color: 'auto'
+                            }
+                        },
+                        axisTick: {
+                            length: 6,
+                            lineStyle: {
+                                color: 'auto',
+                                width: 2
+                            }
+                        },
+                        splitLine: {
+                            length: 20,
+                            lineStyle: {
+                                color: 'auto',
+                                width: 5
+                            }
+                        },
+                        axisLabel: {
+                            show:false
+                        },
+                        title:{
+                            show:false
+                        },
+                        detail: {
+                            fontSize: 30,
+                            offsetCenter: [0, '-15%'],
+                            color: 'inherit'
+                        },
+                        data: [
+                            {
+                                value: 3055,
+                                name: ''
+                            }
+                        ]
+                    }
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+
+                // this.option.xAxis.data = option.xdata;
+                // this.option.series[0].data = option.sdata;
+                // this.option.visualMap.max = option.max ? option.max : 0;
+
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+    },
+    watch: {
+        yearArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.ooption = {
+                    xdata: [],
+                    sdata: [],
+                    max: 0
+                }
+                let _array = newValue
+                let max = []
+                for (var i = 0; i < _array.length; i++) {
+                    this.ooption.xdata.push(_array[i].Month + '月')
+                    this.ooption.sdata.push([i, 0, _array[i].sun])
+                    this.ooption.sdata.push([i, 1, _array[i].mon])
+                    this.ooption.sdata.push([i, 2, _array[i].tue])
+                    this.ooption.sdata.push([i, 3, _array[i].wed])
+                    this.ooption.sdata.push([i, 4, _array[i].thur])
+                    this.ooption.sdata.push([i, 5, _array[i].fri])
+                    this.ooption.sdata.push([i, 6, _array[i].sat])
+                    // let _data = [_array[i].Month-1,] //[月份,星期,值]
+                    max.push(_array[i].sun)
+                    max.push(_array[i].mon)
+                    max.push(_array[i].tue)
+                    max.push(_array[i].wed)
+                    max.push(_array[i].thur)
+                    max.push(_array[i].fri)
+                    max.push(_array[i].sat)
+                }
+                this.ooption.max = max.sort(function (a, b) {
+                    return b - a;
+                })[0];
+                if (!this.chartObj) {
+                    this.setChart(this.ooption);
+                } else {
+                    this.option.xAxis.data = this.ooption.xdata;
+                    this.option.series[0].data = this.ooption.sdata;
+                    this.option.visualMap.max = this.ooption.max ? this.ooption.max : 0;
+                    this.chartObj.setOption(this.option);
+                }
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.ooption = {
+            xdata: [],
+            sdata: [],
+            max: 0
+        }
+        let _array = this.yearArray
+        let max = []
+        for (var i = 0; i < _array.length; i++) {
+            this.ooption.xdata.push(_array[i].Month + '月')
+            this.ooption.sdata.push([i, 0, _array[i].sun])
+            this.ooption.sdata.push([i, 1, _array[i].mon])
+            this.ooption.sdata.push([i, 2, _array[i].tue])
+            this.ooption.sdata.push([i, 3, _array[i].wed])
+            this.ooption.sdata.push([i, 4, _array[i].thur])
+            this.ooption.sdata.push([i, 5, _array[i].fri])
+            this.ooption.sdata.push([i, 6, _array[i].sat])
+            // let _data = [_array[i].Month-1,] //[月份,星期,值]
+            max.push(_array[i].sun)
+            max.push(_array[i].mon)
+            max.push(_array[i].tue)
+            max.push(_array[i].wed)
+            max.push(_array[i].thur)
+            max.push(_array[i].fri)
+            max.push(_array[i].sat)
+        }
+        this.ooption.max = max.sort(function (a, b) {
+            return b - a;
+        })[0];
+
+        this.setChart(this.ooption);
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    position: relative;
+    border-radius: 5px;
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 172 - 0
src/components/pages/dataBoardSies/Pe/studentInfo/index.vue

@@ -0,0 +1,172 @@
+<template>
+    <div class="data_body">
+        <!--  v-if="this.ooption.xdata.length" -->
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+        <!-- <div style="width: 100%; height: 100%;display: flex;align-items: center;justify-content: center;"
+            v-show="!this.ooption.xdata.length">暂无数据</div> -->
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        evCourseArray: {
+            type: Array,
+            default: []
+        },
+        eva: {
+            type: String,
+            default: ''
+        }
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                xdata: [],
+                sdata: [],
+            },
+            option: {
+                tooltip: {},
+                radar: {
+                    axisName: {
+                        color: "#000"
+                    },
+                    // shape: 'circle',
+                    indicator: [
+                        // { name: '目标一', max: 5 },
+                        // { name: '目标二', max: 5 },
+                        // { name: '目标三', max: 5 },
+                        // { name: '目标四', max: 5 },
+                        // { name: '目标五', max: 5 }
+                    ]
+                },
+                series: [
+                    {
+                        name: '学生综合评价',
+                        type: 'radar',
+                        data: [
+                            {
+                                areaStyle: {
+                                    opacity: 0.2,
+                                    color: 'rgb(239, 144, 55)'
+                                },
+                                itemStyle: {
+                                    color: 'rgb(239, 144, 55)',
+                                    lineStyle: {
+                                        color: 'rgb(239, 144, 55)'
+                                    }
+                                },
+                                // 5, 4, 3, 5, 5, 2
+                                value: [],
+                                name: ''
+                            }
+                        ]
+                    }
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                // this.option.radar.indicator = option.xdata;
+                // this.option.series[0].data[0].value = option.sdata;
+                this.option.radar.indicator = [
+                        { name: '数学', max: 5 },
+                        { name: '语文', max: 5 },
+                        { name: '美术', max: 5 },
+                        { name: '科学', max: 5 },
+                        { name: '心里健康', max: 5 },
+                        { name: '道德与法治', max: 5 },
+                        { name: '生命与安全', max: 5 },
+                        { name: '体育', max: 5 },
+                        { name: '音乐', max: 5 }
+                    ];
+                this.option.series[0].data[0].value = [5,5,5,5,4,3,4,5,4];
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setArray(array) {
+            this.ooption = {
+                xdata: [],
+                sdata: [],
+            }
+            for (var i = 0; i < array.length; i++) {
+                if (array[i].evid == this.eva) {
+                    this.ooption.xdata = array[i].indicator
+                    this.ooption.sdata = array[i].value
+                    break;
+                }
+            }
+            setTimeout(() => {
+                // if (!this.chartObj) {
+                this.setChart(this.ooption);
+                // } else {
+                //     this.option.radar.indicator = this.ooption.xdata;
+                //     this.option.series[0].data[0].value = this.ooption.sdata;
+                //     this.chartObj.setOption(this.option);
+                // }
+            }, 100);
+            this.$forceUpdate();
+        },
+    },
+    watch: {
+        evCourseArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(newValue)
+                this.$forceUpdate();
+            },
+        },
+        eva: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(this.evCourseArray)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.setArray(this.evCourseArray)
+        // this.setChart(this.ooption);
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 190 - 0
src/components/pages/dataBoardSies/Pe/studentInfo2/index.vue

@@ -0,0 +1,190 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        evCourseArray: {
+            type: Array,
+            default: []
+        },
+        eva: {
+            type: String,
+            default: ''
+        }
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                xdata: [],
+                sdata: [],
+            },
+            option: {
+                xAxis: {
+                    type: 'value',
+                    show:false,
+                },
+                grid:{
+                    left: '15%',
+                    right: '5%',
+                    bottom: '5%',
+                    top: '5%',
+                },
+                yAxis: {
+                    inverse: true,
+                    type: 'category',
+                    data: [
+                        '休闲状态(<=50%)',
+                        '热身状态(50-60%)',
+                        '脂肪燃烧(60-70%)',
+                        '心肺提升(70-80%)',
+                        '乳酸闽值(80-90%)',
+                        '极限无氧(>=90%)'
+                    ]
+                },
+                series: [
+                    {
+                        showBackground: true,
+                        data: [
+                            {
+                                value: 10,
+                                itemStyle: {
+                                    color: 'rgb(157, 157, 157)'
+                                }
+                            },
+                            {
+                                value: 20,
+                                itemStyle: {
+                                    color: 'rgb(15, 216, 242)'
+                                }
+                            },
+                            {
+                                value: 40,
+                                itemStyle: {
+                                    color: 'rgb(0, 208, 146)'
+                                }
+                            },
+                            {
+                                value: 80,
+                                itemStyle: {
+                                    color: 'rgb(255, 192, 29)'
+                                }
+                            },
+                            {
+                                value: 70,
+                                itemStyle: {
+                                    color: 'rgb(247, 123, 1)'
+                                }
+                            },
+                            {
+                                value: 15,
+                                itemStyle: {
+                                    color: 'rgb(255, 58, 32)'
+                                }
+                            },
+                        ],
+                        type: 'bar'
+                    }
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                // this.option.radar.indicator = option.xdata;
+                // this.option.series[0].data[0].value = option.sdata;
+
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setArray(array) {
+            this.setChart(array);
+            return
+            this.ooption = {
+                xdata: [],
+                sdata: [],
+            }
+            for (var i = 0; i < array.length; i++) {
+                if (array[i].evid == this.eva) {
+                    this.ooption.xdata = array[i].indicator
+                    this.ooption.sdata = array[i].value
+                    break;
+                }
+            }
+            setTimeout(() => {
+                // if (!this.chartObj) {
+                this.setChart(this.ooption);
+                // } else {
+                //     this.option.radar.indicator = this.ooption.xdata;
+                //     this.option.series[0].data[0].value = this.ooption.sdata;
+                //     this.chartObj.setOption(this.option);
+                // }
+            }, 100);
+            this.$forceUpdate();
+        },
+    },
+    watch: {
+        evCourseArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(newValue)
+                this.$forceUpdate();
+            },
+        },
+        eva: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(this.evCourseArray)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.setArray(this.evCourseArray)
+        // this.setChart(this.ooption);
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 318 - 0
src/components/pages/dataBoardSies/Pe/teacherInfo/index.vue

@@ -0,0 +1,318 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        courseArray: {
+            type: Array,
+        },
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                hours: [],
+                days: [],
+                data: [],
+            },
+            option: {
+                tooltip: {
+                    position: 'top',
+                    formatter: function (params) {
+                        // console.log(params);
+                        return params.marker + params.name + ' ' + params.data[1];//params.seriesName + '<br>' + params.
+
+                    }
+                },
+                title: [],
+                singleAxis: [],
+                series: []
+            },
+        };
+    },
+    methods: {
+        // setChart(option) {
+        //     // 雷达图显示的标签
+        //     let newPromise = new Promise((resolve) => {
+        //         resolve();
+        //     });
+        //     //然后异步执行echarts的初始化函数
+        //     newPromise.then(() => {
+        //         const chartObj = this.$echarts.init(
+        //             //劳动课程
+        //             this.$el.querySelector("#charts_canvas")
+        //         );
+        //         const hours = option.hours
+        //         // [
+        //         //     // '语文', '数学', '英语', '科学', '体育', '音乐', '美术',
+        //         //     // '劳动', '其他',
+        //         // ];
+        //         // prettier-ignore
+        //         const days = option.days
+        //         // [
+        //         //     // '一年级', '二年级', '三年级', '四年级', '五年级', '六年级'
+        //         // ];
+        //         // prettier-ignore
+        //         const data = option.data
+        //         // [
+        //         //     // [0, 0, 2], [0, 1, 1], [0, 2, 3], [0, 3, 0], [0, 4, 5], [0, 5, 5], [0, 6, 7], [0, 7, 8], [0, 8, 1],
+        //         //     // [1, 0, 5], [1, 1, 1], [1, 2, 2], [1, 3, 0], [1, 4, 5], [1, 5, 7], [1, 6, 7], [1, 7, 8], [1, 8, 6],
+        //         //     // [2, 0, 5], [2, 1, 2], [2, 2, 0], [2, 3, 2], [2, 4, 1], [2, 5, 5], [2, 6, 4], [2, 7, 4], [2, 8, 1],
+        //         //     // [3, 0, 1], [3, 1, 1], [3, 2, 1], [3, 3, 0], [3, 4, 5], [3, 5, 2], [3, 6, 7], [3, 7, 8], [3, 8, 5],
+        //         //     // [4, 0, 5], [4, 1, 3], [4, 2, 0], [4, 3, 3], [4, 4, 4], [4, 5, 2], [4, 6, 3], [4, 7, 5], [4, 8, 1],
+        //         //     // [5, 0, 5], [5, 1, 1], [5, 2, 0], [5, 3, 0], [5, 4, 5], [5, 5, 5], [5, 6, 7], [5, 7, 8], [5, 8, 3],
+        //         // ];
+        //         const title = [];
+        //         const singleAxis = [];
+        //         const series = [];
+        //         days.forEach(function (day, idx) {
+        //             title.push({
+        //                 textBaseline: 'middle',
+        //                 top: ((idx + 0.5) * 90) / days.length + '%',
+        //                 text: day,
+        //                 textStyle: {
+        //                     fontSize: 12,
+        //                 },
+        //             });
+        //             singleAxis.push({
+        //                 left: 70,
+        //                 type: 'category',
+        //                 boundaryGap: false,
+        //                 data: hours,
+        //                 top: (idx * 90) / days.length + 5 + '%',
+        //                 height: 90 / days.length - 10 + '%'
+        //             });
+        //             series.push({
+        //                 singleAxisIndex: idx,
+        //                 coordinateSystem: 'singleAxis',
+        //                 type: 'scatter',
+        //                 data: [],
+        //                 symbolSize: function (dataItem) {
+        //                     return dataItem[1] * 3;
+        //                 }
+        //             });
+        //         });
+        //         data.forEach(function (dataItem) {
+        //             series[dataItem[0]].data.push([dataItem[1], dataItem[2]]);
+        //         });
+        //         chartObj.off('click')
+        //         let _this = this
+        //         chartObj.on('click', function (param) {  
+        //             //param参数包含的内容有: 
+        //             //param.name:X轴的值 
+        //             //param.data:Y轴的值 
+        //             //param.value:Y轴的值 
+        //             //param.type:点击事件均为click 
+        //             //param.seriesName:legend的名称 
+        //             //param.seriesIndex:系列序号(series中当前图形是第几个图形第几个) 
+        //             //param.dataIndex:数值序列(X轴上当前点是第几个点)
+        //             //alert(param.seriesName);  //legend的名称
+        //             console.log(param);  //X轴的值
+        //             _this.$emit('openCourse',param.componentIndex,param.data[0])
+        //         });
+
+        //         this.option.title = title
+        //         this.option.singleAxis = singleAxis
+        //         this.option.series = series
+        //         // 初始化雷达图
+        //         this.chartObj = chartObj;
+        //         this.chartObj.setOption(this.option);
+        //     });
+        // },
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                const hours = 
+                [
+                    '1班', '2班', '3班', '4班', '5班', '6班', '7班',
+                    '8班'
+                ];
+                // prettier-ignore
+                const days = 
+                [
+                    '一年级', '二年级', '三年级', '四年级', '五年级', '六年级'
+                ];
+                // prettier-ignore
+                const data = 
+                [
+                    [0, 0, 8], [0, 1, 3], [0, 2, 3], [0, 3, 2], [0, 4, 4], [0, 5, 5], [0, 6, 0], [0, 7, 0],
+                    [1, 0, 18], [1, 1, 29], [1, 2, 21], [1, 3, 37], [1, 4, 38], [1, 5, 41], [1, 6, 0], [1, 7, 0],
+                    [2, 0, 46], [2, 1, 43], [2, 2, 31], [2, 3, 44], [2, 4, 43], [2, 5, 38], [2, 6, 0], [2, 7, 0],
+                    [3, 0, 43], [3, 1, 37], [3, 2, 25], [3, 3, 40], [3, 4, 35], [3, 5, 26], [3, 6, 0], [3, 7, 0],
+                    [4, 0, 38], [4, 1, 37], [4, 2, 25], [4, 3, 0], [4, 4, 0], [4, 5, 0], [4, 6, 0], [4, 7, 0],
+                    [5, 0, 24], [5, 1, 0], [5, 2, 3], [5, 3, 0], [5, 4, 0], [5, 5, 0], [5, 6, 0], [5, 7, 0],
+                ];
+                const title = [];
+                const singleAxis = [];
+                const series = [];
+                days.forEach(function (day, idx) {
+                    title.push({
+                        textBaseline: 'middle',
+                        top: ((idx + 0.5) * 90) / days.length + '%',
+                        text: day,
+                        textStyle: {
+                            fontSize: 12,
+                        },
+                    });
+                    singleAxis.push({
+                        left: 70,
+                        type: 'category',
+                        boundaryGap: false,
+                        data: hours,
+                        top: (idx * 90) / days.length + 5 + '%',
+                        height: 90 / days.length - 10 + '%'
+                    });
+                    series.push({
+                        singleAxisIndex: idx,
+                        coordinateSystem: 'singleAxis',
+                        type: 'scatter',
+                        data: [],
+                        symbolSize: function (dataItem) {
+                            return dataItem[1] * 1.5;
+                        }
+                    });
+                });
+                data.forEach(function (dataItem) {
+                    series[dataItem[0]].data.push([dataItem[1], dataItem[2]]);
+                });
+                this.option.title = title
+                this.option.singleAxis = singleAxis
+                this.option.series = series
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setJson(array) {
+            this.setChart(this.ooption);
+            if (array != undefined && array.length > 0) {
+                this.ooption = {
+                    hours: [],
+                    days: [],
+                    data: [],
+                }
+                let _grade = []
+                let _subject = []
+                let data = []
+
+                array.forEach(function (item, idx) {
+                    _grade.push(item.name)
+                })
+
+                array[0].subject.forEach(function (item, idx) {
+                    _subject.push(item.name)
+                })
+                array.forEach(function (item, idx) {
+                    item.subject.forEach(function (item2, idx2) {
+                        data.push([idx, idx2, item2.course])
+                    })
+                })
+                this.ooption.hours = _subject
+                this.ooption.days = _grade
+                this.ooption.data = data
+                if (!this.chartObj) {
+                    this.setChart(this.ooption);
+                } else {
+                    const hours = this.ooption.hours;
+                    // prettier-ignore
+                    const days = this.ooption.days;
+                    // prettier-ignore
+                    const data = this.ooption.data;
+                    const title = [];
+                    const singleAxis = [];
+                    const series = [];
+                    days.forEach(function (day, idx) {
+                        title.push({
+                            textBaseline: 'middle',
+                            top: ((idx + 0.5) * 90) / days.length + '%',
+                            text: day,
+                            textStyle: {
+                                fontSize: 12,
+                            },
+                        });
+                        singleAxis.push({
+                            left: 70,
+                            type: 'category',
+                            boundaryGap: false,
+                            data: hours,
+                            top: (idx * 90) / days.length + 5 + '%',
+                            height: 90 / days.length - 10 + '%'
+                        });
+                        series.push({
+                            singleAxisIndex: idx,
+                            coordinateSystem: 'singleAxis',
+                            type: 'scatter',
+                            data: [],
+                            symbolSize: function (dataItem) {
+                                return dataItem[1] * 3;
+                            }
+                        });
+                    });
+                    data.forEach(function (dataItem) {
+                        series[dataItem[0]].data.push([dataItem[1], dataItem[2]]);
+                    });
+
+                    this.option.title = title
+                    this.option.singleAxis = singleAxis
+                    this.option.series = series
+                    this.chartObj.setOption(this.option);
+                }
+            }
+        }
+    },
+    watch: {
+        courseArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                // newValue = newValue.filter(item => {
+                //     return ['一年级','二年级','三年级','四年级','五年级','六年级','七年级'].indexOf(item.name) !== -1
+                // })
+                this.setJson(newValue)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        // this.courseArray = this.courseArray.filter(item => {
+        //     return ['一年级','二年级','三年级','四年级','五年级','六年级','七年级'].indexOf(item.name) !== -1
+        // })
+
+        this.setJson(this.courseArray)
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    position: relative;
+    border-radius: 5px;
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 95 - 0
src/components/pages/dataBoardSies/education/cateRank/index.vue

@@ -0,0 +1,95 @@
+<template>
+  <div class="data_body">
+    <div style="width: 100%; height: 100%">
+      <el-table :data="tableData" style="width: 100%" :header-cell-style="{ background: '#E0EAFB',color: '#000' }"
+        :row-class-name="tableRowClassName" class="tableClass">
+        <el-table-column label="排行" min-width="50" align="center">
+          <template slot-scope="scope">{{ scope.$index + 1 }}</template>
+        </el-table-column>
+        <el-table-column prop="name" label="类别名称" min-width="80" align="center">
+        </el-table-column>
+        <el-table-column prop="sum" label="课程数量" min-width="80" align="center">
+        </el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    courseNumberArray: {
+      type: Array,
+    },
+  },
+  data() {
+    return {
+      tableData: [
+        // { rank: "1", name: "一年级", sum: "2356" },
+        // { rank: "2", name: "二年级", sum: "2256" },
+        // { rank: "3", name: "三年级", sum: "2156" },
+        // { rank: "4", name: "四年级", sum: "1356" },
+        // { rank: "5", name: "五年级", sum: "1256" },
+        // { rank: "6", name: "六年级", sum: "1056" },
+      ],
+    };
+  },
+  methods: {
+    tableRowClassName({ row, rowIndex }) {
+      if ((rowIndex + 1) % 2 === 0) {
+        return "even_row";
+      } else {
+        return "";
+      }
+    },
+    setArray(array){
+      this.tableData = []
+      for(var i = 0;i<array.length;i++){
+        this.tableData.push({
+          sum:array[i].course,
+          name:array[i].name
+        })
+      }
+      this.tableData = this.tableData.sort(function(a,b){
+        return b.sum - a.sum;
+      })
+    }
+  },
+  watch: {
+    courseNumberArray: {
+      immediate: true,
+      deep: true,
+      handler(newValue, oldValue) {
+        this.setArray(newValue)
+        this.$forceUpdate();
+      },
+    },
+  },
+  mounted() {
+    this.setArray(this.courseNumberArray)
+  },
+};
+</script>
+
+<style scoped>
+.el-table>>>.even_row {
+  background-color: #f2f7ff !important;
+}
+
+.data_body {
+  height: 100%;
+  /* display: flex; */
+  position: relative;
+  border-radius: 5px;
+  /* border: 1px solid #eee; */
+  margin: 0 auto;
+  box-sizing: border-box;
+  padding: 0;
+  width: 95%;
+  background: #fff;
+}
+
+.tableClass >>> td, .tableClass >>> th{
+  padding: 5px 0;
+}
+</style>

+ 121 - 0
src/components/pages/dataBoardSies/education/courseInfo/index.vue

@@ -0,0 +1,121 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        courseNumberArray: {
+            type: Array,
+        },
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                data: [],
+            },
+            option: {
+                xAxis: {
+                    type: 'category',
+                    data: ['一年级', '二年级', '三年级', '四年级', '五年级', '六年级']
+                },
+                tooltip:{},
+                grid: {
+                    left: '5%',
+                    right: '5%',
+                    bottom: '5%',
+                    top: '5%',
+                    containLabel: true
+                },
+                yAxis: {
+                    type: 'value'
+                },
+                series: [
+                    {
+                    data: [120, 200, 150, 80, 70, 110],
+                    type: 'bar',
+                    itemStyle: {
+                        color: 'rgba(80, 135, 236)'
+                    }
+                    }
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                // this.option.series[0].data = this.ooption.data.filter(item => item.value !== 0);
+                
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setArray(array) {
+            this.ooption = {
+                data: [],
+            }
+            for (var i = 0; i < array.length; i++) {
+                this.ooption.data.push({ value: array[i].course, name: array[i].name })
+            }
+            if (!this.chartObj) {
+                this.setChart(this.ooption);
+            } else {
+                this.option.series[0].data = this.ooption.data;
+                this.chartObj.setOption(this.option);
+            }
+            this.$forceUpdate();
+        },
+    },
+    watch: {
+        courseNumberArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(newValue)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.setArray(this.courseNumberArray)
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 419 - 0
src/components/pages/dataBoardSies/education/index.vue

@@ -0,0 +1,419 @@
+<template>
+  <div class="body1" v-loading="isLoading">
+    <!-- 综合数据 -->
+    <div class="left">
+      <div class="top">
+        <div class="titleBox">
+          <div class="title">用户概况</div>
+        </div>
+        <div class="dataBox">
+          <div class="info_box">
+            <div class="info blueBG">
+              <span>用户总数</span>
+              <!-- <span>{{ count }}</span> -->
+              <span>{{ 310 }}</span>
+            </div>
+            <div class="info blueBG">
+              <span>本月登录用户环比</span>
+              <!-- <span>{{ weekCount }}</span> -->
+              <span>{{ "3.04%" }}</span>
+            </div>
+            <div class="info blueBG">
+              <span>本月登录用户总数</span>
+              <!-- <span>{{ loginCount }}</span> -->
+              <span>{{ 2131 }}</span>
+            </div>
+            <div class="info blueBG">
+              <span>本月新增登录用户</span>
+              <!-- <span>{{ (loginCount / count).toFixed(0) }}</span> -->
+              <span>{{ 1604 }}</span>
+            </div>
+          </div>
+          <loginCount style="height: calc(100% - 140px)" :monthArray="loginCountMonthArray"></loginCount>
+        </div>
+      </div>
+      <div class="bottom">
+        <div class="titleBox">
+          <div class="title">登录频次</div>
+          <el-select v-model="cType" @change="typeChange" class="selectBox">
+            <el-option label="全部" value=""></el-option>
+          </el-select>
+        </div>
+        <div class="dataBox">
+          <div class="info_box">
+            <div class="info blueBG">
+              <span>登录频次</span>
+              <!-- <span>{{ loginTime.toFixed(0) }}小时</span> -->
+              <span>{{ 117138 }}</span>
+            </div>
+            <div class="info blueBG">
+              <span>人均登录频次</span>
+              <!-- <span>{{ (loginTime / count).toFixed(0) }}小时</span> -->
+              <span>{{ 4 }}</span>
+            </div>
+          </div>
+          <loginTime :yearArray="loginCountYearArray" style="height: calc(100% - 70px)"></loginTime>
+        </div>
+      </div>
+    </div>
+    <div class="center">
+      <div class="top">
+        <div class="titleBox">
+          <div class="title">班级表现</div>
+          <el-select v-model="cType" @change="typeChange" class="selectBox"  @focus="setMinWidth" style="width: 150px;">
+            <el-option label="累计积分" value=""></el-option>
+          </el-select>
+        </div>
+        <div class="dataBox">
+          <teacherInfo style="height: calc(100%)" :courseArray="courseArray" @openCourse="openCourse"></teacherInfo>
+        </div>
+      </div>
+      <div class="bottom">
+        <div class="titleBox">
+          <div class="title">学生综合素质报告</div>
+        </div>
+        <div class="dataBox">
+          <studentInfo2 :evCourseArray="evCourseArray" :eva="eva"></studentInfo2>
+        </div>
+      </div>
+    </div>
+    <div class="right">
+      <div class="top">
+        <div class="titleBox">
+          <div class="title">年级表现</div>
+          <el-select v-model="cType" @change="typeChange" class="selectBox"  @focus="setMinWidth" style="width: 150px;">
+            <el-option label="全部年级" value=""></el-option>
+          </el-select>
+        </div>
+        <div class="dataBox">
+          <courseInfo :courseNumberArray="courseNumberArray" @openCourse="openCourse2"></courseInfo>
+        </div>
+      </div>
+      <div class="bottom">
+        <div class="titleBox">
+          <div class="title">学科发展情况</div>
+          <div>
+            <el-select v-model="eva" @change="typeChange2" @focus="setMinWidth" class="selectBox" style="width: 120px;">
+              <el-option label="全部年级" value=""></el-option>
+            </el-select>
+            <el-select v-model="eva" @change="typeChange2" @focus="setMinWidth" class="selectBox" style="width: 120px;">
+              <el-option label="全部班级" value=""></el-option>
+            </el-select>
+          </div>
+        </div>
+        <div class="dataBox">
+          <studentInfo :evCourseArray="evCourseArray" :eva="eva"></studentInfo>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import loginCount from "./loginCount";
+import loginTime from "./loginTime";
+import teacherInfo from "./teacherInfo";
+import courseInfo from "./courseInfo";
+import studentInfo from "./studentInfo";
+import studentInfo2 from "./studentInfo2";
+import cateRank from "./cateRank";
+export default {
+  components: {
+    loginCount,
+    loginTime,
+    teacherInfo,
+    courseInfo,
+    studentInfo,
+    studentInfo2,
+    cateRank,
+  },
+  props: {
+    oid: {
+      type: String,
+    },
+    org: {
+      type: String,
+    },
+  },
+  data() {
+    return {
+      isLoading: false,
+      count: 0,
+      loginCount: 0,
+      loginTime: 0,
+      courseCount: 0,
+      teacherCount: 0,
+      loginCountMonthArray: [],
+      weekCount: 0,
+      loginCountYearArray: [],
+      gradeCourse: 0,
+      subjectCourse: 0,
+      courseArray: [],
+      cType: '',
+      gradeArray: [],
+      subjectArray: [],
+      themeArray: [],
+      allArray: [],
+      courseNumberArray: [],
+      typeCount: 0,
+      typeCourseCount: 0,
+      lightJson: {
+        users: 0,
+        teachers: 0,
+        students: 0,
+        upCourseTeachers: 0,
+        gCourseTeachers: 0,
+        upCourseUsers: 0,
+        gCourseUsers: 0,
+        toolUsers: 0,
+        rateUser: 0,
+        upgCourseTeachers: 0,
+        commentUsers: 0,
+      },
+      evArray:[],
+      eva:'',
+      evCourseArray:[],
+      minWidth:0
+    }
+  },
+  mounted() {
+    this.getData();
+  },
+  methods: {
+    setMinWidth (val) {
+      this.minWidth = val.srcElement.clientWidth
+    },
+    openCourse(classIndex,subIndex){
+ 
+    },
+    openCourse2(index){
+   
+    },
+    getData() {
+
+    },
+    typeChange() {
+
+    },
+    typeChange2(){
+
+    },
+    format(percentage) {
+      return percentage + '%';
+    },
+  },
+};
+</script>
+
+
+<style scoped>
+.body1 {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  padding: 20px;
+  box-sizing: border-box;
+  overflow: hidden;
+}
+
+.left {
+  width: calc(100% / 4 * 1);
+  height: 100%;
+}
+
+.left>.top {
+  width: 100%;
+  height: calc(100% / 5 * 2.8 - 20px);
+  background: #fff;
+  border-radius: 5px;
+  margin: 0 0 20px 0;
+}
+
+.left>.bottom {
+  width: 100%;
+  height: calc(100% / 5 * 2.2);
+  background: #fff;
+  border-radius: 5px;
+}
+
+.center {
+  width: calc(100% / 4 * 2 - 40px);
+  height: 100%;
+  margin: 0 20px;
+}
+
+.center>.top {
+  width: 100%;
+  height: calc(100% / 5 * 2.8 - 20px);
+  background: #fff;
+  border-radius: 5px;
+  margin: 0 0 20px 0;
+}
+
+.center>.bottom {
+  width: 100%;
+  height: calc(100% / 5 * 2.2);
+  background: #fff;
+  border-radius: 5px;
+}
+
+.right {
+  width: calc(100% / 4 * 1);
+  height: 100%;
+}
+
+.right>.top {
+  width: 100%;
+  height: calc(100% / 5 * 2.8 - 20px);
+  background: #fff;
+  border-radius: 5px;
+  margin: 0 0 20px 0;
+}
+
+.right>.bottom {
+  width: 100%;
+  height: calc(100% / 5 * 2.2);
+  background: #fff;
+  border-radius: 5px;
+}
+
+.titleBox {
+  height: 40px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 0 15px;
+  width: 100%;
+  box-sizing: border-box;
+}
+
+.titleBox>.title {
+  font-weight: 700;
+}
+
+.dataBox {
+  height: calc(100% - 40px);
+  width: 100%;
+}
+
+.info_box {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: space-between;
+  width: 90%;
+  margin: 0 auto;
+}
+
+.info_box>.info2,
+.info_box>.info3,
+.info_box>.info {
+  width: calc(50% - 10px);
+  display: flex;
+  height: 60px;
+  justify-content: space-between;
+  align-items: center;
+  padding: 0 10px;
+  box-sizing: border-box;
+  margin-bottom: 10px;
+  border-radius: 5px;
+}
+
+.info_box>.info2 {
+  width: calc(100% / 4 - 10px);
+  /* align-items: flex-end; */
+}
+
+.info_box>.info3 {
+  width: 100%;
+  margin-bottom: 5px;
+}
+
+.info_box>.info2>span:nth-child(1),
+.info_box>.info3>span:nth-child(1),
+.info_box>.info>span:nth-child(1) {
+  font-size: 14px;
+  /* margin: 0 0 0 20px; */
+  color: #565e6a;
+  width: 60px;
+  white-space: pre-wrap;
+  word-break: break-all;
+}
+
+.info_box>.info2>span:nth-child(2),
+.info_box>.info3>span:nth-child(2),
+.info_box>.info>span:nth-child(2) {
+  font-size: 24px;
+  /* font-weight: 700; */
+}
+
+.blueBG {
+  background: rgb(243, 248, 253);
+  border: 2px solid rgb(234, 246, 255);
+}
+
+.greenBG {
+  background: linear-gradient(180deg,
+      rgb(211, 246, 228, 0.2) 0%,
+      rgb(23, 196, 105, 0.3) 100%);
+}
+
+.depth_box {
+  display: flex;
+  flex-wrap: wrap;
+  height: 100%;
+  width: 95%;
+  margin: 0 auto;
+  overflow: hidden;
+  justify-content: space-between;
+}
+
+.depth {
+  width: calc(100% / 5 - 10px);
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+}
+
+.depth>span:nth-child(1) {
+  font-size: 14px;
+  font-weight: 700;
+  margin: 0 0 10px;
+}
+
+.depth>div:nth-child(1) {}
+
+.course_box {
+  display: flex;
+  height: 50%;
+  width: 95%;
+  margin: 0 auto;
+}
+
+.course_box .info_box {
+  height: 100%;
+  width: 100px;
+  flex-direction: column;
+  margin: 0;
+  flex-wrap: nowrap;
+}
+
+.course_box_p {
+  width: calc(100% - 100px);
+}
+
+.selectBox {
+  width: 80px;
+  margin-left: 10px;
+}
+
+.selectBox>>>.el-input__inner {
+  height: 30px;
+  line-height: 30px;
+}
+
+.selectBox>>>.el-input__icon {
+  line-height: 30px;
+}
+</style>

+ 158 - 0
src/components/pages/dataBoardSies/education/loginCount/index.vue

@@ -0,0 +1,158 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        monthArray: {
+            type: Array,
+            default: []
+        },
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                xdata: [],
+                teacher: [],
+                student: [],
+            },
+            option: {
+                tooltip: {
+                    trigger: 'axis'
+                },
+                // legend: {
+                //     data: ['老师', '学生'],
+                //     right: '10'
+                // },
+                grid: {
+                    top: '30',
+                    left: '5%',
+                    right: '5%',
+                    bottom: '5%',
+                    containLabel: true
+                },
+                xAxis: {
+                    type: 'category',
+                    boundaryGap: true,
+                    // data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月']
+                    data: []
+                },
+                yAxis: {
+                    type: 'value'
+                },
+                series: [
+                    {
+                        name: '用户',
+                        type: 'line',
+                        // data: [120, 50, 101, 130, 110, 120]
+                        areaStyle: {
+                            color: 'rgb(220, 231, 251)'
+                        },
+                        data: [],
+                        itemStyle: {
+                            normal: {
+                                color: function (params) {
+                                    return "#106bff";
+                                },
+                            },
+                        },
+                    },
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                // this.option.xAxis.data = option.xdata;
+                // this.option.series[0].data = option.teacher;
+                this.option.xAxis.data = ['4月', '5月', '6月', '7月', '8月', '9月'];
+                this.option.series[0].data = [13592, 13609, 13895, 12343, 2460, 11483];
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+    },
+    watch: {
+        monthArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.ooption = {
+                    xdata: [],
+                    teacher: [],
+                    student: [],
+                }
+                let _array = newValue
+                for (var i = 0; i < _array.length; i++) {
+                    this.ooption.xdata.push(_array[i].Month + '月')
+                    this.ooption.teacher.push(_array[i].teacher)
+                    this.ooption.student.push(_array[i].student)
+                }
+
+                if (!this.chartObj) {
+                    this.setChart(this.ooption);
+                } else {
+                    this.option.xAxis.data = this.ooption.xdata;
+                    this.option.series[0].data = this.ooption.teacher;
+                    this.option.series[1].data = this.ooption.student;
+                    this.chartObj.setOption(this.option);
+                }
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.ooption = {
+            xdata: [],
+            teacher: [],
+            student: [],
+        }
+        let _array = this.monthArray
+        for (var i = 0; i < _array.length; i++) {
+            this.ooption.xdata.push(_array[i].Month + '月')
+            this.ooption.teacher.push(_array[i].teacher)
+            this.ooption.student.push(_array[i].student)
+        }
+        this.setChart(this.ooption);
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

File diff suppressed because it is too large
+ 108 - 0
src/components/pages/dataBoardSies/education/loginTime/index.vue


+ 172 - 0
src/components/pages/dataBoardSies/education/studentInfo/index.vue

@@ -0,0 +1,172 @@
+<template>
+    <div class="data_body">
+        <!--  v-if="this.ooption.xdata.length" -->
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+        <!-- <div style="width: 100%; height: 100%;display: flex;align-items: center;justify-content: center;"
+            v-show="!this.ooption.xdata.length">暂无数据</div> -->
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        evCourseArray: {
+            type: Array,
+            default: []
+        },
+        eva: {
+            type: String,
+            default: ''
+        }
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                xdata: [],
+                sdata: [],
+            },
+            option: {
+                tooltip: {},
+                radar: {
+                    axisName: {
+                        color: "#000"
+                    },
+                    // shape: 'circle',
+                    indicator: [
+                        // { name: '目标一', max: 5 },
+                        // { name: '目标二', max: 5 },
+                        // { name: '目标三', max: 5 },
+                        // { name: '目标四', max: 5 },
+                        // { name: '目标五', max: 5 }
+                    ]
+                },
+                series: [
+                    {
+                        name: '学生综合评价',
+                        type: 'radar',
+                        data: [
+                            {
+                                areaStyle: {
+                                    opacity: 0.2,
+                                    color: 'rgb(239, 144, 55)'
+                                },
+                                itemStyle: {
+                                    color: 'rgb(239, 144, 55)',
+                                    lineStyle: {
+                                        color: 'rgb(239, 144, 55)'
+                                    }
+                                },
+                                // 5, 4, 3, 5, 5, 2
+                                value: [],
+                                name: ''
+                            }
+                        ]
+                    }
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                // this.option.radar.indicator = option.xdata;
+                // this.option.series[0].data[0].value = option.sdata;
+                this.option.radar.indicator = [
+                        { name: '数学', max: 5 },
+                        { name: '语文', max: 5 },
+                        { name: '美术', max: 5 },
+                        { name: '科学', max: 5 },
+                        { name: '心里健康', max: 5 },
+                        { name: '道德与法治', max: 5 },
+                        { name: '生命与安全', max: 5 },
+                        { name: '体育', max: 5 },
+                        { name: '音乐', max: 5 }
+                    ];
+                this.option.series[0].data[0].value = [5,5,5,5,4,3,4,5,4];
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setArray(array) {
+            this.ooption = {
+                xdata: [],
+                sdata: [],
+            }
+            for (var i = 0; i < array.length; i++) {
+                if (array[i].evid == this.eva) {
+                    this.ooption.xdata = array[i].indicator
+                    this.ooption.sdata = array[i].value
+                    break;
+                }
+            }
+            setTimeout(() => {
+                // if (!this.chartObj) {
+                this.setChart(this.ooption);
+                // } else {
+                //     this.option.radar.indicator = this.ooption.xdata;
+                //     this.option.series[0].data[0].value = this.ooption.sdata;
+                //     this.chartObj.setOption(this.option);
+                // }
+            }, 100);
+            this.$forceUpdate();
+        },
+    },
+    watch: {
+        evCourseArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(newValue)
+                this.$forceUpdate();
+            },
+        },
+        eva: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(this.evCourseArray)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.setArray(this.evCourseArray)
+        // this.setChart(this.ooption);
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 170 - 0
src/components/pages/dataBoardSies/education/studentInfo2/index.vue

@@ -0,0 +1,170 @@
+<template>
+    <div class="data_body">
+        <!--  v-if="this.ooption.xdata.length" -->
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+        <!-- <div style="width: 100%; height: 100%;display: flex;align-items: center;justify-content: center;"
+            v-show="!this.ooption.xdata.length">暂无数据</div> -->
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        evCourseArray: {
+            type: Array,
+            default: []
+        },
+        eva: {
+            type: String,
+            default: ''
+        }
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                xdata: [],
+                sdata: [],
+            },
+            option: {
+                tooltip: {},
+                radar: {
+                    axisName: {
+                        color: "#000"
+                    },
+                    // shape: 'circle',
+                    indicator: [
+                        // { name: '目标一', max: 5 },
+                        // { name: '目标二', max: 5 },
+                        // { name: '目标三', max: 5 },
+                        // { name: '目标四', max: 5 },
+                        // { name: '目标五', max: 5 }
+                    ]
+                },
+                series: [
+                    {
+                        name: '学生综合评价',
+                        type: 'radar',
+                        data: [
+                            {
+                                areaStyle: {
+                                    opacity: 0.2,
+                                    color: '#0061FF'
+                                },
+                                itemStyle: {
+                                    color: '#0061FF',
+                                    lineStyle: {
+                                        color: '#0061FF'
+                                    }
+                                },
+                                // 5, 4, 3, 5, 5, 2
+                                value: [],
+                                name: ''
+                            }
+                        ]
+                    }
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                // this.option.radar.indicator = option.xdata;
+                // this.option.series[0].data[0].value = option.sdata;
+                this.option.radar.indicator = [
+                    { name: '成茁小先生', max: 5 },
+                    { name: '成行小先生', max: 5 },
+                    { name: '成智小先生', max: 5 },
+                    { name: '成德小先生', max: 5 },
+                    { name: '成彩小先生', max: 5 }
+                ]
+                this.option.series[0].data[0].value = [1,1,3,5,5];
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setArray(array) {
+            this.setChart(array);
+            return
+            this.ooption = {
+                xdata: [],
+                sdata: [],
+            }
+            for (var i = 0; i < array.length; i++) {
+                if (array[i].evid == this.eva) {
+                    this.ooption.xdata = array[i].indicator
+                    this.ooption.sdata = array[i].value
+                    break;
+                }
+            }
+            setTimeout(() => {
+                // if (!this.chartObj) {
+                this.setChart(this.ooption);
+                // } else {
+                //     this.option.radar.indicator = this.ooption.xdata;
+                //     this.option.series[0].data[0].value = this.ooption.sdata;
+                //     this.chartObj.setOption(this.option);
+                // }
+            }, 100);
+            this.$forceUpdate();
+        },
+    },
+    watch: {
+        evCourseArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(newValue)
+                this.$forceUpdate();
+            },
+        },
+        eva: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(this.evCourseArray)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.setArray(this.evCourseArray)
+        // this.setChart(this.ooption);
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 318 - 0
src/components/pages/dataBoardSies/education/teacherInfo/index.vue

@@ -0,0 +1,318 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        courseArray: {
+            type: Array,
+        },
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                hours: [],
+                days: [],
+                data: [],
+            },
+            option: {
+                tooltip: {
+                    position: 'top',
+                    formatter: function (params) {
+                        // console.log(params);
+                        return params.marker + params.name + ' ' + params.data[1];//params.seriesName + '<br>' + params.
+
+                    }
+                },
+                title: [],
+                singleAxis: [],
+                series: []
+            },
+        };
+    },
+    methods: {
+        // setChart(option) {
+        //     // 雷达图显示的标签
+        //     let newPromise = new Promise((resolve) => {
+        //         resolve();
+        //     });
+        //     //然后异步执行echarts的初始化函数
+        //     newPromise.then(() => {
+        //         const chartObj = this.$echarts.init(
+        //             //劳动课程
+        //             this.$el.querySelector("#charts_canvas")
+        //         );
+        //         const hours = option.hours
+        //         // [
+        //         //     // '语文', '数学', '英语', '科学', '体育', '音乐', '美术',
+        //         //     // '劳动', '其他',
+        //         // ];
+        //         // prettier-ignore
+        //         const days = option.days
+        //         // [
+        //         //     // '一年级', '二年级', '三年级', '四年级', '五年级', '六年级'
+        //         // ];
+        //         // prettier-ignore
+        //         const data = option.data
+        //         // [
+        //         //     // [0, 0, 2], [0, 1, 1], [0, 2, 3], [0, 3, 0], [0, 4, 5], [0, 5, 5], [0, 6, 7], [0, 7, 8], [0, 8, 1],
+        //         //     // [1, 0, 5], [1, 1, 1], [1, 2, 2], [1, 3, 0], [1, 4, 5], [1, 5, 7], [1, 6, 7], [1, 7, 8], [1, 8, 6],
+        //         //     // [2, 0, 5], [2, 1, 2], [2, 2, 0], [2, 3, 2], [2, 4, 1], [2, 5, 5], [2, 6, 4], [2, 7, 4], [2, 8, 1],
+        //         //     // [3, 0, 1], [3, 1, 1], [3, 2, 1], [3, 3, 0], [3, 4, 5], [3, 5, 2], [3, 6, 7], [3, 7, 8], [3, 8, 5],
+        //         //     // [4, 0, 5], [4, 1, 3], [4, 2, 0], [4, 3, 3], [4, 4, 4], [4, 5, 2], [4, 6, 3], [4, 7, 5], [4, 8, 1],
+        //         //     // [5, 0, 5], [5, 1, 1], [5, 2, 0], [5, 3, 0], [5, 4, 5], [5, 5, 5], [5, 6, 7], [5, 7, 8], [5, 8, 3],
+        //         // ];
+        //         const title = [];
+        //         const singleAxis = [];
+        //         const series = [];
+        //         days.forEach(function (day, idx) {
+        //             title.push({
+        //                 textBaseline: 'middle',
+        //                 top: ((idx + 0.5) * 90) / days.length + '%',
+        //                 text: day,
+        //                 textStyle: {
+        //                     fontSize: 12,
+        //                 },
+        //             });
+        //             singleAxis.push({
+        //                 left: 70,
+        //                 type: 'category',
+        //                 boundaryGap: false,
+        //                 data: hours,
+        //                 top: (idx * 90) / days.length + 5 + '%',
+        //                 height: 90 / days.length - 10 + '%'
+        //             });
+        //             series.push({
+        //                 singleAxisIndex: idx,
+        //                 coordinateSystem: 'singleAxis',
+        //                 type: 'scatter',
+        //                 data: [],
+        //                 symbolSize: function (dataItem) {
+        //                     return dataItem[1] * 3;
+        //                 }
+        //             });
+        //         });
+        //         data.forEach(function (dataItem) {
+        //             series[dataItem[0]].data.push([dataItem[1], dataItem[2]]);
+        //         });
+        //         chartObj.off('click')
+        //         let _this = this
+        //         chartObj.on('click', function (param) {  
+        //             //param参数包含的内容有: 
+        //             //param.name:X轴的值 
+        //             //param.data:Y轴的值 
+        //             //param.value:Y轴的值 
+        //             //param.type:点击事件均为click 
+        //             //param.seriesName:legend的名称 
+        //             //param.seriesIndex:系列序号(series中当前图形是第几个图形第几个) 
+        //             //param.dataIndex:数值序列(X轴上当前点是第几个点)
+        //             //alert(param.seriesName);  //legend的名称
+        //             console.log(param);  //X轴的值
+        //             _this.$emit('openCourse',param.componentIndex,param.data[0])
+        //         });
+
+        //         this.option.title = title
+        //         this.option.singleAxis = singleAxis
+        //         this.option.series = series
+        //         // 初始化雷达图
+        //         this.chartObj = chartObj;
+        //         this.chartObj.setOption(this.option);
+        //     });
+        // },
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                const hours = 
+                [
+                    '1班', '2班', '3班', '4班', '5班', '6班', '7班',
+                    '8班'
+                ];
+                // prettier-ignore
+                const days = 
+                [
+                    '一年级', '二年级', '三年级', '四年级', '五年级', '六年级'
+                ];
+                // prettier-ignore
+                const data = 
+                [
+                    [0, 0, 2], [0, 1, 1], [0, 2, 3], [0, 3, 0], [0, 4, 5], [0, 5, 5], [0, 6, 7], [0, 7, 8],
+                    [1, 0, 5], [1, 1, 1], [1, 2, 2], [1, 3, 0], [1, 4, 5], [1, 5, 7], [1, 6, 7], [1, 7, 8],
+                    [2, 0, 5], [2, 1, 2], [2, 2, 0], [2, 3, 2], [2, 4, 1], [2, 5, 5], [2, 6, 4], [2, 7, 4],
+                    [3, 0, 1], [3, 1, 1], [3, 2, 1], [3, 3, 0], [3, 4, 5], [3, 5, 2], [3, 6, 7], [3, 7, 8],
+                    [4, 0, 5], [4, 1, 3], [4, 2, 0], [4, 3, 3], [4, 4, 4], [4, 5, 2], [4, 6, 3], [4, 7, 5],
+                    [5, 0, 5], [5, 1, 1], [5, 2, 0], [5, 3, 0], [5, 4, 5], [5, 5, 5], [5, 6, 7], [5, 7, 8],
+                ];
+                const title = [];
+                const singleAxis = [];
+                const series = [];
+                days.forEach(function (day, idx) {
+                    title.push({
+                        textBaseline: 'middle',
+                        top: ((idx + 0.5) * 90) / days.length + '%',
+                        text: day,
+                        textStyle: {
+                            fontSize: 12,
+                        },
+                    });
+                    singleAxis.push({
+                        left: 70,
+                        type: 'category',
+                        boundaryGap: false,
+                        data: hours,
+                        top: (idx * 90) / days.length + 5 + '%',
+                        height: 90 / days.length - 10 + '%'
+                    });
+                    series.push({
+                        singleAxisIndex: idx,
+                        coordinateSystem: 'singleAxis',
+                        type: 'scatter',
+                        data: [],
+                        symbolSize: function (dataItem) {
+                            return dataItem[1] * 3;
+                        }
+                    });
+                });
+                data.forEach(function (dataItem) {
+                    series[dataItem[0]].data.push([dataItem[1], dataItem[2]]);
+                });
+                this.option.title = title
+                this.option.singleAxis = singleAxis
+                this.option.series = series
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setJson(array) {
+            this.setChart(this.ooption);
+            if (array != undefined && array.length > 0) {
+                this.ooption = {
+                    hours: [],
+                    days: [],
+                    data: [],
+                }
+                let _grade = []
+                let _subject = []
+                let data = []
+
+                array.forEach(function (item, idx) {
+                    _grade.push(item.name)
+                })
+
+                array[0].subject.forEach(function (item, idx) {
+                    _subject.push(item.name)
+                })
+                array.forEach(function (item, idx) {
+                    item.subject.forEach(function (item2, idx2) {
+                        data.push([idx, idx2, item2.course])
+                    })
+                })
+                this.ooption.hours = _subject
+                this.ooption.days = _grade
+                this.ooption.data = data
+                if (!this.chartObj) {
+                    this.setChart(this.ooption);
+                } else {
+                    const hours = this.ooption.hours;
+                    // prettier-ignore
+                    const days = this.ooption.days;
+                    // prettier-ignore
+                    const data = this.ooption.data;
+                    const title = [];
+                    const singleAxis = [];
+                    const series = [];
+                    days.forEach(function (day, idx) {
+                        title.push({
+                            textBaseline: 'middle',
+                            top: ((idx + 0.5) * 90) / days.length + '%',
+                            text: day,
+                            textStyle: {
+                                fontSize: 12,
+                            },
+                        });
+                        singleAxis.push({
+                            left: 70,
+                            type: 'category',
+                            boundaryGap: false,
+                            data: hours,
+                            top: (idx * 90) / days.length + 5 + '%',
+                            height: 90 / days.length - 10 + '%'
+                        });
+                        series.push({
+                            singleAxisIndex: idx,
+                            coordinateSystem: 'singleAxis',
+                            type: 'scatter',
+                            data: [],
+                            symbolSize: function (dataItem) {
+                                return dataItem[1] * 3;
+                            }
+                        });
+                    });
+                    data.forEach(function (dataItem) {
+                        series[dataItem[0]].data.push([dataItem[1], dataItem[2]]);
+                    });
+
+                    this.option.title = title
+                    this.option.singleAxis = singleAxis
+                    this.option.series = series
+                    this.chartObj.setOption(this.option);
+                }
+            }
+        }
+    },
+    watch: {
+        courseArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                // newValue = newValue.filter(item => {
+                //     return ['一年级','二年级','三年级','四年级','五年级','六年级','七年级'].indexOf(item.name) !== -1
+                // })
+                this.setJson(newValue)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        // this.courseArray = this.courseArray.filter(item => {
+        //     return ['一年级','二年级','三年级','四年级','五年级','六年级','七年级'].indexOf(item.name) !== -1
+        // })
+
+        this.setJson(this.courseArray)
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    position: relative;
+    border-radius: 5px;
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 135 - 0
src/components/pages/dataBoardSies/index.vue

@@ -0,0 +1,135 @@
+<template>
+  <div class="body">
+    <div class="db_header">
+      <!-- <div class="logoTop">Logo</div> -->
+      <div class="db_header_title">
+        <div v-if="type == 1">德育sise</div>
+        <div v-if="type == 2">智慧体育</div>
+        <div v-if="type == 3">图书馆</div>
+        <div v-if="type == 4">灵动校园</div>
+      </div>
+      <div class="db_check">
+        <div :class="{ active: type == 1 }" @click="setType(1)">德育sise</div>
+        <div :class="{ active: type == 2 }" @click="setType(2)">智慧体育</div>
+        <div :class="{ active: type == 3 }" @click="setType(3)">图书馆</div>
+        <!-- <div :class="{ active: type == 3 }" @click="setType(4)">灵动校园</div> -->
+      </div>
+    </div>
+    <div class="db_body">
+      <education v-if="type == 1" :oid="oid" :org="org"></education>
+      <Pe v-if="type == 2" :oid="oid" :org="org"></Pe>
+      <library v-if="type == 3" :oid="oid" :org="org"></library>
+      <school v-if="type == 4" :oid="oid" :org="org"></school>
+    </div>
+  </div>
+</template>
+
+<script>
+import education from "./education";
+import Pe from "./Pe";
+import library from "./library";
+import school from "./school";
+export default {
+  components: {
+    education,
+    Pe,
+    library,
+    school,
+  },
+  data() {
+    return {
+      type: 1,
+      oid: this.$route.query.oid,
+      org: this.$route.query.org,
+    };
+  },
+  methods: {
+    setType(type) {
+      this.type = type;
+    },
+  },
+};
+</script>
+
+<style scoped>
+.body {
+  height: 100%;
+  width: 100%;
+  min-width: 1200px;
+  min-height: 750px;
+}
+
+.db_header {
+  width: 100%;
+  height: 50px;
+  display: flex;
+  justify-content: center;
+  position: relative;
+  background: #fff;
+  align-items: center;
+}
+
+.logoTop {
+  position: absolute;
+  left: 30px;
+}
+
+.db_header_title {
+  font-weight: bold;
+  font-size: 20px;
+}
+.db_header_title > div {
+  position: relative;
+  z-index: 9;
+}
+.db_header_title > div:after {
+  content: "";
+  position: absolute;
+  width: 250px;
+  height: 10px;
+  bottom: -30px;
+  left: -85px;
+  border-top: 20px solid #fff;
+  border-left: 20px solid transparent;
+  border-right: 20px solid transparent;
+  -webkit-transform: skew(20deg);
+  transform: skew(359deg);
+  z-index: 1;
+}
+
+.db_check {
+  display: flex;
+  align-items: center;
+  position: absolute;
+  right: 30px;
+  height: 100%;
+}
+
+.db_check > div {
+  padding: 14px 20px;
+  cursor: pointer;
+}
+
+.db_check > div:hover {
+  background: #edf4ff;
+}
+
+.db_check > div.active {
+  font-weight: 700;
+  color: #297bff;
+  background: #edf4ff;
+  border-top: 2px solid #297bff;
+  box-sizing: border-box;
+}
+
+/* .db_check > div + div {
+  margin-left: 30px;
+} */
+
+.db_body {
+  height: calc(100% - 50px);
+  width: 100%;
+  overflow: auto;
+  background: rgb(231, 242, 252);
+}
+</style>

+ 104 - 0
src/components/pages/dataBoardSies/library/cateRank/index.vue

@@ -0,0 +1,104 @@
+<template>
+  <div class="data_body">
+    <div class="title">读者借阅排行</div>
+    <div style="width: 100%; height: calc(100% - 50px);overflow: auto;">
+      <el-table :data="tableData" style="width: 100%" :header-cell-style="{ background: '#E0EAFB', color: '#000' }"
+        :row-class-name="tableRowClassName" class="tableClass">
+        <el-table-column label="排行" min-width="50" align="center">
+          <template slot-scope="scope">{{ scope.$index + 1 }}</template>
+        </el-table-column>
+        <el-table-column prop="name" label="借阅人" min-width="80" align="center">
+        </el-table-column>
+        <el-table-column prop="sum" label="借阅数量" min-width="80" align="center">
+        </el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    courseNumberArray: {
+      type: Array,
+    },
+  },
+  data() {
+    return {
+      tableData: [
+        { name: "华宇峰", sum: "347" },
+        { name: "张涵予", sum: "321" },
+        { name: "梁思成", sum: "252" },
+        { name: "陈信安", sum: "150" },
+        { name: "徐丽佳", sum: "148" },
+        { name: "宋佳佳", sum: "130" },
+      ],
+    };
+  },
+  methods: {
+    tableRowClassName({ row, rowIndex }) {
+      if ((rowIndex + 1) % 2 === 0) {
+        return "even_row";
+      } else {
+        return "";
+      }
+    },
+    setArray(array) {
+      this.tableData = []
+      for (var i = 0; i < array.length; i++) {
+        this.tableData.push({
+          sum: array[i].course,
+          name: array[i].name
+        })
+      }
+      this.tableData = this.tableData.sort(function (a, b) {
+        return b.sum - a.sum;
+      })
+    }
+  },
+  watch: {
+    courseNumberArray: {
+      immediate: true,
+      deep: true,
+      handler(newValue, oldValue) {
+        // this.setArray(newValue)
+        this.$forceUpdate();
+      },
+    },
+  },
+  mounted() {
+    // this.setArray(this.courseNumberArray)
+  },
+};
+</script>
+
+<style scoped>
+.el-table>>>.even_row {
+  background-color: #f2f7ff !important;
+}
+
+.data_body {
+  height: 100%;
+  /* display: flex; */
+  position: relative;
+  border-radius: 5px;
+  /* border: 1px solid #eee; */
+  margin: 0 auto;
+  box-sizing: border-box;
+  padding: 0;
+  width: 95%;
+  background: #fff;
+}
+
+.tableClass>>>td,
+.tableClass>>>th {
+  padding: 5px 0;
+}
+
+.title {
+  font-size: 20px;
+  text-align: right;
+  font-weight: 700;
+  margin-bottom: 10px;
+}
+</style>

+ 102 - 0
src/components/pages/dataBoardSies/library/cateRank2/index.vue

@@ -0,0 +1,102 @@
+<template>
+  <div class="data_body">
+    <div class="title">图书借阅排行</div>
+    <div style="width: 100%; height: calc(100% - 50px);overflow: auto;">
+      <el-table :data="tableData" style="width: 100%" :header-cell-style="{ background: '#E0EAFB',color: '#000' }"
+        :row-class-name="tableRowClassName" class="tableClass">
+        <el-table-column label="排行" min-width="50" align="center">
+          <template slot-scope="scope">{{ scope.$index + 1 }}</template>
+        </el-table-column>
+        <el-table-column prop="name" label="图书名称" min-width="80" align="center">
+        </el-table-column>
+        <el-table-column prop="sum" label="借阅数量" min-width="80" align="center">
+        </el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    courseNumberArray: {
+      type: Array,
+    },
+  },
+  data() {
+    return {
+      tableData: [
+        { name: "猫哈拉商店", sum: "149" },
+        { name: "天上的声音", sum: "122" },
+        { name: "窗外有秘密", sum: "118" },
+        { name: "属鼠蓝和属鼠灰", sum: "113" },
+        { name: "莫哈拉", sum: "105" },
+        { name: "残酷的故事", sum: "98" },
+      ],
+    };
+  },
+  methods: {
+    tableRowClassName({ row, rowIndex }) {
+      if ((rowIndex + 1) % 2 === 0) {
+        return "even_row";
+      } else {
+        return "";
+      }
+    },
+    setArray(array){
+      this.tableData = []
+      for(var i = 0;i<array.length;i++){
+        this.tableData.push({
+          sum:array[i].course,
+          name:array[i].name
+        })
+      }
+      this.tableData = this.tableData.sort(function(a,b){
+        return b.sum - a.sum;
+      })
+    }
+  },
+  watch: {
+    courseNumberArray: {
+      immediate: true,
+      deep: true,
+      handler(newValue, oldValue) {
+        // this.setArray(newValue)
+        this.$forceUpdate();
+      },
+    },
+  },
+  mounted() {
+    // this.setArray(this.courseNumberArray)
+  },
+};
+</script>
+
+<style scoped>
+.el-table>>>.even_row {
+  background-color: #f2f7ff !important;
+}
+
+.data_body {
+  height: 100%;
+  /* display: flex; */
+  position: relative;
+  border-radius: 5px;
+  /* border: 1px solid #eee; */
+  margin: 0 auto;
+  box-sizing: border-box;
+  padding: 0;
+  width: 95%;
+  background: #fff;
+}
+
+.tableClass >>> td, .tableClass >>> th{
+  padding: 5px 0;
+}
+.title{
+  font-size: 20px;
+  text-align: right;
+  font-weight: 700;
+  margin-bottom: 10px;
+}
+</style>

+ 121 - 0
src/components/pages/dataBoardSies/library/courseInfo/index.vue

@@ -0,0 +1,121 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        courseNumberArray: {
+            type: Array,
+        },
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                data: [],
+            },
+            option: {
+                xAxis: {
+                    type: 'category',
+                    data: ['一年级', '二年级', '三年级', '四年级', '五年级', '六年级']
+                },
+                tooltip:{},
+                grid: {
+                    left: '5%',
+                    right: '5%',
+                    bottom: '5%',
+                    top: '5%',
+                    containLabel: true
+                },
+                yAxis: {
+                    type: 'value'
+                },
+                series: [
+                    {
+                    data: [120, 200, 150, 80, 70, 110],
+                    type: 'bar',
+                    itemStyle: {
+                        color: 'rgba(80, 135, 236)'
+                    }
+                    }
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                // this.option.series[0].data = this.ooption.data.filter(item => item.value !== 0);
+                
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setArray(array) {
+            this.ooption = {
+                data: [],
+            }
+            for (var i = 0; i < array.length; i++) {
+                this.ooption.data.push({ value: array[i].course, name: array[i].name })
+            }
+            if (!this.chartObj) {
+                this.setChart(this.ooption);
+            } else {
+                this.option.series[0].data = this.ooption.data;
+                this.chartObj.setOption(this.option);
+            }
+            this.$forceUpdate();
+        },
+    },
+    watch: {
+        courseNumberArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(newValue)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.setArray(this.courseNumberArray)
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 429 - 0
src/components/pages/dataBoardSies/library/index.vue

@@ -0,0 +1,429 @@
+<template>
+  <div class="body1" v-loading="isLoading">
+    <!-- 综合数据 -->
+    <div class="left">
+      <div class="top">
+        <div class="titleBox">
+          <div class="title">用户概况</div>
+        </div>
+        <div class="dataBox">
+          <div class="info_box">
+            <div class="info blueBG">
+              <span>用户总数</span>
+              <!-- <span>{{ count }}</span> -->
+              <span>{{ 310 }}</span>
+            </div>
+            <div class="info blueBG">
+              <span>本月借阅用户环比</span>
+              <!-- <span>{{ weekCount }}</span> -->
+              <span>{{ "0.9%" }}</span>
+            </div>
+            <div class="info blueBG">
+              <span>本月借阅书籍总数</span>
+              <!-- <span>{{ loginCount }}</span> -->
+              <span>{{ 138 }}</span>
+            </div>
+            <div class="info blueBG">
+              <span>本月借阅用户总数</span>
+              <!-- <span>{{ (loginCount / count).toFixed(0) }}</span> -->
+              <span>{{ 18 }}</span>
+            </div>
+          </div>
+          <loginCount style="height: calc(100% - 140px)" :monthArray="loginCountMonthArray"></loginCount>
+        </div>
+      </div>
+      <div class="bottom">
+        <div class="titleBox">
+          <div class="title">借阅用户数</div>
+        </div>
+        <div class="dataBox">
+          <div class="info_box">
+            <div class="info blueBG">
+              <span>总借阅用户</span>
+              <!-- <span>{{ loginTime.toFixed(0) }}小时</span> -->
+              <span>{{ 1513 }}</span>
+            </div>
+            <div class="info blueBG">
+              <span>人均借阅数</span>
+              <!-- <span>{{ (loginTime / count).toFixed(0) }}小时</span> -->
+              <span>{{ 4 }}小时</span>
+            </div>
+          </div>
+          <loginTime :yearArray="loginCountYearArray" style="height: calc(100% - 70px)"></loginTime>
+        </div>
+      </div>
+    </div>
+    <div class="center">
+      <div class="top">
+        <div class="titleBox">
+          <div class="title">班级表现</div>
+          <el-select v-model="cType" @change="typeChange" class="selectBox"  @focus="setMinWidth" style="width: 150px;">
+            <el-option label="借阅用户" value=""></el-option>
+          </el-select>
+        </div>
+        <div class="dataBox">
+          <teacherInfo style="height: calc(100%)" :courseArray="courseArray" @openCourse="openCourse"></teacherInfo>
+        </div>
+      </div>
+      <div class="bottom">
+        <div class="titleBox">
+          <div class="title">借阅排行</div>
+          <div>
+            <el-select v-model="eva" @change="typeChange2" @focus="setMinWidth" class="selectBox" style="width: 120px;">
+              <el-option label="全部年级" value=""></el-option>
+            </el-select>
+            <el-select v-model="eva" @change="typeChange2" @focus="setMinWidth" class="selectBox" style="width: 120px;">
+              <el-option label="全部班级" value=""></el-option>
+            </el-select>
+          </div>
+        </div>
+        <div class="dataBox rank_box">
+          <cateRank :evCourseArray="evCourseArray" :eva="eva" style="width: calc(100% / 2 - 10px);"></cateRank>
+          <cateRank2 :evCourseArray="evCourseArray" :eva="eva" style="width: calc(100% / 2 - 10px);"></cateRank2>
+        </div>
+      </div>
+    </div>
+    <div class="right">
+      <div class="top">
+        <div class="titleBox">
+          <div class="title">年级表现</div>
+          <el-select v-model="cType" @change="typeChange" class="selectBox"  @focus="setMinWidth" style="width: 150px;">
+            <el-option label="借阅用户" value=""></el-option>
+          </el-select>
+        </div>
+        <div class="dataBox">
+          <courseInfo :courseNumberArray="courseNumberArray" @openCourse="openCourse2"></courseInfo>
+        </div>
+      </div>
+      <div class="bottom">
+        <div class="titleBox">
+          <div class="title">借阅类别</div>
+          <div>
+            <el-select v-model="eva" @change="typeChange2" @focus="setMinWidth" class="selectBox" style="width: 120px;">
+              <el-option label="全部年级" value=""></el-option>
+            </el-select>
+          </div>
+        </div>
+        <div class="dataBox">
+          <studentInfo :evCourseArray="evCourseArray" :eva="eva"></studentInfo>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import loginCount from "./loginCount";
+import loginTime from "./loginTime";
+import teacherInfo from "./teacherInfo";
+import courseInfo from "./courseInfo";
+import studentInfo from "./studentInfo";
+import studentInfo2 from "./studentInfo2";
+import cateRank from "./cateRank";
+import cateRank2 from "./cateRank2";
+export default {
+  components: {
+    loginCount,
+    loginTime,
+    teacherInfo,
+    courseInfo,
+    studentInfo,
+    studentInfo2,
+    cateRank,
+    cateRank2,
+  },
+  props: {
+    oid: {
+      type: String,
+    },
+    org: {
+      type: String,
+    },
+  },
+  data() {
+    return {
+      isLoading: false,
+      count: 0,
+      loginCount: 0,
+      loginTime: 0,
+      courseCount: 0,
+      teacherCount: 0,
+      loginCountMonthArray: [],
+      weekCount: 0,
+      loginCountYearArray: [],
+      gradeCourse: 0,
+      subjectCourse: 0,
+      courseArray: [],
+      cType: '',
+      gradeArray: [],
+      subjectArray: [],
+      themeArray: [],
+      allArray: [],
+      courseNumberArray: [],
+      typeCount: 0,
+      typeCourseCount: 0,
+      lightJson: {
+        users: 0,
+        teachers: 0,
+        students: 0,
+        upCourseTeachers: 0,
+        gCourseTeachers: 0,
+        upCourseUsers: 0,
+        gCourseUsers: 0,
+        toolUsers: 0,
+        rateUser: 0,
+        upgCourseTeachers: 0,
+        commentUsers: 0,
+      },
+      evArray:[],
+      eva:'',
+      evCourseArray:[],
+      minWidth:0
+    }
+  },
+  mounted() {
+    this.getData();
+  },
+  methods: {
+    setMinWidth (val) {
+      this.minWidth = val.srcElement.clientWidth
+    },
+    openCourse(classIndex,subIndex){
+ 
+    },
+    openCourse2(index){
+   
+    },
+    getData() {
+
+    },
+    typeChange() {
+
+    },
+    typeChange2(){
+
+    },
+    format(percentage) {
+      return percentage + '%';
+    },
+  },
+};
+</script>
+
+
+<style scoped>
+.body1 {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  padding: 20px;
+  box-sizing: border-box;
+  overflow: hidden;
+}
+
+.left {
+  width: calc(100% / 4 * 1);
+  height: 100%;
+}
+
+.left>.top {
+  width: 100%;
+  height: calc(100% / 5 * 2.8 - 20px);
+  background: #fff;
+  border-radius: 5px;
+  margin: 0 0 20px 0;
+}
+
+.left>.bottom {
+  width: 100%;
+  height: calc(100% / 5 * 2.2);
+  background: #fff;
+  border-radius: 5px;
+}
+
+.center {
+  width: calc(100% / 4 * 2 - 40px);
+  height: 100%;
+  margin: 0 20px;
+}
+
+.center>.top {
+  width: 100%;
+  height: calc(100% / 5 * 2.8 - 20px);
+  background: #fff;
+  border-radius: 5px;
+  margin: 0 0 20px 0;
+}
+
+.center>.bottom {
+  width: 100%;
+  height: calc(100% / 5 * 2.2);
+  background: #fff;
+  border-radius: 5px;
+}
+
+.right {
+  width: calc(100% / 4 * 1);
+  height: 100%;
+}
+
+.right>.top {
+  width: 100%;
+  height: calc(100% / 5 * 2.8 - 20px);
+  background: #fff;
+  border-radius: 5px;
+  margin: 0 0 20px 0;
+}
+
+.right>.bottom {
+  width: 100%;
+  height: calc(100% / 5 * 2.2);
+  background: #fff;
+  border-radius: 5px;
+}
+
+.titleBox {
+  height: 40px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 0 15px;
+  width: 100%;
+  box-sizing: border-box;
+}
+
+.titleBox>.title {
+  font-weight: 700;
+}
+
+.dataBox {
+  height: calc(100% - 40px);
+  width: 100%;
+}
+
+.info_box {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: space-between;
+  width: 90%;
+  margin: 0 auto;
+}
+
+.info_box>.info2,
+.info_box>.info3,
+.info_box>.info {
+  width: calc(50% - 10px);
+  display: flex;
+  height: 60px;
+  justify-content: space-between;
+  align-items: center;
+  padding: 0 10px;
+  box-sizing: border-box;
+  margin-bottom: 10px;
+  border-radius: 5px;
+}
+
+.info_box>.info2 {
+  width: calc(100% / 4 - 10px);
+  /* align-items: flex-end; */
+}
+
+.info_box>.info3 {
+  width: 100%;
+  margin-bottom: 5px;
+}
+
+.info_box>.info2>span:nth-child(1),
+.info_box>.info3>span:nth-child(1),
+.info_box>.info>span:nth-child(1) {
+  font-size: 14px;
+  /* margin: 0 0 0 20px; */
+  color: #565e6a;
+  width: 60px;
+  white-space: pre-wrap;
+  word-break: break-all;
+}
+
+.info_box>.info2>span:nth-child(2),
+.info_box>.info3>span:nth-child(2),
+.info_box>.info>span:nth-child(2) {
+  font-size: 24px;
+  /* font-weight: 700; */
+}
+
+.blueBG {
+  background: rgb(243, 248, 253);
+  border: 2px solid rgb(234, 246, 255);
+}
+
+.greenBG {
+  background: linear-gradient(180deg,
+      rgb(211, 246, 228, 0.2) 0%,
+      rgb(23, 196, 105, 0.3) 100%);
+}
+
+.depth_box {
+  display: flex;
+  flex-wrap: wrap;
+  height: 100%;
+  width: 95%;
+  margin: 0 auto;
+  overflow: hidden;
+  justify-content: space-between;
+}
+
+.depth {
+  width: calc(100% / 5 - 10px);
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+}
+
+.depth>span:nth-child(1) {
+  font-size: 14px;
+  font-weight: 700;
+  margin: 0 0 10px;
+}
+
+.depth>div:nth-child(1) {}
+
+.course_box {
+  display: flex;
+  height: 50%;
+  width: 95%;
+  margin: 0 auto;
+}
+
+.course_box .info_box {
+  height: 100%;
+  width: 100px;
+  flex-direction: column;
+  margin: 0;
+  flex-wrap: nowrap;
+}
+
+.course_box_p {
+  width: calc(100% - 100px);
+}
+
+.selectBox {
+  width: 80px;
+  margin-left: 10px;
+}
+
+.selectBox>>>.el-input__inner {
+  height: 30px;
+  line-height: 30px;
+}
+
+.selectBox>>>.el-input__icon {
+  line-height: 30px;
+}
+
+.rank_box{
+  display: flex;
+  justify-content: space-between;
+}
+</style>

+ 158 - 0
src/components/pages/dataBoardSies/library/loginCount/index.vue

@@ -0,0 +1,158 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        monthArray: {
+            type: Array,
+            default: []
+        },
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                xdata: [],
+                teacher: [],
+                student: [],
+            },
+            option: {
+                tooltip: {
+                    trigger: 'axis'
+                },
+                // legend: {
+                //     data: ['老师', '学生'],
+                //     right: '10'
+                // },
+                grid: {
+                    top: '30',
+                    left: '5%',
+                    right: '5%',
+                    bottom: '5%',
+                    containLabel: true
+                },
+                xAxis: {
+                    type: 'category',
+                    boundaryGap: true,
+                    // data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月']
+                    data: []
+                },
+                yAxis: {
+                    type: 'value'
+                },
+                series: [
+                    {
+                        name: '用户',
+                        type: 'line',
+                        // data: [120, 50, 101, 130, 110, 120]
+                        areaStyle: {
+                            color: 'rgb(220, 231, 251)'
+                        },
+                        data: [],
+                        itemStyle: {
+                            normal: {
+                                color: function (params) {
+                                    return "#106bff";
+                                },
+                            },
+                        },
+                    },
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                // this.option.xAxis.data = option.xdata;
+                // this.option.series[0].data = option.teacher;
+                this.option.xAxis.data = ['1月', '2月', '3月', '4月', '5月', '6月', '7月'];
+                this.option.series[0].data = [300, 500, 490, 510, 505, 520, 550];
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+    },
+    watch: {
+        monthArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.ooption = {
+                    xdata: [],
+                    teacher: [],
+                    student: [],
+                }
+                let _array = newValue
+                for (var i = 0; i < _array.length; i++) {
+                    this.ooption.xdata.push(_array[i].Month + '月')
+                    this.ooption.teacher.push(_array[i].teacher)
+                    this.ooption.student.push(_array[i].student)
+                }
+
+                if (!this.chartObj) {
+                    this.setChart(this.ooption);
+                } else {
+                    this.option.xAxis.data = this.ooption.xdata;
+                    this.option.series[0].data = this.ooption.teacher;
+                    this.option.series[1].data = this.ooption.student;
+                    this.chartObj.setOption(this.option);
+                }
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.ooption = {
+            xdata: [],
+            teacher: [],
+            student: [],
+        }
+        let _array = this.monthArray
+        for (var i = 0; i < _array.length; i++) {
+            this.ooption.xdata.push(_array[i].Month + '月')
+            this.ooption.teacher.push(_array[i].teacher)
+            this.ooption.student.push(_array[i].student)
+        }
+        this.setChart(this.ooption);
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

File diff suppressed because it is too large
+ 108 - 0
src/components/pages/dataBoardSies/library/loginTime/index.vue


+ 147 - 0
src/components/pages/dataBoardSies/library/studentInfo/index.vue

@@ -0,0 +1,147 @@
+<template>
+    <div class="data_body">
+        <!--  v-if="this.ooption.xdata.length" -->
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+        <!-- <div style="width: 100%; height: 100%;display: flex;align-items: center;justify-content: center;"
+            v-show="!this.ooption.xdata.length">暂无数据</div> -->
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        evCourseArray: {
+            type: Array,
+            default: []
+        },
+        eva: {
+            type: String,
+            default: ''
+        }
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                xdata: [],
+                sdata: [],
+            },
+            option: {
+                tooltip: {
+                    trigger: 'item'
+                },
+                legend: {
+                },
+                series: [
+                    {
+                        name: 'Access From',
+                        type: 'pie',
+                        radius: '50%',
+                        data: [
+                            { value: 1048, name: '文学类' },
+                            { value: 735, name: '社会类' },
+                            { value: 580, name: '自然科学' },
+                        ],
+                        emphasis: {
+                            itemStyle: {
+                                shadowBlur: 10,
+                                shadowOffsetX: 0,
+                                shadowColor: 'rgba(0, 0, 0, 0.5)'
+                            }
+                        }
+                    }
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                // this.option.radar.indicator = option.xdata;
+                // this.option.series[0].data[0].value = option.sdata;
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setArray(array) {
+            this.ooption = {
+                xdata: [],
+                sdata: [],
+            }
+            for (var i = 0; i < array.length; i++) {
+                if (array[i].evid == this.eva) {
+                    this.ooption.xdata = array[i].indicator
+                    this.ooption.sdata = array[i].value
+                    break;
+                }
+            }
+            setTimeout(() => {
+                // if (!this.chartObj) {
+                this.setChart(this.ooption);
+                // } else {
+                //     this.option.radar.indicator = this.ooption.xdata;
+                //     this.option.series[0].data[0].value = this.ooption.sdata;
+                //     this.chartObj.setOption(this.option);
+                // }
+            }, 100);
+            this.$forceUpdate();
+        },
+    },
+    watch: {
+        evCourseArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(newValue)
+                this.$forceUpdate();
+            },
+        },
+        eva: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(this.evCourseArray)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.setArray(this.evCourseArray)
+        // this.setChart(this.ooption);
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 170 - 0
src/components/pages/dataBoardSies/library/studentInfo2/index.vue

@@ -0,0 +1,170 @@
+<template>
+    <div class="data_body">
+        <!--  v-if="this.ooption.xdata.length" -->
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+        <!-- <div style="width: 100%; height: 100%;display: flex;align-items: center;justify-content: center;"
+            v-show="!this.ooption.xdata.length">暂无数据</div> -->
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        evCourseArray: {
+            type: Array,
+            default: []
+        },
+        eva: {
+            type: String,
+            default: ''
+        }
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                xdata: [],
+                sdata: [],
+            },
+            option: {
+                tooltip: {},
+                radar: {
+                    axisName: {
+                        color: "#000"
+                    },
+                    // shape: 'circle',
+                    indicator: [
+                        // { name: '目标一', max: 5 },
+                        // { name: '目标二', max: 5 },
+                        // { name: '目标三', max: 5 },
+                        // { name: '目标四', max: 5 },
+                        // { name: '目标五', max: 5 }
+                    ]
+                },
+                series: [
+                    {
+                        name: '学生综合评价',
+                        type: 'radar',
+                        data: [
+                            {
+                                areaStyle: {
+                                    opacity: 0.2,
+                                    color: '#0061FF'
+                                },
+                                itemStyle: {
+                                    color: '#0061FF',
+                                    lineStyle: {
+                                        color: '#0061FF'
+                                    }
+                                },
+                                // 5, 4, 3, 5, 5, 2
+                                value: [],
+                                name: ''
+                            }
+                        ]
+                    }
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                // this.option.radar.indicator = option.xdata;
+                // this.option.series[0].data[0].value = option.sdata;
+                this.option.radar.indicator = [
+                    { name: '成茁小先生', max: 5 },
+                    { name: '成行小先生', max: 5 },
+                    { name: '成智小先生', max: 5 },
+                    { name: '成德小先生', max: 5 },
+                    { name: '成彩小先生', max: 5 }
+                ]
+                this.option.series[0].data[0].value = [1,1,3,5,5];
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setArray(array) {
+            this.setChart(array);
+            return
+            this.ooption = {
+                xdata: [],
+                sdata: [],
+            }
+            for (var i = 0; i < array.length; i++) {
+                if (array[i].evid == this.eva) {
+                    this.ooption.xdata = array[i].indicator
+                    this.ooption.sdata = array[i].value
+                    break;
+                }
+            }
+            setTimeout(() => {
+                // if (!this.chartObj) {
+                this.setChart(this.ooption);
+                // } else {
+                //     this.option.radar.indicator = this.ooption.xdata;
+                //     this.option.series[0].data[0].value = this.ooption.sdata;
+                //     this.chartObj.setOption(this.option);
+                // }
+            }, 100);
+            this.$forceUpdate();
+        },
+    },
+    watch: {
+        evCourseArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(newValue)
+                this.$forceUpdate();
+            },
+        },
+        eva: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(this.evCourseArray)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.setArray(this.evCourseArray)
+        // this.setChart(this.ooption);
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 318 - 0
src/components/pages/dataBoardSies/library/teacherInfo/index.vue

@@ -0,0 +1,318 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        courseArray: {
+            type: Array,
+        },
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                hours: [],
+                days: [],
+                data: [],
+            },
+            option: {
+                tooltip: {
+                    position: 'top',
+                    formatter: function (params) {
+                        // console.log(params);
+                        return params.marker + params.name + ' ' + params.data[1];//params.seriesName + '<br>' + params.
+
+                    }
+                },
+                title: [],
+                singleAxis: [],
+                series: []
+            },
+        };
+    },
+    methods: {
+        // setChart(option) {
+        //     // 雷达图显示的标签
+        //     let newPromise = new Promise((resolve) => {
+        //         resolve();
+        //     });
+        //     //然后异步执行echarts的初始化函数
+        //     newPromise.then(() => {
+        //         const chartObj = this.$echarts.init(
+        //             //劳动课程
+        //             this.$el.querySelector("#charts_canvas")
+        //         );
+        //         const hours = option.hours
+        //         // [
+        //         //     // '语文', '数学', '英语', '科学', '体育', '音乐', '美术',
+        //         //     // '劳动', '其他',
+        //         // ];
+        //         // prettier-ignore
+        //         const days = option.days
+        //         // [
+        //         //     // '一年级', '二年级', '三年级', '四年级', '五年级', '六年级'
+        //         // ];
+        //         // prettier-ignore
+        //         const data = option.data
+        //         // [
+        //         //     // [0, 0, 2], [0, 1, 1], [0, 2, 3], [0, 3, 0], [0, 4, 5], [0, 5, 5], [0, 6, 7], [0, 7, 8], [0, 8, 1],
+        //         //     // [1, 0, 5], [1, 1, 1], [1, 2, 2], [1, 3, 0], [1, 4, 5], [1, 5, 7], [1, 6, 7], [1, 7, 8], [1, 8, 6],
+        //         //     // [2, 0, 5], [2, 1, 2], [2, 2, 0], [2, 3, 2], [2, 4, 1], [2, 5, 5], [2, 6, 4], [2, 7, 4], [2, 8, 1],
+        //         //     // [3, 0, 1], [3, 1, 1], [3, 2, 1], [3, 3, 0], [3, 4, 5], [3, 5, 2], [3, 6, 7], [3, 7, 8], [3, 8, 5],
+        //         //     // [4, 0, 5], [4, 1, 3], [4, 2, 0], [4, 3, 3], [4, 4, 4], [4, 5, 2], [4, 6, 3], [4, 7, 5], [4, 8, 1],
+        //         //     // [5, 0, 5], [5, 1, 1], [5, 2, 0], [5, 3, 0], [5, 4, 5], [5, 5, 5], [5, 6, 7], [5, 7, 8], [5, 8, 3],
+        //         // ];
+        //         const title = [];
+        //         const singleAxis = [];
+        //         const series = [];
+        //         days.forEach(function (day, idx) {
+        //             title.push({
+        //                 textBaseline: 'middle',
+        //                 top: ((idx + 0.5) * 90) / days.length + '%',
+        //                 text: day,
+        //                 textStyle: {
+        //                     fontSize: 12,
+        //                 },
+        //             });
+        //             singleAxis.push({
+        //                 left: 70,
+        //                 type: 'category',
+        //                 boundaryGap: false,
+        //                 data: hours,
+        //                 top: (idx * 90) / days.length + 5 + '%',
+        //                 height: 90 / days.length - 10 + '%'
+        //             });
+        //             series.push({
+        //                 singleAxisIndex: idx,
+        //                 coordinateSystem: 'singleAxis',
+        //                 type: 'scatter',
+        //                 data: [],
+        //                 symbolSize: function (dataItem) {
+        //                     return dataItem[1] * 3;
+        //                 }
+        //             });
+        //         });
+        //         data.forEach(function (dataItem) {
+        //             series[dataItem[0]].data.push([dataItem[1], dataItem[2]]);
+        //         });
+        //         chartObj.off('click')
+        //         let _this = this
+        //         chartObj.on('click', function (param) {  
+        //             //param参数包含的内容有: 
+        //             //param.name:X轴的值 
+        //             //param.data:Y轴的值 
+        //             //param.value:Y轴的值 
+        //             //param.type:点击事件均为click 
+        //             //param.seriesName:legend的名称 
+        //             //param.seriesIndex:系列序号(series中当前图形是第几个图形第几个) 
+        //             //param.dataIndex:数值序列(X轴上当前点是第几个点)
+        //             //alert(param.seriesName);  //legend的名称
+        //             console.log(param);  //X轴的值
+        //             _this.$emit('openCourse',param.componentIndex,param.data[0])
+        //         });
+
+        //         this.option.title = title
+        //         this.option.singleAxis = singleAxis
+        //         this.option.series = series
+        //         // 初始化雷达图
+        //         this.chartObj = chartObj;
+        //         this.chartObj.setOption(this.option);
+        //     });
+        // },
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                const hours = 
+                [
+                    '1班', '2班', '3班', '4班', '5班', '6班', '7班',
+                    '8班'
+                ];
+                // prettier-ignore
+                const days = 
+                [
+                    '一年级', '二年级', '三年级', '四年级', '五年级', '六年级'
+                ];
+                // prettier-ignore
+                const data = 
+                [
+                    [0, 0, 2], [0, 1, 1], [0, 2, 3], [0, 3, 0], [0, 4, 5], [0, 5, 5], [0, 6, 7], [0, 7, 8],
+                    [1, 0, 5], [1, 1, 1], [1, 2, 2], [1, 3, 0], [1, 4, 5], [1, 5, 7], [1, 6, 7], [1, 7, 8],
+                    [2, 0, 5], [2, 1, 2], [2, 2, 0], [2, 3, 2], [2, 4, 1], [2, 5, 5], [2, 6, 4], [2, 7, 4],
+                    [3, 0, 1], [3, 1, 1], [3, 2, 1], [3, 3, 0], [3, 4, 5], [3, 5, 2], [3, 6, 7], [3, 7, 8],
+                    [4, 0, 5], [4, 1, 3], [4, 2, 0], [4, 3, 3], [4, 4, 4], [4, 5, 2], [4, 6, 3], [4, 7, 5],
+                    [5, 0, 5], [5, 1, 1], [5, 2, 0], [5, 3, 0], [5, 4, 5], [5, 5, 5], [5, 6, 7], [5, 7, 8],
+                ];
+                const title = [];
+                const singleAxis = [];
+                const series = [];
+                days.forEach(function (day, idx) {
+                    title.push({
+                        textBaseline: 'middle',
+                        top: ((idx + 0.5) * 90) / days.length + '%',
+                        text: day,
+                        textStyle: {
+                            fontSize: 12,
+                        },
+                    });
+                    singleAxis.push({
+                        left: 70,
+                        type: 'category',
+                        boundaryGap: false,
+                        data: hours,
+                        top: (idx * 90) / days.length + 5 + '%',
+                        height: 90 / days.length - 10 + '%'
+                    });
+                    series.push({
+                        singleAxisIndex: idx,
+                        coordinateSystem: 'singleAxis',
+                        type: 'scatter',
+                        data: [],
+                        symbolSize: function (dataItem) {
+                            return dataItem[1] * 3;
+                        }
+                    });
+                });
+                data.forEach(function (dataItem) {
+                    series[dataItem[0]].data.push([dataItem[1], dataItem[2]]);
+                });
+                this.option.title = title
+                this.option.singleAxis = singleAxis
+                this.option.series = series
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setJson(array) {
+            this.setChart(this.ooption);
+            if (array != undefined && array.length > 0) {
+                this.ooption = {
+                    hours: [],
+                    days: [],
+                    data: [],
+                }
+                let _grade = []
+                let _subject = []
+                let data = []
+
+                array.forEach(function (item, idx) {
+                    _grade.push(item.name)
+                })
+
+                array[0].subject.forEach(function (item, idx) {
+                    _subject.push(item.name)
+                })
+                array.forEach(function (item, idx) {
+                    item.subject.forEach(function (item2, idx2) {
+                        data.push([idx, idx2, item2.course])
+                    })
+                })
+                this.ooption.hours = _subject
+                this.ooption.days = _grade
+                this.ooption.data = data
+                if (!this.chartObj) {
+                    this.setChart(this.ooption);
+                } else {
+                    const hours = this.ooption.hours;
+                    // prettier-ignore
+                    const days = this.ooption.days;
+                    // prettier-ignore
+                    const data = this.ooption.data;
+                    const title = [];
+                    const singleAxis = [];
+                    const series = [];
+                    days.forEach(function (day, idx) {
+                        title.push({
+                            textBaseline: 'middle',
+                            top: ((idx + 0.5) * 90) / days.length + '%',
+                            text: day,
+                            textStyle: {
+                                fontSize: 12,
+                            },
+                        });
+                        singleAxis.push({
+                            left: 70,
+                            type: 'category',
+                            boundaryGap: false,
+                            data: hours,
+                            top: (idx * 90) / days.length + 5 + '%',
+                            height: 90 / days.length - 10 + '%'
+                        });
+                        series.push({
+                            singleAxisIndex: idx,
+                            coordinateSystem: 'singleAxis',
+                            type: 'scatter',
+                            data: [],
+                            symbolSize: function (dataItem) {
+                                return dataItem[1] * 3;
+                            }
+                        });
+                    });
+                    data.forEach(function (dataItem) {
+                        series[dataItem[0]].data.push([dataItem[1], dataItem[2]]);
+                    });
+
+                    this.option.title = title
+                    this.option.singleAxis = singleAxis
+                    this.option.series = series
+                    this.chartObj.setOption(this.option);
+                }
+            }
+        }
+    },
+    watch: {
+        courseArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                // newValue = newValue.filter(item => {
+                //     return ['一年级','二年级','三年级','四年级','五年级','六年级','七年级'].indexOf(item.name) !== -1
+                // })
+                this.setJson(newValue)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        // this.courseArray = this.courseArray.filter(item => {
+        //     return ['一年级','二年级','三年级','四年级','五年级','六年级','七年级'].indexOf(item.name) !== -1
+        // })
+
+        this.setJson(this.courseArray)
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    position: relative;
+    border-radius: 5px;
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 95 - 0
src/components/pages/dataBoardSies/school/cateRank/index.vue

@@ -0,0 +1,95 @@
+<template>
+  <div class="data_body">
+    <div style="width: 100%; height: 100%">
+      <el-table :data="tableData" style="width: 100%" :header-cell-style="{ background: '#E0EAFB',color: '#000' }"
+        :row-class-name="tableRowClassName" class="tableClass">
+        <el-table-column label="排行" min-width="50" align="center">
+          <template slot-scope="scope">{{ scope.$index + 1 }}</template>
+        </el-table-column>
+        <el-table-column prop="name" label="类别名称" min-width="80" align="center">
+        </el-table-column>
+        <el-table-column prop="sum" label="课程数量" min-width="80" align="center">
+        </el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    courseNumberArray: {
+      type: Array,
+    },
+  },
+  data() {
+    return {
+      tableData: [
+        // { rank: "1", name: "一年级", sum: "2356" },
+        // { rank: "2", name: "二年级", sum: "2256" },
+        // { rank: "3", name: "三年级", sum: "2156" },
+        // { rank: "4", name: "四年级", sum: "1356" },
+        // { rank: "5", name: "五年级", sum: "1256" },
+        // { rank: "6", name: "六年级", sum: "1056" },
+      ],
+    };
+  },
+  methods: {
+    tableRowClassName({ row, rowIndex }) {
+      if ((rowIndex + 1) % 2 === 0) {
+        return "even_row";
+      } else {
+        return "";
+      }
+    },
+    setArray(array){
+      this.tableData = []
+      for(var i = 0;i<array.length;i++){
+        this.tableData.push({
+          sum:array[i].course,
+          name:array[i].name
+        })
+      }
+      this.tableData = this.tableData.sort(function(a,b){
+        return b.sum - a.sum;
+      })
+    }
+  },
+  watch: {
+    courseNumberArray: {
+      immediate: true,
+      deep: true,
+      handler(newValue, oldValue) {
+        this.setArray(newValue)
+        this.$forceUpdate();
+      },
+    },
+  },
+  mounted() {
+    this.setArray(this.courseNumberArray)
+  },
+};
+</script>
+
+<style scoped>
+.el-table>>>.even_row {
+  background-color: #f2f7ff !important;
+}
+
+.data_body {
+  height: 100%;
+  /* display: flex; */
+  position: relative;
+  border-radius: 5px;
+  /* border: 1px solid #eee; */
+  margin: 0 auto;
+  box-sizing: border-box;
+  padding: 0;
+  width: 95%;
+  background: #fff;
+}
+
+.tableClass >>> td, .tableClass >>> th{
+  padding: 5px 0;
+}
+</style>

+ 188 - 0
src/components/pages/dataBoardSies/school/courseInfo/index.vue

@@ -0,0 +1,188 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        courseNumberArray: {
+            type: Array,
+        },
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                data: [],
+            },
+            option: {
+                tooltip: {
+                    trigger: 'axis',
+                    axisPointer: {
+                        // Use axis to trigger tooltip
+                        type: 'shadow' // 'shadow' as default; can also be 'line' or 'shadow'
+                    }
+                },
+                legend: {
+                    bottom: 10
+                },
+                grid: {
+                    left: '5%',
+                    right: '5%',
+                    bottom: '15%',
+                    top: '5%',
+                    containLabel: true
+                },
+                xAxis: [
+                    {
+                        type: 'category',
+                        data: [
+                            '俄罗斯方块',
+                            '单词大作战',
+                            '诗词大会',
+                            '数字王国',
+                            '石头剪刀布',
+                            '123木头人'
+                        ],
+                        axisLine: {
+                            show: false //不显示横轴线
+                        },
+                        axisTick: {
+                            alignWithLabel: true, //柱状图中心是否对齐刻度位置
+                            show: false //不显示刻度
+                        },
+                        axisLabel: {
+                            interval: 0,
+                            formatter: function (value) {
+                                var ret = "";//拼接加\n返回的类目项  
+                                var maxLength = 3;//每项显示文字个数  
+                                var valLength = value.length;//X轴类目项的文字个数  
+                                var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数  
+                                if (rowN > 1)//如果类目项的文字大于5,  
+                                {
+                                    for (var i = 0; i < rowN; i++) {
+                                        var temp = "";//每次截取的字符串  
+                                        var start = i * maxLength;//开始截取的位置  
+                                        var end = start + maxLength;//结束截取的位置  
+                                        //这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧  
+                                        temp = value.substring(start, end) + "\n";
+                                        ret += temp; //凭借最终的字符串  
+                                    }
+                                    return ret;
+                                }
+                                else {
+                                    return value;
+                                }
+                            }
+                        }
+                    }
+                ],
+                yAxis: {
+                    type: 'value'
+                },
+                series: [
+                    {
+                        name: '男生人数',
+                        type: 'bar',
+                        stack: 'total',
+                        barWidth: 20,
+                        label: {
+                            show: true
+                        },
+                        emphasis: {
+                            focus: 'series'
+                        },
+                        data: [320, 302, 301, 334, 390, 330]
+                    },
+                    {
+                        name: '女生人数',
+                        type: 'bar',
+                        stack: 'total',
+                        label: {
+                            show: true
+                        },
+                        emphasis: {
+                            focus: 'series'
+                        },
+                        data: [120, 132, 101, 134, 90, 230]
+                    }
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                // this.option.series[0].data = this.ooption.data.filter(item => item.value !== 0);
+
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setArray(array) {
+            this.ooption = {
+                data: [],
+            }
+            for (var i = 0; i < array.length; i++) {
+                this.ooption.data.push({ value: array[i].course, name: array[i].name })
+            }
+            if (!this.chartObj) {
+                this.setChart(this.ooption);
+            } else {
+                this.option.series[0].data = this.ooption.data;
+                this.chartObj.setOption(this.option);
+            }
+            this.$forceUpdate();
+        },
+    },
+    watch: {
+        courseNumberArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(newValue)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.setArray(this.courseNumberArray)
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 547 - 0
src/components/pages/dataBoardSies/school/index.vue

@@ -0,0 +1,547 @@
+<template>
+  <div class="body1" v-loading="isLoading">
+    <!-- 综合数据 -->
+    <div class="left">
+      <div class="top">
+        <div class="titleBox">
+          <div class="title">用户概况</div>
+        </div>
+        <div class="dataBox">
+          <div class="info_box">
+            <div class="info blueBG">
+              <span>用户总数</span>
+              <!-- <span>{{ count }}</span> -->
+              <span>{{ 310 }}</span>
+            </div>
+            <div class="info blueBG">
+              <span>本月运动用户环比</span>
+              <!-- <span>{{ weekCount }}</span> -->
+              <span>{{ "0.9%" }}</span>
+            </div>
+            <div class="info blueBG">
+              <span>运动用户百分比</span>
+              <!-- <span>{{ loginCount }}</span> -->
+              <span>{{ '60%' }}</span>
+            </div>
+            <div class="info blueBG">
+              <span>本月运动用户总数</span>
+              <!-- <span>{{ (loginCount / count).toFixed(0) }}</span> -->
+              <span>{{ 18 }}</span>
+            </div>
+          </div>
+          <loginCount style="height: calc(100% - 140px)" :monthArray="loginCountMonthArray"></loginCount>
+        </div>
+      </div>
+      <div class="bottom">
+        <div class="titleBox">
+          <div class="title">运动时长</div>
+        </div>
+        <div class="dataBox">
+          <div class="info_box">
+            <div class="info blueBG">
+              <span>运动总时长</span>
+              <!-- <span>{{ loginTime.toFixed(0) }}小时</span> -->
+              <span>{{ 1513 }}</span>
+            </div>
+            <div class="info blueBG">
+              <span>人均运动时长</span>
+              <!-- <span>{{ (loginTime / count).toFixed(0) }}小时</span> -->
+              <span>{{ 4 }}</span>
+            </div>
+          </div>
+          <loginTime :yearArray="loginCountYearArray" style="height: calc(100% - 70px)"></loginTime>
+        </div>
+      </div>
+    </div>
+    <div class="center">
+      <div class="top">
+        <div class="titleBox">
+          <div class="title">班级表现</div>
+          <el-select v-model="cType" @change="typeChange" class="selectBox" @focus="setMinWidth" style="width: 150px;">
+            <el-option label="累计积分" value=""></el-option>
+          </el-select>
+        </div>
+        <div class="dataBox">
+          <teacherInfo style="height: calc(100%)" :courseArray="courseArray" @openCourse="openCourse"></teacherInfo>
+        </div>
+      </div>
+      <div class="bottom">
+        <div class="titleBox">
+          <div class="title">学生运动报告</div>
+          <div>
+            <el-select v-model="eva" @change="typeChange2" @focus="setMinWidth" class="selectBox" style="width: 120px;">
+              <el-option label="全部年级" value=""></el-option>
+            </el-select>
+            <el-select v-model="eva" @change="typeChange2" @focus="setMinWidth" class="selectBox" style="width: 120px;">
+              <el-option label="全部班级" value=""></el-option>
+            </el-select>
+          </div>
+        </div>
+        <div class="dataBox">
+          <div class="pe_box">
+            <div class="pe_child">
+              <div class="pe_f ">
+                <div class="pe_img orange_pe"><img src="../../../../assets/icon/new/pe_heart.png" alt=""></div>
+                <span>平均心率(次/分)</span>
+              </div>
+              <div class="pe_s">
+                127
+              </div>
+            </div>
+            <div class="pe_child">
+              <div class="pe_f ">
+                <div class="pe_img red_pe"><img src="../../../../assets/icon/new/pe_heart.png" alt=""></div>
+                <span>平均最大心率(次/分)</span>
+              </div>
+              <div class="pe_s">
+                181
+              </div>
+            </div>
+            <div class="pe_child">
+              <div class="pe_f ">
+                <div class="pe_img blue_pe"><img src="../../../../assets/icon/new/pe_mi.png" alt=""></div>
+                <span>运动密度</span>
+              </div>
+              <div class="pe_s">
+                18.93%
+              </div>
+            </div>
+            <div class="pe_child">
+              <div class="pe_f">
+                <div class="pe_img purple_pe"><img src="../../../../assets/icon/new/pe_time.png" alt=""></div>
+                <span>有效时长(分)</span>
+              </div>
+              <div class="pe_s">
+                10
+              </div>
+            </div>
+          </div>
+          <studentInfo2 style="height: calc(100% - 100px)" :evCourseArray="evCourseArray" :eva="eva"></studentInfo2>
+        </div>
+      </div>
+    </div>
+    <div class="right">
+      <div class="top">
+        <div class="titleBox">
+          <div class="title">运动项目锻炼占比</div>
+
+        </div>
+        <div class="dataBox">
+
+          <courseInfo :courseNumberArray="courseNumberArray" @openCourse="openCourse2"></courseInfo>
+        </div>
+      </div>
+      <div class="bottom">
+        <div class="titleBox">
+          <div class="title">运动合格情况</div>
+        </div>
+        <div class="dataBox">
+          <!-- <studentInfo :evCourseArray="evCourseArray" :eva="eva"></studentInfo> -->
+          <div class="depth_box">
+            <div class="depth">
+              <span>平均心率合格率</span>
+              <div>
+                <el-progress :width="80" type="circle" :percentage="14.6" :stroke-width="5" :format="format"
+                  color="#106BFF"></el-progress>
+              </div>
+            </div>
+            <div class="depth">
+              <span>运动密度合格率</span>
+              <div>
+                <el-progress :width="80" type="circle" :percentage="2.4" :stroke-width="5" :format="format"
+                  color="#106BFF"></el-progress>
+              </div>
+            </div>
+            <div class="depth">
+              <span>有效时长占比</span>
+              <div>
+                <el-progress :width="80" type="circle" :percentage="20" :stroke-width="5" :format="format"
+                  color="#106BFF"></el-progress>
+              </div>
+            </div>
+            <div class="depth">
+              <span>综合合格率</span>
+              <div>
+                <el-progress :width="80" type="circle" :percentage="12.3" :stroke-width="5" :format="format"
+                  color="#106BFF"></el-progress>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import loginCount from "./loginCount";
+import loginTime from "./loginTime";
+import teacherInfo from "./teacherInfo";
+import courseInfo from "./courseInfo";
+import studentInfo from "./studentInfo";
+import studentInfo2 from "./studentInfo2";
+import cateRank from "./cateRank";
+export default {
+  components: {
+    loginCount,
+    loginTime,
+    teacherInfo,
+    courseInfo,
+    studentInfo,
+    studentInfo2,
+    cateRank,
+  },
+  props: {
+    oid: {
+      type: String,
+    },
+    org: {
+      type: String,
+    },
+  },
+  data() {
+    return {
+      isLoading: false,
+      count: 0,
+      loginCount: 0,
+      loginTime: 0,
+      courseCount: 0,
+      teacherCount: 0,
+      loginCountMonthArray: [],
+      weekCount: 0,
+      loginCountYearArray: [],
+      gradeCourse: 0,
+      subjectCourse: 0,
+      courseArray: [],
+      cType: '',
+      gradeArray: [],
+      subjectArray: [],
+      themeArray: [],
+      allArray: [],
+      courseNumberArray: [],
+      typeCount: 0,
+      typeCourseCount: 0,
+      lightJson: {
+        users: 0,
+        teachers: 0,
+        students: 0,
+        upCourseTeachers: 0,
+        gCourseTeachers: 0,
+        upCourseUsers: 0,
+        gCourseUsers: 0,
+        toolUsers: 0,
+        rateUser: 0,
+        upgCourseTeachers: 0,
+        commentUsers: 0,
+      },
+      evArray: [],
+      eva: '',
+      evCourseArray: [],
+      minWidth: 0
+    }
+  },
+  mounted() {
+    this.getData();
+  },
+  methods: {
+    setMinWidth(val) {
+      this.minWidth = val.srcElement.clientWidth
+    },
+    openCourse(classIndex, subIndex) {
+
+    },
+    openCourse2(index) {
+
+    },
+    getData() {
+
+    },
+    typeChange() {
+
+    },
+    typeChange2() {
+
+    },
+    format(percentage) {
+      return percentage + '%';
+    },
+  },
+};
+</script>
+
+
+<style scoped>
+.body1 {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  padding: 20px;
+  box-sizing: border-box;
+  overflow: hidden;
+}
+
+.left {
+  width: calc(100% / 4 * 1);
+  height: 100%;
+}
+
+.left>.top {
+  width: 100%;
+  height: calc(100% / 5 * 2.8 - 20px);
+  background: #fff;
+  border-radius: 5px;
+  margin: 0 0 20px 0;
+}
+
+.left>.bottom {
+  width: 100%;
+  height: calc(100% / 5 * 2.2);
+  background: #fff;
+  border-radius: 5px;
+}
+
+.center {
+  width: calc(100% / 4 * 2 - 40px);
+  height: 100%;
+  margin: 0 20px;
+}
+
+.center>.top {
+  width: 100%;
+  height: calc(100% / 5 * 2.5 - 20px);
+  background: #fff;
+  border-radius: 5px;
+  margin: 0 0 20px 0;
+}
+
+.center>.bottom {
+  width: 100%;
+  height: calc(100% / 5 * 2.5);
+  background: #fff;
+  border-radius: 5px;
+}
+
+.right {
+  width: calc(100% / 4 * 1);
+  height: 100%;
+}
+
+.right>.top {
+  width: 100%;
+  height: calc(100% / 5 * 2.8 - 20px);
+  background: #fff;
+  border-radius: 5px;
+  margin: 0 0 20px 0;
+}
+
+.right>.bottom {
+  width: 100%;
+  height: calc(100% / 5 * 2.2);
+  background: #fff;
+  border-radius: 5px;
+}
+
+.titleBox {
+  height: 40px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 0 15px;
+  width: 100%;
+  box-sizing: border-box;
+}
+
+.titleBox>.title {
+  font-weight: 700;
+}
+
+.dataBox {
+  height: calc(100% - 40px);
+  width: 100%;
+}
+
+.info_box {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: space-between;
+  width: 90%;
+  margin: 0 auto;
+}
+
+.info_box>.info2,
+.info_box>.info3,
+.info_box>.info {
+  width: calc(50% - 10px);
+  display: flex;
+  height: 60px;
+  justify-content: space-between;
+  align-items: center;
+  padding: 0 10px;
+  box-sizing: border-box;
+  margin-bottom: 10px;
+  border-radius: 5px;
+}
+
+.info_box>.info2 {
+  width: calc(100% / 4 - 10px);
+  /* align-items: flex-end; */
+}
+
+.info_box>.info3 {
+  width: 100%;
+  margin-bottom: 5px;
+}
+
+.info_box>.info2>span:nth-child(1),
+.info_box>.info3>span:nth-child(1),
+.info_box>.info>span:nth-child(1) {
+  font-size: 14px;
+  /* margin: 0 0 0 20px; */
+  color: #565e6a;
+  width: 60px;
+  white-space: pre-wrap;
+  word-break: break-all;
+}
+
+.info_box>.info2>span:nth-child(2),
+.info_box>.info3>span:nth-child(2),
+.info_box>.info>span:nth-child(2) {
+  font-size: 24px;
+  /* font-weight: 700; */
+}
+
+.blueBG {
+  background: rgb(243, 248, 253);
+  border: 2px solid rgb(234, 246, 255);
+}
+
+.greenBG {
+  background: linear-gradient(180deg,
+      rgb(211, 246, 228, 0.2) 0%,
+      rgb(23, 196, 105, 0.3) 100%);
+}
+
+.depth_box {
+  display: flex;
+  flex-wrap: wrap;
+  height: 100%;
+  width: 95%;
+  margin: 0 auto;
+  overflow: hidden;
+  justify-content: space-between;
+}
+
+.depth {
+  width: calc(100% / 2 - 10px);
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+}
+
+.depth>span:nth-child(1) {
+  font-size: 14px;
+  font-weight: 700;
+  margin: 0 0 10px;
+}
+
+.depth>div:nth-child(1) {}
+
+.course_box {
+  display: flex;
+  height: 50%;
+  width: 95%;
+  margin: 0 auto;
+}
+
+.course_box .info_box {
+  height: 100%;
+  width: 100px;
+  flex-direction: column;
+  margin: 0;
+  flex-wrap: nowrap;
+}
+
+.course_box_p {
+  width: calc(100% - 100px);
+}
+
+.selectBox {
+  width: 80px;
+  margin-left: 10px;
+}
+
+.selectBox>>>.el-input__inner {
+  height: 30px;
+  line-height: 30px;
+}
+
+.selectBox>>>.el-input__icon {
+  line-height: 30px;
+}
+
+
+.pe_box {
+  display: flex;
+  width: 100%;
+  height: 100px;
+  background: rgb(221, 240, 234);
+  padding: 0 20px;
+  justify-content: space-between;
+  box-sizing: border-box;
+}
+
+.orange_pe {
+  background: rgb(254, 119, 1);
+}
+
+.red_pe {
+  background: rgb(216, 35, 254);
+
+}
+
+.purple_pe {
+  background: rgb(255, 13, 11);
+
+}
+
+.pe_child {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: space-between;
+  padding: 20px 0;
+  height: 100%;
+  box-sizing: border-box;
+}
+
+.pe_f {
+  display: flex;
+  align-items: center;
+  font-size: 13px;
+}
+
+.blue_pe {
+  background: rgb(78, 241, 238);
+
+}
+
+.pe_img {
+  border-radius: 50%;
+  width: 40px;
+  height: 40px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.pe_img>img {
+  width: 60%;
+}
+
+.pe_s {
+  font-weight: 700;
+  color: #5a5a5a;
+}
+</style>

+ 158 - 0
src/components/pages/dataBoardSies/school/loginCount/index.vue

@@ -0,0 +1,158 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        monthArray: {
+            type: Array,
+            default: []
+        },
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                xdata: [],
+                teacher: [],
+                student: [],
+            },
+            option: {
+                tooltip: {
+                    trigger: 'axis'
+                },
+                // legend: {
+                //     data: ['老师', '学生'],
+                //     right: '10'
+                // },
+                grid: {
+                    top: '30',
+                    left: '5%',
+                    right: '5%',
+                    bottom: '5%',
+                    containLabel: true
+                },
+                xAxis: {
+                    type: 'category',
+                    boundaryGap: true,
+                    // data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月']
+                    data: []
+                },
+                yAxis: {
+                    type: 'value'
+                },
+                series: [
+                    {
+                        name: '用户',
+                        type: 'line',
+                        // data: [120, 50, 101, 130, 110, 120]
+                        areaStyle: {
+                            color: 'rgb(220, 231, 251)'
+                        },
+                        data: [],
+                        itemStyle: {
+                            normal: {
+                                color: function (params) {
+                                    return "#106bff";
+                                },
+                            },
+                        },
+                    },
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                // this.option.xAxis.data = option.xdata;
+                // this.option.series[0].data = option.teacher;
+                this.option.xAxis.data = ['1月', '2月', '3月', '4月', '5月', '6月', '7月'];
+                this.option.series[0].data = [300, 500, 490, 510, 505, 520, 550];
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+    },
+    watch: {
+        monthArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.ooption = {
+                    xdata: [],
+                    teacher: [],
+                    student: [],
+                }
+                let _array = newValue
+                for (var i = 0; i < _array.length; i++) {
+                    this.ooption.xdata.push(_array[i].Month + '月')
+                    this.ooption.teacher.push(_array[i].teacher)
+                    this.ooption.student.push(_array[i].student)
+                }
+
+                if (!this.chartObj) {
+                    this.setChart(this.ooption);
+                } else {
+                    this.option.xAxis.data = this.ooption.xdata;
+                    this.option.series[0].data = this.ooption.teacher;
+                    this.option.series[1].data = this.ooption.student;
+                    this.chartObj.setOption(this.option);
+                }
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.ooption = {
+            xdata: [],
+            teacher: [],
+            student: [],
+        }
+        let _array = this.monthArray
+        for (var i = 0; i < _array.length; i++) {
+            this.ooption.xdata.push(_array[i].Month + '月')
+            this.ooption.teacher.push(_array[i].teacher)
+            this.ooption.student.push(_array[i].student)
+        }
+        this.setChart(this.ooption);
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 211 - 0
src/components/pages/dataBoardSies/school/loginTime/index.vue

@@ -0,0 +1,211 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        yearArray: {
+            type: Array,
+        },
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                xdata: [],
+                sdata: [],
+            },
+            option: {
+                series: [
+                    {
+                        type: 'gauge',
+                        startAngle: 180,
+                        endAngle: 0,
+                        center: ['50%', '75%'],
+                        radius: '150%',
+                        min: 0,
+                        max: 4000,
+                        splitNumber: 8,
+                        axisLine: {
+                            lineStyle: {
+                                width: 10,
+                                color: [
+                                    [0.25, 'rgb(251, 223, 148)'],
+                                    [0.5, 'rgb(145, 208, 237)'],
+                                    [0.75, 'rgb(68, 96, 193)'],
+                                    [1, 'rgb(240, 141, 158)']
+                                ]
+                            }
+                        },
+                        pointer: {
+                            icon: 'path://M12.8,0.7l12,40.1H0.7L12.8,0.7z',
+                            length: '12%',
+                            width: 12,
+                            offsetCenter: [0, '-60%'],
+                            itemStyle: {
+                                color: 'auto'
+                            }
+                        },
+                        axisTick: {
+                            length: 6,
+                            lineStyle: {
+                                color: 'auto',
+                                width: 2
+                            }
+                        },
+                        splitLine: {
+                            length: 20,
+                            lineStyle: {
+                                color: 'auto',
+                                width: 5
+                            }
+                        },
+                        axisLabel: {
+                            show:false
+                        },
+                        title:{
+                            show:false
+                        },
+                        detail: {
+                            fontSize: 30,
+                            offsetCenter: [0, '-15%'],
+                            color: 'inherit'
+                        },
+                        data: [
+                            {
+                                value: 3055,
+                                name: ''
+                            }
+                        ]
+                    }
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+
+                // this.option.xAxis.data = option.xdata;
+                // this.option.series[0].data = option.sdata;
+                // this.option.visualMap.max = option.max ? option.max : 0;
+
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+    },
+    watch: {
+        yearArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.ooption = {
+                    xdata: [],
+                    sdata: [],
+                    max: 0
+                }
+                let _array = newValue
+                let max = []
+                for (var i = 0; i < _array.length; i++) {
+                    this.ooption.xdata.push(_array[i].Month + '月')
+                    this.ooption.sdata.push([i, 0, _array[i].sun])
+                    this.ooption.sdata.push([i, 1, _array[i].mon])
+                    this.ooption.sdata.push([i, 2, _array[i].tue])
+                    this.ooption.sdata.push([i, 3, _array[i].wed])
+                    this.ooption.sdata.push([i, 4, _array[i].thur])
+                    this.ooption.sdata.push([i, 5, _array[i].fri])
+                    this.ooption.sdata.push([i, 6, _array[i].sat])
+                    // let _data = [_array[i].Month-1,] //[月份,星期,值]
+                    max.push(_array[i].sun)
+                    max.push(_array[i].mon)
+                    max.push(_array[i].tue)
+                    max.push(_array[i].wed)
+                    max.push(_array[i].thur)
+                    max.push(_array[i].fri)
+                    max.push(_array[i].sat)
+                }
+                this.ooption.max = max.sort(function (a, b) {
+                    return b - a;
+                })[0];
+                if (!this.chartObj) {
+                    this.setChart(this.ooption);
+                } else {
+                    this.option.xAxis.data = this.ooption.xdata;
+                    this.option.series[0].data = this.ooption.sdata;
+                    this.option.visualMap.max = this.ooption.max ? this.ooption.max : 0;
+                    this.chartObj.setOption(this.option);
+                }
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.ooption = {
+            xdata: [],
+            sdata: [],
+            max: 0
+        }
+        let _array = this.yearArray
+        let max = []
+        for (var i = 0; i < _array.length; i++) {
+            this.ooption.xdata.push(_array[i].Month + '月')
+            this.ooption.sdata.push([i, 0, _array[i].sun])
+            this.ooption.sdata.push([i, 1, _array[i].mon])
+            this.ooption.sdata.push([i, 2, _array[i].tue])
+            this.ooption.sdata.push([i, 3, _array[i].wed])
+            this.ooption.sdata.push([i, 4, _array[i].thur])
+            this.ooption.sdata.push([i, 5, _array[i].fri])
+            this.ooption.sdata.push([i, 6, _array[i].sat])
+            // let _data = [_array[i].Month-1,] //[月份,星期,值]
+            max.push(_array[i].sun)
+            max.push(_array[i].mon)
+            max.push(_array[i].tue)
+            max.push(_array[i].wed)
+            max.push(_array[i].thur)
+            max.push(_array[i].fri)
+            max.push(_array[i].sat)
+        }
+        this.ooption.max = max.sort(function (a, b) {
+            return b - a;
+        })[0];
+
+        this.setChart(this.ooption);
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    position: relative;
+    border-radius: 5px;
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 172 - 0
src/components/pages/dataBoardSies/school/studentInfo/index.vue

@@ -0,0 +1,172 @@
+<template>
+    <div class="data_body">
+        <!--  v-if="this.ooption.xdata.length" -->
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+        <!-- <div style="width: 100%; height: 100%;display: flex;align-items: center;justify-content: center;"
+            v-show="!this.ooption.xdata.length">暂无数据</div> -->
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        evCourseArray: {
+            type: Array,
+            default: []
+        },
+        eva: {
+            type: String,
+            default: ''
+        }
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                xdata: [],
+                sdata: [],
+            },
+            option: {
+                tooltip: {},
+                radar: {
+                    axisName: {
+                        color: "#000"
+                    },
+                    // shape: 'circle',
+                    indicator: [
+                        // { name: '目标一', max: 5 },
+                        // { name: '目标二', max: 5 },
+                        // { name: '目标三', max: 5 },
+                        // { name: '目标四', max: 5 },
+                        // { name: '目标五', max: 5 }
+                    ]
+                },
+                series: [
+                    {
+                        name: '学生综合评价',
+                        type: 'radar',
+                        data: [
+                            {
+                                areaStyle: {
+                                    opacity: 0.2,
+                                    color: 'rgb(239, 144, 55)'
+                                },
+                                itemStyle: {
+                                    color: 'rgb(239, 144, 55)',
+                                    lineStyle: {
+                                        color: 'rgb(239, 144, 55)'
+                                    }
+                                },
+                                // 5, 4, 3, 5, 5, 2
+                                value: [],
+                                name: ''
+                            }
+                        ]
+                    }
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                // this.option.radar.indicator = option.xdata;
+                // this.option.series[0].data[0].value = option.sdata;
+                this.option.radar.indicator = [
+                        { name: '数学', max: 5 },
+                        { name: '语文', max: 5 },
+                        { name: '美术', max: 5 },
+                        { name: '科学', max: 5 },
+                        { name: '心里健康', max: 5 },
+                        { name: '道德与法治', max: 5 },
+                        { name: '生命与安全', max: 5 },
+                        { name: '体育', max: 5 },
+                        { name: '音乐', max: 5 }
+                    ];
+                this.option.series[0].data[0].value = [5,5,5,5,4,3,4,5,4];
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setArray(array) {
+            this.ooption = {
+                xdata: [],
+                sdata: [],
+            }
+            for (var i = 0; i < array.length; i++) {
+                if (array[i].evid == this.eva) {
+                    this.ooption.xdata = array[i].indicator
+                    this.ooption.sdata = array[i].value
+                    break;
+                }
+            }
+            setTimeout(() => {
+                // if (!this.chartObj) {
+                this.setChart(this.ooption);
+                // } else {
+                //     this.option.radar.indicator = this.ooption.xdata;
+                //     this.option.series[0].data[0].value = this.ooption.sdata;
+                //     this.chartObj.setOption(this.option);
+                // }
+            }, 100);
+            this.$forceUpdate();
+        },
+    },
+    watch: {
+        evCourseArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(newValue)
+                this.$forceUpdate();
+            },
+        },
+        eva: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(this.evCourseArray)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.setArray(this.evCourseArray)
+        // this.setChart(this.ooption);
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 190 - 0
src/components/pages/dataBoardSies/school/studentInfo2/index.vue

@@ -0,0 +1,190 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        evCourseArray: {
+            type: Array,
+            default: []
+        },
+        eva: {
+            type: String,
+            default: ''
+        }
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                xdata: [],
+                sdata: [],
+            },
+            option: {
+                xAxis: {
+                    type: 'value',
+                    show:false,
+                },
+                grid:{
+                    left: '15%',
+                    right: '5%',
+                    bottom: '5%',
+                    top: '5%',
+                },
+                yAxis: {
+                    inverse: true,
+                    type: 'category',
+                    data: [
+                        '休闲状态(<=50%)',
+                        '热身状态(50-60%)',
+                        '脂肪燃烧(60-70%)',
+                        '心肺提升(70-80%)',
+                        '乳酸闽值(80-90%)',
+                        '极限无氧(>=90%)'
+                    ]
+                },
+                series: [
+                    {
+                        showBackground: true,
+                        data: [
+                            {
+                                value: 10,
+                                itemStyle: {
+                                    color: 'rgb(157, 157, 157)'
+                                }
+                            },
+                            {
+                                value: 20,
+                                itemStyle: {
+                                    color: 'rgb(15, 216, 242)'
+                                }
+                            },
+                            {
+                                value: 40,
+                                itemStyle: {
+                                    color: 'rgb(0, 208, 146)'
+                                }
+                            },
+                            {
+                                value: 80,
+                                itemStyle: {
+                                    color: 'rgb(255, 192, 29)'
+                                }
+                            },
+                            {
+                                value: 70,
+                                itemStyle: {
+                                    color: 'rgb(247, 123, 1)'
+                                }
+                            },
+                            {
+                                value: 15,
+                                itemStyle: {
+                                    color: 'rgb(255, 58, 32)'
+                                }
+                            },
+                        ],
+                        type: 'bar'
+                    }
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                // this.option.radar.indicator = option.xdata;
+                // this.option.series[0].data[0].value = option.sdata;
+
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setArray(array) {
+            this.setChart(array);
+            return
+            this.ooption = {
+                xdata: [],
+                sdata: [],
+            }
+            for (var i = 0; i < array.length; i++) {
+                if (array[i].evid == this.eva) {
+                    this.ooption.xdata = array[i].indicator
+                    this.ooption.sdata = array[i].value
+                    break;
+                }
+            }
+            setTimeout(() => {
+                // if (!this.chartObj) {
+                this.setChart(this.ooption);
+                // } else {
+                //     this.option.radar.indicator = this.ooption.xdata;
+                //     this.option.series[0].data[0].value = this.ooption.sdata;
+                //     this.chartObj.setOption(this.option);
+                // }
+            }, 100);
+            this.$forceUpdate();
+        },
+    },
+    watch: {
+        evCourseArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(newValue)
+                this.$forceUpdate();
+            },
+        },
+        eva: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.setArray(this.evCourseArray)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.setArray(this.evCourseArray)
+        // this.setChart(this.ooption);
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 318 - 0
src/components/pages/dataBoardSies/school/teacherInfo/index.vue

@@ -0,0 +1,318 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+    </div>
+</template>
+  
+<script>
+export default {
+    props: {
+        courseArray: {
+            type: Array,
+        },
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                hours: [],
+                days: [],
+                data: [],
+            },
+            option: {
+                tooltip: {
+                    position: 'top',
+                    formatter: function (params) {
+                        // console.log(params);
+                        return params.marker + params.name + ' ' + params.data[1];//params.seriesName + '<br>' + params.
+
+                    }
+                },
+                title: [],
+                singleAxis: [],
+                series: []
+            },
+        };
+    },
+    methods: {
+        // setChart(option) {
+        //     // 雷达图显示的标签
+        //     let newPromise = new Promise((resolve) => {
+        //         resolve();
+        //     });
+        //     //然后异步执行echarts的初始化函数
+        //     newPromise.then(() => {
+        //         const chartObj = this.$echarts.init(
+        //             //劳动课程
+        //             this.$el.querySelector("#charts_canvas")
+        //         );
+        //         const hours = option.hours
+        //         // [
+        //         //     // '语文', '数学', '英语', '科学', '体育', '音乐', '美术',
+        //         //     // '劳动', '其他',
+        //         // ];
+        //         // prettier-ignore
+        //         const days = option.days
+        //         // [
+        //         //     // '一年级', '二年级', '三年级', '四年级', '五年级', '六年级'
+        //         // ];
+        //         // prettier-ignore
+        //         const data = option.data
+        //         // [
+        //         //     // [0, 0, 2], [0, 1, 1], [0, 2, 3], [0, 3, 0], [0, 4, 5], [0, 5, 5], [0, 6, 7], [0, 7, 8], [0, 8, 1],
+        //         //     // [1, 0, 5], [1, 1, 1], [1, 2, 2], [1, 3, 0], [1, 4, 5], [1, 5, 7], [1, 6, 7], [1, 7, 8], [1, 8, 6],
+        //         //     // [2, 0, 5], [2, 1, 2], [2, 2, 0], [2, 3, 2], [2, 4, 1], [2, 5, 5], [2, 6, 4], [2, 7, 4], [2, 8, 1],
+        //         //     // [3, 0, 1], [3, 1, 1], [3, 2, 1], [3, 3, 0], [3, 4, 5], [3, 5, 2], [3, 6, 7], [3, 7, 8], [3, 8, 5],
+        //         //     // [4, 0, 5], [4, 1, 3], [4, 2, 0], [4, 3, 3], [4, 4, 4], [4, 5, 2], [4, 6, 3], [4, 7, 5], [4, 8, 1],
+        //         //     // [5, 0, 5], [5, 1, 1], [5, 2, 0], [5, 3, 0], [5, 4, 5], [5, 5, 5], [5, 6, 7], [5, 7, 8], [5, 8, 3],
+        //         // ];
+        //         const title = [];
+        //         const singleAxis = [];
+        //         const series = [];
+        //         days.forEach(function (day, idx) {
+        //             title.push({
+        //                 textBaseline: 'middle',
+        //                 top: ((idx + 0.5) * 90) / days.length + '%',
+        //                 text: day,
+        //                 textStyle: {
+        //                     fontSize: 12,
+        //                 },
+        //             });
+        //             singleAxis.push({
+        //                 left: 70,
+        //                 type: 'category',
+        //                 boundaryGap: false,
+        //                 data: hours,
+        //                 top: (idx * 90) / days.length + 5 + '%',
+        //                 height: 90 / days.length - 10 + '%'
+        //             });
+        //             series.push({
+        //                 singleAxisIndex: idx,
+        //                 coordinateSystem: 'singleAxis',
+        //                 type: 'scatter',
+        //                 data: [],
+        //                 symbolSize: function (dataItem) {
+        //                     return dataItem[1] * 3;
+        //                 }
+        //             });
+        //         });
+        //         data.forEach(function (dataItem) {
+        //             series[dataItem[0]].data.push([dataItem[1], dataItem[2]]);
+        //         });
+        //         chartObj.off('click')
+        //         let _this = this
+        //         chartObj.on('click', function (param) {  
+        //             //param参数包含的内容有: 
+        //             //param.name:X轴的值 
+        //             //param.data:Y轴的值 
+        //             //param.value:Y轴的值 
+        //             //param.type:点击事件均为click 
+        //             //param.seriesName:legend的名称 
+        //             //param.seriesIndex:系列序号(series中当前图形是第几个图形第几个) 
+        //             //param.dataIndex:数值序列(X轴上当前点是第几个点)
+        //             //alert(param.seriesName);  //legend的名称
+        //             console.log(param);  //X轴的值
+        //             _this.$emit('openCourse',param.componentIndex,param.data[0])
+        //         });
+
+        //         this.option.title = title
+        //         this.option.singleAxis = singleAxis
+        //         this.option.series = series
+        //         // 初始化雷达图
+        //         this.chartObj = chartObj;
+        //         this.chartObj.setOption(this.option);
+        //     });
+        // },
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                const hours = 
+                [
+                    '1班', '2班', '3班', '4班', '5班', '6班', '7班',
+                    '8班'
+                ];
+                // prettier-ignore
+                const days = 
+                [
+                    '一年级', '二年级', '三年级', '四年级', '五年级', '六年级'
+                ];
+                // prettier-ignore
+                const data = 
+                [
+                    [0, 0, 8], [0, 1, 3], [0, 2, 3], [0, 3, 2], [0, 4, 4], [0, 5, 5], [0, 6, 0], [0, 7, 0],
+                    [1, 0, 18], [1, 1, 29], [1, 2, 21], [1, 3, 37], [1, 4, 38], [1, 5, 41], [1, 6, 0], [1, 7, 0],
+                    [2, 0, 46], [2, 1, 43], [2, 2, 31], [2, 3, 44], [2, 4, 43], [2, 5, 38], [2, 6, 0], [2, 7, 0],
+                    [3, 0, 43], [3, 1, 37], [3, 2, 25], [3, 3, 40], [3, 4, 35], [3, 5, 26], [3, 6, 0], [3, 7, 0],
+                    [4, 0, 38], [4, 1, 37], [4, 2, 25], [4, 3, 0], [4, 4, 0], [4, 5, 0], [4, 6, 0], [4, 7, 0],
+                    [5, 0, 24], [5, 1, 0], [5, 2, 3], [5, 3, 0], [5, 4, 0], [5, 5, 0], [5, 6, 0], [5, 7, 0],
+                ];
+                const title = [];
+                const singleAxis = [];
+                const series = [];
+                days.forEach(function (day, idx) {
+                    title.push({
+                        textBaseline: 'middle',
+                        top: ((idx + 0.5) * 90) / days.length + '%',
+                        text: day,
+                        textStyle: {
+                            fontSize: 12,
+                        },
+                    });
+                    singleAxis.push({
+                        left: 70,
+                        type: 'category',
+                        boundaryGap: false,
+                        data: hours,
+                        top: (idx * 90) / days.length + 5 + '%',
+                        height: 90 / days.length - 10 + '%'
+                    });
+                    series.push({
+                        singleAxisIndex: idx,
+                        coordinateSystem: 'singleAxis',
+                        type: 'scatter',
+                        data: [],
+                        symbolSize: function (dataItem) {
+                            return dataItem[1] * 1.5;
+                        }
+                    });
+                });
+                data.forEach(function (dataItem) {
+                    series[dataItem[0]].data.push([dataItem[1], dataItem[2]]);
+                });
+                this.option.title = title
+                this.option.singleAxis = singleAxis
+                this.option.series = series
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setJson(array) {
+            this.setChart(this.ooption);
+            if (array != undefined && array.length > 0) {
+                this.ooption = {
+                    hours: [],
+                    days: [],
+                    data: [],
+                }
+                let _grade = []
+                let _subject = []
+                let data = []
+
+                array.forEach(function (item, idx) {
+                    _grade.push(item.name)
+                })
+
+                array[0].subject.forEach(function (item, idx) {
+                    _subject.push(item.name)
+                })
+                array.forEach(function (item, idx) {
+                    item.subject.forEach(function (item2, idx2) {
+                        data.push([idx, idx2, item2.course])
+                    })
+                })
+                this.ooption.hours = _subject
+                this.ooption.days = _grade
+                this.ooption.data = data
+                if (!this.chartObj) {
+                    this.setChart(this.ooption);
+                } else {
+                    const hours = this.ooption.hours;
+                    // prettier-ignore
+                    const days = this.ooption.days;
+                    // prettier-ignore
+                    const data = this.ooption.data;
+                    const title = [];
+                    const singleAxis = [];
+                    const series = [];
+                    days.forEach(function (day, idx) {
+                        title.push({
+                            textBaseline: 'middle',
+                            top: ((idx + 0.5) * 90) / days.length + '%',
+                            text: day,
+                            textStyle: {
+                                fontSize: 12,
+                            },
+                        });
+                        singleAxis.push({
+                            left: 70,
+                            type: 'category',
+                            boundaryGap: false,
+                            data: hours,
+                            top: (idx * 90) / days.length + 5 + '%',
+                            height: 90 / days.length - 10 + '%'
+                        });
+                        series.push({
+                            singleAxisIndex: idx,
+                            coordinateSystem: 'singleAxis',
+                            type: 'scatter',
+                            data: [],
+                            symbolSize: function (dataItem) {
+                                return dataItem[1] * 3;
+                            }
+                        });
+                    });
+                    data.forEach(function (dataItem) {
+                        series[dataItem[0]].data.push([dataItem[1], dataItem[2]]);
+                    });
+
+                    this.option.title = title
+                    this.option.singleAxis = singleAxis
+                    this.option.series = series
+                    this.chartObj.setOption(this.option);
+                }
+            }
+        }
+    },
+    watch: {
+        courseArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                // newValue = newValue.filter(item => {
+                //     return ['一年级','二年级','三年级','四年级','五年级','六年级','七年级'].indexOf(item.name) !== -1
+                // })
+                this.setJson(newValue)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        // this.courseArray = this.courseArray.filter(item => {
+        //     return ['一年级','二年级','三年级','四年级','五年级','六年级','七年级'].indexOf(item.name) !== -1
+        // })
+
+        this.setJson(this.courseArray)
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+  
+<style scoped>
+.data_body {
+    height: 100%;
+    position: relative;
+    border-radius: 5px;
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>
+  

+ 9 - 0
src/router/index.js

@@ -95,6 +95,7 @@ import teacherSource from '@/components/pages/teacherSource/index'
 import addCourseE from '@/components/pages/easy/addCourse'
 import addCourseT from '@/components/pages/task/addCourse'
 import dataBoard from '@/components/pages/dataBoard'
+import dataBoardSies from '@/components/pages/dataBoardSies'
 import dataBoardNew from '@/components/pages/dataBoardNew'
 import addSynergyCourse from '@/components/pages/synergyCourse/addCourse'
 import synergyCourse from '@/components/pages/synergyCourse/course'
@@ -838,6 +839,14 @@ export default new Router({
                 requireAuth: '' // 不需要鉴权
             }
         },
+        {
+            path: '/dataBoardSies',
+            name: 'dataBoardSies',
+            component: dataBoardSies,
+            meta: {
+                requireAuth: '' // 不需要鉴权
+            }
+        },
         {
             path: '/synergyCourse',
             component: synergyCourse,

Some files were not shown because too many files changed in this diff