Browse Source

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

liqk 4 years ago
parent
commit
fda7bf7a1d
28 changed files with 662 additions and 957 deletions
  1. 1 2
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContent.vue
  2. 24 25
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperTest.vue
  3. 6 7
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperView.vue
  4. 1 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/composePaper.vue
  5. 33 126
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventList.vue
  6. 0 2
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventOverView/EventFinishedNumChart.vue
  7. 0 19
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventOverView/EventLatest.vue
  8. 2 14
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventView.vue
  9. 3 3
      TEAMModelOS/ClientApp/src/components/student-web/EventView/PreviewProgressPie.vue
  10. 0 4
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseListView.vue
  11. 9 29
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/HomeView.vue
  12. 14 37
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/MissionListCard.vue
  13. 197 226
      TEAMModelOS/ClientApp/src/locale/lang/en-US/studentWeb.js
  14. 58 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/evaluation.js
  15. 65 30
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/studentWeb.js
  16. 58 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/evaluation.js
  17. 40 69
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/studentWeb.js
  18. 16 6
      TEAMModelOS/ClientApp/src/utils/evTools.js
  19. 1 1
      TEAMModelOS/ClientApp/src/utils/kityformula.js
  20. 7 11
      TEAMModelOS/ClientApp/src/view/evaluation/bank/ExerciseList.vue
  21. 8 8
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseChild.vue
  22. 5 7
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseChildList.vue
  23. 23 30
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseEditExercise.vue
  24. 37 39
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseExerciseList.vue
  25. 12 12
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseFilter.vue
  26. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/index/CreateExercises.vue
  27. 35 39
      TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.vue
  28. 6 207
      TEAMModelOS/ClientApp/src/view/student-web/App.vue

+ 1 - 2
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContent.vue

@@ -21,14 +21,13 @@
     </div>
         <!-- 如果篩選時未選的時候預設顯示列表第一個-->
     <div class="noSelected" v-if="!this.$store.getters.getIsSelectedNow">
-        <h3>请从列表挑选一个活动</h3>
+        <h3>{{$t("studentWeb.event.selectActivity")}}</h3>
     </div>
 
   </div>
 </template>
 
 <script>
-import mockdata from "@/api";
 import Homework from "./EventContentTypeTemplate/Homework";
 import PreviewMission from "./EventContentTypeTemplate/PreviewMission";
 import Vote from "./EventContentTypeTemplate/Vote";

+ 24 - 25
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperTest.vue

@@ -12,34 +12,34 @@
             <div class="messageCard">
                 <!---中途離開測驗之提示框---->
                 <div class="messageCardContent1" v-if="showMessageNum == 1">
-                    <h3>离开测验提示</h3>
+                    <h3>{{$t("studentWeb.exam.testpop.exitQuizhint")}}</h3>
                     <svg-icon icon-class="logoutComfirm" class="logoutComfirmIcon" />
                     <br />
                     <p v-show="closeTest">
-                        系统检测到您尚未「交卷」,如您选择「确定」,
-                        <br />则目前作答将不保存,下次需重新测验。
+                        {{$t("studentWeb.exam.testpop.exitQuizhintDe")}}
+                        <br /> {{$t("studentWeb.exam.testpop.exitQuizhintDes")}}
                     </p>
-                    <button class="messageCardBtn" @click="closeWarmMessage()">取消</button>
-                    <button class="messageCardBtn" @click="quitTest()">确定</button>
+                    <button class="messageCardBtn" @click="closeWarmMessage()">{{$t("studentWeb.exam.testpop.cancel")}}</button>
+                    <button class="messageCardBtn" @click="quitTest()">{{$t("studentWeb.exam.testpop.ok")}}</button>
                 </div>
                 <!---每題都完成到最後一題交卷之提示框---->
                 <div class="messageCardContent2" v-if="showMessageNum == 2">
-                    <h3>交卷提示</h3>
+                    <h3>{{$t("studentWeb.exam.testpop.submitQuizhint")}}</h3>
                     <svg-icon icon-class="finshedTest" class="handOnImg" />
-                    <p>系统检测当前您已全数作答完成,确定交卷吗?</p>
-                    <button class="messageCardBtn" @click="closeWarmMessage()">否,需再检查</button>
-                    <button class="messageCardBtn" @click="closetest()">确定交卷</button>
+                    <p>{{$t("studentWeb.exam.testpop.submitQuizhintDes1")}}</p>
+                    <button class="messageCardBtn" @click="closeWarmMessage()">{{$t("studentWeb.exam.testpop.check")}}</button>
+                    <button class="messageCardBtn" @click="closetest()">{{$t("studentWeb.exam.testpop.okSubmit")}}</button>
                 </div>
                 <!---有題目沒完成就交卷之提示框---->
                 <div class="messageCardContent3" v-if="showMessageNum == 3">
-                    <h3>交卷提示</h3>
+                    <h3>{{$t("studentWeb.exam.testpop.submitQuizhint")}}</h3>
                     <svg-icon icon-class="unfinishedTest" class="handOnImg" />
                     <p>
-                        目前您有
-                        <span style="color:rgb(250, 100, 0);font-weight:900">{{ undo }}题 未作答 (详查答案卡)</span>,请先完成题目作答!
+                        {{$t("studentWeb.exam.testpop.conAnswer0")}}
+                        <span style="color:rgb(250, 100, 0);font-weight:900">{{ undo }}{{$t("studentWeb.exam.testpop.conAnswer1")}}</span>{{$t("studentWeb.exam.testpop.conAnswer2")}}
                     </p>
-                    <button class="messageCardBtn" @click="closeWarmMessage()">继续作答</button>
-                    <button class="messageCardBtn" @click="closetest()">确定交卷</button>
+                    <button class="messageCardBtn" @click="closeWarmMessage()">{{$t("studentWeb.exam.testpop.conAnswer")}}</button>
+                    <button class="messageCardBtn" @click="closetest()">{{$t("studentWeb.exam.testpop.okSubmit")}}</button>
                 </div>
             </div>
         </div>
@@ -48,13 +48,13 @@
             <span class="logoutIcon" @click="openWarmMessage(1)">
                 <svg-icon icon-class="logout" />
             </span>
-            <span class="testTitleText">评量:{{ $store.getters.getItemTitle.name }}</span>
+            <span class="testTitleText">{{$t("studentWeb.home.exam")}}:{{ $store.getters.getItemTitle.name }}</span>
             <div class="myProgressBar">
-                <span class="myTestProgresstitle">完成度</span>
+                <span class="myTestProgresstitle">{{$t("studentWeb.exam.testpop.completion")}}</span>
                 <Progress style="margin-top:15px" :percent="completeRate" />
             </div>
-            <button v-if="closeTest" class="submitBtn" @click="openWarmMessage(2)" :class="{ hintClick:hintHandon() }">交卷</button>
-            <button v-if="!closeTest" class="submitBtn" :class="{ hintClick:hintHandon()  }">已完成</button>
+            <button v-if="closeTest" class="submitBtn" @click="openWarmMessage(2)" :class="{ hintClick:hintHandon() }">{{$t("studentWeb.exam.testpop.submitted")}}</button>
+            <button v-if="!closeTest" class="submitBtn" :class="{ hintClick:hintHandon()  }">{{$t("studentWeb.exam.testpop.finish")}}</button>
         </div>
         <Row :gutter="30">
             <i-col class="questionArea"
@@ -87,7 +87,7 @@
                                     <span>{{getTestType(getQue(queNo).parentInfo.type)}}</span>
                                 </div>
                                 <div class="compose-box">
-                                    <span style="margin-left:10px;font-weight:800;font-size:15px">題目:</span>
+                                    <span style="margin-left:10px;font-weight:800;font-size:15px">{{$t("studentWeb.exam.testpop.queNo")}}</span>
                                     <br />
                                     <div class="compose-item">
                                         <!--<span w>{{ getQue(queNo).parent + 1}}.</span>-->
@@ -104,7 +104,7 @@
                         </div>
                     </div>
                     <div class="answers">
-                        <div class="questionNo">我的作答:</div>
+                        <div class="questionNo">{{$t("studentWeb.exam.testpop.myAns")}}</div>
                         <div class="answers-box">
                             <!--问答题-->
                             <div class="compose-content" v-if="getQue(queNo).type != 'judge' && getQue(queNo).type != 'single'  && getQue(queNo).type != 'multiple'">
@@ -155,10 +155,10 @@
                    :md="6"
                    :lg="4">
                 <div class="checkAnswer">
-                    <span style="margin-top:10px;font-weight:800">我的答题卡</span>
+                    <span style="margin-top:10px;font-weight:800">{{$t("studentWeb.exam.testpop.myAnswerSheet")}}</span>
                     <br />
                     <br />
-                    <span style="margin-top:10px;font-weight:800">题号:</span>
+                    <span style="margin-top:10px;font-weight:800">{{$t("studentWeb.exam.testpop.qNo")}}</span>
                     <div class="que-box">
                         <div v-for="(item,index) in examInfo" :class="[checkers[index].length > 0 ? 'has-ans':'ans-box',index == queNo ?'select-item':'']" @click="gototheQues(index +1)">
                             <span style="padding:5px 5px;cursor:pointer"> {{ item.parent == undefined ? index +1 : item.paperIndex }}</span>
@@ -168,12 +168,12 @@
                 <!--切換頁-->
                 <div class="pageCtl2">
                     <button @click="preQ()" v-show="queNo != 0">
-                        <Icon type="ios-arrow-back" />上一题
+                        <Icon type="ios-arrow-back" />{{$t("studentWeb.exam.testpop.previous")}}
                     </button>
                     <button @click="nextQ()"
                             v-show="queNo != (examInfo.length-1)"
                             :class="{ hintClick:queNo != (examInfo.length-1) && checkers[queNo] != ''}">
-                        下一题
+                        {{$t("studentWeb.exam.testpop.next")}}
                         <Icon type="ios-arrow-forward" />
                     </button>
                 </div>
