فهرست منبع

Merge branch 'develop5.0-tmd' of http://106.12.23.251:10000/TEAMMODEL/TEAMModelOS into develop5.0-tmd

OnePsycho 3 سال پیش
والد
کامیت
95976f6066
24فایلهای تغییر یافته به همراه588 افزوده شده و 457 حذف شده
  1. 2 2
      TEAMModelOS/ClientApp/src/common/BaseLayout.vue
  2. 7 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReport.vue
  3. 166 117
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReportCharts/KeyPointPerformChart.vue
  4. 54 44
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReportCharts/LessonTestReportCharts.vue
  5. 128 123
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReportCharts/RecognizePerformChart.vue
  6. 134 142
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReportCharts/ScoreBarChart.vue
  7. 20 5
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperView.vue
  8. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/en-US/learnActivity.js
  9. 2 0
      TEAMModelOS/ClientApp/src/locale/lang/en-US/notify.js
  10. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/en-US/studentWeb.js
  11. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/learnActivity.js
  12. 2 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/notify.js
  13. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/studentWeb.js
  14. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/learnActivity.js
  15. 2 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/notify.js
  16. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/studentWeb.js
  17. 20 3
      TEAMModelOS/ClientApp/src/view/classmgt/ClassNotice.vue
  18. 1 1
      TEAMModelOS/ClientApp/src/view/classmgt/ClassStudent.less
  19. 12 5
      TEAMModelOS/ClientApp/src/view/classmgt/CreateNotice.vue
  20. 20 6
      TEAMModelOS/ClientApp/src/view/learnactivity/markpaper/MarkData.vue
  21. 0 1
      TEAMModelOS/ClientApp/src/view/login/jinniu/Teacher.vue
  22. 9 5
      TEAMModelOS/ClientApp/src/view/notify/CreateNotify.vue
  23. 2 1
      TEAMModelOS/ClientApp/src/view/task/index.less
  24. 1 1
      TEAMModelOS/ClientApp/src/view/teachermgmt/Index.vue

+ 2 - 2
TEAMModelOS/ClientApp/src/common/BaseLayout.vue

