You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
house/fount/components/common/Editor.vue

240 lines
9.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div>
<!-- 图片上传组件辅助 -->
<el-upload
class="avatar-uploader" <!-- -->
:action="getActionUrl" <!-- 指定图片上传的目标地址 -->
name="file" <!-- 上传文件的字段名 -->
:headers="header" <!-- 设置上传请求头 -->
:show-file-list="false" <!-- 不显示上传文件列表 -->
:on-success="uploadSuccess" <!-- 上传成功时的回调函数 -->
:on-error="uploadError" <!-- 上传失败时的回调函数 -->
:before-upload="beforeUpload" <!-- 上传前的钩子函数 -->
></el-upload>
<!-- 富文本编辑器组件 -->
<quill-editor
class="editor" <!-- -->
v-model="value" <!-- 双向绑定编辑器内容 -->
ref="myQuillEditor" <!-- 定义引用名称 -->
:options="editorOption" <!-- 配置编辑器选项 -->
@blur="onEditorBlur($event)" <!-- 失去焦点事件 -->
@focus="onEditorFocus($event)" <!-- 获得焦点事件 -->
@change="onEditorChange($event)" <!-- 内容改变事件 -->
></quill-editor>
</div>
</template>
<script>
// 工具栏配置,定义支持的功能按钮
const toolbarOptions = [
["bold", "italic", "underline", "strike"], // 加粗、斜体、下划线、删除线功能
["blockquote", "code-block"], // 引用和代码块功能
[{ header: 1 }, { header: 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"] // 支持插入链接、图片和视频
];
import { quillEditor } from "vue-quill-editor"; // 导入 Quill 编辑器组件
import "quill/dist/quill.core.css"; // 导入 Quill 核心样式
import "quill/dist/quill.snow.css"; // 导入 Snow 主题样式
import "quill/dist/quill.bubble.css"; // 导入 Bubble 主题样式
export default {
props: {
/* 编辑器的内容 */
value: {
type: String // 定义数据类型为字符串
},
action: {
type: String // 定义上传地址的数据类型为字符串
},
/* 图片大小限制 */
maxSize: {
type: Number, // 定义数据类型为数字
default: 4000 // 默认值为 4000 KB
}
},
components: {
quillEditor // 注册 Quill 编辑器组件
},
data() {
return {
content: this.value, // 初始化编辑器内容
quillUpdateImg: false, // 控制图片上传状态,默认为未上传
editorOption: {
placeholder: "", // 占位符提示文字
theme: "snow", // 使用 Snow 主题
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) {
// var href = prompt('请输入url');
// this.quill.format("link", href);
// } else {
// this.quill.format("link", false);
// }
// },
}
}
}
},
// serverUrl: `${base.url}sys/storage/uploadSwiper?token=${storage.get('token')}`, // 图片服务器地址(注释掉)
header: {
// token: sessionStorage.token
'Token': this.$storage.get("Token") // 设置上传请求头中的 Token
} // 上传请求头配置
};
},
computed: {
// 计算属性,动态生成上传地址
getActionUrl: function() {
// return this.$base.url + this.action + "?token=" + this.$storage.get("token");
return `/${this.$base.name}/` + this.action; // 拼接上传地址
}
},
methods: {
onEditorBlur() {
// 编辑器失去焦点时的处理逻辑
},
onEditorFocus() {
// 编辑器获得焦点时的处理逻辑
},
onEditorChange() {
console.log(this.value); // 打印当前编辑器内容
// 编辑器内容改变时触发父组件更新
this.$emit("input", this.value);
},
// 富文本图片上传前的处理逻辑
beforeUpload() {
// 显示加载动画
this.quillUpdateImg = true;
},
uploadSuccess(res, file) {
// res 为图片服务器返回的数据
// 获取富文本组件实例
let quill = this.$refs.myQuillEditor.quill;
// 如果上传成功
if (res.code === 0) {
// 获取光标所在位置
let length = quill.getSelection().index;
// 插入图片res.url 为服务器返回的图片地址
quill.insertEmbed(length, "image", this.$base.url+ "upload/" +res.file);
// 调整光标到最后
quill.setSelection(length + 1);
} else {
this.$message.error("图片插入失败"); // 提示用户图片插入失败
}
// 隐藏加载动画
this.quillUpdateImg = false;
},
// 富文本图片上传失败的处理逻辑
uploadError() {
// 隐藏加载动画
this.quillUpdateImg = false;
this.$message.error("图片插入失败"); // 提示用户图片插入失败
}
}
};
</script>
<style>
.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-tooltip[data-mode="video"]::before {
content: "请输入视频地址:"; /* 自定义视频输入提示文字 */
}
.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: "等宽字体"; /* 等宽字体 */
}
</style>