From 161635a5d2f3f4fe012c4319a14ec4eeb7b0940d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=89=8D=E7=AB=AF=E4=BA=BA=E7=BB=9D=E4=B8=8D=E4=B8=BA?= =?UTF-8?q?=E5=A5=B4?= Date: Mon, 18 Aug 2025 14:18:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=AE=B8=E5=A4=9A=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.jsx | 77 +-- src/assets/iconfont/iconfont.js | 1 + src/assets/images/Sidebar/btn_icon.png | Bin 0 -> 988 bytes src/assets/images/Sidebar/logo.png | Bin 0 -> 37097 bytes src/components/IconFont/index.jsx | 13 + src/components/Layout/MessageNotification.jsx | 165 ----- src/components/Layout/Sidebar.jsx | 143 ----- src/components/Layout/index.css | 570 +----------------- src/components/Layout/index.jsx | 36 +- .../{common/Portal.jsx => Portal/index.jsx} | 0 src/components/Sidebar/index.css | 194 ++++++ src/components/Sidebar/index.jsx | 81 +++ src/{normalize.css => global.css} | 8 + .../components/EventDetailModal.jsx | 4 +- .../components/JobList/index.css | 1 - src/pages/ExpertSupportPage/index.css | 89 +-- src/pages/ExpertSupportPage/index.jsx | 2 +- .../components/InterviewRating/index.jsx | 2 +- src/pages/InterviewSimulationPage/index.jsx | 4 - src/routes/index.jsx | 173 ++++++ src/services/index.js | 0 src/utils/request.js | 43 ++ 22 files changed, 595 insertions(+), 1011 deletions(-) create mode 100644 src/assets/iconfont/iconfont.js create mode 100644 src/assets/images/Sidebar/btn_icon.png create mode 100644 src/assets/images/Sidebar/logo.png create mode 100644 src/components/IconFont/index.jsx delete mode 100644 src/components/Layout/MessageNotification.jsx delete mode 100644 src/components/Layout/Sidebar.jsx rename src/components/{common/Portal.jsx => Portal/index.jsx} (100%) create mode 100644 src/components/Sidebar/index.css create mode 100644 src/components/Sidebar/index.jsx rename src/{normalize.css => global.css} (96%) create mode 100644 src/routes/index.jsx create mode 100644 src/services/index.js create mode 100644 src/utils/request.js diff --git a/src/App.jsx b/src/App.jsx index 2956cf7..f045f93 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,63 +1,42 @@ -import { - BrowserRouter as Router, - Routes, - Route, - Navigate, -} from "react-router-dom"; +import { BrowserRouter, Route, Routes } from "react-router-dom"; import Layout from "./components/Layout"; -import Dashboard from "./pages/Dashboard"; -import CalendarPage from "./pages/CalendarPage"; -import LivePage from "./pages/LivePage"; -import HomeworkPage from "./pages/HomeworkPage"; -import ProjectLibraryPage from "./pages/ProjectLibraryPage"; -import PersonalProfile from "./pages/PersonalProfile"; -import CareerTreePage from "./pages/CareerTreePage"; -import CompanyJobsPage from "./pages/CompanyJobsPage"; -import CompanyJobsListPage from "./pages/CompanyJobsListPage"; -import JobStrategyPage from "./pages/JobStrategyPage"; -import JobStrategyDetailPage from "./pages/JobStrategyDetailPage"; -import InterviewSimulationPage from "./pages/InterviewSimulationPage"; -import ExpertSupportPage from "./pages/ExpertSupportPage"; -import Portfolio from "./pages/Portfolio"; -import PublicCourses from "./pages/PublicCourses"; -import ResumeInterviewPage from "./pages/ResumeInterviewPage"; +import routes from "./routes"; // 样式文件导入 -import "./normalize.css"; +import "./global.css"; import "@arco-design/web-react/dist/css/arco.css"; +const getAllRoutes = (routes) => { + const result = []; + + const traverse = (routeItems) => { + routeItems.forEach((item) => { + if (item.routes) { + // 如果有子路由,递归处理 + traverse(item.routes); + } else if (item.path && item.element) { + // 如果是单个路由项,添加到结果数组 + result.push(item); + } + }); + }; + + traverse(routes); + return result; +}; + function App() { + const allRoutes = getAllRoutes(routes); return ( - + - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } - /> - } /> - } /> - - } - /> - } /> + {allRoutes?.map((item) => ( + + ))} - + ); } diff --git a/src/assets/iconfont/iconfont.js b/src/assets/iconfont/iconfont.js new file mode 100644 index 0000000..f0d7ee3 --- /dev/null +++ b/src/assets/iconfont/iconfont.js @@ -0,0 +1 @@ +window._iconfont_svg_string_4525204='',(l=>{var c=(a=(a=document.getElementsByTagName("script"))[a.length-1]).getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var o,h,i,t,s,e=function(c,a){a.parentNode.insertBefore(c,a)};if(c&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}o=function(){var c,a=document.createElement("div");a.innerHTML=l._iconfont_svg_string_4525204,(a=a.getElementsByTagName("svg")[0])&&(a.setAttribute("aria-hidden","true"),a.style.position="absolute",a.style.width=0,a.style.height=0,a.style.overflow="hidden",a=a,(c=document.body).firstChild?e(a,c.firstChild):c.appendChild(a))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(o,0):(h=function(){document.removeEventListener("DOMContentLoaded",h,!1),o()},document.addEventListener("DOMContentLoaded",h,!1)):document.attachEvent&&(i=o,t=l.document,s=!1,m(),t.onreadystatechange=function(){"complete"==t.readyState&&(t.onreadystatechange=null,v())})}function v(){s||(s=!0,i())}function m(){try{t.documentElement.doScroll("left")}catch(c){return void setTimeout(m,50)}v()}})(window); \ No newline at end of file diff --git a/src/assets/images/Sidebar/btn_icon.png b/src/assets/images/Sidebar/btn_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ab39494e00d93962dd85d8b30fcdf4f092255059 GIT binary patch literal 988 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ᡏz9u^` z;{Vwn2?$8lH}lu@Dggy<6~How-5#H|z<0kPzX^=sbVL8m%nxr{4WPAU+Iw;F0{5PV zJE>lv8A9V&)|O06ed3`lm6*B^r-?kPI%N9)?PFrzE)uhs>B0k9RIwHm1LkK&@Hi?D z6mZ;6ZBf*K_}1JJDY*tA1@!?|%!F&8y$tk;GDIlG+l{p`o_|u~Swp`*ybJ&%+7P4R z87dia$nH%?!*n{OD%oc!xOWi9o@Iz+dJ_`&aSG>21{QVtn7RDSOYaw{q-Un~f^M>R z3)$(=V;`gT8Oks1&Mw`H1#Sx6Y$?xb2xmGCI;T6^(Z6md8bG^SOzeLuMo_FtTQpq^ z!S-94v`sDRUh@bo0P!0S*sI4VyUGO`h4KagdJu*0Zi*ytBx+=7I6_$=Asigm0uoJ4B@I>ef2B;;;CWy

