确定气泡字体样式

This commit is contained in:
2026-07-24 16:56:07 +08:00
parent dc4f6b2132
commit 594775424a
18 changed files with 134 additions and 584 deletions

View File

@@ -1,7 +1,7 @@
;(function(){
let u=void 0,isReady=false,onReadyCallbacks=[],isServiceReady=false,onServiceReadyCallbacks=[];
const __uniConfig = {"pages":[],"globalStyle":{"backgroundColor":"#F8F8F8","navigationBar":{"backgroundColor":"#F8F8F8","titleText":"uni-app","type":"default","titleColor":"#000000"},"isNVue":false},"nvue":{"compiler":"uni-app","styleCompiler":"uni-app","flex-direction":"column"},"renderer":"auto","appname":"test1","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":true},"compilerVersion":"5.07","entryPagePath":"pages/text/IntuitiveAipptViewer","entryPageQuery":"","realEntryPagePath":"pages/Login/Login","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000},"locales":{},"darkmode":false,"themeConfig":{}};
const __uniConfig = {"pages":[],"globalStyle":{"backgroundColor":"#F8F8F8","navigationBar":{"backgroundColor":"#F8F8F8","titleText":"uni-app","type":"default","titleColor":"#000000"},"isNVue":false},"nvue":{"compiler":"uni-app","styleCompiler":"uni-app","flex-direction":"column"},"renderer":"auto","appname":"test1","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":true},"compilerVersion":"5.07","entryPagePath":"pages/Login/Login","entryPageQuery":"","realEntryPagePath":"","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000},"locales":{},"darkmode":false,"themeConfig":{}};
const __uniRoutes = [{"path":"pages/Login/Login","meta":{"isQuit":true,"isEntry":true,"titleNView":false,"bounce":"none","softinputMode":"adjustResize","navigationBar":{"titleText":"登录页面","style":"custom","type":"default"},"isNVue":false}},{"path":"pages/Chat/Chat","meta":{"titleNView":false,"bounce":"none","softinputMode":"adjustResize","navigationBar":{"titleText":"聊天页面(主页面)","style":"custom","type":"default"},"isNVue":false}},{"path":"pages/WorkSpace/WorkSpace","meta":{"titleNView":false,"bounce":"none","softinputMode":"adjustResize","navigationBar":{"titleText":"工作区文件管理","style":"custom","type":"default"},"isNVue":false}},{"path":"pages/UserProfileModal/UserProfileModal","meta":{"titleNView":false,"bounce":"none","softinputMode":"adjustResize","navigationBar":{"titleText":"","style":"custom","type":"default"},"isNVue":false}},{"path":"pages/ContactPages/ContactPages","meta":{"titleNView":false,"bounce":"none","softinputMode":"adjustResize","navigationBar":{"titleText":"","style":"custom","type":"default"},"isNVue":false}},{"path":"pages/WorkSpace/TemplateSpace/TemplateSpace","meta":{"titleNView":false,"bounce":"none","softinputMode":"adjustResize","navigationBar":{"titleText":"","style":"custom","type":"default"},"isNVue":false}},{"path":"pages/CloudDatabase/CloudDatabase","meta":{"titleNView":false,"bounce":"none","softinputMode":"adjustResize","navigationBar":{"titleText":"云端数据","style":"custom","type":"default"},"isNVue":false}},{"path":"pages/CloudDbDetail/CloudDbDetail","meta":{"titleNView":false,"bounce":"none","softinputMode":"adjustResize","navigationBar":{"titleText":"数据库详情","style":"custom","type":"default"},"isNVue":false}},{"path":"pages/text/text","meta":{"navigationBar":{"titleText":"","type":"default"},"isNVue":false}},{"path":"pages/text/IntuitiveAipptViewer","meta":{"navigationBar":{"titleText":"","type":"default"},"isNVue":false}}].map(uniRoute=>(uniRoute.meta.route=uniRoute.path,__uniConfig.pages.push(uniRoute.path),uniRoute.path='/'+uniRoute.path,uniRoute));
__uniConfig.styles=[];//styles
__uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});

View File

