提交 9adacf96 authored 作者: 王鹏飞's avatar 王鹏飞

bug fixes

上级 ba5b000e
...@@ -23,16 +23,33 @@ interface UploadInfo { ...@@ -23,16 +23,33 @@ interface UploadInfo {
videoInfo: any videoInfo: any
progress: number progress: number
} }
interface Props {
beforeUpload?: (file: any) => void
}
const props = defineProps<Props>()
const emit = defineEmits(['success']) const emit = defineEmits(['success'])
const uploader = createUploader() const uploader = createUploader()
let fileList = $ref<UploadInfo[]>([]) let fileList = $ref<UploadInfo[]>([])
const fileChange = (event: Event) => { onUnmounted(() => {
uploader && uploader.stopUpload()
})
const fileChange = async (event: Event) => {
const element = event.currentTarget as HTMLInputElement const element = event.currentTarget as HTMLInputElement
const files: FileList | null = element.files const files: FileList | null = element.files
if (!files) return if (!files) return
if (props.beforeUpload) {
try {
await props.beforeUpload(files)
uploader.cleanList()
} catch (error) {
console.log(error)
return false
}
}
for (const file of files) { for (const file of files) {
// 是否重复上传 // 是否重复上传
const hasRepeat = !!fileList.find( const hasRepeat = !!fileList.find(
......
...@@ -10,6 +10,7 @@ interface Props { ...@@ -10,6 +10,7 @@ interface Props {
prefix?: string prefix?: string
size?: number size?: number
limit?: number limit?: number
beforeUpload?: (file: any) => void
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
...@@ -32,7 +33,7 @@ const showFileList = computed(() => { ...@@ -32,7 +33,7 @@ const showFileList = computed(() => {
// 上传之前 // 上传之前
const handleBeforeUpload = async (file: any) => { const handleBeforeUpload = async (file: any) => {
if (props.limit && fileList.value.length >= props.limit) { if (props.limit && fileList.value.length >= props.limit && props.limit > 1) {
ElMessage.error(`只能上传${props.limit}个文件`) ElMessage.error(`只能上传${props.limit}个文件`)
return false return false
} }
...@@ -52,6 +53,9 @@ const handleBeforeUpload = async (file: any) => { ...@@ -52,6 +53,9 @@ const handleBeforeUpload = async (file: any) => {
url: `${response.host}/${key}` url: `${response.host}/${key}`
} }
file.url = `${response.host}/${key}` file.url = `${response.host}/${key}`
if (props.beforeUpload) {
return props.beforeUpload(file)
}
} }
// 上传成功 // 上传成功
...@@ -60,19 +64,20 @@ const handleSuccess = (response: any, file: any, files: any) => { ...@@ -60,19 +64,20 @@ const handleSuccess = (response: any, file: any, files: any) => {
if (showFileList.value) { if (showFileList.value) {
emit( emit(
'update:modelValue', 'update:modelValue',
files.map((item: any) => { files
return { .map((item: any) => {
name: item.name, return {
url: item.url || item.raw?.url, name: item.name,
size: item.size || item.raw?.size, url: item.url || item.raw?.url,
type: item.type || item.raw?.type size: item.size || item.raw?.size,
} type: item.type || item.raw?.type
}) }
// .reverse() })
// .filter((item: any, index: number) => { .reverse()
// return props.limit ? index < props.limit : true .filter((item: any, index: number) => {
// }) return props.limit ? index < props.limit : true
// .reverse() })
.reverse()
) )
} else { } else {
emit('update:modelValue', file.raw.url) emit('update:modelValue', file.raw.url)
......
<script setup lang="ts"> <script setup lang="ts">
import type { FormInstance, FormRules } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus'
import type { BookItem, BookCreateItem } from '../types' import type { BookItem, BookCreateItem } from '../types'
import { ElMessage } from 'element-plus' import { ElMessageBox, ElMessage } from 'element-plus'
import AppUpload from '@/components/base/AppUpload.vue' import AppUpload from '@/components/base/AppUpload.vue'
import { createBook, updateBook } from '../api' import { createBook, updateBook } from '../api'
...@@ -73,6 +73,14 @@ const experimentList = $computed(() => { ...@@ -73,6 +73,14 @@ const experimentList = $computed(() => {
? [{ id: props.data.experiment_id, name: props.data.experiment_id_name }, ...experiments.value] ? [{ id: props.data.experiment_id, name: props.data.experiment_id_name }, ...experiments.value]
: experiments.value : experiments.value
}) })
function handleBeforeUpload() {
if (form.files.length) {
return ElMessageBox.confirm('系统仅支持1个实验指导书,此操作将覆盖原有实验指导书文件,确认上传新文件吗?', '提示')
}
return true
}
function handleUploadSuccess(file: any) { function handleUploadSuccess(file: any) {
form.name = file.name.split('.').shift() form.name = file.name.split('.').shift()
form.size = (file.size / 1024 / 1024).toString() form.size = (file.size / 1024 / 1024).toString()
...@@ -110,6 +118,7 @@ function handleUpdate(params: BookCreateItem) { ...@@ -110,6 +118,7 @@ function handleUpdate(params: BookCreateItem) {
<AppUpload <AppUpload
v-model="form.files" v-model="form.files"
:limit="1" :limit="1"
:beforeUpload="handleBeforeUpload"
accept=".doc,.docx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,.pdf,application/pdf,.ppt,.pptx,application/vnd.ms-powerpoint,.csv,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" accept=".doc,.docx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,.pdf,application/pdf,.ppt,.pptx,application/vnd.ms-powerpoint,.csv,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
@success="handleUploadSuccess" @success="handleUploadSuccess"
> >
......
<script setup lang="ts"> <script setup lang="ts">
import type { FormInstance, FormRules } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus'
import type { VideoItem, VideoCreateItem } from '../types' import type { VideoItem, VideoCreateItem } from '../types'
import { ElMessage } from 'element-plus' import { ElMessageBox, ElMessage } from 'element-plus'
import UploadVideo from '@/components/UploadVideo.vue' import UploadVideo from '@/components/UploadVideo.vue'
import { createVideo, updateVideo } from '../api' import { createVideo, updateVideo } from '../api'
...@@ -63,6 +63,16 @@ const title = $computed(() => { ...@@ -63,6 +63,16 @@ const title = $computed(() => {
return isUpdate ? '编辑实验操作视频' : '新增实验操作视频' return isUpdate ? '编辑实验操作视频' : '新增实验操作视频'
}) })
function handleBeforeUpload() {
if (form.source_id) {
return ElMessageBox.confirm(
'系统仅支持1个实验操作视频,此操作将覆盖原有实验操作视频文件,确认上传新文件吗?',
'提示'
)
}
return true
}
function handleUploadSuccess(uploadInfo: any) { function handleUploadSuccess(uploadInfo: any) {
form.name = uploadInfo.file.name.split('.').shift() form.name = uploadInfo.file.name.split('.').shift()
form.source_id = uploadInfo.videoId form.source_id = uploadInfo.videoId
...@@ -95,7 +105,7 @@ function handleUpdate(params: VideoCreateItem) { ...@@ -95,7 +105,7 @@ function handleUpdate(params: VideoCreateItem) {
<el-dialog :title="title" :close-on-click-modal="false" width="600px" @update:modelValue="$emit('update:modelValue')"> <el-dialog :title="title" :close-on-click-modal="false" width="600px" @update:modelValue="$emit('update:modelValue')">
<el-form ref="formRef" :model="form" :rules="rules" label-width="140px"> <el-form ref="formRef" :model="form" :rules="rules" label-width="140px">
<el-form-item label="实验操作视频文件" prop="source_id"> <el-form-item label="实验操作视频文件" prop="source_id">
<UploadVideo @success="handleUploadSuccess"> <UploadVideo :beforeUpload="handleBeforeUpload" @success="handleUploadSuccess">
<template #tip>实验操作视频文件支持格式包含:doc docx xls xlsx pdf ppt pptx,大小不超过50M</template> <template #tip>实验操作视频文件支持格式包含:doc docx xls xlsx pdf ppt pptx,大小不超过50M</template>
</UploadVideo> </UploadVideo>
</el-form-item> </el-form-item>
......
<script setup lang="ts"> <script setup lang="ts">
import type { ExperimentRecord, ExperimentRecordFile } from '../types' import type { ExperimentRecord } from '../types'
import { ElMessageBox } from 'element-plus' import { ElMessageBox } from 'element-plus'
import ImageViewer from '@/components/ImageViewer.vue' import ImageViewer from '@/components/ImageViewer.vue'
import { uploadExperimentPicture } from '../api' import { uploadExperimentPicture } from '../api'
......
...@@ -39,6 +39,18 @@ watchEffect(() => { ...@@ -39,6 +39,18 @@ watchEffect(() => {
form.experiment_id = first.id form.experiment_id = first.id
} }
}) })
// 课程改变
function handleCourseChange(value: string) {
ElMessageBox.confirm('切换实验,将会导致当前操作内容变化,请确认当前操作无误并确认切换实验。', '提示').then(() => {
form.course_id = value
})
}
// 实验改变
function handleExperimentChange(value: string) {
ElMessageBox.confirm('切换实验,将会导致当前操作内容变化,请确认当前操作无误并确认切换实验。', '提示').then(() => {
form.experiment_id = value
})
}
let detail = $ref<ExperimentRecord>() let detail = $ref<ExperimentRecord>()
provide('detail', $$(detail)) provide('detail', $$(detail))
...@@ -136,12 +148,12 @@ function handleSubmit() { ...@@ -136,12 +148,12 @@ function handleSubmit() {
<div class="lab-left__inner"> <div class="lab-left__inner">
<el-form :model="form" label-suffix=":" hide-required-asterisk> <el-form :model="form" label-suffix=":" hide-required-asterisk>
<el-form-item label="请选择课程"> <el-form-item label="请选择课程">
<el-select v-model="form.course_id" style="width: 100%"> <el-select :model-value="form.course_id" @change="handleCourseChange" style="width: 100%">
<el-option v-for="item in courses" :key="item.id" :label="item.name" :value="item.id"></el-option> <el-option v-for="item in courses" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="请选择实验" prop="experiment_id"> <el-form-item label="请选择实验" prop="experiment_id">
<el-select v-model="form.experiment_id" style="width: 100%"> <el-select :model-value="form.experiment_id" @change="handleExperimentChange" style="width: 100%">
<el-option v-for="item in experimentList" :key="item.id" :label="item.name" :value="item.id"></el-option> <el-option v-for="item in experimentList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论