~1T=KpATgjc}IX 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 literal 0 HcmV?d00001 diff --git a/src/components/IconFont/index.jsx b/src/components/IconFont/index.jsx new file mode 100644 index 0000000..641f065 --- /dev/null +++ b/src/components/IconFont/index.jsx @@ -0,0 +1,13 @@ +import "@/assets/iconfont/iconfont.js"; + +const IconFont = (props) => { + const { className, name, onClick } = props; + + return ( + + ); +}; + +export default IconFont; diff --git a/src/components/Layout/MessageNotification.jsx b/src/components/Layout/MessageNotification.jsx deleted file mode 100644 index 7e418a6..0000000 --- a/src/components/Layout/MessageNotification.jsx +++ /dev/null @@ -1,165 +0,0 @@ -import React, { useEffect, useRef } from "react"; -import { mockData } from "@/data/mockData"; -import Portal from "../common/Portal"; - -const MessageNotification = ({ isOpen, onClose, onMarkAllRead }) => { - const { notifications } = mockData; - const popupRef = useRef(null); - - // 点击外部关闭浮窗 - useEffect(() => { - const handleClickOutside = (event) => { - if (popupRef.current && !popupRef.current.contains(event.target)) { - onClose(); - } - }; - - if (isOpen) { - document.addEventListener("mousedown", handleClickOutside); - } - - return () => { - document.removeEventListener("mousedown", handleClickOutside); - }; - }, [isOpen, onClose]); - - // 获取消息类型图标 - const getMessageIcon = (type) => { - const icons = { - system: "⚙️", - course: "📚", - assignment: "📝", - announcement: "📢", - }; - return icons[type] || "📬"; - }; - - // 获取优先级颜色 - const getPriorityColor = (priority) => { - const colors = { - high: "#ef4444", - medium: "#f59e0b", - low: "#10b981", - }; - return colors[priority] || "#6b7280"; - }; - - // 格式化时间显示 - const formatTime = (timeString) => { - const date = new Date(timeString); - const now = new Date(); - const diffInHours = Math.floor((now - date) / (1000 * 60 * 60)); - - if (diffInHours < 1) { - return "刚刚"; - } else if (diffInHours < 24) { - return `${diffInHours}小时前`; - } else { - const diffInDays = Math.floor(diffInHours / 24); - return `${diffInDays}天前`; - } - }; - - // 处理消息点击 - const handleMessageClick = (message) => { - // 这里可以添加具体的消息处理逻辑 - }; - - // 处理全部标记已读 - const handleMarkAllReadClick = () => { - onMarkAllRead(); - }; - - if (!isOpen) { - return null; - } - - return ( - -

- {/* 浮窗头部 */} -
-

系统消息

-
- {notifications.unreadCount > 0 && ( - - )} - -
-
- - {/* 消息列表 */} -
- {notifications.messages.length === 0 ? ( -
-
📭
-

暂无消息通知

-
- ) : ( -
- {notifications.messages.map((message) => ( -
handleMessageClick(message)} - > -
- - {getMessageIcon(message.type)} - - {!message.isRead && ( -
- )} -
- -
-
-
{message.title}
- - {formatTime(message.time)} - -
-

{message.content}

-
-
- ))} -
- )} -
- - {/* 浮窗底部 */} -
- - 共 {notifications.messages.length} 条消息 - -
-
- - ); -}; - -export default MessageNotification; diff --git a/src/components/Layout/Sidebar.jsx b/src/components/Layout/Sidebar.jsx deleted file mode 100644 index de73bfb..0000000 --- a/src/components/Layout/Sidebar.jsx +++ /dev/null @@ -1,143 +0,0 @@ -import { useState, useEffect } from "react"; -import { useNavigate, useLocation } from "react-router-dom"; -import { mockData } from "@/data/mockData"; - -const navigation = { - sections: [ - { - title: "个人区块", - items: [ - { name: "🏠 主页", path: "/dashboard", active: true }, - { name: "👤 个人档案", path: "/profile" }, - { name: "📅 日历", path: "/calendar" }, - ], - }, - { - title: "课程区块", - items: [ - { name: "📺 公共课直播间", path: "/public-courses" }, - { name: "📺 课程直播间", path: "/live" }, - { name: "🌳 就业管家知识树", path: "/career-tree" }, - { name: "📝 课后作业", path: "/homework" }, - { - name: "🎯 1V1定制求职策略", - path: ["/job-strategy", "/job-strategy-detail"], - }, - { name: "🎭 线下面试模拟", path: "/interview-simulation" }, - ], - }, - { - title: "资源区块", - items: [ - { name: "🏥 专家支持中心", path: "/expert-support" }, - { - name: "🏢 企业内推岗位", - path: ["/company-jobs", "/company-jobs-list"], - }, - { name: "📄 我的简历与面试题", path: "/resume-interview" }, - { name: "📚 我的项目库", path: "/project-library" }, - { name: "📚 我的作品集", path: "/portfolio" }, - ], - }, - ], -}; - -const Sidebar = () => { - const navigate = useNavigate(); - const location = useLocation(); - const { user } = mockData; - - // 侧边栏折叠状态,从localStorage恢复状态 - const [isCollapsed, setIsCollapsed] = useState(() => { - const saved = localStorage.getItem("sidebar-collapsed"); - return saved === "true"; - }); - - // 保存状态到localStorage并发送事件 - useEffect(() => { - localStorage.setItem("sidebar-collapsed", isCollapsed.toString()); - // 发送自定义事件通知Layout组件状态变化 - const event = new CustomEvent("sidebarToggle", { - detail: { isCollapsed }, - }); - window.dispatchEvent(event); - }, [isCollapsed]); - - const handleNavClick = (path) => { - if (Array.isArray(path)) { - navigate(path[0]); - } else { - navigate(path); - } - }; - - // 切换侧边栏展开/折叠状态 - const toggleSidebar = () => { - setIsCollapsed(!isCollapsed); - }; - - return ( - <> -
- {/* 顶部Logo和标题 */} -
-
- {!isCollapsed && ( -
多多畅职教务系统
- )} -
- - {/* 用户信息 - 纯静态展示 */} -
-
- {!isCollapsed && ( -
-

{user.name}

-
- )} -
- - {/* 导航菜单 */} -
- {navigation.sections.map((section, sectionIndex) => ( -
- {isCollapsed ? ( -
- {section.title.charAt(0)} -
- ) : ( -
{section.title}
- )} - {section.items.map((item, itemIndex) => ( - - ))} -
- ))} -
-
- - {/* 悬浮的折叠/展开按钮 */} - - - ); -}; - -export default Sidebar; diff --git a/src/components/Layout/index.css b/src/components/Layout/index.css index fb65b2a..9be72e6 100644 --- a/src/components/Layout/index.css +++ b/src/components/Layout/index.css @@ -1,583 +1,15 @@ -/* 全局z-index层级系统 - 确保弹窗层级的最佳实践 */ -:root { - /* z-index层级标准 - 数值间隔1000确保充足的层级空间 */ - --z-modal: 10000; /* 模态框 - 最高层级,包括系统消息弹窗 */ - --z-popup: 9000; /* 弹出框 - 次高层级,如用户菜单、下拉框 */ - --z-tooltip: 8000; /* 提示框 - 中等层级,如悬浮提示 */ - --z-dropdown: 7000; /* 下拉菜单 - 较低层级 */ - --z-header: 1000; /* 页头导航 - 基础层级 */ - --z-content: 1; /* 页面内容 - 默认层级 */ -} - -/* Layout组件专用变量定义 - 不与其他文件共享 */ -.app-layout, -.sidebar, -.app-layout *, -.sidebar * { - --primary-color: #3b82f6; - --text-primary: #111827; - --text-secondary: #6b7280; - --card-bg: #ffffff; - --sidebar-bg: #ffffff; - --border-color: #e5e7eb; -} - /* 布局相关样式 */ .app-layout { display: flex; min-height: 100vh; - width: 100vw; -} - -/* 侧边栏样式 */ -.sidebar { - width: 280px; /* 增加宽度避免内容换行 */ - background: var(--sidebar-bg); - border-right: 1px solid var(--border-color); - display: flex; - flex-direction: column; - position: fixed; /* 固定定位同时作为子元素的定位上下文 */ - height: 100%; - overflow: hidden; - transition: width 0.3s ease; -} - -/* 侧边栏滚动条样式 - 极简清透设计 */ -.sidebar::-webkit-scrollbar { - width: 6px; /* 纤细的滚动条 */ -} - -.sidebar::-webkit-scrollbar-track { - background: transparent; /* 透明轨道 */ - margin: 10px 0; /* 上下留边 */ -} - -.sidebar::-webkit-scrollbar-thumb { - background: rgba(0, 0, 0, 0.1); /* 半透明滑块 */ - border-radius: 3px; - transition: background 0.2s ease; -} - -.sidebar::-webkit-scrollbar-thumb:hover { - background: rgba(0, 0, 0, 0.2); /* 悬停时加深 */ -} - -/* Firefox滚动条样式 */ -.sidebar { - scrollbar-width: thin; - scrollbar-color: rgba(0, 0, 0, 0.1) transparent; -} - -/* 折叠状态的侧边栏 */ -.sidebar.collapsed { - width: 64px; -} - -.sidebar-header { - padding: 20px 16px; - border-bottom: 1px solid var(--border-color); - display: flex; - align-items: center; - justify-content: flex-start; - gap: 12px; -} - -.sidebar-logo { - width: 32px; - height: 32px; - background: var(--primary-color); - border-radius: 6px; - display: flex; - align-items: center; - justify-content: center; - color: white; - font-weight: 600; -} - -.sidebar-title { - font-size: 14px; - font-weight: 500; - color: var(--text-primary); -} - -.user-profile { - padding: 16px; - display: flex; - align-items: center; - gap: 12px; - border-bottom: 1px solid var(--border-color); -} - -.user-avatar { - width: 40px; - height: 40px; - min-width: 40px; - min-height: 40px; - border-radius: 50% !important; - background: #e5e7eb; - background-image: url('data:image/svg+xml;utf8,'); - background-size: 20px; - background-repeat: no-repeat; - background-position: center; - flex-shrink: 0; - flex-grow: 0; -} - -.user-info h4 { - font-size: 14px; - font-weight: 500; - color: var(--text-primary); -} - -/* 导航菜单样式 */ -.nav-menu { - flex: 1; - padding: 8px 0; - overflow-y: auto; -} - -.nav-section { - margin-bottom: 8px; -} - -.nav-section-title { - padding: 8px 16px; - font-size: 13px; - font-weight: 600; - color: var(--text-secondary); - text-transform: uppercase; - letter-spacing: 0.05em; -} - -.nav-item { - display: block; - padding: 8px 16px; - color: var(--text-secondary); - text-decoration: none; - font-size: 14px; - transition: all 0.15s ease; - border: none; - background: none; width: 100%; - text-align: left; - cursor: pointer; + background-color: #f2f3f5; } - -.nav-item:hover { - background: #f3f4f6; - color: var(--text-primary); -} - -.nav-item.active { - background: #eff6ff; - color: var(--primary-color); - font-weight: 500; -} - -/* 折叠状态下的区块标题 */ -.nav-section-title-collapsed { - padding: 8px 16px; - font-size: 12px; - font-weight: 600; - color: var(--text-secondary); - text-align: center; - border-bottom: 1px solid #f3f4f6; - margin-bottom: 4px; -} - -/* 悬浮的折叠/展开按钮 */ -.sidebar-float-toggle { - position: fixed; - top: 5%; /* 垂直居中 */ - left: 260px; /* 默认位置:侧边栏宽度 */ - transform: translateY(-50%); - width: 20px; - height: 50px; - background: linear-gradient(135deg, #3b82f6, #2563eb); - border: none; - border-radius: 0 10px 10px 0; /* 右侧圆角 */ - color: white; - cursor: pointer; - font-size: 10px; - transition: all 0.3s ease; - display: flex; - align-items: center; - justify-content: center; - box-shadow: 2px 0 10px rgba(59, 130, 246, 0.3); - z-index: 1001; /* 确保在侧边栏上方 */ - opacity: 0.9; - backdrop-filter: blur(4px); -} - -/* 折叠状态的按钮位置 */ -.sidebar-float-toggle.collapsed { - left: 64px; /* 折叠时的侧边栏宽度 */ -} - -/* 悬停效果 */ -.sidebar-float-toggle:hover { - opacity: 1; - width: 28px; - background: linear-gradient(135deg, #2563eb, #1d4ed8); - box-shadow: 3px 0 15px rgba(59, 130, 246, 0.4); - transform: translateY(-50%) translateX(2px); -} - -/* 图标动画 */ -.toggle-icon { - transition: transform 0.3s ease; - display: inline-block; -} - -.sidebar-float-toggle:hover .toggle-icon { - transform: scale(1.2); -} - -/* 旧的toggle-btn样式已被sidebar-float-toggle替代 */ - -/* 折叠状态下的特殊样式 */ -.sidebar.collapsed .nav-item { - padding: 8px 12px; - text-align: center; - font-size: 16px; - min-height: 40px; - display: flex; - align-items: center; - justify-content: center; -} - -.sidebar.collapsed .user-profile { - justify-content: center; - padding: 16px 12px; -} - -.sidebar.collapsed .sidebar-header { - justify-content: center; - padding: 20px 12px; -} - /* 主内容区域 */ .main-content { flex: 1; - margin-left: 280px; /* 配合侧边栏宽度调整 */ overflow: hidden; transition: margin-left 0.3s ease; display: flex; flex-direction: column; - background-color: #f2f3f5; -} - -/* 当侧边栏折叠时的主内容区域 */ -.main-content.sidebar-collapsed { - margin-left: 64px; -} - -/* 用户信息区域优化 */ -.user-info { - display: flex; - align-items: center; - justify-content: space-between; - width: 100%; -} - -/* 消息图标容器 */ -.message-icon-container { - position: relative; - cursor: pointer; - padding: 4px; - border-radius: 6px; - transition: background-color 150ms ease; - display: flex; - align-items: center; - justify-content: center; -} - -.message-icon-container:hover { - background-color: #f3f4f6; -} - -/* 消息图标 */ -.message-icon { - font-size: 18px; - color: #6b7280; - transition: color 150ms ease; -} - -.message-icon-container:hover .message-icon { - color: #374151; -} - -/* 未读消息徽章 */ -.message-badge { - position: absolute; - top: -2px; - right: -2px; - background: #ef4444; - color: white; - border-radius: 50%; - min-width: 16px; - height: 16px; - font-size: 10px; - font-weight: 600; - display: flex; - align-items: center; - justify-content: center; - animation: messagePulse 2s ease-in-out infinite; -} - -/* 未读徽章动画 */ -@keyframes messagePulse { - 0%, - 100% { - transform: scale(1); - } - 50% { - transform: scale(1.1); - } -} - -/* 消息通知浮窗遮罩 - 已由Portal替代,保留样式以防回退 */ -.message-notification-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: var(--z-modal); - pointer-events: none; -} - -/* 消息通知浮窗 - 使用全局z-index系统 */ -.message-notification-popup { - position: fixed; /* Portal渲染到body,使用fixed定位 */ - top: 120px; - left: 280px; - width: 320px; - max-height: 400px; - background: #ffffff; - border-radius: 8px; - box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15), 0 4px 6px rgba(0, 0, 0, 0.1); - border: 1px solid #e5e7eb; - pointer-events: auto; - opacity: 1; - transform: translateY(0); - z-index: var(--z-modal); /* 使用全局变量确保最高层级 */ - display: flex; - flex-direction: column; - overflow: hidden; -} - -/* 浮窗淡入动画 */ -@keyframes notificationFadeIn { - from { - opacity: 0; - transform: translateY(-8px) scale(0.95); - } - to { - opacity: 1; - transform: translateY(0) scale(1); - } -} - -/* 浮窗头部 */ -.message-notification-header { - display: flex; - justify-content: space-between; - align-items: center; - padding: 16px 16px 12px 16px; - border-bottom: 1px solid #f3f4f6; -} - -.message-notification-title { - margin: 0; - font-size: 14px; - font-weight: 600; - color: #111827; -} - -.message-notification-actions { - display: flex; - align-items: center; - gap: 8px; -} - -.mark-all-read-btn { - font-size: 12px; - color: #3b82f6; - background: none; - border: none; - cursor: pointer; - padding: 4px 8px; - border-radius: 4px; - transition: background-color 150ms ease; -} - -.mark-all-read-btn:hover { - background-color: #eff6ff; -} - -.close-btn { - font-size: 18px; - color: #9ca3af; - background: none; - border: none; - cursor: pointer; - padding: 4px; - border-radius: 4px; - transition: all 150ms ease; - line-height: 1; -} - -.close-btn:hover { - background-color: #f3f4f6; - color: #6b7280; -} - -/* 浮窗内容区域 */ -.message-notification-content { - flex: 1; - max-height: 300px; - overflow-y: auto; - padding: 8px 0; - background: #ffffff; -} - -/* 滚动条样式 */ -.message-notification-content::-webkit-scrollbar { - width: 4px; -} - -.message-notification-content::-webkit-scrollbar-track { - background: transparent; -} - -.message-notification-content::-webkit-scrollbar-thumb { - background-color: #e5e7eb; - border-radius: 2px; -} - -.message-notification-content::-webkit-scrollbar-thumb:hover { - background-color: #d1d5db; -} - -/* 消息列表 */ -.message-list { - display: flex; - flex-direction: column; -} - -/* 消息项 */ -.message-item { - display: flex; - gap: 12px; - padding: 12px 16px; - cursor: pointer; - transition: background-color 150ms ease; - border-left: 2px solid transparent; -} - -.message-item:hover { - background-color: #f9fafb; -} - -.message-item.unread { - background-color: #fefefe; - border-left-color: #3b82f6; -} - -.message-item.read { - opacity: 0.8; -} - -/* 消息图标包装器 */ -.message-icon-wrapper { - position: relative; - flex-shrink: 0; -} - -.message-type-icon { - font-size: 16px; - display: block; -} - -.message-priority-dot { - position: absolute; - top: -2px; - right: -2px; - width: 6px; - height: 6px; - border-radius: 50%; -} - -/* 消息内容 */ -.message-content { - flex: 1; - min-width: 0; -} - -.message-header { - display: flex; - justify-content: space-between; - align-items: flex-start; - gap: 8px; - margin-bottom: 4px; -} - -.message-title { - margin: 0; - font-size: 13px; - font-weight: 500; - color: #111827; - line-height: 1.3; -} - -.message-time { - font-size: 11px; - color: #9ca3af; - flex-shrink: 0; -} - -.message-text { - margin: 0; - font-size: 12px; - color: #6b7280; - line-height: 1.4; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; -} - -/* 空消息状态 */ -.empty-messages { - text-align: center; - padding: 32px 16px; - color: #9ca3af; -} - -.empty-icon { - font-size: 32px; - margin-bottom: 8px; -} - -.empty-messages p { - margin: 0; - font-size: 13px; -} - -/* 浮窗底部 */ -.message-notification-footer { - padding: 12px 16px; - border-top: 1px solid #f3f4f6; - text-align: center; - background: #fafafa; - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; - flex-shrink: 0; -} - -.message-count { - font-size: 11px; - color: #9ca3af; - font-weight: 500; } diff --git a/src/components/Layout/index.jsx b/src/components/Layout/index.jsx index 7a701c3..e6adb1b 100644 --- a/src/components/Layout/index.jsx +++ b/src/components/Layout/index.jsx @@ -1,42 +1,14 @@ import { useState, useEffect } from "react"; -import Sidebar from "./Sidebar"; +import Sidebar from "../Sidebar"; import "./index.css"; const Layout = ({ children }) => { - const [isCollapsed, setIsCollapsed] = useState(() => { - const saved = localStorage.getItem("sidebar-collapsed"); - return saved === "true"; - }); - - useEffect(() => { - const handleStorageChange = () => { - const saved = localStorage.getItem("sidebar-collapsed"); - setIsCollapsed(saved === "true"); - }; - - window.addEventListener("storage", handleStorageChange); - - // 监听自定义事件 - const handleSidebarToggle = (event) => { - setIsCollapsed(event.detail.isCollapsed); - }; - - window.addEventListener("sidebarToggle", handleSidebarToggle); - - return () => { - window.removeEventListener("storage", handleStorageChange); - window.removeEventListener("sidebarToggle", handleSidebarToggle); - }; - }, []); + const [isCollapsed, setIsCollapsed] = useState(true); return (
- -
- {children} -
+ +
{children}
); }; diff --git a/src/components/common/Portal.jsx b/src/components/Portal/index.jsx similarity index 100% rename from src/components/common/Portal.jsx rename to src/components/Portal/index.jsx diff --git a/src/components/Sidebar/index.css b/src/components/Sidebar/index.css new file mode 100644 index 0000000..1c3ca1c --- /dev/null +++ b/src/components/Sidebar/index.css @@ -0,0 +1,194 @@ +.sidebar-expand-wrapper { + width: 280px; + box-sizing: border-box; + position: relative; + display: flex; + justify-content: flex-start; + align-items: center; + flex-direction: column; + transition: width 0.3s ease; + overflow-x: hidden; + overflow-y: auto; + background-color: #fff; + + .sidebar-title { + width: 100%; + height: 80px; + display: flex; + justify-content: center; + align-items: center; + + > img { + width: 48px; + height: 48px; + margin-right: 10px; + transition: margin 0.3s ease; + } + > p { + color: #262626; + font-size: 20px; + font-weight: 400; + opacity: 1; + transform: translateX(0); + transition: opacity 0.3s ease, transform 0.3s ease; + white-space: nowrap; + } + } + .user-info { + width: 100%; + height: 80px; + display: flex; + justify-content: center; + align-items: center; + .user-avatar { + width: 64px; + height: 64px; + border-radius: 12px; + } + } + .visitor-count { + width: 100%; + height: 41px; + text-align: center; + font-size: 12px; + font-weight: 700; + line-height: 41px; + } + .sidebar-menu { + width: 100%; + overflow-x: hidden; + overflow-y: auto; + box-sizing: border-box; + padding: 0 20px; + display: flex; + justify-content: flex-start; + align-items: center; + flex-direction: column; + + .sidebar-menu-title { + width: 100%; + height: 36px; + text-align: left; + line-height: 36px; + color: #bfbfbf; + font-size: 14px; + font-weight: 400; + } + + .sidebar-menu-item-active { + background-color: #e8f3ff; + + .sidebar-menu-icon { + color: #0275f2 !important; + } + .sidebar-menu-text { + color: #0275f2 !important; + } + } + + .sidebar-menu-item { + width: 100%; + height: 40px; + display: flex; + justify-content: flex-start; + align-items: center; + border-radius: 8px; + cursor: pointer; + + .sidebar-menu-icon { + margin: 0 10px; + font-size: 20px; + } + .sidebar-menu-text { + margin-left: 10px; + font-size: 16px; + font-weight: 400; + color: #616065; + } + } + } + + .sidebar-btn { + width: 190px; + height: 22px; + position: absolute; + bottom: 20px; + left: 50%; + transform: translateX(-50%); + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + + > img { + width: 22px; + height: 22px; + } + + .sidebar-btn-text { + margin-left: 10px; + color: #616065; + font-size: 16px; + font-weight: 400; + opacity: 1; + transform: translateX(0); + transition: opacity 0.3s ease, transform 0.3s ease; + white-space: nowrap; + } + } +} + +.sidebar-retract-wrapper { + width: 95px; + .sidebar-title { + > img { + margin: 0; + transition: margin 0.3s ease; + } + > p { + opacity: 0; + transform: translateX(-10px); + pointer-events: none; + transition: opacity 0.3s ease, transform 0.3s ease; + width: 0; + } + } + .user-info { + margin-bottom: 41px; + } + .visitor-count { + display: none; + } + .sidebar-menu { + .sidebar-menu-title { + text-align: center; + opacity: 0; + transition: opacity 0.3s ease; + } + .sidebar-menu-item { + justify-content: center; + + .sidebar-menu-icon { + margin: 0; + } + .sidebar-menu-text { + opacity: 0; + transform: translateX(-10px); + pointer-events: none; + transition: opacity 0.3s ease, transform 0.3s ease; + width: 0; + } + } + } + + .sidebar-btn { + width: 80px; + .sidebar-btn-text { + opacity: 0; + transform: translateX(-10px); + pointer-events: none; + transition: opacity 0.3s ease, transform 0.3s ease; + width: 0; + } + } +} diff --git a/src/components/Sidebar/index.jsx b/src/components/Sidebar/index.jsx new file mode 100644 index 0000000..5629086 --- /dev/null +++ b/src/components/Sidebar/index.jsx @@ -0,0 +1,81 @@ +import { useNavigate, useLocation } from "react-router-dom"; +import { mockData } from "@/data/mockData"; +import IconFont from "@/components/IconFont"; +import Logo from "@/assets/images/Sidebar/logo.png"; +import BTNICON from "@/assets/images/Sidebar/btn_icon.png"; +import routes from "@/routes"; +import "./index.css"; + +const Sidebar = ({ isCollapsed, setIsCollapsed }) => { + const navigate = useNavigate(); + const location = useLocation(); + const { user } = mockData; + + const handleNavClick = (path) => { + navigate(path); + }; + + // 切换侧边栏展开/折叠状态 + const toggleSidebar = () => { + setIsCollapsed((prev) => !prev); + }; + + return ( +
+
+ logo +

多多畅职教育系统

+
+
+ avatar +
+
访客总数:1000
+
    + {routes + .filter((item) => item.showMenu) + ?.map((item) => ( + <> +

    + {item.name} +

    + {item.routes + ?.filter((i) => i.showMenuItem) + ?.map((j) => ( +
  • handleNavClick(j.path)} + > + + {j.name} +
  • + ))} + + ))} +
