浏览代码

Merge branch 'develop3.0-tmd' of http://106.12.23.251:10080/TEAMMODEL/TEAMModelOS into develop3.0-tmd

zhouj1203@hotmail.com 4 年之前
父节点
当前提交
83f628eafb
共有 46 个文件被更改,包括 2215 次插入1906 次删除
  1. 1 1
      TEAMModelOS.SDK/Models/Cosmos/Common/Inner/Repair.cs
  2. 37 0
      TEAMModelOS.SDK/Models/Cosmos/School/Knowledge.cs
  3. 415 419
      TEAMModelOS/ClientApp/src/components/selflearn/ExerciseList.vue
  4. 555 596
      TEAMModelOS/ClientApp/src/components/selflearn/NewChooseContent.vue
  5. 10 0
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseKnowledgeDetail.vue
  6. 0 1
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseKnowledgeRadar.vue
  7. 97 94
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseLevelPie.vue
  8. 160 164
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseLevelRadar.vue
  9. 1 1
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseScatter.vue
  10. 7 11
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReport.vue
  11. 4 1
      TEAMModelOS/ClientApp/src/locale/lang/en-US/schoolBaseInfo.js
  12. 1 1
      TEAMModelOS/ClientApp/src/locale/lang/en-US/totalAnalysis.js
  13. 6 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/evaluation.js
  14. 4 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolBaseInfo.js
  15. 3 3
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/totalAnalysis.js
  16. 6 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/evaluation.js
  17. 4 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/schoolBaseInfo.js
  18. 231 231
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/totalAnalysis.js
  19. 43 10
      TEAMModelOS/ClientApp/src/utils/blobTool.js
  20. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseDiffPie.vue
  21. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseObjectivePie.vue
  22. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/components/BasePointPie.vue
  23. 6 0
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseRepair.vue
  24. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseTypePie.vue
  25. 4 4
      TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.vue
  26. 1 0
      TEAMModelOS/ClientApp/src/view/learnactivity/PaperScore.less
  27. 0 7
      TEAMModelOS/ClientApp/src/view/learnactivity/PaperScore.vue
  28. 59 7
      TEAMModelOS/ClientApp/src/view/learnactivity/Scoring.vue
  29. 18 6
      TEAMModelOS/ClientApp/src/view/learnactivity/SimpleAnalysis.vue
  30. 3 0
      TEAMModelOS/ClientApp/src/view/schoolmgmt/ClassroomSetting/ClassroomSetting.less
  31. 90 32
      TEAMModelOS/ClientApp/src/view/schoolmgmt/ClassroomSetting/ClassroomSetting.vue
  32. 1 4
      TEAMModelOS/ClientApp/src/view/student-account/Index.vue
  33. 1 1
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue
  34. 5 5
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.vue
  35. 13 3
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/KnowledgeAnalysis.vue
  36. 2 2
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue
  37. 13 2
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/LevelAnalysis.vue
  38. 217 197
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue
  39. 2 0
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue
  40. 8 3
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue
  41. 46 33
      TEAMModelOS/ClientApp/src/view/teachcontent/index.vue
  42. 45 56
      TEAMModelOS/Controllers/Core/ImportController.cs
  43. 6 0
      TEAMModelOS/JsonFile/Core/LangConfig.json
  44. 79 0
      TEAMModelOS/JsonFile/Core/LangConfigV3.json
  45. 6 3
      TEAMModelOS/Startup.cs
  46. 1 2
      TEAMModelOS/TEAMModelOS.csproj

+ 1 - 1
TEAMModelOS.SDK/Models/Cosmos/Common/Inner/Repair.cs

@@ -12,7 +12,7 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Common.Inner
         /// <summary>
         /// 文件名字
         /// </summary>
-        //public string name { get; set; }
+        public string name { get; set; }
         /// <summary>
         /// 补救资源绝对地址
         /// </summary>

+ 37 - 0
TEAMModelOS.SDK/Models/Cosmos/School/Knowledge.cs

@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Models.Cosmos.School
+{
+    /// <summary>
+    ///Teaching materials 教学材料 --- 知识点,知识块
+    /// </summary>    
+    public class Knowledge : CosmosEntity
+    {
+        public Knowledge() {
+            points = new List<string>();
+            blocks = new List<CodeValue>();
+            pk = "Knowledge";
+        }
+
+        public string scope { get; set; }
+        /// <summary>
+        /// 学段id
+        /// </summary>
+        public string periodId { get; set; }
+        /// <summary>
+        /// 学科id
+        /// </summary>
+        public string subjectId { get; set; }
+        /// <summary>
+        /// 知识点
+        /// </summary>
+        public List<string> points { get; set; }
+        /// <summary>
+        /// 知识块
+        /// </summary>
+        public List<CodeValue> blocks { get; set; }
+
+    }
+}

+ 415 - 419
TEAMModelOS/ClientApp/src/components/selflearn/ExerciseList.vue

@@ -122,10 +122,7 @@
                                     </div>
                                     <!-- 其余题型答案 -->
                                     <div v-else>
-                                        <span :class="[
-                        item.type === 'complete' ? 'item-answer-item' : '',
-                      ]"
-                                              v-for="(answer, index) in item.answer" :key="index">{{ answer }}</span>
+                                        <span :class="[item.type === 'complete' ? 'item-answer-item' : '',]" v-for="(answer, index) in item.answer" :key="index">{{ answer }}</span>
                                     </div>
                                 </div>
                             </div>
@@ -140,7 +137,7 @@
                             <div class="item-explain">
                                 <span class="explain-title">【知识点】</span>
                                 <div class="item-explain-details">
-                                    <span v-if="!item.points.length">暂未绑定知识点</span>
+                                    <span v-if="!item.points">暂未绑定知识点</span>
                                     <div v-else>
                                         <span v-for="(point, index) in item.points" class="item-point-tag" :key="index">
                                             {{ point }}
@@ -181,441 +178,440 @@
         </Modal>
 
         <!-- 底部分页区域 -->
-        <Page :total="totalNum" show-sizer show-total :page-size="pageSize" :current="pageNum" @on-page-size-change="pageSizeChange"
-              @on-change="pageChange" :page-size-opts="[5, 10, 15, 20]" />
+        <Page :total="totalNum" show-sizer show-total :page-size="pageSize" :current="pageNum" @on-page-size-change="pageSizeChange" @on-change="pageChange" :page-size-opts="[5, 10, 15, 20]" />
     </div>
 </template>
 <script>
