Browse Source

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

zhouj1203@hotmail.com 4 năm trước cách đây
mục cha
commit
ed4416d6e3
49 tập tin đã thay đổi với 1391 bổ sung2163 xóa
  1. 44 0
      TEAMModelOS.SDK/Models/Cosmos/Common/JoinList.cs
  2. 0 59
      TEAMModelOS/ClientApp/src/common/BaseAudioPlayer.vue
  3. 1 1
      TEAMModelOS/ClientApp/src/common/BaseLayout.vue
  4. 0 573
      TEAMModelOS/ClientApp/src/common/BaseMock.vue
  5. 16 10
      TEAMModelOS/ClientApp/src/common/BaseMyCanvas.vue
  6. 3 3
      TEAMModelOS/ClientApp/src/common/BaseNotification.vue
  7. 3 3
      TEAMModelOS/ClientApp/src/common/BaseSelectSchool.vue
  8. 18 18
      TEAMModelOS/ClientApp/src/common/BaseUserPoptip.vue
  9. 0 41
      TEAMModelOS/ClientApp/src/common/BaseVideoPlayer.vue
  10. 5 6
      TEAMModelOS/ClientApp/src/common/ImportExcel.vue
  11. 0 408
      TEAMModelOS/ClientApp/src/common/NewUploadFile.vue
  12. 2 2
      TEAMModelOS/ClientApp/src/common/UploadFile.vue
  13. 1 1
      TEAMModelOS/ClientApp/src/common/VideoPlayer2.vue
  14. 0 12
      TEAMModelOS/ClientApp/src/components/selflearn/ExerciseList.vue
  15. 5 3
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseScatter.vue
  16. 5 3
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseTestScatter.vue
  17. 204 198
      TEAMModelOS/ClientApp/src/locale/lang/en-US/learnActivity.js
  18. 152 87
      TEAMModelOS/ClientApp/src/locale/lang/en-US/schoolBaseInfo.js
  19. 13 1
      TEAMModelOS/ClientApp/src/locale/lang/en-US/system.js
  20. 8 2
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/learnActivity.js
  21. 80 79
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolBaseInfo.js
  22. 13 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/system.js
  23. 8 6
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/totalAnalysis.js
  24. 34 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/utils.js
  25. 8 2
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/learnActivity.js
  26. 2 3
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/schoolBaseInfo.js
  27. 13 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/system.js
  28. 9 7
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/totalAnalysis.js
  29. 33 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/utils.js
  30. 1 0
      TEAMModelOS/ClientApp/src/utils/editorTools.js
  31. 0 2
      TEAMModelOS/ClientApp/src/view/learnactivity/CreateSchoolEva.vue
  32. 4 4
      TEAMModelOS/ClientApp/src/view/learnactivity/PaperScore.vue
  33. 5 4
      TEAMModelOS/ClientApp/src/view/learnactivity/PrivScoring.vue
  34. 2 3
      TEAMModelOS/ClientApp/src/view/learnactivity/Scoring.vue
  35. 3 4
      TEAMModelOS/ClientApp/src/view/learnactivity/echarts/AvgCompare.vue
  36. 2 3
      TEAMModelOS/ClientApp/src/view/learnactivity/echarts/ScoreMatrix.vue
  37. 1 2
      TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.vue
  38. 0 1
      TEAMModelOS/ClientApp/src/view/newcourse/NewCusMgt.vue
  39. 2 4
      TEAMModelOS/ClientApp/src/view/schoolmgmt/ClassroomSetting/ClassroomSetting.vue
  40. 10 5
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.vue
  41. 558 505
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue
  42. 14 8
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EntryTables.vue
  43. 2 1
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.less
  44. 53 51
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.vue
  45. 1 1
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue
  46. 28 19
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/ScatterAnalysis/ScatterAnalysis.vue
  47. 2 2
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue
  48. 11 6
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/index.less
  49. 12 6
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/index.vue

+ 44 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/JoinList.cs

@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Models.Cosmos.Common
+{
+
+    /*
+     * {
+            "id": "28936",
+            "code": "JoinList-hbcn",
+            "school": [
+                "schoolClassid1"
+            ],
+            "teacher": [
+                "stulistGUID"
+            ]
+        },
+        {
+            "id": "tmdid",
+            "code": "JoinList-tmdid",
+            "school": [
+                "schoolClassid1"
+            ],
+            "teacher": [
+                "schoolClassid1"
+            ]
+        }
+     */
+
+    /// <summary>
+    /// 学生已经加入的名单列表
+    /// 分学校创建的学生名单和教师创建的私人名单
+    /// </summary>
+    public class JoinList : CosmosEntity
+    {
+        public JoinList()
+        {
+            pk = "JoinList";
+        }
+        public List<string> school { get; set; } = new List<string>();
+        public List<string> teacher { get; set; } = new List<string>();
+    }
+}

+ 0 - 59
TEAMModelOS/ClientApp/src/common/BaseAudioPlayer.vue

@@ -1,59 +0,0 @@
-<template>
-	<div class="audio-container">
-		<!-- <audio :src="audioSrc" controls="controls"></audio> -->
-		<p style="margin-left: 15px;margin-bottom: 10px;">{{ audioName }}</p>
-		<!-- <AudioPlayer ref="audioRef" :audio-list="audioList":show-prev-button="false" :show-next-button="false"/> -->
-
-		<vue-audio-native ref="audioRef" size="default" :url="audioSrc" :showDownload="false" autoplay></vue-audio-native>
-	</div>
-</template>
-
-<script>
-	export default {
-		name: 'audioPlayer',
-		props: {
-			audioSrc: {
-				type: String,
-				default: ''
-			},
-			audioName: {
-				type: String,
-				default: ''
-			}
-		},
-		data() {
-			return {
-				audioList: []
-			}
-		},
-		created() {
-			// this.getFileSas(this.audioSrc)
-			
-		},
-		methods: {
-			async getFileSas(url){
-				const fileSas = await this.$tools.getFileSas({params:url})
-				console.log(fileSas)
-				this.audioSrc = this.audioSrc + fileSas
-			},
-			onCloseAudio() {
-				this.$refs.audioRef.onPause()
-			},
-			onPlayAudio() {
-				this.$refs.audioRef.onPlay()
-			}
-		},
-		watch: {
-			audioSrc: {
-				handler(n) {
-					this.audioList = []
-					this.audioList.push(n)
-				},
-				immediate: true
-			}
-		}
-	}
-</script>
-<style>
-
-</style>

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

