当前位置: 首页 > article >正文

quillEditor 禁用复制粘贴图片,以及class转style等问题

<template><div><div class="search-term"><el-form :inline="true" :model="searchInfo" class="demo-form-inline"><el-form-item label="案例标题"><el-input v-model="searchInfo.title" placeholder="请输入案例标题" /></el-form-item><el-form-item label="项目名称"><el-inputv-model="searchInfo.projectName"placeholder="请输入项目名称"/></el-form-item><el-form-item><el-button type="primary" @click="onSubmit">查询</el-button></el-form-item><el-form-item><el-button type="primary" @click="openDialog('addArticle')">新增案例</el-button></el-form-item></el-form></div><el-table:data="tableData"@sort-change="sortChange"@selection-change="handleSelectionChange"><el-table-column type="selection" width="55" /><el-table-columntype="index":index="indexMethod"label="序号"width="100"/><!-- <el-table-column label="ID" min-width="50" prop="id" /> --><el-table-column label="标题与副标题" min-width="300"><template slot-scope="scope"><div><strong>ID:</strong> {{ scope.row.id }}</div><div><strong>标题:</strong> {{ scope.row.title }}</div><div><strong>副标题:</strong> {{ scope.row.subtitle }}</div></template></el-table-column><!-- <el-table-column label="省份与城市" min-width="150"><template slot-scope="scope"><div><strong>省份:</strong> {{ scope.row.provinceName }}</div><div><strong>城市:</strong> {{ scope.row.cityName }}</div></template></el-table-column> --><el-table-column label="项目名称" min-width="150"><template slot-scope="scope">{{ getProjectName(scope.row.projectId) }}</template></el-table-column><el-table-column label="小区" min-width="150"><template slot-scope="scope">{{ getCommunityName(scope.row.communityId) }}</template></el-table-column><el-table-column label="风格" min-width="150"><template slot-scope="scope">{{ getStyleName(scope.row.seriesId) }}</template></el-table-column><el-table-column label="房型" min-width="150"><template slot-scope="scope">{{ getHouseTypeName(scope.row.houseTypeId) }}</template></el-table-column><el-table-column label="面积与标签" min-width="200"><template slot-scope="scope"><div><strong>面积:</strong> {{ scope.row.area }} 平方米</div><div><strong>标签:</strong> {{ scope.row.tags }}</div></template></el-table-column><el-table-column label="推荐" min-width="100" prop="isRecommend"><template slot-scope="scope"><el-tagv-if="scope.row.isRecommend === '0'"effect="dark"size="mini"type="info">否</el-tag><el-tag v-else effect="dark" size="mini" type="success">是</el-tag></template></el-table-column><el-table-column label="创建时间" min-width="100" prop="createdAt" /><el-table-column label="操作" width="250"><template slot-scope="scope"><el-buttonsize="small"type="primary"icon="el-icon-edit"@click="editArticle(scope.row)">编辑</el-button><el-buttonsize="small"type="danger"icon="el-icon-delete"@click="deleteArticle(scope.row)">删除</el-button></template></el-table-column></el-table><el-pagination:current-page="page":page-size="pageSize":page-sizes="[10, 30, 50, 100]":style="{ float: 'right', padding: '20px' }":total="total"layout="total, sizes, prev, pager, next, jumper"@current-change="handleCurrentChange"@size-change="handleSizeChange"/><el-dialog:before-close="closeDialog":title="dialogTitle":visible.sync="dialogFormVisible"><el-formref="articleForm":inline="false":model="form":rules="rules"label-width="80px"><el-tabs v-model="activeName" @tab-click="handleClick"><el-tab-pane label="基本信息" name="first"><el-form-item label="标题" prop="title"><el-inputv-model="form.title"placeholder="请输入标题"required/></el-form-item><el-form-item label="副标题" prop="title"><el-input v-model="form.subtitle" placeholder="请输入副标题" /></el-form-item><el-form-item label="案例封面" prop="picUrl"><el-inputv-model="form.picUrl"placeholder="http://"disabledstyle="display: none"/><QnEleUpload :image-url="form.picUrl" @oss-url="ossPicUrl" /></el-form-item><el-form-item label="全景链接"><el-row style="padding-top: 0px"><el-col :span="4"><el-select v-model="form.panoramaType" placeholder="请选择"><el-optionv-for="item in panoramaList":key="item.value":label="item.label":value="item.value"/></el-select></el-col><el-col :span="12" style="margin-left: 10px"><el-inputv-model="form.panoramaUrl"placeholder="请输入全景链接"/></el-col></el-row></el-form-item><el-form-item label="项目" required><el-selectv-model="projectId"placeholder="请选择"style="width: 100%"><el-optionv-for="(item, index) in projectList":key="index":label="item.title":value="item.id"/></el-select></el-form-item><!-- <el-form-item label="地区" required><div style="display: flex"><el-selectv-model="provinceId"placeholder="请选择"style="margin-right: 10px"><el-optionv-for="(item, index) in provinceList":key="index":label="item.name":value="item.id"/></el-select><el-select v-model="cityId" placeholder="请选择"><el-optionv-for="(item, index) in cityList":key="index":label="item.name":value="item.id"/></el-select></div></el-form-item> --><el-form-item label="小区"><el-selectv-model="communityId"placeholder="请选择"style="width: 100%"><el-optionv-for="(item, index) in communityList":key="index":label="item.name":value="item.id"/></el-select></el-form-item><el-form-item label="户型名称" required><el-selectv-model="houseTypeId"placeholder="请选择"style="width: 100%"><el-optionv-for="(item, index) in houseTypeList":key="index":label="item.title":value="item.id"/></el-select></el-form-item><el-form-item label="风格"><el-selectv-model="seriesId"placeholder="请选择"style="width: 100%"><el-optionv-for="(item, index) in seriesList":key="index":label="item.title":value="item.id"/></el-select></el-form-item><!-- <el-form-item label="案例视频" prop="videoUrl"><el-input v-model="form.videoUrl" placeholder="http://" /><QnEleUploadVedio :image-url="form.videoUrl" @oss-url="ossPicUrlVideo" /><i class="warning">为了更好的保持兼容性建议上传mp4格式</i></el-form-item> --><el-form-item label="标签" prop="tags"><el-inputv-model="form.tags"placeholder="请输入标签,多个标签用 | 分割"/></el-form-item><el-form-item label="面积" prop="area"><el-input v-model="form.area" placeholder="请输入面积" required><template slot="append">平方米</template></el-input></el-form-item><el-form-item label="是否推荐" prop="isRecommend"><el-switchv-model="form.isRecommend":active-value="'1'":inactive-value="'0'"/></el-form-item></el-tab-pane><el-tab-pane label="案例详情" name="second"><!-- <el-form-item label="案例详情"><el-input v-model="form.skill" type="textarea" maxlength="150" show-word-limit /></el-form-item> --><div style="min-height: 500px"><QnEleUploadv-show="false"ref="upload"class="avatar-uploader":image-url="form.avatar"@oss-url="onUploadHandler"/><quill-editorref="myQuillEditor"v-model="form.detail":options="editorOption"style="min-height: 300px"/></div></el-tab-pane></el-tabs></el-form><div slot="footer" class="dialog-footer"><el-button @click="closeDialog">取 消</el-button><el-button type="primary" @click="enterDialog">确 定</el-button></div></el-dialog></div>
</template><style>
#editor—wrapper {border: 1px solid #ccc;z-index: 100; /* 按需定义 */
}
#toolbar-container {border-bottom: 1px solid #ccc;
}
#editor-container {height: 500px;
}
</style>
<script>
// 获取列表内容封装在mixins内部  getTableData方法 初始化已封装完成 条件搜索时候 请把条件安好后台定制的结构体字段 放到 this.searchInfo 中即可实现条件搜索import {getArticleList,createArticle,updateArticle,deleteArticle// deleteArticlesByIds
} from '@/api/article'
import { getProjectList } from '@/api/project'import { getCityList } from '@/api/city'
import { getCommunityList } from '@/api/community'
import { getSeriesList } from '@/api/series'import infoList from '@/mixins/infoList'
import { toSQLLine } from '@/utils/stringFun'
import QnEleUpload from '@/components/oss/qiniu'
// import QnEleUploadVedio from '@/components/oss/qiniuVideo'
import * as Quill from 'quill'
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
// 引用字号和字体css
import '@/utils/quillEditor.css'
// 设置字体大小
const fontSizeStyle = Quill.import('attributors/style/size') // 引入这个后会把样式写在style上
fontSizeStyle.whitelist = ['12px', '14px', '16px', '18px', '20px', '24px', '28px', '32px', '36px']
Quill.register(fontSizeStyle, true)
// 设置字体样式
const Font = Quill.import('attributors/style/font') // 引入这个后会把样式写在style上
const fonts = ['SimSun','SimHei','Microsoft-YaHei','KaiTi','FangSong'
]
Font.whitelist = fonts // 将字体加入到白名单
Quill.register(Font, true)
// 设置文字水平方式
var Align = Quill.import('attributors/style/align')
Align.whitelist = ['right', 'center', 'justify']
Quill.register(Align, true)
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: ['12px', '14px', '16px', '18px', '20px', '24px', '28px', '32px', '36px'] }], // 字体大小[{ header: [1, 2, 3, 4, 5, 6] }], // 标题[{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色// [{ font: ['songti'] }], // 字体种类[{ align: [] }], // 对齐方式['clean'], // 清除文本格式['image'] // 链接、图片,需要视频的可以加上video]// import * as Quill from 'quill'
// 调整上传图片大小
import ImageResize from 'quill-image-resize-module' // 引用
import { ImageDrop } from 'quill-image-drop-module'
// import { json } from 'body-parser'
Quill.register('modules/imageResize', ImageResize) // 注册
Quill.register('modules/imageDrop', ImageDrop)
import { getHouseTypeList } from '@/api/houseType'export default {name: 'Article',// 注册组件components: {QnEleUpload// QnEleUploadVedio},filters: {},mixins: [infoList],data () {return {panoramaList: [{ value: 0, label: '酷家乐', prefix: 'http://pano478.p.kujiale.com/' }, { value: 1, label: '小红屋', prefix: 'http://pano478.p.xiaohongwu.com/' }],isRecommend: 0,cityList: [],provinceId: 0,provinceName: '',cityId: 0,cityName: '',projectList: [],projectId: '1',provinceList: [],communityList: [{ id: '0', name: '请选择' }],communityId: '0',seriesList: [],seriesId: 0,houseTypeList: [],houseTypeId: 0,content: '', // 双向数据绑定数据tags: '',editorOption: {modules: {// 重写剪贴板模块clipboard: {matchers: [[Node.ELEMENT_NODE, (node, delta) => {// 拦截图片标签if (node.tagName === 'IMG') {// 返回空 Delta 阻止插入return new Delta().retain(delta.length());}return delta;}]]},toolbar: {container: toolbarOptions, // 工具栏handlers: {'image': function (value) {if (value) {// 调用el-upload的click点击事件实现文件上传document.querySelector('.avatar-uploader input').click()} else {this.quill.format('image', false)}}}},// 调整图片大小imageResize: {displayStyles: {backgroundColor: 'black',border: 'none',color: 'white'},modules: ['Resize', 'DisplaySize', 'Toolbar']}},placeholder: '请输入案例详情'},activeName: 'first',deleteVisible: false,listApi: getArticleList,dialogFormVisible: false,dialogTitle: '新增案例',articles: [],form: {id: 0,isRecommend: 0,projectId: '1',title: '',subtitle: '',picUrl: '',sort: 1,detail: '',provinceId: 0,provinceName: '',cityId: 0,cityName: '',tags: '',communityId: '0',seriesId: 0,houseTypeId: 0,area: '',panoramaUrl: '',panoramaType: 0,panoramaPrefix: ''},tab: 'first',rules: {title: [{ required: true, message: '请选输入案例标题', trigger: 'blur' }],picUrl: [{ required: true, message: '请上传案例封面', trigger: 'blur' }],detail: [{ required: true, message: '案例详情不能为空', trigger: 'blur' }],area: [{ required: true, message: '面积不能为空', trigger: 'blur' }],// seriesId: [{ required: true, message: '系列不能为空', trigger: 'blur' }],houseTypeId: [{ required: true, message: '风格不能为空', trigger: 'blur' }],panoramaUrl: [{required: false,validator: this.validatePanoramaUrl,trigger: 'blur'}]}}},watch: {seriesId (val) {this.form.seriesId = val},communityId (val) {this.form.communityId = val},projectId (val) {this.form.projectId = this.projectId},houseTypeId (val) {this.form.houseTypeId = val},provinceId (val) {this.cityList = this.provinceList.find(item => item.id === val).childrenconsole.log(1112, this.cityList)this.provinceName = this.provinceList.find(item => item.id === val).namethis.cityId = this.cityList[0].idthis.form.cityId = this.cityList[0].idthis.form.cityName = this.cityList[0].namethis.form.provinceName = this.provinceNamethis.form.provinceId = val},cityId (val) {this.cityId = valthis.form.cityId = valthis.form.cityName = this.cityList.find(item => item.id === val).name}// isRecommend (val) {//   this.form.isRecommend = Number(val)// }},async created () {const params = this.$route.paramsthis.searchInfo.projectName = params.projectNamethis.getTableData()this.initForm()},methods: {// 计算序号indexMethod (index) {return (this.page - 1) * this.pageSize + index + 1},validatePanoramaUrl (rule, value, callback) {if (value && !value.startsWith('http')) {callback(new Error('必须以http开头'))} else {callback()}},getProjectName (projectId) {console.log(111111, projectId)const project = this.projectList.find(item => item.id === projectId)return project ? project.title : '-'},getCommunityName (communityId) {const community = this.communityList.find(item => item.id === communityId)return community ? community.name : ''},getStyleName (seriesId) {const series = this.seriesList.find(item => item.id === seriesId)return series ? series.title : ''},getHouseTypeName (houseTypeId) {const houseType = this.houseTypeList.find(item => item.id === houseTypeId)return houseType ? houseType.title : ''},async getHouseTypeList () {const res = await getHouseTypeList({ page: 1, pageSize: 1000 })if (res.code === '0') {this.houseTypeList = res.data.listthis.houseTypeId = this.houseTypeList[0].idthis.form.houseTypeId = this.houseTypeId}},async getSeriesList () {const res = await getSeriesList({ page: 1, pageSize: 1000 })if (res.code === '0') {this.seriesList = res.data.listthis.seriesId = this.seriesList[0].idthis.form.seriesId = this.seriesId}},async getCommunityList () {const res = await getCommunityList({ page: 1, pageSize: 10000 })if (res.code === '0') {this.communityList = [{ id: '0', name: '请选择' }, ...res.data.list]// this.communityList = res.data.listthis.communityId = this.communityList[0].idthis.form.communityId = this.communityId}},async getProjectList () {const res = await getProjectList({ page: 1, pageSize: 1000 })if (res.code === '0') {this.projectList = res.data.listthis.projectId = this.projectList[0].idthis.form.projectId = this.projectId}},async getCityLists () {const res = await getCityList({})if (res.code === '0') {this.provinceList = res.data.listthis.provinceId = this.provinceList[0].idthis.provinceName = this.provinceList[0].namethis.form.provinceId = this.provinceIdthis.form.provinceName = this.provinceNamethis.form.cityId = this.provinceList[0].children[0].idthis.form.cityName = this.provinceList[0].children[0].name}},onEditorBlur (val) { }, // 失去焦点触发事件onEditorFocus () { }, // 获得焦点触发事件onEditorChange (val) { }, // 内容改变触发事件ossPicUrl (e) {this.form.picUrl = e.url},ossPicUrlVideo (e) {this.form.videoUrl = e.url},async onUploadHandler (e) {console.log(e)const imageUrl = e.url// 获取光标所在位置const quill = this.$refs.myQuillEditor.quillconst length = quill.getSelection().index// 插入图片quill.insertEmbed(length, 'image', imageUrl)// 调整光标到最后quill.setSelection(length + 1)// this.content += url},async onUploadHandlerCaseDescription (e) {console.log(e)const imageUrl = e.url// 获取光标所在位置const quill = this.$refs.myQuillEditorCaseDescription.quillconst length = quill.getSelection().index// 插入图片quill.insertEmbed(length, 'image', imageUrl)// 调整光标到最后quill.setSelection(length + 1)// this.content += url},handleClick (tab, event) {console.log(tab, event)},//  选中articlehandleSelectionChange (val) {this.articles = val},// async onDelete() {//   const ids = this.articles.map(item => item.id)//   const res = await deleteArticlesByIds({ ids })//   if (res.code === '0') {//     this.$message({//       type: 'success',//       message: res.message && '删除成功~'//     })//     if (this.tableData.length === ids.length && this.page > 1) {//       this.page--//     }//     this.deleteVisible = false//     this.getTableData()//   }// },// 排序sortChange ({ prop, order }) {if (prop) {this.searchInfo.orderKey = toSQLLine(prop)this.searchInfo.desc = order === 'descending'}this.getTableData()},// 条件搜索前端看此方法onSubmit () {this.page = 1this.pageSize = 10this.getTableData()},async initForm () {// this.$refs.articleForm.resetFields()this.form = {id: 0,isRecommend: 0,projectId: '1',title: '',subtitle: '',picUrl: '',sort: 1,detail: '',provinceId: 0,provinceName: '',cityId: 0,cityName: '',communityId: 0,seriesId: 0,houseTypeId: 0,area: '',panoramaType: 0,panoramaPrefix: ''}await this.getCityLists()await this.getProjectList()await this.getCommunityList()await this.getSeriesList()await this.getHouseTypeList()},closeDialog () {// this.initForm()this.dialogFormVisible = false},openDialog (type) {switch (type) {case 'addArticle':this.initForm()this.dialogTitle = '新增案例'breakcase 'edit':this.dialogTitle = '编辑案例'breakdefault:break}this.activeName = 'first'this.type = typethis.dialogFormVisible = true},async editArticle (row) {// const res = await getArticleById({ id: row.id })// if (res.code === '0') {//   this.form = res.data//   this.openDialog('edit')// }// this.initForm()console.log(2222, row)// this.$nextTick(() => {this.form = rowthis.communityId = row.communityIdthis.projectId = row.projectIdthis.provinceId = row.provinceIdthis.cityId = row.cityIdthis.houseTypeId = row.houseTypeIdthis.seriesId = row.seriesIdthis.isRecommend = Number(row.isRecommend)// this.form.isRecommend = Number(row.isRecommend)// this.form.isShow = Number(row.isShow)// this.openDialog('edit')// })this.openDialog('edit')},async deleteArticle (row) {this.$confirm('此操作将永久删除该条记录, 是否继续?','提示',{confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(async () => {const res = await deleteArticle({ id: row.id })if (res.code === '0') {this.$message({type: 'success',message: '删除成功!'})if (this.tableData.length === 1 && this.page > 1) {this.page--}this.getTableData()}}).catch(() => {this.$message({type: 'info',message: '已取消删除'})})},async enterDialog () {this.$refs.articleForm.validate(async valid => {if (valid) {for (let i = 0; i < this.panoramaList.length; i++) {if (this.form.panoramaType == this.panoramaList[i].value) {this.form.panoramaPrefix = this.panoramaList[i].prefix}}// this.form.mentorId = Number(this.form.mentorId)switch (this.type) {case 'addArticle':{const res = await createArticle(this.form)if (res.code === '0') {this.$message({type: 'success',message: '添加成功',showClose: true})}this.getTableData()this.closeDialog()}breakcase 'edit':{const res = await updateArticle(this.form)if (res.code === '0') {this.$message({type: 'success',message: '编辑成功',showClose: true})}this.getTableData()this.closeDialog()}breakdefault:// eslint-disable-next-line no-lone-blocks{this.$message({type: 'error',message: '未知操作',showClose: true})}break}}})}}
}
</script><style scoped lang="scss">
.button-box {padding: 10px 20px;.el-button {float: right;}
}
.el-tag--mini {margin-left: 5px;
}
.warning {color: #dc143c;
}
.quill-editor {height: 400px;
}.editor {line-height: normal !important;height: 400px;
}
.ql-snow .ql-tooltip[data-mode="link"]::before {content: "请输入链接地址:";
}
.ql-snow .ql-tooltip.ql-editing a.ql-action::after {border-right: 0px;content: "保存";padding-right: 0px;
}.ql-snow .ql-picker.ql-size .ql-picker-label::before,
.ql-snow .ql-picker.ql-size .ql-picker-item::before {content: "14px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before {content: "10px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="large"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"]::before {content: "18px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="huge"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before {content: "32px";
}.ql-snow .ql-picker.ql-header .ql-picker-label::before,
.ql-snow .ql-picker.ql-header .ql-picker-item::before {content: "文本";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {content: "标题1";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {content: "标题2";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {content: "标题3";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {content: "标题4";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {content: "标题5";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {content: "标题6";
}.ql-snow .ql-picker.ql-font .ql-picker-label::before,
.ql-snow .ql-picker.ql-font .ql-picker-item::before {content: "标准字体";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before {content: "衬线字体";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before {content: "等宽字体";
}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="12"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="12"]::before {content: "12px";vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="14"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="14"]::before {content: "14px";vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="16"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="16"]::before {content: "16px";vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="18"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="18"]::before {content: "18px";vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="20"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="20"]::before {content: "20px";vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="22"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="22"]::before {content: "22px";vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="24"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="24"]::before {content: "24px";vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="28"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="28"]::before {content: "28px";vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="32"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="32"]::before {content: "32px";vertical-align: top;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="36"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="36"]::before {content: "36px";vertical-align: top;
}/* 这个是字号数字对应的px值 */
.ql-editor .ql-size-12 {font-size: 12px;
}
.ql-editor .ql-size-14 {font-size: 14px;
}
.ql-editor .ql-size-16 {font-size: 16px;
}
.ql-editor .ql-size-18 {font-size: 18px;
}
.ql-editor .ql-size-20 {font-size: 20px;
}
.ql-editor .ql-size-22 {font-size: 22px;
}
.ql-editor .ql-size-24 {font-size: 24px;
}
.ql-editor .ql-size-28 {font-size: 28px;
}
.ql-editor .ql-size-32 {font-size: 32px;
}
.ql-editor .ql-size-36 {font-size: 36px;
}/* 选择字号富文本字的大小 */
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="12"]::before {font-size: 12px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="14"]::before {font-size: 14px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="16"]::before {font-size: 16px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="18"]::before {font-size: 18px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="20"]::before {font-size: 20px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="22"]::before {font-size: 22px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="24"]::before {font-size: 24px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="28"]::before {font-size: 28px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="32"]::before {font-size: 32px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="36"]::before {font-size: 36px;
}
</style>

quillEditor.css

.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=SimHei]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=SimHei]::before {content: "黑体";font-family: "SimHei";
}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=Microsoft-YaHei]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=Microsoft-YaHei]::before {content: "微软雅黑";font-family: "Microsoft YaHei";
}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=KaiTi]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=KaiTi]::before {content: "楷体";font-family: "KaiTi";
}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=FangSong]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=FangSong]::before {content: "仿宋";font-family: "FangSong";
}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=Arial]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=Arial]::before {content: "Arial";font-family: "Arial";
}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=Times-New-Roman]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=Times-New-Roman]::before {content: "Times New Roman";font-family: "Times New Roman";
}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=sans-serif]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=sans-serif]::before {content: "sans-serif";font-family: "sans-serif";
}.ql-font-SimSun {font-family: "SimSun";
}.ql-font-SimHei {font-family: "SimHei";
}.ql-font-Microsoft-YaHei {font-family: "Microsoft YaHei";
}.ql-font-KaiTi {font-family: "KaiTi";
}.ql-font-FangSong {font-family: "FangSong";
}.ql-font-Arial {font-family: "Arial";
}.ql-font-Times-New-Roman {font-family: "Times New Roman";
}.ql-font-sans-serif {font-family: "sans-serif";
}/* 字号设置 */
/* 默认字号 */
.ql-snow .ql-picker.ql-size .ql-picker-label::before,
.ql-snow .ql-picker.ql-size .ql-picker-item::before {content: "14px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="12px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="12px"]::before {content: "12px";font-size: 12px;
}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="14px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="14px"]::before {content: "14px";font-size: 14px;
}.ql-size-14px {font-size: 14px;
}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="16px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="16px"]::before {content: "16px";font-size: 16px;
}.ql-size-16px {font-size: 16px;
}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="18px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="18px"]::before {content: "18px";font-size: 18px;
}.ql-size-18px {font-size: 18px;
}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="20px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="20px"]::before {content: "20px";font-size: 20px;
}.ql-size-20px {font-size: 20px;
}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="22px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="22px"]::before {content: "22px";font-size: 22px;
}.ql-size-22px {font-size: 22px;
}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="26px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="26px"]::before {content: "26px";font-size: 26px;
}.ql-size-26px {font-size: 26px;
}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="28px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="28px"]::before {content: "28px";font-size: 28px;
}.ql-size-28px {font-size: 28px;
}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="30px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="30px"]::before {content: "30px";font-size: 30px;
}.ql-size-30px {font-size: 30px;
}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="32px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="32px"]::before {content: "32px";font-size: 32px;
}.ql-size-32px {font-size: 32px;
}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="36px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="36px"]::before {content: "36px";font-size: 36px;
}.ql-size-36px {font-size: 36px;
}

