소스 검색

feat: add expert level/realname/brief to PostVo

yangyi 2 일 전
부모
커밋
8b9a49f273
3개의 변경된 파일35개의 추가작업 그리고 1개의 파일을 삭제
  1. 9 0
      AGENTS.md
  2. 9 0
      src/main/java/space/anyi/serve/entity/post/PostVo.java
  3. 17 1
      src/main/java/space/anyi/serve/service/impl/PostServiceImpl.java

+ 9 - 0
AGENTS.md

@@ -41,3 +41,12 @@ export databaseHost=localhost databaseUsername=postgres databasePassword=postgre
 - **OpenAPI**: Every DTO and VO class must have `@Schema(description = "...")`. Every DTO field must have `@Schema` and `jakarta.validation` annotations (`@NotBlank`, `@NotNull`, `@Size`, etc.) with Chinese `message`.
 - **Controller return types**: Always use `Response<T>` with a concrete generic type (DTO or VO). Never raw `Response` or `Response<Map<...>>`.
 - No Dockerfile, no CI, no Makefile.
+
+## Git remote
+
+| Remote | URL | Push allowed? |
+|--------|-----|--------------|
+| `gogs` | `git@git.anyi.space:gdit/lt_server.git` | **Yes** — team repo, always push here |
+| `origin` | `git@git.anyi.space:yangyi/serve_template.git` | **No** — personal fork, never push |
+
+**Always use `git push gogs`.** Never push to `origin`.

+ 9 - 0
src/main/java/space/anyi/serve/entity/post/PostVo.java

@@ -21,6 +21,9 @@ public class PostVo {
     private Integer viewCount;
     private Boolean isPublic;
     private Boolean isPaid;
+    private String expertLevel;
+    private Boolean expertIsRealname;
+    private String expertBrief;
     private LocalDateTime publishTime;
     private LocalDateTime expireTime;
 
@@ -71,6 +74,12 @@ public class PostVo {
     public void setIsPublic(Boolean isPublic) { this.isPublic = isPublic; }
     public Boolean getIsPaid() { return isPaid; }
     public void setIsPaid(Boolean isPaid) { this.isPaid = isPaid; }
+    public String getExpertLevel() { return expertLevel; }
+    public void setExpertLevel(String expertLevel) { this.expertLevel = expertLevel; }
+    public Boolean getExpertIsRealname() { return expertIsRealname; }
+    public void setExpertIsRealname(Boolean expertIsRealname) { this.expertIsRealname = expertIsRealname; }
+    public String getExpertBrief() { return expertBrief; }
+    public void setExpertBrief(String expertBrief) { this.expertBrief = expertBrief; }
     public LocalDateTime getPublishTime() { return publishTime; }
     public void setPublishTime(LocalDateTime publishTime) { this.publishTime = publishTime; }
     public LocalDateTime getExpireTime() { return expireTime; }

+ 17 - 1
src/main/java/space/anyi/serve/service/impl/PostServiceImpl.java

@@ -8,6 +8,7 @@ import org.springframework.transaction.annotation.Transactional;
 import space.anyi.serve.entity.order.OrderTip;
 import space.anyi.serve.entity.post.Post;
 import space.anyi.serve.entity.post.PostVo;
+import space.anyi.serve.entity.profile.UserProfile;
 import space.anyi.serve.entity.user.User;
 import space.anyi.serve.mapper.OrderTipMapper;
 import space.anyi.serve.mapper.PostMapper;
@@ -15,6 +16,7 @@ import space.anyi.serve.mapper.PostViewRecordMapper;
 import space.anyi.serve.entity.post.PostViewRecord;
 import space.anyi.serve.service.PostService;
 import space.anyi.serve.service.UserService;
+import space.anyi.serve.service.UserProfileService;
 
 import java.time.LocalDateTime;
 import java.util.List;
@@ -26,13 +28,16 @@ public class PostServiceImpl extends ServiceImpl<PostMapper, Post> implements Po
     private final PostViewRecordMapper postViewRecordMapper;
     private final OrderTipMapper orderTipMapper;
     private final UserService userService;
+    private final UserProfileService userProfileService;
 
     public PostServiceImpl(PostViewRecordMapper postViewRecordMapper,
                            OrderTipMapper orderTipMapper,
-                           UserService userService) {
+                           UserService userService,
+                           UserProfileService userProfileService) {
         this.postViewRecordMapper = postViewRecordMapper;
         this.orderTipMapper = orderTipMapper;
         this.userService = userService;
+        this.userProfileService = userProfileService;
     }
 
     @Override
@@ -66,6 +71,7 @@ public class PostServiceImpl extends ServiceImpl<PostMapper, Post> implements Po
                 vo.setExpertName(expert.getUsername());
                 vo.setExpertAvatar(expert.getAvatar());
             }
+            applyExpertProfile(vo, post.getExpertId());
             if (currentUserId != null) {
                 vo.setIsPaid(hasUserPaid(post.getId(), currentUserId));
             }
@@ -93,6 +99,7 @@ public class PostServiceImpl extends ServiceImpl<PostMapper, Post> implements Po
             vo.setExpertName(expert.getUsername());
             vo.setExpertAvatar(expert.getAvatar());
         }
+        applyExpertProfile(vo, post.getExpertId());
 
         boolean isExpired = LocalDateTime.now().isAfter(post.getExpireTime());
         boolean isPaid = currentUserId != null && hasUserPaid(id, currentUserId);
@@ -176,6 +183,15 @@ public class PostServiceImpl extends ServiceImpl<PostMapper, Post> implements Po
         return page(page, wrapper);
     }
 
+    private void applyExpertProfile(PostVo vo, Long expertUserId) {
+        if (expertUserId == null) return;
+        UserProfile profile = userProfileService.getByUserId(expertUserId);
+        if (profile != null) {
+            vo.setExpertLevel(profile.getLevel());
+            vo.setExpertIsRealname(profile.getIsRealname());
+        }
+    }
+
     private void recordView(Long userId, List<Post> posts) {
         for (Post post : posts) {
             Long count = postViewRecordMapper.selectCount(