Kaynağa Gözat

mapper及xml 提取,商品搜索页推荐列表接口

wxd 1 ay önce
ebeveyn
işleme
289fdab251

+ 16 - 0
alien-entity/src/main/java/shop/alien/entity/second/vo/SecondGoodsVo.java

@@ -1,11 +1,14 @@
 package shop.alien.entity.second.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import shop.alien.entity.second.SecondGoods;
 
+import java.util.Date;
 import java.util.List;
 
 @Data
@@ -19,4 +22,17 @@ public class SecondGoodsVo extends SecondGoods {
 //    @NotBlank(message = "商品图片不能为空")
     @ApiModelProperty(value = "商品图片")
     private List<String> imgUrl;
+
+    @TableField("user_name")
+    private String userName;
+
+    @TableField("real_name")
+    private String realName;
+
+    @TableField("user_phone")
+    private String userPhone;
+
+    @TableField("user_image")
+    private String userImage;
+
 }

+ 7 - 0
alien-entity/src/main/java/shop/alien/mapper/LifeUserMapper.java

@@ -13,6 +13,7 @@ import shop.alien.entity.store.vo.LifeUserOrderVo;
 import shop.alien.entity.store.vo.LifeUserVo;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 用户
@@ -55,4 +56,10 @@ public interface LifeUserMapper extends BaseMapper<LifeUser> {
 
     LifeUserVo getRemoveUser(@Param("id") String id);
 
+    /**
+     * 批量获取用户信息
+     * @param userIds 用户id集合
+     * @return 用户信息
+     */
+    Map<Integer, LifeUser> getUserByIds(List<Integer> userIds);
 }

+ 9 - 0
alien-entity/src/main/java/shop/alien/mapper/StoreImgMapper.java

@@ -8,6 +8,7 @@ import shop.alien.entity.store.StoreImg;
 import shop.alien.entity.store.vo.StoreImgTypeVo;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 门店图片 Mapper 接口
@@ -26,4 +27,12 @@ public interface StoreImgMapper extends BaseMapper<StoreImg> {
             "union all " +
             "select IFNULL(img_type, 5) img_type, count(1) count, img_url imgUrl from store_img where store_id = #{storeId} and img_type = 5 and delete_flag= 0")
     List<StoreImgTypeVo> getStoreImgTypeCount(@Param("storeId") Integer storeId);
+
+    /**
+     * 根据商品id获取图片
+     *
+     * @param goodsIds 商品id
+     * @return 商品图片
+     */
+    Map<Integer, List<StoreImg>> getImgsByGoodsIds(List<Integer> goodsIds);
 }

+ 17 - 0
alien-entity/src/main/java/shop/alien/mapper/second/SecondGoodsMapper.java

@@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; // 引入 Mapper 注解
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
 import shop.alien.entity.second.SecondGoods;
+import shop.alien.entity.second.vo.SecondGoodsVo;
+
 import java.util.List;
 
 /**
@@ -67,4 +69,19 @@ public interface SecondGoodsMapper extends BaseMapper<SecondGoods> {
      * @return 收藏排行榜列表
      */
     List<SecondGoods> getCollectTop10();
+
+    /**
+     * 搜索结果-商品列表
+     * @param page 分页参数
+     * @param currentLatitude 当前位置纬度
+     * @param currentLongitude 当前位置经度
+     * @return 搜索结果列表
+     */
+    IPage<SecondGoodsVo> searchGoodsList(IPage<SecondGoodsVo> page,
+                                         @Param("currentLatitude") Double currentLatitude,
+                                         @Param("currentLongitude") Double currentLongitude,
+                                         @Param("orderData") String orderData,
+                                         @Param("orderType")  Integer orderType,
+                                         @Param("shieldedGoodsIds")  List<Integer>  shieldedGoodsIds,
+                                         @Param("userIdList")  List<Integer> userIdList);
 }

+ 10 - 0
alien-entity/src/main/resources/mapper/LifeUserMapper.xml

@@ -64,4 +64,14 @@
         select concat(user_name,"(账号已注销)") as name,user_phone FROM life_user where id = #{id}
     </select>
 
