Browse Source

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

zhouj1203@hotmail.com 3 years ago
parent
commit
c61ad37e74
47 changed files with 1450 additions and 761 deletions
  1. 4 0
      TEAMModelOS.SDK/Models/Cosmos/Common/SheetConfig.cs
  2. 302 3
      TEAMModelOS/ClientApp/src/assets/iconfont/demo_index.html
  3. 55 3
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.css
  4. 1 1
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.js
  5. 91 0
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.json
  6. BIN
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.ttf
  7. BIN
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff
  8. BIN
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff2
  9. 95 3
      TEAMModelOS/ClientApp/src/common/BaseLayout.vue
  10. 37 19
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventList.vue
  11. 19 1
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/MissionListCard.vue
  12. 9 2
      TEAMModelOS/ClientApp/src/components/vote/BaseVoteSsTable.vue
  13. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/en-US/cusMgt.js
  14. 5 1
      TEAMModelOS/ClientApp/src/locale/lang/en-US/home.js
  15. 2 1
      TEAMModelOS/ClientApp/src/locale/lang/en-US/studentWeb.js
  16. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/cusMgt.js
  17. 5 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/home.js
  18. 2 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/studentWeb.js
  19. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/cusMgt.js
  20. 5 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/home.js
  21. 2 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/studentWeb.js
  22. 17 3
      TEAMModelOS/ClientApp/src/store/module/answerSheet.js
  23. 11 1
      TEAMModelOS/ClientApp/src/utils/js-fn.js
  24. 2 2
      TEAMModelOS/ClientApp/src/utils/sheetConfig.js
  25. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.vue
  26. 77 55
      TEAMModelOS/ClientApp/src/view/homepage/AcCountPie.vue
  27. 14 5
      TEAMModelOS/ClientApp/src/view/homepage/HomePage.less
  28. 87 54
      TEAMModelOS/ClientApp/src/view/homepage/HomePage.vue
  29. 3 3
      TEAMModelOS/ClientApp/src/view/learnactivity/CreatePrivEva.vue
  30. 6 0
      TEAMModelOS/ClientApp/src/view/learnactivity/PaperScore.vue
  31. 1 1
      TEAMModelOS/ClientApp/src/view/learnactivity/Scoring.vue
  32. 11 2
      TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.less
  33. 9 5
      TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.vue
  34. 16 13
      TEAMModelOS/ClientApp/src/view/newsheet/BaseSvgBg.vue
  35. 3 2
      TEAMModelOS/ClientApp/src/view/newsheet/BaseTitleEditor.vue
  36. 339 292
      TEAMModelOS/ClientApp/src/view/newsheet/SheetBaseInfo.vue
  37. 32 3
      TEAMModelOS/ClientApp/src/view/newsheet/SheetObjective.vue
  38. 5 4
      TEAMModelOS/ClientApp/src/view/newsheet/index.vue
  39. 42 38
      TEAMModelOS/ClientApp/src/view/student-web/App.vue
  40. 116 229
      TEAMModelOS/ClientApp/src/view/teachcontent/index.vue
  41. 12 6
      TEAMModelOS/ClientApp/src/view/vote/ManageVote.vue
  42. 1 0
      TEAMModelOS/Controllers/Common/SurveyController.cs
  43. 2 0
      TEAMModelOS/Controllers/Common/VoteController.cs
  44. 0 1
      TEAMModelOS/Controllers/School/CourseController.cs
  45. 2 0
      TEAMModelOS/Controllers/Teacher/InitController.cs
  46. 1 0
      TEAMModelOS/Controllers/XTest/FixDataController.cs
  47. 3 3
      TEAMModelOS/TEAMModelOS.csproj

+ 4 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/SheetConfig.cs

@@ -42,6 +42,10 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Common
         public List<JsonElement> infoPos{ get; set; } = new List<JsonElement>();
         public List<JsonElement> objectivePos { get; set; } = new List<JsonElement>();
         /// <summary>
+        /// 答题卡是A3 A4纸张
+        /// </summary>
+        public string mode { get; set; }
+        /// <summary>
         /// 页码块数量
         /// </summary>
         public int pageNumBlockCount { get; set; }

+ 302 - 3
TEAMModelOS/ClientApp/src/assets/iconfont/demo_index.html

@@ -54,6 +54,84 @@
       <div class="content unicode" style="display: block;">
           <ul class="icon_lists dib-box">
           
+            <li class="dib">
+              <span class="icon iconfont">&#xe648;</span>
+                <div class="name">文档</div>
+                <div class="code-name">&amp;#xe648;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe78f;</span>
+                <div class="name">视频 播放 影片</div>
+                <div class="code-name">&amp;#xe78f;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe64b;</span>
+                <div class="name">音频</div>
+                <div class="code-name">&amp;#xe64b;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe64c;</span>
+                <div class="name">其他</div>
+                <div class="code-name">&amp;#xe64c;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe70a;</span>
+                <div class="name">云盘</div>
+                <div class="code-name">&amp;#xe70a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe71c;</span>
+                <div class="name">选择</div>
+                <div class="code-name">&amp;#xe71c;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe63d;</span>
+                <div class="name">手指上</div>
+                <div class="code-name">&amp;#xe63d;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6a6;</span>
+                <div class="name">线上</div>
+                <div class="code-name">&amp;#xe6a6;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe644;</span>
+                <div class="name">目标考核管理</div>
+                <div class="code-name">&amp;#xe644;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe645;</span>
+                <div class="name">诊断</div>
+                <div class="code-name">&amp;#xe645;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe646;</span>
+                <div class="name">3_3综合素养</div>
+                <div class="code-name">&amp;#xe646;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe7ae;</span>
+                <div class="name">精品课堂</div>
+                <div class="code-name">&amp;#xe7ae;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe63c;</span>
+                <div class="name">政策</div>
+                <div class="code-name">&amp;#xe63c;</div>
+              </li>
+          
             <li class="dib">
               <span class="icon iconfont">&#xe652;</span>
                 <div class="name">谷歌_google114</div>
@@ -828,9 +906,9 @@
 <pre><code class="language-css"
 >@font-face {
   font-family: 'iconfont';
-  src: url('iconfont.woff2?t=1625740015353') format('woff2'),
-       url('iconfont.woff?t=1625740015353') format('woff'),
-       url('iconfont.ttf?t=1625740015353') format('truetype');
+  src: url('iconfont.woff2?t=1628756740623') format('woff2'),
+       url('iconfont.woff?t=1628756740623') format('woff'),
+       url('iconfont.ttf?t=1628756740623') format('truetype');
 }
 </code></pre>
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -856,6 +934,123 @@
       <div class="content font-class">
         <ul class="icon_lists dib-box">
           
+          <li class="dib">
+            <span class="icon iconfont icon-document"></span>
+            <div class="name">
+              文档
+            </div>
+            <div class="code-name">.icon-document
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-video-outline"></span>
+            <div class="name">
+              视频 播放 影片
+            </div>
+            <div class="code-name">.icon-video-outline
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-audio-outline"></span>
+            <div class="name">
+              音频
+            </div>
+            <div class="code-name">.icon-audio-outline
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-other-grad"></span>
+            <div class="name">
+              其他
+            </div>
+            <div class="code-name">.icon-other-grad
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-yunpan"></span>
+            <div class="name">
+              云盘
+            </div>
+            <div class="code-name">.icon-yunpan
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-choose-arrow"></span>
+            <div class="name">
+              选择
+            </div>
+            <div class="code-name">.icon-choose-arrow
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-handle-down"></span>
+            <div class="name">
+              手指上
+            </div>
+            <div class="code-name">.icon-handle-down
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-online"></span>
+            <div class="name">
+              线上
+            </div>
+            <div class="code-name">.icon-online
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-assess"></span>
+            <div class="name">
+              目标考核管理
+            </div>
+            <div class="code-name">.icon-assess
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-diagnosis"></span>
+            <div class="name">
+              诊断
+            </div>
+            <div class="code-name">.icon-diagnosis
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-literacy"></span>
+            <div class="name">
+              3_3综合素养
+            </div>
+            <div class="code-name">.icon-literacy
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-cus-video"></span>
+            <div class="name">
+              精品课堂
+            </div>
+            <div class="code-name">.icon-cus-video
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-policy"></span>
+            <div class="name">
+              政策
+            </div>
+            <div class="code-name">.icon-policy
+            </div>
+          </li>
+          
           <li class="dib">
             <span class="icon iconfont icon-google"></span>
             <div class="name">
@@ -2017,6 +2212,110 @@
       <div class="content symbol">
           <ul class="icon_lists dib-box">
           
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-document"></use>
+                </svg>
+                <div class="name">文档</div>
+                <div class="code-name">#icon-document</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-video-outline"></use>
+                </svg>
+                <div class="name">视频 播放 影片</div>
+                <div class="code-name">#icon-video-outline</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-audio-outline"></use>
+                </svg>
+                <div class="name">音频</div>
+                <div class="code-name">#icon-audio-outline</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-other-grad"></use>
+                </svg>
+                <div class="name">其他</div>
+                <div class="code-name">#icon-other-grad</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-yunpan"></use>
+                </svg>
+                <div class="name">云盘</div>
+                <div class="code-name">#icon-yunpan</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-choose-arrow"></use>
+                </svg>
+                <div class="name">选择</div>
+                <div class="code-name">#icon-choose-arrow</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-handle-down"></use>
+                </svg>
+                <div class="name">手指上</div>
+                <div class="code-name">#icon-handle-down</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-online"></use>
+                </svg>
+                <div class="name">线上</div>
+                <div class="code-name">#icon-online</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-assess"></use>
+                </svg>
+                <div class="name">目标考核管理</div>
+                <div class="code-name">#icon-assess</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-diagnosis"></use>
+                </svg>
+                <div class="name">诊断</div>
+                <div class="code-name">#icon-diagnosis</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-literacy"></use>
+                </svg>
+                <div class="name">3_3综合素养</div>
+                <div class="code-name">#icon-literacy</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-cus-video"></use>
+                </svg>
+                <div class="name">精品课堂</div>
+                <div class="code-name">#icon-cus-video</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-policy"></use>
+                </svg>
+                <div class="name">政策</div>
+                <div class="code-name">#icon-policy</div>
+            </li>
+          
             <li class="dib">
                 <svg class="icon svg-icon" aria-hidden="true">
                   <use xlink:href="#icon-google"></use>

+ 55 - 3
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 2000444 */
-  src: url('iconfont.woff2?t=1625740015353') format('woff2'),
-       url('iconfont.woff?t=1625740015353') format('woff'),
-       url('iconfont.ttf?t=1625740015353') format('truetype');
+  src: url('iconfont.woff2?t=1628756740623') format('woff2'),
+       url('iconfont.woff?t=1628756740623') format('woff'),
+       url('iconfont.ttf?t=1628756740623') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,58 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-document:before {
+  content: "\e648";
+}
+
+.icon-video-outline:before {
+  content: "\e78f";
+}
+
+.icon-audio-outline:before {
+  content: "\e64b";
+}
+
+.icon-other-grad:before {
+  content: "\e64c";
+}
+
+.icon-yunpan:before {
+  content: "\e70a";
+}
+
+.icon-choose-arrow:before {
+  content: "\e71c";
+}
+
+.icon-handle-down:before {
+  content: "\e63d";
+}
+
+.icon-online:before {
+  content: "\e6a6";
+}
+
+.icon-assess:before {
+  content: "\e644";
+}
+
+.icon-diagnosis:before {
+  content: "\e645";
+}
+
+.icon-literacy:before {
+  content: "\e646";
+}
+
+.icon-cus-video:before {
+  content: "\e7ae";
+}
+
+.icon-policy:before {
+  content: "\e63c";
+}
+
 .icon-google:before {
   content: "\e652";
 }

File diff suppressed because it is too large
+ 1 - 1
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.js


+ 91 - 0
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.json

