2025-10-14
项目简介富文本图片/视频上传
This commit is contained in:
52
src/assets/wangeditor.css
Normal file
52
src/assets/wangeditor.css
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
.editor-content-view {
|
||||||
|
border: 3px solid #ccc;
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 0 10px;
|
||||||
|
margin-top: 20px;
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-content-view p,
|
||||||
|
.editor-content-view li {
|
||||||
|
white-space: pre-wrap; /* 保留空格 */
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-content-view blockquote {
|
||||||
|
border-left: 8px solid #d0e5f2;
|
||||||
|
padding: 10px 10px;
|
||||||
|
margin: 10px 0;
|
||||||
|
background-color: #f1f1f1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-content-view code {
|
||||||
|
font-family: monospace;
|
||||||
|
background-color: #eee;
|
||||||
|
padding: 3px;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
.editor-content-view pre>code {
|
||||||
|
display: block;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-content-view table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
.editor-content-view td,
|
||||||
|
.editor-content-view th {
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
min-width: 50px;
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
.editor-content-view th {
|
||||||
|
background-color: #f1f1f1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-content-view ul,
|
||||||
|
.editor-content-view ol {
|
||||||
|
padding-left: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-content-view input[type="checkbox"] {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
@@ -52,7 +52,7 @@ const mode = 'default' // 或 'simple'
|
|||||||
// 工具栏配置
|
// 工具栏配置
|
||||||
const toolbarConfig = {
|
const toolbarConfig = {
|
||||||
excludeKeys: [
|
excludeKeys: [
|
||||||
'group-video', // 排除视频
|
// 'group-video', // 排除视频
|
||||||
'fullScreen' // 排除全屏
|
'fullScreen' // 排除全屏
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -63,26 +63,47 @@ const editorConfig = {
|
|||||||
MENU_CONF: {
|
MENU_CONF: {
|
||||||
// 配置上传图片
|
// 配置上传图片
|
||||||
uploadImage: {
|
uploadImage: {
|
||||||
server: '/api/upload/image',
|
server: '/mid/upload/image',
|
||||||
fieldName: 'file',
|
fieldName: 'file',
|
||||||
meta: {
|
meta: {
|
||||||
token: localStorage.getItem('token') || ''
|
token: localStorage.getItem('token') || ''
|
||||||
},
|
},
|
||||||
metaWithUrl: false,
|
metaWithUrl: false,
|
||||||
headers: {
|
headers: {
|
||||||
'Authorization': `Bearer ${localStorage.getItem('token') || ''}`
|
'Authorization': `Bearer ${localStorage.getItem('admin_token') || ''}`
|
||||||
},
|
},
|
||||||
maxFileSize: 5 * 1024 * 1024, // 5M
|
maxFileSize: 5 * 1024 * 1024, // 5M
|
||||||
allowedFileTypes: ['image/*'],
|
allowedFileTypes: ['image/*'],
|
||||||
customInsert(res, insertFn) {
|
customInsert(res, insertFn) {
|
||||||
// 自定义插入图片
|
// 自定义插入图片
|
||||||
if (res.code === 200) {
|
if (res.success) {
|
||||||
insertFn(res.data.url, res.data.alt || '', res.data.url)
|
insertFn(res.data.url, res.data.alt || '', res.data.url)
|
||||||
} else {
|
} else {
|
||||||
console.error('图片上传失败:', res.message)
|
console.error('图片上传失败:', res.message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
uploadVideo: {
|
||||||
|
server: '/mid/upload',
|
||||||
|
fieldName: 'file',
|
||||||
|
meta: {
|
||||||
|
token: localStorage.getItem('token') || ''
|
||||||
|
},
|
||||||
|
metaWithUrl: false,
|
||||||
|
headers: {
|
||||||
|
'Authorization': `Bearer ${localStorage.getItem('admin_token') || ''}`
|
||||||
|
},
|
||||||
|
maxFileSize: 20 * 1024 * 1024,
|
||||||
|
allowedFileTypes: ['video/*'],
|
||||||
|
customInsert(res, insertFn) {
|
||||||
|
// 自定义插入视频
|
||||||
|
if (res.success) {
|
||||||
|
insertFn(res.data.url, res.data.alt || '', res.data.url)
|
||||||
|
} else {
|
||||||
|
console.error('视频上传失败:', res.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
// 配置字体
|
// 配置字体
|
||||||
fontSize: {
|
fontSize: {
|
||||||
fontSizeList: [
|
fontSizeList: [
|
||||||
|
|||||||
@@ -87,7 +87,7 @@
|
|||||||
|
|
||||||
<!-- 数据列表 -->
|
<!-- 数据列表 -->
|
||||||
<el-card class="table-card">
|
<el-card class="table-card">
|
||||||
<el-row :gutter="10" class="mb8">
|
<el-row :gutter="10" class="mb8 mb-2">
|
||||||
<el-col :span="1.5">
|
<el-col :span="1.5">
|
||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="primary"
|
||||||
@@ -140,7 +140,11 @@
|
|||||||
<el-table-column prop="startDate" label="开始时间"/>
|
<el-table-column prop="startDate" label="开始时间"/>
|
||||||
<el-table-column prop="endDate" label="结束时间"/>
|
<el-table-column prop="endDate" label="结束时间"/>
|
||||||
<el-table-column prop="createDate" label="创建时间"/>
|
<el-table-column prop="createDate" label="创建时间"/>
|
||||||
<el-table-column prop="introduction" label="项目描述"/>
|
<el-table-column prop="introduction" label="项目描述">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button text type="primary" @click="handleDetail(scope.row)">详情</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="300">
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="300">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -166,7 +170,7 @@
|
|||||||
</el-card>
|
</el-card>
|
||||||
|
|
||||||
<!-- 表单 -->
|
<!-- 表单 -->
|
||||||
<el-dialog :title="title" v-model="open" width="800px" append-to-body>
|
<el-dialog :title="title" v-model="open" width="60%" append-to-body top="1vh">
|
||||||
<el-form ref="formRef" :model="form" :rules="rules" label-width="80px">
|
<el-form ref="formRef" :model="form" :rules="rules" label-width="80px">
|
||||||
<el-form-item label="项目名称" prop="name">
|
<el-form-item label="项目名称" prop="name">
|
||||||
<el-input v-model="form.name" placeholder="请输入项目名称"/>
|
<el-input v-model="form.name" placeholder="请输入项目名称"/>
|
||||||
@@ -196,7 +200,7 @@
|
|||||||
<!-- <el-input v-model="form.endDate" placeholder="请选择结束时间"/>-->
|
<!-- <el-input v-model="form.endDate" placeholder="请选择结束时间"/>-->
|
||||||
<!-- </el-form-item>-->
|
<!-- </el-form-item>-->
|
||||||
<el-form-item label="项目描述" prop="introduction" class="editor">
|
<el-form-item label="项目描述" prop="introduction" class="editor">
|
||||||
<RichTextEditor height="300px" />
|
<RichTextEditor v-model="form.introduction" class="w-100"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
@@ -207,10 +211,17 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
|
<!-- 详情 -->
|
||||||
|
<el-dialog :title="detailTitle" v-model="openDetail" width="50%" class="h-75 overflow-hidden overflow-scroll">
|
||||||
|
<div class="p-5 border editor-content-view">
|
||||||
|
<div v-html="detailContent"></div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup>
|
||||||
import {getCurrentInstance, reactive, ref, shallowRef, toRefs} from "vue";
|
import {getCurrentInstance, reactive, ref, shallowRef, toRefs} from "vue";
|
||||||
import {Check, Money, Wallet} from "@element-plus/icons-vue";
|
import {Check, Money, Wallet} from "@element-plus/icons-vue";
|
||||||
import {ElMessage, ElMessageBox} from "element-plus";
|
import {ElMessage, ElMessageBox} from "element-plus";
|
||||||
@@ -218,8 +229,7 @@ import {programAPI} from "@/api/program";
|
|||||||
import {useUserStore} from "@/stores/user";
|
import {useUserStore} from "@/stores/user";
|
||||||
|
|
||||||
import '@wangeditor/editor/dist/css/style.css' // 引入 css
|
import '@wangeditor/editor/dist/css/style.css' // 引入 css
|
||||||
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
|
import '@/assets/wangeditor.css'
|
||||||
import {IToolbarConfig} from "@wangeditor/editor";
|
|
||||||
import RichTextEditor from "@/components/RichTextEditor.vue";
|
import RichTextEditor from "@/components/RichTextEditor.vue";
|
||||||
|
|
||||||
const {proxy} = getCurrentInstance();
|
const {proxy} = getCurrentInstance();
|
||||||
@@ -330,9 +340,15 @@ const handleDelete = (row) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const openDetail = ref(false)
|
||||||
|
const detailTitle = ref("")
|
||||||
|
const detailContent = ref("")
|
||||||
|
|
||||||
// 查看详情
|
// 查看详情
|
||||||
const handleDetail = (row) => {
|
const handleDetail = (row) => {
|
||||||
ElMessage.info('查看详情')
|
detailTitle.value = row.name
|
||||||
|
detailContent.value = row.introduction
|
||||||
|
openDetail.value = true
|
||||||
}
|
}
|
||||||
|
|
||||||
const submitForm = () => {
|
const submitForm = () => {
|
||||||
@@ -359,9 +375,25 @@ const submitForm = () => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
const formRef = ref(null)
|
||||||
|
const reset = () => {
|
||||||
|
form.value = {
|
||||||
|
linkmanId: undefined,
|
||||||
|
startDate: undefined,
|
||||||
|
endDate: undefined,
|
||||||
|
dataRange: [],
|
||||||
|
name: undefined,
|
||||||
|
company: undefined,
|
||||||
|
address: undefined,
|
||||||
|
introduction: undefined,
|
||||||
|
paymentMethod: undefined
|
||||||
|
}
|
||||||
|
formRef.value.resetForm()
|
||||||
|
}
|
||||||
|
|
||||||
const cancel = () => {
|
const cancel = () => {
|
||||||
open.value = false
|
open.value = false
|
||||||
|
reset()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取统计
|
// 获取统计
|
||||||
|
|||||||
Reference in New Issue
Block a user