+    <!-- 根据用户ID列表查询用户信息,返回Map -->
+    <select id="getUserByIds" resultType="shop.alien.entity.store.life.LifeUser">
+        SELECT *
+        FROM life_user
+        WHERE delete_flag = 0 AND id IN
+        <foreach item="id" collection="userIds" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+
 </mapper>

+ 15 - 0
alien-entity/src/main/resources/mapper/StoreImgMapper.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="shop.alien.mapper.StoreImgMapper">
+    <!-- 其他已有的SQL语句应放在这里 -->
+
+    <!-- 根据商品ID列表查询商品图片信息,返回Map -->
+    <select id="getImgsByGoodsIds" resultType="shop.alien.entity.store.StoreImg">
+        SELECT *
+        FROM store_img
+        WHERE delete_flag = 0 AND goods_id IN
+        <foreach item="id" collection="goodsIds" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+</mapper>

+ 24 - 12
alien-entity/src/main/resources/mapper/second/SecondGoodsMapper.xml

@@ -23,6 +23,7 @@
         <result column="created_user_id" property="createdUserId" jdbcType="INTEGER"/>
         <result column="updated_time" property="updatedTime" jdbcType="TIMESTAMP"/>
         <result column="updated_user_id" property="updatedUserId" jdbcType="INTEGER"/>
+        <result column="release_time" property="releaseTime" jdbcType="TIMESTAMP"/>
     </resultMap>
 
     <!-- 自定义分页查询 -->
@@ -43,31 +44,32 @@
 
     <!-- 查询商品热卖排行榜 -->
     <select id="getHotSellingRanking" resultType="shop.alien.entity.second.SecondGoods">
-        SELECT sg.*
-        FROM second_goods sg
-        WHERE sg.delete_flag = 0
-        ORDER BY sg.like_count DESC
+        SELECT *
+        FROM second_goods
+        WHERE delete_flag = 0
+        ORDER BY like_count DESC
     </select>
 
     <!-- 查询商品热卖排行榜(前10名),按标签聚合计算总点赞量 -->
     <select id="getHotSellingRankingTop10" resultType="shop.alien.entity.second.SecondGoods">
-        SELECT sg.label, SUM(sg.like_count) AS like_count
-        FROM second_goods sg
-        WHERE sg.delete_flag = 0
-        GROUP BY sg.label
+        SELECT label, SUM(like_count) AS like_count
+        FROM second_goods
+        WHERE delete_flag = 0
+        GROUP BY label
         ORDER BY like_count DESC
         LIMIT 10
     </select>
 
     <!-- 获取商品收藏排行榜(前10名),按标签聚合计算总收藏量 -->
     <select id="getCollectTop10" resultType="shop.alien.entity.second.SecondGoods">
-        SELECT sg.label, SUM(sg.collect_count) AS collect_count
-        FROM second_goods sg
-        WHERE sg.delete_flag = 0
-        GROUP BY sg.label
+        SELECT label, SUM(collect_count) AS collect_count
+        FROM second_goods
+        WHERE delete_flag = 0
+        GROUP BY label
         ORDER BY collect_count DESC
             LIMIT 10
     </select>
+
     <!-- 带图片信息的商品查询 支持分类和状态筛选 -->
     <select id="selectGoodsWithImages" resultType="shop.alien.entity.second.SecondGoods">
         SELECT *
@@ -92,4 +94,14 @@
         WHERE ss.user_id = #{userId} AND ss.delete_flag = 0 AND sg.delete_flag = 0
         AND ss.shield_type = #{shieldType}
     </select>
