refactor: 使用Editor组件替换WxEditor

(cherry picked from commit 813e7d2776)
This commit is contained in:
dhb52 2023-04-14 14:49:19 +08:00 committed by shizhong
parent df41b6860e
commit 2a242c770f
5 changed files with 307 additions and 375 deletions

View File

@ -20,7 +20,7 @@ const props = defineProps({
editorId: propTypes.string.def('wangeEditor-1'), editorId: propTypes.string.def('wangeEditor-1'),
height: propTypes.oneOfType([Number, String]).def('500px'), height: propTypes.oneOfType([Number, String]).def('500px'),
editorConfig: { editorConfig: {
type: Object as PropType<IEditorConfig>, type: Object as PropType<Partial<IEditorConfig>>,
default: () => undefined default: () => undefined
}, },
readonly: propTypes.bool.def(false), readonly: propTypes.bool.def(false),
@ -147,6 +147,7 @@ const editorConfig = computed((): IEditorConfig => {
props.editorConfig || {} props.editorConfig || {}
) )
}) })
const editorStyle = computed(() => { const editorStyle = computed(() => {
return { return {
height: isNumber(props.height) ? `${props.height}px` : props.height height: isNumber(props.height) ? `${props.height}px` : props.height

View File

@ -1,104 +0,0 @@
<script setup>
import { ref, reactive } from 'vue'
import { getAccessToken } from '@/utils/auth'
import { Editor } from '@/components/Editor'
const BASE_URL = import.meta.env.VITE_BASE_URL
const actionUrl = BASE_URL + '/admin-api/mp/material/upload-news-image' //
const headers = { Authorization: 'Bearer ' + getAccessToken() } //
const message = useMessage()
const props = defineProps({
/* 公众号账号编号 */
accountId: {
type: Number,
required: true
},
/* 编辑器的内容 */
value: {
type: String,
default: ''
},
/* 图片大小 */
maxSize: {
type: Number,
default: 4000 // kb
}
})
const emit = defineEmits(['input'])
const myQuillEditorRef = ref()
const content = ref(props.value.replace(/data-src/g, 'src'))
const loading = ref(false) // loadingfalse,
const uploadData = reactive({
type: 'image', // TODO thumb
accountId: props.accountId
})
const onEditorChange = (text) => {
//
emit('input', text)
}
//
const beforeUpload = () => {
// loading
loading.value = true
}
//
// 访
const uploadSuccess = (res) => {
// res
//
const quill = myQuillEditorRef.value.quill
//
const link = res.data
if (link) {
//
let length = quill.getSelection().index
// res.info
quill.insertEmbed(length, 'image', link)
//
quill.setSelection(length + 1)
} else {
message.error('图片插入失败')
}
// loading
loading.value = false
}
//
const uploadError = () => {
// loading
loading.value = false
message.error('图片插入失败')
}
</script>
<template>
<div id="wxEditor">
<div v-loading="loading" element-loading-text="请稍等,图片上传中">
<!-- 图片上传组件辅助-->
<el-upload
class="avatar-uploader"
name="file"
:action="actionUrl"
:headers="headers"
:show-file-list="false"
:data="uploadData"
:on-success="uploadSuccess"
:on-error="uploadError"
:before-upload="beforeUpload"
/>
<Editor
editor-id="wxEditor"
ref="quillEditorRef"
:modelValue="content"
@change="(editor) => onEditorChange(editor.getText())"
/>
</div>
</div>
</template>

View File

@ -1,45 +0,0 @@
const toolbarOptions = [
['bold', 'italic', 'underline', 'strike'], // 加粗 斜体 下划线 删除线
['blockquote', 'code-block'], // 引用 代码块
[{ header: 1 }, { header: 2 }], // 1、2 级标题
[{ list: 'ordered' }, { list: 'bullet' }], // 有序、无序列表
[{ script: 'sub' }, { script: 'super' }], // 上标/下标
[{ indent: '-1' }, { indent: '+1' }], // 缩进
// [{'direction': 'rtl'}], // 文本方向
[{ size: ['small', false, 'large', 'huge'] }], // 字体大小
[{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题
[{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
[{ font: [] }], // 字体种类
[{ align: [] }], // 对齐方式
['clean'], // 清除文本格式
['link', 'image', 'video'] // 链接、图片、视频
]
export default {
theme: 'snow',
placeholder: '请输入文章内容',
modules: {
toolbar: {
container: toolbarOptions,
// container: "#toolbar",
handlers: {
image: function (value) {
if (value) {
// 触发input框选择图片文件
document.querySelector('.avatar-uploader input').click()
} else {
this.quill.format('image', false)
}
},
link: function (value) {
if (value) {
const href = prompt('注意!只支持公众号图文链接')
this.quill.format('link', href)
} else {
this.quill.format('link', false)
}
}
}
}
}
}

View File

@ -0,0 +1,72 @@
import { IEditorConfig } from '@wangeditor/editor'
import { getAccessToken, getTenantId } from '@/utils/auth'
const message = useMessage()
type InsertFnType = (url: string, alt: string, href: string) => void
export const createEditorConfig = (
server: string,
accountId: number | undefined
): Partial<IEditorConfig> => {
return {
MENU_CONF: {
['uploadImage']: {
server,
// 单个文件的最大体积限制,默认为 2M
maxFileSize: 5 * 1024 * 1024,
// 最多可上传几个文件,默认为 100
maxNumberOfFiles: 10,
// 选择文件时的类型限制,默认为 ['image/*'] 。如不想限制,则设置为 []
allowedFileTypes: ['image/*'],
// 自定义上传参数,例如传递验证的 token 等。参数会被添加到 formData 中,一起上传到服务端。
meta: { accountId: accountId },
// 将 meta 拼接到 url 参数中,默认 false
metaWithUrl: true,
// 自定义增加 http header
headers: {
Accept: '*',
Authorization: 'Bearer ' + getAccessToken(),
'tenant-id': getTenantId()
},
// 跨域是否传递 cookie ,默认为 false
withCredentials: true,
// 超时时间,默认为 10 秒
timeout: 5 * 1000, // 5 秒
// form-data fieldName后端接口参数名称默认值wangeditor-uploaded-image
fieldName: 'file',
// 上传之前触发
onBeforeUpload(file: File) {
console.log(file)
return file
},
// 上传进度的回调函数
onProgress(progress: number) {
// progress 是 0-100 的数字
console.log('progress', progress)
},
onSuccess(file: File, res: any) {
console.log('onSuccess', file, res)
},
onFailed(file: File, res: any) {
message.alertError(res.message)
console.log('onFailed', file, res)
},
onError(file: File, err: any, res: any) {
message.alertError(err.message)
console.error('onError', file, err, res)
},
// 自定义插入图片
customInsert(res: any, insertFn: InsertFnType) {
insertFn(res.data, 'image', res.data)
}
}
}
}
}

View File

@ -71,168 +71,182 @@
<el-dialog <el-dialog
:title="operateMaterial === 'add' ? '新建图文' : '修改图文'" :title="operateMaterial === 'add' ? '新建图文' : '修改图文'"
width="80%" width="80%"
top="20px"
v-model="dialogNewsVisible" v-model="dialogNewsVisible"
:before-close="dialogNewsClose" :before-close="dialogNewsClose"
:close-on-click-modal="false" destroy-on-close
> >
<div class="left"> <el-container>
<div class="select-item"> <el-aside width="40%">
<div v-for="(news, index) in articlesAdd" :key="news.id"> <div class="select-item">
<div <div v-for="(news, index) in articlesAdd" :key="news.id">
class="news-main father" <div
v-if="index === 0" class="news-main father"
:class="{ activeAddNews: isActiveAddNews === index }" v-if="index === 0"
@click="activeNews(index)" :class="{ activeAddNews: isActiveAddNews === index }"
> @click="activeNews(index)"
<div class="news-content"> >
<img class="material-img" v-if="news.thumbUrl" :src="news.thumbUrl" /> <div class="news-content">
<div class="news-content-title">{{ news.title }}</div> <img class="material-img" v-if="news.thumbUrl" :src="news.thumbUrl" />
</div> <div class="news-content-title">{{ news.title }}</div>
<div class="child" v-if="articlesAdd.length > 1"> </div>
<el-button size="small" @click="downNews(index)" <div class="child" v-if="articlesAdd.length > 1">
><Icon icon="ep:sort-down" />下移</el-button <el-button size="small" @click="downNews(index)"
> ><Icon icon="ep:sort-down" />下移</el-button
<el-button v-if="operateMaterial === 'add'" size="small" @click="minusNews(index)" >
><Icon icon="ep:delete" />删除 <el-button v-if="operateMaterial === 'add'" size="small" @click="minusNews(index)"
</el-button> ><Icon icon="ep:delete" />删除
</div> </el-button>
</div>
<div
class="news-main-item father"
v-if="index > 0"
:class="{ activeAddNews: isActiveAddNews === index }"
@click="activeNews(index)"
>
<div class="news-content-item">
<div class="news-content-item-title">{{ news.title }}</div>
<div class="news-content-item-img">
<img
class="material-img"
v-if="news.thumbUrl"
:src="news.thumbUrl"
height="100%"
/>
</div> </div>
</div> </div>
<div class="child"> <div
<el-button class="news-main-item father"
v-if="articlesAdd.length > index + 1" v-if="index > 0"
size="small" :class="{ activeAddNews: isActiveAddNews === index }"
@click="downNews(index)" @click="activeNews(index)"
><Icon icon="ep:sort-down" />下移 >
</el-button> <div class="news-content-item">
<el-button size="small" @click="upNews(index)" <div class="news-content-item-title">{{ news.title }}</div>
><Icon icon="ep:sort-up" />上移</el-button <div class="news-content-item-img">
> <img
<el-button class="material-img"
v-if="operateMaterial === 'add'" v-if="news.thumbUrl"
type="danger" :src="news.thumbUrl"
size="small" width="100%"
@click="minusNews(index)" />
><Icon icon="ep:delete" />删除 </div>
</el-button> </div>
<div class="child">
<el-button
v-if="articlesAdd.length > index + 1"
size="small"
@click="downNews(index)"
><Icon icon="ep:sort-down" />下移
</el-button>
<el-button size="small" @click="upNews(index)"
><Icon icon="ep:sort-up" />上移</el-button
>
<el-button
v-if="operateMaterial === 'add'"
type="danger"
size="small"
@click="minusNews(index)"
><Icon icon="ep:delete" />删除
</el-button>
</div>
</div> </div>
</div> </div>
</div> <el-row justify="center" class="ope-row">
<el-row justify="center" class="ope-row"> <el-button
<el-button type="primary"
type="primary" circle
circle @click="plusNews"
@click="plusNews" v-if="articlesAdd.length < 8 && operateMaterial === 'add'"
v-if="articlesAdd.length < 8 && operateMaterial === 'add'"
>
<Icon icon="ep:plus" />
</el-button>
</el-row>
</div>
</div>
<div class="right" v-loading="addMaterialLoading" v-if="articlesAdd.length > 0">
<br />
<br />
<br />
<br />
<!-- 标题作者原文地址 -->
<el-input v-model="articlesAdd[isActiveAddNews].title" placeholder="请输入标题(必填)" />
<el-input
v-model="articlesAdd[isActiveAddNews].author"
placeholder="请输入作者"
style="margin-top: 5px"
/>
<el-input
v-model="articlesAdd[isActiveAddNews].contentSourceUrl"
placeholder="请输入原文地址"
style="margin-top: 5px"
/>
<!-- 封面和摘要 -->
<div class="input-tt">封面和摘要</div>
<div>
<div class="thumb-div">
<img
class="material-img"
v-if="articlesAdd[isActiveAddNews].thumbUrl"
:src="articlesAdd[isActiveAddNews].thumbUrl"
:class="isActiveAddNews === 0 ? 'avatar' : 'avatar1'"
/>
<Icon
v-else
icon="ep:plus"
class="avatar-uploader-icon"
:class="isActiveAddNews === 0 ? 'avatar' : 'avatar1'"
/>
<div class="thumb-but">
<el-upload
:action="uploadUrl"
:headers="headers"
multiple
:limit="1"
:file-list="fileList"
:data="uploadData"
:before-upload="beforeThumbImageUpload"
:on-success="handleUploadSuccess"
> >
<template #trigger> <Icon icon="ep:plus" />
<el-button size="small" type="primary">本地上传</el-button> </el-button>
</template> </el-row>
<el-button
size="small"
type="primary"
@click="openMaterial"
style="margin-left: 5px"
>素材库选择</el-button
>
<template #tip>
<div class="el-upload__tip">支持 bmp/png/jpeg/jpg/gif 格式大小不超过 2M</div>
</template>
</el-upload>
</div>
<el-dialog title="选择图片" v-model="dialogImageVisible" width="80%" append-to-body>
<WxMaterialSelect
ref="materialSelectRef"
:objData="{ type: 'image', accountId: queryParams.accountId }"
@select-material="selectMaterial"
/>
</el-dialog>
</div> </div>
<el-input </el-aside>
:rows="8" <el-main>
type="textarea" <div class="" v-loading="addMaterialLoading" v-if="articlesAdd.length > 0">
v-model="articlesAdd[isActiveAddNews].digest" <!-- 标题作者原文地址 -->
placeholder="请输入摘要" <el-row :gutter="20">
class="digest" <el-input
maxlength="120" v-model="articlesAdd[isActiveAddNews].title"
style="float: right" placeholder="请输入标题(必填)"
/> />
</div> <el-input
<!--富文本编辑器组件--> v-model="articlesAdd[isActiveAddNews].author"
<el-row> placeholder="请输入作者"
<WxEditor style="margin-top: 5px"
v-model="articlesAdd[isActiveAddNews].content" />
:account-id="uploadData.accountId" <el-input
v-if="hackResetEditor" v-model="articlesAdd[isActiveAddNews].contentSourceUrl"
/> placeholder="请输入原文地址"
</el-row> style="margin-top: 5px"
</div> />
</el-row>
<!-- 封面和摘要 -->
<el-row :gutter="20">
<el-col :span="12">
<p>封面:</p>
<div class="thumb-div">
<el-image
v-if="articlesAdd[isActiveAddNews].thumbUrl"
style="width: 300px; max-height: 300px"
:src="articlesAdd[isActiveAddNews].thumbUrl"
fit="contain"
/>
<Icon
v-else
icon="ep:plus"
class="avatar-uploader-icon"
:class="isActiveAddNews === 0 ? 'avatar' : 'avatar1'"
/>
<div class="thumb-but">
<el-upload
:action="uploadUrl"
:headers="headers"
multiple
:limit="1"
:file-list="fileList"
:data="uploadData"
:before-upload="beforeThumbImageUpload"
:on-success="handleUploadSuccess"
>
<template #trigger>
<el-button size="small" type="primary">本地上传</el-button>
</template>
<el-button
size="small"
type="primary"
@click="openMaterial"
style="margin-left: 5px"
>素材库选择</el-button
>
<template #tip>
<div class="el-upload__tip"
>支持 bmp/png/jpeg/jpg/gif 格式大小不超过 2M</div
>
</template>
</el-upload>
</div>
<el-dialog
title="选择图片"
v-model="dialogImageVisible"
width="80%"
append-to-body
>
<WxMaterialSelect
ref="materialSelectRef"
:objData="{ type: 'image', accountId: queryParams.accountId }"
@select-material="selectMaterial"
/>
</el-dialog>
</div>
</el-col>
<el-col :span="12">
<p>摘要:</p>
<el-input
:rows="8"
type="textarea"
v-model="articlesAdd[isActiveAddNews].digest"
placeholder="请输入摘要"
class="digest"
maxlength="120"
/>
</el-col>
</el-row>
<!--富文本编辑器组件-->
<el-row>
<Editor
v-model="articlesAdd[isActiveAddNews].content"
:editor-config="editorConfig"
/>
</el-row>
</div>
</el-main>
</el-container>
<template #footer> <template #footer>
<el-button @click="dialogNewsVisible = false"> </el-button> <el-button @click="dialogNewsVisible = false"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button> <el-button type="primary" @click="submitForm"> </el-button>
@ -242,7 +256,7 @@
</template> </template>
<script setup lang="ts" name="MpDraft"> <script setup lang="ts" name="MpDraft">
import WxEditor from '@/views/mp/components/wx-editor/WxEditor.vue' import { Editor } from '@/components/Editor'
import WxNews from '@/views/mp/components/wx-news/main.vue' import WxNews from '@/views/mp/components/wx-news/main.vue'
import WxMaterialSelect from '@/views/mp/components/wx-material-select/main.vue' import WxMaterialSelect from '@/views/mp/components/wx-material-select/main.vue'
import WxMpSelect from '@/views/mp/components/WxMpSelect.vue' import WxMpSelect from '@/views/mp/components/WxMpSelect.vue'
@ -250,8 +264,11 @@ import { getAccessToken } from '@/utils/auth'
import * as MpDraftApi from '@/api/mp/draft' import * as MpDraftApi from '@/api/mp/draft'
import * as MpFreePublishApi from '@/api/mp/freePublish' import * as MpFreePublishApi from '@/api/mp/freePublish'
import type { UploadFiles, UploadProps, UploadRawFile } from 'element-plus' import type { UploadFiles, UploadProps, UploadRawFile } from 'element-plus'
import { createEditorConfig } from './editor-config'
// API // API
// import drafts from './mock' import drafts from './mock'
import { IEditorConfig } from '@wangeditor/editor'
const message = useMessage() // const message = useMessage() //
const loading = ref(true) // const loading = ref(true) //
@ -285,14 +302,25 @@ const uploadData: UploadData = reactive({
}) })
// ========== 稿 or ========== // ========== 稿 or ==========
interface Article {
title: string
thumbMediaId: string
author: string
digest: string
showCoverPic: string
content: string
contentSourceUrl: string
needOpenComment: string
onlyFansCanComment: string
thumbUrl: string
}
const dialogNewsVisible = ref(false) const dialogNewsVisible = ref(false)
const addMaterialLoading = ref(false) // 稿 loading const addMaterialLoading = ref(false) // 稿 loading
const articlesAdd = ref<any[]>([]) const articlesAdd = ref<Article[]>([])
const isActiveAddNews = ref(0) const isActiveAddNews = ref(0)
const dialogImageVisible = ref(false) const dialogImageVisible = ref(false)
const operateMaterial = ref<'add' | 'edit'>('add') const operateMaterial = ref<'add' | 'edit'>('add')
const articlesMediaId = ref('') const articlesMediaId = ref('')
const hackResetEditor = ref(false)
/** 侦听公众号变化 **/ /** 侦听公众号变化 **/
const onAccountChanged = (id?: number) => { const onAccountChanged = (id?: number) => {
@ -305,13 +333,16 @@ const onAccountChanged = (id?: number) => {
const setAccountId = (id?: number) => { const setAccountId = (id?: number) => {
queryParams.accountId = id queryParams.accountId = id
uploadData.accountId = id uploadData.accountId = id
editorConfig.value = createEditorConfig(uploadUrl, queryParams.accountId)
} }
const editorConfig = ref<Partial<IEditorConfig>>({})
/** 查询列表 */ /** 查询列表 */
const getList = async () => { const getList = async () => {
loading.value = true loading.value = true
try { try {
const drafts = await MpDraftApi.getDraftPage(queryParams) // const drafts = await MpDraftApi.getDraftPage(queryParams)
drafts.list.forEach((item) => { drafts.list.forEach((item) => {
const newsItem = item.content.newsItem const newsItem = item.content.newsItem
// thumbUrl picUrl wx-news // thumbUrl picUrl wx-news
@ -329,7 +360,6 @@ const getList = async () => {
// ======================== /稿 ======================== // ======================== /稿 ========================
/** 新增按钮操作 */ /** 新增按钮操作 */
const handleAdd = () => { const handleAdd = () => {
resetEditor()
reset() reset()
// //
operateMaterial.value = 'add' operateMaterial.value = 'add'
@ -338,7 +368,6 @@ const handleAdd = () => {
/** 更新按钮操作 */ /** 更新按钮操作 */
const handleUpdate = (item: any) => { const handleUpdate = (item: any) => {
resetEditor()
reset() reset()
articlesMediaId.value = item.mediaId articlesMediaId.value = item.mediaId
articlesAdd.value = JSON.parse(JSON.stringify(item.content.newsItem)) articlesAdd.value = JSON.parse(JSON.stringify(item.content.newsItem))
@ -370,7 +399,6 @@ const dialogNewsClose = async (onDone: () => {}) => {
try { try {
await message.confirm('修改内容可能还未保存,确定关闭吗?') await message.confirm('修改内容可能还未保存,确定关闭吗?')
reset() reset()
resetEditor()
onDone() onDone()
} catch {} } catch {}
} }
@ -381,14 +409,6 @@ const reset = () => {
articlesAdd.value = [buildEmptyArticle()] articlesAdd.value = [buildEmptyArticle()]
} }
// Editor
const resetEditor = () => {
hackResetEditor.value = false //
nextTick(() => {
hackResetEditor.value = true //
})
}
// //
const downNews = (index: number) => { const downNews = (index: number) => {
let temp = articlesAdd.value[index] let temp = articlesAdd.value[index]
@ -398,8 +418,8 @@ const downNews = (index: number) => {
} }
// //
const upNews = (index) => { const upNews = (index: number) => {
let temp = articlesAdd.value[index] const temp = articlesAdd.value[index]
articlesAdd.value[index] = articlesAdd.value[index - 1] articlesAdd.value[index] = articlesAdd.value[index - 1]
articlesAdd.value[index - 1] = temp articlesAdd.value[index - 1] = temp
isActiveAddNews.value = index - 1 isActiveAddNews.value = index - 1
@ -407,7 +427,6 @@ const upNews = (index) => {
// index // index
const activeNews = (index: number) => { const activeNews = (index: number) => {
resetEditor()
isActiveAddNews.value = index isActiveAddNews.value = index
} }
@ -429,7 +448,7 @@ const plusNews = () => {
} }
// article // article
const buildEmptyArticle = () => { const buildEmptyArticle = (): Article => {
return { return {
title: '', title: '',
thumbMediaId: '', thumbMediaId: '',
@ -455,8 +474,8 @@ const beforeThumbImageUpload: UploadProps['beforeUpload'] = (rawFile: UploadRawF
addMaterialLoading.value = false addMaterialLoading.value = false
return false return false
} }
const isLt = rawFile.size / 1024 / 1024 < 2
if (!isLt) { if (rawFile.size / 1024 / 1024 > 2) {
message.error('上传图片大小不能超过 2M!') message.error('上传图片大小不能超过 2M!')
addMaterialLoading.value = false addMaterialLoading.value = false
return false return false
@ -465,10 +484,10 @@ const beforeThumbImageUpload: UploadProps['beforeUpload'] = (rawFile: UploadRawF
return true return true
} }
const handleUploadSuccess: UploadProps['onSuccess'] = (response: any) => { const handleUploadSuccess: UploadProps['onSuccess'] = (res: any) => {
addMaterialLoading.value = false addMaterialLoading.value = false
if (response.code !== 0) { if (res.code !== 0) {
message.error('上传出错:' + response.msg) message.error('上传出错:' + res.msg)
return false return false
} }
@ -476,8 +495,8 @@ const handleUploadSuccess: UploadProps['onSuccess'] = (response: any) => {
fileList.value = [] fileList.value = []
// 稿 // 稿
articlesAdd.value[isActiveAddNews.value].thumbMediaId = response.data.mediaId articlesAdd.value[isActiveAddNews.value].thumbMediaId = res.data.mediaId
articlesAdd.value[isActiveAddNews.value].thumbUrl = response.data.url articlesAdd.value[isActiveAddNews.value].thumbUrl = res.data.url
} }
// or 稿 // or 稿
@ -502,7 +521,7 @@ const handlePublish = async (item: any) => {
await message.confirm(content) await message.confirm(content)
await MpFreePublishApi.submitFreePublish(accountId, mediaId) await MpFreePublishApi.submitFreePublish(accountId, mediaId)
message.notifySuccess('发布成功') message.notifySuccess('发布成功')
getList() await getList()
} catch {} } catch {}
} }
@ -514,7 +533,7 @@ const handleDelete = async (item: any) => {
await message.confirm('此操作将永久删除该草稿, 是否继续?') await message.confirm('此操作将永久删除该草稿, 是否继续?')
await MpDraftApi.deleteDraft(accountId, mediaId) await MpDraftApi.deleteDraft(accountId, mediaId)
message.notifySuccess('删除成功') message.notifySuccess('删除成功')
getList() await getList()
} catch {} } catch {}
} }
</script> </script>
@ -535,6 +554,13 @@ const handleDelete = async (item: any) => {
padding-top: 5px; padding-top: 5px;
} }
.el-row {
margin-bottom: 20px;
}
.el-row:last-child {
margin-bottom: 0;
}
.item-name { .item-name {
font-size: 12px; font-size: 12px;
overflow: hidden; overflow: hidden;
@ -548,35 +574,33 @@ const handleDelete = async (item: any) => {
} }
/*新增图文*/ /*新增图文*/
.left { // .left {
display: inline-block; // display: inline-block;
width: 35%; // vertical-align: top;
vertical-align: top; // margin-top: 200px;
margin-top: 200px; // }
}
.right { // .right {
display: inline-block; // display: inline-block;
width: 60%; // width: 100%;
margin-top: -40px; // }
}
.avatar-uploader { // .avatar-uploader {
width: 20%; // width: 20%;
display: inline-block; // display: inline-block;
} // }
.avatar-uploader .el-upload { // .avatar-uploader .el-upload {
border-radius: 6px; // border-radius: 6px;
cursor: pointer; // cursor: pointer;
position: relative; // position: relative;
overflow: hidden; // overflow: hidden;
text-align: unset !important; // text-align: unset !important;
} // }
.avatar-uploader .el-upload:hover { // .avatar-uploader .el-upload:hover {
border-color: #165dff; // border-color: #165dff;
} // }
.avatar-uploader-icon { .avatar-uploader-icon {
border: 1px solid #d9d9d9; border: 1px solid #d9d9d9;
@ -599,7 +623,7 @@ const handleDelete = async (item: any) => {
} }
.digest { .digest {
width: 60%; width: 100%;
display: inline-block; display: inline-block;
vertical-align: top; vertical-align: top;
} }
@ -620,28 +644,16 @@ const handleDelete = async (item: any) => {
border: 1px solid #eaeaea; border: 1px solid #eaeaea;
} }
p {
line-height: 30px;
}
@media (min-width: 992px) and (max-width: 1300px) { @media (min-width: 992px) and (max-width: 1300px) {
.waterfall { .waterfall {
column-count: 3; column-count: 3;
} }
p {
color: red;
}
} }
@media (min-width: 768px) and (max-width: 991px) { @media (min-width: 768px) and (max-width: 991px) {
.waterfall { .waterfall {
column-count: 2; column-count: 2;
} }
p {
color: orange;
}
} }
@media (max-width: 767px) { @media (max-width: 767px) {
@ -707,10 +719,6 @@ p {
background-color: #acadae; background-color: #acadae;
} }
.input-tt {
padding: 5px;
}
.activeAddNews { .activeAddNews {
border: 5px solid #2bb673; border: 5px solid #2bb673;
} }
@ -747,7 +755,7 @@ p {
.thumb-div { .thumb-div {
display: inline-block; display: inline-block;
width: 30%; width: 100%;
text-align: center; text-align: center;
} }