部分优化

This commit is contained in:
2026-07-07 18:02:55 +08:00
parent b8af01cc69
commit bf5203b081
48 changed files with 3228 additions and 1755 deletions

View File

@@ -32,6 +32,7 @@ if (uni.restoreGlobal) {
(function(vue) {
"use strict";
const ON_SHOW = "onShow";
const ON_UNLOAD = "onUnload";
function formatAppLog(type, filename, ...args) {
if (uni.__log__) {
uni.__log__(type, filename, ...args);
@@ -50,6 +51,11 @@ if (uni.restoreGlobal) {
1 | 2
/* HookFlags.PAGE */
);
const onUnload = /* @__PURE__ */ createLifeCycleHook(
ON_UNLOAD,
2
/* HookFlags.PAGE */
);
const BASE_URL = "https://cloud.yuxindazhineng.com";
const login = async (username, password) => {
return new Promise((resolve, reject) => {
@@ -4615,6 +4621,7 @@ This will fail in production.`);
vue.ref("");
const logs = vue.ref([]);
const maxLogCount = vue.ref(20);
const authFailReason = vue.ref("");
const isConnected = vue.computed(() => connectionStatus.value === "connected");
const isConnecting = vue.computed(() => connectionStatus.value === "connecting");
const isDisconnected = vue.computed(() => connectionStatus.value === "disconnected");
@@ -4631,7 +4638,7 @@ This will fail in production.`);
if (logs.value.length > maxLogCount.value) {
logs.value = logs.value.slice(-maxLogCount.value);
}
formatAppLog("log", "at stores/socket.js:52", `[${type.toUpperCase()}] ${connect2}`);
formatAppLog("log", "at stores/socket.js:54", `[${type.toUpperCase()}] ${connect2}`);
}
function clearLogs() {
logs.value = [];
@@ -4669,7 +4676,7 @@ This will fail in production.`);
addLog("warn", "已主动断开连接");
}
async function send(message) {
formatAppLog("log", "at stores/socket.js:96", "检查到要发生消息为:", message);
formatAppLog("log", "at stores/socket.js:98", "检查到要发生消息为:", message);
if (!isConnected.value) {
addLog("error", "发送失败: 连接未建立");
throw new Error("连接未建立");
@@ -4686,7 +4693,7 @@ This will fail in production.`);
function handleOpen() {
connectionStatus.value = "connected";
addLog("success", "连接成功!发送auth");
formatAppLog("log", "at stores/socket.js:115", "连接成功!发送auth");
formatAppLog("log", "at stores/socket.js:117", "连接成功!发送auth");
sendAuth();
}
function handleClose() {
@@ -4720,11 +4727,16 @@ This will fail in production.`);
message_id,
data
} = messageData || {};
formatAppLog("log", "at stores/socket.js:160", "[handleMessage] type =", type, ", data =", JSON.stringify(data));
formatAppLog("log", "at stores/socket.js:162", "[handleMessage] type =", type, ", data =", JSON.stringify(data));
switch (type) {
case "auth_ok":
addLog("success", "连接成功");
break;
case "auth_fail":
isThinking.value = false;
authFailReason.value = (data == null ? void 0 : data.reason) || (messageData == null ? void 0 : messageData.reason) || "unknown";
addLog("error", `认证失败: ${authFailReason.value}`);
break;
case "chat_ack":
addLog("warn", "AI成功收到用户发送的消息");
break;
@@ -4745,12 +4757,18 @@ This will fail in production.`);
}
function handleBusinessMessage(data) {
if (data === "exit") {
formatAppLog("log", "at stores/socket.js:212", "ai结束思考");
formatAppLog("log", "at stores/socket.js:220", "ai结束思考");
isThinking.value = false;
return;
}
if (!data || typeof data !== "object")
return;
if (data.cmd === "event_callback" && data.info === "中断成功") {
formatAppLog("log", "at stores/socket.js:230", "后端确认中断成功");
addLog("warn", `中断确认: ${data.info}`);
isThinking.value = false;
return;
}
const {
role,
chunk,
@@ -4760,7 +4778,7 @@ This will fail in production.`);
task_call_id
} = data;
if (!isThinking.value && (chunk || message_role === "assistant")) {
formatAppLog("log", "at stores/socket.js:233", "ai开始思考");
formatAppLog("log", "at stores/socket.js:247", "ai开始思考");
messageString.value = "";
isThinking.value = true;
}
@@ -4784,6 +4802,7 @@ This will fail in production.`);
isThinking,
logs,
config,
authFailReason,
// 计算属性
isConnected,
isConnecting,
@@ -5556,7 +5575,7 @@ This will fail in production.`);
if (friendSocketStore.isConnected)
return;
if (!userToken.value || !UserId.value) {
formatAppLog("warn", "at pages/Chat/Chat.vue:292", "Token或UserId未准备好");
formatAppLog("warn", "at pages/Chat/Chat.vue:307", "Token或UserId未准备好");
return;
}
friendSocketStore.connect({
@@ -5627,7 +5646,7 @@ This will fail in production.`);
const html = t(content);
return html;
} catch (e2) {
formatAppLog("error", "at pages/Chat/Chat.vue:390", "解析失败", e2);
formatAppLog("error", "at pages/Chat/Chat.vue:405", "解析失败", e2);
return content;
}
};
@@ -5677,7 +5696,7 @@ This will fail in production.`);
const textContent = content.replace(match[0], "").trim();
return { textContent, files };
} catch (e2) {
formatAppLog("error", "at pages/Chat/Chat.vue:458", "解析文件信息失败:", e2);
formatAppLog("error", "at pages/Chat/Chat.vue:473", "解析文件信息失败:", e2);
return { textContent: content, files: [] };
}
};
@@ -5711,7 +5730,7 @@ This will fail in production.`);
}
takeUserConversations();
} catch (error) {
formatAppLog("error", "at pages/Chat/Chat.vue:500", "新建普通会话失败:", error);
formatAppLog("error", "at pages/Chat/Chat.vue:515", "新建普通会话失败:", error);
uni.showToast({
title: "创建会话失败,请重试",
icon: "none"
@@ -5749,7 +5768,7 @@ This will fail in production.`);
};
const previewFileArray = vue.ref([]);
const uploadPhoto = () => {
formatAppLog("log", "at pages/Chat/Chat.vue:549", "点击了拍照上传");
formatAppLog("log", "at pages/Chat/Chat.vue:564", "点击了拍照上传");
uni.chooseImage({
count: 1,
sourceType: ["camera", "album"],
@@ -5772,33 +5791,21 @@ This will fail in production.`);
});
},
fail: (err) => {
formatAppLog("error", "at pages/Chat/Chat.vue:567", "选择图片失败", err);
formatAppLog("error", "at pages/Chat/Chat.vue:582", "选择图片失败", err);
}
});
};
const deleteImage = (index) => {
uni.showModal({
title: "提示",
content: "确定要删除这张图片吗?",
success: (res) => {
if (res.confirm) {
previewFileArray.value.splice(index, 1);
uni.showToast({
title: "删除成功",
icon: "success"
});
}
}
});
previewFileArray.value.splice(index, 1);
};
const fileList = vue.ref([]);
const uploadFile = () => {
formatAppLog("log", "at pages/Chat/Chat.vue:590", "点击了上传文件");
formatAppLog("log", "at pages/Chat/Chat.vue:593", "点击了上传文件");
chooseFile({
count: 5,
type: "all",
success: (res) => {
formatAppLog("log", "at pages/Chat/Chat.vue:595", "成功了");
formatAppLog("log", "at pages/Chat/Chat.vue:598", "成功了");
fileList.value = res.tempFiles;
previewFileArray.value.push(...res.tempFiles);
uni.showToast({
@@ -5807,7 +5814,7 @@ This will fail in production.`);
});
},
fail: (err) => {
formatAppLog("error", "at pages/Chat/Chat.vue:606", "选择失败:", err);
formatAppLog("error", "at pages/Chat/Chat.vue:609", "选择失败:", err);
uni.showToast({
title: "选择失败",
icon: "error"
@@ -5839,8 +5846,19 @@ This will fail in production.`);
});
};
const isThinking = vue.ref(false);
const isSelfSent = vue.ref(false);
const isUploading = vue.ref(false);
const uploadedFiles = vue.ref([]);
const showMessageModal = vue.ref(false);
const detailMessageContent = vue.ref("");
const showMessageDetail = (message) => {
detailMessageContent.value = message.content || "";
showMessageModal.value = true;
};
const closeMessageDetail = () => {
showMessageModal.value = false;
detailMessageContent.value = "";
};
const sendMessage = async () => {
const message = textMessage.value.trim();
if (!message && previewFileArray.value.length === 0)
@@ -5861,7 +5879,7 @@ This will fail in production.`);
previewFileArray.value = [];
} catch (err) {
uni.hideLoading();
formatAppLog("error", "at pages/Chat/Chat.vue:673", "文件上传失败:", err);
formatAppLog("error", "at pages/Chat/Chat.vue:689", "文件上传失败:", err);
uni.showToast({
title: "文件上传失败,请重试",
icon: "error"
@@ -5972,15 +5990,17 @@ This will fail in production.`);
};
socketStore.send(data);
isThinking.value = true;
isSelfSent.value = true;
aiResponseTimer = setTimeout(() => {
uni.showToast({
title: "AI回复超时请重试",
icon: "none"
});
isThinking.value = false;
isSelfSent.value = false;
textMessage.value = "";
uploadedFiles.value = [];
}, 18e4);
}, 6e5);
} catch (error) {
isThinking.value = false;
uni.showToast({
@@ -5989,18 +6009,55 @@ This will fail in production.`);
});
}
};
const stopConversation = async () => {
formatAppLog("log", "at pages/Chat/Chat.vue:853", "中断对话 - 当前会话ID:", currentSessionId.value);
try {
await socketStore.send({
type: "stop",
conversation_id: currentSessionId.value
});
formatAppLog("log", "at pages/Chat/Chat.vue:859", "中断指令已发送成功");
} catch (err) {
formatAppLog("error", "at pages/Chat/Chat.vue:861", "中断指令发送失败:", err);
}
clearTimeout(aiResponseTimer);
isThinking.value = false;
isSelfSent.value = false;
textMessage.value = "";
uploadedFiles.value = [];
uni.showToast({ title: "已中断", icon: "none", duration: 1500 });
};
vue.watch(() => socketStore.isThinking, (newVal, oldVal) => {
formatAppLog("log", "at pages/Chat/Chat.vue:835", "isThinking 变化:", oldVal, "→", newVal);
if (oldVal && !newVal && socketStore.messageString) {
formatAppLog("log", "at pages/Chat/Chat.vue:875", "isThinking 变化:", oldVal, "→", newVal, "messageString:", socketStore.messageString);
if (!oldVal && newVal) {
formatAppLog("log", "at pages/Chat/Chat.vue:878", "AI开始回复跨设备同步锁定输入框");
isThinking.value = true;
return;
}
if (oldVal && !newVal) {
clearTimeout(aiResponseTimer);
formatAppLog("log", "at pages/Chat/Chat.vue:839", "ai返回的消息", socketStore.messageString);
formatAppLog("log", "at pages/Chat/Chat.vue:840", "AI回复结束刷新消息列表");
formatAppLog("log", "at pages/Chat/Chat.vue:885", "AI回复结束正常/中断),解锁并刷新消息列表");
takeConversationMessages();
isThinking.value = false;
isSelfSent.value = false;
textMessage.value = "";
uploadedFiles.value = [];
}
});
vue.watch(() => socketStore.authFailReason, (reason) => {
if (reason === "pc offline") {
isThinking.value = false;
socketStore.authFailReason = "";
vue.nextTick(() => {
uni.showModal({
title: "提示",
content: "PC端不在线不可聊天",
showCancel: false,
confirmText: "知道了"
});
});
}
});
const textMessage = vue.ref("");
const UserConversations = vue.ref([]);
const currentSessionId = vue.ref("");
@@ -6014,15 +6071,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:866", "用户信息已加载:", UserId.value, UserAvatar.value);
formatAppLog("log", "at pages/Chat/Chat.vue:928", "用户信息已加载:", UserId.value, UserAvatar.value);
} catch (error) {
formatAppLog("error", "at pages/Chat/Chat.vue:868", "获取用户信息失败:", error);
formatAppLog("error", "at pages/Chat/Chat.vue:930", "获取用户信息失败:", error);
}
};
const takeUserConversations = async () => {
try {
userToken.value = getToken();
formatAppLog("log", "at pages/Chat/Chat.vue:876", "token:", userToken.value);
formatAppLog("log", "at pages/Chat/Chat.vue:938", "token:", userToken.value);
UserConversations.value = await getUserConversations(userToken.value) || [];
const savedSessionId = getCurrentSessionId();
if (savedSessionId && UserConversations.value.some((c) => c._id === savedSessionId)) {
@@ -6032,7 +6089,7 @@ This will fail in production.`);
} else {
currentSessionId.value = "";
}
formatAppLog("log", "at pages/Chat/Chat.vue:888", "保存会话id", currentSessionId.value);
formatAppLog("log", "at pages/Chat/Chat.vue:950", "保存会话id", currentSessionId.value);
uni.setStorageSync("currentSessionId", currentSessionId.value);
} catch (error) {
uni.showToast({
@@ -6044,17 +6101,17 @@ This will fail in production.`);
const FriendInfoList = vue.ref([]);
const takeFriendList = async () => {
try {
formatAppLog("log", "at pages/Chat/Chat.vue:903", "开始获取好友列表");
formatAppLog("log", "at pages/Chat/Chat.vue:965", "开始获取好友列表");
const friendList = await getChatFriend(UserId.value);
formatAppLog("log", "at pages/Chat/Chat.vue:906", "friendList:", friendList);
formatAppLog("log", "at pages/Chat/Chat.vue:968", "friendList:", friendList);
if (friendList && friendList.length) {
FriendInfoList.value = await takeUserAvatar(friendList);
} else {
FriendInfoList.value = [];
formatAppLog("log", "at pages/Chat/Chat.vue:911", "好友列表为空");
formatAppLog("log", "at pages/Chat/Chat.vue:973", "好友列表为空");
}
} catch (error) {
formatAppLog("error", "at pages/Chat/Chat.vue:914", "获取好友列表失败:", error);
formatAppLog("error", "at pages/Chat/Chat.vue:976", "获取好友列表失败:", error);
FriendInfoList.value = [];
} finally {
UserConversations.value = FriendInfoList.value;
@@ -6081,17 +6138,17 @@ This will fail in production.`);
};
});
} catch (err) {
formatAppLog("error", "at pages/Chat/Chat.vue:944", "获取好友头像失败", err);
formatAppLog("error", "at pages/Chat/Chat.vue:1006", "获取好友头像失败", err);
return friendList;
}
};
const GroupList = vue.ref([]);
const takeGroupList = async () => {
try {
formatAppLog("log", "at pages/Chat/Chat.vue:954", "开始获取群聊列表");
formatAppLog("log", "at pages/Chat/Chat.vue:1016", "开始获取群聊列表");
GroupList.value = await getGroup(UserId.value);
} catch (error) {
formatAppLog("error", "at pages/Chat/Chat.vue:959", "获取群聊列表失败:", error);
formatAppLog("error", "at pages/Chat/Chat.vue:1021", "获取群聊列表失败:", error);
GroupList.value = [];
} finally {
UserConversations.value = GroupList.value;
@@ -6103,22 +6160,22 @@ This will fail in production.`);
return [];
try {
const memberIds = memberList.map((item) => item.groupContactId);
formatAppLog("log", "at pages/Chat/Chat.vue:973", "请求头像的ID列表:", memberIds);
formatAppLog("log", "at pages/Chat/Chat.vue:1035", "请求头像的ID列表:", memberIds);
const memberAvatarList = await getUserAvatar(userToken.value, memberIds);
formatAppLog("log", "at pages/Chat/Chat.vue:975", "头像接口返回数据:", memberAvatarList);
formatAppLog("log", "at pages/Chat/Chat.vue:1037", "头像接口返回数据:", memberAvatarList);
const userMap = new Map(memberAvatarList.map((user) => [user.user_id, user]) || []);
formatAppLog("log", "at pages/Chat/Chat.vue:978", "userMap的keys:", Array.from(userMap.keys()));
formatAppLog("log", "at pages/Chat/Chat.vue:1040", "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:983", `查找 ${memberId} 的头像:`, userInfo);
formatAppLog("log", "at pages/Chat/Chat.vue:1045", `查找 ${memberId} 的头像:`, userInfo);
return {
...member,
avatar: (userInfo == null ? void 0 : userInfo.avatar) || null
};
});
} catch (err) {
formatAppLog("error", "at pages/Chat/Chat.vue:990", "获取群成员头像失败", err);
formatAppLog("error", "at pages/Chat/Chat.vue:1052", "获取群成员头像失败", err);
return memberList;
}
};
@@ -6138,7 +6195,6 @@ This will fail in production.`);
const takeConversationMessages = async () => {
try {
allmessages.value = await getConversationMessages(userToken.value, currentSessionId.value) || [];
formatAppLog("log", "at pages/Chat/Chat.vue:1021", "获取到的所有消息:", JSON.stringify(allmessages.value));
scrollToBottom();
} catch (error) {
uni.showToast({
@@ -6150,7 +6206,7 @@ This will fail in production.`);
const takeFriendMessages = async () => {
try {
allmessages.value = await getFriendMessages(currentSessionId.value) || [];
formatAppLog("log", "at pages/Chat/Chat.vue:1035", "好友消息:", JSON.stringify(allmessages.value));
formatAppLog("log", "at pages/Chat/Chat.vue:1097", "好友消息:", JSON.stringify(allmessages.value));
scrollToBottom();
} catch (error) {
uni.showToast({
@@ -6162,12 +6218,12 @@ This will fail in production.`);
const takeGroupMessages = async () => {
try {
allmessages.value = await getGroupMessages(currentSessionId.value) || [];
formatAppLog("log", "at pages/Chat/Chat.vue:1048", "群聊消息:", allmessages.value);
formatAppLog("log", "at pages/Chat/Chat.vue:1110", "群聊消息:", allmessages.value);
const memberList = await getGroupMemberList(currentSessionId.value);
formatAppLog("log", "at pages/Chat/Chat.vue:1051", "获取到的群成员列表:", memberList);
formatAppLog("log", "at pages/Chat/Chat.vue:1113", "获取到的群成员列表:", memberList);
if (memberList && memberList.length) {
groupMemberList.value = await takeGroupMemberAvatar(memberList);
formatAppLog("log", "at pages/Chat/Chat.vue:1054", "群成员列表(带头像):", groupMemberList.value);
formatAppLog("log", "at pages/Chat/Chat.vue:1116", "群成员列表(带头像):", groupMemberList.value);
} else {
groupMemberList.value = [];
}
@@ -6180,7 +6236,7 @@ This will fail in production.`);
}
};
const loadMoreMessages = async () => {
formatAppLog("log", "at pages/Chat/Chat.vue:1069", "加载更多信息");
formatAppLog("log", "at pages/Chat/Chat.vue:1131", "加载更多信息");
if (allmessages.value.length > pageInfoNumber * currentPage.value) {
currentPage.value += 1;
const newMessages = allmessages.value.slice(-pageInfoNumber * currentPage.value);
@@ -6199,9 +6255,9 @@ This will fail in production.`);
}
};
vue.watch(() => friendSocketStore.MessageReceived, (newId) => {
formatAppLog("log", "at pages/Chat/Chat.vue:1097", "收到了好友消息");
formatAppLog("log", "at pages/Chat/Chat.vue:1159", "收到了好友消息");
if (newId) {
formatAppLog("log", "at pages/Chat/Chat.vue:1099", "ChatType:", ChatType.value);
formatAppLog("log", "at pages/Chat/Chat.vue:1161", "ChatType:", ChatType.value);
switch (ChatType.value) {
case 0:
takeConversationMessages();
@@ -6216,7 +6272,7 @@ This will fail in production.`);
friendSocketStore.MessageReceived = false;
break;
default:
formatAppLog("log", "at pages/Chat/Chat.vue:1115", "default 分支");
formatAppLog("log", "at pages/Chat/Chat.vue:1177", "default 分支");
friendSocketStore.MessageReceived = false;
break;
}
@@ -6230,6 +6286,8 @@ This will fail in production.`);
switch (ChatType.value) {
case 0:
takeConversationMessages();
socketStore.disconnect();
handleConnect();
break;
case 1:
takeFriendMessages();
@@ -6260,6 +6318,9 @@ This will fail in production.`);
if (currentSessionId.value) {
takeConversationMessages();
}
if (userToken.value && currentSessionId.value && !socketStore.isConnected) {
handleConnect();
}
} else if (chatType === 1) {
await takeFriendList();
takeFriendMessages();
@@ -6270,12 +6331,17 @@ This will fail in production.`);
await takeGroupMessages();
}
});
const __returned__ = { friendSocketStore, handleFriendConnect, socketStore, ChatType, convertMarkdownTable, renderTable, pareseMarkdown, sanitizeContent, previewImage, openFile, formatFileSize, parseFileInfo, selectNormalChat, showNewChatModal, closeNewChatModal, isChatSidebar, handleChatSidebar, goWorkSpace, goCloudDatabase, logOut, previewFileArray, uploadPhoto, deleteImage, fileList, uploadFile, handleConnect, isThinking, isUploading, uploadedFiles, sendMessage, sendFriendMessage, sendGroupMessage, get aiResponseTimer() {
onUnload(() => {
socketStore.disconnect();
});
const __returned__ = { friendSocketStore, handleFriendConnect, socketStore, ChatType, convertMarkdownTable, renderTable, pareseMarkdown, sanitizeContent, previewImage, openFile, formatFileSize, parseFileInfo, selectNormalChat, showNewChatModal, closeNewChatModal, isChatSidebar, handleChatSidebar, goWorkSpace, goCloudDatabase, logOut, previewFileArray, uploadPhoto, deleteImage, fileList, uploadFile, handleConnect, isThinking, isSelfSent, isUploading, uploadedFiles, showMessageModal, detailMessageContent, showMessageDetail, closeMessageDetail, sendMessage, sendFriendMessage, sendGroupMessage, get aiResponseTimer() {
return aiResponseTimer;
}, set aiResponseTimer(v) {
aiResponseTimer = v;
}, sendAIMessage, textMessage, UserConversations, currentSessionId, userToken, UserId, UserAvatar, UserData, takeUserInfo, takeUserConversations, FriendInfoList, takeFriendList, takeTalkUserAvatar, takeUserAvatar, GroupList, takeGroupList, groupMemberList, takeGroupMemberAvatar, getGroupMemberAvatarById, allmessages, pageInfoNumber, scrollToView, isLoadingMore, currentPage, currentMessages, takeConversationMessages, takeFriendMessages, takeGroupMessages, loadMoreMessages, onScroll, scrollToBottom, computed: vue.computed, getCurrentInstance: vue.getCurrentInstance, nextTick: vue.nextTick, onMounted: vue.onMounted, ref: vue.ref, watch: vue.watch, get onShow() {
}, sendAIMessage, stopConversation, textMessage, UserConversations, currentSessionId, userToken, UserId, UserAvatar, UserData, takeUserInfo, takeUserConversations, FriendInfoList, takeFriendList, takeTalkUserAvatar, takeUserAvatar, GroupList, takeGroupList, groupMemberList, takeGroupMemberAvatar, getGroupMemberAvatarById, allmessages, pageInfoNumber, scrollToView, isLoadingMore, currentPage, currentMessages, takeConversationMessages, takeFriendMessages, takeGroupMessages, loadMoreMessages, onScroll, scrollToBottom, computed: vue.computed, getCurrentInstance: vue.getCurrentInstance, nextTick: vue.nextTick, onMounted: vue.onMounted, ref: vue.ref, watch: vue.watch, get onShow() {
return onShow;
}, get onUnload() {
return onUnload;
}, ChatSidebar, get getUserConversations() {
return getUserConversations;
}, get getConversationMessages() {
@@ -6398,23 +6464,59 @@ This will fail in production.`);
])
])
])) : vue.createCommentVNode("v-if", true),
$setup.isThinking ? (vue.openBlock(), vue.createElementBlock("view", {
$setup.isThinking && $setup.isSelfSent ? (vue.openBlock(), vue.createElementBlock("view", {
key: 1,
class: "ncd-overlay",
onClick: $setup.closeNewChatModal
onClick: _cache[1] || (_cache[1] = vue.withModifiers(() => {
}, ["stop"]))
}, [
vue.createElementVNode("view", {
class: "ncd-card ai-card",
onClick: _cache[1] || (_cache[1] = vue.withModifiers(() => {
}, ["stop"]))
}, [
vue.createElementVNode("view", { class: "ncd-card ai-card" }, [
vue.createElementVNode("view", { class: "thinking-content" }, [
vue.createElementVNode("view", { class: "loading-dots" }, [
vue.createElementVNode("view", { class: "dot" }),
vue.createElementVNode("view", { class: "dot" }),
vue.createElementVNode("view", { class: "dot" })
]),
vue.createElementVNode("text", { class: "thinking-text" }, "AI 正在思考中...")
vue.createElementVNode("text", { class: "thinking-text" }, "AI 正在思考中..."),
vue.createElementVNode("view", {
class: "stop-thinking-btn",
onClick: $setup.stopConversation
}, [
vue.createElementVNode("text", null, "⏹ 中断对话")
])
])
])
])) : vue.createCommentVNode("v-if", true),
$setup.showMessageModal ? (vue.openBlock(), vue.createElementBlock("view", {
key: 2,
class: "ncd-overlay",
onClick: $setup.closeMessageDetail
}, [
vue.createElementVNode("view", {
class: "ncd-card message-detail-card",
onClick: _cache[2] || (_cache[2] = vue.withModifiers(() => {
}, ["stop"]))
}, [
vue.createElementVNode("view", { class: "ncd-header" }, [
vue.createElementVNode("text", { class: "ncd-title-zh" }, "消息详情"),
vue.createVNode(_component_uni_icons, {
type: "closeempty",
color: "#ff0000",
size: "24",
onClick: $setup.closeMessageDetail
})
]),
vue.createElementVNode("scroll-view", {
class: "message-detail-content",
"scroll-y": ""
}, [
vue.createElementVNode(
"text",
null,
vue.toDisplayString($setup.detailMessageContent),
1
/* TEXT */
)
])
])
])) : vue.createCommentVNode("v-if", true),
@@ -6433,11 +6535,11 @@ This will fail in production.`);
vue.createVNode($setup["ChatSidebar"], {
chatList: $setup.UserConversations,
showNewChatModal: $setup.showNewChatModal,
"onUpdate:showNewChatModal": _cache[2] || (_cache[2] = ($event) => $setup.showNewChatModal = $event),
"onUpdate:showNewChatModal": _cache[3] || (_cache[3] = ($event) => $setup.showNewChatModal = $event),
currentSessionId: $setup.currentSessionId,
"onUpdate:currentSessionId": _cache[3] || (_cache[3] = ($event) => $setup.currentSessionId = $event),
"onUpdate:currentSessionId": _cache[4] || (_cache[4] = ($event) => $setup.currentSessionId = $event),
chatType: $setup.ChatType,
"onUpdate:chatType": _cache[4] || (_cache[4] = ($event) => $setup.ChatType = $event),
"onUpdate:chatType": _cache[5] || (_cache[5] = ($event) => $setup.ChatType = $event),
onRefreshConversations: $setup.takeUserConversations
}, null, 8, ["chatList", "showNewChatModal", "currentSessionId", "chatType"])
],
@@ -6518,66 +6620,61 @@ This will fail in production.`);
2
/* CLASS */
)) : vue.createCommentVNode("v-if", true),
message.content && String(message.content).trim() !== "" ? (vue.openBlock(), vue.createElementBlock(
"view",
{
message.content && String(message.content).trim() !== "" ? (vue.openBlock(), vue.createElementBlock("view", {
key: 1,
class: vue.normalizeClass(["chat-content", { "chat-content-user": message.role === "user" }]),
onClick: ($event) => $setup.showMessageDetail(message)
}, [
$setup.parseFileInfo(message.content).textContent ? (vue.openBlock(), vue.createElementBlock("view", {
key: 0,
innerHTML: $setup.pareseMarkdown($setup.parseFileInfo(message.content).textContent)
}, null, 8, ["innerHTML"])) : vue.createCommentVNode("v-if", true),
$setup.parseFileInfo(message.content).files.length > 0 ? (vue.openBlock(), vue.createElementBlock("view", {
key: 1,
class: vue.normalizeClass(["chat-content", { "chat-content-user": message.role === "user" }])
},
[
$setup.parseFileInfo(message.content).textContent ? (vue.openBlock(), vue.createElementBlock("view", {
key: 0,
innerHTML: $setup.pareseMarkdown($setup.parseFileInfo(message.content).textContent)
}, null, 8, ["innerHTML"])) : vue.createCommentVNode("v-if", true),
$setup.parseFileInfo(message.content).files.length > 0 ? (vue.openBlock(), vue.createElementBlock("view", {
key: 1,
class: "message-file-list"
}, [
(vue.openBlock(true), vue.createElementBlock(
vue.Fragment,
null,
vue.renderList($setup.parseFileInfo(message.content).files, (file, idx) => {
return vue.openBlock(), vue.createElementBlock("view", {
key: idx,
class: "file-item"
class: "message-file-list"
}, [
(vue.openBlock(true), vue.createElementBlock(
vue.Fragment,
null,
vue.renderList($setup.parseFileInfo(message.content).files, (file, idx) => {
return vue.openBlock(), vue.createElementBlock("view", {
key: idx,
class: "file-item"
}, [
["jpg", "jpeg", "png", "gif", "webp", "bmp"].includes(file.extendName.toLowerCase()) ? (vue.openBlock(), vue.createElementBlock("image", {
key: 0,
src: file.url,
mode: "widthFix",
class: "message-image",
onClick: ($event) => $setup.previewImage(file.url)
}, null, 8, ["src", "onClick"])) : (vue.openBlock(), vue.createElementBlock("view", {
key: 1,
class: "message-file",
onClick: ($event) => $setup.openFile(file.url)
}, [
["jpg", "jpeg", "png", "gif", "webp", "bmp"].includes(file.extendName.toLowerCase()) ? (vue.openBlock(), vue.createElementBlock("image", {
key: 0,
src: file.url,
mode: "widthFix",
class: "message-image",
onClick: ($event) => $setup.previewImage(file.url)
}, null, 8, ["src", "onClick"])) : (vue.openBlock(), vue.createElementBlock("view", {
key: 1,
class: "message-file",
onClick: ($event) => $setup.openFile(file.url)
}, [
vue.createElementVNode("view", { class: "file-icon" }, "📄"),
vue.createElementVNode(
"view",
{ class: "file-name" },
vue.toDisplayString(file.name),
1
/* TEXT */
),
vue.createElementVNode(
"view",
{ class: "file-size" },
vue.toDisplayString($setup.formatFileSize(file.fileSize)),
1
/* TEXT */
)
], 8, ["onClick"]))
]);
}),
128
/* KEYED_FRAGMENT */
))
])) : vue.createCommentVNode("v-if", true)
],
2
/* CLASS */
)) : vue.createCommentVNode("v-if", true)
vue.createElementVNode("view", { class: "file-icon" }, "📄"),
vue.createElementVNode(
"view",
{ class: "file-name" },
vue.toDisplayString(file.name),
1
/* TEXT */
),
vue.createElementVNode(
"view",
{ class: "file-size" },
vue.toDisplayString($setup.formatFileSize(file.fileSize)),
1
/* TEXT */
)
], 8, ["onClick"]))
]);
}),
128
/* KEYED_FRAGMENT */
))
])) : vue.createCommentVNode("v-if", true)
], 10, ["onClick"])) : vue.createCommentVNode("v-if", true)
], 10, ["id"])) : vue.createCommentVNode("v-if", true)
],
64
@@ -6784,79 +6881,100 @@ This will fail in production.`);
/* KEYED_FRAGMENT */
)) : vue.createCommentVNode("v-if", true)
], 40, ["scroll-into-view"]),
vue.createElementVNode("view", { class: "chat-interactive-container" }, [
vue.createElementVNode("view", { class: "chat-interactive-group" }, [
vue.createElementVNode("view", {
class: "chat-interactive-btn",
onClick: $setup.uploadPhoto
}, "拍照上传"),
vue.createElementVNode("view", {
class: "chat-interactive-btn",
onClick: _cache[5] || (_cache[5] = ($event) => $setup.uploadFile())
}, "上传文件")
]),
$setup.previewFileArray.length > 0 ? (vue.openBlock(), vue.createElementBlock("view", {
key: 0,
class: "image-list"
}, [
vue.createElementVNode(
"view",
{ class: "image-title" },
"已选择: (" + vue.toDisplayString($setup.previewFileArray.length) + ")",
1
/* TEXT */
),
vue.createElementVNode("view", { class: "image-grid" }, [
(vue.openBlock(true), vue.createElementBlock(
vue.Fragment,
null,
vue.renderList($setup.previewFileArray, (item, index) => {
return vue.openBlock(), vue.createElementBlock("view", {
class: "image-item",
key: index
}, [
vue.createElementVNode("view", { class: "image-info" }, [
vue.createElementVNode(
"view",
{
class: vue.normalizeClass(["chat-interactive-container", { "interactive-disabled": $setup.isThinking }])
},
[
vue.createElementVNode("view", { class: "chat-interactive-group" }, [
vue.createElementVNode(
"view",
{
class: vue.normalizeClass(["chat-interactive-btn", { disabled: $setup.isThinking }]),
onClick: _cache[6] || (_cache[6] = ($event) => !$setup.isThinking && $setup.uploadPhoto())
},
"拍照上传",
2
/* CLASS */
),
vue.createElementVNode(
"view",
{
class: vue.normalizeClass(["chat-interactive-btn", { disabled: $setup.isThinking }]),
onClick: _cache[7] || (_cache[7] = ($event) => !$setup.isThinking && $setup.uploadFile())
},
"上传文件",
2
/* CLASS */
)
]),
$setup.previewFileArray.length > 0 ? (vue.openBlock(), vue.createElementBlock("view", {
key: 0,
class: "image-list"
}, [
vue.createElementVNode("view", { class: "image-tags" }, [
(vue.openBlock(true), vue.createElementBlock(
vue.Fragment,
null,
vue.renderList($setup.previewFileArray, (item, index) => {
return vue.openBlock(), vue.createElementBlock("view", {
class: "image-tag",
key: index
}, [
vue.createElementVNode(
"text",
{ class: "image-name" },
{ class: "tag-name" },
vue.toDisplayString(item.name),
1
/* TEXT */
),
vue.createElementVNode("text", {
class: "delete-btn",
class: "tag-close",
onClick: vue.withModifiers(($event) => $setup.deleteImage(index), ["stop"])
}, "删除", 8, ["onClick"])
])
]);
}),
128
/* KEYED_FRAGMENT */
))
])
])) : vue.createCommentVNode("v-if", true),
vue.createElementVNode("view", { class: "chat-input-container" }, [
vue.withDirectives(vue.createElementVNode(
"textarea",
}, "×", 8, ["onClick"])
]);
}),
128
/* KEYED_FRAGMENT */
))
])
])) : vue.createCommentVNode("v-if", true),
vue.createElementVNode(
"view",
{
class: "message-input",
placeholder: "输入消息...",
onConfirm: $setup.sendMessage,
"confirm-type": "send",
"onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => $setup.textMessage = $event),
"auto-height": ""
class: vue.normalizeClass(["chat-input-container", { "input-disabled": $setup.isThinking }])
},
null,
544
/* NEED_HYDRATION, NEED_PATCH */
), [
[vue.vModelText, $setup.textMessage]
]),
vue.createElementVNode("view", { class: "input-btn-group" }, [
vue.createElementVNode("view", { class: "iconfont icon-tingzhi icon-btn" })
])
])
])
[
vue.withDirectives(vue.createElementVNode("textarea", {
class: "message-input",
placeholder: $setup.isThinking ? $setup.isSelfSent ? "AI 正在回复中..." : "电脑正在运行,请稍后" : "输入消息...",
disabled: $setup.isThinking,
"onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => $setup.textMessage = $event),
"auto-height": ""
}, null, 8, ["placeholder", "disabled"]), [
[vue.vModelText, $setup.textMessage]
]),
vue.createElementVNode(
"view",
{
class: vue.normalizeClass(["input-btn-group send-message-btn", { disabled: $setup.isThinking }]),
onClick: _cache[9] || (_cache[9] = ($event) => !$setup.isThinking && $setup.sendMessage())
},
[
vue.createElementVNode("view", { class: "iconfont icon-fasong" })
],
2
/* CLASS */
)
],
2
/* CLASS */
)
],
2
/* CLASS */
)
])
])
])
@@ -7281,14 +7399,14 @@ This will fail in production.`);
".wav": "icon-wenjianyinpin",
".flac": "icon-wenjianyinpin",
".aac": "icon-wenjianyinpin",
".pdf": "icon-PDF",
".doc": "icon-DOC",
".docx": "icon-DOC",
".xls": "icon-XLS",
".xlsx": "icon-XLS",
".ppt": "icon-PPT",
".pptx": "icon-PPT",
".txt": "icon-TXT",
".pdf": "icon-PDF1",
".doc": "icon-word",
".docx": "icon-word",
".xls": "icon-execl",
".xlsx": "icon-execl",
".ppt": "icon-PPT1",
".pptx": "icon-PPT1",
".txt": "icon-TXT1",
".md": "icon-file-markdown-fill",
".zip": "icon-wenjianyasuo",
".rar": "icon-wenjianyasuo",
@@ -7300,11 +7418,11 @@ This will fail in production.`);
".vue": "icon-daimawenjia",
".html": "icon-HTML",
".css": "icon-CSS",
".py": "icon-daimawenjian",
".java": "icon-daimawenjian",
".py": "icon-daima",
".java": "icon-daima",
".json": "icon-JSON"
};
return iconMap[ext == null ? void 0 : ext.toLowerCase()] || "icon-qitawenjian";
return iconMap[ext == null ? void 0 : ext.toLowerCase()] || "icon-qitalingyu";
};
const allFoldersData = vue.ref({});
const folderStack = vue.ref([]);