config.js

export const titleConfig = [{ Choice: '.ql-bold', title: '加粗' },{ Choice: '.ql-italic', title: '斜体' },{ Choice: '.ql-underline', title: '下划线' },{ Choice: '.ql-header', title: '段落格式' },{ Choice: '.ql-strike', title: '删除线' },{ Choice: '.ql-blockquote', title: '块引用' },{ Choice: '.ql-code', title: '插入代码' },{ Choice: '.ql-code-block', title: '插入代码段' },{ Choice: '.ql-font', title: '字体' },{ Choice: '.ql-size', title: '字体大小' },{ Choice: '.ql-list[value="ordered"]', title: '编号列表' },{ Choice: '.ql-list[value="bullet"]', title: '项目列表' },{ Choice: '.ql-direction', title: '文本方向' },{ Choice: '.ql-header[value="1"]', title: 'h1标题' },{ Choice: '.ql-header[value="2"]', title: 'h2标题' },{ Choice: '.ql-align', title: '对齐方式' },{ Choice: '.ql-color', title: '字体颜色' },{ Choice: '.ql-background', title: '背景颜色' },{ Choice: '.ql-image', title: '图像' },{ Choice: '.ql-video', title: '视频' },{ Choice: '.ql-link', title: '添加链接' },{ Choice: '.ql-table', title: '添加表格' },{ Choice: '.ql-formula', title: '插入公式' },{ Choice: '.ql-clean', title: '清除字体格式' },{ Choice: '.ql-script[value="sub"]', title: '下标' },{ Choice: '.ql-script[value="super"]', title: '上标' },{ Choice: '.ql-indent[value="-1"]', title: '向左缩进' },{ Choice: '.ql-indent[value="+1"]', title: '向右缩进' },{ Choice: '.ql-header .ql-picker-label', title: '标题大小' },{ Choice: '.ql-header .ql-picker-item[data-value="1"]', title: '标题一' },{ Choice: '.ql-header .ql-picker-item[data-value="2"]', title: '标题二' },{ Choice: '.ql-header .ql-picker-item[data-value="3"]', title: '标题三' },{ Choice: '.ql-header .ql-picker-item[data-value="4"]', title: '标题四' },{ Choice: '.ql-header .ql-picker-item[data-value="5"]', title: '标题五' },{ Choice: '.ql-header .ql-picker-item[data-value="6"]', title: '标题六' },{ Choice: '.ql-header .ql-picker-item:last-child', title: '标准' },{ Choice: '.ql-size .ql-picker-item[data-value="small"]', title: '小号' },{ Choice: '.ql-size .ql-picker-item[data-value="large"]', title: '大号' },{ Choice: '.ql-size .ql-picker-item[data-value="huge"]', title: '超大号' },{ Choice: '.ql-size .ql-picker-item:nth-child(2)', title: '标准' },{ Choice: '.ql-align', title: '文本对齐' },{ Choice: '.ql-align .ql-picker-item:first-child', title: '居左对齐' },{ Choice: '.ql-align .ql-picker-item[data-value="center"]', title: '居中对齐' },{ Choice: '.ql-align .ql-picker-item[data-value="right"]', title: '居右对齐' },{ Choice: '.ql-align .ql-picker-item[data-value="justify"]', title: '两端对齐' }
]

