Prechádzať zdrojové kódy

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

liqk 4 rokov pred
rodič
commit
201c301b8c

+ 15 - 11
TEAMModelOS/ClientApp/src/common/BaseSelectSchool.vue

@@ -1,14 +1,14 @@
 <template>
 	<div class="base-school-select">
-		<div v-if="!user.schools.length">暂未加入学校</div>
+		<div v-if="!joinSchools.length">暂未加入学校</div>
 		<Dropdown @on-click="onSchoolSelect" v-else>
 			<img class="school-logo" :src="curSchool.logo || defaultLogo" />
-			<a href="javascript:void(0)" :class="['base-user-post', user.schools.length === 1 ? 'single-school' : '']">
+			<a href="javascript:void(0)" :class="['base-user-post', joinSchools.length === 1 ? 'single-school' : '']">
 				{{ curSchool.name }}
 				<Icon type="ios-arrow-down"></Icon>
 			</a>
 			<DropdownMenu slot="list">
-				<div v-for="(item,index) in user.schools" :key="index">
+				<div v-for="(item,index) in joinSchools" :key="index">
 					<DropdownItem :name="index">
 						<div class="school-item">
 							<img :src="item.logo || defaultLogo" alt="">
@@ -34,7 +34,8 @@
 				defaultLogo: '',
 				user: {
 					schools: []
-				}
+				},
+				joinSchools:[]
 			}
 		},
 		created() {
@@ -43,9 +44,9 @@
 			let user = JSON.parse(decodeURIComponent(localStorage.user_profile, "utf-8"));
 			console.log(user)
 			let schoolProfile = localStorage.school_profile ? JSON.parse(decodeURIComponent(localStorage.school_profile, "utf-8")) :undefined;
-
+			this.user.schools = user.schools
 			let joinSchools = user.schools && user.schools.length ?  user.schools.filter(i => i.status === 'join') : null
-			this.user.schools = joinSchools
+			this.joinSchools = joinSchools
 			// 如果本地存储已经有保存学校信息 则刷新后会直接读取之前的学校信息
 			if (schoolProfile && joinSchools.length) {
 				this.curSchool = joinSchools.filter(i => i.schoolId === schoolProfile.school_base.id)[0]
@@ -60,9 +61,13 @@
 		},
 		methods: {
 			async onSchoolSelect(val) {
+				console.log(val)
+				console.log(this.user.schools)
+				console.log(this.joinSchools)
+				this.joinSchools = this.user.schools.filter(i => i.status === 'join')
 				this.$EventBus.$emit('onGlobalLoading', true)
-				this.curSchool = this.user.schools[val]
-				let schoolCode = this.user.schools[val].schoolId
+				this.curSchool = this.joinSchools[val]
+				let schoolCode = this.joinSchools[val].schoolId
 				// 更新当前school_code
 				this.$store.dispatch('user/setSchoolCode', schoolCode)
 				// 更新当前school_profile以及access
@@ -107,9 +112,8 @@
 					console.log('检测到切换学校')
 					console.log(params)
 					this.user = params.user
-					// this.curSchool = params.user.defaultschool ? params.user.schools.filter(i => i.schoolId === params.user.defaultschool)[
-					// 	0] : params.user.schools[0]
-					this.onSchoolSelect(params.user.schools.map(i => i.schoolId).indexOf(params.schoolCode))
+					let joinSchools = params.user.schools.filter(i => i.status === 'join')
+					this.onSchoolSelect(params.isFirst ? 0 : joinSchools.map(j => j.schoolId).indexOf(params.schoolCode))
 				}
 			})
 		},

+ 22 - 33
TEAMModelOS/ClientApp/src/common/BaseUserPoptip.vue

@@ -15,7 +15,7 @@
 					</DropdownMenu>
 				</Dropdown>
 			</div>
