[feat]增加首页视频、商品和用户搜索接口v1.0

This commit is contained in:
haolj 2025-08-29 19:28:36 +08:00
parent f27e96ffed
commit 214d1cf82e
7 changed files with 189 additions and 0 deletions

View File

@ -1,21 +1,38 @@
package org.dromara.app;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wzj.soopin.content.domain.bo.ArticleBO;
import com.wzj.soopin.content.domain.bo.IndexListBO;
import com.wzj.soopin.content.domain.bo.SearchBO;
import com.wzj.soopin.content.domain.vo.ArticleVO;
import com.wzj.soopin.content.domain.vo.IndexVlogVO;
import com.wzj.soopin.content.enums.SearchTypeEnum;
import com.wzj.soopin.content.service.VlogService;
import com.wzj.soopin.goods.domain.bo.ProductBo;
import com.wzj.soopin.goods.domain.vo.ProductVO;
import com.wzj.soopin.goods.service.ProductService;
import com.wzj.soopin.goods.service.impl.ProductServiceImpl;
import com.wzj.soopin.member.domain.bo.MemberBO;
import com.wzj.soopin.member.service.IMemberService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.service.ISysTenantService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Objects;
@Slf4j
@RestController
@RequestMapping("/app/common/search")
@Tag(name = "公共检索")
@ -29,6 +46,9 @@ public class AppSearchController {
private final IMemberService memberService;
private final VlogService vlogService;
@Tag(name = "检索")
@PostMapping("/search")
public R<List<ArticleVO>> search(@RequestBody ArticleBO bo,@RequestBody Page<ArticleBO> page) {
@ -40,4 +60,36 @@ public class AppSearchController {
// return R.ok(articleList);
return null;
}
@Tag(name = "视频、商品和用户检索")
@PostMapping("/searchApp")
public R<IPage<?>> searchApp(@RequestBody SearchBO searchBO, @RequestBody Page page) {
try {
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
throw new ServiceException("用户未登录");
}
searchBO.setUserId(String.valueOf(loginUser.getUserId()));
} catch (Exception e) {
log.error("用户没登陆", e);
}
IPage<?> pages = null;
// 视频检索信息
if (Objects.nonNull(searchBO) && Objects.nonNull(searchBO.getType()) && (SearchTypeEnum.VIDEO.type.intValue() == searchBO.getType().intValue())) {
pages = vlogService.getIndexSearchVlogList(searchBO, page);
// 商品检索信息
} else if (Objects.nonNull(searchBO) && Objects.nonNull(searchBO.getType()) && (SearchTypeEnum.PRODUCT.type.intValue() == searchBO.getType().intValue())) {
ProductBo productBo = new ProductBo();
productBo.setNameLike(searchBO.getTitle());
pages = productService.getProductPageList(productBo, page);
// 用户检索信息
} else if (Objects.nonNull(searchBO) && Objects.nonNull(searchBO.getType()) && (SearchTypeEnum.MEMBER.type.intValue() == searchBO.getType().intValue())) {
MemberBO memberBO = new MemberBO();
memberBO.setNickname(searchBO.getTitle());
pages = memberService.getMemberPageList(memberBO, page);
}
return R.ok(pages);
}
}

View File

@ -0,0 +1,46 @@
package com.wzj.soopin.content.domain.bo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 搜索DO
*
* @author haolj
* @since 2025/08/29
*/
@Data
@Schema(description = "视频、商品和用户检索查询对象")
public class SearchBO {
/**
* 类型
*/
@Schema(description = "类型1-视频2-商品3-用户")
private Integer type;
/**
* 标题
*/
@Schema(description = "标题")
private String title;
/**
* 用户ID
*/
@Schema(description = "用户ID")
private String userId;
/**
* 城市编码
*/
@Schema(description = "城市编码")
private String cityCode;
/**
* 状态
*/
@Schema(description = "状态")
private String status;
}

View File

@ -0,0 +1,18 @@
package com.wzj.soopin.content.enums;
/**
* 首页搜索内容类型
*/
public enum SearchTypeEnum {
VIDEO(1, "视频"),
PRODUCT(2, "商品"),
MEMBER(3, "用户");
public final Integer type;
public final String value;
SearchTypeEnum(Integer type, String value) {
this.type = type;
this.value = value;
}
}

View File

@ -147,4 +147,9 @@ public interface VlogService {
* @return 随机视频列表
*/
List<Map<String, Object>> getRandomVlogs(int limit);
/**
* 首页搜索/搜索的vlog列表
*/
Page<IndexVlogVO> getIndexSearchVlogList(SearchBO bo, Page page);
}

View File

@ -783,4 +783,50 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService {
return new ArrayList<>();
}
}
@Override
public Page<IndexVlogVO> getIndexSearchVlogList(SearchBO bo, Page page) {
String userId = bo.getUserId();
int current = (int) page.getCurrent();
int size = (int) page.getSize();
Page<Vlog> pageParam = new Page<>(current, size);
LambdaQueryWrapper<Vlog> queryWrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotBlank(bo.getTitle())) {
queryWrapper.like(Vlog::getTitle, bo.getTitle());
}
if (StringUtils.isNotBlank(bo.getCityCode())) {
queryWrapper.eq(Vlog::getCityCode, bo.getCityCode());
}
if (StringUtils.isNotBlank(bo.getStatus())) {
queryWrapper.eq(Vlog::getStatus, bo.getStatus());
}
Page<Vlog> vlogPage = vlogMapper.selectPage(pageParam, queryWrapper);
List<Vlog> vlogList = vlogPage.getRecords();
List<IndexVlogVO> voList = vlogList.stream().map(v -> {
IndexVlogVO vo = MapstructUtils.convert(v, IndexVlogVO.class);
if (StringUtils.isNotBlank(userId)) {
vo.setDoIFollowVloger(fansService.queryDoIFollowVloger(userId, v.getMemberId()));
vo.setDoILikeThisVlog(doILikeVlog(userId, v.getId()));
}
vo.setLikeCounts(getVlogBeLikedCounts(v.getId()));
vo.setCommentsCounts(getVlogComment(v.getId()));
MemberVO m =memberService.getMemberInfo(vo.getMemberId());
if (m != null) {
vo.setAvatar(m.getAvatar());
vo.setNickname(m.getNickname());
}
return vo;
}).collect(Collectors.toList());
// 封装分页结果
Page<IndexVlogVO> gridResult = new Page<IndexVlogVO>();
gridResult.setRecords(voList); // 当前页数据列表
gridResult.setCurrent(current); // 当前页码
gridResult.setTotal(vlogPage.getTotal()); // 总记录数
gridResult.setSize(vlogPage.getPages()); // 总页数
return gridResult;
}
}

View File

@ -18,4 +18,13 @@ public interface ProductService extends IService<Product> {
*/
IPage<ProductVO> getRecommendPage( Page<Product> page);
/**
* 不带租户的获取商品信息
*
* @param query
* @param page
* @return
*/
IPage<ProductVO> getProductPageList(ProductBo query, Page<Product> page);
}

View File

@ -167,4 +167,17 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
public IPage<ProductVO> getProduct(Page<Product> page, ProductBo query) {
return TenantHelper.ignore(() -> productMapper.getProduct(page, query));
}
/**
* 不带租户的获取商品信息
*
* @param query
* @param page
* @return
*/
@Override
public IPage<ProductVO> getProductPageList(ProductBo query, Page<Product> page) {
return TenantHelper.ignore(() -> productMapper.getProduct(page, query));
}
}