@@ -449,12 +449,12 @@ export default {
                 {
                     icon: 'iconfont icon-class-self',
                     name: this.$t('system.menu.myClass'),
-                    router: '/home/manageClass',
+                    router: '/home/classmgt',
                     tag: '',
                     role: 'teacher',
                     permission: '',
                     child: [],
-                    menuName: 'manageClass',
+                    menuName: 'classmgt',
                     isShow: this.$store.state.userInfo.hasSchool && this.$store.state.userInfo.isHeadmaster
                 },
                 // 我的课程

+ 7 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReport.vue

@@ -117,7 +117,7 @@
                 </i-col>
                 <i-col :xs="24" :sm="24" :md="24" :lg="24">
                     <!-- <Card class="chart-card"> -->
-                        <LessonTestReportCharts></LessonTestReportCharts>
+                        <LessonTestReportCharts :chartsData="chartsData"></LessonTestReportCharts>
                     <!-- </Card> -->
                 </i-col>
             </Row>
@@ -366,6 +366,12 @@
                 default: () => {
                     return {}
                 }
+            },
+            chartsData: {
+                type: Object,
+                default: () => {
+                    return undefined
+                }
             }
         },
         data() {

+ 166 - 117
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReportCharts/KeyPointPerformChart.vue

@@ -1,132 +1,181 @@
 <template>
-  <div class="keyPoint-perform-chart">
-    <h4>{{$t('studentWeb.exam.chart.keyPointPerformance')}}</h4>
-    <apexchart height="400" type="radar" :options="chartOptions" :series="series"></apexchart>
-  </div>
+    <div class="keyPoint-perform-chart">
+        <div>
+            <div id="knowledge" style="width: 306px; height: 380px"></div>
+        </div>
+        <div class="typeAll">
+            <div class="typeDef" @click="changeType(true)">
+                <span :class="{'activeBg': type}"></span>
+                <span>{{ $t("studentWeb.exam.chart.me") }}</span>
+            </div>
+            <div class="typeDef" @click="changeType(false)">
+                <span :class="{'activeBg': !type}"></span>
+                <span>{{ $t("studentWeb.exam.chart.participantClass") }}</span>
+            </div>
+        </div>
+    </div>
 </template>
 
 <script>
-import ApexCharts from "vue-apexcharts";
 export default {
-  name: "KeyPointPerformChart",
-  components: {
-    apexchart: ApexCharts
-  },
-  data() {
-    return {
-      series: [
-        {
-          name: this.$t('studentWeb.exam.chart.me'),
-          //data: [80, 50, 30, 40, 100]
-          data: [0,0,0,0,0]
-        },
-        {
-          name: this.$t('studentWeb.exam.chart.participantClass'),
-          //data: [20, 30, 40, 80, 20]
-            data: [0, 0, 0, 0, 0]
-
-        },
-       
-      ],
-
-      chartOptions: {
-        chart: {
-          height: 500,
-          type: "radar",
-          toolbar: {
-            show: false
-          }
-        },
-        plotOptions: {
-          radar: {
-            polygons: {
-              strokeColor: "#e8e8e8",
-              strokeWidth: 2,
-              fill: {
-                colors: ["#f8f8f8", "#fff"]
-              }
+    name: "KeyPointPerformChart",
+    props: {
+        knowledge: {
+            type: Object,
+            default: () => {
+                return undefined
             }
-          }
-        },
-        fill: {
-          opacity: 0.5,
-          colors: ["rgba(0, 145, 255, 0.8)", "rgba(0, 0, 0, 0.25)"]
-        },
-        stroke: {
-          show: false,
-          width: 2,
-          colors: ["rgba(0, 145, 255, 0.8)", "rgba(0, 0, 0, 0.25)"],
-          dashArray: 0
-        },
-        markers: {
-          size: 2,
-          colors: ["rgba(0, 145, 255, 0.8)", "rgba(0, 0, 0, 0.25)"],
-          hover: {
-            size: 2
-          }
-        },
-
-        tooltip: {
-          custom: function({ series, seriesIndex, dataPointIndex }) {
-            return (
-              '<div class="arrow_box"><span>' +
-              series[seriesIndex][dataPointIndex] +
-              " point</span>" +
-              "</div>"
-            );
-          }
-        },
-        style: {
-          fontSize: "16px",
-          fontFamily: undefined
-        },
-        xaxis: {
-          type: "category",
-          //categories: localStorage.getItem('lang')=='tw'?["內積空間", "向量", "矩陣", "行列式", "線性轉換"]:["Inner product space", "vector", "matrix", "determinant", "linear transformation"],
-            categories: ["知识点1", "知识点2", "知识点3", "知识点4", "知识点5"],
-          labels: {
-            style: {
-              colors: ["#000", "#000", "#000", "#000", "#000"],
-              fontSize: "12px",
-              fontFamily: "Helvetica, Arial, sans-serif",
-              fontWeight: 500
+        }
+    },
+    data() {
+        return {
+            ckps: [], //班级
+            kps: [], //个人
+            type: true, //个人的类型
+        }
+    },
+    methods: {
+        setMap() {
+            let myChart = this.$echarts.init(document.getElementById("knowledge"))
+            let option = {
+                color: [
+                    "#6495ed",
+                    "#87cefa",
+                    "#da70d6",
+                    "#32cd32",
+                    "#ff69b4",
+                    "#ba55d3",
+                    "#cd5c5c",
+                    "#ffa500",
+                    "#40e0d0",
+                    "#1e90ff",
+                    "#ff6347",
+                    "#7b68ee",
+                    "#00fa9a",
+                    "#ffd700",
+                    "#6699FF",
+                    "#ff6666",
+                    "#3cb371",
+                    "#b8860b",
+                    "#30e0e0"
+                ],
+                title: {
+                    text: this.$t("studentWeb.exam.chart.keyPointPerformance"),
+                    left: 'left',
+                    textStyle: {
+                        // fontWeight: "normal",
+                        fontSize: "14",
+                    }
+                },
+                legend: {
+                    data: ["个人", "班级"],
+                    bottom: 0,
+                },
+                tooltip: {
+                    trigger: 'item',
+                    padding: [4, 12],
+                },
+                series: [
+                    {
+                        name: this.$t("studentWeb.exam.chart.keyPointPerformance"),
+                        type: 'pie',
+                        radius: '50%',
+                        /* itemStyle: {
+                            borderRadius: 10,
+                            borderColor: '#fff',
+                            borderWidth: 2
+                        }, */
+                        label: {
+                            show: true,
+                            position: 'outside'
+                        },
+                        emphasis: {
+                            label: {
+                                show: true,
+                                fontSize: '16',
+                                fontWeight: 'bold'
+                            },
+                            itemStyle: {
+                                shadowBlur: 10,
+                                shadowOffsetX: 0,
+                                shadowColor: 'rgba(0, 0, 0, 0.5)'
+                            }
+                        },
+                        labelLine: {
+                            show: true
+                        },
+                        data: this.type ? this.kps : this.ckps
+                    }
+                ]
             }
-          }
+            myChart.setOption(option)
         },
-        dataLabels: {
-          enabled: false
+        getknowledge() {
+            let kps = []
+            let ckps = []
+            this.knowledge.kn.map((item, index) => {
+                kps.push({
+                    value: this.knowledge.kps[index],
+                    name: item
+                })
+                ckps.push({
+                    value: this.knowledge.ckps[index],
+                    name: item
+                })
+            })
+            this.kps = kps
+            this.ckps = ckps
         },
-        legend: {
-          markers: {
-            width: 20,
-            height: 12,
-            strokeWidth: 0,
-            strokeColor: "#fff",
-            fillColors: ["rgba(0, 145, 255, 0.8)", "rgba(0, 0, 0, 0.25)"],
-            radius: 4,
-            customHTML: undefined,
-            onClick: undefined,
-            offsetX: 0,
-            offsetY: 0
-          }
+        changeType(type) {
+            this.type = type
+            this.setMap()
         },
-        title: {
-          text: ""
-        }
-      }
-    };
-  },
-  
-};
+    },
+    mounted () {
+        this.getknowledge()
+        this.setMap()
+    }
+}
 </script>
 
-<style scoped>
+<style lang="less" scoped>
 .keyPoint-perform-chart {
-  width: 100%;
-  margin: auto;
-  margin-bottom: 50px;
-  padding: 15px 40px 0px 40px;
-  height: 420px;
-  color: rgba(0, 0, 0, 0.726);
+    width: 100%;
+    margin: auto;
+    margin-bottom: 50px;
+    padding: 15px 40px 0px 40px;
+    height: 420px;
+    color: rgba(0, 0, 0, 0.726);
+
+    .typeAll{
+        display: flex;
+        justify-content: center;
+
+        &>div:first-child{
+            margin-right: 20px;
+        }
+
+        .typeDef{
+            cursor: pointer;
+            display: flex;
+            align-items: center;
+            font-size: 12px;
+            
+
+            &>span:first-of-type{
+                display: inline-block;
+                background: #ccc;
+                height: 12px;
+                width: 20px;
+                margin-right: 5px;
+                border-radius: 4px;
+            }
+        }
+
+        .activeBg{
+            background-color: #00ad6cd1 !important;
+            // color: white;
+        }
+    }
 }
 </style>

+ 54 - 44
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReportCharts/LessonTestReportCharts.vue

@@ -1,6 +1,6 @@
 <template>
-  <div class="lessontest-report-charts">
-    <!-- <Carousel
+    <div class="lessontest-report-charts">
+        <!-- <Carousel
       v-model="value2"
       :autoplay="setting.autoplay"
       :dots="setting.dots"
@@ -9,57 +9,67 @@
       :arrow="setting.arrow"
     >
       <CarouselItem class="demo-carousel"><ScoreBarChart></ScoreBarChart></CarouselItem> -->
-      <!-- 知识点的类型在LessonTestReport 的 paperInfo.points -->
-      <!-- <CarouselItem class="demo-carousel"><KeyPointPerformChart></KeyPointPerformChart></CarouselItem>
+        <!-- 知识点的类型在LessonTestReport 的 paperInfo.points -->
+        <!-- <CarouselItem class="demo-carousel"><KeyPointPerformChart></KeyPointPerformChart></CarouselItem>
       <CarouselItem class="demo-carousel"><RecognizePerformChart></RecognizePerformChart></CarouselItem>
     </Carousel> -->
-    <Row :gutter="20">
-      <i-col :xs="24" :sm="24" :md="24" :lg="8">
-        <Card>
-          <ScoreBarChart></ScoreBarChart>
-        </Card>
-      </i-col>
-      <i-col :xs="24" :sm="24" :md="24" :lg="8">
-        <Card>
-          <KeyPointPerformChart></KeyPointPerformChart>
-        </Card>
-      </i-col>
-      <i-col :xs="24" :sm="24" :md="24" :lg="8">
-        <Card>
-          <RecognizePerformChart></RecognizePerformChart>
-        </Card>
-      </i-col>
-    </Row>
-  </div>
+        <Row :gutter="20">
+            <i-col :xs="24" :sm="24" :md="24" :lg="8">
+                <Card>
+                    <ScoreBarChart :total="chartsData.total"></ScoreBarChart>
+                </Card>
+            </i-col>
+            <i-col :xs="24" :sm="24" :md="24" :lg="8">
+                <Card>
+                    <KeyPointPerformChart :knowledge="chartsData.knowledge"></KeyPointPerformChart>
+                </Card>
+            </i-col>
+            <i-col :xs="24" :sm="24" :md="24" :lg="8">
+                <Card>
+                    <RecognizePerformChart :filed="chartsData.filed"></RecognizePerformChart>
+                </Card>
+            </i-col>
+        </Row>
+    </div>
 </template>
 
 <script>
-import ScoreBarChart from './ScoreBarChart'
-import KeyPointPerformChart from './KeyPointPerformChart'
-import RecognizePerformChart from './RecognizePerformChart'
+import ScoreBarChart from "./ScoreBarChart"
+import KeyPointPerformChart from "./KeyPointPerformChart"
+import RecognizePerformChart from "./RecognizePerformChart"
 
 export default {
-  name: "LessonTestReportCharts",
-  components:{
-       ScoreBarChart,KeyPointPerformChart,RecognizePerformChart
-  },
-  data() {
-    return {
-      value2: 0,
-      setting: {
-        autoplay: false,
-        dots: "outside",
-        radiusDot: true,
-        trigger: "click",
-        arrow: "always"
-      }
-    };
-  }
-};
+    name: "LessonTestReportCharts",
+    components: {
+        ScoreBarChart,
+        KeyPointPerformChart,
+        RecognizePerformChart,
+    },
+    props: {
+        chartsData: {
+            type: Object,
+            default: () => {
+                return undefined
+            }
+        }
+    },
+    data() {
+        return {
+            value2: 0,
+            setting: {
+                autoplay: false,
+                dots: "outside",
+                radiusDot: true,
+                trigger: "click",
+                arrow: "always",
+            },
+        }
+    },
+}
 </script>
 
 <style scoped>
-.lessontest-report-charts .ivu-carousel-dots.ivu-carousel-dots-outside{
-   bottom:-40px;
+.lessontest-report-charts .ivu-carousel-dots.ivu-carousel-dots-outside {
+    bottom: -40px;
 }
 </style>

+ 128 - 123
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReportCharts/RecognizePerformChart.vue

@@ -1,137 +1,142 @@
 <template>
-  <div class="recognize-perform-chart">
-    <h4>{{$t('studentWeb.exam.chart.recognizePerformance')}}</h4>
-    <apexchart height="380" type="radar" :options="chartOptions" :series="series2"></apexchart>
-  </div>
+    <div class="recognize-perform-chart">
+        <div id="filed" style="width: 306px; height: 400px"></div>
+    </div>
 </template>
 
 <script>
-import ApexCharts from "vue-apexcharts";
 export default {
-  name: "RecognizePerformChart",
-  components: {
-    apexchart: ApexCharts
-  },
-  data() {
-    return {
-      series2: [
-        {
-          name:this.$t('studentWeb.exam.chart.me'),
-              //data: [80, 50, 30, 40, 100, 70]
-            data: [0,0,0,0,0,0]
-        },
-        {
-          name: this.$t('studentWeb.exam.chart.participantClass'),
-          //data: [20, 30, 40, 80, 42, 80]
-            data:[0,0,0,0,0,0]
+    name: "RecognizePerformChart",
+    props: {
+        filed: {
+            type: Object,
+            default: () => {
+                return undefined
+            }
         }
-      ],
-
-      chartOptions: {
-        chart: {
-          height: 480,
-          type: "radar",
-          toolbar: {
-            show: false
-          }
-        },
-        plotOptions: {
-          radar: {
-            polygons: {
-              strokeColor: "#e8e8e8",
-              strokeWidth: 2,
-              fill: {
-                colors: ["#f8f8f8", "#fff"]
-              }
+    },
+    data() {
+        return {
+            cfps: [], //班级
+            fps: [], //个人
+            type: true, //个人的类型
+            categories: [
+                {
+                    name: this.$t("evaluation.level1"),
+                    max: 1
+                },
+                {
+                    name: this.$t("evaluation.level2"),
+                    max: 1
+                },
+                {
+                    name: this.$t("evaluation.level3"),
+                    max: 1
+                },
+                {
+                    name: this.$t("evaluation.level4"),
+                    max: 1
+                },
+                {
+                    name: this.$t("evaluation.level5"),
+                    max: 1
+                },
+                {
+                    name: this.$t("evaluation.level6"),
+                    max: 1
+                }
+            ],
+        }
+    },
+    methods: {
+        setMap() {
+            let myChart = this.$echarts.init(document.getElementById("filed"))
+            let option = {
+                color: ["#5470C6", "#91CC75"],
+                title: {
+                    text: this.$t('studentWeb.exam.chart.recognizePerformance'),
+                    left: 'left',
+                    textStyle: {
+                        // fontWeight: "normal",
+                        fontSize: "14",
+                    }
+                },
+                legend: {
+                    data: ["个人", "班级"],
+                    bottom: 0,
+                },
+                tooltip: {
+                    trigger: 'item',
+                    padding: [4, 12],
+                },
+                radar: {
+                    // shape: 'circle',
+                    indicator: this.categories
+                },
+                series: [
+                    {
+                        name: 'Budget vs spending',
+                        type: 'radar',
+                        data: [
+                            {
+                                value: this.filed.fps,
+                                name: '个人'
+                            },
+                            {
+                                value: this.filed.cfps,
+                                name: '班级'
+                            }
+                        ]
+                    }
+                ],
             }
-          }
-        },
-        fill: {
-          opacity: 0.5,
-          colors: ["rgba(0, 173, 108, 0.82)", "rgba(0, 0, 0, 0.25)"]
-        },
-        stroke: {
-          show: false,
-          width: 2,
-          colors: ["rgba(0, 173, 108, 0.82)", "rgba(0, 0, 0, 0.25)"],
-          dashArray: 0
-        },
-        markers: {
-          size: 2,
-          colors: ["rgba(0, 173, 108, 0.82)", "rgba(0, 0, 0, 0.25)"],
-          hover: {
-            size: 2
-          }
+            myChart.setOption(option)
         },
+    },
+    mounted () {
+        this.setMap()
+    }
+}
+</script>
 
-        tooltip: {
-          custom: function({ series, seriesIndex, dataPointIndex }) {
-            return (
-              '<div class="arrow_box"><span>' +
-              series[seriesIndex][dataPointIndex] +
-              " point</span>" +
-              "</div>"
-            );
-          }
-        },
-        style: {
-          fontSize: "16px",
-          fontFamily: undefined
-        },
-        xaxis: {
-          type: "category",
-          //categories: localStorage.getItem('lang')=='tw'?["知識", "理解", "應用", "分析", "綜合", "評鑑"]:["Knowledge", "Understanding", "Application", "Analysis", "Integration", "Evaluation"],
-          // categories: ["知识", "理解", "应用", "分析", "综合", "评鉴"],
-          categories: [
-            this.$t("evaluation.level1"),
-            this.$t("evaluation.level2"),
-            this.$t("evaluation.level3"),
-            this.$t("evaluation.level4"),
-            this.$t("evaluation.level5"),
-            this.$t("evaluation.level6")
-          ],
-          labels: {
-            style: {
-              colors: ["#000", "#000", "#000", "#000", "#000", "#000"],
-              fontSize: "12px",
-              fontFamily: "Helvetica, Arial, sans-serif",
-              fontWeight: 500
+<style lang="less" scoped>
+.recognize-perform-chart {
+    width: 100%;
+    margin: auto;
+    margin-bottom: 50px;
+    padding: 15px 40px 0px 40px;
+    height: 420px;
+    color: rgba(0, 0, 0, 0.726);
+
+    .typeAll{
+        display: flex;
+        justify-content: center;
+
+        &>div:first-child{
+            margin-right: 20px;
+        }
+
+        .typeDef{
+            cursor: pointer;
+            display: flex;
+            align-items: center;
+            font-size: 12px;
+            
+
+            &>span:first-of-type{
+                display: inline-block;
+                background: #ccc;
+                height: 12px;
+                width: 20px;
+                margin-right: 5px;
+                border-radius: 4px;
             }
-          }
-        },
-        dataLabels: {
-          enabled: false
-        },
-        legend: {
-          markers: {
-            width: 20,
-            height: 12,
-            strokeWidth: 0,
-            strokeColor: "#fff",
-            fillColors: ["rgba(0, 173, 108, 0.82)", "rgba(0, 0, 0, 0.25)"],
-            radius: 4,
-            customHTML: undefined,
-            onClick: undefined,
-            offsetX: 0,
-            offsetY: 0
-          }
-        },
-        title: {
-          text: ""
         }
-      }
-    };
-  }
-};
-</script>
 
-<style scoped>
-.recognize-perform-chart {
-  width: 100%;
-  margin: auto;
-  margin-bottom: 50px;
-  padding: 15px 40px 0px 40px;
-  height: 420px;
-  color: rgba(0, 0, 0, 0.726);
+        .activeBg{
+            background-color: #00ad6cd1 !important;
+            // color: white;
+        }
+    }
 }
 </style>

+ 134 - 142
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReportCharts/ScoreBarChart.vue

@@ -1,164 +1,156 @@
 <template>
-  <div class="score-bar-chart">
-    <h4>{{$t('studentWeb.exam.chart.scoreDistribution')}}</h4>
-    <div class="attendance">
-      {{$t('studentWeb.exam.chart.participant')}}
-      <span class="timeNum">{{Attendance}}</span>
-      / {{parseInt(Attendance) +2}}   {{$t('studentWeb.exam.chart.student')}}
+    <div class="score-bar-chart">
+        <!-- <h4>{{ $t("studentWeb.exam.chart.scoreDistribution") }}</h4> -->
+        <div class="attendance">
+            {{ $t("studentWeb.exam.chart.participant") }}
+            <span class="timeNum">{{ Attendance }}</span><!--  / {{ Attendance }} -->
+            {{ $t("studentWeb.exam.chart.student") }}
+        </div>
+        <!-- <BarChart :option="option" /> -->
+        <!-- <div></div> -->
+        <!-- <img
+            class="avatar"
+            src="https://images.unsplash.com/photo-1520223297779-95bbd1ea79b7?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=60"
+        /> -->
+        <div>
+            <div id="scoreStu" style="width: 306px; height: 400px"></div>
+        </div>
     </div>
-    <BarChart :option="option" />
-    <div>
-    </div>
-    <img class="avatar"  src="https://images.unsplash.com/photo-1520223297779-95bbd1ea79b7?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=60" />
-  </div>
 </template>
 
 <script>
-
-import { BarChart } from "dr-vue-echarts";
-import { Random } from "mockjs";
+import { BarChart } from "dr-vue-echarts"
+import { Random } from "mockjs"
 export default {
-  name: "ScoreBarChart",
-  components: {
-    [BarChart.name]: BarChart
-  },
+    name: "ScoreBarChart",
+    components: {
+        [BarChart.name]: BarChart,
+    },
 
-  computed: {
-    Attendance: function() {
-      var result = 0;
-      for (var i = 0; i < 7; i++) {
-        result += this.option.series[0]["data"][i]["value"];
-      }
-      return result.toFixed(0);
-    }
-  },
- 
-  data() {
-    return {
-      option: {
-        title: {
-          text: ""
+    computed: {
+        Attendance: function () {
+            let att = 0
+            this.total.map(item => {
+                att += item
+            })
+            return att
         },
-        tooltip: {
-          trigger: "item",
-          padding: [4, 12],
-          backgroundColor: "white",
-          textStyle: {
-            color: "black",
-            fontFamily: "Ariel",
-            fontWeight: "bolder"
-          },
-          formatter: localStorage.getItem('lang')=='tw'?'PR前{b0}%: <span class="studyhrs">{c0}</span>人':'PR {b0}%: <span class="studyhrs">{c0} </span> students'
-        },
-        grid: {
-          top: "20%",
-          left: "6%",
-          right: "12%",
-          bottom: "18%",
-          containLabel: true
-        },
-        xAxis: {
-          type: "category",
-          data: ["0-59", "60", "70", "80", "90", "100"],
-          splitLine: {
-            lineStyle: {
-              color: "transparent"
+    },
+    props: {
+        total: {
+            type: Array,
+            default: () => {
+                return []
             }
-          },
-          //座標軸線的設置
-          axisLine: {
-            lineStyle: {
-              color: "gray",
-              width: 2
+        }
+    },
+    data() {
+        return {
+        }
+    },
+    methods: {
+        setMap() {
+            let myChart = this.$echarts.init(document.getElementById("scoreStu"))
+            let option = {
+                title: {
+                    text: this.$t("studentWeb.exam.chart.scoreDistribution"),
+                    left: 'left',
+                    textStyle: {
+                        // fontWeight: "normal",
+                        fontSize: "14",
+                    }
+                },
+                tooltip: {
+                    trigger: "item",
+                    padding: [4, 12],
+                    // backgroundColor: "white",
+                    textStyle: {
+                        // color: "black",
+                        // fontFamily: "Ariel",
+                        // fontWeight: "bolder",
+                    },
+                    formatter: `{b0}${this.$t('studentWeb.exam.chart.score')}: <span>{c0}</span>${this.$t('studentWeb.exam.chart.student')}`,
+                },
+                /* grid: {
+                    top: "20%",
+                    left: "6%",
+                    right: "12%",
+                    bottom: "18%",
+                    containLabel: true,
+                }, */
+                xAxis: {
+                    type: "category",
+                    data: ['0-59', '59-70', '70-80', '80-90', '90-100'],
+                    splitLine: {
+                        lineStyle: {
+                            color: "transparent",
+                        },
+                    },
+                    //座標軸線的設置
+                    axisLine: {
+                        lineStyle: {
+                            color: "gray",
+                            width: 1,
+                        },
+                    },
+                    //座標軸的刻度顏色
+                    axisLabel: {
+                        color: "black",
+                    },
+                },
+                yAxis: {
+                    type: "value",
+                    show: true,
+                    //座標軸線的設置
+                    axisLine: {
+                        lineStyle: {
+                            color: "transparent",
+                        },
+                    },
+                    //座標軸的刻度顏色
+                    axisLabel: {
+                        color: "black",
+                    },
+                },
+                barCategoryGap: "1px",
+                series: [
+                    {
+                        data: this.total,
+                        type: "line",
+                        itemStyle: { color: "#73a373" }
+                    },
+                ],
             }
-          },
-          //座標軸的刻度顏色
-          axisLabel: {
-            color: "black"
-          }
+            myChart.setOption(option)
         },
-        yAxis: {
-          type: "value",
-          show: true,
-          //座標軸線的設置
-          axisLine: {
-            lineStyle: {
-              color: "transparent"
-            }
-          },
-          //座標軸的刻度顏色
-          axisLabel: {
-            color: "black"
-          }
-        },
-        emphasis: {
-          itemStyle: {
-            color: "#FA6400" //高亮
-          }
-        },
-        barCategoryGap: "1px",
-        series: [
-          {
-            data: [
-              {
-                value: 0,
-                itemStyle: { color: "#00AD6C" }
-              },
-              {
-                value: 0,
-                itemStyle: { color: "#008352" }
-              },
-              {
-                value:0,
-                itemStyle: { color: "#008352" }
-              },
-              {
-                value: 0,
-                itemStyle: { color: "rgb(0, 62, 39)" }
-              },
-              {
-                value: 0,
-                itemStyle: { color: "#00AD6C" }
-              },
-              {
-                value:0,
-                itemStyle: { color: "#00AD6C" }
-              },
-              {
-                value:0,
-                itemStyle: { color: "#00AD6C" }
-              }
-            ],
-            type: "bar"
-          }
-        ]
-      }
-    };
-  }
-};
+    },
+    mounted () {
+        this.setMap()
+    }
+}
 </script>
 
 <style scoped>
 .score-bar-chart {
-  width: 100%;
-  margin: auto;
-  margin-bottom: 50px;
-  padding: 15px 40px 0px 40px;
-  height: 420px;
-  color: rgba(0, 0, 0, 0.726);
+    width: 100%;
+    margin: auto;
+    margin-bottom: 50px;
+    padding: 15px 40px 0px 40px;
+    height: 420px;
+    color: rgba(0, 0, 0, 0.726);
 }
 .attendance {
-  position: relative;
-  top: 20px;
-  margin-top: -20px;
-  text-align: right;
-  padding-left: 12%;
+    position: relative;
+    top: 20px;
+    margin-top: -20px;
+    text-align: right;
+    padding-left: 12%;
 }
-.avatar{
-    width:32px;
+.avatar {
+    width: 32px;
     height: 32px;
     position: relative;
-    top:-60px;
-    left:26.5%;
+    top: -60px;
+    left: 26.5%;
 }
 </style>

+ 20 - 5
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperView.vue

@@ -25,8 +25,8 @@
                         <div class="item-box">
                             <div v-for="(item, index) in paperData"
                                  :key="index"
-                                 :class="['paper-item',item.paperId == chooseData.paperId ? 'paper-choose' : '']"
-                                 @click="opentestWithSubject(item)">
+                                 :class="['paper-item',index == activeIndex ? 'paper-choose' : '']"
+                                 @click="opentestWithSubject(item, index)">
                                 <svg-icon icon-class="test" class="title-icon" />
                                 <span style="margin-top:5px">{{ item.subject.name }}{{getItemTitle.scope == 'school' ? $t('studentWeb.exam.isSubject'):''}}</span>
                                 <div v-show="item.stuAns != undefined">
@@ -41,7 +41,7 @@
                         <div v-if="chooseData.subject !== undefined">
                             <!-- <div class="title-rect" /> -->
                             <h2 class="title-rect-name">{{$t("studentWeb.exam.subjectNow")}}:{{chooseData.subject.name}}</h2>
-                            <LessonTestReport :paperInfo="selectData" :examInfo="chooseData" />
+                            <LessonTestReport :paperInfo="selectData" :examInfo="chooseData" :chartsData="chartsData" />
                         </div>
                     </div>
                 </TabPane>
@@ -106,6 +106,9 @@
                 selectTab: "test",
                 paperCtn: null, // 当前评测的scope
                 privateType: null, //评测类型
+                activeIndex: null, //当前科目的下标
+                chartsData: undefined, //单科知识点、认知层次等
+                allCharts: undefined, //知识点、认知层次等
             };
         },
         methods: {
@@ -130,6 +133,12 @@
                         console.log(res)
                         if (res.papers.length) {
                             this.stuData = res
+                            this.allCharts = {
+                                subjects: res.subjects,
+                                filed: res.filed,
+                                knowledge: res.knowledge,
+                                total: res.total
+                            }
                             let resData = res
                             for (let item of resData.papers) {
                                 if (item.scope) {
@@ -175,7 +184,7 @@
                             if (isTest == this.paperData.length) {
                                 this.isTestOver = true
                             }
-                            this.opentestWithSubject(this.paperData[0])
+                            this.opentestWithSubject(this.paperData[0], 0)
                         } else {
                             this.$Modal.confirm({
                                 title: this.$t("studentWeb.exam.delTitle"),
@@ -215,8 +224,14 @@
 					}
                 })
             },
-            opentestWithSubject(item) {
+            opentestWithSubject(item, index) {
                 if (item !== undefined) {
+                    this.activeIndex = index
+                    this.chartsData = {
+                        filed: this.allCharts.filed[index],
+                        knowledge: this.allCharts.knowledge[index],
+                        total: this.allCharts.total[index]
+                    }
                     this.getPaper(item)
                 }
             },

+ 1 - 0
TEAMModelOS/ClientApp/src/locale/lang/en-US/learnActivity.js

@@ -266,6 +266,7 @@ export default {
         assigned: 'Assigned',
         unassigned: 'Not Assigned',
         teaProgress: 'Teaching Marking Progress',
+        exProgress: '異常捲進度',
         schedule: 'Adjust',
         subject: 'Subject',
         stuNum: 'Examinee Number',

+ 2 - 0
TEAMModelOS/ClientApp/src/locale/lang/en-US/notify.js

@@ -35,4 +35,6 @@ export default {
     delErr:'Failed to delete',
     classTitle:'創建班級公告',
     classLabel:'班級',
+    attr:'屬性',
+    isAutoDel:'是否到期自動刪除'
 }

+ 1 - 0
TEAMModelOS/ClientApp/src/locale/lang/en-US/studentWeb.js

@@ -424,6 +424,7 @@ export default {
             scoreDistribution: 'Assessment score distribution map',
             participant: 'Number of examinees:',
             student: 'people',
+            score: '分',
             keyPointPerformance: 'Key Concept performance radar chart',
             me: 'Personal',
             participantClass: 'Whole Class',

+ 1 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/learnActivity.js

@@ -266,6 +266,7 @@ export default {
         assigned: '已分配',
         unassigned: '未分配',
         teaProgress: '教师阅卷进度',
+        exProgress: '异常卷进度',
         schedule: '调度',
         subject: '学科',
         stuNum: '考试人数',

+ 2 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/notify.js

@@ -35,4 +35,6 @@ export default {
     delErr:'删除失败',
     classTitle:'创建班级公告',
     classLabel:'班级',
+    attr:'属性',
+    isAutoDel:'是否到期自动删除'
 }

+ 1 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/studentWeb.js

@@ -424,6 +424,7 @@ export default {
             scoreDistribution: '评量成绩分布图',
             participant: '应考人数:',
             student: '人',
+            score: '分',
             keyPointPerformance: '知识点表现雷达图',
             me: '个人',
             participantClass: '全班',

+ 1 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/learnActivity.js

@@ -266,6 +266,7 @@ export default {
         assigned: '已分配',
         unassigned: '未分配',
         teaProgress: '教師閱卷進度',
+        exProgress: '異常捲進度',
         schedule: '調度',
         subject: '學科',
         stuNum: '考試人數',

+ 2 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/notify.js

@@ -35,4 +35,6 @@ export default {
     delErr:'刪除失敗',
     classTitle:'創建班級公告',
     classLabel:'班級',
+    attr:'屬性',
+    isAutoDel:'是否到期自動刪除'
 }

+ 1 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/studentWeb.js

@@ -424,6 +424,7 @@ export default {
             scoreDistribution: '評量成績分佈圖',
             participant: '應考人數:',
             student: '人',
+            score: '分',
             keyPointPerformance: '知識點表現雷達圖',
             me: '個人',
             participantClass: '全班',

+ 20 - 3
TEAMModelOS/ClientApp/src/view/classmgt/ClassNotice.vue

@@ -102,7 +102,8 @@ export default {
             let params = {
                 admin: "1",
                 code: this.$store.state.userInfo.schoolCode,
-                type: "class"
+                type: "class",
+                classes: this.classList.map(item=>{return item.id})
             }
             this.$api.notice.FindNotice(params).then(
                 res => {
@@ -148,10 +149,26 @@ export default {
                     )
                 }
             })
-        }
+        },
+        //查询自己管理的班级
+        findClass() {
+            this.$store.dispatch('user/getSchoolProfile').then(
+                res => {
+                    if (this.$store.state.userInfo.isHeadmaster) {
+                        let classes = res.school_classes
+                        this.classList = classes.filter(item => {
+                            return this.$store.state.userInfo.mgtClasses.indexOf(item.id) > -1
+                        })
+                        if(this.classList.length){
+                            this.findNotice()
+                        }
+                    }
+                }
+            )
+        },
     },
     created() {
-        this.findNotice()
+        this.findClass()
     }
 }
 </script>

+ 1 - 1
TEAMModelOS/ClientApp/src/view/classmgt/ClassStudent.less

@@ -9,7 +9,7 @@
 
 .mgt-class-container {
     width: 100%;
-    height: 100%;
+    height: ~"calc(100% - 45px)";
 }
 .mgt-class-header{
     width:100%;

+ 12 - 5
TEAMModelOS/ClientApp/src/view/classmgt/CreateNotice.vue

@@ -12,14 +12,17 @@
                 <FormItem prop="date" :label="$t('notify.notifyTime')">
                     <DatePicker v-model="noticeDate" :editable="false" type="daterange" @on-change="getTimestamp" split-panels :placeholder="$t('notify.timeTips')" style="width:100%"></DatePicker>
                 </FormItem>
-                <FormItem prop="target" :label="$t('notify.classLabel')">
-                    <Select v-model="notifyInfo.target" multiple>
+                <FormItem prop="classes" :label="$t('notify.classLabel')">
+                    <Select v-model="notifyInfo.classes" multiple>
                         <Option v-for="item in classList" :value="item.id" :key="item.id">{{ item.name }}</Option>
                     </Select>
                 </FormItem>
                 <FormItem prop="content" :label="$t('notify.notifyContent')">
                     <Input v-model="notifyInfo.content" type="textarea" :maxlength="500" show-word-limit :autosize="{minRows: 5,maxRows: 8}" />
                 </FormItem>
+                <FormItem :label="$t('notify.attr')" style="user-select: none">
+                    <Checkbox v-model="notifyInfo.autoDelete" :true-value="true" :false-value="false">{{$t('notify.isAutoDel')}}</Checkbox>
+                </FormItem>
                 <!-- <FormItem prop="user" label="附件">
                     <Upload multiple type="drag" action="//jsonplaceholder.typicode.com/posts/">
                         <div style="padding: 20px 0">
@@ -67,7 +70,8 @@ export default {
                 startTime: '',
                 endTime: '',
                 files: [],
-                target: []//接受对象
+                autoDelete:true,
+                classes: []//接受对象
             },
             noticeDate: [],
             noticeEditor: undefined,
@@ -81,7 +85,7 @@ export default {
                 content: [
                     { required: true, validator: vContent, trigger: 'change' },
                 ],
-                target: [
+                classes: [
                     { required: true, type: 'array', trigger: 'change' },
                 ],
             }
@@ -173,10 +177,11 @@ export default {
                 startTime: this.notifyInfo.startTime,
                 endTime: this.notifyInfo.endTime,
                 type: 'class',
-                target: this.notifyInfo.target,
+                classes: this.notifyInfo.classes,
                 content: this.notifyInfo.content,
                 title: this.notifyInfo.title,
                 creatorId: this.$store.state.userInfo.TEAMModelId,
+                autoDelete: this.notifyInfo.autoDelete,
                 publish,
                 createTime: new Date().getTime()
             }
@@ -204,6 +209,8 @@ export default {
             this.notifyInfo.startTime = routeData.notice.startTime
             this.notifyInfo.endTime = routeData.notice.endTime
             this.notifyInfo.content = routeData.notice.content
+            this.notifyInfo.classes = routeData.notice.classes
+            this.notifyInfo.autoDelete = routeData.notice.autoDelete
             this.notifyInfo.id = routeData.notice.id
             this.noticeDate = []
             this.noticeDate.push(new Date(this.notifyInfo.startTime))

+ 20 - 6
TEAMModelOS/ClientApp/src/view/learnactivity/markpaper/MarkData.vue

@@ -39,7 +39,6 @@
             <div class="setting-block">
                 <p class="block-title">
                     {{$t('learnActivity.mark.subData')}}
-                    <span style="color:rgb(45, 183, 245)">(预览)</span>
                 </p>
                 <div class="setting-content">
                     <Table :columns="subCol" :data="subData" class="sub-info-table">
@@ -55,6 +54,12 @@
                         <template slot-scope="{ row }" slot="arb">
                             {{ `${row.tarbs}/${row.arbs}` }}
                         </template>
+                        <template slot-scope="{ row }" slot="errTeacher">
+                            <!-- {{ `${row.tqs}/${row.qs}` }} -->
+                        </template>
+                        <template slot-scope="{ row }" slot="arbTeacher">
+                            <!-- {{ `${row.tarbs}/${row.arbs}` }} -->
+                        </template>
                         <template slot-scope="{ row }" slot="status">
                             {{ row.status == 0 ? $t('learnActivity.mark.unassigned') : $t('learnActivity.mark.assigned')}}
                         </template>
@@ -72,7 +77,6 @@
             <div class="setting-block">
                 <p class="block-title">
                     {{$t('learnActivity.mark.teaProgress')}}
-                    <span style="color:rgb(45, 183, 245)">(预览)</span>
                 </p>
                 <div class="setting-content">
                     <Table :columns="teaCol" :data="teaData" class="sub-info-table">
@@ -82,19 +86,18 @@
                         <template slot-scope="{ row }" slot="progress">
                             <div style="display: flex;justify-content: center;">
                                 <i-circle :percent="100" :size="40" :stroke-width="8" :trail-width="7" stroke-color="#5cb85c">
-                                    <!-- <span class="demo-Circle-inner">80%</span> -->
                                     <Icon type="ios-checkmark" size="30" style="color:#5cb85c"></Icon>
                                 </i-circle>
                             </div>
                         </template>
                         <template slot-scope="{ row }" slot="err">
-                            {{ `${row.handleErr}/${row.err}` }}
+                            {{ `${row.quf}/${row.qus}` }}
                         </template>
                         <template slot-scope="{ row }" slot="mark">
                             {{ `${row.handleErr}/${row.err}` }}
                         </template>
                         <template slot-scope="{ row }" slot="arb">
-                            {{ `${row.handleArb}/${row.arb}` }}
+                            {{ `${row.fArbs}/${row.tArbs}` }}
                         </template>
                         <template slot-scope="{ row }" slot="status">
                             {{ row.status == 0 ? $t('learnActivity.mark.unassigned') : $t('learnActivity.mark.assigned') }}
@@ -105,6 +108,7 @@
                     </Table>
                 </div>
             </div>
+            
         </vuescroll>
     </div>
 </template>
@@ -137,11 +141,21 @@ export default {
                     key: 'count',
                     align: 'center'
                 },
+                {
+                    title: '异常卷处理老师',
+                    slot: 'errTeacher',
+                    align: 'center'
+                },
                 {
                     title: this.$t('learnActivity.mark.errDeclare'),
                     slot: 'err',
                     align: 'center'
                 },
+                {
+                    title: '仲裁卷处理老师',
+                    slot: 'arbTeacher',
+                    align: 'center'
+                },
                 {
                     title: this.$t('learnActivity.mark.arbDeclare'),
                     slot: 'arb',
@@ -215,7 +229,7 @@ export default {
                 res => {
                     if (!res.error) {
                         res.sc.forEach(item => {
-                            item.percent = parseFloat((item.cs*100/item.count).toFixed(1))
+                            item.percent = parseFloat((item.cs * 100 / item.count).toFixed(1))
                         })
                         this.subData = res.sc
 

+ 0 - 1
TEAMModelOS/ClientApp/src/view/login/jinniu/Teacher.vue

@@ -469,7 +469,6 @@ export default {
                         schoolCode: result.defaultschool
                     })
                     // this.$router.push({ path: '/home' })
-                    console.log('判断是否跳区级', result.toArea)
                     if (result.toArea) {
                         localStorage.setItem('platform', 'area')
                         this.$router.push({ path: '/area' })

+ 9 - 5
TEAMModelOS/ClientApp/src/view/notify/CreateNotify.vue

@@ -14,7 +14,10 @@
                 </FormItem>
                 <FormItem prop="content" :label="$t('notify.notifyContent')">
                     <!-- <div ref="noticeEditor"></div> -->
-                    <Input v-model="notifyInfo.content" type="textarea" :maxlength="500" show-word-limit :autosize="{minRows: 5,maxRows: 8}"/>
+                    <Input v-model="notifyInfo.content" type="textarea" :maxlength="500" show-word-limit :autosize="{minRows: 5,maxRows: 8}" />
+                </FormItem>
+                <FormItem :label="$t('notify.attr')" style="user-select: none">
+                    <Checkbox v-model="notifyInfo.autoDelete" :true-value="true" :false-value="false">{{$t('notify.isAutoDel')}}</Checkbox>
                 </FormItem>
                 <!-- <FormItem prop="user" label="附件">
                     <Upload multiple type="drag" action="//jsonplaceholder.typicode.com/posts/">
@@ -61,7 +64,7 @@ export default {
                 content: '',
                 startTime: '',
                 endTime: '',
-                files: []
+                autoDelete: true
             },
             noticeDate: [],
             noticeEditor: undefined,
@@ -154,6 +157,7 @@ export default {
                 content: this.notifyInfo.content,
                 title: this.notifyInfo.title,
                 creatorId: this.$store.state.userInfo.TEAMModelId,
+                autoDelete:this.notifyInfo.autoDelete,
                 publish,
                 createTime: new Date().getTime()
             }
@@ -197,11 +201,11 @@ export default {
 .notify-form-wrap .ivu-input {
     // background: #404040;
 }
-.notify-form-wrap{
-    .w-e-menu{
+.notify-form-wrap {
+    .w-e-menu {
         z-index: 100 !important;
     }
-    .w-e-text-container{
+    .w-e-text-container {
         z-index: 99 !important;
     }
 }

+ 2 - 1
TEAMModelOS/ClientApp/src/view/task/index.less

@@ -81,9 +81,10 @@
     margin-top: 40px;
 
     .block-title{
-        border-left: 3px solid var(--tabs-bottom-color);
+        border-left: 2px solid var(--tabs-bottom-color);
         color: var(--tabs-text-color);
         padding-left: 10px;
+        line-height: 12px;
     }
 }
 .setting-block:first-child {

+ 1 - 1
TEAMModelOS/ClientApp/src/view/teachermgmt/Index.vue

@@ -14,7 +14,7 @@
     <div class="mgmt-top">
       <div class="tab-box">
         <span class="pane" @click="paneBtn('userList')" :class="{ active: compts === 'userList' }">{{ $t('teachermgmt.page.text1') }}</span>
-        <span v-if="$store.state.config.srvAdr === 'China'" class="pane" @click="paneBtn('Group')" :class="{ active: compts === 'Group' }">{{ $t('teachermgmt.page.text3') + '23232' }}</span>
+        <span v-if="$store.state.config.srvAdr === 'China'" class="pane" @click="paneBtn('Group')" :class="{ active: compts === 'Group' }">{{ $t('teachermgmt.page.text3')}}</span>
         <span v-if="$access.can('admin.*|teacher-upd')" class="pane" @click="paneBtn('personnel')" :class="{ active: compts === 'personnel' }">{{ $t('teachermgmt.page.text2') }} <Badge :count="requestedUserCount" class-name="badgesty"></Badge></span>
       </div>
     </div>