diff --git a/Cunkebao/dist/.vite/manifest.json b/Cunkebao/dist/.vite/manifest.json
index 426614a4..2289b6a9 100644
--- a/Cunkebao/dist/.vite/manifest.json
+++ b/Cunkebao/dist/.vite/manifest.json
@@ -1,14 +1,18 @@
{
- "_charts-DN1cefc8.js": {
- "file": "assets/charts-DN1cefc8.js",
+ "_charts-aNYyX7D2.js": {
+ "file": "assets/charts-aNYyX7D2.js",
"name": "charts",
"imports": [
- "_ui-5V-xZWkf.js",
+ "_ui-DZwp85UP.js",
"_vendor-Bq99rrm8.js"
]
},
- "_ui-5V-xZWkf.js": {
- "file": "assets/ui-5V-xZWkf.js",
+ "_ui-D0C0OGrH.css": {
+ "file": "assets/ui-D0C0OGrH.css",
+ "src": "_ui-D0C0OGrH.css"
+ },
+ "_ui-DZwp85UP.js": {
+ "file": "assets/ui-DZwp85UP.js",
"name": "ui",
"imports": [
"_vendor-Bq99rrm8.js"
@@ -17,10 +21,6 @@
"assets/ui-D0C0OGrH.css"
]
},
- "_ui-D0C0OGrH.css": {
- "file": "assets/ui-D0C0OGrH.css",
- "src": "_ui-D0C0OGrH.css"
- },
"_utils-Ft3ushmX.js": {
"file": "assets/utils-Ft3ushmX.js",
"name": "utils",
@@ -33,18 +33,18 @@
"name": "vendor"
},
"index.html": {
- "file": "assets/index-9Clf2a7g.js",
+ "file": "assets/index-CCIZs36L.js",
"name": "index",
"src": "index.html",
"isEntry": true,
"imports": [
"_vendor-Bq99rrm8.js",
- "_ui-5V-xZWkf.js",
+ "_ui-DZwp85UP.js",
"_utils-Ft3ushmX.js",
- "_charts-DN1cefc8.js"
+ "_charts-aNYyX7D2.js"
],
"css": [
- "assets/index-CK1wd128.css"
+ "assets/index-DRrzDMi4.css"
]
}
}
\ No newline at end of file
diff --git a/Cunkebao/dist/index.html b/Cunkebao/dist/index.html
index 408e052b..9b257a9d 100644
--- a/Cunkebao/dist/index.html
+++ b/Cunkebao/dist/index.html
@@ -11,13 +11,13 @@
-
+
-
+
-
+
-
+
diff --git a/Touchkebao/src/pages/pc/ckbox/components/NavCommon/index.data.ts b/Touchkebao/src/pages/pc/ckbox/components/NavCommon/index.data.tsx
similarity index 69%
rename from Touchkebao/src/pages/pc/ckbox/components/NavCommon/index.data.ts
rename to Touchkebao/src/pages/pc/ckbox/components/NavCommon/index.data.tsx
index 5404b4f6..94ae6d0e 100644
--- a/Touchkebao/src/pages/pc/ckbox/components/NavCommon/index.data.ts
+++ b/Touchkebao/src/pages/pc/ckbox/components/NavCommon/index.data.tsx
@@ -1,8 +1,9 @@
+import { BarChartOutlined, RobotOutlined } from "@ant-design/icons";
// 菜单项接口
export interface MenuItem {
id: string;
title: string;
- icon: string;
+ icon: React.ReactNode;
path?: string;
}
@@ -10,22 +11,16 @@ export interface MenuItem {
export const menuList: MenuItem[] = [
{
id: "wechat",
- title: "微信管理",
- icon: "💬",
+ title: "AI智能客服",
+ icon: ,
path: "/pc/weChat",
},
{
id: "powerCenter",
title: "功能中心",
- icon: "📊",
+ icon: ,
path: "/pc/powerCenter",
},
- {
- id: "dashboard",
- title: "数据面板",
- icon: "📊",
- path: "/pc/dashboard",
- },
];
// 抽屉菜单配置数据
diff --git a/Touchkebao/src/pages/pc/ckbox/components/NavCommon/index.module.scss b/Touchkebao/src/pages/pc/ckbox/components/NavCommon/index.module.scss
index abb8c2aa..1e9b197c 100644
--- a/Touchkebao/src/pages/pc/ckbox/components/NavCommon/index.module.scss
+++ b/Touchkebao/src/pages/pc/ckbox/components/NavCommon/index.module.scss
@@ -1,3 +1,32 @@
+/**
+ * NavCommon 组件样式文件
+ *
+ * 文件结构说明:
+ * 1. Header 区域样式 - 顶部导航栏相关样式
+ * - headerLeft: 左侧菜单按钮和标题
+ * - headerRight: 右侧用户信息、算力显示、消息按钮等
+ *
+ * 2. Drawer 抽屉区域样式 - 左侧菜单抽屉相关样式
+ * - drawerContent: 抽屉内容容器
+ * - drawerHeader: 抽屉头部(Logo区域)
+ * - drawerBody: 抽屉主体(主要按钮和菜单项)
+ * - drawerFooter: 抽屉底部(余额显示)
+ *
+ * 3. 消息抽屉区域样式 - 右侧消息中心抽屉相关样式
+ * - messageContent: 消息列表容器
+ * - messageItem: 单个消息项样式
+ *
+ * 4. 兼容样式 - 保持向后兼容的独立样式类
+ *
+ * 5. 响应式设计 - 移动端适配样式
+ *
+ * 样式组织原则:
+ * - 按照 tsx 文件中的嵌套结构组织样式
+ * - 使用 SCSS 嵌套语法体现 DOM 层级关系
+ * - 相关样式就近放置,便于维护
+ */
+
+// ===== Header 区域样式 =====
.header {
background: #fff;
padding: 0 16px;
@@ -7,212 +36,129 @@
justify-content: space-between;
height: 64px;
border-bottom: 1px solid #f0f0f0;
-}
-.headerLeft {
- display: flex;
- align-items: center;
- gap: 12px;
-}
-
-.menuButton {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 40px;
- height: 40px;
- border-radius: 6px;
- transition: all 0.3s;
-
- &:hover {
- background-color: #f5f5f5;
- }
-
- .anticon {
- font-size: 18px;
- color: #666;
- }
-}
-
-.title {
- font-size: 18px;
- color: #333;
- margin: 0;
-}
-
-.headerRight {
- display: flex;
- align-items: center;
- gap: 16px;
- padding-right: 10px;
-}
-
-.userInfo {
- display: flex;
- align-items: center;
- gap: 16px;
- padding: 8px 0;
-
- .suanli {
+ // Header 左侧区域
+ .headerLeft {
display: flex;
align-items: center;
- gap: 4px;
- font-size: 16px;
- color: #666;
- font-weight: 500;
- cursor: pointer;
+ gap: 12px;
- .suanliIcon {
- font-size: 20px;
- color: #ffc107;
- }
- &:hover {
- color: #52c41a;
+ .menuButton {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 40px;
+ height: 40px;
+ border-radius: 6px;
transition: all 0.3s;
+
+ &:hover {
+ background-color: #f5f5f5;
+ }
+
+ .anticon {
+ font-size: 18px;
+ color: #666;
+ }
+ }
+
+ .title {
+ font-size: 18px;
+ color: #333;
+ margin: 0;
+ }
+ }
+
+ // Header 右侧区域
+ .headerRight {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ padding-right: 10px;
+
+ .userInfo {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ padding: 8px 0;
+
+ .suanli {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ font-size: 16px;
+ color: #666;
+ font-weight: 500;
+ cursor: pointer;
+
+ .suanliIcon {
+ font-size: 20px;
+ color: #ffc107;
+ }
+
+ &:hover {
+ color: #52c41a;
+ transition: all 0.3s;
+ }
+ }
+
+ .avatar {
+ border: 2px solid #e9ecef;
+ transition: all 0.3s;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ }
+ }
+
+ .messageButton {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 40px;
+ height: 40px;
+ border-radius: 80px;
+ transition: all 0.3s;
+ border: 1px solid #e9ecef;
+ background: #fff;
+ cursor: pointer;
+
+ &:hover {
+ background-color: #f8f9fa;
+ border-color: #1890ff;
+ box-shadow: 0 0px 12px rgba(24, 144, 255, 0.15);
+ }
+
+ .anticon {
+ font-size: 18px;
+ color: #666;
+ }
+ }
+
+ .userSection {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ cursor: pointer;
+ padding: 8px 16px;
+ }
+
+ .userNickname {
+ font-size: 14px;
+ color: #333;
+ font-weight: 600;
+ max-width: 100px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
}
}
}
+
+// 兼容旧样式(避免破坏性更改)
.bell {
cursor: pointer;
background: #f5f5f5;
}
-.messageButton {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 40px;
- height: 40px;
- border-radius: 80px;
- transition: all 0.3s;
- border: 1px solid #e9ecef;
- background: #fff;
- cursor: pointer;
- &:hover {
- background-color: #f8f9fa;
- border-color: #1890ff;
- box-shadow: 0 0px 12px rgba(24, 144, 255, 0.15);
- }
-
- .anticon {
- font-size: 18px;
- color: #666;
- }
-}
-
-.userSection {
- display: flex;
- align-items: center;
- gap: 12px;
- cursor: pointer;
- padding: 8px 16px;
-}
-
-.userNickname {
- font-size: 14px;
- color: #333;
- font-weight: 600;
- max-width: 100px;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.avatar {
- border: 2px solid #e9ecef;
- transition: all 0.3s;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-}
-
-// 消息抽屉样式
-.messageDrawer {
- :global(.ant-drawer-header) {
- border-bottom: 1px solid #f0f0f0;
- }
-
- :global(.ant-drawer-body) {
- padding: 0;
- }
-}
-
-.messageContent {
- height: 100%;
- overflow-y: auto;
-}
-
-.messageItem {
- display: flex;
- padding: 16px;
- border-bottom: 1px solid #f5f5f5;
- transition: background-color 0.2s;
-
- &:hover {
- background-color: #fafafa;
- }
-
- &:last-child {
- border-bottom: none;
- }
-}
-
-.messageAvatar {
- margin-right: 12px;
- flex-shrink: 0;
-}
-
-.messageInfo {
- flex: 1;
- min-width: 0;
-}
-
-.messageTitle {
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-bottom: 8px;
-}
-
-.messageType {
- font-size: 14px;
- font-weight: 500;
- color: #262626;
-}
-
-.messageStatus {
- width: 8px;
- height: 8px;
- border-radius: 50%;
- background-color: #1890ff;
-}
-
-.messageText {
- font-size: 13px;
- color: #595959;
- line-height: 1.4;
- margin-bottom: 8px;
- word-break: break-word;
-}
-
-.messageTime {
- display: flex;
- align-items: center;
- justify-content: space-between;
- font-size: 12px;
- color: #8c8c8c;
-}
-
-.messageActions {
- display: flex;
- gap: 8px;
- margin-top: 8px;
-
- :global(.ant-btn) {
- height: 24px;
- padding: 0 8px;
- font-size: 12px;
- }
-}
-
.username {
font-size: 14px;
color: #333;
@@ -220,7 +166,8 @@
margin-left: 8px;
}
-// 抽屉样式
+// ===== Drawer 抽屉区域样式 =====
+// 左侧菜单抽屉
.drawer {
:global(.ant-drawer-header) {
background: #fafafa;
@@ -230,141 +177,259 @@
:global(.ant-drawer-body) {
padding: 0;
}
-}
-.drawerContent {
- height: 100%;
- display: flex;
- flex-direction: column;
- background: #f8f9fa;
-}
-
-.drawerHeader {
- padding: 20px;
- background: #fff;
- border-bottom: none;
-}
-
-.logoSection {
- display: flex;
- align-items: center;
- gap: 12px;
-}
-
-.logoIcon {
- width: 48px;
- height: 48px;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- border-radius: 12px;
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: 24px;
- color: white;
-}
-
-.logoText {
- display: flex;
- flex-direction: column;
-}
-
-.appName {
- font-size: 18px;
- font-weight: 600;
- color: #333;
- margin: 0;
-}
-
-.appDesc {
- font-size: 12px;
- color: #999;
- margin: 2px 0 0 0;
-}
-
-.drawerBody {
- flex: 1;
- display: flex;
- flex-direction: column;
- gap: 16px;
-}
-
-.primaryButton {
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- border-radius: 12px;
- padding: 16px 20px;
- display: flex;
- align-items: center;
- gap: 12px;
- cursor: pointer;
- transition: all 0.3s;
-
- &:hover {
- transform: translateY(-2px);
- box-shadow: 0 8px 25px rgba(102, 126, 234, 0.3);
- }
-
- .buttonIcon {
- font-size: 20px;
- }
-
- span {
- font-size: 16px;
- font-weight: 600;
- color: white;
- }
-}
-
-.menuSection {
- margin-top: 8px;
-}
-
-.menuItem {
- display: flex;
- align-items: center;
- padding: 16px 20px;
- cursor: pointer;
- transition: all 0.3s;
- border-radius: 8px;
-
- &:hover {
- background-color: #f0f0f0;
- }
-
- span {
- font-size: 16px;
- color: #333;
- font-weight: 500;
- }
-}
-
-.menuIcon {
- font-size: 20px;
- margin-right: 12px;
- width: 20px;
- text-align: center;
-}
-
-.drawerFooter {
- padding: 20px;
- background: #fff;
- border-top: 1px solid #f0f0f0;
- .balanceSection {
+ // 抽屉内容容器
+ .drawerContent {
+ height: 100%;
display: flex;
- justify-content: space-between;
- align-items: center;
- .balanceIcon {
- color: #666;
- .suanliIcon {
- font-size: 20px;
+ flex-direction: column;
+ background: #f8f9fa;
+
+ // 抽屉头部
+ .drawerHeader {
+ padding: 20px;
+ background: #fff;
+ border-bottom: none;
+
+ .logoSection {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+
+ .logoIcon {
+ width: 48px;
+ height: 48px;
+ background: linear-gradient(135deg, #3b81f6 0%, #9035ea 100%);
+ border-radius: 12px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 24px;
+ color: white;
+ }
+
+ .logoText {
+ display: flex;
+ flex-direction: column;
+
+ .appName {
+ font-size: 18px;
+ font-weight: 600;
+ color: #333;
+ margin: 0;
+ }
+
+ .appDesc {
+ font-size: 12px;
+ color: #999;
+ margin: 2px 0 0 0;
+ }
+ }
}
}
- .balanceText {
- color: #3d9c0d;
+ // 抽屉主体内容
+ .drawerBody {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+
+ .primaryButton {
+ background: linear-gradient(135deg, #3d80f6 0%, #764ba2 100%);
+ border-radius: 12px;
+ padding: 16px 20px;
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ cursor: pointer;
+ transition: all 0.3s;
+
+ &:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 25px rgba(102, 126, 234, 0.3);
+ }
+
+ .buttonIcon {
+ font-size: 20px;
+ }
+
+ span {
+ font-size: 16px;
+ font-weight: 600;
+ color: white;
+ }
+ }
+
+ // 菜单区域
+ .menuSection {
+ padding: 0px 20px;
+ .menuItem {
+ display: flex;
+ align-items: center;
+ padding: 8px 20px;
+ cursor: pointer;
+ transition: all 0.3s;
+ border-radius: 8px;
+ margin: 4px 0;
+
+ &:hover {
+ background-color: #f0f0f0;
+ }
+
+ .menuIcon {
+ font-size: 20px;
+ margin-right: 12px;
+ width: 20px;
+ text-align: center;
+ }
+
+ span {
+ font-size: 16px;
+ color: #333;
+ font-weight: 500;
+ }
+
+ &.menuItemActive {
+ background: linear-gradient(to right, #3b82f6, #9333ea);
+ color: white;
+ box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);
+
+ span {
+ color: white;
+ font-weight: 600;
+ }
+
+ .menuIcon {
+ color: white;
+ }
+
+ &:hover {
+ background: linear-gradient(to right, #3b82f6, #9333ea);
+ box-shadow: 0 6px 16px rgba(102, 126, 234, 0.4);
+ }
+ }
+ }
+ }
+ }
+
+ // 抽屉底部
+ .drawerFooter {
+ padding: 20px;
+ background: #fff;
+ border-top: 1px solid #f0f0f0;
+
+ .balanceSection {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .balanceIcon {
+ color: #666;
+
+ .suanliIcon {
+ font-size: 20px;
+ }
+ }
+
+ .balanceText {
+ color: #3d9c0d;
+ }
+ }
}
}
}
+// ===== 消息抽屉区域样式 =====
+.messageDrawer {
+ :global(.ant-drawer-header) {
+ border-bottom: 1px solid #f0f0f0;
+ }
+
+ :global(.ant-drawer-body) {
+ padding: 0;
+ }
+
+ .messageContent {
+ height: 100%;
+ overflow-y: auto;
+
+ .messageItem {
+ display: flex;
+ padding: 16px;
+ border-bottom: 1px solid #f5f5f5;
+ transition: background-color 0.2s;
+
+ &:hover {
+ background-color: #fafafa;
+ }
+
+ &:last-child {
+ border-bottom: none;
+ }
+
+ .messageAvatar {
+ margin-right: 12px;
+ flex-shrink: 0;
+ }
+
+ .messageInfo {
+ flex: 1;
+ min-width: 0;
+
+ .messageTitle {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 8px;
+
+ .messageType {
+ font-size: 14px;
+ font-weight: 500;
+ color: #262626;
+ }
+
+ .messageStatus {
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ background-color: #1890ff;
+ }
+ }
+
+ .messageText {
+ font-size: 13px;
+ color: #595959;
+ line-height: 1.4;
+ margin-bottom: 8px;
+ word-break: break-word;
+ }
+
+ .messageTime {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ font-size: 12px;
+ color: #8c8c8c;
+ }
+
+ .messageActions {
+ display: flex;
+ gap: 8px;
+ margin-top: 8px;
+
+ :global(.ant-btn) {
+ height: 24px;
+ padding: 0 8px;
+ font-size: 12px;
+ }
+ }
+ }
+ }
+ }
+}
+
+// ===== 兼容样式 =====
.balanceLabel {
font-size: 12px;
color: #999;
@@ -378,18 +443,24 @@
margin: 2px 0 0 0;
}
-// 响应式设计
+// ===== 响应式设计 =====
@media (max-width: 768px) {
.header {
padding: 0 12px;
- }
- .title {
- font-size: 16px;
- }
+ .headerLeft {
+ .title {
+ font-size: 16px;
+ }
+ }
- .username {
- display: none;
+ .headerRight {
+ .userInfo {
+ .username {
+ display: none;
+ }
+ }
+ }
}
.drawer {
diff --git a/Touchkebao/src/pages/pc/ckbox/components/NavCommon/index.tsx b/Touchkebao/src/pages/pc/ckbox/components/NavCommon/index.tsx
index f2da7d2a..aefdc2fa 100644
--- a/Touchkebao/src/pages/pc/ckbox/components/NavCommon/index.tsx
+++ b/Touchkebao/src/pages/pc/ckbox/components/NavCommon/index.tsx
@@ -7,9 +7,10 @@ import {
UserSwitchOutlined,
LogoutOutlined,
} from "@ant-design/icons";
+
import { useUserStore } from "@/store/module/user";
-import { useCkChatStore } from "@/store/module/ckchat/ckchat";
-import { useNavigate } from "react-router-dom";
+// import { useCkChatStore } from "@/store/module/ckchat/ckchat";
+import { useNavigate, useLocation } from "react-router-dom";
import { drawerMenuData, menuList } from "./index.data";
import styles from "./index.module.scss";
@@ -28,9 +29,9 @@ const NavCommon: React.FC = ({
const [messageDrawerVisible, setMessageDrawerVisible] = useState(false);
const [messageCount] = useState(3); // 模拟消息数量
const navigate = useNavigate();
- const { userInfo } = useCkChatStore();
- const { user } = useUserStore();
- console.log(user);
+ const location = useLocation();
+ // const { userInfo } = useCkChatStore();
+ const { user, logout } = useUserStore();
// 处理菜单图标点击
const handleMenuClick = () => {
@@ -55,8 +56,8 @@ const NavCommon: React.FC = ({
// 处理退出登录
const handleLogout = () => {
- console.log("退出登录");
- // TODO: 实现退出登录逻辑
+ logout(); // 清除localStorage中的token和用户状态
+ navigate("/login"); // 跳转到登录页面
};
// 用户菜单项
@@ -106,21 +107,24 @@ const NavCommon: React.FC = ({
- {menuList.map((item, index) => (
-
{
- if (item.path) {
- navigate(item.path);
- setDrawerVisible(false);
- }
- }}
- >
-
{item.icon}
-
{item.title}
-
- ))}
+ {menuList.map((item, index) => {
+ const isActive = location.pathname === item.path;
+ return (
+
{
+ if (item.path) {
+ navigate(item.path);
+ setDrawerVisible(false);
+ }
+ }}
+ >
+
{item.icon}
+
{item.title}
+
+ );
+ })}
@@ -185,7 +189,6 @@ const NavCommon: React.FC = ({