相关文章:

quillEditor 禁用复制粘贴图片,以及class转style等问题

<template><div><div class"search-term"><el-form :inline"true" :model"searchInfo" class"demo-form-inline"><el-form-item label"案例标题"><el-input v-model"searchInfo.titl…...

快速掌握EasyOCR应用实战指南

EasyOCR 是一个开源的、支持多语言&#xff08;28种&#xff09;和多文档格式&#xff08;PDF/PNG/JPG/TIFF等&#xff09;的 OCR&#xff08;光学字符识别&#xff09;工具库&#xff0c;由 Hugging Face 团队维护。其目标是简化 OCR 的开发流程&#xff0c;提供易用、高性能的…...

ubuntu22.04本地部署OpenWebUI

一、简介 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台&#xff0c;旨在完全离线运行。它支持各种 LLM 运行器&#xff0c;如 Ollama 和 OpenAI 兼容的 API&#xff0c;并内置了 RAG 推理引擎&#xff0c;使其成为强大的 AI 部署解决方案。 二、安装 方法 …...

JavaScript(最后一个元素的索引就是数组的长度减 1)array.length - 1

在不同的编程语言中&#xff0c;表示数组中最后一个元素的方法略有不同&#xff0c;但基本思路都是利用数组的长度或索引来实现。 以下是一些常见编程语言中获取数组最后一个元素的方法&#xff1a; 1. JavaScript: 使用 array.length - 1 索引: 这是最常见和传统的方法。Java…...

