diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 1a696ec..31425af 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -30,7 +30,10 @@ "mcp__serena__get_symbols_overview", "mcp__serena__create_text_file", "Bash(git remote add:*)", - "Bash(git add:*)" + "Bash(git add:*)", + "Bash(git remote remove:*)", + "Bash(git commit:*)", + "Bash(git push:*)" ], "deny": [], "ask": [] diff --git a/.serena/cache/typescript/document_symbols_cache_v23-06-25.pkl b/.serena/cache/typescript/document_symbols_cache_v23-06-25.pkl index 2086b89..76df669 100644 Binary files a/.serena/cache/typescript/document_symbols_cache_v23-06-25.pkl and b/.serena/cache/typescript/document_symbols_cache_v23-06-25.pkl differ diff --git a/src/components/CourseList/index.css b/src/components/CourseList/index.css index b3aa3da..907fec1 100644 --- a/src/components/CourseList/index.css +++ b/src/components/CourseList/index.css @@ -83,6 +83,14 @@ background-image: url("@/assets/images/Common/time_line_clock_icon.png"); background-size: 100% 100%; } + + .time-line-lock-icon { + width: 12px; + height: 12px; + background-image: url("@/assets/images/Common/time_line_lock_icon.png"); + background-size: 100% 100%; + opacity: 0.5; + } .time-line-item { width: 248px; height: 74px; @@ -148,6 +156,19 @@ background-size: 100% 100%; } } + .pending { + opacity: 0.6; + cursor: not-allowed; + + > p { + color: #86909c; + } + + .time-line-item-info { + color: #86909c; + } + } + .coming { &::before { content: "即将开始"; diff --git a/src/components/CourseList/index.jsx b/src/components/CourseList/index.jsx index 4ba0024..f8cd3f5 100644 --- a/src/components/CourseList/index.jsx +++ b/src/components/CourseList/index.jsx @@ -1,10 +1,74 @@ -import { Collapse, Timeline } from "@arco-design/web-react"; +import { useState, useEffect } from "react"; +import { Collapse, Timeline, Spin } from "@arco-design/web-react"; +import { getCourseLiveList } from "@/services/courseLive"; import "./index.css"; const TimelineItem = Timeline.Item; const CollapseItem = Collapse.Item; const CourseList = ({ className = "" }) => { + const [courseLiveList, setCourseLiveList] = useState([]); + const [loading, setLoading] = useState(false); + + useEffect(() => { + fetchCourseList(); + }, []); + + const fetchCourseList = async () => { + setLoading(true); + try { + const res = await getCourseLiveList(); + if (res.success) { + setCourseLiveList(res.data || []); + } + } catch (error) { + console.error("获取课程列表失败:", error); + } finally { + setLoading(false); + } + }; + + // 判断课程状态 + const getCourseStatus = (course) => { + if (course.completed) return "finish"; + if (course.current) return "active"; + + // 判断是否为即将开始(今天或明天的课程) + const courseDate = new Date(course.date); + const today = new Date(); + const tomorrow = new Date(); + tomorrow.setDate(tomorrow.getDate() + 1); + + // 重置时间部分只比较日期 + courseDate.setHours(0, 0, 0, 0); + today.setHours(0, 0, 0, 0); + tomorrow.setHours(0, 0, 0, 0); + + if (courseDate.getTime() === today.getTime() || courseDate.getTime() === tomorrow.getTime()) { + return "coming"; + } + + return "pending"; + }; + + // 获取图标类型 + const getDotIcon = (course) => { + if (course.completed) return
; + if (course.current) return
; + return
; + }; + + if (loading) { + return ( +
+

课程列表

+
+ +
+
+ ); + } + return (

课程列表

@@ -14,39 +78,34 @@ const CourseList = ({ className = "" }) => { className="course-list" bordered={false} expandIconPosition="right" + defaultActiveKey={["1"]} > - - - } - lineType="dashed" - > -
-

终生学习系统

-
- 张老师 - 2023-01-01 -
-
-
- } - lineType="dashed" - > -
-

终生学习系统

-
- 张老师 - 2023-01-01 -
-
-
-
-
+ {courseLiveList.map((unit, index) => ( + + + {unit.courses.map((course) => ( + +
+

{course.courseName}

+
+ {course.teacherName} + {course.date} +
+
+
+ ))} +
+
+ ))}
diff --git a/src/components/LiveSummary/index.css b/src/components/LiveSummary/index.css index a994a6b..7507b0a 100644 --- a/src/components/LiveSummary/index.css +++ b/src/components/LiveSummary/index.css @@ -35,16 +35,7 @@ background-size: 100% 100%; } - &::after { - content: ""; - position: absolute; - right: 0; - bottom: 10px; - width: 62px; - height: 20px; - background-image: url("@/assets/images/CoursesVideoPlayer/living_icon.png"); - background-size: 100% 100%; - } + } .live-summary-list { width: 100%; diff --git a/src/components/LiveSummary/index.jsx b/src/components/LiveSummary/index.jsx index 15a4d90..32ee36a 100644 --- a/src/components/LiveSummary/index.jsx +++ b/src/components/LiveSummary/index.jsx @@ -10,8 +10,15 @@ const LiveSummary = ({ className = "", showBtn = false, isLiving = true }) => { navigate("/job-strategy-detail"); }; - // 根据type分组keyPoints - const groupedPoints = jobStrategyNotes.keyPoints.reduce((acc, point) => { + // 按时间排序keyPoints(从早到晚) + const sortedPoints = [...jobStrategyNotes.keyPoints].sort((a, b) => { + const timeA = a.time.split(':').map(Number); + const timeB = b.time.split(':').map(Number); + return (timeA[0] * 60 + timeA[1]) - (timeB[0] * 60 + timeB[1]); + }); + + // 根据type分组排序后的keyPoints + const groupedPoints = sortedPoints.reduce((acc, point) => { const typeMap = { strategy: "策略建议", advice: "专家建议", diff --git a/src/data/mockData.js b/src/data/mockData.js index 74c6942..288dc24 100644 --- a/src/data/mockData.js +++ b/src/data/mockData.js @@ -4517,4 +4517,118 @@ mockData.profileOverview = { }, }; +// 课程直播间的课程列表数据 +mockData.courseLiveList = [ + { + unitId: "unit1", + unitName: "岗位体系认知", + courses: [ + { courseId: "c1-1", courseName: "教育体系认知", teacherName: "李老师", date: "2025-08-20", completed: true, current: false }, + { courseId: "c1-2", courseName: "现代文旅类企业的管理体系", teacherName: "王老师", date: "2025-08-21", completed: true, current: false }, + { courseId: "c1-3", courseName: "专科生的职业规划", teacherName: "张老师", date: "2025-08-22", completed: true, current: false } + ] + }, + { + unitId: "unit2", + unitName: "产业认知课", + courses: [ + { courseId: "c2-1", courseName: "文旅产业认知课", teacherName: "陈老师", date: "2025-08-23", completed: true, current: false }, + { courseId: "c2-2", courseName: "行业详解:旅游行业", teacherName: "赵老师", date: "2025-08-24", completed: true, current: false }, + { courseId: "c2-3", courseName: "行业详解:酒店与民宿行业", teacherName: "刘老师", date: "2025-08-25", completed: true, current: false }, + { courseId: "c2-4", courseName: "行业详解:活动与会展行业", teacherName: "周老师", date: "2025-08-26", completed: true, current: false }, + { courseId: "c2-5", courseName: "行业详解:文化服务行业", teacherName: "吴老师", date: "2025-08-27", completed: false, current: true } + ] + }, + { + unitId: "unit3", + unitName: "旅游产业全景与文旅基础知识", + courses: [ + { courseId: "c3-1", courseName: "现代文旅产业生态图谱", teacherName: "郑老师", date: "2025-08-28", completed: false, current: false }, + { courseId: "c3-2", courseName: "文旅政策法规与风险管理", teacherName: "王老师", date: "2025-08-29", completed: false, current: false }, + { courseId: "c3-3", courseName: "旅游产品与旅游资源", teacherName: "李老师", date: "2025-08-30", completed: false, current: false }, + { courseId: "c3-4", courseName: "游客行为心理学基础", teacherName: "张老师", date: "2025-08-31", completed: false, current: false }, + { courseId: "c3-5", courseName: "可持续旅游发展", teacherName: "陈老师", date: "2025-09-01", completed: false, current: false }, + { courseId: "c3-6", courseName: "单元小结", teacherName: "赵老师", date: "2025-09-02", completed: false, current: false } + ] + }, + { + unitId: "unit4", + unitName: "文旅服务:形象、沟通与体验的融合艺术", + courses: [ + { courseId: "c4-1", courseName: "文旅场景职业形象IP塑造", teacherName: "刘老师", date: "2025-09-03", completed: false, current: false }, + { courseId: "c4-2", courseName: "情境化服务体验设计", teacherName: "周老师", date: "2025-09-04", completed: false, current: false }, + { courseId: "c4-3", courseName: "政务商务接待专项礼仪", teacherName: "吴老师", date: "2025-09-05", completed: false, current: false }, + { courseId: "c4-4", courseName: "文旅服务中的非语言表达", teacherName: "郑老师", date: "2025-09-06", completed: false, current: false }, + { courseId: "c4-5", courseName: "服务沟通技巧与表达训练", teacherName: "王老师", date: "2025-09-07", completed: false, current: false }, + { courseId: "c4-6", courseName: "多元文化下的服务表达差异", teacherName: "李老师", date: "2025-09-08", completed: false, current: false }, + { courseId: "c4-7", courseName: "单元小结", teacherName: "张老师", date: "2025-09-09", completed: false, current: false } + ] + }, + { + unitId: "unit5", + unitName: "文旅与供应链基础", + courses: [ + { courseId: "c5-1", courseName: "供应链管理的内容", teacherName: "陈老师", date: "2025-09-10", completed: false, current: false }, + { courseId: "c5-2", courseName: "文旅资源调度", teacherName: "赵老师", date: "2025-09-11", completed: false, current: false }, + { courseId: "c5-3", courseName: "文旅产品全生命周期管理", teacherName: "刘老师", date: "2025-09-12", completed: false, current: false }, + { courseId: "c5-4", courseName: "文旅商品供应链", teacherName: "周老师", date: "2025-09-13", completed: false, current: false }, + { courseId: "c5-5", courseName: "住宿业资源协同", teacherName: "吴老师", date: "2025-09-14", completed: false, current: false }, + { courseId: "c5-6", courseName: "小型文旅项目的供应链角色模拟", teacherName: "郑老师", date: "2025-09-15", completed: false, current: false }, + { courseId: "c5-7", courseName: "文旅项目供应链特征", teacherName: "王老师", date: "2025-09-16", completed: false, current: false }, + { courseId: "c5-8", courseName: "文旅供应链中的B2B与B2C模式", teacherName: "李老师", date: "2025-09-17", completed: false, current: false }, + { courseId: "c5-9", courseName: "单元小结", teacherName: "张老师", date: "2025-09-18", completed: false, current: false } + ] + }, + { + unitId: "unit6", + unitName: "商业设计基础", + courses: [ + { courseId: "c6-1", courseName: "现代设计行业的发展现状", teacherName: "陈老师", date: "2025-09-19", completed: false, current: false }, + { courseId: "c6-2", courseName: "设计基础", teacherName: "赵老师", date: "2025-09-20", completed: false, current: false }, + { courseId: "c6-3", courseName: "字体设计与中文字体情绪表达", teacherName: "刘老师", date: "2025-09-21", completed: false, current: false }, + { courseId: "c6-4", courseName: "商业平面色彩搭配", teacherName: "周老师", date: "2025-09-22", completed: false, current: false }, + { courseId: "c6-5", courseName: "平面设计构图", teacherName: "吴老师", date: "2025-09-23", completed: false, current: false }, + { courseId: "c6-6", courseName: "图像编辑工具:Photoshop", teacherName: "郑老师", date: "2025-09-24", completed: false, current: false }, + { courseId: "c6-7", courseName: "矢量与标志设计:Illustrator", teacherName: "王老师", date: "2025-09-25", completed: false, current: false }, + { courseId: "c6-8", courseName: "快速设计工具使用:Canva", teacherName: "李老师", date: "2025-09-26", completed: false, current: false }, + { courseId: "c6-9", courseName: "移动端视觉原型设计:Figma", teacherName: "张老师", date: "2025-09-27", completed: false, current: false }, + { courseId: "c6-10", courseName: "视频剪辑入门:剪映", teacherName: "陈老师", date: "2025-09-28", completed: false, current: false }, + { courseId: "c6-11", courseName: "单元小结", teacherName: "赵老师", date: "2025-09-29", completed: false, current: false } + ] + }, + { + unitId: "unit7", + unitName: "AIGC人工智能生成内容", + courses: [ + { courseId: "c7-1", courseName: "AIGC发展简史与基本逻辑", teacherName: "刘老师", date: "2025-09-30", completed: false, current: false }, + { courseId: "c7-2", courseName: "AIGC的基本概念与各领域的应用", teacherName: "周老师", date: "2025-10-01", completed: false, current: false }, + { courseId: "c7-3", courseName: "AIGC语言模型:chatgpt的灵活应用", teacherName: "吴老师", date: "2025-10-02", completed: false, current: false }, + { courseId: "c7-4", courseName: "AIGC生成内容的版权问题与合规使用", teacherName: "郑老师", date: "2025-10-03", completed: false, current: false }, + { courseId: "c7-5", courseName: "AIGC图像生成模型:Stable Diffusion AI摄影和平面设计", teacherName: "王老师", date: "2025-10-04", completed: false, current: false }, + { courseId: "c7-6", courseName: "AIGC图像生成模型:Stable Diffusion的应用操作", teacherName: "李老师", date: "2025-10-05", completed: false, current: false }, + { courseId: "c7-7", courseName: "AIGC视频应用:音视频生成与AI自动剪辑", teacherName: "张老师", date: "2025-10-06", completed: false, current: false }, + { courseId: "c7-8", courseName: "AI词曲创作:suno", teacherName: "陈老师", date: "2025-10-07", completed: false, current: false }, + { courseId: "c7-9", courseName: "单元小结", teacherName: "赵老师", date: "2025-10-08", completed: false, current: false } + ] + }, + { + unitId: "unit8", + unitName: "全栈新媒体运营赋能文旅营销", + courses: [ + { courseId: "c8-1", courseName: "新媒体应用传播学", teacherName: "刘老师", date: "2025-10-09", completed: false, current: false }, + { courseId: "c8-2", courseName: "新媒体故事结构入门", teacherName: "周老师", date: "2025-10-10", completed: false, current: false }, + { courseId: "c8-3", courseName: "新媒体产品策划", teacherName: "吴老师", date: "2025-10-11", completed: false, current: false }, + { courseId: "c8-4", courseName: "平台账号经营与内容赛道", teacherName: "郑老师", date: "2025-10-12", completed: false, current: false }, + { courseId: "c8-5", courseName: "各平台变现方式与具体方法", teacherName: "王老师", date: "2025-10-13", completed: false, current: false }, + { courseId: "c8-6", courseName: "内容运营:短视频的制作工具", teacherName: "李老师", date: "2025-10-14", completed: false, current: false }, + { courseId: "c8-7", courseName: "内容运营:短视频制作内容对标", teacherName: "张老师", date: "2025-10-15", completed: false, current: false }, + { courseId: "c8-8", courseName: "直播运营:直播间的搭建", teacherName: "陈老师", date: "2025-10-16", completed: false, current: false }, + { courseId: "c8-9", courseName: "品牌运营:当地文化IP数字化传播", teacherName: "赵老师", date: "2025-10-17", completed: false, current: false }, + { courseId: "c8-10", courseName: "品牌运营:跨界营销创新", teacherName: "刘老师", date: "2025-10-18", completed: false, current: false }, + { courseId: "c8-11", courseName: "私域运营:私域流量池的运营", teacherName: "周老师", date: "2025-10-19", completed: false, current: false }, + { courseId: "c8-12", courseName: "单元小结", teacherName: "吴老师", date: "2025-10-20", completed: false, current: false } + ] + } +]; + // 模拟数据加载完成 diff --git a/src/pages/ProjectLibraryPage/components/ProjectCasesModal/index.css b/src/pages/ProjectLibraryPage/components/ProjectCasesModal/index.css index d078284..df91472 100644 --- a/src/pages/ProjectLibraryPage/components/ProjectCasesModal/index.css +++ b/src/pages/ProjectLibraryPage/components/ProjectCasesModal/index.css @@ -275,6 +275,7 @@ color: #1d2129; font-size: 14px; line-height: 1.6; + text-align: left; h1, h2, h3, h4, h5, h6 { color: #1d2129; @@ -293,6 +294,7 @@ p { margin: 8px 0; line-height: 1.6; + text-align: left; } ul, ol { @@ -303,6 +305,7 @@ li { margin: 4px 0; line-height: 1.6; + text-align: left; } ul li { diff --git a/src/services/courseLive.js b/src/services/courseLive.js new file mode 100644 index 0000000..db5e5ca --- /dev/null +++ b/src/services/courseLive.js @@ -0,0 +1,39 @@ +import { mockData } from "@/data/mockData"; + +// 获取课程直播列表 +export async function getCourseLiveList() { + // 模拟异步请求 + return Promise.resolve({ + success: true, + data: mockData.courseLiveList || [], + }); +} + +// 获取课程详情 +export async function getCourseDetail(courseId) { + // 模拟异步请求 + const allCourses = []; + mockData.courseLiveList?.forEach(unit => { + allCourses.push(...unit.courses); + }); + + const course = allCourses.find(c => c.courseId === courseId); + + return Promise.resolve({ + success: true, + data: course || null, + }); +} + +// 更新课程进度 +export async function updateCourseProgress(courseId, progress) { + // 模拟异步请求 + return Promise.resolve({ + success: true, + data: { + courseId, + progress, + message: "进度更新成功", + }, + }); +} \ No newline at end of file