diff --git a/ruoyi-admin/src/main/java/org/dromara/app/AppSearchController.java b/ruoyi-admin/src/main/java/org/dromara/app/AppSearchController.java index 735c70016..062387cba 100644 --- a/ruoyi-admin/src/main/java/org/dromara/app/AppSearchController.java +++ b/ruoyi-admin/src/main/java/org/dromara/app/AppSearchController.java @@ -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> search(@RequestBody ArticleBO bo,@RequestBody Page page) { @@ -40,4 +60,36 @@ public class AppSearchController { // return R.ok(articleList); return null; } + + + @Tag(name = "视频、商品和用户检索") + @PostMapping("/searchApp") + public R> 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); + } } diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/SearchBO.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/SearchBO.java new file mode 100644 index 000000000..dfe3daf0b --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/SearchBO.java @@ -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; + +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/enums/SearchTypeEnum.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/enums/SearchTypeEnum.java new file mode 100644 index 000000000..31a478e68 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/enums/SearchTypeEnum.java @@ -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; + } +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/VlogService.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/VlogService.java index 4aa521de5..6ff642ccc 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/VlogService.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/VlogService.java @@ -147,4 +147,9 @@ public interface VlogService { * @return 随机视频列表 */ List> getRandomVlogs(int limit); + + /** + * 首页搜索/搜索的vlog列表 + */ + Page getIndexSearchVlogList(SearchBO bo, Page page); } diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java index e2be61c8d..9b69ee8a0 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java @@ -783,4 +783,50 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { return new ArrayList<>(); } } + + @Override + public Page getIndexSearchVlogList(SearchBO bo, Page page) { + String userId = bo.getUserId(); + int current = (int) page.getCurrent(); + int size = (int) page.getSize(); + Page pageParam = new Page<>(current, size); + + LambdaQueryWrapper 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 vlogPage = vlogMapper.selectPage(pageParam, queryWrapper); + List vlogList = vlogPage.getRecords(); + List 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 gridResult = new Page(); + gridResult.setRecords(voList); // 当前页数据列表 + gridResult.setCurrent(current); // 当前页码 + gridResult.setTotal(vlogPage.getTotal()); // 总记录数 + gridResult.setSize(vlogPage.getPages()); // 总页数 + + return gridResult; + } } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductService.java index e45a5288a..45c589ef0 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductService.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductService.java @@ -18,4 +18,13 @@ public interface ProductService extends IService { */ IPage getRecommendPage( Page page); + /** + * 不带租户的获取商品信息 + * + * @param query + * @param page + * @return + */ + IPage getProductPageList(ProductBo query, Page page); + } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/impl/ProductServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/impl/ProductServiceImpl.java index c6f0154b2..615c9d48e 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/impl/ProductServiceImpl.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/impl/ProductServiceImpl.java @@ -167,4 +167,17 @@ public class ProductServiceImpl extends ServiceImpl impl public IPage getProduct(Page page, ProductBo query) { return TenantHelper.ignore(() -> productMapper.getProduct(page, query)); } + + + /** + * 不带租户的获取商品信息 + * + * @param query + * @param page + * @return + */ + @Override + public IPage getProductPageList(ProductBo query, Page page) { + return TenantHelper.ignore(() -> productMapper.getProduct(page, query)); + } }