From 534831f592e69fe88bfa26f8f5024f2572dcd532 Mon Sep 17 00:00:00 2001 From: hebo Date: Sun, 16 Nov 2025 21:45:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A5=E9=BE=99=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/BasicSign/Sign.vue | 37 +++++++---- src/pages/base/jl/detail.vue | 48 ++++++++++++-- src/pages/base/jl/detailwb.vue | 104 ++++++++++++++++++++++++++++-- 3 files changed, 166 insertions(+), 23 deletions(-) diff --git a/src/components/BasicSign/Sign.vue b/src/components/BasicSign/Sign.vue index ef42b32..54b7627 100644 --- a/src/components/BasicSign/Sign.vue +++ b/src/components/BasicSign/Sign.vue @@ -156,20 +156,31 @@ export default { return await new Promise(async (resolve) => { this.listeners.push((res) => { if (res) { - const byteCharacters = atob(res.split(',')[1]); - const byteNumbers = new Array(byteCharacters.length); - for (let i = 0; i < byteCharacters.length; i++) { - byteNumbers[i] = byteCharacters.charCodeAt(i); + // 基础数据,所有平台都支持 + const result = { + base64: res + }; + + // 以下代码仅在 H5 环境中执行,因为微信小程序不支持 Blob、File、URL.createObjectURL + // #ifdef H5 + try { + const byteCharacters = atob(res.split(',')[1]); + const byteNumbers = new Array(byteCharacters.length); + for (let i = 0; i < byteCharacters.length; i++) { + byteNumbers[i] = byteCharacters.charCodeAt(i); + } + const byteArray = new Uint8Array(byteNumbers); + const blob = new Blob([byteArray], {type: 'image/svg+xml'}); + const fileName = 'sign.svg'; + const file = new File([blob], fileName, {type: 'image/svg+xml'}); + result.blob = URL.createObjectURL(file); + result.file = file; + } catch (e) { + console.error('处理签名文件失败:', e); } - const byteArray = new Uint8Array(byteNumbers); - const blob = new Blob([byteArray], {type: 'image/svg+xml'}); - const fileName = 'sign.svg'; - const file = new File([blob], fileName, {type: 'image/svg+xml'}); - resolve({ - base64: res, - blob: URL.createObjectURL(file), - file - }); + // #endif + + resolve(result); } else { resolve(res); } diff --git a/src/pages/base/jl/detail.vue b/src/pages/base/jl/detail.vue index 2f96908..0732ab8 100644 --- a/src/pages/base/jl/detail.vue +++ b/src/pages/base/jl/detail.vue @@ -27,7 +27,7 @@ 更多 - + 收起 @@ -152,9 +152,37 @@ const currentStudent = computed(() => userStore.curXs); const descPreview = computed(() => { if (!noticeDetail.value?.jlms) return ''; - const div = document.createElement('div'); - div.innerHTML = noticeDetail.value.jlms; - return div.innerText.replace(/\n/g, '').slice(0, 100) + (div.innerText.length > 100 ? '...' : ''); + // 使用正则表达式去除 HTML 标签,兼容所有平台 + const text = noticeDetail.value.jlms + .replace(/<[^>]+>/g, '') // 去除 HTML 标签 + .replace(/ /g, '\u3000') // 转换为中文全角空格(保留段落缩进) + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(/“/g, '"') // 左双引号 + .replace(/”/g, '"') // 右双引号 + .replace(/‘/g, "'") // 左单引号 + .replace(/’/g, "'") // 右单引号 + .replace(/—/g, '—') // 长破折号 + .replace(/–/g, '–') // 短破折号 + .replace(/…/g, '…') // 省略号 + .replace(/·/g, '·') // 间隔号 + .replace(/&#\d+;/g, '') // 移除数字型 HTML 实体 + .replace(/[\r\n]+/g, ' ') // 将换行符转换为空格 + .replace(/[ \t]+/g, ' ') // 只合并普通空格和制表符,保留全角空格 + .trim(); + + return text.slice(0, 100) + (text.length > 100 ? '...' : ''); +}); + +// 处理完整内容,移除段落开头的多余空格(因为 CSS 已设置 text-indent) +const processedContent = computed(() => { + if (!noticeDetail.value?.jlms) return ''; + // 将段落开头的 4个   替换为空(CSS 会自动添加 2em 缩进) + return noticeDetail.value.jlms + .replace(/( \s*){4}/g, '') // 移除 4个连续的  (可能有空格分隔) + .replace(/( ){4}/g, ''); // 移除紧挨着的 4个   }); // 获取文件名 @@ -600,6 +628,18 @@ watch(studentList, (list) => { font-size: 14px; color: #666; line-height: 1.5; + white-space: pre-wrap; // 保留空格和换行 + word-wrap: break-word; // 自动换行 + } + + // 使用深度选择器为 rich-text 内部的段落设置缩进 + .desc-rich-text ::v-deep p { + text-indent: 2em; // 段落首行缩进2个字符 + margin: 0.5em 0; // 段落间距 + } + + .desc-rich-text ::v-deep p:first-child { + text-indent: 0; // 第一个段落(标题)不缩进 } } diff --git a/src/pages/base/jl/detailwb.vue b/src/pages/base/jl/detailwb.vue index b85aca5..f2ce7c2 100644 --- a/src/pages/base/jl/detailwb.vue +++ b/src/pages/base/jl/detailwb.vue @@ -2,7 +2,14 @@