This commit is contained in:
skyselang 2024-02-26 16:25:37 +08:00
parent e0fa309c94
commit 1e88ad422d
11 changed files with 377 additions and 404 deletions

View File

@ -23,6 +23,9 @@
"dependencies": {
"@vitejs/plugin-vue": "^4.6.2",
"@vueuse/core": "^10.7.2",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "5.1.10",
"@wangeditor/plugin-upload-attachment": "^1.1.0",
"axios": "^1.6.7",
"clipboardy": "^4.0.0",
"crypto-js": "^4.2.0",
@ -38,7 +41,6 @@
"vue": "^3.4.19",
"vue-i18n": "^9.9.1",
"vue-router": "^4.2.5",
"wangeditor": "^4.7.15",
"xlsx": "^0.18.5"
},
"devDependencies": {

View File

@ -7,9 +7,15 @@
<script setup>
import { useAppStore } from '@/store/modules/app'
import { useSettingsStore } from '@/store/modules/settings'
import { Boot } from '@wangeditor/editor'
import attachmentModule from '@wangeditor/plugin-upload-attachment'
const appStore = useAppStore()
const settingsStore = useSettingsStore()
// wangEditor
Boot.registerModule(attachmentModule)
onMounted(() => {
settingsStore.changeSetting({ key: 'layout', value: settingsStore.layout })
settingsStore.changeSetting({ key: 'theme', value: settingsStore.theme })

View File

@ -1,7 +1,23 @@
<template>
<div>
<div class="editor-wrapper">
<!-- 工具栏 -->
<el-affix target=".editor-wrapper" :offset="150">
<Toolbar
id="toolbar-container"
:editor="editorRef"
:default-config="toolbarConfig"
:mode="mode"
/>
</el-affix>
<!-- 编辑器 -->
<div :id="editorId"></div>
<Editor
id="editor-container"
v-model="modelValue"
:default-config="editorConfig"
:mode="mode"
@on-change="handleChange"
@on-created="handleCreated"
/>
<!-- 文件管理 -->
<el-dialog
v-model="fileDialog"
@ -17,248 +33,116 @@
</div>
</template>
<script>
import E from 'wangeditor'
import { randomString } from '@/utils'
<script setup>
import { useAppStore } from '@/store/modules/app'
import { i18nChangeLanguage } from '@wangeditor/editor'
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
import FileManage from '@/components/FileManage/index.vue'
export default {
name: 'RichEditor',
components: { FileManage },
model: {
prop: 'content',
event: 'change'
},
props: {
id: { type: String, default: 'wangeditor' + randomString() },
content: { type: String, default: '' },
excludeMenus: {
type: Array,
default() {
return ['image', 'video']
const props = defineProps({
modelValue: {
type: [String],
default: ''
}
})
const appStore = useAppStore()
const emit = defineEmits(['update:modelValue'])
// - 'en' 'zh-CN'
i18nChangeLanguage(appStore.language == 'zh-cn' ? 'zh-CN' : 'en')
const modelValue = useVModel(props, 'modelValue', emit)
// shallowRef
const editorRef = shallowRef()
//
const mode = ref('default')
//
const toolbarConfig = ref({
insertKeys: {
index: 24, //
keys: ['uploadAttachment'] //
}
})
//
const editorConfig = ref({
placeholder: '请输入内容...',
MENU_CONF: {
uploadImage: {
//
customBrowseAndUpload() {
fileDialog.value = true
fileType.value = 'image'
}
},
zIndex: { type: Number, default: 5000 },
height: { type: Number, default: 500 },
focus: { type: Boolean, default: false },
placeholder: { type: String, default: '请输入内容' }
},
data() {
return {
name: '富文本编辑器',
editor: null,
editorId: this.id,
editorContent: this.content,
editorContentNew: '',
fileDialog: false,
fileTitle: '文件管理',
fileType: 'image'
}
},
watch: {
content(value) {
if (value !== this.editor.txt.html()) {
this.editor.txt.html(this.content)
}
}
},
mounted() {
this.editorCreate()
},
unmounted() {
this.editorDestroy()
},
methods: {
//
editorCreate() {
const that = this
//
const { BtnMenu } = E
class upimage extends BtnMenu {
constructor(editor) {
const $elem = E.$(
`<div class="w-e-menu" data-title="上传图片"><el-button>图片</el-button></div>`
)
super($elem, editor)
}
clickHandler() {
that.fileType = 'image'
that.fileTitle = '上传图片'
that.fileDialog = true
}
tryChangeActive() {}
}
class upvideo extends BtnMenu {
constructor(editor) {
const $elem = E.$(
`<div class="w-e-menu" data-title="上传视频"><el-button>视频</el-button></div>`
)
super($elem, editor)
}
clickHandler() {
that.fileType = 'video'
that.fileTitle = '上传视频'
that.fileDialog = true
}
tryChangeActive() {}
}
class upaudio extends BtnMenu {
constructor(editor) {
const $elem = E.$(
`<div class="w-e-menu" data-title="上传音频"><el-button>音频</el-button></div>`
)
super($elem, editor)
}
clickHandler() {
that.fileType = 'audio'
that.fileTitle = '上传音频'
that.fileDialog = true
}
tryChangeActive() {}
}
class upword extends BtnMenu {
constructor(editor) {
const $elem = E.$(
`<div class="w-e-menu" data-title="上传文档"><el-button>文档</el-button></div>`
)
super($elem, editor)
}
clickHandler() {
that.fileType = 'word'
that.fileTitle = '上传文档'
that.fileDialog = true
}
tryChangeActive() {}
}
class upother extends BtnMenu {
constructor(editor) {
const $elem = E.$(
`<div class="w-e-menu" data-title="上传附件"><el-button>附件</el-button></div>`
)
super($elem, editor)
}
clickHandler() {
that.fileType = 'other'
that.fileTitle = '上传附件'
that.fileDialog = true
}
tryChangeActive() {}
}
class clear extends BtnMenu {
constructor(editor) {
const $elem = E.$(
`<div class="w-e-menu" data-title="清空内容"><el-button>清空</el-button></div>`
)
super($elem, editor)
}
clickHandler() {
that.editor.txt.clear()
}
tryChangeActive() {}
}
//
that.editor = new E('#' + that.editorId)
that.editor.config.excludeMenus = that.excludeMenus
that.editor.menus.extend('upimageKey', upimage)
that.editor.config.menus = that.editor.config.menus.concat('upimageKey')
that.editor.menus.extend('upvideoKey', upvideo)
that.editor.config.menus = that.editor.config.menus.concat('upvideoKey')
that.editor.menus.extend('upaudioKey', upaudio)
that.editor.config.menus = that.editor.config.menus.concat('upaudioKey')
that.editor.menus.extend('upwordKey', upword)
that.editor.config.menus = that.editor.config.menus.concat('upwordKey')
that.editor.menus.extend('upotherKey', upother)
that.editor.config.menus = that.editor.config.menus.concat('upotherKey')
that.editor.menus.extend('clearKey', clear)
that.editor.config.menus = that.editor.config.menus.concat('clearKey')
that.editor.config.zIndex = that.zIndex
that.editor.config.height = that.height
that.editor.config.focus = that.focus
that.editor.config.placeholder = that.placeholder
that.editor.config.onchange = (newHtml) => {
that.editorContentNew = newHtml
this.$emit('change', that.editorContentNew)
}
console.log(that.editor.textElemId)
console.log(that.editor.toolbarElemId)
that.editor.create()
that.editor.txt.clear()
that.editor.txt.html(that.editorContent)
},
//
editorDestroy() {
this.editorContent = ''
this.editorContentNew = ''
if (this.editor) {
this.editor.txt.html('')
this.editor.destroy()
this.editor = null
uploadVideo: {
//
customBrowseAndUpload() {
fileDialog.value = true
fileType.value = 'video'
}
},
//
fileCancel() {
this.fileDialog = false
},
fileSubmit(filelist, filetype) {
this.fileDialog = false
this.fileTitle = ''
const fileLength = filelist.length
if (fileLength) {
for (let i = 0; i < fileLength; i++) {
if (filetype === 'image') {
this.editor.cmd.do(
'insertHTML',
`<img file-id="${filelist[i]['file_id']}" src="${filelist[i]['file_url']}" style="max-width:50%;"/>`
)
} else if (filetype === 'video') {
this.editor.cmd.do(
'insertHTML',
`<video width="50%" height="50%" controls>
<source file-id="${filelist[i]['file_id']}" src="${filelist[i]['file_url']}" type="video/mp4">
<object file-id="${filelist[i]['file_id']}" data="${filelist[i]['file_url']}" width="50%" height="50%">
<embed file-id="${filelist[i]['file_id']}" src="${filelist[i]['file_url']}" width="50%" height="50%">
</object>
</video>`
)
} else if (filetype === 'audio') {
this.editor.cmd.do(
'insertHTML',
`<audio width="50%" height="50%" controls>
<source file-id="${filelist[i]['file_id']}" src="${filelist[i]['file_url']}" type="audio/mp3">
<embed file-id="${filelist[i]['file_id']}" src="${filelist[i]['file_url']}" width="50%" height="50%">
</audio>`
)
} else {
this.editor.cmd.do(
'insertHTML',
`<a file-id="${filelist[i]['file_id']}" href="${filelist[i]['file_url']}" download="${filelist[i]['file_url']}" target="_blank">${filelist[i]['file_name']}.${filelist[i]['file_ext']}</a>`
)
}
}
uploadAttachment: {
//
customBrowseAndUpload() {
fileDialog.value = true
fileType.value = 'word'
}
}
}
})
const handleCreated = (editor) => {
// editor
editorRef.value = editor
}
function handleChange(editor) {
modelValue.value = editor.getHtml()
}
//
const fileDialog = ref(false)
const fileTitle = ref('文件管理')
const fileType = ref('image')
function fileCancel() {
fileDialog.value = false
}
function fileSubmit(files) {
fileDialog.value = false
var htmls = ''
const length = files.length
for (let i = 0; i < length; i++) {
if (files[i]['file_type'] === 'image') {
htmls += `<img file-id="${files[i]['file_id']}" src="${files[i]['file_url']}" style="width:640px;"/>`
} else if (files[i]['file_type'] === 'video') {
htmls += `<div data-w-e-type="video" data-w-e-is-void><video width="640" height="480" controls>
<source file-id="${files[i]['file_id']}" src="${files[i]['file_url']}" type="video/mp4">
<object file-id="${files[i]['file_id']}" data="${files[i]['file_url']}">
<embed file-id="${files[i]['file_id']}" src="${files[i]['file_url']}" width="640" height="480">
</object>
</video></div>`
} else if (files[i]['file_type'] === 'audio') {
htmls += `<div data-w-e-type="audio" data-w-e-is-void data-w-e-is-inline><audio controls>
<source file-id="${files[i]['file_id']}" src="${files[i]['file_url']}" type="audio/mp3">
<embed file-id="${files[i]['file_id']}" src="${files[i]['file_url']}">
</audio></div>`
} else {
htmls += `<div data-w-e-type="attachment" data-w-e-is-void data-w-e-is-inline><a file-id="${files[i]['file_id']}" href="${files[i]['file_url']}" download="${files[i]['file_url']}" target="_blank">${files[i]['file_name']}.${files[i]['file_ext']}</a></div>`
}
}
const editor = editorRef.value
editor.dangerouslyInsertHtml(htmls)
}
//
onBeforeUnmount(() => {
const editor = editorRef.value
if (editor == null) return
editor.destroy()
})
</script>
<style lang="scss">
.w-e-toolbar {
border: 1px solid var(--el-border-color) !important;
background-color: var(--el-bg-color) !important;
border-bottom: 0 !important;
}
.w-e-text-container {
border: 1px solid var(--el-border-color) !important;
background-color: var(--el-bg-color) !important;
<style src="@wangeditor/editor/dist/css/style.css"></style>
<style>
.editor-wrapper {
border: 1px solid #cfd3dc;
}
</style>

View File

@ -9,14 +9,14 @@ const defaultSettings = {
sidebarName: true,
fixedHeader: true,
tagsView: true,
layout: 'left',
theme: 'light',
themeColor: '#409EFF',
layout: 'left', // 导航模式left、top、mix
theme: 'light', // 主题light明亮dark暗黑
themeColor: '#409EFF', // 主题颜色
tokenType: 'header', // token方式header、param
tokenName: 'AdminToken', // token名称前后端必须一致
pageLimit: 20, // 分页每页默认数量
size: 'default',
language: 'zh-cn'
size: 'default', // 组件大小large、default、small
language: 'zh-cn' //语言zh-cn中文en英文
}
export default defaultSettings

View File

@ -9,6 +9,12 @@ html.dark {
--subMenuHover: rgb(0 0 0 / 20%);
--subMenuActiveText: var(--el-menu-active-color);
// wangEditor
--w-e-textarea-bg-color: var(--el-bg-color-overlay);
--w-e-toolbar-bg-color: var(--el-bg-color-overlay);
--w-e-modal-button-bg-color: var(--el-bg-color-overlay);
--w-e-toolbar-border-color: var(--el-button-border-color);
.navbar {
background-color: var(--el-bg-color);
.setting-container .setting-item:hover {

View File

@ -359,7 +359,7 @@
<el-tab-pane label="内容">
<el-scrollbar native :height="height - 80">
<el-form-item label="内容" prop="content">
<RichEditor :content="model.content" />
<RichEditor v-model="model.content" />
</el-form-item>
</el-scrollbar>
</el-tab-pane>

View File

@ -332,7 +332,8 @@
</el-input>
</el-col>
<el-col class="line" :span="13">
官方域名 [ 百度云 > 对象存储 > 发布管理 ] 获取yyladmin.gz.bcebos.com
官方域名 [ 百度云 > 对象存储 > Bucket列表 > 发布管理 ]
获取yyladmin.gz.bcebos.com
</el-col>
</el-form-item>
<el-form-item label="所属地域" prop="baidu_endpoint">
@ -502,7 +503,12 @@
<el-col :span="11">
<el-input v-model="model.image_ext" clearable />
</el-col>
<el-col class="line" :span="13"> 允许上传的图片后缀逗号,隔开 </el-col>
<el-col class="line" :span="13">
<el-tooltip :content="model.image_exts">
<svg-icon icon-class="question-filled" />
</el-tooltip>
允许上传的图片后缀逗号,隔开
</el-col>
</el-form-item>
<el-form-item label="图片大小" prop="image_size">
<el-col :span="11">
@ -517,7 +523,12 @@
<el-col :span="11">
<el-input v-model="model.video_ext" clearable />
</el-col>
<el-col class="line" :span="13"> 允许上传的视频后缀逗号,隔开 </el-col>
<el-col class="line" :span="13">
<el-tooltip :content="model.video_exts">
<svg-icon icon-class="question-filled" />
</el-tooltip>
允许上传的视频后缀逗号,隔开
</el-col>
</el-form-item>
<el-form-item label="视频大小" prop="video_size">
<el-col :span="11">
@ -532,7 +543,12 @@
<el-col :span="11">
<el-input v-model="model.audio_ext" clearable />
</el-col>
<el-col class="line" :span="13"> 允许上传的音频后缀逗号,隔开 </el-col>
<el-col class="line" :span="13">
<el-tooltip :content="model.audio_exts">
<svg-icon icon-class="question-filled" />
</el-tooltip>
允许上传的音频后缀逗号,隔开
</el-col>
</el-form-item>
<el-form-item label="音频大小" prop="audio_size">
<el-col :span="11">
@ -547,7 +563,12 @@
<el-col :span="11">
<el-input v-model="model.word_ext" clearable />
</el-col>
<el-col class="line" :span="13"> 允许上传的文档后缀逗号,隔开 </el-col>
<el-col class="line" :span="13">
<el-tooltip :content="model.word_exts">
<svg-icon icon-class="question-filled" />
</el-tooltip>
允许上传的文档后缀逗号,隔开
</el-col>
</el-form-item>
<el-form-item label="文档大小" prop="word_size">
<el-col :span="11">
@ -562,7 +583,12 @@
<el-col :span="11">
<el-input v-model="model.other_ext" clearable />
</el-col>
<el-col class="line" :span="13"> 允许上传的其它文件后缀逗号,隔开 </el-col>
<el-col class="line" :span="13">
<el-tooltip :content="model.other_exts">
<svg-icon icon-class="question-filled" />
</el-tooltip>
允许上传的其它文件后缀逗号,隔开
</el-col>
</el-form-item>
<el-form-item label="其它大小" prop="other_size">
<el-col :span="11">
@ -640,14 +666,19 @@ export default {
aws_region: '',
aws_domain: '',
image_ext: '',
image_exts: '',
image_size: 0,
video_ext: '',
video_exts: '',
video_size: 0,
audio_ext: '',
audio_exts: '',
audio_size: 0,
word_ext: '',
word_exts: '',
word_size: 0,
other_ext: '',
other_exts: '',
other_size: 0
},
rules: {

View File

@ -149,49 +149,57 @@
top="5vh"
destroy-on-close
>
<el-scrollbar native :height="height - 30">
<el-form ref="ref" :rules="rules" :model="model" label-width="100px">
<el-form-item label="标识" prop="unique">
<el-input v-model="model.unique" placeholder="请输入标识(唯一)" clearable>
<template #append>
<el-button title="复制" @click="copy(model.unique)">
<svg-icon icon-class="copy-document" />
</el-button>
</template>
</el-input>
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input v-model="model.name" placeholder="请输入名称" clearable>
<template #append>
<el-button title="复制" @click="copy(model.name)">
<svg-icon icon-class="copy-document" />
</el-button>
</template>
</el-input>
</el-form-item>
<el-form-item label="描述" prop="desc">
<el-input v-model="model.desc" type="textarea" autosize placeholder="请输入描述" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="model.remark" placeholder="请输入备注" clearable />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="model.sort" type="number" />
</el-form-item>
<el-form-item label="内容" prop="content">
<RichEditor :content="model.content" />
</el-form-item>
<el-form-item v-if="model[idkey]" label="添加时间" prop="create_time">
<el-input v-model="model.create_time" disabled />
</el-form-item>
<el-form-item v-if="model[idkey]" label="修改时间" prop="update_time">
<el-input v-model="model.update_time" disabled />
</el-form-item>
<el-form-item v-if="model.delete_time" label="删除时间" prop="delete_time">
<el-input v-model="model.delete_time" disabled />
</el-form-item>
</el-form>
</el-scrollbar>
<el-form ref="ref" :rules="rules" :model="model" label-width="100px">
<el-tabs>
<el-tab-pane label="信息">
<el-scrollbar native :height="height - 80">
<el-form-item label="标识" prop="unique">
<el-input v-model="model.unique" placeholder="请输入标识(唯一)" clearable>
<template #append>
<el-button title="复制" @click="copy(model.unique)">
<svg-icon icon-class="copy-document" />
</el-button>
</template>
</el-input>
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input v-model="model.name" placeholder="请输入名称" clearable>
<template #append>
<el-button title="复制" @click="copy(model.name)">
<svg-icon icon-class="copy-document" />
</el-button>
</template>
</el-input>
</el-form-item>
<el-form-item label="描述" prop="desc">
<el-input v-model="model.desc" type="textarea" autosize placeholder="请输入描述" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="model.remark" placeholder="请输入备注" clearable />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="model.sort" type="number" />
</el-form-item>
<el-form-item v-if="model[idkey]" label="添加时间" prop="create_time">
<el-input v-model="model.create_time" disabled />
</el-form-item>
<el-form-item v-if="model[idkey]" label="修改时间" prop="update_time">
<el-input v-model="model.update_time" disabled />
</el-form-item>
<el-form-item v-if="model.delete_time" label="删除时间" prop="delete_time">
<el-input v-model="model.delete_time" disabled />
</el-form-item>
</el-scrollbar>
</el-tab-pane>
<el-tab-pane label="内容">
<el-scrollbar native :height="height - 80">
<el-form-item label="内容" prop="content">
<RichEditor v-model="model.content" />
</el-form-item>
</el-scrollbar>
</el-tab-pane>
</el-tabs>
</el-form>
<template #footer>
<el-button :loading="loading" @click="cancel">取消</el-button>
<el-button :loading="loading" type="primary" @click="submit">提交</el-button>
@ -316,6 +324,8 @@ export default {
this.loading = false
})
}
} else {
ElMessage.error('请完善必填项(带红色星号*')
}
})
},

View File

@ -177,66 +177,84 @@
:before-close="cancel"
top="5vh"
>
<el-scrollbar native :height="height - 30">
<el-form ref="ref" :model="model" :rules="rules" label-width="100px">
<el-form-item label="图片" prop="image_id">
<FileImage v-model="model.image_id" :file-url="model.image_url" :height="100" upload />
</el-form-item>
<el-form-item label="类型" prop="type">
<el-select v-model="model.type">
<el-option v-for="(item, index) in types" :key="index" :value="index" :label="item" />
</el-select>
</el-form-item>
<el-form-item label="标题" prop="title">
<el-col :span="18">
<el-input v-model="model.title" placeholder="请输入标题" clearable />
</el-col>
<el-col :span="3" class="text-center">标题颜色</el-col>
<el-col :span="3">
<el-color-picker v-model="model.title_color" />
</el-col>
</el-form-item>
<el-form-item label="描述" prop="desc">
<el-input v-model="model.desc" type="textarea" autosize placeholder="请输入描述" />
</el-form-item>
<el-form-item label="开始时间" prop="start_time">
<el-date-picker
v-model="model.start_time"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="开始时间"
:default-time="new Date(2024, 1, 1, 0, 0, 0)"
/>
</el-form-item>
<el-form-item label="结束时间" prop="end_time">
<el-date-picker
v-model="model.end_time"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="结束时间"
:default-time="new Date(2024, 1, 1, 23, 59, 59)"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="model.remark" placeholder="请输入备注" clearable />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="model.sort" type="number" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="内容" prop="content">
<RichEditor :content="model.content" />
</el-form-item>
<el-form-item v-if="model[idkey]" label="添加时间" prop="create_time">
<el-input v-model="model.create_time" disabled />
</el-form-item>
<el-form-item v-if="model[idkey]" label="修改时间" prop="update_time">
<el-input v-model="model.update_time" disabled />
</el-form-item>
<el-form-item v-if="model.delete_time" label="删除时间" prop="delete_time">
<el-input v-model="model.delete_time" disabled />
</el-form-item>
</el-form>
</el-scrollbar>
<el-form ref="ref" :model="model" :rules="rules" label-width="100px">
<el-tabs>
<el-tab-pane label="信息">
<el-scrollbar native :height="height - 80">
<el-form-item label="图片" prop="image_id">
<FileImage
v-model="model.image_id"
:file-url="model.image_url"
:height="100"
upload
/>
</el-form-item>
<el-form-item label="类型" prop="type">
<el-select v-model="model.type">
<el-option
v-for="(item, index) in types"
:key="index"
:value="index"
:label="item"
/>
</el-select>
</el-form-item>
<el-form-item label="标题" prop="title">
<el-col :span="18">
<el-input v-model="model.title" placeholder="请输入标题" clearable />
</el-col>
<el-col :span="3" class="text-center">标题颜色</el-col>
<el-col :span="3">
<el-color-picker v-model="model.title_color" />
</el-col>
</el-form-item>
<el-form-item label="描述" prop="desc">
<el-input v-model="model.desc" type="textarea" autosize placeholder="请输入描述" />
</el-form-item>
<el-form-item label="开始时间" prop="start_time">
<el-date-picker
v-model="model.start_time"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="开始时间"
:default-time="new Date(2024, 1, 1, 0, 0, 0)"
/>
</el-form-item>
<el-form-item label="结束时间" prop="end_time">
<el-date-picker
v-model="model.end_time"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="结束时间"
:default-time="new Date(2024, 1, 1, 23, 59, 59)"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="model.remark" placeholder="请输入备注" clearable />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="model.sort" type="number" placeholder="请输入排序" />
</el-form-item>
<el-form-item v-if="model[idkey]" label="添加时间" prop="create_time">
<el-input v-model="model.create_time" disabled />
</el-form-item>
<el-form-item v-if="model[idkey]" label="修改时间" prop="update_time">
<el-input v-model="model.update_time" disabled />
</el-form-item>
<el-form-item v-if="model.delete_time" label="删除时间" prop="delete_time">
<el-input v-model="model.delete_time" disabled />
</el-form-item>
</el-scrollbar>
</el-tab-pane>
<el-tab-pane label="内容">
<el-scrollbar native :height="height - 80">
<el-form-item label="内容" prop="content">
<RichEditor v-model="model.content" />
</el-form-item>
</el-scrollbar>
</el-tab-pane>
</el-tabs>
</el-form>
<template #footer>
<el-button :loading="loading" @click="cancel">取消</el-button>
<el-button :loading="loading" type="primary" @click="submit">提交</el-button>

View File

@ -162,61 +162,74 @@
:before-close="cancel"
top="5vh"
>
<el-scrollbar native :height="height - 30">
<el-form ref="ref" :model="model" :rules="rules" label-width="100px">
<el-form-item label="图片" prop="image_id">
<FileImage v-model="model.image_id" :file-url="model.image_url" :height="100" upload />
</el-form-item>
<el-form-item label="标题" prop="title">
<el-col :span="18">
<el-input v-model="model.title" placeholder="请输入标题" clearable />
</el-col>
<el-col :span="3" style="text-align: center">标题颜色</el-col>
<el-col :span="3">
<el-color-picker v-model="model.title_color" />
</el-col>
</el-form-item>
<el-form-item label="简介" prop="desc">
<el-input v-model="model.desc" type="textarea" autosize placeholder="请输入简介" />
</el-form-item>
<el-form-item label="开始时间" prop="start_time">
<el-date-picker
v-model="model.start_time"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
:default-time="new Date(2024, 1, 1, 0, 0, 0)"
placeholder="开始时间"
/>
</el-form-item>
<el-form-item label="结束时间" prop="end_time">
<el-date-picker
v-model="model.end_time"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
:default-time="new Date(2024, 1, 1, 23, 59, 59)"
placeholder="结束时间"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="model.remark" placeholder="请输入备注" clearable />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="model.sort" type="number" />
</el-form-item>
<el-form-item label="内容" prop="content">
<RichEditor :content="model.content" />
</el-form-item>
<el-form-item v-if="model[idkey]" label="添加时间" prop="create_time">
<el-input v-model="model.create_time" disabled />
</el-form-item>
<el-form-item v-if="model[idkey]" label="修改时间" prop="update_time">
<el-input v-model="model.update_time" disabled />
</el-form-item>
<el-form-item v-if="model.delete_time" label="删除时间" prop="delete_time">
<el-input v-model="model.delete_time" disabled />
</el-form-item>
</el-form>
</el-scrollbar>
<el-form ref="ref" :model="model" :rules="rules" label-width="100px">
<el-tabs>
<el-tab-pane label="信息">
<el-scrollbar native :height="height - 80">
<el-form-item label="图片" prop="image_id">
<FileImage
v-model="model.image_id"
:file-url="model.image_url"
:height="100"
upload
/>
</el-form-item>
<el-form-item label="标题" prop="title">
<el-col :span="18">
<el-input v-model="model.title" placeholder="请输入标题" clearable />
</el-col>
<el-col :span="3" style="text-align: center">标题颜色</el-col>
<el-col :span="3">
<el-color-picker v-model="model.title_color" />
</el-col>
</el-form-item>
<el-form-item label="简介" prop="desc">
<el-input v-model="model.desc" type="textarea" autosize placeholder="请输入简介" />
</el-form-item>
<el-form-item label="开始时间" prop="start_time">
<el-date-picker
v-model="model.start_time"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
:default-time="new Date(2024, 1, 1, 0, 0, 0)"
placeholder="开始时间"
/>
</el-form-item>
<el-form-item label="结束时间" prop="end_time">
<el-date-picker
v-model="model.end_time"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
:default-time="new Date(2024, 1, 1, 23, 59, 59)"
placeholder="结束时间"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="model.remark" placeholder="请输入备注" clearable />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="model.sort" type="number" />
</el-form-item>
<el-form-item v-if="model[idkey]" label="添加时间" prop="create_time">
<el-input v-model="model.create_time" disabled />
</el-form-item>
<el-form-item v-if="model[idkey]" label="修改时间" prop="update_time">
<el-input v-model="model.update_time" disabled />
</el-form-item>
<el-form-item v-if="model.delete_time" label="删除时间" prop="delete_time">
<el-input v-model="model.delete_time" disabled />
</el-form-item>
</el-scrollbar>
</el-tab-pane>
<el-tab-pane label="内容">
<el-scrollbar native :height="height - 80">
<el-form-item label="内容" prop="content">
<RichEditor v-model="model.content" />
</el-form-item>
</el-scrollbar>
</el-tab-pane>
</el-tabs>
</el-form>
<template #footer>
<el-button :loading="loading" @click="cancel">取消</el-button>
<el-button :loading="loading" type="primary" @click="submit">提交</el-button>
@ -348,6 +361,8 @@ export default {
this.loading = false
})
}
} else {
ElMessage.error('请完善必填项(带红色星号*')
}
})
},

View File

@ -84,6 +84,7 @@ export default defineConfig(({ mode }) => {
'echarts/charts',
'echarts/components',
'echarts/renderers',
'element-plus/es/components/affix/style/css',
'element-plus/es/components/alert/style/css',
'element-plus/es/components/avatar/style/css',
'element-plus/es/components/breadcrumb-item/style/css',