-    import blobTool from "@/utils/blobTool.js";
-
-    export default {
-        data() {
-            return {
-                userId: "",
-                schoolCode: "",
-                dataLoading: false,
-                exerciseList: [],
-                schoolInfo: {},
-                exersicesType: this.$GLOBAL.EXERCISE_TYPES(),
-                exersicesDiff: this.$GLOBAL.EXERCISE_DIFFS(),
-                exersicesField: this.$GLOBAL.EXERCISE_LEVELS(),
-                diffColors: ["#32CF74", "#E8BE15", "#F19300", "#EB5E00", "#D30000"],
-                filterType: ["all"],
-                filterOrigin: "",
-                filterDiff: ["all"],
-                filterField: ["all"],
-                filterSort: "createTime",
-                filterPeriod: 0,
-                filterGrade: [false],
-                filterSubject: [false],
-                totalNum: 0,
-                pageSize: 20,
-                pageNum: 1,
-                currentPage: 1,
-                collapseList: [],
-                periodList: [],
-                gradeList: [],
-                subjectList: [],
-                filterParams: {},
-                allPointList: [],
-                originData: [],
-                playAudioModal: false,
-                playVideoModal: false,
-                curAudioSrc: "",
-                curAudioName: "",
-                curVideoSrc: "",
-                curVideoName: "",
-            };
+import blobTool from "@/utils/blobTool.js";
+
+export default {
+    data() {
+        return {
+            userId: "",
+            schoolCode: "",
+            dataLoading: false,
+            exerciseList: [],
+            schoolInfo: {},
+            exersicesType: this.$GLOBAL.EXERCISE_TYPES(),
+            exersicesDiff: this.$GLOBAL.EXERCISE_DIFFS(),
+            exersicesField: this.$GLOBAL.EXERCISE_LEVELS(),
+            diffColors: ["#32CF74", "#E8BE15", "#F19300", "#EB5E00", "#D30000"],
+            filterType: ["all"],
+            filterOrigin: "",
+            filterDiff: ["all"],
+            filterField: ["all"],
+            filterSort: "createTime",
+            filterPeriod: 0,
+            filterGrade: [false],
+            filterSubject: [false],
+            totalNum: 0,
+            pageSize: 20,
+            pageNum: 1,
+            currentPage: 1,
+            collapseList: [],
+            periodList: [],
+            gradeList: [],
+            subjectList: [],
+            filterParams: {},
+            allPointList: [],
+            originData: [],
+            playAudioModal: false,
+            playVideoModal: false,
+            curAudioSrc: "",
+            curAudioName: "",
+            curVideoSrc: "",
+            curVideoName: "",
+        };
+    },
+    created() {
+        this.getSchoolInfo()
+    },
+    methods: {
+        /* 音频弹窗切换事件 */
+        onAudioModalChange(val) {
+            if (!val) {
+                this.$refs.audioPlayer.onCloseAudio();
+            }
         },
-        created() {
-            this.getSchoolInfo()
+
+        /* 视频弹窗切换事件 */
+        onVideoModalChange(val) {
+            if (!val) {
+                this.$refs.videoPlayer.onCloseAudio();
+            }
         },
-        methods: {
-            /* 音频弹窗切换事件 */
-            onAudioModalChange(val) {
-                if (!val) {
-                    this.$refs.audioPlayer.onCloseAudio();
-                }
-            },
 
-            /* 视频弹窗切换事件 */
-            onVideoModalChange(val) {
-                if (!val) {
-                    this.$refs.videoPlayer.onCloseAudio();
-                }
-            },
-
-            /* 音频点击播放事件 */
-            onRichTextClick(e) {
-                // e.stopPropagation()
-                let sasString = JSON.parse(
-                    decodeURIComponent(localStorage.getItem("user_profile"))
-                ).blob_sas;
-                // console.log(JSON.parse(decodeURIComponent(localStorage.getItem('school_profile'))))
-                if (e.srcElement.classList[0] === "richText-audio") {
-                    this.playAudioModal = true;
-                    this.curAudioSrc = e.srcElement.dataset.url;
-                    this.curAudioName = e.srcElement.dataset.name;
-                } else if (e.srcElement.classList[0] === "richText-video") {
-                    this.playVideoModal = true;
-                    this.curVideoSrc =
-                        e.srcElement.dataset.url.split("?")[0] + "?" + sasString;
-                    console.log(this.curVideoSrc);
-                    this.curVideoName = e.srcElement.dataset.name;
-                }
-            },
-
-            /** 获取区班校信息 */
-            getSchoolInfo() {
-                this.dataLoading = true;
-                this.$store.dispatch("user/getSchoolProfile").then((res) => {
-                    let schoolBaseInfo = res.school_base;
-                    if (schoolBaseInfo) {
-                        this.schoolInfo = schoolBaseInfo;
-                        this.schoolCode = schoolBaseInfo.id;
-                        this.userId = this.$store.state.userInfo.TEAMModelId;
-                        this.filterOrigin = this.$store.state.userInfo.TEAMModelId;
-                        this.periodList = schoolBaseInfo.period;
-                        console.log('periodList:', this.periodList)
-                        if (schoolBaseInfo.period.length) {
-                            this.gradeList = schoolBaseInfo.period[0].grades;
-                            this.subjectList = schoolBaseInfo.period[0].subjects;
-                        }
-                        this.doFilter();
+        /* 音频点击播放事件 */
+        onRichTextClick(e) {
+            // e.stopPropagation()
+            let sasString = JSON.parse(
+                decodeURIComponent(localStorage.getItem("user_profile"))
+            ).blob_sas;
+            // console.log(JSON.parse(decodeURIComponent(localStorage.getItem('school_profile'))))
+            if (e.srcElement.classList[0] === "richText-audio") {
+                this.playAudioModal = true;
+                this.curAudioSrc = e.srcElement.dataset.url;
+                this.curAudioName = e.srcElement.dataset.name;
+            } else if (e.srcElement.classList[0] === "richText-video") {
+                this.playVideoModal = true;
+                this.curVideoSrc =
+                    e.srcElement.dataset.url.split("?")[0] + "?" + sasString;
+                console.log(this.curVideoSrc);
+                this.curVideoName = e.srcElement.dataset.name;
+            }
+        },
+
+        /** 获取区班校信息 */
+        getSchoolInfo() {
+            this.dataLoading = true;
+            this.$store.dispatch("user/getSchoolProfile").then((res) => {
+                let schoolBaseInfo = res.school_base;
+                if (schoolBaseInfo) {
+                    this.schoolInfo = schoolBaseInfo;
+                    this.schoolCode = schoolBaseInfo.id;
+                    this.userId = this.$store.state.userInfo.TEAMModelId;
+                    this.filterOrigin = this.$store.state.userInfo.TEAMModelId;
+                    this.periodList = schoolBaseInfo.period;
+                    console.log('periodList:', this.periodList)
+                    if (schoolBaseInfo.period.length) {
+                        this.gradeList = schoolBaseInfo.period[0].grades;
+                        this.subjectList = schoolBaseInfo.period[0].subjects;
                     }
-                });
-            },
-
-            /* 获取BLOB所有试题LIST */
-            async getBlobOrigin() {
-                // 获取初始化Blob需要的数据
-                let sasData = await this.$tools.getPrivateSas();
-                //初始化Blob
-                let containerClient = new blobTool(
-                    sasData.url,
-                    sasData.name,
-                    sasData.sas,
-                    "private"
-                );
-                // 等待blob的返回结果
-                containerClient
-                    .listBlob({
-                        prefix: "paper",
-                    })
-                    .then(
-                        (res) => {
-                            console.log(res);
-                        },
-                        (err) => {
-                            this.$Message.error("API Error");
-                        }
-                    );
-            },
-
-            /** 执行筛选条件获取数据 */
-            doFilter() {
-                this.dataLoading = true;
-                this.collapseList = []; // 所有详情都收起来
-                /** 定义查询接口的参数规格 */
-                this.filterParams = {
-                    // '@CURRPAGE': this.pageNum,
-                    // '@PAGESIZE': this.pageSize,
-                    "@DESC": this.filterSort,
-                    code: this.filterOrigin,
-                    periodId: this.filterOrigin == this.schoolCode ? [this.periodList[this.filterPeriod].id] : [],
-                    "gradeIds[*]": this.filterOrigin == this.schoolCode ? this.deleteFalse(this.filterGrade) : [],
-                    subjectId: this.filterOrigin == this.schoolCode ? this.deleteFalse(this.filterSubject) : [],
-                    level: this.deleteFalse(this.filterDiff),
-                    type: this.deleteFalse(this.filterType),
-                    field: this.deleteFalse(this.filterField),
-                    scope: this.curScope,
-                };
-                this.getExerciseList(this.filterParams);
-            },
-
-            /**
-             * 获取最新题库列表
-             * @param data
-             */
-            async getExerciseList(data) {
-                let that = this;
-                this.$api.newEvaluation.FindExerciseList(data).then(async (res) => {
-                    let list = res.items;
-                    /* 获取试题总数 */
-                    this.totalNum = res.items.length;
-                    /* 查找当前页面所有知识点ID换名称 */
-                    // this.getPointsByIds(this.getPointIds(list)).then(res => {
-                    // 	this.allPointList = res
-                    // })
-                    this.exerciseList = list;
-                    this.originData = list;
-                    this.pageChange(1);
-
-                    setTimeout(() => {
-                        that.dataLoading = false;
-                    }, 1000);
-                });
-            },
-
-            /**
-             * 拿到当前页面所有知识点集合
-             * @param arr
-             */
-            getPointIds(arr) {
-                let ids = [];
-                arr.forEach((i) => {
-                    ids = ids.concat(i.points);
-                });
-                return [...new Set(ids)];
-            },
-
-            /**
-             * 根据知识点id集合换取知识点对象集合
-             * @param ids
-             */
-            getPointsByIds(ids) {
-                if (typeof ids[0] !== "string") {
-                    ids = ids.map((item) => item.id);
+                    this.doFilter();
                 }
-                return new Promise((r, j) => {
-                    if (ids.length) {
-                        this.$api.knowledge
-                            .FindKnowledgebyId(ids)
-                            .then((res) => {
-                                if (!res.error && res.result.data.length) {
-                                    r(res.result.data);
-                                } else {
-                                    r([]);
-                                }
-                            })
-                            .catch((err) => {
-                                j(err);
-                            });
-                    } else {
-                        r([]);
+            });
+        },
+
+        /* 获取BLOB所有试题LIST */
+        async getBlobOrigin() {
+            // 获取初始化Blob需要的数据
+            let sasData = await this.$tools.getPrivateSas();
+            //初始化Blob
+            let containerClient = new blobTool(
+                sasData.url,
+                sasData.name,
+                sasData.sas,
+                "private"
+            );
+            // 等待blob的返回结果
+            containerClient
+                .listBlob({
+                    prefix: "paper",
+                })
+                .then(
+                    (res) => {
+                        console.log(res);
+                    },
+                    (err) => {
+                        this.$Message.error("API Error");
                     }
-                });
-            },
-
-            /**
-             * 题干展开与收缩
-             * @param index
-             * @param id
-             */
-            onQuestionToggle(index, id, e) {
-                let curClassName = e.target.className;
-                console.log(curClassName);
-                if (
-                    curClassName === "item-tools" ||
-                    curClassName === "richText-video" ||
-                    curClassName === "richText-audio"
-                )
-                    return;
-                e.stopPropagation();
-                let listIndex = this.collapseList.indexOf(index);
-                if (listIndex > -1) {
-                    this.collapseList.splice(listIndex, 1);
+                );
+        },
+
+        /** 执行筛选条件获取数据 */
+        doFilter() {
+            this.dataLoading = true;
+            this.collapseList = []; // 所有详情都收起来
+            /** 定义查询接口的参数规格 */
+            this.filterParams = {
+                // '@CURRPAGE': this.pageNum,
+                // '@PAGESIZE': this.pageSize,
+                "@DESC": this.filterSort,
+                code: this.filterOrigin,
+                periodId: this.filterOrigin == this.schoolCode ? [this.periodList[this.filterPeriod].id] : [],
+                "gradeIds[*]": this.filterOrigin == this.schoolCode ? this.deleteFalse(this.filterGrade) : [],
+                subjectId: this.filterOrigin == this.schoolCode ? this.deleteFalse(this.filterSubject) : [],
+                level: this.deleteFalse(this.filterDiff),
+                type: this.deleteFalse(this.filterType),
+                field: this.deleteFalse(this.filterField),
+                scope: this.curScope,
+            };
+            this.getExerciseList(this.filterParams);
+        },
+
+        /**
+         * 获取最新题库列表
+         * @param data
+         */
+        async getExerciseList(data) {
+            let that = this;
+            this.$api.newEvaluation.FindExerciseList(data).then(async (res) => {
+                let list = res.items;
+                /* 获取试题总数 */
+                this.totalNum = res.items.length;
+                /* 查找当前页面所有知识点ID换名称 */
+                // this.getPointsByIds(this.getPointIds(list)).then(res => {
+                // 	this.allPointList = res
+                // })
+                this.exerciseList = list;
+                this.originData = list;
+                this.pageChange(1);
+
+                setTimeout(() => {
+                    that.dataLoading = false;
+                }, 1000);
+            });
+        },
+
+        /**
+         * 拿到当前页面所有知识点集合
+         * @param arr
+         */
+        getPointIds(arr) {
+            let ids = [];
+            arr.forEach((i) => {
+                ids = ids.concat(i.points);
+            });
+            return [...new Set(ids)];
+        },
+
+        /**
+         * 根据知识点id集合换取知识点对象集合
+         * @param ids
+         */
+        getPointsByIds(ids) {
+            if (typeof ids[0] !== "string") {
+                ids = ids.map((item) => item.id);
+            }
+            return new Promise((r, j) => {
+                if (ids.length) {
+                    this.$api.knowledge
+                        .FindKnowledgebyId(ids)
+                        .then((res) => {
+                            if (!res.error && res.result.data.length) {
+                                r(res.result.data);
+                            } else {
+                                r([]);
+                            }
+                        })
+                        .catch((err) => {
+                            j(err);
+                        });
                 } else {
-                    this.collapseList.push(index);
-                    let exerciseItemDom = e.path.filter(
-                        (i) => i.className === "exercise-item"
-                    );
+                    r([]);
                 }
+            });
+        },
+
+        /**
+         * 题干展开与收缩
+         * @param index
+         * @param id
+         */
+        onQuestionToggle(index, id, e) {
+            let curClassName = e.target.className;
+            console.log(curClassName);
+            if (
+                curClassName === "item-tools" ||
+                curClassName === "richText-video" ||
+                curClassName === "richText-audio"
+            )
+                return;
+            e.stopPropagation();
+            let listIndex = this.collapseList.indexOf(index);
+            if (listIndex > -1) {
+                this.collapseList.splice(listIndex, 1);
+            } else {
+                this.collapseList.push(index);
+                let exerciseItemDom = e.path.filter(
+                    (i) => i.className === "exercise-item"
+                );
+            }
+
+            this.$emit("toggleChange", this.collapseList);
+        },
+
+        /**
+         * 筛选学段条件
+         * @param val
+         */
+        filterPeriodChange(val) {
+            // this.filterPeriod = this.periodList[val].periodCode
+            this.gradeList = this.schoolInfo.period[val].grades;
+            this.subjectList = this.schoolInfo.period[val].subjects;
+            this.filterGrade = [false];
+            this.filterSubject = [false];
+            this.doFilter();
+        },
 
-                this.$emit("toggleChange", this.collapseList);
-            },
-
-            /**
-             * 筛选学段条件
-             * @param val
-             */
-            filterPeriodChange(val) {
-                // this.filterPeriod = this.periodList[val].periodCode
-                this.gradeList = this.schoolInfo.period[val].grades;
-                this.subjectList = this.schoolInfo.period[val].subjects;
+        /**
+         * 筛选年级
+         * @param val
+         */
+        filterGradeChange(val) {
+            if (val.length > 1 && val.indexOf(false) === 0) {
+                this.filterGrade.splice(val.indexOf(false), 1);
+            } else if (val.indexOf(false) > -1 || val.length === 0) {
                 this.filterGrade = [false];
+            }
+            this.doFilter();
+        },
+
+        /**
+         * 筛选科目
+         * @param val
+         */
+        filterSubjectChange(val) {
+            if (val.length > 1 && val.indexOf(false) === 0) {
+                this.filterSubject.splice(val.indexOf(false), 1);
+            } else if (val.indexOf(false) > -1 || val.length === 0) {
                 this.filterSubject = [false];
-                this.doFilter();
-            },
-
-            /**
-             * 筛选年级
-             * @param val
-             */
-            filterGradeChange(val) {
-                if (val.length > 1 && val.indexOf(false) === 0) {
-                    this.filterGrade.splice(val.indexOf(false), 1);
-                } else if (val.indexOf(false) > -1 || val.length === 0) {
-                    this.filterGrade = [false];
-                }
-                this.doFilter();
-            },
-
-            /**
-             * 筛选科目
-             * @param val
-             */
-            filterSubjectChange(val) {
-                if (val.length > 1 && val.indexOf(false) === 0) {
-                    this.filterSubject.splice(val.indexOf(false), 1);
-                } else if (val.indexOf(false) > -1 || val.length === 0) {
-                    this.filterSubject = [false];
-                }
-                this.doFilter();
-            },
-
-            /**
-             * 根据题库加载题目
-             * @param val
-             */
-            filterOriginChange(origin) {
-                this.filterOrigin = origin;
-                this.doFilter();
-            },
-
-            /**
-             * 筛选题型
-             * @param val
-             */
-            filterTypeChange(val) {
-                if (val.length > 1 && val.indexOf("all") === 0) {
-                    this.filterType.splice(val.indexOf("all"), 1);
-                } else if (val.indexOf("all") > -1 || val.length === 0) {
-                    this.filterType = ["all"];
-                }
-                this.doFilter();
-            },
-
-            /**
-             * 筛选难度
-             * @param val
-             */
-            filterDiffChange(val) {
-                if (val.length > 1 && val.indexOf("all") === 0) {
-                    this.filterDiff.splice(val.indexOf("all"), 1);
-                } else if (val.indexOf("all") > -1 || val.length === 0) {
-                    this.filterDiff = ["all"];
-                }
-                this.doFilter();
-            },
-
-            /**
-             * 筛选认知层次
-             * @param val
-             */
-            filterFieldChange(val) {
-                if (val.length > 1 && val.indexOf("all") === 0) {
-                    this.filterField.splice(val.indexOf("all"), 1);
-                } else if (val.indexOf("all") > -1 || val.length === 0) {
-                    this.filterField = ["all"];
-                }
-                this.doFilter();
-            },
-
-            /**
-             * 排序条件更换
-             * @param val
-             */
-            filterSortChange(val) {
-                this.doFilter();
-            },
-
-            /**
-             * 删除筛选条件里面的False值与All值
-             * @param arr
-             */
-            deleteFalse(arr) {
-                let list = JSON.parse(JSON.stringify(arr));
-                list.forEach((item, index) => {
-                    if (!item || item === "all") list.splice(index, 1);
-                });
-                return list;
-            },
-
-            /**
-             * 切换页码操作
-             * @param page
-             */
-            async pageChange(page) {
-                this.pageNum = page;
-                let start = this.pageSize * (page - 1);
-                let end = this.pageSize * page;
-                // 拿到当前页码需要展示的数据
-                let simpleList = this.originData.slice(start, end);
-                try {
-                    // 执行试题换取完整JSON数据
-                    this.exerciseList = await this.$evTools.getFullItem(simpleList);
-                    this.currentPage = page;
-                    // 公式渲染
-                    this.$nextTick(() => {
-                        this.$MathJax.MathQueue(this.$refs.mathJaxContainer);
-                    });
-                } catch (e) {
-                    console.log(e);
-                }
-            },
-
-            /**
-             * 切换每页显示数量
-             * @param val
-             */
-            pageSizeChange(val) {
-                this.pageSize = val;
-                this.pageChange(1);
-            },
-            
+            }
+            this.doFilter();
         },
-        mounted() {
-            // 公式渲染
-            this.$nextTick(() => {
-                window.MathJax.Hub.Queue([
-                    "Typeset",
-                    MathJax.Hub,
-                    this.$refs.mathJaxContainer,
-                ]);
+
+        /**
+         * 根据题库加载题目
+         * @param val
+         */
+        filterOriginChange(origin) {
+            this.filterOrigin = origin;
+            this.doFilter();
+        },
+
+        /**
+         * 筛选题型
+         * @param val
+         */
+        filterTypeChange(val) {
+            if (val.length > 1 && val.indexOf("all") === 0) {
+                this.filterType.splice(val.indexOf("all"), 1);
+            } else if (val.indexOf("all") > -1 || val.length === 0) {
+                this.filterType = ["all"];
+            }
+            this.doFilter();
+        },
+
+        /**
+         * 筛选难度
+         * @param val
+         */
+        filterDiffChange(val) {
+            if (val.length > 1 && val.indexOf("all") === 0) {
+                this.filterDiff.splice(val.indexOf("all"), 1);
+            } else if (val.indexOf("all") > -1 || val.length === 0) {
+                this.filterDiff = ["all"];
+            }
+            this.doFilter();
+        },
+
+        /**
+         * 筛选认知层次
+         * @param val
+         */
+        filterFieldChange(val) {
+            if (val.length > 1 && val.indexOf("all") === 0) {
+                this.filterField.splice(val.indexOf("all"), 1);
+            } else if (val.indexOf("all") > -1 || val.length === 0) {
+                this.filterField = ["all"];
+            }
+            this.doFilter();
+        },
+
+        /**
+         * 排序条件更换
+         * @param val
+         */
+        filterSortChange(val) {
+            this.doFilter();
+        },
+
+        /**
+         * 删除筛选条件里面的False值与All值
+         * @param arr
+         */
+        deleteFalse(arr) {
+            let list = JSON.parse(JSON.stringify(arr));
+            list.forEach((item, index) => {
+                if (!item || item === "all") list.splice(index, 1);
             });
+            return list;
         },
-        computed: {
-            headers() {
-                let hd = {};
-                hd["Authorization"] = "Bearer " + localStorage.getItem("token");
-                return hd;
-            },
-            curScope() {
-                return this.filterOrigin === this.$store.state.userInfo.schoolCode ?
-                    "school" :
-                    "private";
-            },
-            hasSchool() {
-                return this.$store.state.userInfo.hasSchool;
-            },
+
+        /**
+         * 切换页码操作
+         * @param page
+         */
+        async pageChange(page) {
+            this.pageNum = page;
+            let start = this.pageSize * (page - 1);
+            let end = this.pageSize * page;
+            // 拿到当前页码需要展示的数据
+            let simpleList = this.originData.slice(start, end);
+            try {
+                // 执行试题换取完整JSON数据
+                this.exerciseList = await this.$evTools.getFullItem(simpleList);
+                this.currentPage = page;
+                // 公式渲染
+                this.$nextTick(() => {
+                    this.$MathJax.MathQueue(this.$refs.mathJaxContainer);
+                });
+            } catch (e) {
+                console.log(e);
+            }
         },
-    };
+
+        /**
+         * 切换每页显示数量
+         * @param val
+         */
+        pageSizeChange(val) {
+            this.pageSize = val;
+            this.pageChange(1);
+        },
+
+    },
+    mounted() {
+        // 公式渲染
+        this.$nextTick(() => {
+            window.MathJax.Hub.Queue([
+                "Typeset",
+                MathJax.Hub,
+                this.$refs.mathJaxContainer,
+            ]);
+        });
+    },
+    computed: {
+        headers() {
+            let hd = {};
+            hd["Authorization"] = "Bearer " + localStorage.getItem("token");
+            return hd;
+        },
+        curScope() {
+            return this.filterOrigin === this.$store.state.userInfo.schoolCode ?
+                "school" :
+                "private";
+        },
+        hasSchool() {
+            return this.$store.state.userInfo.hasSchool;
+        },
+    },
+};
 </script>
 <style scoped lang="less">
-    @import "./ExerciseList.less";
+@import "./ExerciseList.less";
 </style>
 
 <style>
-    .circle {
-        border: solid 1px red;
-        background-color: red;
-        border-radius: 50%;
-        width: 50px;
-        height: 50px;
-    }
-
-    .slide-enter-active {
-        transition: all 0.3s ease;
-    }
-
-    .slide-leave-active {
-        transition: all 0.3s ease;
-    }
-
-    .slide-enter,
-    .slide-leave-to {
-        transform: translateY(10px);
-        opacity: 0;
-    }
+.circle {
+    border: solid 1px red;
+    background-color: red;
+    border-radius: 50%;
+    width: 50px;
+    height: 50px;
+}
+
+.slide-enter-active {
+    transition: all 0.3s ease;
+}
+
+.slide-leave-active {
+    transition: all 0.3s ease;
+}
+
+.slide-enter,
+.slide-leave-to {
+    transform: translateY(10px);
+    opacity: 0;
+}
 </style>

文件差异内容过多而无法显示
+ 555 - 596
TEAMModelOS/ClientApp/src/components/selflearn/NewChooseContent.vue


+ 10 - 0
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseKnowledgeDetail.vue

@@ -236,6 +236,16 @@
 				return curJson
             }
         },
+		
+		watch: {
+		    getKnowledgeData: {
+		        handler(val) {
+		            if (val) {
+		                this.doRender(val)
+		            }
+		        }
+		    }
+		}
     }
 </script>
 

+ 0 - 1
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseKnowledgeRadar.vue

@@ -144,7 +144,6 @@
         },
         watch: {
             getKnowledgeData: {
-                deep: true,
                 handler(val) {
                     if (val) {
                         this.doRender(val)

+ 97 - 94
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseLevelPie.vue

@@ -1,108 +1,111 @@
 <template>
-    <div class="myLevelPie" :id="pieId" ></div>
+	<div class="myLevelPie" :id="pieId"></div>
 </template>
 
 <script>
-    export default {
-        name: 'BasePie',
-        props: ['pieId'],
-        data() {
-            return {
-                pieData: []
-            }
-        },
-        methods: {
+	export default {
+		name: 'BasePie',
+		props: ['pieId'],
+		data() {
+			return {
+				pieData: []
+			}
+		},
+		methods: {
 
-            drawLine(data) {
-                let that = this
+			drawLine(data) {
+				let that = this
 
-                // 基于准备好的dom,初始化echarts实例
-                let myLevelPie = this.$echarts.init(document.getElementById(this.pieId), 'chalk')
+				// 基于准备好的dom,初始化echarts实例
+				let myLevelPie = this.$echarts.init(document.getElementById(this.pieId), 'chalk')
 
-                // 指定图表的配置项和数据
-                var option = {
-                    tooltip: {
-                        trigger: 'item',
-                        formatter: '{a} <br/>{b} : {c} ({d}%)'
-                    },
-                    calculable: true,
-                    roseType: true,
-                    series: {
-                        name: that.$t('totalAnalysis.le_title1'),
-                        type: 'pie',
-                        radius: [40, 150],
-                        center: ['45%', 190],
-                        max: 100, // for funnel
-                        sort: 'ascending', // for funnel
-                        data: data
-                    }
-                }
+				// 指定图表的配置项和数据
+				var option = {
+					tooltip: {
+						trigger: 'item',
+						formatter: '{a} <br/>{b} : {c} ({d}%)'
+					},
+					calculable: true,
+					roseType: true,
+					series: {
+						name: that.$t('totalAnalysis.le_title1'),
+						type: 'pie',
+						radius: [40, 150],
+						center: ['45%', 190],
+						max: 100, // for funnel
+						sort: 'ascending', // for funnel
+						data: data
+					}
+				}
 
-                // 绘制图表
-                myLevelPie.setOption(option)
-                window.addEventListener('resize', function() {
-                    myLevelPie.resize()
-                })
-            }
-        },
-        mounted() {
-            if (this.getPieData) {
-                let pointList = this.getPieData.pointList
-                let valList = this.getPieData.per
-                let arr = []
-                pointList.forEach((item, index) => {
-                    let o = {}
-                    o.name = item
-                    o.value = valList[index].replace('%', '')
-                    arr.push(o)
-                })
-                this.drawLine(arr)
-            }
-        },
-        computed: {
-            // 获取最新知识点占比饼图数据
-            getPieData() {
-				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis.currentSubject)
-                let levelJson = this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].levelKey
-                let transArr = this.$GLOBAL.EXERCISE_LEVELS()
-                levelJson.pointList = levelJson.pointList.map((i,index) => transArr[index])
-                for(let key in levelJson.classpercent){
-                	if(key !== 'className'){
-                		let newKey = transArr[+key - 1]
-                		levelJson.classpercent[newKey] = levelJson.classpercent[key]
-                	}
-                }
-                return levelJson
-            }
-        },
-        watch: {
-            // getPieData: {
-            //     deep: true,
-            //     handler(val) {
-            //         let pointList = val.level
-            //         let valList = val.fper
-            //         let arr = []
-            //         pointList.forEach((item, index) => {
-            //             let o = {}
-            //             o.name = item
-            //             o.value = valList[index].replace('%', '')
-            //             arr.push(o)
-            //         })
-            //         this.drawLine(arr)
-            //     }
-            // }
-        }
+				// 绘制图表
+				myLevelPie.setOption(option)
+				window.addEventListener('resize', function() {
+					myLevelPie.resize()
+				})
+			}
+		},
+		mounted() {
+			if (this.getPieData) {
+				let pointList = this.getPieData.pointList
+				let valList = this.getPieData.per
+				let arr = []
+				pointList.forEach((item, index) => {
+					let o = {}
+					o.name = item
+					o.value = valList[index].replace('%', '')
+					arr.push(o)
+				})
+				this.drawLine(arr)
+			}
+		},
+		computed: {
+			// 获取最新知识点占比饼图数据
+			getPieData() {
+				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state
+					.totalAnalysis.currentSubject)
+				let levelJson = this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].levelKey
+				let transArr = this.$GLOBAL.EXERCISE_LEVELS()
+				levelJson.pointList = levelJson.pointList.map((i, index) => transArr[index])
+				for (let key in levelJson.classpercent) {
+					if (key !== 'className') {
+						let newKey = transArr[+key - 1]
+						levelJson.classpercent[newKey] = levelJson.classpercent[key]
+					}
+				}
+				return levelJson
+			},
+			getKnowledgeData() {
+				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state
+					.totalAnalysis.currentSubject)
+				return this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].pointKey
+			},
+		},
+		watch: {
+			getKnowledgeData(val) {
+				if (!val) return
+				let pointList = this.getPieData.pointList
+				let valList = this.getPieData.per
+				let arr = []
+				pointList.forEach((item, index) => {
+					let o = {}
+					o.name = item
+					o.value = valList[index].replace('%', '')
+					arr.push(o)
+				})
+				this.drawLine(arr)
+			}
+		}
 
-    }
+	}
 </script>
 
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style scoped>
-
-    .myLevelPie {
-        width: 100%;
-        height: 380px;
-        margin: 0 auto;
-        display: block;
-    }
+	.myLevelPie {
+		width: 100%;
+		height: 380px;
+		margin: 0 auto;
+		display: block;
+	}
 </style>

+ 160 - 164
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseLevelRadar.vue

@@ -1,178 +1,174 @@
 <template>
-    <div>
-        <div :id="echartsId" class="myRadar"></div>
-    </div>
+	<div>
+		<div :id="echartsId" class="myRadar"></div>
+	</div>
 </template>
 
 <script>
-    export default {
-        name: 'helloLine',
-        props: ['echartsId'],
-        data() {
-            return {
-                radarData: []
-            }
-        },
-        mounted() {
-            this.radarData = this.getRadarData
-            this.drawLine(this.radarData)
-        },
-        methods: {
-            drawLine(indicator, data) {
-                // 基于准备好的dom,初始化echarts实例
-                let that = this
-                let myRadar = this.$echarts.init(document.getElementById(this.echartsId), 'chalk')
+	export default {
+		name: 'helloLine',
+		props: ['echartsId'],
+		data() {
+			return {
+				radarData: []
+			}
+		},
+		mounted() {
+			this.radarData = this.getRadarData
+			this.drawLine(this.radarData)
+		},
+		methods: {
+			drawLine(indicator, data) {
+				// 基于准备好的dom,初始化echarts实例
+				let that = this
+				let myRadar = this.$echarts.init(document.getElementById(this.echartsId), 'chalk')
 
-                // 指定图表的配置项和数据
-                var option = {
-                    tooltip: {
-                        formatter: function(params) {
-                            var results = params.marker + '认知层次占比情况<br>'
-                            for (var i = 0; i < params.value.length; i++) {
-                                results += indicator[i].name + ':' + params.value[i] + '%<br>'
-                            }
-                            return results
-                        } },
-                    radar: {
-                        triggerEvent: true,
-                        name: {
-                            textStyle: {
-                                color: '#fff',
-                                borderRadius: 3,
-                                fontSize: 14,
-                                padding: [13, 15]
-                            }
-                        },
-                        center: ['50%', '50%'],
-                        tooltip: {
+				// 指定图表的配置项和数据
+				var option = {
+					tooltip: {
+						formatter: function(params) {
+							var results = params.marker + '认知层次占比情况<br>'
+							for (var i = 0; i < params.value.length; i++) {
+								results += indicator[i].name + ':' + params.value[i] + '%<br>'
+							}
+							return results
+						}
+					},
+					radar: {
+						triggerEvent: true,
+						name: {
+							textStyle: {
+								color: '#fff',
+								borderRadius: 3,
+								fontSize: 14,
+								padding: [13, 15]
+							}
+						},
+						center: ['50%', '50%'],
+						tooltip: {
 
-                        },
-                        indicator: indicator,
-                        splitArea: {
-                            areaStyle: {
-                                // color: [
-                                //  'rgba(222,134,85, 0.1)', 'rgba(222,134,85, 0.2)',
-                                //  'rgba(222,134,85, 0.4)', 'rgba(222,134,85, 0.6)',
-                                //  'rgba(222,134,85, 0.8)', 'rgba(222,134,85, 1)'
-                                // ].reverse()
-                            }
-                        },
-                        axisLine: { // 指向外圈文本的分隔线样式
-                            lineStyle: {
-                                color: 'rgba(255,255,255,0.2)'
-                            }
-                        },
-                        splitLine: {
-                            lineStyle: {
-                                width: 2,
-                                color: [
-                                    'rgba(224,134,82, 0.1)', 'rgba(224,134,82, 0.2)',
-                                    'rgba(224,134,82, 0.4)', 'rgba(224,134,82, 0.6)',
-                                    'rgba(224,134,82, 0.8)', 'rgba(224,134,82, 1)'
-                                ].reverse()
-                            }
-                        }
-                    },
-                    series: [
-                        {
-                            name: '',
-                            type: 'radar',
-                            itemStyle: {
-                                color: '#22CEE7'
-                            },
-                            areaStyle: {
-                                color: {
-                                    type: 'linear',
-                                    x: 0,
-                                    y: 0,
-                                    x2: 0,
-                                    y2: 1,
-                                    colorStops: [
-                                        {
-                                            offset: 0,
-                                            color: '#2cc7cb' // 0% 处的颜色
-                                        },
-                                        {
-                                            offset: 1,
-                                            color: '#59b2ef' // 100% 处的颜色
-                                        }
-                                    ],
-                                    global: false // 缺省为 false
-                                }
-                            },
-                            lineStyle: {
-                                color: '#9FACE6'
-                            },
-                            data: [
-                                {
-                                    value: data,
-                                    name: '知识点占比'
-                                }
-                            ]
-                        }
-                    ]
-                }
+						},
+						indicator: indicator,
+						splitArea: {
+							areaStyle: {
+								// color: [
+								//  'rgba(222,134,85, 0.1)', 'rgba(222,134,85, 0.2)',
+								//  'rgba(222,134,85, 0.4)', 'rgba(222,134,85, 0.6)',
+								//  'rgba(222,134,85, 0.8)', 'rgba(222,134,85, 1)'
+								// ].reverse()
+							}
+						},
+						axisLine: { // 指向外圈文本的分隔线样式
+							lineStyle: {
+								color: 'rgba(255,255,255,0.2)'
+							}
+						},
+						splitLine: {
+							lineStyle: {
+								width: 2,
+								color: [
+									'rgba(224,134,82, 0.1)', 'rgba(224,134,82, 0.2)',
+									'rgba(224,134,82, 0.4)', 'rgba(224,134,82, 0.6)',
+									'rgba(224,134,82, 0.8)', 'rgba(224,134,82, 1)'
+								].reverse()
+							}
+						}
+					},
+					series: [{
+						name: '',
+						type: 'radar',
+						itemStyle: {
+							color: '#22CEE7'
+						},
+						areaStyle: {
+							color: {
+								type: 'linear',
+								x: 0,
+								y: 0,
+								x2: 0,
+								y2: 1,
+								colorStops: [{
+										offset: 0,
+										color: '#2cc7cb' // 0% 处的颜色
+									},
+									{
+										offset: 1,
+										color: '#59b2ef' // 100% 处的颜色
+									}
+								],
+								global: false // 缺省为 false
+							}
+						},
+						lineStyle: {
+							color: '#9FACE6'
+						},
+						data: [{
+							value: data,
+							name: '知识点占比'
+						}]
+					}]
+				}
 
-                // 绘制图表
-                myRadar.setOption(option)
-            },
+				// 绘制图表
+				myRadar.setOption(option)
+			},
 
-            doRender(data) {
-                let list = data
-                let indicator = []
-                list.pointList.forEach(item => {
-                    indicator.push({
-                        name: item,
-                        max: 100
-                    })
-                })
-                this.drawLine(indicator, list.per.map(item => (Number(item) * 100).toFixed(2)))
-            }
-        },
-        mounted() {
-            if (this.getKnowledgeData) {
-                this.doRender(this.getKnowledgeData)
-            }
-        },
+			doRender(data) {
+				let list = data
+				let indicator = []
+				list.pointList.forEach(item => {
+					indicator.push({
+						name: item,
+						max: 100
+					})
+				})
+				this.drawLine(indicator, list.per.map(item => (Number(item) * 100).toFixed(2)))
+			}
+		},
+		mounted() {
+			if (this.getLevelData) {
+				this.doRender(this.getLevelData)
+			}
+		},
 
-        computed: {
-            // 获取最新散点图数据
-            getKnowledgeData() {
-                let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis.currentSubject)
-                let levelJson = this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].levelKey
-                let transArr = this.$GLOBAL.EXERCISE_LEVELS()
-                levelJson.pointList = levelJson.pointList.map((i,index) => transArr[index])
-                for(let key in levelJson.classpercent){
-                	if(key !== 'className'){
-                		let newKey = transArr[+key - 1]
-                		levelJson.classpercent[newKey] = levelJson.classpercent[key]
-                	}
-                }
-                return levelJson
-            }
-        },
-        watch: {
-            getKnowledgeData: {
-                deep: true,
-                handler(val) {
-                    if (val) {
-                        this.doRender(val)
-                    }
-                }
-
-            }
-        }
-    }
+		computed: {
+			// 获取最新散点图数据
+			getLevelData() {
+				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state
+					.totalAnalysis.currentSubject)
+				let levelJson = this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].levelKey
+				let transArr = this.$GLOBAL.EXERCISE_LEVELS()
+				levelJson.pointList = levelJson.pointList.map((i, index) => transArr[index])
+				for (let key in levelJson.classpercent) {
+					if (key !== 'className') {
+						let newKey = transArr[+key - 1]
+						levelJson.classpercent[newKey] = levelJson.classpercent[key]
+					}
+				}
+				return levelJson
+			},
+			getKnowledgeData() {
+				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state
+					.totalAnalysis.currentSubject)
+				return this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].pointKey
+			},
+		},
+		watch: {
+			getKnowledgeData(val) {
+				if (!val) return
+				this.doRender(this.getLevelData)
+			}
+		}
+	}
 </script>
 
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style scoped>
-
-    .myRadar {
-        width: 100%;
-        height: 480px;
-        margin: 50px auto 0 auto;
-        padding: 30px;
-        display: block;
-    }
+	.myRadar {
+		width: 100%;
+		height: 480px;
+		margin: 50px auto 0 auto;
+		padding: 30px;
+		display: block;
+	}
 </style>