【Leetcode 每日一题】2597. 美丽子集的数目

问题背景 给你一个由正整数组成的数组 n u m s nums nums 和一个 正 整数 k k k。 如果 n u m s nums nums 的子集中&#xff0c;任意两个整数的绝对差均不等于 k k k&#xff0c;则认为该子数组是一个 美丽 子集。 返回数组 n u m s nums nums 中 非空 且 美丽 的子集数…...

jupyter配置多个核心

CMD输入 先创建虚拟环境 "D:\Program Files\Python37\python.exe" -m venv myenv激活虚拟环境 myenv\Scripts\activate"D:\Program Files\Python37\python.exe" -m pip install ipykernel "D:\Program Files\Python37\python.exe" -m ipykern…...

【Linux系统编程】初识系统编程

目录 一、什么是系统编程1. 系统编程的定义2. 系统编程的特点3. 系统编程的应用领域4. 系统编程的核心概念5. 系统编程的工具和技术 二、操作系统四大基本功能1. 进程管理&#xff08;Process Management&#xff09;2. 内存管理&#xff08;Memory Management&#xff09;3. 文…...

Python-列表和元组

列表 列表是什么, 元组是什么 编程中, 经常需要使用变量, 来保存/表示数据. 如果代码中需要表示的数据个数比较少, 我们直接创建多个变量即可. 但是有的时候, 代码中需要表示的数据特别多, 甚至也不知道要表示多少个数据. 这个时候, 就需要用到列表. 列表是一种让程序猿在代…...

