2 Commits a661894c5e ... 2f75e12c97

Author SHA1 Message Date
  Sakana 2f75e12c97 Merge remote-tracking branch 'origin/main' 4 days ago
  Sakana 65eeb42392 banner查询所有信息(分页-连表);opinion基础基础查询上传 4 days ago

+ 8 - 0
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/commodity/ShopReviewRemoteController.java

@@ -0,0 +1,8 @@
+package edu.travel.remote.commodity;
+
+import edu.travel.remote.base.RemoteBaseController;
+import edu.travel.remote.dto.ShopReviewDto;
+import edu.travel.remote.vo.ShopReviewVo;
+
+public interface ShopReviewRemoteController extends RemoteBaseController<ShopReviewVo, ShopReviewDto> {
+}

+ 74 - 0
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/ShopReviewDto.java

@@ -0,0 +1,74 @@
+package edu.travel.remote.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import edu.travel.entity.BaseEntity;
+import edu.travel.po.PagePO;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 商品评论表
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName(value = "shop_review")
+public class ShopReviewDto extends PagePO {
+    /**
+     * 商品评论表ID
+     */
+    private Long id;
+
+    /**
+     * 父级ID、0为一级评论
+     */
+    private Long parentId;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 商品ID
+     */
+    private Long productId;
+    /**
+     * 订单号
+     */
+    private Long orderId;
+    /**
+     * SKU
+     */
+    private Long skuId;
+
+    /**
+     * 评级
+     */
+    private Integer rating;
+
+    /**
+     * 评论内容
+     */
+    private String content;
+
+    /**
+     * 评论图片
+     */
+    private String image;
+
+    /**
+     * 是否置顶
+     */
+    private String isTop;
+
+    /**
+     * sku详情
+     */
+    private String skuDetails;
+
+}

+ 2 - 1
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/vo/ShopReviewVo.java

@@ -1,11 +1,12 @@
 package edu.travel.remote.vo;
 
+import edu.travel.entity.BaseEntity;
 import lombok.Data;
 
 import java.util.List;
 
 @Data