@@ -5,6 +5,97 @@
   "css_prefix_text": "icon-",
   "description": "",
   "glyphs": [
+    {
+      "icon_id": "554016",
+      "name": "文档",
+      "font_class": "document",
+      "unicode": "e648",
+      "unicode_decimal": 58952
+    },
+    {
+      "icon_id": "688102",
+      "name": "视频 播放 影片",
+      "font_class": "video-outline",
+      "unicode": "e78f",
+      "unicode_decimal": 59279
+    },
+    {
+      "icon_id": "1391286",
+      "name": "音频",
+      "font_class": "audio-outline",
+      "unicode": "e64b",
+      "unicode_decimal": 58955
+    },
+    {
+      "icon_id": "9697596",
+      "name": "其他",
+      "font_class": "other-grad",
+      "unicode": "e64c",
+      "unicode_decimal": 58956
+    },
+    {
+      "icon_id": "13479229",
+      "name": "云盘",
+      "font_class": "yunpan",
+      "unicode": "e70a",
+      "unicode_decimal": 59146
+    },
+    {
+      "icon_id": "20567897",
+      "name": "选择",
+      "font_class": "choose-arrow",
+      "unicode": "e71c",
+      "unicode_decimal": 59164
+    },
+    {
+      "icon_id": "2226561",
+      "name": "手指上",
+      "font_class": "handle-down",
+      "unicode": "e63d",
+      "unicode_decimal": 58941
+    },
+    {
+      "icon_id": "2552606",
+      "name": "线上",
+      "font_class": "online",
+      "unicode": "e6a6",
+      "unicode_decimal": 59046
+    },
+    {
+      "icon_id": "7171140",
+      "name": "目标考核管理",
+      "font_class": "assess",
+      "unicode": "e644",
+      "unicode_decimal": 58948
+    },
+    {
+      "icon_id": "8780649",
+      "name": "诊断",
+      "font_class": "diagnosis",
+      "unicode": "e645",
+      "unicode_decimal": 58949
+    },
+    {
+      "icon_id": "9074037",
+      "name": "3_3综合素养",
+      "font_class": "literacy",
+      "unicode": "e646",
+      "unicode_decimal": 58950
+    },
+    {
+      "icon_id": "18486382",
+      "name": "精品课堂",
+      "font_class": "cus-video",
+      "unicode": "e7ae",
+      "unicode_decimal": 59310
+    },
+    {
+      "icon_id": "18043205",
+      "name": "政策",
+      "font_class": "policy",
+      "unicode": "e63c",
+      "unicode_decimal": 58940
+    },
     {
       "icon_id": "634377",
       "name": "谷歌_google114",

BIN
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.ttf


BIN
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff


BIN
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff2


+ 95 - 3
TEAMModelOS/ClientApp/src/common/BaseLayout.vue

@@ -122,6 +122,7 @@
     </div>
 </template>
 <script>
+import jwtDecode from 'jwt-decode'
 export default {
     data() {
         return {
@@ -477,7 +478,62 @@ export default {
         changeMenuStatus() {
             this.$refs.side1.toggleCollapse()
             this.$EventBus.$emit('onCollapseChange', this.isCollapsed)
-        }
+        },
+        // 获取账号详细信息,用来验证大陆站用户是否完成手机号绑定
+        getIdInfo() {
+            let host = this.$store.state.config.China.coreAPIUrl
+            let clientId = this.$store.state.config.China.clientID
+            let idToken = localStorage.getItem('id_token')
+            let tokenData = jwtDecode(idToken)
+            let nonce = tokenData ? tokenData.nonce : ''
+            let params = {
+                "grant_type": "get",
+                "nonce": nonce,
+                "client_id": clientId,
+                "id_token": idToken
+            }
+            this.$api.service.getIdProfile(host, params).then(
+                res => {
+                    console.log(res)
+                    if (!res.error) {
+                        if (!res.mobile) {
+                            this.$Notice.warning({
+                                title: this.$t('home.verifyPhTitle'),
+                                duration: 0,
+                                render: (h, params) => {
+                                    return h('span', {
+                                        style: {
+                                            color: 'red'
+                                        }
+                                    }, [
+                                        h('span', this.$t('home.verifyPh')+', '),
+                                        h('a', {
+                                            domProps: {
+                                                innerHTML: this.$t('home.toPhone')
+                                            },
+                                            on: {
+                                                'click': () => {
+                                                    this.$router.push({
+                                                        path: '/home/userCenter'
+                                                    })
+                                                }
+                                            }
+                                        })
+                                    ])
+                                }
+                            })
+                        } else {
+                            this.hasVerify = true
+                        }
+                    } else {
+                        this.$Message.error('API Error')
+                    }
+                },
+                err => {
+                    console.log(err)
+                }
+            )
+        },
     },
     computed: {
         rotateIcon() {
@@ -493,9 +549,9 @@ export default {
                 } else if (!this.$store.state.userInfo.hasSchool) {
                     // 没有加入学校,但是有申请中的学校 
                     let requestSchool = this.$store.state.user.userProfile.schools
-                    
+
                     return requestSchool.length ? `${requestSchool[0].name}(${this.$t('settings.status3')})` : this.$t('system.menu.noSchool2')
-                }else{
+                } else {
                     return ''
                 }
             }
@@ -511,6 +567,42 @@ export default {
             }
             this.isShowLogo = cloudSetting.logoStatus === 'open'
         }
+        this.srvAdr = this.$store.state.config.srvAdr
+        //只有大陆站才验证手机号
+        if (this.srvAdr == 'China') {
+            this.getIdInfo()
+        } else {
+            this.hasVerify = true
+        }
+        //判断是否绑定手机、加入学校
+        this.$Notice.destroy()
+        if (!this.$store.state.userInfo.hasSchool) {
+            this.$Notice.warning({
+                title: this.$t('home.verifySchoolTitle'),
+                duration: 0,
+                render: (h, params) => {
+                    return h('span', {
+                        style: {
+                            color: 'red'
+                        }
+                    }, [
+                        h('span', this.$t('home.verifySchool') + ' ,'),
+                        h('a', {
+                            domProps: {
+                                innerHTML: this.$t('home.toSchool')
+                            },
+                            on: {
+                                'click': () => {
+                                    this.$router.push({
+                                        path: '/home/settings'
+                                    })
+                                }
+                            }
+                        })
+                    ])
+                }
+            })
+        }
     },
     mounted() {
         this.$EventBus.$off('onLogoStatusChange')

+ 37 - 19
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventList.vue

@@ -48,28 +48,14 @@
                         >
                             <svg-icon :icon-class="iconBtn.iconClass"
                                       class="innerIcon"
-                                      :class="`Icon-${index + 1}`" />
+                                      :class="`Icon-${index + 1}`" 
+                            />
+                            <div class="dev-top" v-if="iconBtn.eventType == 'Preview' || iconBtn.eventType == 'HomeWork'">
+                                <span class="develop">{{ $t("studentWeb.public.develop") }}</span>
+                            </div>
                         </Radio>
                     </RadioGroup>
                 </div>
-                <!-- <ul class="icon-selector" v-if="hideIconbtn == false">
-                    <li class="icon-btn"
-                        @click="selectAllType()"
-                        :class="{'icon-btn-selected': eventTypeCheckers == ''}">
-                        <svg-icon icon-class="alltext" class="innerIcon Icon-0" />
-                    </li>
-                    <label v-for="(iconBtn, index) in typeNametoIcon" :key="index">
-                        <input type="checkbox"
-                               :value="iconBtn.eventType"
-                               v-model="eventTypeCheckers"
-                               @change="predealMockdatafirstItem()" />
-                        <li class="icon-btn">
-                            <svg-icon :icon-class="iconBtn.iconClass"
-                                      class="innerIcon"
-                                      :class="`Icon-${index + 1}`" />
-                        </li>
-                    </label>
-                </ul> -->
                 <!---按鈕搜尋區(多選)--->
             </div>
             <!--活動清單分頁-->
@@ -607,3 +593,35 @@ import { mapGetters, mapState } from 'vuex';
     @import "~@/assets/student-web/component_styles/event-list.css";
     @import "~@/assets/student-web/component_styles/event-list-new.css";
 </style>
+
+<style lang="less" scoped>
+.icon-selector{
+    .ivu-radio-wrapper{
+        overflow: hidden;
+    }
+}
+.dev-top{
+    .develop{
+        position: absolute;
+        top: 1px;
+        right: -13px;
+        font-size: xx-small;
+        color: #fff;
+        padding: 2px 5px;
+        z-index: 99;
+        transform: scale(0.7) rotate(45deg);
+    }
+
+    &::after{
+        position: absolute;
+        content: " ";
+        right: 0px;
+        top: -4px;
+        z-index: 0;
+        width: 33px;
+        height: 20px;
+        background-color: #64AE16;
+        transform: skewY(45deg);
+    }
+}
+</style>

+ 19 - 1
TEAMModelOS/ClientApp/src/components/student-web/HomeView/MissionListCard.vue

@@ -5,7 +5,17 @@
             <span class="title">{{ $t("studentWeb.missionListCardTitle") }}</span>
         </div>
         <Card class="list">
-            <Scroll class="list-block"
+            <div class="no-data-text" v-if="!testData.length">
+                <img
+                    src="@/assets/icon/no_data_evaluation.png"
+                    width="120"
+                />
+                <span style="margin-top: 15px; color: #808080">{{
+                    $t("studentWeb.public.noData")
+                }}</span>
+            </div>
+            <Scroll v-else
+                    class="list-block"
                     :style="{'max-height':listblockHeight+'px'}"
                     :on-reach-bottom="handleReachBottom"
                     :loading-text=" testData.length == 5  ? $t('studentWeb.missionListCardReachBottom') : $t('studentWeb.missionListCardLoading') "
@@ -210,3 +220,11 @@
     @import "~@/assets/student-web/component_styles/mission-list-card.css";
     @import "~@/assets/student-web/component_styles/mission-list-card-new.css";
 </style>
+
+<style lang="less" scoped>
+.list{
+    .no-data-text{
+        margin-top: 100px;
+    }
+}
+</style>

+ 9 - 2
TEAMModelOS/ClientApp/src/components/vote/BaseVoteSsTable.vue

@@ -9,7 +9,11 @@
             tableDatas: {
                 type: Array,
                 default:[]
-            }
+            },
+			isSecret:{
+				type:Boolean,
+				default:false
+			}
         },
         data(vm) {
             return {
@@ -31,7 +35,10 @@
                 columns: [
                     {
                         title: vm.$t('vote.name'),
-                        key: 'name'
+                        key: 'name',
+						render:(h, params) => {
+                            return h('span', vm.isSecret ? '***' : params.row.name)
+                        },
                     },
                     {
                         title: vm.$t('vote.className'),

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

@@ -107,6 +107,7 @@ export default {
     qrCodeText:'Invitation Code:',
     inviteUrl:'Invitation Link:',
     copyUrl:'Copy Link',
+    createTips:'溫馨提示:您(已加入學校)可以挑選學校學生加入課程 或者 讓學生通過邀請碼、二維碼、鏈接加入名單。 ',
     //ManageClass.vue
     classLabel:'Class:',
     stuCount:'Student Number: ',

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

@@ -20,6 +20,7 @@ export default{
     ac4:'Poll',
     ac5:'Survey',
     countNum:'Number',
+    verifyPhTitle:'Cell phone number linking',
     verifyPh:'Cell phone number linking',
     verifyText:'By completing the cell phone number linking and joining the school, you can:',
     verifyText1:'1. Get 1G system space for free',
@@ -29,6 +30,7 @@ export default{
     toPhone:'Go to link>>>',
     phoneSuccess:'Cell phone number linking has been completed!',
     hasBanding:'Already linked',
+    verifySchoolTitle:'Join School',
     verifySchool:'Join School',
     toSchool:'Join School>>>',
     schoolSuccess:'You have joined the school!',
@@ -37,5 +39,7 @@ export default{
     tmwCus:'Tomorrow Course',
     course:'Course:',
     className:'Class:',
-    tmwNoCus:'No classes scheduled for tomorrow'
+    tmwNoCus:'No classes scheduled for tomorrow',
+    schoolLabel:'School',
+    privateLabel:'Private'
 }

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

@@ -21,7 +21,8 @@ export default {
         schoolSurvey: 'School-level Survey',
         privateSurvey: 'Personal Survey',
         search: 'Please enter the query content...',
-        notice: 'This feature is not yet available!'
+        notice: '功能开发中,敬请期待',
+        develop: "开发中",
     },
     type: {
         home: "Home",

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

@@ -107,6 +107,7 @@ export default {
     qrCodeText:'邀请码:',
     inviteUrl:'邀请链接:',
     copyUrl:'复制链接',
+    createTips:'温馨提示:您(已加入学校)可以挑选学校学生加入课程 或者 让学生通过邀请码、二维码、链接加入名单。',
     //ManageClass.vue
     classLabel:'班级:',
     stuCount:'学生人数:',

+ 5 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/home.js

@@ -20,6 +20,7 @@ export default{
     ac4:'投票活动',
     ac5:'问卷调查',
     countNum:'数量',
+    verifyPhTitle:'手机号绑定',
     verifyPh:'手机号未绑定',
     verifyText:'完成手机号绑定并加入学校,您可以:',
     verifyText1:'1、免费获得1G系统空间',
@@ -29,6 +30,7 @@ export default{
     toPhone:'前往绑定>>>',
     phoneSuccess:'手机号绑定已完成!',
     hasBanding:'已绑定',
+    verifySchoolTitle:'加入学校',
     verifySchool:'暂未加入学校',
     toSchool:'加入学校>>>',
     schoolSuccess:'您已加入学校!',
@@ -41,5 +43,7 @@ export default{
     noRecord:'暂无课堂记录',
     noGoing:'暂无进行中的活动',
     noNotice:'暂无公告',
-    noInfo:'暂无推送'
+    noInfo:'暂无推送',
+    schoolLabel:'校本',
+    privateLabel:'个人'
 }

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

@@ -21,7 +21,8 @@ export default {
         schoolSurvey: '校级问卷',
         privateSurvey: '个人问卷',
         search: '请输入查询内容...',
-        notice: '此功能暂未开放!'
+        notice: '功能开发中,敬请期待',
+        develop: "开发中",
     },
     type: {
         home: "首页",

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

@@ -107,6 +107,7 @@ export default {
     qrCodeText:'邀請碼:',
     inviteUrl:'邀請鏈接:',
     copyUrl:'複製鏈接',
+    createTips:'溫馨提示:您(已加入學校)可以挑選學校學生加入課程 或者 讓學生通過邀請碼、二維碼、鏈接加入名單。 ',
     //ManageClass.vue
     classLabel: '班級:',
     stuCount: '學生人數:',

+ 5 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/home.js

@@ -20,6 +20,7 @@ export default {
     ac4: '投票活動',
     ac5: '問卷調查',
     countNum:'數量',
+    verifyPhTitle:'手機號綁定',
     verifyPh:'手機號綁定',
     verifyText: '完成手機號碼綁定並加入學校,您可以:',
     verifyText1: '1、免費獲得1G系統空間',
@@ -29,6 +30,7 @@ export default {
     toPhone:'前往綁定>>>',
     phoneSuccess:'手機號碼綁定已完成! ',
     hasBanding:'已綁定',
+    verifySchoolTitle:'加入學校',
     verifySchool:'加入學校',
     toSchool:'加入學校>>>',
     schoolSuccess:'您已加入學校! ',
@@ -41,5 +43,7 @@ export default {
     noRecord:'暫無課堂記錄',
     noGoing:'暫無進行中的活動',
     noNotice:'暫無公告',
-    noInfo:'暫無推送'
+    noInfo:'暫無推送',
+    schoolLabel:'校本',
+    privateLabel:'個人'
 }

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

@@ -21,7 +21,8 @@ export default {
         schoolSurvey: '校級問卷',
         privateSurvey: '個人問卷',
         search: '請輸入查詢內容...',
-        notice: '此功能暫未開放!'
+        notice: '功能開發中,敬請期待',
+        develop: "開發中",
     },
     type: {
         home: "首頁",

+ 17 - 3
TEAMModelOS/ClientApp/src/store/module/answerSheet.js

@@ -70,8 +70,8 @@ export default {
 			"columns": null, //列数
 			"pageCount": 1,
 
-			"pageWidth": PAPER_W - (ANCHORPROP.gapX - 5) * 2, //页面大小(回字组成的)
-			"pageHeight": PAPER_H - (ANCHORPROP.gapY - 5) * 2 , //页面大小(回字组成的)
+			"pageWidth": SVG_BORDER_PROP.width, //页面大小(回字组成的)
+			"pageHeight": SVG_BORDER_PROP.height , //页面大小(回字组成的)
 
 			"pageNumBlockCount": 3, //页码块数量
 			"pageNumStartValue": 1, //页码起始值, 起始是3个空格方块开始,写1; 2个空格1个实心,写0
@@ -86,11 +86,25 @@ export default {
 			"notHuisRect": [0.3, 0.3, 0.4, 0.4], //不检测回字区域(pc版辅助效果20%, 手机版50%)
 
 			//内容块 vblockCount为该模块竖向的方块数 hblockCount为该模块横向方块数
-			"contents": []
+			"contents": [],
+			
+			"infoMode":'number',
+			"infoPos":[],
+			"objectivePos":[],
+			"mode":"A4"
 		}
 	},
 
 	mutations: {
+		setInfoMode(state, val) {
+			state.config.infoMode = val
+		},
+		setInfoPos(state, val) {
+			state.config.infoPos = val
+		},
+		setObjectivePos(state, val) {
+			state.config.objectivePos = val
+		},
 		setCreateModal(state, val) {
 			state.isAutoCreate = val === 'auto'
 		},

+ 11 - 1
TEAMModelOS/ClientApp/src/utils/js-fn.js

@@ -255,6 +255,15 @@ function findChartIndex(str, cha, num) {
     }
     return x;
 }
+function dateFormat(timestamp) {
+    let date = new Date(timestamp)
+    let Y = date.getFullYear()
+    let M = date.getMonth()
+    let D = date.getDate()
+    let H = date.getHours()
+    let MIN = date.getMinutes()
+    return `${Y}/${M < 9 ? '0' + (M + 1) : M + 1}/${D} ${H < 10 ? '0' + H : H}:${MIN < 10 ? '00' : MIN}`
+}
 
 /**
  * 根据学年获取年级名称
@@ -341,5 +350,6 @@ export default {
     uuid,
     findChartIndex,
     getGradeNameByYear,
-    getYearByGrade
+    getYearByGrade,
+    dateFormat
 }

+ 2 - 2
TEAMModelOS/ClientApp/src/utils/sheetConfig.js

@@ -11,9 +11,9 @@ const ANCHORPROP = {
 };
 const SVG_BORDER_PROP = {
     x:15,
-    y:10,
+    y:20,
     width:PAPER_W - 15 * 2,
-    height:PAPER_H - 140
+    height:PAPER_H - 100
 }
 const SVG_BORDER_MB = PAPER_H - SVG_BORDER_PROP.y - SVG_BORDER_PROP.height
 const CONTENT_MT = 10; // 内容与定位框间隔

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

@@ -52,7 +52,7 @@
 								</FormItem>
 								<FormItem :label="$t('evaluation.paperList.paperScore')" prop="name"
 									class="evaluation-attr-wrap-inputNumber">
-									<InputNumber :max="200" :min="1" v-model="evaluationInfo.score"></InputNumber>
+									<InputNumber :max="1000" :min="1" v-model="evaluationInfo.score"></InputNumber>
 								</FormItem>
 							</Form>
 						</div>

+ 77 - 55
TEAMModelOS/ClientApp/src/view/homepage/AcCountPie.vue

@@ -3,21 +3,35 @@
 </template>
 <script>
 import elementResizeDetectorMaker from "element-resize-detector"
+let title = '总量'
 export default {
+    props: {
+        count: {
+            type: Array,
+            default: () => {
+                return []
+            }
+        }
+    },
     data() {
         return {
             index: 0,
+            color: ['#00f492', '#fa8d38', '#f862bb', '#65dcda', '#d6b8ff'],
             typeCountPie: undefined,
             option: {
+                tooltip: {
+                    trigger: 'item',
+                    formatter: '{b}({c})',
+                    textStyle: {
+                        color: '#000'
+                    },
+                    backgroundColor: '#fff',
+                    extraCssText: 'box-shadow: 0px 0px 10px 0px rgba(19,83,88,0.2);'
+                },
                 backgroundColor: "#27262b",
+                title: [],
                 legend: {
-                    data: [
-                        this.$t('home.ac1'),
-                        this.$t('home.ac2'),
-                        this.$t('home.ac3'),
-                        this.$t('home.ac4'),
-                        this.$t('home.ac5')
-                    ],
+                    data: [],
                     textStyle: {
                         color: '#DDDDDD',
                         padding: [5, 0, 5, 0]
@@ -34,68 +48,22 @@ export default {
                 },
                 series: [
                     {
-
                         name: this.$t('home.countNum'),
                         type: 'pie',
                         top: -60,
-                        radius: [95, 120],
-                        avoidLabelOverlap: false,
-                        legendHoverLink: false,
-                        label: {
-                            show: false,
-                            position: 'center',
-                            formatter: function (data) { // 设置圆饼图中间文字排版
-                                return data.value + "\n" + data.name
-                            }
-                        },
-                        emphasis: {
-                            label: {
-                                show: true,
-                                fontSize: '24',
-                                fontWeight: 'bold'
-                            },
-                        },
+                        radius: [85, 115],
                         labelLine: {
                             show: false
                         },
-                        data: [
-                            { value: 335, name: this.$t('home.ac1'), itemStyle: { color: "#00f492" } },
-                            { value: 310, name: this.$t('home.ac2'), itemStyle: { color: "#fa8d38" } },
-                            { value: 234, name: this.$t('home.ac3'), itemStyle: { color: "#f862bb" } },
-                            { value: 135, name: this.$t('home.ac4'), itemStyle: { color: "#65dcda" } },
-                            { value: 1548, name: this.$t('home.ac5'), itemStyle: { color: "#d6b8ff" } }
-                        ],
-                        itemStyle: {
-                            borderWidth: 5,
-                            borderColor: '#2b2a2f'
-                        }
+                        data: []
                     }
                 ]
             }
         }
-    },
-    created() {
-
     },
     mounted() {
         this.typeCountPie = this.$echarts.init(document.getElementById('ac-type-count'))
         this.typeCountPie.setOption(this.option)
-        this.typeCountPie.dispatchAction({ type: 'highlight', seriesIndex: 0, dataIndex: 0 })
-        this.typeCountPie.on('mouseover', (e) => {
-            this.typeCountPie.dispatchAction({ type: 'downplay', seriesIndex: 0, dataIndex: 0 })
-            if (e.dataIndex != this.index) {
-                this.typeCountPie.dispatchAction({ type: 'downplay', seriesIndex: 0, dataIndex: this.index })
-            }
-            if (e.dataIndex == 0) {
-                this.typeCountPie.dispatchAction({ type: 'highlight', seriesIndex: 0, dataIndex: e.dataIndex })
-            }
-        })
-
-        //当鼠标离开时,把当前项置为选中 
-        this.typeCountPie.on('mouseout', (e) => {
-            this.index = e.dataIndex
-            this.typeCountPie.dispatchAction({ type: 'highlight', seriesIndex: 0, dataIndex: e.dataIndex })
-        })
         this.erd = elementResizeDetectorMaker()
         this.erd.listenTo(document.getElementById("ac-type-count"), () => {
             this.$nextTick(() => {
@@ -103,6 +71,60 @@ export default {
                 this.typeCountPie.resize()
             })
         })
+    },
+    computed: {
+        total() {
+            let t = 0
+            this.option.series[0].data.forEach(item => {
+                t += item.value
+            })
+            return t
+        }
+    },
+    watch: {
+        count: {
+            handler(n, o) {
+                console.log('统计数据:', this.count)
+                this.option.legend.data = this.count.map(item => {
+                    return item.name
+                })
+                this.option.series[0].data = this.count.map((item, index) => {
+                    item.itemStyle = {
+                        color: this.color[index]
+                    }
+                    return item
+                })
+                this.option.title = []
+                this.option.title.push({
+                    text: '{name|' + title + '}\n{val|' + this.total + '}',
+                    top: '30%',
+                    left: 'center',
+                    textStyle: {
+                        rich: {
+                            name: {
+                                fontSize: 16,
+                                fontWeight: 'normal',
+                                color: '#ccc',
+                                padding: [10, 0],
+                            },
+                            val: {
+                                fontSize: 40,
+                                fontWeight: 'bold',
+                                color: '#fff',
+                            },
+                        },
+                    },
+                })
+                this.$nextTick(() => {
+                    if (!this.typeCountPie) {
+                        this.typeCountPie = this.$echarts.init(document.getElementById('ac-type-count'))
+                    }
+                    this.typeCountPie.setOption(this.option)
+                })
+            },
+            deep: true,
+            immediate: true
+        }
     }
 }
 </script>

+ 14 - 5
TEAMModelOS/ClientApp/src/view/homepage/HomePage.less

@@ -118,6 +118,9 @@
         display: flex;
         cursor: pointer;
 
+        &:hover{
+            background: #404040;
+        }
         .ac-type-icon {
             width: 60px;
             text-align: center;
@@ -163,11 +166,17 @@
         .ac-pro-box {
             width: 80px;
             text-align: center;
-            color: #1cc1f1;
-            font-size: 30px;
-            font-weight: 600;
-            .percent-chart{
-                font-size:18px;
+            .type-label{
+                font-size:14px;
+                padding: 1px 5px;
+                color: #5cadff;
+                border-radius: 2px;
+                border: 1px solid #5cadff;
+                line-height: 55px;
+            }
+            .special-color{
+                color: #19be6b;
+                border-color: #19be6b;
             }
         }
     }

+ 87 - 54
TEAMModelOS/ClientApp/src/view/homepage/HomePage.vue

@@ -1,9 +1,7 @@
 <template>
-    <div v-if="!isComplete" class="uncomplete-wrap">
+    <!-- 验证提示调整为提示框 -->
+    <!-- <div v-if="!isComplete" class="uncomplete-wrap">
         <p class="verify-info-text" v-if="!$store.state.userInfo.hasSchool">
-            <!-- <span>{{$t('home.verifyText')}}</span>
-            <span>{{$t('home.verifyText1')}}</span>
-            <span> {{$t('home.verifyText2')}}</span> -->
             <span style="text-align:left;display: inline-block;">
                 {{$t('home.verifyText3')}}
             </span>
@@ -11,7 +9,7 @@
             <a href="https://www.habook.com/zh-tw/cloud.php?act=view&id=13" target="_blank">{{$t('home.websiteLink')}}</a>
         </p>
         <div class="verify-status">
-            <!-- 如果是大陆站需要验证是否完成手机号认证 -->
+             如果是大陆站需要验证是否完成手机号认证 
             <div v-show="srvAdr == 'China'" class="verify-status-box" v-if="!hasVerify">
                 <Icon custom="iconfont icon-phone-unverify" class="tips-icon" />
                 <b class="verify-title">{{$t('home.verifyPh')}}</b>
@@ -26,7 +24,7 @@
                 <span class="has-verify">{{$t('home.hasBanding')}}</span>
             </div>
 
-            <!-- 大陆和国际站都需要验证是否加入学校 -->
+            大陆和国际站都需要验证是否加入学校 
             <div class="verify-status-box" v-if="!$store.state.userInfo.hasSchool">
                 <Icon custom="iconfont icon-school" class="tips-icon" />
                 <b class="verify-title">{{$t('home.verifySchool')}}</b>
@@ -40,9 +38,8 @@
                 <span class="has-verify">{{$t('home.hasJoin')}}</span>
             </div>
         </div>
-
-    </div>
-    <div v-else class="home-page-container dark-iview-split dark-iview-card">
+    </div> -->
+    <div class="home-page-container dark-iview-split dark-iview-card">
         <!-- 课前预习 对应模块暂未排上里程 暂时隐藏 -->
         <!-- <div class="prepare-area box-item">
             <p class="list-title">
@@ -153,7 +150,7 @@
                 <p class="chart-title">
                     {{$t('home.acCount')}}
                 </p>
-                <AcCountPie style="margin-top:-20px;"></AcCountPie>
+                <AcCountPie style="margin-top:-20px;" :count="acCount"></AcCountPie>
             </div>
             <div class="ac-list-box box-item" style="flex:1;">
                 <p class="list-title">
@@ -161,23 +158,25 @@
                 </p>
                 <div class="in-pro-detail">
                     <vuescroll>
-                        <!-- <div class="in-pro-ac-item" @click="toAc('vote')">
-                            <Icon custom="iconfont icon-vote" class="ac-type-icon"></Icon>
+                        <div v-for="(item,index) in goingList" :key="index" class="in-pro-ac-item" @click="toAc(item.pk, item.scope)">
+                            <Icon :custom="getAcIcon(item.pk)" class="ac-type-icon"></Icon>
                             <div class="ac-info-box">
                                 <p>
-                                    <span class="classname-label">一年级一班</span>
-                                    <span class="ac-name-label">两位数加法123100</span>
+                                    <!-- <span class="classname-label">一年级一班</span> -->
+                                    <span class="ac-name-label">{{item.name}}</span>
                                 </p>
                                 <p class="ac-time-wrap">
-                                    2020.01.11 - 2020.01.22
+                                    <Icon type="md-alarm" />
+                                    {{$jsFn.dateFormat(item.startTime)}} - {{$jsFn.dateFormat(item.endTime)}}
                                 </p>
                             </div>
                             <div class="ac-pro-box">
-                                <span>86</span>
-                                <span class="percent-chart">%</span>
+                                <span :class="['type-label', item.owner == 'school' ? '' : 'special-color']">
+                                    {{item.owner == 'school' ? $t('home.schoolLabel') : $t('home.privateLabel')}}
+                                </span>
                             </div>
-                        </div> -->
-                        <EmptyData :textContent="$t('home.noGoing')"></EmptyData>
+                        </div>
+                        <EmptyData v-show="!goingList.length" :textContent="$t('home.noGoing')"></EmptyData>
                     </vuescroll>
                 </div>
 
@@ -250,7 +249,6 @@ import AcCountPie from "./AcCountPie.vue"
 import TechScore from "./TechScore.vue"
 import TeachScore from "./TeachScore.vue"
 import MinTable from "./MinTable.vue"
-import jwtDecode from 'jwt-decode'
 export default {
     components: {
         AcCountPie, TechScore, TeachScore, MinTable
@@ -264,27 +262,56 @@ export default {
             tmwCus: [],
             srvAdr: 'China',
             hasVerify: false, //是否完成手机号验证
+            acCount: [],
+            goingList: []
         }
     },
     methods: {
+        getAcIcon(type) {
+            let icon = ''
+            switch (type) {
+                case 'Exam':
+                    icon = 'iconfont icon-test'
+                    break
+                case 'Self':
+                    icon = 'iconfont icon-activityT'
+                    break
+                case 'Homework':
+                    icon = 'iconfont icon-hw'
+                    break
+                case 'Vote':
+                    icon = 'iconfont icon-vote'
+                    break
+                case 'Survey':
+                    icon = 'iconfont icon-questionnaire'
+                    break
+                default:
+                    break
+            }
+            return icon
+        },
         getTmwCus(data) {
             this.tmwCus = data
         },
-        toAc(type) {
+        toAc(type,scope) {
+            if(scope == 'school'){
+                this.$Message.warning('暂未处理校本活动详情页')
+                return
+            }
             switch (type) {
-                case 'vote':
+                case 'Vote':
                     this.$router.push({
-                        path: '/home/manageVote'
+                        path: '/home/personalVote'
                     })
                     break
-                case 'que':
+                case 'Survey':
                     this.$router.push({
-                        path: '/home/manageQuestionnaire'
+                        path: '/home/personalSurvey'
                     })
                     break
-                case 'test':
+                case 'Exam':
                     this.$router.push({
-                        path: '/home/manageEvaluation'
+                        path: '/home/privateEvaluation'
                     })
                     break
                 default:
@@ -306,42 +333,48 @@ export default {
                 path: '/home/settings'
             })
         },
-        // 获取账号详细信息,用来验证大陆站用户是否完成手机号绑定
-        getIdInfo() {
-            let host = this.$store.state.config.China.coreAPIUrl
-            let clientId = this.$store.state.config.China.clientID
-            let idToken = localStorage.getItem('id_token')
-            let tokenData = jwtDecode(idToken)
-            let nonce = tokenData ? tokenData.nonce : ''
-            let params = {
-                "grant_type": "get",
-                "nonce": nonce,
-                "client_id": clientId,
-                "id_token": idToken
-            }
-            this.$api.service.getIdProfile(host, params).then(
+
+        //获取活动统计数据已经进行中的活动
+        getAcCount() {
+            this.$api.learnActivity.ActivityCount({}).then(
                 res => {
-                    console.log(res)
-                    if (!res.error) {
-                        if (res.mobile) this.hasVerify = true
-                    } else {
-                        this.$Message.error('API Error')
+                    if (res.totalCount && res.totalCount.length) {
+                        res.totalCount.forEach(item => {
+                            switch (item.key) {
+                                case 'Exam':
+                                    item.name = this.$t('home.ac1')
+                                    break
+                                case 'Self':
+                                    item.name = this.$t('home.ac2')
+                                    break
+                                case 'Homework':
+                                    item.name = this.$t('home.ac3')
+                                    break
+                                case 'Vote':
+                                    item.name = this.$t('home.ac4')
+                                    break
+                                case 'Survey':
+                                    item.name = this.$t('home.ac5')
+                                    break
+                                default:
+                                    break
+                            }
+                        })
+                        this.acCount = res.totalCount
                     }
+                    if (res.goingDatas) {
+                        this.goingList = res.goingDatas
+                    }
+
                 },
                 err => {
-                    console.log(err)
+                    this.$Message.error('API error!')
                 }
             )
         }
     },
     created() {
-        this.srvAdr = this.$store.state.config.srvAdr
-        //只有大陆站才验证手机号
-        if (this.srvAdr == 'China') {
-            this.getIdInfo()
-        } else {
-            this.hasVerify = true
-        }
+        this.getAcCount()
     },
     computed: {
         //暂时只验证加入学校, 手机号需要对接API

+ 3 - 3
TEAMModelOS/ClientApp/src/view/learnactivity/CreatePrivEva.vue

@@ -36,7 +36,7 @@
                             </FormItem>
                             <FormItem :label="$t('learnActivity.createEv.courseType')" prop="course">
                                 <Select v-model="evaluationInfo.scope" @on-change="resetCourse">
-                                    <Option value="school">{{$t('learnActivity.createEv.cusLabel1')}}</Option>
+                                    <Option value="school" v-show="$store.state.userInfo.hasSchool">{{$t('learnActivity.createEv.cusLabel1')}}</Option>
                                     <Option value="private">{{$t('learnActivity.createEv.cusLabel2')}}</Option>
                                 </Select>
                             </FormItem>
@@ -167,7 +167,7 @@ export default {
                 name: '',
                 targets: [],
                 classes: [],
-                scope: 'school',
+                scope: '',
                 type: '',  //测试类别
                 source: '',
                 publish: '0',
@@ -589,7 +589,7 @@ export default {
         } else {
             this.mode = 'private'
         }
-
+        this.evaluationInfo.scope = this.$store.state.userInfo.hasSchool ? 'school' : 'private'
         //编辑评测逻辑
         let routerData = this.$route.params.evaluationInfo
         if (routerData !== undefined) {

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

@@ -27,6 +27,10 @@
                     <Icon :type="showQu ? 'md-eye-off':'md-eye'" />
                     {{ showQu ? $t('learnActivity.score.hideQu') : $t('learnActivity.score.showQu')}}
                 </span>
+                <span class="base-info-btn" @click="markByQu">
+                    <Icon type="ios-create" />
+                    按题批阅
+                </span>
             </div>
             <!-- 题号 -->
             <div class="question-index-box" v-if="studentAnswer.scores">
@@ -377,7 +381,9 @@ export default {
         }
     },
     methods: {
+        markByQu(){
 
+        },
         closeModal() {
             this.markStatus = false
             this.curAnIndex = -1

+ 1 - 1
TEAMModelOS/ClientApp/src/view/learnactivity/Scoring.vue

@@ -667,7 +667,7 @@ export default {
 
                         },
                         err => {
-                            this.$Message.error('教学班数据获取失败')
+                            this.$Message.error('API error')
                         }
                     )
                     return []

+ 11 - 2
TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.less

@@ -336,7 +336,7 @@
     position: absolute;
     right: 15px;
     top: 50%;
-    margin-top: -10px;
+    margin-top: -15px;
 }
 .no-school-tips{
     color: #ff9900;
@@ -390,4 +390,13 @@
     user-select: none;
     line-height: 45px;
     display: inline-block;
-}
+}
+.create-list-title{
+    font-size: 16px;
+    font-weight: 500;
+    margin-right: 20px;
+}
+.create-list-tips{
+    color: #ff9900;
+    font-size: 12px;
+}

+ 9 - 5
TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.vue

@@ -59,7 +59,7 @@
                                         <span class="attr-label">{{$t('cusMgt.stuCount')}}:</span>
                                         <span class="class-name">{{item.allStu ? item.allStu.length : 0}}{{$t('unit.text7')}}</span>
                                     </p>
-                                    <Icon size="20" custom="iconfont icon-qr-code" class="qr-code-icon" @click="showQrCode(index)" v-if="listType == 'private'" />
+                                    <Icon size="30" custom="iconfont icon-qr-code" class="qr-code-icon" @click="showQrCode(index)" v-if="listType == 'private'" title="扫码加入名单"/>
                                 </div>
                                 <EmptyData v-if="teaClassList.length == 0" :top="160" :textContent="$t('cusMgt.noClassList')"></EmptyData>
                             </vuescroll>
@@ -67,8 +67,8 @@
                     </div>
                     <div class="course-classroom-info" id="table-height" slot="right">
                         <div class="course-classroom-info-header" style="padding-right:30px;">
-                            <span @click="selectTab('record')" :class="tabName == 'record' ? 'course-classroom-label line-bottom line-bottom-active':'course-classroom-label line-bottom'">{{$t('cusMgt.cusRecord')}}</span>
                             <span @click="selectTab('activity')" :class="tabName == 'activity' ? 'course-classroom-label line-bottom line-bottom-active':'course-classroom-label line-bottom'">{{$t('cusMgt.acRecord')}}</span>
+                            <span @click="selectTab('record')" :class="tabName == 'record' ? 'course-classroom-label line-bottom line-bottom-active':'course-classroom-label line-bottom'">{{$t('cusMgt.cusRecord')}}</span>
                             <span @click="selectTab('stus')" :class="tabName == 'stus' ? 'course-classroom-label line-bottom line-bottom-active':'course-classroom-label line-bottom'">{{$t('courseManage.classroom.studentList')}}</span>
                             <span v-show="tabName == 'stus' && listType == 'school'" class="group-tips">{{$t('cusMgt.groupTips')}}</span>
                             <!-- 个人课程时段设置暂不实做 -->
@@ -278,9 +278,13 @@
             </div>
         </Drawer>
         <!-- 创建名单 -->
-        <Modal v-model="newSlStatus" :title="$t('cusMgt.createList')" width="1200" @on-ok="confirmCreateList" class-name="dark-iview-modal" :loading="modalLoading">
+        <Modal v-model="newSlStatus" width="1200" @on-ok="confirmCreateList" class-name="dark-iview-modal" :loading="modalLoading">
+            <div slot="header">
+                <span class="create-list-title">{{$t('cusMgt.createList')}}</span>
+                <span class="create-list-tips">{{$t('cusMgt.createTips')}}</span>
+            </div>
             <div class="dark-iview-input list-name-box">
-                <span>{{$t('cusMgt.name')}}</span>
+                <span>{{$t('cusMgt.name')}}</span>
                 <Input v-model="listName" :placeholder="$t('cusMgt.nameHolder')" style="width: 300px" />
             </div>
             <StudentList v-if="$store.state.userInfo.hasSchool" @getSelectInfo="(selction)=>{createStuList = selction}"></StudentList>
@@ -475,7 +479,7 @@ export default {
             newSlStatus: false,
             stuLoading: false,
             listType: 'private',
-            tabName: 'record',
+            tabName: 'activity',
             addCusStatus: false,
             addStuStatus: false,
             joinQRcode: undefined,

+ 16 - 13
TEAMModelOS/ClientApp/src/view/newsheet/BaseSvgBg.vue

@@ -1,6 +1,6 @@
 <template>
 	<div
-		style="position:relative; width: 100%; height: 100%; overflow: hidden; margin-top: 0;border-bottom: 1px solid #b1b1b1;">
+		style="position:relative; width: 100%; height: 100%; overflow: hidden; margin-top: 0;border-bottom: 0px solid #b1b1b1;">
 		<div v-show="ids === 'svg0'" class="sheet-paper-title">
 			<BaseTitleEditor :ids="'sheetName' + ids" :content="sheetPaperName"></BaseTitleEditor>
 		</div>
@@ -46,12 +46,15 @@
 			BaseTitleEditor
 		},
 		created() {
-				var reader = new FileReader();
-			    // 读取文件作为URL可访问地址
-			    var img = document.createElement("img");
-			    img.src = 'file:///C:\Users\zxj\AppData\Local\Temp\ksohtml1436\wps8.jpg';
-				document.getElementById('pdfDom').append(img)
-				console.log(img)
+				// var reader = new FileReader();
+			 //    // 读取文件作为URL可访问地址
+			 //    var img = document.createElement("img");
+				// let s = 'file:///C:\Users\zxj\AppData\Local\Temp\ksohtml1436\wps8.jpg'
+				// let j = URL.createObjectURL(s)
+			 //    img.src = j;
+				// document.getElementById('pdfDom').append(img)
+				// console.log(j)
+				// console.log(img)
 		},
 		methods: {
 			doRenderPageAnchor(snap) {
@@ -67,7 +70,7 @@
 						snap
 						.rect(
 							parseInt(ANCHORPROP.gapX + 65 + 30 * index) + 0.5,
-							parseInt(PAPER_H - ANCHORPROP.height - ANCHORPROP.gapY - 60),
+							parseInt(PAPER_H - ANCHORPROP.height - ANCHORPROP.gapY - 10),
 							20,
 							10
 						)
@@ -88,7 +91,7 @@
 				var page = snap
 					.text(
 						(PAPER_W - 100) / 2,
-						PAPER_H - 100,
+						PAPER_H - 50,
 						`${this.$t('answerSheet.tip2')} ${Number(this.ids.replace("svg", "")) + 1} ${this.$t('answerSheet.tip21')}  /  ${this.$t('answerSheet.tip9')} ${
             this.total
           } ${this.$t('answerSheet.tip21')}`
@@ -106,8 +109,8 @@
 					var page = snap
 						.text(
 							550,
-							PAPER_H - 100,
-							`0123456789-${Number(this.ids.replace("svg", "")) + 1}`
+							PAPER_H - 50,
+							`${this.sheetId}-${Number(this.ids.replace("svg", "")) + 1}`
 							)
 						.attr({
 							fontSize: 16,
@@ -235,8 +238,8 @@
 <style lang="less">
 	.sheet-paper-title {
 		position: absolute;
-		top: 10px;
-		left: 58px;
+		top: 15px;
+		left: 30px;
 
 		.w-e-text {
 			font-size: 18px !important;

+ 3 - 2
TEAMModelOS/ClientApp/src/view/newsheet/BaseTitleEditor.vue

@@ -204,9 +204,10 @@ export default {
 <style>
 .sheet-title-Editor {
   position: relative;
-  width: 710px;
+  width: 770px;
   margin: 10px auto 0 auto;
   border: 0 solid #000 !important;
+  background: transparent !important;
 }
 
 .sheet-title-Editor .w-e-toolbar {
@@ -214,7 +215,7 @@ export default {
   position: absolute;
   top: -32px;
   left: -1px;
-  width: 710px;
+  width: 770px;
   border: 1px solid #000 !important;
   border-bottom: none !important;
 }

+ 339 - 292
TEAMModelOS/ClientApp/src/view/newsheet/SheetBaseInfo.vue

@@ -1,308 +1,355 @@
 <template>
-  <div
-    class="sheet-info-container"
-    ref="baseInfoRef"
-    @mouseout="isShowInfoEdit = false"
-    @mouseover="isShowInfoEdit = true"
-  >
-    <svg id="sheetInfoSvg" width="100%" height="100%"></svg>
-    <div class="info-edit" v-show="isShowInfoEdit" @click="editModal = true">
-      <span>{{ $t('answerSheet.edit') }}</span>
-    </div>
-    <Modal v-model="editModal" :title="$t('answerSheet.baseInfo')" @on-ok="onEditBaseInfo">
-      <p class="edit-title">{{ $t('answerSheet.needTitle') }}</p>
-      <CheckboxGroup v-model="showInfoList">
-        <Checkbox
-          v-for="(item, index) in infoList"
-          :key="index"
-          :label="item"
-          :disabled="index < 2"
-        ></Checkbox>
-      </CheckboxGroup>
-      <p class="edit-title">{{ $t('answerSheet.idNumber') }}</p>
-      <InputNumber :max="12" :min="4" v-model="idLength"></InputNumber>
-    </Modal>
-  </div>
+	<div class="sheet-info-container" ref="baseInfoRef" @mouseout="isShowInfoEdit = false"
+		@mouseover="isShowInfoEdit = true">
+		<svg id="sheetInfoSvg" width="100%" height="100%"></svg>
+		<div class="info-edit" v-show="isShowInfoEdit" @click="editModal = true">
+			<span>{{ $t('answerSheet.edit') }}</span>
+		</div>
+		<Modal v-model="editModal" :title="$t('answerSheet.baseInfo')" @on-ok="onEditBaseInfo">
+			<p class="edit-title">{{ $t('answerSheet.needTitle') }}</p>
+			<CheckboxGroup v-model="showInfoList">
+				<Checkbox v-for="(item, index) in infoList" :key="index" :label="item" :disabled="index < 2"></Checkbox>
+			</CheckboxGroup>
+			<p class="edit-title">{{ $t('answerSheet.idNumber') }}</p>
+			<InputNumber :max="12" :min="4" v-model="idLength"></InputNumber>
+		</Modal>
+	</div>
 </template>
- 
+
 <script>
-import Snap from "imports-loader?this=>window,fix=>module.exports=0!snapsvg/dist/snap.svg.js";
-import {
-  PAPER_W,
-  PAPER_H,
-  CONTENT_MT,
-  CONTENT_ML,
-  ANCHORPROP,
-  CONTENT_START_X,
-  CONTENT_START_Y,
-  INFO_W,
-  INFO_H,
-  INFO_ITEM_GAP,
-  INFO_ITEM_MARGIN,
-  ID_LENGTH,
-  INFO_LEFT_X,
-  INFO_LEFT_W,
-  ID_TITLE_H,
-  ID_TITLE_Y,
-  NUMBER_CELL_H,
-  NUMBER_ITEM_W,
-  NUMBER_ITEM_H,
-  NUMBER_ITEM_MT,
-  NUMBER_ITEM_ML,
-} from "@/utils/sheetConfig.js";
-export default {
-  components: {},
-  data(vm) {
-    return {
-      infoList: [vm.$t('answerSheet.id'), vm.$t('answerSheet.name'),vm.$t('answerSheet.school'),vm.$t('answerSheet.className'),vm.$t('answerSheet.no'),vm.$t('answerSheet.roomNo')],
-      showInfoList: [vm.$t('answerSheet.id'), vm.$t('answerSheet.name'),vm.$t('answerSheet.school'),vm.$t('answerSheet.className'),vm.$t('answerSheet.no')],
-      isShowInfoEdit: false,
-      editModal: false,
-      infoLeftBox: null,
-      idNumberBox: null,
-      snap: null,
-      idLength: 10,
-    };
-  },
-  created() {
-    this.snap = Snap("#sheetInfoSvg");
-  },
-  methods: {
-    onEditBaseInfo() {
-      this.infoLeftBox.remove();
-      let snap = this.snap;
-      this.infoLeftBox = snap.paper.g();
-      let gap = INFO_H / (this.showInfoList.length + 1);
-	  let lineWidth = INFO_W - this.idLength * 30
-      this.showInfoList.forEach((item, index) => {
-        // 考号、座号、姓名等
-        let leftInfo1 = snap.text(
-          CONTENT_START_X + 30,
-          CONTENT_START_Y + INFO_ITEM_MARGIN + gap * index,
-          `${item} :`
-        );
-        // 下划线
-        let leftInfo2 = snap
-          .line(
-            CONTENT_START_X + 80,
-            CONTENT_START_Y + INFO_ITEM_MARGIN + gap * index,
-            CONTENT_START_X + lineWidth - 40,
-            CONTENT_START_Y + INFO_ITEM_MARGIN + gap * index
-          )
-          .attr({ fill: "none", stroke: "#000", strokeWidth: 1,shapeRendering:"crispEdges", });
-        this.infoLeftBox.add(leftInfo1, leftInfo2);
-      });
+	import Snap from "imports-loader?this=>window,fix=>module.exports=0!snapsvg/dist/snap.svg.js";
+	import {
+		PAPER_W,
+		PAPER_H,
+		CONTENT_MT,
+		CONTENT_ML,
+		ANCHORPROP,
+		CONTENT_START_X,
+		CONTENT_START_Y,
+		INFO_W,
+		INFO_H,
+		INFO_ITEM_GAP,
+		INFO_ITEM_MARGIN,
+		ID_LENGTH,
+		INFO_LEFT_X,
+		INFO_LEFT_W,
+		ID_TITLE_H,
+		ID_TITLE_Y,
+		NUMBER_CELL_H,
+		NUMBER_ITEM_W,
+		NUMBER_ITEM_H,
+		NUMBER_ITEM_MT,
+		NUMBER_ITEM_ML,
+	} from "@/utils/sheetConfig.js";
+	export default {
+		components: {},
+		data(vm) {
+			return {
+				infoList: [vm.$t('answerSheet.id'), vm.$t('answerSheet.name'), vm.$t('answerSheet.school'), vm.$t(
+					'answerSheet.className'), vm.$t('answerSheet.no'), vm.$t('answerSheet.roomNo')],
+				showInfoList: [vm.$t('answerSheet.id'), vm.$t('answerSheet.name'), vm.$t('answerSheet.school'), vm.$t(
+					'answerSheet.className'), vm.$t('answerSheet.no')],
+				isShowInfoEdit: false,
+				editModal: false,
+				infoLeftBox: null,
+				idNumberBox: null,
+				snap: null,
+				idLength: 10,
+				svgPosArr: []
+			};
+		},
+		created() {
+			this.snap = Snap("#sheetInfoSvg");
+		},
+		methods: {
+			onEditBaseInfo() {
+				this.infoLeftBox.remove();
+				let snap = this.snap;
+				this.infoLeftBox = snap.paper.g();
+				let gap = INFO_H / (this.showInfoList.length + 1);
+				let lineWidth = INFO_W - this.idLength * 30
+				this.showInfoList.forEach((item, index) => {
+					// 考号、座号、姓名等
+					let leftInfo1 = snap.text(
+						CONTENT_START_X + 30,
+						CONTENT_START_Y + INFO_ITEM_MARGIN + gap * index,
+						`${item} :`
+					);
+					// 下划线
+					let leftInfo2 = snap
+						.line(
+							CONTENT_START_X + 80,
+							CONTENT_START_Y + INFO_ITEM_MARGIN + gap * index,
+							CONTENT_START_X + lineWidth - 40,
+							CONTENT_START_Y + INFO_ITEM_MARGIN + gap * index
+						)
+						.attr({
+							fill: "none",
+							stroke: "#000",
+							strokeWidth: 1,
+							shapeRendering: "crispEdges",
+						});
+					this.infoLeftBox.add(leftInfo1, leftInfo2);
+				});
+
+				this.renderIdNumber(this.idLength, false);
+				console.log(this.svgPosArr);
+				this.$store.commit('setInfoMode', 'number')
+				this.$store.commit('setInfoPos', this.svgPosArr)
+			},
+
+			// 渲染准考证号填涂区域
+			renderIdNumber(idLength, isShowCode) {
+				let snap = this.snap;
+				this.svgPosArr = []
+				this.setInfoConfig()
+				this.idNumberBox.remove();
+				this.idNumberBox = snap.paper.g();
+
+				const CELL_WIDTH = 30
+
+				const INFO_LEFT_W = INFO_W - CELL_WIDTH * idLength; // 左侧的宽度
+				const INFO_LEFT_X = INFO_LEFT_W + CONTENT_ML + ANCHORPROP.width + ANCHORPROP.gapX; // 左侧的x坐标
+				var numbers = new Array(idLength).fill("0");
+				var cellWidth = CELL_WIDTH; // 计算每个号码的宽度
+				const NUMBER_ITEM_MLR =
+					((INFO_W - INFO_LEFT_W) / idLength - NUMBER_ITEM_W) / 2; // 计算号码左右间距
+				// 信息框左右分割线
+				this.idNumberBox.add(
+					snap
+					.line(
+						INFO_LEFT_X,
+						CONTENT_MT + 50,
+						INFO_LEFT_X,
+						CONTENT_MT + 50 + INFO_H
+					)
+					.attr({
+						fill: "none",
+						stroke: "#000",
+						strokeWidth: 1,
+						shapeRendering: "crispEdges"
+					})
+				);
+
+				// 准考证号下边框
+				this.idNumberBox.add(
+					snap
+					.line(
+						INFO_LEFT_X,
+						ID_TITLE_Y,
+						PAPER_W - CONTENT_ML - ANCHORPROP.width - ANCHORPROP.gapX,
+						ID_TITLE_Y
+					)
+					.attr({
+						fill: "none",
+						stroke: "#000",
+						strokeWidth: 1,
+						shapeRendering: "crispEdges"
+					})
+				);
+				// 准考证号
+				this.idNumberBox.add(
+					snap.text(
+						INFO_LEFT_X + (idLength * CELL_WIDTH - 69) / 2,
+						CONTENT_MT + 75,
+						isShowCode ? this.$t('answerSheet.qrCodeTitle') : this.$t('answerSheet.idTitle')
+					)
+				);
+				if (!isShowCode) {
+					this.idNumberBox.add(
+						// 填涂上边框
+						snap
+						.line(
+							INFO_LEFT_X,
+							ID_TITLE_Y + NUMBER_CELL_H,
+							PAPER_W - CONTENT_ML - ANCHORPROP.width - ANCHORPROP.gapX,
+							ID_TITLE_Y + NUMBER_CELL_H
+						)
+						.attr({
+							fill: "none",
+							stroke: "#000",
+							strokeWidth: 1,
+							shapeRendering: "crispEdges"
+						})
+					);
+					numbers.forEach((item, index) => {
+						// 画准考证号填涂对应锚点
+						let c1 = snap.rect(
+							INFO_LEFT_X + NUMBER_ITEM_MLR + index * cellWidth,
+							40,
+							0,
+							NUMBER_ITEM_H
+						);
+						//  画准考证号分列分割线
+						let c2 = snap
+							.line(
+								INFO_LEFT_X + cellWidth * index,
+								ID_TITLE_Y,
+								INFO_LEFT_X + cellWidth * index,
+								ID_TITLE_Y - ID_TITLE_H + INFO_H
+							)
+							.attr({
+								fill: "none",
+								stroke: "#000",
+								strokeWidth: index === 0 ? 0 : 1,
+								shapeRendering: "crispEdges"
+							});
+
+						this.idNumberBox.add(c1, c2);
+						const context = require.context('@/icons/answersheet', false, /.svg/)
+						const frames = []
+						context.keys().forEach(k => {
+							frames.push(context(k))
+						})
+						// 画填涂svg图片
+						for (let i = 0; i < 10; i++) {
+							let img = frames[i];
+							let x = INFO_LEFT_X + NUMBER_ITEM_MLR + cellWidth * index
+							let y = ID_TITLE_Y + NUMBER_CELL_H + 5 + NUMBER_ITEM_MT * i
+							let c3 = snap.image(
+								img,
+								x,
+								y,
+								NUMBER_ITEM_W,
+								NUMBER_ITEM_H
+							);
+							this.idNumberBox.add(c3);
+							this.svgPosArr.push({
+								ans: i + '',
+								row: index,
+								pos: [{
+										x: x - CONTENT_START_X,
+										y: y - CONTENT_START_Y
+									},
+									{
+										x: x - CONTENT_START_X + NUMBER_ITEM_W,
+										y: y - CONTENT_START_Y
+									},
+									{
+										x: x - CONTENT_START_X,
+										y: y - CONTENT_START_Y + NUMBER_ITEM_H
+									},
+									{
+										x: x - CONTENT_START_X + NUMBER_ITEM_W,
+										y: y - CONTENT_START_Y + NUMBER_ITEM_H
+									}
+								]
+							})
+						}
+					});
+					// 画左边准考证号定位锚点
+					// for (let i = 0; i < 10; i++) {
+					//   snap.rect(
+					//     20,
+					//     ID_TITLE_Y + NUMBER_CELL_H + 5 + NUMBER_ITEM_MT * i,
+					//     NUMBER_ITEM_W,
+					//     NUMBER_ITEM_H
+					//   ).attr({ shapeRendering:"crispEdges"});
+					// }
+				} else {
+					let img = require("@/static/qrCode.png");
+					let c4 = snap.image(
+						img,
+						450,
+						180,
+						150,
+						150
+					);
+					this.idNumberBox.add(c4);
+				}
+
+			},
 
-      this.renderIdNumber(this.idLength,false);
-    },
+			renderQRCode() {
+				let snap = this.snap;
+				this.setInfoConfig()
+				this.idNumberBox.remove();
+				this.idNumberBox = snap.paper.g();
 
-    // 渲染准考证号填涂区域
-    renderIdNumber(idLength,isShowCode) {
-      let snap = this.snap;
-	  this.setInfoConfig()
-      this.idNumberBox.remove();
-      this.idNumberBox = snap.paper.g();
-	  
-	  const CELL_WIDTH = 30
+			},
 
-      const INFO_LEFT_W = INFO_W - CELL_WIDTH * idLength; // 左侧的宽度
-      const INFO_LEFT_X = INFO_LEFT_W + CONTENT_ML + ANCHORPROP.width + ANCHORPROP.gapX; // 左侧的x坐标
-      var numbers = new Array(idLength).fill("0");
-      var cellWidth = CELL_WIDTH; // 计算每个号码的宽度
-      const NUMBER_ITEM_MLR =
-        ((INFO_W - INFO_LEFT_W) / idLength - NUMBER_ITEM_W) / 2; // 计算号码左右间距
-      // 信息框左右分割线
-      this.idNumberBox.add(
-        snap
-          .line(
-            INFO_LEFT_X,
-            CONTENT_MT + 50,
-            INFO_LEFT_X,
-            CONTENT_MT + 50 + INFO_H
-          )
-          .attr({ fill: "none", stroke: "#000", strokeWidth: 1,shapeRendering:"crispEdges"})
-      );
+			setInfoConfig() {
+				let infoConfig = {
+					"type": 0,
+					"x": CONTENT_START_X - ANCHORPROP.gapX + 5,
+					"y": CONTENT_START_Y - ANCHORPROP.gapY + 5,
+					"width": INFO_W,
+					"height": INFO_H,
+					"pageNum": 1,
+					"vblockCount": 10,
+					"hblockCount": this.idLength
+				}
+				this.$store.commit('setInfoConfig', infoConfig)
+			}
+		},
+		mounted: function() {
+			this.snap = Snap("#sheetInfoSvg");
+			var snap = this.snap;
+			// 定义分组Group
+			this.infoLeftBox = snap.paper.g();
+			this.idNumberBox = snap.paper.g();
+			// 渲染个人信息区域
+			this.onEditBaseInfo();
 
-      // 准考证号下边框
-      this.idNumberBox.add(
-        snap
-          .line(
-            INFO_LEFT_X,
-            ID_TITLE_Y,
-            PAPER_W - CONTENT_ML - ANCHORPROP.width - ANCHORPROP.gapX,
-            ID_TITLE_Y
-          )
-          .attr({ fill: "none", stroke: "#000", strokeWidth: 1,shapeRendering:"crispEdges" })
-      );
-      // 准考证号
-      this.idNumberBox.add(
-        snap.text(
-          INFO_LEFT_X + (idLength * CELL_WIDTH - 69) / 2,
-          CONTENT_MT + 75,
-          isShowCode ? this.$t('answerSheet.qrCodeTitle') : this.$t('answerSheet.idTitle')
-        )
-      );
-	  if(!isShowCode){
-		  this.idNumberBox.add(
-		    // 填涂上边框
-		    snap
-		      .line(
-		        INFO_LEFT_X,
-		        ID_TITLE_Y + NUMBER_CELL_H,
-		        PAPER_W - CONTENT_ML - ANCHORPROP.width - ANCHORPROP.gapX,
-		        ID_TITLE_Y + NUMBER_CELL_H
-		      )
-		      .attr({ fill: "none", stroke: "#000", strokeWidth: 1,shapeRendering:"crispEdges" })
-		  );
-		  numbers.forEach((item, index) => {
-		    // 画准考证号填涂对应锚点
-		    let c1 = snap.rect(
-		      INFO_LEFT_X + NUMBER_ITEM_MLR + index * cellWidth,
-		      40,
-		      0,
-		      NUMBER_ITEM_H
-		    );
-		    //  画准考证号分列分割线
-		    let c2 = snap
-		      .line(
-		        INFO_LEFT_X + cellWidth * index,
-		        ID_TITLE_Y,
-		        INFO_LEFT_X + cellWidth * index,
-		        ID_TITLE_Y - ID_TITLE_H + INFO_H
-		      )
-		      .attr({
-		        fill: "none",
-		        stroke: "#000",
-		        strokeWidth: index === 0 ? 0 : 1,
-				shapeRendering:"crispEdges"
-		      });
-		  
-		    this.idNumberBox.add(c1, c2);
-			const context = require.context('@/icons/answersheet', false, /.svg/)
-			const frames = []
-			context.keys().forEach(k => {
-				frames.push(context(k))
+			// 信息框
+			let infoBox = snap
+				.rect(CONTENT_START_X, CONTENT_START_Y, INFO_W, INFO_H)
+				.attr({
+					fill: "rgba(0,0,0,0)",
+					stroke: "#000",
+					strokeWidth: 2,
+					shapeRendering: "crispEdges",
+				});
+			this.setInfoConfig()
+
+
+			infoBox.mouseover(() => {
+				// 移入
+				this.isShowInfoEdit = true;
+			});
+			infoBox.mouseout(() => {
+				// 移入
+				this.isShowInfoEdit = false;
+			});
+			this.$EventBus.$off('onCreateSheet')
+			this.$EventBus.$on('onCreateSheet', () => {
+				this.isShowInfoEdit = false
 			})
-		    // 画填涂svg图片
-		    for (let i = 0; i < 10; i++) {
-		      let img = frames[i];
-		      let c3 = snap.image(
-		        img,
-		        INFO_LEFT_X + NUMBER_ITEM_MLR + cellWidth * index,
-		        ID_TITLE_Y + NUMBER_CELL_H + 5 + NUMBER_ITEM_MT * i,
-		        NUMBER_ITEM_W,
-		        NUMBER_ITEM_H
-		      );
-		      this.idNumberBox.add(c3);
-		    }
-		  });
-		  // 画左边准考证号定位锚点
-		  // for (let i = 0; i < 10; i++) {
-		  //   snap.rect(
-		  //     20,
-		  //     ID_TITLE_Y + NUMBER_CELL_H + 5 + NUMBER_ITEM_MT * i,
-		  //     NUMBER_ITEM_W,
-		  //     NUMBER_ITEM_H
-		  //   ).attr({ shapeRendering:"crispEdges"});
-		  // }
-	  }else{
-		  let img = require("@/static/qrCode.png");
-		  let c4 = snap.image(
-		    img,
-		    450,
-		    180,
-		    150,
-		    150
-		  );
-		  this.idNumberBox.add(c4);
-	  }
-      
-    },
-	
-	renderQRCode(){
-		let snap = this.snap;
-		this.setInfoConfig()
-		this.idNumberBox.remove();
-		this.idNumberBox = snap.paper.g();
-		
-	},
-	
-	setInfoConfig(){
-		let infoConfig = {
-			"type": 0,
-			"x": CONTENT_START_X - ANCHORPROP.gapX + 5,
-			"y": CONTENT_START_Y - ANCHORPROP.gapY + 5,
-			"width": INFO_W,
-			"height": INFO_H,
-			"pageNum": 1,
-			"vblockCount": 10,
-			"hblockCount": this.idLength
-		} 
-		this.$store.commit('setInfoConfig', infoConfig)  
-	}
-  },
-  mounted: function () {
-    this.snap = Snap("#sheetInfoSvg");
-    var snap = this.snap;
-    // 定义分组Group
-    this.infoLeftBox = snap.paper.g();
-    this.idNumberBox = snap.paper.g();
-    // 渲染个人信息区域
-    this.onEditBaseInfo();
-    
-    // 信息框
-    let infoBox = snap
-      .rect(CONTENT_START_X, CONTENT_START_Y, INFO_W, INFO_H)
-      .attr({ fill: "rgba(0,0,0,0)", stroke: "#000", strokeWidth: 2,shapeRendering:"crispEdges", });
-	this.setInfoConfig()
-	
-	  
-    infoBox.mouseover(() => {
-      // 移入
-      this.isShowInfoEdit = true;
-    });
-    infoBox.mouseout(() => {
-      // 移入
-      this.isShowInfoEdit = false;
-    });
-	this.$EventBus.$off('onCreateSheet')
-	this.$EventBus.$on('onCreateSheet',() => {
-		this.isShowInfoEdit = false
-	})
-  },
-};
+
+
+		},
+	};
 </script>
 <style scoped>
-.sheet-info-container {
-  position: absolute;
-  left: 0;
-  top: 0;
-  width: 826px;
-  height: 342px;
-}
+	.sheet-info-container {
+		position: absolute;
+		left: 0;
+		top: 0;
+		width: 826px;
+		height: 342px;
+	}
 
-/* .sheet-info-container:hover .info-edit{
+	/* .sheet-info-container:hover .info-edit{
     display: flex;
 } */
 
-.info-edit {
-  position: absolute;
-  top: 125px;
-  right: 110px;
-  width: 40px;
-  height: 25px;
-  background: #00a43a;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  color: #fff;
-  font-size: 12px;
-  cursor: pointer;
-  z-index: 0;
-}
+	.info-edit {
+		position: absolute;
+		top: 75px;
+		right: 40px;
+		width: 40px;
+		height: 25px;
+		background: #00a43a;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		color: #fff;
+		font-size: 12px;
+		cursor: pointer;
+		z-index: 0;
+	}
 
-.edit-title {
-  margin: 10px 0;
-}
+	.edit-title {
+		margin: 10px 0;
+	}
 </style>
- 

+ 32 - 3
TEAMModelOS/ClientApp/src/view/newsheet/SheetObjective.vue

@@ -75,7 +75,8 @@
 				curColumn:0,
 				curCellCount:0,
 				times:-1,
-				lastItem:null
+				lastItem:null,
+				objectivePosArr:[]
 			};
 		},
 		created() {
@@ -133,6 +134,7 @@
 
 			// 渲染客观题目
 			doRenderItems(items, number) {
+				this.objectivePosArr = []
 				this.curBlockIndex = -2,
 				this.preBlockCellCount = 0,
 				this.curColumn = 0,
@@ -228,17 +230,42 @@
 							64 + parseInt(optionIndex + 1)
 						).toLowerCase();
 						let img = frames.slice(10,frames.length - 1)[optionIndex]
+						let x = xArr[itemsPositionArr[index].xArrIndex + optionIndex + 1]
+						let y = optionY - 10
 						let c3 = snap.image(
 							item.type !== 'judge' ? img : optionIndex === 0 ? trueSvg : falseSvg,
 							// optionX + NUMBER_ITEM_ML + optionGap * optionIndex,
-							xArr[itemsPositionArr[index].xArrIndex + optionIndex + 1],
-							optionY - 10,
+							x,
+							y,
 							NUMBER_ITEM_W,
 							NUMBER_ITEM_H
 						);
 						console.log(item.order,[xArr[itemsPositionArr[index].xArrIndex + optionIndex + 1],optionY - 10])
 						this.objectiveGroup.add(c3);
 						curXArrIndex = itemsPositionArr[index].xArrIndex + optionIndex + 1
+						
+						this.objectivePosArr.push({
+							ans:String.fromCharCode(64 + parseInt(optionIndex + 1)),
+							row:this.isAutoCreate ? index + 1 : item.order,
+							pos:[
+								{
+									x:x - CONTENT_START_X,
+									y:y - 2
+								},
+								{
+									x:x - CONTENT_START_X + NUMBER_ITEM_W,
+									y:y - 2
+								},
+								{
+									x:x - CONTENT_START_X,
+									y:y - 2 + NUMBER_ITEM_H
+								},
+								{
+									x:x - CONTENT_START_X + NUMBER_ITEM_W,
+									y:y - 2 + NUMBER_ITEM_H
+								}
+							]
+						})
 					});
 				});
 				console.log(this.leftItems)
@@ -275,6 +302,8 @@
 
 				// 渲染包围框
 				this.doRenderBorder(items, number, blockList.length);
+				this.$store.commit('setObjectivePos',this.objectivePosArr)
+				console.log(this.objectivePosArr)
 			},
 
 			// 获取每一列渲染的x坐标

+ 5 - 4
TEAMModelOS/ClientApp/src/view/newsheet/index.vue

@@ -292,10 +292,10 @@
 			},
 			/* 打印答题卡 */
 			doDownload() {
-				this.getPdf().then(r => {
-					this.isLoading = false
-				})
-				return
+				// this.getPdf().then(r => {
+				// 	this.isLoading = false
+				// })
+				// return
 				if(this.curPaper.sheet && this.hasModify){
 					this.$Modal.confirm({
 						title: '更新提示',
@@ -342,6 +342,7 @@
 				return new Promise((r, j) => {
 					let paperInfo = this.$store.state.answerSheet.paperItem
 					let configParams = this.$store.state.answerSheet.config
+					console.log(configParams.infoPos)
 					let curCode = paperInfo.examCode || paperInfo.code
 					let curScope = paperInfo.examScope || paperInfo.scope
 					if (paperInfo.sheet) {

+ 42 - 38
TEAMModelOS/ClientApp/src/view/student-web/App.vue

@@ -42,19 +42,26 @@
                     </div>
                 </span>
                 <!--通知彈窗區域-->
-                <!-- <span class="dropdown"> -->
                 <MenuItem name="6" @click.native="noData" :title="$t('studentWeb.type.note')">
                     <span class="info-badge" v-if="MyNo != 6"></span>
-                    <svg-icon icon-class="bell" class="tabIcon1" />
+                    <div class="dev-top">
+                        <svg-icon icon-class="bell" class="tabIcon1" />
+                        <span class="develop">{{ $t("studentWeb.public.develop") }}</span>
+                    </div>
                 </MenuItem>
-                <!-- </span> -->
                 <!-- hiteach课堂记录 -->
                 <MenuItem name="5" @click.native="noData" :title="$t('studentWeb.type.hiteach')">
-                    <svg-icon icon-class="hiteach" class="tabIcon4" />
+                    <div class="dev-top">
+                        <svg-icon icon-class="hiteach" class="tabIcon4" />
+                        <span class="develop">{{ $t("studentWeb.public.develop") }}</span>
+                    </div>
                 </MenuItem>
                 <!-- 自主学习 -->
                 <MenuItem name="3" @click.native="noData" :title="$t('studentWeb.type.studyview')">
-                    <svg-icon icon-class="note" class="tabIcon1" />
+                    <div class="dev-top">
+                        <svg-icon icon-class="note" class="tabIcon1" />
+                        <span class="develop">{{ $t("studentWeb.public.develop") }}</span>
+                    </div>
                 </MenuItem>
                 <MenuItem name="4" to="/studentWeb/eventView" :title="$t('studentWeb.type.activity')">
                     <svg-icon icon-class="selflearning" class="tabIcon2" />
@@ -62,21 +69,6 @@
                 <MenuItem name="1" to="/studentWeb/homeView" :title="$t('studentWeb.type.home')">
                     <svg-icon icon-class="home" class="tabIcon3" />
                 </MenuItem>
-                <!-- 加入课程 -->
-                <!-- <button class="addcoursebtn"
-                        @click='sentcourseID()'
-                        v-if="isAddClass">
-                    {{$t("studentWeb.home.joinClass")}}
-                </button>
-                <input maxlength="6"
-                    class="addcourseinput"
-                    v-model="courseID"
-                    :placeholder="$t('studentWeb.home.classPla')"
-                    v-if="isAddClass" />
-                <div class="clearinput">
-                    <Icon @click="clearInput()" v-if="isTyping" type="md-close" />
-                </div> -->
-                <!-- 加入课程 -->
             </Menu>
         </div>
         <!-- 小屏幕 -->
@@ -117,10 +109,6 @@
                 isRouterAlive: true,
                 windowWidth: window.innerWidth,
                 windowHeight: window.innerHeight,
-                bgc: "red",
-                active: false,
-                mockdata: "",
-                isClickInfoPop: false,
                 isTyping: false,
                 curRole: '',
                 users: '',
@@ -152,9 +140,9 @@
         watch: {
             courseID: function (value) {
                 if (value != "") {
-                    this.isTyping = true;
+                    this.isTyping = true
                 } else if (value == "") {
-                    this.isTyping = false;
+                    this.isTyping = false
                 }
             },
         },
@@ -174,9 +162,6 @@
             sentcourseID() {
                 this.$store.commit('searchCourseIDforAdd', this.courseID.trim())
             },
-            clearInput() {
-                this.courseID = "";
-            },
             onResize() {
                 this.windowWidth = window.innerWidth;
                 this.windowHeight = window.innerHeight;
@@ -186,17 +171,9 @@
                     return "#f0f0f0";
                 }
             },
-            mouseOver: function () {
-                this.active = !this.active;
-            },
             clickSidebarToggle() {
                 this.$store.commit("ToggleSidebar");
             },
-            changeBgc() {
-                if (this.MyNo == "4") {
-                    return true;
-                }
-            },
             noData() {
                 this.$Message.warning(this.$t("studentWeb.public.notice"))
             },
@@ -204,7 +181,6 @@
                 this.isRouterAlive = false;
                 this.$nextTick(() => (this.isRouterAlive = true));
             },
-
             getNavNo: function (MyNo) {
                 this.MyNo = MyNo;
             },
@@ -258,3 +234,31 @@
 <style scoped>
     @import "~@/assets/student-web/component_styles/app-nav.css";
 </style>
+
+<style lang="less" scoped>
+.dev-top{
+    .develop{
+        position: absolute;
+        bottom: 10px;
+        right: -11px;
+        font-size: xx-small;
+        color: #fff;
+        padding: 2px 5px;
+        z-index: 99;
+        transform: scale(0.7) rotate(45deg);
+    }
+
+    &::after{
+        position: absolute;
+        content: " ";
+        right: 0px;
+        top: -4px;
+        z-index: -1;
+        width: 33px;
+        height: 20px;
+        background-color: #64AE16;
+        transform: skewY(45deg);
+    }
+}
+
+</style>

+ 116 - 229
TEAMModelOS/ClientApp/src/view/teachcontent/index.vue

@@ -166,7 +166,7 @@
                                     <span class="table-file-name" v-show="editIndex !== index">{{row.name}}</span>
                                     <Input v-model="fileListShow[index].name" v-show="editIndex == index" style="width: 300px;" @on-change="checkName" />
                                     <span style="color:#ed4014" v-show="editIndex == index && formatErr">{{$t('teachContent.specialChart')}}(?*:"<>\/|)</span>
-                                    <Icon type="md-checkmark" v-show="editIndex == index && !formatErr" @click="confirmRename" class="rename-action-icon" />
+                                    <Icon type="md-checkmark" v-show="editIndex == index && !formatErr" @click="confirmRename('list')" class="rename-action-icon" />
                                     <Icon type="md-close" v-show="editIndex == index" @click="cancelRename" class="rename-action-icon" />
                                 </div>
                             </template>
@@ -178,7 +178,7 @@
                                     <Icon type="md-download" size="18" color="white" :title="$t('teachContent.tips3')" @click="downloadFile(index)" />
                                     <Icon v-if="activeType !== 'other' && (activeType == 'res' && row.extension != 'HTE')" type="md-eye" size="18" color="white" :title="$t('teachContent.tips4')" @click="openPreviewFile(index)" />
                                     <Icon v-if="$access.can('admin.*|content-upd') || routerScope == 'private'" type="md-trash" size="18" color="white" :title="$t('teachContent.tips7')" @click="delFile(row,index)" />
-                                    <Icon v-if="$access.can('admin.*|content-upd') || routerScope == 'private'" type="md-create" size="18" color="white" :title="$t('teachContent.tips6')" @click="rename(row,index)" />
+                                    <Icon v-if="$access.can('admin.*|content-upd') || routerScope == 'private'" type="md-create" size="18" color="white" :title="$t('teachContent.tips6')" @click="rename(row,index,'list')" />
                                 </div>
                             </template>
                         </Table>
@@ -192,6 +192,7 @@
                                     <Icon type="md-download" size="18" color="white" :title="$t('teachContent.tips3')" @click.stop="downloadFile(props.index)" />
                                     <Icon type="md-eye" size="18" color="white" :title="$t('teachContent.tips4')" @click.stop="openPreviewFile(props.index)" />
                                     <Icon v-if="$access.can('admin.*|content-upd') || routerScope == 'private'" type="md-trash" size="18" color="white" :title="$t('teachContent.tips7')" @click.stop="delFile(props.value, props.index)" />
+                                    <Icon v-if="$access.can('admin.*|content-upd') || routerScope == 'private'" type="md-create" size="18" color="white" :title="$t('teachContent.tips6')" @click.stop="rename(props.value, props.index, 'card')" />
                                     <span style="color:white; float:right;margin-right:10px;">{{$jsFn.formatBytes(props.value.size)}}</span>
                                 </div>
                             </div>
@@ -222,6 +223,10 @@
                 <MyHTEXRender v-else-if="previewFile.extension == 'HTEX'" :url="previewFile.url"></MyHTEXRender>
             </div>
         </div>
+        <Modal v-model="edidNameStatus" title="重命名" @on-ok="confirmRename('card')" @on-cancel="cancelRename">
+            <span style="margin-right:10px">文件名:</span>
+            <Input v-model="edName" :placeholder="renameBefore" style="width: 300px" />
+        </Modal>
     </div>
 </template>
 <script>
@@ -239,6 +244,9 @@ export default {
     },
     data() {
         return {
+            renameBefore: '',
+            edName: '',
+            edidNameStatus: false,
             teachSpace: 0,
             schoolBase: {
                 period: []
@@ -363,7 +371,18 @@ export default {
                 this.formatErr = false
             }
         },
-        rename(row, index) {
+        /**
+         * type list:列表模式 card:图片模式
+         */
+        rename(row, index, type) {
+            if (type == 'list') {
+
+            } else if (type == 'card') {
+                this.edidNameStatus = true
+                this.edName = row.name
+            } else {
+                return
+            }
             this.editIndex = index
             this.renameBefore = row.name
         },
@@ -374,11 +393,18 @@ export default {
             this.fileListShow = JSON.parse(dataTemp);
             this.editIndex = -1
         },
-        confirmRename() {
+        /**
+         * type list | card
+         */
+        confirmRename(mode) {
             let editIndex = this.editIndex
-            console.log(this.fileListShow[editIndex])
-            let newName = this.fileListShow[editIndex].name
-
+            let newName = mode == 'list' ? this.fileListShow[editIndex].name : this.edName
+            // 检查文件后缀
+            let oldEx = this.renameBefore.substring(this.renameBefore.lastIndexOf('.'), this.renameBefore.length)
+            let newEx = newName.substring(newName.lastIndexOf('.'), newName.length)
+            if (oldEx != newEx) {
+                this.$Message('不能修改文件后缀名')
+            }
             let params = {
                 scope: this.routerScope,
                 cntr: this.routerScope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,
@@ -388,6 +414,9 @@ export default {
             this.$api.blob.blobRename(params).then(
                 res => {
                     this.$Message.success(this.$t('teachContent.nameOk'))
+                    if (mode == 'card') {
+                        this.$set(this.fileListShow[editIndex], 'name', newName)
+                    }
                     let orginUrl = this.fileListShow[editIndex].url
                     let thum = this.fileListShow[editIndex].url
                     this.fileListShow[editIndex].blob = '/' + params.newName
@@ -410,52 +439,6 @@ export default {
             ).finally(() => {
                 this.editIndex = -1
             })
-            // if (this.fileListShow[this.editIndex].extension == 'HTEX') {
-            //     let newName = this.fileListShow[editIndex].name
-            //     this.containerClient.copyFolder(`res/${newName.replace('.HTEX', '/')}`, `res/${this.renameBefore.replace('.HTEX', '')}`).then(
-            //         res => {
-            //             this.$api.blob.deletePrefix({
-            //                 cntr: this.routerScope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,
-            //                 prefix: `res/${this.renameBefore.replace('.HTEX', '')}`
-            //             }).then(
-            //                 res => {
-            //                     this.$Message.success(this.$t('teachContent.nameOk'))
-            //                     let orginUrl = this.fileListShow[editIndex].url
-            //                     this.fileListShow[editIndex].blob = `/res/${this.newName}/index.json`
-            //                     this.fileListShow[editIndex].url = orginUrl.replace(this.renameBefore, this.fileListShow[editIndex].name)
-            //                 }
-            //             )
-            //         },
-            //         err => {
-            //             this.$Message.error(this.$t('teachContent.nameErr'))
-            //         }
-            //     ).finally(() => {
-            //         this.editIndex = -1
-            //     })
-            // } else {
-            //     let sourceUrl = this.fileListShow[this.editIndex].url.substring(0, this.fileListShow[this.editIndex].url.lastIndexOf('?')) //截取授权之前的,授权不能encode
-            //     let targetUrl = this.fileListShow[this.editIndex].blob
-            //     targetUrl = targetUrl.replace(this.renameBefore, this.fileListShow[this.editIndex].name)
-            //     targetUrl = targetUrl.substring(1)
-            //     this.containerClient.copyBlob(targetUrl, sourceUrl, this.sasString).then(
-            //         res => {
-            //             //这里虽然是复制,但是是重命名操作,所以空间不会变化,就设置为0
-            //             this.containerClient.deleteBlob(this.fileListShow[editIndex].blob, 0).then(
-            //                 res => {
-            //                     this.$Message.success(this.$t('teachContent.nameOk'))
-            //                     let orginUrl = this.fileListShow[editIndex].url
-            //                     this.fileListShow[editIndex].blob = '/' + targetUrl
-            //                     this.fileListShow[editIndex].url = orginUrl.replace(this.renameBefore, this.fileListShow[editIndex].name)
-            //                 }
-            //             )
-            //         },
-            //         err => {
-            //             this.$Message.error(this.$t('teachContent.nameErr'))
-            //         }
-            //     ).finally(() => {
-            //         this.editIndex = -1
-            //     })
-            // }
         },
         getFileUrl(files) { // 获取文件地址
             this.preUpdFiles.push(...files)
@@ -741,23 +724,23 @@ export default {
                 {
                     label: this.$t('teachContent.filterVideo'),
                     type: 'video',
-                    icon: 'logo-youtube'
+                    icon: 'iconfont icon-video-outline'
                 },
                 {
                     label: this.$t('teachContent.filterAudio'),
                     type: 'audio',
-                    icon: 'iconfont icon-audio2'
+                    icon: 'iconfont icon-audio-outline'
                 },
                 {
                     label: this.$t('teachContent.filterDoc'),
                     type: 'doc',
-                    icon: 'logo-wordpress'
+                    icon: 'iconfont icon-document'
                 },
 
                 {
                     label: this.$t('teachContent.filterOther'),
                     type: 'other',
-                    icon: 'md-filing'
+                    icon: 'iconfont icon-other-grad'
                 }
             ]
         },
@@ -875,107 +858,6 @@ export default {
                             this.$Message.error(this.$t('teachContent.props3'))
                         }
                     )
-                    // if (this.activeType == 'res') {
-                    //     //批量删除HTEX需要循环删除每个文件夹下面的文件
-                    //     this.selections.forEach((item, index) => {
-                    //         this.$api.blob.deletePrefix({
-                    //             cntr: this.routerScope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,
-                    //             prefix: `res/${item.name.replace('.HTEX', '')}`,
-                    //             scope: this.routerScope
-                    //         }).then(
-                    //             res => {
-                    //                 let fileNames = this.selections.map((item) => { return item.name })
-                    //                 for (let i = 0; i < this.fileList[this.activeType].length; i++) {
-                    //                     let index = fileNames.indexOf(this.fileList[this.activeType][i].name)
-                    //                     if (index > -1) {
-                    //                         this.sizeInfo[this.activeType] -= this.fileList[this.activeType][i].size
-                    //                         this.sizeInfo.total -= this.fileList[this.activeType][i].size
-                    //                         this.fileList[this.activeType].splice(i, 1)
-                    //                         i--
-                    //                     }
-                    //                 }
-                    //                 let fs = this.fileList[this.activeType] ? this.fileList[this.activeType] : []
-                    //                 this.fileListShow = this._.cloneDeep(fs)
-                    //                 this.$Message.success(this.$t('teachContent.props2'))
-                    //             },
-                    //             err => {
-                    //                 this.$Message.error(this.$t('teachContent.props3'))
-                    //             }
-                    //         ).finally(() => {
-                    //             this.isLoading = false
-                    //         })
-                    //     })
-                    //     //删除本地最近上传数据
-                    //     let ids = this.selections.map(item => {
-                    //         return item.id
-                    //     })
-                    //     this.delCacheFiles(ids)
-                    // } else {
-                    //     let blobs = this.selections.map((item) => {
-                    //         return item.url.substring(0, item.url.lastIndexOf('?'))
-                    //     })
-                    //     let ids = this.selections.map((item) => {
-                    //         return item.id
-                    //     })
-                    //     this.$api.blob.deleteBlobs({
-                    //         cntr: this.routerScope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,
-                    //         urls: blobs,
-                    //         scope: this.routerScope,
-                    //         ids
-                    //     }).then(
-                    //         res => {
-                    //             let thums = this.selections.map((item) => {
-                    //                 if (item.type == 'image') {
-                    //                     return item.url.substring(0, item.url.lastIndexOf('?')).replace('/image/', '/thum/')
-                    //                 } else if (item.extension == 'MP4') {
-                    //                     let n = item.url.substring(0, item.url.lastIndexOf('?')).replace('/video/', '/thum/')
-                    //                     return n.slice(0, n.lastIndexOf('.')) + '.png'
-                    //                 }
-
-                    //             })
-                    //             if (thums.length) {
-                    //                 this.$api.blob.deleteBlobs({
-                    //                     cntr: this.routerScope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,
-                    //                     urls: thums,
-                    //                     scope: this.routerScope,
-                    //                     ids: []
-                    //                 })
-                    //             }
-
-                    //             let files = this.selections.map((item) => { return item.blob })
-                    //             for (let i = 0; i < this.fileList[this.activeType].length; i++) {
-                    //                 let index = files.indexOf(this.fileList[this.activeType][i].blob)
-                    //                 if (index != -1) {
-                    //                     this.sizeInfo[this.activeType] -= this.fileList[this.activeType][i].size
-                    //                     this.sizeInfo.total -= this.fileList[this.activeType][i].size
-                    //                     this.fileList[this.activeType].splice(i, 1)
-                    //                     i--
-                    //                 }
-                    //             }
-                    //             let fs = this.fileList[this.activeType] ? this.fileList[this.activeType] : []
-                    //             this.fileListShow = this._.cloneDeep(fs)
-                    //             this.$Message.success(this.$t('teachContent.props2'))
-
-                    //             if (this.activeType == 'recent') {
-                    //                 this.selections.forEach(item => {
-                    //                     let type = item.type
-                    //                     if (this.fileList[type]) {
-                    //                         for (let i = 0; i < this.fileList[type].length; i++) {
-                    //                             if (item.id == this.fileList[type][i].id) {
-                    //                                 this.fileList[type].splice(i, 1)
-                    //                             }
-                    //                         }
-                    //                     }
-                    //                 })
-                    //             }
-                    //             //删除本地最近上传数据
-                    //             this.delCacheFiles(ids)
-                    //         },
-                    //         err => {
-                    //             this.$Message.success(this.$t('teachContent.props3'))
-                    //         }
-                    //     )
-                    // }
                 }
             })
         },
@@ -992,87 +874,92 @@ export default {
                     //需要先删除CosmosDB记录的Blob信息
                     let params = {
                         scope: this.routerScope,
-                        name: this.routerScope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,
-                        opt: 'del',
-                        id: [file.id]
+                        cntr: this.routerScope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,
+                        blobs: []
                     }
-                    this.$api.blob.BlobInfoMgt(params).then(
+                    params.blobs.push({
+                        path: file.blob.substring(1),
+                        id: file.id
+                    })
+                    this.$api.blob.deleteBlobs(params).then(
                         res => {
-                            //这里开始真正的删除Blob
+                            this.$Message.success(this.$t('teachContent.props2'))
+                            //这里开始真正的删除Blob,后端处理,前端不用处理blob
                             //删除HTEX需要批量删除
-                            if (file.extension == 'HTEX') {
-                                this.sizeInfo[this.activeType] -= file.size
-                                this.sizeInfo.total -= file.size
-                                this.fileListShow.splice(index, 1)
-                                for (let i in this.fileList[this.activeType]) {
-                                    if (this.fileList[this.activeType][i].url == file.url) {
-                                        this.fileList[this.activeType].splice(i, 1)
-                                    }
-                                }
-                                this.$api.blob.deletePrefix({
-                                    cntr: this.routerScope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,
-                                    prefix: `res/${file.name.replace('.HTEX', '')}`
-                                }).then(
-                                    res => {
-                                        this.$Message.success(this.$t('teachContent.props2'))
-                                    },
-                                    err => {
-                                        // this.$Message.error(this.$t('teachContent.props3'))
-                                        console.log('delete blob error')
-                                    }
-                                ).finally(() => {
-                                    this.isLoading = false
-                                })
-                            } else {
-                                this.sizeInfo[this.activeType] -= file.size
-                                this.sizeInfo.total -= file.size
-                                this.fileListShow.splice(index, 1)
-                                for (let i in this.fileList[this.activeType]) {
-                                    if (this.fileList[this.activeType][i].url == file.url) this.fileList[this.activeType].splice(i, 1)
-                                }
-                                this.$Message.success(this.$t('teachContent.props2'))
-                                this.containerClient.deleteBlob(file.blob, file.size).then(
-                                    (res) => {
-                                        //删除缩略图或封面
-                                        if (file.type == 'image') {
-                                            let thum = file.blob.replace('/image/', '/thum/')
-                                            //这里暂时预设缩略图大小为60KB
-                                            this.containerClient.deleteBlob(thum, 60 * 1024)
-                                        } else if (file.type == 'video' && file.extension == 'MP4') {
-                                            let thum = file.blob.replace('/video/', '/thum/')
-                                            thum = thum.slice(0, thum.lastIndexOf('.')) + '.png'
-                                            //这里暂时预封面大小为60KB
-                                            this.containerClient.deleteBlob(thum, 60 * 1024)
-                                        }
-                                        //如果是从最近上传删除,则需要判断是否已经请求对接类型的数据,如果有则需要删除对应的数据
-                                        if (this.activeType == 'recent') {
-                                            let type = file.type
-                                            if (this.fileList[type]) {
-                                                for (let i = 0; i < this.fileList[type].length; i++) {
-                                                    if (file.id == this.fileList[type][i].id) {
-                                                        this.fileList[type].splice(i, 1)
-                                                    }
-                                                }
-                                            }
-                                        }
-                                    },
-                                    (err) => {
-                                        // this.$Message.error(this.$t('teachContent.props3'))
-                                        console.log('delete blob error')
-                                    }
-                                ).finally(() => {
-                                    this.isLoading = false
-                                })
+                            // if (file.extension == 'HTEX') {
+                            //     this.sizeInfo[this.activeType] -= file.size
+                            //     this.sizeInfo.total -= file.size
+                            //     this.fileListShow.splice(index, 1)
+                            //     for (let i in this.fileList[this.activeType]) {
+                            //         if (this.fileList[this.activeType][i].url == file.url) {
+                            //             this.fileList[this.activeType].splice(i, 1)
+                            //         }
+                            //     }
+                            //     this.$api.blob.deletePrefix({
+                            //         cntr: this.routerScope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,
+                            //         prefix: `res/${file.name.replace('.HTEX', '')}`
+                            //     }).then(
+                            //         res => {
+                            //             this.$Message.success(this.$t('teachContent.props2'))
+                            //         },
+                            //         err => {
+                            //             // this.$Message.error(this.$t('teachContent.props3'))
+                            //             console.log('delete blob error')
+                            //         }
+                            //     ).finally(() => {
+                            //         this.isLoading = false
+                            //     })
+                            // } else {
+                            //     this.sizeInfo[this.activeType] -= file.size
+                            //     this.sizeInfo.total -= file.size
+                            //     this.fileListShow.splice(index, 1)
+                            //     for (let i in this.fileList[this.activeType]) {
+                            //         if (this.fileList[this.activeType][i].url == file.url) this.fileList[this.activeType].splice(i, 1)
+                            //     }
+                            //     this.$Message.success(this.$t('teachContent.props2'))
+                            //     this.containerClient.deleteBlob(file.blob, file.size).then(
+                            //         (res) => {
+                            //             //删除缩略图或封面
+                            //             if (file.type == 'image') {
+                            //                 let thum = file.blob.replace('/image/', '/thum/')
+                            //                 //这里暂时预设缩略图大小为60KB
+                            //                 this.containerClient.deleteBlob(thum, 60 * 1024)
+                            //             } else if (file.type == 'video' && file.extension == 'MP4') {
+                            //                 let thum = file.blob.replace('/video/', '/thum/')
+                            //                 thum = thum.slice(0, thum.lastIndexOf('.')) + '.png'
+                            //                 //这里暂时预封面大小为60KB
+                            //                 this.containerClient.deleteBlob(thum, 60 * 1024)
+                            //             }
+                            //             //如果是从最近上传删除,则需要判断是否已经请求对接类型的数据,如果有则需要删除对应的数据
+                            //             if (this.activeType == 'recent') {
+                            //                 let type = file.type
+                            //                 if (this.fileList[type]) {
+                            //                     for (let i = 0; i < this.fileList[type].length; i++) {
+                            //                         if (file.id == this.fileList[type][i].id) {
+                            //                             this.fileList[type].splice(i, 1)
+                            //                         }
+                            //                     }
+                            //                 }
+                            //             }
+                            //         },
+                            //         (err) => {
+                            //             // this.$Message.error(this.$t('teachContent.props3'))
+                            //             console.log('delete blob error')
+                            //         }
+                            //     ).finally(() => {
+                            //         this.isLoading = false
+                            //     })
 
-                            }
+                            // }
                             //删除本地最近上传数据
                             this.delCacheFiles([file.id])
                         },
                         err => {
                             this.$Message.error(this.$t('teachContent.props3'))
                         }
-                    )
-
+                    ).finally(() => {
+                        this.isLoading = false
+                    })
                 }
             })
         },

+ 12 - 6
TEAMModelOS/ClientApp/src/view/vote/ManageVote.vue

@@ -77,7 +77,7 @@
 									<span>{{ $t('vote.voteResult') }}</span>
 									<div class="hw-box-header-tools">
 										<div>
-											<span class="hw-box-header-tools-tool" @click="changeTableView">
+											<span class="hw-box-header-tools-tool" @click="changeTableView" v-if="!currentVote.secret">
 												<Icon type="md-podium" />
 												{{ isOptionView ? $t('vote.stuListView') : $t('vote.optionView') }}
 											</span>
@@ -95,7 +95,7 @@
 								<div class="hw-data-wrap" style="height:90%" ref="baseQnRef" v-else>
 									<vuescroll>
 										<BaseVoteTable :tableDatas="tableData" v-show="isOptionView"></BaseVoteTable>
-										<BaseVoteSsTable :tableDatas="studentsTable" v-show="!isOptionView">
+										<BaseVoteSsTable :tableDatas="studentsTable" v-show="!isOptionView" :isSecret="currentVote.secret">
 										</BaseVoteSsTable>
 										<div style="display:flex">
 											<BaseVotePie pieId="votePie" :pieData="studentsTable"
@@ -301,9 +301,15 @@
 			async getVoteRecord(voteItem) {
 				return new Promise(async (r, j) => {
 					try {
-						let curItemRecord = await this.getBlobJsonFile(voteItem.scope, voteItem
-							.recordUrl)
-						r(curItemRecord)
+						if(!voteItem.recordUrl){
+							console.log('xxxxx')
+							r({})
+						}else{
+							let curItemRecord = await this.getBlobJsonFile(voteItem.scope, voteItem
+								.recordUrl)
+							r(curItemRecord)
+						}
+						
 					} catch (e) {
 						j(e)
 					}
@@ -441,7 +447,7 @@
 							this.studentsTable = list
 							
 							// 要根据作答情况 结合两张表 处理表格显示的数据 
-							if (records.options.length) {
+							if (records.options && records.options.length) {
 								records.options = this._.orderBy(records.options,'code')
 								records.options.forEach((item, index) => {
 									arr.push({

+ 1 - 0
TEAMModelOS/Controllers/Common/SurveyController.cs

@@ -157,6 +157,7 @@ namespace TEAMModelOS.Controllers
                             request.progress = "going";
                         }
                         request.progress = info.progress;
+                        request.recordUrl = $"/survey/{request.id}/record.json";
                         request = await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(request, info.id, new PartitionKey($"{info.code}"));
                     }
                     else {

+ 2 - 0
TEAMModelOS/Controllers/Common/VoteController.cs

@@ -154,6 +154,8 @@ namespace TEAMModelOS.Controllers.Learn
                             request.progress = "going";
                         }
                         request.progress = info.progress;
+                        string url = $"/vote/{request.id}/record.json";
+                        request.recordUrl = url;
                         request = await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(request, info.id, new PartitionKey($"{info.code}"));
                     }
                     else

+ 0 - 1
TEAMModelOS/Controllers/School/CourseController.cs

@@ -1949,6 +1949,5 @@ namespace TEAMModelOS.Controllers
         public List<string> ids { get; set; }
         public string code { get; set; }
         public string scope { get; set; }
-
     }
 }

+ 2 - 0
TEAMModelOS/Controllers/Teacher/InitController.cs

@@ -189,6 +189,8 @@ namespace TEAMModelOS.Controllers
                         var container = _azureStorage.GetBlobContainerClient(id);
                         await container.CreateIfNotExistsAsync(PublicAccessType.None); //嘗試創建Teacher私有容器,如存在則不做任何事,保障容器一定存在
                         teacher = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemAsync<Teacher>(teacher, new PartitionKey("Base"));
+                        total = teacher.size;
+                        tsize = teacher.size;
                     } 
                 }
                 //私人課程

+ 1 - 0
TEAMModelOS/Controllers/XTest/FixDataController.cs

@@ -158,6 +158,7 @@ namespace TEAMModelOS.Controllers.XTest
             return Ok(new { noGradeIds, itemConds });
         }
 
+
         /// <summary>
         /// 修复名单的scope,school,creatorid
         /// </summary>

+ 3 - 3
TEAMModelOS/TEAMModelOS.csproj

@@ -37,9 +37,9 @@
     <SpaRoot>ClientApp\</SpaRoot>
     <DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>
     <UserSecretsId>078b5d89-7d90-4f6a-88fc-7d96025990a8</UserSecretsId>
-    <Version>5.2108.09</Version>
-    <AssemblyVersion>5.2108.09.1</AssemblyVersion>
-    <FileVersion>5.2108.09.1</FileVersion>
+    <Version>5.2108.12</Version>
+    <AssemblyVersion>5.2108.12.1</AssemblyVersion>
+    <FileVersion>5.2108.12.1</FileVersion>
     <Description>修复学生端扫码加入课程名单,联动触发相关课程和活动。</Description>
     <PackageReleaseNotes>版本说明</PackageReleaseNotes>
   </PropertyGroup>