浏览代码

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

OnePsycho 4 年之前
父节点
当前提交
6f1c65376b

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

@@ -127,9 +127,9 @@
     }
 </script>
 <style>
-  .ivu-drawer-right {
+  /*.ivu-drawer-right {
     width:400px !important;
-  }
+  }*/
 </style>
 <style scoped>
 .header_box{

+ 1 - 1
TEAMModelOS/ClientApp/src/components/learnactivity/AnalyseChart.vue

@@ -295,7 +295,7 @@
     #knowledge{
         width:420px;
         height:420px;
-        margin-left:50px;
+        margin-left:100px;
     }  
     #score{
         width:450px;

+ 1 - 1
TEAMModelOS/ClientApp/src/components/learnactivity/GradeList.less

@@ -75,7 +75,7 @@
     width: 100%;
 }
 .type-list{
-    width:50%;
+    width:100%;
     padding-top:5px;
     margin-left:5px;
 }

+ 12 - 1
TEAMModelOS/ClientApp/src/components/learnactivity/GradeList.vue

@@ -110,6 +110,9 @@
                         }
                     }
                 }
+                //if(num == this.studentData.length){
+                //    alert('OK')
+                //}
                 return num
             }
         },
@@ -185,7 +188,6 @@
                                 this.answerInfo = []
                                 this.answer = res.result.data.answers
                                 if (this.answer !== null) {
-                                    console.log(this.answer)
                                     this.answerInfo = this.getAnswer(this.answer)
                                     this.dealPaper()
                                 }
@@ -287,7 +289,16 @@
             }
         },
         mounted() {
+            console.log(this.paperInfo)
             this.getStudentData()
+        },
+        watch: {
+            paperInfo: {
+                handel(newVal, oldVal) {
+                    console.log('修改测试内容')
+                },
+                 deep: true
+            }
         }
     }
 </script>

+ 1 - 0
TEAMModelOS/ClientApp/src/components/learnactivity/ReviewPaperList.vue

