diff --git a/openhis-ui-vue3/src/api/login.js b/openhis-ui-vue3/src/api/login.js index dc96c258..9d793df9 100644 --- a/openhis-ui-vue3/src/api/login.js +++ b/openhis-ui-vue3/src/api/login.js @@ -50,8 +50,10 @@ export function logout() { // 获取验证码 export function getUserBindTenantList(username) { + // 确保username存在,避免构建出错误的URL + const safeUsername = username || ''; return request({ - url: '/system/tenant/user-bind/'+username, + url: '/system/tenant/user-bind/' + safeUsername, headers: { isToken: false }, diff --git a/openhis-ui-vue3/src/components/Editor/index.vue b/openhis-ui-vue3/src/components/Editor/index.vue index 0a696f22..c919df0f 100644 --- a/openhis-ui-vue3/src/components/Editor/index.vue +++ b/openhis-ui-vue3/src/components/Editor/index.vue @@ -1,28 +1,16 @@ @@ -30,10 +18,11 @@ import { QuillEditor } from "@vueup/vue-quill"; import "@vueup/vue-quill/dist/vue-quill.snow.css"; import { getToken } from "@/utils/auth"; - -const { proxy } = getCurrentInstance(); +import { ref, computed, watch, onMounted } from 'vue'; +import modal from '@/plugins/modal'; const quillEditorRef = ref(); +const uploadRef = ref(); const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload"); // 上传的图片服务器地址 const headers = ref({ Authorization: "Bearer " + getToken() @@ -115,32 +104,34 @@ watch(() => props.modelValue, (v) => { // 如果设置了上传地址则自定义图片上传事件 onMounted(() => { if (props.type == 'url') { - let quill = quillEditorRef.value.getQuill(); - let toolbar = quill.getModule("toolbar"); - toolbar.addHandler("image", (value) => { - if (value) { - proxy.$refs.uploadRef.click(); - } else { - quill.format("image", false); - } - }); + let quill = quillEditorRef.value?.getQuill(); + if (quill) { + let toolbar = quill.getModule("toolbar"); + toolbar.addHandler("image", (value) => { + if (value && uploadRef.value) { + uploadRef.value.click(); + } else { + quill.format("image", false); + } + }); + } } }); // 上传前校检格式和大小 function handleBeforeUpload(file) { - const type = ["image/jpeg", "image/jpg", "image/png", "image/svg"]; + const type = ["image/jpeg", "image/jpg", "image/png", "image/svg+xml"]; const isJPG = type.includes(file.type); //检验文件格式 if (!isJPG) { - proxy.$modal.msgError(`图片格式错误!`); + modal.msgError(`图片格式错误!`); return false; } // 校检文件大小 if (props.fileSize) { const isLt = file.size / 1024 / 1024 < props.fileSize; if (!isLt) { - proxy.$modal.msgError(`上传文件大小不能超过 ${props.fileSize} MB!`); + modal.msgError(`上传文件大小不能超过 ${props.fileSize} MB!`); return false; } } @@ -152,21 +143,24 @@ function handleUploadSuccess(res, file) { // 如果上传成功 if (res.code == 200) { // 获取富文本实例 - let quill = toRaw(quillEditorRef.value).getQuill(); - // 获取光标位置 - let length = quill.selection.savedRange.index; - // 插入图片,res.url为服务器返回的图片链接地址 - quill.insertEmbed(length, "image", import.meta.env.VITE_APP_BASE_API + res.fileName); - // 调整光标到最后 - quill.setSelection(length + 1); + let quill = quillEditorRef.value?.getQuill(); + if (quill) { + // 获取光标位置 + let range = quill.selection?.savedRange || quill.getSelection(); + let length = range?.index || 0; + // 插入图片,res.url为服务器返回的图片链接地址 + quill.insertEmbed(length, "image", import.meta.env.VITE_APP_BASE_API + res.fileName); + // 调整光标到最后 + quill.setSelection(length + 1); + } } else { - proxy.$modal.msgError("图片插入失败"); + modal.msgError("图片插入失败"); } } // 上传失败处理 function handleUploadError() { - proxy.$modal.msgError("图片插入失败"); + modal.msgError("图片插入失败"); } @@ -174,78 +168,98 @@ function handleUploadError() { .editor-img-uploader { display: none; } -.editor, .ql-toolbar { + +.editor, +.ql-toolbar { white-space: pre-wrap !important; line-height: normal !important; } + .quill-img { display: none; } + .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: "等宽字体"; } - + \ No newline at end of file diff --git a/openhis-ui-vue3/src/components/FileUpload/index.vue b/openhis-ui-vue3/src/components/FileUpload/index.vue index 2af9672e..38911eab 100644 --- a/openhis-ui-vue3/src/components/FileUpload/index.vue +++ b/openhis-ui-vue3/src/components/FileUpload/index.vue @@ -39,7 +39,9 @@ + +/* 备注信息列表样式 */ +.instructions-list { + list-style-type: none; + padding-left: 0; +} + \ No newline at end of file diff --git a/openhis-ui-vue3/src/template/index.js b/openhis-ui-vue3/src/template/index.js index 65055b2e..523c687f 100644 --- a/openhis-ui-vue3/src/template/index.js +++ b/openhis-ui-vue3/src/template/index.js @@ -1,17 +1,42 @@ -// 动态引入 template 目录下的所有 .vue 文件 +/** + * 模板组件注册模块 + * 动态引入 template 目录下的所有 .vue 文件,并将它们注册为全局组件 + */ + +// 动态引入 template 目录下的所有 .vue 文件(包括中文命名的文件) +// 使用 { eager: true } 表示立即加载所有匹配的文件 const templates = import.meta.glob('./*.vue', { eager: true }); +// 存储所有加载的组件 const components = []; // 遍历所有引入的文件 for (const path in templates) { - const component = templates[path].default; - components.push(component); + try { + // 获取组件的默认导出 + const component = templates[path].default; + + // 检查组件是否有 name 属性,如果没有则跳过 + if (component && component.name) { + components.push(component); + } else { + console.warn(`组件 ${path} 缺少 name 属性,将不会被注册`); + } + } catch (error) { + console.error(`加载组件 ${path} 时出错:`, error); + } } + +/** + * 注册所有组件到 Vue 应用实例 + * @param {Object} app - Vue 应用实例 + */ const registerComponents = (app) => { components.forEach((component) => { + // 使用组件的 name 属性作为组件名称进行注册 app.component(component.name, component); - }) -} -export { components, registerComponents }; + }); +}; +// 导出组件数组和注册函数 +export { components, registerComponents }; \ No newline at end of file diff --git a/openhis-ui-vue3/src/template/nursingRecordSheet.vue b/openhis-ui-vue3/src/template/nursingRecordSheet.vue index dcfb1ba0..f3d354f3 100644 --- a/openhis-ui-vue3/src/template/nursingRecordSheet.vue +++ b/openhis-ui-vue3/src/template/nursingRecordSheet.vue @@ -5,13 +5,11 @@ -->