@@ -120,7 +120,7 @@ export default {
                         // },
                         {
                             icon: 'iconfont icon-kecheng',
-                            name: '课程管理',
+                            name: this.$t('system.menu.cusMgt'),
                             router: '/home/NewCusMgt',
                             tag: '',
                             role: 'admin',

+ 0 - 573
TEAMModelOS/ClientApp/src/common/BaseMock.vue

@@ -1,573 +0,0 @@
-<template>
-	<div>
-		<div style="display: flex;flex-direction: column;">
-			<span style="margin: 20px 2px;">选择活动类型</span>
-			<Select v-model="acType">
-				<Option :value="0">作业活动</Option>
-				<Option :value="1">投票活动</Option>
-				<Option :value="2">问卷活动</Option>
-				<Option :value="3">评测活动</Option>
-				<Option :value="4">编序式学习</Option>
-				<Option :value="5">学习单元</Option>
-			</Select>
-		</div>
-		<div style="display: flex;flex-direction: column;">
-			<span style="margin: 20px 2px;">输入活动ID</span>
-			<Input v-model="acId" placeholder=""></Input>
-		</div>
-		<div style="margin-top: 30px;">
-			<Button type="success" style="width:100%" @click="onMock" :loading="isLoading">生成</Button>
-		</div>
-	</div>
-</template>
-
-<script>
-	import Mock from 'mockjs'
-	export default {
-		name: "BaseMock",
-		data() {
-			return {
-				isLoading: false,
-				acType: 0,
-                acId: '5ed79799-4e2d-471e-a484-deedb81a8ad7'
-			};
-		}, 
-		created() {},
-		methods: {
-			onMock() {
-				if (this.acId) {
-					this.isLoading = true
-					switch (this.acType) {
-						case 0:
-							this.doMockHomeWork(this.acId)
-							break
-						case 1:
-							this.doMockVote(this.acId)
-							break
-						case 2:
-							this.doMockQuestionnaire(this.acId)
-							break
-						case 3:
-							this.doMockEvaluation(this.acId)
-							break
-                        case 4:
-							this.doMockSelfLearning(this.acId)
-                            break	
-                        case 5:
-							this.doMockSelfLearning(this.acId)
-							break	
-						default:
-							break;
-					}
-				} else {
-					this.$Message.warning('请输入活动ID!')
-				}
-			},
-
-			/* 生成评测活动的学生模拟作答数据 */
-			async doMockEvaluation(acId) {
-				console.log(acId)
-				let classCodeArr = await this.getExamClass(acId)
-				let studentList = await this.getStudentList(classCodeArr)
-				let paper = await this.getExamPaper(acId)
-				console.log(console.log(paper))
-				let items = paper.item
-				let paperId = paper.id
-				let result = []
-				studentList.forEach(s => {
-					result.push({
-						id:paperId,
-						code:s.code,
-						examCode:acId,
-						status:1,
-						mark:0,
-						answers:[]
-					})
-				})
-				items.forEach((item,index) => {
-					result.forEach((i) => {
-						if(item.type === 'Complete'){
-							this.randomAnswer(item).forEach(j => {
-								i.answers.push({
-									num:i.answers.length,
-									group:index,
-									type:item.type,
-									ans:[j]
-								})
-							})
-						}else{
-							i.answers.push({
-								num:i.answers.length,
-								group:index,
-								type:item.type,
-								ans:this.randomAnswer(item)
-							})
-						}
-					})
-				})
-
-				 //保存模拟数据
-				this.$api.learnActivity.UpsertAllRecord(result).then(res => {
-					if (!res.error && res.result.data) {
-						this.$Message.success('保存成功!')
-						this.$emit('onSuccess')
-					} else {
-						this.$Message.error('保存失败!')
-					}
-					this.isLoading = false
-				})
-			},
-
-			/* 生成作业活动学生作答数据 */
-			async doMockHomeWork(acId) {
-				let result = []
-				// 拿到班级Code去换取学生名单
-				let classCodeArr = await this.getHomeWorkClass(acId)
-				let arr = await this.getStudentList(classCodeArr)
-				// 遍历随机赋值作答数据
-				arr.forEach(i => {
-					result.push({
-						id: acId,
-						code: i.code,
-						score: Mock.mock({"number|1-100": 100}).number,
-						content: [{
-							answers: Mock.mock('@cparagraph(2)'),
-							resource: []
-						}],
-						submit: true,
-						submitTime: new Date(Mock.mock('@datetime')).getTime()
-					})
-				})
-				// 保存模拟数据
-				this.$api.learnActivity.SaveHwRecords(result).then(res => {
-					if (!res.error && res.result.data) {
-						this.$Message.success('保存成功!')
-						this.$emit('onSuccess')
-					} else {
-						this.$Message.error('保存失败!')
-					}
-					this.isLoading = false
-				})
-			},
-
-			/* 生成自主学习学生作答数据 */
-			async doMockSelfLearning(acId) {
-                let result = []
-                let acInfo = null
-                if (this.acType == 4) {
-                    acInfo = await this.findOrderLearn()
-                    if (acInfo) {
-                        let taskes = await this.findTask()
-                        let classes = taskes.map((item) => {
-                            return item.code
-                        })
-                        let students = await this.getStudentList(classes)
-                        for (let item of students) {
-                            let rdItem = {
-                                id: this.acId,
-                                code: item.code,
-                                steps: []
-                            }
-                            let compSteps = this.$jsFn.getBtwRandom(0, (acInfo[0].steps.length + 1))
-                            for (let index = 0; index < compSteps; index++) {
-                                let aswItem = {
-                                    index: parseInt(index),
-									count:this.$jsFn.getBtwRandom(1,4),
-									score:this.$jsFn.getBtwRandom(50,100),
-                                    answer: []
-                                }
-                                acInfo[0].steps[index].item.forEach((question, i) => {
-                                    let stItem = {
-                                        index: i,
-                                        ans: this.randomAnswer(question),
-										//count: this.$jsFn.getBtwRandom(0,5)
-                                    }
-                                    aswItem.answer.push(stItem)
-                                })
-                                rdItem.steps.push(aswItem)
-                            }
-                            result.push(rdItem)
-                        }
-                        this.$api.learnActivity.upsertRecord(result).then(
-                            (res) => {
-                                if (!res.error && res.result.data) {
-                                    this.$Message.success('学习数据模拟成功!')
-                                } else {
-									this.$Message.error('学习数据模拟失败!')
-                                }
-                            },
-                            (err) => {
-								this.$Message.error('学习数据模拟失败!')
-                            }
-                        )
-                        
-                    }
-                } else if (this.acType == 5) {
-                    acInfo = await this.findUnit()
-                    let taskes = await this.findTask()
-                    let classes = taskes.map((item) => {
-                        return item.code
-                    })
-                    let students = await this.getStudentList(classes)
-                    for (let item of students) {
-                        let radom = this.$jsFn.getBtwRandom(0, 2)
-                        if (radom) {
-                            let rdItem = {
-                                id: this.acId,
-                                code: item.code,
-                                steps: []
-                            }
-                            let aswItem = {
-                                index: 0,
-                                answer: []
-                            }
-                            acInfo[0].item.forEach((question, i) => {
-                                let stItem = {
-                                    index: i,
-                                    ans: this.randomAnswer(question),
-                                    count: this.$jsFn.getBtwRandom(0, 5)
-                                }
-                                aswItem.answer.push(stItem)
-                            })
-                            rdItem.steps.push(aswItem)
-                            result.push(rdItem)
-                        }
-                    }
-                    console.log(result)
-                    this.$api.learnActivity.upsertRecord(result).then(
-                        (res) => {
-                            if (!res.error && res.result.data) {
-                                this.$Message.success('学习数据模拟成功!')
-                            } else {
-                                this.$Message.error('学习数据模拟失败!')
-                            }
-                        },
-                        (err) => {
-                            this.$Message.error('学习数据模拟失败!')
-                        }
-                    )
-                }
-                this.isLoading = false
-			},
-			
-			/* 生成投票活动学生作答数据 */
-			async doMockVote(acId) {
-				let result = []
-				// 拿到班级Code去换取学生名单
-				let voteItem = await this.getVoteInfo(acId)
-				let classCodeArr = voteItem.target.map(i => i.classroomCode)
-				let arr = await this.getStudentList(classCodeArr)
-				console.log(arr)
-				// 遍历随机赋值作答数据
-				arr.forEach(i => {
-					result.push({
-						id: acId,
-						code: i.id,
-						name:i.name,
-						classroom:{
-							name:i.classroomName , 
-							code:i.id
-						},
-						option:voteItem.option[Math.floor(Math.random() * voteItem.option.length)].code,
-						submit: true,
-						submitTime: new Date(Mock.mock('@datetime')).getTime()
-					})
-				})
-				console.log(result)
-				// 保存模拟数据
-				this.$api.learnActivity.SaveVoteRecords(result).then(res => {
-					if (!res.error && res) {
-						this.$Message.success('保存成功!')
-						this.$emit('onSuccess')
-					} else {
-						this.$Message.error('保存失败!')
-					}
-					this.isLoading = false
-				})
-			},
-			
-			/* 生成问卷活动学生作答数据 */
-			async doMockQuestionnaire(acId) {
-				let result = []
-				// 拿到班级Code去换取学生名单
-				let qnItem = await this.getQuestionnaireInfo(acId)
-				let classCodeArr = qnItem.target.map(i => i.classroomCode)
-				let arr = await this.getStudentList(classCodeArr)
-				console.log(arr)
-				// 遍历随机赋值作答数据
-				arr.forEach(i => {
-					result.push({
-						id: acId,
-						code: i.code,
-						classroom:{
-							name:qnItem.target.filter(j => j.classroomCode === i.id)[0].classroomName , 
-							code:i.id
-						},
-						submit: true,
-						submitTime: new Date(Mock.mock('@datetime')).getTime(),
-						answers:[]
-					})
-				})
-				
-				qnItem.items.forEach((item,index) => {
-					result.forEach((i) => {
-						i.answers.push({
-							order:i.answers.length,
-							answer:this.randomQnAnswer(item)
-						})
-					})
-				})
-				
-				// 保存模拟数据
-				this.$api.questionnaire.UpsertRecord(result).then(res => {
-					if (!res.error && res.result.data) {
-						this.$Message.success('保存成功!')
-						this.$emit('onSuccess')
-					} else {
-						this.$Message.error('保存失败!')
-					}
-					this.isLoading = false
-				})
-			},
-
-			/* 获取当前活动下的发布对象CODE */
-			async getHomeWorkClass(id) {
-				return new Promise((r, j) => {
-					this.$api.learnActivity.FindHomeWork({
-						id: id
-					}).then(res => {
-						if (!res.error && res.result.data) {
-							r(res.result.data[0].target.map(i => i.classroomCode))
-						} else {
-							j(500)
-						}
-					})
-				})
-			},
-			
-			/* 获取当前活动下的发布对象CODE */
-			async getVoteInfo(id) {
-				return new Promise((r, j) => {
-					this.$api.learnActivity.FindVote({
-						code:this.$store.state.userInfo.TEAMModelId,
-						id: id
-					}).then(async res => {
-						if (!res.error && res.votes) {
-							let privateSas = await this.$tools.getPrivateSas()
-							let schoolSas = await this.$tools.getSchoolSas()
-							let i = res.votes[0]
-							if (i.url) {
-								let sasString = i.code === this.$store.state.userInfo.TEAMModelId ? privateSas : schoolSas 
-								let jsonInfo = await this.$tools.getFile(i.url + sasString.sas)
-								let jsonData = JSON.parse(jsonInfo)
-								jsonData.id = i.id
-								jsonData.fileName = i.url.split('/')[i.url.split('/').length - 1].split('.json')[0]
-								r(jsonData)
-								console.log(jsonData)
-							}else{
-								r(i)
-							}
-						} else {
-							j(500)
-						}
-					})
-				})
-			},
-			
-			/* 获取当前活动下的发布对象CODE */
-			async getQuestionnaireInfo(id) {
-				return new Promise(async (r, j) => {
-					let privateSas = await this.$tools.getPrivateSas()
-					let schoolSas = await this.$tools.getSchoolSas()
-					this.$api.questionnaire.FindSurveys({
-						id: id
-					}).then(async res => {
-						if (!res.error && res.result.data) {
-								let i = res.result.data[0]
-								if (i.url) {
-									let sasString = i.code === this.$store.state.userInfo.TEAMModelId ? privateSas : schoolSas 
-									let jsonInfo = await this.$tools.getFile(i.url + sasString.sas)
-									let jsonData = JSON.parse(jsonInfo)
-									jsonData.id = i.id
-									jsonData.fileName = i.url.split('/')[i.url.split('/').length - 1].split('.json')[0]
-									r(jsonData)
-								}else{
-									r(i)
-								}
-						} else {
-							j(500)
-						}
-					})
-				})
-			},
-
-			/* 获取班级下面所有的学生清单 */
-			async getStudentList(classCodeList) {
-				console.log(classCodeList)
-				return new Promise((r, j) => {
-					this.$api.courseMgmt.getClassroomStudent({
-						classroomCode: classCodeList,
-						school_code: this.$store.state.userInfo.schoolCode
-					}).then(res => {
-						if (!res.error && res.classrooms) {
-							let list = []
-							res.classrooms.forEach(classroom => {
-								classroom.students.forEach(i => {
-									list.push({
-										id:i.id,
-										name:i.name,
-										no:i.no,
-										classroomName:classroom.name
-									})
-								})
-							})
-							if (this.acType === 3) {
-								r(list)
-							} else {
-								r(list)
-							}
-						} else {
-							j(500)
-						}
-					})
-				})
-			},
-            //查询学习任务
-            async findTask() {
-                return new Promise((r, j) => {
-                    this.$api.learnActivity.findTask({
-                        id: this.acId
-                    }).then(
-                        (res) => {
-                            if (!res.error && res.result.data) {
-								r(res.result.data)
-                            } else {
-                                j(500)
-                            }
-                        },
-                        (err) => {
-                            j(500)
-                        }
-                    )
-                })
-            },
-			/**
-             * 查询编序式教材列表
-             * */
-            async findOrderLearn() {
-                return new Promise((r, j) => {
-                    let requestData = {
-                        id: this.acId
-                    }
-                    this.$api.learnActivity.FindOrderLearn(requestData).then(
-                        res => {
-                            if (!res.error && res.result.data) {
-                                r(res.result.data)
-                            } else {
-                                j(500)
-                            }
-                        },
-                        err => {
-							j(500)
-                        }
-                    )
-                })
-            },
-            /**
-             * 查询最小单元列表
-             * */
-            async findUnit() {
-                return new Promise((r, j) => {
-                    let requestData = {
-                        id: this.acId
-                    }
-                    this.$api.learnActivity.FindUnit(requestData).then(
-                        res => {
-                            if (!res.error && res.result.data) {
-                                r(res.result.data)
-                            } else {
-                                j(500)
-                            }
-                        },
-                        err => {
-							j(500)
-                        }
-                    )
-                })
-            },
-			/* 获取评测施测班级 */
-			getExamClass(id) {
-				return new Promise((r, j) => {
-					this.$api.learnActivity.FindExamInfo({
-						id: id
-					}).then(res => {
-						console.log('学生班级')
-						console.log(res.result.data)
-						if (!res.error && res.result.data) {
-							r(res.result.data[0].target)
-						} else {
-							j(500)
-						}
-					})
-				})
-			},
-			
-			/* 获取评测试卷信息 */
-			getExamPaper(id) {
-				return new Promise((r, j) => {
-					this.$api.learnActivity.FindExamPaper({
-						code: id
-					}).then(res => {
-						if (!res.error && res.result.data) {
-							r(res.result.data[1])
-						} else {
-							j(500)
-						}
-					})
-				})
-			},
-			
-			/* 根据题型生成随机答案 */
-            randomAnswer(item) {
-				switch (item.type) {
-					case 'Single':
-						return [item.option[Math.floor(Math.random() * item.option.length)].code]
-						break;
-					case 'Multiple':
-						return [item.option[Math.floor(Math.random() * item.option.length)].code]
-						break;
-					case 'Judge':
-						let arr = ['A','B'] 
-						return [arr[Math.floor(Math.random() * 2)]]
-						break;
-					case 'Complete':
-						let ans = item.answer.map(i => i = Mock.mock('@cparagraph(2)'))
-						return ans
-						break;	
-					default:
-						return [Mock.mock('@cparagraph(2)')]
-						break;
-				}
-			},
-			/* 根据题型生成随机答案 */
-			randomQnAnswer(item) {
-				switch (item.type) {
-					case 'Single':
-						return [item.options[Math.floor(Math.random() * item.options.length)].code]
-						break;
-					case 'Multiple':
-						return [item.options[Math.floor(Math.random() * item.options.length)].code]
-						break;
-					case 'Judge':
-						let arr = ['A','B'] 
-						return [arr[Math.floor(Math.random() * 2)]]
-						break;
-					default:
-						return [Mock.mock('@cparagraph(2)')]
-						break;
-				}
-			},
-		},
-		mounted() {}
-	};
-</script>

+ 16 - 10
TEAMModelOS/ClientApp/src/common/BaseMyCanvas.vue

@@ -7,12 +7,12 @@
 				<Poptip trigger="click">
 					<div class="flex-center">
 						<Icon type="md-create" />
-						<span>绘制</span>
+						<span>{{ vm.$t('utils.draw') }}</span>
 					</div>
 					<div slot="content" class="textBox">
-						 <p class="text-tools-title">画笔粗细 <span style="font-weight: bold;color: #0086E6;margin-left: 15px;font-size: 18px;">{{ options.textSize }}</span> </p>
+						 <p class="text-tools-title">{{ vm.$t('utils.width') }} <span style="font-weight: bold;color: #0086E6;margin-left: 15px;font-size: 18px;">{{ options.textSize }}</span> </p>
 						 <Slider v-model="options.writeWidth"></Slider>
-						 <p class="text-tools-title">画笔颜色</p>
+						 <p class="text-tools-title">{{ vm.$t('utils.color') }}</p>
 						 <ColorPicker v-model="options.writeColor" />
 					</div>
 				</Poptip>
@@ -21,31 +21,31 @@
 				<Poptip trigger="click">
 					<div class="flex-center">
 						<Icon type="md-text" />
-						<span>文本输入</span>
+						<span>{{ vm.$t('utils.text') }}</span>
 					</div>
 					<div slot="content" class="textBox">
-						 <p class="text-tools-title">字体大小 <span style="font-weight: bold;color: #0086E6;margin-left: 15px;font-size: 18px;">{{ options.textSize }}</span> </p>
+						 <p class="text-tools-title">{{ vm.$t('utils.fontSize') }} <span style="font-weight: bold;color: #0086E6;margin-left: 15px;font-size: 18px;">{{ options.textSize }}</span> </p>
 						 <Slider v-model="options.textSize"></Slider>
-						 <p class="text-tools-title">字体颜色</p>
+						 <p class="text-tools-title">{{ vm.$t('utils.fontColor') }}</p>
 						 <ColorPicker v-model="options.textColor" />
 					</div>
 				</Poptip>
 			</span>
 			<span class="canvas-tools-item" @click="canvasClear()">
 				<Icon type="md-refresh" />
-				<span>清屏</span>
+				<span>{{ vm.$t('utils.clear') }}</span>
 			</span>
 			<span class="canvas-tools-item" @click="undo()">
 				<Icon type="md-undo" />
-				<span>撤销</span>
+				<span>{{ vm.$t('utils.undo') }}</span>
 			</span>
 			<span class="canvas-tools-item" @click="closeModal()">
 				<Icon type="md-close" />
-				<span>关闭</span>
+				<span>{{ vm.$t('utils.close') }}</span>
 			</span>
 			<span class="canvas-tools-item" @click="downloadSignImg()" style="border-radius:  0 15px 0 0 ;">
 				<Icon type="md-cloud-download" />
-				<span>保存</span>
+				<span>{{ vm.$t('utils.save') }}</span>
 			</span>
 		</div>
 	</div>
@@ -57,6 +57,12 @@
 			BaseCanvas
 		},
 		props: {
+			vm:{
+				type:Object,
+				default:() => {
+					return {}
+				}
+			},
 			isStudent: {
 				type: Boolean,
 				default: false

+ 3 - 3
TEAMModelOS/ClientApp/src/common/BaseNotification.vue

@@ -1,8 +1,8 @@
 <template>
 	<div class="base-notification">
-		<Poptip title="新通知" class="dark-iview-poptip">
+		<Poptip :title="$t('utils.newNotice')" class="dark-iview-poptip">
 			<Icon type="md-notifications" />
-			<div slot="content" class="notice-wrap">
+			<!-- <div slot="content" class="notice-wrap">
 				<div class="notice-item">
 					<p class="item-name">青城山学校</p>
 					<p class="item-content">活动[2020下学期国文期末考]达成率已达100%</p>
@@ -18,7 +18,7 @@
 					<p class="item-content">活动[2020下学期国文期末考]达成率已达100%</p>
 					<span class="item-time">2020-08-14 18:22</span>
 				</div>
-			</div>
+			</div> -->
 		</Poptip>
 	</div>
 </template>

+ 3 - 3
TEAMModelOS/ClientApp/src/common/BaseSelectSchool.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="base-school-select">
-		<div v-if="!joinSchools || !joinSchools.length">暂未加入学校</div>
+		<div v-if="!joinSchools || !joinSchools.length">{{ $t('utils.noJoinSchool') }}</div>
 		<Dropdown @on-click="onSchoolSelect" v-else>
 			<img class="school-logo" :src="curSchool.logo || defaultLogo" />
 			<a href="javascript:void(0)" :class="['base-user-post', joinSchools && joinSchools.length === 1 ? 'single-school' : '']">
@@ -56,7 +56,7 @@
 				this.curSchool = user.defaultschool ? joinSchools.filter(i => i.schoolId === user.defaultschool)[0] : joinSchools[0]
 				this.$store.commit('setSchoolCode', this.curSchool.schoolId)
 			} else {
-				this.$Message.warning('用户暂无学校列表数据')
+				this.$Message.warning(this.$t('utils.noShoolTip'))
 			}
 		},
 		methods: {
@@ -97,7 +97,7 @@
 							}
 						},
 						(err) => {
-							this.$Message.error("数据获取失败!")
+							this.$Message.error(this.$t('utils.getDataFail'))
 						}
 					)
 				})

+ 18 - 18
TEAMModelOS/ClientApp/src/common/BaseUserPoptip.vue

@@ -10,8 +10,8 @@
 						<Icon type="ios-arrow-down"></Icon>
 					</a>
 					<DropdownMenu slot="list">
-						<DropdownItem v-if="curRole != 'teacher' && curRole != 'admin'" name="teacher">教师</DropdownItem>
-						<DropdownItem v-if="curRole != 'student'" name="student">學生</DropdownItem>
+						<DropdownItem v-if="curRole != 'teacher' && curRole != 'admin'" name="teacher">{{ $t('utils.teacher') }}</DropdownItem>
+						<DropdownItem v-if="curRole != 'student'" name="student">{{ $t('utils.student') }}</DropdownItem>
 						<!-- <DropdownItem  name="student">學生</DropdownItem> -->
 					</DropdownMenu>
 				</Dropdown>
@@ -28,26 +28,26 @@
 						<span class="user-info-username">{{ userInfo.username }}</span>
 						<span class="user-info-account">{{ user.id }}</span>
 						<span class="user-info-account">{{ curRole }}</span>
-						<span class="user-info-btn">账号管理</span>
+						<span class="user-info-btn">{{ $t('utils.accountManage') }}</span>
 					</div>
 					<div class="user-nums">
 						<div class="user-nums-item">
 							<span>{{ userInfo.courseNum }}</span>
-							<span>任教课程数</span>
+							<span>{{ $t('utils.courseNum') }}</span>
 						</div>
 						<div class="user-nums-item">
 							<span>{{ userInfo.activityNum }}</span>
-							<span>发布活动数</span>
+							<span>{{ $t('utils.activityNum') }}</span>
 						</div>
 						<div class="user-nums-item">
 							<span>{{ userInfo.classNum }}</span>
-							<span>任教班级数</span>
+							<span>{{ $t('utils.classNum') }}</span>
 						</div>
 					</div>
 					<div class="user-storage">
 						<p :style="{color: sizeInfo.total > $GLOBAL.PRIVATE_SPACE ? '#ff2929' : '#a5a5a5'}">
-							<span v-if="sizeInfo.total > $GLOBAL.PRIVATE_SPACE">(已满)</span>
-							个人空间状态
+							<span v-if="sizeInfo.total > $GLOBAL.PRIVATE_SPACE">({{ $t('utils.full') }})</span>
+							{{ $t('utils.spaceStatus') }}
 							{{ getSizeVal(sizeInfo.total) }} / {{ getSizeVal($GLOBAL.PRIVATE_SPACE) }}
 						</p>
                         <div class="user-storage-distribution">
@@ -61,16 +61,16 @@
                             <span class="storage-data" :style='{ width: getPercent(sizeInfo.data) }'></span>
                         </div>
 						<p class="user-storage-text">
-							<span v-if="sizeInfo.res != 0" class="text-res">教材:{{ getSizeVal(sizeInfo.res) }}</span>
-							<span v-if="sizeInfo.image != 0" class="text-image">图片:{{ getSizeVal(sizeInfo.image) }}</span>
-							<span v-if="sizeInfo.video != 0" class="text-video">视频:{{ getSizeVal(sizeInfo.video) }}</span>
-							<span v-if="sizeInfo.audio != 0" class="text-audio">音频:{{ getSizeVal(sizeInfo.audio) }}</span>
-							<span v-if="sizeInfo.doc != 0" class="text-doc">文档:{{ getSizeVal(sizeInfo.doc) }}</span>
-							<span v-if="sizeInfo.data != 0" class="text-data">题库:{{ getSizeVal(sizeInfo.data) }}</span>
-							<span v-if="sizeInfo.other != 0" class="text-other">其他内容:{{ getSizeVal(sizeInfo.other) }}</span>
+							<span v-if="sizeInfo.res != 0" class="text-res">{{ $t('utils.res') }}:{{ getSizeVal(sizeInfo.res) }}</span>
+							<span v-if="sizeInfo.image != 0" class="text-image">{{ $t('utils.img') }}:{{ getSizeVal(sizeInfo.image) }}</span>
+							<span v-if="sizeInfo.video != 0" class="text-video">{{ $t('utils.video') }}:{{ getSizeVal(sizeInfo.video) }}</span>
+							<span v-if="sizeInfo.audio != 0" class="text-audio">{{ $t('utils.audio') }}:{{ getSizeVal(sizeInfo.audio) }}</span>
+							<span v-if="sizeInfo.doc != 0" class="text-doc">{{ $t('utils.doc') }}:{{ getSizeVal(sizeInfo.doc) }}</span>
+							<span v-if="sizeInfo.data != 0" class="text-data">{{ $t('utils.bank') }}:{{ getSizeVal(sizeInfo.data) }}</span>
+							<span v-if="sizeInfo.other != 0" class="text-other">{{ $t('utils.other') }}:{{ getSizeVal(sizeInfo.other) }}</span>
 						</p>
 					</div>