@@ -401,7 +401,6 @@
             },
             closetest: function () {
                 this.WarmMessageisOpen = false
-                console.log('保存信息')
                 if (this.checkers.length) {
                     this.isLoading = true;
                     let codes = this.$store.getters.getItemTitle.code.split('-')

+ 6 - 7
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperView.vue

@@ -13,10 +13,10 @@
             </div>
             <EventBasicInfo :paper="paperData" />
             <Tabs :value="selectTab" v-if="paperData.length">
-                <TabPane label="评测内容" name="test">
+                <TabPane :label="$t('studentWeb.exam.examData')" name="test">
                     <div class="title-rect-group">
                         <div class="title-rect" />
-                        <h2 class="title-rect-name">试卷链接</h2>
+                        <h2 class="title-rect-name">{{$t("studentWeb.exam.examLink")}}</h2>
                     </div>
                     <!--多學科試卷-->
                     <div v-if="paperData.length > 0 ">
@@ -26,7 +26,7 @@
                                  :class="['paper-item',item.paperId == chooseData.paperId ? 'paper-choose' : '']"
                                  @click="opentestWithSubject(item)">
                                 <svg-icon icon-class="test" class="title-icon" />
-                                <span style="margin-top:5px">{{ item.subject.name }}{{$store.getters.getItemTitle.scope == 'school' ? '科试卷':''}}</span>
+                                <span style="margin-top:5px">{{ item.subject.name }}{{$store.getters.getItemTitle.scope == 'school' ? $t("studentWeb.exam.isSubject"):''}}</span>
                                 <div :class="{ unfinished: item.stuAns.length == 0 ,finished:item.stuAns.length != 0 }">
                                     <Icon style="margin-top:-10px;margin-left:-8px;" type="ios-checkmark" size="36" />
                                 </div>
@@ -36,16 +36,15 @@
                     <div class="title-rect-group">
                         <div v-if="chooseData.subject !== undefined">
                             <div class="title-rect" />
-                            <h2 class="title-rect-name">当前科目:{{chooseData.subject.name}}</h2>
-                            <!--<span v-show="isExamDown" @click="showTest" style="margin-left: 25px;color: #03966a;cursor:pointer">--><!--试卷详情--><!--</span>-->
+                            <h2 class="title-rect-name">{{$t("studentWeb.exam.subjectNow")}}:{{chooseData.subject.name}}</h2>
                             <LessonTestReport :paperInfo="selectData" :examInfo="chooseData" />
                         </div>
                     </div>
                 </TabPane>
-                <TabPane label="成绩报告" v-if="isTestOver" name="analyse">
+                <TabPane :label="$t('studentWeb.exam.gradeReport')" v-if="isTestOver" name="analyse">
                     <div class="title-rect-group">
                         <div class="title-rect" />
-                        <h2 class="title-rect-name">评测分析</h2>
+                        <h2 class="title-rect-name">{{$t("studentWeb.exam.gradeAnalyse")}}</h2>
                     </div>
                     <div class="student-score">
                         <StudentScore :stuData="stuData"></StudentScore>

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

@@ -111,7 +111,7 @@
                 answerIframe.contentWindow.document.body.style.minWidth = '600px'
                 answerIframe.contentWindow.document.body.style.backgroundColor = '#f5f5f5'
                 let iframe = document.getElementById('answerIframe').contentWindow.document.getElementsByTagName('p')
-                iframe[1].style.lineHeight = '50px'
+                iframe[1].style.lineHeight = '20px'
                 html2canvas(answerIframe.contentWindow.document.body).then(canvas => {
                     this.markStatus = true
                     this.markBg = canvas.toDataURL("image/png");

+ 33 - 126
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventList.vue

@@ -11,7 +11,7 @@
                                   :class="{ openSearch: openSearch }" />
                     </div>
                     <div class="search-wrapper" :class="{ openSearch: openSearch }">
-                        <Input type="text" v-model="search" placeholder="搜尋" clearable />
+                        <Input type="text" v-model="search" :placeholder="$t('studentWeb.public.search')" clearable />
                     </div>
                 </div>
                 <!---搜尋--->
@@ -23,23 +23,23 @@
                             <Icon type="ios-arrow-down"></Icon>
                         </a>
                         <DropdownMenu slot="list">
-                            <div @click="sentEventStatus('所有活动状态')">
-                                <DropdownItem>{{ $t("studentWeb.allStatus") }}</DropdownItem>
+                            <div @click="sentEventStatus('all')">
+                                <DropdownItem>{{ $t("studentWeb.event.allStatus") }}</DropdownItem>
                             </div>
-                            <div @click="sentEventStatus('未完成')">
-                                <DropdownItem>{{ $t("studentWeb.unFinished") }}</DropdownItem>
+                            <div @click="sentEventStatus('unFinsish')">
+                                <DropdownItem>{{ $t("studentWeb.event.unFinished") }}</DropdownItem>
                             </div>
-                            <div @click="sentEventStatus('已完成')">
-                                <DropdownItem>{{ $t("studentWeb.Fineshed") }}</DropdownItem>
+                            <div @click="sentEventStatus('finish')">
+                                <DropdownItem>{{ $t("studentWeb.event.Fineshed") }}</DropdownItem>
                             </div>
-                            <div @click="sentEventStatus('已逾时')">
-                                <DropdownItem>{{ $t("studentWeb.Timeout") }}</DropdownItem>
+                            <div @click="sentEventStatus('overTime')">
+                                <DropdownItem>{{ $t("studentWeb.event.Timeout") }}</DropdownItem>
                             </div>
-                            <div @click="sentEventStatus('评测补考')">
-                                <DropdownItem divided>{{ $t("studentWeb.makeupExam") }}</DropdownItem>
+                            <div @click="sentEventStatus('reExam')">
+                                <DropdownItem divided>{{ $t("studentWeb.event.makeupExam") }}</DropdownItem>
                             </div>
-                            <div @click="sentEventStatus('作业补交')">
-                                <DropdownItem>{{ $t("studentWeb.makeupHW") }}</DropdownItem>
+                            <div @click="sentEventStatus('reMake')">
+                                <DropdownItem>{{ $t("studentWeb.event.makeupHw") }}</DropdownItem>
                             </div>
                         </DropdownMenu>
                     </Dropdown>
@@ -94,10 +94,9 @@
                                       icon-class="quesnaire" />
                         </li>
                         <li class="list-item-info"
-                            :class="{'list-item-infonofeedback': isNoFeedback(item) && finishedcondition(item) == false}"
                             v-if="item.eventType == 'exam'">
                             <p class="list-item-title">
-                                <span class="list-item-typeMark">{{item.scope == 'school' ? '校级评测' : '个人评测'}}</span>
+                                <span class="list-item-typeMark">{{item.scope == 'school' ? $t('studentWeb.public.schoolExam'):$t('studentWeb.public.privateExam')}}</span>
                                 <span class="list-item-typeMark"
                                       v-if="getCurrentLang() == 'en'">{{ transTypetoEn(item.eventType) }}</span>
                                 <span>{{ item.name }}</span>
@@ -108,10 +107,10 @@
                         </li>
                             <!--<div>已交卷</div>-->
                         <li class="list-item-unDone" v-show="item.progress == 'going'">
-                            <div class="isAllowRetry">进行中</div>
+                            <div class="isAllowRetry">{{$t("studentWeb.public.going")}}</div>
                         </li>
                         <li class="list-item-unDone" v-show="item.progress == 'finish'">
-                            <div class="isOvertime">已结束</div>
+                            <div class="isOvertime">{{$t("studentWeb.public.finish")}}</div>
                         </li>
                     </ul>
                 </div>
@@ -125,8 +124,6 @@
 
 <script>
     import { Random } from "mockjs";
-    import mockdata from "@/api/newData";
-    import mockdataEn from "@/api/newDataEn";
     import PreviewProgressPie from "../EventView/PreviewProgressPie";
 
 
@@ -177,7 +174,7 @@
                 search: "",
                 alreadyScrolltimes: 0,
                 defaultFirstItem: "",
-                selectedEventStatusNow: "所有活动状态",
+                selectedEventStatusNow: this.$t('studentWeb.event.allStatus'),
                 hideIconbtn: false,
                 isListNoItem: false, //清單為空
                 eventList: []
@@ -248,14 +245,6 @@
                 var D = date.getDate() + ' '
                 return Y + M + D;
             },
-            timeoutCondition(item) {
-                return (
-                    (item.endTime <= "2020.02.10" && item.allowRetryNow == false && item.eventType != "問卷") ||
-                    (item.endTime <= "2020.02.10" && item.eventType == "投票") ||
-                    (item.endTime <= "2020.02.10" && item.eventType == "課前預習")
-
-                );
-            },
             retryCondition(item) {
                 return (
                     item.endTime <= "2020.02.10" &&
@@ -263,40 +252,14 @@
                     item.isDone == false
                 );
             },
-            isNoFeedback(item) {
-                return (
-
-                    !(item.eventType == "課前預習" && item.endTime > "2020.02.10") &&
-                    !(
-                        item.eventType == "評量" &&
-                        item.eventSubject == "綜合學科" &&
-                        item.endTime > "2020.02.10"
-                    ) &&
-                    item.isDone == false &&
-                    item.endTime > "2020.02.10"
-                );
-            },
             getCurrentLang() {
                 return localStorage.getItem("lang");
             },
-            createMockdata: function () {
-                if (localStorage.getItem("lang") == "en") {
-                    this.mockdata = mockdataEn.eventList;
-                } else this.mockdata = mockdata.eventList
-            },
-            transStatustoEn(status) {
-                if (status == "所有活動狀態") return "All Status";
-                else if (status == "未完成") return "Unfinished";
-                else if (status == "已完成") return "Fineshed";
-                else if (status == "已逾時") return "Timeout";
-                else if (status == "評量補考") return "Make up Exam";
-                else if (status == "作業補交") return "Make up Homework";
-            },
             transTypetoEn(type) {
-                if (type == "投票") return "Vote";
-                else if (type == "評量") return "Exam";
-                else if (type == "作業") return "Homework";
-                else if (type == "課前預習") return "Preview";
+                if (type == "vote") return "Vote";
+                else if (type == "exam") return "Exam";
+                else if (type == "homework") return "Homework";
+                else if (type == "preview") return "Preview";
             },
             //取得目前滑鼠座標
             getCursorPosition() {
@@ -347,7 +310,7 @@
                 return Random.integer(70, 96);
             },
             sentEventStatus(status) {
-                if (status == "作業補交" || status == "評量補考") {
+                if (status == "reMake" || status == "reExam") {
                     this.eventTypeCheckers = [];
                 }
                 this.selectedEventStatusNow = status;
@@ -401,31 +364,31 @@
                 } else this.isListNoItem = true; //清單空值樣式配置
             },
             dropDownShowCondition(status, item) {
-                if (status == "作業補交") {
+                if (status == "reMake") {
                     this.hideIconbtn = true;
 
                     return (
                         item.endTime <= "2020.02.10" &&
-                        item.eventType == "作業" &&
+                        item.eventType == "homework" &&
                         item.allowRetryNow == true &&
                         item.isDone == false
                     );
-                } else if (status == "評量補考") {
+                } else if (status == "reExam") {
                     this.hideIconbtn = true;
 
                     return (
                         item.endTime <= "2020.02.10" &&
-                        item.eventType == "評量" &&
+                        item.eventType == "exam" &&
                         item.allowRetryNow == true &&
                         item.isDone == false
                     );
-                } else if (status == "未完成") {
+                } else if (status == "unFinish") {
                     this.hideIconbtn = false;
                     return item.isDone == false;
-                } else if (status == "已完成") {
+                } else if (status == "finish") {
                     this.hideIconbtn = false;
                     return item.isDone == true;
-                } else if (status == "已逾時") {
+                } else if (status == "overTime") {
                     this.hideIconbtn = false;
                     return (
                         (item.isDone == false &&
@@ -433,10 +396,10 @@
                             item.allowRetryNow == false) ||
                         (item.isDone == false &&
                             item.endTime <= "2020.02.10" &&
-                            item.eventType == "投票") ||
+                            item.eventType == "vote") ||
                         (item.isDone == false &&
                             item.endTime <= "2020.02.10" &&
-                            item.eventType == "課前預習")
+                            item.eventType == "preview")
                     );
                 } else {
                     this.hideIconbtn = false;
@@ -450,62 +413,8 @@
             showSearch() {
                 this.openSearch = !this.openSearch;
             },
-            showSelected: function (item) {
-
-                if (this.eventTypeCheckers == "") {
-                    if (this.search) {
-                        if ("評量".includes(this.search)) {
-                            this.isListNoItem = false;
-                            return item.eventType == "評量";
-                        } else if ("投票".includes(this.search)) {
-                            this.isListNoItem = false;
-                            return item.eventType == "投票";
-                        } else if ("作業".includes(this.search)) {
-                            this.isListNoItem = false;
-                            return item.eventType == "作業";
-                        } else if ("課前預習".includes(this.search)) {
-                            this.isListNoItem = false;
-                            return item.eventType == "課前預習";
-                        } else if ("問卷".includes(this.search)) {
-                            this.isListNoItem = false;
-                            return item.eventType == "問卷";
-                        } else return item.eventName.includes(this.search);
-                    } else {
-                        this.isListNoItem = false;
-                        return true;
-                    }
-                }
-                if (this.eventTypeCheckers.includes(item.eventType)) {
-                    if (this.search) {
-                        if ("評量".includes(this.search)) {
-                            this.isListNoItem = false;
-                            return item.eventType == "評量";
-                        } else if ("投票".includes(this.search)) {
-                            this.isListNoItem = false;
-                            return item.eventType == "投票";
-                        } else if ("作業".includes(this.search)) {
-                            this.isListNoItem = false;
-                            return item.eventType == "作業";
-                        } else if ("課前預習".includes(this.search)) {
-                            this.isListNoItem = false;
-                            return item.eventType == "課前預習";
-                        } else if ("問卷".includes(this.search)) {
-                            this.isListNoItem = false;
-                            return item.eventType == "問卷";
-                        } else {
-                            this.isListNoItem = false;
-                            return item.eventName.includes(this.search);
-                        }
-                    } else {
-                        this.isListNoItem = false;
-                        return true;
-                    }
-                } else return false;
-            },
-            sentEvenType: function (eventype) {
-
+            sentEvenType(eventype) {
                 this.$store.commit("ChangeFilterType", eventype);
-
                 if (this.$store.getters.getFilterType == "all") {
                     let filterListFinished = [],
                         filterListUnFinished = [];
@@ -570,9 +479,8 @@
             scrollListfromInfoPop() {
                 if (this.$store.getters.getisFromInfoPoptoScroll == true) {
                     //當從通知操作進行捲動時,將篩選條件清空
-                    this.selectedEventStatusNow = "所有活動狀態";
+                    this.selectedEventStatusNow = this.$t('studentWeb.event.allStatus');
                     this.eventTypeCheckers = [];
-
                     let targetItem = document.getElementById(
                         `event${this.$store.getters.getItemTitle.eventID}`
                     );
@@ -642,7 +550,6 @@
                 } else return false;
             },
             finishedItemtime(item) {
-                //this.$store.getters.getFinishedItemTime
                 if (this.$store.getters.getFinishedItem.includes(item.eventID) == true) {
                     let timeIndex = this.$store.getters.getFinishedItem.indexOf(
                         item.eventID

+ 0 - 2
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventOverView/EventFinishedNumChart.vue

@@ -1,8 +1,6 @@
 <template>
   <div class="event-finished-num-chart">
-    
       <LineChart :option="option" />
-   
   </div>
 </template>
 

+ 0 - 19
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventOverView/EventLatest.vue

@@ -7,9 +7,7 @@
     </h2>
     <div class="new-event-item-list ">
       <Row :gutter="20">
-      
         <i-col
-          
           :xs="24"
           :sm="24"
           :md="12"
@@ -18,7 +16,6 @@
           :key="index"
           v-show=" eventPageType.includes(item.eventType) == true && item.isDone == false && index < 20 "
           ><!--item.isOverEndTime == false -->
-          
           <ul
             class="new-event-item list-item"
             @click="sentSelectedEventTitle(item)"
@@ -47,7 +44,6 @@
                 {{ item.startTime }} ~ {{ item.endTime }}
               </p>
             </li>
-            
           </ul>
         </i-col>
       </Row>
@@ -57,15 +53,9 @@
 </template>
 
 <script>
-//import EventTypeNotFinishedChart from "../EventOverView/EventTypeNotFinishedChart";
-//import EventFinishedNumChart from "../EventOverView/EventFinishedNumChart";
 import mockdata from "@/api/newData";
 export default {
   name: "EventLatest",
-  components: {
-    //EventFinishedNumChart,
-    //EventTypeNotFinishedChart,
-  },
   data() {
     return {
       //倒入資料
@@ -113,13 +103,4 @@ export default {
 
 <style scoped>
 @import "~@/assets/student-web/component_styles/event-latest.css";
-/* 活動進度條圖表Icon
-@keyframes born {
-  from {
-    width: 0;
-  }
-  to {
-    width: MyEventData + "%";
-  }
-}*/
 </style>

+ 2 - 14
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventView.vue

@@ -10,8 +10,6 @@
     import CommentList from "./CommentList.vue";
     import EventList from "./EventList";
     import EventContentArea from "./EventContentArea.vue";
-    import mockdata from "@/api/newData";
-    import mockdataEn from "@/api/newDataEn";
     export default {
         name: "EventView",
         components: {
@@ -24,17 +22,10 @@
                 MyNo: "4", //接收NavBar 選定的那一頁icon標示
                 MyName: "",
                 mockdata: "",
-                eventPageType: ["課前預習", "評量", "作業", "投票", "問卷"] //本頁出現的類型
+                eventPageType: ["preview", "exam", "homework", "vote", "quesnaire"] //本頁出現的類型
             };
         },
         created() {
-            //發送本頁target 跟名字給App.Vue 的navBar
-            if (localStorage.getItem("lang") == "") {
-                this.mockdata = mockdata.eventList;
-            }
-            if (localStorage.getItem("lang") == "tw") {
-                this.mockdata = mockdata.eventList;
-            } else this.mockdata = mockdataEn.eventList;
             this.MyName = this.$t("studentWeb.eventView-title");
             this.$emit("onNavNo", this.MyNo);
             this.$emit("onNavName", this.MyName);
@@ -46,8 +37,6 @@
                 //當從通知操作進行捲動時,將篩選條件清空
                 this.selectedEventStatusNow = "所有活動狀態";
                 this.eventTypeCheckers = [];
-                console.log("收到從下一個按鈕切換項目");
-
                 let targetItem = document.getElementById(
                     `event${this.$store.getters.getItemTitle.eventID}`
                 );
@@ -74,8 +63,7 @@
                         console.log("目前:" + i, this.mockdata[i].eventName);
                         let j = i + 1;
                         if (
-                            j < this.mockdata.length &&
-                            this.eventPageType.includes(this.mockdata[j].eventType)
+                            j < this.mockdata.length && this.eventPageType.includes(this.mockdata[j].eventType)
                         ) {
                             nextItems.push(this.mockdata[j]);
                         } else {

+ 3 - 3
TEAMModelOS/ClientApp/src/components/student-web/EventView/PreviewProgressPie.vue

@@ -22,13 +22,13 @@ export default {
   methods: {
     finishedValue() {
       if (this.$store.getters.getItemTitle.eventID == this.itemID) {
-        if (this.$store.getters.getItemTitle.eventType == "課前預習") {
+        if (this.$store.getters.getItemTitle.eventType == "preview") {
           this.option.series[0].data[0].value =
             this.$store.getters.getCurrentPassPhaseTest * 33;
           this.option.series[0].data[1].value =
             100 - this.$store.getters.getCurrentPassPhaseTest * 33;
         }
-        else if(this.$store.getters.getItemTitle.eventType == "評量"){
+        else if(this.$store.getters.getItemTitle.eventType == "exam"){
           console.log(this.$store.getters.getCurrentfinishedSubject.length*33)
            this.option.series[0].data[0].value = this.$store.getters.getCurrentfinishedSubject.length*33;
             this.option.series[0].data[1].value =
@@ -50,7 +50,7 @@ export default {
         },
         series: [
           {
-            name: "访问来源",
+            //name: "访问来源",
             type: "pie",
             radius: ["50%", "70%"],
             avoidLabelOverlap: false,

+ 0 - 4
TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseListView.vue

@@ -1,11 +1,7 @@
 <template>
   <div class="courselist-view">
-   
     <CourseList :class="{ 'hide-sidebar': this.$store.getters.getSidebarisOpen == false}" />
     <CourseContent :class="{'course-content-span': this.$store.getters.getSidebarisOpen == false}"/>
-
-    
-   
   </div>
 </template>
 

+ 9 - 29
TEAMModelOS/ClientApp/src/components/student-web/HomeView/HomeView.vue

@@ -34,28 +34,23 @@
                                     v-show="eventPageType.includes(item.eventType) == true &&item.isDone == false && index < 8 ">
                                     <ul>
                                         <li class="list-item-icon">
-                                            <svg-icon v-if="item.eventType == '作業'"
+                                            <svg-icon v-if="item.eventType == 'homework'"
                                                       icon-class="doc" />
-                                            <svg-icon v-if="item.eventType == '課前預習'"
+                                            <svg-icon v-if="item.eventType == 'preview'"
                                                       icon-class="selflearninginTime" />
-                                            <svg-icon v-if="item.eventType == '評量'"
+                                            <svg-icon v-if="item.eventType == 'exam'"
                                                       icon-class="test"
                                                       class="reset-testIcon" />
-                                            <svg-icon v-if="item.eventType == '投票'"
+                                            <svg-icon v-if="item.eventType == 'vote'"
                                                       icon-class="vote" />
-                                            <svg-icon v-if="item.eventType == '問卷'"
+                                            <svg-icon v-if="item.eventType == 'quesnaire'"
                                                       icon-class="quesnaire" />
                                         </li>
                                         <li class="list-item-info">
                                             <p class="list-item-title"
-                                               :class="{
-                            'list-item-titleEn': getCurrentLang() == 'en',
-                          }">
-                                                <span class="list-item-typeMark"
-                                                      v-if="getCurrentLang() == 'tw'">{{ item.eventType }}</span>
-                                                <span class="list-item-typeMark"
-                                                      v-if="getCurrentLang() == 'en'">{{ transTypetoEn(item.eventType) }}</span>
-
+                                               :class="{ 'list-item-titleEn': getCurrentLang() == 'en', }"
+                                               >
+                                                <span class="list-item-typeMark">{{ item.eventType }}</span>
                                                 <span>{{ item.eventName }}</span>
                                             </p>
                                             <p class="list-item-time">
@@ -115,7 +110,6 @@
                     </div>
                 </Card>
                 <!--<router-link to="/studentWeb/eventView">
-
                 </router-link>-->
                 <br />
                 <Card class="bar-card" @click.native="noData">
@@ -135,7 +129,6 @@
                     </div>
                 </Card>
                 <!--<router-link to="/studentWeb/studyView">
-
                 <!--</router-link>-->
             </i-col>
         </Row>
@@ -204,7 +197,7 @@
 
         data() {
             return {
-                eventPageType: ["課前預習", "評量", "作業", "投票", "問卷"], //本頁出現的類型
+                eventPageType: ["preview", "exam", "homework", "vote", "quesnaire"], //本頁出現的類型
                 MyNo: "1", //接收NavBar 選定的那一頁icon標示
                 MyName: "",
                 mockdata: [
@@ -270,19 +263,6 @@
             setSpanCharts() {
                 this.spanCharts = !this.spanCharts;
             },
-            //createMockdata: function () {
-            //  if (localStorage.getItem("lang") == "en") {
-            //    this.mockdata = mockdataEn.eventList.slice(0, 39);
-            //    } else this.mockdata = mockdata.eventList.slice(0, 39);
-            //    console.log('mock')
-            //    console.log(JSON.stringify(this.mockdata))
-            //},
-            transTypetoEn(type) {
-                if (type == "投票") return "Vote";
-                else if (type == "評量") return "Exam";
-                else if (type == "作業") return "Homework";
-                else if (type == "課前預習") return "Preview";
-            },
         },
 
         created() {

+ 14 - 37
TEAMModelOS/ClientApp/src/components/student-web/HomeView/MissionListCard.vue

@@ -15,29 +15,26 @@
                     @click="sentSelectedEventTitle(item)"
                     v-for="(item, index) in testData" :key="index">
                     <ul>
-                        <!--v-show=" eventPageType.includes(item.eventType) == true && item.isDone == false && item.endTime > '2020.02.10'"-->
                         <li class="list-item-icon">
-                            <svg-icon v-if="item.eventType == '作業'" icon-class="doc" />
-                            <svg-icon v-if="item.eventType == '課前預習'"
+                            <svg-icon v-if="item.eventType == 'homework'" icon-class="doc" />
+                            <svg-icon v-if="item.eventType == 'preview'"
                                       icon-class="selflearninginTime" />
                             <svg-icon v-if="  item.eventType == 'exam'"
                                       icon-class="test"
                                       class="reset-testIcon" />
-                            <!--<svg-icon v-if=" item.eventType == 'exam' && item.eventSubject == '綜合學科' "
-                                      icon-class="multiTest" />-->
-                            <svg-icon v-if="item.eventType == '投票'" icon-class="vote" />
-                            <svg-icon v-if="item.eventType == '問卷'" icon-class="quesnaire" />
+                            <svg-icon v-if="item.eventType == 'vote'" icon-class="vote" />
+                            <svg-icon v-if="item.eventType == 'quesnaire'" icon-class="quesnaire" />
                         </li>
                         <li class="list-item-info" :class="{ 'list-item-infonoPie': isNoPie(item) }">
                             <p class="list-item-title" :class="{ 'list-item-titleEn': getCurrentLang() == 'en' }">
-                                <span class="list-item-typeMark">{{item.scope == 'school'? '校级评测':'个人评测'}}</span>
+                                <span class="list-item-typeMark">{{item.scope == 'school'? $t('studentWeb.public.schoolExam'):$t('studentWeb.public.privateExam')}}</span>
                                 <span>{{ item.name }}</span>
                                 <div style="float:right;margin-top:-20px">
                                     <div class="list-item-unDone" v-show="item.progress == 'going'">
-                                        <span class="isAllowRetry">进行中</span>
+                                        <span class="isAllowRetry">{{$t("studentWeb.public.going")}}</span>
                                     </div>
                                     <div class="list-item-unDone" v-show="item.progress == 'finish'">
-                                        <span class="isOvertime">已结束</span>
+                                        <span class="isOvertime">{{$t("studentWeb.public.finish")}}</span>
                                     </div>
                                 </div>
                             </p>
@@ -45,11 +42,11 @@
                                 {{ dateFormat(item.startTime) }} ~ {{ dateFormat(item.endTime) }}
                             </p>
                         </li>
-                <li class="list-item-unDone">
-                    <PreviewProgressPie v-if=" item.eventType == '課前預習' && item.endTime > '2020.02.10' "></PreviewProgressPie>
+                <!--<li class="list-item-unDone">
+                    <PreviewProgressPie v-if=" item.eventType == 'preview'"></PreviewProgressPie>
                     <PreviewProgressPie :itemID="item.eventID"
-                                        v-if=" item.eventType == '評量' && item.eventSubject == '綜合學科' && item.endTime > '2020.02.10' "></PreviewProgressPie>
-                </li>
+                                        v-if="item.eventType == 'exam'"></PreviewProgressPie>
+                </li>-->
                 </ul>
                 </div>
             </Scroll>
@@ -59,7 +56,6 @@
 </template>
 
 <script>
-    //import { Random } from "mockjs";
     import PreviewProgressPie from "../EventView/PreviewProgressPie";
     export default {
         name: "MissionListCard",
@@ -73,7 +69,7 @@
                 mockdata: "",
                 testData: [],
                 templistArray: [],
-                eventPageType: ["課前預習", "評量", "作業", "投票", "問卷"] //本頁出現的類型
+                eventPageType: ["preview", "exam", "homework", "vote", "questionnare"] //本頁出現的類型
             };
         },
         created() {
@@ -131,9 +127,9 @@
             },
             isNoPie(item) {
                 return (
-                    !(item.eventType == "課前預習" && item.endTime > "2020.02.10") &&
+                    !(item.eventType == "preview" && item.endTime > "2020.02.10") &&
                     !(
-                        item.eventType == "評量" &&
+                        item.eventType == "exam" &&
                         item.eventSubject == "綜合學科" &&
                         item.endTime > "2020.02.10"
                     )
@@ -142,23 +138,6 @@
             getCurrentLang() {
                 return localStorage.getItem("lang");
             },
-            createMockdataOriginal: function () {
-                if (localStorage.getItem("lang") == "en") {
-                    this.mockdataOriginal = mockdataEn.eventList;
-                } else this.mockdataOriginal = mockdata.eventList;
-            },
-            createMockdata: function () {
-                if (localStorage.getItem("lang") == "en") {
-                    this.mockdata = mockdataEn.eventList.slice(0, 39);
-                } else this.mockdata = mockdata.eventList.slice(0, 39);
-            },
-
-            transTypetoEn(type) {
-                if (type == "投票") return "Vote";
-                else if (type == "評量") return "Exam";
-                else if (type == "作業") return "Homework";
-                else if (type == "課前預習") return "Preview";
-            },
             handleReachBottom() {
                 return new Promise((resolve) => {
                     setTimeout(() => {
@@ -168,7 +147,6 @@
                             i++
                         ) {
                             //小於原始資料總長度在加入空陣列
-
                             this.mockdata.push(this.mockdataOriginal[this.mockdata.length + 1]);
                         }
                         resolve();
@@ -200,7 +178,6 @@
                 if (document.getElementById(`event${item.eventID}`).offsetTop > 600) {
                     let scrollvalue = document.getElementById(`event${item.eventID}`)
                         .offsetTop;
-                    console.log("選項在清單可視範圍外!!");
                     this.$store.commit("scrollList", scrollvalue);
                 }
             },

+ 197 - 226
TEAMModelOS/ClientApp/src/locale/lang/en-US/studentWeb.js

@@ -1,311 +1,282 @@
 export default {
-    "settingView-title": "Setting",
+    "home": {
+        "teacher": "teacher",
+        "student": "student",
+        "setting": "Personal Settings",
+        "logout": "Logout",
+        "joinClass": "Join Class",
+        "exam": "evaluation",
+    },
+    "public": {
+        "going": "In progress",
+        "finish": "Finished",
+        "schoolExam": "School Level Evaluation",
+        "privateExam": "Personal Evaluation",
+        "search": "Please enter search content..."
+    },
+    "event": {
+        "allStatus": "All Activity Status",
+        "unFinished": "Unfinished",
+        "Fineshed": "Finished",
+        "Timeout": "Timeout",
+        "makeupExam": "Makeup Exam",
+        "makeupHw": "Makeup available",
+        "selectActivity": "Please select an activity from the list"
+    },
+    "settingView-title": "Personal Settings",
     "teammodel-account-management": {
         "page-title": "TeamModel Account Management",
         "name": "Name",
         "account": "Account",
         "password": "Password",
-        "phone": "Phone",
+        "phone": "Mobile Number",
         "e-mail": "E-mail",
-        "binding": "Third Party Account Binding",
-        "isbind": "Binding",
-        "unbind": "Unbinding",
-        "save": "Save"
+        "binding": "Binding Management",
+        "isbind": "Bind",
+        "unbind": "Unbind",
+        "save": "Save settings"
     },
     "preference": {
-        "page-title": "Preference",
-        "UI-theme": "UI Theme",
-        "language": "Language"
+        "page-title": "Preferences",
+        "UI-theme": "Interface Style Settings",
+        "language": "Language Setting"
     },
     "change-school": {
-        "page-title": "Change School",
-        "current-data-school": "Current School Data Source",
+        "page-title": "Switch school",
+        "current-data-school": "Current data source school",
         "Habook-smart-school": "Habook Smart School"
     },
-    "homeView-title": "Overview",
-    "calenderCardTitle": "Calender",
-    "recentClass": "Recent Class",
-    "defaultRecentClass": "Inroduction to Embedded System Basic and Applications",
-    "defaultClassTime": "Wed. 13:30 - 16:30 (7th - 9th)",
-    "defaultClassPlace": "Building No.5 Room F504",
-    "todaydeadlineList": "Due Today Tasks",
-    "endsTodayTime": "Ends today at 23:59",
-    "coursesCardTitle": "My Courses List",
-    "newAddCourse": "New added Course:Advanced Mathematics II ",
-    "missionListCardTitle": "Tasks in progress ",
+    "homeView-title": "Homepage Information Overview",
+    "calenderCardTitle": "Calendar",
+    "recentClass": "Recent Class Reminder",
+    "defaultRecentClass": "Introduction to Microprocessor Basics and Applications",
+    "defaultClassTime": "Wednesday 13:30-16:30 (Sections 7-9)",
+    "defaultClassPlace": "F504 Classroom in the Fifth Teaching Building",
+    "todaydeadlineList": "Today Deadline Event Reminder",
+    "endsTodayTime": "Ends Today at 23:59",
+    "coursesCardTitle": "My Course List",
+    "newAddCourse": "The latest addition: Elective Mathematics (2)",
+    "missionListCardTitle": "Activity Task List",
     "missionListCardLoading": "Loading",
-    "missionListCardReachBottom": "Reached Page Bottom!",
+    "missionListCardReachBottom": "It's the bottom, no activity!",
     "myProgressBar": {
-        "tasksCompletionRate": "Tasks Completion Rate",
-        "selfStudyClickRate": "Self Study Tutorial Reading Rate"
+        "tasksCompletionRate": "Activity task completion rate",
+        "selfStudyClickRate": "Self-study textbook click rate"
     },
     "chartNames": [
-        "Time of Learning Online",
-        "Hours of Learning Online Each Month",
-        "Comparison of Tasks Participation",
-        "Comparison the Time of Learning Online",
-        "Proportion of participation time by task type this month",
-        "Heat Map of Learning Online"
+        "Average self-study time",
+        "Monthly self-study hour curve for this semester",
+        "Comparison of the number of activity participation between me and my grade last month",
+        "Comparison chart of average daily self-study time and the whole year level",
+        "Percentage of participation time of various activities and tasks this month",
+        "Self-study activity"
     ],
     "studyTimeChart": {
-        "averageTime": " min / day",
+        "averageTime": "Minutes/Day",
         "xAxisData": [
-            "Sun",
-            "Mon",
-            "Tue",
-            "Wed",
-            "Thu",
-            "Fri",
-            "Sat"
+            "day",
+            "One",
+            "two",
+            "three",
+            "four",
+            "Fives",
+            "six"
         ]
     },
     "splineSreaChart": {
         "xAxisData": [
-            "Feb",
-            "Mar",
-            "Apr",
+            "February",
+            "March",
+            "April",
             "May",
-            "Jun"
+            "June"
         ]
     },
     "stackBarChart": {
         "chartMon": "May",
         "yAxisData": [
-            "Me(3rd Grade)",
-            "3rd Grade",
-            "2nd Grade",
-            "1st Grade "
+            "I (third grade)",
+            "Third grade",
+            "second grade",
+            "ㄧ Grade"
         ],
         "stackType": [
-            "Homework",
-            "Exam",
-            "Preview",
-            "Vote"
+            "operation",
+            "Assessment",
+            "Pre-Class Preview",
+            "vote"
         ]
     },
     "twoLineChart": {
         "xAxisData": [
-            "Sun",
-            "Mon",
-            "Tue",
-            "Wed",
-            "Thu",
-            "Fri",
-            "Sat"
+            "day",
+            "",
+            "two",
+            "three",
+            "four",
+            "Fives",
+            "six"
         ]
     },
     "eventPieChart": {
         "partType": [
-            "Homework",
-            "Exam",
-            "Preview",
-            "Vote"
+            "operation",
+            "Assessment",
+            "Pre-Class Preview",
+            "vote"
         ]
     },
     "studyHeatMap": {
-        "tutorials": "tutorials",
         "xAxisData": [
-            "Mon",
-            "Tue",
-            "Wed",
-            "Thu",
-            "Fri"
+            "",
+            "two",
+            "three",
+            "four",
+            "Fives"
         ]
     },
-    "latestNotification": "Latest Notifications",
-    "postAt": "posted at",
-    "setting": "Setting",
-    "logout": "Log out",
+    "latestNotification": "Latest Notification",
+    "postAt": "Post At",
     "______________": "______________",
-    "eventView-title": "Tasks",
-    "nextTask": "Next task",
-    "allStatus": "All Status",
+    "eventView-title": "Activity Task",
+    "nextTask": "Next Task",
+    "allStatus": "All Activity Status",
     "unFinished": "Unfinished",
-    "Fineshed": "Fineshed",
+    "Fineshed": "Finished",
     "Timeout": "Timeout",
-    "makeupExam": "Make up Exam",
-    "makeupHW": "Make up Homework",
-    "empty": "No tasks yet!",
+    "makeupExam": "Makeup Exam",
+    "makeupHW": "Makeup available",
+    "empty": "There is currently no data ~",
     "baseInfo": {
         "subject": "Subject:",
         "teacher": "Teacher:",
-        "period": "Period:",
-        "postTime": "Posted Time:",
-        "classTime": "Class time",
+        "period": "Activity period:",
+        "postTime": "Post Time:",
+        "classTime": "Class Time",
         "unFinished": "Unfinished",
-        "Fineshed": "Fineshed",
+        "Fineshed": "Finished",
         "Closed": "Closed"
     },
     "billboard": {
         "description": "Description",
-        "referlink": "referlink",
+        "referlink": "referlink data",
         "attachment": "Attachment",
-        "reference": "Reference"
+        "reference": "reference"
     },
     "preview": {
-        "checkpoint": "Checkpoint",
-        "tutorial": "Tutorial",
-        "multiQues": "multi-Ques",
+        "checkpoint": "Activity Task",
+        "tutorial": "Programming Textbook",
+        "multiQues": "Multi-question pass module",
         "previewContent": {
-            "tutorial": "Tutorial",
-            "Des": "Description:",
-            "Unit": "Unit ",
-            "quiz": "Quiz"
+            "tutorial": "Textbook",
+            "Des": "Content",
+            "Unit": "Unit",
+            "quiz": "Examination in the classroom"
         },
-        "previous": "Previous",
-        "next": "Next",
-        "sentAns": "Submit",
-        "tryAgain": "Read and Try again",
+        "previous": "Previous Question",
+        "next": "Next Question",
+        "sentAns": "Sent Ans",
+        "tryAgain": "Read the textbook carefully, try again",
         "nextUnit": "Next Unit",
-        "goHome": "go to Overview",
-        "quizRetries": "Number of Quiz Retries",
-        "crossUnitHint": "The previous unit quizzes has not been completed yet. You should finish previous unit first and current unit could be unlock.",
-        "timeoutHint": "The preview task time has ended. You still could read and practice the task. If it is not completed before the end time, relevant scores may be affected."
+        "goHome": "Go Home",
+        "quizRetries": "Quiz Retries",
+        "crossUnitHint": "The last unit test has not been completed. Please complete it before proceeding to this unit test",
+        "timeoutHint": "The pre-class preview activity time has ended, textbook reading and practice can still be carried out. If it is not completed before the end time, relevant results may be affected."
     },
     "vote": {
-        "bollotbox": "Bollot Box",
-        "submit": "Submit",
-        "reVote": "Submit Again",
-        "voteSuccess": "Finished !",
-        "voteDes": "After the event is over, you can view the voting results.",
-        "timeoutHint": "The voting time has ended. Please wait the voting result!",
-        "voteResult": "The voting result is: ",
-        "voteDesDefault": "Please select a plan you prefer:"
+        "bollotbox": "Voting Area",
+        "submit": "OK to submit",
+        "reVote": "Vote again",
+        "voteSuccess": "Vote successful",
+        "voteDes": "After the event is over, you can view everyone's voting results",
+        "timeoutHint": "The voting time has passed, and no more voting is possible. Please pay attention to the teacher's release of the voting results!",
+        "voteResult": "The result of this vote is:",
+        "voteDesDefault": "Please select a desired plan:"
     },
     "homework": {
-        "homeworkUpload": "Homework Upload",
-        "homeworkUoloadBtn": "Upload",
-        "homeworkReUoloadBtn": "Reupload",
-        "CommentClassmatesHomeworkBtn": "Reference and comment classmates homework",
-        "uploadSuccess": "Upload Success",
-        "uploadDes": "After the task is over, you can view the homework feedback by teacher and classmates.",
-        "timeoutHint": "The homework task time has ended and you have not uploaded, so your score of the homework will be 0 or wait for making up homework.",
-        "contentPage": "Description",
-        "scorePage": "Score and Comment",
-        "score": "Score",
-        "classmatesComments": "Classmates Comments",
-        "comment": "Comment: "
-    },
-    "classmatesComment": {
-        "title": "Reference and comment classmates homework",
-        "seatNo": "No.",
-        "name": "Name",
-        "star": "Star",
-        "comment": "Comment",
-        "preview": "Preview: File Name",
-        "unPreview": "The format of this file could not be previewed now",
-        "download": "Download",
-        "submitted": "submitted",
-        "inputSomething": "Type Something",
-        "previous": "Previous",
-        "next": "Next",
-        "submitBtn": "Submit"
-    },
-    "exam": {
-        "examLink": "Exam Link",
-        "timeoutHint": "The exam task time has ended and you have not finished, so your score of the exam will be 0 or wait for making up exam.",
-        "contentPage": "Description",
+        "homeworkUpload": "Homework Upload Area",
+        "homeworkUoloadBtn": "Upload job",
+        "homeworkReUoloadBtn": "Re-upload",
+        "CommentClassmatesHomeworkBtn": "CommentClassmatesHomeworkBtn",
+        "uploadSuccess": "Upload successful",
+        "uploadDes": "After the activity is over, you can view the assignment score comments",
+        "timeoutHint": "The time for uploading the homework has ended. The grade of this homework will be calculated as 0 points, or waiting for the teacher to open it up.",
+        "contentPage": "Job Content",
         "scorePage": "Score Report",
-        "practiceHint": "The exam task time has ended and you still can click the link to practice.",
-        "performance": "Performance",
-        "reviewAnswers": "Review of Answers",
-        "Chinese": "Chinise",
-        "Math": "Math",
-        "English": "English",
+        "practiceHint": "The assessment activity time has ended, you can still click on the test paper link to continue practicing.",
+        "performance": "performance",
+        "reviewAnswers": "Review of answering status",
+        "Chinese": "国文",
+        "Math": "Mathematics",
+        "English": "英文",
         "score": "Score",
-        "difficulty": "Difficulty",
+        "difficulty": "Comprehensive difficulty of examination questions",
         "average": "Class average score",
-        "rightNum": "Number of correct answers",
-        "smartComment": "AI Suggestion",
-        "keypoint": "Review keypoint:",
+        "rightNum": "The number of my correct answers",
+        "smartComment": "Smart Comment",
+        "keypoint": "Recommended knowledge points for review:",
         "chart": {
-            "scoreDistribution": "Score Distribution",
-            "participant": "participant:",
-            "student": "students",
-            "keyPointPerformance": "KeyPoint Performance",
-            "me": "Me",
-            "participantAverage": "Participants' average",
-            "recognizePerformance": "Recognize Performance"
+            "scoreDistribution": "Score Distribution Chart",
+            "participant": "Number of candidates:",
+            "student": "person",
+            "keyPointPerformance": "Knowledge Point Performance Radar Chart",
+            "me": "Individual",
+            "participantAverage": "The whole school",
+            "recognizePerformance": "Recognition Level Radar Chart"
         },
-        "correctAnswer": "Correct",
-        "wrongAnswer": "Wrong",
+        "correctAnswer": "correctAnswer",
+        "wrongAnswer": "Wrong Answer",
         "unAnswered": "Unanswered",
         "solution": "Solution",
         "analysis": "Analysis",
-        "correctRate": "Correct rate",
-        "relatedAQues": "Related Question",
-        "testpop": {
-            "title": "Exam",
-            "completion": "Completion rate",
-            "practiceMode": "Practice Mode",
-            "all": "All",
-            "onlywrong": "Only wrong",
-            "questions": "questions",
-            "submitted": "submit",
-            "showAns": "Show Answer",
-            "hideAns": "Hide Answer",
-            "hint": "keypoint hint",
-            "previous": "Previous",
-            "next": "Next",
-            "myAnswerSheet": "MyAnswerSheet",
-            "exitQuizhint": "Exit Quiz",
-            "exitQuizhintDes": "The system detects that you have not yet 'submitted', if you choose 'OK', the current answer will not be saved, and you need to retest next time",
-            "cancel": "Cancel",
-            "ok": "OK",
-            "submitQuizhint": "Submit Quiz",
-            "submitQuizhintDes1": "The system detects that you finished all question, are you sure to submmit ?",
-            "check": "No, Check Again",
-            "okSubmit": "OK",
-            "qNo": "No.",
-            "myAns": "My Answer",
-            "correction": "Correction"
-        }
+        "correctRate": "correct rate",
+        "relatedAQues": "Related Questions",
     },
-    "informview-title": "Notifications",
-    "view": "view",
-    "read": "read",
-    "studyview-title": "Self-study",
-    "hiteachview-title": "HiTeach Note",
+    "informview-title": "Notification Overview",
+    "view": "Go to view",
+    "read": "Read",
+    "studyview-title": "self-study",
+    "hiteachview-title": "HiTeach Class Record",
     "hiteachNote": {
-        "material": "Material",
-        "classInteractionRecord": "Interaction Record",
-        "qA": "QA",
-        "qAMulti": "QA(Multi)",
-        "reference": "Reference Answer",
-        "correct": "Correct",
-        "groupQAMulti": "Group QA(Multi)",
-        "poImg": "Teacher sent a picture from Hitach:",
-        "link": "Link"
+        "material": "Class Content",
+        "classInteractionRecord": "Class Interaction Record",
+        "qA": "Question and Answer",
+        "qAMulti": "Question and Answer (Multiple Choice)",
+        "reference": "reference answer",
+        "correct": "The answer is correct",
+        "groupQAMulti": "Group QAMulti (multiple choice)",
+        "poImg": "The teacher pushed a picture from Hitach:",
+        "link": "Share Link"
     },
-    "courseList-title": "Course List",
-    "defaultClass": "Default",
-    "tempClass": "Additional",
+    "courseList-title": "My Course List",
+    "defaultClass": "Specify a class",
+    "tempClass": "Temporary Class",
     "courseContent": {
-        "baseInfo": "Infomation",
-        "description": "Description",
-        "classmates": "Classmates",
-        "classID": "Class ID",
-        "classTime": "Class time",
+        "baseInfo": "Basic Information",
+        "description": "Course Overview",
+        "classmates": "Classmates List",
+        "classID": "Course Code",
+        "classTime": "Class Time",
         "classroom": "Classroom",
         "teacher": "Teacher",
-        "co-teacher": "Co-teachers",
-        "addedTime": "Added time",
-        "syllabus": "Syllabus",
-        "seatNo": "No.",
+        "co-teacher": "Co-teacher",
+        "addedTime": "Added Course Date",
+        "syllabus": "Syllabus Overview",
+        "seatNo": "seatNo",
         "name": "Name",
         "group": "Group"
     },
-    "calendar-title": "Calendar - 2020 Semester II",
-    "today":"Today",
-    "importEvent":"Important Event of Class or Campus",
-    "deadlineTasks":"Tasks Ended of the day",
-    "schedule":"Schedule",
-    "des":"Description",
-    "time":"Time",
-    "place":"Place",
-    "course":"Course",
-    "mockcourses":["Reading and Writing", "English Presentation", "Special Experiments on Electronic Circuits", "Introduction to Computers", "Microprocessor Experiments"],
-    "importEventTitle":"Important Events",
-    "Thatday":"That day",
-    "deadlineTasksTitle":"Unfinished Tasks Ended That Day"
+    "calendar-title": "Calendar-Second Semester of 109 School Year",
+    "today": "Today",
+    "importEvent": "Campus Class Important Events",
+    "deadlineTasks": "Deadline Tasks",
+    "schedule": "Schedule Schedule",
+    "des": "Description",
+    "time": "Time",
+    "place": "Location",
+    "course": "course",
+    "mockcourses": ["Reading and Writing", "English Presentation", "Special Experiments on Electronic Circuits", "Introduction to Computers", "Microprocessor Experiments"],
+    "importEventTitle": "Campus Class Important Events",
+    "Thatday": "Thatday",
+    "deadlineTasksTitle": "DeadlineTasksTitle"
 }

+ 58 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/evaluation.js

@@ -59,6 +59,7 @@ export default {
 	confirm:'确认',
 	deleteSuc:'删除成功',
 	deleteFail:'删除失败',
+	editSuc:'修改成功',
 	newExercise:{
 		newSchoolItem:'新建校本题目',
 		newPrivateItem:'新建个人题目',
@@ -101,6 +102,27 @@ export default {
 		answerTitle:'参考答案',
 		contentRelate:'内容关联'
 	},
+	exerciseList:{
+		confirmDelete:'确认删除该试题吗?',
+		setAnswer:'设置答案',
+		typeScore:'题型配分',
+		totalScore:'试卷总分',
+		alreadyScore:'已分配总分',
+		waitScore:'待分配分数',
+		itemNums:'道题,总分配',
+		multipleRule:'多选题(包括综合题的小题)配分规则',
+		rule1:'默认全对得满分',
+		rule2:'少选得一半分数,错选或者不选不得分',
+		rule3:'少选按个数得分,错选或者不选不得分',
+		rule1:'依照(选项数 - 2 * 错选数)/ 选项数,负分则不得分',
+		overScoreTip:'配分已超试卷总分,请重新分配!',
+		editExercise:'编辑习题',
+		editChild:'编辑子题',
+		moveUp:'上移',
+		moveDown:'下移',
+		noAnswerTip:'请为当前客观题设置正确答案!',
+		noOptionTip:'试题题干或选项信息有误,请删除或者重新导入正确文档!'
+	},
 	paperList:{
 		usePeriod:'适用学段',
 		useGrade:'适用年级',
@@ -109,6 +131,41 @@ export default {
 		totalScore:'总分',
 		score:'分',
 		paperErrorTip:'获取试卷数据失败!',
-		confirmDelete:'确认删除该试卷吗?'
+		confirmDelete:'确认删除该试卷吗?',
+		editPaper:'编辑试卷',
+		backToBank:'返回试卷库',
+		baseInfo:'基础信息',
+		paperType:'试卷类型',
+		schoolBank:'学校公有库',
+		praviteBank:'个人试卷库',
+		paperName:'试卷名称',
+		paperScore:'试卷总分',
+		saveRule1:'温馨提示:当前试卷将以题目顺序方式保存',
+		saveRule2:'温馨提示:当前试卷将以题型顺序方式保存',
+		tab1:'组题条件',
+		tab2:'备选题目',
+		tab3:'重新导入',
+		tab4:'导入试题',
+		tab5:'试题预览',
+		tab6:'学生作答预览',
+		isSaving:'保存中',
+		savePaper:'保存试卷',
+		editSuc:'编辑成功',
+		saveSuc:'保存成功',
+		saveFail:'保存失败',
+		defaultName:'预设试卷名称',
+		saveItemsFailTip:'试卷试题数据保存失败!',
+		emptyNameTip:'试卷名称不能为空!',
+		noSpaceTip:'空间已满!',
+		noItemTip:'未选择任何试题!',
+		isExistPaperTip:'试卷库已存在重复名称试卷,是否继续保存覆盖原试卷?',
+		cancelSaveTip:'取消保存试卷!',
+		hasNoScoreTip:'存在未配分的题目,请配分后再保存!',
+		noCompleteScoreTip:'保存前请确认试卷配分是否与试卷总分一致!',
+		hasErrorItemTip:'存在异常试题,请修改或者重新导入!'
+	},
+	importFile:{
+		uploadSuc:'文件上传解析成功!',
+		analysisFail:'对不起,文档解析失败!'
 	}
 }

+ 65 - 30
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/studentWeb.js

@@ -1,4 +1,28 @@
 export default {
+    "home": {
+        "teacher": "教师",
+        "student": "学生",
+        "setting": "个人设定",
+        "logout": "登出",
+        "joinClass": "加入课程",
+        "exam": "评量",
+    },
+    "public": {
+        "going": "进行中",
+        "finish": "已结束",
+        "schoolExam": "校级评测",
+        "privateExam": "个人评测",
+        "search":"请输入查询内容..."
+    },
+    "event": {
+        "allStatus": "所有活动状态",
+        "unFinished": "未完成",
+        "Fineshed": "已完成",
+        "Timeout": "已逾时",
+        "makeupExam": "可补考",
+        "makeupHw": "可补交",
+        "selectActivity":"请从列表挑选一个活动"
+    },
     "settingView-title": "个人设定",
     "teammodel-account-management": {
         "page-title": "TeamModel 帐号管理",
@@ -25,7 +49,6 @@ export default {
     "homeView-title": "首页资讯总览",
     "calenderCardTitle": "行事历",
     "recentClass": "近期上课提醒",
-
     "defaultRecentClass": "微处理机基础与应用概论",
     "defaultClassTime": "星期三 13:30 - 16:30 (第7-9节)",
     "defaultClassPlace": "第五教学楼 F504 教室",
@@ -114,8 +137,6 @@ export default {
     },
     "latestNotification": "最新通知",
     "postAt": "发布于",
-    "setting": "个人设定",
-    "logout": "登出",
     "______________": "______________",
     "eventView-title": "活动任务",
     "nextTask": "下个活动",
@@ -203,6 +224,45 @@ export default {
     },
     "exam": {
         "examLink": "试卷连结",
+        "isSubject": "科试卷",
+        "subjectNow": "当前科目",
+        "examData": "评测内容",
+        "gradeReport": "成绩报告",
+        "gradeAnalyse": "成绩分析",
+        "testpop": {
+            "title": "评量",
+            "completion": "完成度",
+            "practiceMode": "练习模式",
+            "all": "练习全部",
+            "onlywrong": "只练习答错",
+            "questions": "的题目",
+            "submitted": "交卷",
+            "finish":"已完成",
+            "showAns": "显示答案",
+            "hideAns": "隐藏答案",
+            "hint": "重点提示",
+            "previous": "上一题",
+            "next": "下一题",
+            "myAnswerSheet": "我的答题卡",
+            "exitQuizhint": "离开测验提示",
+            "exitQuizhintDe": "系统检测您尚未「交卷」,如您选择「确定」,",
+            "exitQuizhintDes": "则目前作答将不保存,下次需重新测验",
+            "cancel": "取消",
+            "ok": "确定",
+            "submitQuizhint": "交卷提示",
+            "submitQuizhintDes1": "系统检测目前您已全数作答完成,确定交卷吗?",
+            "check": "否,需再检查",
+            "conAnswer0": "目前您有",
+            "conAnswer1": "题 未作答 (详查答案卡)",
+            "conAnswer2":",请先完成题目作答!",
+            "conAnswer":"继续作答",
+            "okSubmit": "确定交卷",
+            "qNo": "题号:",
+            "myAns": "作答",
+            "correction": "正解",
+            "queNo": "题目:",
+            "myAns":"我的作答:"
+        },
         "timeoutHint": "评量活动时间已结束,逾时将以0分计算,或等待教师开放补考。",
         "contentPage": "评量内容",
         "scorePage": "成绩报告",
@@ -213,7 +273,7 @@ export default {
         "Math": "数学",
         "English": "英文",
         "score": "得分",
-        "difficulty": "考题综合难易度",
+        "difficulty": "考题综合难易度", 
         "average": "班平均分数",
         "rightNum": "我的答对题数",
         "smartComment": "智能点评",
@@ -234,32 +294,7 @@ export default {
         "analysis": "解析",
         "correctRate": "答对率",
         "relatedAQues": "关联题目",
-        "testpop": {
-            "title": "评量",
-            "completion": "完成度",
-            "practiceMode": "练习模式",
-            "all": "练习全部",
-            "onlywrong": "只练习答错",
-            "questions": "的题目",
-            "submitted": "交卷",
-            "showAns": "显示答案",
-            "hideAns": "隐藏答案",
-            "hint": "重点提示",
-            "previous": "上一题",
-            "next": "下一题",
-            "myAnswerSheet": "我的答案卡",
-            "exitQuizhint": "离开测验提示",
-            "exitQuizhintDes": "系统检测您尚未「交卷」,如您选择「确定」,则目前作答将不保存,下次需重新测验",
-            "cancel": "取消",
-            "ok": "确定",
-            "submitQuizhint": "交卷提示",
-            "submitQuizhintDes1": "系统检测目前您已全数作答完成,确定交卷吗?",
-            "check": "否,需再检查",
-            "okSubmit": "确定交卷",
-            "qNo": "题号",
-            "myAns": "作答",
-            "correction": "正解"
-        }
+       
     },
     "informview-title": "通知总览",
     "view": "前往检视",

+ 58 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/evaluation.js

@@ -59,6 +59,7 @@ export default {
 	confirm: '確認',
 	deleteSuc: '删除成功',
 	deleteFail: '删除失敗',
+	editSuc: '修改成功',
 	newExercise: {
 		newSchoolItem: '新建校本題目',
 		newPrivateItem: '新建個人題目',
@@ -101,6 +102,27 @@ export default {
 		answerTitle: '參考答案',
 		contentRelate: '內容關聯'
 	},
+	exerciseList: {
+		confirmDelete: '確認删除該試題嗎?',
+		setAnswer: '設定答案',
+		typeScore: '題型配分',
+		totalScore: '試卷總分',
+		alreadyScore: '已分配總分',
+		waitScore: '待分配分數',
+		itemNums: '道題,總分配',
+		multipleRule: '复选题(包括綜合題的小題)配分規則',
+		rule1: '默認全對得滿分',
+		rule2: '少選得一半分數,錯選或者不選不得分',
+		rule3: '少選按個數得分,錯選或者不選不得分',
+		rule1: '依照(選項數- 2 *錯選數)/選項數,負分則不得分',
+		overScoreTip: '配分已超試卷總分,請重新分配!',
+		editExercise: '編輯習題',
+		editChild: '編輯子題',
+		moveUp: '上移',
+		moveDown: '下移',
+		noAnswerTip: '請為當前客觀題設定正確答案!',
+		noOptionTip: '試題題幹或選項資訊有誤,請删除或者重新導入正確檔案!'
+	},
 	paperList: {
 		usePeriod: '適用學段',
 		useGrade: '適用年級',
@@ -109,6 +131,41 @@ export default {
 		totalScore: '總分',
 		score: '分',
 		paperErrorTip: '獲取試卷數據失敗!',
-		confirmDelete: '確認删除該試卷嗎?'
+		confirmDelete: '確認删除該試卷嗎?',
+		editPaper: '編輯試卷',
+		backToBank: '返回試卷庫',
+		baseInfo: '基礎資訊',
+		paperType: '試卷類型',
+		schoolBank: '學校公有庫',
+		praviteBank: '個人試卷庫',
+		paperName: '試卷名稱',
+		paperScore: '試卷總分',
+		saveRule1: '溫馨提示:當前試卷將以題目順序管道保存',
+		saveRule2: '溫馨提示:當前試卷將以題型順序管道保存',
+		tab1: '組題條件',
+		tab2: '備選題目',
+		tab3: '重新導入',
+		tab4: '導入試題',
+		tab5: '試題預覽',
+		tab6: '學生作答預覽',
+		isSaving: '保存中',
+		savePaper: '保存試卷',
+		editSuc: '編輯成功',
+		saveSuc: '保存成功',
+		saveFail: '保存失敗',
+		defaultName: '預設試卷名稱',
+		saveItemsFailTip: '試卷試題數據保存失敗!',
+		emptyNameTip: '試卷名稱不能為空!',
+		noSpaceTip: '空間已滿!',
+		noItemTip: '未選擇任何試題!',
+		isExistPaperTip: '試卷庫已存在重複名稱試卷,是否繼續保存覆蓋原試卷?',
+		cancelSaveTip: '取消保存試卷!',
+		hasNoScoreTip: '存在未配分的題目,請配分後再保存!',
+		noCompleteScoreTip: '保存前請確認試卷配分是否與試卷總分一致!',
+		hasErrorItemTip: '存在异常試題,請修改或者重新導入!'
+	},
+	importFile: {
+		uploadSuc: '文件上傳解析成功!',
+		analysisFail: '對不起,檔案解析失敗!'
 	}
 }

+ 40 - 69
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/studentWeb.js

@@ -1,4 +1,28 @@
 export default {
+    "home": {
+        "teacher": "教師",
+        "student": "學生",
+        "setting": "個人設定",
+        "logout": "登出",
+        "joinClass": "加入課程",
+        "exam": "評量",
+    },
+    "public": {
+        "going": "進行中",
+        "finish": "已結束",
+        "schoolExam": "校級評測",
+        "privateExam": "個人評測",
+        "search": "請輸入查詢內容..."
+    },
+    "event": {
+        "allStatus": "所有活動狀態",
+        "unFinished": "未完成",
+        "Fineshed": "已完成",
+        "Timeout": "已逾時",
+        "makeupExam": "可補考",
+        "makeupHw": "可補交",
+        "selectActivity": "請從列表挑選一個活動"
+    },
     "settingView-title": "個人設定",
     "teammodel-account-management": {
         "page-title": "TeamModel 帳號管理",
@@ -23,7 +47,7 @@ export default {
         "Habook-smart-school": "Habook智慧校園"
     },
     "homeView-title": "首頁資訊總覽",
-    "calenderCardTitle": "行事",
+    "calenderCardTitle": "行事",
     "recentClass": "近期上課提醒",
     "defaultRecentClass": "微處理機基礎與應用概論",
     "defaultClassTime": "星期三 13:30 - 16:30 (第7-9節)",
@@ -113,8 +137,6 @@ export default {
     },
     "latestNotification": "最新通知",
     "postAt": "發佈於",
-    "setting": "個人設定",
-    "logout": "登出",
     "______________": "______________",
     "eventView-title": "活動任務",
     "nextTask": "下個活動",
@@ -167,7 +189,7 @@ export default {
         "reVote": "再次投票",
         "voteSuccess": "投票成功",
         "voteDes": "活動結束後,即可檢視大家的投票結果",
-        "timeoutHint": "投票時間已過,無法再進行投票,敬請留意教師發投票結果!",
+        "timeoutHint": "投票時間已過,無法再進行投票,敬請留意教師發投票結果!",
         "voteResult": "本次投票結果為:",
         "voteDesDefault": "請選擇一個想要的方案:"
     },
@@ -180,30 +202,6 @@ export default {
         "uploadDes": "活動結束後,即可檢視作業成績評語",
         "timeoutHint": "作業上傳時間已結束,本次作業成績將以 0分 計算,或等候教師開放補交。",
         "contentPage": "作業內容",
-        "scorePage": "成績評語",
-        "score": "教師評分",
-        "classmatesComments": "同學給評",
-        "comment": "給評: "
-    },
-    "classmatesComment": {
-        "title": "同學作業觀摩與互評",
-        "seatNo": "座號",
-        "name": "姓名",
-        "star": "星級",
-        "comment": "給評",
-        "preview": "作業預覽:檔案名稱",
-        "unPreview": "這個檔案的格式目前不提供預覽",
-        "download": "下載檔案",
-        "submitted": "提交",
-        "inputSomething": "輸入評語與其他建議",
-        "previous": "上一位",
-        "next": "下一位",
-        "submitBtn": "送出"
-    },
-    "exam": {
-        "examLink": "試卷連結",
-        "timeoutHint": "評量活動時間已結束,逾時將以0分計算,或等待教師開放補考。",
-        "contentPage": "評量內容",
         "scorePage": "成績報告",
         "practiceHint": "評量活動時間已結束,仍可點擊試卷連結,持續練習。",
         "performance": "成績表現",
@@ -232,33 +230,7 @@ export default {
         "solution": "解答",
         "analysis": "解析",
         "correctRate": "答對率",
-        "relatedAQues": "關聯題目",
-        "testpop": {
-            "title": "評量",
-            "completion": "完成度",
-            "practiceMode": "練習模式",
-            "all": "練習全部",
-            "onlywrong": "只練習答錯",
-            "questions": "的題目",
-            "submitted": "交卷",
-            "showAns": "顯示答案",
-            "hideAns": "隱藏答案",
-            "hint": "重點提示",
-            "previous": "上一題",
-            "next": "下一題",
-            "myAnswerSheet": "我的答案卡",
-            "exitQuizhint": "離開測驗提示",
-            "exitQuizhintDes": "系統檢測您尚未「交卷」,如您選擇「確定」,則目前作答將不保存,下次需重新測驗",
-            "cancel": "取消",
-            "ok": "確定",
-            "submitQuizhint": "交卷提示",
-            "submitQuizhintDes1": "系統檢測目前您已全數作答完成,確定交卷嗎?",
-            "check": "否,需再檢查",
-            "okSubmit": "確定交卷",
-            "qNo": "題號",
-            "myAns": "作答",
-            "correction": "正解"
-        }
+        "relatedAQues": "關聯題目"
     },
     "informview-title": "通知總覽",
     "view": "前往檢視",
@@ -294,18 +266,17 @@ export default {
         "name": "姓名",
         "group": "組別"
     },
-    "calendar-title": "行事曆 - 109學年度第二學期",
-    "today":"今天",
-    "importEvent":"校園班級要事",
-   
-    "deadlineTasks":"截止活動任務",
-    "schedule":"表定課表",
-    "des":"描述",
-    "time":"時間",
-    "place":"地點",
-    "course":"課程",
-    "mockcourses":["閱讀與寫作","英文簡報","電子電路專題實驗","計算機概論","微處理機實驗"],
-    "importEventTitle":"校園班級要事",
-    "Thatday":"當日",
-    "deadlineTasksTitle":"當日截止未完成活動任務"
+    "calendar-title": "行事歷 - 109學年度第二學期",
+    "today": "今天",
+    "importEvent": "校園班級要事",
+    "deadlineTasks": "截止活動任務",
+    "schedule": "表定課表",
+    "des": "描述",
+    "time": "時間",
+    "place": "地點",
+    "course": "課程",
+    "mockcourses": ["閱讀與寫作", "英文簡報", "電子電路專題實驗", "計算機概論", "微處理機實驗"],
+    "importEventTitle": "校園班級要事",
+    "Thatday": "當日",
+    "deadlineTasksTitle": "當日截止未完成活動任務"
 }

+ 16 - 6
TEAMModelOS/ClientApp/src/utils/evTools.js

@@ -7,7 +7,20 @@ import {
 	Modal
 } from 'view-design'
 
+
+
 export default {
+	
+	/* 根据登录后的用户信息获取blobHOST域名 */
+	getBlobHost(){
+		if(store.state.user.userProfile){
+			let s = store.state.user.userProfile.blob_uri
+			return s.split(s.substring(s.lastIndexOf('/')))[0]
+		}else{
+			return 'https://teammodelstorage.blob.core.chinacloudapi.cn'
+		}
+	},
+	
 	/* 获取试题保存在Blob的JSON文件 */
 	createBlobItem(item){
 		return new Promise((r,j) => {
@@ -176,7 +189,7 @@ export default {
 							/* 如果是来自试卷的题目 则需要匹配试卷HOST */
 							if(examItem){
 								let examContainer = examItem.examId ?  (examItem.scope === 'school' ? store.state.userInfo.schoolCode : store.state.userInfo.TEAMModelId) : examItem.code
-								let blobUrl = 'https://teammodelstorage.blob.core.chinacloudapi.cn/' + examContainer  + examItem.blob +  '/' + src
+								let blobUrl = this.getBlobHost() +  '/' + examContainer  + examItem.blob +  '/' + src
 								try{
 									let addSasUrl = await $tools.getFileSas(blobUrl)
 									richTextObj[key] = richTextObj[key].replace(`src="${ src }"`, `src="${ addSasUrl.url }"`);
@@ -184,7 +197,7 @@ export default {
 									j(500)
 								}
 							}else if(paperName){
-								let blobUrl = 'https://teammodelstorage.blob.core.chinacloudapi.cn/' + container + '/paper/' + paperName + '/' + src
+								let blobUrl = this.getBlobHost() +  '/'  + container + '/paper/' + paperName + '/' + src
 								try{
 									let addSasUrl = await $tools.getFileSas(blobUrl)
 									richTextObj[key] = richTextObj[key].replace(`src="${ src }"`, `src="${ addSasUrl.url }"`);
@@ -192,7 +205,7 @@ export default {
 									j(500)
 								}
 							}else{
-								let blobUrl = 'https://teammodelstorage.blob.core.chinacloudapi.cn/' + container + '/item/' + exerciseItem.id + '/' + src
+								let blobUrl = this.getBlobHost() +  '/'  + container + '/item/' + exerciseItem.id + '/' + src
 								try{
 									let addSasUrl = await $tools.getFileSas(blobUrl)
 									richTextObj[key] = richTextObj[key].replace(`src="${ src }"`, `src="${ addSasUrl.url }"`);
@@ -378,7 +391,6 @@ export default {
 					jsonData.item = []
 					const path = sasString.url + '/' + paper.code + paper.blob
 					let promiseArr = []
-
 					jsonData.slides.forEach((item, index) => {
 						promiseArr.push(new Promise(async (resolve, reject) => {
 							// 获取题目JSON并且包装成完整试题对象
@@ -397,7 +409,6 @@ export default {
 							}
 						}))
 					})
-
 					Promise.all(promiseArr).then(res => {
 						res.forEach((resItem,resIndex) => {
 							resItem.children = []
@@ -423,7 +434,6 @@ export default {
 		return new Promise(async (r, j) => {
 			// 根据试卷的Blob地址 去读取JSON文件
 			let sasString = paper.scope === 'school' ? await $tools.getSchoolSas(paper.code) : await $tools.getPrivateSas(paper.code)
-			//console.log(sasString)
 			try {
 				console.log(paper.blob + sasString.sas)
 				let jsonInfo = await $tools.getFile(paper.blob + sasString.sas)

+ 1 - 1
TEAMModelOS/ClientApp/src/utils/kityformula.js

@@ -34,7 +34,7 @@ export default function(editor) {
 				console.log(kfe)
               let latex = kfe.execCommand('get.source')
               latex = latex.replace(/\s/g, '') // 去掉空格
-				
+				console.log('latex',latex)
 				
               // 使用 editor.cmd.do  无法关闭弹窗
               // editor.cmd.do(

+ 7 - 11
TEAMModelOS/ClientApp/src/view/evaluation/bank/ExerciseList.vue

@@ -608,10 +608,8 @@
 			 */
 			handleDelete(item) {
 				this.$Modal.confirm({
-					title: "提示",
-					content: "<p>确认删除该试题吗?</p>",
-					okText: "确认",
-					cancelText: "取消",
+					title: this.$t('evaluation.newExercise.modalTip'),
+					content: this.$t('evaluation.exerciseList.confirmDelete'),
 					onOk: () => {
 						this.dataLoading = true;
 						this.$api.newEvaluation
@@ -624,7 +622,7 @@
 								// 获取初始化Blob需要的数据
 								this.deleteBlobPrefix(item).then(status => {
 									if(status === 200){
-										this.$Message.success("删除成功");
+										this.$Message.success(this.$t('evaluation.deleteSuc'));
 										this.doFilter();
 									}else{
 										console.log(err)
@@ -634,7 +632,7 @@
 							})
 							.catch((err) => {
 								console.log(err);
-								this.$Message.warning("删除失败");
+								this.$Message.warning(this.$t('evaluation.deleteFail'));
 								this.dataLoading = false;
 							});
 					},
@@ -712,7 +710,7 @@
 						option: "update",
 					})
 					.then((res) => {
-						this.$Message.success("修改成功!");
+						this.$Message.success(this.$t('evaluation.editSuc'));
 						this.$refs.editRef.isLoading = false;
 						this.editExerciseModal = false;
 						this.doFilter();
@@ -730,15 +728,13 @@
 					this.$api.SaveAnalyzeHtml(requestData).then((res) => {
 						if (res.error === null) {
 							setTimeout(function() {
-								that.$Message.success("文件上传解析成功!");
-								//that.exerciseList = res.result.data
+								that.$Message.success(this.$t('evaluation.importFile.uploadSuc'));
 								that.importLoading = false;
 							}, 1000);
-							// this.saveItemBank(res.result.data);
 						}
 					});
 				} else {
-					this.$Message.error("对不起,文档解析失败!");
+					this.$Message.error(this.$t('evaluation.importFile.analysisFail'));
 				}
 			},
 

+ 8 - 8
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseChild.vue

@@ -16,20 +16,20 @@
 				<template>
 					<InputNumber :max="totalScore" :min="0" v-model="item.score" style="display: inline-block ;width: 60px;margin-right: 10px;height: 30px;"
 					 @click.stop></InputNumber>
-					<span style="margin-right: 20px;"></span>
+					<span style="margin-right: 20px;">{{$t('evaluation.paperList.score')}}</span>
 				</template>
 			</div>
 			<!-- 答案展示部分 -->
 			<div class="item-explain">
-				<span class="explain-title">【答ㅤ案】</span>
+				<span class="explain-title">【{{$t('evaluation.answer')}}】</span>
 				<div class="item-explain-details">
 					<!-- 问答题答案 -->
 					<div v-if="item.type === 'subjective' || item.type === 'complete'">
-						<span v-for="(answer,index) in item.answer" :key="index" v-html="item.answer && item.answer.length ? answer : '未设置答案'"></span>
+						<span v-for="(answer,index) in item.answer" :key="index" v-html="item.answer && item.answer.length ? answer : $t('evaluation.noAnswer')"></span>
 					</div>
 					<!-- 问答题答案 -->
 					<div v-else-if="item.type === 'judge'">
-						<span>{{ item.answer && item.answer.length ? (item.answer[0] === 'A' ? '正确' : '错误') : '未设置答案' }}</span>
+						<span>{{ item.answer && item.answer.length ? (item.answer[0] === 'A' ? $t('evaluation.isTrue') : $t('evaluation.isFalse')) : $t('evaluation.answer') }}</span>
 					</div>
 					<!-- 其余题型答案 -->
 					<div v-else>
@@ -39,16 +39,16 @@
 			</div>
 			<!-- 解析部分 -->
 			<div class="item-explain">
-				<span class="explain-title">【解ㅤ析】</span>
+				<span class="explain-title">【{{$t('evaluation.explain')}}】</span>
 				<div class="item-explain-details">
-					<span v-html="item.explain || '暂无解析'"></span>
+					<span v-html="item.explain || $t('evaluation.noExplain')"></span>
 				</div>
 			</div>
 			<!-- 知识点部分 -->
 			<div class="item-explain">
-				<span class="explain-title">【知识点】</span>
+				<span class="explain-title">【{{$t('evaluation.knowledgePoints')}}】</span>
 				<div class="item-explain-details">
-					<span v-if="!item.points || !item.points.length">暂未绑定知识点</span>
+					<span v-if="!item.points || !item.points.length">{{$t('evaluation.noPoints')}}</span>
 					<div v-else>
 						<span v-for="(point,index) in item.points" :key="index" class="item-point-tag">
 							<span>{{ point }}</span>

+ 5 - 7
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseChildList.vue

@@ -10,9 +10,9 @@
 						</div>
 						<div class="item-tools-wrap">
 							<div class="item-tools-t flex-row-center" @click="onEditChild(item,index)">
-								<Icon type="ios-brush-outline" />编辑</div>
+								<Icon type="ios-brush-outline" />{{$t('evaluation.editItem')}}</div>
 							<div class="item-tools-t flex-row-center" @click="onDeleteChild(item,index)">
-								<Icon type="ios-archive-outline" />删除</div>
+								<Icon type="ios-archive-outline" />{{$t('evaluation.deleteItem')}}</div>
 						</div>
 					</div>
 				</transition-group>
@@ -20,7 +20,7 @@
 		</div>
 		<!-- 添加子题弹窗 -->
 		<Modal v-model="editChildModal" width="1080" footer-hide class="">
-			<div class="modal-header" slot="header">编辑子题</div>
+			<div class="modal-header" slot="header">{{$t('evaluation.exerciseList.editChild')}}</div>
 			<BaseCreateChild @addFinish='onEditChildFinish' refId="childListEdit" :editItem="curItem" :curPeriodIndex="curPeriodIndex"
 			 :curSubjectIndex="curSubjectIndex"></BaseCreateChild>
 		</Modal>
@@ -84,10 +84,8 @@
 
 			onDeleteChild(item, index) {
 				this.$Modal.confirm({
-					title: '提示',
-					content: '<p>确认删除该小题吗?</p>',
-					okText: '确认',
-					cancelText: '取消',
+					title: this.$t('evaluation.newExercise.modalTip'),
+					content: this.$t('evaluation.exerciseList.confirmDelete'),
 					onOk: () => {
 						this.childrenList.splice(index, 1)
 						this.$emit('onEditChildFinish', this.childrenList)

+ 23 - 30
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseEditExercise.vue

@@ -2,19 +2,19 @@
 	<div class="ev-container component-ev-container" :id="refId" ref="editContainer">
 		<div class="display-flex" v-if="isSchool">
 			<div class="exersices-attr my-radio-style">
-				<IconText :text="'选择学段'" :color="'#00b8ff'" :icon="'md-school'"></IconText>
+				<IconText :text="$t('evaluation.newExercise.choosePeriod')" :color="'#00b8ff'" :icon="'md-school'"></IconText>
 				<Select v-model="exercisePeriod" @on-change="onPeriodChange">
 					<Option v-for="(period, index) in schoolInfo.period" :value="index" :key="index">{{ period.name }}</Option>
 				</Select>
 			</div>
 			<div class="my-radio-style exersices-attr">
-				<IconText :text="'选择年级'" :color="'#00b8ff'" :icon="'logo-buffer'"></IconText>
+				<IconText :text="$t('evaluation.newExercise.chooseGrade')" :color="'#00b8ff'" :icon="'logo-buffer'"></IconText>
 				<Select v-model="exerciseGrade" multiple>
 					<Option v-for="(grade, index) in gradeList" :value="grade.id" :key="index">{{ grade.name }}</Option>
 				</Select>
 			</div>
 			<div class="exersices-attr my-radio-style">
-				<IconText :text="'选择科目'" :color="'#00b8ff'" :icon="'md-bookmarks'"></IconText>
+				<IconText :text="$t('evaluation.newExercise.chooseSubject')" :color="'#00b8ff'" :icon="'md-bookmarks'"></IconText>
 				<Select v-model="exerciseSubject" @on-change="onSubjectChange">
 					<Option v-for="(subject, index) in subjectList" :value="index" :key="index">{{ subject.name }}</Option>
 				</Select>
@@ -28,7 +28,7 @@
 				</Select>
 			</div> -->
 			<div class="exersices-attr edit-exersices-attr-diff my-radio-style">
-				<IconText :text="'题目难度'" :color="'#00b8ff'" :icon="'md-pulse'"></IconText>
+				<IconText :text="$t('evaluation.newExercise.diff')" :color="'#00b8ff'" :icon="'md-pulse'"></IconText>
 				<RadioGroup v-model="exersicesDiff" type="button" ref="diffRef">
 					<Radio label="1" @click.native="diffChange($event, '1')">容易</Radio>
 					<Radio label="2" @click.native="diffChange($event, '2')">较易</Radio>
@@ -38,13 +38,13 @@
 				</RadioGroup>
 			</div>
 			<div class="exersices-attr my-radio-style">
-				<IconText :text="'关联认知层次'" :color="'#00b8ff'" :icon="'md-planet'"></IconText>
+				<IconText :text="$t('evaluation.newExercise.field')" :color="'#00b8ff'" :icon="'md-planet'"></IconText>
 				<Select v-model="exerciseField">
 					<Option v-for="(item, index) in fieldList" :value="index" :key="index">{{ item }}</Option>
 				</Select>
 			</div>
 			<div class="exersices-attr my-radio-style">
-				<IconText :text="'关联知识点'" :color="'#00b8ff'" :icon="'md-infinite'"></IconText>
+				<IconText :text="$t('evaluation.newExercise.knowledge')" :color="'#00b8ff'" :icon="'md-infinite'"></IconText>
 				<Button type="info" style="margin-top: 20px" @click="onSelectPoints" v-if="exercisePoints.length === 0">选择知识点</Button>
 				<div v-else style="margin-top: 10px">
 					<span v-for="(item, index) in exercisePoints" :key="index" class="exercise-item-point">
@@ -58,7 +58,7 @@
 		</div>
 		<div class="exersices-attr display-flex">
 			<div class="exersices-attr-diff my-radio-style">
-				<IconText :text="'选择题型'" :color="'#00b8ff'" :icon="'md-pricetags'"></IconText>
+				<IconText :text="$t('evaluation.newExercise.type')" :color="'#00b8ff'" :icon="'md-pricetags'"></IconText>
 				<RadioGroup v-model="exersicesType" type="button" @on-change="typeChange">
 					<Radio label="single" :disabled="isEdit">单选题</Radio>
 					<Radio label="multiple" :disabled="isEdit">多选题</Radio>
@@ -84,7 +84,7 @@
 
 		<!-- 解析的富文本部分 -->
 		<div class="exersices-analysis" v-show="exersicesType !== 'compose'">
-			<IconText :text="'解析'" :color="'#2892DD'" :icon="'md-list'" style="margin-bottom: 10px"></IconText>
+			<IconText :text="$t('evaluation.explain')" :color="'#2892DD'" :icon="'md-list'" style="margin-bottom: 10px"></IconText>
 			<div>
 				<div ref="analysisEditor" style="text-align: left"></div>
 			</div>
@@ -92,13 +92,13 @@
 
 		<!-- 补救的富文本部分 -->
 		<div class="exersices-analysis" v-show="exersicesType !== 'compose'">
-			<IconText :text="'补救资源'" :color="'#2892DD'" :icon="'md-link'" style="margin-bottom: 10px"></IconText>
+			<IconText :text="$t('evaluation.newExercise.repair')" :color="'#2892DD'" :icon="'md-link'" style="margin-bottom: 10px"></IconText>
 			<BaseRepair ref="repairRef" :datas="repairResource || []"></BaseRepair>
 		</div>
 
 		<!-- 小题展示区域 -->
 		<div class="child-list-wrap" v-show="exersicesType === 'compose' && childList.length">
-			<IconText :text="'小题列表'" :color="'#00b8ff'" :icon="'md-list'"></IconText>
+			<IconText :text="$t('evaluation.newExercise.childList')" :color="'#00b8ff'" :icon="'md-list'"></IconText>
 			<BaseChildList :childList="childList" @onEditChildFinish="onEditChildFinish" @onDeleteChild="onDeleteChild" :curPeriodIndex="exercisePeriod"
 			 :curSubjectIndex="exerciseSubject"></BaseChildList>
 		</div>
@@ -108,28 +108,20 @@
 			<Button type="success" @click="getContent(exersicesType)" :loading="isLoading">保存</Button>
 		</div>
 
-		<Modal v-model="selectPointsModal" title="选择知识点" ref="editPointRef" width="600px" style="z-index: 99999">
+		<Modal v-model="selectPointsModal" :title="$t('evaluation.newExercise.choosePoint')" ref="editPointRef" width="600px" style="z-index: 99999">
 			<BasePoints v-if="selectPointsModal" :period="schoolInfo.period[exercisePeriod].id" :subject="subjectList[exerciseSubject].id"
 			 @onCheckChange="onCheckChange" :points="exercisePoints" ref="pointRef" :scope="curScope"></BasePoints>
 			<!--<CreateNewChild v-if="isLoadModal" ref="newChild" :isChildEdit="isChildEdit" :editItem="editChild"></CreateNewChild>-->
 			<div slot="footer">
-				<Button type="text" @click="onConfirm">取消</Button>
-				<Button type="primary" @click="onConfirm">确定</Button>
+				<Button type="text" @click="onConfirm">{{ $t('evaluation.newExercise.cancel') }}</Button>
+				<Button type="primary" @click="onConfirm">{{ $t('evaluation.newExercise.confirm') }}</Button>
 			</div>
 		</Modal>
 
-		<!-- 关联内容弹窗 -->
-		<Modal v-model="isRelatedContent" width="880" footer-hide class="relate-modal related-modal">
-			<div class="modal-header" slot="header">内容关联</div>
-			<!-- <ChooseContent :showSyllabus="isFalse" :showOther="isFalse" :showQuestion="isFalse" @on-select-file="onSelectFile"
-			 @on-cancel-file="onSelectFile"></ChooseContent> -->
-
-			<Button class="modal-btn" @click="onConfirmRelate">确认</Button>
-		</Modal>
 
 		<!-- 添加小题弹窗 -->
 		<Modal v-model="addChildModal" width="1080" footer-hide class="">
-			<div class="modal-header" slot="header">添加小题</div>
+			<div class="modal-header" slot="header">{{ $t('evaluation.newExercise.addChild') }}</div>
 			<BaseCreateChild @addFinish="onAddChildFinish" v-if="addChildModal" :curPeriodIndex="exercisePeriod"
 			 :curSubjectIndex="exerciseSubject"></BaseCreateChild>
 		</Modal>
@@ -185,8 +177,9 @@
 				exercisePoints: [],
 				childList: [],
 				oldChildList:[],
-				scopeList: ["个人题库", "校本题库"],
-				fieldList: ["知识", "理解", "应用", "分析", "综合", "评鉴"],
+				scopeList: [this.$t('evaluation.filter.schoolBank'),this.$t('evaluation.filter.privateBank')],
+				fieldList: [this.$t('evaluation.level1'),this.$t('evaluation.level2'),this.$t('evaluation.level3'),
+				this.$t('evaluation.level4'),this.$t('evaluation.level5'),this.$t('evaluation.level6')],
 				periodList: [],
 				gradeList: [],
 				subjectList: [],
@@ -224,7 +217,7 @@
 				if(this.hasSchool){
 					this.selectPointsModal = true
 				}else{
-					this.$Message.warning('您当前未加入学校,无法选择知识点!')
+					this.$Message.warning(this.$t('evaluation.newExercise.noSchoolTip'))
 				}
 			},
 
@@ -414,7 +407,7 @@
 								console.log(exerciseItem)
 								this.saveExercise(cosmosItem);
 							} else {
-								this.$Message.error("试题文件上传失败,请稍后重试!");
+								this.$Message.error(this.$t('evaluation.newExercise.uploadErrorTip'));
 							}
 						} catch (e) {
 							this.$Message.error(e.spaceError);
@@ -427,7 +420,7 @@
 					this.$Message.warning("题目难度未设置!");
 					this.isLoading = false;
 				} else {
-					this.$Message.warning("请将题目填写完整!");
+					this.$Message.warning(this.$t('evaluation.newExercise.unCompleteTip'));
 					this.isLoading = false;
 				}
 				console.log(exerciseItem);
@@ -488,7 +481,7 @@
 											r(res.itemInfo)
 										});
 								} else {
-									this.$Message.error("试题文件上传失败,请稍后重试!");
+									this.$Message.error(this.$t('evaluation.newExercise.uploadErrorTip'));
 								}
 							} catch (e) {
 								this.$Message.error(e);
@@ -535,7 +528,7 @@
 						})
 						.catch((err) => {
 							j(err);
-							this.$Message.warning("删除失败");
+							this.$Message.warning(this.$t('evaluation.deleteFail'));
 						});
 				})
 				
@@ -618,7 +611,7 @@
 			// 题目类型转换
 			typeChange(val) {
 				if (this.isEdit) {
-					this.$Message.warning("暂不支持更换题型!");
+					this.$Message.warning(this.$t('evaluation.newExercise.typeChangeTip'));
 				}else {
 					this.exersicesType = val;
 					this.analysisEditor.txt.clear();

+ 37 - 39
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseExerciseList.vue

@@ -3,14 +3,14 @@
 		<!-- 题目列表部分 -->
 		<div v-if="exerciseList.length === 0" class="no-data-text">
 			<img src="@/assets/icon/no_data.svg" width="120" />
-			<span style="margin-top:15px;color:#808080">暂无数据</span>
+			<span style="margin-top:15px;color:#808080">{{$t('evaluation.noData')}}</span>
 		</div>
 		<div class="content-wrap" ref="mathJaxContainer" v-else>
 			<Loading :top="200" v-show="dataLoading" type="1"></Loading>
 			<div class="list-view" :key="typeIndex" v-for="(typeItem,typeIndex) in listData">
 				<p v-show="viewModel === 'type' && typeItem.list.length" class="type-name">{{ numberConvertToUppercase(getLatestTypeIndex(typeItem.type) + 1) }}
 					: {{ exersicesType[typeItem.type] }}
-					({{ typeItem.score || 0 }} ) </p>
+					({{ typeItem.score || 0 }} {{$t('evaluation.paperList.score')}}) </p>
 
 				<div v-for="(item,index) of typeItem.list" :key="index" :class='["exercise-item",isError(item.id) ? "exercise-item-error":""]'
 				 @mouseenter="exerciseMouseover($event)" @mouseleave="exerciseMouseleave($event)" :data-id="item.id">
@@ -20,22 +20,22 @@
 						<!-- <div class="item-tools-t flex-row-center" v-show="isShowTools" @click.stop="handleSetScore(item,exerciseList.indexOf(item),typeItem.list,index)">
 							<Icon type="ios-list-box-outline" />配分</div> -->
 						<div class="item-tools-t flex-row-center" v-if="!item.blob && errorList.indexOf(item) < 0" @click.stop="handleToolEdit(typeItem.list,item,index)">
-							<Icon type="ios-brush-outline" />编辑</div>
+							<Icon type="ios-brush-outline" />{{$t('evaluation.editItem')}}</div>
 						<div class="item-tools-t flex-row-center" v-show="isShowTools && !isExamPaper &&noAnswerList.indexOf(item) > -1"
 						 @click.stop="onSetAnswer(item,exerciseList.indexOf(item),typeItem.list,index)">
-							<Icon type="ios-brush-outline" />设置正确答案</div>
+							<Icon type="ios-brush-outline" />{{$t('evaluation.exerciseList.setAnswer')}}</div>
 						<div class="item-tools-t flex-row-center" v-show="isShowTools && !isExamPaper" @click.stop="handleDelete(typeItem.list,item,index)">
-							<Icon type="ios-archive-outline" />删除</div>
+							<Icon type="ios-archive-outline" />{{$t('evaluation.deleteItem')}}</div>
 						<div class="item-tools-t flex-row-center" v-show="index != 0 && isShowTools && !isExamPaper" @click.stop="handleMoveUp(typeItem.list,index)">
-							<Icon type="md-arrow-up" />上移</div>
+							<Icon type="md-arrow-up" />{{$t('evaluation.exerciseList.moveUp')}}</div>
 						<div class="item-tools-t flex-row-center" v-show="index != (typeItem.list.length - 1)  && isShowTools && !isExamPaper"
 						 @click.stop="handleMoveDown(typeItem.list,index)">
-							<Icon type="md-arrow-down" />下移</div>
+							<Icon type="md-arrow-down" />{{$t('evaluation.exerciseList.moveDown')}}</div>
 					</div>
 
 					<div class="item-error-wrap" v-if="errorList.indexOf(item) > -1">
-						<span v-if="isNoAnswer(item)">请为当前客观题设置正确答案!</span>
-						<span v-else>试题题干或选项信息有误,请删除或者重新导入正确文档!</span>
+						<span v-if="isNoAnswer(item)">{{$t('evaluation.exerciseList.noAnswerTip')}}</span>
+						<span v-else>{{$t('evaluation.exerciseList.noOptionTip')}}</span>
 					</div>
 
 					<div @click="onQuestionToggle(exerciseList.indexOf(item),item.id,$event,typeItem.list)">
@@ -62,11 +62,11 @@
 						<template v-if="!isExamPaper">
 							<InputNumber :max="item.score + surPlusScore" :min="0" v-model="item.score" style="display: inline-block ;width: 60px;margin-right: 10px;height: 30px;"
 							 @click.stop></InputNumber>
-							<span style="margin-right: 20px;"></span>
+							<span style="margin-right: 20px;">{{$t('evaluation.paperList.score')}}</span>
 							<!-- <span class="item-score" title="设置题目分数" @click.stop="onSetSingleItem(item,index)" v-else>{{ item.score }} 分</span> -->
 						</template>
 						<template v-else>
-							<span style="margin-right: 20px;font-size: 16px;"> <span style="font-weight: bold;color: #0086E6;">{{ item.score }}</span>  </span>
+							<span style="margin-right: 20px;font-size: 16px;"> <span style="font-weight: bold;color: #0086E6;">{{ item.score }}</span>  {{$t('evaluation.paperList.score')}}</span>
 						</template>
 						<Icon :type="collapseList.indexOf(index) > -1 ? 'ios-arrow-dropup' : 'ios-arrow-dropdown'" />
 					</div>
@@ -77,21 +77,21 @@
 							<div v-if="item.type !== 'compose'">
 								<!-- 答案展示部分 -->
 								<div class="item-explain" v-show="isShowAnswer">
-									<span class="explain-title">【题ㅤ型】</span>
+									<span class="explain-title">【{{$t('evaluation.filter.type')}}】</span>
 									<div class="item-explain-details">
 										{{ exersicesType[item.type] }}
 									</div>
 								</div>
 								<div class="item-explain" v-show="isShowAnswer">
-									<span class="explain-title">【答ㅤ案】</span>
+									<span class="explain-title">【{{$t('evaluation.answer')}}】</span>
 									<div class="item-explain-details">
 										<!-- 问答题答案 -->
 										<div v-if="item.type === 'subjective' || item.type === 'complete' || item.type === 'connector' || item.type === 'correct'">
-											<span v-for="(answer,index) in item.answer" :key="index" v-html="item.answer.length ? answer : '未设置答案'"></span>
+											<span v-for="(answer,index) in item.answer" :key="index" v-html="item.answer.length ? answer : $t('evaluation.noAnswer')"></span>
 										</div>
 										<!-- 问答题答案 -->
 										<div v-else-if="item.type === 'judge'">
-											<span>{{ item.answer.length ? (item.answer[0] === 'A' ? '正确' : '错误') : '未设置答案' }}</span>
+											<span>{{ item.answer.length ? (item.answer[0] === 'A' ? $t('evaluation.isTrue') : $t('evaluation.isFalse')) : $t('evaluation.answer') }}</span>
 										</div>
 										<!-- 其余题型答案 -->
 										<div v-else>
@@ -102,16 +102,16 @@
 								</div>
 								<!-- 解析部分 -->
 								<div class="item-explain" v-show="isShowAnswer">
-									<span class="explain-title">【解ㅤ析】</span>
+									<span class="explain-title">【{{$t('evaluation.explain')}}】</span>
 									<div class="item-explain-details">
-										<span v-html="item.explain || '暂无解析'"></span>
+										<span v-html="item.explain || $t('evaluation.noExplain')"></span>
 									</div>
 								</div>
 								<!-- 知识点部分 -->
 								<div class="item-explain" v-show="isShowAnswer">
-									<span class="explain-title">【知识点】</span>
+									<span class="explain-title">【{{$t('evaluation.knowledgePoints')}}】</span>
 									<div class="item-explain-details">
-										<span v-if="! (_.compact(item.points).length)">暂未绑定知识点</span>
+										<span v-if="! (_.compact(item.points).length)">{{$t('evaluation.noPoints')}}</span>
 										<div v-else>
 											<span v-for="(point,index) in item.points" :key="index" class="item-point-tag">
 												{{ point }}
@@ -132,7 +132,7 @@
 		</div>
 
 		<!-- 单个试题配分弹框 -->
-		<Modal v-model="answerModal" title="设置答案" @on-ok="onConfirmAnswer">
+		<Modal v-model="answerModal" :title="$t('evaluation.exerciseList.setAnswer')" @on-ok="onConfirmAnswer">
 			<div v-if="curErrorItem.type === 'single'">
 				<RadioGroup v-model="curErrorSingleAnswer" type="button">
 					<Radio v-for="(option,index) in curErrorItem.option" :key="index" :label="option.code"></Radio>
@@ -146,51 +146,51 @@
 		</Modal>
 
 		<!-- 题型配分弹窗 -->
-		<Modal v-model="typeScoreModel" title="题型配分" footer-hide>
-			<span class="type-score-item">试卷总分 : <span style="color: #0086E6;font-weight: bold;">{{ paperInfo.score }}</span> </span>
-			<span class="type-score-item">已分配总分 : <span style="color: #04945f;font-weight: bold;">{{ getTotalScore(groupTypeList) }}</span></span>
-			<span class="type-score-item">待分配分数 : <span style="color: #e63c3f;font-weight: bold;">{{ paperInfo.score - getTotalScore(groupTypeList) }}</span></span>
+		<Modal v-model="typeScoreModel" :title="$t('evaluation.exerciseList.typeScore')" footer-hide>
+			<span class="type-score-item">{{$t('evaluation.exerciseList.totalScore')}} : <span style="color: #0086E6;font-weight: bold;">{{ paperInfo.score }}</span> </span>
+			<span class="type-score-item">{{$t('evaluation.exerciseList.alreadyScore')}} : <span style="color: #04945f;font-weight: bold;">{{ getTotalScore(groupTypeList) }}</span></span>
+			<span class="type-score-item">{{$t('evaluation.exerciseList.waitScore')}} : <span style="color: #e63c3f;font-weight: bold;">{{ paperInfo.score - getTotalScore(groupTypeList) }}</span></span>
 			<div v-for="(modalItem,modalIndex) in groupTypeList" :key="modalIndex" class="type-score-item">
 				<div v-if="modalItem.list.length">
 					<span>{{ exersicesType[modalItem.type] }} </span>
-					<span>共 <span style="color: #0086E6;font-weight: bold;margin: 0 10px;">{{ modalItem.list.length }}</span> 道题,总分配:</span>
+					<span>共 <span style="color: #0086E6;font-weight: bold;margin: 0 10px;">{{ modalItem.list.length }}</span> {{$t('evaluation.exerciseList.itemNums')}} :</span>
 					<InputNumber :max="paperInfo.score" :min="0" :step="scoreStep" v-model="modalItem.score"></InputNumber>
 					<span> 分</span>
 				</div>
 			</div>
 			<div style="margin: 20px 10px;">
-				<p style="margin-bottom: 10px;">多选题(包括综合题的小题)配分规则</p>
+				<p style="margin-bottom: 10px;">{{$t('evaluation.exerciseList.multipleRule')}}</p>
 				<div class="rule-item">
 					<RadioGroup v-model="multipleRule" vertical>
 						<Radio :label="1">
 							<Icon type="social-android"></Icon>
-							<span>默认全对得满分</span>
+							<span>{{$t('evaluation.exerciseList.rule1')}}</span>
 						</Radio>
 						<Radio :label="2">
 							<Icon type="social-windows"></Icon>
-							<span>少选得一半分数,错选或者不选不得分</span>
+							<span>{{$t('evaluation.exerciseList.rule2')}}</span>
 						</Radio>
 						<Radio :label="3">
 							<Icon type="social-windows"></Icon>
-							<span>少选按个数得分,错选或者不选不得分</span>
+							<span>{{$t('evaluation.exerciseList.rule3')}}</span>
 						</Radio>
 						<Radio :label="4">
 							<Icon type="social-windows"></Icon>
-							<span>依照(选项数 - 2 * 错选数)/ 选项数,负分则不得分</span>
+							<span>{{$t('evaluation.exerciseList.rule4')}}分</span>
 						</Radio>
 					</RadioGroup>
 				</div>
 			</div>
-			<Button class="type-score-btn" @click="onConfirmTypeScore" type="info" :disabled="getTotalScore(groupTypeList) > paperInfo.score">确认</Button>
-			<p style="color:red;text-align:center;font-weight:bold;margin-top:10px" v-show="getTotalScore(groupTypeList) > paperInfo.score">配分已超试卷总分,请重新分配!</p>
+			<Button class="type-score-btn" @click="onConfirmTypeScore" type="info" :disabled="getTotalScore(groupTypeList) > paperInfo.score">{{$t('evaluation.confirm')}}</Button>
+			<p style="color:red;text-align:center;font-weight:bold;margin-top:10px" v-show="getTotalScore(groupTypeList) > paperInfo.score">{{$t('evaluation.exerciseList.overScoreTip')}}</p>
 
 		</Modal>
 
 		<!-- 编辑试题弹窗 -->
-		<Modal v-model="editExerciseModal" class-name="edit-exercise-modal" width="1200px" footer-hide title="编辑习题">
+		<Modal v-model="editExerciseModal" class-name="edit-exercise-modal" width="1200px" footer-hide :title="$t('evaluation.exerciseList.editExercise')">
 			<BaseEditExercise :exerciseItem="currentExercise" @onEditSuccess="onEditSuccess" refId="paperEdit" ref="paperEdit"></BaseEditExercise>
 			<div slot="footer">
-				<Button type="success">确认</Button>
+				<Button type="success">{{$t('evaluation.confirm')}}</Button>
 			</div>
 		</Modal>
 	</div>
@@ -380,12 +380,10 @@
 			 */
 			handleDelete(arr, item, index) {
 				this.$Modal.confirm({
-					title: '提示',
-					content: '<p>确认删除该试题吗?</p>',
-					okText: '确认',
-					cancelText: '取消',
+					title: this.$t('evaluation.newExercise.modalTip'),
+					content: this.$t('evaluation.exerciseList.confirmDelete'),
 					onOk: () => {
-						this.$Message.success('删除成功')
+						this.$Message.success(this.$t('evaluation.deleteSuc'))
 						this.surPlusScore += item.score
 						this.$emit('scoreUpdate', this.surPlusScore)
 						arr.splice(index, 1)

+ 12 - 12
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseFilter.vue

@@ -1,40 +1,40 @@
 <template>
 	<div class="filter-wrap">
 		<div class="filter-item" v-show="!isShowSchoolBank">
-			<span class="filter-title">来源:</span>
+			<span class="filter-title">{{$t('evaluation.filter.origin')}}:</span>
 			<RadioGroup v-model="filterOrigin" type="button" @on-change="filterOriginChange">
-				<Radio :label="schoolCode" v-if="isShowSchoolBank">校本试卷库</Radio>
-				<Radio :label="userId">个人试卷库</Radio>
-				<Radio :label="schoolCode" v-if="!isShowSchoolBank && hasSchool">校本试卷库</Radio>
+				<Radio :label="schoolCode" v-if="isShowSchoolBank">{{$t('evaluation.filter.schoolBank')}}</Radio>
+				<Radio :label="userId">{{$t('evaluation.filter.privateBank')}}</Radio>
+				<Radio :label="schoolCode" v-if="!isShowSchoolBank && hasSchool">{{$t('evaluation.filter.schoolBank')}}</Radio>
 			</RadioGroup>
 		</div>
 		<div class="filter-item" v-show="(isShowSchoolBank || (filterOrigin === schoolCode)) &&  hasSchool">
-			<span class="filter-title">学段:</span>
+			<span class="filter-title">{{$t('evaluation.filter.period')}}:</span>
 			<RadioGroup v-model="filterPeriod" type="button" @on-change="filterPeriodChange">
 				<Radio v-for="(item, index) in periodList" :key="index" :label="index">{{ item.name }}</Radio>
 			</RadioGroup>
 		</div>
 		<div class="filter-item" v-show="(isShowSchoolBank || (filterOrigin === schoolCode)) &&  hasSchool">
-			<span class="filter-title">年级:</span>
+			<span class="filter-title">{{$t('evaluation.filter.grade')}}:</span>
 			<CheckboxGroup v-model="filterGrade" border @on-change="filterGradeChange">
-				<Checkbox lable="all">全部</Checkbox>
+				<Checkbox lable="all">{{$t('evaluation.filter.all')}}</Checkbox>
 				<Checkbox v-for="(item, index) in gradeList" :key="index" :label="item.id">{{ item.name }}</Checkbox>
 			</CheckboxGroup>
 		</div>
 		<div class="filter-item" v-show="(isShowSchoolBank || (filterOrigin === schoolCode)) &&  hasSchool">
-			<span class="filter-title">科目:</span>
+			<span class="filter-title">{{$t('evaluation.filter.subject')}}:</span>
 			<CheckboxGroup v-model="filterSubject" border @on-change="filterSubjectChange">
-				<Checkbox lable="all">全部</Checkbox>
+				<Checkbox lable="all">{{$t('evaluation.filter.all')}}</Checkbox>
 				<Checkbox v-for="(item, index) in subjectList" :key="index" :label="item.id">{{ item.name }}</Checkbox>
 			</CheckboxGroup>
 		</div>
 		<div class="filter-item">
-			<span class="filter-title">排序:</span>
+			<span class="filter-title">{{$t('evaluation.filter.sort')}}:</span>
 			<RadioGroup v-model="filterSort" type="button" @on-change="filterSortChange">
-				<Radio label="createTime">新增时间
+				<Radio label="createTime">{{$t('evaluation.filter.createTime')}}
 					<Icon type="md-arrow-round-down" />
 				</Radio>
-				<Radio label="useCount">使用次数
+				<Radio label="useCount">{{$t('evaluation.filter.useCount')}}
 					<Icon type="md-arrow-round-down" />
 				</Radio>
 			</RadioGroup>

+ 1 - 1
TEAMModelOS/ClientApp/src/view/evaluation/index/CreateExercises.vue

@@ -111,7 +111,7 @@
 			 @onCheckChange="onCheckChange" :points="exercisePoints" :scope="curScope"></BasePoints>
 			<div slot="footer">
 				<Button type="text" @click="selectPointsModal = false">{{ $t('evaluation.newExercise.cancel') }}</Button>
-				<Button type="primary" @click="selectPointsModal = false">{{ $t('evaluation.newExercise.addChild') }}</Button>
+				<Button type="primary" @click="selectPointsModal = false">{{ $t('evaluation.newExercise.confirm') }}</Button>
 			</div>
 		</Modal>
 

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

@@ -1,44 +1,44 @@
 <template>
 	<div class="create-evaluation-container">
 		<div class="create-header">
-			<p class="create-header-title">{{ isEditPaper ? '编辑试卷' : evaluationInfo.createType === 'auto' ? '智能组卷' : evaluationInfo.createType === 'import' ? '导题组卷' : '挑题组卷'}}</p>
+			<p class="create-header-title">{{ isEditPaper ? $t('evaluation.paperList.editPaper') : evaluationInfo.createType === 'auto' ? $t('evaluation.index.autoCreate') : evaluationInfo.createType === 'import' ? $t('evaluation.index.importCreate')  : $t('evaluation.index.manualCreate') }}</p>
 			<div style="float: right;" class="common-save-btn">
-				<Button class="btn-save" type="text" icon="md-arrow-round-back" @click="goBack">返回试卷库</Button>
-				<Button class="btn-save" type="text" icon="md-folder" :loading="isLoading" @click="saveTestPaper">{{ isLoading ? '保存中' : '保存试卷'}}</Button>
+				<Button class="btn-save" type="text" icon="md-arrow-round-back" @click="goBack">{{$t('evaluation.paperList.backToBank')}}</Button>
+				<Button class="btn-save" type="text" icon="md-folder" :loading="isLoading" @click="saveTestPaper">{{ isLoading ? $t('evaluation.paperList.isSaving') : $t('evaluation.paperList.savePaper')}}</Button>
 			</div>
 		</div>
 		<div class="create-body dark-iview-split">
 			<Split v-model="split1">
 				<div slot="left" class="demo-split-pane">
 					<div class="evaluation-attr-wrap">
-						<p class="wrap-label">基础信息</p>
+						<p class="wrap-label">{{$t('evaluation.paperList.baseInfo')}}</p>
 						<div style="width:100%; height:calc(100% - 45px);padding-top:30px;">
 							<Form ref="evaluationInfo" :model="evaluationInfo" label-position="top" class="evaluation-attr-form" label-colon>
-								<FormItem label="试卷类型" prop="type">
+								<FormItem :label="$t('evaluation.paperList.paperType')" prop="type">
 									<Select v-model="evaluationInfo.type" disabled>
-										<Option value="private">个人试卷库</Option>
-										<Option value="school">学校公有库</Option>
+										<Option value="private">{{$t('evaluation.paperList.praviteBank')}}</Option>
+										<Option value="school">{{$t('evaluation.paperList.schoolBank')}}</Option>
 									</Select>
 								</FormItem>
-								<FormItem label="试卷名称" prop="name">
+								<FormItem :label="$t('evaluation.paperList.paperName')" prop="name">
 									<Input v-model="evaluationInfo.name"></Input>
 								</FormItem>
-								<FormItem label="选择学段" prop="paperPeriod" v-if="isSchool">
+								<FormItem :label="$t('evaluation.newExercise.choosePeriod')" prop="paperPeriod" v-if="isSchool">
 									<Select v-model="evaluationInfo.paperPeriod" @on-change="onPeriodChange">
 										<Option v-for="(period,index) in schoolInfo.period" :value="index" :key="index">{{ period.name }}</Option>
 									</Select>
 								</FormItem>
-								<FormItem label="选择年级" prop="publish" v-if="isSchool">
-									<Select v-model="evaluationInfo.paperGrade" multiple placeholder="不选择则默认选中全部年级">
+								<FormItem :label="$t('evaluation.newExercise.chooseGrade')" prop="publish" v-if="isSchool">
+									<Select v-model="evaluationInfo.paperGrade" multiple :placeholder="$t('evaluation.newExercise.gradePlaceholder')">
 										<Option v-for="(grade,index) in gradeList" :value="grade.id" :key="index">{{ grade.name }}</Option>
 									</Select>
 								</FormItem>
-								<FormItem label="选择科目" class="dark-iview-select" v-if="isSchool">
+								<FormItem :label="$t('evaluation.newExercise.chooseSubject')" class="dark-iview-select" v-if="isSchool">
 									<Select v-model="evaluationInfo.paperSubject">
 										<Option v-for="(subject,index) in subjectList" :value="index" :key="index">{{ subject.name }}</Option>
 									</Select>
 								</FormItem>
-								<FormItem label="试卷总分" prop="name" class="evaluation-attr-wrap-inputNumber">
+								<FormItem :label="$t('evaluation.paperList.paperScore')" prop="name" class="evaluation-attr-wrap-inputNumber">
 									<InputNumber :max="200" :min="1" v-model="evaluationInfo.score"></InputNumber>
 								</FormItem>
 							</Form>
@@ -56,19 +56,19 @@
 									<Radio label="import" v-if="!isEditPaper">试题导入</Radio>
 								</RadioGroup>
 							</div> -->
-							<p class="save-tips">* 温馨提示:当前试卷将以 {{ viewModel === 'list' ? '题目顺序' : '题型顺序' }} 方式保存</p>
+							<p class="save-tips">* {{ viewModel === 'list' ? $t('evaluation.paperList.saveRule1') : $t('evaluation.paperList.saveRule2') }} </p>
 							<Tabs v-model="activeTab" type="card" class="question-main-tabs" name="createTest">
-								<TabPane label="组题条件" name="auto" v-if="evaluationInfo.createType == 'auto'" :index="1" tab="createTest">
+								<TabPane :label="$t('evaluation.paperList.tab1')" name="auto" v-if="evaluationInfo.createType == 'auto'" :index="1" tab="createTest">
 									<AutoCreate :subject="propSubject" :period="propPeriod" @goToPreview="goToPreview" @autoQuestions="getAutoQuestions"></AutoCreate>
 								</TabPane>
-								<TabPane label="备选题目" name="manual" v-if="evaluationInfo.createType == 'manual'" :index="2" tab="createTest">
+								<TabPane :label="$t('evaluation.paperList.tab2')" name="manual" v-if="evaluationInfo.createType == 'manual'" :index="2" tab="createTest">
 									<ManualCreate :questionList="questionList" :subjectCode="propSubject" :periodCode="propPeriod" :selQue="evaluationInfo.item" @goToPreview="goToPreview"
 									 @selectedQuestion="getSelectedQuestion"></ManualCreate>
 								</TabPane>
-								<TabPane :label="evaluationInfo.item.length ? '重新导入' : '导入试题'" name="import" v-if="evaluationInfo.createType == 'import'" :index="3" tab="createTest">
+								<TabPane :label="evaluationInfo.item.length ? $t('evaluation.paperList.tab3') : $t('evaluation.paperList.tab4')" name="import" v-if="evaluationInfo.createType == 'import'" :index="3" tab="createTest">
 									<BaseImport @importFinish="onImportFinish"></BaseImport>
 								</TabPane>
-								<TabPane label="试题预览" name="preview" :index="4" tab="createTest">
+								<TabPane :label="$t('evaluation.paperList.tab5')" name="preview" :index="4" tab="createTest">
 									<!--<TeacherPreview :testPaper="evaluationInfo.testPaper[currentSubjectIndex]" :paperName="evaluationInfo.name"></TeacherPreview>-->
 									<vuescroll ref="paperRef" @handle-scroll="handleScroll">
 										<TestPaper v-if="!examAnalysisStatus" :paper="evaluationInfo" :class="examAnalysisStatus ? '':'animated fadeIn'"
@@ -77,7 +77,7 @@
 										 :testPaper="evaluationInfo"></ExamPaperAnalysis>
 									</vuescroll>
 								</TabPane>
-								<TabPane label="学生作答预览" name="student" :index="5" tab="createTest">
+								<TabPane :label="$t('evaluation.paperList.tab6')" name="student" :index="5" tab="createTest">
 									<StudentPreview></StudentPreview>
 								</TabPane>
 							</Tabs>
@@ -135,7 +135,7 @@
 				questionList: [],
 				currentSubjectIndex: 0,
 				evaluationInfo: {
-					name: '预设试卷名称',
+					name: this.$t('evaluation.paperList.defaultName'),
 					target: [],
 					type: 'private',
 					publish: '',
@@ -326,8 +326,6 @@
 					this.$Modal.confirm({
 						title: '温馨提示',
 						content: '<p>切换组题方式会清空当前所选试题,是否继续?</p>',
-						okText: '确认',
-						cancelText: '取消',
 						onOk: () => {
 							this.evaluationInfo.item = []
 							this.$refs.testPaper.$refs.exList.errorList = []
@@ -490,7 +488,7 @@
 						})
 					}).catch(err => {
 						console.log(err)
-						this.$Message.error('操作失败')
+						this.$Message.error(this.$t('evaluation.paperList.saveItemsFailTip'))
 					})
 				})
 			},
@@ -513,7 +511,7 @@
 							r(res)
 						} else {
 							j(res)
-							this.$Message.error('服务器繁忙!')
+							this.$Message.error(this.$t('evaluation.paperList.saveItemsFailTip'))
 						}
 
 					})
@@ -569,7 +567,7 @@
 				let list = this.evaluationInfo.item
 				this.$refs.testPaper.isShowAnalysis = false
 				if (this.evaluationInfo.name.trim() === '') {
-					this.$Message.warning('试卷名称不能为空!')
+					this.$Message.warning(this.$t('evaluation.paperList.emptyNameTip'))
 					return
 				}
 				if (!hasErrorItem) {
@@ -587,20 +585,18 @@
 									})
 									if (!this.checkComposeScore(arr)) return
 									if (isContainerFull) {
-										this.$Message.warning('空间已满!')
+										this.$Message.warning(this.$t('evaluation.paperList.noSpaceTip'))
 									} else {
 										let saveArr = this.viewModel === 'type' ? arr : list
 										this.doSavePaper(saveArr)
 									}
 								} else {
-									this.$Message.warning('未选择任何试题!')
+									this.$Message.warning(this.$t('evaluation.paperList.noItemTip'))
 								}
 							} else {
 								this.$Modal.confirm({
-									title: '温馨提示',
-									content: '<p>试卷库已存在重复名称试卷,是否继续保存覆盖原试卷?</p>',
-									okText: '确认',
-									cancelText: '取消',
+									title: this.$t('evaluation.newExercise.modalTip'),
+									content: this.$t('evaluation.paperList.isExistPaperTip'),
 									onOk: async () => {
 										// 拿到题型顺序的试题数组进行拼接
 										let arr = []
@@ -613,7 +609,7 @@
 										let files = blobList.blobList.map(i => i.blob)
 										this.onDeleteBlobPaper(files).then(r => {
 											if (isContainerFull) {
-												this.$Message.warning('空间已满!')
+												this.$Message.warning(this.$t('evaluation.paperList.noSpaceTip'))
 											} else {
 												let saveArr = this.viewModel === 'type' ? arr : list
 												this.doSavePaper(saveArr)
@@ -622,20 +618,20 @@
 									},
 									onCancel: () => {
 										this.isLoading = false
-										this.$Message.warning('取消保存试卷')
+										this.$Message.warning(this.$t('evaluation.paperList.cancelSaveTip'))
 									}
 								})
 							}
 						} else {
-							this.$Message.warning(`存在未配分的题目,请配分后再保存!`)
+							this.$Message.warning(this.$t('evaluation.paperList.hasNoScoreTip'))
 							this.isLoading = false
 						}
 					} else {
-						this.$Message.warning(`保存前请确认试卷配分是否与试卷总分一致!`)
+						this.$Message.warning(this.$t('evaluation.paperList.noCompleteScoreTip'))
 						this.isLoading = false
 					}
 				} else {
-					this.$Message.warning(`存在异常试题,请修改或者重新导入!`)
+					this.$Message.warning(this.$t('evaluation.paperList.hasErrorItemTip'))
 					this.isLoading = false
 				}
 			},
@@ -803,7 +799,7 @@
 								this.$api.learnActivity.SaveExamPaper(params).then(
 									res => {
 										if (res.error == null) {
-											this.$Message.success(this.isEditPaper ? '编辑成功' : '保存成功')
+											this.$Message.success(this.isEditPaper ? this.$t('evaluation.paperList.editSuc') : this.$t('evaluation.paperList.saveSuc'))
 											this.isLoading = false
 											this.$router.push({
 												name: this.evaluationInfo.type === 'private' ? 'personalBank' : 'schoolBank',
@@ -812,12 +808,12 @@
 												}
 											})
 										} else {
-											this.$Message.error('保存试卷失败')
+											this.$Message.error(this.$t('evaluation.paperList.saveFail'))
 											this.isLoading = false
 										}
 									},
 									err => {
-										this.$Message.error('保存试卷失败')
+										this.$Message.error(this.$t('evaluation.paperList.saveFail'))
 										this.isLoading = false
 									}
 								)

+ 6 - 207
TEAMModelOS/ClientApp/src/view/student-web/App.vue

@@ -26,16 +26,16 @@
                                 </a>
                             </li>
                             <DropdownMenu slot="list">
-                                <DropdownItem :name="'teacher'">教师</DropdownItem>
-                                <DropdownItem :name="'student'">{{ '學生' }}</DropdownItem>
+                                <DropdownItem :name="'teacher'">{{$t("studentWeb.home.teacher")}}</DropdownItem>
+                                <DropdownItem :name="'student'">{{$t("studentWeb.home.student")}}</DropdownItem>
                             </DropdownMenu>
                         </Dropdown>
                         <li class="profile-pop-item">
                             <svg-icon icon-class="setting"
-                                      class="profile-pop-itemIcon1" />{{ $t("studentWeb.setting") }}
+                                      class="profile-pop-itemIcon1" />{{ $t("studentWeb.home.setting") }}
                         </li>
                         <li class="profile-pop-item" @click="onQuit">
-                            <svg-icon icon-class="logout" class="profile-pop-itemIcon2" />{{$t("studentWeb.logout")}}
+                            <svg-icon icon-class="logout" class="profile-pop-itemIcon2" />{{$t("studentWeb.home.logout")}}
                         </li>
                     </div>
                 </span>
@@ -44,132 +44,6 @@
                         <span class="info-badge" v-if="MyNo != 6"></span>
                         <svg-icon icon-class="bell" class="tabIcon1" />
                     </MenuItem>
-                    <!--通知彈窗區域-->
-                    <!--<div id="info-pop" v-if="isClickInfoPop == false">
-                      <span class="info-pop-triangle"></span>
-                      <div class="list">
-                        <div class="info-pop-title">
-                          {{ $t("studentWeb.latestNotification") }}
-                        </div>
-                        <Scroll
-                          class="list-block"
-                          :on-reach-bottom="handleReachBottom"
-                          :loading-text="
-                            mockdata.length == 69
-                              ? $t('studentWeb.missionListCardReachBottom')
-                              : $t('studentWeb.missionListCardLoading')
-                          "
-                        >
-                          <li
-                            class="list-item"
-                            v-for="(item, index) in mockdata"
-                            @click="gotoTargetItemPage(item)"
-                            :key="index"
-                          >
-                            <ul>
-                              <li class="list-item-icon">
-                                <svg-icon
-                                  v-if="item.eventType == '作業'"
-                                  icon-class="doc"
-                                />
-                                <svg-icon
-                                  v-if="item.eventType == '課前預習'"
-                                  icon-class="selflearninginTime"
-                                />
-                                <svg-icon
-                                  v-if="
-                                    item.eventType == '評量' &&
-                                    item.eventSubject != '綜合學科'
-                                  "
-                                  icon-class="test"
-                                  class="reset-testIcon"
-                                />
-                                <svg-icon
-                                  v-if="
-                                    item.eventType == '評量' &&
-                                    item.eventSubject == '綜合學科'
-                                  "
-                                  icon-class="multiTest"
-                                />
-                                <svg-icon
-                                  v-if="item.eventType == '教師私訊'"
-                                  icon-class="message"
-                                />
-                                <svg-icon
-                                  v-if="item.eventType == '投票'"
-                                  icon-class="vote"
-                                />
-                                <svg-icon
-                                  v-if="item.eventType == '公告'"
-                                  icon-class="slide"
-                                />
-                                <svg-icon
-                                  v-if="item.eventType == 'Hiteach電子筆記'"
-                                  icon-class="hiteach"
-                                />
-                                <svg-icon
-                                  v-if="item.eventType == '問卷'"
-                                  icon-class="quesnaire"
-                                />
-                              </li>
-                              <li
-                                class="list-item-info"
-                                :class="{
-                                  'list-item-infonofeedback': isNoFeedback(item),
-                                }"
-                              >
-                                <p
-                                  class="list-item-title"
-                                  :class="{
-                                    'list-item-titleEn': getCurrentLang() == 'en',
-                                  }"
-                                >
-                                  <span
-                                    class="list-item-typeMark"
-                                    v-if="getCurrentLang() == 'tw'"
-                                    >{{ item.eventType }}</span
-                                  >
-                                  <span
-                                    class="list-item-typeMark"
-                                    v-if="getCurrentLang() == 'en'"
-                                    >{{ transTypetoEn(item.eventType) }}</span
-                                  >
-
-                                  <span>{{ item.eventName }}</span>
-                                </p>
-                                <p class="list-item-time">
-                                  <span class="teacher-name">{{ item.teacher }}</span>
-                                  {{ $t("studentWeb.postAt") }} {{ item.endTime }} 14:20
-                                </p>
-                              </li>
-                              <li class="list-item-isDone" v-if="item.isDone == true">-->
-                    <!---可能產生反饋的圖示-->
-                    <!--<div
-                      class="done-feedback"
-                      v-show="item.eventType == '投票'"
-                    >-->
-                    <!--svg-icon class="feedback-icon" icon-class="voteStatic" /-->
-                    <!--<div class="score-num">B</div>
-                    </div>
-                    <div
-                      class="done-feedback"
-                      v-show="item.eventType == '評量'"
-                    >
-                      <span class="score-num">{{ randomScore() }}</span>
-                    </div>
-                    <div
-                      class="done-feedback"
-                      v-show="item.eventType == '作業'"
-                    >
-                      <span class="score-num">{{ randomScore() }}</span>
-                    </div>-->
-                    <!---可能產生反饋的圖示-->
-                    <!--</li>
-                            </ul>
-                          </li>
-                        </Scroll>
-                      </div>
-                    </div>-->
                 </span>
                 <!--通知彈窗區域-->
                 <MenuItem name="5" @click.native="noData">
@@ -187,7 +61,7 @@
                 <button class="addcoursebtn"
                         @click='sentcourseID()'
                         v-if="MyName == this.$t('studentWeb.courseList-title')">
-                    加入課程
+                    {{$t("studentWeb.home.joinClass")}}
                 </button>
 
                 <input maxlength="6"
@@ -215,9 +89,6 @@
 
 <script>
     import jwtDecode from 'jwt-decode'
-    import { Random } from "mockjs";
-    import mockdata from "@/api/newData";
-    import mockdataEn from "@/api/newDataEn";
     import SmallNavBar from "@/components/student-web/SmallNavBar";
     import PersonalPhoto from '@/components/public/personalPhoto/Index.vue'
     export default {
@@ -243,7 +114,6 @@
                 bgc: "red",
                 active: false,
                 mockdata: "",
-                eventPageType: ["課前預習", "評量", "作業", "投票", "問卷"], //活動頁出現的類型
                 isClickInfoPop: false,
                 isTyping: false,
                 curRole: '',
@@ -254,11 +124,11 @@
         },
         computed: {
             getRoleName() {
-                console.log('用户权限',this.curRole)
                 return val => {
                     return val === 'student' ? '学生' : '教师'
                 }
             },
+            //判断用户权限
             isTeacher() {
                 let state = false
                 if (this.users.roles.length) {
@@ -299,61 +169,15 @@
             clearInput() {
                 this.courseID = "";
             },
-            isNoFeedback(item) {
-                return (
-                    (item.isDone == false && item.endTime > "2020.02.10") ||
-                    item.eventType == "教師私訊" ||
-                    item.eventType == "Hiteach電子筆記" ||
-                    item.eventType == "公告"
-                );
-            },
-            getCurrentLang() {
-                return localStorage.getItem("lang");
-            },
-            createMockdataOriginal: function () {
-                if (localStorage.getItem("lang") == "en") {
-                    this.mockdataOriginal = mockdataEn.eventList;
-                } else this.mockdataOriginal = mockdata.eventList;
-                localStorage.setItem('lang', "tw")
-            },
-            createMockdata: function () {
-                if (localStorage.getItem("lang") == "en") {
-                    this.mockdata = mockdataEn.eventList.slice(0, 6);
-                } else this.mockdata = mockdata.eventList.slice(0, 6);
-            },
-            handleReachBottom() {
-                return new Promise((resolve) => {
-                    setTimeout(() => {
-                        for (let i = 1; i < 11 && this.mockdata.length < this.mockdataOriginal.length - 1; i++) {
-                            //小於原始資料總長度在加入空陣列
-                            this.mockdata.push(this.mockdataOriginal[this.mockdata.length + 1]);
-                        }
-                        resolve();
-                    }, 1000);
-                });
-            },
-            transTypetoEn(type) {
-                if (type == "投票") return "Vote";
-                else if (type == "評量") return "Exam";
-                else if (type == "作業") return "Homework";
-                else if (type == "課前預習") return "Preview";
-                else if (type == "公告") return "Billboard";
-                else if (type == "教師私訊") return "Message";
-                else if (type == "Hiteach電子筆記") return "HiTeach Note";
-            },
             onResize() {
                 this.windowWidth = window.innerWidth;
                 this.windowHeight = window.innerHeight;
             },
             pagebgc() {
-                //console.log(this.MyName)
                 if (this.MyNo == "1") {
                     return "#f0f0f0";
                 }
             },
-            randomScore: function () {
-                return Random.integer(70, 96);
-            },
             mouseOver: function () {
                 this.active = !this.active;
             },
@@ -367,7 +191,6 @@
             },
             noData() {
                 this.$Message.warning('此功能暂未开放!')
-
             },
             reload() {
                 this.isRouterAlive = false;
@@ -379,30 +202,6 @@
             },
             getNavName: function (MyName) {
                 this.MyName = MyName;
-                console.log('myname', this.MyName)
-                console.log('myname', this.MyNo)
-            },
-            gotoTargetItemPage(item) {
-                this.$store.commit("ChangeItemName", item);
-                this.isClickInfoPop = true;
-                this.$store.commit("SetisFromInfoPoptpScroll", true);
-                if (this.eventPageType.includes(item.eventType)) {
-                    this.$router.push("/eventView#" + item.eventID);
-                }
-                if (item.eventType == "Hiteach電子筆記") {
-                    //this.$router.push("/hiteachView");
-                    this.$Message.warning('此功能暂未开放!')
-
-                }
-                if (item.eventType == "公告" || item.eventType == "教師私訊") {
-                    //this.$router.push("/informView");
-                    this.$Message.warning('此功能暂未开放!')
-
-                }
-                //點擊後先將彈窗關閉,待跳轉過去才能在顯示彈窗
-                setTimeout(() => {
-                    this.isClickInfoPop = false;
-                }, 1000);
             },
             getUsers() {
                 this.users = JSON.parse(decodeURIComponent(localStorage.userInfo, "utf-8"));