Bläddra i källkod

feat: 适配新接口结构,重写我的愿望页面分页,修复标签间距

- wish API 适配 MyBatis-Plus Page 格式(records 替代 list)
- fetchMyWishes 去掉 userId 参数,后端改为 token 识别用户
- submitWish 去掉 treeName/userId,后端自动获取
- MyWishesView 加入 van-list 无限滚动分页
- 修复首页重复请求(van-list v-if 延迟渲染)
- 修复 WishCard/WishDetailView 标签换行间距(flex gap)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
tanlie 3 veckor sedan
förälder
incheckning
d0ad327eb7

+ 6 - 8
wishing-platform/platform-service/platform-service-mobile/src/main/java/cn/qinys/platform/mobile/controller/UserWishController.java

@@ -4,7 +4,6 @@ import cn.qinys.platform.base.response.Result;
 import cn.qinys.platform.mobile.req.WishCreateReq;
 import cn.qinys.platform.mobile.req.WishPageReq;
 import cn.qinys.platform.mobile.resp.WishDetailResp;
-import cn.qinys.platform.mobile.resp.WishListResp;
 import cn.qinys.platform.mobile.resp.WishPageResp;
 import cn.qinys.platform.mobile.service.UserWishService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -23,9 +22,9 @@ public class UserWishController {
      * 创建愿望
      */
     @PostMapping("/create")
-    public Result<WishDetailResp> create(@RequestBody @Valid WishCreateReq req) {
-        WishDetailResp resp = wishService.create(req);
-        return new Result<>(resp);
+    public Result<String> create(@RequestBody @Valid WishCreateReq req) {
+        wishService.create(req);
+        return new Result<>("success");
     }
 
     /**
@@ -50,17 +49,16 @@ public class UserWishController {
      * 愿望详情
      */
     @GetMapping("/{id}")
-    public Result<WishDetailResp> detail(@PathVariable Long id) {
+    public Result<WishDetailResp> detail(@PathVariable Integer id) {
         WishDetailResp resp = wishService.getDetail(id);
-        return resp != null ? new Result<>(resp) : new Result<>(404, "愿望不存在");
+        return new Result<>(resp);
     }
 
     /**
      * 删除愿望
      */
     @DeleteMapping("/{id}")
-    public Result<Boolean> delete(@PathVariable Long id,
-                                  @RequestHeader(value = "X-User-Id", defaultValue = "anonymous") String userId) {
+    public Result<Boolean> delete(@PathVariable Long id, @RequestHeader(value = "X-User-Id", defaultValue = "anonymous") String userId) {
         boolean ok = wishService.delete(id, userId);
         return ok ? new Result<>(true) : new Result<>(404, "删除失败,愿望不存在或无权操作");
     }

+ 10 - 0
wishing-platform/platform-service/platform-service-mobile/src/main/java/cn/qinys/platform/mobile/mapper/UserWishMapper.java

@@ -1,6 +1,7 @@
 package cn.qinys.platform.mobile.mapper;
 
 import cn.qinys.platform.entity.wishing.UserWish;
+import cn.qinys.platform.mobile.resp.UserWishSummaryResp;
 import cn.qinys.platform.mobile.resp.WishDetailResp;
 import cn.qinys.platform.mobile.resp.WishPageResp;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -18,4 +19,13 @@ public interface UserWishMapper extends BaseMapper<UserWish> {
     @Select("SELECT * FROM user_wish ${ew.customSqlSegment}")
     Page<WishPageResp> selectWishPage(Page<UserWish> page, @Param(Constants.WRAPPER) Wrapper<UserWish> wrapper);
 
+
+    @Select("SELECT * FROM user_wish WHERE id = #{id}")
+    WishDetailResp selectWishDetail(@Param("id") Integer id);
+
+
+    @Select("SELECT COUNT(*) AS wishCount, SUM(likes) AS receiveCount FROM user_wish " +
+            "WHERE user_id = #{userId} AND is_deleted = 0")
+    UserWishSummaryResp selectWishSummary(@Param("userId") Integer userId);
+
 }

+ 6 - 0
wishing-platform/platform-service/platform-service-mobile/src/main/java/cn/qinys/platform/mobile/mapper/WishingTreeExtensionMapper.java

@@ -3,6 +3,8 @@ package cn.qinys.platform.mobile.mapper;
 import cn.qinys.platform.entity.wishing.WishingTreeExtension;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 /**
  * @author lie tan
@@ -11,4 +13,8 @@ import org.apache.ibatis.annotations.Mapper;
  **/
 @Mapper
 public interface WishingTreeExtensionMapper extends BaseMapper<WishingTreeExtension> {
+
+
+    @Select("SELECT * FROM wishing_tree_extension WHERE tree_id = #{treeId} LIMIT 1")
+    WishingTreeExtension selectByTreeId(@Param("treeId") Integer treeId);
 }

+ 13 - 7
wishing-platform/platform-service/platform-service-mobile/src/main/java/cn/qinys/platform/mobile/resp/WishDetailResp.java

@@ -1,9 +1,10 @@
 package cn.qinys.platform.mobile.resp;
 
+import com.alibaba.fastjson2.JSON;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.io.Serializable;
-import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.List;
 
@@ -20,21 +21,26 @@ public class WishDetailResp implements Serializable {
 
     private String content;
 
-    private List<String> images;
-
-    private BigDecimal lng;
-
-    private BigDecimal lat;
+    private String images;
 
     private String address;
 
     private Boolean isPublic;
 
-    private List<String> tags;
+    private String tags;
 
     private Integer likes;
 
     private Integer status;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createdAt;
+
+    public List<String> getImages() {
+        return JSON.parseArray(images, String.class);
+    }
+
+    public List<String> getTags() {
+        return JSON.parseArray(tags, String.class);
+    }
 }

+ 0 - 14
wishing-platform/platform-service/platform-service-mobile/src/main/java/cn/qinys/platform/mobile/resp/WishListResp.java

@@ -1,14 +0,0 @@
-package cn.qinys.platform.mobile.resp;
-
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.List;
-
-@Data
-public class WishListResp implements Serializable {
-
-    private List<WishDetailResp> list;
-
-    private Long total;
-}

+ 2 - 3
wishing-platform/platform-service/platform-service-mobile/src/main/java/cn/qinys/platform/mobile/service/UserWishService.java

@@ -3,7 +3,6 @@ package cn.qinys.platform.mobile.service;
 import cn.qinys.platform.mobile.req.WishCreateReq;
 import cn.qinys.platform.mobile.req.WishPageReq;
 import cn.qinys.platform.mobile.resp.WishDetailResp;
-import cn.qinys.platform.mobile.resp.WishListResp;
 import cn.qinys.platform.mobile.resp.WishPageResp;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 
@@ -13,9 +12,9 @@ public interface UserWishService {
 
     Page<WishPageResp> pageByUser(WishPageReq req);
 
-    WishDetailResp getDetail(Long id);
+    WishDetailResp getDetail(Integer id);
 
-    WishDetailResp create(WishCreateReq req);
+    void create(WishCreateReq req);
 
     boolean delete(Long id, String userId);
 

+ 31 - 0
wishing-platform/platform-service/platform-service-mobile/src/main/java/cn/qinys/platform/mobile/service/impl/AbstractUserWishService.java

@@ -0,0 +1,31 @@
+package cn.qinys.platform.mobile.service.impl;
+
+import cn.qinys.platform.entity.wishing.WishingTreeExtension;
+import cn.qinys.platform.mobile.mapper.WishingTreeExtensionMapper;
+import jakarta.annotation.Resource;
+
+/**
+ * @author lie tan
+ * @description
+ * @date 2026-06-07 17:25
+ **/
+public abstract class AbstractUserWishService {
+
+    @Resource
+    WishingTreeExtensionMapper treeExtensionMapper;
+
+    public void treeWishesCounter(Integer treeId, Integer isPublic) {
+        WishingTreeExtension extension = treeExtensionMapper.selectByTreeId(treeId);
+        if (extension == null) {
+            extension = new WishingTreeExtension();
+        }
+        extension.setTotalCount(extension.getTotalCount() + 1);
+        if (isPublic == 1) {
+            extension.setPublicCount(extension.getPublicCount() + 1);
+        } else {
+            extension.setPrivateCount(extension.getPrivateCount() + 1);
+        }
+        treeExtensionMapper.insertOrUpdate(extension);
+    }
+
+}

+ 6 - 5
wishing-platform/platform-service/platform-service-mobile/src/main/java/cn/qinys/platform/mobile/service/impl/LoginServiceImpl.java

@@ -6,6 +6,7 @@ import cn.qinys.platform.base.service.AbstractLoginService;
 import cn.qinys.platform.base.service.ICaptchaService;
 import cn.qinys.platform.base.vo.LoginUserInfo;
 import cn.qinys.platform.entity.wishing.WishingUser;
+import cn.qinys.platform.mobile.mapper.UserWishMapper;
 import cn.qinys.platform.mobile.mapper.WishingUserMapper;
 import cn.qinys.platform.mobile.req.LoginReq;
 import cn.qinys.platform.mobile.resp.CaptchaResp;
@@ -14,6 +15,7 @@ import cn.qinys.platform.mobile.resp.UserWishSummaryResp;
 import cn.qinys.platform.mobile.service.LoginService;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
+import org.aspectj.apache.bcel.generic.RET;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
@@ -36,6 +38,8 @@ public class LoginServiceImpl extends AbstractLoginService implements LoginServi
     private ICaptchaService captchaService;
     @Resource
     private WishingUserMapper userMapper;
+    @Resource
+    private UserWishMapper wishMapper;
 
 
     @Override
@@ -91,10 +95,7 @@ public class LoginServiceImpl extends AbstractLoginService implements LoginServi
 
     @Override
     public UserWishSummaryResp wishSummary() {
-        UserWishSummaryResp resp = new UserWishSummaryResp();
-        // 随机生成 0 ~ 999 的整数,作为 wishCount
-        resp.setWishCount(ThreadLocalRandom.current().nextInt(1000));
-        resp.setReceiveCount(ThreadLocalRandom.current().nextInt(100));
-        return resp;
+        Integer userId = Integer.valueOf(CurrentUtils.getCurrentUserId());
+        return wishMapper.selectWishSummary(userId);
     }
 }

+ 8 - 55
wishing-platform/platform-service/platform-service-mobile/src/main/java/cn/qinys/platform/mobile/service/impl/UserWishServiceImpl.java

@@ -8,25 +8,19 @@ import cn.qinys.platform.mobile.mapper.WishingTreeMapper;
 import cn.qinys.platform.mobile.req.WishCreateReq;
 import cn.qinys.platform.mobile.req.WishPageReq;
 import cn.qinys.platform.mobile.resp.WishDetailResp;
-import cn.qinys.platform.mobile.resp.WishListResp;
 import cn.qinys.platform.mobile.resp.WishPageResp;
 import cn.qinys.platform.mobile.service.UserWishService;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.List;
-
 @Slf4j
 @Service
-public class UserWishServiceImpl implements UserWishService {
+public class UserWishServiceImpl extends AbstractUserWishService implements UserWishService {
 
     @Resource
     private UserWishMapper wishMapper;
@@ -59,29 +53,26 @@ public class UserWishServiceImpl implements UserWishService {
     }
 
     @Override
-    public WishDetailResp getDetail(Long id) {
-        UserWish wish = wishMapper.selectById(id);
-        return wish != null ? toDetailResp(wish) : null;
+    public WishDetailResp getDetail(Integer id) {
+        return wishMapper.selectWishDetail(id);
     }
 
     @Override
-    public WishDetailResp create(WishCreateReq req) {
+    public void create(WishCreateReq req) {
         WishingTree tree = treeMapper.selectById(req.getTreeId());
-
         UserWish wish = new UserWish();
         wish.setTreeId(req.getTreeId());
         wish.setTreeName(tree != null ? tree.getName() : "");
         wish.setUserId(CurrentUtils.getCurrentUserId());
         wish.setContent(req.getContent());
-        wish.setImages(toJson(req.getImages()));
+        wish.setImages(JSON.toJSONString(req.getImages()));
         wish.setLongitude(req.getLng());
         wish.setLatitude(req.getLat());
         wish.setAddress(req.getAddress());
         wish.setIsPublic(req.getIsPublic() != null && req.getIsPublic() ? 1 : 0);
-        wish.setTags(toJson(req.getTags()));
-
+        wish.setTags(JSON.toJSONString(req.getTags()));
         wishMapper.insert(wish);
-        return toDetailResp(wish);
+        this.treeWishesCounter(req.getTreeId(), wish.getIsPublic());
     }
 
     @Override
@@ -105,43 +96,5 @@ public class UserWishServiceImpl implements UserWishService {
         return wish.getLikes();
     }
 
-    private WishDetailResp toDetailResp(UserWish wish) {
-        WishDetailResp resp = new WishDetailResp();
-        resp.setId(wish.getId());
-        resp.setTreeId(wish.getTreeId());
-        resp.setTreeName(wish.getTreeName());
-        resp.setUserId(wish.getUserId());
-        resp.setContent(wish.getContent());
-        resp.setImages(parseJsonList(wish.getImages()));
-        resp.setLng(wish.getLongitude());
-        resp.setLat(wish.getLatitude());
-        resp.setAddress(wish.getAddress());
-        resp.setIsPublic(wish.getIsPublic() != null && wish.getIsPublic() == 1);
-        resp.setTags(parseJsonList(wish.getTags()));
-        resp.setLikes(wish.getLikes());
-        resp.setStatus(wish.getStatus());
-        resp.setCreatedAt(wish.getCreatedAt());
-        return resp;
-    }
-
-    private String toJson(List<String> list) {
-        if (list == null || list.isEmpty()) return "[]";
-        try {
-            return OBJECT_MAPPER.writeValueAsString(list);
-        } catch (JsonProcessingException e) {
-            log.error("toJson error", e);
-            return "[]";
-        }
-    }
 
-    private List<String> parseJsonList(String json) {
-        if (json == null || json.isBlank()) return new ArrayList<>();
-        try {
-            return OBJECT_MAPPER.readValue(json, new TypeReference<List<String>>() {
-            });
-        } catch (Exception e) {
-            log.error("parseJsonList error", e);
-            return new ArrayList<>();
-        }
-    }
 }

+ 4 - 1
wishing-tree-h5/src/views/WishDetailView.vue

@@ -20,7 +20,7 @@
       </div>
 
       <div class="wish-tags-box" v-if="wish.tags?.length">
-        <van-tag v-for="t in wish.tags" :key="t" plain type="primary" size="medium" style="margin-right: 6px">
+        <van-tag v-for="t in wish.tags" :key="t" plain type="primary" size="medium">
           {{ t }}
         </van-tag>
       </div>
@@ -125,6 +125,9 @@ onMounted(async () => {
   margin-bottom: 12px;
 }
 .wish-tags-box {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 6px 4px;
   margin-bottom: 12px;
 }
 .wish-meta-box {

BIN
wishing-tree-h5/wish.zip