确定气泡字体样式

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

@@ -2,7 +2,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/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/text/text","meta":{"navigationBar":{"titleText":"","type":"default"},"isNVue":false}},{"path":"pages/text/text2","meta":{"navigationBar":{"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}}].map(uniRoute=>(uniRoute.meta.route=uniRoute.path,__uniConfig.pages.push(uniRoute.path),uniRoute.path='/'+uniRoute.path,uniRoute));
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()})}});
__uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.container[data-v-939e1d1d]{padding:.625rem;background-color:#f5f5f5;min-height:100vh}.status-card[data-v-939e1d1d],.config-card[data-v-939e1d1d],.control-card[data-v-939e1d1d],.send-card[data-v-939e1d1d],.log-card[data-v-939e1d1d]{background-color:#fff;border-radius:.5rem;padding:.9375rem;margin-bottom:.625rem;box-shadow:0 .0625rem .25rem rgba(0,0,0,.05)}.status-label[data-v-939e1d1d]{font-size:.875rem;color:#666;margin-bottom:.5rem}.status-value[data-v-939e1d1d]{display:inline-block;padding:.375rem 1rem;border-radius:.25rem;font-size:.875rem;font-weight:500}.status-connected[data-v-939e1d1d]{background-color:#e6f7e6;color:#52c41a}.status-connecting[data-v-939e1d1d]{background-color:#fff7e6;color:#faad14}.status-disconnected[data-v-939e1d1d]{background-color:#f5f5f5;color:#999}.status-error[data-v-939e1d1d]{background-color:#fff1f0;color:#ff4d4f}.status-info[data-v-939e1d1d]{margin-top:.5rem}.reconnect-info[data-v-939e1d1d]{font-size:.75rem;color:#faad14}.section-title[data-v-939e1d1d]{font-size:1rem;font-weight:600;color:#333;margin-bottom:.75rem;display:block}.input-group[data-v-939e1d1d]{margin-bottom:.75rem}.input-label[data-v-939e1d1d]{font-size:.875rem;color:#666;margin-bottom:.375rem;display:block}.input-field[data-v-939e1d1d]{border:.0625rem solid #e8e8e8;border-radius:.25rem;padding:.625rem;font-size:.875rem;background-color:#fafafa}.control-card[data-v-939e1d1d]{display:flex;gap:.625rem}.btn[data-v-939e1d1d]{flex:1;height:2.75rem;line-height:2.75rem;border-radius:.375rem;font-size:1rem;text-align:center;border:none}.btn-primary[data-v-939e1d1d]{background-color:#1890ff;color:#fff}.btn-danger[data-v-939e1d1d]{background-color:#ff4d4f;color:#fff}.btn-secondary[data-v-939e1d1d]{background-color:#f0f0f0;color:#666}.btn-outline[data-v-939e1d1d]{background-color:transparent;color:#1890ff;border:.0625rem solid #1890ff}.btn-small[data-v-939e1d1d]{height:2rem;line-height:2rem;font-size:.8125rem;padding:0 .75rem}.btn[disabled][data-v-939e1d1d]{opacity:.5}.send-input-wrapper[data-v-939e1d1d]{display:flex;flex-direction:column;gap:.625rem}.send-input[data-v-939e1d1d]{border:.0625rem solid #e8e8e8;border-radius:.25rem;padding:.625rem;font-size:.875rem;min-height:5rem;background-color:#fafafa;box-sizing:border-box}.send-buttons[data-v-939e1d1d]{display:flex;gap:.625rem}.quick-messages[data-v-939e1d1d]{margin-top:.75rem;padding-top:.75rem;border-top:.0625rem solid #f0f0f0}.quick-label[data-v-939e1d1d]{font-size:.8125rem;color:#999;margin-bottom:.5rem;display:block}.quick-btns[data-v-939e1d1d]{display:flex;flex-wrap:wrap;gap:.5rem}.quick-btn[data-v-939e1d1d]{padding:.375rem .75rem;background-color:#f0f5ff;color:#1890ff;border-radius:.25rem;font-size:.8125rem;border:none}.quick-btn[disabled][data-v-939e1d1d]{opacity:.5}.log-header[data-v-939e1d1d]{display:flex;justify-content:space-between;align-items:center;margin-bottom:.75rem}.log-title-wrapper[data-v-939e1d1d]{display:flex;align-items:center;gap:.375rem}.log-title-wrapper .section-title[data-v-939e1d1d]{margin-bottom:0}.log-count[data-v-939e1d1d]{font-size:.75rem;color:#999}.log-actions[data-v-939e1d1d]{display:flex;gap:.375rem}.log-list[data-v-939e1d1d]{max-height:15.625rem;background-color:#1e1e1e;border-radius:.25rem;padding:.625rem}.log-item[data-v-939e1d1d]{display:flex;margin-bottom:.375rem;font-family:Courier New,monospace;font-size:.75rem;line-height:1.6}.log-time[data-v-939e1d1d]{color:#888;margin-right:.5rem;flex-shrink:0}.log-content[data-v-939e1d1d]{word-break:break-all;flex:1;color:#fff}.log-info .log-content[data-v-939e1d1d]{color:#fff}.log-success .log-content[data-v-939e1d1d]{color:#52c41a}.log-error .log-content[data-v-939e1d1d]{color:#ff4d4f}.log-warn .log-content[data-v-939e1d1d]{color:#faad14}.log-send .log-content[data-v-939e1d1d]{color:#1890ff}.log-receive .log-content[data-v-939e1d1d]{color:#52c41a}

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;
}