ISA-95(S95)标准详解

目录 1. 什么是ISA-95&#xff1f; 2. 为什么需要ISA-95&#xff1f; 3. ISA-95模型结构 3.1 功能层次&#xff08;Purdue CIM模型&#xff09; 3.2 信息流模型 3.3 控制功能模型 3.4 生产活动定义&#xff08;Part 3&#xff09; 4. ISA-95与ISA-88&#xff08;S88&am…...

OpenHarmony 5.0.0 Release

OpenHarmony 5.0.0 Release 版本概述 OpenHarmony 5.0.0 Release版本标准系统能力持续完善。相比OpenHarmony 5.0 Beta1&#xff0c;Release版本做出了如下特性新增或增强&#xff1a; 应用框架新增更多生命周期管理能力、提供子进程相关能力&#xff0c;可以对应用运行时的…...

透视京东物流财报:一个长期主义的产业样本

“企业的使命不是预测未来&#xff0c;而是创造未来。但创造的前提是理解什么值得坚守百年。” 从某种角度来说&#xff0c;京东物流恰在成为当下国内研究长期主义的一个样本。这些亮眼的财报数据背后&#xff0c;对应的不仅是向上的业务增长本身&#xff0c;其中更需要被看见…...

H.264,H.265,H.266标准技术改进

