提交 48fe0fb0 authored 作者: matian's avatar matian

bug fixes

上级 74df4d85
...@@ -5,9 +5,19 @@ import type { UploadProps, UploadUserFile } from 'element-plus' ...@@ -5,9 +5,19 @@ import type { UploadProps, UploadUserFile } from 'element-plus'
import md5 from 'blueimp-md5' import md5 from 'blueimp-md5'
import { getSignature } from '@/api/base' import { getSignature } from '@/api/base'
const props = withDefaults(defineProps<{ modelValue: string | []; prefix?: string; isPost?: string }>(), { const props = withDefaults(
prefix: 'upload/admin/' defineProps<{
}) modelValue: string | []
prefix?: string
size?: number
beforeUploadFiles?: (file: any) => boolean | void
onChange?: (file: any, files: any) => void
}>(),
{
prefix: 'upload/admin/'
}
)
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const uploadData = ref() const uploadData = ref()
...@@ -39,35 +49,15 @@ const handleBeforeUpload = async (file: any) => { ...@@ -39,35 +49,15 @@ 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.isPost) { if (props.beforeUploadFiles) {
if ( return props.beforeUploadFiles(file)
fileList.value.filter((item: any) => item.name.includes('.png')).length +
fileList.value.filter((item: any) => item.name.includes('.jpg')).length +
fileList.value.filter((item: any) => item.name.includes('.jpeg')).length >
10
) {
const videoList = fileList.value.filter((item: any) => item.name.includes('.mp4')).slice(0, 1)
const imgList = fileList.value
.filter((item: any) => item.name.includes('.png') || item.name.includes('.jpg') || item.name.includes('.jpeg'))
.slice(0, 10)
fileList.value = [...videoList, ...imgList]
ElMessage.warning('支持最多上传10张图片,格式支持jpg,jpeg,png')
} else if (fileList.value.filter((item: any) => item.name.includes('.mp4')).length > 1) {
const videoList = fileList.value.filter((item: any) => item.name.includes('.mp4')).slice(0, 1)
const imgList = fileList.value
.filter((item: any) => item.name.includes('.png') || item.name.includes('.jpg') || item.name.includes('.jpeg'))
.slice(0, 10)
fileList.value = [...videoList, ...imgList]
ElMessage.warning('视频最多长传1个')
}
} }
} }
// 上传成功 // 上传成功
const handleSuccess = (response: any, file: any, files: any) => { const handleSuccess: UploadProps['onSuccess'] = (response, file: any, files: any) => {
if (!files.every((item: any) => item.status === 'success')) return if (!files.every((item: any) => item.status === 'success')) return
if (showFileList.value) { if (showFileList.value) {
console.log(files)
emit( emit(
'update:modelValue', 'update:modelValue',
files.map((item: any) => { files.map((item: any) => {
...@@ -90,11 +80,11 @@ const handleExceed: UploadProps['onExceed'] = () => { ...@@ -90,11 +80,11 @@ const handleExceed: UploadProps['onExceed'] = () => {
} }
// 删除 // 删除
const handleRemove: UploadProps['onRemove'] = (file, files) => { const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => {
if (showFileList.value) { if (showFileList.value) {
emit( emit(
'update:modelValue', 'update:modelValue',
files.map((item: any) => { uploadFiles.map((item: any) => {
return { name: item.name, url: item.url || item.raw.url } return { name: item.name, url: item.url || item.raw.url }
}) })
) )
......
<script lang="ts" setup> <script lang="ts" setup>
import AppUpload from '@/components/base/AppUpload.vue' import AppUpload from '@/components/base/AppUpload.vue'
import type { FormInstance, FormRules } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus'
import { ElMessage } from 'element-plus'
import { useProjectList } from '@/composables/useGetProjectList' import { useProjectList } from '@/composables/useGetProjectList'
import { createPosts, getConditionList } from '../api' import { createPosts, getConditionList } from '../api'
import { useMapStore } from '@/stores/map' import { useMapStore } from '@/stores/map'
...@@ -9,6 +11,7 @@ const typeList = store.getMapValuesByKey('learning_discussion_type') ...@@ -9,6 +11,7 @@ const typeList = store.getMapValuesByKey('learning_discussion_type')
const departmentList: any = useProjectList('', '79806610719731712').departmentList const departmentList: any = useProjectList('', '79806610719731712').departmentList
const ruleFormRef = ref<FormInstance>() const ruleFormRef = ref<FormInstance>()
const emit = defineEmits<Emits>() const emit = defineEmits<Emits>()
const loading = ref(false)
defineProps({ defineProps({
isShowAddDialog: { isShowAddDialog: {
type: Boolean type: Boolean
...@@ -125,12 +128,14 @@ const handleCancel = () => { ...@@ -125,12 +128,14 @@ const handleCancel = () => {
} }
// 确认 // 确认
const handleConfirm = async (formEl: FormInstance | undefined) => { const handleConfirm = async (formEl: FormInstance | undefined) => {
loading.value = true
if (!formEl) return if (!formEl) return
await formEl.validate(valid => { await formEl.validate(valid => {
if (valid) { if (valid) {
form.files = JSON.stringify(form.files) form.files = JSON.stringify(form.files)
const params: any = Object.assign({}, form) const params: any = Object.assign({}, form)
createPosts(params).then(() => { createPosts(params).then(() => {
loading.value = false
emit('update:isShowAddDialog', false) emit('update:isShowAddDialog', false)
emit('create') emit('create')
}) })
...@@ -165,10 +170,38 @@ const handleChangeCourse = () => { ...@@ -165,10 +170,38 @@ const handleChangeCourse = () => {
form.chapter_id = '' form.chapter_id = ''
chapterList.value = [] chapterList.value = []
} }
const videoLimit = $computed(() => {
return form.files.filter((item: any) => item.url.includes('.mp4'))
})
const imgLimit = $computed(() => {
return form.files.filter(
(item: any) => item.url.includes('.png') || item.url.includes('.jpg') || item.url.includes('.jpeg')
)
})
const beforeUploadFiles = (file: any) => {
console.log(file)
if (file.type.includes('video/') && file.size > 104857600) {
ElMessage.warning('视频大小不能超过100MB')
return false
}
if (file.type.includes('image/') && file.size > 2097152) {
ElMessage.warning('图片大小不能超过2MB')
return false
}
if (imgLimit.length >= 10 && (file.url.includes('.png') || file.url.includes('.jpg') || file.url.includes('.jpeg'))) {
ElMessage.warning('最多只能上传10张图片')
return false
}
if (videoLimit.length >= 1 && file.url.includes('.mp4')) {
ElMessage.warning('最多只能上传1个视频')
return false
}
}
</script> </script>
<template> <template>
<el-dialog :model-value="isShowAddDialog" draggable title="新建帖子" :before-close="handleCancel"> <el-dialog :model-value="isShowAddDialog" title="新建帖子" :before-close="handleCancel">
<div style="height: 40vh; overflow-y: auto"> <div style="height: 65vh; overflow-y: auto">
<el-form <el-form
:model="form" :model="form"
label-position="right" label-position="right"
...@@ -242,10 +275,9 @@ const handleChangeCourse = () => { ...@@ -242,10 +275,9 @@ const handleChangeCourse = () => {
</el-form-item> </el-form-item>
<el-form-item label="标题" prop="title"> <el-form-item label="标题" prop="title">
<el-input v-model="form.title" /> <el-input v-model="form.title" placeholder="标题" />
</el-form-item> </el-form-item>
<el-form-item label="正文内容" prop="content"> <el-form-item label="正文内容" prop="content">
<!-- <v-editor v-model="form.content" class="editor" :height="200"></v-editor> -->
<el-input <el-input
v-model="form.content" v-model="form.content"
maxlength="500" maxlength="500"
...@@ -254,23 +286,13 @@ const handleChangeCourse = () => { ...@@ -254,23 +286,13 @@ const handleChangeCourse = () => {
type="textarea" type="textarea"
/> />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item prop="files">
<div> <AppUpload v-model="form.files" accept="image/*,video/*" :beforeUploadFiles="beforeUploadFiles">
<div class="upload-video"> <el-button size="default">上传图片/视频附件</el-button>
<div class="upload-box"> <template #tip
<AppUpload >支持最多上传10张图片,格式支持jpg,jpeg,png,2MB以内<br />视频最多上传1个,100Mb以内
accept=".mp4,.png,.jpeg,.jpg" </template>
:multiple="true" </AppUpload>
:limit="11"
v-model="form.files"
:isPost="'1'"
></AppUpload>
</div>
</div>
<div class="tips">
支持最多上传10张图片,格式支持jpg,jpeg,png,2MB以内 <br />视频最多长传1个,100Mb以内
</div>
</div>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
...@@ -278,7 +300,7 @@ const handleChangeCourse = () => { ...@@ -278,7 +300,7 @@ const handleChangeCourse = () => {
<template #footer> <template #footer>
<span> <span>
<el-button @click="handleCancel">取消</el-button> <el-button @click="handleCancel">取消</el-button>
<el-button type="primary" @click="handleConfirm(ruleFormRef)">确认</el-button> <el-button type="primary" @click="handleConfirm(ruleFormRef)" :loading="loading">确认</el-button>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
......
...@@ -166,18 +166,13 @@ const handleDelFloor = (val: any) => { ...@@ -166,18 +166,13 @@ const handleDelFloor = (val: any) => {
alt="" alt=""
class="top_img" class="top_img"
/> />
<!-- <div
class="top_name" <div class="top_name" v-if="item.floor_id !== item.reply_id">
v-html="
item.from_name !== item.to_name
? `${item.from_name} &nbsp;回复 &nbsp; ${item.to_name} `
: `${item.to_name}`
"
></div> -->
<div class="top_name" v-if="item.from_name !== item.to_name">
{{ item.from_name }}&nbsp;回复 &nbsp;<span style="color: #3571e0">{{ item.to_name }}</span> {{ item.from_name }}&nbsp;回复 &nbsp;<span style="color: #3571e0">{{ item.to_name }}</span>
</div> </div>
<div class="top_name" v-else>{{ item.to_name }}</div> <div class="top_name" v-if="item.floor_id === item.reply_id">
{{ item.from_name }}
</div>
</div> </div>
<div class="list_con" v-html="item.content"></div> <div class="list_con" v-html="item.content"></div>
<div class="list_bottom"> <div class="list_bottom">
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论