diff --git a/apps/server/src/models/post/post.service.ts b/apps/server/src/models/post/post.service.ts index 57b2962..cbcf7bc 100755 --- a/apps/server/src/models/post/post.service.ts +++ b/apps/server/src/models/post/post.service.ts @@ -200,6 +200,8 @@ export class PostService extends BaseTreeService { rating: number | null; createdAt: Date; views: number; + hates: number; + likes: number; publishedAt: Date | null; updatedAt: Date; deletedAt: Date | null; diff --git a/apps/server/src/models/visit/visit.router.ts b/apps/server/src/models/visit/visit.router.ts index ad6d632..e600ff2 100755 --- a/apps/server/src/models/visit/visit.router.ts +++ b/apps/server/src/models/visit/visit.router.ts @@ -15,13 +15,13 @@ export class VisitRouter { private readonly visitService: VisitService, ) {} router = this.trpc.router({ - create: this.trpc.protectProcedure + create: this.trpc.procedure .input(VisitCreateArgsSchema) .mutation(async ({ ctx, input }) => { const { staff } = ctx; return await this.visitService.create(input, staff); }), - createMany: this.trpc.protectProcedure + createMany: this.trpc.procedure .input(z.array(VisitCreateManyInputSchema)) .mutation(async ({ ctx, input }) => { const { staff } = ctx; diff --git a/apps/server/src/queue/models/post/utils.ts b/apps/server/src/queue/models/post/utils.ts index 51bffca..57129a3 100755 --- a/apps/server/src/queue/models/post/utils.ts +++ b/apps/server/src/queue/models/post/utils.ts @@ -8,7 +8,7 @@ import { export async function updateTotalCourseViewCount(type: VisitType) { const posts = await db.post.findMany({ where: { - type: { in: [PostType.COURSE, PostType.LECTURE] }, + // type: { in: [PostType.COURSE, PostType.LECTURE,] }, deletedAt: null, }, select: { id: true, type: true }, @@ -66,27 +66,34 @@ export async function updatePostViewCount(id: string, type: VisitType) { where: { id }, select: { id: true, meta: true, type: true }, }); + console.log(post?.type); + console.log('updatePostViewCount'); const metaFieldMap = { [VisitType.READED]: 'views', [VisitType.LIKE]: 'likes', [VisitType.HATE]: 'hates', }; if (post?.type === PostType.LECTURE) { - const course = await db.postAncestry.findFirst({ + const courseAncestry = await db.postAncestry.findFirst({ where: { descendantId: post?.id, ancestor: { type: PostType.COURSE, }, }, - select: { id: true }, + select: { id: true, ancestorId: true }, }); - const lectures = await db.postAncestry.findMany({ + const course = { id: courseAncestry.ancestorId }; + const lecturesAncestry = await db.postAncestry.findMany({ where: { ancestorId: course.id, descendant: { type: PostType.LECTURE } }, select: { id: true, + descendantId: true, }, }); + const lectures = lecturesAncestry.map((ancestry) => ({ + id: ancestry.descendantId, + })); const courseViews = await db.visit.aggregate({ _sum: { views: true, @@ -98,9 +105,11 @@ export async function updatePostViewCount(id: string, type: VisitType) { type: type, }, }); + console.log(courseViews); await db.post.update({ where: { id: course.id }, data: { + [metaFieldMap[type]]: courseViews._sum.views || 0, meta: { ...((post?.meta as any) || {}), [metaFieldMap[type]]: courseViews._sum.views || 0, @@ -117,9 +126,11 @@ export async function updatePostViewCount(id: string, type: VisitType) { type: type, }, }); + console.log('totalViews', totalViews); await db.post.update({ where: { id }, data: { + [metaFieldMap[type]]: totalViews._sum.views || 0, meta: { ...((post?.meta as any) || {}), [metaFieldMap[type]]: totalViews._sum.views || 0, diff --git a/apps/web/src/app/main/path/components/DeptInfo.tsx b/apps/web/src/app/main/path/components/DeptInfo.tsx index fe82bbd..eb09867 100644 --- a/apps/web/src/app/main/path/components/DeptInfo.tsx +++ b/apps/web/src/app/main/path/components/DeptInfo.tsx @@ -24,7 +24,7 @@ const DeptInfo = ({ post }: { post: PostDto }) => {
- {`${post?.meta?.views || 0}`} + {`${post?.views || 0}`} {post?.studentIds && post?.studentIds?.length > 0 && ( diff --git a/apps/web/src/components/models/course/detail/CourseDetailContext.tsx b/apps/web/src/components/models/course/detail/CourseDetailContext.tsx index 1e29d87..bb43156 100755 --- a/apps/web/src/components/models/course/detail/CourseDetailContext.tsx +++ b/apps/web/src/components/models/course/detail/CourseDetailContext.tsx @@ -80,6 +80,7 @@ export function CourseDetailProvider({ useEffect(() => { if (lecture?.id) { + console.log(123); read.mutateAsync({ data: { visitorId: user?.id || null, diff --git a/apps/web/src/components/models/course/detail/CourseDetailDescription.tsx b/apps/web/src/components/models/course/detail/CourseDetailDescription.tsx index 463dc8b..bbbd495 100755 --- a/apps/web/src/components/models/course/detail/CourseDetailDescription.tsx +++ b/apps/web/src/components/models/course/detail/CourseDetailDescription.tsx @@ -36,11 +36,11 @@ export const CourseDetailDescription: React.FC = () => { {!selectedLectureId && (
{ - }
{ }); } }} - className="w-full h-full absolute top-0 z-10 bg-[rgba(0,0,0,0.3)] transition-all duration-300 ease-in-out hover:bg-[rgba(0,0,0,0.7)] cursor-pointer group"> + className="absolute rounded-xl top-0 left-0 right-0 bottom-0 z-10 bg-[rgba(0,0,0,0.3)] transition-all duration-300 ease-in-out hover:bg-[rgba(0,0,0,0.7)] cursor-pointer group">
点击进入学习
diff --git a/apps/web/src/components/models/course/detail/CourseDetailTitle.tsx b/apps/web/src/components/models/course/detail/CourseDetailTitle.tsx index cc984e1..940981b 100755 --- a/apps/web/src/components/models/course/detail/CourseDetailTitle.tsx +++ b/apps/web/src/components/models/course/detail/CourseDetailTitle.tsx @@ -12,11 +12,12 @@ import dayjs from "dayjs"; import CourseOperationBtns from "./JoinLearingButton"; export default function CourseDetailTitle() { - const { course } = useContext(CourseDetailContext); + const { course, lecture, selectedLectureId } = + useContext(CourseDetailContext); return (
- {course?.title} + {!selectedLectureId ? course?.title : lecture?.title}
{course?.author?.showname && ( @@ -36,15 +37,25 @@ export default function CourseDetailTitle() {
{"发布于:"} - {dayjs(course?.createdAt).format("YYYY年M月D日")} + {dayjs( + !selectedLectureId + ? course?.createdAt + : lecture?.createdAt + ).format("YYYY年M月D日")}
{"最后更新:"} - {dayjs(course?.updatedAt).format("YYYY年M月D日")} + {dayjs( + !selectedLectureId + ? course?.updatedAt + : lecture?.updatedAt + ).format("YYYY年M月D日")}
-
{`观看次数${course?.meta?.views || 0}`}
+
{`观看次数${ + !selectedLectureId ? course?.views : lecture?.views || 0 + }`}
diff --git a/apps/web/src/components/models/course/detail/CourseSyllabus/LectureItem.tsx b/apps/web/src/components/models/course/detail/CourseSyllabus/LectureItem.tsx index 39bce21..9f41c82 100755 --- a/apps/web/src/components/models/course/detail/CourseSyllabus/LectureItem.tsx +++ b/apps/web/src/components/models/course/detail/CourseSyllabus/LectureItem.tsx @@ -45,7 +45,9 @@ export const LectureItem: React.FC = ({
)}
-

{lecture.title}

+

+ {lecture.title} +

{lecture.subTitle && ( {lecture.subTitle} @@ -53,7 +55,9 @@ export const LectureItem: React.FC = ({ )}
- {lecture?.meta?.views ? lecture?.meta?.views : 0} + + {lecture?.views ? lecture?.views : 0} +
diff --git a/apps/web/src/components/models/course/editor/context/CourseEditorContext.tsx b/apps/web/src/components/models/course/editor/context/CourseEditorContext.tsx index bc84b18..f7bd74f 100755 --- a/apps/web/src/components/models/course/editor/context/CourseEditorContext.tsx +++ b/apps/web/src/components/models/course/editor/context/CourseEditorContext.tsx @@ -101,13 +101,17 @@ export function CourseFormProvider({ terms: termIds?.length > 0 ? { - set: termIds.map((id) => ({ id })), // 转换成 connect 格式 + [editId ? "set" : "connect"]: termIds.map((id) => ({ + id, + })), // 转换成 connect 格式 } : undefined, depts: deptIds?.length > 0 ? { - set: deptIds.map((id) => ({ id })), + [editId ? "set" : "connect"]: deptIds.map((id) => ({ + id, + })), } : undefined, }; diff --git a/apps/web/src/components/models/course/editor/form/CourseContentForm/SortableLecture.tsx b/apps/web/src/components/models/course/editor/form/CourseContentForm/SortableLecture.tsx index 3c9f279..2f74c61 100755 --- a/apps/web/src/components/models/course/editor/form/CourseContentForm/SortableLecture.tsx +++ b/apps/web/src/components/models/course/editor/form/CourseContentForm/SortableLecture.tsx @@ -115,7 +115,7 @@ export const SortableLecture: React.FC = ({ resources: [videoUrlId, ...fileIds].filter(Boolean)?.length > 0 ? { - connect: [videoUrlId, ...fileIds] + set: [videoUrlId, ...fileIds] .filter(Boolean) .map((fileId) => ({ fileId, diff --git a/packages/common/prisma/schema.prisma b/packages/common/prisma/schema.prisma index 6bcd44b..7f5138e 100755 --- a/packages/common/prisma/schema.prisma +++ b/packages/common/prisma/schema.prisma @@ -207,6 +207,8 @@ model Post { students Staff[] @relation("post_student") depts Department[] @relation("post_dept") views Int @default(0) @map("views") + hates Int @default(0) @map("hates") + likes Int @default(0) @map("likes") // 索引 // 日期时间类型字段 createdAt DateTime @default(now()) @map("created_at") diff --git a/packages/common/src/models/select.ts b/packages/common/src/models/select.ts index 8245ffe..f21f1a6 100755 --- a/packages/common/src/models/select.ts +++ b/packages/common/src/models/select.ts @@ -45,11 +45,13 @@ export const postDetailSelect: Prisma.PostSelect = { }, }, meta: true, + views: true, }; export const postUnDetailSelect: Prisma.PostSelect = { id: true, type: true, title: true, + views: true, parent: true, parentId: true, content: true, @@ -79,6 +81,7 @@ export const messageDetailSelect: Prisma.MessageSelect = { id: true, sender: true, content: true, + title: true, url: true, option: true, @@ -88,6 +91,7 @@ export const courseDetailSelect: Prisma.PostSelect = { id: true, title: true, subTitle: true, + views: true, type: true, author: true, authorId: true, @@ -124,6 +128,7 @@ export const lectureDetailSelect: Prisma.PostSelect = { subTitle: true, content: true, resources: true, + views: true, createdAt: true, updatedAt: true, // 关联表选择