@@ -180,6 +180,7 @@
 
 		methods: {
 			inputScore(data) {
+				console.log(data)
 				if (data.score == "") {
 					this.$Message.warning('请完成题目评分!')
                 }

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

@@ -456,12 +456,13 @@ import router from '../../router'
                 )
             },
             /**
-             * 查找教课程下的教室
+             * 查找教课程下的教室
              * */
             findClassroom() {
                 if (this.classroomList.length == 0) {
-                    let requestData = this.$store.state.userInfo.TEAMModelId
-                    this.$api.learnActivity.FindClassroomByTeacherId(requestData).then(
+                        this.$api.learnActivity.FindClassroomByTeacherId({
+                            code:this.$store.state.userInfo.TEAMModelId
+                        }).then(
                         res => {
                             if (res.error == null) {
                                 this.classroomList = res.result.data

+ 15 - 0
TEAMModelOS/ClientApp/src/view/school-mgmt/SystemSetting/SystemSettingNew.less

@@ -507,4 +507,19 @@
             }
         }
     }
+}
+
+.grade-item {
+    display: flex;
+    width: 100%;
+    border-bottom: 1px solid #282828;
+    padding: 5px 2px;
+    align-items:baseline;
+    .grade-order {
+        flex: 0.1;
+    }
+
+    .grade-name {
+        flex: 0.8;
+    }
 }

+ 45 - 23
TEAMModelOS/ClientApp/src/view/school-mgmt/SystemSetting/SystemSettingNew.vue

@@ -27,20 +27,22 @@
                                 <Icon v-if="$access.ability('admin','schoolSetting-upd').validateAll" type="md-trash" @click="showComfirmDelPeriod()" title="删除" :class="editIconStatus ? 'action-btn-icon':'custom-label-disabeld action-btn-icon'" />
                                 <Icon v-if="$access.ability('admin','schoolSetting-upd').validateAll" type="md-create" @click="changePeriodEditStatus(curPriodIndex)" title="编辑" :class="editIconStatus ? 'action-btn-icon':'custom-label-disabeld action-btn-icon'" />
                             </div>
-                            <div class="period-list">
-                                <div class="period-item" v-for="(item,index) in schoolSetting.period" :key="index" @click="choosePeriod(index)" :class="index == curPriodIndex ? 'block-bg-active block-bg':'block-bg'">
-                                    <p class="period-item-name">
-                                        <EditableLabel ref="periodName" class="term-item-name" :content="item.periodName" @editComplete="handleEditPeriod($event,index)">
-                                        </EditableLabel>
-                                        <span class="campus-label" @click="setCampus">
-                                            {{item.campusCode === null ? '请设置校区': $JSONPath.query(schoolSetting, "$..campuses[?(@.campusCode=='" + item.campusCode + "')]").length > 0 ? $JSONPath.query(schoolSetting, "$..campuses[?(@.campusCode=='" + item.campusCode + "')]")[0].campusName : '请设置校区' }}
-                                        </span>
-                                    </p>
-                                    <p class="period-item-num"><span></span>{{ $t('schoolBaseInfo.semesterNum') + item.semesters.length}}</p>
-                                    <p class="period-item-num"><span></span>{{ $t('schoolBaseInfo.gradeNum') + item.grades.length}}</p>
-                                    <p class="period-item-num"><span></span>{{ $t('schoolBaseInfo.periodNum') + item.subjects.length}}</p>
-                                </div>
-                            </div>
+                            <Draggable  ghost-class="ghost" class="period-list list-group" :list="schoolSetting.period" :animation='200'>
+                                <transition-group name='flip-list'>
+                                    <div class="period-item list-group-item" v-for="(item,index) in schoolSetting.period" :key="index" @click="choosePeriod(index)" :class="index == curPriodIndex ? 'block-bg-active block-bg':'block-bg'">
+                                        <p class="period-item-name">
+                                            <EditableLabel ref="periodName" class="term-item-name" :content="item.periodName" @editComplete="handleEditPeriod($event,index)">
+                                            </EditableLabel>
+                                            <span class="campus-label" @click="setCampus">
+                                                {{item.campusCode === null ? '请设置校区': $JSONPath.query(schoolSetting, "$..campuses[?(@.campusCode=='" + item.campusCode + "')]").length > 0 ? $JSONPath.query(schoolSetting, "$..campuses[?(@.campusCode=='" + item.campusCode + "')]")[0].campusName : '请设置校区' }}
+                                            </span>
+                                        </p>
+                                        <p class="period-item-num"><span></span>{{ $t('schoolBaseInfo.semesterNum') + item.semesters.length}}</p>
+                                        <p class="period-item-num"><span></span>{{ $t('schoolBaseInfo.gradeNum') + item.grades.length}}</p>
+                                        <p class="period-item-num"><span></span>{{ $t('schoolBaseInfo.periodNum') + item.subjects.length}}</p>
+                                    </div>
+                                </transition-group>
+                            </Draggable>
                         </div>
                         <!--学期列表-->
                         <div slot="right" class="semester-wrap">
@@ -108,14 +110,23 @@
                                 <Icon type="md-create" @click.stop="editGraStatus = true" class="action-btn-icon" v-if="$access.ability('admin','schoolSetting-upd').validateAll" />
                             </div>
                             <div class="grade-body">
-                                <Table draggable :show-header="false" @click.native.stop :columns="columns" :data="schoolSetting.period[curPriodIndex].grades" @on-drag-drop="dragOrder" style="width:100%;">
-                                    <template slot-scope="{ row, index }" slot="name">
-                                        <Input v-model="row.gradeName" :disabled="!editGraStatus" placeholder="设置年级..." :style="{width: getWidth(index,row.gradeName)+'px'}" />
-                                    </template>
-                                    <template slot-scope="{ row, index }" slot="action">
-                                        <Icon type="md-close" @click="showDelGrade(index)" style="cursor:pointer;" v-show="delGraStatus" />
-                                    </template>
-                                </Table>
+                                <!--<Table draggable :show-header="false" @click.native.stop :columns="columns" :data="schoolSetting.period[curPriodIndex].grades" @on-drag-drop="dragOrder" style="width:100%;">
+        <template slot-scope="{ row, index }" slot="name">
+            <Input v-model="schoolSetting.period[curPriodIndex].grades[index].gradeName" :disabled="!editGraStatus" placeholder="设置年级..." :style="{width: getWidth(index,row.gradeName)+'px'}" />
+        </template>
+        <template slot-scope="{ row, index }" slot="action">
+            <Icon type="md-close" @click="showDelGrade(index)" style="cursor:pointer;" v-show="delGraStatus" />
+        </template>
+    </Table>-->
+                                <Draggable ghost-class="ghost" class="grade-list list-group" :list="schoolSetting.period[curPriodIndex].grades" :animation='200'>
+                                    <transition-group name='flip-list'>
+                                        <div class="grade-item list-group-item" v-for="(item,index) in schoolSetting.period[curPriodIndex].grades" :key="index">
+                                            <span class="grade-order">{{index + 1}}</span>
+                                            <Input class="grade-name" v-model="item.gradeName" :disabled="!editGraStatus" placeholder="设置年级..." :style="{width: getWidth(index,item.gradeName)+'px'}" />
+                                            <Icon type="md-close" @click="showDelGrade(index)" style="cursor:pointer;flex:0.1" v-show="delGraStatus" />
+                                        </div>
+                                    </transition-group>
+                                </Draggable>
                             </div>
                         </div>
                         <!--学科显示区域-->
@@ -175,6 +186,7 @@
 </template>
 
 <script>
+    import Draggable from 'vuedraggable'
     import EditableLabel from '@/common/EditableLabel.vue'
     import '@/utils/Math.uuid'
     // 学期默认模板
@@ -186,7 +198,7 @@
     }
     export default {
         components: {
-            EditableLabel
+            EditableLabel,Draggable
         },
         data() {
             return {
@@ -931,6 +943,10 @@
     @import './SystemSettingNew.less';
 </style>
 <style>
+    .ghost {
+        opacity: 0;
+        background: #c8ebfb;
+    }
     .second-arrow {
         margin-left: -16px;
     }
@@ -974,4 +990,10 @@
     .grade-body .ivu-table::before {
         background-color: #282828;
     }
+    .flip-list-move {
+        transition: transform 0.5s;
+    }
+    .grade-item .ivu-input {
+        text-align:center;
+    }
 </style>

+ 8 - 3
TEAMModelOS/ClientApp/src/view/selfstudy/ActivityInfo.vue

@@ -6,10 +6,10 @@
                     <span>
                         授课班级
                     </span>
-                    <div class="tools-box">
+                    <div class="tools-box" v-if="classList.length > 0">
                         <Icon v-show="classList[curClassIndex][learnContent.id]" type="ios-undo" class="action-btn-icon" title="撤回" @click="revokeStatus = true" />
                         <Icon v-if="!classList[curClassIndex][learnContent.id]" type="md-share" class="action-btn-icon" title="分享" @click="publishStatus = true" />
-                        <Icon v-else type="md-create" class="action-btn-icon" title="编辑" @click="publishStatus = true"/>
+                        <Icon v-else type="md-create" class="action-btn-icon" title="编辑" @click="publishStatus = true" />
                     </div>
                 </div>
                 <div @click="selectActivity(index)" v-for="(item,index) in classList" :class="index == curClassIndex ? 'activity-target-item block-bg block-bg-active':'block-bg activity-target-item'">
@@ -31,6 +31,7 @@
                         <span class="info-value">{{item.endTime ? item.endTime:'-- --'}}</span>
                     </p>
                 </div>
+                <EmptyData textContent="暂无授课班级"></EmptyData>
             </div>
             <div slot="right" class="activity-detail-info">
                 <vuescroll style="height:100%;">
@@ -79,7 +80,7 @@
                         </div>
                         <QuestionInfo v-if="showAnswer" @closeAnswerDetail="showAnswer = false"></QuestionInfo>
                     </div>
-                    <EmptyData v-else textContent="此班未分享,暂无学习数据" style="padding-top:200px;"></EmptyData>
+                    <EmptyData v-else textContent="此班未分享,暂无学习数据"></EmptyData>
                 </vuescroll>
             </div>
         </Split>
@@ -351,6 +352,7 @@
             selectActivity(index) {
                 this.curClassIndex = index
                 if (this.classList.length > 0 && this.classList[this.curClassIndex]) {
+                    console.log('......')
                     this.getClassroomStudent()
                 }
             },
@@ -445,6 +447,7 @@
             //获取教室关联的学生
             getClassroomStudent() {
                 this.isLoading = true
+                console.log(this.classList)
                 if (!this.classList[this.curClassIndex].students) {
                     this.$api.courseMgmt.getClassroomStudent(
                         {
@@ -478,6 +481,8 @@
         },
         mounted() {
             if (this.classList.length > 0 && this.classList[this.curClassIndex]) {
+                console.log('333')
+                console.log(this.classList[this.curClassIndex])
                 this.getClassroomStudent()
             }
         },

+ 22 - 13
TEAMModelOS/ClientApp/src/view/selfstudy/SelfLearn.vue

@@ -1,23 +1,25 @@
 <template>
     <div class="manage-order-learn">
         <div class="order-learn-list-box">
-            <vuescroll>
-                <div class="dark-iview-tabs-line" style="padding-top:10px;">
-                    <Tabs v-model="listType" @on-click="toggleList">
+                <div class="dark-iview-tabs-line" style="padding-top:10px;height:100%;">
+                    <Tabs v-model="listType" @on-click="toggleList" style="height:100%;">
                         <div slot="extra">
                             <Icon type="md-add" class="to-create-icon" @click="createData" title="新增" />
                             <Icon type="md-trash" :color="editIconStatus ? 'white':'#808080'" :style="{'cursor': editIconStatus ? 'pointer':'not-allowed'}" class="to-create-icon" @click="deleteData" title="删除" />
                             <Icon type="md-create" :color="editIconStatus ? 'white':'#808080'" :style="{'cursor': editIconStatus ? 'pointer':'not-allowed'}" class="to-create-icon" @click="editInfo" title="编辑" />
                         </div>
-                        <TabPane label="编序式学习" name="order">
-                            <OrderLearnList :class="listType == 0 ? 'animated fadeIn':''" @selectIndex="selectOrderLearn" :orderLearnList="orderLearnList"></OrderLearnList>
+                        <TabPane label="编序式学习" name="order" style="height:calc(100% - 40px);">
+                            <vuescroll>
+                                <OrderLearnList :class="listType == 0 ? 'animated fadeIn':''" @selectIndex="selectOrderLearn" :orderLearnList="orderLearnList"></OrderLearnList>
+                            </vuescroll>
                         </TabPane>
-                        <TabPane label="学习单元" name="unit">
-                            <UnitList :class="listType == 1 ? 'animated fadeIn':''" @selectIndex="selectOrderLearn" :unitList="unitList"></UnitList>
+                        <TabPane label="学习单元" name="unit"  style="height:calc(100% - 40px);">
+                            <vuescroll>
+                                <UnitList :class="listType == 1 ? 'animated fadeIn':''" @selectIndex="selectOrderLearn" :unitList="unitList"></UnitList>
+                            </vuescroll>
                         </TabPane>
                     </Tabs>
                 </div>
-            </vuescroll>
         </div>
         <div class="order-learn-main">
             <div class="main-bar-wrap">
@@ -258,14 +260,18 @@
             findClassroom() {
                 if (this.classList.length == 0) {
                     let requestData = this.$store.state.userInfo.TEAMModelId
-                    this.$api.learnActivity.FindClassroomByTeacherId(requestData).then(
+                    this.$api.learnActivity.FindClassroomByTeacherId({
+                        code:requestData
+                    }).then(
                         res => {
                             if (res.error == null) {
                                 this.classList = res.result.data
-                                this.findTask()
-                                setTimeout(() => {
-                                    this.$refs['activityInfo'].getClassroomStudent()
-                                },1000)
+                                if (this.classList.length > 0) {
+                                    this.findTask()
+                                    setTimeout(() => {
+                                        this.$refs['activityInfo'].getClassroomStudent()
+                                    }, 1000)
+                                }
                             } else {
                                 this.$Message.error('API ERROR!')
                             }
@@ -375,4 +381,7 @@
     .publish-modal .ivu-picker-confirm-time {
         color: #515a6e;
     }
+    .order-learn-list-box .ivu-tabs-content {
+        height:100%;
+    }
 </style>

+ 2 - 4
TEAMModelOS/ClientApp/src/view/student-account/Index.vue

@@ -16,7 +16,7 @@
                     <Option v-for="(item,index) in schoolData.period" :value="item.periodCode" :key="index" @click.native="getGradeList(index)">{{ item.periodName }}</Option>
                 </Select>
                 <Select v-model="searchGrade" style="width:20%;margin-left:1%;" :placeholder="$t('stuAccount.gradeHolder')" clearable @on-change="filterStudentInfo">
-                    <Option v-for="(item,index) in fn.getPeriod($store.state.schoolBaseInfo.schoolBaseInfo,searchPeriod).grades" :value="item.gradeCode" :key="index">{{ item.gradeName }}</Option>
+                    <Option v-for="(item,index) in $jsFn.getPeriod($store.state.schoolBaseInfo.schoolBaseInfo,searchPeriod).grades" :value="item.gradeCode" :key="index">{{ item.gradeName }}</Option>
                 </Select>
                 <Select v-model="searchClassroom" ref="classroom" style="width:20%;margin-left:1%;" :placeholder="$t('stuAccount.classroomHolder')" clearable @on-change="filterStudentInfo">
                     <Option v-for="(item,index) in classroomShowList" :value="item.classroomCode" :key="index">{{ item.classroomName }}</Option>
@@ -77,7 +77,7 @@
             <div class="page-box dark-iview-page">
                 <Page :total="totalNum" show-sizer :page-size="pageSize" show-total :current.sync="currentPage" @on-change="getPageData" @on-page-size-change="setPageSize"/>
             </div>
-            <authorization :isShow="authorizationStatus" @closeAuth="closeAuth"></authorization>
+            <authorization :isShow="authorizationStatus" @closeAuth="closeAuth" :selected="selections"></authorization>
         </div>
 
         <Modal v-model="addStudentStatus" width="520" class="add-student" :mask-closable="false">
@@ -97,7 +97,6 @@
 </template>
 
 <script>
-    import fn from '@/utils/js-fn.js'
     import AddStudent from './add-student/AddStudent'
     import ImportStudent from './add-student/ImportStudent'
     import Authorization from './add-student/Authorization'
@@ -111,7 +110,6 @@
         },
         data() {
             return {
-                fn,
                 totalNum:0,
                 classroomList: [],
                 classroomShowList: [],

+ 129 - 123
TEAMModelOS/ClientApp/src/view/student-account/add-student/Authorization.less

@@ -1,164 +1,170 @@
 @borderColor: #626262;
 
 .model-title {
-  color: #7F7F7F;
-  font-size: 18px;
-  font-weight: 800;
-  display: inline-block;
-  width: 100%;
-  text-align: center;
+    color: #7F7F7F;
+    font-size: 18px;
+    font-weight: 800;
+    display: inline-block;
+    width: 100%;
+    text-align: center;
 }
 
 .import-tips {
-  color: #707070;
-  font-size: 18px;
-  line-height: 30px;
-  font-weight: 600;
+    color: #707070;
+    font-size: 18px;
+    line-height: 30px;
+    font-weight: 600;
 }
 
 .my-btn {
-  width: 97%;
-  height: 35px;
-  line-height: 35px;
-  text-align: center;
-  background-color: #4f4f4f;
-  margin: auto;
-  color: #A1A1A1;
-  font-size: 16px;
-  font-weight: 600;
-  letter-spacing: 2px;
-  cursor: pointer;
-  border-radius: 4px;
-  margin-bottom: 15px;
+    width: 100%;
+    height: 35px;
+    line-height: 35px;
+    text-align: center;
+    background-color: #4f4f4f;
+    margin-top:40px;
+    color: #A1A1A1;
+    font-size: 16px;
+    font-weight: 600;
+    letter-spacing: 2px;
+    cursor: pointer;
+    border-radius: 4px;
+    margin-bottom: 80px;
 }
 
 .my-btn-active {
-  background-color: #6DE2C4;
-  color: white;
+    background-color: #6DE2C4;
+    color: white;
 }
 
 .drawer-footer {
-  /*position:absolute;
-    left:20px;
-    bottom:40px;*/
-  width: 380px;
-  margin-top: 15px;
+    width: 380px;
+    margin-top: 15px;
 }
 
 .auth-info {
-  width: 100%;
-  /*border-bottom: 1px solid @borderColor;
-    padding-bottom: 30px;*/
-  margin-bottom: 10px;
-
-  &-title {
-    color: white;
-    font-size: 18px;
-  }
+    width: 100%;
+    margin-top: 10px;
 
-  &-discreption {
-    color: #8E8E8E;
-    margin-top: 5px;
-    margin-bottom: 25px;
-  }
+    &-title {
+        color: white;
+        font-size: 18px;
+    }
 
-  &-count-item {
-    width: 100%;
-    margin-top: 5px;
-    color: #8E8E8E;
-    font-size: 14px;
-    font-weight: 600;
+    &-discreption {
+        color: #8E8E8E;
+        margin-top: 5px;
+        margin-bottom: 25px;
+    }
 
-    & span {
-      display: inline-block;
+    &-count-item {
+        width: 100%;
+        margin-top: 5px;
+        color: #8E8E8E;
+        font-size: 14px;
+        font-weight: 600;
+        text-align: center;
     }
-  }
 
-  &-label {
-    width: 60%;
-  }
+    &-label {
+        display: block;
+    }
 
-  &-num {
-    color: #DDDDDD;
-  }
+    &-num {
+        color: white;
+        font-size: 25px;
+        display: block;
+    }
 }
 
 .auth-rule {
-  margin-top: 15px;
+    margin-top: 40px;
+
+    &-item {
+        margin-bottom: 25px;
+        margin-top:20px;
+        width: 100%;
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        justify-content: space-between;
+    }
 
-  &-item {
-    margin-bottom: 25px;
-    width: 100%;
-    display: flex;
-    flex-direction: row;
-    align-items: center;
-    justify-content: space-between;
-  }
-
-  &-label {
-    color: #aaaaaa;
-    font-size: 14px;
-  }
-
-  &-btn {
-    padding: 2px 12px;
-    background: #808080;
-    margin-right: 50px;
-    color: #DDDDDD;
-    border-radius: 5px;
-    width: -webkit-fit-content;
-    width: -moz-fit-content;
-    width: -o-fit-content;
-    width: fit-content;
-    cursor: pointer;
-    user-select: none;
+    &-label {
+        color: #aaaaaa;
+        font-size: 14px;
+    }
 
-    &-active {
-      background-color: #6de2c4;
+    &-btn {
+        padding: 2px 12px;
+        background: #808080;
+        color: white;
+        border-radius: 5px;
+        width: fit-content;
+        cursor: pointer;
+        user-select: none;
+
+        &-active {
+            background-color: #6de2c4;
+        }
     }
-  }
 }
 
 .collapse-header {
-  &-box {
-    width: 100%;
-    display: inline-block;
-  }
+    &-box {
+        width: 100%;
+        display: inline-block;
+    }
 
-  &-label {
-    padding-left: 10px;
-    height: 18px;
-    line-height: 18px;
-    font-size: 15px;
-    font-weight: 600;
-    color: #9E9E9E;
-    width: 60%;
-    box-sizing: border-box;
-    display: inline-block;
-  }
+    &-label {
+        padding-left: 10px;
+        height: 18px;
+        line-height: 18px;
+        font-size: 15px;
+        font-weight: 600;
+        color: white;
+        box-sizing: border-box;
+        display: inline-block;
+    }
 
-  &-num {
-    padding-left: 10px;
-    height: 18px;
-    font-size: 15px;
-    font-weight: 600;
-    color: #9F9F9F;
-  }
+    &-num {
+        padding-left: 10px;
+        height: 18px;
+        font-size: 15px;
+        font-weight: 600;
+        color: white;
+        float: right;
+        margin-right: 30px;
+    }
 }
 
 .auth-num-item ul {
-  list-style: none;
-  color: #9F9F9F;
-  font-size: 14px;
-  width: 100%;
-
-  & li {
-    margin-top: 5px;
+    list-style: none;
+    color: #CCCCCC;
+    font-size: 14px;
     width: 100%;
-  }
 
-  & li span:nth-child(1) {
-    display: inline-block;
-    width: 63%;
-  }
+    & li {
+        margin-top: 5px;
+        width: 100%;
+    }
+
+    & li span:nth-child(1) {
+        display: inline-block;
+    }
+
+    & li span:nth-child(2) {
+        float:right;
+        margin-right:14px;
+    }
 }
+
+.student-count {
+    margin-left: 5px;
+    background: #ed4014;
+    padding: 2px 6px;
+    border-radius: 10px;
+    text-align: center;
+    color: white;
+    vertical-align: baseline;
+}

+ 338 - 264
TEAMModelOS/ClientApp/src/view/student-account/add-student/Authorization.vue

@@ -1,280 +1,354 @@
-<style lang="less" scoped>
-  @import './Authorization.less';
-</style>
-<style lang="less">
-  .auth-box .ivu-tabs-nav .ivu-tabs-tab {
-    color: white;
-  }
-
-  .auth-box .ivu-tabs-nav .ivu-tabs-tab-active {
-    color: #2d8cf0;
-  }
-  .auth-box .ivu-drawer-content {
-    border-left:1px solid #383838;
-    background-color:#404040;
-  }
-  .auth-box .ivu-drawer-header {
-    border-color:#424242;
-  }
-  .auth-box .ivu-drawer-body {
-    box-sizing:content-box;
-  }
-  .auth-rule .ivu-select-selection {
-    border-color:#AAAAAA;
-    margin:0px 5px;
-  }
-  .auth-rule .ivu-input {
-    border-color: #AAAAAA;
-    text-align:center;
-  }
-  .auth-rule .ivu-collapse,.ivu-collapse-content {
-    background:none;
-    border:none;
-  }
-  .auth-rule .ivu-collapse>.ivu-collapse-item>.ivu-collapse-header {
-    border:none;
-    padding-left:2px;
-  }
-    .auth-rule .ivu-collapse > .ivu-collapse-item {
-      border:none;
-    }
-  .auth-rule .ivu-icon-ios-arrow-forward:before {
-    content:"";
-  }
-  .auth-rule .ivu-collapse-item-active .collapse-header-label {
-    border-left:3px solid white;
-  }
-  .auth-rule .ivu-collapse > .ivu-collapse-item > .ivu-collapse-header > i {
-    display:none;
-  }
-  .auth-rule .ivu-collapse-item-active .ivu-collapse-content-box {
-    border-bottom:1px solid #AAAAAA;
-  }
-</style>
 <template>
-    <Drawer title="服务授权管理"
-            v-model="show"
+    <Drawer v-model="show"
             width="420"
-            :transfer="!flag"
+            :transfer="false"
             @on-close="close"
             inner
-            class-name="sc-content" class="auth-box">
-      <p slot="header" style="color:#a5a5a5;">{{$t('stuAccount.authTitle')}}</p>
-      <div class="auth-info">
-        <h3 class="auth-info-title">
-          {{$t('stuAccount.authTitle1')}}
-        </h3>
-        <p class="auth-info-discreption">{{$t('stuAccount.authDiscraption')}}</p>
-        <div class="auth-info-count-item">
-          <span class="auth-info-label">{{$t('stuAccount.authCount')}}</span>
-          <span class="auth-info-num">356</span>
-        </div>
-        <div class="auth-info-count-item">
-          <span class="auth-info-label">{{$t('stuAccount.alreadyUse')}}</span>
-          <span class="auth-info-num">287</span>
-        </div>
-        <div class="auth-info-count-item">
-          <span class="auth-info-label">{{$t('stuAccount.mayUse')}}</span>
-          <span class="auth-info-num">69</span>
-        </div>
-      </div>
-      <div class="auth-rule">
-        <Tabs>
-          <TabPane label="授权总览">
-            <p class="auth-info-discreption">{{$t('stuAccount.authNum')}}</p>
-
-            <Collapse accordion v-model="activePanel">
-              <Panel name="1">
-                <div class="collapse-header-box">
-                  <span class="collapse-header-label">小学使用数</span><span class="collapse-header-num">188</span>
+            class-name="auth-box">
+        <p slot="header" style="color:#DDDDDD;">
+            {{$t('stuAccount.authTitle1')}}
+            <Tooltip max-width="200" :content="$t('stuAccount.authDiscraption')">
+                <Icon type="md-alert" />
+            </Tooltip>
+        </p>
+        <vuescroll :ops="ops">
+            <div class="auth-info">
+                <div style="width:100%;display:flex;">
+                    <div class="auth-info-count-item">
+                        <CountTo class="auth-info-num" :endVal='total' :duration='600'></CountTo>
+                        <span class="auth-info-label">总量</span>
+                    </div>
+                    <div class="auth-info-count-item">
+                        <CountTo class="auth-info-num" :endVal='used' :duration='600'></CountTo>
+                        <span class="auth-info-label">已用</span>
+                    </div>
+                    <div class="auth-info-count-item">
+                        <CountTo class="auth-info-num" :endVal='surplus' :duration='600'></CountTo>
+                        <span class="auth-info-label">可用</span>
+                    </div>
                 </div>
-                <div slot="content" class="auth-num-item">
-                  <ul>
-                    <li>
-                      <span>一年级使用数</span>
-                      <span>58</span>
-                    </li>
-                    <li>
-                      <span>二年级使用数</span>
-                      <span>46</span>
-                    </li>
-                    <li>
-                      <span>三年级使用数</span>
-                      <span>86</span>
-                    </li>
-                    <li>
-                      <span>四年级使用数</span>
-                      <span>35</span>
-                    </li>
-                    <li>
-                      <span>五年级使用数</span>
-                      <span>48</span>
-                    </li>
-                    <li>
-                      <span>六年级使用数</span>
-                      <span>78</span>
-                    </li>
-                  </ul>
-                </div>
-              </Panel>
-              <Panel name="2">
-                <div style="display:inline-block;" class="collapse-header-box">
-                  <span class="collapse-header-label">初中使用数</span><span class="collapse-header-num">135</span>
-                </div>
-                <div slot="content" class="auth-num-item">
-                  <ul>
-                    <li>
-                      <span>一年级使用数</span>
-                      <span>58</span>
-                    </li>
-                    <li>
-                      <span>二年级使用数</span>
-                      <span>46</span>
-                    </li>
-                    <li>
-                      <span>三年级使用数</span>
-                      <span>86</span>
-                    </li>
-                  </ul>
-                </div>
-              </Panel>
-              <Panel name="3">
-                <div style="display:inline-block;" class="collapse-header-box">
-                  <span class="collapse-header-label">高中使用数</span><span class="collapse-header-num">89</span>
-                </div>
-                <div slot="content" class="auth-num-item">
-                  <ul>
-                    <li>
-                      <span>一年级使用数</span>
-                      <span>58</span>
-                    </li>
-                    <li>
-                      <span>二年级使用数</span>
-                      <span>46</span>
-                    </li>
-                    <li>
-                      <span>三年级使用数</span>
-                      <span>86</span>
-                    </li>
-                  </ul>
-                </div>
-              </Panel>
-            </Collapse>
-          </TabPane>
-          <TabPane label="授权设置">
-            <div class="auth-rule-item">
-              <div class="auth-rule-label">套用至所有当前节选项目</div>
-              <div class="auth-rule-btn">套用</div>
-            </div>
-            <div class="auth-rule-item">
-              <div class="auth-rule-label">
-                <span>套用至所有当前节选目标</span>
-                <Input size="small" placeholder="—" style="width: 50px;border-color:#AAAAAA;" />
-                <span>至</span>
-                <Input size="small" placeholder="—" style="width: 50px" />
-                <span>项</span>
-              </div>
-              <div class="auth-rule-btn">套用</div>
-            </div>
-            <div class="auth-rule-item">
-              <div class="auth-rule-label">
-                <span>套用至</span>
-                <Select size="small" v-model="list" style="width:140px" placeholder="请选择学制">
-                  <Option v-for="item in list" :value="item.value" :key="item.value">{{ item.label }}</Option>
-                </Select>
-                <span>所有项目</span>
-              </div>
-              <div class="auth-rule-btn">套用</div>
             </div>
-            <div class="auth-rule-item">
-              <div class="auth-rule-label">
-                <span>套用至</span>
-                <Select size="small" v-model="list" style="width:140px" placeholder="请选择学级">
-                  <Option v-for="item in list" :value="item.value" :key="item.value">{{ item.label }}</Option>
-                </Select>
-                <span>所有项目</span>
-              </div>
-              <div class="auth-rule-btn">套用</div>
+            <div class="auth-rule dark-iview-select">
+                <Tabs>
+                    <TabPane label="授权总览">
+                        <p class="auth-info-discreption">{{$t('stuAccount.authNum')}}</p>
+                        <Collapse accordion v-model="activePanel">
+                            <Panel :name="index + ''" v-for="(item,index) in authInfo">
+                                <div class="collapse-header-box">
+                                    <span class="collapse-header-label">{{item.periodName}}使用数</span>
+                                    <span class="collapse-header-num">{{item.count}}</span>
+                                </div>
+                                <div slot="content" class="auth-num-item">
+                                    <ul>
+                                        <li v-for="(gradeItem, gradeIndex) in item.grades" :key="gradeIndex">
+                                            <span>{{gradeItem.gradeName}}使用数</span>
+                                            <span>{{gradeItem.count}}</span>
+                                        </li>
+                                    </ul>
+                                </div>       
+                            </Panel>
+                        </Collapse>
+                    </TabPane>
+                    <TabPane label="授权设置">
+                        <div class="auth-rule-item">
+                            <div class="auth-rule-label">
+                                当前选择学生
+                                <span class="student-count">{{selected.length}}</span>
+                            </div>
+                            <Button :type="selected.length > 0 ? 'primary' : 'default'" size="small" :disabled="selected.length == 0" @click="used = selected.length">确认授权</Button>
+                        </div>
+                        <div class="auth-rule-item">
+                            <div class="auth-rule-label">
+                                <span>套用至</span>
+                                <Select size="small" clearable v-model="periodCode" style="width:140px" placeholder="请选择学制">
+                                    <Option v-for="(item, index) in $store.state.schoolBaseInfo.schoolBaseInfo.period" :value="item.periodCode" :key="index">{{ item.periodName }}</Option>
+                                </Select>
+                                <span>所有学生</span>
+                            </div>
+                            <Button :type="periodCode ? 'primary' : 'default'" size="small" :disabled="!periodCode" @click="showAuth(1)">学段授权</Button>
+                        </div>
+                        <div class="auth-rule-item">
+                            <div class="auth-rule-label">
+                                <span>套用至</span>
+                                <Select size="small" clearable v-model="gradeCode" style="width:140px" placeholder="请选择学级">
+                                    <Option v-for="(item, index) in $jsFn.getPeriod($store.state.schoolBaseInfo.schoolBaseInfo,periodCode).grades" :value="item.gradeCode" :key="index">{{ item.gradeName }}</Option>
+                                </Select>
+                                <span>所有学生</span>
+                            </div>
+                            <Button :type="gradeCode ? 'primary' : 'default'" size="small" :disabled="!gradeCode"  @click="showAuth(2)">年级授权</Button>
+                        </div>
+                        <div class="auth-rule-item">
+                            <div class="auth-rule-label">
+                                <span>套用至</span>
+                                <Select size="small" clearable v-model="classCode" style="width:140px" placeholder="请选择班级">
+                                    <Option v-for="(item,index) in classList" :value="item.classroomCode" :key="index">{{ item.classroomName }}</Option>
+                                </Select>
+                                <span>所有学生</span>
+                            </div>
+                            <Button :type="classCode ? 'primary' : 'default'" size="small" :disabled="!classCode"  @click="showAuth(3)">班级授权</Button>
+                        </div>
+                        <div class="auth-rule-item">
+                            <div class="auth-rule-label">套用至全校所有项目</div>
+                            <Button type="primary" size="small" disabled  @click="showAuth(4)">全校授权</Button>
+                        </div>
+                        <div class="drawer-footer">
+                            <!--<div class="my-btn" @click="confirm()">
+                            收回所有授权
+                        </div>-->
+                            <div class="my-btn my-btn-active" @click="used = 0">
+                                收回所有授权
+                            </div>
+                        </div>
+                    </TabPane>
+                </Tabs>
             </div>
-            <div class="auth-rule-item">
-              <div class="auth-rule-label">
-                <span>套用至</span>
-                <Select size="small" v-model="list" style="width:140px" placeholder="请选择班级">
-                  <Option v-for="item in list" :value="item.value" :key="item.value">{{ item.label }}</Option>
-                </Select>
-                <span>所有项目</span>
-              </div>
-              <div class="auth-rule-btn">套用</div>
-            </div>
-            <div class="auth-rule-item">
-              <div class="auth-rule-label">套用至全校所有项目</div>
-              <div class="auth-rule-btn">套用</div>
-            </div>
-            <div class="drawer-footer">
-              <div class="my-btn" @click="confirm()">
-                收回所有授权
-              </div>
-              <div class="my-btn my-btn-active" @click="confirm()">
-                保存所有变更
-              </div>
-            </div>
-          </TabPane>
-        </Tabs>
-
-      </div>
-
+        </vuescroll>
+        <Modal v-model="authStatus"
+               title="确认授权"
+               @on-ok="ok">
+            <p>
+                确认对
+                <span v-if="periodCode && authType > 0">{{ $jsFn.getPeriod($store.state.schoolBaseInfo.schoolBaseInfo,periodCode).periodName}}</span>
+                <span v-if="gradeCode  && authType > 1">·{{ $jsFn.getGradeName($jsFn.getPeriod($store.state.schoolBaseInfo.schoolBaseInfo,periodCode), gradeCode)}}</span>
+                <span v-if="classCode && authType > 2">·{{ className }}</span>
+                所有学生批量授权?
+            </p>
+        </Modal>
     </Drawer>
 </template>
 <script>
-  export default {
-    props: {
-      isShow: {
-        type: Boolean,
-        default: false
-      },
-      schoolCode: {
-        type: String,
-        default: ''
-      }
-    },
-    data() {
-        return {
-          activePanel: '1',
-        flag: true,
-        list: []
-      }
-    },
-    computed: {
-      show: {
-        get() {
-          return this.isShow
+    import CountTo from 'vue-count-to'
+    export default {
+        components: {
+            CountTo
+        },
+        props: {
+            isShow: {
+                type: Boolean,
+                default: false
+            },
+            schoolCode: {
+                type: String,
+                default: ''
+            },
+            selected: {
+                type: Array,
+                default: () => {
+                    return []
+                }
+            }
+        },
+        data() {
+            return {
+                authType:0,
+                authStatus: false,
+                ops: {
+                    bar: {
+                        opacity:0
+                    }
+                },
+                periodCode: undefined,
+                gradeCode: undefined,
+                classCode: undefined,
+                total: 820,
+                used: 0,
+                activePanel: '1',
+                list: []
+            }
         },
-        set(value) {
+        computed: {
+            show: {
+                get() {
+                    return this.isShow
+                },
+                set(value) {
+                }
+            },
+            classList() {
+                console.log(this.$store.state)
+                if (this.$store.state.schoolBaseInfo.classroomList) {
+                    let arr = this.$store.state.schoolBaseInfo.classroomList.filter((item) => {
+                        if (!this.periodCode) {
+                            return item
+                        } else if (this.periodCode && !this.gradeCode) {
+                            return item.periodCode == this.periodCode
+                        } else {
+                            return (item.periodCode == this.periodCode && item.gradeCode == this.gradeCode)
+                        }
+                    })
+                    console.log(this.periodCode)
+                    console.log(arr)
+                    return arr
+                } else {
+                    return []
+                }
+            },
+            surplus() {
+                return this.total - this.used
+            },
+            className() {
+                let res = this.classList.filter((item) => {
+                    return item.classroomCode == this.classCode
+                })
+                if (res.length > 0) {
+                    return res[0].classroomName
+                } else {
+                    return ''
+                }
+            },
+            authInfo() {
+                let data = []
+                for (let pItem of this.$store.state.schoolBaseInfo.schoolBaseInfo.period) {
+                    let dataItem = {
+                        periodCode: pItem.periodCode,
+                        periodName: pItem.periodName,
+                        count: 0,
+                        grades: []
+                    }
+                    for (let gItem of pItem.grades) {
+                        dataItem.grades.push(
+                            {
+                                gradeName: gItem.gradeName,
+                                gradeCode: gItem.gradeCode,
+                                count:0
+                            }
+                        )
+                    }
+                    data.push(dataItem)
+                }
+                console.log(data)
+                console.log(this.$store.state.schoolBaseInfo.schoolBaseInfo.period)
+                return data
+            }
+        },
+        methods: {
+            ok() {
+                if (this.authType == 1) {
+                    for (let index in this.authInfo) {
+                        if (this.authInfo[index].periodCode == this.periodCode) {
+                            if (this.authInfo[index].grades.length * 100 > this.surplus) {
+                                this.$Message.warning('可用授权数量不足')
+                            } else {
+                                for (let gIndex in this.authInfo[index].grades) {
+                                    this.authInfo[index].grades[gIndex].count = 100
+                                }
+                                this.authInfo[index].count = this.authInfo[index].grades.length * 100
+                                this.used += this.authInfo[index].count
+                            }
+                            break
+                        }
+                    }
+                } else if (this.authType == 2) {
+                    for (let index in this.authInfo) {
+                        for (let gIndex in this.authInfo[index].grades) {
+                            if (this.authInfo[index].periodCode == this.periodCode && this.authInfo[index].grades[gIndex].gradeCode == this.gradeCode) {
+                                if (102 > this.surplus) {
+                                    this.$Message.warning('可用授权数量不足')
+                                } else {
+                                    this.authInfo[index].grades[gIndex].count = 102
+                                    this.used += this.authInfo[index].grades[gIndex].count
+                                    this.authInfo[index].count += 102
+                                }
+                                break
+                            }
+                            
+                        }
+                    }
+                } else if (this.authType == 3) {
+                    if (this.surplus < 50) {
+                        this.$Message.warning('可用授权数量不足')
+                    } else {
+                        this.used += 50
+                    }
+                }
+            },
+            showAuth(type) {
+                this.authType = type
+                this.authStatus = true
+            },
+            close() {
+                this.$emit('closeAuth', {
+                    action: 0
+                })
+            },
+            confirm() {
+                this.$emit('closeAuth', {
+                    action: 1
+                })
+            }
+        },
+        created() {
+        },
+        mounted() {
+
+        }
+    }
+</script>
+<style lang="less" scoped>
+    @import './Authorization.less';
+</style>
+<style lang="less">
+    .auth-box .ivu-tabs-nav .ivu-tabs-tab {
+        color: white;
+    }
+
+    .auth-box .ivu-tabs-nav .ivu-tabs-tab-active {
+        color: #2d8cf0;
+    }
+
+    .auth-box .ivu-drawer-content {
+        border-left: 1px solid #383838;
+        background-color: #404040;
+    }
+
+    .auth-box .ivu-drawer-header {
+        border-color: #424242;
+    }
+
+    /*.auth-box .ivu-drawer-body {
+        box-sizing: content-box;
+    }*/
+
+    .auth-rule .ivu-select-selection {
+        border-color: #AAAAAA;
+        margin: 0px 5px;
+    }
+
+    .auth-rule .ivu-input {
+        border-color: #AAAAAA;
+        text-align: center;
+    }
+
+    .auth-rule .ivu-collapse, .ivu-collapse-content {
+        background: none;
+        border: none;
+    }
+
+        .auth-rule .ivu-collapse > .ivu-collapse-item > .ivu-collapse-header {
+            border: none;
+            padding-left: 2px;
         }
-      }
 
-    },
-    watch: {
-    },
-    methods: {
-      close() {
-        this.$emit('closeAuth', {
-          action: 0
-        })
-      },
-      confirm() {
-        this.$emit('closeAuth', {
-          action: 1
-        })
-      }
-    },
-    created() {
-    },
-    mounted() {
+        .auth-rule .ivu-collapse > .ivu-collapse-item {
+            border: none;
+        }
 
-    },
-    watch: {
+    .auth-rule .ivu-icon-ios-arrow-forward:before {
+        content: "";
+    }
 
+    .auth-rule .ivu-collapse-item-active .collapse-header-label {
+        border-left: 3px solid white;
     }
-  }
-</script>
+
+    .auth-rule .ivu-collapse > .ivu-collapse-item > .ivu-collapse-header > i {
+        display: none;
+    }
+
+    .auth-rule .ivu-collapse-item-active .ivu-collapse-content-box {
+        border-bottom: 1px solid #AAAAAA;
+    }
+    .auth-rule .ivu-collapse-content > .ivu-collapse-content-box {
+        padding-top:0px;
+    }
+</style>

+ 1 - 1
TEAMModelOS/Service/Evaluation/HtmlAnalyzeService.cs

@@ -160,7 +160,7 @@ namespace TEAMModelOS.Service
                     {
                         nbsp += "&nbsp;";
                     }
-                    ReplaceDto replaceDto = new ReplaceDto { oldstr = langConfig.Item.Start + an + langConfig.Item.End, newstr = "<underline data=\"" + index + "\"><u>" + nbsp + "</u></underline>" };
+                    ReplaceDto replaceDto = new ReplaceDto { oldstr = langConfig.Item.Start + an + langConfig.Item.End, newstr = "<underline style='word-break: break-word' data=\"" + index + "\"><u>" + nbsp + "</u></underline>" };
                     replaces.Add(replaceDto);
                     ans.Add(an);
                     m = m.NextMatch();