@@ -5686,7 +5686,10 @@ This will fail in production.`);
html += "<tr>";
cells.forEach((cell, ci) => {
const align = alignments[ci] ? ` style="text-align:${alignments[ci]}"` : "";
let cellContent = cell.trim().replace(/_/g, "&#95;").replace(/\*/g, "&#42;");
let cellContent = cell.trim();
cellContent = cellContent.replace(/\*\*(.+?)\*\*/g, "<strong>$1</strong>");
cellContent = cellContent.replace(/\*(.+?)\*/g, "<em>$1</em>");
cellContent = cellContent.replace(/_/g, "&#95;").replace(/\*/g, "&#42;");
html += `<${tag}${align} style="padding:6px 10px;border:1px solid #ddd">${cellContent}</${tag}>`;
});
html += "</tr>";
@@ -5714,7 +5717,7 @@ This will fail in production.`);
);
return html;
} catch (e2) {
formatAppLog("error", "at pages/Chat/Chat.vue:455", "解析失败", e2);
formatAppLog("error", "at pages/Chat/Chat.vue:460", "解析失败", e2);
return content;
}
};
@@ -5773,7 +5776,7 @@ This will fail in production.`);
files
};
} catch (e2) {
formatAppLog("error", "at pages/Chat/Chat.vue:532", "解析文件信息失败:", e2);
formatAppLog("error", "at pages/Chat/Chat.vue:537", "解析文件信息失败:", e2);
return {
textContent: content,
files: []
@@ -5810,7 +5813,7 @@ This will fail in production.`);
}
takeUserConversations();
} catch (error) {
formatAppLog("error", "at pages/Chat/Chat.vue:577", "新建普通会话失败:", error);
formatAppLog("error", "at pages/Chat/Chat.vue:582", "新建普通会话失败:", error);
uni.showToast({
title: "创建会话失败,请重试",
icon: "none"
@@ -5848,7 +5851,7 @@ This will fail in production.`);
};
const previewFileArray = vue.ref([]);
const uploadPhoto = () => {
formatAppLog("log", "at pages/Chat/Chat.vue:626", "点击了拍照上传");
formatAppLog("log", "at pages/Chat/Chat.vue:631", "点击了拍照上传");
uni.chooseImage({
count: 1,
sourceType: ["camera", "album"],
@@ -5871,7 +5874,7 @@ This will fail in production.`);
});
},
fail: (err) => {
formatAppLog("error", "at pages/Chat/Chat.vue:644", "选择图片失败", err);
formatAppLog("error", "at pages/Chat/Chat.vue:649", "选择图片失败", err);
}
});
};
@@ -5880,12 +5883,12 @@ This will fail in production.`);
};
const fileList = vue.ref([]);
const uploadFile = () => {
formatAppLog("log", "at pages/Chat/Chat.vue:655", "点击了上传文件");
formatAppLog("log", "at pages/Chat/Chat.vue:660", "点击了上传文件");
chooseFile({
count: 5,
type: "all",
success: (res) => {
formatAppLog("log", "at pages/Chat/Chat.vue:660", "成功了");
formatAppLog("log", "at pages/Chat/Chat.vue:665", "成功了");
fileList.value = res.tempFiles;
previewFileArray.value.push(...res.tempFiles);
uni.showToast({
@@ -5894,7 +5897,7 @@ This will fail in production.`);
});
},
fail: (err) => {
formatAppLog("error", "at pages/Chat/Chat.vue:671", "选择失败:", err);
formatAppLog("error", "at pages/Chat/Chat.vue:676", "选择失败:", err);
uni.showToast({
title: "选择失败",
icon: "error"
@@ -6094,7 +6097,7 @@ This will fail in production.`);
previewFileArray.value = [];
} catch (err) {
uni.hideLoading();
formatAppLog("error", "at pages/Chat/Chat.vue:895", "文件上传失败:", err);
formatAppLog("error", "at pages/Chat/Chat.vue:900", "文件上传失败:", err);
uni.showToast({
title: "文件上传失败,请重试",
icon: "error"
@@ -6228,15 +6231,15 @@ This will fail in production.`);
}
};
const stopConversation = async () => {
formatAppLog("log", "at pages/Chat/Chat.vue:1064", "中断对话 - 当前会话ID:", currentSessionId.value);
formatAppLog("log", "at pages/Chat/Chat.vue:1069", "中断对话 - 当前会话ID:", currentSessionId.value);
try {
await socketStore.send({
type: "stop",
conversation_id: currentSessionId.value
});
formatAppLog("log", "at pages/Chat/Chat.vue:1070", "中断指令已发送成功");
formatAppLog("log", "at pages/Chat/Chat.vue:1075", "中断指令已发送成功");
} catch (err) {
formatAppLog("error", "at pages/Chat/Chat.vue:1072", "中断指令发送失败:", err);
formatAppLog("error", "at pages/Chat/Chat.vue:1077", "中断指令发送失败:", err);
}
if (streamingMessageId.value) {
allmessages.value = allmessages.value.filter((m) => m._id !== streamingMessageId.value);
@@ -6254,9 +6257,9 @@ This will fail in production.`);
});
};
vue.watch(() => socketStore.isThinking, (newVal, oldVal) => {
formatAppLog("log", "at pages/Chat/Chat.vue:1096", "isThinking 变化:", oldVal, "→", newVal, "messageString:", socketStore.messageString);
formatAppLog("log", "at pages/Chat/Chat.vue:1101", "isThinking 变化:", oldVal, "→", newVal, "messageString:", socketStore.messageString);
if (!oldVal && newVal) {
formatAppLog("log", "at pages/Chat/Chat.vue:1099", "AI开始回复跨设备同步锁定输入框");
formatAppLog("log", "at pages/Chat/Chat.vue:1104", "AI开始回复跨设备同步锁定输入框");
isThinking.value = true;
if (!streamingMessageId.value) {
streamingMessageId.value = "streaming-" + Date.now();
@@ -6270,7 +6273,7 @@ This will fail in production.`);
return;
}
if (oldVal && !newVal) {
formatAppLog("log", "at pages/Chat/Chat.vue:1115", "AI回复结束正常/中断),解锁并刷新消息列表");
formatAppLog("log", "at pages/Chat/Chat.vue:1120", "AI回复结束正常/中断),解锁并刷新消息列表");
if (streamingMessageId.value) {
allmessages.value = allmessages.value.filter((m) => m._id !== streamingMessageId.value);
streamingMessageId.value = null;
@@ -6322,15 +6325,15 @@ This will fail in production.`);
UserData.value = await getUserInfo(userToken.value);
UserId.value = UserData.value._id;
UserAvatar.value = UserData.value.avatar || "";
formatAppLog("log", "at pages/Chat/Chat.vue:1179", "用户信息已加载:", UserId.value, UserAvatar.value);
formatAppLog("log", "at pages/Chat/Chat.vue:1184", "用户信息已加载:", UserId.value, UserAvatar.value);
} catch (error) {
formatAppLog("error", "at pages/Chat/Chat.vue:1181", "获取用户信息失败:", error);
formatAppLog("error", "at pages/Chat/Chat.vue:1186", "获取用户信息失败:", error);
}
};
const takeUserConversations = async () => {
try {
userToken.value = getToken();
formatAppLog("log", "at pages/Chat/Chat.vue:1189", "token:", userToken.value);
formatAppLog("log", "at pages/Chat/Chat.vue:1194", "token:", userToken.value);
UserConversations.value = await getUserConversations(userToken.value) || [];
const savedSessionId = getCurrentSessionId();
if (savedSessionId && UserConversations.value.some((c) => c._id === savedSessionId)) {
@@ -6340,7 +6343,7 @@ This will fail in production.`);
} else {
currentSessionId.value = "";
}
formatAppLog("log", "at pages/Chat/Chat.vue:1201", "保存会话id", currentSessionId.value);
formatAppLog("log", "at pages/Chat/Chat.vue:1206", "保存会话id", currentSessionId.value);
uni.setStorageSync("currentSessionId", currentSessionId.value);
} catch (error) {
uni.showToast({
@@ -6352,17 +6355,17 @@ This will fail in production.`);
const FriendInfoList = vue.ref([]);
const takeFriendList = async () => {
try {
formatAppLog("log", "at pages/Chat/Chat.vue:1216", "开始获取好友列表");
formatAppLog("log", "at pages/Chat/Chat.vue:1221", "开始获取好友列表");
const friendList = await getChatFriend(UserId.value);
formatAppLog("log", "at pages/Chat/Chat.vue:1219", "friendList:", friendList);
formatAppLog("log", "at pages/Chat/Chat.vue:1224", "friendList:", friendList);
if (friendList && friendList.length) {
FriendInfoList.value = await takeUserAvatar(friendList);
} else {
FriendInfoList.value = [];
formatAppLog("log", "at pages/Chat/Chat.vue:1224", "好友列表为空");
formatAppLog("log", "at pages/Chat/Chat.vue:1229", "好友列表为空");
}
} catch (error) {
formatAppLog("error", "at pages/Chat/Chat.vue:1227", "获取好友列表失败:", error);
formatAppLog("error", "at pages/Chat/Chat.vue:1232", "获取好友列表失败:", error);
FriendInfoList.value = [];
} finally {
UserConversations.value = FriendInfoList.value;
@@ -6389,17 +6392,17 @@ This will fail in production.`);
};
});
} catch (err) {
formatAppLog("error", "at pages/Chat/Chat.vue:1257", "获取好友头像失败", err);
formatAppLog("error", "at pages/Chat/Chat.vue:1262", "获取好友头像失败", err);
return friendList;
}
};
const GroupList = vue.ref([]);
const takeGroupList = async () => {
try {
formatAppLog("log", "at pages/Chat/Chat.vue:1267", "开始获取群聊列表");
formatAppLog("log", "at pages/Chat/Chat.vue:1272", "开始获取群聊列表");
GroupList.value = await getGroup(UserId.value);
} catch (error) {
formatAppLog("error", "at pages/Chat/Chat.vue:1272", "获取群聊列表失败:", error);
formatAppLog("error", "at pages/Chat/Chat.vue:1277", "获取群聊列表失败:", error);
GroupList.value = [];
} finally {
UserConversations.value = GroupList.value;
@@ -6411,22 +6414,22 @@ This will fail in production.`);
return [];
try {
const memberIds = memberList.map((item) => item.groupContactId);
formatAppLog("log", "at pages/Chat/Chat.vue:1286", "请求头像的ID列表:", memberIds);
formatAppLog("log", "at pages/Chat/Chat.vue:1291", "请求头像的ID列表:", memberIds);
const memberAvatarList = await getUserAvatar(userToken.value, memberIds);
formatAppLog("log", "at pages/Chat/Chat.vue:1288", "头像接口返回数据:", memberAvatarList);
formatAppLog("log", "at pages/Chat/Chat.vue:1293", "头像接口返回数据:", memberAvatarList);
const userMap = new Map(memberAvatarList.map((user) => [user.user_id, user]) || []);
formatAppLog("log", "at pages/Chat/Chat.vue:1291", "userMap的keys:", Array.from(userMap.keys()));
formatAppLog("log", "at pages/Chat/Chat.vue:1296", "userMap的keys:", Array.from(userMap.keys()));
return memberList.map((member) => {
const memberId = member.groupContactId;
const userInfo = userMap.get(memberId);
formatAppLog("log", "at pages/Chat/Chat.vue:1296", `查找 ${memberId} 的头像:`, userInfo);
formatAppLog("log", "at pages/Chat/Chat.vue:1301", `查找 ${memberId} 的头像:`, userInfo);
return {
...member,
avatar: (userInfo == null ? void 0 : userInfo.avatar) || null
};
});
} catch (err) {
formatAppLog("error", "at pages/Chat/Chat.vue:1303", "获取群成员头像失败", err);
formatAppLog("error", "at pages/Chat/Chat.vue:1308", "获取群成员头像失败", err);
return memberList;
}
};
@@ -6469,12 +6472,12 @@ This will fail in production.`);
const takeGroupMessages = async () => {
try {
allmessages.value = await getGroupMessages(currentSessionId.value) || [];
formatAppLog("log", "at pages/Chat/Chat.vue:1363", "群聊消息:", allmessages.value);
formatAppLog("log", "at pages/Chat/Chat.vue:1368", "群聊消息:", allmessages.value);
const memberList = await getGroupMemberList(currentSessionId.value);
formatAppLog("log", "at pages/Chat/Chat.vue:1366", "获取到的群成员列表:", memberList);
formatAppLog("log", "at pages/Chat/Chat.vue:1371", "获取到的群成员列表:", memberList);
if (memberList && memberList.length) {
groupMemberList.value = await takeGroupMemberAvatar(memberList);
formatAppLog("log", "at pages/Chat/Chat.vue:1369", "群成员列表(带头像):", groupMemberList.value);
formatAppLog("log", "at pages/Chat/Chat.vue:1374", "群成员列表(带头像):", groupMemberList.value);
} else {
groupMemberList.value = [];
}
@@ -6496,9 +6499,9 @@ This will fail in production.`);
}
};
vue.watch(() => friendSocketStore.MessageReceived, (newId) => {
formatAppLog("log", "at pages/Chat/Chat.vue:1414", "收到了好友消息");
formatAppLog("log", "at pages/Chat/Chat.vue:1419", "收到了好友消息");
if (newId) {
formatAppLog("log", "at pages/Chat/Chat.vue:1416", "ChatType:", ChatType.value);
formatAppLog("log", "at pages/Chat/Chat.vue:1421", "ChatType:", ChatType.value);
switch (ChatType.value) {
case 0:
takeConversationMessages();
@@ -6513,7 +6516,7 @@ This will fail in production.`);
friendSocketStore.MessageReceived = false;
break;
default:
formatAppLog("log", "at pages/Chat/Chat.vue:1432", "default 分支");
formatAppLog("log", "at pages/Chat/Chat.vue:1437", "default 分支");
friendSocketStore.MessageReceived = false;
break;
}
@@ -7510,6 +7513,7 @@ This will fail in production.`);
uni.hideLoading();
if (downloadRes.statusCode === 200) {
const tempPath = downloadRes.tempFilePath;
formatAppLog("log", "at pages/WorkSpace/WorkSpace.vue:396", "// 下载成功,文件下载路径为:", tempPath);
openFile(tempPath);
} else {
uni.showToast({
@@ -7520,7 +7524,7 @@ This will fail in production.`);
},
fail: (err) => {
uni.hideLoading();
formatAppLog("error", "at pages/WorkSpace/WorkSpace.vue:406", "下载文件失败:", err);
formatAppLog("error", "at pages/WorkSpace/WorkSpace.vue:407", "下载文件失败:", err);
uni.showToast({
title: "下载失败,请重试",
icon: "error"
@@ -7529,7 +7533,7 @@ This will fail in production.`);
});
} catch (error) {
uni.hideLoading();
formatAppLog("error", "at pages/WorkSpace/WorkSpace.vue:415", "获取下载链接失败:", error);
formatAppLog("error", "at pages/WorkSpace/WorkSpace.vue:416", "获取下载链接失败:", error);
uni.showToast({
title: "获取下载链接失败,请重试",
icon: "error"
@@ -7544,7 +7548,7 @@ This will fail in production.`);
icon: "success"
}),
fail: (err) => {
formatAppLog("error", "at pages/WorkSpace/WorkSpace.vue:432", "打开文件失败:", err);
formatAppLog("error", "at pages/WorkSpace/WorkSpace.vue:433", "打开文件失败:", err);
uni.showToast({
title: "无法打开此文件",
icon: "error"
@@ -7561,7 +7565,7 @@ This will fail in production.`);
icon: "success"
}),
fail: (err) => {
formatAppLog("error", "at pages/WorkSpace/WorkSpace.vue:451", "打开文件失败:", err);
formatAppLog("error", "at pages/WorkSpace/WorkSpace.vue:452", "打开文件失败:", err);
uni.showToast({
title: "无法打开此文件",
icon: "error"
@@ -7577,7 +7581,7 @@ This will fail in production.`);
if (res.confirm) {
try {
const filePath = `./${folder.path}`;
formatAppLog("log", "at pages/WorkSpace/WorkSpace.vue:470", "删除的是:", filePath);
formatAppLog("log", "at pages/WorkSpace/WorkSpace.vue:471", "删除的是:", filePath);
await daleteWorkspace(UserToken.value, workspaceId.value, filePath);
uni.showToast({
title: "删除成功",
@@ -7585,7 +7589,7 @@ This will fail in production.`);
});
initCurrentFolderList();
} catch (error) {
formatAppLog("error", "at pages/WorkSpace/WorkSpace.vue:478", "删除失败:", error);
formatAppLog("error", "at pages/WorkSpace/WorkSpace.vue:479", "删除失败:", error);
uni.showToast({
title: "删除失败,请重试",
icon: "error"
@@ -7653,7 +7657,7 @@ This will fail in production.`);
const currentFolderList = vue.ref([]);
const getCurrentFolderList = () => {
var _a, _b;
formatAppLog("log", "at pages/WorkSpace/WorkSpace.vue:559", "当前路径为:", JSON.stringify(folderStack.value));
formatAppLog("log", "at pages/WorkSpace/WorkSpace.vue:560", "当前路径为:", JSON.stringify(folderStack.value));
const currentPath = folderStack.value.length > 0 ? folderStack.value[folderStack.value.length - 1].path : ".";
if (currentPath === ".") {
return ((_a = allFoldersData.value) == null ? void 0 : _a.children) || [];
@@ -7677,7 +7681,7 @@ This will fail in production.`);
const initCurrentFolderList = async () => {
workspaceId.value = getWorkspaceId();
UserToken.value = getToken();
formatAppLog("log", "at pages/WorkSpace/WorkSpace.vue:586", "getWorkspaceId:", workspaceId.value);
formatAppLog("log", "at pages/WorkSpace/WorkSpace.vue:587", "getWorkspaceId:", workspaceId.value);
allFoldersData.value = await getWorkspaceList(UserToken.value, workspaceId.value);
currentFolderList.value = getCurrentFolderList();
};
@@ -7722,7 +7726,7 @@ This will fail in production.`);
uni.navigateBack({
delta: 1,
fail() {
formatAppLog("log", "at pages/WorkSpace/WorkSpace.vue:643", "返回失败,进入兜底跳转");
formatAppLog("log", "at pages/WorkSpace/WorkSpace.vue:644", "返回失败,进入兜底跳转");
uni.reLaunch({
url: "/pages/Chat/Chat"
});

View File

@@ -243,6 +243,16 @@
.icon-qita:before {
content: "\e600";
}
/* ===== 全局系统字体栈 ===== */
/* iPhone: PingFang SC */
/* 华为鸿蒙: HarmonyOS Sans */
/* 小米: MiSans */
/* OPPO/vivo/realme: 系统默认黑体 */
/* 其他安卓: Source Han Sans CN / Roboto */
body, uni-view, uni-text, uni-input, uni-textarea, uni-button {
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "HarmonyOS Sans", "MiSans", "Source Han Sans CN", "Microsoft YaHei", "Noto Sans CJK SC", sans-serif;
font-weight: 400;
}
/* 顶部状态栏占位(自动适配刘海高度) */
.status-bar {
height: var(--status-bar-height);

View File

@@ -124,7 +124,7 @@
"style": "dark",
"background": "#F8F8F8"
},
"arguments": "{\"path\":\"pages/text/IntuitiveAipptViewer\"}",
"arguments": "{\"name\":\"\",\"path\":\"\",\"query\":\"\"}",
"uniStatistics": {
"enable": false
},

View File

@@ -1655,8 +1655,15 @@ to { opacity: 1; transform: translateY(0);
/* 垂直间距 */
/* 透明度 */
/* 文章场景相关 */
/* 气泡内容字体:确保 v-html 渲染的 markdown 内容使用系统字体栈 */
.chat-content {
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "HarmonyOS Sans", "MiSans", "Source Han Sans CN", "Microsoft YaHei", "Noto Sans CJK SC", sans-serif !important;
font-size: 16px !important;
font-weight: 600 !important;
line-height: 1.6;
margin: 0.25rem 0;
/* 普通正文 */
/* 粗体和斜体样式 */
/* 气泡内的内联链接(替代 <a> 标签,点击由 JS 拦截处理) */
}
.chat-content h1 {
@@ -1684,10 +1691,20 @@ to { opacity: 1; transform: translateY(0);
.chat-content p,
.chat-content uni-text,
.chat-content span {
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "HarmonyOS Sans", "MiSans", "Source Han Sans CN", "Microsoft YaHei", "Noto Sans CJK SC", sans-serif !important;
font-size: 1.1875rem !important;
font-weight: 400 !important;
line-height: 1.6;
margin: 0.25rem 0;
}
.chat-content strong,
.chat-content b {
font-weight: 600 !important;
}
.chat-content em,
.chat-content i {
font-style: italic !important;
}
.chat-content .chat-inline-link {
color: #3b86ff !important;
text-decoration: underline;

View File

@@ -1,526 +0,0 @@
.book-viewer[data-v-dc6aee90] {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: #1a1a2e;
z-index: 9999;
display: flex;
flex-direction: column;
overflow: hidden;
}
/* ========== 工具栏 ========== */
.toolbar[data-v-dc6aee90] {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 0.625rem;
height: 2.1875rem;
background: rgba(26, 26, 46, 0.95);
border-bottom: 0.0625rem solid rgba(255, 255, 255, 0.08);
flex-shrink: 0;
}
.toolbar-left[data-v-dc6aee90] {
display: flex;
align-items: center;
gap: 0.5rem;
flex: 1;
min-width: 0;
}
.toolbar-brand[data-v-dc6aee90] {
font-size: 0.6875rem;
font-weight: 800;
color: #0ea5e9;
letter-spacing: 0.0625rem;
flex-shrink: 0;
}
.toolbar-title[data-v-dc6aee90] {
font-size: 0.8125rem;
color: #e2e8f0;
font-weight: 500;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.toolbar-right[data-v-dc6aee90] {
display: flex;
align-items: center;
gap: 0.25rem;
flex-shrink: 0;
}
.toolbar-btn[data-v-dc6aee90] {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 0.25rem 0.4375rem;
border-radius: 0.25rem;
background: rgba(255, 255, 255, 0.06);
min-width: 2.125rem;
}
.toolbar-btn[data-v-dc6aee90]:active {
background: rgba(255, 255, 255, 0.15);
}
.toolbar-close[data-v-dc6aee90] {
background: rgba(239, 68, 68, 0.15);
margin-left: 0.25rem;
}
.toolbar-close[data-v-dc6aee90]:active {
background: rgba(239, 68, 68, 0.3);
}
.toolbar-icon[data-v-dc6aee90] {
font-size: 0.875rem;
color: #cbd5e1;
}
.toolbar-label[data-v-dc6aee90] {
font-size: 0.5625rem;
color: #94a3b8;
margin-top: 0.0625rem;
}
.page-display[data-v-dc6aee90] {
display: flex;
align-items: center;
gap: 0.1875rem;
padding: 0 0.3125rem;
font-size: 0.75rem;
color: #e2e8f0;
font-weight: 600;
min-width: 2.5rem;
justify-content: center;
}
/* ========== 目录侧边栏 ========== */
.toc-overlay[data-v-dc6aee90] {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 10001;
}
.toc-sidebar[data-v-dc6aee90] {
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 13.75rem;
background: #16213e;
display: flex;
flex-direction: column;
box-shadow: 0.25rem 0 1.25rem rgba(0, 0, 0, 0.4);
}
.toc-header[data-v-dc6aee90] {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.75rem 0.875rem;
border-bottom: 0.0625rem solid rgba(255, 255, 255, 0.08);
flex-shrink: 0;
}
.toc-header-title[data-v-dc6aee90] {
font-size: 0.9375rem;
font-weight: 700;
color: #e2e8f0;
}
.toc-close[data-v-dc6aee90] {
width: 1.625rem;
height: 1.625rem;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
background: rgba(255, 255, 255, 0.08);
font-size: 0.875rem;
color: #94a3b8;
}
.toc-close[data-v-dc6aee90]:active {
background: rgba(255, 255, 255, 0.2);
}
.toc-list[data-v-dc6aee90] {
flex: 1;
overflow: hidden;
}
.toc-item[data-v-dc6aee90] {
display: flex;
align-items: center;
padding: 0.625rem 0.875rem;
border-bottom: 0.03125rem solid rgba(255, 255, 255, 0.04);
gap: 0.4375rem;
}
.toc-item[data-v-dc6aee90]:active {
background: rgba(255, 255, 255, 0.05);
}
.toc-active[data-v-dc6aee90] {
background: rgba(14, 165, 233, 0.12);
border-left: 0.1875rem solid #0ea5e9;
}
.toc-level-1 .toc-text[data-v-dc6aee90] {
font-weight: 700;
font-size: 0.8125rem;
color: #e2e8f0;
}
.toc-level-2 .toc-text[data-v-dc6aee90] {
padding-left: 0.75rem;
font-size: 0.75rem;
color: #cbd5e1;
}
.toc-level-3 .toc-text[data-v-dc6aee90] {
padding-left: 1.5rem;
font-size: 0.6875rem;
color: #94a3b8;
}
.toc-bullet[data-v-dc6aee90] {
font-size: 0.5rem;
color: #0ea5e9;
flex-shrink: 0;
}
.toc-text[data-v-dc6aee90] {
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.toc-page[data-v-dc6aee90] {
font-size: 0.625rem;
color: #64748b;
flex-shrink: 0;
}
/* ========== 书本舞台 ========== */
.book-stage[data-v-dc6aee90] {
flex: 1;
position: relative;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
background: #1a1a2e;
}
/* ========== 3D 书本容器 ========== */
.book-flip-container[data-v-dc6aee90] {
width: 92%;
height: 88%;
position: relative;
perspective: 1600px;
display: flex;
}
/* ========== 展开页(底层) ========== */
.book-spread[data-v-dc6aee90] {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
z-index: 1;
}
.book-page[data-v-dc6aee90] {
flex: 1;
height: 100%;
position: relative;
}
.book-page-left[data-v-dc6aee90] {
border-radius: 0.375rem 0 0 0.375rem;
}
.book-page-right[data-v-dc6aee90] {
border-radius: 0 0.375rem 0.375rem 0;
}
/* ========== 翻页层 ========== */
.book-flipper[data-v-dc6aee90] {
position: absolute;
top: 0;
width: 50%;
height: 100%;
transform-style: preserve-3d;
z-index: 10;
}
.flipper-right[data-v-dc6aee90] {
right: 0;
border-radius: 0 0.375rem 0.375rem 0;
}
.flipper-left[data-v-dc6aee90] {
left: 0;
border-radius: 0.375rem 0 0 0.375rem;
}
.flipper-face[data-v-dc6aee90] {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
overflow: hidden;
}
.flipper-front[data-v-dc6aee90] {
z-index: 2;
background: linear-gradient(135deg, #fefefe 0%, #f5f5f4 100%);
}
.flipper-right .flipper-front[data-v-dc6aee90] {
border-radius: 0 0.375rem 0.375rem 0;
box-shadow: -0.125rem 0 0.9375rem rgba(0, 0, 0, 0.3);
}
.flipper-left .flipper-front[data-v-dc6aee90] {
border-radius: 0.375rem 0 0 0.375rem;
box-shadow: 0.125rem 0 0.9375rem rgba(0, 0, 0, 0.3);
}
.flipper-back[data-v-dc6aee90] {
transform: rotateY(180deg);
background: linear-gradient(135deg, #fefefe 0%, #f5f5f4 100%);
}
.flipper-right .flipper-back[data-v-dc6aee90] {
border-radius: 0.375rem 0 0 0.375rem;
box-shadow: 0.125rem 0 0.9375rem rgba(0, 0, 0, 0.3);
}
.flipper-left .flipper-back[data-v-dc6aee90] {
border-radius: 0 0.375rem 0.375rem 0;
box-shadow: -0.125rem 0 0.9375rem rgba(0, 0, 0, 0.3);
}
/* ========== 书脊线 ========== */
.book-spine[data-v-dc6aee90] {
position: absolute;
top: 4%;
left: 50%;
bottom: 4%;
width: 0.0625rem;
background: linear-gradient(180deg,
transparent 0%,
rgba(0,0,0,0.15) 15%,
rgba(0,0,0,0.15) 85%,
transparent 100%);
z-index: 5;
pointer-events: none;
}
/* ========== 页面内容通用 ========== */
.page-scroll[data-v-dc6aee90] {
height: 100%;
box-sizing: border-box;
}
.page-content[data-v-dc6aee90] {
min-height: 100%;
padding: 1.25rem;
background: linear-gradient(135deg, #fefefe 0%, #f5f5f4 100%);
border-radius: 0.375rem;
box-shadow: 0 0.25rem 1.25rem rgba(0, 0, 0, 0.35);
color: #1e293b;
font-size: 0.875rem;
line-height: 1.8;
word-break: break-word;
}
/* ========== 底部翻页提示 ========== */
.page-hint[data-v-dc6aee90] {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.4375rem 1rem;
flex-shrink: 0;
background: rgba(26, 26, 46, 0.95);
border-top: 0.0625rem solid rgba(255, 255, 255, 0.08);
}
.hint-btn[data-v-dc6aee90] {
padding: 0.3125rem 0.875rem;
border-radius: 0.625rem;
background: rgba(14, 165, 233, 0.15);
color: #0ea5e9;
font-size: 0.75rem;
}
.hint-btn[data-v-dc6aee90]:active {
background: rgba(14, 165, 233, 0.3);
}
.hint-disabled[data-v-dc6aee90] {
background: rgba(255, 255, 255, 0.05);
color: #475569;
pointer-events: none;
}
.hint-center[data-v-dc6aee90] {
font-size: 0.75rem;
color: #94a3b8;
padding: 0.3125rem 0.75rem;
border-radius: 0.625rem;
background: rgba(255, 255, 255, 0.05);
}
.hint-center[data-v-dc6aee90]:active {
background: rgba(255, 255, 255, 0.12);
}
/* 页面内部元素自适应 */
.book-stage[data-v-dc6aee90] img {
max-width: 100%;
height: auto;
border-radius: 0.25rem;
}
.book-stage[data-v-dc6aee90] table {
width: 100%;
border-collapse: collapse;
font-size: 0.75rem;
}
.book-stage[data-v-dc6aee90] th,
.book-stage[data-v-dc6aee90] td {
border: 0.03125rem solid #cbd5e1;
padding: 0.375rem 0.5rem;
text-align: left;
}
.book-stage[data-v-dc6aee90] th {
background: #f1f5f9;
font-weight: 600;
}
.book-stage[data-v-dc6aee90] pre {
background: #1e293b;
color: #e2e8f0;
padding: 0.75rem;
border-radius: 0.3125rem;
overflow-x: auto;
font-size: 0.75rem;
line-height: 1.5;
}
.book-stage[data-v-dc6aee90] code {
font-family: 'SF Mono', 'Menlo', monospace;
}
.book-stage[data-v-dc6aee90] blockquote {
border-left: 0.1875rem solid #0ea5e9;
padding: 0.5rem 0.875rem;
margin: 0.625rem 0;
background: #f0f9ff;
border-radius: 0 0.25rem 0.25rem 0;
color: #334155;
}
.book-stage[data-v-dc6aee90] h1 {
font-size: 1.25rem;
font-weight: 800;
color: #0f172a;
margin: 0.5rem 0 0.75rem;
padding-bottom: 0.375rem;
border-bottom: 0.09375rem solid #0ea5e9;
}
.book-stage[data-v-dc6aee90] h2 {
font-size: 1.0625rem;
font-weight: 700;
color: #1e293b;
margin: 0.5rem 0 0.625rem;
}
.book-stage[data-v-dc6aee90] h3 {
font-size: 0.9375rem;
font-weight: 600;
color: #334155;
margin: 0.4375rem 0 0.5rem;
}
.book-stage[data-v-dc6aee90] h4,
.book-stage[data-v-dc6aee90] h5,
.book-stage[data-v-dc6aee90] h6 {
font-size: 0.875rem;
font-weight: 600;
color: #475569;
margin: 0.375rem 0 0.4375rem;
}
.book-stage[data-v-dc6aee90] ul,
.book-stage[data-v-dc6aee90] ol {
padding-left: 1.25rem;
}
.book-stage[data-v-dc6aee90] li {
margin: 0.3125rem 0;
}
.book-stage[data-v-dc6aee90] p {
margin: 0.4375rem 0;
}
.book-stage[data-v-dc6aee90] a {
color: #0ea5e9;
text-decoration: none;
}
.book-stage[data-v-dc6aee90] hr {
border: none;
border-top: 0.0625rem solid #e2e8f0;
margin: 0.875rem 0;
}
.book-stage[data-v-dc6aee90] uni-video {
max-width: 100%;
height: auto;
border-radius: 0.25rem;
}
/* ========== 加载状态 ========== */
.book-loading[data-v-dc6aee90] {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 0.9375rem;
}
.loading-spinner[data-v-dc6aee90] {
width: 1.875rem;
height: 1.875rem;
border: 0.125rem solid rgba(14, 165, 233, 0.2);
border-top-color: #0ea5e9;
border-radius: 50%;
animation: spin-dc6aee90 0.8s linear infinite;
}
@keyframes spin-dc6aee90 {
to {
transform: rotate(360deg);
}
}
.loading-text[data-v-dc6aee90] {
font-size: 0.8125rem;
color: #94a3b8;
}
/* ========== 空状态 ========== */
.book-empty[data-v-dc6aee90] {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 0.75rem;
}
.empty-icon[data-v-dc6aee90] {
font-size: 2.5rem;
}
.empty-text[data-v-dc6aee90] {
font-size: 0.875rem;
color: #64748b;
}
/* ========== 页码跳转浮层 ========== */
.page-jump-bar[data-v-dc6aee90] {
position: absolute;
top: 0.5rem;
right: 0.9375rem;
z-index: 99;
}
.jump-input[data-v-dc6aee90] {
width: 6.25rem;
height: 1.875rem;
background: rgba(255, 255, 255, 0.95);
border: 0.0625rem solid #0ea5e9;
border-radius: 0.3125rem;
padding: 0 0.625rem;
font-size: 0.8125rem;
color: #1e293b;
text-align: center;
}
/* ========== 错误提示 ========== */
.error-toast[data-v-dc6aee90] {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: rgba(239, 68, 68, 0.92);
color: #fff;
padding: 0.625rem 1.25rem;
border-radius: 0.375rem;
font-size: 0.8125rem;
z-index: 10010;
max-width: 80vw;
text-align: center;
}