浏览代码

资源管理

zhangsq 8 月之前
父节点
当前提交
9f1d686f94

+ 4 - 0
src/api/resourceAudit.js

@@ -58,5 +58,9 @@ export default {
 	//文件下载资源上传删除
 	downloadfile(data = {}) {
 		return request('resourceFile/downloadfile', data, 'get', { responseType: 'blob' })
+	},
+	//文件上传成功转换格式
+	fileFormatConversion(data = {}) {
+		return request('transcodingResource/file', data, 'post')
 	}
 }

+ 14 - 5
src/views/myResources/UploadModal.vue

@@ -107,6 +107,7 @@
 		chunkSize: 1024 * 1024,
 		fileParameterName: 'file',
 		maxChunkRetries: 3,
+		simultaneousUploads: 5, // 控制并发上传数
 		testChunks: true,
 		checkChunkUploadedByResponse: (chunk, message) => {
 			let objMessage = JSON.parse(message)
@@ -135,6 +136,7 @@
 	})
 
 	const attrs = ref({
+		// accept: '.doc,.docx,.ppt,.pptx,.xls,.xlsx'
 		accept: '*'
 	})
 
@@ -232,12 +234,15 @@
 			message.warning(`剩余存储空间不足,请重新选择${filesSource.length > 1 ? '批量' : ''}文件`)
 			filesSource.ignored = true // 本次选择的文件过滤掉
 		} else {
-			// 批量或单个选择的文件未超出剩余存储空间,正常上传
 			filesLength.value += filesSource.length
-			filesSource.forEach((file) => {
-				dropBoxShow.value = false
-				computeMD5(file)
-			})
+			// 手动控制上传队列,每次只处理5个文件
+			const batchSize = 5
+			for (let i = 0; i < filesSource.length; i += batchSize) {
+				const batch = filesSource.slice(i, i + batchSize)
+				batch.forEach((file) => {
+					computeMD5(file)
+				})
+			}
 		}
 	}
 
@@ -260,6 +265,10 @@
 		filesLength.value--
 		// 所有文件上传完成后,允许关闭弹窗
 		canClose.value = filesLength.value === 0
+		// 当一个文件完成时,检查是否有待上传文件
+		if (uploaderInstance.value.files.some((f) => !f.isComplete)) {
+			uploaderInstance.value.upload()
+		}
 		console.log(formState.fileIds, response, result, 'formState.fileIdsformState.fileIdsformState.fileIds')
 	}
 

+ 4 - 17
src/views/myResources/auditModal.vue

@@ -9,7 +9,10 @@
 					:source="activeVideoSource"
 					@ready="playerReadied"
 				></video-player>
-				<div v-else-if="['pdf', 'word', 'ppt', 'doc'].includes(recordData.suffix.toLowerCase())" class="preview-iframe">
+				<div
+					v-else-if="['pdf', 'word', 'ppt', 'doc', 'docx'].includes(recordData.suffix.toLowerCase())"
+					class="preview-iframe"
+				>
 					<iframe
 						:src="`https://docs.google.com/gview?url=${sysConfig.FILE_URL + recordData.fileUrl}&embedded=true`"
 						frameborder="0"
@@ -76,22 +79,6 @@
 	const auditResult = ref(1) // 默认为通过
 	const detailData = ref({})
 	const visibles = ref(true)
