Skip to content

Commit e447f50

Browse files
committed
feat(search): 使用枚举优化搜索排序功能
Signed-off-by: LiggMax <wenzhouli06@gmail.com>
1 parent 1e1eb45 commit e447f50

7 files changed

Lines changed: 51 additions & 15 deletions

File tree

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.ligg.common.enums;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
6+
/**
7+
* @author Ligg
8+
* @create_time 2025/11/6 18:48
9+
* @update_time 2025/11/6 18:48
10+
**/
11+
@Getter
12+
@AllArgsConstructor
13+
public enum SearchSorting {
14+
//价格排序
15+
PRICE_ASC("价格升序"),
16+
RATING_ASC("评分升序"),
17+
HOT_ASC("热度升序");
18+
19+
private final String value;
20+
}

common/src/main/java/com/ligg/common/mapper/SearchMapper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package com.ligg.common.mapper;
66

77
import com.baomidou.mybatisplus.core.metadata.IPage;
8+
import com.ligg.common.enums.SearchSorting;
89
import com.ligg.common.module.entity.ProductEntity;
910
import org.apache.ibatis.annotations.Mapper;
1011
import org.apache.ibatis.annotations.Param;
@@ -22,5 +23,5 @@ public interface SearchMapper {
2223
*/
2324
IPage<ProductEntity> selectCommodity(@Param("page") IPage<ProductEntity> page,
2425
@Param("keyword") String keyword,
25-
@Param("sort") Integer sort);
26+
@Param("sort") SearchSorting sort);
2627
}

common/src/main/java/com/ligg/common/service/SearchService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.ligg.common.service;
22

3+
import com.ligg.common.enums.SearchSorting;
34
import com.ligg.common.module.entity.ProductEntity;
45
import com.ligg.common.module.vo.PageVo;
56
import jakarta.validation.constraints.NotNull;
@@ -9,5 +10,5 @@
910
* @Time 2025/10/8
1011
**/
1112
public interface SearchService {
12-
PageVo<ProductEntity> searchCommodityPageList(@NotNull String keyword, Long pageNumber, long pageSize, Integer sort);
13+
PageVo<ProductEntity> searchCommodityPageList(@NotNull String keyword, Long pageNumber, long pageSize, SearchSorting sort);
1314
}

common/src/main/java/com/ligg/common/service/impl/SearchServiceImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import com.baomidou.mybatisplus.core.metadata.IPage;
88
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
9+
import com.ligg.common.enums.SearchSorting;
910
import com.ligg.common.module.entity.ProductEntity;
1011
import com.ligg.common.mapper.SearchMapper;
1112
import com.ligg.common.service.SearchService;
@@ -29,7 +30,7 @@ public class SearchServiceImpl implements SearchService {
2930
* @return 商品列表
3031
*/
3132
@Override
32-
public PageVo<ProductEntity> searchCommodityPageList(String keyword, Long pageNumber, long pageSize, Integer sort) {
33+
public PageVo<ProductEntity> searchCommodityPageList(String keyword, Long pageNumber, long pageSize, SearchSorting sort) {
3334
Page<ProductEntity> page = new Page<>(pageNumber, pageSize);
3435
IPage<ProductEntity> result = searchMapper.selectCommodity(page, keyword,sort);
3536
PageVo<ProductEntity> pageVo = new PageVo<>();

common/src/main/resources/mapper/SearchMapper.xml

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,25 @@
1414
p.rating
1515
from product p
1616
left join product_detail pd on p.id = pd.product_id
17-
where p.title like concat('%', #{keyword}, '%')
18-
or pd.description like concat('%', #{keyword}, '%')
19-
<if test="sort == 2">
20-
order by p.current_price
21-
</if>
22-
<if test="sort == 3">
23-
order by p.current_price desc
24-
</if>
17+
<where>
18+
<if test="keyword != null and keyword != ''">
19+
where p.title like concat('%', #{keyword}, '%')
20+
or pd.description like concat('%', #{keyword}, '%')
21+
</if>
22+
</where>
23+
<choose>
24+
<when test="sort != null and sort.name() == 'PRICE_ASC'">
25+
order by p.current_price desc
26+
</when>
27+
<when test="sort != null and sort.name() == 'RATING_ASC'">
28+
order by p.rating desc
29+
</when>
30+
<when test="sort != null and sort.name() == 'HOT_ASC'">
31+
order by p.views desc
32+
</when>
33+
<otherwise>
34+
order by p.created_at desc
35+
</otherwise>
36+
</choose>
2537
</select>
2638
</mapper>

web/api-client/src/main/java/com/ligg/apiclient/controller/ClientProductController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
88
import com.ligg.apiclient.pojo.vo.TagVo;
9+
import com.ligg.common.enums.SearchSorting;
910
import com.ligg.common.module.entity.ProductEntity;
1011
import com.ligg.common.module.entity.ProductDetailEntity;
1112
import com.ligg.common.module.entity.ProductImageEntity;
@@ -131,7 +132,7 @@ public Response<ProductDetailVo> getFeaturedDetail(@Schema(description = "商品
131132
@Operation(summary = "商品搜索")
132133
public Response<PageVo<SearchVo>> search(@Schema(description = "关键字") @NotNull String keyword,
133134
@Schema(description = "页码") @NotNull Long pageNumber,
134-
@Schema(description = "排序") @RequestParam(required = false) Integer sort) {
135+
@Schema(description = "排序") @RequestParam(required = false) SearchSorting sort) {
135136
//获取商品分页列表
136137
PageVo<ProductEntity> searchData = searchService.searchCommodityPageList(keyword, pageNumber, 20L, sort);
137138
List<SearchVo> searchResult = searchData.getList().stream().map(search -> {

web/api-client/src/main/java/com/ligg/apiclient/controller/SearchController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
**/
55
package com.ligg.apiclient.controller;
66

7+
import com.ligg.common.enums.SearchSorting;
78
import com.ligg.common.module.entity.ProductEntity;
89
import com.ligg.common.enums.BusinessStates;
910
import com.ligg.common.service.SearchService;
@@ -15,7 +16,6 @@
1516
import io.swagger.v3.oas.annotations.Operation;
1617
import io.swagger.v3.oas.annotations.media.Schema;
1718
import io.swagger.v3.oas.annotations.tags.Tag;
18-
import jakarta.validation.constraints.NotNull;
1919
import lombok.RequiredArgsConstructor;
2020
import org.springframework.beans.BeanUtils;
2121
import org.springframework.web.bind.annotation.GetMapping;
@@ -46,9 +46,9 @@ public class SearchController {
4646
*/
4747
@Operation(summary = "搜索商品")
4848
@GetMapping
49-
public Response<PageVo<SearchVo>> searchCommodity(@Schema(description = "关键字") @RequestParam @NotNull String keyword,
49+
public Response<PageVo<SearchVo>> searchCommodity(@Schema(description = "关键字") @RequestParam(required = false) String keyword,
5050
@Schema(description = "页码") @RequestParam(defaultValue = "1") Long pageNumber,
51-
@Schema(description = "排序") @RequestParam(defaultValue = "1") Integer sort) {
51+
@Schema(description = "排序") @RequestParam(defaultValue = "1") SearchSorting sort) {
5252
PageVo<ProductEntity> pageVo = searchService.searchCommodityPageList(keyword, pageNumber, 20L, sort);
5353
List<SearchVo> pageVolist = pageVo.getList().stream().map(product -> {
5454
SearchVo searchVo = new SearchVo();

0 commit comments

Comments
 (0)