diff --git a/apps/web/src/app/main/my-learning/page.tsx b/apps/web/src/app/main/my-learning/page.tsx
index 14278e8..5f0a7a8 100755
--- a/apps/web/src/app/main/my-learning/page.tsx
+++ b/apps/web/src/app/main/my-learning/page.tsx
@@ -1,14 +1,18 @@
import PostList from "@web/src/components/models/course/list/PostList";
import { useAuth } from "@web/src/providers/auth-provider";
+import { useMainContext } from "../layout/MainProvider";
import CourseCard from "../courses/components/CourseCard";
export default function MyLearningPage() {
const { user } = useAuth();
+ const { searchCondition } = useMainContext();
return (
<>
}
+ renderItem={(post) => (
+
+ )}
params={{
pageSize: 12,
where: {
@@ -17,6 +21,7 @@ export default function MyLearningPage() {
id: user?.id,
},
},
+ ...searchCondition,
},
}}
cols={4}>
diff --git a/apps/web/src/components/models/course/detail/CourseDetailLayout.tsx b/apps/web/src/components/models/course/detail/CourseDetailLayout.tsx
index 6154bbe..cac3bf8 100755
--- a/apps/web/src/components/models/course/detail/CourseDetailLayout.tsx
+++ b/apps/web/src/components/models/course/detail/CourseDetailLayout.tsx
@@ -19,7 +19,7 @@ export default function CourseDetailLayout() {
const [isSyllabusOpen, setIsSyllabusOpen] = useState(true);
return (
-
+ {/*
*/}
{/* 添加 Header 组件 */}
{/* 主内容区域 */}
diff --git a/apps/web/src/components/models/course/detail/CourseDetailTitle.tsx b/apps/web/src/components/models/course/detail/CourseDetailTitle.tsx
index 3ebc083..0b8da3b 100755
--- a/apps/web/src/components/models/course/detail/CourseDetailTitle.tsx
+++ b/apps/web/src/components/models/course/detail/CourseDetailTitle.tsx
@@ -1,8 +1,15 @@
import { useContext } from "react";
import { CourseDetailContext } from "./CourseDetailContext";
import { useNavigate } from "react-router-dom";
-import { BookOutlined, CalendarOutlined, EditTwoTone, EyeOutlined, ReloadOutlined } from "@ant-design/icons";
+import {
+ BookOutlined,
+ CalendarOutlined,
+ EditTwoTone,
+ EyeOutlined,
+ ReloadOutlined,
+} from "@ant-design/icons";
import dayjs from "dayjs";
+import CourseOperationBtns from "./JoinLearingButton";
export default function CourseDetailTitle() {
const {
@@ -19,14 +26,14 @@ export default function CourseDetailTitle() {
{course?.title}
-
+
{"创建于:"}
{dayjs(course?.createdAt).format("YYYY年M月D日")}
-
+
{"更新于:"}
{dayjs(course?.updatedAt).format("YYYY年M月D日")}
@@ -38,19 +45,7 @@ export default function CourseDetailTitle() {
{`学习人数${course?.studentIds?.length || 0}`}
- {canEdit && (
-
{
- const url = course?.id
- ? `/course/${course?.id}/editor`
- : "/course/editor";
- navigate(url);
- }}>
-
- {"点击编辑课程"}
-
- )}
+
);
diff --git a/apps/web/src/components/models/course/detail/JoinLearingButton.tsx b/apps/web/src/components/models/course/detail/JoinLearingButton.tsx
new file mode 100644
index 0000000..68c4243
--- /dev/null
+++ b/apps/web/src/components/models/course/detail/JoinLearingButton.tsx
@@ -0,0 +1,94 @@
+import { useAuth } from "@web/src/providers/auth-provider";
+import { useContext, useState } from "react";
+import { useNavigate, useParams } from "react-router-dom";
+import { CourseDetailContext } from "./CourseDetailContext";
+import { useStaff } from "@nice/client";
+import {
+ CheckCircleFilled,
+ CheckCircleOutlined,
+ CloseCircleFilled,
+ CloseCircleOutlined,
+ EditFilled,
+ EditTwoTone,
+ LoginOutlined,
+} from "@ant-design/icons";
+
+export default function CourseOperationBtns() {
+ const { id } = useParams();
+ const { isAuthenticated, user, hasSomePermissions, hasEveryPermissions } =
+ useAuth();
+ const navigate = useNavigate();
+ const { course, canEdit, userIsLearning } = useContext(CourseDetailContext);
+ const { update } = useStaff();
+ const [isHovered, setIsHovered] = useState(false);
+ const toggleLearning = async () => {
+ if (!userIsLearning) {
+ await update.mutateAsync({
+ where: { id: user?.id },
+ data: {
+ learningPosts: {
+ connect: { id: course.id },
+ },
+ },
+ });
+ } else {
+ await update.mutateAsync({
+ where: { id: user?.id },
+ data: {
+ learningPosts: {
+ disconnect: {
+ id: course.id,
+ },
+ },
+ },
+ });
+ }
+ };
+ return (
+ <>
+ {isAuthenticated && (
+
setIsHovered(true)}
+ onMouseLeave={() => setIsHovered(false)}
+ className={`flex px-1 py-0.5 gap-1 hover:cursor-pointer transition-all ${
+ userIsLearning
+ ? isHovered
+ ? "text-red-500 border-red-500 rounded-md "
+ : "text-green-500 "
+ : "text-primary "
+ }`}>
+ {userIsLearning ? (
+ isHovered ? (
+
+ ) : (
+
+ )
+ ) : (
+
+ )}
+
+ {userIsLearning
+ ? isHovered
+ ? "退出学习"
+ : "正在学习"
+ : "加入学习"}
+
+
+ )}
+ {canEdit && (
+
{
+ const url = course?.id
+ ? `/course/${course?.id}/editor`
+ : "/course/editor";
+ navigate(url);
+ }}>
+
+ {"编辑课程"}
+
+ )}
+ >
+ );
+}
diff --git a/apps/web/src/routes/index.tsx b/apps/web/src/routes/index.tsx
index f011db6..d4d4afe 100755
--- a/apps/web/src/routes/index.tsx
+++ b/apps/web/src/routes/index.tsx
@@ -92,6 +92,10 @@ export const routes: CustomRouteObject[] = [
),
},
+ {
+ path: "course/:id?/detail/:lectureId?", // 使用 ? 表示 id 参数是可选的
+ element:
,
+ },
],
},
@@ -125,10 +129,6 @@ export const routes: CustomRouteObject[] = [
},
],
},
- {
- path: ":id?/detail/:lectureId?", // 使用 ? 表示 id 参数是可选的
- element:
,
- },
],
},
adminRoute,