关于H.264,H.265,H.266相关资料链接&#xff1a; 标准及中文资料链接 视频编码中的主要技术 视频编码的目标是在保证视频质量的前提下&#xff0c;尽可能减少数据量。以下是视频编码中的核心技术&#xff1a; 块划分&#xff08;Block Partitioning&#xff09; 将视频帧划分…...

Pipeline模式详解:提升程序处理效率的设计模式

文章目录 Pipeline模式详解&#xff1a;提升程序处理效率的设计模式引言Pipeline的基本概念Pipeline的工作原理Pipeline的优势Pipeline的应用场景1. 数据处理2. DevOps中的CI/CD3. 机器学习4. 图像处理 常见的Pipeline实现方式1. 函数式编程中的Pipeline2. 基于消息队列的Pipel…...

时序数据库 TDengine 化工新签约:存储降本一半,查询提速十倍

化工行业在数字化转型过程中面临数据接入复杂、实时性要求高、系统集成难度大等诸多挑战。福州力川数码科技有限公司科技依托深厚的行业积累&#xff0c;精准聚焦行业痛点&#xff0c;并携手 TDengine 提供高效解决方案。通过应用 TDengine&#xff0c;力川科技助力化工企业实现…...

Networking Based ISAC Hardware Testbed and Performance Evaluation

