Browse Source

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

zhouj1203@hotmail.com 4 năm trước cách đây
mục cha
commit
94ddaba2b9

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

@@ -16,7 +16,7 @@ import {
 
 
 export default {
 export default {
 	/* 初始化自定义富文本配置项 */
 	/* 初始化自定义富文本配置项 */
-	initMyEditor(editor,vm) {
+	initMyEditor(editor,vm,isOption) {
 		// 初始化公式、视频、音频、画板功能
 		// 初始化公式、视频、音频、画板功能
 		this.addFormula(vm,editor)
 		this.addFormula(vm,editor)
 		this.addVideoUpload(vm,editor)
 		this.addVideoUpload(vm,editor)
@@ -43,6 +43,7 @@ export default {
 			'canvas',
 			'canvas',
 			'formula'
 			'formula'
 		]
 		]
+		isOption && editor.config.menus.splice(editor.config.menus.indexOf('video'),1)
 	},
 	},
 
 
 	/* 初始化自定义富文本简版配置项 */
 	/* 初始化自定义富文本简版配置项 */

+ 1 - 0
TEAMModelOS/ClientApp/src/utils/kityformula.js

@@ -33,6 +33,7 @@ export default function(editor) {
 						// 去掉空格
 						// 去掉空格
 						latex = latex.replace(/\s/g, '') 
 						latex = latex.replace(/\s/g, '') 
 						// 将latex转换成svg输出
 						// 将latex转换成svg输出
+						console.log(window.MathJax)
 						const html = window.MathJax.tex2svg(latex,{em: 12, ex: 6})
 						const html = window.MathJax.tex2svg(latex,{em: 12, ex: 6})
 						// 匹配输出的svg标签内容直接插入到编辑器中
 						// 匹配输出的svg标签内容直接插入到编辑器中
 						var regex = /\<svg .*\>.*\<\/svg\>/;
 						var regex = /\<svg .*\>.*\<\/svg\>/;

+ 90 - 48
TEAMModelOS/ClientApp/src/utils/public.js

@@ -171,7 +171,8 @@ export default {
 	},
 	},
 	// 生成随机UUID工具
 	// 生成随机UUID工具
 	guid: function() {
 	guid: function() {
-		return (this.randomId() + this.randomId() + '-' + this.randomId() + '-' + this.randomId() + '-' + this.randomId() +
+		return (this.randomId() + this.randomId() + '-' + this.randomId() + '-' + this.randomId() + '-' + this
+			.randomId() +
 			'-' + this.randomId() + this.randomId() + this.randomId())
 			'-' + this.randomId() + this.randomId() + this.randomId())
 	},
 	},
 
 
@@ -245,8 +246,9 @@ export default {
 		}
 		}
 		if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (d.getFullYear() + '').substr(4 - RegExp.$1.length))
 		if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (d.getFullYear() + '').substr(4 - RegExp.$1.length))
 		for (var k in o)
 		for (var k in o)
-			if (new RegExp('(' + k + ')').test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[
-				k]).substr(('' + o[k]).length)))
+			if (new RegExp('(' + k + ')').test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : ((
+				'00' + o[
+					k]).substr(('' + o[k]).length)))
 		return fmt
 		return fmt
 	},
 	},
 
 
