From e4aa910d4e213c1cf70970895b7c0560ec808300 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98Liammcl=E2=80=99?= Date: Tue, 14 Jan 2025 22:33:10 +0800 Subject: [PATCH] fix --- index.html | 9 +-- .../logo-collapsed.png => public/minilogo.png | Bin src/assets/minilogo.png | Bin 0 -> 2919 bytes src/components/ChatAi/index.jsx | 5 +- src/components/Layout/Logo.jsx | 2 +- src/components/difyChatAi/index.jsx | 62 ++++++++++++------ src/hooks/aichat.jsx | 4 +- src/pages/resource/menu/index.jsx | 2 +- src/routes/AppRoutes.jsx | 3 - src/styles/main.scss | 34 +++++----- src/utils/menuUtils.jsx | 16 +++-- 11 files changed, 77 insertions(+), 60 deletions(-) rename src/assets/logo-collapsed.png => public/minilogo.png (100%) create mode 100644 src/assets/minilogo.png diff --git a/index.html b/index.html index 20ce57b..cae04f6 100644 --- a/index.html +++ b/index.html @@ -2,13 +2,10 @@ - + - Uppeta - - - - + Limq +
diff --git a/src/assets/logo-collapsed.png b/public/minilogo.png similarity index 100% rename from src/assets/logo-collapsed.png rename to public/minilogo.png diff --git a/src/assets/minilogo.png b/src/assets/minilogo.png new file mode 100644 index 0000000000000000000000000000000000000000..23b251ffc48bb1f9d50e8cac5207dc4d71487369 GIT binary patch literal 2919 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 JSON.parse(storedMessages):[], }); const messagesEndRef = useRef(null); @@ -88,7 +88,6 @@ export default function ChatAIDrawer({ open, onClose, onExport }) { width={800} open={open} onClose={onClose} - className="rounded-l-xl" >
diff --git a/src/components/Layout/Logo.jsx b/src/components/Layout/Logo.jsx index 0762fc9..076c4d0 100644 --- a/src/components/Layout/Logo.jsx +++ b/src/components/Layout/Logo.jsx @@ -1,7 +1,7 @@ import React from "react"; import logo from "@/assets/logo.png"; -import logoCollapsed from "@/assets/logo-collapsed.png"; +import logoCollapsed from "@/assets/minilogo.png"; export const Logo = ({ collapsed, isDarkMode }) => (
diff --git a/src/components/difyChatAi/index.jsx b/src/components/difyChatAi/index.jsx index 4e93cfd..f93991e 100644 --- a/src/components/difyChatAi/index.jsx +++ b/src/components/difyChatAi/index.jsx @@ -3,6 +3,8 @@ import { CodeHighlight } from "@mantine/code-highlight"; import { DownloadOutlined, EditOutlined, CheckOutlined, CloseOutlined } from '@ant-design/icons'; import { useRef, useEffect, useState } from 'react'; import { useDifyChat } from '@/hooks/aichat'; +import Editor from "@monaco-editor/react"; +import {useTheme}from '@/contexts/ThemeContext' export default function DifyChatDrawer({ open, onClose, onExport }) { const { @@ -14,7 +16,7 @@ export default function DifyChatDrawer({ open, onClose, onExport }) { storedMessages, setStoredMessages } = useDifyChat(); - + const {isDarkMode}=useTheme() const [input, setInput] = useState(''); const messagesEndRef = useRef(null); @@ -25,6 +27,20 @@ export default function DifyChatDrawer({ open, onClose, onExport }) { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }, [messages]); + useEffect(() => { + if (storedMessages && storedMessages.length > 0) { + console.log(storedMessages,'storedMessages'); + + setMessages(storedMessages); + } + }, []); + + useEffect(() => { + if (messages.length > 0) { + setStoredMessages(messages); + } + }, [messages]); + const handleSendMessage = async (e) => { e.preventDefault(); await sendMessage(input); @@ -67,15 +83,20 @@ export default function DifyChatDrawer({ open, onClose, onExport }) { } }; + const handleClearHistory = () => { + clearHistory(); + setStoredMessages([]); + }; + return ( - AI 助手 + AI 助手 @@ -85,7 +106,6 @@ export default function DifyChatDrawer({ open, onClose, onExport }) { width={800} open={open} onClose={onClose} - className="rounded-l-xl" >
@@ -94,13 +114,15 @@ export default function DifyChatDrawer({ open, onClose, onExport }) { key={message.id} className={`rounded-lg p-4 transition-all ${ message.role === 'assistant' - ? 'bg-blue-50 hover:bg-blue-100' - : 'bg-gray-50 hover:bg-gray-100' + ? 'bg-blue-50 hover:bg-blue-100 dark:bg-blue-900/30 dark:hover:bg-blue-900/50' + : 'bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700' }`} >
{message.role === 'assistant' ? 'AI 助手' : '用户'} @@ -112,7 +134,7 @@ export default function DifyChatDrawer({ open, onClose, onExport }) { icon={} disabled={isLoading} onClick={() => handleEdit(message)} - className="text-gray-500 hover:text-blue-600" + className="text-gray-500 hover:text-blue-600 dark:text-gray-400 dark:hover:text-blue-400" > 编辑 @@ -121,7 +143,7 @@ export default function DifyChatDrawer({ open, onClose, onExport }) { size="small" icon={} onClick={() => handleExport(message.content)} - className="text-gray-500 hover:text-blue-600" + className="text-gray-500 hover:text-blue-600 dark:text-gray-400 dark:hover:text-blue-400" > 导出 @@ -132,12 +154,12 @@ export default function DifyChatDrawer({ open, onClose, onExport }) { {message.role === "assistant" ? (
{editingMessageId === message.id ? ( -
+
-
+
@@ -166,7 +188,7 @@ export default function DifyChatDrawer({ open, onClose, onExport }) { size="small" icon={} onClick={handleSaveEdit} - className="bg-blue-600 hover:bg-blue-700" + className="bg-blue-600 hover:bg-blue-700 dark:bg-blue-700 dark:hover:bg-blue-800" > 保存 @@ -179,12 +201,12 @@ export default function DifyChatDrawer({ open, onClose, onExport }) { copyLabel="复制代码" copiedLabel="已复制!" withLineNumbers - className="rounded-lg" + className="rounded-lg dark:border-gray-700" /> )}
) : ( -
+
{message.content}
)} @@ -193,20 +215,20 @@ export default function DifyChatDrawer({ open, onClose, onExport }) {
-
+
setInput(e.target.value)} disabled={isLoading} - className="flex-1 rounded-lg border-gray-300 hover:border-blue-400 focus:border-blue-600 focus:shadow-blue-100" + className="flex-1 rounded-lg border-gray-300 dark:border-gray-600 hover:border-blue-400 dark:hover:border-blue-500 focus:border-blue-600 dark:focus:border-blue-500 focus:shadow-blue-100 dark:focus:shadow-blue-900 dark:bg-gray-700 dark:text-gray-200" /> diff --git a/src/hooks/aichat.jsx b/src/hooks/aichat.jsx index dd7a40d..002cbce 100644 --- a/src/hooks/aichat.jsx +++ b/src/hooks/aichat.jsx @@ -9,7 +9,7 @@ const STORAGE_KEY = 'dify_chat_history'; const CONVERSATION_ID_KEY = 'dify_conversation_id'; export function useDifyChat() { - const [storedMessages, setStoredMessages] = useSessionStorage(STORAGE_KEY, '[]'); + const [storedMessages, setStoredMessages] = useSessionStorage(STORAGE_KEY, []); const [conversationId, setConversationId] = useSessionStorage(CONVERSATION_ID_KEY, ''); const [messages, setMessages] = useState([]); const [isLoading, setIsLoading] = useState(false); @@ -18,7 +18,7 @@ export function useDifyChat() { const clearHistory = () => { setMessages([]); - setStoredMessages('[]'); + setStoredMessages([]); setConversationId(''); message.success('历史记录已清空'); }; diff --git a/src/pages/resource/menu/index.jsx b/src/pages/resource/menu/index.jsx index f0b8bd7..ff8dd60 100644 --- a/src/pages/resource/menu/index.jsx +++ b/src/pages/resource/menu/index.jsx @@ -201,7 +201,7 @@ export default function MenuManagement() { }, []); return ( -
+
菜单权限管理 diff --git a/src/routes/AppRoutes.jsx b/src/routes/AppRoutes.jsx index 4da2594..287dc18 100644 --- a/src/routes/AppRoutes.jsx +++ b/src/routes/AppRoutes.jsx @@ -89,10 +89,7 @@ const AppRoutes = () => { index element={} /> - - {/* 渲染所有路由 */} {renderRoutes(allRoutes)} - } /> diff --git a/src/styles/main.scss b/src/styles/main.scss index b185d19..4a175dc 100644 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -112,27 +112,27 @@ body { .dark { @apply bg-gray-900; - .ant-card { - background: #1f1f1f; + // .ant-card { + // background: #1f1f1f; - .ant-card-head { - color: rgba(255, 255, 255, 0.85); - border-bottom-color: #303030; - } - } + // .ant-card-head { + // color: rgba(255, 255, 255, 0.85); + // border-bottom-color: #303030; + // } + // } - .ant-table { - background: #1f1f1f; + // .ant-table { + // background: #1f1f1f; - .ant-table-thead>tr>th { - background: #141414; - color: rgba(255, 255, 255, 0.85); - } + // .ant-table-thead>tr>th { + // background: #141414; + // color: rgba(255, 255, 255, 0.85); + // } - .ant-table-tbody>tr>td { - border-bottom: 1px solid #303030; - } - } + // .ant-table-tbody>tr>td { + // border-bottom: 1px solid #303030; + // } + // } } // Statistics card styles diff --git a/src/utils/menuUtils.jsx b/src/utils/menuUtils.jsx index ca0ee54..19771bc 100644 --- a/src/utils/menuUtils.jsx +++ b/src/utils/menuUtils.jsx @@ -13,15 +13,21 @@ const getAntIcon = (iconName) => { const generateMenuItems = (routes, menuKeys = [], parentPath = "") => { return routes .filter((route) => { - if (!menuKeys.length) return !route.hidden; + if (route.hidden) return false; + + if (!menuKeys.length) return true; const isRouteAllowed = menuKeys.includes(route.key); // 如果有子路由,只要子路由中有被授权的,父路由就应该显示 if (route.children) { const hasAllowedChildren = route.children.some(child => - menuKeys.includes(child.key) || - (child.children && child.children.some(grandChild => menuKeys.includes(grandChild.key))) + !child.hidden && ( + menuKeys.includes(child.key) || + (child.children && child.children.some(grandChild => + !grandChild.hidden && menuKeys.includes(grandChild.key) + )) + ) ); return hasAllowedChildren || isRouteAllowed; } @@ -56,16 +62,12 @@ export const filterRoutesByMenuKeys = (routes, menuKeys) => { return []; } return routes.reduce((acc, route) => { - // 检查当前路由的 key 是否在 menuKeys 中 const isRouteAllowed = menuKeys.includes(route.key); - // 递归处理子路由 let filteredChildren = []; if (route.children) { filteredChildren = filterRoutesByMenuKeys(route.children, menuKeys); } - - // 如果当前路由被允许或者有被允许的子路由,则保留该路由 if (isRouteAllowed || filteredChildren.length > 0) { acc.push({ ...route,