文章目录 Applications and Challenges of Networked SensingCooperation Mechanism in Networked SensingChallenges and Key Enabling Technologies 5G NR Frame Structure Based ISAC ApproachSignals Available for Radio SensingMulti-Dimensiona Resource Optimization S…...

【音视频】ffplay简单过滤器

一、ffplay简单过滤器 视频旋转&#xff1a;借助transpose滤镜 ffplay -i 1.mp4 -vf transpose1这里选择不同的数字是不同的方向&#xff1a; 视频翻转&#xff1a;借助hflip/vflip实现水平和垂直翻转&#xff1a; 水平翻转 ffplay 1.mp4 -vf hflip垂直翻转 ffplay 1.mp4 …...

力扣HOT100之哈希:1. 两数之和

这道题之前刷代码随想录的时候已经刷过好几遍了&#xff0c;看到就直接秒了。这道题主要是通过unordered_map<int, int>来建立哈希表&#xff0c;其中键用来保存向量中的元素&#xff0c;而对应的值则为元素的下标。遍历整个向量&#xff0c;当遍历到nums[i]时&#xff0…...

TON基金会确认冠名赞助2025香港Web3嘉年华,并将于4月8日重磅呈现“TON生态日”

近日&#xff0c;由万向区块链实验室与HashKey Group联合推出的Web3年度盛典——2025香港Web3嘉年华正式宣布&#xff0c;TON基金会确认成为本届嘉年华的冠名赞助商&#xff0c;并将于4月8日在主会场特别举办“TON生态日”专题Side Event&#xff0c;集中展现TON生态的最新技术…...