-
-	const playerOptions = computed(() => ({
-		autoplay: false, // 禁止自动播放
-		controls: true, // 显示控制条
-		fluid: true, // 流体布局
-		preload: 'auto', // 预加载
-		sources: [
-			{
-				type: 'video/mp4',
-				src: sysConfig.FILE_URL + props.recordData.fileUrl
-			}
-		],
-		techOrder: ['html5'], // 优先使用html5播放
-		// poster: sysConfig.FILE_URL + props.recordData.posterPath
-		poster: 'http://192.168.1.245:10005/education/upload/20250702/21d8bc591e499136c393c13cf5343f6c.jpeg'
-	}))
 	const activeVideoSource = computed(() => ({
 		type: `video/mp4`,
 		src: sysConfig.FILE_URL + props.recordData.fileUrl

+ 63 - 19
src/views/myResources/myResources.vue

@@ -2,32 +2,39 @@
 	<a-card>
 		<!-- 标签页 -->
 		<a-tabs v-model:activeKey="formState.verifyStatus" @change="tabChange">
-			<a-tab-pane key="0" tab="未发布" v-if="!pageType"></a-tab-pane>
+			<a-tab-pane key="0" tab="未发布"></a-tab-pane>
 			<a-tab-pane key="1" tab="待审核"></a-tab-pane>
-			<a-tab-pane key="2" tab="已发布" v-if="!pageType"></a-tab-pane>
+			<a-tab-pane key="2" tab="已发布"></a-tab-pane>
 			<!-- <a-tab-pane key="3" tab="已审核" v-if="pageType == 'economize'"></a-tab-pane> -->
 			<a-tab-pane key="4" tab="回收站"></a-tab-pane>
 		</a-tabs>
 		<!-- 搜索和操作区域 -->
 		<a-row :gutter="16" style="margin-bottom: 16px">
 			<a-col :span="18">
-				<a-input v-model:value="formState.fileName" placeholder="请输入资源名称" style="width: 200px" />
+				<a-input v-model:value="formState.fileName" placeholder="请输入资源名称" style="width: 150px" />
 				<a-cascader
-					style="width: 200px; margin-left: 8px"
-					v-model:value="formState.majorIdName"
+					style="width: 240px; margin-left: 8px"
+					v-model:value="majorIdName"
 					:options="collegeMajorOptions"
-					:fieldNames="{ label: 'name', value: 'parentId', children: 'children' }"
+					:fieldNames="{ label: 'name', value: 'id', children: 'children' }"
 					placeholder="请选择院系"
 					changeOnSelect
 					@change="changeCollegeMajor"
 				/>
+				<!-- <a-select
+					v-model:value="formState.majorId"
+					style="width: 150px; margin-left: 8px"
+					:fieldNames="{ label: 'majorName', value: 'majorCode' }"
+					:options="majorOptions"
+					placeholder="请选择专业"
+				/> -->
 				<a-select
-					v-model:value="formState.resourceTypeName"
-					style="width: 200px; margin-left: 8px"
+					v-model:value="formState.resourceType"
+					style="width: 150px; margin-left: 8px"
 					:options="courseTypeOptions"
 					placeholder="请选择资源类型"
 				/>
-				<a-select v-model:value="formState.suffix" placeholder="请选择资源格式" style="width: 200px; margin-left: 8px">
+				<a-select v-model:value="formState.suffix" placeholder="请选择资源格式" style="width: 150px; margin-left: 8px">
 					<a-select-option value="mp4">mp4</a-select-option>
 					<a-select-option value="ppt">ppt</a-select-option>
 					<a-select-option value="word">word</a-select-option>
@@ -270,11 +277,16 @@
 		fileName: null,
 		verifyStatus: '0',
 		resourcesId: null,
-		majorIdName: null,
-		resourceTypeName: null,
+		// majorId: null, //专业
+		collegeId: null, //院校一级id
+		collegeTwoId: null, //院校二级id
+		collegeThreeId: null, //院校三级id
+		resourceType: null,
 		suffix: null
 	})
 	// 添加选择状态
+	const majorIdName = ref([])
+	const majorOptions = ref([]) //专业
 	const selectedRowKeys = ref([])
 	const selectedRows = ref([])
 	const publishedData = ref([]) //当前点击数据
@@ -452,9 +464,13 @@
 			size: pagination.pageSize,
 			verifyStatus: formState.verifyStatus,
 			fileName: formState.fileName,
-			majorIdName: formState.majorIdName?.join(','),
-			resourceTypeName: formState.resourceTypeName,
-			suffix: formState.suffix
+			resourceType: formState.resourceType,
+			suffix: formState.suffix,
+			// majorId: formState.majorId,
+			collegeTwoId: formState.collegeTwoId,
+			collegeId: formState.collegeId,
+			collegeThreeId: formState.collegeThreeId,
+			isSelf: !pageType ? 1 : 0
 		}
 		resourceAuditApi
 			.page(params)