+ 1 - 1
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseScatter.vue

@@ -28,7 +28,7 @@
 				let newArr = []
 				analysisJson.forEach(item => {
 					let arr2 = []
-					arr2.push((item.x * 100).toFixed(2))
+					arr2.push((+item.x).toFixed(2))
 					arr2.push((item.y * 100).toFixed(2))
 					arr2.push(item.name)
 					arr2.push(item.memberId)

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

@@ -73,12 +73,6 @@
                 <h2 class="title-rect-name"  @click="checkedAnsFilter">评测作答回顾</h2>
             </div>
             <div class="filterBtn">
-                <br />
-                <!--<label class="checkAns">
-                    <input type="checkbox" value="right" v-model="checkedAns" />
-                    <span>满分题:{{rightAns.right}}</span>
-                    <div class="allAnsBtn"></div>
-                </label>-->
                 <label class="checkAns">
                     <input type="checkbox" value="right" v-model="checkedAns" />
                     <span>答对: {{rightAns.right}}</span>
@@ -457,11 +451,13 @@
                         right: 0,
                         noAns:0
                     }
-                    for (let i = 0; i < this.examInfo.stuScore.length; i++ ) {
-                        if (this.examInfo.stuScore[i] == -1) {
-                            info.noAns++
-                        } else if (this.examInfo.stuScore[i] == this.paperData[i].score && this.examInfo.stuScore[i] != -1) {
-                            info.right++
+                    if (this.paperData[0]!= undefined) {
+                        for (let i = 0; i < this.examInfo.stuScore.length; i++) {
+                            if (this.examInfo.stuScore[i] == -1) {
+                                info.noAns++
+                            } else if (this.examInfo.stuScore[i] == this.paperData[i].score && this.examInfo.stuScore[i] != -1) {
+                                info.right++
+                            }
                         }
                     }
                 }

+ 4 - 1
TEAMModelOS/ClientApp/src/locale/lang/en-US/schoolBaseInfo.js

@@ -86,5 +86,8 @@ export default {
   '3222NIYD': 'ezStation 2',
   'J223IZ6M': 'HiTeach STD',
   '3222C6D2': 'HiTeach TBL',
-  'J223IZAM': 'HiTeach PRO'
+  'J223IZAM': 'HiTeach PRO',
+  addStuBtn: '添加學生',
+  delStuBtn: '删除學生',
+  editSeat: '修改座號'
 }

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

@@ -29,7 +29,7 @@ export default {
     ti_text4: 'number of grades',
     ti_text5: 'number of classes',
     ti_text12: 'evaluate all',
-    ti_text6: 'weekly test',
+    ti_text6: 'formal examination',
     ti_text7: 'opening examination',
     ti_text8: 'midterm exam',
     ti_text9: 'final exam',

+ 6 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/evaluation.js

@@ -218,5 +218,11 @@ export default {
 		addFail:'添加失败!',
 		numMax1:'最多绑定',
 		numMax2:'个知识点'
+	},
+	echarts:{
+		pointPie:'试卷知识点分析图',
+		typePie:'试卷题型分析图',
+		diffPie:'试卷难度分析图',
+		objectivePie:'试卷主客观分析图'
 	}
 }

+ 4 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolBaseInfo.js

@@ -149,5 +149,8 @@ export default {
   formWarning:'请先完善班级信息再保存!',
   bindingErr:'Hiteach 绑定失败!',
   delClass:'删除班级',
-  saveClassWarning:'当前教室数据尚未保存。如果离开,修改的数据将不会保存!'
+  saveClassWarning:'当前教室数据尚未保存。如果离开,修改的数据将不会保存!',
+  addStuBtn:'添加学生',
+  delStuBtn:'删除学生',
+  editSeat:'修改座号'
 }

+ 3 - 3
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/totalAnalysis.js

@@ -29,9 +29,9 @@ export default {
     ti_text4: '年级数',
     ti_text5: '班级数',
     ti_text12: '全部评测',
-    ti_text6: '考',
-    ti_text7: '考',
-    ti_text8: '平常考',
+    ti_text6: '正规考',
+    ti_text7: '模拟考',
+    ti_text8: '普通考',
     ti_text9: '其它',
     ti_text10: '模拟测验',
     ti_text11: '诊断测验',

+ 6 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/evaluation.js

@@ -218,5 +218,11 @@ export default {
 		addFail: '添加失敗!',
 		numMax1: '最多綁定',
 		numMax2: '個知識點'
+	},
+	echarts: {
+		pointPie: '試卷知識點分析圖',
+		typePie: '試卷題型分析圖',
+		diffPie: '試卷難度分析圖',
+		objectivePie: '試卷主客觀分析圖'
 	}
 }

+ 4 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/schoolBaseInfo.js

@@ -151,5 +151,8 @@ export default {
   formWarning: '請先完善班級資訊再保存!',
   bindingErr: 'Hiteach綁定失敗!',
   delClass: '删除班級',
-  saveClassWarning: '當前教室數據尚未保存。如果離開,修改的數據將不會保存!'
+  saveClassWarning: '當前教室數據尚未保存。如果離開,修改的數據將不會保存!',
+  addStuBtn: '添加學生',
+  delStuBtn: '删除學生',
+  editSeat: '修改座號'
 }

+ 231 - 231
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/totalAnalysis.js

@@ -1,239 +1,239 @@
 export default {
-    // EvaluationList.vue
-    text1: '歷次考試匯總',
-    text2: '次數',
-    text3: '更多篩選',
-    text4: '輸入考試名稱...',
-    text5: '當前篩選條件',
-    text6: '當前條數',
-    text7: '參與人數',
-    text8: '考試日期',
-    text9: '無',
-    condition1: '關註學段',
-    condition2: '關註年級',
-    condition3: '學年期',
-    condition4: '考試類型',
-    condition5: '考試範圍',
-    condition6: '評測來源',
-    condition7: '考試學科',
-
-    // totalIndex.vue
-    ti_title1: '基本資料統計',
-    ti_title2: '評測資料統計',
-    ti_title3: '學科對比統計',
-    ti_title4: '年級優生率統計',
-    ti_title5: '評測清單數據',
-    ti_text1: '教師人數',
-    ti_text2: '學生人數',
-    ti_text3: '學段數',
-    ti_text4: '年級數',
+	// EvaluationList.vue
+	text1: '歷次考試匯總',
+	text2: '次數',
+	text3: '更多篩選',
+	text4: '輸入考試名稱...',
+	text5: '當前篩選條件',
+	text6: '當前條數',
+	text7: '參與人數',
+	text8: '考試日期',
+	text9: '無',
+	condition1: '關註學段',
+	condition2: '關註年級',
+	condition3: '學年期',
+	condition4: '考試類型',
+	condition5: '考試範圍',
+	condition6: '評測來源',
+	condition7: '考試學科',
+
+	// totalIndex.vue
+	ti_title1: '基本資料統計',
+	ti_title2: '評測資料統計',
+	ti_title3: '學科對比統計',
+	ti_title4: '年級優生率統計',
+	ti_title5: '評測清單數據',
+	ti_text1: '教師人數',
+	ti_text2: '學生人數',
+	ti_text3: '學段數',
+	ti_text4: '年級數',
 	ti_text5: '班級數',
 	ti_text12: '全部評測',
-	ti_text6: '考',
-	ti_text7: '考',
-	ti_text8: '平常考',
+	ti_text6: '正規考',
+	ti_text7: '模擬考',
+	ti_text8: '普通考',
 	ti_text9: '其它',
 	ti_text10: '模擬測驗',
 	ti_text11: '診斷測驗',
-    echarts_text1: '最高值',
-    echarts_text2: '最低值',
-    echarts_text3: '平均值',
-    echarts_text4: '班級平均',
-    echarts_text5: '年級平均',
-    echarts_text6: '班級總人數',
-    echarts_text7: '進線總人數',
-    echarts_text8: '進線率',
-    echarts_text9: '當前年級',
-    echarts_text10: '篩選',
-    echarts_text11: '施測時間',
-    echarts_text12: '應參與人數',
-    echarts_text13: '實際參與人數',
-    echarts_text14: '參與率',
-    echarts_text15: '平均分',
-    echarts_text16: '成就指數',
-    echarts_text17: '優生率',
-    echarts_text18: '優生人數',
-
-    // Base Info
-    base_name: '姓名',
-    base_class: '班级',
-    base_id: '座號',
-    base_score: '分數',
-
-    // ExamList.vue
-    newest: '最新測驗',
-    more: '查看更多',
-
-    // index.vue
-    module1: '成績分析',
-    module2: '落点分析',
-    module3: '試題分析',
-    module4: '知識点掌握',
-    module5: '認知層次掌握',
-    exportTable: '匯出表格',
-    currentSubject: '當前科目',
-
-    // AchievementAnalysis.vue
-    ach_title1: '及格率統計',
-    ach_title2: '均分分析',
-    ach_title3: '進線人數統計',
-    ach_title4: '進線情况統計',
-    ach_title5: '進線率統計',
-    ach_title6: '預警統計',
-    ach_title7: '排名統計',
-    ach_title8: '均分分析',
-    ach_text1: '及格率',
-    ach_text2: '年级',
-    ach_text3: '區級',
-    ach_text4: '班級平均分',
-    ach_text5: '校級平均分',
-    ach_text6: '區級平均分',
-    ach_text7: '班級總人數',
-    ach_text8: '進線總人數',
-    ach_text9: '進線率',
-    ach_text10: '當前班級',
-    ach_text11: '總人數',
-    ach_text12: '返回',
-
-    ach_table_text1: '年級排名',
-    ach_table_text2: '總分',
-    ach_table_text3: '平均分',
-    ach_table_text4: '標準差',
-    ach_table_text5: '超均率',
-    ach_table_text6: '進線',
-    ach_table_text7: '踩線',
-    ach_table_text8: '班級排名',
-    ach_table_text9: '年級排名',
-    ach_table_text10: '區級排名',
-    ach_table_text11: '班級PR排名',
-    ach_table_text12: '年級PR排名',
-    ach_table_text13: '區級PR排名',
-    ach_table_text14: '進步班級',
-    ach_table_text15: '退步班級',
-    ach_table_text16: '穩定班級',
-
-    ach_chart_text1: '排序方式',
-    ach_chart_text2: '默認排序',
-    ach_chart_text3: '分數從高到低',
-    ach_chart_text4: '分數從低到高',
-
-    // ScatterAnalysis.vue
-    sca_title1: '學生學習力分佈',
-    sca_title2: '學生穩定度統計表',
-    sca_text1: '區域',
-    sca_text2: '區域特性',
-    sca_text3: '所占人數',
-    sca_text4: '學生',
-    sca_text5: '學習良好,穩定度高',
-    sca_text6: '粗心大意,不細心造成錯誤',
-    sca_text7: '學習尚且穩定,需要再用功',
-    sca_text8: '偶爾粗心,準備不够充分',
-    sca_text9: '學習不够充分,需要更加努力',
-    sca_text10: '學習極不穩定,對考試沒有充分準備',
-    sca_chart_text1: '通過率',
-    sca_chart_text2: '穩定度',
-    sca_table_text1: '答對題數',
-    sca_table_text2: '答錯題數',
-    sca_table_text3: '應努力題號',
-    sca_table_text4: '需小心題號',
-    sca_table_text5: '穩定程度',
-    sca_table_text6: '落點區域',
-
-    // TestAnalysis.vue
-    ta_title1: '試題落點分析',
-    ta_title2: '年級單題得分率統計',
-    ta_title3: '試題分析總表',
-    ta_title4: '試題得分率錶',
-
-    ta_text1: '區域',
-    ta_text2: '區域特性',
-    ta_text3: '題數',
-    ta_text4: '題目編號',
-    ta_text5: '所選題號',
-    ta_text6: '試題相當適當,可以用來區分學生的不同',
-    ta_text7: '試題可能含有異質成分在內,需要局部修正',
-    ta_text8: '試題困難度較高,適合區分高成就者學生',
-    ta_text9: '試題含有異質成分,可能數據錯誤或者題意不清,必須加以修改',
-
-    ta_chart_text1: '試題',
-    ta_chart_text2: '答對率',
-    ta_chart_text3: '穩定度',
-    ta_chart_text4: '班級得分率',
-    ta_chart_text5: '年級得分率',
-    ta_chart_text6: '區級得分率',
-
-    ta_table_text1: '題號',
-    ta_table_text2: '題型',
-    ta_table_text3: '知識點',
-    ta_table_text4: '配分',
-    ta_table_text5: '難易度',
-    ta_table_text6: '鑒別度',
-    ta_table_text7: '班級',
-    ta_table_text8: '得分率',
-    ta_table_text9: '區級',
-    ta_table_text10: '高分组',
-    ta_table_text11: '低分组',
-
-    ta_table_tip1: '* 組織:得分率',
-    ta_table_tip2: '* R1-R6:排名區間',
-
-    // KnowledgeAnalysis.vue
-    ka_title1: '知識點占比',
-    ka_title2: '認知層次分佈',
-    ka_title3: '得分率關係表',
-    ka_title4: '知識點得分率統計',
-    ka_title5: '知識點得分詳情',
-    ka_title6: '錯題率關係表',
-
-    ka_text1: '當前知識塊',
-    ka_text2: '當前知識點',
-    ka_text3: '當前認知層次',
-
-    ka_chart_text1: '切換柱狀圖',
-    ka_chart_text2: '切換雷达圖',
-
-    ka_radar_text1: '知識',
-    ka_radar_text2: '應用',
-    ka_radar_text3: '分析',
-    ka_radar_text4: '綜合',
-    ka_radar_text5: '評鑒',
-    ka_radar_text6: '理解',
-
-    ka_table_text1: '知識點',
-    ka_table_text2: '認知層次',
-    ka_table_text3: '年級得分率',
-    ka_table_text4: '分值',
-    ka_table_text5: '本節得分',
-    ka_table_text6: '得分率',
-    ka_table_text7: '涉及題號',
-    ka_table_text8: '平均得分率',
-    ka_table_text9: '錯題人數',
-    ka_table_text10: 'RH錯題人數',
-    ka_table_text11: 'RL錯題人數',
-
-    ka_tip1: '* RH:高分區段 / RL:低分區段',
-
-    // LevelAnalysis.vue
-    le_title1: '認知層次占比',
-    le_title2: '认知层次分布',
-    le_title3: '得分率關系表',
-    le_title4: '認知層次得分率統計',
-    le_title5: '認知層次得分詳情',
-    le_title6: '錯題率關系表',
-
-    // QuestionList.vue
-    ql_text1: '試卷總分',
-    ql_text2: '單項選擇題',
-    ql_text3: '多項選擇題',
-    ql_text4: '判斷題',
-    ql_text5: '填空題',
-    ql_text6: '問答題',
-    ql_text7: '綜合題',
-    ql_text8: '分',
-    ql_text9: '查看答案與解析',
-    ql_text10: '查看資料分析',
-    ql_text11: '參考答案',
-    ql_text12: '答題解析',
-    ql_text13: '返回'
+	echarts_text1: '最高值',
+	echarts_text2: '最低值',
+	echarts_text3: '平均值',
+	echarts_text4: '班級平均',
+	echarts_text5: '年級平均',
+	echarts_text6: '班級總人數',
+	echarts_text7: '進線總人數',
+	echarts_text8: '進線率',
+	echarts_text9: '當前年級',
+	echarts_text10: '篩選',
+	echarts_text11: '施測時間',
+	echarts_text12: '應參與人數',
+	echarts_text13: '實際參與人數',
+	echarts_text14: '參與率',
+	echarts_text15: '平均分',
+	echarts_text16: '成就指數',
+	echarts_text17: '優生率',
+	echarts_text18: '優生人數',
+
+	// Base Info
+	base_name: '姓名',
+	base_class: '班级',
+	base_id: '座號',
+	base_score: '分數',
+
+	// ExamList.vue
+	newest: '最新測驗',
+	more: '查看更多',
+
+	// index.vue
+	module1: '成績分析',
+	module2: '落点分析',
+	module3: '試題分析',
+	module4: '知識点掌握',
+	module5: '認知層次掌握',
+	exportTable: '匯出表格',
+	currentSubject: '當前科目',
+
+	// AchievementAnalysis.vue
+	ach_title1: '及格率統計',
+	ach_title2: '均分分析',
+	ach_title3: '進線人數統計',
+	ach_title4: '進線情况統計',
+	ach_title5: '進線率統計',
+	ach_title6: '預警統計',
+	ach_title7: '排名統計',
+	ach_title8: '均分分析',
+	ach_text1: '及格率',
+	ach_text2: '年级',
+	ach_text3: '區級',
+	ach_text4: '班級平均分',
+	ach_text5: '校級平均分',
+	ach_text6: '區級平均分',
+	ach_text7: '班級總人數',
+	ach_text8: '進線總人數',
+	ach_text9: '進線率',
+	ach_text10: '當前班級',
+	ach_text11: '總人數',
+	ach_text12: '返回',
+
+	ach_table_text1: '年級排名',
+	ach_table_text2: '總分',
+	ach_table_text3: '平均分',
+	ach_table_text4: '標準差',
+	ach_table_text5: '超均率',
+	ach_table_text6: '進線',
+	ach_table_text7: '踩線',
+	ach_table_text8: '班級排名',
+	ach_table_text9: '年級排名',
+	ach_table_text10: '區級排名',
+	ach_table_text11: '班級PR排名',
+	ach_table_text12: '年級PR排名',
+	ach_table_text13: '區級PR排名',
+	ach_table_text14: '進步班級',
+	ach_table_text15: '退步班級',
+	ach_table_text16: '穩定班級',
+
+	ach_chart_text1: '排序方式',
+	ach_chart_text2: '默認排序',
+	ach_chart_text3: '分數從高到低',
+	ach_chart_text4: '分數從低到高',
+
+	// ScatterAnalysis.vue
+	sca_title1: '學生學習力分佈',
+	sca_title2: '學生穩定度統計表',
+	sca_text1: '區域',
+	sca_text2: '區域特性',
+	sca_text3: '所占人數',
+	sca_text4: '學生',
+	sca_text5: '學習良好,穩定度高',
+	sca_text6: '粗心大意,不細心造成錯誤',
+	sca_text7: '學習尚且穩定,需要再用功',
+	sca_text8: '偶爾粗心,準備不够充分',
+	sca_text9: '學習不够充分,需要更加努力',
+	sca_text10: '學習極不穩定,對考試沒有充分準備',
+	sca_chart_text1: '通過率',
+	sca_chart_text2: '穩定度',
+	sca_table_text1: '答對題數',
+	sca_table_text2: '答錯題數',
+	sca_table_text3: '應努力題號',
+	sca_table_text4: '需小心題號',
+	sca_table_text5: '穩定程度',
+	sca_table_text6: '落點區域',
+
+	// TestAnalysis.vue
+	ta_title1: '試題落點分析',
+	ta_title2: '年級單題得分率統計',
+	ta_title3: '試題分析總表',
+	ta_title4: '試題得分率錶',
+
+	ta_text1: '區域',
+	ta_text2: '區域特性',
+	ta_text3: '題數',
+	ta_text4: '題目編號',
+	ta_text5: '所選題號',
+	ta_text6: '試題相當適當,可以用來區分學生的不同',
+	ta_text7: '試題可能含有異質成分在內,需要局部修正',
+	ta_text8: '試題困難度較高,適合區分高成就者學生',
+	ta_text9: '試題含有異質成分,可能數據錯誤或者題意不清,必須加以修改',
+
+	ta_chart_text1: '試題',
+	ta_chart_text2: '答對率',
+	ta_chart_text3: '穩定度',
+	ta_chart_text4: '班級得分率',
+	ta_chart_text5: '年級得分率',
+	ta_chart_text6: '區級得分率',
+
+	ta_table_text1: '題號',
+	ta_table_text2: '題型',
+	ta_table_text3: '知識點',
+	ta_table_text4: '配分',
+	ta_table_text5: '難易度',
+	ta_table_text6: '鑒別度',
+	ta_table_text7: '班級',
+	ta_table_text8: '得分率',
+	ta_table_text9: '區級',
+	ta_table_text10: '高分组',
+	ta_table_text11: '低分组',
+
+	ta_table_tip1: '* 組織:得分率',
+	ta_table_tip2: '* R1-R6:排名區間',
+
+	// KnowledgeAnalysis.vue
+	ka_title1: '知識點占比',
+	ka_title2: '認知層次分佈',
+	ka_title3: '得分率關係表',
+	ka_title4: '知識點得分率統計',
+	ka_title5: '知識點得分詳情',
+	ka_title6: '錯題率關係表',
+
+	ka_text1: '當前知識塊',
+	ka_text2: '當前知識點',
+	ka_text3: '當前認知層次',
+
+	ka_chart_text1: '切換柱狀圖',
+	ka_chart_text2: '切換雷达圖',
+
+	ka_radar_text1: '知識',
+	ka_radar_text2: '應用',
+	ka_radar_text3: '分析',
+	ka_radar_text4: '綜合',
+	ka_radar_text5: '評鑒',
+	ka_radar_text6: '理解',
+
+	ka_table_text1: '知識點',
+	ka_table_text2: '認知層次',
+	ka_table_text3: '年級得分率',
+	ka_table_text4: '分值',
+	ka_table_text5: '本節得分',
+	ka_table_text6: '得分率',
+	ka_table_text7: '涉及題號',
+	ka_table_text8: '平均得分率',
+	ka_table_text9: '錯題人數',
+	ka_table_text10: 'RH錯題人數',
+	ka_table_text11: 'RL錯題人數',
+
+	ka_tip1: '* RH:高分區段 / RL:低分區段',
+
+	// LevelAnalysis.vue
+	le_title1: '認知層次占比',
+	le_title2: '认知层次分布',
+	le_title3: '得分率關系表',
+	le_title4: '認知層次得分率統計',
+	le_title5: '認知層次得分詳情',
+	le_title6: '錯題率關系表',
+
+	// QuestionList.vue
+	ql_text1: '試卷總分',
+	ql_text2: '單項選擇題',
+	ql_text3: '多項選擇題',
+	ql_text4: '判斷題',
+	ql_text5: '填空題',
+	ql_text6: '問答題',
+	ql_text7: '綜合題',
+	ql_text8: '分',
+	ql_text9: '查看答案與解析',
+	ql_text10: '查看資料分析',
+	ql_text11: '參考答案',
+	ql_text12: '答題解析',
+	ql_text13: '返回'
 
 }

+ 43 - 10
TEAMModelOS/ClientApp/src/utils/blobTool.js

@@ -68,12 +68,10 @@ export default class BlobTool {
             this.containerClient.getProperties(options).then(
                 res => {
                     console.log('获取信息成功')
-                    console.log(res)
                     r(res)
                 },
                 err => {
                     console.log('获取信息失败')
-                    console.log(err)
                     j(err)
                 }
             )
@@ -136,6 +134,39 @@ export default class BlobTool {
             )
         })
     }