-					<div class="btn-logout" @click="onQuit">登出</div>
+					<div class="btn-logout" @click="onQuit">{{ $t('utils.logout') }}</div>
 				</div>
 			</Poptip>
 		</div>
@@ -127,7 +127,7 @@
                         this.sizeInfo = res
                     },
                     err => {
-                        this.$Message.error('空间计算异常')
+                        this.$Message.error(this.$t('utils.caclErrorL'))
                     }
                 )
 			},
@@ -169,7 +169,7 @@
 			},
 			getRoleName() {
 				return val => {
-					return val === 'student' ? '学生' : '教师'
+					return val === 'student' ? this.$t('utils.student') : this.$t('utils.teacher')
 				}
 			}
 		},

+ 0 - 41
TEAMModelOS/ClientApp/src/common/BaseVideoPlayer.vue

@@ -1,41 +0,0 @@
-<template>
-	<div class="audio-container">
-		<p style="margin-left: 15px;margin-bottom: 10px;">{{ videoName }}</p>
-		<video :src="videoSrc" id="video" controls="controls" width="100%"></video>
-	</div>
-</template>
-
-<script>
-	export default {
-		name: 'audioPlayer',
-		props: {
-			videoSrc: {
-				type: String,
-				default: ''
-			},
-			videoName: {
-				type: String,
-				default: ''
-			}
-		},
-		data() {
-			return {
-				audioList: []
-			}
-		},
-		created() {
-			// console.log(this.videoSrc);
-		},
-		methods: {
-			onCloseAudio() {
-				document.getElementById('video').pause()
-			},
-			onPlayAudio() {
-				document.getElementById('video').play()
-			}
-		}
-	}
-</script>
-<style>
-
-</style>

+ 5 - 6
TEAMModelOS/ClientApp/src/common/ImportExcel.vue

@@ -11,9 +11,9 @@
                     <p>{{(row.password == '' || row.password == null)? '— —' : row.password.value+''}}</p>
                 </template>
                 <template slot-scope="{ row,index }" slot="status">
-                    <p :class="(repeatAccounts.length == 0 || repeatAccounts.indexOf(row.account) == -1) ? 'account-success-tips':'account-error-tips'">{{(repeatAccounts.length == 0 || repeatAccounts.indexOf(row.account) == -1)?"":"错误:账号重复!" }}</p>
-                    <p :class="(row.classroomCode == '' || row.classroomCode == null) ? 'account-warning-tips':''">{{(row.classroomCode == '' || row.classroomCode == null)?"警告 :未找到指定班级":"" }}</p>
-                    <p :class="row.seatRepeat? 'account-error-tips':''">{{row.seatRepeat ? "错误:座位号重复":"" }}</p>
+                    <p :class="(repeatAccounts.length == 0 || repeatAccounts.indexOf(row.account) == -1) ? 'account-success-tips':'account-error-tips'">{{(repeatAccounts.length == 0 || repeatAccounts.indexOf(row.account) == -1)?"":$t('system.compt.acRep') }}</p>
+                    <p :class="(row.classroomCode == '' || row.classroomCode == null) ? 'account-warning-tips':''">{{(row.classroomCode == '' || row.classroomCode == null) ? $t('system.compt.classErr'):"" }}</p>
+                    <p :class="row.seatRepeat? 'account-error-tips':''">{{row.seatRepeat ? $t('system.compt.setErr'):"" }}</p>
                 </template>
             </Table>
         </div>
