Explorar o código

🐛 fix(posts): 添加错误日志输出以便调试

- 在获取帖子列表接口的错误捕获中添加console.error输出错误信息

♻️ refactor(follows): 修复FollowEntity关联关系定义

- 将follower关联从user.id改为user.following
- 将following关联从user.id改为user.followers

♻️ refactor(posts): 重构帖子服务错误处理方式

- 将HTTPException抛出改为普通Error抛出
- 统一错误消息格式,移除HTTP状态码硬编码

✨ feat(posts): 增强关注动态查询功能与日志记录

- 添加debug日志记录,便于跟踪查询过程
- 分离数据查询和计数查询,优化性能
- 记录生成的SQL和参数,便于调试
- 添加查询结果日志,记录返回数据量

✨ feat(users): 添加用户关注关系的反向关联

- 为UserEntity添加following和followers一对多关联
- 实现用户关注列表和粉丝列表的查询能力
yourname hai 5 meses
pai
achega
182c6f90d7

+ 1 - 0
src/server/api/posts/get.ts

@@ -83,6 +83,7 @@ const app = new OpenAPIHono<AuthContext>().openapi(routeDef, async (c) => {
       }
     }, 200);
   } catch (error) {
+    console.error(error)
     const { code = 500, message = '获取帖子列表失败' } = error as Error & { code?: number };
     return c.json({ code, message }, code as unknown as 400 | 500);
   }

+ 2 - 2
src/server/modules/follows/follow.entity.ts

@@ -13,10 +13,10 @@ export class FollowEntity {
   @Column({ name: 'following_id', type: 'int', unsigned: true, comment: '被关注者ID' })
   followingId!: number;
 
-  @ManyToOne(() => UserEntity, user => user.id)
+  @ManyToOne(() => UserEntity, user => user.following)
   follower!: UserEntity;
 
-  @ManyToOne(() => UserEntity, user => user.id)
+  @ManyToOne(() => UserEntity, user => user.followers)
   following!: UserEntity;
 
   @CreateDateColumn({ name: 'created_at', type: 'timestamp', comment: '关注时间' })

+ 30 - 5
src/server/modules/posts/post.service.ts

@@ -1,11 +1,15 @@
 import { DataSource, Repository } from 'typeorm';
+import debug from 'debug';
 import { z } from '@hono/zod-openapi';
 import { PostEntity as Post } from './post.entity';
+import { FollowEntity } from '../follows/follow.entity';
 import { UserEntity as User } from '../users/user.entity';
 import type { CreatePostDto, UpdatePostDto } from './post.entity';
 import { HTTPException } from 'hono/http-exception';
 import { DeleteStatus } from '@/share/types';
 
+const logger = debug('backend:posts:service');
+
 export class PostService {
   private postRepository: Repository<Post>;
   private userRepository: Repository<User>;
@@ -22,7 +26,7 @@ export class PostService {
     // 验证用户是否存在
     const user = await this.userRepository.findOneBy({ id: userId });
     if (!user) {
-      throw new HTTPException(404, { message: '用户不存在' });
+      throw new Error('用户不存在');
     }
 
     const post = this.postRepository.create({
@@ -60,7 +64,7 @@ export class PostService {
     });
 
     if (!post) {
-      throw new HTTPException(404, { message: '帖子不存在或没有权限' });
+      throw new Error('帖子不存在或没有权限');
     }
 
     Object.assign(post, data);
@@ -103,6 +107,9 @@ export class PostService {
     const skip = (page - 1) * pageSize;
     
     // 直接查询关注用户的帖子,假设follow表存在且有关联
+    logger('Building following feed query for followerId: %d, page: %d, pageSize: %d', followerId, page, pageSize);
+    
+    // 创建主查询用于获取分页数据
     const query = this.postRepository
       .createQueryBuilder('post')
       .leftJoin('follows', 'f', 'f.following_id = post.user_id')
@@ -113,7 +120,25 @@ export class PostService {
       .skip(skip)
       .take(pageSize);
 
-    const [posts, total] = await query.getManyAndCount();
+    // 创建计数查询
+    const countQuery = this.postRepository
+      .createQueryBuilder('post')
+      .leftJoin('follows', 'f', 'f.following_id = post.user_id')
+      .where('f.follower_id = :followerId', { followerId })
+      .andWhere('post.is_deleted = :notDeleted', { notDeleted: DeleteStatus.NOT_DELETED });
+
+    // 记录生成的SQL和参数
+    const sql = query.getSql();
+    const parameters = query.getParameters();
+    logger('Following feed query: %s', sql);
+    logger('Query parameters: %o', parameters);
+    
+    const [posts, total] = await Promise.all([
+      query.getRawMany(),
+      countQuery.getCount()
+    ]);
+    
+    logger('Following feed results: %d posts, total: %d', posts.length, total);
     return [posts, total];
   }
 
@@ -127,7 +152,7 @@ export class PostService {
     });
 
     if (!post) {
-      throw new HTTPException(404, { message: '帖子不存在' });
+      throw new Error('帖子不存在');
     }
 
     post.likesCount += 1;
@@ -144,7 +169,7 @@ export class PostService {
     });
 
     if (!post) {
-      throw new HTTPException(404, { message: '帖子不存在' });
+      throw new Error('帖子不存在');
     }
 
     if (post.likesCount > 0) {

+ 7 - 0
src/server/modules/users/user.entity.ts

@@ -2,6 +2,7 @@ import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable, CreateDa
 import { Role, RoleSchema } from './role.entity';
 import { z } from '@hono/zod-openapi';
 import { DeleteStatus, DisabledStatus } from '@/share/types';
+import { FollowEntity } from '../follows/follow.entity';
 
 @Entity({ name: 'users' })
 export class UserEntity {
@@ -48,6 +49,12 @@ export class UserEntity {
   @JoinTable()
   roles!: Role[];
 
+  @OneToMany(() => FollowEntity, follow => follow.follower)
+  following!: FollowEntity[];
+
+  @OneToMany(() => FollowEntity, follow => follow.following)
+  followers!: FollowEntity[];
+
   @CreateDateColumn({ name: 'created_at', type: 'timestamp' })
   createdAt!: Date;