master
管理员 8 months ago
parent 7090c6e4c7
commit 40e7e5aa96

@ -1,36 +1,51 @@
<template> <template>
<div> <div style="width: 100%;">
<el-upload <el-upload :action="uploadUrl" :before-upload="handleBeforeUpload" :on-success="handleUploadSuccess"
:action="uploadUrl" :on-error="handleUploadError" class="editor-img-uploader" name="file" :show-file-list="false" :headers="headers"
:before-upload="handleBeforeUpload" style="display: none" ref="uploadRef" v-if="type == 'url'">
:on-success="handleUploadSuccess"
:on-error="handleUploadError"
class="editor-img-uploader"
name="file"
:show-file-list="false"
:headers="headers"
style="display: none"
ref="uploadRef"
v-if="type == 'url'"
>
</el-upload> </el-upload>
<div class="editor"> <div class="editor">
<quill-editor <div v-if="!source">
ref="myQuillEditor" <quill-editor ref="myQuillEditor" v-model:content="content" contentType="html"
v-model:content="content" @textChange="(e) => $emit('update:modelValue', content)" :options="options" :style="styles" />
contentType="html" </div>
@textChange="(e) => $emit('update:modelValue', content)" <el-input v-if="source" class="source-textarea" :style="{ height: height + 'px',width:'100%' }" type="textarea"
:options="options" v-model="content" />
:style="styles"
/> <div style="padding-top: .2em; display: flex; justify-content: flex-end;">
<el-radio-group v-model="source" @change="changeSource">
<el-radio-button label="编辑视图" :value="false" />
<el-radio-button label="源码视图" :value="true" />
</el-radio-group>
</div>
</div> </div>
</div> </div>
</template> </template>
<script setup> <script setup>
import { QuillEditor, Quill } from '@vueup/vue-quill'; import { QuillEditor, Quill } from '@vueup/vue-quill';
// import ImageResize from 'quill-image-resize-module';
import '@vueup/vue-quill/dist/vue-quill.snow.css'; import '@vueup/vue-quill/dist/vue-quill.snow.css';
import { getToken } from "@/utils/auth"; import { getToken } from "@/utils/auth";
import { ref, computed, onMounted, getCurrentInstance } from 'vue'
// Quill.register(ImageResize)
const source = ref(false)
const height = ref(100)
onMounted(async () => {
await proxy.$nextTick()
height.value = myQuillEditor.value.editor.clientHeight + 42;
})
const changeSource = () => {
if (!source.value) {
console.debug(myQuillEditor.value.editor.clientHeight);
}
}
const props = defineProps({ const props = defineProps({
/* 编辑器的内容 */ /* 编辑器的内容 */
@ -61,12 +76,16 @@ const props = defineProps({
type: { type: {
type: String, type: String,
default: "url", default: "url",
},
server: {
type: String,
default: "/system/oss/upload"
} }
}); });
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
// //
const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/system/oss/upload"); const uploadUrl = computed(() => import.meta.env.VITE_APP_BASE_API + props.server);
const headers = ref({ Authorization: "Bearer " + getToken() }); const headers = ref({ Authorization: "Bearer " + getToken() });
const myQuillEditor = ref(); const myQuillEditor = ref();
@ -80,14 +99,14 @@ const options = ref({
container: [ container: [
["bold", "italic", "underline", "strike"], // 线 线 ["bold", "italic", "underline", "strike"], // 线 线
["blockquote", "code-block"], // ["blockquote", "code-block"], //
[{ list: "ordered" }, { list: "bullet"} ], // [{ list: "ordered" }, { list: "bullet" }], //
[{ indent: "-1" }, { indent: "+1" }], // [{ indent: "-1" }, { indent: "+1" }], //
[{ size: ["small", false, "large", "huge"] }], // [{ size: ["small", false, "large", "huge"] }], //
[{ header: [1, 2, 3, 4, 5, 6, false] }], // [{ header: [1, 2, 3, 4, 5, 6, false] }], //
[{ color: [] }, { background: [] }], // [{ color: [] }, { background: [] }], //
[{ align: [] }], // [{ align: [] }], //
["clean"], // ["clean"], //
["link", "image", "video"] // ["link", "image"] //
], ],
handlers: { handlers: {
image: function (value) { image: function (value) {
@ -132,7 +151,7 @@ function handleUploadSuccess(res, file) {
// //
let length = quill.selection.savedRange.index; let length = quill.selection.savedRange.index;
// res // res
quill.insertEmbed(length, "image", res.data.url); quill.insertEmbed(length, "image", res.data);
// //
quill.setSelection(length + 1); quill.setSelection(length + 1);
proxy.$modal.closeLoading(); proxy.$modal.closeLoading();
@ -164,16 +183,20 @@ function handleUploadError(err) {
</script> </script>
<style> <style>
.editor, .ql-toolbar { .editor,
.ql-toolbar {
white-space: pre-wrap !important; white-space: pre-wrap !important;
line-height: normal !important; line-height: normal !important;
} }
.quill-img { .quill-img {
display: none; display: none;
} }
.ql-snow .ql-tooltip[data-mode="link"]::before { .ql-snow .ql-tooltip[data-mode="link"]::before {
content: "请输入链接地址:"; content: "请输入链接地址:";
} }
.ql-snow .ql-tooltip.ql-editing a.ql-action::after { .ql-snow .ql-tooltip.ql-editing a.ql-action::after {
border-right: 0px; border-right: 0px;
content: "保存"; content: "保存";
@ -188,14 +211,17 @@ function handleUploadError(err) {
.ql-snow .ql-picker.ql-size .ql-picker-item::before { .ql-snow .ql-picker.ql-size .ql-picker-item::before {
content: "14px"; content: "14px";
} }
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"]::before, .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 { .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before {
content: "10px"; content: "10px";
} }
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="large"]::before, .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 { .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"]::before {
content: "18px"; content: "18px";
} }
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="huge"]::before, .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 { .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before {
content: "32px"; content: "32px";
@ -205,26 +231,32 @@ function handleUploadError(err) {
.ql-snow .ql-picker.ql-header .ql-picker-item::before { .ql-snow .ql-picker.ql-header .ql-picker-item::before {
content: "文本"; content: "文本";
} }
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, .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 { .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
content: "标题1"; content: "标题1";
} }
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, .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 { .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
content: "标题2"; content: "标题2";
} }
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, .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 { .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
content: "标题3"; content: "标题3";
} }
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, .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 { .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
content: "标题4"; content: "标题4";
} }
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, .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 { .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
content: "标题5"; content: "标题5";
} }
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, .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 { .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
content: "标题6"; content: "标题6";
@ -234,12 +266,21 @@ function handleUploadError(err) {
.ql-snow .ql-picker.ql-font .ql-picker-item::before { .ql-snow .ql-picker.ql-font .ql-picker-item::before {
content: "标准字体"; content: "标准字体";
} }
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before, .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 { .ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before {
content: "衬线字体"; content: "衬线字体";
} }
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before, .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 { .ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before {
content: "等宽字体"; content: "等宽字体";
} }
.source-textarea textarea.el-textarea__inner {
resize: none;
height: 100%;
width: 100%;
}
</style> </style>

@ -38,7 +38,7 @@ public class ${entity.toUpperName()}Api {
*/ */
@GetMapping("/{id}") @GetMapping("/{id}")
@SaCheckPermission("${moduleName}:${entity.toSimpleLowerName()}:query") @SaCheckPermission("${moduleName}:${entity.toSimpleLowerName()}:query")
public ${entity.toUpperName()} id(@NotNull(message = "编号不能为空") @PathVariable Long id) { public ${entity.toUpperName()} id(@NotNull(message = "编号不能为空") @PathVariable ${entity.id.clazz.getSimpleName()} id) {
return findById(${entity.toUpperName()}.class, id); return findById(${entity.toUpperName()}.class, id);
} }
@ -113,7 +113,7 @@ public class ${entity.toUpperName()}Api {
@SaCheckPermission("${moduleName}:${entity.toSimpleLowerName()}:delete") @SaCheckPermission("${moduleName}:${entity.toSimpleLowerName()}:delete")
@Log(title = "${entity.name}", businessType = BusinessType.DELETE) @Log(title = "${entity.name}", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}") @DeleteMapping("/{ids}")
public void remove(@NotEmpty(message = "编号不能为空") @PathVariable Long[] ids) { public void remove(@NotEmpty(message = "编号不能为空") @PathVariable ${entity.id.clazz.getSimpleName()}[] ids) {
doRemove(${entity.toUpperName()}.class, conditions().put("_id$in", ids).query()); doRemove(${entity.toUpperName()}.class, conditions().put("_id$in", ids).query());
} }

Loading…
Cancel
Save