@@ -78,7 +78,7 @@
                     this.showProgress = true
                 }
                 reader.onerror = e => {
-                    this.$Message.error('文件读取失败!')
+                    this.$Message.error(this.$t('system.compt.fileReadErr'))
                 }
                 reader.onload = e => {
                     const data = e.target.result
@@ -100,12 +100,11 @@
                     if (flag) {
                         // 处理表格导入数据类型
                         this.tableData = [...results]
-                        //this.$Message.info('文件读取成功')
                         this.tableLoading = false
                         this.$emit('getTableData', this.tableData)
                     } else {
                         this.$Message.error({
-                            content: '导入数据没有' + column + ',请完善表格数据再导入',
+                            content: this.$t('system.compt.tbColErr1') + column + this.$t('system.compt.tbColErr2'),
                             duration: 4
                         })
                         this.tableLoading = false

+ 0 - 408
TEAMModelOS/ClientApp/src/common/NewUploadFile.vue

@@ -1,408 +0,0 @@
-<template>
-    <div class="upload-file-box">
-        <Upload type="drag" action="" :show-upload-list="false" multiple :before-upload="customUpload" class="upload-wrap">
-            <Icon class="upload-icon" custom="iconfont icon-upload" v-show="!uploadedList.length" />
-            <p class="upload-text" :style="{marginTop: uploadedList.length ? '25px':'0px'}">
-                <Icon size="24" style="font-size: 22px;vertical-align: baseline;margin-right: 5px;" custom="iconfont icon-upload" v-show="uploadedList.length" />
-                {{$t('teachContent.uploadText')}}
-            </p>
-            <p class="upload-text" style="font-size:12px;">* 上传相同名字的文件会自动覆盖</p>
-            <p class="upload-text" :style="{fontSize:'12px',marginBottom: uploadedList.length ? '25px':'50px'}">
-                * 勾选
-                <Icon custom="iconfont icon-convert" size="12"  class="is-parse-htex"/>
-                支持PPTX文档转换成HTEX教材
-            </p>
-        </Upload>
-        <div class="upload-file-box">
-            <div class="upload-file-item" v-for="(item,index) in uploadedList" :key="index">
-                <div class="upload-item-left">
-                    <p class="upload-file-name">
-                        <span v-if="item.type == 'res'" class="file-type-tag" style="color: #1FFCC5;border-color: #1FFCC5">教材</span>
-                        <span v-else-if="item.type == 'image'" class="file-type-tag" style="color: #45C84A;border-color: #45C84A">图片</span>
-                        <span v-else-if="item.type == 'video'" class="file-type-tag" style="color: #8E2BDD;border-color: #8E2BDD">视频</span>
-                        <span v-else-if="item.type == 'audio'" class="file-type-tag" style="color: #E1027B;border-color: #E1027B">音频</span>
-                        <span v-else-if="item.type == 'doc'" class="file-type-tag" style="color: #03C0C2;border-color: #03C0C2">{{item.isParse ? '转换':'文档'}}</span>
-                        <span v-else class="file-type-tag" style="color: #E87B22; border-color: #E87B22">其他</span>
-                        <span>{{item.name}}</span>
-                    </p>
-                    <span class="upload-info-wrap" style="color:white;">
-                        {{parseInt(item.loadedBytes * 100 / item.size)+'%'}}
-                    </span>
-                    <span class="upload-info-wrap">
-                        {{getSizeByBytes(item.loadedBytes)+'/'+getSizeByBytes(item.size)}}
-                    </span>
-                    <span v-if="item.extension == 'PPTX'" class="upload-info-wrap parse-label" @click="item.isParse = !item.isParse" :style="{color:item.isParse ? '#1cc0f3':'#808080'}">
-                        <Icon class="is-parse-htex" size="12" custom="iconfont icon-convert" />
-                        转成HTEX教材
-                    </span>
-                    <Progress style="top:-10px;" v-if="item.status == 0" :percent="item.loadedBytes * 100 / item.size" status="active" stroke-color="#1CC0F3" :stroke-width="2" hide-info />
-                </div>
-                <div class="upload-item-right">
-                    <Icon type="ios-close" class="delete-btn" color="red" size="30" style="float:right;" @click="deleteFile(index)" />
-                </div>
-            </div>
-        </div>
-    </div>
-</template>
-<script>
-import '@/icons/svg/loading3.svg';
-import BlobTool from '@/utils/blobTool.js';
-export default {
-    data() {
-        return {
-            uploadedList: [],
-            containerClient: null,
-            routerScope: ''
-        }
-    },
-    props: {
-        //默认文件列表
-        defaultFileList: {
-            default: () => {
-                return []
-            },
-            type: Array
-        },
-        //文件路径
-        path: {
-            default: '',
-            type: String,
-            required: true
-        },
-        //授权信息
-        sasString: {
-            default: '',
-            type: String,
-            required: true
-        },
-        //blob链接
-        urlString: {
-            default: '',
-            type: String,
-            required: true
-        },
-        //容器名称
-        containerName: {
-            default: '',
-            type: String,
-            required: true
-        },
-        //文件大小限制
-        maxSize: {
-            default: 2 * 1024 * 1024 * 1024,
-            type: Number
-        },
-        //文件格式限制
-        format: {
-            default: () => {
-                return []
-            },
-            type: Array
-        }
-    },
-    methods: {
-        //删除文件
-        deleteFile(index) {
-            this.containerClient.deleteBlob(this.uploadedList[index].blob).then(
-                res => {
-                    //删除缩略图和封面
-                    if (this.uploadedList[index].type == 'image') {
-                        let thum = this.uploadedList[index].blob.replace('/image/', '/thum/')
-                        this.containerClient.deleteBlob(thum)
-                    } else if (this.uploadedList[index].type == 'video') {
-                        let thum = this.uploadedList[index].blob.replace('/video/', '/thum/')
-                        thum = thum.slice(0, thum.lastIndexOf('.')) + '.png'
-                        this.containerClient.deleteBlob(thum)
-                    }
-                    this.$emit('deleteFile', this._.cloneDeep(this.uploadedList[index]))
-                    this.uploadedList.splice(index, 1)
-                    this.$Message.success('删除成功!')
-                },
-                err => {
-                    this.$Message.error('删除失败!')
-                }
-            )
-        },
-        getFileType(fileName) {
-            let extension = fileName.substring(fileName.lastIndexOf('.') + 1, fileName.length)
-            extension = extension.toUpperCase()
-            for (let key in this.$GLOBAL.CONTENT_TYPES) {
-                if (this.$GLOBAL.CONTENT_TYPES[key].indexOf(extension) != -1) {
-                    return key
-                }
-            }
-            return 'other'
-        },
-        getSizeByBytes(bytes) {
-            return bytes / 1024 < 1024 ? (bytes / 1024).toFixed(1) + 'KB' : bytes / 1024 / 1024 < 1024 ? (bytes / 1024 / 1024).toFixed(1) + 'M' : (bytes / 1024 / 1024 / 1024).toFixed(1) + 'G'
-        },
-        async customUpload(file) {
-            if (file.size > this.maxSize) {
-                this.$Message.error({
-                    content: "文件大小超出限制",
-                    duration: 3
-                })
-                return false
-            }
-
-            let extension = file.name.substring(file.name.lastIndexOf('.') + 1, file.name.length)
-            if (this.format.length > 0 && this.format.indexOf(extension) == -1) {
-                this.$Message.error({
-                    content: "文件类型不支持",
-                    duration: 3
-                })
-                return false
-            }
-
-            let fileType = this.getFileType(file.name)
-            //上传文件
-            let fileInfo = {
-                url: this.urlString + '/' + this.containerName + '/' + fileType + '/' + file.name,
-                name: file.name,
-                size: file.size,
-                loadedBytes: 0,
-                progress: 0,
-                status: 0,
-                type: fileType,
-                file: file,
-                extension: extension.toUpperCase(),
-                isParse: false
-            }
-            this.uploadedList.push(fileInfo)
-            let _this = this
-            let index = this.uploadedList.length - 1
-            // this.containerClient.upload(file, fileType, {
-            //     onProgress: function (e) {
-            //         _this.uploadedList[index].loadedBytes = e.loadedBytes
-            //         _this.uploadedList[index].progress = parseInt(e.loadedBytes * 100 / file.size)
-            //     }
-            // }).then(
-            //     res => {
-            //         this.uploadedList[index].status = 1
-            //         this.uploadedList[index].blob = res.blob
-            //         extension = extension.toUpperCase()
-            //         if (res.type == 'image') {
-            //             this.uploadThum(file)
-            //             this.$emit('successData', res)
-            //         } else if (res.type == 'video') {
-            //             this.uploadPoater(res)
-            //             this.$emit('successData', res)
-            //         } else if (extension == 'PPTX') {
-            //             this.$Modal.confirm({
-            //                 title: '文件解析',
-            //                 okText: '是',
-            //                 cancelText: '否',
-            //                 content: `<p>是否将<strong style='color:red;'>${file.name}</strong>转成HTEX文件?</p>`,
-            //                 onOk: () => {
-            //                     this.$emit('parsing')
-            //                     this.$emit('successData', res)
-            //                     let delBlob = res.blob
-            //                     this.$api.teachContent.ParseDoc({
-            //                         file: res.url,
-            //                         scope: this.routerScope
-            //                     }).then(
-            //                         parseRes => {
-            //                             this.containerClient.deleteBlob(delBlob)
-            //                             res.blob = `/res/${res.name}/index.json`
-            //                             res.extension = 'HTEX'
-            //                             res.name = res.name.replace('pptx', 'HTEX').replace('PPTX', 'HTEX')
-            //                             res.type = 'res'
-
-            //                             this.$emit('parseComplete')
-            //                             this.$Message.success('解析成功')
-            //                         },
-            //                         parseErr => {
-            //                             this.$Message.error('解析失败')
-            //                         }
-            //                     )
-            //                 },
-            //                 onCancel: () => {
-            //                     this.$emit('successData', res)
-            //                 }
-            //             })
-            //         } else if (extension == 'HTEX') {
-            //             let delBlob = res.blob
-            //             this.$emit('parsing')
-            //             res.blob = `/res/${res.name}/index.json`
-            //             this.$emit('successData', res)
-            //             this.$api.teachContent.ParseDoc({
-            //                 file: res.url,
-            //                 scope: this.routerScope
-            //             }).then(
-            //                 parseRes => {
-            //                     this.containerClient.deleteBlob(delBlob)
-            //                 },
-            //                 parseErr => {
-            //                     this.$Message.error('上传失败')
-            //                     this.containerClient.deleteBlob(delBlob)
-            //                 }
-            //             ).finally(() => {
-            //                 this.$emit('parseComplete')
-            //             })
-            //         }
-            //     },
-            //     err => {
-            //         this.uploadedList[index].status = 2
-            //         if (err.spaceError) {
-            //             this.$Message.error(err.spaceError)
-            //         } else {
-            //             this.$Message.error("上传失败")
-            //         }
-            //     }
-            // )
-            return false
-        },
-        //处理图片缩略图
-        async uploadThum(file) {
-            let dataUrl = await this.$jsFn.fileToURL(file)
-            dataUrl = await this.$jsFn.compressImgByUrl(dataUrl, file.name, 0.1)
-            let f = this.$jsFn.dataURLtoFile(dataUrl, file.name)
-            this.containerClient.upload(f, 'thum').then(
-                res => {
-                    console.log('压缩图上传成功')
-                },
-                err => {
-                    console.log('压缩图上传失败')
-                }
-            )
-        },
-        //处理视频封面
-        async uploadPoater(file) {
-            let n = file.name.substring(0, file.name.lastIndexOf('.'))
-            console.log(n)
-            console.log('视频蜂蜜昂')
-            let dataUrl = await this.$jsFn.createVideoPoster(file.url + this.sasString, file.name, 0.1)
-            let f = this.$jsFn.dataURLtoFile(dataUrl, n + '.png')
-            console.log(f)
-            this.containerClient.upload(f, 'thum').then(
-                res => {
-                    console.log('视频封面上传成功')
-                },
-                err => {
-                    console.log('视频封面上传失败')
-                }
-            )
-        }
-    },
-    created() {
-        let route = this.$route
-        if (route.name == 'personalcontent') {
-            this.routerScope = 'private'
-        } else {
-            this.routerScope = 'school'
-        }
-    },
-    watch: {
-        urlString: {
-            handler(v, o) {
-                if (this.urlString && this.containerName && this.sasString) {
-                    let scope = ''
-                    if (this.containerName == this.$store.state.userInfo.TEAMModelId) {
-                        scope = 'private'
-                    } else if (this.containerName == this.$store.state.userInfo.schoolCode) {
-                        scope = 'school'
-                    }
-                    //初始化Blob
-                    this.containerClient = new BlobTool(this.urlString, this.containerName, this.sasString, scope)
-                }
-            }
-        },
-        containerName: {
-            handler(v, o) {
-                if (this.urlString && this.containerName && this.sasString) {
-                    let scope = ''
-                    if (this.containerName == this.$store.state.userInfo.TEAMModelId) {
-                        scope = 'private'
-                    } else if (this.containerName == this.$store.state.userInfo.schoolCode) {
-                        scope = 'school'
-                    }
-                    //初始化Blob
-                    this.containerClient = new BlobTool(this.urlString, this.containerName, this.sasString, scope)
-                }
-            }
-        },
-        sasString: {
-            handler(v, o) {
-                if (this.urlString && this.containerName && this.sasString) {
-                    let scope = ''
-                    if (this.containerName == this.$store.state.userInfo.TEAMModelId) {
-                        scope = 'private'
-                    } else if (this.containerName == this.$store.state.userInfo.schoolCode) {
-                        scope = 'school'
-                    }
-                    //初始化Blob
-                    this.containerClient = new BlobTool(this.urlString, this.containerName, this.sasString, scope)
-                }
-            }
-        }
-    }
-}
-
-</script>
-<style scoped>
-.upload-text {
-    margin: 10px 0px;
-    font-size: 24px;
-}
-.upload-icon {
-    font-size: 50px;
-    margin-top: 60px;
-}
-.upload-file-item {
-    color: #909090;
-    margin-top: 5px;
-    padding: 5px 2px 0px 5px;
-    display: flex;
-}
-.upload-item-left {
-    width: calc(100% - 25px);
-}
-.upload-item-right {
-    width: 25px;
-}
-.upload-info-wrap {
-    float: right;
-    margin-left: 10px;
-    vertical-align: middle;
-    /* color: white; */
-    line-height: 30px;
-}
-
-.upload-file-item:hover {
-    /* color: white; */
-    /* background: #585858; */
-    border-radius: 5px;
-}
-
-.upload-file-item:hover .delete-btn {
-    display: inline-block;
-}
-.upload-loading-icon {
-    vertical-align: middle;
-}
-.upload-file-name {
-    display: inline-block;
-    color: #eeeeee;
-    line-height: 30px;
-}
-
-.delete-btn {
-    display: none;
-}
-.file-type-tag {
-    border: 1px solid;
-    /*border-color:white;*/
-    border-radius: 2px;
-    padding: 0px 4px;
-    margin-right: 5px;
-    font-size: 12px;
-}
-.parse-label {
-    cursor: pointer;
-    font-size: 12px;
-    user-select: none;
-}
-.is-parse-htex {
-    vertical-align: baseline;
-}
-</style>

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

@@ -236,7 +236,7 @@
                 let url = file.name
                 if (file.size > this.maxSize) {
                     this.$Message.error({
-                        content: "文件大小超出限制",
+                        content: this.$t('system.compt.sizeErr'),
                         duration: 3
                     })
                     return false
@@ -245,7 +245,7 @@
                 let extension = file.name.substring(file.name.lastIndexOf('.') + 1, file.name.length)
                 if (this.format.length > 0 && this.format.indexOf(extension) == -1) {
                     this.$Message.error({
-                        content: "文件类型不支持",
+                        content: this.$t('system.compt.typeErr'),
                         duration: 3
                     })
                     return false

+ 1 - 1
TEAMModelOS/ClientApp/src/common/VideoPlayer2.vue

@@ -60,7 +60,7 @@
                         "font-size": "16px",
                     },
                     text: function (marker) {
-                        return "课件 " + marker.text;
+                        return this.$t('system.compt.cusWare') + marker.text;
                     },
                 },
                 markerTip: {

+ 0 - 12
TEAMModelOS/ClientApp/src/components/selflearn/ExerciseList.vue

@@ -165,18 +165,6 @@
             </div>
         </div>
 
-        <!-- 音频播放弹窗 -->
-        <Modal v-model="playAudioModal" width="400" footer-hide @on-visible-change="onAudioModalChange">
-            <div class="modal-header" slot="header">音频播放</div>
-            <BaseAudioPlayer :audioSrc="curAudioSrc" :audioName="curAudioName" ref="audioPlayer"></BaseAudioPlayer>
-        </Modal>
-
-        <!-- 视频播放弹窗 -->
-        <Modal v-model="playVideoModal" width="400" footer-hide @on-visible-change="onVideoModalChange">
-            <div class="modal-header" slot="header">视频播放</div>
-            <BaseVideoPlayer :videoSrc="curVideoSrc" :audioName="curVideoName" ref="videoPlayer"></BaseVideoPlayer>
-        </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]" />
     </div>

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

@@ -79,6 +79,8 @@
 					xAxis: [{
 						type: 'value',
 						splitNumber: 2,
+						min:0,
+						max:1,
 						name: _this.$t('totalAnalysis.sca_chart_text2'),
 						nameTextStyle: {
 							color: '#e4eadb'
@@ -212,7 +214,7 @@
 										position: ['5%', '10%'],
 										color: '#66ff33',
 										fontSize: 20,
-										formatter: 'A-'
+										formatter: "A'"
 									}
 
 								}, {
@@ -251,7 +253,7 @@
 										color: '#66ff33',
 										fontSize: 20,
 										zIndex: 99999,
-										formatter: 'B-'
+										formatter: "B'"
 									}
 
 								}, {
@@ -289,7 +291,7 @@
 										position: ['5%', '10%'],
 										color: '#66ff33',
 										fontSize: 20,
-										formatter: 'C-'
+										formatter: "C'"
 									}
 
 								}, {

+ 5 - 3
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseTestScatter.vue

@@ -73,11 +73,13 @@
 					xAxis: [{
 						type: 'value',
 						splitNumber: 2,
+						min:0,
+						max:1,
 						name: _this.$t('totalAnalysis.ta_chart_text3'),
 						nameTextStyle: {
 							color: '#e4eadb'
 						},
-						scale: true,
+						scale: false,
 						splitLine: {
 							show: true,
 							lineStyle: {
@@ -187,7 +189,7 @@
 										position: ['5%', '10%'],
 										color: '#66ff33',
 										fontSize: 20,
-										formatter: 'B-'
+										formatter: "B'"
 									}
 
 								}, {
@@ -225,7 +227,7 @@
 										position: ['5%', '40%'],
 										color: '#66ff33',
 										fontSize: 20,
-										formatter: 'A-'
+										formatter: "A'"
 									}
 								}, {
 									xAxis: '0.5',

+ 204 - 198
TEAMModelOS/ClientApp/src/locale/lang/en-US/learnActivity.js

@@ -1,201 +1,207 @@
-export default {
-    //MgtSchoolEva.vue
-    mgtScEv:{
-        listLabel:'评测列表',
-        period:'学段:',
-        create:'新建',
-        delete:'删除',
-        edit:'编辑',
-        createTime:'施测时间:',
-        pending:'待发布',
-        going:'进行中',
-        finish:'已结束',
-        endTime:'结束时间:',
-        stop:'立即结束',
-        evType:'测试类型:',
-        stuCount:'施测人数:',
-        nodata:'暂无评测',
-        tab1:'评测数据',
-        tab2:'评测试卷',
-        autoTips1:'此功能仅用于展示情景快速模拟学生作答数据,且学生作答为随机生成,仅供参考!',
-        autoTips2:'此功能仅用于展示情景快速模拟教师评分数据,且分数为随机生成,仅供参考!',
-        autoScore:'一键评分',
-        autoAnswer:'一键作答',
-        evSubject:'测试科目:',
-        returnTop:'返回顶部',
-        mockOk:'模拟成功',
-        mockErr:'模拟失败',
-        stopTitle:'结束评测',
-        stopContent:'结束后学生将不能继续作答,是否立即结束',
-        stopOk:'评测已结束!',
-        deleteTitle:'删除评测',
-        deleteContent:'是否确认删除',
-        deleteOk:'删除成功',
-        deleteErr:'删除失败',
-        noJoin:'此账号暂未加入任何学校!',
-        myEv:'我发布的评测',
-        teaEv:'任课老师发布的评测'
-    },
+export default{
+  //MgtSchoolEva.vue
+  mgtScEv:{
+      listLabel:'评测列表',
+      period:'学段:',
+      create:'新建',
+      delete:'删除',
+      edit:'编辑',
+      createTime:'施测时间:',
+      pending:'待发布',
+      going:'进行中',
+      finish:'已结束',
+      endTime:'结束时间:',
+      stop:'立即结束',
+      evType:'测试类型:',
+      stuCount:'施测人数:',
+      nodata:'暂无评测',
+      tab1:'评测数据',
+      tab2:'评测试卷',
+      autoTips1:'此功能仅用于展示情景快速模拟学生作答数据,且学生作答为随机生成,仅供参考!',
+      autoTips2:'此功能仅用于展示情景快速模拟教师评分数据,且分数为随机生成,仅供参考!',
+      autoScore:'一键评分',
+      autoAnswer:'一键作答',
+      evSubject:'测试科目:',
+      returnTop:'返回顶部',
+      mockOk:'模拟成功',
+      mockErr:'模拟失败',
+      stopTitle:'结束评测',
+      stopContent:'结束后学生将不能继续作答,是否立即结束',
+      stopOk:'评测已结束!',
+      deleteTitle:'删除评测',
+      deleteContent:'是否确认删除',
+      deleteOk:'删除成功',
+      deleteErr:'删除失败',
+      noJoin:'此账号暂未加入任何学校!',
+      myEv:'我发布的评测',
+      teaEv:'任课老师发布的评测'
+  },
 
-    //创建评测校本/个人
-    createEv:{
-        createLabel:'创建评测',
-        publishEv:'发布评测',
-        return:'返回上级',
-        baseInfo:'基础信息',
-        evName:'评测名称',
-        evPeriod:'测试学段',
-        evMode:'评测模式',
-        evType:'评测类型',
-        examType:'考试类别',
-        courseType:'课程类别',
-        cusLabel1:'校本课程',
-        cusLabel2:'个人课程',
-        evTarget:'施测对象',
-        publishType:'发布方式',
-        startTime:'开始时间',
-        sTimeHolder:'请选择开始时间',
-        endTime:'结束时间',
-        eTimeHolder:'请选择结束时间',
-        addSubject:'添加学科',
-        noSubject:'暂无科目,请添加科目',
-        noSubject1:'* 请先选择测试学段',
-        papersLabel:'试卷库',
-        perviewLabel:'试卷预览',
-        importLabel:'导入说明',
-        answerPreview:'作答预览',
-        errTips1:'评测名称不能为空!',
-        errTips2:'测试类型不能为空!',
-        errTips3:'评量模式不能为空!',
-        errTips4:'请设置类别!',
-        errTips5:'请设置测试类型!',
-        errTips6:'请设置测试对象!',
-        errTips7:'请设置发布方式!',
-        errTips8:'请设置发布时间!',
-        errTips9:'请设置结束时间!',
-        errTips10:'请设置测试学段!',
-        stPaperTitle:'挑选试卷',
-        stPaperContent:'是否确认挑选',
-        inDev:'功能正在开发中,敬请期待!',
-        formWarning:'请先完善评测基础信息!',
-        paperWarning:'请挑选或导入试卷!',
-        paperWarning1:'还没有试卷,请挑选或导入试卷!',
-        pdWarning:'请添加测试科目!',
-        publishOk:'评测发布成功!',
-        togglePeriod:'切换学段',
-        togglePdTip1:'您已添加',
-        togglePdTip2:'的测试科目,如果现在切换学段会清空已选科目,确定切换学段吗?',
-        toggleOkText:'切换',
-        delPdTitle:'删除科目',
-        delPdContent:'是否确认删除',
-        delOk:'删除成功',
-        pdTips:'请先选择测试学段!',
-        defaultPaper:'(请先挑选或导入试卷)',
-    },
-    // ManualPaper.vue
-    manual:{
-        source:'来源:',
-        sourceP:'个人试卷库',
-        sourceS:'校本试卷库',
-        pdLabel:'学段:',
-        subjectLabel:'学科:',
-        gradeLabel:'年级:',
-        fitPd:'适用学段:',
-        fitSubject:'适用科目:',
-        quCount:'题量:',
-        useCount:'使用次数:',
-        stdPaper:'已选试卷',
-        stPaper:'选择试卷',
-        previewPaper:'预览试卷',
-        noPaper:'暂无对应的试卷',
-        noPaper1:'暂无试卷'
-    },
-    // PaperScore.vue、Scoring.vue
-    score:{
-        stuName:'学生姓名:',
-        score:'总分:',
-        scoreUnit:'分',
-        saveScore:'保存打分',
-        showAns:'显示答案',
-        hideAns:'隐藏答案',
-        showQu:'显示题干',
-        hideQu:'隐藏题干',
-        quIndex:'题号:',
-        quIndex1:'题号',
-        fullScore:'满分',
-        zeroScore:'零分',
-        zeroScore1:'0分',
-        stuAns:'【学 生 作 答】',
-        mark:'批注',
-        quAns:'【答ㅤ案】',
-        noAnswer:'未设置答案',
-        anaLabel:'【解ㅤ析】',
-        noAna:'暂无解析',
-        kdLabel:'【知识点】',
-        noKd:'暂未绑定知识点',
-        sQuLabel1:'【小题',
-        sQuLabel2:'】',
-        quIndexLabel:'【题号',
-        nextStu:'下一位学生>>>',
-        markOk:'批注成功!',
-        markErr:'批注失败!',
-        isFullTips:'已经是小题满分了',
-        isZeroTips:'已经是零分了',
-        saveScoreOk:'成绩保存成功!',
-        saveSocreErr:'成绩保存失败!',
-        zero:'零',
-        one:'一',
-        two:'二',
-        three:'三',
-        four:'四',
-        five:'五',
-        six:'六',
-        seven:'七',
-        eight:'八',
-        nine:'九',
-        ten:'十',
-        hundred:'百',
-        thousand:'千',
-        tenThd:'万',
-        hMillion:'亿',
-        noStuAns:'未作答',
-        noStuAns1:'暂未作答',
-        trueAns:'正确',
-        falseAns:'错误',
-        //Scoring.vue
-        subjectLabel:'学科:',
-        gradeLabel:'年级:',
-        classLabel:'班级:',
-        stuLabel:'学生:',
-        scoreView:'分数概览',
-        scoring:'试卷评分',
-        classNoStu:'班级暂无学生',
-        status1:'暂未作答',
-        status2:'前往评分',
-        status3:'查看分数',
-        column1:'姓名',
-        column2:'总分',
-        column3:'状态',
-        finishScore:'已完成所有学生作答的评分!',
-        unableScore:'学生尚未作答,无法评分',
-        stStuWarning:'请先选择学生!'
-    },
+  //CreateEv
+  createEv:{
+      createLabel:'创建评测',
+      publishEv:'发布评测',
+      return:'返回上级',
+      baseInfo:'基础信息',
+      evName:'评测名称',
+      evPeriod:'测试学段',
+      evMode:'评测模式',
+      evType:'评测类型',
+      examType:'考试类别',
+      courseType:'课程类别',
+      cusLabel1:'校本课程',
+      cusLabel2:'个人课程',
+      evTarget:'施测对象',
+      publishType:'发布方式',
+      startTime:'开始时间',
+      sTimeHolder:'请选择开始时间',
+      endTime:'结束时间',
+      eTimeHolder:'请选择结束时间',
+      addSubject:'添加学科',
+      noSubject:'暂无科目,请添加科目',
+      noSubject1:'* 请先选择测试学段',
+      papersLabel:'试卷库',
+      perviewLabel:'试卷预览',
+      importLabel:'导入说明',
+      answerPreview:'作答预览',
+      errTips1:'评测名称不能为空!',
+      errTips2:'测试类型不能为空!',
+      errTips3:'评量模式不能为空!',
+      errTips4:'请设置类别!',
+      errTips5:'请设置测试类型!',
+      errTips6:'请设置测试对象!',
+      errTips7:'请设置发布方式!',
+      errTips8:'请设置发布时间!',
+      errTips9:'请设置结束时间!',
+      errTips10:'请设置测试学段!',
+      stPaperTitle:'挑选试卷',
+      stPaperContent:'是否确认挑选',
+      inDev:'功能正在开发中,敬请期待!',
+      formWarning:'请先完善评测基础信息!',
+      paperWarning:'请挑选或导入试卷!',
+      paperWarning1:'还没有试卷,请挑选或导入试卷!',
+      pdWarning:'请添加测试科目!',
+      publishOk:'评测发布成功!',
+      togglePeriod:'切换学段',
+      togglePdTip1:'您已添加',
+      togglePdTip2:'的测试科目,如果现在切换学段会清空已选科目,确定切换学段吗?',
+      toggleOkText:'切换',
+      delPdTitle:'删除科目',
+      delPdContent:'是否确认删除',
+      delOk:'删除成功',
+      pdTips:'请先选择测试学段!',
+      defaultPaper:'(请先挑选或导入试卷)',
+  },
+  // ManualPaper.vue
+  manual:{
+      source:'来源:',
+      sourceP:'个人试卷库',
+      sourceS:'校本试卷库',
+      pdLabel:'学段:',
+      subjectLabel:'学科:',
+      gradeLabel:'年级:',
+      fitPd:'适用学段:',
+      fitSubject:'适用科目:',
+      quCount:'题量:',
+      useCount:'使用次数:',
+      stdPaper:'已选试卷',
+      stPaper:'选择试卷',
+      previewPaper:'预览试卷',
+      noPaper:'暂无对应的试卷',
+      noPaper1:'暂无试卷'
+  },
+  // PaperScore.vue、Scoring.vue
+  score:{
+      stuName:'学生姓名:',
+      score:'总分:',
+      scoreUnit:'分',
+      saveScore:'保存打分',
+      showAns:'显示答案',
+      hideAns:'隐藏答案',
+      showQu:'显示题干',
+      hideQu:'隐藏题干',
+      quIndex:'题号:',
+      quIndex1:'题号',
+      fullScore:'满分',
+      zeroScore:'零分',
+      zeroScore1:'0分',
+      stuAns:'【学 生 作 答】',
+      mark:'批注',
+      quAns:'【答ㅤ案】',
+      noAnswer:'未设置答案',
+      anaLabel:'【解ㅤ析】',
+      noAna:'暂无解析',
+      kdLabel:'【知识点】',
+      noKd:'暂未绑定知识点',
+      sQuLabel1:'【小题',
+      sQuLabel2:'】',
+      quIndexLabel:'【题号',
+      nextStu:'下一位学生>>>',
+      markOk:'批注成功!',
+      markErr:'批注失败!',
+      isFullTips:'已经是小题满分了',
+      isZeroTips:'已经是零分了',
+      saveScoreOk:'成绩保存成功!',
+      saveSocreErr:'成绩保存失败!',
+      zero:'零',
+      one:'一',
+      two:'二',
+      three:'三',
+      four:'四',
+      five:'五',
+      six:'六',
+      seven:'七',
+      eight:'八',
+      nine:'九',
+      ten:'十',
+      hundred:'百',
+      thousand:'千',
+      tenThd:'万',
+      hMillion:'亿',
+      noStuAns:'未作答',
+      noStuAns1:'暂未作答',
+      trueAns:'正确',
+      falseAns:'错误',
+      //Scoring.vue
+      subjectLabel:'学科:',
+      gradeLabel:'年级:',
+      classLabel:'班级:',
+      stuLabel:'学生:',
+      scoreView:'分数概览',
+      scoring:'试卷评分',
+      classNoStu:'班级暂无学生',
+      status1:'暂未作答',
+      status2:'前往评分',
+      status3:'查看分数',
+      column1:'姓名',
+      column2:'总分',
+      column3:'状态',
+      finishScore:'已完成所有学生作答的评分!',
+      unableScore:'学生尚未作答,无法评分',
+      stStuWarning: '请先选择学生!',
+      lastQu: '上一题',
+      nextQu: '下一题',
+  },
 
-    //SimpleAnalysis.vue
-    simple:{
-        total:'总人数',
-        missExam:'缺考数',
-        classLabel:'班级',
-        sjLabel:'学科',
-        avgScore:'平均分',
-        classStuCount:'班级人数',
-        answered:'已作答',
-        unanswer:'未作答',
-        scored:'已评分',
-        unscore:'未评分',
-        noPublish:'评测尚未发布,暂无统计数据',
-        calcing:'成绩数据结算中,',
-        clickFresh:'点此刷新',
-        inCalc:'数据结算中,请稍后查看'
-    }
+  //SimpleAnalysis.vue
+  simple:{
+      total:'总人数',
+      missExam:'缺考数',
+      classLabel:'班级',
+      sjLabel:'学科',
+      avgScore:'平均分',
+      classStuCount:'班级人数',
+      answered:'已作答',
+      unanswer:'未作答',
+      scored:'已评分',
+      unscore:'未评分',
+      noPublish:'评测尚未发布,暂无统计数据',
+      calcing:'成绩数据结算中,',
+      clickFresh:'点此刷新',
+      inCalc:'数据结算中,请稍后查看',
+      total:'总分',
+      avgScore:'均分统计',
+      totalLabel:'总量',
+      scoreMat:'分数段统计'
+  }
 }

+ 152 - 87
TEAMModelOS/ClientApp/src/locale/lang/en-US/schoolBaseInfo.js

@@ -1,100 +1,165 @@
 export default {
-  // Index.vue
-  createPeriod: 'establishing a school level system',
-  classroomSetting: 'classroom setting',
-
   // SystemSetting.vue
-  schoolNameLabel: 'school name setting:',
-  periodSettingLabel: 'school system establishment and setting',
-  order: 'sort by creation time',
-  semesterSetting: 'semester (quarter) setting',
-  gradeSetting: 'grade setting',
-  subjectSetting: 'subject setting',
-  semesterNum: 'semesters:',
-  gradeNum: 'grade number:',
-  periodNum: 'number of subjects:',
-  startDate: 'from',
-  semesterDuration: 'semester duration:',
-  dayUnit: 'day',
-  saveInfo: 'save changes',
-  noSemester: 'semester not set',
-  editLabel: 'Edit',
-  monthHolder: 'month',
-  dayHolder: 'day',
-  delete: 'delete',
-  ssTips1: 'click to set the name',
-  ssTips2: 'at least one item needs to be reserved! ',
-  ssTips3: 'saving / modifying information succeeded! ',
-  ssTips4: 'the same name already exists, please reset it! ',
-  ssTips5: 'the number of subjects has reached the maximum! ',
-  ssTips6: 'the number of grades has reached the upper limit! ',
-  ssTips7: 'the maximum number of semesters has been reached! ',
-  ssTips8: 'you have not saved the modified information. If you leave, the data will be lost!',
-  presetPeriod: 'preset period',
-  persetSemester: 'Default semester',
-  persetGrade: 'default grade',
-  presetGrade1: 'first year',
-  presetGrade2: 'second year',
-  presetGrade3: 'third grade',
-  presetSubject: 'preset subject',
-  presetSubject1: 'chinese',
-  presetSubject2: 'Mathematics',
-  presetSubject3: 'English',
+  schoolNameLabel: '学校名称:',
+  periodSettingLabel: '学制设置',
+  order: '依建立时间排序',
+  semesterSetting: '学期(季)设置',
+  gradeSetting: '年级设置',
+  subjectSetting: '学科设置',
+  semesterNum: '学期数:',
+  gradeNum: '年级数:',
+  periodNum: '科目数:',
+  startDate: '开始于',
+  semesterDuration: '学期时长:',
+  dayUnit: '天',
+  saveInfo: '存储变更',
+  noSemester: '没有设置学期',
+  editLabel: '编辑',
+  monthHolder: '月',
+  dayHolder: '日',
+  delete: '删除',
+  ssTips1: '点击设置名称',
+  ssTips2: '至少需要保留一项!',
+  ssTips3: '保存/修改 信息成功!',
+  ssTips4: '已有相同的名字,请重新设置名字!',
+  ssTips5: '学科数已达上限!',
+  ssTips6: '年级数已达上限!',
+  ssTips7: '学期数已达上限!',
+  ssTips8: '您修改信息后还未保存,如果离开数据将会丢失!',
+  presetPeriod: '学段',
+  persetSemester: '学期',
+  persetGrade: '年级',
+  presetGrade1: '一年级',
+  presetGrade2: '二年级',
+  presetGrade3: '三年级',
+  presetSubject: '学科',
+  presetSubject1: '语文',
+  presetSubject2: '数学',
+  presetSubject3: '英语',
+  pdHolder: '设置学段...',
+  tmzLabel: '时区设置:',
+  tmzHolder: '请设置时区...',
+  campusHolder: '请设置校区',
+  setCampus: '请设置校区',
+  smHolder: '设置学期...',
+  subjectHolder: '设置学科...',
+  noSubject: '暂无学科',
+  anaLabel: '学情设置',
+  exTypeLabel: '考试类型:',
+  examHolder: '设置考试类型...',
+  noExam: '暂无考试类型',
+  eugenicsLabel: '优生率:',
+  eugenicsTips: '优生率计算方式',
+  incomeLable: '进线率:',
+  incomeTips: '(进线人数)/(报名人数)×100%',
+  touchLabel: '踩线生:',
+  touchTips: '踩线生计算方式',
+  scoreUnit: '分',
+  delExamTitle: '删除考试类型',
+  delGradeTitle: '删除年级',
+  delSubjectTitle: '删除学科',
+  delPdTitle: '删除学段',
+  delCampusTitle: '删除校区',
+  delSmTitle: '删除学期',
+  delContent: '后与之关联的数据将不能查询,确认删除吗?',
+  campusWarning: '对不起,校区数量已到系统授权最多数量!',
+  authWarning: '您暂无此操作权限!',
+  saveErr: '保存失败!',
+  saveWarning: '保存提醒',
+  leaveText: '离开',
 
   // ClassroomSetting.vue
-  classroomList: 'classroom list',
-  listOrder: 'sort by creation time',
-  classroomAttr: 'classroom properties',
-  classroomCode: 'classroom code',
-  classroomName: 'classroom name',
-  headmaster: 'head teacher:',
-  setPeriod: 'select classroom segment',
-  setGrade: 'set classroom grade',
-  setHiteachCode: 'Hiteach software serial number',
-  addClassroom: 'new classroom',
-  schoolPlan: 'campus plan and classroom location setting',
-  uploadPlan: 'upload plan',
-  hiteachList: 'Hiteach sequence number list',
-  codeSearchHolder: 'please enter keyword search',
-  classroomCodeHolder: 'please enter the classroom code...',
-  classroomNameHolder: 'please enter the classroom name...',
-  headmasterHolder: 'please specify the teacher name...',
-  hiTeachHolder: 'please select available serial numbers in the list on the right...',
-  noHiTeachTips: 'no sequence number available',
-  suportCanvas: 'canvas is not supported in the current browser. Please change your browser and try again. ',
-  addCodeTitle: 'enter Hiteach serial number',
-  codeHolder: 'please enter Hiteach serial number...',
-  moreAuth: 'massive authorization',
-  yes: 'yes',
-  no: 'no',
-  hiTeach: 'HiTeach serial number',
-  csTips1: 'magnified to the maximum multiple! ',
-  csTips2: 'reduced to the minimum multiple! ',
-  csTips3: 'saved successfully! ',
-  csTips4: 'at least one item needs to be reserved! ',
-  csTips5: 'upload succeeded! ',
-  csTips6: 'this serial number has been bound to the classroom! ',
-  csTips7: 'Delete succese��',
-  presetClassroomName: 'preset classroom',
-  presetHeadmaster: 'no head teacher specified',
-  sokapp:'苏格拉底议课',
-  remotcls:'远距教室服务',
-  sokdesk:'苏格拉底桌面',
-  sokrpt:'苏格拉底报告',
-  sokvdo:'苏格拉底影片',
-  ezs:'录播系统',
+  classroomList: '教室列表',
+  pdLabel: '学段:',
+  listOrder: '依创建时间排序',
+  listOrder1: '依教室编号排序',
+  listOrder2: '依智慧教室排序',
+  classroomAttr: '教室属性',
+  classroomCode: '教室编码',
+  classroomName: '教室名称',
+  headmaster: '班主任:',
+  setPeriod: '选择教室学段',
+  setGrade: '设置教室年级',
+  setHiteachCode: 'HiTeach软件序号',
+  addClassroom: '新增教室',
+  schoolPlan: '校园平面图与教室位置设置',
+  uploadPlan: '上传平面图',
+  hiteachList: 'HiTeach序号列表',
+  codeSearchHolder: '请输入关键字搜索',
+  classroomCodeHolder: 'eg: HBCN0101',
+  classroomNameHolder: 'eg: 一年级一班',
+  headmasterHolder: '可通过名字搜索...',
+  hiTeachHolder: '请在右侧列表选择可用序号...',
+  noHiTeachTips: '没有可用序号',
+  suportCanvas: '当前浏览器不支持Canvas,请更换浏览器再试试。',
+  addCodeTitle: '录入HiTeach序列号',
+  codeHolder: '请输入HiTeach序号...',
+  moreAuth: '大量授权',
+  yes: '是',
+  no: '否',
+  hiTeach: 'HiTeach序列号',
+  csTips1: '已放大至最大倍数!',
+  csTips2: '已缩小至最小倍数!',
+  csTips3: '保存成功!',
+  csTips4: '至少需要保留一项!',
+  csTips5: '上传成功!',
+  csTips6: '此序号已绑定到教室!',
+  csTips7: '删除成功!',
+  presetClassroomName: '教室',
+  presetHeadmaster: '未指定班主任',
+  sokapp: '苏格拉底议课',
+  remotcls: '远距教室服务',
+  sokdesk: '苏格拉底桌面',
+  sokrpt: '苏格拉底报告',
+  sokvdo: '苏格拉底影片',
+  ezs: '录播系统',
   '3222NIYD': 'ezStation 2',
   'J223IZ6M': 'HiTeach STD',
   '3222C6D2': 'HiTeach TBL',
   'J223IZAM': 'HiTeach PRO',
-  addStuBtn: '添加學生',
-  delStuBtn: '移除學生',
-  editSeat: '修改座號',
+  tmdClass: 'TEAM Model 智慧教室',
+  normalClass: '普通教室',
+  dClass: '专科教室',
+  tab1: '基础信息',
+  tab2: '学生名单',
+  tab3: '位置设定',
+  tab4: '关联Hiteach',
+  classAttr: '教室属性',
+  relationHi: '关联Hiteach设备',
+  hiFilter1: '显示所有版本的Hiteach',
+  hiFilter2: '仅显示Hiteach Standard版本',
+  hiFilter3: '仅显示Hiteach Pro版本',
+  hiFilter4: '仅显示Hiteach TBL版本',
+  single: '单一',
+  mach: '大量',
+  expireLabel: '序号到期日',
+  related: '已被關聯',
+  noEnable: '此序号尚未启用',
+  onClassStu: '专科教室没有固定学生名单!',
+  classNoErr: '教室编码不能为空!',
+  classNoErr1: '教室编码只能由字母和数字组成!',
+  classAttr1: '常规教室(有固定学生)',
+  classAttr2: '专科教室(无固定学生)',
+  nameWarning: '请输入教室名称',
+  typeWarning: '请设置教室属性',
+  gradeWarning: '请设置年级',
+  expireLabel1: '已到期',
+  expireLabel2: '无限期',
+  findStuErr: '查询班级学生名单失败!',
+  noStdClass: '当前班级未选中,不能移动!',
+  formWarning: '请先完善班级信息再保存!',
+  bindingErr: 'Hiteach 绑定失败!',
+  delClass: '删除班级',
+  saveClassWarning: '当前教室数据尚未保存。如果离开,修改的数据将不会保存!',
+  addStuBtn: '添加学生',
+  delStuBtn: '移除学生',
+  editSeat: '修改座号',
   removeTile: '移除提醒',
-  removeContent: '是否確認移除',
+  removeContent: '是否确认移除',
   removeOk: '移除成功',
-  removeErr: '移除失敗',
+  removeErr: '移除失',
   deLink: '解除关联',
   link: '关联',
-  confirmDelink:'请问您确定要解除关联'
+  confirmDelink: '请问您确定要解除关联',
+  noStu: '暂无学生'
 }

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

@@ -33,6 +33,18 @@ export default {
         prtQu:'个人问卷',
         selfLearn:'自主学习',
         homework:'作业活动',
-        acRecord:'活动记录'
+        acRecord: '活动记录',
+        cusMgt:'课程管理'
+    },
+    compt: {
+        cusWare: '课件',
+        sizeErr: '文件大小超出限制',
+        typeErr: '文件类型不支持',
+        acRep: '警告 :未找到指定班级',
+        classErr: '警告 :未找到指定班级',
+        setErr: '错误:座位号重复',
+        tbColErr1:'导入数据没有',
+        tbColErr2: ',请完善表格数据再导入',
+        fileReadErr:'文件读取失败'
     }
 }

+ 8 - 2
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/learnActivity.js

@@ -178,7 +178,9 @@ export default{
         column3:'状态',
         finishScore:'已完成所有学生作答的评分!',
         unableScore:'学生尚未作答,无法评分',
-        stStuWarning:'请先选择学生!'
+        stStuWarning: '请先选择学生!',
+        lastQu: '上一题',
+        nextQu: '下一题',
     },
 
     //SimpleAnalysis.vue
@@ -196,6 +198,10 @@ export default{
         noPublish:'评测尚未发布,暂无统计数据',
         calcing:'成绩数据结算中,',
         clickFresh:'点此刷新',
-        inCalc:'数据结算中,请稍后查看'
+        inCalc:'数据结算中,请稍后查看',
+        total:'总分',
+        avgScore:'均分统计',
+        totalLabel:'总量',
+        scoreMat:'分数段统计'
     }
 }

+ 80 - 79
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolBaseInfo.js

@@ -36,41 +36,41 @@ export default {
   presetSubject1: '语文',
   presetSubject2: '数学',
   presetSubject3: '英语',
-  pdHolder:'设置学段...',
-  tmzLabel:'时区设置:',
-  tmzHolder:'请设置时区...',
-  campusHolder:'请设置校区',
-  setCampus:'请设置校区',
-  smHolder:'设置学期...',
-  subjectHolder:'设置学科...',
-  noSubject:'暂无学科',
-  anaLabel:'学情设置',
-  exTypeLabel:'考试类型:',
-  examHolder:'设置考试类型...',
-  noExam:'暂无考试类型',
-  eugenicsLabel:'优生率:',
-  eugenicsTips:'优生率计算方式',
-  incomeLable:'进线率:',
-  incomeTips:'(进线人数)/(报名人数)×100%',
-  touchLabel:'踩线生:',
-  touchTips:'踩线生计算方式',
-  scoreUnit:'分',
-  delExamTitle:'删除考试类型',
-  delGradeTitle:'删除年级',
-  delSubjectTitle:'删除学科',
-  delPdTitle:'删除学段',
-  delCampusTitle:'删除校区',
-  delSmTitle:'删除学期',
-  delContent:'后与之关联的数据将不能查询,确认删除吗?',
-  campusWarning:'对不起,校区数量已到系统授权最多数量!',
-  authWarning:'您暂无此操作权限!',
-  saveErr:'保存失败!',
-  saveWarning:'保存提醒',
-  leaveText:'离开',
+  pdHolder: '设置学段...',
+  tmzLabel: '时区设置:',
+  tmzHolder: '请设置时区...',
+  campusHolder: '请设置校区',
+  setCampus: '请设置校区',
+  smHolder: '设置学期...',
+  subjectHolder: '设置学科...',
+  noSubject: '暂无学科',
+  anaLabel: '学情设置',
+  exTypeLabel: '考试类型:',
+  examHolder: '设置考试类型...',
+  noExam: '暂无考试类型',
+  eugenicsLabel: '优生率:',
+  eugenicsTips: '优生率计算方式',
+  incomeLable: '进线率:',
+  incomeTips: '(进线人数)/(报名人数)×100%',
+  touchLabel: '踩线生:',
+  touchTips: '踩线生计算方式',
+  scoreUnit: '分',
+  delExamTitle: '删除考试类型',
+  delGradeTitle: '删除年级',
+  delSubjectTitle: '删除学科',
+  delPdTitle: '删除学段',
+  delCampusTitle: '删除校区',
+  delSmTitle: '删除学期',
+  delContent: '后与之关联的数据将不能查询,确认删除吗?',
+  campusWarning: '对不起,校区数量已到系统授权最多数量!',
+  authWarning: '您暂无此操作权限!',
+  saveErr: '保存失败!',
+  saveWarning: '保存提醒',
+  leaveText: '离开',
 
   // ClassroomSetting.vue
   classroomList: '教室列表',
-  pdLabel:'学段:',
+  pdLabel: '学段:',
   listOrder: '依创建时间排序',
   listOrder1: '依教室编号排序',
   listOrder2: '依智慧教室排序',
@@ -107,58 +107,59 @@ export default {
   csTips7: '删除成功!',
   presetClassroomName: '教室',
   presetHeadmaster: '未指定班主任',
-  sokapp:'苏格拉底议课',
-  remotcls:'远距教室服务',
-  sokdesk:'苏格拉底桌面',
-  sokrpt:'苏格拉底报告',
-  sokvdo:'苏格拉底影片',
-  ezs:'录播系统',
+  sokapp: '苏格拉底议课',
+  remotcls: '远距教室服务',
+  sokdesk: '苏格拉底桌面',
+  sokrpt: '苏格拉底报告',
+  sokvdo: '苏格拉底影片',
+  ezs: '录播系统',
   '3222NIYD': 'ezStation 2',
   'J223IZ6M': 'HiTeach STD',
   '3222C6D2': 'HiTeach TBL',
   'J223IZAM': 'HiTeach PRO',
-  tmdClass:'TEAM Model 智慧教室',
-  normalClass:'普通教室',
-  dClass:'专科教室',
-  tab1:'基础信息',
-  tab2:'学生名单',
-  tab3:'位置设定',
+  tmdClass: 'TEAM Model 智慧教室',
+  normalClass: '普通教室',
+  dClass: '专科教室',
+  tab1: '基础信息',
+  tab2: '学生名单',
+  tab3: '位置设定',
   tab4: '关联Hiteach',
-  classAttr:'教室属性',
-  relationHi:'关联Hiteach设备',
-  hiFilter1:'显示所有版本的Hiteach',
-  hiFilter2:'仅显示Hiteach Standard版本',
-  hiFilter3:'仅显示Hiteach Pro版本',
-  hiFilter4:'仅显示Hiteach TBL版本',
-  single:'单一',
-  mach:'大量',
-  expireLabel:'序号到期日',
-  related:'已被關聯',
-  noEnable:'此序号尚未启用',
-  onClassStu:'专科教室没有固定学生名单!',
-  classNoErr:'教室编码不能为空!',
-  classNoErr1:'教室编码只能由字母和数字组成!',
-  classAttr1:'常规教室(有固定学生)',
-  classAttr2:'专科教室(无固定学生)',
-  nameWarning:'请输入教室名称',
-  typeWarning:'请设置教室属性',
-  gradeWarning:'请设置年级',
-  expireLabel1:'已到期',
-  expireLabel2:'无限期',
-  findStuErr:'查询班级学生名单失败!',
-  noStdClass:'当前班级未选中,不能移动!',
-  formWarning:'请先完善班级信息再保存!',
-  bindingErr:'Hiteach 绑定失败!',
-  delClass:'删除班级',
-  saveClassWarning:'当前教室数据尚未保存。如果离开,修改的数据将不会保存!',
-  addStuBtn:'添加学生',
-  delStuBtn:'移除学生',
-  editSeat:'修改座号',
-  removeTile:'移除提醒',
-  removeContent:'是否确认移除',
-  removeOk:'移除成功',
-  removeErr:'移除失败',
+  classAttr: '教室属性',
+  relationHi: '关联Hiteach设备',
+  hiFilter1: '显示所有版本的Hiteach',
+  hiFilter2: '仅显示Hiteach Standard版本',
+  hiFilter3: '仅显示Hiteach Pro版本',
+  hiFilter4: '仅显示Hiteach TBL版本',
+  single: '单一',
+  mach: '大量',
+  expireLabel: '序号到期日',
+  related: '已被關聯',
+  noEnable: '此序号尚未启用',
+  onClassStu: '专科教室没有固定学生名单!',
+  classNoErr: '教室编码不能为空!',
+  classNoErr1: '教室编码只能由字母和数字组成!',
+  classAttr1: '常规教室(有固定学生)',
+  classAttr2: '专科教室(无固定学生)',
+  nameWarning: '请输入教室名称',
+  typeWarning: '请设置教室属性',
+  gradeWarning: '请设置年级',
+  expireLabel1: '已到期',
+  expireLabel2: '无限期',
+  findStuErr: '查询班级学生名单失败!',
+  noStdClass: '当前班级未选中,不能移动!',
+  formWarning: '请先完善班级信息再保存!',
+  bindingErr: 'Hiteach 绑定失败!',
+  delClass: '删除班级',
+  saveClassWarning: '当前教室数据尚未保存。如果离开,修改的数据将不会保存!',
+  addStuBtn: '添加学生',
+  delStuBtn: '移除学生',
+  editSeat: '修改座号',
+  removeTile: '移除提醒',
+  removeContent: '是否确认移除',
+  removeOk: '移除成功',
+  removeErr: '移除失败',
   deLink: '解除关联',
   link: '关联',
-  confirmDelink:'请问您确定要解除关联'
+  confirmDelink: '请问您确定要解除关联',
+  noStu: '暂无学生'
 }

+ 13 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/system.js

@@ -33,6 +33,18 @@ export default {
         prtQu:'个人问卷',
         selfLearn:'自主学习',
         homework:'作业活动',
-        acRecord:'活动记录'
+        acRecord: '活动记录',
+        cusMgt:'课程管理'
+    },
+    compt: {
+        cusWare: '课件',
+        sizeErr: '文件大小超出限制',
+        typeErr: '文件类型不支持',
+        acRep: '警告 :未找到指定班级',
+        classErr: '警告 :未找到指定班级',
+        setErr: '错误:座位号重复',
+        tbColErr1:'导入数据没有',
+        tbColErr2: ',请完善表格数据再导入',
+        fileReadErr:'文件读取失败'
     }
 }

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

@@ -4,6 +4,8 @@ export default {
 		tab1:'统计数据',
 		tab2:'评测数据',
 	},
+	allClasses:'所有班级',
+	all:'全部',
     // EvaluationList.vue
     text1: '历次考试汇总',
     text2: '次数',
@@ -81,10 +83,10 @@ export default {
 
     // AchievementAnalysis.vue
     ach_title1: '得分率统计',
-    ach_title2: '均分分析',
+    ach_title2: '平均分数统计',
     ach_title3: '进线人数统计',
     ach_title4: '进线情况统计',
-    ach_title5: '进线率统计',
+    ach_title5: '各班平均与进线率统计',
     ach_title6: '预警统计',
     ach_title7: '排名统计',
     ach_title8: '均分分析',
@@ -94,8 +96,8 @@ export default {
     ach_text4: '班级平均分',
     ach_text5: '校级平均分',
     ach_text6: '区级平均分',
-    ach_text7: '人数',
-    ach_text8: '进线人数',
+    ach_text7: '人数',
+    ach_text8: '进线人数',
     ach_text9: '进线率',
     ach_text10: '当前班级',
     ach_text11: '总人数',
@@ -108,8 +110,8 @@ export default {
     ach_table_text5: '超均率',
     ach_table_text6: '进线',
     ach_table_text7: '踩线',
-    ach_table_text8: '班级排名',
-    ach_table_text9: '年级排名',
+    ach_table_text8: '班级排名(PR排名)',
+    ach_table_text9: '年级排名(PR排名)',
     ach_table_text10: '区级排名',
     ach_table_text11: '班级PR排名',
     ach_table_text12: '年级PR排名',

+ 34 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/utils.js

@@ -3,5 +3,38 @@ export default {
 	videoFormatError:'视频格式不正确!请重新选择!',
 	audioFormatError:'音频格式不正确!请重新选择!',
 	fileReadFail:'有试题数据读取失败!',
-	uploadLoading:'上传中...'
+	uploadLoading:'上传中...',
+	draw:'绘制',
+	text:'文本输入',
+	clear:'清屏',
+	undo:'撤销',
+	close:'关闭',
+	save:'保存',
+	width:'画笔粗细',
+	color:'画笔颜色',
+	fontSize:'字体大小',
+	fontColor:'字体颜色',
+	newNotice:'新通知',
+	noData:'暂无数据',
+	noJoinSchool:'暂未加入学校',
+	noShoolTip:'用户暂无学校列表数据',
+	getDataFail:'获取数据失败',
+	teacher:'教师',
+	student:'学生',
+	accountManage:'账号管理',
+	courseNum:'任教课程数',
+	activityNum:'发布活动数',
+	classNum:'任教班级数',
+	full:'已满',
+	spaceStatus:'个人空间状态',
+	res:'教材',
+	img:'图片',
+	video:'视频',
+	audio:'音频',
+	doc:'文档',
+	bank:'题库',
+	other:'其他内容',
+	caclErrorL:'空间计算异常',
+	logout:'退出登录',
+	
 }

+ 8 - 2
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/learnActivity.js

@@ -178,7 +178,9 @@ export default {
         column3: '狀態',
         finishScore: '已完成所有學生作答的評分!',
         unableScore: '學生尚未作答,無法評分',
-        stStuWarning: '請先選擇學生!'
+        stStuWarning: '請先選擇學生!',
+        lastQu: '上一題',
+        nextQu: '下一題',
     },
 
     //SimpleAnalysis.vue
@@ -196,6 +198,10 @@ export default {
         noPublish: '評測尚未發佈,暫無統計資料',
         calcing: '成績數據結算中,',
         clickFresh: '點此重繪',
-        inCalc: '數據結算中,請稍後查看'
+        inCalc: '數據結算中,請稍後查看',
+        total: '總分',
+        avgScore: '均分統計',
+        totalLabel: '總量',
+        scoreMat: '分數段統計'
     }
 }

+ 2 - 3
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/schoolBaseInfo.js

@@ -68,9 +68,7 @@ export default {
   saveWarning: '保存提醒',
   leaveText: '離開',
 
-
   //ClassroomSetting.vue
-
   classroomList: '教室清單',
   pdLabel: '學段:',
   listOrder: '依創建時間排序',
@@ -162,5 +160,6 @@ export default {
   removeErr: '移除失敗',
   deLink: '解除關聯',
   link: '關聯',
-  confirmDelink:'請問您確定要解除關聯'
+  confirmDelink:'請問您確定要解除關聯',
+  noStu: '暫無學生'
 }

+ 13 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/system.js

@@ -33,6 +33,18 @@ export default {
         prtQu: '個人問卷',
         selfLearn: '自主學習',
         homework: '工作活動',
-        acRecord: '活動記錄'
+        acRecord: '活動記錄',
+        cusMgt: '課程管理'
+    },
+    compt: {
+        cusWare: '課件',
+        sizeErr: '文件大小超出限制',
+        typeErr: '檔案類型不支持',
+        acRep: '警告:未找到指定班級',
+        classErr: '警告:未找到指定班級',
+        setErr: '錯誤:座位號重複',
+        tbColErr1: '導入數據沒有',
+        tbColErr2: ',請完善表格數據再導入',
+        fileReadErr: '檔案讀取失敗'
     }
 }

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

@@ -4,6 +4,8 @@ export default {
 		tab1: '統計資料',
 		tab2: '評測數據',
 	},
+	allClasses:'所有班級',
+	all:'全部',
 	// EvaluationList.vue
 	text1: '歷次考試匯總',
 	text2: '次數',
@@ -81,10 +83,10 @@ export default {
 
 	// AchievementAnalysis.vue
 	ach_title1: '得分率統計',
-	ach_title2: '均分分析',
+	ach_title2: '平均分數統計',
 	ach_title3: '進線人數統計',
 	ach_title4: '進線情况統計',
-	ach_title5: '進線率統計',
+	ach_title5: '各班平均與進線率統計',
 	ach_title6: '預警統計',
 	ach_title7: '排名統計',
 	ach_title8: '均分分析',
@@ -94,9 +96,9 @@ export default {
 	ach_text4: '班級平均分',
 	ach_text5: '校級平均分',
 	ach_text6: '區級平均分',
-	ach_text7: '人數',
-	ach_text8: '進線總人數',
-	ach_text9: '進線率',
+	ach_text7: '人數',
+	ach_text8: '達標人數',
+	ach_text9: '達標率',
 	ach_text10: '當前班級',
 	ach_text11: '總人數',
 	ach_text12: '返回',
@@ -108,8 +110,8 @@ export default {
 	ach_table_text5: '超均率',
 	ach_table_text6: '進線',
 	ach_table_text7: '踩線',
-	ach_table_text8: '班級排名',
-	ach_table_text9: '年級排名',
+	ach_table_text8: '班級排名(PR排名)',
+	ach_table_text9: '年級排名(PR排名)',
 	ach_table_text10: '區級排名',
 	ach_table_text11: '班級PR排名',
 	ach_table_text12: '年級PR排名',

+ 33 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/utils.js

@@ -3,5 +3,37 @@ export default {
 	videoFormatError: '視頻格式不正確!請重新選擇!',
 	audioFormatError: '音訊格式不正確!請重新選擇!',
 	fileReadFail: '有試題數據讀取失敗!',
-	uploadLoading: '上傳中…'
+	uploadLoading: '上傳中…',
+	draw: '繪製',
+	text: '文字輸入',
+	clear: '清屏',
+	undo: '撤銷',
+	close: '關閉',
+	save: '保存',
+	width: '畫筆粗細',
+	color: '畫筆顏色',
+	fontSize: '字體大小',
+	fontColor: '字體顏色',
+	newNotice: '新通知',
+	noData: '暫無數據',
+	noJoinSchool: '暫未加入學校',
+	noShoolTip: '用戶暫無學校清單數據',
+	getDataFail: '獲取數據失敗',
+	teacher: '教師',
+	student: '學生',
+	accountManage: '帳號管理',
+	courseNum: '任教課程數',
+	activityNum: '發佈活動數',
+	classNum: '任教班級數',
+	full: '已滿',
+	spaceStatus: '個人空間狀態',
+	res: '教材',
+	img: '圖片',
+	video: '視頻',
+	audio: '音訊',
+	doc: '檔案',
+	bank: '題庫',
+	other: '其他內容',
+	caclErrorL: '空間計算异常',
+	logout: '登出',
 }

+ 1 - 0
TEAMModelOS/ClientApp/src/utils/editorTools.js

@@ -345,6 +345,7 @@ export default {
 							}),
 							h('BaseMyCanvas', {
 								props:{
+									vm:vm
 								},
 								on: {
 									onSaveCanvas(val) {

+ 0 - 2
TEAMModelOS/ClientApp/src/view/learnactivity/CreateSchoolEva.vue

@@ -672,7 +672,6 @@ export default {
                 }
             )
             this.activeTab = 'preview'
-            this.$Message.warning('编辑评测功能尚未完善')
         }
     },
     computed: {
@@ -698,7 +697,6 @@ export default {
                     })
                 }
             }
-            console.log('数据', data)
             return data
         },
         //计算当前学段下面的年级信息

+ 4 - 4
TEAMModelOS/ClientApp/src/view/learnactivity/PaperScore.vue

@@ -79,10 +79,10 @@
                             </div>
                             <!-- 滚动上下题目去掉 -->
                             <!-- <div style="display:flex;justify-content: space-evenly;margin-top:5px;display:none;" v-show="showQu">
-                                <span class="fast-score-tag" title="上一题" :style="{'background':'#aeaeae','cursor':(typeIndex + index) == 0 ? 'not-allowed':''}" @click="goToQuestion(getQuIndex(typeIndex,index) - 1)">
+                                <span class="fast-score-tag" :title="$t('learnActivity.score.lastQu')" :style="{'background':'#aeaeae','cursor':(typeIndex + index) == 0 ? 'not-allowed':''}" @click="goToQuestion(getQuIndex(typeIndex,index) - 1)">
                                     <Icon type="md-arrow-round-back" />
                                 </span>
-                                <span class="fast-score-tag" title="下一题" :style="{'background':'#aeaeae','cursor':(typeIndex + index + 1) == studentAnswer.scores.legnth ? 'not-allowed':''}" @click="goToQuestion(getQuIndex(typeIndex,index) + 1)">
+                                <span class="fast-score-tag" :title="$t('learnActivity.score.nextQu')" :style="{'background':'#aeaeae','cursor':(typeIndex + index + 1) == studentAnswer.scores.legnth ? 'not-allowed':''}" @click="goToQuestion(getQuIndex(typeIndex,index) + 1)">
                                     <Icon type="md-arrow-round-forward" />
                                 </span>
                             </div> -->
@@ -203,10 +203,10 @@
                                 </div>
                                 <!-- 滚动上下题目去掉 -->
                                 <!-- <div style="display:flex;justify-content: space-evenly;margin-top:5px;display:none;" v-show="showQu">
-                                        <span class="fast-score-tag" title="上一题" :style="{'background':'#aeaeae','cursor':(typeIndex + index + childIndex) == 0 ? 'not-allowed':''}" @click="goToQuestion((getQuIndex(typeIndex,index) + childIndex) - 1)">
+                                        <span class="fast-score-tag" :title="$t('learnActivity.score.lastQu')" :style="{'background':'#aeaeae','cursor':(typeIndex + index + childIndex) == 0 ? 'not-allowed':''}" @click="goToQuestion((getQuIndex(typeIndex,index) + childIndex) - 1)">
                                             <Icon type="md-arrow-round-back" />
                                         </span>
-                                        <span class="fast-score-tag" title="下一题" :style="{'background':'#aeaeae','cursor':(typeIndex + index + childIndex + 1) == studentAnswer.scores.length ? 'not-allowed':''}" @click="goToQuestion((getQuIndex(typeIndex,index) + childIndex) + 1)">
+                                        <span class="fast-score-tag" :title="$t('learnActivity.score.nextQu')" :style="{'background':'#aeaeae','cursor':(typeIndex + index + childIndex + 1) == studentAnswer.scores.length ? 'not-allowed':''}" @click="goToQuestion((getQuIndex(typeIndex,index) + childIndex) + 1)">
                                             <Icon type="md-arrow-round-forward" />
                                         </span>
                                     </div> -->

+ 5 - 4
TEAMModelOS/ClientApp/src/view/learnactivity/PrivScoring.vue

@@ -239,9 +239,10 @@ export default {
         },
         // 获取班级名单
         async getClassStudent() {
+            this.tableData = []
+            if (!this.chooseClass) return
             this.showTest = false
             this.tableLoading = true
-            if (!this.chooseClass) return
             let stuRes = undefined
             try {
                 //个人自定义名单则直接根据学生id换name
@@ -266,9 +267,9 @@ export default {
                     stuRes = await this.$api.schoolSetting.getClassroomStudent(requestData)
                 }
             } catch (e) {
-                this.$Message.error('获取学生名单失败')
+                this.$Message.error('API ERROR')
+                this.tableLoading = false
             }
-            console.log('***', stuRes)
             if (!stuRes.error) {
                 if (!this.paperInfo[this.chooseClass]) {
                     this.paperInfo[this.chooseClass] = {}
@@ -279,7 +280,7 @@ export default {
                 }
                 this.$set(this.paperInfo[this.chooseClass], "students", classStu)
                 this.students = []
-                this.tableData = []
+                
                 this.studentScore = []
                 this.tableColumn = [...this.scoreList]
                 let defSocre = []

+ 2 - 3
TEAMModelOS/ClientApp/src/view/learnactivity/Scoring.vue

@@ -253,9 +253,10 @@ export default {
         },
         // 获取班级名单
         getClassStudent() {
+            this.tableData = []
+            if (!this.chooseClass) return
             this.showTest = false
             this.tableLoading = true
-            if (!this.chooseClass) return;
             let requestData = {
                 ids: [this.chooseClass],
                 scope: this.examInfo.scope == 'private' ? 'private' : 'school',
@@ -273,7 +274,6 @@ export default {
                     }
                     this.$set(this.paperInfo[this.chooseClass], "students", classStu)
                     this.students = []
-                    this.tableData = []
                     this.studentScore = []
                     this.tableColumn = [...this.scoreList]
                     let defSocre = []
@@ -290,7 +290,6 @@ export default {
                             defSocre.push(-1)
                         }
                         let classStu = this.paperInfo[this.chooseClass].students.students
-                        console.log('classStu', classStu)
                         for (let k = 0; k < classStu.length; k++) {
                             let score = {}
                             score.name = classStu[k].name

+ 3 - 4
TEAMModelOS/ClientApp/src/view/learnactivity/echarts/AvgCompare.vue

@@ -16,7 +16,7 @@ export default {
         return {
             progressPie: undefined,
             defaultSeries: {
-                name: '总分',
+                name: this.$t('learnActivity.simple.total'),
                 type: 'line',
                 itemStyle: {
                     color: '#11C2EE',
@@ -59,7 +59,7 @@ export default {
                     data: []
                 },
                 title: {
-                    "text": "均分统计",
+                    "text": this.$t('learnActivity.simple.avgScore'),
                     "left": 0,
                     "top": 0,
                     "textStyle": {
@@ -180,14 +180,13 @@ export default {
                             {
                                 name: item.subjectId,
                                 type: 'bar',
-                                stack: '总量',
+                                stack: this.$t('learnActivity.simple.totalLabel'),
                                 barMaxWidth: 30,
                                 data: item.ClassAverage
                             }
                         )
                     })
                     this.newOption.series.push(this.defaultSeries)
-                    console.log('option哈哈',this.newOption)
                     this.progressPie.setOption(this.newOption, true)
                 })
             },

+ 2 - 3
TEAMModelOS/ClientApp/src/view/learnactivity/echarts/ScoreMatrix.vue

@@ -18,10 +18,10 @@ export default {
             option: {
                 tooltip: {
                     trigger: 'item',
-                    formatter: '{b} : {c}人'
+                    formatter: '{b} : {c}' + this.$t('unit.text7')
                 },
                 title: {
-                    "text": "分数段统计",
+                    "text": this.$t('learnActivity.simple.scoreMat'),
                     "left": "center",
                     "top": 0,
                     "textStyle": {
@@ -92,7 +92,6 @@ export default {
     watch: {
         pieData: {
             handler(n, o) {
-                console.log('新的',this.pieData)
                 this.$nextTick(() => {
                     if (!this.progressPie) {
                         this.progressPie = this.$echarts.init(document.getElementById('ev-score-matrix'))

+ 1 - 2
TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.vue

@@ -60,7 +60,6 @@
                     <div class="course-classroom-list" slot="left">
                         <div class="course-classroom-list-header">
                             <span class="course-classroom-label">{{$t('courseManage.classroom.classroomList')}}</span>
-                            <!-- <Icon custom="iconfont icon-schedule" v-show="listType == 'school'" class="add-icon" size="16" title="课表模式" /> -->
                             <Icon type="md-add" v-show="listType == 'private'" class="add-icon" @click="newSlStatus = true" />
                             <!-- 暂未处理编辑个人自定义名单 -->
                             <!-- <Icon type="md-create" v-show="listType == 'private' && teaClassList.length" class="add-icon" @click="editClassStatus = true" /> -->
@@ -79,7 +78,7 @@
                                     </p>
                                     <p class="class-attr-item" v-show="listType == 'private'">
                                         <span class="attr-label">{{$t('cusMgt.stuCount')}}:</span>
-                                        <span class="class-name">{{item.students ? item.students.length : 0}}</span>
+                                        <span class="class-name">{{item.students ? item.students.length : 0}}{{$t('unit.text7')}}</span>
                                     </p>
                                 </div>
                                 <EmptyData v-if="teaClassList.length == 0" :top="160" :textContent="$t('cusMgt.noClassList')"></EmptyData>

+ 0 - 1
TEAMModelOS/ClientApp/src/view/newcourse/NewCusMgt.vue

@@ -192,7 +192,6 @@
                                     <Radio label="class">{{$t('cusMgt.listType1')}}</Radio>
                                     <Radio label="stulist">{{$t('cusMgt.listType2')}}</Radio>
                                 </RadioGroup>
-                                <!-- <Input search placeholder="搜索" style="width:240px;margin-top:0px;margin-left:15px;" size="small" /> -->
                                 <div class="action-btn-wrap">
                                     <span class="action-btn" style="margin-right:40px" @click="confirmAddSchd">
                                         <Icon type="md-add" size="16" />

+ 2 - 4
TEAMModelOS/ClientApp/src/view/schoolmgmt/ClassroomSetting/ClassroomSetting.vue

@@ -269,7 +269,7 @@
                 <!--学生名单-->
                 <div id="sut-list-box" class="dark-iview-table dark-iview-input" style="width:100%;height:100%;" v-show="currentTabIndex == 2">
                     <vuescroll style="height:100%;" v-if="classroomListShow[curClassIndex] && classroomListShow[curClassIndex].openType == '1'">
-                        <Table :columns="studentColumn" :data="students" @on-selection-change="(selections)=>{delSelections = selections}" :height="tableHeight" class="system-classroom-table" :loading="stuLoading" no-data-text="暂无学生">
+                        <Table :columns="studentColumn" :data="students" @on-selection-change="(selections)=>{delSelections = selections}" :height="tableHeight" class="system-classroom-table" :loading="stuLoading" :no-data-text="$t('schoolBaseInfo.noStu')">
                             <Loading slot="loading" :top="0" bgColor="rgba(103, 103, 103, 0.27)"></Loading>
                             <template slot-scope="{ row }" slot="picture">
                                 <PersonalPhoto :name="row.name" :picture="row.picture" />
@@ -290,7 +290,7 @@
                                 <span>{{row.groupId ? row.groupId : '- -'}}</span>
                             </template>
                             <template slot-scope="{ row, index }" slot="groupName">
-                                <span>{{row.groupName ? row.groupName : '未分组'}}</span>
+                                <span>{{row.groupName ? row.groupName : '- -'}}</span>
                             </template> -->
                         </Table>
                     </vuescroll>
@@ -1184,9 +1184,7 @@ export default {
                         onOk: () => {
                             if (this.classroomListShow[this.curClassIndex].option == 'insert') {
                                 this.delClassroom(this.curClassIndex)
-                                console.log('删除')
                             } else {
-                                console.log('离开')
                                 this.updated = false
                                 this.updHiteachLink = []
                                 this.$set(this.classroomListShow, this.curClassIndex, JSON.parse(this.updateBefore))

+ 10 - 5
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.vue

@@ -8,9 +8,11 @@
             <div class="percent-item" v-for="(item,index) in passRate" :key="index">
                 <div class="fl-col-center">
                     <span class="percent-name">{{item.name}}</span>
-                    <span class="percent-value"><span class="percent-line" :style="{background:colorList[index]}"></span>{{item.class}}</span>
-                    <!-- <span class="percent-grade-value">{{$t('totalAnalysis.ach_text2')}}:{{item.grade}}</span> -->
-                    <!-- <span class="percent-area-value">{{$t('totalAnalysis.ach_text3')}}:{{item.area}}</span> -->
+                    <span class="percent-value"><span class="percent-line" :style="{background:colorList[index]}"></span>{{item.value}}</span>
+					<div style="margin-left: 30px;">
+						<p>平均分:110</p>
+						<p>标准差:20</p>
+					</div>
                 </div>
             </div>
         </Row>
@@ -137,7 +139,10 @@
 			/* 获取成绩分析模块 -- 及格率统计数据 */
 			getPassRate(analysisJson){
 				console.log(analysisJson)
-				let result = []
+				let result = [{
+					name:'全科',
+					value: '88.8%'
+				}]
 				analysisJson.subjects.forEach((item,index) => {
 					let o = {}
 					o.name = item.name
@@ -147,7 +152,7 @@
 					})
 					result.push({
 						name:item.name,
-						class:(+(classAverage / analysisJson.classes.length) * 100).toFixed(1) + '%',
+						value:(+(classAverage / analysisJson.classes.length) * 100).toFixed(1) + '%',
 					})
 				})
 				return result

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 558 - 505
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue


+ 14 - 8
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EntryTables.vue

@@ -86,16 +86,22 @@
                         title: this.$t('totalAnalysis.base_class'),
                         key: 'name'
                     },
+					{
+					    title: this.$t('totalAnalysis.sca_chart_text1'),
+					    key: 'name',
+					    sortable: 'custom',
+					    minWidth: 50
+					},
+					{
+					    title: this.$t('totalAnalysis.ach_text7'),
+					    key: 'totalNum',
+					    sortable: true
+					},
                     {
                         title: this.$t('totalAnalysis.ach_text8'),
                         key: 'entryNum',
                         sortable: true
                     },
-                    {
-                        title: this.$t('totalAnalysis.ach_text7'),
-                        key: 'totalNum',
-                        sortable: true
-                    },
                     {
                         title: this.$t('totalAnalysis.ach_text9'),
                         key: 'overAverageRate',
@@ -108,7 +114,7 @@
 					    title: this.$t('totalAnalysis.ach_table_text3'),
 					    key:'average',
 					    renderType: function(h, params) {
-					        return h('span', (Number(params.row.average)).toFixed(2))
+					        return h('span', (Number(params.row.average)).toFixed(1))
 					    },
 					    sortable: 'custom'
 					},
@@ -181,8 +187,8 @@
 						entryNum:classItem.lineCount,
 						totalNum:classItem.stuCount,
 						overAverageRate:classItem.stuCount > 0 ? ((classItem.lineCount / classItem.stuCount) * 100).toFixed(2) : 0.00,
-						average:classItem.totalAverage,
-						standardDeviation:classItem.standardDeviation.toFixed(2),
+						average:classItem.totalAverage.toFixed(1),
+						standardDeviation:classItem.standardDeviation.toFixed(1),
 					})
 				})
 				/* 根据超均率 来对班级进行年级排名 */

+ 2 - 1
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.less

@@ -348,9 +348,10 @@
         .filter-item {
             background: #0087af;
             color: #fff;
-            padding: 2px 5px;
+            padding: 4px 7px;
             margin-left: 15px;
 			font-size: 12px;
+			border-radius: 4px;
         }
 
         .filter-item .ivu-icon {

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

@@ -77,14 +77,14 @@
 							<div class="el-filter-item">
 								<span class="el-filter-title">{{ $t("totalAnalysis.condition2") }}:</span>
 								<RadioGroup v-model="filterGrade" type="button" @on-change="filterGradeChange">
-									<Radio label="全部">全部</Radio>
+									<Radio :label="$t('totalAnalysis.all')">{{ $t('totalAnalysis.all') }}</Radio>
 									<Radio v-for="(item, index) in filterGradeList" :label="item.name" :key="index">{{ item.name }}</Radio>
 								</RadioGroup>
 							</div>
 							<div class="el-filter-item">
 								<span class="el-filter-title">{{ $t("totalAnalysis.condition7") }}:</span>
 								<RadioGroup v-model="filterSubject" type="button" @on-change="filterSubjectChange">
-									<Radio label="全部">全部</Radio>
+									<Radio :label="$t('totalAnalysis.all')">{{ $t('totalAnalysis.all') }}</Radio>
 									<Radio v-for="(item, index) in filterSubjectList" :label="item.name" :key="index">{{ item.name }}</Radio>
 								</RadioGroup>
 							</div>
@@ -100,22 +100,6 @@
 									<Radio v-for="(item, index) in filterData.termList" :label="item.name" :key="index">{{ item.name }}</Radio>
 								</RadioGroup>
 							</div>
-
-							<!-- 考试范围暂未实际有效字段 -->
-							<!-- <div class="el-filter-item">
-                                        <span class="el-filter-title">{{ $t("totalAnalysis.condition5") }}:</span>
-                                        <RadioGroup v-model="filterArea" type="button" @on-change="filterAreaChange">
-                                            <Radio v-for="(item, index) in filterData.areaList" :label="item.name" :key="index">{{ item.name }}</Radio>
-                                        </RadioGroup>
-                                    </div> -->
-							<!-- 评测来源暂未实际有效字段 -->
-							<!-- <div class="el-filter-item">
-                                        <span class="el-filter-title">{{ $t("totalAnalysis.condition6") }}:</span>
-                                        <RadioGroup v-model="filterFeedback" type="button" @on-change="filterFeedbackChange">
-                                            <Radio v-for="(item, index) in filterData.feedbackList" :label="item.name" :key="index">{{ item.name }}</Radio>
-                                        </RadioGroup>
-                                    </div> -->
-
 						</div>
 					</transition>
 					<div class="el-bread">
@@ -160,11 +144,15 @@
 									<!-- 暂无参与率数据 -->
 									{{ getJoinRate(item) }}
 								</span>
+								<span>{{ $t("totalAnalysis.sca_chart_text1") }}:
+									<!-- 得分率数据 -->
+									{{ item.score.toFixed(2) + '%' }}
+								</span>
 								<!-- <span>{{ $t("totalAnalysis.echarts_text15") }}:
 										</span> -->
 							</div>
 						</div>
-						<Page size="small" />
+						<!-- <Page size="small" /> -->
 					</div>
 				</div>
 			</div>
@@ -187,7 +175,7 @@
 			BaseSubjectBar,
 			BaseClassBar,
 		},
-		data() {
+		data(vm) {
 			return {
 				currentPanel: "",
 				isLoadingList: false,
@@ -199,7 +187,6 @@
 				classList: new Array(11).fill("1"),
 				gradeList: [],
 				geniusLineData: null,
-				semesterList: ["2019上学期", "2019下学期"],
 				activeGradeIndex: null,
 				arrowLeft: 0,
 				selectSemester: 0,
@@ -217,26 +204,44 @@
 				filterData: {},
 				searchValue: "",
 				searchList: [],
-				filterPeriod: "全部",
-				filterGrade: "全部",
-				filterTerm: "全部",
-				filterType: "全部",
-				filterArea: "全部",
-				filterFeedback: "全部",
-				filterSubject: "全部",
+				filterPeriod: vm.$t('totalAnalysis.all'),
+				filterGrade: vm.$t('totalAnalysis.all'),
+				filterTerm: vm.$t('totalAnalysis.all'),
+				filterType: vm.$t('totalAnalysis.all'),
+				filterArea: vm.$t('totalAnalysis.all'),
+				filterFeedback: vm.$t('totalAnalysis.all'),
+				filterSubject: vm.$t('totalAnalysis.all'),
 				schoolData: {
 					name: "",
 					period: []
 				},
 				defaultAll: {
-					name: '全部',
+					name: vm.$t('totalAnalysis.all'),
 					id: '0'
 				},
 				evType: {
-					regular: '正规考',
-					simulation: '模拟考',
-					normal: '普通考'
-				}
+					regular: vm.$t('totalAnalysis.ti_text6'),
+					simulation: vm.$t('totalAnalysis.ti_text7'),
+					normal: vm.$t('totalAnalysis.ti_text8')
+				},
+				typeList: [
+				  {
+				    "name": vm.$t('totalAnalysis.all'),
+				    "key": "all"
+				  },
+				  {
+				    "key": "regular",
+				    "name": vm.$t('totalAnalysis.ti_text6')
+				  },
+				  {
+				    "key": "simulation",
+				    "name": vm.$t('totalAnalysis.ti_text7')
+				  },
+				  {
+				    "key": "normal",
+				    "name": vm.$t('totalAnalysis.ti_text8')
+				  }
+				],
 			};
 		},
 		created() {
@@ -263,7 +268,6 @@
 						//     this.filterGradeChange()
 						// }
 						console.log(this.filterConditions)
-						let filterJson = this.$store.state.totalAnalysis.filterData
 						if (schoolBaseInfo.period.length) {
 							this.filterData.periodList = [this.defaultAll].concat(schoolBaseInfo.period);
 							this.filterData.gradeList = [this.defaultAll].concat(schoolBaseInfo.period[0].grades);
@@ -271,9 +275,7 @@
 								.subjects);
 							this.filterData.termList = [this.defaultAll].concat(schoolBaseInfo.period[0]
 							.semesters);
-							this.filterData.typeList = filterJson.typeList;
-							this.filterData.areaList = filterJson.areaList;
-							this.filterData.feedbackList = filterJson.feedbackList;
+							this.filterData.typeList = this.typeList;
 						}
 					}
 				});
@@ -364,27 +366,27 @@
 						// this.filterConditions.period = null;
 						break;
 					case "grade":
-						this.filterGrade = "全部";
+						this.filterGrade = this.$t('totalAnalysis.all');
 						this.filterConditions.grade = null;
 						break;
 					case "term":
-						this.filterTerm = "全部";
+						this.filterTerm = this.$t('totalAnalysis.all');
 						this.filterConditions.term = null;
 						break;
 					case "type":
-						this.filterType = "全部";
+						this.filterType = this.$t('totalAnalysis.all');
 						this.filterConditions.type = null;
 						break;
 					case "area":
-						this.filterArea = "全部";
+						this.filterArea = this.$t('totalAnalysis.all');
 						this.filterConditions.area = null;
 						break;
 					case "feedback":
-						this.filterFeedback = "全部";
+						this.filterFeedback = this.$t('totalAnalysis.all');
 						this.filterConditions.feedback = null;
 						break;
 					case "subject":
-						this.filterSubject = "全部";
+						this.filterSubject = this.$t('totalAnalysis.all');
 						this.filterConditions.subject = null;
 						break;
 					default:
@@ -396,27 +398,27 @@
 			},
 
 			filterPeriodChange() {
-				this.filterConditions.period = this.filterPeriod === "全部" ? null : this.filterPeriod;
+				this.filterConditions.period = this.filterPeriod === this.$t('totalAnalysis.all') ? null : this.filterPeriod;
 				// 切换学科后年级会变化,需要初始化年级状态 默认选中全部
 				if (this.filterGradeList && this.filterGradeList.length) {
-				    this.filterGrade = "全部"
+				    this.filterGrade = this.$t('totalAnalysis.all')
 				    this.filterGradeChange()
 				}
 				// 切换学科后学科会变化,需要初始化学科状态 默认选中全部
 				if (this.filterSubjectList && this.filterSubjectList.length) {
-				    this.filterSubject = "全部"
+				    this.filterSubject = this.$t('totalAnalysis.all')
 				    this.filterSubjectChange()
 				}
 				this.doFilter();
 			},
 			filterGradeChange() {
 				this.filterConditions.grade =
-					this.filterGrade === "全部" ? null : this.filterGrade;
+					this.filterGrade === this.$t('totalAnalysis.all') ? null : this.filterGrade;
 				this.doFilter();
 			},
 			filterTermChange() {
 				this.filterConditions.term =
-					this.filterTerm === "全部" ? null : this.filterTerm;
+					this.filterTerm === this.$t('totalAnalysis.all') ? null : this.filterTerm;
 				this.doFilter();
 			},
 			filterTypeChange() {
@@ -424,7 +426,7 @@
 				// this.filterConditions.type =
 				//     this.filterType === "全部" ? null : this.filterType;
 				console.log(this.filterType)
-				if (this.filterType === "全部") {
+				if (this.filterType === this.$t('totalAnalysis.all')) {
 					this.filterConditions.type = null
 				} else {
 					let res = this.filterData.typeList.find(item => {
@@ -437,7 +439,7 @@
 
 			filterSubjectChange() {
 				this.filterConditions.subject =
-					this.filterSubject === "全部" ? null : this.filterSubject;
+					this.filterSubject === this.$t('totalAnalysis.all') ? null : this.filterSubject;
 				this.doFilter();
 			},
 
@@ -528,7 +530,7 @@
 		computed: {
 			getJoinRate() {
 				return (item) => {
-					return (item.stuCount / item.stuCount).toFixed(2) * 100 + "%";
+					return item.stuCount === 0 ? 0 : (item.stuCount / item.stuCount).toFixed(2) * 100 + "%";
 				};
 			},
 			filterGradeList() {

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

@@ -11,7 +11,7 @@
                     <BaseRadar echartsId="knowRadar"></BaseRadar>
                 </div>
             </Col>
-            <Col span="12">
+            <Col span="12"  style="padding: 30px 100px 0 0">
             <!-- 知识点得分详情 -->
                 <!-- <span class="component-title"><span style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">{{$t('totalAnalysis.ka_text2')}}:{{currentPoint}}</span></span> -->
                 <div>

+ 28 - 19
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/ScatterAnalysis/ScatterAnalysis.vue

@@ -94,31 +94,50 @@
                         title: this.$t('totalAnalysis.base_class'),
                         key: 'className',
 						sortable:'custom',
-                        minWidth: 100
+                        minWidth: 60
                     },
                     {
                         title: this.$t('totalAnalysis.base_id'),
-                        key: 'memberId',
+                        key: 'no',
                         sortable: 'custom',
-                        minWidth: 100
+                        minWidth: 50
                     },
+					{
+					    title: this.$t('totalAnalysis.sca_chart_text1'),
+					    key: 'no',
+					    sortable: 'custom',
+					    minWidth: 50
+					},
+					{
+					    title: this.$t('totalAnalysis.sca_table_text6'),
+					    key: 'scatter',
+					    minWidth: 60
+					},
+					{
+					    title: this.$t('totalAnalysis.sca_table_text5'),
+					    sortable: true,
+						renderType: function(h, params) {
+						    return h('span', Number(params.row.x).toFixed(2))
+						},
+					    minWidth: 60
+					},
                     {
                         title: this.$t('totalAnalysis.base_score'),
                         sortable: 'custom',
                         key: 'score',
-                        minWidth: 100
+                        minWidth: 60
                     },
                     {
                         title: this.$t('totalAnalysis.sca_table_text1'),
                         key: 'trueNum',
                         sortable: 'custom',
-                        minWidth: 100
+                        minWidth: 60
                     },
                     {
                         title: this.$t('totalAnalysis.sca_table_text2'),
                         key: 'falseNum',
                         sortable: 'custom',
-                        minWidth: 100
+                        minWidth: 60
                     },
                     {
                         title: this.$t('totalAnalysis.sca_table_text3'),
@@ -132,19 +151,7 @@
                         key: 'carefulList',
                         renderType: 'renderCareful'
                     },
-                    {
-                        title: this.$t('totalAnalysis.sca_table_text5'),
-                        sortable: true,
-						renderType: function(h, params) {
-						    return h('span', Number(params.row.x).toFixed(2))
-						},
-                        minWidth: 120
-                    },
-                    {
-                        title: this.$t('totalAnalysis.sca_table_text6'),
-                        key: 'scatter',
-                        minWidth: 100
-                    }
+                    
                 ]
             }
         },
@@ -193,6 +200,7 @@
 					analysisJson.scatterKey.forEach((key, index) => {
 						stu.subjects[subjectIndex].scatter[0] = stu.name
 						obj[key] = stu.subjects[subjectIndex].scatter[index]
+						obj.no = stu.no
 					})
 					result.push(obj)
 				})
@@ -204,6 +212,7 @@
             this.$refs.scatterTable.$el.childNodes[1].style.borderRight = '0'
             if (this.getAnalysisJson) {
                 this.tableData = this.renderData(this.getAnalysisJson)
+				console.log(this.tableData)
 				this.originTableData = JSON.parse(JSON.stringify(this.tableData)) 
                 this.classList = ['全部'].concat([...new Set(this.getAnalysisJson.classes.map(item => item.className))]) // 获取班级列表
             }

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

@@ -26,7 +26,7 @@
 				</div>
 				<Divider />
 				<div class="scatter-table-line">
-					<span>A-</span>
+					<span>A'</span>
 					<span class="scatter-explain"
 						:title="$t('totalAnalysis.ta_text7')">{{$t('totalAnalysis.ta_text7')}}</span>
 					<span>{{A2List.length}}</span>
@@ -48,7 +48,7 @@
 				</div>
 				<Divider />
 				<div class="scatter-table-line">
-					<span>B-</span>
+					<span>B'</span>
 					<span class="scatter-explain"
 						:title="$t('totalAnalysis.ta_text9')">{{$t('totalAnalysis.ta_text9')}}</span>
 					<span>{{B2List.length}}</span>

+ 11 - 6
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/index.less

@@ -108,16 +108,18 @@ body, html, .total-container {
 }
 .total-content {
   .basic-info {
-	  font-size: 12px;
+	  font-size: 14px;
     .info-type {
       padding: 1px 5px;
       color: #fbd103;
       border-radius: 5px;
       border: 1px solid #fbd103;
+	  font-size: 12px;
       vertical-align: super;
     }
     .info-subject {
       padding: 2px 6px;
+	  font-size: 12px;
       color: #eee;
       border-radius: 3px;
       vertical-align: super;
@@ -128,20 +130,23 @@ body, html, .total-container {
       padding: 2px 6px;
       color: #eee;
       border-radius: 3px;
+	  font-size: 12px;
       vertical-align: super;
       margin-left: 10px;
       background: #018b99;
     }
     .info-name {
       color: #fff;
-      font-size: 22px;
+      font-size: 24px;
       margin-left: 10px;
+	  display: inline-block;
+	  margin-bottom: 4px;
       cursor: pointer;
     }
     .info-date-person {
       margin-top: 10px;
       display: flex;
-      color: #9e9e9e;
+      color: #e1e1e1;
       .info-item {
         margin-left: 20px;
         &:first-child {
@@ -158,7 +163,7 @@ body, html, .total-container {
     bottom: 8px;
     right: 40px;
     color: #d1d1d1;
-    font-size: 12px;
+    font-size: 14px;
     .basic-tool-export {
       padding: 5px 10px;
       background: none;
@@ -183,8 +188,7 @@ body, html, .total-container {
   .data-select {
     padding: 25px 0 0 22px;
     color: #9e9e9e;
-    font-size: 14px;
-    font-weight: bold;
+    font-size: 16px;
     .data-select-active {
       color: #fff;
       border-bottom: 3px solid #42beda;
@@ -218,6 +222,7 @@ body, html, .total-container {
 		display: inline-block;
 		margin-right: 20px;
 		padding: 0 8px 2px 8px;
+		font-size: 14px;
 		cursor: pointer;
 	}
 	&-item-active{

+ 12 - 6
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/index.vue

@@ -120,7 +120,7 @@
 			ExportTables,
 			Loading
 		},
-		data() {
+		data(vm) {
 			return {
 				searchValue: '',
 				contentLoading: false,
@@ -143,9 +143,9 @@
 					'normal': '#00ff8a'
 				},
 				nameTransfer: {
-					'regular': '正规考',
-					'simulation': '模拟考',
-					'normal': '正常考'
+					regular: vm.$t('totalAnalysis.ti_text6'),
+					simulation: vm.$t('totalAnalysis.ti_text7'),
+					normal: vm.$t('totalAnalysis.ti_text8')
 				},
 				scrollTopssss: 0,
 				totalAverage: 0,
@@ -377,7 +377,7 @@
 			console.log(this.currentExamItem)
 
 			if (this.getAnalysisJson) {
-				this.classList = ['全部'].concat([...new Set(this.getAnalysisJson.classes.map(item => item
+				this.classList = [this.$t('totalAnalysis.allClasses')].concat([...new Set(this.getAnalysisJson.classes.map(item => item
 					.className))]) // 获取班级列表
 			}
 		},
@@ -388,7 +388,13 @@
 			},
 			getSubjectList() {
 				this.subjectSelectVal = this.$store.state.totalAnalysis.currentSubject
-				return this.$store.state.totalAnalysis.subjectList
+				/* 如果是成绩分析则要加入全科统计栏目 */
+				if(this.dataSelectIndex === '0'){
+					return ['全科',...this.$store.state.totalAnalysis.subjectList] 
+				}else{
+					return this.$store.state.totalAnalysis.subjectList
+				}
+				
 			},
 			getVuexExamList() {
 				return this.$store.state.totalAnalysis.examList