+    /**
+     * 处理HTEX文件类型
+     * @param {blobList} fileList 
+     */
+    handleHTEXFile(fileList) {
+        let parseRes = []
+        let names = []
+        fileList.forEach((item, index) => {
+            if (item.url.indexOf('/res/') > 0) {
+                let fileItem = {}
+                let startIndex = JsFn.findChartIndex(item.blob, '/', 1)
+                let endIndex = JsFn.findChartIndex(item.blob, '/', 2)
+                let name = item.blob.substring(startIndex + 1, endIndex)
+                let nameIndex = names.indexOf(name)
+                if (nameIndex == -1) {
+                    fileItem.url = this.blobUrl+ '/' + this.container +'/res/' + name
+                    fileItem.blob = `/res/${name}/index.json`
+                    fileItem.name = name + '.HTEX'
+                    fileItem.size = item.size
+                    fileItem.createTime = item.createTime
+                    fileItem.extension = 'HTEX'
+                    fileItem.type = 'res'
+                    names.push(name)
+                    parseRes.push(fileItem)
+                } else {
+                    parseRes[nameIndex].size += item.size
+                }
+            } else {
+                parseRes.push(item)
+            }
+        })
+        return parseRes
+    }
 
     /**
      * 列出所有(查询)
@@ -143,7 +174,7 @@ export default class BlobTool {
      * eg: option.prefix = 'res' 只查res文件夹下的blob
      * @returns {object} {blobList, continuationToken}
      */