+
+ btn + 展开/收起 +
+
+ ); +}; + +export default Sidebar; diff --git a/src/normalize.css b/src/global.css similarity index 96% rename from src/normalize.css rename to src/global.css index ab332a7..e550dee 100644 --- a/src/normalize.css +++ b/src/global.css @@ -153,3 +153,11 @@ html { .arco-icon { font-size: 32; } + +.icon { + width: 1em; + height: 1em; + vertical-align: -0.15em; + fill: currentcolor; + overflow: hidden; +} diff --git a/src/pages/CalendarPage/components/EventDetailModal.jsx b/src/pages/CalendarPage/components/EventDetailModal.jsx index e4fb5bf..b03d438 100644 --- a/src/pages/CalendarPage/components/EventDetailModal.jsx +++ b/src/pages/CalendarPage/components/EventDetailModal.jsx @@ -1,5 +1,5 @@ -import React, { useEffect } from "react"; -import Portal from "@/components/common/Portal"; +import { useEffect } from "react"; +import Portal from "@/components/Portal"; const EventDetailModal = ({ isOpen, event, onClose }) => { // ESC键关闭模态框 diff --git a/src/pages/CompanyJobsPage/components/JobList/index.css b/src/pages/CompanyJobsPage/components/JobList/index.css index 4db65ff..1ccb78b 100644 --- a/src/pages/CompanyJobsPage/components/JobList/index.css +++ b/src/pages/CompanyJobsPage/components/JobList/index.css @@ -1,6 +1,5 @@ .company-jobs-page-left-list { width: 100%; - height: 100%; overflow-y: auto; display: flex; justify-content: flex-start; diff --git a/src/pages/ExpertSupportPage/index.css b/src/pages/ExpertSupportPage/index.css index 2b0e2cf..c624b2d 100644 --- a/src/pages/ExpertSupportPage/index.css +++ b/src/pages/ExpertSupportPage/index.css @@ -31,7 +31,7 @@ gap: 12px; } -.sidebar-title { +.expert-support-sidebar-title { font-size: 18px; font-weight: 600; color: #111827; @@ -164,7 +164,8 @@ } @keyframes pulse-red { - 0%, 100% { + 0%, + 100% { opacity: 1; transform: scale(1); } @@ -541,32 +542,32 @@ .expert-support-page { grid-template-columns: 300px 1fr; } - + .conversation-sidebar { width: 300px; } - + .sidebar-header { padding: 20px 16px; } - + .new-conversation-btn .btn-text { display: none; } - + .new-conversation-btn { padding: 8px; border-radius: 6px; } - + .chat-header { padding: 20px 24px; } - + .messages-container { padding: 20px 24px; } - + .chat-input-area { padding: 16px 24px; } @@ -577,40 +578,40 @@ grid-template-columns: 1fr; grid-template-rows: auto 1fr; } - + .conversation-sidebar { height: 200px; width: 100%; border-right: none; border-bottom: 1px solid #e5e7eb; } - + .sidebar-header { padding: 16px; flex-direction: column; gap: 8px; align-items: stretch; } - + .new-conversation-btn { width: 100%; justify-content: center; } - + .new-conversation-btn .btn-text { display: inline; } - - .conversation-groups { - overflow-x: auto; - } - - .conversation-list { - display: flex; - gap: 8px; - padding: 8px 16px; - } - + + .conversation-groups { + overflow-x: auto; + } + + .conversation-list { + display: flex; + gap: 8px; + padding: 8px 16px; + } + .conversation-item { min-width: 280px; flex-shrink: 0; @@ -619,27 +620,27 @@ border: 1px solid #e5e7eb; margin-bottom: 0; } - + .chat-header { padding: 16px 20px; } - + .service-title { font-size: 20px; } - + .messages-container { padding: 16px 20px; } - + .chat-input-area { padding: 16px 20px; } - + .message-bubble { max-width: 85%; } - + .chat-title-bar { padding: 16px 20px; flex-direction: column; @@ -648,33 +649,32 @@ } } - @media (max-width: 480px) { - +@media (max-width: 480px) { .chat-header { padding: 12px 16px; } - + .service-title { font-size: 18px; } - + .service-subtitle { font-size: 13px; } - + .messages-container { padding: 12px 16px; } - + .chat-input-area { padding: 12px 16px; } - + .input-container { flex-direction: column; gap: 8px; } - + .send-button { width: 100%; } @@ -703,7 +703,8 @@ border-radius: 12px; width: 90%; max-width: 480px; - box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); + box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), + 0 10px 10px -5px rgba(0, 0, 0, 0.04); overflow: hidden; animation: modalAppear 0.2s ease-out; } @@ -826,22 +827,22 @@ width: 95%; margin: 0 10px; } - + .modal-header { padding: 16px 20px; } - + .modal-content { padding: 20px; } - + .modal-actions { padding: 16px 20px; flex-direction: column; } - + .btn-secondary, .btn-primary { width: 100%; } -} \ No newline at end of file +} diff --git a/src/pages/ExpertSupportPage/index.jsx b/src/pages/ExpertSupportPage/index.jsx index 738a6ca..3db4c22 100644 --- a/src/pages/ExpertSupportPage/index.jsx +++ b/src/pages/ExpertSupportPage/index.jsx @@ -383,7 +383,7 @@ const ExpertSupportPage = () => { {/* 左侧对话记录区域 */}
-

对话记录

+

对话记录