OnePsycho 4 jaren geleden
bovenliggende
commit
409ce38a72

+ 2 - 2
TEAMModelOS/ClientApp/src/common/BaseLayout.less

@@ -190,10 +190,10 @@
     text-align: center;
     user-select: none;
     line-height: 25px;
-    border-top: 1px solid #515a6e;
+    border-top: 1px solid #2c2f36;
 }
 .school-menu-tips{
-    color: #1CC0F3;
+    color: #ff9900;
     font-size: 12px;
     padding-left: 28px;
     min-height: 40px;

+ 94 - 68
TEAMModelOS/ClientApp/src/common/BaseLayout.vue

@@ -3,7 +3,7 @@
         <!-- 头部菜单栏 -->
         <Header class="header">
             <div class="logo-wrap">
-                <img src="../assets/ies5.png" :class="isCollapsed ? 'collapsed-logo-width unit-logo':'collapsed-logo-width  unit-logo'" v-show="isShowLogo"/>
+                <img src="../assets/ies5.png" :class="isCollapsed ? 'collapsed-logo-width unit-logo':'collapsed-logo-width  unit-logo'" v-show="isShowLogo" />
             </div>
             <div class="school-wrap">
                 <BaseSelectSchool></BaseSelectSchool>
@@ -19,36 +19,39 @@
                 <vuescroll :ops="ops">
                     <MenuGroup title="学校">
                         <!-- 暂未提供判断是否购买服务的字段 -->
-                        <p class="school-menu-tips" v-show="$store.state.userInfo.schoolPay && !isCollapsed">*当前学校暂未购买服务</p>
-                        <div v-for="(item,index) in schoolMenu" :key="index">
-                            <Submenu :name="item.subName" v-if="$access.ability(item.role,item.permission).validateAll && item.child.length" v-show="(index == 0 && $store.state.userInfo.hasSchool) || index > 0">
-                                <template slot="title">
-                                    <Tooltip :content="item.name" placement="right" transfer v-show="isCollapsed">
-                                        <Icon :custom="item.icon" style="width:55px;text-align:left;" :class="isCollapsed ? 'collapse-icon-size':''" size="20" />
+                        <p class="school-menu-tips" v-if="$store.state.userInfo.schoolPay && !isCollapsed">*当前学校暂未购买服务</p>
+                        <p class="school-menu-tips" v-else-if="!$store.state.userInfo.hasSchool && !isCollapsed">*暂未加入学校,无法使用学校功能</p>
+                        <div v-else-if="!$store.state.userInfo.schoolPay && $store.state.userInfo.hasSchool">
+                            <div v-for="(item,index) in schoolMenu" :key="index">
+                                <Submenu :name="item.subName" v-if="$access.ability(item.role,item.permission).validateAll && item.child.length" v-show="(index == 0 && $store.state.userInfo.hasSchool) || index > 0">
+                                    <template slot="title">
+                                        <Tooltip :content="item.name" placement="right" transfer v-show="isCollapsed">
+                                            <Icon :custom="item.icon" style="width:55px;text-align:left;" :class="isCollapsed ? 'collapse-icon-size':''" size="20" />
+                                        </Tooltip>
+                                        <Icon v-show="!isCollapsed" :custom="item.icon" :class="isCollapsed ? 'collapse-icon-size':''" size="20" />
+                                        <span>{{item.name}}</span>
+                                    </template>
+                                    <MenuItem class="sub-item-wrap sub-item-wrap-active" :name="menuItem.menuName" :to="menuItem.router" v-for="(menuItem,i) in item.child" :key="i" v-show="$access.ability(menuItem.role,menuItem.permission).validateAll">
+                                    <Tooltip :content="menuItem.name" placement="right" transfer v-show="isCollapsed">
+                                        <Icon class="sub-menu-icon" :custom="menuItem.icon" size="18" />
                                     </Tooltip>
-                                    <Icon v-show="!isCollapsed" :custom="item.icon" :class="isCollapsed ? 'collapse-icon-size':''" size="20" />
-                                    <span>{{item.name}}</span>
-                                </template>
-                                <MenuItem class="sub-item-wrap sub-item-wrap-active" :name="menuItem.menuName" :to="menuItem.router" v-for="(menuItem,i) in item.child" :key="i" v-if="$access.ability(menuItem.role,menuItem.permission).validateAll">
-                                <Tooltip :content="menuItem.name" placement="right" transfer v-show="isCollapsed">
-                                    <Icon class="sub-menu-icon" :custom="menuItem.icon" size="18" />
-                                </Tooltip>
-                                <Icon v-show="!isCollapsed" class="sub-menu-icon" :custom="menuItem.icon" size="18" />
-                                <span>
-                                    {{menuItem.name}}
-                                    <span style="color: aqua;margin-left: 2px;font-size: 12px;vertical-align: text-top;">
-                                        {{menuItem.tag}}
+                                    <Icon v-show="!isCollapsed" class="sub-menu-icon" :custom="menuItem.icon" size="18" />
+                                    <span>
+                                        {{menuItem.name}}
+                                        <span style="color: aqua;margin-left: 2px;font-size: 12px;vertical-align: text-top;">
+                                            {{menuItem.tag}}
+                                        </span>
                                     </span>
-                                </span>
+                                    </MenuItem>
+                                </Submenu>
+                                <MenuItem :name="item.menuName" v-else-if="$access.ability(item.role,item.permission).validateAll" :to="item.router">
+                                <Tooltip :content="item.name" placement="right" transfer v-show="isCollapsed">
+                                    <Icon :custom="item.icon" style="width:55px;text-align:left;" :class="isCollapsed ? 'collapse-icon-size':''" size="22" />
+                                </Tooltip>
+                                <Icon v-show="!isCollapsed" :custom="item.icon" :class="isCollapsed ? 'collapse-icon-size':''" size="22" />
+                                <span>{{item.name}}</span>
                                 </MenuItem>
-                            </Submenu>
-                            <MenuItem :name="item.menuName" v-else-if="$access.ability(item.role,item.permission).validateAll" :to="item.router">
-                            <Tooltip :content="item.name" placement="right" transfer v-show="isCollapsed">
-                                <Icon :custom="item.icon" style="width:55px;text-align:left;" :class="isCollapsed ? 'collapse-icon-size':''" size="22" />
-                            </Tooltip>
-                            <Icon v-show="!isCollapsed" :custom="item.icon" :class="isCollapsed ? 'collapse-icon-size':''" size="22" />
-                            <span>{{item.name}}</span>
-                            </MenuItem>
+                            </div>
                         </div>
                     </MenuGroup>
                     <MenuGroup title="个人">
@@ -61,7 +64,7 @@
                                     <Icon v-show="!isCollapsed" :custom="item.icon" :class="isCollapsed ? 'collapse-icon-size':''" size="20" />
                                     <span>{{item.name}}</span>
                                 </template>
-                                <MenuItem class="sub-item-wrap sub-item-wrap-active" :name="menuItem.menuName" :to="menuItem.router" v-for="(menuItem,i) in item.child" :key="i" v-if="$access.ability(menuItem.role,menuItem.permission).validateAll">
+                                <MenuItem class="sub-item-wrap sub-item-wrap-active" :name="menuItem.menuName" :to="menuItem.router" v-for="(menuItem,i) in item.child" :key="i" v-show="$access.ability(menuItem.role,menuItem.permission).validateAll && menuItem.isShow">
                                 <Tooltip :content="menuItem.name" placement="right" transfer v-show="isCollapsed">
                                     <Icon class="sub-menu-icon" :custom="menuItem.icon" size="18" />
                                 </Tooltip>
@@ -74,7 +77,7 @@
                                 </span>
                                 </MenuItem>
                             </Submenu>
-                            <MenuItem :name="item.menuName" v-else-if="$access.ability(item.role,item.permission).validateAll" :to="item.router">
+                            <MenuItem :name="item.menuName" v-else-if="$access.ability(item.role,item.permission).validateAll && item.isShow" :to="item.router">
                             <Tooltip :content="item.name" placement="right" transfer v-show="isCollapsed">
                                 <Icon :custom="item.icon" style="width:55px;text-align:left;" :class="isCollapsed ? 'collapse-icon-size':''" size="22" />
                             </Tooltip>
@@ -325,6 +328,30 @@ export default {
 
             ] : []
             this.teacherMenu = [
+                // 我的班级
+                {
+                    icon: 'iconfont icon-class-self',
+                    name: this.$t('system.menu.myClass'),
+                    router: '/home/manageClass',
+                    tag: '',
+                    role: 'teacher',
+                    permission: '',
+                    child: [],
+                    menuName: 'manageClass',
+                    isShow: this.$store.state.userInfo.hasSchool && this.$store.state.userInfo.isHeadmaster
+                },
+                // 我的课程
+                {
+                    icon: 'iconfont icon-course-self',
+                    name: this.$t('system.menu.myCus'),
+                    router: '/home/myCourse',
+                    tag: '',
+                    role: 'teacher',
+                    permission: '',
+                    child: [],
+                    menuName: 'myCourse',
+                    isShow: true
+                },
                 // 我的资源
                 {
                     icon: 'iconfont icon-textbook',
@@ -341,7 +368,8 @@ export default {
                             tag: this.$t('system.menu.preview'),
                             role: 'teacher|admin',
                             permission: '',
-                            menuName: 'personalSyllabus'
+                            menuName: 'personalSyllabus',
+                            isShow: true
                         },
                         {
                             icon: 'iconfont icon-file',
@@ -350,7 +378,8 @@ export default {
                             tag: '',
                             role: 'teacher|admin',
                             permission: '',
-                            menuName: 'personalcontent'
+                            menuName: 'personalcontent',
+                            isShow: true
                         },
                         {
                             icon: 'iconfont icon-question-bank',
@@ -359,7 +388,8 @@ export default {
                             tag: '',
                             role: 'teacher|admin',
                             permission: '',
-                            menuName: 'personalBank'
+                            menuName: 'personalBank',
+                            isShow: true
                         }
                     ]
                 },
@@ -379,7 +409,8 @@ export default {
                             tag: '',
                             role: 'teacher|admin',
                             permission: '',
-                            menuName: 'privateEvaluation'
+                            menuName: 'privateEvaluation',
+                            isShow: true
                         },
                         {
                             icon: 'iconfont icon-vote',
@@ -388,7 +419,8 @@ export default {
                             tag: '',
                             role: 'teacher|admin',
                             permission: '',
-                            menuName: 'personalVote'
+                            menuName: 'personalVote',
+                            isShow: true
                         },
                         {
                             icon: 'iconfont icon-questionnaire',
@@ -397,7 +429,8 @@ export default {
                             tag: '',
                             role: 'teacher|admin',
                             permission: '',
-                            menuName: 'personalSurvey'
+                            menuName: 'personalSurvey',
+                            isShow: true
                         },
                         // 自主学习和作业活动暂时隐藏
                         // {
@@ -407,7 +440,8 @@ export default {
                         //     tag: this.$t('system.menu.preview'),
                         //     role: 'teacher|admin',
                         //     permission: '',
-                        //     menuName: 'selfLearn'
+                        //     menuName: 'selfLearn',
+                        // isShow:true
                         // },
                         // {
                         //     icon: 'iconfont icon-hw',
@@ -416,32 +450,12 @@ export default {
                         //     tag: this.$t('system.menu.preview'),
                         //     role: 'teacher|admin',
                         //     permission: '',
-                        //     menuName: 'manageHomeWork'
+                        //     menuName: 'manageHomeWork',
+                        // isShow:true
                         // }
                     ]
                 },
-                // 我的班级
-                {
-                    icon: 'iconfont icon-class-self',
-                    name: this.$t('system.menu.myClass'),
-                    router: '/home/manageClass',
-                    tag: '',
-                    role: 'teacher',
-                    permission: '',
-                    child: [],
-                    menuName: 'manageClass'
-                },
-                // 我的课程
-                {
-                    icon: 'iconfont icon-course-self',
-                    name: this.$t('system.menu.myCus'),
-                    router: '/home/myCourse',
-                    tag: '',
-                    role: 'teacher',
-                    permission: '',
-                    child: [],
-                    menuName: 'myCourse'
-                },
+
                 // 任务列表
                 {
                     icon: 'iconfont icon-task',
@@ -451,7 +465,8 @@ export default {
                     role: 'teacher',
                     permission: '',
                     child: [],
-                    menuName: 'taskList'
+                    menuName: 'taskList',
+                    isShow: this.$store.state.userInfo.hasSchool
                 }
             ]
         },
@@ -466,6 +481,7 @@ export default {
         }
     },
     created() {
+        console.log('权限',this.$access)
         this.initMenu()
         let cloudSetting = localStorage.getItem('cloudSetting')
         if (cloudSetting) {
@@ -485,19 +501,29 @@ export default {
     watch: {
         $route: {
             handler(val, oldval) {
-                if (this.menuTree.length == 0) {
+                if (this.schoolMenu.length == 0) {
                     this.initMenu()
                 }
-                console.log(val)
                 let metaName = val.meta.activeName
                 this.activeName = metaName
                 this.openNames = []
-                for (let i in this.menuTree) {
-                    if (this.menuTree[i].child.length) {
-                        for (let j in this.menuTree[i].child) {
-                            if (this.menuTree[i].child[j].menuName == metaName) {
+                for (let i in this.schoolMenu) {
+                    if (this.schoolMenu[i].child.length) {
+                        for (let j in this.schoolMenu[i].child) {
+                            if (this.schoolMenu[i].child[j].menuName == metaName) {
+                                this.activeName = metaName
+                                this.openNames.push(this.schoolMenu[i].subName)
+                                break
+                            }
+                        }
+                    }
+                }
+                for (let i in this.teacherMenu) {
+                    if (this.teacherMenu[i].child.length) {
+                        for (let j in this.teacherMenu[i].child) {
+                            if (this.teacherMenu[i].child[j].menuName == metaName) {
                                 this.activeName = metaName
-                                this.openNames.push(this.menuTree[i].subName)
+                                this.openNames.push(this.teacherMenu[i].subName)
                                 break
                             }
                         }

+ 37 - 8
TEAMModelOS/ClientApp/src/common/UploadModal.vue

@@ -1,5 +1,5 @@
 <template>
-    <Modal v-model="uploadStatus" :ok-text="textLoading ? $t('updModal.uploading') : isComplete ? $t('updModal.complete'):$t('updModal.comfirmUpd')" :cancel-text="$t('updModal.cancelUpd')" :title="$t('teachContent.btnUpload')" class="upload-modal dark-iview-modal" width="660" :mask-closable="false" :closable="false" @on-ok="modalOk" @on-cancel="modalCancel" :loading="modalLoading">
+    <Modal v-model="uploadStatus" :ok-text="textLoading ? $t('updModal.uploading') : isComplete ? $t('updModal.complete'):$t('updModal.comfirmUpd')" :cancel-text="$t('updModal.cancelUpd')" :title="$t('teachContent.btnUpload')" class="upload-modal dark-iview-modal" width="800" :mask-closable="false" :closable="false" @on-ok="modalOk" @on-cancel="modalCancel" :loading="modalLoading">
         <div class="upload-file-box">
             <Upload type="drag" action="" :show-upload-list="false" multiple :before-upload="customUpload" class="upload-wrap" :disabled="textLoading">
                 <Icon class="upload-icon" custom="iconfont icon-upload" v-show="!uploadedList.length" />
@@ -9,9 +9,9 @@
                 </p>
                 <p class="upload-text" style="font-size:12px;">{{$t('updModal.tips1')}}</p>
                 <p class="upload-text" :style="{fontSize:'12px',marginBottom: uploadedList.length ? '25px':'50px'}">
-                    {{$t('updModal.tips2')}}
-                    <Icon custom="iconfont icon-convert" size="12" class="is-parse-htex" />
-                    {{$t('updModal.tips3')}}
+                    <!-- {{$t('updModal.tips2')}}
+                    <Icon custom="iconfont icon-convert" size="12" class="is-parse-htex" /> -->
+                    * {{$t('updModal.tips3')}}
                 </p>
             </Upload>
             <div class="upload-file-box">
@@ -44,10 +44,14 @@
                         <span class="upload-info-wrap">
                             {{getSizeByBytes(item.loadedBytes)+'/'+getSizeByBytes(item.size)}}
                         </span>
-                        <span v-if="item.extension == 'PPTX'" class="upload-info-wrap parse-label" @click="item.isParse = !item.isParse" :style="{color:item.isParse ? '#1cc0f3':'#808080'}">
+                        <!-- <span v-if="item.extension == 'PPTX'" class="upload-info-wrap parse-label" @click="item.isParse = !item.isParse" :style="{color:item.isParse ? '#1cc0f3':'#808080'}">
                             <Icon class="is-parse-htex" size="12" custom="iconfont icon-convert" />
                             {{$t('updModal.resolve')}}
-                        </span>
+                        </span> -->
+                        <!-- pptx是否转换 -->
+                        <Checkbox class="upload-info-wrap parse-label" v-if="item.extension == 'PPTX'" v-model="item.isParse">
+                            {{$t('updModal.resolve')}}
+                        </Checkbox>
                         <Progress style="top:-10px;" v-if="item.status == 0" :percent="item.loadedBytes * 100 / item.size" status="active" stroke-color="#1CC0F3" :stroke-width="2" hide-info />
                     </div>
                     <div class="upload-item-right">
@@ -365,7 +369,7 @@ export default {
                 err => {
                     console.log(this.$t('updModal.compressImgErr'))
                 }
-            ).finally(()=>{
+            ).finally(() => {
                 this.counterReduce()
             })
         },
@@ -382,7 +386,7 @@ export default {
                 err => {
                     console.log(this.$t('updModal.posterErr'))
                 }
-            ).finally(()=>{
+            ).finally(() => {
                 this.counterReduce()
             })
         }
@@ -505,8 +509,33 @@ export default {
     cursor: pointer;
     font-size: 12px;
     user-select: none;
+    color: white;
 }
+
 .is-parse-htex {
     vertical-align: baseline;
 }
 </style>
+<style>
+.parse-label .ivu-checkbox-inner {
+    background: transparent;
+    width: 14px;
+    height: 14px;
+    border-color: #909090;
+}
+.parse-label .ivu-checkbox-checked .ivu-checkbox-inner:after {
+    content: "";
+    display: block;
+    width: 8px;
+    height: 13px;
+    border-right: 2px solid #fff;
+    border-bottom: 2px solid #fff;
+    transform: rotate(35deg);
+    position: absolute;
+    top: -4px;
+    left: 3px;
+    border-radius: 0;
+    background-color: initial;
+    border-color: #0094ff;
+}
+</style>

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

@@ -36,11 +36,12 @@
 		</div> -->
 		<br />
 		<EventBasicInfo />
+		<!-- 已提交 -->
 		<div v-if="alreadyAnswered" style="text-align: center;padding-top: 15%;">
 			<Icon type="md-checkmark-circle-outline" color="#00ad6c" size="80"/>
 			<p style="font-size: 30px;color:#00ad6c;font-weight: 600; margin:20px;">{{ $t('survey.studentWeb.already') }}</p>
 		</div>
-		
+		<!-- 活动结束 -->
 		<div v-if="!alreadyAnswered && surveyInfo.progress === 'finish'" style="text-align: center;padding-top: 15%;">
 			<Icon type="md-stopwatch" color="#00ad6c" size="80"/>
 			<p style="font-size: 30px;color:#00ad6c;font-weight: 600; margin:20px;">{{ $t('survey.studentWeb.overtime') }}</p>

+ 2 - 0
TEAMModelOS/ClientApp/src/service/User.js

@@ -77,6 +77,8 @@ export class User {
           localStorage.removeItem('school_profile')
           localStorage.removeItem('student_profile')
           localStorage.removeItem('filterConditions')
+          localStorage.removeItem('cacheSchoolFiles')
+          localStorage.removeItem('cachePrivFiles')
           
           // 重置登录状态
           User.$access.reset();

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

@@ -701,8 +701,6 @@ export default {
                         } else {
                             targetBlob = new BlobTool(privateSas.url, privateSas.name, privateSas.sas, 'private')
                         }
-                        console.log('scope', this.evaluationInfo.scope)
-                        console.log('target', targetBlob)
                         let privateBlob = new BlobTool(privateSas.url, privateSas.name, privateSas.sas, 'private')
                         let schoolBlob = undefined
                         let targetFolder = 'exam/' + examId + '/paper/'

+ 7 - 1
TEAMModelOS/ClientApp/src/view/learnactivity/MgtPrivEva.less

@@ -69,7 +69,7 @@
             }
 
             .evaluation-type span {
-                margin-right: 10px;
+                margin-right: 5px;
             }
         }
     }
@@ -264,4 +264,10 @@
 }
 .mock-tea-scoring{
     margin-right: 40px;
+}
+.ev-info-tag{
+    color: #dadada;
+    border: 1px solid #a5a5a5;
+    border-radius: 2px;
+    padding: 1px 2px;
 }

+ 23 - 10
TEAMModelOS/ClientApp/src/view/learnactivity/MgtPrivEva.vue

@@ -29,25 +29,30 @@
                             <p class="evaluation-type">
                                 <Icon type="md-time" style="margin-right:5px;" size="16" />
                                 <span>{{$t('learnActivity.mgtScEv.createTime')}}{{dateFormat(item.startTime)}}</span>
-                                <span class="evaluation-status-tag" :style="{ borderColor: item.progress == 'pending' ? '#0BADD4' : item.progress == 'going' ? '#1CC0F3' : '#949594', color: (item.progress == 'pending' ? '#0BADD4' : item.progress == 'going' ? '#1CC0F3' : '#949594')}">
-                                    {{ item.progress == 'pending' ? $t('learnActivity.mgtScEv.pending') : item.progress == 'going' ? $t('learnActivity.mgtScEv.going') : $t('learnActivity.mgtScEv.finish') }}
-                                </span>
                             </p>
                             <p class="evaluation-type">
                                 <Icon type="md-time" style="margin-right:5px;" size="16" />
                                 <span>{{$t('learnActivity.mgtScEv.endTime')}}{{dateFormat(item.endTime)}}</span>
-                                <span v-if="item.progress == 'going'" class="handle-end-tag" @click="handleEnd(index)">
-                                    {{$t('learnActivity.mgtScEv.stop')}}
-                                </span>
                             </p>
                             <div style="display:inline-flex">
                                 <p class="evaluation-type">
-                                    <Icon type="ios-cube" style="margin-right:5px;" size="14" />
-                                    <span>{{$t('learnActivity.mgtScEv.evType')}}{{getTypeLabel(item.type)}}</span>
+                                    <span class="ev-info-tag">{{getTypeLabel(item.type)}}</span>
                                 </p>
+                                <!-- 评测模式 -->
                                 <p class="evaluation-type">
-                                    <Icon type="ios-people" style="margin-right:5px;" size="16" />
-                                    <span>{{$t('learnActivity.mgtScEv.stuCount')}}{{item.stuCount}}</span>
+                                    <span class="ev-info-tag">{{getModeLabel(item.source)}}</span>
+                                </p>
+                                <!-- 活动状态 -->
+                                <p class="evaluation-type">
+                                    <span class="evaluation-status-tag" :style="{ borderColor: item.progress == 'pending' ? '#0BADD4' : item.progress == 'going' ? '#1CC0F3' : '#949594', color: (item.progress == 'pending' ? '#0BADD4' : item.progress == 'going' ? '#1CC0F3' : '#949594')}">
+                                        {{ item.progress == 'pending' ? $t('learnActivity.mgtScEv.pending') : item.progress == 'going' ? $t('learnActivity.mgtScEv.going') : $t('learnActivity.mgtScEv.finish') }}
+                                    </span>
+                                </p>
+                                <!-- 立即结束 -->
+                                <p class="evaluation-type">
+                                    <span v-if="item.progress == 'going'" class="handle-end-tag" @click="handleEnd(index)">
+                                        {{$t('learnActivity.mgtScEv.stop')}}
+                                    </span>
                                 </p>
                             </div>
                         </div>
@@ -129,6 +134,14 @@ export default {
         }
     },
     methods: {
+        /**获取mode对应的label */
+        getModeLabel(code) {
+            for (let item of this.$GLOBAL.EV_MODE()) {
+                if (item.value == code) {
+                    return item.label
+                }
+            }
+        },
         dropdownStates(flag) {
             if (!flag) this.filterByTag()
         },

+ 7 - 1
TEAMModelOS/ClientApp/src/view/learnactivity/MgtSchoolEva.less

@@ -68,7 +68,7 @@
             }
 
             .evaluation-type span {
-                margin-right: 10px;
+                margin-right: 5px;
             }
         }
     }
@@ -236,4 +236,10 @@
 }
 .filter-item{
     margin: 10px 5px;
+}
+.ev-info-tag{
+    color: #dadada;
+    border: 1px solid #a5a5a5;
+    border-radius: 2px;
+    padding: 1px 2px;
 }

+ 32 - 26
TEAMModelOS/ClientApp/src/view/learnactivity/MgtSchoolEva.vue

@@ -20,7 +20,7 @@
                         <Icon type="md-trash" v-show="evaListShow.length" class="to-create-icon" :title="$t('learnActivity.mgtScEv.delete')" @click="deleteEvaluation" v-if="$access.can('admin.*|schoolAc-upd')" />
                         <Icon type="md-create" v-show="evaListShow.length && evaListShow[curEvaIndex] && evaListShow[curEvaIndex].progress == 'pending'" class="to-create-icon" @click="editEvaluation" :title="$t('learnActivity.mgtScEv.edit')" v-if="$access.can('admin.*|schoolAc-upd')" />
                         <!-- 筛选 -->
-                        <Poptip style="float:right" trigger="hover" :offset="-10" theme="light">
+                        <Poptip style="float:right" trigger="click" :offset="-10" theme="light">
                             <Icon type="ios-funnel" class="to-create-icon" :color="filter.status || filter.type || filter.mode ? '#2d8cf0':'#fff'" />
                             <div slot="content">
                                 <div class="filter-item">
@@ -60,30 +60,38 @@
                             <p class="evaluation-type">
                                 <Icon type="md-time" style="margin-right:5px;" size="16" />
                                 <span>{{$t('learnActivity.mgtScEv.createTime')}}{{dateFormat(item.startTime)}}</span>
-                                <span class="evaluation-status-tag" :style="{ borderColor: item.progress == 'pending' ? '#0BADD4' : item.progress == 'going' ? '#1CC0F3' : '#949594', color: (item.progress == 'pending' ? '#0BADD4' : item.progress == 'going' ? '#1CC0F3' : '#949594')}">
-                                    {{ item.progress == 'pending' ? $t('learnActivity.mgtScEv.pending') : item.progress == 'going' ? $t('learnActivity.mgtScEv.going') : $t('learnActivity.mgtScEv.finish') }}
-                                </span>
                             </p>
                             <p class="evaluation-type">
                                 <Icon type="md-time" style="margin-right:5px;" size="16" />
                                 <span>{{$t('learnActivity.mgtScEv.endTime')}}{{dateFormat(item.endTime)}}</span>
-                                <span v-if="item.progress == 'going'" class="handle-end-tag" @click="handleEnd(index)">
-                                    {{$t('learnActivity.mgtScEv.stop')}}
-                                </span>
+
                             </p>
+                            <!-- 学生人数 -->
+                            <!-- <p class="evaluation-type">
+                                <Icon type="ios-people" style="margin-right:5px;" size="16" />
+                                <span>{{$t('learnActivity.mgtScEv.stuCount')}}{{item.stuCount}}</span>
+                            </p> -->
                             <div style="display:inline-flex">
-                                <!-- <p class="evaluation-type">
-                                    <Icon type="ios-cube" style="margin-right:5px;" size="14" />
-                                    <span>{{$t('learnActivity.mgtScEv.evType')}}{{getTypeLabel(item.type)}}</span>
-                                </p> -->
                                 <p class="evaluation-type">
-                                    <Icon type="ios-cube" style="margin-right:5px;" size="14" />
-                                    <span>{{$t('learnActivity.mgtScEv.evType')}}{{getModeLabel(item.source)}}</span>
+                                    <span class="ev-info-tag">{{getTypeLabel(item.type)}}</span>
+                                </p>
+                                <!-- 评测模式 -->
+                                <p class="evaluation-type">
+                                    <span class="ev-info-tag">{{getModeLabel(item.source)}}</span>
+                                </p>
+                                <!-- 活动状态 -->
+                                <p class="evaluation-type">
+                                    <span class="evaluation-status-tag" :style="{ borderColor: item.progress == 'pending' ? '#0BADD4' : item.progress == 'going' ? '#1CC0F3' : '#949594', color: (item.progress == 'pending' ? '#0BADD4' : item.progress == 'going' ? '#1CC0F3' : '#949594')}">
+                                        {{ item.progress == 'pending' ? $t('learnActivity.mgtScEv.pending') : item.progress == 'going' ? $t('learnActivity.mgtScEv.going') : $t('learnActivity.mgtScEv.finish') }}
+                                    </span>
                                 </p>
+                                <!-- 立即结束 -->
                                 <p class="evaluation-type">
-                                    <Icon type="ios-people" style="margin-right:5px;" size="16" />
-                                    <span>{{$t('learnActivity.mgtScEv.stuCount')}}{{item.stuCount}}</span>
+                                    <span v-if="item.progress == 'going'" class="handle-end-tag" @click="handleEnd(index)">
+                                        {{$t('learnActivity.mgtScEv.stop')}}
+                                    </span>
                                 </p>
+
                             </div>
                         </div>
                         <EmptyData v-if="evaListShow.length == 0" style="margin-top:180px;" :textContent="`${scope == 'school' ? filterPeriodName:''}${$t('learnActivity.mgtScEv.nodata')}`"></EmptyData>
@@ -99,18 +107,15 @@
                     <span :class="curBarIndex == 1 ? 'evalustion-bar-item line-bottom-active line-bottom':'evalustion-bar-item line-bottom'" @click="selectBar(1)">
                         {{$t('learnActivity.mgtScEv.tab2')}}
                     </span>
-                    <!-- <span v-show="evaListShow[curEvaIndex] && evaListShow[curEvaIndex].source == '2'" :class="curBarIndex == 2 ? 'evalustion-bar-item line-bottom-active line-bottom':'evalustion-bar-item line-bottom'" @click="selectBar(2)">
-                        {{$t('learnActivity.mgtScEv.markSetting')}}
-                    </span>
-                    <span v-show="evaListShow[curEvaIndex] && evaListShow[curEvaIndex].source == '2'" :class="curBarIndex == 3 ? 'evalustion-bar-item line-bottom-active line-bottom':'evalustion-bar-item line-bottom'" @click="selectBar(3)">
-                        {{$t('learnActivity.mgtScEv.markData')}}
-                    </span> -->
-                    <span :class="curBarIndex == 2 ? 'evalustion-bar-item line-bottom-active line-bottom':'evalustion-bar-item line-bottom'" @click="selectBar(2)">
+
+                    <!-- 阅卷功能0531之前完成不了,暂时隐藏 -->
+                    <!-- <span :class="curBarIndex == 2 ? 'evalustion-bar-item line-bottom-active line-bottom':'evalustion-bar-item line-bottom'" @click="selectBar(2)">
                         {{$t('learnActivity.mgtScEv.markSetting')}}
                     </span>
                     <span :class="curBarIndex == 3 ? 'evalustion-bar-item line-bottom-active line-bottom':'evalustion-bar-item line-bottom'" @click="selectBar(3)">
                         {{$t('learnActivity.mgtScEv.markData')}}
-                    </span>
+                    </span> -->
+
                     <!--取消一键作答和一键评分功能-->
                     <!--<div style="float:right;" v-if="$access.ability('admin','mock-eva').validateAll" v-show="evaListShow[curEvaIndex] && evaListShow[curEvaIndex].progress == 'going'">
                         <Tooltip :content="$t('learnActivity.mgtScEv.autoTips1')" :max-width="240">
@@ -120,6 +125,7 @@
                             <Button type="warning" size="small" :loading="scoreLoading" class="mock-tea-scoring" @click="mockScoring">{{$t('learnActivity.mgtScEv.autoScore')}}</Button>
                         </Tooltip>
                     </div>-->
+
                     <!-- 保存阅卷配置 -->
                     <div style="float:right;" class="common-save-btn" v-show="curBarIndex == 2">
                         <Button class="mock-stu-answer" type="text" :loading="btnLoading" @click="saveMarkSetting" icon="ios-albums-outline">
@@ -183,7 +189,7 @@ export default {
     inject: ['reload'],
     data() {
         return {
-            btnLoading:false,
+            btnLoading: false,
             keyword: '',
             isSearch: false,
             answerLoading: false,
@@ -212,7 +218,7 @@ export default {
     },
     methods: {
         //保存阅卷配置
-        saveMarkSetting(){
+        saveMarkSetting() {
             console.log(this.$refs['markSetting'])
             this.$refs['markSetting'].saveSetting()
         },
@@ -248,7 +254,7 @@ export default {
             this.evaListShow = curPdEv.filter(item => {
                 let status = !this.filter.status || (this.filter.status == item.progress)
                 let type = !this.filter.type || (this.filter.type == item.type)
-                let mode = !this.filter.mode || (this.filter.type == item.source)
+                let mode = !this.filter.mode || (this.filter.mode == item.source)
                 return status && type && mode
             })
         },

+ 3 - 2
TEAMModelOS/ClientApp/src/view/schoolmgmt/SystemSetting/NewSystemSetting.vue

@@ -63,8 +63,9 @@
                     <div class="col-title">
                         <span>{{$t('schoolBaseInfo.periodSettingLabel')}}</span>
                         <div class="action-btx-box">
-                            <Icon v-if="$access.ability('admin','schoolSetting-upd').validateAll" type="md-add" @click="addPeriod()" class="action-btn-icon" />
-                            <Icon v-if="$access.ability('admin','schoolSetting-upd').validateAll" type="md-trash" @click="showComfirmDelPeriod()" :title="$t('schoolBaseInfo.delete')" :class="editIconStatus ? 'action-btn-icon':'custom-label-disabeld action-btn-icon'" />
+                            <!-- 学段根据学校购买数量进行分配,学校只能进行编辑操作,不能新增和删除 -->
+                            <!-- <Icon v-if="$access.ability('admin','schoolSetting-upd').validateAll" type="md-add" @click="addPeriod()" class="action-btn-icon" />
+                            <Icon v-if="$access.ability('admin','schoolSetting-upd').validateAll" type="md-trash" @click="showComfirmDelPeriod()" :title="$t('schoolBaseInfo.delete')" :class="editIconStatus ? 'action-btn-icon':'custom-label-disabeld action-btn-icon'" /> -->
                             <Icon v-if="$access.ability('admin','schoolSetting-upd').validateAll" type="md-create" @click.stop="editPrdIndex = curPriodIndex" :title="$t('schoolBaseInfo.editLabel')" :class="editIconStatus ? 'action-btn-icon':'custom-label-disabeld action-btn-icon'" />
                         </div>
                     </div>

+ 4 - 4
TEAMModelOS/ClientApp/src/view/teachcontent/index.less

@@ -116,7 +116,7 @@
     height: 100%;
 
     .content-type-list {
-        width: 220px;
+        width: 200px;
         border-right: 1px solid @borderColor;
         height: 100%;
         float: left;
@@ -202,8 +202,8 @@
 
         .content-type-item {
             width: 100%;
-            height: 90px;
-            line-height: 90px;
+            height: 80px;
+            line-height: 80px;
             text-align: center;
             border-bottom: 1px solid @borderColor;
             cursor: pointer;
@@ -242,7 +242,7 @@
     }
 
     .content-file-list-box {
-        width: ~'calc(100% - 220px)';
+        width: ~'calc(100% - 200px)';
         float: right;
         height: 100%;
         position: relative;

+ 148 - 85
TEAMModelOS/ClientApp/src/view/teachcontent/index.vue

@@ -4,76 +4,79 @@
         <div class="teach-content-main">
             <!--文件分类列表-->
             <div class="content-type-list">
-                <div :class="item.type === activeType ? 'content-type-item content-type-item-active':'content-type-item'" v-for="(item,index) in contentTypeList" :key="index" @click="selectFileType(index)">
-                    <Icon v-if="item.icon.indexOf('iconfont') != -1" :custom="item.icon" color="white" size="20" />
-                    <Icon v-else :type="item.icon" color="white" size="20" />
-                    <span class="content-type-label">{{item.label}}</span>
-                    <Tooltip transfer theme="light" :content="$t('teachContent.resTips')" :max-width="248" placement="bottom" offset="-20">
-                        <Icon type="ios-alert-outline" color="#1cc0f3" size="20" v-if="index == 0" style="position:absolute;top:-16px;margin-left:5px;" />
-                    </Tooltip>
-                </div>
-                <!-- Blob空间计算 -->
-                <div :class="($access.can('admin.*|content-school-upd') || routerScope == 'private') ? 'space-box animated fadeIn fast' : 'space-box animated fadeOut fast'">
-                    <div class="percent-box">
-                        <span class="percent-item-span storage-full" :style="{ width: '100%' }" v-if="sizeInfo.total > storageSpace"></span>
-                        <span class="percent-item-span storage-res" :style='{ width: getPercent(sizeInfo.res) }'></span>
-                        <span class="percent-item-span storage-image" :style='{ width: getPercent(sizeInfo.image) }'></span>
-                        <span class="percent-item-span storage-video" :style='{ width: getPercent(sizeInfo.video) }'></span>
-                        <span class="percent-item-span storage-audio" :style='{ width: getPercent(sizeInfo.audio) }'></span>
-                        <span class="percent-item-span storage-doc" :style='{ width: getPercent(sizeInfo.doc) }'></span>
-                        <span class="percent-item-span storage-other" :style='{ width: getPercent(sizeInfo.other) }'></span>
-                        <span class="percent-item-span storage-data" :style='{ width: getPercent(sizeInfo.data) }'></span>
+                <vuescroll>
+                    <div :class="item.type === activeType ? 'content-type-item content-type-item-active':'content-type-item'" v-for="(item,index) in contentTypeList" :key="index" @click="selectFileType(index)">
+                        <Icon v-if="item.icon.indexOf('iconfont') != -1" :custom="item.icon" color="white" size="20" />
+                        <Icon v-else :type="item.icon" color="white" size="20" />
+                        <span class="content-type-label">{{item.label}}</span>
+                        <Tooltip transfer theme="light" :content="item.tips" :max-width="248" placement="bottom" offset="-20">
+                            <Icon type="ios-alert-outline" color="#1cc0f3" size="20" v-if="item.tips" style="position:absolute;top:-16px;margin-left:5px;" />
+                        </Tooltip>
                     </div>
-                    <p :style="{color: sizeInfo.total > storageSpace ? 'red' : 'white', fontSize: sizeInfo.total > storageSpace ? '14px' : '12px'}">
-                        <span>
-                            {{$t('teachContent.space')}}
-                        </span>
-                        <span v-show="sizeLoading">
-                            {{$t('teachContent.calcing')}}
-                        </span>
-                        <span v-show="!sizeLoading">
-                            {{$jsFn.formatBytes(sizeInfo.total)}}/{{ $jsFn.formatBytes(storageSpace)}}
-                        </span>
-                        <span v-if="sizeInfo.total > storageSpace">{{$t('teachContent.blobFull')}}</span>
-                    </p>
-                    <div class="percent-detail-box">
-                        <p class="percent-detail-text" v-if="sizeInfo.res != 0">
-                            <span class="text-dot storage-res"></span>
-                            <span>{{$t('teachContent.filterRes')}}</span>
-                            <span class="text-size">{{$jsFn.formatBytes(sizeInfo.res)}}</span>
-                        </p>
-                        <p class="percent-detail-text" v-if="sizeInfo.image != 0">
-                            <span class="text-dot storage-image"></span>
-                            <span>{{$t('teachContent.filterPicture')}}</span>
-                            <span class="text-size">{{$jsFn.formatBytes(sizeInfo.image)}}</span>
-                        </p>
-                        <p class="percent-detail-text" v-if="sizeInfo.video != 0">
-                            <span class="text-dot storage-video"></span>
-                            <span>{{$t('teachContent.filterVideo')}}</span>
-                            <span class="text-size">{{$jsFn.formatBytes(sizeInfo.video)}}</span>
-                        </p>
-                        <p class="percent-detail-text" v-if="sizeInfo.audio != 0">
-                            <span class="text-dot storage-audio"></span>
-                            <span>{{$t('teachContent.filterAudio')}}</span>
-                            <span class="text-size">{{$jsFn.formatBytes(sizeInfo.audio)}}</span>
-                        </p>
-                        <p class="percent-detail-text" v-if="sizeInfo.doc != 0">
-                            <span class="text-dot storage-doc"></span>
-                            <span>{{$t('teachContent.filterDoc')}}</span>
-                            <span class="text-size">{{$jsFn.formatBytes(sizeInfo.doc)}}</span>
-                        </p>
-                        <p class="percent-detail-text" v-if="sizeInfo.other != 0">
-                            <span class="text-dot storage-other"></span>
-                            <span>{{$t('teachContent.otherType')}}</span>
-                            <span class="text-size">{{$jsFn.formatBytes(sizeInfo.other)}}</span>
-                        </p>
-                        <p class="percent-detail-text" v-if="sizeInfo.data != 0">
-                            <span class="text-dot storage-data"></span>
-                            <span>{{$t('teachContent.appData')}}</span>
-                            <span class="text-size">{{$jsFn.formatBytes(sizeInfo.data)}}</span>
+                    <!-- Blob空间计算 -->
+                    <div :class="($access.can('admin.*|content-school-upd') || routerScope == 'private') ? 'space-box animated fadeIn fast' : 'space-box animated fadeOut fast'">
+                        <div class="percent-box">
+                            <span class="percent-item-span storage-full" :style="{ width: '100%' }" v-if="sizeInfo.total > storageSpace"></span>
+                            <span class="percent-item-span storage-res" :style='{ width: getPercent(sizeInfo.res) }'></span>
+                            <span class="percent-item-span storage-image" :style='{ width: getPercent(sizeInfo.image) }'></span>
+                            <span class="percent-item-span storage-video" :style='{ width: getPercent(sizeInfo.video) }'></span>
+                            <span class="percent-item-span storage-audio" :style='{ width: getPercent(sizeInfo.audio) }'></span>
+                            <span class="percent-item-span storage-doc" :style='{ width: getPercent(sizeInfo.doc) }'></span>
+                            <span class="percent-item-span storage-other" :style='{ width: getPercent(sizeInfo.other) }'></span>
+                            <span class="percent-item-span storage-data" :style='{ width: getPercent(sizeInfo.data) }'></span>
+                        </div>
+                        <p :style="{color: sizeInfo.total > storageSpace ? 'red' : 'white', fontSize: sizeInfo.total > storageSpace ? '14px' : '12px'}">
+                            <span>
+                                {{$t('teachContent.space')}}
+                            </span>
+                            <span v-show="sizeLoading">
+                                {{$t('teachContent.calcing')}}
+                            </span>
+                            <span v-show="!sizeLoading">
+                                {{$jsFn.formatBytes(sizeInfo.total)}}/{{ $jsFn.formatBytes(storageSpace)}}
+                            </span>
+                            <span v-if="sizeInfo.total > storageSpace">{{$t('teachContent.blobFull')}}</span>
                         </p>
+                        <div class="percent-detail-box">
+                            <p class="percent-detail-text" v-if="sizeInfo.res != 0">
+                                <span class="text-dot storage-res"></span>
+                                <span>{{$t('teachContent.filterRes')}}</span>
+                                <span class="text-size">{{$jsFn.formatBytes(sizeInfo.res)}}</span>
+                            </p>
+                            <p class="percent-detail-text" v-if="sizeInfo.image != 0">
+                                <span class="text-dot storage-image"></span>
+                                <span>{{$t('teachContent.filterPicture')}}</span>
+                                <span class="text-size">{{$jsFn.formatBytes(sizeInfo.image)}}</span>
+                            </p>
+                            <p class="percent-detail-text" v-if="sizeInfo.video != 0">
+                                <span class="text-dot storage-video"></span>
+                                <span>{{$t('teachContent.filterVideo')}}</span>
+                                <span class="text-size">{{$jsFn.formatBytes(sizeInfo.video)}}</span>
+                            </p>
+                            <p class="percent-detail-text" v-if="sizeInfo.audio != 0">
+                                <span class="text-dot storage-audio"></span>
+                                <span>{{$t('teachContent.filterAudio')}}</span>
+                                <span class="text-size">{{$jsFn.formatBytes(sizeInfo.audio)}}</span>
+                            </p>
+                            <p class="percent-detail-text" v-if="sizeInfo.doc != 0">
+                                <span class="text-dot storage-doc"></span>
+                                <span>{{$t('teachContent.filterDoc')}}</span>
+                                <span class="text-size">{{$jsFn.formatBytes(sizeInfo.doc)}}</span>
+                            </p>
+                            <p class="percent-detail-text" v-if="sizeInfo.other != 0">
+                                <span class="text-dot storage-other"></span>
+                                <span>{{$t('teachContent.otherType')}}</span>
+                                <span class="text-size">{{$jsFn.formatBytes(sizeInfo.other)}}</span>
+                            </p>
+                            <p class="percent-detail-text" v-if="sizeInfo.data != 0">
+                                <span class="text-dot storage-data"></span>
+                                <span>{{$t('teachContent.appData')}}</span>
+                                <span class="text-size">{{$jsFn.formatBytes(sizeInfo.data)}}</span>
+                            </p>
+                        </div>
                     </div>
-                </div>
+                </vuescroll>
+
             </div>
             <!--文件表格列表-->
             <div class="content-file-list-box">
@@ -81,12 +84,12 @@
                 <div class="content-file-filter">
                     <Input v-model="keyWord" search size="small" :placeholder="$t('teachContent.searchText')" class="key-word-search" @on-change="searchKeyWord" @on-search="searchKeyWord" />
                     <CheckboxGroup v-model="extFilter" style="display:inline-block;margin-left:38px;margin-top:13px;" @on-change="filterFileByExtension">
-                        <Checkbox :label="item" v-for="(item ,index) in extensions" :key="index" v-if="activeType !== 0" :class="activeType !== 0 ? 'animated fadeIn' : 'animated fadeOut'">
+                        <Checkbox :label="item" v-for="(item ,index) in extensions" :key="index">
                             <span>{{item}}</span>
                         </Checkbox>
                     </CheckboxGroup>
                     <span v-if="$access.can('admin.*|content-school-upd') || routerScope == 'private'" class="action-btn-wrap" @click="delFileBatch">
-                        <Icon v-if="$access.can('admin.*|content-school-upd')" type="md-trash" class="toggle-btn-icon" />
+                        <Icon type="md-trash" class="toggle-btn-icon" />
                         {{$t('teachContent.delBatch')}}
                     </span>
                     <span v-if="$access.can('admin.*|content-school-upd') || routerScope == 'private'" @click="showUpload" class="action-btn-wrap">
@@ -102,7 +105,7 @@
                 <!--文件列表区域-->
                 <div class="content-file-list dark-iview-loading" id="card-box">
                     <!--table形式-->
-                    <div v-if="activeType === 'res' || activeType === 'doc' || activeType === 'other'|| activeType === 'audio' || !showType" class="animated fadeIn dark-iview-table">
+                    <div v-if="activeType === 'recent' || activeType === 'res' || activeType === 'doc' || activeType === 'other'|| activeType === 'audio' || !showType" class="animated fadeIn dark-iview-table">
                         <Table :columns="fileColumns" :data="fileListShow" class="animated fadeIn" @on-selection-change="handleSelect">
                             <template slot-scope="{ row, index }" slot="size">
                                 <div>
@@ -155,7 +158,7 @@
                                 <div class="item-tools">
                                     <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="openPreviewFile(props.index)" />
-                                    <Icon v-if="$access.can('admin.*|content-school-upd')" 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-school-upd') || routerScope == 'private'" type="md-trash" size="18" color="white" :title="$t('teachContent.tips7')" @click.stop="delFile(props.value, props.index)" />
                                     <span style="color:white; float:right;margin-right:10px;">{{$jsFn.formatBytes(props.value.size)}}</span>
                                 </div>
                             </div>
@@ -192,7 +195,6 @@ import FileSaver from "file-saver";
 import JSZip from "jszip";
 import elementResizeDetectorMaker from "element-resize-detector"
 import VueWaterfall from 'vue-waterfall-easy'
-import { file } from 'jszip';
 export default {
     components: {
         VueWaterfall
@@ -219,7 +221,7 @@ export default {
             previewStatus: false,
             storageSpace: 0,
             keyWord: '',
-            activeType: 'res',
+            activeType: 'recent',
             fileList: {},
             fileListShow: [],
             searchResult: [],
@@ -323,6 +325,7 @@ export default {
         },
         //确认上传
         async confirmUpd() {
+            this.cacheRecent(this.preUpdFiles)
             for (let file of this.preUpdFiles) {
                 if (!this.fileList[file.type]) {
                     this.fileList[file.type] = []
@@ -344,7 +347,7 @@ export default {
                         n = n.replace(file.name, file.name.slice(0, file.name.lastIndexOf('.'))) + '.png'
                         file['thum'] = file.url.replace(file.blob, n)
                     }
-                    if (this.activeType == file.type) {
+                    if (this.activeType == file.type || this.activeType == 'recent') {
                         this.fileListShow.unshift(file)
                         this.fileList[file.type].unshift(file)
                     } else {
@@ -378,6 +381,40 @@ export default {
             }
             this.preUpdFiles = []
         },
+        //通过localstorage存储最近上传的文件(默认最多20条)
+        cacheRecent(files) {
+            let cacheFiles = []
+            if (this.routerScope == 'private') {
+                cacheFiles = JSON.parse(localStorage.getItem('cachePrivFiles') || '[]')
+            } else {
+                cacheFiles = JSON.parse(localStorage.getItem('cacheSchoolFiles') || '[]')
+            }
+            let f = files.map(item => {
+                return {
+                    blob: item.blob,
+                    createTime: item.createTime,
+                    extension: item.extension,
+                    name: item.name,
+                    size: item.size,
+                    thum: item.thum,
+                    type: item.type,
+                    url: item.url
+                }
+            })
+            cacheFiles.push(...f)
+            cacheFiles.sort((a, b) => {
+                return b.createTime - a.createTime
+            })
+            let len = cacheFiles.length
+            if (len > 20) {
+                cacheFiles.splice(19, len - 20)
+            }
+            if (this.routerScope == 'private') {
+                localStorage.setItem('cachePrivFiles', JSON.stringify(cacheFiles))
+            } else {
+                localStorage.setItem('cacheSchoolFiles', JSON.stringify(cacheFiles))
+            }
+        },
         //计算空间占比
         getPercent(size) {
             if (this.sizeInfo.total > this.storageSpace) {
@@ -464,10 +501,17 @@ export default {
                 }
             ]
             this.contentTypeList = [
+                {
+                    label: '最近',
+                    type: 'recent',
+                    icon: 'md-time',
+                    tips: '仅本地临时缓存最近上传的资源,最多保存20条。退出账号或者更换电脑记录将会清空。'
+                },
                 {
                     label: this.$t('teachContent.filterRes'),
                     type: 'res',
-                    icon: 'iconfont icon-htex'
+                    icon: 'iconfont icon-htex',
+                    tips: this.$t('teachContent.resTips')
                 },
                 {
                     label: this.$t('teachContent.filterPicture'),
@@ -543,7 +587,7 @@ export default {
                 this.urlString = sasRes.url
                 this.containerName = sasRes.name
                 this.containerClient = new BlobTool(this.urlString, this.containerName, this.sasString, scope)
-                this.findFileList()
+                // this.findFileList()
             } else {
                 this.$Message.error(this.$t('teachContent.authErr'))
             }
@@ -834,18 +878,17 @@ export default {
                         }
                         this.fileList[this.activeType] = res.blobList
                         this.fileListShow = this._.cloneDeep(this.fileList[this.activeType])
-                        setTimeout(() => {
-                            this.isLoading = false
-                        }, 500)
                         this.searchBefore = this.fileList[this.activeType]
                         this.getFilesExtension()
                     },
                     (err) => {
-                        setTimeout(() => {
-                            this.isLoading = false
-                        }, 500)
+
                     }
-                )
+                ).finally(() => {
+                    setTimeout(() => {
+                        this.isLoading = false
+                    }, 500)
+                })
             }
         },
 
@@ -874,7 +917,21 @@ export default {
                 }
             }
         },
-
+        //获取本地缓存最近上传数据
+        getCacheFiles() {
+            let files = []
+            if (this.routerScope == 'private') {
+                files = JSON.parse(localStorage.getItem('cachePrivFiles') || '[]')
+            } else {
+                files = JSON.parse(localStorage.getItem('cacheSchoolFiles') || '[]')
+            }
+            files.forEach(item => {
+                item.url = item.url + this.sasString
+            })
+            this.fileListShow = files
+            this.searchBefore = this.fileListShow
+            this.extensions = []
+        },
         /**
          * 根据文件类型筛选
          * @param index
@@ -883,6 +940,11 @@ export default {
             this.extFilter = []
             this.selections.length = 0
             this.activeType = this.contentTypeList[index].type
+            //最近上传文件读取本地storage
+            if (this.activeType == 'recent') {
+                this.getCacheFiles()
+                return
+            }
             if (this.isFirst[this.activeType]) {
                 this.fileListShow.length = 0
                 this.findFileList()
@@ -948,6 +1010,7 @@ export default {
         ).finally(() => {
             this.sizeLoading = false
         })
+        this.getCacheFiles()
     },
     watch: {
         $route: {
@@ -960,7 +1023,7 @@ export default {
                     this.routerScope = 'private'
                     this.storageSpace = this.$GLOBAL.PRIVATE_SPACE
                 }
-                this.activeType = 'res'
+                // this.activeType = 'recent'
                 this.getSasStr()
             },
             immediate: true

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

@@ -245,7 +245,7 @@ namespace TEAMModelOS.Controllers
         /// <returns></returns>
         [ProducesDefaultResponseType]
         [HttpPost("find-id")]
-        [AuthToken(Roles = "teacher,admin")]
+        [AuthToken(Roles = "teacher,admin,student")]
         public async Task<IActionResult> FindById(JsonElement requert)
         {
             try

+ 1 - 1
TEAMModelOS/Controllers/Common/VoteController.cs

@@ -245,7 +245,7 @@ namespace TEAMModelOS.Controllers.Learn
         /// <returns></returns>
         [ProducesDefaultResponseType]
         [HttpPost("find-id")]
-        [AuthToken(Roles = "teacher,admin")]
+        [AuthToken(Roles = "teacher,admin,student")]
         public async Task<IActionResult> FindById(JsonElement requert)
         {
             try