-    async listBlob(option) {
+    async listBlob(option, hendleHTEX = true) {
         return new Promise(async (r, j) => {
             let blobList = []
             if (this.containerClient) {
@@ -152,7 +183,6 @@ export default class BlobTool {
                 while (!blobItem.done) {
                     let blobName = blobItem.value.name
                     let info = getExAndType(blobItem.value.name)
-
                     blobList.push(
                         {
                             url: this.blobUrl + '/' + this.container + '/' + blobName,
@@ -167,6 +197,9 @@ export default class BlobTool {
                     )
                     blobItem = await iter.next();
                 }
+                if (hendleHTEX) {
+                    blobList = this.handleHTEXFile(blobList)
+                }
                 r({
                     blobList,
                     continuationToken: 'end'
@@ -321,13 +354,13 @@ export default class BlobTool {
             let sasString = ''
             if (blobTool) {
                 blobs = await blobTool.listBlob({
-                    prefix: sourceFolder
-                })
+                    prefix: sourceFolder + '/'
+                }, false)
                 sasString = blobTool.sasString
             } else {
                 blobs = await this.listBlob({
-                    prefix: sourceFolder
-                })
+                    prefix: sourceFolder + '/'
+                }, false)
                 sasString = this.sasString
             }
             if (blobs && blobs.blobList) {
@@ -371,7 +404,7 @@ export default class BlobTool {
      */
     async getContainerSize() {
         return new Promise((r, j) => {
-            this.listBlob().then(
+            this.listBlob({},false).then(
                 res => {
                     let totalSize = res.blobList.reduce((total, item) => {
                         return total + parseInt(item.size)
@@ -414,7 +447,7 @@ export default class BlobTool {
      */
     getSize(option) {
         return new Promise((r, j) => {
-            this.listBlob(option).then(
+            this.listBlob(option,false).then(
                 res => {
                     let sizeInfo = {
                         total: 0,   //所有

+ 1 - 1
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseDiffPie.vue

@@ -22,7 +22,7 @@
                 // 指定图表的配置项和数据
                 var option = {
                     title: {
-                        'text': '试卷难度分析图',
+                        'text':  this.$t('evaluation.echarts.diffPie'),
                         'left': 'center',
                         'textStyle': {
                             'fontSize': 14,

+ 1 - 1
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseObjectivePie.vue

@@ -22,7 +22,7 @@
                 // 指定图表的配置项和数据
                 var option = {
                     title: {
-                        'text': '试卷主客观分析图',
+                        'text': this.$t('evaluation.echarts.objectivePie'),
                         'left': 'center',
                         'textStyle': {
                             'fontSize': 14,

+ 1 - 1
TEAMModelOS/ClientApp/src/view/evaluation/components/BasePointPie.vue

@@ -22,7 +22,7 @@
 				// 指定图表的配置项和数据
 				var option = {
 					title: {
-						'text': '试卷知识点分析图',
+						'text': this.$t('evaluation.echarts.pointPie'),
 						'left': 'center',
 						'textStyle': {
 							'fontSize': 14,

+ 6 - 0
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseRepair.vue

@@ -42,6 +42,7 @@
 		    <NewChooseContent :showSyllabus="isFalse"
 		                   :showOther="isFalse"
 		                   :showQuestion="isFalse"
+						   :defaultFiles="relateFileList"
 						   ref="chooseContentRef"
 		                   @on-file-change="onSelectFile"></NewChooseContent>
 		
@@ -85,6 +86,11 @@
 			onDeleteLink(item){
 				let index = this.datas.indexOf(item)
 				this.datas.splice(index,1)
+				if(item.type === 'file'){
+					let urlArr = this.relateFileList.map(i => i.url)
+					this.relateFileList.splice(urlArr.indexOf(item.blobUrl),1)
+				}
+				console.log(this.relateFileList.map(i => i.url))
 			},
 			
 			onInputChange(val){

+ 1 - 1
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseTypePie.vue

@@ -22,7 +22,7 @@
                 // 指定图表的配置项和数据
                 var option = {
                     title: {
-                        'text': '试卷题型分布图',
+                        'text': this.$t('evaluation.echarts.typePie'),
                         'left': 'center',
                         'textStyle': {
                             'fontSize': 14,

+ 4 - 4
TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.vue

@@ -254,8 +254,8 @@
 						/* 如果是导入的试题 没有ID 则试题的信息和当前试卷的学段信息保持一致 */
 						i.id = this.$tools.guid()
 						i.code = code
-						i.level = 3
-						i.field = 1
+						i.level = i.level || 3
+						i.field = i.field || 1
 						i.scope = this.isSchool ? 'school' : 'private'
 						i.gradeIds = gradeIds
 						i.subjectId = subjectId
@@ -266,8 +266,8 @@
 								j.pid = i.id
 								j.scope = i.scope
 								j.code = code
-								j.level = 3
-								j.field = 1
+								j.level = j.level || 3
+								j.field = j.field || 1
 								j.gradeIds = gradeIds
 								j.subjectId = subjectId
 								j.periodId = periodId

+ 1 - 0
TEAMModelOS/ClientApp/src/view/learnactivity/PaperScore.less

@@ -314,6 +314,7 @@
         font-size: 12px;
         display: none; 
         line-height: 18px;
+        cursor: pointer;
     }
     .stu-status-tag{
         background: #ed4014;

+ 0 - 7
TEAMModelOS/ClientApp/src/view/learnactivity/PaperScore.vue

@@ -395,9 +395,7 @@ export default {
             this.curAnIndex = index
             let answerIframe = document.getElementById('answerIframe')
             let markBody = answerIframe.contentWindow.document.body
-            console.log('body', answerIframe.contentWindow.document.body)
             answerIframe.onload = () => {
-                console.log(markBody)
                 answerIframe.style.width = '850px'
                 answerIframe.contentWindow.document.body.style.margin = '0px 20px'
                 answerIframe.contentWindow.document.body.style.padding = '10px'
@@ -576,7 +574,6 @@ export default {
     watch: {
         paper: {
             handler(newValue, oldValue) {
-                console.log('newValue', newValue)
                 this.paperInfo = newValue
             },
             deep: true
@@ -619,7 +616,6 @@ export default {
                 if (!this.studentAnswer.status) {
                     if (newValue.answers.length) {
                         try {
-                            console.log(this.scope)
                             let sas = this.scope == 'school' ? this.$store.state.user.schoolProfile.blob_sas : this.$store.state.user.userProfile.blob_sas
                             let a = await this.$tools.getFile(newValue.answers[0] + '?' + sas)
                             if (a) {
@@ -627,7 +623,6 @@ export default {
                                 ans.forEach((item, index) => {
                                     if (!item.length) ans[index] = [this.$t('learnActivity.score.noStuAns')]
                                 })
-                                console.log('a', ans)
                                 this.$set(this.studentAnswer, 'answers', ans)
                             } else {
                                 this.$set(this.studentAnswer, 'answers', [])
@@ -640,7 +635,6 @@ export default {
                         let a = newValue.scores.map(item => {
                             return [this.$t('learnActivity.score.noStuAns1')]
                         })
-                        console.log('a', a)
                         this.$set(this.studentAnswer, 'answers', a)
                     }
                     this.studentAnswer.status = true
@@ -665,7 +659,6 @@ export default {
         }
     },
     created() {
-        console.log('router', this.$route)
         if (this.$route.name == 'privateEvaluation') {
             this.scope = 'private'
         } else {

+ 59 - 7
TEAMModelOS/ClientApp/src/view/learnactivity/Scoring.vue

@@ -1,7 +1,7 @@
 <template>
     <div class="ev-scoring dark-iview-table">
         <vuescroll ref="score-main-warp">
-            <SimpleAnalysis :examInfo="examInfo" v-show="!showTest"></SimpleAnalysis>
+            <SimpleAnalysis :examInfo="examInfo" v-show="!showTest" :overviewInfo="overviewInfo"></SimpleAnalysis>
             <div class="ev-target-box dark-iview-select">
                 <span class="filter-label" v-show="examInfo.scope == 'school'">{{$t('learnActivity.score.subjectLabel')}}</span>
                 <Select filterable v-model="chooseSubject" class="filter-select" size="small" @on-change="getCurPaper" v-show="examInfo.scope == 'school'" transfer>
@@ -72,6 +72,13 @@ export default {
     },
     data() {
         return {
+            overviewInfo: {
+                total: 0,
+                answered: 0,
+                noAnswer: 0,
+                scored: 0,
+                noScore: 0
+            },
             defaultIndex: 0,
             tableLoading: false,
             tableHeight: 750,
@@ -224,7 +231,30 @@ export default {
                 }
             })
         },
-
+        //计算总览数据
+        calcOverView(data) {
+            //计算已作答未作答
+            this.overviewInfo.noAnswer = 0
+            data.studentAnswers.forEach(item => {
+                if (item.length == 0) {
+                    this.overviewInfo.noAnswer++
+                }
+            })
+            this.overviewInfo.answered = data.studentAnswers.length - this.overviewInfo.noAnswer
+            // 计算已评分未评分
+            this.overviewInfo.noScore = 0
+            data.studentScores.forEach(item => {
+                let flag = item.find(item => {
+                    return item == -1
+                })
+                if (flag) {
+                    this.overviewInfo.noScore++
+                }
+            })
+            this.overviewInfo.scored = data.studentScores.length - this.overviewInfo.noScore
+            // 班级总人数
+            this.overviewInfo.total = data.studentIds.length
+        },
         getStudentAnswer() {
             this.dataLoading = true
             let requestData = {
@@ -238,6 +268,11 @@ export default {
                     if (res.examClassResults) {
                         this.paperInfo[this.chooseClass]["studentAns"] = res.examClassResults[0];
                         this.setTableData();
+                        console.log('stuAns', res.examClassResults)
+                        if (res.examClassResults[0]) {
+                            this.calcOverView(res.examClassResults[0])
+                        }
+
                     }
                 },
                 (err) => {
@@ -247,13 +282,9 @@ export default {
                 setTimeout(() => {
                     this.$nextTick(() => {
                         let tableBody = document.getElementsByClassName('ivu-table-tbody')
-                        console.log('tableBody', tableBody)
                         let fixed = document.getElementsByClassName('ivu-table-fixed-body')
-                        console.log(fixed)
                         for (let iterator of fixed) {
-                            console.log(iterator)
                             let max = 653 > (48 * this.studentScore.length) ? (48 * this.studentScore.length) : 653
-                            // iterator.style.maxHeight =  (this.tableHeight - 40) + 'px'
                             iterator.style.maxHeight = max + 'px'
                         }
                     })
@@ -317,6 +348,7 @@ export default {
                         );
                     }
                 }
+                console.log('123', this.studentScore)
             }
 
         },
@@ -408,6 +440,27 @@ export default {
                 }
             },
             deep: true,
+        },
+        chooseStudent: {
+            handler(n, o) {
+                if (n.id) {
+                    let curStu = this.studentScore.find(item => {
+                        return item.id == n.id
+                    })
+                    console.log('curStu',curStu)
+                    if (curStu.status == 2) {
+                        let flag = n.scores.find(item => {
+                            return item == -1
+                        })
+                        if (!flag) {
+                            curStu.status = 3
+                            this.overviewInfo.noScore--
+                            this.overviewInfo.scored++
+                        }
+                    }
+                }
+            },
+            deep: true
         }
     },
     computed: {
@@ -437,7 +490,6 @@ export default {
                             ids: this.examInfo.targetClassIds
                         }).then(
                             res => {
-                                console.log('list', res)
                                 if (res.className && res.className.length) this.chooseClass = res.className[0].id
                                 this.privClassList = res.className
                             },

+ 18 - 6
TEAMModelOS/ClientApp/src/view/learnactivity/SimpleAnalysis.vue

@@ -43,35 +43,35 @@
         </div>
         <div class="overview-box" v-if="examInfo.progress == 'going'" style="margin-bottom:30px;">
             <div class="count-box">
-                <span class="count-subject-num">{{examInfo.stuCount}}</span>
+                <span class="count-subject-num">{{overviewInfo.total}}</span>
                 <span class="count-subject-text">
                     <Icon type="ios-people" class="count-icon" />
-                    人数
+                    人数
                 </span>
             </div>
             <div class="count-box" style="color:#2db7f5">
-                <span class="count-subject-num">352</span>
+                <span class="count-subject-num">{{overviewInfo.answered}}</span>
                 <span class="count-subject-text">
                     <Icon type="md-checkmark-circle" class="count-icon" />
                     已作答
                 </span>
             </div>
             <div class="count-box" style="color:#ed4014">
-                <span class="count-subject-num">400</span>
+                <span class="count-subject-num">{{overviewInfo.noAnswer}}</span>
                 <span class="count-subject-text">
                     <Icon type="md-remove-circle" class="count-icon" />
                     未作答
                 </span>
             </div>
             <div class="count-box" style="color:#19be6b">
-                <span class="count-subject-num">158</span>
+                <span class="count-subject-num">{{overviewInfo.scored}}</span>
                 <span class="count-subject-text">
                     <Icon type="md-star" class="count-icon" />
                     已评分
                 </span>
             </div>
             <div class="count-box"  style="color:#ff9900">
-                <span class="count-subject-num">58</span>
+                <span class="count-subject-num">{{overviewInfo.noScore}}</span>
                 <span class="count-subject-text">
                     <Icon type="ios-star-outline" class="count-icon" />
                     未评分
@@ -97,6 +97,18 @@ export default {
                 }
             },
             type: Object
+        },
+        overviewInfo:{
+            type:Object,
+            default:()=>{
+                return {
+                    total:0,
+                    answered:0,
+                    noAnswer:0,
+                    scored:0,
+                    noScore:0
+                }
+            }
         }
     }
 }

+ 3 - 0
TEAMModelOS/ClientApp/src/view/schoolmgmt/ClassroomSetting/ClassroomSetting.less

@@ -449,4 +449,7 @@
     padding: 1px 3px;
     border-radius: 3px;
     vertical-align:middle;
+}
+.item-tools{
+    display:none;
 }

+ 90 - 32
TEAMModelOS/ClientApp/src/view/schoolmgmt/ClassroomSetting/ClassroomSetting.vue

@@ -93,8 +93,18 @@
                 <span :class="currentTabIndex == 1 ? 'main-header-tab line-bottom line-bottom-active':'main-header-tab line-bottom'" @click="selectTab(1)">
                     {{$t('schoolBaseInfo.tab3')}}
                 </span>
-
-                <Button v-if="$access.can('admin.*|classroom-upd')" class="save-btn" :loading="isSaveLoading" :disabled="!updated" icon="ios-albums-outline" @click="saveClassroom()">{{$t('schoolBaseInfo.saveInfo')}}</Button>
+                <!-- 编辑教室 -->
+                <Button v-if="$access.can('admin.*|classroom-upd')" class="save-btn" :loading="isSaveLoading" :disabled="!updated" icon="ios-albums-outline" @click="saveClassroom()" v-show="currentTabIndex == 0">
+                    {{$t('schoolBaseInfo.saveInfo')}}
+                </Button>
+                <!-- 添加学生 -->
+                <Button v-if="$access.can('admin.*|student-upd')" class="save-btn" :loading="isSaveLoading" icon="md-add" @click="addStuStatus = true" v-show="currentTabIndex == 2">
+                    {{$t('schoolBaseInfo.addStuBtn')}}
+                </Button>
+                <!-- 删除学生 -->
+                <Button v-if="$access.can('admin.*|student-upd')" class="save-btn" style="margin-right:10px;" :loading="isSaveLoading" icon="md-trash" @click="delStudent()" v-show="currentTabIndex == 2">
+                    {{$t('schoolBaseInfo.delStuBtn')}}
+                </Button>
             </div>
             <div class="class-info-content">
                 <!--基础信息-->
@@ -167,13 +177,10 @@
                             <vuescroll>
                                 <div class="hiteach-collapse" v-for="(item, index) in showHiteachData" :key="index">
                                     <div @click="openHiSub(index)" class="hiteach-collapse-main">
-
                                         <Icon class="arrowIcon" v-if="item.deviceMax > 1" :type="item.subOpen ? 'ios-arrow-up' : 'ios-arrow-down'" size="30" color="white" />
-
                                         <v-icon v-if="item.prodCode == 'J223IZ6M'" class="proIcon" iconClass="htc_std" />
                                         <v-icon v-else-if="item.prodCode == '3222C6D2'" class="proIcon" iconClass="htc_tbl" />
                                         <v-icon v-else-if="item.prodCode == 'J223IZAM'" class="proIcon" iconClass="htc_pro" />
-
                                         <div class="proCont">
                                             <ul>
                                                 <li>
@@ -198,11 +205,9 @@
                                     </div>
                                     <div v-if="item.subOpen" id="hiteach-1">
                                         <template v-if="item.deviceBound.length >0">
-                                            <!-- <div v-for="(dbItem, dbIndex) in item.deviceBound" :key="dbIndex" class="hiteach-collapse-sub gradient" :class="{'linked': dbItem.classId != '' && dbItem.classId != null && classroomListShow[curClassIndex].id != dbItem.classId}"> -->
                                             <div v-for="(dbItem, dbIndex) in item.deviceBound" :key="dbIndex" class="hiteach-collapse-sub gradient" :class="{'linked': dbItem.classId != '' && dbItem.classId != null && classroomListShow[curClassIndex].id != dbItem.classId}">
                                                 <!-- 被關聯 disabled -->
                                                 <Checkbox :id="'checkbox-' + (dbItem.uuid + dbItem.uuid2)" @on-change="whatUpdHiLink(dbItem, classroomListShow[curClassIndex].id, item.id)" style="margin-right: 70px;" v-model="dbItem.hiteachLink" :disabled="dbItem.classId != '' && dbItem.classId != null && classroomListShow[curClassIndex].id != dbItem.classId"></Checkbox>
-
                                                 <div class="hiteach-collapse-sub-detail" @click="pushCheckbox(dbItem, (dbItem.classId && classroomListShow[curClassIndex].id != dbItem.classId))">
                                                     <ul>
                                                         <li>
@@ -233,12 +238,6 @@
                                         </template>
                                     </div>
                                 </div>
-                                <!-- <ul>
-                        <li v-for="(item,index) in hiTeachsShow" :key="index" @click.stop="chooseHiTeach(index)" :class="item.using > 0 ? 'fourth-text-color':''" :title="item.code">
-                            <span>{{item.code}}</span>
-                            <Tag color="#6BDFC3" v-if="item.single == 1">{{item.using+'/'+5}}</Tag>
-                        </li>
-                    </ul> -->
                             </vuescroll>
                         </div>
                     </div>
@@ -266,21 +265,27 @@
                     <vuescroll style="height:100%;" v-if="classroomListShow[curClassIndex] && classroomListShow[curClassIndex].openType == '1'">
                         <Table :columns="studentColumn" :data="students" @on-selection-change="(selections)=>{delSelection = selections}" :height="tableHeight" class="system-classroom-table" :loading="stuLoading" no-data-text="暂无学生">
                             <Loading slot="loading" bgColor="rgba(103, 103, 103, 0.27)"></Loading>
+                            <template slot-scope="{ row }" slot="picture">
+                                <PersonalPhoto :name="row.name" :picture="row.picture" />
+                            </template>
                             <template slot-scope="{ row ,index}" slot="action">
-                                <strong></strong>
+                                <div class="item-tools" v-if="$access.can('admin.*|student-upd')">
+                                    <Icon type="md-create" size="18" color="white" @click="editStudent(row)" :title="$t('schoolBaseInfo.editSeat')" />
+                                </div>
                             </template>
-                            <template slot-scope="{ row, index }" slot="groupId">
+                            <!-- <template slot-scope="{ row, index }" slot="groupId">
                                 <span>{{row.groupId ? row.groupId : '- -'}}</span>
                             </template>
                             <template slot-scope="{ row, index }" slot="groupName">
                                 <span>{{row.groupName ? row.groupName : '未分组'}}</span>
-                            </template>
+                            </template> -->
                         </Table>
                     </vuescroll>
                     <h2 v-else style="text-align:center;color:#cccccc;width:100%;padding-top:80px;">{{$t('schoolBaseInfo.onClassStu')}}</h2>
                 </div>
             </div>
         </div>
+        <!-- 原来可以创建序号,如果现在调整序列号部分后不需要添加可以删除相关代码 -->
         <Modal v-model="addCode" :title="$t('schoolBaseInfo.addCodeTitle')" @on-ok="confirmAdd" class-name="dark-iview-modal dark-iview-form">
             <Form :model="hiTeachItem" :label-width="80" label-position="left">
                 <FormItem :label="$t('schoolBaseInfo.hiTeach')">
@@ -294,6 +299,9 @@
                 </FormItem>
             </Form>
         </Modal>
+        <Modal v-model="addStuStatus" title="添加学生" width="1200" @on-ok="confirmAddStu" class-name="dark-iview-modal">
+            <StudentList @getSelectInfo="(selction)=>{selections = selction}"></StudentList>
+        </Modal>
     </div>
 </template>
 
@@ -304,7 +312,12 @@ import '@/icons/svg/htc_std.svg'
 import '@/icons/svg/htc_tbl.svg'
 import '@/icons/svg/board.svg'
 import { mapGetters } from 'vuex'
+import PersonalPhoto from "@/components/public/personalPhoto/Index.vue"
+import StudentList from '@/components/coursemgt/StudentList.vue'
 export default {
+    components: {
+        PersonalPhoto,StudentList
+    },
     data() {
         // 验证只能是字母和数字
         const validateCode = (rule, value, callback) => {
@@ -320,16 +333,22 @@ export default {
         }
         return {
             studentColumn: [
+                // {
+                //     title: ' ',
+                //     type: 'selection',
+                //     width: 60,
+                //     align: 'center'
+                // },
                 {
                     title: ' ',
-                    type: 'selection',
-                    width: 80,
-                    align: 'center'
+                    slot: 'picture',
+                    align: 'left ',
+                    width: '150'
                 },
                 {
                     title: this.$t('courseManage.classroom.studentTableC2'),
                     key: 'name',
-                    align: 'left '
+                    align: 'center '
                 },
                 {
                     title: this.$t('courseManage.classroom.studentTableC7'),
@@ -343,17 +362,24 @@ export default {
                     align: 'center',
                     sortable: true
                 },
+                //这里暂不显示分组信息
+                // {
+                //     title: this.$t('courseManage.classroom.studentTableC5'),
+                //     slot: 'groupId',
+                //     align: 'center',
+                //     sortable: true
+                // },
+                // {
+                //     title: this.$t('courseManage.classroom.studentTableC6'),
+                //     slot: 'groupName',
+                //     align: 'center'
+                // }
                 {
-                    title: this.$t('courseManage.classroom.studentTableC5'),
-                    slot: 'groupId',
-                    align: 'center',
-                    sortable: true
+                    title: ' ',
+                    slot: 'action',
+                    align: 'left ',
+                    width: '150'
                 },
-                {
-                    title: this.$t('courseManage.classroom.studentTableC6'),
-                    slot: 'groupName',
-                    align: 'center'
-                }
             ],
             updHiteachLink: [],
             orgHiteachData: [],
@@ -361,6 +387,8 @@ export default {
             schoolBase: {
                 period: []
             },
+            selections:[],
+            addStuStatus:false,
             stuLoading: false,
             orderBy: 'id',
             filterHiteachVer: 'ALL',
@@ -540,8 +568,34 @@ export default {
         }
     },
     methods: {
-        showtest(val) {
-            console.log(val, 'showtest')
+        //确认添加学生
+        confirmAddStu() {
+            if (this.selections.length > 0) {
+                console.log(this.selections)
+                //保存操作
+                // this.listLoading = true
+                // this.courseListP[this.curCusIndex].code = this.$store.state.userInfo.TEAMModelId
+                // this.$api.schoolSetting.classUpsert({
+                //     classroom: this.courseListP[this.curCusIndex].classes[this.curClassIndex],
+                //     option: 'update',
+                //     'school_code': this.$store.state.userInfo.TEAMModelId
+                // }).then(
+                //     (res) => {
+                //         if (!res.error) {
+                //             this.selections.length = 0
+                //             this.$Message.success('添加成功!')
+                //         } else {
+                //             this.$Message.error('添加失败!')
+                //         }
+                //     },
+                //     (err) => {
+                //         this.$Message.error('添加失败!')
+                //     }
+                // ).finally(() => {
+                //     this.listLoading = false
+                //     this.baseEditStatus = !this.baseEditStatus
+                // })
+            }
         },
         dropdownStates(flag) {
             if (!flag) this.filterByPeriod()
@@ -773,7 +827,7 @@ export default {
             this.activeIcon = this.checkActivieIcon(this.point)
             if (this.activeIcon != -1 && this.activeIcon != this.curClassIndex) {
                 this.$Message.warning(this.$t('schoolBaseInfo.noStdClass'))
-                this.activeIcon = -1 
+                this.activeIcon = -1
             } else {
                 this.isMouseDown = true
             }
@@ -1387,6 +1441,10 @@ export default {
 @import "./ClassroomSetting.less";
 </style>
 <style>
+.class-mgt-container .ivu-table-row-hover .item-tools{
+    display:inline-block ;
+    cursor: pointer;
+}
 .class-info-content
     .ivu-select-single
     .ivu-select-selection

+ 1 - 4
TEAMModelOS/ClientApp/src/view/student-account/Index.vue

@@ -61,10 +61,7 @@
         <!--学生账号table-->
         <div class="sc-content dark-iview-table"
              style="position: relative; padding-left: 20px"
-             :style="{
-        width: authorizationStatus == true ? '70%' : '100%',
-        transition: 'all 0.7s'
-      }">
+             :style="{width: authorizationStatus == true ? '70%' : '100%',transition: 'all 0.7s'}">
             <Scroll :on-reach-bottom="scrollLoad" height="750" :distance-to-edge="[15, 15]">
                 <Table ref="selection" :columns="tableColumns" :data="tableShowData" :loading="tableLoading" @on-selection-change="getSelectInfo">
                     <template slot-scope="{ row }" slot="status">

+ 1 - 1
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue

@@ -346,8 +346,8 @@
                                 normal: { // 渐变色
                                     color: 'rgb(102,204,204)'
                                 },
-                                width: 20
                             },
+							barMaxWidth: 40,
                             markPoint: {
                                 data: [
                                     { type: 'max', name: '最大值' },

+ 5 - 5
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.vue

@@ -24,7 +24,7 @@
 							<div class="section-box">
 								<div class="exam-data-item block-item">
 									<div class="item-content">
-										<div class="item-num">{{ examList.length }}</div>
+										<div class="item-num">{{ originList.length }}</div>
 										<div class="item-name">
 											{{ $t("totalAnalysis.ti_text12") }}
 										</div>
@@ -32,7 +32,7 @@
 								</div>
 								<div class="exam-data-item block-item">
 									<div class="item-content">
-										<div class="item-num">0</div>
+										<div class="item-num">{{ originList.filter(i => i.type === 'regular').length }}</div>
 										<div class="item-name">
 											{{ $t("totalAnalysis.ti_text6") }}
 										</div>
@@ -40,7 +40,7 @@
 								</div>
 								<div class="exam-data-item block-item">
 									<div class="item-content">
-										<div class="item-num">0</div>
+										<div class="item-num">{{ originList.filter(i => i.type === 'simulation').length }}</div>
 										<div class="item-name">
 											{{ $t("totalAnalysis.ti_text7") }}
 										</div>
@@ -48,7 +48,7 @@
 								</div>
 								<div class="exam-data-item block-item">
 									<div class="item-content">
-										<div class="item-num">0</div>
+										<div class="item-num">{{ originList.filter(i => i.type === 'normal').length }}</div>
 										<div class="item-name">
 											{{ $t("totalAnalysis.ti_text8") }}
 										</div>
@@ -299,7 +299,7 @@
 		},
 		created() {
 			this.getSchoolInfo();
-			this.getHomePageData();
+			// this.getHomePageData();
 			this.getExamList();
 			// this.filterData =
 		},

+ 13 - 3
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/KnowledgeAnalysis.vue

@@ -84,7 +84,7 @@
 
         methods: {
             renderClassColumns(classData,origin) {
-				console.log(origin)
+				let classColumns = []
                 // 渲染得分率关系表格的班级数据
 				classData.classes.forEach((item,index) => {
 				    let classColumn = {
@@ -96,8 +96,11 @@
 				        },
 				        minWidth: 150
 				    }
-				    this.tableColumns.push(classColumn)
+				    classColumns.push(classColumn)
 				})
+				
+				// 清除之前的科目columns 添加当前评测的科目columns
+				this.tableColumns.splice(2,this.tableColumns.length - 2,...classColumns)
             },
 
             changePieOrBar() {
@@ -144,7 +147,14 @@
 				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis.currentSubject)
 				return this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].pointKey.pointList.length
 			}
-        }
+        },
+		
+		watch: {
+		    getKnowledgeData(val) {
+		        if (!val) return
+				this.doRender(val)
+		    }
+		}
     }
 </script>
 

+ 2 - 2
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue

@@ -202,10 +202,10 @@
                 deep: true,
                 handler(val) {
                     if (val) {
-                        this.doRender(val)
+                        this.doRender(val,val.pointList[0])
+						this.doRenderWrong(val)
                     }
                 }
-
             }
         }
     }

+ 13 - 2
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/LevelAnalysis.vue

@@ -69,6 +69,7 @@
 
         methods: {
             renderClassColumns(classData,origin) {
+				let classColumns = []
                 // 渲染得分率关系表格的班级数据
             	classData.classes.forEach((item,index) => {
             	    let classColumn = {
@@ -80,8 +81,11 @@
             	        },
             	        minWidth: 150
             	    }
-            	    this.tableColumns.push(classColumn)
+            	    classColumns.push(classColumn)
             	})
+				
+				// 清除之前的科目columns 添加当前评测的科目columns
+				this.tableColumns.splice(2,this.tableColumns.length - 2,...classColumns)
             },
 
             changePieOrBar() {
@@ -131,9 +135,16 @@
 			getAnalysisJson() {
 			    return this.$store.state.totalAnalysis.analysisJson
 			},
+			getKnowledgeData() {
+				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis.currentSubject)
+			    return this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].pointKey
+			},
         },
         watch: {
-            
+            getKnowledgeData(val) {
+                if (!val) return
+        		this.doRender(this.getLevelData)
+            }
         }
     }
 </script>

+ 217 - 197
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue

@@ -1,214 +1,234 @@
 <template>
-    <div class="scatter-container">
-        <Row>
-            <Col span="12">
-                <span class="component-title">{{$t('totalAnalysis.le_title4')}}</span>
-                <span class="pie-to-bar" @click="changeRadarOrBar"><Icon :type="isShowRadar ? 'ios-podium' : 'ios-pie'" />{{isShowRadar?$t('totalAnalysis.ka_chart_text1'):$t('totalAnalysis.ka_chart_text2')}}</span>
-                <div v-show="!isShowRadar">
-                    <BaseDetailBar echartsId="levelDetailBar" :echartData="levelData" @handleItemClick="handleItemClick" ref="detailsBar"></BaseDetailBar>
-                </div>
-                <div v-if="isShowRadar">
-                    <BaseRadar echartsId="levelRadar"></BaseRadar>
-                </div>
-            </Col>
-            <Col span="12">
-            <span class="component-title">{{$t('totalAnalysis.le_title5')}}<span style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">{{$t('totalAnalysis.ka_text3')}}:{{transArr[+currentPoint-1]}}</span></span>
-                <div style="padding:0 50px;">
-                    <BaseMyTable :columns="detailsColumns"
-                                 :tableName="$t('totalAnalysis.le_title5')"
-                                  tableRef="levelScoreTable"
-                                 :tableDatas="tableData" ref="detailsTable"></BaseMyTable>
-                </div>
-            </Col>
-        </Row>
-        <Divider />
-        <Row>
-            <span class="component-title">{{$t('totalAnalysis.le_title6')}}</span>
-            <div style="padding:20px 50px;">
-                <BaseMyTable :columns="tableColumns"
-                             :tableName="$t('totalAnalysis.le_title6')"
-                             tableRef="levelWrongTable"
-                             :tableDatas="numData" ref="numTable" :tips="$t('totalAnalysis.ka_tip1')"></BaseMyTable>
-            </div>
-            <!--<span style="/*font-size:14px;font-weight:bold;margin-left:60px;color:#66cccc*/"></span>-->
-        </Row>
-    </div>
+	<div class="scatter-container">
+		<Row>
+			<Col span="12">
+			<span class="component-title">{{$t('totalAnalysis.le_title4')}}</span>
+			<span class="pie-to-bar" @click="changeRadarOrBar">
+				<Icon :type="isShowRadar ? 'ios-podium' : 'ios-pie'" />{{isShowRadar?$t('totalAnalysis.ka_chart_text1'):$t('totalAnalysis.ka_chart_text2')}}</span>
+			<div v-show="!isShowRadar">
+				<BaseDetailBar echartsId="levelDetailBar" :echartData="levelData" @handleItemClick="handleItemClick" ref="detailsBar"></BaseDetailBar>
+			</div>
+			<div v-if="isShowRadar">
+				<BaseRadar echartsId="levelRadar"></BaseRadar>
+			</div>
+			</Col>
+			<Col span="12">
+			<span class="component-title">{{$t('totalAnalysis.le_title5')}}<span style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">{{$t('totalAnalysis.ka_text3')}}:{{transArr[+currentPoint-1]}}</span></span>
+			<div style="padding:0 50px;">
+				<BaseMyTable :columns="detailsColumns" :tableName="$t('totalAnalysis.le_title5')" tableRef="levelScoreTable"
+				 :tableDatas="tableData" ref="detailsTable"></BaseMyTable>
+			</div>
+			</Col>
+		</Row>
+		<Divider />
+		<Row>
+			<span class="component-title">{{$t('totalAnalysis.le_title6')}}</span>
+			<div style="padding:20px 50px;">
+				<BaseMyTable :columns="tableColumns" :tableName="$t('totalAnalysis.le_title6')" tableRef="levelWrongTable"
+				 :tableDatas="numData" ref="numTable" :tips="$t('totalAnalysis.ka_tip1')"></BaseMyTable>
+			</div>
+			<!--<span style="/*font-size:14px;font-weight:bold;margin-left:60px;color:#66cccc*/"></span>-->
+		</Row>
+	</div>
 </template>
 
 <script>
-    import BaseDetailBar from '@/components/student-analysis/total/BaseKnowledgeDetail.vue'
-    import BaseMyTable from '@/components/student-analysis/total/BaseMyTable.vue'
-    import BaseRadar from '@/components/student-analysis/total/BaseRadar.vue'
-    export default {
-        components: {
-            BaseDetailBar, BaseMyTable, BaseRadar
-        },
-        data() {
-            return {
-                isShowRadar: false,
-                tableData: [],
-                classDatas: [],
-                currentPoint: 1,
-				transArr:this.$GLOBAL.EXERCISE_LEVELS(),
-                tipContent: '* RH:高分区段  /  RL:低分区段 (模拟数据,仅供参考)',
-                levelData: [],
-                numData: [],
-                tableColumns: [
-                    {
-                        title: this.$t('totalAnalysis.ka_table_text2'),
-                        key: 'name',
-                        minWidth: 150
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ka_table_text4'),
-                        key: 'point',
-                        minWidth: 100,
-                        sortable: 'custom',
-                        renderType: function(h, params) {
-                            return h('span', Number(params.row.point).toFixed(2))
-                        }
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ka_table_text7'),
-                        key: 'itemNO',
-                        renderType: 'renderHard',
-                        width: 250
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ka_table_text8'),
-                        key: 'persent',
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.persent)).toFixed(2) + '%')
-                        },
-                        sortable: 'custom',
-                        minWidth: 100
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ka_table_text9'),
-                        key: 'wrong',
-                        sortable: 'custom',
-                        minWidth: 100
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ka_table_text10'),
-                        key: 'rhw',
-                        sortable: 'custom',
-                        minWidth: 100
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ka_table_text11'),
-                        key: 'rlw',
-                        sortable: 'custom',
-                        minWidth: 100
-                    }
-                ],
-                detailsColumns: [
-                    {
-                        title: this.$t('totalAnalysis.base_name'),
-                        key: 'id',
-                        minWidth: 100
-                    },
-                    {
-                        title: this.$t('totalAnalysis.base_class'),
-                        key: 'className',
-                        width: 120
-                    },
-                    {
-                        title: this.$t('totalAnalysis.base_id'),
-                        key: 'seatNO',
-                        width: 100
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ka_table_text4'),
-                        key: 'point',
-                        sortable: 'custom',
-                        renderType: function(h, params) {
-                            return h('span', Number(params.row.point).toFixed(2))
-                        },
-                        minWidth: 100
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ka_table_text5'),
-                        key: 'anwPoint',
-                        minWidth: 100,
-                        sortable: 'custom',
-                        renderType: function(h, params) {
-                            return h('span', Number(params.row.anwPoint).toFixed(2))
-                        }
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ka_table_text6'),
-                        key: 'persent',
-                        minWidth: 100,
-                        sortable: 'custom',
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.persent) * 100).toFixed(2) + '%')
-                        }
-                    }
-                ]
-            }
-        },
-        created() {
+	import BaseDetailBar from '@/components/student-analysis/total/BaseKnowledgeDetail.vue'
+	import BaseMyTable from '@/components/student-analysis/total/BaseMyTable.vue'
+	import BaseRadar from '@/components/student-analysis/total/BaseRadar.vue'
+	export default {
+		components: {
+			BaseDetailBar,
+			BaseMyTable,
+			BaseRadar
+		},
+		data() {
+			return {
+				isShowRadar: false,
+				tableData: [],
+				classDatas: [],
+				currentPoint: 1,
+				transArr: this.$GLOBAL.EXERCISE_LEVELS(),
+				tipContent: '* RH:高分区段  /  RL:低分区段 (模拟数据,仅供参考)',
+				levelData: [],
+				numData: [],
+				tableColumns: [{
+						title: this.$t('totalAnalysis.ka_table_text2'),
+						key: 'name',
+						minWidth: 150
+					},
+					{
+						title: this.$t('totalAnalysis.ka_table_text4'),
+						key: 'point',
+						minWidth: 100,
+						sortable: 'custom',
+						renderType: function(h, params) {
+							return h('span', Number(params.row.point).toFixed(2))
+						}
+					},
+					{
+						title: this.$t('totalAnalysis.ka_table_text7'),
+						key: 'itemNO',
+						renderType: 'renderHard',
+						width: 250
+					},
+					{
+						title: this.$t('totalAnalysis.ka_table_text8'),
+						key: 'persent',
+						renderType: function(h, params) {
+							return h('span', (Number(params.row.persent)).toFixed(2) + '%')
+						},
+						sortable: 'custom',
+						minWidth: 100
+					},
+					{
+						title: this.$t('totalAnalysis.ka_table_text9'),
+						key: 'wrong',
+						sortable: 'custom',
+						minWidth: 100
+					},
+					{
+						title: this.$t('totalAnalysis.ka_table_text10'),
+						key: 'rhw',
+						sortable: 'custom',
+						minWidth: 100
+					},
+					{
+						title: this.$t('totalAnalysis.ka_table_text11'),
+						key: 'rlw',
+						sortable: 'custom',
+						minWidth: 100
+					}
+				],
+				detailsColumns: [{
+						title: this.$t('totalAnalysis.base_name'),
+						key: 'id',
+						minWidth: 100
+					},
+					{
+						title: this.$t('totalAnalysis.base_class'),
+						key: 'className',
+						width: 120
+					},
+					{
+						title: this.$t('totalAnalysis.base_id'),
+						key: 'seatNO',
+						width: 100
+					},
+					{
+						title: this.$t('totalAnalysis.ka_table_text4'),
+						key: 'point',
+						sortable: 'custom',
+						renderType: function(h, params) {
+							return h('span', Number(params.row.point).toFixed(2))
+						},
+						minWidth: 100
+					},
+					{
+						title: this.$t('totalAnalysis.ka_table_text5'),
+						key: 'anwPoint',
+						minWidth: 100,
+						sortable: 'custom',
+						renderType: function(h, params) {
+							return h('span', Number(params.row.anwPoint).toFixed(2))
+						}
+					},
+					{
+						title: this.$t('totalAnalysis.ka_table_text6'),
+						key: 'persent',
+						minWidth: 100,
+						sortable: 'custom',
+						renderType: function(h, params) {
+							return h('span', (Number(params.row.persent) * 100).toFixed(2) + '%')
+						}
+					}
+				]
+			}
+		},
+		created() {
 
-        },
+		},
 
-        methods: {
+		methods: {
 
-            changeRadarOrBar() {
-                this.isShowRadar = !this.isShowRadar
-            },
+			changeRadarOrBar() {
+				this.isShowRadar = !this.isShowRadar
+			},
 
-            // 点击柱状图某个点事件
-            handleItemClick(item) {
-                this.currentPoint = this.transArr.indexOf(item.name) + 1
-                this.doRender(this.getLevelData, this.currentPoint)
-            },
+			// 点击柱状图某个点事件
+			handleItemClick(item) {
+				this.currentPoint = this.transArr.indexOf(item.name) + 1
+				this.doRender(this.getLevelData, this.currentPoint)
+			},
 
-            doRender(data, point) {
-                let origin = data.stupercent
-                let keys = origin.keys
-                let datas = origin[point]
-                this.tableData = this.$tools.jsonTransform({ datas: datas, keys: keys })
-            },
+			doRender(data, point) {
+				let origin = data.stupercent
+				let keys = origin.keys
+				let datas = origin[point]
+				this.tableData = this.$tools.jsonTransform({
+					datas: datas,
+					keys: keys
+				})
+			},
 
-            doRenderWrong(data) {
-                let origin = data.wrong
-                let keys = origin.keys
-                let datas = origin.datas
+			doRenderWrong(data) {
+				let origin = data.wrong
+				let keys = origin.keys
+				let datas = origin.datas
 				console.log(datas)
-				datas.forEach((i,index) => {
+				datas.forEach((i, index) => {
 					i[0] = this.transArr[index]
 				})
-                this.numData = this.$tools.jsonTransform({ datas: datas, keys: keys })
-            }
+				this.numData = this.$tools.jsonTransform({
+					datas: datas,
+					keys: keys
+				})
+			}
 
-        },
-        mounted() {
-            this.$refs.detailsTable.$el.childNodes[1].style.borderRight = '0'
-            this.$refs.numTable.$el.childNodes[1].style.borderRight = '0'
-            if (this.getLevelData) {
-                this.doRender(this.getLevelData, this.currentPoint)
-                this.doRenderWrong(this.getLevelData)
-            }
-        },
-        computed: {
-            // 获取最新散点图数据
-            getLevelData() {
-                let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis.currentSubject)
-                let levelJson = this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].levelKey
-                let transArr = this.$GLOBAL.EXERCISE_LEVELS()
-                levelJson.pointList = levelJson.pointList.map((i,index) => transArr[index])
-                for(let key in levelJson.classpercent){
-                	if(!isNaN(key)){
-                		let newKey = transArr[+key - 1]
-                		levelJson.classpercent[newKey] = levelJson.classpercent[key]
-                		levelJson.stupercent[newKey] = levelJson.stupercent[key]
-                	}
-                }
-                return levelJson
-            }
-        }
-    }
+		},
+		mounted() {
+			this.$refs.detailsTable.$el.childNodes[1].style.borderRight = '0'
+			this.$refs.numTable.$el.childNodes[1].style.borderRight = '0'
+			if (this.getLevelData) {
+				this.doRender(this.getLevelData, this.currentPoint)
+				this.doRenderWrong(this.getLevelData)
+			}
+		},
+		computed: {
+			// 获取最新散点图数据
+			getLevelData() {
+				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state
+					.totalAnalysis.currentSubject)
+				let levelJson = this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].levelKey
+				let transArr = this.$GLOBAL.EXERCISE_LEVELS()
+				levelJson.pointList = levelJson.pointList.map((i, index) => transArr[index])
+				for (let key in levelJson.classpercent) {
+					if (!isNaN(key)) {
+						let newKey = transArr[+key - 1]
+						levelJson.classpercent[newKey] = levelJson.classpercent[key]
+						levelJson.stupercent[newKey] = levelJson.stupercent[key]
+					}
+				}
+				return levelJson
+			},
+			// 获取最新散点图数据
+			getKnowledgeData() {
+				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state
+					.totalAnalysis.currentSubject)
+				return this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].pointKey
+			}
+		},
+		watch: {
+			getKnowledgeData: {
+				handler(val) {
+					if (val) {
+						this.doRender(this.getLevelData, this.getLevelData.pointList[0])
+						this.doRenderWrong(this.getLevelData)
+					}
+				}
+			}
+		}
+	}
 </script>
 
 <style src="./LevelAnalysis.css" scoped></style>

+ 2 - 0
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue

@@ -270,6 +270,7 @@
 			
 			let curExam = JSON.parse(localStorage.getItem('curExam'))
 			let curSubjectIndex = curExam.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis.currentSubject)
+			console.log(curSubjectIndex)
 			console.log('当前的评测数据',curExam)
 			let curPaper = curExam.papers[curSubjectIndex]
 			this.initFullPaper(curPaper)
@@ -314,6 +315,7 @@
         methods: {
 			
 			async initFullPaper(examPaper){
+				console.log(examPaper.name)
 				let fullPaperJson =  await this.$evTools.getFullPaper(examPaper)
 				this.questionList = fullPaperJson.item
 				this.SingleList = this.questionList.filter(item => item.type === 'single')

+ 8 - 3
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue

@@ -283,6 +283,7 @@
 
         methods: {
             renderClassColumns(classData) {
+				let classCloumns = []
                 // 渲染进线表格的班级数据
                 classData.classes.forEach(item => {
                     let classColumn = {
@@ -294,8 +295,10 @@
                         },
                         minWidth: 150
                     }
-                    this.exerciseColumns.push(classColumn)
+                    classCloumns.push(classColumn)
                 })
+				
+				this.exerciseColumns.splice(4,this.exerciseColumns.length - 4,...classCloumns)
             },
 
             // 点击落点图某个点事件
@@ -374,7 +377,7 @@
 				let newArr = []
 				arr.forEach(item => {
 					let arr2 = []
-					arr2.push((item.X * 100).toFixed(2))
+					arr2.push((+item.X).toFixed(2))
 					arr2.push((item.Y * 100).toFixed(2))
 					arr2.push(item.type)
 					arr2.push(item.id)
@@ -396,7 +399,9 @@
 			this.$EventBus.$off('onSubjectChange')
 			this.$EventBus.$on('onSubjectChange',val => {
 				this.doRender(this.getAnalysisJson)
-				this.$refs.lineBar.renderData(this.getAnalysisJson)
+				// this.$nextTick(() => {
+				// 	this.$refs.lineBar.renderData(this.getAnalysisJson)
+				// })
 			})
         },
         computed: {

+ 46 - 33
TEAMModelOS/ClientApp/src/view/teachcontent/index.vue

@@ -128,8 +128,9 @@
                                         <img v-else src="../../assets/icon/prelearn50.png" width="15" />
                                     </div>
                                     <span v-show="editIndex !== index">{{row.name}}</span>
-                                    <Input v-model="fileListShow[index].name" v-show="editIndex == index" style="width: 300px;" />
-                                    <Icon type="md-checkmark" v-show="editIndex == index" @click="confirmRename" class="rename-action-icon" />
+                                    <Input v-model="fileListShow[index].name" v-show="editIndex == index" style="width: 300px;" @on-change="checkName" />
+                                    <span style="color:#ed4014" v-show="editIndex == index && formatErr">不能包含特殊字符(?*:"<>\/|)</span>
+                                    <Icon type="md-checkmark" v-show="editIndex == index && !formatErr" @click="confirmRename" class="rename-action-icon" />
                                     <Icon type="md-close" v-show="editIndex == index" @click="cancelRename" class="rename-action-icon" />
                                 </div>
                             </template>
@@ -202,7 +203,8 @@ export default {
     },
     data() {
         return {
-            sizeLoading:false,
+            formatErr: false,
+            sizeLoading: false,
             editIndex: -1,
             containerClient: undefined,
             waterfallWidth: 1000,
@@ -250,6 +252,17 @@ export default {
         }
     },
     methods: {
+        //检查文件特殊字符
+        checkName(data) {
+            let reg = new RegExp('[?*:"<>\/|]')
+            if (reg.test(this.fileListShow[this.editIndex].name)) {
+                console.log(1)
+                this.formatErr = true
+            } else {
+                console.log(2)
+                this.formatErr = false
+            }
+        },
         rename(row, index) {
             this.editIndex = index
             this.renameBefore = row.name
@@ -557,7 +570,7 @@ export default {
                 err => {
                     this.$Message.error('空间计算异常')
                 }
-            ).finally(()=>{
+            ).finally(() => {
                 this.sizeLoading = false
             })
         },
@@ -804,32 +817,32 @@ export default {
             let date = new Date(timestamp)
             return date.toLocaleString()
         },
-        // 处理教材文件夹的文件
-        handleHTEXFile(fileList) {
-            let parseRes = []
-            let names = []
-            fileList.forEach((item, index) => {
-                let fileItem = {}
-                let startIndex = this.$jsFn.findChartIndex(item.blob,'/',1)
-                let endIndex = this.$jsFn.findChartIndex(item.blob,'/',2)
-                let name = item.blob.substring(startIndex + 1, endIndex)
-                let nameIndex = names.indexOf(name)
-                if (nameIndex == -1) {
-                    fileItem.url = this.urlString + '/res/' + name
-                    fileItem.blob = `/res/${name}/index.json`
-                    fileItem.name = name + '.HTEX'
-                    fileItem.size = item.size
-                    fileItem.createTime = item.createTime
-                    fileItem.extension = 'HTEX'
-                    fileItem.type = 'res'
-                    names.push(name)
-                    parseRes.push(fileItem)
-                } else {
-                    parseRes[nameIndex].size += item.size
-                }
-            })
-            return parseRes
-        },
+        // 处理教材文件夹的文件 在BlobTool统一处理
+        // handleHTEXFile(fileList) {
+        //     let parseRes = []
+        //     let names = []
+        //     fileList.forEach((item, index) => {
+        //         let fileItem = {}
+        //         let startIndex = this.$jsFn.findChartIndex(item.blob, '/', 1)
+        //         let endIndex = this.$jsFn.findChartIndex(item.blob, '/', 2)
+        //         let name = item.blob.substring(startIndex + 1, endIndex)
+        //         let nameIndex = names.indexOf(name)
+        //         if (nameIndex == -1) {
+        //             fileItem.url = this.urlString + '/res/' + name
+        //             fileItem.blob = `/res/${name}/index.json`
+        //             fileItem.name = name + '.HTEX'
+        //             fileItem.size = item.size
+        //             fileItem.createTime = item.createTime
+        //             fileItem.extension = 'HTEX'
+        //             fileItem.type = 'res'
+        //             names.push(name)
+        //             parseRes.push(fileItem)
+        //         } else {
+        //             parseRes[nameIndex].size += item.size
+        //         }
+        //     })
+        //     return parseRes
+        // },
         /**查询文件列表 */
         findFileList() {
             if (this.containerClient) {
@@ -846,9 +859,9 @@ export default {
                         console.log(res)
                         console.log(this.containerName)
                         this.mk[this.activeType] = res.continuationToken
-                        if (this.activeType == 'res') {
-                            res.blobList = this.handleHTEXFile(res.blobList)
-                        }
+                        // if (this.activeType == 'res') {
+                        //     res.blobList = this.handleHTEXFile(res.blobList)
+                        // }
                         //拼接授权字符串
                         for (let i in res.blobList) {
                             console.log(res.blobList[i].url)

+ 45 - 56
TEAMModelOS/Controllers/Core/ImportController.cs

@@ -41,35 +41,20 @@ namespace TEAMModelOS.Controllers
     {
         public PPTX2HTEXTranslator _PPTX2HTEXTranslator { get; set; }
         public DOXC2HTMLTranslator _DOXC2HTMLTranslator { get; set; }
-        public HTML2ITEMTranslator _HTML2ITEMTranslator { get; set; }
-        //  private readonly IHtexService htexService;
+
         private readonly AzureStorageFactory _azureStorage;
         private readonly IWebHostEnvironment _webHostEnvironment;
-        private List<LangConfig> langConfigs { get; set; }
         private readonly IHttpClientFactory _clientFactory;
-        public ImportController(AzureStorageFactory azureStorage, IWebHostEnvironment webHostEnvironment,
+        public HTML2ITEMV3Translator _HTML2ITEMV3Translator { get; set; }
+        public ImportController(
             PPTX2HTEXTranslator PPTX2HTEXTranslator, IHttpClientFactory clientFactory,
-            DOXC2HTMLTranslator DOXC2HTMLTranslator, HTML2ITEMTranslator HTML2ITEMTranslator)
+            DOXC2HTMLTranslator DOXC2HTMLTranslator, HTML2ITEMV3Translator HTML2ITEMV3Translator)
         {
-            _HTML2ITEMTranslator = HTML2ITEMTranslator;
+            _HTML2ITEMV3Translator = HTML2ITEMV3Translator;
             _DOXC2HTMLTranslator = DOXC2HTMLTranslator;
             _clientFactory = clientFactory;
             this._PPTX2HTEXTranslator = PPTX2HTEXTranslator;
-            _webHostEnvironment = webHostEnvironment;
-            _azureStorage = azureStorage;
-            string path = _webHostEnvironment.ContentRootPath + "/JsonFile/Core/LangConfig.json";
-            FileStream fs = new FileStream(path, System.IO.FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
-            StreamReader sr = new StreamReader(fs, System.Text.Encoding.UTF8);
-            String line;
-            StringBuilder builder = new StringBuilder();
-            while ((line = sr.ReadLine()) != null)
-            {
-                builder.Append(line.ToString());
-            }
 
-            sr.Close();
-            string text = builder.ToString();
-            langConfigs = text.ToObject<List<LangConfig>>();
         }
         private static string ReplaceLast(string input, string oldValue, string newValue)
         {
@@ -140,26 +125,27 @@ namespace TEAMModelOS.Controllers
                 {
                     return Ok(new { index = "" });
                 }
-                else if (ext.ToLower() == "htex" )
+                else if (ext.ToLower() == "htex")
                 {
-                    var index=await   HTEXTranslator(containerid, FileName, stream);
+                    var index = await HTEXTranslator(containerid, FileName, stream);
                     return Ok(new { index = index });
                 }
-                else {
+                else
+                {
                     return Ok(new { index = "" });
                 }
             }
             else { return BadRequest("不是正确的Blob链接!"); }
         }
 
-        private   async Task<string> HTEXTranslator(string containerid,string FileName, Stream stream)
+        private async Task<string> HTEXTranslator(string containerid, string FileName, Stream stream)
         {
             await _azureStorage.GetBlobServiceClient().DelectBlobs(containerid, $"res/{FileName}");
             Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
             //处理中文乱码问题
             Encoding encoding = Encoding.GetEncoding("GB2312");
-            var options = new ReadOptions {  Encoding = encoding };
-            string index=null;
+            var options = new ReadOptions { Encoding = encoding };
+            string index = null;
             bool hasindex = false;
             List<Task<string>> tasks = new List<Task<string>>();
             ZipFile zip = ZipFile.Read(stream, options);
@@ -167,7 +153,7 @@ namespace TEAMModelOS.Controllers
             List<Stream> streams = new List<Stream>();
             foreach (var f in zip.Entries)
             {
-                string name = FileName +"/"+ f.FileName;
+                string name = FileName + "/" + f.FileName;
                 if (f.IsDirectory)
                 {
                     continue;
@@ -177,21 +163,24 @@ namespace TEAMModelOS.Controllers
                 uploadStream.Read(buffer, 0, buffer.Length);
                 Stream blobstream = new MemoryStream(buffer);
                 streams.Add(blobstream);
-                tasks.Add(  _azureStorage.UploadFileByContainer(containerid, blobstream, "res", $"{name}", false));
-                if (name.Contains($"{FileName}/index.json")) {
-                    hasindex = true; 
+                tasks.Add(_azureStorage.UploadFileByContainer(containerid, blobstream, "res", $"{name}", false));
+                if (name.Contains($"{FileName}/index.json"))
+                {
+                    hasindex = true;
                 }
                 uploadStream.Close();
             }
-           
+
             zip.Dispose();
             stream.Close();
-            if (hasindex) {
-                await  Task.WhenAll(tasks);
+            if (hasindex)
+            {
+                await Task.WhenAll(tasks);
                 foreach (var task in tasks)
                 {
-                    var url= System.Web.HttpUtility.UrlDecode(task.Result, Encoding.UTF8);
-                    if (url.Contains($"{FileName}/index.json")) {
+                    var url = System.Web.HttpUtility.UrlDecode(task.Result, Encoding.UTF8);
+                    if (url.Contains($"{FileName}/index.json"))
+                    {
                         index = url;
                     }
                 }
@@ -260,7 +249,7 @@ namespace TEAMModelOS.Controllers
 
             var doc = _DOXC2HTMLTranslator.Translate(file.OpenReadStream());
             // Dictionary<string, object> model = await ImportExerciseService.UploadWord(_azureStorage, file);
-            return Ok(doc);
+            return Ok(new { htmlString = doc });
         }
 
         /// <summary>
@@ -268,28 +257,28 @@ namespace TEAMModelOS.Controllers
         /// </summary>
         /// <param name="request"></param>
         /// <returns></returns>
-        [HttpPost("parse-html")]
-        public IActionResult AnalyzeHtml(JsonElement request)
+        [HttpPost("parse-word")]
+        public IActionResult ParseWord([FromForm] IFormFile file)
         {
-            //ResponseBuilder builder = ResponseBuilder.custom();
-            Dictionary<string, object> dict = new Dictionary<string, object>();
-            var emobj = request.EnumerateObject();
-            while (emobj.MoveNext())
-            {
-                dict[emobj.Current.Name] = emobj.Current.Value;
-            }
-            bool flag = dict.TryGetValue("htmlString", out object htmlString);
-            bool flagLang = dict.TryGetValue("lang", out object lang);
-            if (flag && htmlString != null && !string.IsNullOrEmpty(htmlString.ToString()))
-            {
-                LangConfig langConfig = langConfigs.Where(x => x.Lang == lang.ToString()).FirstOrDefault();
-                var exercises = _HTML2ITEMTranslator.Translate(htmlString.ToString(), langConfig);
-                return Ok(exercises);
-            }
-            else
+            if (!FileType.GetExtention(file.FileName).ToLower().Equals("docx"))
             {
-                return BadRequest();
+                return BadRequest(new Dictionary<string, object> { { "msg", "type is not docx!" }, { "code", ResponseCode.FAILED } });
             }
+            var doc = _DOXC2HTMLTranslator.Translate(file.OpenReadStream());
+            var exercises = _HTML2ITEMV3Translator.Translate(doc);
+            return Ok(exercises);
+        }
+        /// <summary>
+        /// htmlString AnalyzeHtml
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("parse-html")]
+        public IActionResult AnalyzeHtml(JsonElement request)
+        {
+            if (!request.TryGetProperty("htmlString", out JsonElement htmlString)) { return BadRequest(); }
+            var exercises = _HTML2ITEMV3Translator.Translate(htmlString.GetString());
+            return Ok(exercises);
         }
 
 
@@ -367,7 +356,7 @@ namespace TEAMModelOS.Controllers
         public string thumbnail { get; set; }
         //  public int page { get; set; }
         // public Dictionary<string, Store> stores { get; set; }
-        public List<string> points { get; set; }
+        public List<string> knowledge { get; set; }
         public string periodId { get; set; }
         public List<string> gradeIds { get; set; }
         public string subjectId { get; set; }

+ 6 - 0
TEAMModelOS/JsonFile/Core/LangConfig.json

@@ -21,6 +21,7 @@
       "Filed": "知识|理解|应用|分析|综合|评鉴",
       "Judge": "对|错",
       "Ended": "结束",
+      "Level": "难度",
       "Options": "ABCDEFGHIJKLMN",
       "Start": "{",
       "End": "}"
@@ -48,6 +49,7 @@
       "Filed": "知識|理解|應用|分析|綜合|評鑒",
       "Judge": "對|錯",
       "Ended": "結束",
+      "Level": "難度",
       "Options": "ABCDEFGHIJKLMN",
       "Start": "{",
       "End": "}"
@@ -75,6 +77,7 @@
       "Filed": "知識|理解|應用|分析|綜合|評鑒",
       "Judge": "對|錯",
       "Ended": "結束",
+      "Level": "難度",
       "Options": "ABCDEFGHIJKLMN",
       "Start": "{",
       "End": "}"
@@ -102,6 +105,7 @@
       "Filed": "知識|理解|應用|分析|綜合|評鑒",
       "Judge": "對|錯",
       "Ended": "結束",
+      "Level": "難度",
       "Options": "ABCDEFGHIJKLMN",
       "Start": "{",
       "End": "}"
@@ -129,6 +133,7 @@
       "Filed": "knowledge|understand|using|analyse|synthesize|discern",
       "Judge": "true|false",
       "Ended": "Ended",
+      "Level": "Level",
       "Options": "ABCDEFGHIJKLMN",
       "Start": "{",
       "End": "}"
@@ -156,6 +161,7 @@
       "Filed": "knowledge|understand|using|analyse|synthesize|discern",
       "Judge": "true|false",
       "Ended": "Ended",
+      "Level": "Level",
       "Options": "ABCDEFGHIJKLMN",
       "Start": "{",
       "End": "}"

+ 79 - 0
TEAMModelOS/JsonFile/Core/LangConfigV3.json

@@ -0,0 +1,79 @@
+{
+  "Options": "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+  "Start": "{",
+  "End": "}",
+  "LangConfig": [
+    {
+      "Lang": "简体",
+      "Alias": "简体中文",
+      "Item": {
+        "Type": {
+          "compose": "综合题",
+          "single": "单选题",
+          "multiple": "多选题",
+          "judge": "判断题",
+          "complete": "填空题",
+          "subjective": "问答题",
+          "connector": "连线题",
+          "correct": "改错题"
+        },
+        "Answer": "答案",
+        "Analysis": "解析",
+        "Score": "配分",
+        "Point": "知识点",
+        "Filed": "知识|理解|应用|分析|综合|评鉴",
+        "Judge": "对|错",
+        "Ended": "结束",
+        "Level": "难度"
+      }
+    },
+    {
+      "Lang": "繁體",
+      "Alias": "繁體中文",
+      "Item": {
+        "Type": {
+          "compose": "綜合題",
+          "single": "選擇題",
+          "multiple": "複選題",
+          "judge": "是非題",
+          "complete": "填充題",
+          "subjective": "問答題",
+          "connector": "連綫題",
+          "correct": "改錯題"
+        },
+        "Answer": "答案",
+        "Analysis": "解析",
+        "Score": "配分",
+        "Point": "知識點",
+        "Filed": "知識|理解|應用|分析|綜合|評鑒",
+        "Judge": "對|錯",
+        "Ended": "結束",
+        "Level": "難度"
+      }
+    },
+    {
+      "Lang": "EN",
+      "Alias": "English",
+      "Item": {
+        "Type": {
+          "compose": "QuestionGroup",
+          "single": "MultipleChoice",
+          "multiple": "MultipleAnswers",
+          "judge": "TrueFalse",
+          "complete": "Blank",
+          "subjective": "Essay",
+          "connector": "Connector",
+          "correct": "Correct"
+        },
+        "Answer": "Answer",
+        "Analysis": "Explain",
+        "Score": "Score",
+        "Point": "Point",
+        "Filed": "Knowledge|Understand|Using|Analyse|Synthesize|Discern",
+        "Judge": "True|False",
+        "Ended": "Ended",
+        "Level": "Level"
+      }
+    }
+  ]
+}

+ 6 - 3
TEAMModelOS/Startup.cs

@@ -31,11 +31,13 @@ namespace TEAMModelOS
 {
     public class Startup
     {
+        public IWebHostEnvironment environment { get; set; }
         readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
         //private IServiceCollection _services;
         public Startup(IConfiguration configuration, IWebHostEnvironment env)
         {
             Configuration = configuration;
+            environment = env;
             BaseConfigModel.SetBaseConfig(Configuration, env.ContentRootPath, env.WebRootPath);
         }
 
@@ -98,7 +100,7 @@ namespace TEAMModelOS
             services.AddHttpClient();
             services.AddHttpClient<DingDing>();
             services.AddMemoryCache();
-            services.AddControllers().AddJsonOptions(options => { options.JsonSerializerOptions.IgnoreNullValues = false;  });            
+            services.AddControllers().AddJsonOptions(options => { options.JsonSerializerOptions.IgnoreNullValues = false; });
 
             //HttpContextAccessor,并用来访问HttpContext。(提供組件或非控制器服務存取HttpContext)
             services.AddHttpContextAccessor();
@@ -109,7 +111,8 @@ namespace TEAMModelOS
             CSRedis.CSRedisClient.Serialize = obj => System.Text.Json.JsonSerializer.Serialize(obj);
             CSRedis.CSRedisClient.Deserialize = (json, type) => System.Text.Json.JsonSerializer.Deserialize(json, type);
             RedisHelper.Initialization(csredis);
-            services.AddHtexTranslator();
+            string path = $"{ environment.ContentRootPath}/JsonFile/Core";
+            services.AddHtexTranslator(path);
         }
 
         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
@@ -134,7 +137,7 @@ namespace TEAMModelOS
             //如果应用使用身份验证/授权功能(如 AuthorizePage 或 [Authorize]),请将对 UseAuthentication 和 UseAuthorization的
             //调用放在之后、UseRouting 和 UseCors,但在 UseEndpoints之前
             app.UseAuthentication();
-            app.UseAuthorization();            
+            app.UseAuthorization();
             app.UseEndpoints(endpoints =>
             {
                 endpoints.MapControllers();

+ 1 - 2
TEAMModelOS/TEAMModelOS.csproj

@@ -7,7 +7,7 @@
     <PackageReference Include="Caching.CSRedis" Version="3.6.50" />
     <PackageReference Include="CSRedisCore" Version="3.6.5" />
     <PackageReference Include="DotNetZip" Version="1.15.0" />
-    <PackageReference Include="HTEXLib" Version="2.2.7" />
+    <PackageReference Include="HTEXLib" Version="2.3.3" />
     <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.6" />
       <PackageReference Include="VueCliMiddleware" Version="3.1.2" />  </ItemGroup>
   <PropertyGroup>
@@ -51,7 +51,6 @@
   <ItemGroup>
     <Folder Include="JwtRsaFile\" />
     <Folder Include="Services\Evaluation\" />
-    <Folder Include="wwwroot\" />
   </ItemGroup>
   
   <ItemGroup>