@@ -471,6 +487,19 @@
 				loading.value = false
 			})
 	}
+	const changeCollegeMajor = (value, selectedOptions) => {
+		console.log('Selected:', value, selectedOptions)
+		majorIdName.value = selectedOptions.map((it) => it.name).join('/')
+		formState.collegeId = value[0] || null
+		formState.collegeTwoId = value[1] || null
+		formState.collegeThreeId = value[2] || null
+		if (selectedOptions.length) {
+			// 获取选中的最后一级
+			const lastSelected = selectedOptions[selectedOptions.length - 1]
+			console.log(lastSelected, '最后一级id')
+			getCollegeMajor(lastSelected.id)
+		}
+	}
 	const getList = () => {
 		getListData()
 		uploadModalVisible.value = false
@@ -487,6 +516,17 @@
 				console.log(err)
 			})
 	}
+	const getCollegeMajor = (id) => {
+		resourceAuditApi
+			.zyselect({ collegeId: id })
+			.then((res) => {
+				console.log(res.data, '专业下拉数据')
+				majorOptions.value = res.data
+			})
+			.catch((err) => {
+				console.log(err)
+			})
+	}
 	// 方法
 	const handleSearch = () => {
 		console.log('Search:', searchValue.value)
@@ -495,10 +535,14 @@
 
 	const handleReset = () => {
 		searchValue.value = null
-		formState.majorIdName = null
+		majorIdName.value = null
 		formState.fileName = null
-		formState.resourceTypeName = null
+		formState.resourceType = null
 		formState.suffix = null
+		formState.collegeTwoId = null
+		// formState.majorId = null
+		formState.collegeId = null
+		formState.collegeThreeId = null
 		getListData()
 	}
 	const tabChange = () => {
@@ -708,9 +752,9 @@
 	}
 
 	onMounted(() => {
-		if (pageType == 'economize') {
-			formState.verifyStatus = '1'
-		}
+		// if (pageType == 'economize') {
+		// 	formState.verifyStatus = '1'
+		// }
 		getOrgTreeSelector()
 		getListData()
 	})

+ 26 - 15
src/views/myResources/resourceUpload.vue

@@ -19,15 +19,15 @@
 					@change="changeCollegeMajor"
 				/>
 			</a-form-item>
-			<a-form-item label="专业" name="majorId" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }">
+			<!-- <a-form-item label="专业" name="majorId" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }">
 				<a-select
 					v-model:value="formState.majorId"
 					style="width: 200px"
-					:fieldNames="{ label: 'createUserName', value: 'popular' }"
+					:fieldNames="{ label: 'majorName', value: 'majorCode' }"
 					:options="majorOptions"
 					placeholder="请选择专业"
 				/>
-			</a-form-item>
+			</a-form-item> -->
 			<!-- <a-form-item label="课程" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }">
 				<a-select
 					v-model:value="formState.courseId"
@@ -164,7 +164,7 @@
 		collegeTwoId: null, //院校二级id
 		collegeThreeId: null, //院校三级id
 		resourceDesc: null, //资源介绍
-		majorId: null, //专业id
+		// majorId: null, //专业id
 		// courseTypeName: [], // 资源类型
 		keywordValue: [], // 添加关键词
 		keyword: [], // 热门关键词
@@ -191,9 +191,22 @@
 		emit('close')
 		fileList.value = []
 	}
+	// 新增Set记录已处理ID
+	// const processedIds = ref(new Set())
 	//资源文件上传成功返回