-public class ShopReviewVo {
+public class ShopReviewVo extends BaseEntity {
     /**
      * 商品评论表ID
      */

+ 7 - 2
edu-travel-remote/edu-travel-remote-tenant/src/main/java/edu/travel/remote/feign/mode/dto/tenant/BannerDto.java

@@ -1,12 +1,12 @@
 package edu.travel.remote.feign.mode.dto.tenant;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import edu.travel.po.PagePO;
 import lombok.Data;
 
 import java.util.Date;
-
 @Data
-public class BannerDto {
+public class BannerDto extends PagePO {
     /**
      * 轮播图ID
      */
@@ -47,6 +47,10 @@ public class BannerDto {
      */
     private Integer isDefault;
     /**
+     * 是否启用
+     */
+    private String enable;
+    /**
      * 开始时间
      */
     private Date startTime;
@@ -65,4 +69,5 @@ public class BannerDto {
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
     private Date updateTime;
 
+
 }

+ 10 - 1
edu-travel-remote/edu-travel-remote-tenant/src/main/java/edu/travel/remote/feign/mode/vo/banner/BannerVo.java

@@ -2,6 +2,8 @@ package edu.travel.remote.feign.mode.vo.banner;
 
 import lombok.Data;
 
+import java.util.Map;
+
 @Data
 public class BannerVo {
     /**
@@ -35,5 +37,12 @@ public class BannerVo {
      * 链接地址
      */
     private String linkUrl;
-
+    /**
+     * 是否默认
+     */
+    private Integer isDefault;
+    /**
+     * map
+     */
+    private Map<String, Object> map;
 }

+ 0 - 9
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopOpinionServiceImpl.java

@@ -41,7 +41,6 @@ public class ShopOpinionServiceImpl extends SysServiceImpl<ShopOpinionMapper, Sh
                 (dto.getCurrentPage() - 1) * dto.getPageSize()
         );
 
-        // 这里直接使用 shopOpinions,无需转换
         List<ShopOpinionVo> shopOpinionVoList = shopOpinions; // 直接赋值
 
         int total = shopOpinionMapper.countAll(dto.getDescription(), dto.getState(),null);
@@ -73,14 +72,6 @@ public class ShopOpinionServiceImpl extends SysServiceImpl<ShopOpinionMapper, Sh
         return new RPCBaseResponse<>(200, "SUCCESS", pageVoLink);
     }
 
-    // 确保 convertToVo 方法处理正确
-    private ShopOpinionVo convertToVo(ShopOpinion shopOpinion) {
-        // 确保从 ShopOpinion 转换到 ShopOpinionVo 的逻辑是正确的
-        ShopOpinionVo vo = new ShopOpinionVo();
-        vo.setId(shopOpinion.getId());
-        vo.setCountryId(shopOpinion.getCountryId());
-        return vo;
-    }
     //查询国家信息
     private Map<String, ShopOpinionVo> fetchCountryData(Set<String> countryServeIds) {
         Map<String, ShopOpinionVo> countryMap = new HashMap<>();

+ 83 - 12
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopReviewController.java

@@ -1,35 +1,41 @@
 package edu.travel.commodity.web;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import edu.travel.commodity.entity.ShopReview;
 import edu.travel.commodity.service.ShopReviewService;
+import edu.travel.remote.commodity.ShopReviewRemoteController;
 import edu.travel.remote.dto.AddReviewDto;
 import edu.travel.remote.dto.ProductSpecDto;
-import edu.travel.rpc.RPCBaseResponse;
+import edu.travel.remote.dto.ShopReviewDto;
 import edu.travel.remote.vo.ShopReviewVo;
-import org.springframework.web.bind.annotation.*;
-
+import edu.travel.rpc.RPCBaseResponse;
+import edu.travel.web.BaseController;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
 
 import static edu.travel.rpc.RPCBaseResponse.success;
 
 
 /**
-* 商品评论表(shop_review)表控制层
-*
-* @author xxxxx
-*/
+ * 商品评论表(shop_review)表控制层
+ *
+ * @author xxxxx
+ */
 @RestController
 @RequestMapping("/shopReview")
-public class ShopReviewController {
-/**
-* 服务对象
-*/
+public class ShopReviewController extends BaseController<ShopReview> implements ShopReviewRemoteController {
+    /**
+     * 服务对象
+     */
     @Autowired
     private ShopReviewService shopReviewService;
 
     /**
-     *  获取商品评论
+     * 获取商品评论
+     *
      * @param params
      * @return {@link RPCBaseResponse }<{@link Page }<{@link ShopReviewVo }>>
      */
@@ -41,6 +47,7 @@ public class ShopReviewController {
 
     /**
      * 发表评论
+     *
      * @param params
      * @return {@link RPCBaseResponse }<{@link String }>
      */
@@ -48,4 +55,68 @@ public class ShopReviewController {
     public RPCBaseResponse<String> addReview(@RequestBody AddReviewDto params) {
         return success(shopReviewService.addReview(params));
     }
+
+    /**
+     * 通过id查找商品评论
+     */
+    @Override
+    @GetMapping("/getFormId")
+    public RPCBaseResponse<ShopReviewVo> getFormId(String id) {
+        RPCBaseResponse<ShopReview> shopReviewRPCBaseResponse = super.getId(id);
+        RPCBaseResponse<ShopReviewVo> shopReviewVoRPCBaseResponse = new RPCBaseResponse<>();
+        BeanUtils.copyProperties(shopReviewRPCBaseResponse, shopReviewVoRPCBaseResponse);
+        return shopReviewVoRPCBaseResponse;
+    }
+
+    /**
+     * 根据id更新商品评论
+     */
+    @Override
+    @PostMapping("/updateTargetFormId")
+    public RPCBaseResponse<ShopReviewVo> updateTargetFormId(ShopReviewDto entity) {
+        ShopReview shopReview = new ShopReview();
+        BeanUtils.copyProperties(entity, shopReview);
+        RPCBaseResponse<ShopReview> shopReviewRPCBaseResponse = super.updateTargetById(shopReview);
+        RPCBaseResponse<ShopReviewVo> shopReviewVoRPCBaseResponse = new RPCBaseResponse<>();
+        BeanUtils.copyProperties(shopReviewRPCBaseResponse, shopReviewVoRPCBaseResponse);
+        return shopReviewVoRPCBaseResponse;
+    }
+
+    /**
+     * 新增商品评论
+     */
+    @Override
+    @PostMapping("/saveFormTarget")
+    public RPCBaseResponse<ShopReviewVo> saveFormTarget(ShopReviewDto entity) {
+        ShopReview shopReview = new ShopReview();
+        BeanUtils.copyProperties(entity, shopReview);
+        RPCBaseResponse<ShopReview> shopReviewRPCBaseResponse = super.saveTarget(shopReview);
+        RPCBaseResponse<ShopReviewVo> shopReviewVoRPCBaseResponse = new RPCBaseResponse<>();
+        BeanUtils.copyProperties(shopReviewRPCBaseResponse, shopReviewVoRPCBaseResponse);
+        return shopReviewVoRPCBaseResponse;
+    }
+
+    /**
+     * 删除商品评论
+     */
+    @Override
+    @PostMapping("/deleteTargetFormId")
+    public RPCBaseResponse<ShopReviewVo> deleteTargetFormId(List<String> ids) {
+        RPCBaseResponse<ShopReview> shopReviewRPCBaseResponse = super.deleteTargetById(ids);
+        RPCBaseResponse<ShopReviewVo> shopReviewVoRPCBaseResponse = new RPCBaseResponse<>();
+        BeanUtils.copyProperties(shopReviewRPCBaseResponse, shopReviewVoRPCBaseResponse);
+        return shopReviewVoRPCBaseResponse;
+    }
+
+    /**
+     * 获取所有商品评论
+     */
+    @Override
+    @GetMapping("/getAllForm")
+    public RPCBaseResponse<List<ShopReviewVo>> getAllForm() {
+        RPCBaseResponse<List<ShopReview>> shopReviewRPCBaseResponse = super.listAll();
+        RPCBaseResponse<List<ShopReviewVo>> shopReviewVoRPCBaseResponse = new RPCBaseResponse<>();
+        BeanUtils.copyProperties(shopReviewRPCBaseResponse, shopReviewVoRPCBaseResponse);
+        return shopReviewVoRPCBaseResponse;
+    }
 }

+ 8 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/mapper/ShopBannerMapper.java

@@ -1,7 +1,15 @@
 package edu.travel.tenant.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import edu.travel.remote.feign.mode.dto.tenant.BannerDto;
+import edu.travel.remote.feign.mode.vo.banner.BannerVo;
 import edu.travel.tenant.entity.ShopBanner;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface ShopBannerMapper extends BaseMapper<ShopBanner> {
+    List<BannerVo> selectBannerWithCountry(BannerDto banner);
+
+    int countAll(BannerDto bannerDto);
 }

+ 3 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/ShopBannerService.java

@@ -1,5 +1,6 @@
 package edu.travel.tenant.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import edu.travel.remote.feign.mode.dto.tenant.BannerDto;
 import edu.travel.remote.feign.mode.vo.banner.BannerVo;
@@ -20,4 +21,6 @@ public interface ShopBannerService extends IService<ShopBanner>{
     RPCBaseResponse<BannerVo> saveBannerCountry(BannerDto banner);
 
     RPCBaseResponse<BannerVo> updateBannerCountry(BannerDto banner);
+
+    RPCBaseResponse<IPage<BannerVo>> getBannerAllPage(BannerDto banner);
 }

+ 64 - 3
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/impl/ShopBannerServiceImpl.java

@@ -6,7 +6,9 @@ import cn.hutool.core.io.FileTypeUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import edu.travel.adapter.service.country.CountryAdapter;
 import edu.travel.adapter.service.upload.UploadAdapter;
@@ -20,13 +22,13 @@ import edu.travel.tenant.entity.ShopBanner;
 import edu.travel.tenant.mapper.ShopBannerMapper;
 import edu.travel.tenant.service.ShopBannerService;
 import edu.travel.tenant.utils.FIleUtil;
+import edu.travel.vo.BaseCountryServeVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import static edu.travel.rpc.RPCBaseResponse.error;
 import static edu.travel.rpc.RPCBaseResponse.success;
@@ -37,6 +39,11 @@ public class ShopBannerServiceImpl extends ServiceImpl<ShopBannerMapper, ShopBan
     private UploadAdapter uploadAdapter;
     @Autowired
     private CountryAdapter countryAdapter;
+    @Autowired
+    private ShopBannerMapper shopBannerMapper;
+    @Autowired
+    private ShopBannerService shopBannerService;
+
     @Override
     public List<BannerVo> getBanner(BannerDto mode) {
        List<BannerVo> list = new ArrayList<>();
@@ -239,6 +246,60 @@ public class ShopBannerServiceImpl extends ServiceImpl<ShopBannerMapper, ShopBan
         }
     }
 
+    /**
+     * 获取所有信息(分页-连表)
+     * @param bannerDto
+     * @return
+     */
+    @Override
+    public RPCBaseResponse<IPage<BannerVo>> getBannerAllPage(BannerDto bannerDto) {
+        //查询轮播图数据,确保返回类型正确
+        List<BannerVo> bannerVos = shopBannerMapper.selectBannerWithCountry(bannerDto);
+        List<BannerVo> shopBannerVos = bannerVos;
+
+        int total = shopBannerMapper.countAll(bannerDto);
+
+        //提取CountryID
+        Set<String> countryIds = shopBannerVos.stream()
+                .map(BannerVo::getCountryId)
+                .collect(Collectors.toSet());
+        //查询国家信息
+        Map<String, BannerVo> countryMap = fetchCountryData(countryIds);
+
+        //遍历并设置国家信息
+        for (BannerVo shopBannerVo : shopBannerVos) {
+            if (shopBannerVo.getMap() == null) {
+                shopBannerVo.setMap(new HashMap<>());
+            }
+            if (countryMap.containsKey(shopBannerVo.getCountryId())) {
+                shopBannerVo.getMap().put("countryServe", countryMap.get(shopBannerVo.getCountryId()));
+            }
+        }
+        //封装返回结果
+        IPage<BannerVo> pageVoLink = new Page<>();
+        pageVoLink.setRecords(shopBannerVos);
+        pageVoLink.setTotal(total);
+        pageVoLink.setCurrent(bannerDto.getCurrentPage());
+        pageVoLink.setSize(bannerDto.getPageSize());
+        return new RPCBaseResponse<>(200, "SUCCESS", pageVoLink);
+    }
+    //查询国家信息
+    private Map<String, BannerVo>fetchCountryData(Set<String> countryIds){
+        Map<String, BannerVo> countryMap = new HashMap<>();
+        for (String countryId : countryIds) {
+            BaseCountryServeVo countryServeVo = countryAdapter.getFormId(countryId).getData();
+            if (countryServeVo != null) {
+                BannerVo bannerVo = new BannerVo();
+                bannerVo.setCountryId(countryId);
+                bannerVo.setMap(new HashMap<>());
+                bannerVo.getMap().put("countryNameZh", countryServeVo.getCountryNameZh());
+               bannerVo.getMap().put("countryNameEn", countryServeVo.getCountryNameEn());
+               bannerVo.getMap().put("countryNameLocal", countryServeVo.getCountryNameLocal());
+               countryMap.put(countryId, bannerVo);
+            }
+        }
+        return countryMap;
+    }
 
 
 }

+ 8 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/web/ShopBannerController.java

@@ -1,5 +1,6 @@
 package edu.travel.tenant.web;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import edu.travel.remote.feign.mode.dto.tenant.BannerDto;
 import edu.travel.remote.feign.mode.romote.ShopBannerRemoteController;
 import edu.travel.remote.feign.mode.vo.banner.BannerVo;
@@ -42,6 +43,13 @@ public class ShopBannerController extends BaseController<ShopBanner> implements
         return success(shopBannerService.getBanner(banner));
     }
     /**
+     * 获取轮播图(连表-分页)
+     */
+    @GetMapping("/getBannerAllPage")
+    public RPCBaseResponse<IPage<BannerVo>> getBannerAllPage(BannerDto banner){
+        return shopBannerService.getBannerAllPage(banner);
+    }
+    /**
      * 新增轮播图(通过上传返回id自动填充)
      */
     @PostMapping("/saveBannerCountry")

+ 87 - 28
edu-travel-service/edu-travel-service-tenement/src/main/resources/mapper/ShopBannerMapper.xml

@@ -1,32 +1,91 @@
 <?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="edu.travel.tenant.mapper.ShopBannerMapper">
-  <resultMap id="BaseResultMap" type="edu.travel.tenant.entity.ShopBanner">
-    <!--@mbg.generated-->
-    <!--@Table shop_banner-->
-    <id column="id" jdbcType="BIGINT" property="id" />
-    <result column="url" jdbcType="VARCHAR" property="url" />
-    <result column="url_type" jdbcType="INTEGER" property="urlType" />
-    <result column="content" jdbcType="VARCHAR" property="content" />
-    <result column="link_url" jdbcType="VARCHAR" property="linkUrl" />
-    <result column="sort_order" jdbcType="INTEGER" property="sortOrder" />
-    <result column="start_time" jdbcType="TIMESTAMP" property="startTime" />
-    <result column="end_time" jdbcType="TIMESTAMP" property="endTime" />
-    <result column="country_id" jdbcType="BIGINT" property="countryId" />
-    <result column="is_default" jdbcType="INTEGER" property="isDefault" />
-    <result column="mode" jdbcType="INTEGER" property="mode" />
-    <result column="enable" jdbcType="INTEGER" property="enable" />
-    <result column="project" jdbcType="VARCHAR" property="project" />
-    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
-    <result column="create_user_id" jdbcType="VARCHAR" property="createUserId" />
-    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
-    <result column="update_user_id" jdbcType="VARCHAR" property="updateUserId" />
-    <result column="delete_flag" jdbcType="INTEGER" property="deleteFlag" />
-  </resultMap>
-  <sql id="Base_Column_List">
-    <!--@mbg.generated-->
-    id, url, url_type, content, link_url, sort_order, start_time, end_time, `is_default`, `country_id`
-    `mode`, `enable`, project, create_time, create_user_id, update_time, update_user_id, 
-    delete_flag
-  </sql>
+    <resultMap id="BaseResultMap" type="edu.travel.tenant.entity.ShopBanner">
+        <!--@mbg.generated-->
+        <!--@Table shop_banner-->
+        <id column="id" jdbcType="BIGINT" property="id"/>
+        <result column="url" jdbcType="VARCHAR" property="url"/>
+        <result column="url_type" jdbcType="INTEGER" property="urlType"/>
+        <result column="content" jdbcType="VARCHAR" property="content"/>
+        <result column="link_url" jdbcType="VARCHAR" property="linkUrl"/>
+        <result column="sort_order" jdbcType="INTEGER" property="sortOrder"/>
+        <result column="start_time" jdbcType="TIMESTAMP" property="startTime"/>
+        <result column="end_time" jdbcType="TIMESTAMP" property="endTime"/>
+        <result column="country_id" jdbcType="BIGINT" property="countryId"/>
+        <result column="is_default" jdbcType="INTEGER" property="isDefault"/>
+        <result column="mode" jdbcType="INTEGER" property="mode"/>
+        <result column="enable" jdbcType="INTEGER" property="enable"/>
+        <result column="project" jdbcType="VARCHAR" property="project"/>
+        <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
+        <result column="create_user_id" jdbcType="VARCHAR" property="createUserId"/>
+        <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
+        <result column="update_user_id" jdbcType="VARCHAR" property="updateUserId"/>
+        <result column="delete_flag" jdbcType="INTEGER" property="deleteFlag"/>
+    </resultMap>
+    <sql id="Base_Column_List">
+        <!--@mbg.generated-->
+        id, url, url_type, content, link_url, sort_order, start_time, end_time, `is_default`, `country_id`
+        `mode`, `enable`, project, create_time, create_user_id, update_time, update_user_id,
+        delete_flag
+    </sql>
+    <select id="selectBannerWithCountry" resultType="edu.travel.remote.feign.mode.vo.banner.BannerVo">
+        SELECT
+        sb.id,
+        sb.url,
+        sb.url_type,
+        sb.content,
+        sb.link_url,
+        sb.mode,
+        sb.country_id,
+        sb.start_time,
+        sb.end_time,
+        sb.sort_order,
+        sb.is_default,
+        sb.enable,
+        sb.project
+        FROM
+        shop_banner sb
+        <where>
+            <if test="url != null and url != ''">
+                AND sb.url LIKE CONCAT('%', #{url}, '%')
+            </if>
+            <if test="urlType != null">
+                AND sb.url_type = #{urlType}
+            </if>
+            <if test="content != null and content != ''">
+                AND sb.content LIKE CONCAT('%', #{content}, '%')
+            </if>
+            <if test="countryId != null and countryId != ''">
+                AND sb.country_id = #{countryId}
+            </if>
+            <if test="isDefault != null">
+                AND sb.is_default = #{isDefault}
+            </if>
+            <if test="linkUrl != null and linkUrl != ''">
+                AND sb.link_url LIKE CONCAT('%', #{linkUrl}, '%')
+            </if>
+            <if test="mode != null and mode !=''">
+                AND sb.mode = #{mode}
+            </if>
+            <if test="enable != null and enable !=''">
+                AND sb.enable = #{enable}
+            </if>
+        </where>
+    </select>
+    <select id="countAll" resultType="int">
+        SELECT COUNT(*)
+        FROM shop_banner sb
+        <where>
+            <if test="url != null and url != ''">
+                AND sb.url LIKE CONCAT('%', #{url}, '%')
+            </if>
+            <if test="urlType != null">
+                AND sb.url_type = #{urlType}
+            </if>
+            <if test="content != null and content != ''">
+                AND sb.content LIKE CONCAT('%', #{content}, '%')
+            </if>
+        </where>
+    </select>
 </mapper>