diff --git a/apps/server/src/main.ts b/apps/server/src/main.ts index 8b82ed1..386668a 100755 --- a/apps/server/src/main.ts +++ b/apps/server/src/main.ts @@ -15,7 +15,7 @@ async function bootstrap() { const trpc = app.get(TrpcRouter); trpc.applyMiddleware(app); - const port = process.env.SERVER_PORT || 3000; + const port = process.env.SERVER_PORT || 3001; await app.listen(port); } diff --git a/apps/server/src/tasks/init/gendev.service.ts b/apps/server/src/tasks/init/gendev.service.ts index addb264..d7c3e01 100755 --- a/apps/server/src/tasks/init/gendev.service.ts +++ b/apps/server/src/tasks/init/gendev.service.ts @@ -22,7 +22,7 @@ export class GenDevService { terms: Record = { [TaxonomySlug.CATEGORY]: [], [TaxonomySlug.TAG]: [], - [TaxonomySlug.LEVEL]: [], + [TaxonomySlug.LEVEL]: [] }; depts: Department[] = []; domains: Department[] = []; diff --git a/apps/web/src/app/main/course/preview/components/couresPreviewTabmsg.tsx b/apps/web/src/app/main/course/preview/components/couresPreviewTabmsg.tsx new file mode 100644 index 0000000..8f32fce --- /dev/null +++ b/apps/web/src/app/main/course/preview/components/couresPreviewTabmsg.tsx @@ -0,0 +1,25 @@ +import { Checkbox, List } from 'antd'; +import React from 'react'; + +export function CoursePreviewTabmsg({data}){ + + + const renderItem = (item) => ( + + + + ); + + return( +
+ +
+ ) +} \ No newline at end of file diff --git a/apps/web/src/app/main/course/preview/components/courseCatalog.tsx b/apps/web/src/app/main/course/preview/components/courseCatalog.tsx new file mode 100644 index 0000000..b13e87d --- /dev/null +++ b/apps/web/src/app/main/course/preview/components/courseCatalog.tsx @@ -0,0 +1,11 @@ +import type { MenuProps } from 'antd'; +import { Menu } from 'antd'; + +type MenuItem = Required['items'][number]; + +export function CourseCatalog(){ + return ( + <> + + ) +} \ No newline at end of file diff --git a/apps/web/src/app/main/course/preview/components/coursePreviewAllmsg.tsx b/apps/web/src/app/main/course/preview/components/coursePreviewAllmsg.tsx index ee10b4a..f56466d 100644 --- a/apps/web/src/app/main/course/preview/components/coursePreviewAllmsg.tsx +++ b/apps/web/src/app/main/course/preview/components/coursePreviewAllmsg.tsx @@ -1,7 +1,51 @@ -export function coursePreviewAllmsg() { +import { useEffect } from 'react'; +import { CoursePreviewMsg } from '@web/src/app/main/course/preview/type.ts'; +import { Button , Tabs , Image, Skeleton } from 'antd'; +import type { TabsProps } from 'antd'; +import { PlayCircleOutlined } from "@ant-design/icons"; +export function CoursePreviewAllmsg({previewMsg,items,isLoading}: {previewMsg?:CoursePreviewMsg,items:TabsProps['items'],isLoading:Boolean}){ + useEffect(() => { + console.log(previewMsg) + }) + const TapOnChange = (key: string) => { + console.log(key); + }; return ( -
- helloword +
+
+
+ example +
+ +
+ +
+
+ { + isLoading ? + :( + <> + {previewMsg.Title} + {previewMsg.SubTitle} + {previewMsg.Description} + + ) + } + + +
+
+
+ +
) } \ No newline at end of file diff --git a/apps/web/src/app/main/course/preview/page.tsx b/apps/web/src/app/main/course/preview/page.tsx index f345883..367c21a 100644 --- a/apps/web/src/app/main/course/preview/page.tsx +++ b/apps/web/src/app/main/course/preview/page.tsx @@ -1,7 +1,81 @@ +import { Skeleton, type TabsProps } from 'antd'; +import { CoursePreviewAllmsg } from "./components/coursePreviewAllmsg"; +import { CoursePreviewTabmsg } from "./components/couresPreviewTabmsg"; +import { CoursePreviewMsg } from "./type"; +import { api } from '@nice/client' +import { useNavigate, useParams } from 'react-router-dom'; +import { useEffect, useState } from 'react'; +import { courseDetailSelect, CourseDto } from '@nice/common'; + export function CoursePreview(){ + const { id } = useParams() + const { data:course,isLoading:courseIsLoading}:{data:CourseDto,isLoading:boolean}= api.post.findFirst.useQuery({ + where:{ + id + }, + select:courseDetailSelect + }) + // course.sections[0].lectures[0] + // `/course/${course.id}/detail/${Lecture.id}` + useEffect(() => { + if(!courseIsLoading){ + setPreviewMsg({ + videoPreview: course?.meta?.thumbnail, + Title: course?.title, + SubTitle:course?.subTitle, + Description:course?.content, + ToCourseUrl:`/course/${id}`, + isLoading:courseIsLoading + }) + } + + },[courseIsLoading]) + const [previewMsg,setPreviewMsg] = useState({ + videoPreview: '', + Title: '', + SubTitle:'', + Description:'', + ToCourseUrl:'', + isLoading:courseIsLoading + }) + const tapData = [ + { + title: '掌握R语言的基本概念语法', + description: '学生将学习R语言和RStudio的基本知识', + }, + { + title: '掌握R语言的基本概念语法', + description: '学生将学习R语言的变量、数据类型、循环和条件语句等', + }, + { + title: '掌握R语言的数据导入管理', + description: '学生将学会如何将数据导入R环境,并且使用各种类型的数据', + }, + { + title: '掌握R语言的基本数据清洗', + description: '学生将学会使用R语言进行数据清洗、整理和管理', + }, + { + title: '掌握R语言的基本数据统计', + description: '学生将学会使用R语言进行基本的数据统计', + }, + { + title: '掌握R语言的基本绘图功能', + description: '学生将学会使用R语言基本的绘图功能和ggplot2的应用', + }, + ]; + const isLoading = false + const items: TabsProps['items'] = [ + { + key: '1', + label: '课程学习目标', + children: isLoading ? : , + } + ]; + return(
- helloword +
) } \ No newline at end of file diff --git a/apps/web/src/app/main/course/preview/type.ts b/apps/web/src/app/main/course/preview/type.ts new file mode 100644 index 0000000..3119ae7 --- /dev/null +++ b/apps/web/src/app/main/course/preview/type.ts @@ -0,0 +1,8 @@ +export interface CoursePreviewMsg{ + videoPreview: string; + Title: string; + SubTitle:string; + Description:string; + ToCourseUrl:string; + isLoading:Boolean +} diff --git a/apps/web/src/app/main/courses/components/FilterSection.tsx b/apps/web/src/app/main/courses/components/FilterSection.tsx index 5cc1574..32f41ba 100755 --- a/apps/web/src/app/main/courses/components/FilterSection.tsx +++ b/apps/web/src/app/main/courses/components/FilterSection.tsx @@ -1,8 +1,9 @@ import { Checkbox, Divider, Radio, Space , Spin} from 'antd'; import { categories, levels } from '../mockData'; import { TaxonomySlug, TermDto } from '@nice/common'; -import { GetTaxonomyProps, useGetTaxonomy } from '@web/src/hooks/useGetTaxonomy'; + import { useMemo } from 'react'; +import { api } from '@nice/client'; interface FilterSectionProps { selectedCategory: string; @@ -11,6 +12,35 @@ interface FilterSectionProps { onLevelChange: (level: string) => void; } +interface GetTaxonomyProps { + categories: string[]; + isLoading: boolean; +} + +function useGetTaxonomy({type}) : GetTaxonomyProps { + const {data,isLoading} :{data:TermDto[],isLoading:boolean}= api.term.findMany.useQuery({ + where:{ + taxonomy: { + //TaxonomySlug.CATEGORY + slug:type + } + }, + include:{ + children :true + }, + take:10, // 只取前10个 + orderBy: { + createdAt: 'desc', // 按创建时间降序排列 + }, + }) + const categories = useMemo(() => { + const allCategories = isLoading ? [] : data?.map((course) => course.name); + return [...Array.from(new Set(allCategories))]; + }, [data]); + return {categories,isLoading} +} + + export default function FilterSection({ selectedCategory, selectedLevel, diff --git a/apps/web/src/app/main/home/components/CoursesSection.tsx b/apps/web/src/app/main/home/components/CoursesSection.tsx index 8d6c1c5..a1f0cfe 100755 --- a/apps/web/src/app/main/home/components/CoursesSection.tsx +++ b/apps/web/src/app/main/home/components/CoursesSection.tsx @@ -11,7 +11,35 @@ import { } from '@ant-design/icons'; import { TaxonomySlug, TermDto } from '@nice/common'; import { api } from '@nice/client'; -import { GetTaxonomyProps, useGetTaxonomy } from '@web/src/hooks/useGetTaxonomy'; + +interface GetTaxonomyProps { + categories: string[]; + isLoading: boolean; +} + +function useGetTaxonomy({type}) : GetTaxonomyProps { + const {data,isLoading} :{data:TermDto[],isLoading:boolean}= api.term.findMany.useQuery({ + where:{ + taxonomy: { + //TaxonomySlug.CATEGORY + slug:type + } + }, + include:{ + children :true + }, + take:10, // 只取前10个 + orderBy: { + createdAt: 'desc', // 按创建时间降序排列 + }, + }) + const categories = useMemo(() => { + const allCategories = isLoading ? [] : data?.map((course) => course.name); + return [...Array.from(new Set(allCategories))]; + }, [data]); + return {categories,isLoading} +} + const { Title, Text } = Typography; diff --git a/apps/web/src/app/main/home/page.tsx b/apps/web/src/app/main/home/page.tsx index 8715fbf..4d4be9e 100755 --- a/apps/web/src/app/main/home/page.tsx +++ b/apps/web/src/app/main/home/page.tsx @@ -105,20 +105,19 @@ const HomePage = () => { return (
- {/* */} - + - + /> */} - + {/* */}
); }; diff --git a/apps/web/src/hooks/useGetTaxonomy.ts b/apps/web/src/hooks/useGetTaxonomy.ts deleted file mode 100644 index 4eeb3d5..0000000 --- a/apps/web/src/hooks/useGetTaxonomy.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { api } from "@nice/client/" -import { TaxonomySlug, TermDto } from "@nice/common" -import { useMemo } from 'react'; - -export interface GetTaxonomyProps { - categories: string[]; - isLoading: boolean; -} - -export function useGetTaxonomy({type}) : GetTaxonomyProps { - const {data,isLoading} :{data:TermDto[],isLoading:boolean}= api.term.findMany.useQuery({ - where:{ - taxonomy: { - //TaxonomySlug.CATEGORY - slug:type - } - }, - include:{ - children :true - }, - take:10, // 只取前10个 - orderBy: { - createdAt: 'desc', // 按创建时间降序排列 - }, - }) - const categories = useMemo(() => { - const allCategories = isLoading ? [] : data?.map((course) => course.name); - return [...Array.from(new Set(allCategories))]; - }, [data]); - return {categories,isLoading} -} diff --git a/apps/web/src/routes/index.tsx b/apps/web/src/routes/index.tsx index 9ec10fe..09aeaba 100755 --- a/apps/web/src/routes/index.tsx +++ b/apps/web/src/routes/index.tsx @@ -93,9 +93,10 @@ export const routes: CustomRouteObject[] = [ }, // 课程预览页面 { - path: "coursePreview", - element: , - }, + path: "coursePreview/:id?", + element: + } + ], }, {