-	const uploadSuccess = (idsArr) => {
+	const uploadSuccess = async (idsArr) => {
 		formState.userfileIds = idsArr.join(',')
+		// const newIds = idsArr.filter((id) => !processedIds.value.has(id))
+		// if (newIds.length === 0) return
+		// //文件转换
+		// try {
+		// 	const requests = newIds.map((id) => resourceAuditApi.fileFormatConversion({ userFileId: id }))
+		// 	await Promise.all(requests)
+		// 	newIds.forEach((id) => processedIds.value.add(id))
+		// 	newKeyword.value = ''
+		// } catch (err) {
+		// 	console.error('部分请求失败:', err)
+		// }
 	}
 	// 自定义校验函数示例
 	const validateKeywords = (rule, value, callback) => {
@@ -212,7 +225,7 @@
 			{ required: true, message: '请选择关键词', trigger: 'blur' },
 			{ validator: validateKeywords, trigger: 'blur' }
 		],
-		majorId: [{ required: true, message: '请选择专业', trigger: 'change' }],
+		// majorId: [{ required: true, message: '请选择专业', trigger: 'change' }],
 		resourceType: [{ required: true, message: '请选择资源类型', trigger: 'change' }],
 		resourceDesc: [
 			{ required: true, message: '请输入资源描述', trigger: 'blur' },
@@ -244,7 +257,6 @@
 		console.log(keywordName, index)
 		// 1. 从显示列表中删除
 		formState.keywordValue = formState.keywordValue.filter((name) => name !== keywordName)
-		console.log(formState.keywordValue, 'formState.keywordValue')
 		// 2. 更新checkbox的绑定值
 		formState.keyword = HotKeywordsOptions.value
 			.filter((option) => formState.keywordValue.includes(option.label))
@@ -271,7 +283,6 @@
 		formState.keywordValue = HotKeywordsOptions.value
 			.filter((option) => checkedValues.includes(option.value))
 			.map((item) => item.label)
-		console.log(formState.keywordValue, '选中数据')
 	}
 	const setPublicStatus = (status) => {
 		formState.publicStatus = status
@@ -349,10 +360,10 @@
 				collegeId: formState.collegeId,
 				collegeTwoId: formState.collegeTwoId,
 				collegeThreeId: formState.collegeThreeId,
-				keywordValue: formState.keywordValue.join(', '),
-				keyword: formState.keyword.join(', '),
+				keywordValue: formState.keywordValue.join(','),
+				keyword: formState.keyword.join(','),
 				resourceDesc: formState.resourceDesc,
-				majorId: formState.majorId,
+				// majorId: formState.majorId,
 				isHot: formState.isHot,
 				isRecommend: formState.isRecommend,
 				coverImage: formState.coverImage,
@@ -391,9 +402,9 @@
 			majorIdName.value = res.data.collegeAllId.split(',')
 			getCollegeMajor(majorIdName.value[majorIdName.value.length - 1])
 			formState.resourceDesc = res.data.resourceDesc
-			formState.majorId = res.data.majorId
+			// formState.majorId = res.data.majorId
 			formState.keywordValue = res.data.keywordValue.split(',')
-			formState.keyword = res.data.keyword.split(',')
+			formState.keyword = res.data.keyword.split(',').filter(Boolean).map(Number)
 		})
 	}
 	// 获取历史添加表单
@@ -407,9 +418,9 @@
 			majorIdName.value = res.data.collegeAllId.split(',')
 			getCollegeMajor(majorIdName.value[majorIdName.value.length - 1])
 			formState.resourceDesc = res.data.resourceDesc
-			formState.majorId = res.data.majorId
+			// formState.majorId = res.data.majorId
 			formState.keywordValue = res.data.keywordValue.split(',')
-			formState.keyword = res.data.keyword.split(',')
+			formState.keyword = res.data.keyword.split(',').filter(Boolean).map(Number)
 		})
 	}
 	// 上传前的钩子函数