View File

@@ -28,9 +28,9 @@
/*每个页面公共css */
@font-face {
font-family: "iconfont"; /* Project id 4890805 */
src: url('static/iconfont/iconfont.woff2?t=1782200893170') format('woff2'),
url('static/iconfont/iconfont.woff?t=1782200893170') format('woff'),
url('static/iconfont/iconfont.ttf?t=1782200893170') format('truetype');
src: url('static/iconfont/iconfont.woff2?t=1783330740989') format('woff2'),
url('static/iconfont/iconfont.woff?t=1783330740989') format('woff'),
url('static/iconfont/iconfont.ttf?t=1783330740989') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
@@ -39,6 +39,33 @@
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-daima:before {
content: "\e695";
}
.icon-word:before {
content: "\e64c";
}
.icon-qitalingyu:before {
content: "\e62f";
}
.icon-wenjianjia1:before {
content: "\e63a";
}
.icon-execl:before {
content: "\e64d";
}
.icon-TXT1:before {
content: "\e64e";
}
.icon-PPT1:before {
content: "\e64f";
}
.icon-ZIP:before {
content: "\e650";
}
.icon-PDF1:before {
content: "\e651";
}
.icon-cloud:before {
content: "\e988";
}
@@ -220,49 +247,68 @@
.status-bar {
height: var(--status-bar-height);
width: 100%;
background: linear-gradient(180deg, #fafbff 0%, #f5f6fa 100%);
}
.page-container {
width: 100%;
height: calc(100vh - var(--status-bar-height));
background: linear-gradient(180deg, #f0f2ff 0%, #f5f6fa 40%, #fafbfc 100%);
}
.solid-line {
width: 100%;
border-bottom: 0.03125rem solid #999;
height: 0.03125rem;
background: linear-gradient(90deg, transparent, #d4d4f0, transparent);
}
.icon-btn {
padding: 0.3125rem;
border-radius: 0.625rem;
padding: 0.375rem;
border-radius: 0.5rem;
box-sizing: border-box;
display: flex;
justify-content: center;
align-items: center;
transition: all 0.2s ease;
}
.icon-btn:active {
background: rgba(170, 170, 255, 0.12);
transform: scale(0.95);
}
.text-btn {
padding: 0.3125rem;
padding: 0.375rem 0.625rem;
border-radius: 0.625rem;
box-sizing: border-box;
display: flex;
justify-content: center;
align-items: center;
transition: all 0.2s ease;
font-size: 0.8125rem;
font-weight: 500;
}
.text-btn:active {
opacity: 0.8;
transform: scale(0.97);
}
.switch-box {
width: 42px;
height: 20px;
background-color: #999;
border-radius: 10px;
width: 48px;
height: 26px;
background-color: #d4d4d8;
border-radius: 13px;
display: flex;
align-items: center;
padding: 1px;
padding: 2px;
transition: all 0.3s ease;
}
.switch-box.active {
justify-content: flex-end;
background-color: #00aaff;
background: linear-gradient(135deg, #aaaaff, #3b86ff);
box-shadow: 0 0 0.375rem rgba(170, 170, 255, 0.4);
}
.switch-track {
width: 20px;
height: 20px;
width: 22px;
height: 22px;
background-color: #ffffff;
border-radius: 50%;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15);
transition: all 0.3s ease;
}
.popup-overlay {
position: fixed;
@@ -273,31 +319,68 @@
display: flex;
align-items: center;
justify-content: center;
background-color: rgba(193, 193, 193, 0.4);
background-color: rgba(30, 30, 50, 0.35);
backdrop-filter: blur(6px);
-webkit-backdrop-filter: blur(6px);
z-index: 1000;
animation: fadeIn 0.25s ease;
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes slideUp {
from {
opacity: 0;
transform: translateY(1.25rem) scale(0.96);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.popup-card {
width: 90%;
height: auto;
background-color: #ffffff;
border-radius: 1.5625rem;
padding: 1.5625rem;
border-radius: 1.25rem;
padding: 1.5rem 1.25rem;
box-sizing: border-box;
display: flex;
flex-direction: column;
position: relative;
box-shadow: 0 0.625rem 1.875rem rgba(0, 0, 0, 0.08);
animation: slideUp 0.3s ease;
}
.close-popup-card {
position: absolute;
top: 0.3125rem;
right: 0.3125rem;
color: #ff0000;
top: 0.5rem;
right: 0.5rem;
color: #ff4d4f;
padding: 0.3125rem;
box-sizing: border-box;
width: 1.5rem;
height: 1.5rem;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
transition: all 0.2s ease;
}
.close-popup-card:active {
background: rgba(255, 77, 79, 0.1);
}
.popup-title {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
font-size: 1.0625rem;
font-weight: 600;
color: #1a1a2e;
margin-bottom: 0.75rem;
}

View File

@@ -8,7 +8,7 @@
"name": "test1",
"version": {
"name": "1.1.1",
"code": "1"
"code": 2
},
"description": "",
"developer": {

File diff suppressed because it is too large Load Diff

View File

@@ -536,12 +536,15 @@
flex-direction: column;
width: 100%;
height: 100vh;
background-color: #f5f6fa;
background: linear-gradient(180deg, #f0f2ff 0%, #f5f4f9 40%, #faf9fe 100%);
}
.cloud-db-header[data-v-51006ffb] {
flex-shrink: 0;
background-color: #ffffff;
background-color: rgba(255, 255, 255, 0.85);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
padding-bottom: 0;
border-bottom: 0.03125rem solid rgba(170, 170, 255, 0.1);
}
.custom-navbar[data-v-51006ffb] {
display: flex;
@@ -574,18 +577,18 @@
}
.navbar-before-title[data-v-51006ffb] {
font-size: 0.8125rem;
color: #3b86ff;
color: #6c63ff;
margin-left: 0.25rem;
}
.navbar-right-text[data-v-51006ffb] {
font-size: 0.875rem;
color: #3b86ff;
color: #6c63ff;
font-weight: 500;
}
/* 菜单 */
.menu-open[data-v-51006ffb] {
color: #3b86ff;
color: #6c63ff;
}
.menu-card[data-v-51006ffb] {
position: absolute;
@@ -633,7 +636,7 @@
transition: color 0.3s;
}
.category-tab.active[data-v-51006ffb] {
color: #3b86ff;
color: #6c63ff;
font-weight: 600;
}
.category-tab.active[data-v-51006ffb]::after {
@@ -644,7 +647,7 @@
transform: translateX(-50%);
width: 1.5rem;
height: 0.1875rem;
background: #3b86ff;
background: linear-gradient(90deg, #6c63ff, #aaaaff);
border-radius: 0.09375rem;
}
@@ -680,7 +683,7 @@
}
.section-title .iconfont[data-v-51006ffb] {
font-size: 1.125rem;
color: #3b86ff;
color: #6c63ff;
}
.section-actions[data-v-51006ffb] {
display: flex;
@@ -692,11 +695,15 @@
align-items: center;
gap: 0.1875rem;
padding: 0.3125rem 0.625rem;
background: rgba(59, 134, 255, 0.08);
color: #3b86ff;
border-radius: 0.9375rem;
background: rgba(108, 99, 255, 0.06);
color: #6c63ff;
border-radius: 0.625rem;
font-size: 0.75rem;
font-weight: 500;
transition: all 0.15s ease;
}
.action-btn[data-v-51006ffb]:active {
background: rgba(108, 99, 255, 0.12);
}
.section-divider[data-v-51006ffb] {
height: 0.0625rem;
@@ -738,8 +745,8 @@
box-sizing: border-box;
}
.file-item[data-v-51006ffb]:active {
border-color: #3b86ff;
background: rgba(59, 134, 255, 0.04);
border-color: #6c63ff;
background: rgba(108, 99, 255, 0.04);
}
.file-icon[data-v-51006ffb] {
width: 2.5rem;
@@ -758,11 +765,11 @@
color: #ffa500;
}
.file-icon.is-file[data-v-51006ffb] {
background: rgba(59, 134, 255, 0.1);
background: rgba(108, 99, 255, 0.1);
}
.file-icon.is-file .iconfont[data-v-51006ffb] {
font-size: 1.375rem;
color: #3b86ff;
color: #6c63ff;
}
.file-name[data-v-51006ffb] {
font-size: 0.75rem;
@@ -807,8 +814,8 @@
transition: all 0.2s;
}
.table-item[data-v-51006ffb]:active {
border-color: #3b86ff;
background: rgba(59, 134, 255, 0.03);
border-color: #6c63ff;
background: rgba(108, 99, 255, 0.03);
}
.table-icon[data-v-51006ffb] {
width: 2rem;
@@ -816,7 +823,7 @@
display: flex;
align-items: center;
justify-content: center;
background: rgba(59, 134, 255, 0.08);
background: rgba(108, 99, 255, 0.08);
border-radius: 0.4375rem;
margin-right: 0.625rem;
flex-shrink: 0;
@@ -875,7 +882,7 @@
}
.team-chip.active[data-v-51006ffb] {
color: #fff;
background: #3b86ff;
background: #6c63ff;
font-weight: 500;
}
.team-info[data-v-51006ffb] {
@@ -887,8 +894,8 @@
}
.team-type-tag[data-v-51006ffb] {
font-size: 0.6875rem;
color: #3b86ff;
background: rgba(59, 134, 255, 0.1);
color: #6c63ff;
background: rgba(108, 99, 255, 0.1);
padding: 0.1875rem 0.5rem;
border-radius: 0.25rem;
font-weight: 500;
@@ -968,7 +975,7 @@
background: #f9fafb;
}
.create-folder-name uni-input[data-v-51006ffb]:focus {
border-color: #3b86ff;
border-color: #6c63ff;
background: #fff;
}
.nf-path-label[data-v-51006ffb] {
@@ -978,8 +985,8 @@
}
.nf-path-display[data-v-51006ffb] {
font-size: 0.75rem;
color: #3b86ff;
background: rgba(59, 134, 255, 0.06);
color: #6c63ff;
background: rgba(108, 99, 255, 0.06);
padding: 0.375rem 0.5rem;
border-radius: 0.3125rem;
margin-bottom: 0.625rem;
@@ -1002,7 +1009,7 @@
}
.opt-confirm[data-v-51006ffb] {
color: #fff;
background: #3b86ff;
background: #6c63ff;
}
/* 团队管理弹窗 */
@@ -1071,8 +1078,8 @@
background: rgba(230, 162, 60, 0.1);
}
.member-role.admin[data-v-51006ffb] {
color: #3b86ff;
background: rgba(59, 134, 255, 0.1);
color: #6c63ff;
background: rgba(108, 99, 255, 0.1);
}
.member-role.member[data-v-51006ffb] {
color: #67c23a;
@@ -1088,8 +1095,8 @@
border-radius: 0.5rem;
}
.set-admin[data-v-51006ffb] {
color: #3b86ff;
border: 0.03125rem solid #3b86ff;
color: #6c63ff;
border: 0.03125rem solid #6c63ff;
}
.demote-admin[data-v-51006ffb] {
color: #e6a23c;
@@ -1119,7 +1126,7 @@
background: #f9fafb;
}
.invite-btn[data-v-51006ffb] {
background: #3b86ff;
background: #6c63ff;
color: #fff;
font-size: 0.75rem;
padding: 0.4375rem 1rem;
@@ -1142,7 +1149,7 @@
border-bottom: none;
}
.search-result-item[data-v-51006ffb]:active {
background: rgba(59, 134, 255, 0.05);
background: rgba(108, 99, 255, 0.05);
}
.result-avatar[data-v-51006ffb] {
width: 2rem;
@@ -1155,7 +1162,7 @@
width: 2rem;
height: 2rem;
border-radius: 50%;
background: linear-gradient(135deg, #3b86ff, #6db3ff);
background: linear-gradient(135deg, #6c63ff, #6db3ff);
display: flex;
align-items: center;
justify-content: center;
@@ -1184,9 +1191,9 @@
.result-add-btn[data-v-51006ffb] {
flex-shrink: 0;
font-size: 0.75rem;
color: #3b86ff;
color: #6c63ff;
padding: 0.3125rem 0.75rem;
border: 0.03125rem solid #3b86ff;
border: 0.03125rem solid #6c63ff;
border-radius: 0.625rem;
}
.search-empty[data-v-51006ffb] {
@@ -1240,13 +1247,13 @@
text-align: center;
padding: 0.5625rem;
font-size: 0.8125rem;
color: #3b86ff;
background: rgba(59, 134, 255, 0.06);
color: #6c63ff;
background: rgba(108, 99, 255, 0.06);
border-radius: 0.4375rem;
border: 0.03125rem solid rgba(59, 134, 255, 0.2);
border: 0.03125rem solid rgba(108, 99, 255, 0.2);
}
.edit-team-btn[data-v-51006ffb]:active {
background: rgba(59, 134, 255, 0.12);
background: rgba(108, 99, 255, 0.12);
}
.edit-team-form[data-v-51006ffb] {
margin-bottom: 0.3125rem;
@@ -1290,7 +1297,7 @@
width: 1.75rem;
height: 1.75rem;
border: 0.125rem solid #e8e8e8;
border-top-color: #3b86ff;
border-top-color: #6c63ff;
border-radius: 50%;
animation: spin-51006ffb 0.8s linear infinite;
}
@@ -1315,9 +1322,9 @@ to {
vertical-align: middle;
}
.db-tag.tag-personal[data-v-51006ffb] {
color: #3b86ff;
background: rgba(59, 134, 255, 0.08);
border: 0.03125rem solid rgba(59, 134, 255, 0.2);
color: #6c63ff;
background: rgba(108, 99, 255, 0.08);
border: 0.03125rem solid rgba(108, 99, 255, 0.2);
}
.db-tag.tag-team[data-v-51006ffb] {
color: #67c23a;
@@ -1341,12 +1348,12 @@ to {
margin-bottom: 0.625rem;
}
.upload-file-area[data-v-51006ffb]:active {
border-color: #3b86ff;
background: rgba(59, 134, 255, 0.03);
border-color: #6c63ff;
background: rgba(108, 99, 255, 0.03);
}
.selected-file[data-v-51006ffb] {
font-size: 0.8125rem;
color: #3b86ff;
color: #6c63ff;
font-weight: 500;
word-break: break-all;
}

View File

@@ -533,13 +533,13 @@
/* ========== 通用 ========== */
.status-bar[data-v-96fa4671] {
height: var(--status-bar-height);
background-color: #ffffff;
background: linear-gradient(180deg, #fafbff 0%, #f5f6fa 100%);
}
.page-container[data-v-96fa4671] {
display: flex;
flex-direction: column;
height: 100vh;
background-color: #f5f6fa;
background: linear-gradient(180deg, #f0f2ff 0%, #f5f4f9 40%, #faf9fe 100%);
}
/* ========== 导航栏 ========== */
.cloud-db-header[data-v-96fa4671] {

View File

@@ -533,10 +533,11 @@
.tabbar-page[data-v-976117c3] {
display: flex;
flex-direction: column;
background: linear-gradient(180deg, #f5f4f9 0%, #faf9fe 100%);
}
.content-swiper[data-v-976117c3] {
width: 100%;
height: calc(100% - 3.125rem);
height: calc(100% - 3.75rem);
}
.tabpage-content[data-v-976117c3] {
display: flex;
@@ -556,13 +557,22 @@
display: flex;
align-items: center;
flex-shrink: 0;
padding: 0.625rem 0.75rem;
box-sizing: border-box;
background: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border-bottom: 0.03125rem solid rgba(170, 170, 255, 0.1);
}
.tabpage-header .iconfont[data-v-976117c3] {
font-size: 1.5625rem;
margin-right: 0.3125rem;
font-size: 1.4375rem;
margin-right: 0.375rem;
color: #6c63ff;
}
.tabpage-title[data-v-976117c3] {
font-size: 1.25rem;
font-size: 1.125rem;
font-weight: 700;
color: #1a1a2e;
}
.tabpage-body[data-v-976117c3] {
width: 100%;
@@ -571,7 +581,7 @@
min-height: 0;
align-items: center;
flex-direction: column;
padding: 0.625rem;
padding: 0.75rem;
box-sizing: border-box;
}
@@ -595,10 +605,17 @@
.group-name .input[data-v-976117c3] {
width: 100%;
height: auto;
padding: 0.625rem;
padding: 0.6875rem 0.875rem;
box-sizing: border-box;
border: 0.03125rem solid #007aff;
border-radius: 0.9375rem;
border: 0.0625rem solid #d4d4f0;
border-radius: 0.75rem;
font-size: 0.875rem;
background: #fff;
transition: all 0.2s ease;
}
.group-name .input[data-v-976117c3]:focus {
border-color: #6c63ff;
box-shadow: 0 0 0 0.125rem rgba(108, 99, 255, 0.06);
}
.group-member-wrapper[data-v-976117c3] {
width: 100%;
@@ -606,49 +623,57 @@
flex-direction: column;
justify-content: center;
align-items: center;
padding: 0.625rem;
padding: 0.75rem;
box-sizing: border-box;
background-color: rgba(16, 185, 129, .05);
border: 0.03125rem solid rgba(16, 185, 129, .2);
border-radius: 0.9375rem;
margin: 0.3125rem 0;
background: rgba(16, 185, 129, .04);
border: 0.0625rem solid rgba(16, 185, 129, .15);
border-radius: 0.75rem;
margin: 0.375rem 0;
}
.group-member-wrapper .member-title[data-v-976117c3] {
color: #059669;
font-weight: bold;
font-weight: 600;
font-size: 0.875rem;
}
.group-ismember-list[data-v-976117c3] {
display: flex;
flex-wrap: wrap;
margin-top: 0.3125rem;
margin-top: 0.375rem;
box-sizing: border-box;
max-height: 6.25rem;
overflow-y: auto;
}
.group-ismember-info[data-v-976117c3] {
padding: 0.3125rem 0.5rem;
padding: 0.3125rem 0.625rem;
box-sizing: border-box;
border: 0.03125rem solid rgba(16, 185, 129, 0.8);
background-color: #fff;
border-radius: 0.9375rem;
margin: 0.15625rem 0.3125rem;
border: 0.0625rem solid rgba(16, 185, 129, 0.5);
background: #fff;
border-radius: 0.75rem;
margin: 0.1875rem 0.25rem;
}
.group-ismember-name[data-v-976117c3] {
font-size: 0.6875rem;
color: #059669;
font-weight: 500;
}
.create-group-btn[data-v-976117c3] {
width: 100%;
background: #007aff;
border-radius: 0.9375rem;
padding: 0.625rem;
background: linear-gradient(135deg, #6c63ff, #4a45d1);
border-radius: 0.75rem;
padding: 0.75rem;
box-sizing: border-box;
font-weight: bold;
font-weight: 600;
color: #fff;
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 0.3125rem;
font-size: 0.9375rem;
box-shadow: 0 0.125rem 0.5rem rgba(108, 99, 255, 0.25);
transition: all 0.2s ease;
}
.create-group-btn[data-v-976117c3]:active {
transform: scale(0.97);
}
.group-member[data-v-976117c3] {
display: flex;
@@ -664,31 +689,39 @@
flex-direction: column;
justify-content: center;
align-items: flex-start;
width: 100%;
}
.friend-card[data-v-976117c3] {
display: flex;
justify-content: flex-start;
align-items: center;
width: 100%;
padding: 0.625rem;
margin: 0.3125rem 0;
padding: 0.75rem;
margin: 0.25rem 0;
box-sizing: border-box;
border: 0.03125rem solid #aaaaff;
border-radius: 0.9375rem;
border: 0.0625rem solid rgba(170, 170, 255, 0.25);
border-radius: 0.75rem;
background: rgba(255, 255, 255, 0.7);
transition: all 0.2s ease;
}
.friend-card[data-v-976117c3]:active {
background: rgba(108, 99, 255, 0.04);
border-color: #6c63ff;
transform: scale(0.98);
}
.friend-card-left[data-v-976117c3] {
flex-shrink: 0;
margin-right: 0.3125rem;
margin-right: 0.5rem;
}
.friend-avatar[data-v-976117c3] {
display: flex;
justify-content: center;
align-items: center;
border-radius: 50%;
width: 3.125rem;
height: 3.125rem;
border-radius: 50%;
width: 2.8125rem;
height: 2.8125rem;
overflow: hidden;
border: 0.09375rem solid rgba(170, 170, 255, 0.2);
}
.friend-card-middle[data-v-976117c3] {
flex: 1;
@@ -699,8 +732,9 @@
align-items: flex-start;
}
.friend-name[data-v-976117c3] {
font-weight: 500;
font-size: 1rem;
font-weight: 600;
font-size: 0.9375rem;
color: #1a1a2e;
}
.friend-card-right[data-v-976117c3] {
width: auto;
@@ -710,13 +744,18 @@
align-items: center;
}
.friend-checkbox[data-v-976117c3] {
width: 0.9375rem;
height: 0.9375rem;
width: 1.125rem;
height: 1.125rem;
border-radius: 0.3125rem;
display: flex;
justify-content: center;
align-items: center;
border: 0.03125rem solid #3b86ff;
border: 0.0625rem solid rgba(108, 99, 255, 0.5);
background: #fff;
}
.friend-checkbox.checked[data-v-976117c3] {
background: linear-gradient(135deg, #6c63ff, #4a45d1);
border-color: #6c63ff;
}
/* 添加好友 */
@@ -727,26 +766,27 @@
}
.search-warpper .search-file-input[data-v-976117c3] {
flex: 1;
background-color: #f9fafb;
border: 0.0625rem solid rgba(139, 195, 232, .2);
padding: 0.625rem;
margin-right: 0.625rem;
background: #ffffff;
border: 0.0625rem solid #e8e7f5;
padding: 0.6875rem 0.75rem;
margin-right: 0.5rem;
height: auto;
box-sizing: border-box;
border-radius: 0.9375rem;
border-radius: 0.75rem;
font-size: 0.875rem;
transition: all 0.25s ease;
}
.search-file-input.active[data-v-976117c3] {
background-color: #ffffff;
box-shadow: 0 0 0.46875rem #aaaaff;
border-color: #007aff;
border-color: #6c63ff;
box-shadow: 0 0 0 0.125rem rgba(108, 99, 255, 0.06);
}
.search-warpper .iconfont[data-v-976117c3] {
flex-shrink: 0;
font-size: 1.1875rem;
font-size: 1.125rem;
font-weight: bold;
color: #fff;
background-color: #007aff;
padding: 0.5625rem;
background: linear-gradient(135deg, #6c63ff, #4a45d1);
padding: 0.625rem;
box-sizing: border-box;
border-radius: 0.625rem;
}
@@ -754,10 +794,13 @@
width: 100%;
}
.add-btn[data-v-976117c3] {
background: #3b86ff;
background: linear-gradient(135deg, #6c63ff, #4a45d1);
color: #fff;
font-size: 14px;
font-weight: 500;
border-radius: 0.625rem;
padding: 0.375rem 0.875rem;
box-shadow: 0 0.0625rem 0.25rem rgba(108, 99, 255, 0.25);
}
/* 添加好友卡片 */
@@ -773,19 +816,24 @@
.input-nickname[data-v-976117c3] {
width: 100%;
height: auto;
padding: 0.625rem;
padding: 0.6875rem 0.75rem;
box-sizing: border-box;
border: 0.03125rem solid #007aff;
border-radius: 0.9375rem;
border: 0.0625rem solid #d4d4f0;
border-radius: 0.75rem;
margin: 0.625rem 0;
box-sizing: border-box;
font-size: 0.875rem;
background: #fff;
}
.input-nickname[data-v-976117c3]:focus {
border-color: #6c63ff;
}
.confirm-btn[data-v-976117c3] {
background: #3b86ff;
background: linear-gradient(135deg, #6c63ff, #4a45d1);
color: #fff;
font-size: 16px;
font-weight: 500;
padding: 10px;
font-weight: 600;
padding: 0.4375rem 1.25rem;
border-radius: 0.75rem;
}
/* 视频会议 */
@@ -802,18 +850,27 @@
.input-meeting[data-v-976117c3] {
width: 100%;
height: auto;
padding: 0.625rem;
padding: 0.6875rem 0.75rem;
box-sizing: border-box;
border: 0.03125rem solid #007aff;
border-radius: 0.9375rem;
border: 0.0625rem solid #d4d4f0;
border-radius: 0.75rem;
margin: 0.3125rem 0;
box-sizing: border-box;
font-size: 0.875rem;
background: #fff;
}
.input-meeting[data-v-976117c3]:focus {
border-color: #6c63ff;
}
.meeting-btn[data-v-976117c3] {
width: 100%;
background: #007aff;
background: linear-gradient(135deg, #6c63ff, #4a45d1);
margin: 0.3125rem 0;
color: #fff;
border-radius: 0.75rem;
padding: 0.75rem;
font-size: 0.9375rem;
font-weight: 600;
box-shadow: 0 0.125rem 0.5rem rgba(108, 99, 255, 0.25);
}
.meeting-field[data-v-976117c3] {
width: 100%;
@@ -833,6 +890,7 @@
width: 100%;
display: flex;
justify-content: space-between;
padding: 0.5rem 0;
}
/* 好友申请 */
@@ -844,21 +902,26 @@
.agree-btn[data-v-976117c3] {
font-size: 14px;
font-weight: 500;
border: 1px solid #3b86ff;
color: #3b86ff;
border: 0.0625rem solid #6c63ff;
color: #6c63ff;
box-sizing: border-box;
border-radius: 0.625rem;
padding: 0.3125rem 0.75rem;
}
.agree-btn[data-v-976117c3]:active {
background: rgba(108, 99, 255, 0.08);
}
/* 好友申请状态 */
.friend-status[data-v-976117c3] {
font-size: 14px;
font-weight: 500;
padding: 0.25rem 0.625rem;
border-radius: 0.9375rem;
padding: 0.25rem 0.75rem;
border-radius: 0.625rem;
}
.friend-status.agreed[data-v-976117c3] {
color: #059669;
background-color: rgba(16, 185, 129, 0.1);
background-color: rgba(16, 185, 129, 0.08);
}
/* 通讯录 */
@@ -873,20 +936,34 @@
/* 底部导航 */
.bottom-tabbar[data-v-976117c3] {
width: 100%;
height: 4.375rem;
height: 4.0625rem;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.625rem;
padding: 0.5rem 0.9375rem;
box-sizing: border-box;
background: rgba(200, 200, 200, 0.1);
background: rgba(255, 255, 255, 0.85);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border-top: 0.03125rem solid rgba(170, 170, 255, 0.1);
}
.tab-item[data-v-976117c3] {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 0.25rem 0.625rem;
border-radius: 0.5rem;
transition: all 0.2s ease;
}
.tab-item.active[data-v-976117c3] {
background: rgba(108, 99, 255, 0.08);
}
.tab-label[data-v-976117c3] {
font-size: 0.875rem;
font-size: 0.8125rem;
color: #666;
}
.tab-item.active .tab-label[data-v-976117c3] {
color: #6c63ff;
font-weight: 600;
}

View File

@@ -1,22 +1,29 @@
.login-container[data-v-461d1d79] {
padding: 4.375rem 1.875rem 3.125rem 1.875rem;
padding: 3.75rem 1.5625rem 2.5rem 1.5625rem;
box-sizing: border-box;
display: flex;
flex-direction: column;
align-items: center;
background: linear-gradient(160deg, #f0f2ff 0%, #f5f3f8 30%, #faf9fe 60%, #f5f4ff 100%);
}
.login-card[data-v-461d1d79] {
position: relative;
flex: 1;
width: 100%;
height: 100%;
padding: 0.625rem;
max-width: 20rem;
padding: 1.5625rem 1.25rem;
box-sizing: border-box;
background: #ffffff;
background: rgba(255, 255, 255, 0.85);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border-radius: 1.25rem;
box-shadow: 0 0.5rem 1.5rem rgba(100, 100, 180, 0.1);
border: 0.03125rem solid rgba(170, 170, 255, 0.15);
}
.conner[data-v-461d1d79] {
position: absolute;
@@ -48,8 +55,6 @@
border-right: 2px solid #aaaaff;
}
.login-header[data-v-461d1d79] {
/* position: absolute;
top: 80rpx; */
display: flex;
justify-content: center;
align-items: center;
@@ -61,83 +66,104 @@
align-items: center;
}
.login-header-logo uni-text[data-v-461d1d79] {
margin-left: 0.25rem;
font-size: 1.875rem;
font-weight: bold;
color: #aaaaff;
text-shadow: 0 0 0.3125rem rgba(170, 170, 255, 0.4),
0 0 0.625rem rgba(170, 170, 255, 0.3);
margin-left: 0.375rem;
font-size: 1.75rem;
font-weight: 800;
color: #6c63ff;
letter-spacing: 0.0625rem;
}
.icon-wrapper[data-v-461d1d79] {
width: 2.8125rem;
height: 2.8125rem;
width: 3rem;
height: 3rem;
border-radius: 50%;
background-color: rgb(255, 255, 255);
background: linear-gradient(135deg, rgba(255, 255, 255, 0.9), rgba(240, 238, 255, 0.8));
display: flex;
align-items: center;
justify-content: center;
animation: glow-461d1d79 2s ease-in-out infinite;
animation: glow-461d1d79 2.5s ease-in-out infinite;
box-shadow: 0 0.125rem 0.5rem rgba(108, 99, 255, 0.12);
}
@keyframes glow-461d1d79 {
0%,
100% {
box-shadow: 0 0 0.625rem rgba(170, 170, 255, 0.3);
0%, 100% {
box-shadow: 0 0.125rem 0.5rem rgba(108, 99, 255, 0.12);
}
50% {
box-shadow: 0 0 0.625rem rgba(170, 170, 255, 0.4),
0 0 0.9375rem rgba(170, 170, 255, 0.3),
0 0 1.5625rem rgba(170, 170, 255, 0.2);
box-shadow: 0 0.125rem 0.75rem rgba(108, 99, 255, 0.25),
0 0 1.5625rem rgba(108, 99, 255, 0.12);
}
}
.icon-wrapper .danao-style[data-v-461d1d79] {
font-size: 2.1875rem;
color: #aaaaff;
font-size: 2rem;
color: #6c63ff;
}
.sub-title[data-v-461d1d79] {
margin-top: 0.625rem;
font-size: 1.125rem;
margin-top: 0.5rem;
font-size: 1rem;
font-weight: 500;
color: #666;
text-shadow: 0 0 0.3125rem #999;
color: #888;
letter-spacing: 0.03125rem;
}
.form-wrapper[data-v-461d1d79] {
margin-top: 1.5625rem;
width: 15.625rem;
padding: 2.5rem 0.9375rem;
background-color: rgba(170, 170, 255, 0.05);
border-radius: 0.625rem;
/* border: 1rpx solid #aaaaff; */
box-shadow: 0 0 0.3125rem rgba(170, 170, 255, 0.5);
width: 100%;
max-width: 15.625rem;
padding: 1.875rem 1.125rem 1.125rem;
background: rgba(170, 170, 255, 0.04);
border-radius: 0.875rem;
border: 0.03125rem solid rgba(170, 170, 255, 0.1);
display: flex;
flex-direction: column;
}
.form-item[data-v-461d1d79] {
margin-top: 0.625rem;
}
.form-label[data-v-461d1d79] {
font-size: 0.8125rem;
font-weight: 500;
color: #555;
margin-bottom: 0.25rem;
display: flex;
align-items: center;
gap: 0.25rem;
}
.form-item .form-input[data-v-461d1d79] {
width: 100%;
height: 2.5rem;
padding: 0 10px;
height: 2.75rem;
padding: 0 0.75rem;
box-sizing: border-box;
border-radius: 0.9375rem;
border: 0.03125rem solid #e5e5e5;
border-radius: 0.75rem;
border: 0.0625rem solid #e8e8f0;
background: rgba(255, 255, 255, 0.8);
font-size: 0.875rem;
color: #333;
transition: all 0.25s ease;
}
.form-item .form-input[data-v-461d1d79]::-webkit-input-placeholder {
color: #c0c0d0;
}
.form-item .form-input[data-v-461d1d79]::placeholder {
color: #c0c0d0;
}
.form-item .focused[data-v-461d1d79] {
border-color: #aaaaff;
box-shadow: 0 0 0.3125rem rgba(170, 170, 255, 0.5);
border-color: #6c63ff;
background: #ffffff;
box-shadow: 0 0 0 0.1875rem rgba(108, 99, 255, 0.06);
}
.form-item .error[data-v-461d1d79] {
border-color: #ff0000;
box-shadow: 0 0 0.3125rem rgba(255, 0, 0, 0.5);
border-color: #ff4d4f;
box-shadow: 0 0 0 0.1875rem rgba(255, 77, 79, 0.06);
}
.error-info[data-v-461d1d79] {
font-size: 0.75rem;
color: #ff0000;
font-size: 0.6875rem;
color: #ff4d4f;
margin-top: 0.25rem;
padding-left: 0.25rem;
}
.form-option[data-v-461d1d79] {
margin-top: 0.3125rem;
margin-top: 0.625rem;
display: flex;
justify-content: space-between;
align-items: center;
}
.form-option .checkbox-wrapper[data-v-461d1d79] {
display: flex;
@@ -145,23 +171,54 @@
align-items: center;
}
.form-option .checkbox-wrapper .checkbox[data-v-461d1d79] {
width: 0.9375rem;
height: 0.9375rem;
border: 0.03125rem solid #666;
width: 1.125rem;
height: 1.125rem;
border: 0.0625rem solid #d4d4e0;
border-radius: 0.25rem;
display: flex;
justify-content: center;
align-items: center;
}
.form-option .checkbox-wrapper .checked[data-v-461d1d79] {
background-color: #aaaaff;
transition: all 0.2s ease;
background: #fff;
}
.form-option .checkbox-wrapper .checkbox uni-text[data-v-461d1d79] {
color: #ffffff;
font-size: 0.6875rem;
}
.form-option .checkbox-wrapper .checked[data-v-461d1d79] {
background: linear-gradient(135deg, #6c63ff, #4a45d1);
border-color: #6c63ff;
}
.form-option .checkbox-wrapper .checkbox-text[data-v-461d1d79] {
margin-left: 0.3125rem;
font-size: 0.8125rem;
color: #666;
}
.form-option .forget-pwd[data-v-461d1d79] {
font-size: 0.8125rem;
color: #6c63ff;
font-weight: 500;
}
[data-v-461d1d79] .login-btn {
margin-top: 0.9375rem;
width: 15.625rem;
height: 3.125rem;
border-radius: 2.5rem;
background: linear-gradient(to right, #aaaaff, #2969ed);
margin-top: 1.125rem;
width: 100%;
max-width: 15.625rem;
height: 3rem;
border-radius: 1.5rem;
background: linear-gradient(135deg, #6c63ff, #4a45d1);
color: #fff;
font-size: 1rem;
font-weight: 600;
letter-spacing: 0.0625rem;
box-shadow: 0 0.25rem 0.75rem rgba(108, 99, 255, 0.3);
transition: all 0.2s ease;
border: none;
}
[data-v-461d1d79] .login-btn:active {
transform: scale(0.97);
box-shadow: 0 0.125rem 0.375rem rgba(108, 99, 255, 0.2);
}
[data-v-461d1d79] .login-btn[disabled] {
opacity: 0.7;
background: linear-gradient(135deg, #a8a4f0, #8a86d8);
}

View File

@@ -5,45 +5,49 @@
padding: 0.3125rem 0.625rem;
box-sizing: border-box;
align-items: center;
background-color: rgba(194, 191, 211, 0.1);
border-radius: 0.3125rem;
background: rgba(108, 99, 255, 0.06);
border-radius: 0.4375rem;
border: 0.0625rem solid transparent;
transition: all 0.25s ease;
}
.create-folder-name uni-input[data-v-769edd25] {
box-sizing: border-box;
width: 100%;
font-size: 0.875rem;
color: #333;
}
.create-folder-name.has-value[data-v-769edd25] {
background-color: #ffffff;
border: 0.0625rem solid #aaaaff;
box-shadow: 0 0 0.46875rem #aaaaff;
border-color: #6c63ff;
box-shadow: 0 0 0 0.125rem rgba(108, 99, 255, 0.06);
}
/* 新建文件夹弹窗内部样式 */
.new-folder-name[data-v-769edd25] {
font-size: 0.875rem;
color: #666;
color: #555;
margin-bottom: 0.375rem;
}
.nf-path-label[data-v-769edd25] {
font-size: 0.8125rem;
font-size: 0.75rem;
color: #999;
margin-top: 0.75rem;
margin-bottom: 0.25rem;
}
.nf-path-display[data-v-769edd25] {
font-size: 0.875rem;
font-size: 0.8125rem;
color: #333;
padding: 0.375rem 0.625rem;
background: #f5f5f5;
border-radius: 0.3125rem;
background: #f5f5f8;
border-radius: 0.375rem;
word-break: break-all;
}
.nf-path-preview[data-v-769edd25] {
font-size: 0.875rem;
color: #0073ff;
font-size: 0.8125rem;
color: #6c63ff;
padding: 0.375rem 0.625rem;
background: rgba(0, 115, 255, 0.05);
border: 0.0625rem dashed rgba(0, 115, 255, 0.3);
border-radius: 0.3125rem;
background: rgba(108, 99, 255, 0.05);
border: 0.0625rem dashed rgba(108, 99, 255, 0.25);
border-radius: 0.375rem;
word-break: break-all;
}
.option-wrapper[data-v-769edd25] {
@@ -58,24 +62,30 @@
justify-content: center;
align-items: center;
padding: 0.75rem 0;
border-radius: 0.375rem;
border-radius: 0.5rem;
font-size: 0.9375rem;
font-weight: 500;
transition: all 0.2s ease;
}
.opt-btn[data-v-769edd25]:active {
transform: scale(0.97);
}
.opt-cancel[data-v-769edd25] {
background: #f5f5f5;
background: #f0f1f5;
color: #666;
}
.opt-confirm[data-v-769edd25] {
background: linear-gradient(135deg, #0073ff, #3ab0ff);
background: linear-gradient(135deg, #6c63ff, #4a45d1);
color: #fff;
box-shadow: 0 0.125rem 0.375rem rgba(108, 99, 255, 0.25);
}
.workspace-container[data-v-769edd25] {
display: flex;
flex-direction: column;
background: rgba(140, 140, 140, 0.1);
background: linear-gradient(180deg, #f5f4f9 0%, #faf9fe 100%);
}
.workspace-text[data-v-769edd25] {
color: #0073ff;
color: #6c63ff;
font-weight: bold;
}
.workspace-header[data-v-769edd25] {
@@ -84,16 +94,21 @@
flex-shrink: 0;
flex-direction: column;
align-items: center;
padding: 0.5rem 0;
padding: 0.375rem 0;
box-sizing: border-box;
border-bottom: 0.03125rem solid #ddd;
position: relative;
z-index: 100;
background: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border-bottom: 0.03125rem solid rgba(170, 170, 255, 0.1);
}
.custom-navbar[data-v-769edd25] {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.625rem 0.3125rem;
padding: 0.5rem 0.3125rem;
box-sizing: border-box;
position: relative;
}
@@ -107,6 +122,9 @@
justify-content: center;
align-items: center;
text-align: center;
font-size: 0.8125rem;
color: #6c63ff;
font-weight: 500;
}
.navbar-title[data-v-769edd25] {
display: flex;
@@ -116,6 +134,9 @@
position: absolute;
left: 50%;
transform: translateX(-50%);
font-size: 1rem;
font-weight: 700;
color: #1a1a2e;
}
.navbar-right[data-v-769edd25] {
display: flex;
@@ -125,11 +146,11 @@
box-sizing: border-box;
}
.navbar-right .menu-open[data-v-769edd25] {
color: #3ab0ff !important;
color: #6c63ff !important;
font-size: 1.25rem !important;
}
.custom-navbar-icon[data-v-769edd25] {
color: #0073ff !important;
color: #6c63ff !important;
font-size: 1.25rem !important;
}
.search-file-warpper[data-v-769edd25] {
@@ -141,23 +162,34 @@
display: flex;
flex: 1;
align-items: center;
background: rgba(255, 255, 255, 1);
padding: 0.5rem;
background: rgba(255, 255, 255, 0.9);
padding: 0.4375rem 0.75rem;
box-sizing: border-box;
border-radius: 0.9375rem;
border-radius: 0.875rem;
border: 0.0625rem solid #e8e7f5;
transition: all 0.25s ease;
}
.search-file[data-v-769edd25]:focus-within {
border-color: #6c63ff;
box-shadow: 0 0 0 0.125rem rgba(108, 99, 255, 0.06);
}
.icon-sousuo[data-v-769edd25] {
font-weight: bold;
color: #999;
}
.search-file-input[data-v-769edd25] {
margin-left: 0.625rem;
margin-left: 0.5rem;
font-size: 0.8125rem;
color: #333;
}
.cancel-search[data-v-769edd25] {
display: flex;
flex-shrink: 0;
padding: 0 0 0 0.625rem;
box-sizing: border-box;
color: #0073ff;
color: #6c63ff;
font-size: 0.875rem;
font-weight: 500;
}
.workspace-content[data-v-769edd25] {
width: 100%;
@@ -172,19 +204,28 @@
position: absolute;
top: 100%;
right: 0.625rem;
width: 9.375rem;
width: 8.75rem;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background: #fff;
border-radius: 0.9375rem;
z-index: 1;
border-radius: 0.75rem;
z-index: 999;
box-shadow: 0 0.25rem 1rem rgba(0, 0, 0, 0.08);
padding: 0.25rem 0;
overflow: hidden;
}
.menu-card-item[data-v-769edd25] {
width: 100%;
padding: 0.625rem;
padding: 0.6875rem 0.875rem;
box-sizing: border-box;
font-size: 0.875rem;
color: #333;
transition: all 0.15s ease;
}
.menu-card-item[data-v-769edd25]:active {
background: rgba(108, 99, 255, 0.06);
}
.folder-null[data-v-769edd25] {
width: 100%;
@@ -196,16 +237,18 @@
left: 50%;
top: 30%;
transform: translateX(-50%);
font-size: 1rem;
font-size: 0.9375rem;
color: #bbb;
}
.folder-null .iconfont[data-v-769edd25] {
font-size: 5.625rem;
color: #ddd;
}
.folder-grid[data-v-769edd25] {
width: 100%;
display: grid;
grid-template-columns: repeat(3, 1fr);
padding: 0.625rem;
padding: 0.75rem;
box-sizing: border-box;
gap: 0.625rem;
align-items: start;
@@ -217,58 +260,75 @@
align-items: center;
position: relative;
min-width: 0;
background: rgba(255, 255, 255, 0.7);
border-radius: 0.75rem;
padding: 0.75rem 0.25rem 0.5rem;
border: 0.0625rem solid transparent;
transition: all 0.2s ease;
}
.folder-item.select-folder[data-v-769edd25] {
border-radius: 0.9375rem;
background: rgba(9, 9, 9, 0.1);
border-color: rgba(108, 99, 255, 0.3);
background: rgba(108, 99, 255, 0.04);
}
.folder-item[data-v-769edd25]:active {
transform: scale(0.96);
background: rgba(255, 255, 255, 0.95);
}
.folder-item .folder-name[data-v-769edd25] {
max-width: 4.6875rem;
max-width: 5rem;
text-align: center;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
display: inline-block;
text-align: center;
line-height: 1.25rem;
line-height: 1.375rem;
min-width: 0;
font-size: 0.8125rem;
color: #444;
}
.folder-item-style[data-v-769edd25] {
font-size: 5rem !important;
font-weight: 0.3125rem !important;
color: #3ab0ff !important;
font-size: 3.4375rem !important;
color: #6c63ff !important;
}
.folder-checkbox[data-v-769edd25] {
width: 1.5625rem;
height: 1.5625rem;
border: 0.1875rem solid #fff;
width: 1.375rem;
height: 1.375rem;
border: 0.09375rem solid #fff;
border-radius: 50%;
box-shadow: 0 0.0625rem 0.09375rem #333;
background: rgba(255, 255, 255, 0.2);
box-shadow: 0 0.0625rem 0.25rem rgba(0, 0, 0, 0.12);
background: rgba(255, 255, 255, 0.9);
box-sizing: border-box;
position: absolute;
left: 50%;
top: 30%;
top: 25%;
transform: translate(-50%);
display: flex;
justify-content: center;
align-items: center;
transition: all 0.2s ease;
}
.folder-checkbox.select-folder[data-v-769edd25] {
background-color: #0073ff;
background: linear-gradient(135deg, #6c63ff, #4a45d1);
border-color: #6c63ff;
}
.workspace-footer[data-v-769edd25] {
width: 100%;
display: flex;
flex-shrink: 0;
justify-content: space-between;
padding: 0.9375rem;
padding: 0.75rem 0.9375rem;
box-sizing: border-box;
color: #999999;
background: #eeeeee;
color: #888;
background: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border-top: 0.03125rem solid rgba(170, 170, 255, 0.1);
font-size: 0.8125rem;
transition: all 0.2s ease;
}
.workspace-footer.folder-actions[data-v-769edd25] {
color: #0073ff;
color: #6c63ff;
font-weight: 500;
}
.workspace-footer .iconfont[data-v-769edd25] {
font-size: 1.25rem !important;

View File

@@ -537,45 +537,49 @@
padding: 0.3125rem 0.625rem;
box-sizing: border-box;
align-items: center;
background-color: rgba(194, 191, 211, 0.1);
border-radius: 0.3125rem;
background: rgba(108, 99, 255, 0.06);
border-radius: 0.4375rem;
border: 0.0625rem solid transparent;
transition: all 0.25s ease;
}
.create-folder-name uni-input[data-v-c1a60359] {
box-sizing: border-box;
width: 100%;
font-size: 0.875rem;
color: #333;
}
.create-folder-name.has-value[data-v-c1a60359] {
background-color: #ffffff;
border: 0.0625rem solid #aaaaff;
box-shadow: 0 0 0.46875rem #aaaaff;
border-color: #6c63ff;
box-shadow: 0 0 0 0.125rem rgba(108, 99, 255, 0.06);
}
/* 新建文件夹弹窗内部样式 */
.new-folder-name[data-v-c1a60359] {
font-size: 0.875rem;
color: #666;
color: #555;
margin-bottom: 0.375rem;
}
.nf-path-label[data-v-c1a60359] {
font-size: 0.8125rem;
font-size: 0.75rem;
color: #999;
margin-top: 0.75rem;
margin-bottom: 0.25rem;
}
.nf-path-display[data-v-c1a60359] {
font-size: 0.875rem;
font-size: 0.8125rem;
color: #333;
padding: 0.375rem 0.625rem;
background: #f5f5f5;
border-radius: 0.3125rem;
background: #f5f5f8;
border-radius: 0.375rem;
word-break: break-all;
}
.nf-path-preview[data-v-c1a60359] {
font-size: 0.875rem;
color: #0073ff;
font-size: 0.8125rem;
color: #6c63ff;
padding: 0.375rem 0.625rem;
background: rgba(0, 115, 255, 0.05);
border: 0.0625rem dashed rgba(0, 115, 255, 0.3);
border-radius: 0.3125rem;
background: rgba(108, 99, 255, 0.05);
border: 0.0625rem dashed rgba(108, 99, 255, 0.25);
border-radius: 0.375rem;
word-break: break-all;
}
.option-wrapper[data-v-c1a60359] {
@@ -590,24 +594,30 @@
justify-content: center;
align-items: center;
padding: 0.75rem 0;
border-radius: 0.375rem;
border-radius: 0.5rem;
font-size: 0.9375rem;
font-weight: 500;
transition: all 0.2s ease;
}
.opt-btn[data-v-c1a60359]:active {
transform: scale(0.97);
}
.opt-cancel[data-v-c1a60359] {
background: #f5f5f5;
background: #f0f1f5;
color: #666;
}
.opt-confirm[data-v-c1a60359] {
background: linear-gradient(135deg, #0073ff, #3ab0ff);
background: linear-gradient(135deg, #6c63ff, #4a45d1);
color: #fff;
box-shadow: 0 0.125rem 0.375rem rgba(108, 99, 255, 0.25);
}
.workspace-container[data-v-c1a60359] {
display: flex;
flex-direction: column;
background: rgba(140, 140, 140, 0.1);
background: linear-gradient(180deg, #f5f4f9 0%, #faf9fe 100%);
}
.workspace-text[data-v-c1a60359] {
color: #0073ff;
color: #6c63ff;
font-weight: bold;
}
.workspace-header[data-v-c1a60359] {
@@ -616,16 +626,21 @@
flex-shrink: 0;
flex-direction: column;
align-items: center;
padding: 0.5rem 0;
padding: 0.375rem 0;
box-sizing: border-box;
border-bottom: 0.03125rem solid #ddd;
position: relative;
z-index: 100;
background: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border-bottom: 0.03125rem solid rgba(170, 170, 255, 0.1);
}
.custom-navbar[data-v-c1a60359] {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.625rem 0.3125rem;
padding: 0.5rem 0.3125rem;
box-sizing: border-box;
position: relative;
}
@@ -639,6 +654,9 @@
justify-content: center;
align-items: center;
text-align: center;
font-size: 0.8125rem;
color: #6c63ff;
font-weight: 500;
}
.navbar-title[data-v-c1a60359] {
display: flex;
@@ -648,6 +666,9 @@
position: absolute;
left: 50%;
transform: translateX(-50%);
font-size: 1rem;
font-weight: 700;
color: #1a1a2e;
}
.navbar-right[data-v-c1a60359] {
display: flex;
@@ -657,11 +678,11 @@
box-sizing: border-box;
}
.navbar-right .menu-open[data-v-c1a60359] {
color: #3ab0ff !important;
color: #6c63ff !important;
font-size: 1.25rem !important;
}
.custom-navbar-icon[data-v-c1a60359] {
color: #0073ff !important;
color: #6c63ff !important;
font-size: 1.25rem !important;
}
.search-file-warpper[data-v-c1a60359] {
@@ -673,23 +694,34 @@
display: flex;
flex: 1;
align-items: center;
background: rgba(255, 255, 255, 1);
padding: 0.5rem;
background: rgba(255, 255, 255, 0.9);
padding: 0.4375rem 0.75rem;
box-sizing: border-box;
border-radius: 0.9375rem;
border-radius: 0.875rem;
border: 0.0625rem solid #e8e7f5;
transition: all 0.25s ease;
}
.search-file[data-v-c1a60359]:focus-within {
border-color: #6c63ff;
box-shadow: 0 0 0 0.125rem rgba(108, 99, 255, 0.06);
}
.icon-sousuo[data-v-c1a60359] {
font-weight: bold;
color: #999;
}
.search-file-input[data-v-c1a60359] {
margin-left: 0.625rem;
margin-left: 0.5rem;
font-size: 0.8125rem;
color: #333;
}
.cancel-search[data-v-c1a60359] {
display: flex;
flex-shrink: 0;
padding: 0 0 0 0.625rem;
box-sizing: border-box;
color: #0073ff;
color: #6c63ff;
font-size: 0.875rem;
font-weight: 500;
}
.workspace-content[data-v-c1a60359] {
width: 100%;
@@ -704,19 +736,28 @@
position: absolute;
top: 100%;
right: 0.625rem;
width: 9.375rem;
width: 8.75rem;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background: #fff;
border-radius: 0.9375rem;
z-index: 1;
border-radius: 0.75rem;
z-index: 999;
box-shadow: 0 0.25rem 1rem rgba(0, 0, 0, 0.08);
padding: 0.25rem 0;
overflow: hidden;
}
.menu-card-item[data-v-c1a60359] {
width: 100%;
padding: 0.625rem;
padding: 0.6875rem 0.875rem;
box-sizing: border-box;
font-size: 0.875rem;
color: #333;
transition: all 0.15s ease;
}
.menu-card-item[data-v-c1a60359]:active {
background: rgba(108, 99, 255, 0.06);
}
.folder-null[data-v-c1a60359] {
width: 100%;
@@ -728,16 +769,18 @@
left: 50%;
top: 30%;
transform: translateX(-50%);
font-size: 1rem;
font-size: 0.9375rem;
color: #bbb;
}
.folder-null .iconfont[data-v-c1a60359] {
font-size: 5.625rem;
color: #ddd;
}
.folder-grid[data-v-c1a60359] {
width: 100%;
display: grid;
grid-template-columns: repeat(3, 1fr);
padding: 0.625rem;
padding: 0.75rem;
box-sizing: border-box;
gap: 0.625rem;
align-items: start;
@@ -749,58 +792,75 @@
align-items: center;
position: relative;
min-width: 0;
background: rgba(255, 255, 255, 0.7);
border-radius: 0.75rem;
padding: 0.75rem 0.25rem 0.5rem;
border: 0.0625rem solid transparent;
transition: all 0.2s ease;
}
.folder-item.select-folder[data-v-c1a60359] {
border-radius: 0.9375rem;
background: rgba(9, 9, 9, 0.1);
border-color: rgba(108, 99, 255, 0.3);
background: rgba(108, 99, 255, 0.04);
}
.folder-item[data-v-c1a60359]:active {
transform: scale(0.96);
background: rgba(255, 255, 255, 0.95);
}
.folder-item .folder-name[data-v-c1a60359] {
max-width: 4.6875rem;
max-width: 5rem;
text-align: center;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
display: inline-block;
text-align: center;
line-height: 1.25rem;
line-height: 1.375rem;
min-width: 0;
font-size: 0.8125rem;
color: #444;
}
.folder-item-style[data-v-c1a60359] {
font-size: 5rem !important;
font-weight: 0.3125rem !important;
color: #3ab0ff !important;
font-size: 3.4375rem !important;
color: #6c63ff !important;
}
.folder-checkbox[data-v-c1a60359] {
width: 1.5625rem;
height: 1.5625rem;
border: 0.1875rem solid #fff;
width: 1.375rem;
height: 1.375rem;
border: 0.09375rem solid #fff;
border-radius: 50%;
box-shadow: 0 0.0625rem 0.09375rem #333;
background: rgba(255, 255, 255, 0.2);
box-shadow: 0 0.0625rem 0.25rem rgba(0, 0, 0, 0.12);
background: rgba(255, 255, 255, 0.9);
box-sizing: border-box;
position: absolute;
left: 50%;
top: 30%;
top: 25%;
transform: translate(-50%);
display: flex;
justify-content: center;
align-items: center;
transition: all 0.2s ease;
}
.folder-checkbox.select-folder[data-v-c1a60359] {
background-color: #0073ff;
background: linear-gradient(135deg, #6c63ff, #4a45d1);
border-color: #6c63ff;
}
.workspace-footer[data-v-c1a60359] {
width: 100%;
display: flex;
flex-shrink: 0;
justify-content: space-between;
padding: 0.9375rem;
padding: 0.75rem 0.9375rem;
box-sizing: border-box;
color: #999999;
background: #eeeeee;
color: #888;
background: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border-top: 0.03125rem solid rgba(170, 170, 255, 0.1);
font-size: 0.8125rem;
transition: all 0.2s ease;
}
.workspace-footer.folder-actions[data-v-c1a60359] {
color: #0073ff;
color: #6c63ff;
font-weight: 500;
}
.workspace-footer .iconfont[data-v-c1a60359] {
font-size: 1.25rem !important;

View File

@@ -54,6 +54,60 @@
<div class="content unicode" style="display: block;">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont">&#xe695;</span>
<div class="name">代码</div>
<div class="code-name">&amp;#xe695;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe64c;</span>
<div class="name">word</div>
<div class="code-name">&amp;#xe64c;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe62f;</span>
<div class="name">其他领域</div>
<div class="code-name">&amp;#xe62f;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe63a;</span>
<div class="name">文件夹</div>
<div class="code-name">&amp;#xe63a;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe64d;</span>
<div class="name">execl</div>
<div class="code-name">&amp;#xe64d;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe64e;</span>
<div class="name">TXT</div>
<div class="code-name">&amp;#xe64e;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe64f;</span>
<div class="name">PPT</div>
<div class="code-name">&amp;#xe64f;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe650;</span>
<div class="name">ZIP</div>
<div class="code-name">&amp;#xe650;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe651;</span>
<div class="name">PDF</div>
<div class="code-name">&amp;#xe651;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe988;</span>
<div class="name">云端,云,云服务</div>
@@ -426,9 +480,9 @@
<pre><code class="language-css"
>@font-face {
font-family: 'iconfont';
src: url('iconfont.woff2?t=1782200893170') format('woff2'),
url('iconfont.woff?t=1782200893170') format('woff'),
url('iconfont.ttf?t=1782200893170') format('truetype');
src: url('iconfont.woff2?t=1783330740989') format('woff2'),
url('iconfont.woff?t=1783330740989') format('woff'),
url('iconfont.ttf?t=1783330740989') format('truetype');
}
</code></pre>
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -454,6 +508,87 @@
<div class="content font-class">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont icon-daima"></span>
<div class="name">
代码
</div>
<div class="code-name">.icon-daima
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-word"></span>
<div class="name">
word
</div>
<div class="code-name">.icon-word
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-qitalingyu"></span>
<div class="name">
其他领域
</div>
<div class="code-name">.icon-qitalingyu
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-wenjianjia1"></span>
<div class="name">
文件夹
</div>
<div class="code-name">.icon-wenjianjia1
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-execl"></span>
<div class="name">
execl
</div>
<div class="code-name">.icon-execl
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-TXT1"></span>
<div class="name">
TXT
</div>
<div class="code-name">.icon-TXT1
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-PPT1"></span>
<div class="name">
PPT
</div>
<div class="code-name">.icon-PPT1
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-ZIP"></span>
<div class="name">
ZIP
</div>
<div class="code-name">.icon-ZIP
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-PDF1"></span>
<div class="name">
PDF
</div>
<div class="code-name">.icon-PDF1
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-cloud"></span>
<div class="name">
@@ -1012,6 +1147,78 @@
<div class="content symbol">
<ul class="icon_lists dib-box">
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-daima"></use>
</svg>
<div class="name">代码</div>
<div class="code-name">#icon-daima</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-word"></use>
</svg>
<div class="name">word</div>
<div class="code-name">#icon-word</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-qitalingyu"></use>
</svg>
<div class="name">其他领域</div>
<div class="code-name">#icon-qitalingyu</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-wenjianjia1"></use>
</svg>
<div class="name">文件夹</div>
<div class="code-name">#icon-wenjianjia1</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-execl"></use>
</svg>
<div class="name">execl</div>
<div class="code-name">#icon-execl</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-TXT1"></use>
</svg>
<div class="name">TXT</div>
<div class="code-name">#icon-TXT1</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-PPT1"></use>
</svg>
<div class="name">PPT</div>
<div class="code-name">#icon-PPT1</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-ZIP"></use>
</svg>
<div class="name">ZIP</div>
<div class="code-name">#icon-ZIP</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-PDF1"></use>
</svg>
<div class="name">PDF</div>
<div class="code-name">#icon-PDF1</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-cloud"></use>

View File

@@ -1,8 +1,8 @@
@font-face {
font-family: "iconfont"; /* Project id 4890805 */
src: url('iconfont.woff2?t=1782200893170') format('woff2'),
url('iconfont.woff?t=1782200893170') format('woff'),
url('iconfont.ttf?t=1782200893170') format('truetype');
src: url('iconfont.woff2?t=1783330740989') format('woff2'),
url('iconfont.woff?t=1783330740989') format('woff'),
url('iconfont.ttf?t=1783330740989') format('truetype');
}
.iconfont {
@@ -13,6 +13,42 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-daima:before {
content: "\e695";
}
.icon-word:before {
content: "\e64c";
}
.icon-qitalingyu:before {
content: "\e62f";
}
.icon-wenjianjia1:before {
content: "\e63a";
}
.icon-execl:before {
content: "\e64d";
}
.icon-TXT1:before {
content: "\e64e";
}
.icon-PPT1:before {
content: "\e64f";
}
.icon-ZIP:before {
content: "\e650";
}
.icon-PDF1:before {
content: "\e651";
}
.icon-cloud:before {
content: "\e988";
}

File diff suppressed because one or more lines are too long

View File

@@ -5,6 +5,69 @@
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
{
"icon_id": "1767709",
"name": "代码",
"font_class": "daima",
"unicode": "e695",
"unicode_decimal": 59029
},
{
"icon_id": "6294488",
"name": "word",
"font_class": "word",
"unicode": "e64c",
"unicode_decimal": 58956
},
{
"icon_id": "1460463",
"name": "其他领域",
"font_class": "qitalingyu",
"unicode": "e62f",
"unicode_decimal": 58927
},
{
"icon_id": "5194070",
"name": "文件夹",
"font_class": "wenjianjia1",
"unicode": "e63a",
"unicode_decimal": 58938
},
{
"icon_id": "6294485",
"name": "execl",
"font_class": "execl",
"unicode": "e64d",
"unicode_decimal": 58957
},
{
"icon_id": "6294486",
"name": "TXT",
"font_class": "TXT1",
"unicode": "e64e",
"unicode_decimal": 58958
},
{
"icon_id": "6294487",
"name": "PPT",
"font_class": "PPT1",
"unicode": "e64f",
"unicode_decimal": 58959
},
{
"icon_id": "6294528",
"name": "ZIP",
"font_class": "ZIP",
"unicode": "e650",
"unicode_decimal": 58960
},
{
"icon_id": "6294529",
"name": "PDF",
"font_class": "PDF1",
"unicode": "e651",
"unicode_decimal": 58961
},
{
"icon_id": "18170211",
"name": "云端,云,云服务",

View File

@@ -1,277 +0,0 @@
@file:Suppress("UNCHECKED_CAST", "USELESS_CAST", "INAPPLICABLE_JVM_NAME", "UNUSED_ANONYMOUS_PARAMETER", "SENSELESS_COMPARISON", "NAME_SHADOWING", "UNNECESSARY_NOT_NULL_ASSERTION")
package uts.sdk.modules.limeChooseFile
import android.content.Intent
import android.net.Uri
import android.provider.OpenableColumns
import io.dcloud.uniapp.*
import io.dcloud.uniapp.extapi.*
import io.dcloud.unicloud.*
import io.dcloud.uts.*
import io.dcloud.uts.Map
import io.dcloud.uts.Set
import io.dcloud.uts.UTSAndroid
import java.io.File
import java.io.FileOutputStream
import kotlin.properties.Delegates
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
typealias ChooseFileErrorCode = Number
interface GeneralCallbackResult : IUniError {
override var errCode: ChooseFileErrorCode
}
interface ChooseFile {
var name: String
var path: String
var size: Number
var time: Number
var type: String
}
open class ChooseFileSuccessCallbackResult (
@JsonNotNull
open var tempFiles: UTSArray<ChooseFile>,
@JsonNotNull
open var errMsg: String,
) : UTSObject(), IUTSSourceMap {
override fun `__$getOriginalPosition`(): UTSSourceMapPosition? {
return UTSSourceMapPosition("ChooseFileSuccessCallbackResult", "uni_modules/lime-choose-file/utssdk/interface.uts", 34, 13)
}
}
typealias ChooseFileSuccessCallback = (result: ChooseFileSuccessCallbackResult) -> Unit
typealias ChooseFileFailCallback = (res: GeneralCallbackResult) -> Unit
typealias ChooseFileCompleteCallback = (res: GeneralCallbackResult) -> Unit
open class ChooseFileOption (
open var filename: String? = null,
open var count: Number? = null,
open var type: String? = null,
open var extension: UTSArray<String>? = null,
open var success: ChooseFileSuccessCallback? = null,
open var fail: ChooseFileFailCallback? = null,
open var complete: ChooseFileCompleteCallback? = null,
) : UTSObject(), IUTSSourceMap {
override fun `__$getOriginalPosition`(): UTSSourceMapPosition? {
return UTSSourceMapPosition("ChooseFileOption", "uni_modules/lime-choose-file/utssdk/interface.uts", 45, 13)
}
}
val UniErrorSubject = "chooseFile\""
val UniErrors: Map<ChooseFileErrorCode, String> = Map(_uA(
_uA(
9010001,
"chooseFile:ok"
),
_uA(
9010002,
"ChooseFile:failed"
)
))
open class GeneralCallbackResultImpl : UniError, GeneralCallbackResult, IUTSSourceMap {
override fun `__$getOriginalPosition`(): UTSSourceMapPosition? {
return UTSSourceMapPosition("GeneralCallbackResultImpl", "uni_modules/lime-choose-file/utssdk/unierror.uts", 25, 14)
}
constructor(errCode: ChooseFileErrorCode, errMsg: String? = null) : super() {
this.errSubject = UniErrorSubject
this.errCode = errCode
this.errMsg = errMsg ?: UniErrors[errCode] ?: ""
}
}
val REQUEST_CODE_CHOOSE_FILE: Int = 42
var resultFunction: ((requestCode: Int, resultCode: Int, data: Intent?) -> Unit)? = null
open class ChooseFileImpl : ChooseFile, IUTSSourceMap {
override fun `__$getOriginalPosition`(): UTSSourceMapPosition? {
return UTSSourceMapPosition("ChooseFileImpl", "uni_modules/lime-choose-file/utssdk/app-android/index.uts", 17, 7)
}
override var name: String = ""
override var path: String = ""
override var size: Number = 0
override var time: Number = 0
override var type: String = "file"
private var options: ChooseFileOption
constructor(uri: Uri, options: ChooseFileOption){
this.options = options
this.time = Date.now()
this.type = this.getFileTypeFromUri(uri)
this.getFileInfoFromUri(uri)
if (this.isCache(options)) {
this.copyFileToCache(uri)
}
}
private fun isCache(options: ChooseFileOption): Boolean {
val extension = this.getFileExtension(this.name)
val extensions = options.extension
val type = options.type ?: "all"
val hasExtension = extensions != null && extension != "" && extensions.includes(extension)
val isVideoOrImage = _uA(
"video",
"image"
).includes(type)
val isFileAndNotVideoOrImage = type == "file" && !_uA(
"video",
"image"
).includes(this.type)
if ((type == "all" || isVideoOrImage || isFileAndNotVideoOrImage) && !hasExtension) {
return true
} else {
return false
}
}
private fun getFileExtension(fileName: String): String {
val lastDotIndex = fileName.lastIndexOf(".")
if (lastDotIndex == -1) {
return ""
}
return fileName.substring(lastDotIndex + 1)
}
private fun copyFileToCache(uri: Uri) {
val cacheDir = UTSAndroid.getAppCachePath()
val context = UTSAndroid.getAppContext()
if (cacheDir != null) {
val path = File(cacheDir)
if (!path.exists()) {
path.mkdir()
}
}
var fileName = this.name
if (this.options.filename != null) {
fileName = this.options.filename!!
if (this.options.count != null && this.options.count!! > 1) {
fileName = "" + fileName + "_" + Date.now()
}
val extension = this.getFileExtension(this.name)
fileName = "" + fileName + "." + extension
}
val destFile = File(cacheDir, fileName)
try {
val inputStream = context!!.getContentResolver().openInputStream(uri)
val outputStream = FileOutputStream(destFile)
if (inputStream != null) {
var buffer = ByteArray(1024)
var c = inputStream.read(buffer)
while(c > 0){
outputStream.write(buffer, 0, c)
c = inputStream.read(buffer)
}
}
this.path = cacheDir + fileName
}
catch (e: Throwable) {}
}
private fun getFileTypeFromUri(uri: Uri): String {
val context = UTSAndroid.getAppContext()
var fileType = "file"
var mimeType = context!!.getContentResolver().getType(uri)
if (mimeType != null) {
if (mimeType.startsWith("video")) {
fileType = "video"
} else if (mimeType.startsWith("image")) {
fileType = "image"
}
}
return fileType
}
private fun getFileInfoFromUri(uri: Uri) {
val context = UTSAndroid.getAppContext()
var cursor = context!!.getContentResolver().query(uri, null, null, null, null)
if (cursor != null && cursor.moveToFirst()) {
this.name = cursor.getString(cursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME))
val fileSize = cursor.getLong(cursor.getColumnIndexOrThrow(OpenableColumns.SIZE))
this.size = UTSNumber.from(fileSize)
cursor.close()
} else if ("file".equals(uri.getScheme())) {
this.name = uri.getLastPathSegment() ?: ""
val file = File(uri.getPath() ?: "")
val fileSize = file.length()
this.size = UTSNumber.from(fileSize)
}
}
}
fun chooseFile(options: ChooseFileOption) {
if (resultFunction != null) {
UTSAndroid.offAppActivityResult(resultFunction!!)
}
val type = options.type ?: "all"
val intent = Intent(Intent.ACTION_GET_CONTENT)
if (type.equals("all") || type.equals("file")) {
intent.setType("*/*")
} else if (type.equals("video")) {
intent.setType("video/*")
} else if (type.equals("image")) {
intent.setType("image/*")
}
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, if (options.count == 1) {
false
} else {
true
}
)
resultFunction = fun(requestCode: Int, resultCode: Int, data: Intent?){
if (requestCode == REQUEST_CODE_CHOOSE_FILE) {
UTSAndroid.offAppActivityResult(resultFunction!!)
if (resultCode == -1 && data != null) {
val clipData = data.getClipData()
val tempFiles: UTSArray<ChooseFile> = _uA()
if (clipData != null) {
run {
var i: Number = 0
while(i < clipData.getItemCount()){
val uri = clipData.getItemAt(i.toInt()).getUri()
val chooseFile = ChooseFileImpl(uri, options)
if (chooseFile.path != "") {
tempFiles.push(chooseFile)
}
i++
}
}
} else {
val uri = data.getData()
if (uri != null) {
val chooseFile = ChooseFileImpl(uri, options)
if (chooseFile.path != "") {
tempFiles.push(chooseFile)
}
}
}
val count = options.count ?: Integer.MAX_VALUE
if (tempFiles.length > 0 && count >= tempFiles.length) {
options.success?.invoke(ChooseFileSuccessCallbackResult(tempFiles = tempFiles, errMsg = "chooseFile:ok"))
} else {
val err = GeneralCallbackResultImpl(9010002, "没有可用的文件或文件超过设置数量")
options.fail?.invoke(err)
options.complete?.invoke(err)
}
} else {
val err = GeneralCallbackResultImpl(9010002, "没有可用的文件")
options.fail?.invoke(err)
options.complete?.invoke(err)
}
} else {
val err = GeneralCallbackResultImpl(9010002, "没有可用的文件")
options.fail?.invoke(err)
options.complete?.invoke(err)
}
}
UTSAndroid.onAppActivityResult(resultFunction!!)
UTSAndroid.getUniActivity()!!.startActivityForResult(Intent.createChooser(intent, "选择文件"), REQUEST_CODE_CHOOSE_FILE)
}
open class ChooseFileOptionJSONObject : UTSJSONObject() {
open var filename: String? = null
open var count: Number? = null
open var type: String? = null
open var extension: UTSArray<String>? = null
open var success: UTSCallback? = null
open var fail: UTSCallback? = null
open var complete: UTSCallback? = null
}
fun chooseFileByJs(options: ChooseFileOptionJSONObject) {
return chooseFile(ChooseFileOption(filename = options.filename, count = options.count, type = options.type, extension = options.extension, success = fun(result: ChooseFileSuccessCallbackResult): Unit {
options.success?.invoke(result)
}
, fail = fun(res: GeneralCallbackResult): Unit {
options.fail?.invoke(res)
}
, complete = fun(res: GeneralCallbackResult): Unit {
options.complete?.invoke(res)
}
))
}