Raspberry pi4 realsense图像发送和自动启动服务

测试realsense安装&#xff1a; import pyrealsense2 as rs import numpy as np import cv2def main():# 配置RealSense管道pipeline rs.pipeline()config rs.config()# 启用RGB和彩色深度流config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)config.ena…...

Git - 补充工作中常用的一些命令

Git - 补充工作中常用的一些命令 1 一些场景1.1 场景11.2 场景21.3 场景31.4 场景41.5 场景51.6 场景61.7 场景71.8 场景81.9 场景91.10 场景101.11 场景111.12 场景121.13 场景131.14 场景141.15 场景15 2 git cherry-pick \<commit-hash\> 和 git checkout branch \-\-…...

电脑网络出现问题!简单的几种方法解除电脑飞行模式

在某些情况下&#xff0c;您可能需要关闭电脑上的飞行模式以便重新连接到 Wi-Fi、蓝牙或其他无线网络。本教程中简鹿办公将指导您如何在 Windows 和 macO S操作系统上解除飞行模式。 一、Windows 系统下解除飞行模式 通过快捷操作中心 步骤一&#xff1a;点击屏幕右下角的通知…...

CefSharp 文件下载和保存功能-监听前端事件

重点在 启用文件下载 和 通过 JavaScript 调用 C# 保存文件&#xff1a; 1. 添加文件下载处理器 (DownloadHandler) 在 VueFormService 类中&#xff0c;添加一个实现 IDownloadHandler 接口的类&#xff0c;用于处理文件下载到本地。 // 新增的 DownloadHandler 类 public c…...

PQL查询和监控各类中间件

1 prometheus的PQL查询 1.1 Metrics数据介绍 prometheus监控中采集过来的数据统一称为Metrics数据&#xff0c;其并不是代表具体的数据格式&#xff0c;而是一种统计度量计算单位当需要为某个系统或者某个服务做监控时&#xff0c;就需要使用到 metrics prometheus支持的met…...

【从零开始学习计算机科学】数字逻辑(九)有限状态机

【从零开始学习计算机科学】数字逻辑(九)有限状态机 有限状态机状态机的表示方法有限状态机的Verilog描述有限状态机 有限状态机(简称状态机)相当于一个控制器,它将一项功能的完成分解为若干步,每一步对应于二进制的一个状态,通过预先设计的顺序在各状态之间进行转换,状…...

java错题总结

本篇文章用来记录学习javaSE以来的错题 解答&#xff1a;重载要求俩个方法的名字相同&#xff0c;但参数的类型或者个数不同&#xff0c;但是不要求返回类型相同&#xff0c;所以A正确。 重写还需要要求返回类型相同&#xff08;呈现父子类关系也可以&#xff0c;但是属于特例&…...

12.【线性代数】——图和网络

十二 图和网络&#xff08;线性代数的应用&#xff09; 图 g r a p h { n o d e s , e d g e s } graph\{nodes, edges\} graph{nodes,edges}1.关联矩阵2. A A A矩阵的零空间&#xff0c;求解 A x 0 Ax0 Ax0 电势3. A T A^T AT矩阵的零空间&#xff0c;电流总结电流图结论 …...

【C++】ImGui:VSCode下的无依赖轻量GUI开发

本教程将手把手带您用纯原生方式构建ImGui应用&#xff0c;无需CMake/第三方库。您将全程明了自己每个操作的意义&#xff0c;特别适合首次接触GUI开发的新手。 环境配置 安装VSCode 作用&#xff1a;轻量级代码编辑器&#xff0c;提供智能提示操作&#xff1a; 官网下载安装…...

新编大学应用英语综合教程2 U校园全套参考答案

全套答案获取&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/389618f53143...

Python数据可视化——Matplotlib的基本绘图:图形、轴、标签

Matplotlib的绘图系统是由多个层次组成的,它的基本结构包括图形(Figure)、坐标轴(Axes)、刻度(Ticks)、标签(Labels)等多个部分。理解这些基本组件,有助于更好地使用Matplotlib绘制和优化图表。在本节中,我们将结合NumPy数组,详细讲解Matplotlib的基本结构,并展示…...

STM32之软件SPI

SPI传输更快&#xff0c;最大可达80MHz&#xff0c;而I2C最大只有3.4MHz。输入输出是分开的&#xff0c;可以同时输出输入。是同步全双工。仅支持一主多从。SS是从机选择线。每个从机一根。SPI无应答机制的设计。 注意&#xff1a;所有设备需要共地&#xff0c;时钟线主机输出&…...