浏览代码

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

XW 3 年之前
父节点
当前提交
edc7bb4d75

+ 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; }

+ 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')

+ 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'),

+ 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'
 }

+ 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:'个人'
 }

+ 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:'個人'
 }

+ 4 - 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
@@ -90,7 +90,8 @@ export default {
 			
 			"infoMode":'number',
 			"infoPos":[],
-			"objectivePos":[]
+			"objectivePos":[],
+			"mode":"A4"
 		}
 	},
 

+ 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
 }

+ 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

+ 2 - 2
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>
@@ -110,7 +110,7 @@
 						.text(
 							550,
 							PAPER_H - 50,
-							`0123456789-${Number(this.ids.replace("svg", "")) + 1}`
+							`${this.sheetId}-${Number(this.ids.replace("svg", "")) + 1}`
 							)
 						.attr({
 							fontSize: 16,

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

@@ -1,339 +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,
-	  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);
-      });
+	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);
-	  console.log(this.svgPosArr);
-	  this.$store.commit('setInfoMode','number')
-	  this.$store.commit('setInfoPos',this.svgPosArr)
-    },
+			renderQRCode() {
+				let snap = this.snap;
+				this.setInfoConfig()
+				this.idNumberBox.remove();
+				this.idNumberBox = snap.paper.g();
 
-    // 渲染准考证号填涂区域
-    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"})
-      );
+			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 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);
-	  }
-      
-    },
-	
-	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: 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;
-}
+	.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>
- 

+ 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; }
-
     }
 }

+ 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>