From e8b23533d70b50c99d23c605ca9f1b43fad5a106 Mon Sep 17 00:00:00 2001 From: ditiqi Date: Sun, 26 Jan 2025 15:28:34 +0800 Subject: [PATCH 1/2] add 20250126-1558 --- apps/server/src/auth/auth.service.ts | 16 +- apps/server/src/models/post/utils.ts | 20 +- apps/server/src/models/visit/visit.service.ts | 7 + apps/web/src/app/auth/register.tsx | 207 +++++++++--------- .../src/components/models/post/LetterCard.tsx | 201 +++++++++-------- .../models/post/detail/PostCommentList.tsx | 2 +- packages/client/src/api/hooks/useVisitor.ts | 15 ++ packages/common/prisma/schema.prisma | 3 +- packages/common/src/enum.ts | 1 + 9 files changed, 264 insertions(+), 208 deletions(-) diff --git a/apps/server/src/auth/auth.service.ts b/apps/server/src/auth/auth.service.ts index 4f0be21..8d7e96c 100755 --- a/apps/server/src/auth/auth.service.ts +++ b/apps/server/src/auth/auth.service.ts @@ -169,12 +169,16 @@ export class AuthService { password, officerId, showname, - department: { - connect: { id: deptId }, - }, - domain: { - connect: { id: deptId }, - }, + department: deptId + ? { + connect: { id: deptId }, + } + : undefined, + domain: deptId + ? { + connect: { id: deptId }, + } + : undefined, // domainId: data.deptId, meta: { photoUrl, diff --git a/apps/server/src/models/post/utils.ts b/apps/server/src/models/post/utils.ts index 90906fd..9de3772 100644 --- a/apps/server/src/models/post/utils.ts +++ b/apps/server/src/models/post/utils.ts @@ -31,7 +31,6 @@ export async function setPostRelation(params: { visitorId: staff?.id, }, })) > 0; - const liked = (await db.visit.count({ where: { @@ -50,6 +49,24 @@ export async function setPostRelation(params: { }), }, })) > 0; + const hated = + (await db.visit.count({ + where: { + postId: data.id, + type: VisitType?.HATE, + ...(staff?.id + ? // 如果有 staff,查找对应的 visitorId + { visitorId: staff.id } + : // 如果没有 staff,查找相同 IP 且 visitorId 为 null 且 30 分钟内的记录 + { + visitorId: null, + meta: { path: ['ip'], equals: clientIp }, + updatedAt: { + gte: thirtyMinutesAgo, + }, + }), + }, + })) > 0; const readedCount = await db.visit.count({ where: { postId: data.id, @@ -61,6 +78,7 @@ export async function setPostRelation(params: { readed, readedCount, liked, + hated, commentsCount, }); // console.log('data', data); diff --git a/apps/server/src/models/visit/visit.service.ts b/apps/server/src/models/visit/visit.service.ts index 9847639..3d3a49a 100644 --- a/apps/server/src/models/visit/visit.service.ts +++ b/apps/server/src/models/visit/visit.service.ts @@ -78,6 +78,13 @@ export class VisitService extends BaseService { visitType: VisitType.LIKE, }); } + if (args.data.type === VisitType.HATE) { + EventBus.emit('updateVisitCount', { + objectType: ObjectType.POST, + id: postId, + visitType: VisitType.HATE, + }); + } } return result; } diff --git a/apps/web/src/app/auth/register.tsx b/apps/web/src/app/auth/register.tsx index 18253f2..3337d32 100644 --- a/apps/web/src/app/auth/register.tsx +++ b/apps/web/src/app/auth/register.tsx @@ -37,19 +37,20 @@ export const RegisterForm = ({ onSubmit, isLoading }: RegisterFormProps) => { layout="vertical" onFinish={onSubmit} scrollToFirstError> -
-
+
+
+ width: `100%`, + height: 210, + }} + />
-
+
{ noStyle label="部门" rules={[{ required: true, message: "请选择部门" }]}> - + + + +
-
- - - - - - - - - - - - - - - - - - - - ({ - validator(_, value) { - if ( - !value || - getFieldValue("password") === value - ) { - return Promise.resolve(); - } - return Promise.reject( - new Error("两次输入的密码不一致") - ); +
+
+ - - + ]} + name={"phoneNumber"} + label="手机号"> + + + + + + + + +
+
+ + + + + + + ({ + validator(_, value) { + if ( + !value || + getFieldValue("password") === value + ) { + return Promise.resolve(); + } + return Promise.reject( + new Error("两次输入的密码不一致") + ); + }, + }), + ]}> + + +
+ +
- -
-
-
-
- ); +
+ + +
+ + + + ); } diff --git a/apps/web/src/components/models/post/detail/PostCommentList.tsx b/apps/web/src/components/models/post/detail/PostCommentList.tsx index b731b5c..042f1f8 100644 --- a/apps/web/src/components/models/post/detail/PostCommentList.tsx +++ b/apps/web/src/components/models/post/detail/PostCommentList.tsx @@ -142,7 +142,7 @@ export default function PostCommentList() { return (
- + {items.map((comment, index) => ( ({ + ...item, + hates: (item.hates || 0) + 1, + hated: true, + })) + ); + const unHate = api.visitor.deleteMany.useMutation( + createOptimisticMutation((item) => ({ + ...item, + hates: item.hates - 1 || 0, + hated: false, + })) + ); + const addStar = api.visitor.create.useMutation( createOptimisticMutation((item) => ({ ...item, diff --git a/packages/common/prisma/schema.prisma b/packages/common/prisma/schema.prisma index bf19866..7fba477 100644 --- a/packages/common/prisma/schema.prisma +++ b/packages/common/prisma/schema.prisma @@ -75,7 +75,7 @@ model Staff { username String @unique @map("username") avatar String? @map("avatar") password String? @map("password") - + phoneNumber String? @unique @map("phone_number") @@ -206,6 +206,7 @@ model Post { visits Visit[] // 访问记录,关联 Visit 模型 views Int @default(0) likes Int @default(0) + hates Int @default(0) receivers Staff[] @relation("post_receiver") parentId String? @map("parent_id") parent Post? @relation("PostChildren", fields: [parentId], references: [id]) // 父级帖子,关联 Post 模型 diff --git a/packages/common/src/enum.ts b/packages/common/src/enum.ts index 5a1b00b..035c58a 100755 --- a/packages/common/src/enum.ts +++ b/packages/common/src/enum.ts @@ -14,6 +14,7 @@ export enum VisitType { STAR = "star", READED = "read", LIKE = "like", + HATE = "hate", } export enum StorageProvider { From 1266d076b16e9c64d3c6d8c1b3cf555e88277ddb Mon Sep 17 00:00:00 2001 From: ditiqi Date: Sun, 26 Jan 2025 15:29:31 +0800 Subject: [PATCH 2/2] add --- .../models/post/detail/PostResources.tsx | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/apps/web/src/components/models/post/detail/PostResources.tsx b/apps/web/src/components/models/post/detail/PostResources.tsx index 3c67707..3807d7c 100644 --- a/apps/web/src/components/models/post/detail/PostResources.tsx +++ b/apps/web/src/components/models/post/detail/PostResources.tsx @@ -9,7 +9,8 @@ export default function PostResources({ post }: { post: PostDto }) { const { resources } = useMemo(() => { if (!post?.resources) return { resources: [] }; - const isImage = (url: string) => /\.(png|jpg|jpeg|gif|webp)$/i.test(url); + const isImage = (url: string) => + /\.(png|jpg|jpeg|gif|webp)$/i.test(url); const sortedResources = post.resources .map((resource) => ({ @@ -38,8 +39,7 @@ export default function PostResources({ post }: { post: PostDto }) { md={6} lg={6} xl={4} - className="relative" - > + className="relative">
(
+ className="flex items-center justify-between p-3 hover:bg-gray-50 rounded-md transition-colors duration-200">
- {getFileIcon(resource.url)} + + {getFileIcon(resource.url)} +

{resource.title || "未命名文件"}

- {resource.url.split(".").pop()?.toUpperCase()}文件 + {resource.url + .split(".") + .pop() + ?.toUpperCase()} + 文件 - {resource.metadata.size && - `${(resource.metadata.size / 1024 / 1024).toFixed(1)}MB`} + {(resource.metadata as any) + .size && + `${((resource.metadata as any).size / 1024 / 1024).toFixed(1)}MB`}
@@ -102,8 +108,7 @@ export default function PostResources({ post }: { post: PostDto }) {
@@ -113,4 +118,4 @@ export default function PostResources({ post }: { post: PostDto }) { )}
); -} \ No newline at end of file +}