接龙调整

This commit is contained in:
hebo 2025-11-16 21:45:47 +08:00
parent 01fad2bfe7
commit 534831f592
3 changed files with 166 additions and 23 deletions

View File

@ -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 BlobFileURL.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);
}

View File

@ -27,7 +27,7 @@
<u-button type="text" size="mini" class="more-btn" @click="descExpanded = true">更多</u-button>
</view>
<view v-else>
<rich-text :nodes="noticeDetail.jlms" class="desc-rich-text"></rich-text>
<rich-text :nodes="processedContent" class="desc-rich-text"></rich-text>
<u-button type="text" size="mini" class="more-btn" @click="descExpanded = false">收起</u-button>
</view>
</view>
@ -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(/&nbsp;/g, '\u3000') //
.replace(/&lt;/g, '<')
.replace(/&gt;/g, '>')
.replace(/&amp;/g, '&')
.replace(/&quot;/g, '"')
.replace(/&ldquo;/g, '"') //
.replace(/&rdquo;/g, '"') //
.replace(/&lsquo;/g, "'") //
.replace(/&rsquo;/g, "'") //
.replace(/&mdash;/g, '—') //
.replace(/&ndash;/g, '') //
.replace(/&hellip;/g, '…') //
.replace(/&middot;/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 &nbsp; CSS 2em
return noticeDetail.value.jlms
.replace(/(&nbsp;\s*){4}/g, '') // 4 &nbsp;
.replace(/(&nbsp;){4}/g, ''); // 4 &nbsp;
});
//
@ -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; //
}
}

View File

@ -2,7 +2,14 @@
<template>
<BasicLayout>
<view class="notice-detail-page">
<view v-if="isLoading" class="loading-indicator">加载中...</view>
<!-- 加载遮罩层 -->
<view v-if="isLoading" class="loading-overlay">
<view class="loading-content">
<view class="loading-spinner"></view>
<text class="loading-text">加载中...</text>
</view>
</view>
<view v-else-if="noticeDetail" class="detail-container">
<!-- 1. 主要内容卡片 -->
<view class="info-card main-content-card">
@ -27,7 +34,7 @@
<u-button type="text" size="mini" class="more-btn" @click="descExpanded = true">更多</u-button>
</view>
<view v-else>
<rich-text :nodes="noticeDetail.jlms" class="desc-rich-text"></rich-text>
<rich-text :nodes="processedContent" class="desc-rich-text"></rich-text>
<u-button type="text" size="mini" class="more-btn" @click="descExpanded = false">收起</u-button>
</view>
</view>
@ -153,9 +160,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(/&nbsp;/g, '\u3000') //
.replace(/&lt;/g, '<')
.replace(/&gt;/g, '>')
.replace(/&amp;/g, '&')
.replace(/&quot;/g, '"')
.replace(/&ldquo;/g, '"') //
.replace(/&rdquo;/g, '"') //
.replace(/&lsquo;/g, "'") //
.replace(/&rsquo;/g, "'") //
.replace(/&mdash;/g, '—') //
.replace(/&ndash;/g, '') //
.replace(/&hellip;/g, '…') //
.replace(/&middot;/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 &nbsp; CSS 2em
return noticeDetail.value.jlms
.replace(/(&nbsp;\s*){4}/g, '') // 4 &nbsp;
.replace(/(&nbsp;){4}/g, ''); // 4 &nbsp;
});
//
@ -552,7 +587,52 @@ watch(studentList, (list) => {
}
}
.loading-indicator,
/* 加载遮罩层样式 */
.loading-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.6);
display: flex;
justify-content: center;
align-items: center;
z-index: 9999;
}
.loading-content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background-color: rgba(255, 255, 255, 0.95);
border-radius: 12px;
padding: 30px 40px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.loading-spinner {
width: 40px;
height: 40px;
border: 4px solid #f3f3f3;
border-top: 4px solid #409eff;
border-radius: 50%;
animation: spin 1s linear infinite;
margin-bottom: 15px;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.loading-text {
font-size: 15px;
color: #333;
font-weight: 500;
}
.empty-state {
text-align: center;
color: #999;
@ -639,6 +719,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; //
}
}