@@ -356,7 +358,8 @@ export default {
 	 */
 	 */
 	getPrivateSas(code) {
 	getPrivateSas(code) {
 		return new Promise((r, j) => {
 		return new Promise((r, j) => {
-			if (!store.state.privateSas || checkSas(store.state.privateSas.timeout) || store.state.privateSas.name !== store.state.userInfo.TEAMModelId) {
+			if (!store.state.privateSas || checkSas(store.state.privateSas.timeout) || store.state.privateSas
+				.name !== store.state.userInfo.TEAMModelId) {
 				$api.blob.blobSasRCW({
 				$api.blob.blobSasRCW({
 					name: code || store.state.userInfo.TEAMModelId,
 					name: code || store.state.userInfo.TEAMModelId,
 					role: 'teacher'
 					role: 'teacher'
@@ -384,7 +387,8 @@ export default {
 	 */
 	 */
 	getSchoolSas(code) {
 	getSchoolSas(code) {
 		return new Promise((r, j) => {
 		return new Promise((r, j) => {
-			if (!store.state.schoolSas || checkSas(store.state.schoolSas.timeout)  || store.state.schoolSas.name !== store.state.userInfo.schoolCode) {
+			if (!store.state.schoolSas || checkSas(store.state.schoolSas.timeout) || store.state.schoolSas
+				.name !== store.state.userInfo.schoolCode) {
 				$api.blob.blobSasRCW({
 				$api.blob.blobSasRCW({
 					name: code || store.state.userInfo.schoolCode,
 					name: code || store.state.userInfo.schoolCode,
 					role: 'school'
 					role: 'school'
@@ -469,11 +473,11 @@ export default {
 			render: (h) => {
 			render: (h) => {
 				return h('div', {
 				return h('div', {
 					'class': 'my-spin',
 					'class': 'my-spin',
-					style:{
-						background:'#000',
-						padding:'20px',
-						borderRadius:'5px',
-						color:'#fff'
+					style: {
+						background: '#000',
+						padding: '20px',
+						borderRadius: '5px',
+						color: '#fff'
 					}
 					}
 				}, [
 				}, [
 					h('Icon', {
 					h('Icon', {
@@ -490,12 +494,12 @@ export default {
 		const blobTool = require('./blobTool.js')
 		const blobTool = require('./blobTool.js')
 		const isSchool = vm.$parent.exerciseScope ? vm.$parent.exerciseScope === 1 : vm.exerciseScope === 1
 		const isSchool = vm.$parent.exerciseScope ? vm.$parent.exerciseScope === 1 : vm.exerciseScope === 1
 		const sasData = isSchool ? await this.getSchoolSas() : await this.getPrivateSas()
 		const sasData = isSchool ? await this.getSchoolSas() : await this.getPrivateSas()
-		
+
 		const scope = isSchool ? 'school' : 'private'
 		const scope = isSchool ? 'school' : 'private'
 		const blobToolClass = blobTool.default
 		const blobToolClass = blobTool.default
 		//初始化Blob
 		//初始化Blob
 		let containerClient = new blobToolClass(sasData.url, sasData.name, sasData.sas, scope)
 		let containerClient = new blobToolClass(sasData.url, sasData.name, sasData.sas, scope)
-		try{
+		try {
 			let id = vm.curId || vm.$parent.curId
 			let id = vm.curId || vm.$parent.curId
 			// 上传文件
 			// 上传文件
 			let blobFile = await containerClient.upload(file, 'item/' + id)
 			let blobFile = await containerClient.upload(file, 'item/' + id)
@@ -506,13 +510,18 @@ export default {
 			editor.txt.append('<p><video src=' +
 			editor.txt.append('<p><video src=' +
 				fileBlobUrl + ' class="richText-video" width="300" preload controls="controls"></video></p>')
 				fileBlobUrl + ' class="richText-video" width="300" preload controls="controls"></video></p>')
 			editor.change.emit()
 			editor.change.emit()
+			vm.$EventBus.$emit('noSave', {
+				path: blobFile.blob,
+				size: blobFile.size,
+				scope: scope
+			})
 			vm.$Spin.hide();
 			vm.$Spin.hide();
-		}catch(e){
+		} catch (e) {
 			vm.$Message.error(e.spaceError)
 			vm.$Message.error(e.spaceError)
 			vm.$Spin.hide();
 			vm.$Spin.hide();
 		}
 		}
 	},
 	},
-	
+
 	/* 上传视频到BLob */
 	/* 上传视频到BLob */
 	async doUploadAudio(vm, file, editor) {
 	async doUploadAudio(vm, file, editor) {
 		console.log(vm)
 		console.log(vm)
@@ -520,11 +529,11 @@ export default {
 			render: (h) => {
 			render: (h) => {
 				return h('div', {
 				return h('div', {
 					'class': 'my-spin',
 					'class': 'my-spin',
-					style:{
-						background:'#000',
-						padding:'20px',
-						borderRadius:'5px',
-						color:'#fff'
+					style: {
+						background: '#000',
+						padding: '20px',
+						borderRadius: '5px',
+						color: '#fff'
 					}
 					}
 				}, [
 				}, [
 					h('Icon', {
 					h('Icon', {
@@ -541,12 +550,11 @@ export default {
 		const blobTool = require('./blobTool.js')
 		const blobTool = require('./blobTool.js')
 		const isSchool = vm.$parent.exerciseScope ? vm.$parent.exerciseScope === 1 : vm.exerciseScope === 1
 		const isSchool = vm.$parent.exerciseScope ? vm.$parent.exerciseScope === 1 : vm.exerciseScope === 1
 		const sasData = isSchool ? await this.getSchoolSas() : await this.getPrivateSas()
 		const sasData = isSchool ? await this.getSchoolSas() : await this.getPrivateSas()
-		
 		const scope = isSchool ? 'school' : 'private'
 		const scope = isSchool ? 'school' : 'private'
 		const blobToolClass = blobTool.default
 		const blobToolClass = blobTool.default
 		//初始化Blob
 		//初始化Blob
 		let containerClient = new blobToolClass(sasData.url, sasData.name, sasData.sas, scope)
 		let containerClient = new blobToolClass(sasData.url, sasData.name, sasData.sas, scope)
-		try{
+		try {
 			let id = vm.curId || vm.$parent.curId
 			let id = vm.curId || vm.$parent.curId
 			// 上传文件
 			// 上传文件
 			let blobFile = await containerClient.upload(file, 'item/' + id)
 			let blobFile = await containerClient.upload(file, 'item/' + id)
@@ -554,20 +562,52 @@ export default {
 			// 获取blob链接以及视频封面截图
 			// 获取blob链接以及视频封面截图
 			const fileSas = await this.getFileSas(blobFile.url)
 			const fileSas = await this.getFileSas(blobFile.url)
 			const fileBlobUrl = fileSas.url
 			const fileBlobUrl = fileSas.url
-			editor.cmd["do"]('insertHTML', `<span class="richText-audio" contenteditable="false" >
+			editor.cmd["do"]('insertHTML', `<span><span>&nbsp;&nbsp;</span><span class="richText-audio" contenteditable="false" >
 					<span class="audio-info">
 					<span class="audio-info">
 						<i class="ivu-icon ivu-icon-ios-musical-notes" style="font-size: 24px;margin:0 10px"></i>
 						<i class="ivu-icon ivu-icon-ios-musical-notes" style="font-size: 24px;margin:0 10px"></i>
 						<span class="audio-name">${ file.name }</span>
 						<span class="audio-name">${ file.name }</span>
 					</span>
 					</span>
 					<audio src="${ fileBlobUrl }"  id="audio" controls="controls" controlsList="nodownload"></audio>
 					<audio src="${ fileBlobUrl }"  id="audio" controls="controls" controlsList="nodownload"></audio>
-				</span>`);
+				</span><span>&nbsp;</span></span>`);
 			editor.change.emit()
 			editor.change.emit()
+			vm.$EventBus.$emit('noSave', {
+				path: blobFile.blob,
+				size: blobFile.size,
+				scope: scope
+			})
 			vm.$Spin.hide();
 			vm.$Spin.hide();
-		}catch(e){
+		} catch (e) {
 			vm.$Message.error(e.spaceError)
 			vm.$Message.error(e.spaceError)
 			vm.$Spin.hide();
 			vm.$Spin.hide();
 		}
 		}
 	},
 	},
+	/* 删除未保存的BLOB多媒体文件 */
+	async deleteNoSave(noSaveArr) {
+		const blobTool = require('./blobTool.js')
+		const schoolSas = await this.getSchoolSas()
+		const privateSas = await this.getPrivateSas()
+		const blobToolClass = blobTool.default
+		let schoolBlobClient = new blobToolClass(schoolSas.url, schoolSas.name, schoolSas.sas, 'school')
+		let privateBlobClient = new blobToolClass(privateSas.url, privateSas.name, privateSas.sas, 'private')
+		let promiseArr = []
+		for (let i = 0; i < noSaveArr.length; i++) {
+			let item = noSaveArr[i]
+			promiseArr.push(new Promise((r, j) => {
+				let myClient = item.scope === 'school' ? schoolBlobClient : privateBlobClient
+				myClient.deleteBlob(item.path, item.size).then(res => {
+					r(200)
+				}).catch(err => {
+					j(err)
+				})
+			}))
+		}
+		Promise.all(promiseArr).then(result => {
+			localStorage.setItem('noSave','[]')
+		}).catch(err => {
+			console.log(err)
+		})
+
+	},
 	isEqual: function(x, y) {
 	isEqual: function(x, y) {
 		// If both x and y are null or undefined and exactly the same 
 		// If both x and y are null or undefined and exactly the same 
 		if (x === y) {
 		if (x === y) {
@@ -611,8 +651,8 @@ export default {
 		}
 		}
 		return true;
 		return true;
 	},
 	},
-	
-	getLevelStuPercent(val,subjectIndex,index){
+
+	getLevelStuPercent(val, subjectIndex, index) {
 		let result = []
 		let result = []
 		val.students.forEach(stu => {
 		val.students.forEach(stu => {
 			result.push([
 			result.push([
@@ -621,40 +661,41 @@ export default {
 				stu.no || '-',
 				stu.no || '-',
 				val.fScores[subjectIndex].Value[index],
 				val.fScores[subjectIndex].Value[index],
 				stu.subjects[subjectIndex].fieldPoint[index],
 				stu.subjects[subjectIndex].fieldPoint[index],
-				(stu.subjects[subjectIndex].fieldPoint[index] / val.fScores[subjectIndex].Value[index]).toFixed(2)
+				(stu.subjects[subjectIndex].fieldPoint[index] / val.fScores[subjectIndex].Value[index])
+				.toFixed(2)
 			])
 			])
 		})
 		})
 		return result
 		return result
 	},
 	},
-	
-	getLevelClassPercent(val,subjectIndex,index){
+
+	getLevelClassPercent(val, subjectIndex, index) {
 		let result = []
 		let result = []
 		val.classes.forEach(classItem => {
 		val.classes.forEach(classItem => {
 			result.push(classItem.subjects[subjectIndex].field[index])
 			result.push(classItem.subjects[subjectIndex].field[index])
 		})
 		})
 		return result
 		return result
 	},
 	},
-	
-	getLevelPercent(val,subjectIndex){
+
+	getLevelPercent(val, subjectIndex) {
 		let stuResult = {}
 		let stuResult = {}
 		let classResult = {}
 		let classResult = {}
-		val.fieldName[subjectIndex].Value.forEach((item,index) => {
-			stuResult[item] = this.getLevelStuPercent(val,subjectIndex,index)
-			classResult[item] = this.getLevelClassPercent(val,subjectIndex,index)
+		val.fieldName[subjectIndex].Value.forEach((item, index) => {
+			stuResult[item] = this.getLevelStuPercent(val, subjectIndex, index)
+			classResult[item] = this.getLevelClassPercent(val, subjectIndex, index)
 		})
 		})
 		stuResult.grade = val.fieldAllPer[subjectIndex].Value
 		stuResult.grade = val.fieldAllPer[subjectIndex].Value
 		stuResult.keys = val.knowKey
 		stuResult.keys = val.knowKey
 		classResult.keys = val.knowkey
 		classResult.keys = val.knowkey
 		classResult.className = []
 		classResult.className = []
 		let obj = {
 		let obj = {
-			stuResult:stuResult,
-			classResult:classResult
+			stuResult: stuResult,
+			classResult: classResult
 		}
 		}
 		return obj
 		return obj
 	},
 	},
-	
+
 	/* 学情知识点模块数据转换 */
 	/* 学情知识点模块数据转换 */
-	getKnowStuPercent(val,subjectIndex,index){
+	getKnowStuPercent(val, subjectIndex, index) {
 		let result = []
 		let result = []
 		val.students.forEach(stu => {
 		val.students.forEach(stu => {
 			result.push([
 			result.push([
@@ -663,34 +704,35 @@ export default {
 				stu.no || '-',
 				stu.no || '-',
 				val.kScores[subjectIndex].Value[index],
 				val.kScores[subjectIndex].Value[index],
 				stu.subjects[subjectIndex].point[index],
 				stu.subjects[subjectIndex].point[index],
-				(stu.subjects[subjectIndex].point[index] / val.kScores[subjectIndex].Value[index]).toFixed(2)
+				(stu.subjects[subjectIndex].point[index] / val.kScores[subjectIndex].Value[index])
+				.toFixed(2)
 			])
 			])
 		})
 		})
 		return result
 		return result
 	},
 	},
-	
-	getKnowClassPercent(val,subjectIndex,index){
+
+	getKnowClassPercent(val, subjectIndex, index) {
 		let result = []
 		let result = []
 		val.classes.forEach(classItem => {
 		val.classes.forEach(classItem => {
 			result.push(classItem.subjects[subjectIndex].point[index])
 			result.push(classItem.subjects[subjectIndex].point[index])
 		})
 		})
 		return result
 		return result
 	},
 	},
-	
-	getKnowPercent(val,subjectIndex){
+
+	getKnowPercent(val, subjectIndex) {
 		let stuResult = {}
 		let stuResult = {}
 		let classResult = {}
 		let classResult = {}
-		val.knowName[subjectIndex].Value.forEach((item,index) => {
-			stuResult[item] = this.getKnowStuPercent(val,subjectIndex,index)
-			classResult[item] = this.getKnowClassPercent(val,subjectIndex,index)
+		val.knowName[subjectIndex].Value.forEach((item, index) => {
+			stuResult[item] = this.getKnowStuPercent(val, subjectIndex, index)
+			classResult[item] = this.getKnowClassPercent(val, subjectIndex, index)
 		})
 		})
 		stuResult.grade = val.knowAllper[subjectIndex].Value
 		stuResult.grade = val.knowAllper[subjectIndex].Value
 		stuResult.keys = val.knowKey
 		stuResult.keys = val.knowKey
 		classResult.keys = val.knowkey
 		classResult.keys = val.knowkey
 		classResult.className = []
 		classResult.className = []
 		let obj = {
 		let obj = {
-			stuResult:stuResult,
-			classResult:classResult
+			stuResult: stuResult,
+			classResult: classResult
 		}
 		}
 		return obj
 		return obj
 	},
 	},

+ 13 - 0
TEAMModelOS/ClientApp/src/view/Home.vue

@@ -100,11 +100,24 @@
             }
             }
         },
         },
         mounted() {
         mounted() {
+			
+			if(localStorage.getItem('noSave') && JSON.parse(localStorage.getItem('noSave')).length){
+				this.$tools.deleteNoSave(JSON.parse(localStorage.getItem('noSave')))
+			}else{
+				localStorage.setItem('noSave','[]')
+			}
+			
 			this.$EventBus.$off('onGlobalLoading')
 			this.$EventBus.$off('onGlobalLoading')
 			this.$EventBus.$on('onGlobalLoading', val => {
 			this.$EventBus.$on('onGlobalLoading', val => {
 				this.isLoading = val
 				this.isLoading = val
             })
             })
             
             
+			this.$EventBus.$off('noSave')
+			this.$EventBus.$on('noSave', val => {
+				let curNoSaveArr = JSON.parse(localStorage.getItem('noSave'))
+				curNoSaveArr.push(val)
+				localStorage.setItem('noSave',JSON.stringify(curNoSaveArr))
+			})
            
            
         },
         },
         watch: {
         watch: {

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

@@ -697,6 +697,7 @@
 						option: "update",
 						option: "update",
 					})
 					})
 					.then((res) => {
 					.then((res) => {
+						localStorage.setItem('noSave','[]')
 						this.$Message.success(this.$t('evaluation.editSuc'));
 						this.$Message.success(this.$t('evaluation.editSuc'));
 						this.$refs.editRef.isLoading = false;
 						this.$refs.editRef.isLoading = false;
 						this.editExerciseModal = false;
 						this.editExerciseModal = false;

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

@@ -412,6 +412,7 @@
 								option: "insert",
 								option: "insert",
 							}).then((res) => {
 							}).then((res) => {
 								this.isComplete = true
 								this.isComplete = true
+								localStorage.setItem('noSave','[]')
 								this.$router.push({
 								this.$router.push({
 									name: this.exerciseScope === 0 ? "personalBank" : "schoolBank",
 									name: this.exerciseScope === 0 ? "personalBank" : "schoolBank",
 									params: {
 									params: {

+ 2 - 2
TEAMModelOS/ClientApp/src/view/evaluation/types/BaseMultiple.vue

@@ -68,7 +68,7 @@
 						}
 						}
 						
 						
 						editor.config.uploadImgShowBase64 = true;
 						editor.config.uploadImgShowBase64 = true;
-						this.$editorTools.initMyEditor(editor,this)
+						this.$editorTools.initMyEditor(editor,this,true)
 
 
 							// 选项编辑器内容发生变化时
 							// 选项编辑器内容发生变化时
 							editor.config.onchange = (html) => {
 							editor.config.onchange = (html) => {
@@ -109,7 +109,7 @@
 					this.existOptions.push(newIndex)
 					this.existOptions.push(newIndex)
 					this.$nextTick(() => {
 					this.$nextTick(() => {
 						let editor = new E(that.$refs['singleOption' + newIndex][0])
 						let editor = new E(that.$refs['singleOption' + newIndex][0])
-						this.$editorTools.initMyEditor(editor,this)
+						this.$editorTools.initMyEditor(editor,this,true)
 						editor.config.onchange = (html) => {
 						editor.config.onchange = (html) => {
 							let key = String.fromCharCode(64 + parseInt(newIndex + 1))
 							let key = String.fromCharCode(64 + parseInt(newIndex + 1))
 							let codeArr = this.optionsContent.map(item => item.code)
 							let codeArr = this.optionsContent.map(item => item.code)

+ 2 - 2
TEAMModelOS/ClientApp/src/view/evaluation/types/BaseSingle.vue

@@ -65,7 +65,7 @@
 								}
 								}
 							}
 							}
 						}
 						}
-						this.$editorTools.initMyEditor(editor,this)
+						this.$editorTools.initMyEditor(editor,this,true)
 
 
 						// 选项编辑器内容发生变化时
 						// 选项编辑器内容发生变化时
 						editor.config.onchange = (html) => {
 						editor.config.onchange = (html) => {
@@ -107,7 +107,7 @@
 					this.existOptions.push(newIndex)
 					this.existOptions.push(newIndex)
 					this.$nextTick(() => {
 					this.$nextTick(() => {
 						let editor = new E(that.$refs['singleOption' + newIndex][0])
 						let editor = new E(that.$refs['singleOption' + newIndex][0])
-						this.$editorTools.initMyEditor(editor,this)
+						this.$editorTools.initMyEditor(editor,this,true)
 						editor.config.onchange = (html) => {
 						editor.config.onchange = (html) => {
 							let key = String.fromCharCode(64 + parseInt(newIndex + 1))
 							let key = String.fromCharCode(64 + parseInt(newIndex + 1))
 							let codeArr = this.optionsContent.map(item => item.code)
 							let codeArr = this.optionsContent.map(item => item.code)