+
+    <!-- 搜索商品列表(包含商品信息、图片、用户信息),按距离和创建时间倒序 -->
+    <select id="searchGoodsList" resultType="shop.alien.entity.second.SecondGoods">
+        SELECT 
+            sg.*, 
+            (6371 * acos(cos(radians(#{currentLatitude})) * cos(radians(SUBSTRING_INDEX(sg.position, ',', 1))) * cos(radians(SUBSTRING_INDEX(sg.position, ',', -1)) - radians(#{currentLongitude})) + sin(radians(#{currentLatitude})) * sin(radians(SUBSTRING_INDEX(sg.position, ',', 1))))) AS distance
+        FROM second_goods sg
+        WHERE sg.delete_flag = 0
+        ORDER BY distance ASC, sg.created_time DESC
+    </select>
 </mapper>

+ 28 - 6
alien-second/src/main/java/shop/alien/second/controller/SecondGoodsController.java

@@ -4,7 +4,6 @@ import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.google.common.collect.Lists;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -134,12 +133,13 @@ public class SecondGoodsController {
     /**
      * 更新二手商品
      */
-    @PutMapping("/{id}")
+    @PutMapping("/edit")
     @ApiOperation("更新二手商品")
-    public R<Void> updateSecondGoods(@ApiParam("商品ID") @PathVariable Integer id, @ApiParam("更新后的商品信息") @RequestBody SecondGoods secondGoods) {
-        secondGoods.setId(id);
-        secondGoodsService.updateById(secondGoods);
-        return R.success("更新成功");
+    public R<Void> updateSecondGoods(@ApiParam("二手商品信息") @RequestBody SecondGoodsVo secondGoods) {
+        if (!secondGoodsService.createBasicInfo(secondGoods)) {
+            return R.fail("添加二手商品失败");
+        }
+        return R.success("添加二手商品成功");
     }
 
     /**
@@ -151,4 +151,26 @@ public class SecondGoodsController {
         secondGoodsService.removeById(id);
         return R.success("删除成功");
     }
+
+    /**
+     * 搜索商品列表(包含商品信息、图片、用户信息),按距离和创建时间倒序
+     */
+    @GetMapping("/search")
+    @ApiOperation("搜索结果-商品列表")
+    public R<IPage<SecondGoodsVo>> searchGoodsList(
+            @ApiParam("当前页码") @RequestParam Integer pageNum,
+            @ApiParam("每页数量") @RequestParam Integer pageSize,
+            @ApiParam("当前纬度") @RequestParam Double currentLatitude,
+            @ApiParam("当前经度") @RequestParam Double currentLongitude,
+            @ApiParam("排序方式") @RequestParam Integer orderType,
+            @ApiParam("排序字段") @RequestParam String orderData) {
+        R<IPage<SecondGoodsVo>> result = new R<>() ;
+        IPage<SecondGoodsVo> page = new Page<>(pageNum, pageSize);
+        JSONObject data = JwtUtil.getCurrentUserInfo();
+        if (null != data) {
+            int userId = data.getInteger("userId");
+            result = R.data(secondGoodsService.searchGoodsList(page, currentLatitude, currentLongitude, orderData, orderType,userId), "查询成功");
+        }
+        return result;
+    }
 }

+ 79 - 0
alien-second/src/main/java/shop/alien/second/mapper/SecondGoodsMapper.java

@@ -0,0 +1,79 @@
+package shop.alien.second.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper; // 引入 Mapper 注解
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import shop.alien.entity.second.SecondGoods;
+import java.util.List;
+
+/**
+ * 二手商品映射器
+ */
+public interface SecondGoodsMapper extends BaseMapper<SecondGoods> {
+    /**
+     * 自定义分页查询
+     */
+    List<SecondGoods> getSecondGoodsByPage(IPage<SecondGoods> page);
+    
+    /**
+     * 自定义分页查询并按距离排序
+     * @param page 分页信息
+     * @param currentLatitude 当前位置纬度
+     * @param currentLongitude 当前位置经度
+     * @return 分页后的二手商品列表
+     */
+    List<SecondGoods> getSecondGoodsByPageAndDistance(IPage<SecondGoods> page, @Param("currentLatitude") Double currentLatitude, @Param("currentLongitude") Double currentLongitude);
+
+    /**
+     * 自定义查询方法,返回包含图片信息的二手商品列表
+     * @param page 分页信息
+     * @param categoryId 分类ID
+     * @param status 商品状态
+     * @return 包含图片信息的二手商品列表
+     */
+    IPage<SecondGoods> selectGoodsWithImages(IPage<SecondGoods> page, @Param("categoryId") Integer categoryId, @Param("status") Integer status);
+
+    /**
+     * 查询用户屏蔽的商品列表
+     * @param page 分页参数
+     * @param userId 用户ID
+     * @return 分页后的屏蔽商品列表
+     */
+    IPage<SecondGoods> getShieldedGoodsListByType(IPage<SecondGoods> page, @Param("userId") Integer userId, @Param("shieldType") Integer shieldType);
+
+    /**
+     * 查询用户屏蔽的商品列表
+     * @param userId 用户ID
+     * @return 屏蔽的商品列表
+     */
+    List<SecondGoods> getShieldedGoodsList(@Param("userId") Integer userId);
+
+    /**
+     * 查询商品热卖排行榜
+     * @param page 分页参数
+     * @return 商品热卖排行榜列表
+     */
+    IPage<SecondGoods> getHotSellingRanking(IPage<SecondGoods> page);
+
+    /**
+     * 查询商品热卖排行榜(前10名),按标签聚合计算总点赞量
+     * @return 热卖排行榜列表
+     */
+    List<SecondGoods> getHotSellingRankingTop10();
+
+    /**
+     * 获取商品收藏排行榜(前10名),按标签聚合计算总收藏量
+     * @return 收藏排行榜列表
+     */
+    List<SecondGoods> getCollectTop10();
+
+    /**
+     * 搜索商品列表(包含商品信息、图片、用户信息),按距离和创建时间倒序
+     * @param page 分页参数
+     * @param currentLatitude 当前纬度
+     * @param currentLongitude 当前经度
+     * @return 商品列表
+     */
+    IPage<SecondGoods> searchGoodsListWithDistanceAndTime(IPage<SecondGoods> page, @Param("currentLatitude") Double currentLatitude, @Param("currentLongitude") Double currentLongitude);
+}

+ 11 - 0
alien-second/src/main/java/shop/alien/second/service/SecondGoodsService.java

@@ -71,4 +71,15 @@ public interface SecondGoodsService extends IService<SecondGoods> {
      * @return 商品收藏排行榜列表
      */
     List<SecondGoods> getCollectTop10();
+
+    /**
+     * 搜索结果-商品列表
+     * @param page 分页参数
+     * @param currentLatitude 当前纬度
+     * @param currentLongitude 当前经度
+     * @param orderData 排序字段
+     * @param orderType 排序方式
+     * @return 商品列表
+     */
+    IPage<SecondGoodsVo> searchGoodsList(IPage<SecondGoodsVo> page, Double currentLatitude, Double currentLongitude, String orderData, Integer orderType,Integer userId);
 }

+ 102 - 2
alien-second/src/main/java/shop/alien/second/service/impl/SecondGoodsServiceImpl.java

@@ -3,17 +3,23 @@ package shop.alien.second.service.impl;
 import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import shop.alien.entity.second.SecondGoods;
+import shop.alien.entity.store.LifeUser;
 import shop.alien.entity.store.StoreImg;
 import shop.alien.entity.second.vo.SecondGoodsVo;
+import shop.alien.mapper.LifeUserMapper;
+import shop.alien.mapper.StoreImgMapper;
+import shop.alien.mapper.StoreInfoMapper;
 import shop.alien.mapper.second.SecondGoodsMapper;
 import shop.alien.second.service.SecondGoodsService;
 import shop.alien.util.common.netease.ImageCheckUtil;
 import shop.alien.util.common.netease.TextCheckUtil;
 
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -23,10 +29,24 @@ import java.util.stream.Collectors;
  * 二手商品服务实现类
  */
 @Service
+@RequiredArgsConstructor
 public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, SecondGoods> implements SecondGoodsService {
 
-    @Autowired
-    private SecondGoodsMapper secondGoodsMapper;
+    /**
+     * 二手商品Mapper
+     */
+    private final SecondGoodsMapper secondGoodsMapper;
+
+    /**
+     * 用户信息Mapper
+     */
+    private final LifeUserMapper lifeUserMapper;
+
+    /**
+     * 店铺信息Mapper
+     */
+    private final StoreImgMapper storeImgMapper;
+
     /**
      * 保存商品为草稿状态
      * @param goods 商品实体
@@ -281,4 +301,84 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
     public IPage<SecondGoods> getShieldedGoodsListByType(IPage<SecondGoods> page, Integer userId, Integer shieldType) {
         return secondGoodsMapper.getShieldedGoodsListByType(page, userId, shieldType);
     }
+
+    /**
+     * 搜索商品列表
+     * @param page 分页参数
+     * @param currentLatitude 当前位置纬度
+     * @param currentLongitude 当前位置经度
+     * @param orderData 排序字段
+     * @param orderType 排序方式
+     * @return 商品列表
+     */
+    @Override
+    public IPage<SecondGoodsVo> searchGoodsList(IPage<SecondGoodsVo> page, Double currentLatitude, Double currentLongitude, String orderData, Integer orderType, Integer userId) {
+        // 获取商品屏蔽列表
+        List<SecondGoods>  shieldedGoodsList = getShieldedGoodsList(userId);
+        // 提取屏蔽商品ID
+        List<Integer> shieldedGoodsIds = shieldedGoodsList.stream()
+                .map(SecondGoods::getId)
+                .collect(Collectors.toList());
+        // 获取拉黑列表
+        List<Integer> userIdList = lifeBlackMapper.getBlackList(userId);
+        if (CollectionUtil.isEmpty(userIdList)) {
+            userIdList = Collections.emptyList();
+        }
+
+        IPage<SecondGoodsVo> searchGoodsList = secondGoodsMapper.searchGoodsList(page, currentLatitude, currentLongitude, orderData, orderType,shieldedGoodsIds, userIdList);
+        // 批量设置商品图片信息
+        batchSetGoodsImages(searchGoodsList);
+        // 批量设置用户信息
+        batchSetUserInfo(searchGoodsList);
+        return searchGoodsList;
+    }
+
+    private void batchSetUserInfo(IPage<SecondGoodsVo> searchGoodsList) {
+        // 批量获取用户信息(头像,用户姓名,用户id)
+        if (CollectionUtil.isNotEmpty(searchGoodsList.getRecords())) {
+            List<Integer> userIds = searchGoodsList.getRecords().stream()
+                    .map(SecondGoodsVo::getUserId)
+                    .collect(Collectors.toList());
+                    Map<Integer, LifeUser> userInfoMap = lifeUserMapper.getUserByIds(userIds);
+                    for (SecondGoodsVo goods : searchGoodsList.getRecords()) {
+                        LifeUser userInfo = userInfoMap.get(goods.getUserId());
+                        if (userInfo != null){
+                            // 用户名称
+                            goods.setUserName(userInfo.getUserName());
+                            // 用户真实姓名
+                            goods.setRealName(userInfo.getRealName());
+                            // 用户头像
+                            goods.setUserImage(userInfo.getUserImage());
+                            // 用户id
+                            goods.setUserId(userInfo.getId());
+                            // 用户手机号
+                            goods.setUserPhone(userInfo.getUserPhone());
+                        }
+                    }
+        }
+    }
+
+    /**
+     * 批量设置商品图片信息
+     * @param searchGoodsList 商品列表
+     */
+    private void batchSetGoodsImages(IPage<SecondGoodsVo> searchGoodsList) {
+        // 批量获取图片信息
+        if (CollectionUtil.isNotEmpty(searchGoodsList.getRecords())) {
+            List<Integer> goodsIds = searchGoodsList.getRecords().stream()
+                    .map(SecondGoodsVo::getId)
+                    .collect(Collectors.toList());
+                    Map<Integer, List<StoreImg>> imagesMap = storeImgMapper.getImgsByGoodsIds(goodsIds);
+                    for (SecondGoodsVo goods : searchGoodsList.getRecords()) {
+                        // 提取图片url
+                        List<StoreImg> images = imagesMap.get(goods.getId());
+                        if (images != null) {
+                            goods.setImgUrl(images.stream()
+                                    .map(StoreImg::getImgUrl)
+                                    .collect(Collectors.toList()));
+
+                        }
+                    }
+        }
+    }
 }