-			<Poptip class="dark-iview-poptip" @on-popper-show="getSize()">
+			<Poptip class="dark-iview-poptip" @on-popper-show="doRefresh()">
 				<!-- <img :src="user.picture" /> -->
 				<PersonalPhoto style="cursor: pointer;" :name="userInfo.username" :picture="user.picture" :color="userInfo.nameColor"/>
 
@@ -26,7 +26,7 @@
 
 						<span class="user-info-username">{{ userInfo.username }}</span>
 						<span class="user-info-account">{{ user.id }}</span>
-						<span class="user-info-account">{{ userInfo.role }}</span>
+						<span class="user-info-account">{{ curRole }}</span>
 						<span class="user-info-btn">账号管理</span>
 					</div>
 					<div class="user-nums">
@@ -84,12 +84,12 @@
 			return {
 				curRole: '',
 				userInfo: {
-					username: 'Hao James Ker',
-					account: '15895626464',
-					role: 'admin',
-					courseNum: 7,
-					activityNum: 16,
-					classNum: 21,
+					username: '',
+					account: '',
+					role: '',
+					courseNum: 0,
+					activityNum: 0,
+					classNum: 0,
 					nameColor: '',
 				},
 				user: {},
@@ -106,30 +106,19 @@
 			}
 		},
 		created() {
-			this.user = JSON.parse(decodeURIComponent(localStorage.userInfo, "utf-8"));
-            let user_profile = JSON.parse(decodeURIComponent(localStorage.user_profile, "utf-8"));
-   //         if (user_profile.schools.length) {
-			//	this.$store.commit('setUserInfo', {
-			//		TEAMModelId: this.user.id,
-			//		name: this.user.name,
-			//		schoolCode: user_profile.defaultschool || user_profile.schools[0].schoolId
-			//	})
-			//} else {
-			//	this.$store.commit('setUserInfo', {
-			//		TEAMModelId: this.user.id,
-			//		name: this.user.name,
-			//		schoolCode: 'SYSTEM_NO_SCHOOL'
-			//	})
-			//}
-			
-			if(this.user.roles.length){
-				this.curRole = this.user.roles[0]
-			}
-			this.userInfo.username = this.user.name
-			this.userInfo.nameColor = this.randomColor()
-            this.getSize()
+            this.doRefresh()
 		},
 		methods: {
+			doRefresh(){
+				this.user = JSON.parse(decodeURIComponent(localStorage.userInfo, "utf-8"));
+				let user_profile = JSON.parse(decodeURIComponent(localStorage.user_profile, "utf-8"));
+				if(this.user.roles.length){
+					this.curRole = this.user.roles[0]
+				}
+				this.userInfo.username = this.user.name
+				this.userInfo.nameColor = this.randomColor()
+				this.getSize()
+			},
 			//获取Blob空间信息
 			async getSize() {
 				let sasRes = await this.$tools.getPrivateSas()
@@ -420,10 +409,10 @@
 			.btn-logout {
 				.fl-col-center;
 				background: #1CC0F3;
-				padding: 10px 60px;
+				padding: 6px 0;
 				color: #fff;
-				width: 70%;
-				margin-left: 15%;
+				width: 60%;
+				margin-left: 20%;
 				margin-top: 40px;
 				border-radius: 5px;
 				font-size: 16px;

+ 1 - 1
TEAMModelOS/ClientApp/src/components/vote/BaseVoteForm.vue

@@ -15,7 +15,7 @@
 			
 			<FormItem label="起止时间" prop="rangeTime">
 			    <!-- <DatePicker type="datetime" :class="!voteFormEdit ? 'vote-form-disabled':''" :editable="isDateEdit" placeholder="请选择投票结束时间" v-model="voteForm.endTime"  :options="endTimeOptions"></DatePicker> -->
-				<DatePicker type="datetimerange" @on-change="onChangeRange" format="yyyy-MM-dd HH:mm" :class="!voteFormEdit ? 'vote-form-disabled':''" :editable="isDateEdit" :value="[voteForm.startTime,voteForm.endTime]" placeholder="请选择投票结束时间"></DatePicker>
+				<DatePicker type="datetimerange" transfer @on-change="onChangeRange" format="yyyy-MM-dd HH:mm" :class="!voteFormEdit ? 'vote-form-disabled':''" :editable="isDateEdit" :value="[voteForm.startTime,voteForm.endTime]" placeholder="请选择投票结束时间"></DatePicker>
 			</FormItem>
 
             <FormItem label="投票描述" prop="description">

+ 10 - 1
TEAMModelOS/ClientApp/src/css/site.css

@@ -116,7 +116,16 @@ html[white]{ /*白色主題*/
 .leftInOut-enter, .leftInOut-leave-to /* .list-leave-active below version 2.1.8 */ {
     opacity: 0;
     transform: translateX(-150px);    
-}
+}	
+
+	.richText-audio{
+		background-image: url('../assets/icon/icon_audio.png');
+		background-size: cover;
+		width: 35px;
+		height: 35px;
+		display: inline-block;
+		cursor: pointer;
+	}
 
 	.richText-video {
 		position: relative;

+ 1 - 0
TEAMModelOS/ClientApp/src/store/module/user.js

@@ -645,6 +645,7 @@ export default {
         },
         setSchoolCode(context, data) {
 			context.rootState.userInfo.schoolCode = data
+			context.rootState.userInfo.hasSchool = true
             localStorage.setItem('login_schoolCode', data)
             context.commit('setSchoolCode', data)
         },

+ 6 - 2
TEAMModelOS/ClientApp/src/utils/editorTools.js

@@ -183,8 +183,12 @@ export default {
 									var reader = new FileReader();
 									reader.readAsDataURL(fileList[0]);
 									reader.onload = function(e) {
-										editor.cmd.do('insertHTML', '<img data-url=' + e.target.result + ' data-name=' + fileList[0].name +
-											' src=' + audioImg + ' class="richText-audio"></img>');
+										// editor.cmd.do('insertHTML', '<img data-url=' + e.target.result + ' data-name=' + fileList[0].name +
+										// 	' src=' + audioImg + ' class="richText-audio"></img>');
+										// editor.txt.append('<span data-url=' + e.target.result + ' data-name=' + fileList[0].name +
+										// 	' class="richText-audio"></span>');	
+										editor.txt.append('<audio data-name=' + fileList[0].name + ' src=' + e.target.result +
+											' class="richText-audio" width="300" controls="controls"></audio>');		
 									}
 								}
 								// 返回 true 可关闭 panel

+ 2 - 0
TEAMModelOS/ClientApp/src/utils/public.js

@@ -501,6 +501,8 @@ export default {
 			const posterBase64 = await this.getVideoBase64(fileBlobUrl)
 			editor.txt.append('<img data-url=' + fileBlobUrl + ' data-name=' + blobFile.name + ' src=' +
 				posterBase64 + ' class="richText-video"></img>')
+			// editor.txt.append('<video data-url=' + fileBlobUrl + ' data-name=' + blobFile.name + ' src=' +
+			// 	fileBlobUrl + ' class="richText-video" width="300" controls="controls"></video>')
 			editor.change.emit()
 			vm.$Spin.hide();
 		}catch(e){

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

@@ -369,7 +369,7 @@
 				/** 定义查询接口的参数规格 */
 				this.filterParams = {
 					"@DESC": this.filterSort,
-					code:this.isShowSchoolBank ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,
+					code: (this.isShowSchoolBank || (this.filterOrigin === this.schoolCode)) ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,
 					periodId: (this.isShowSchoolBank || (this.filterOrigin === this.schoolCode)) && this.periodList.length ? [this.periodList[this.filterPeriod].id] : [],
 					"gradeIds[*]": (this.isShowSchoolBank || (this.filterOrigin === this.schoolCode)) ?
 						this.deleteFalse(this.filterGrade) : [],

+ 2 - 6
TEAMModelOS/ClientApp/src/view/evaluation/bank/TestPaperList.vue

@@ -96,20 +96,16 @@
 			},
 
 			onFilterChange(filterParams) {
+				console.log(filterParams)
 				let isSchool = filterParams.code === this.$store.state.userInfo.schoolCode
 				this.filterParams = {
 					'@DESC': filterParams.filterSort,
 					'code': filterParams.code,
 					'scope': isSchool ? 'school' : 'private',
 					'periodId': isSchool ? filterParams.periodId[0] : [],
-					'gradeIds': isSchool ? filterParams.gradeIds : [],
+					"gradeIds[*]": isSchool ? filterParams.gradeIds : [],
 					'subjectId': isSchool ? filterParams.subjectId : []
 				}
-				// this.findCountParams = findCountParams
-
-				//this.gradeList = this.periodList.filter(item => item.periodCode = filterParams.periodCode[0])[0].grades
-				//this.subjectList = this.periodList.filter(item => item.periodCode = filterParams.periodCode[0])[0].subjects
-				// this.pageChange(1)
 				this.doFilter()
 			},
 

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

@@ -14,7 +14,7 @@
         >
       </RadioGroup>
     </div>
-    <div class="filter-item" v-show="isShowSchoolBank">
+    <div class="filter-item" v-show="isShowSchoolBank || (filterOrigin === schoolCode)">
       <span class="filter-title">学段:</span>
       <RadioGroup
         v-model="filterPeriod"
@@ -29,7 +29,7 @@
         >
       </RadioGroup>
     </div>
-    <div class="filter-item" v-show="isShowSchoolBank">
+    <div class="filter-item" v-show="isShowSchoolBank || (filterOrigin === schoolCode)">
       <span class="filter-title">年级:</span>
       <CheckboxGroup
         v-model="filterGrade"
@@ -45,7 +45,7 @@
         >
       </CheckboxGroup>
     </div>
-    <div class="filter-item" v-show="isShowSchoolBank">
+    <div class="filter-item" v-show="isShowSchoolBank || (filterOrigin === schoolCode)">
       <span class="filter-title">科目:</span>
       <CheckboxGroup
         v-model="filterSubject"
@@ -169,13 +169,15 @@ export default {
       /** 定义查询接口的参数规格 */
       this.filterParams = {
         filterSort: this.filterSort,
-        code: this.isShowSchoolBank  ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,
-        periodId: this.periodList.length ?  [this.periodList[this.filterPeriod].id] : [],
-        gradeIds: this.deleteFalse(this.filterGrade),
-        subjectId: this.deleteFalse(this.filterSubject),
+        code: (this.isShowSchoolBank || (this.filterOrigin === this.schoolCode)) ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,
+        periodId: (this.isShowSchoolBank || (this.filterOrigin === this.schoolCode)) && this.periodList.length ? [this.periodList[this.filterPeriod].id] : [],
+        gradeIds: (this.isShowSchoolBank || (this.filterOrigin === this.schoolCode)) ?
+        	this.deleteFalse(this.filterGrade) : [],
+        subjectId: (this.isShowSchoolBank || (this.filterOrigin === this.schoolCode)) ?
+        	this.deleteFalse(this.filterSubject) : [],
         level: this.deleteFalse(this.filterDiff),
         type: this.deleteFalse(this.filterType),
-        field: this.deleteFalse(this.filterField),
+        field: this.deleteFalse(this.filterField)
       };
 
       this.$emit("onChange", this.filterParams);

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

@@ -225,8 +225,11 @@
 		},
 		created() {
 			let scope = this.$route.params.scope; // 编辑题目
-			this.exerciseScope = scope === "private" ? 0 : 1;
-			this.fromScope = scope;
+			if(scope){
+				this.exerciseScope = scope === "private" ? 0 : 1;
+				this.fromScope = scope;
+			}
+			
 			// 初始化区班校信息
 			this.getSchoolInfo();
 		},
@@ -268,7 +271,6 @@
 
 			/* 音频点击播放事件 */
 			onRichTextClick(e) {
-				console.log(e)
 				if (e.srcElement.classList[0] === "richText-audio") {
 					this.playAudioModal = true;
 					this.curAudioSrc = e.srcElement.dataset.url;

+ 0 - 1
TEAMModelOS/ClientApp/src/view/evaluation/types/BaseSingleNew.vue

@@ -101,7 +101,6 @@
 			},
 
 			onRichTextClick(e) {
-				console.log(e)
 				this.$parent.onRichTextClick(e)
 			},
 			/* 添加选项 */

+ 0 - 7
TEAMModelOS/ClientApp/src/view/knowledge-point/index/Index.vue

@@ -62,19 +62,12 @@
 							 @on-clear="onSearchClear" />
 						</span>
 						<div>
-							<!-- <Icon type="md-apps" title="切换到知识点视图" v-if="!isShowPoints" color="#fff" size="20" style="cursor:pointer;margin-right:10px" @click="onChangeShowType" /> -->
-							<!-- <Icon type="ios-photos" title="切换到知识块视图" v-if="isShowPoints" color="#fff" size="18" style="cursor:pointer;margin-right:10px" @click="onChangeShowType" /> -->
 							<Icon type="md-add" v-if="($access.can('admin.*|Point_Add')) && subjectList.length" color="#fff" size="18" style="cursor:pointer;margin-right:10px"
 							 @click="onAddPoint" />
-							<!-- <Icon type="ios-search" v-if="blockList.length !== 0" color="#fff" size="18" style="cursor:pointer" @click="isSearchPoint = true" /> -->
-
 							<Button class="btn-compose-block" v-if="checkedPointList.length" @click="onComposeBlock">组成知识块</Button>
 						</div>
 					</div>
 					<div class="ns-header-search" v-else>
-						<!-- 搜索知识点部分 -->
-						<!-- <Input icon="ios-close" v-model="searchPoint" placeholder="搜索知识点..." autofocus style="width: 100%" @on-click="isSearchPoint = false"
-						 @on-blur="isSearchPoint = false" @on-change="onSearchPointChange" @on-enter="onSearchPointChange" /> -->
 					</div>
 					<div>
 						<div v-if="pointList.length === 0">

+ 9 - 6
TEAMModelOS/ClientApp/src/view/questionnaire/ManageQuestionnaire.vue

@@ -13,8 +13,8 @@
 				<div class="qn-box-header">
 					<span>问卷列表</span>
 					<div>
-						<Icon type="md-trash" class="to-create-icon" @click="onDeleteQn" style="margin-left: 10px" v-show="qnList.length" />
-						<Icon type="md-add" class="to-create-icon" @click="goToCreate" />
+						<Icon type="md-trash" class="to-create-icon" @click="onDeleteQn" style="margin-left: 10px" v-if="qnList.length && ($access.can('admin.*|schoolAc-upd') || isPrivate)" />
+						<Icon type="md-add" class="to-create-icon" @click="goToCreate"  v-if="($access.can('admin.*|schoolAc-upd') || isPrivate)"/>
 					</div>
 				</div>
 				<vuescroll>
@@ -62,7 +62,7 @@
 						<!-- <span class="qn-box-header-tools-tool" v-show="currentQn.status !== 300 && qnList.length">
 							<Icon type="md-create" size="18" title="编辑" @click="onEditQn" /></span> -->
 						<span class="qn-box-header-tools-tool" v-show="currentQn.progress === 'going' && qnList.length">
-							<Icon type="md-undo" size="18" title="取消发布" @click="onCancelQn" style="margin-left: 8px" /></span>
+							<Icon type="md-undo" size="18" title="取消发布" @click="onCancelQn" style="margin-left: 8px" v-if="($access.can('admin.*|schoolAc-upd') || isPrivate)"/></span>
 					</div>
 				</div>
 				<vuescroll ref="qnDetailsScroll">
@@ -98,7 +98,7 @@
 							<Icon type="md-podium" color="#dcdcdc" />
 							<span>查看统计数据</span>
 						</div> -->
-						<div class="qn-box-header-tools-tool" @click="onEditQn" v-show="currentQn.progress === 'pending' && qnList.length && !editable">
+						<div class="qn-box-header-tools-tool" @click="onEditQn" v-show="currentQn.progress === 'pending' && qnList.length && !editable && ($access.can('admin.*|schoolAc-upd') || isPrivate)">
 							<Icon type="md-create" color="#209460" />
 							<span>编辑问卷</span>
 						</div>
@@ -170,7 +170,7 @@
 						endTime: "",
 						startTime: "",
 						description: "",
-						rangeTime:[],
+						rangeTime: [],
 						isReset: [],
 						progress: "pending",
 						other: [],
@@ -273,7 +273,7 @@
 			 * @param index
 			 */
 			async onQnClick(item, index) {
-				if (this.activeQnIndex === index && this.currentQn.id && this.currentQn.id === item.id ) return
+				if (this.activeQnIndex === index && this.currentQn.id && this.currentQn.id === item.id) return
 				console.log(item, index);
 				/* 判断是否有新增但是无效的ITEM  如果有 则清空 需要重新添加 */
 				let hasNewQn = this.qnList.filter((i) => !i.id).length;
@@ -485,6 +485,9 @@
 			getCurScope() {
 				return this.$route.name === "personalSurvey" ? "private" : "school";
 			},
+			isPrivate(){
+				return this.$route.name === 'personalSurvey'
+			}
 		},
 		watch: {
 			$route: {

+ 4 - 3
TEAMModelOS/ClientApp/src/view/settings/SchoolMgmt.vue

@@ -290,13 +290,14 @@
 								if (!res.error) {
 									this.$Message.success("加入成功!")
 									// 如果之前用户没有加入任何学校
-									if(teacherInfo.schools && this.mySchoolList.filter(i => i.status === 'join').length === 0){
+									if(this.mySchoolList.length && this.mySchoolList.filter(i => i.status === 'join').length === 0){
 										let teacherInfo = await this.getTeacherInfo()
-										let schoolCode = teacherInfo.schools[0].schoolId
+										let schoolCode = item.schoolId
 										let schoolInfo = await this.getTeacherSchoolInfo(schoolCode)
 										this.$EventBus.$emit('onChangeSchool', {
 											user:teacherInfo,
-											schoolCode:schoolCode
+											schoolCode:schoolCode,
+											isFirst:true
 										})
 										this.$EventBus.$off('onChangeSchool')
 									}else{

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

@@ -13,8 +13,8 @@
 				<div class="hw-box-header">
 					<span>投票活动列表</span>
 					<span>
-						<Icon type="md-trash" class="to-create-icon" @click="onDeleteVote" style="margin-left:10px" v-show="voteList.length" />
-						<Icon type="md-add" class="to-create-icon" @click="goToCreate" />
+						<Icon type="md-trash" class="to-create-icon" @click="onDeleteVote" style="margin-left:10px" v-if="voteList.length && ($access.can('admin.*|schoolAc-upd') || isPrivate)" />
+						<Icon type="md-add" class="to-create-icon" @click="goToCreate" v-if="($access.can('admin.*|schoolAc-upd') || isPrivate)"/>
 					</span>
 				</div>
 				<vuescroll>
@@ -45,7 +45,7 @@
 					<span>投票详情</span>
 					<div class="hw-box-header-tools">
 						<span class="hw-box-header-tools-tool" v-show="currentVote.progress === 'pending'">
-							<Icon type="md-create" size="18" title="编辑" @click="onEditVote" /></span>
+							<Icon type="md-create" size="18" title="编辑" @click="onEditVote" v-if="($access.can('admin.*|schoolAc-upd') || isPrivate)"/></span>
 					</div>
 				</div>
 				<vuescroll>
@@ -358,6 +358,9 @@
 			},
 			getCurScope(){
 				return this.$route.name === 'personalVote' ? 'private' : 'school'
+			},
+			isPrivate(){
+				return this.$route.name === 'personalVote'
 			}
 		},
         watch: {