去除 user 服务,对 product 服务的依赖。
目前 product 服务会报错,稍后修复
This commit is contained in:
@@ -1,66 +0,0 @@
|
||||
package cn.iocoder.mall.user.biz.convert;
|
||||
|
||||
import cn.iocoder.mall.product.api.message.ProductSpuCollectionMessage;
|
||||
import cn.iocoder.mall.user.api.bo.UserProductSpuCollectionsBO;
|
||||
import cn.iocoder.mall.user.api.dto.UserProductSpuCollectionsAddDTO;
|
||||
import cn.iocoder.mall.user.api.dto.UserProductSpuCollectionsUpdateDTO;
|
||||
import cn.iocoder.mall.user.biz.dataobject.UserProductSpuCollectionsDO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mappings;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 用户_商品_收藏记录表
|
||||
*
|
||||
* @author xiaofeng
|
||||
* @date 2019-07-01 20:23:30
|
||||
*/
|
||||
@Mapper
|
||||
public interface UserProductSpuCollectionsConvert {
|
||||
|
||||
UserProductSpuCollectionsConvert INSTANCE = Mappers.getMapper(UserProductSpuCollectionsConvert.class);
|
||||
|
||||
/**
|
||||
* DTO convert DO
|
||||
* @param userSkuCollectionsAddDTO
|
||||
* @return
|
||||
*/
|
||||
@Mappings({})
|
||||
UserProductSpuCollectionsDO convert(UserProductSpuCollectionsAddDTO userSkuCollectionsAddDTO);
|
||||
|
||||
/**
|
||||
* update DTO convert DO
|
||||
* @param userProductSpuCollectionsUpdateDTO
|
||||
* @return
|
||||
*/
|
||||
@Mappings({})
|
||||
UserProductSpuCollectionsDO convert(UserProductSpuCollectionsUpdateDTO userProductSpuCollectionsUpdateDTO);
|
||||
|
||||
/**
|
||||
* DO Convert BO
|
||||
* @param userSkuCollectionsDO
|
||||
* @return
|
||||
*/
|
||||
@Mappings({})
|
||||
UserProductSpuCollectionsBO convert(UserProductSpuCollectionsDO userSkuCollectionsDO);
|
||||
|
||||
/**
|
||||
* DO List convert BO LIST
|
||||
* @param userSkuCollectionsDOS
|
||||
* @return
|
||||
*/
|
||||
@Mappings({})
|
||||
List<UserProductSpuCollectionsBO> convert(List<UserProductSpuCollectionsDO> userSkuCollectionsDOS);
|
||||
|
||||
/**
|
||||
* 消处数据转换
|
||||
* @param productSpuCollectionMessage
|
||||
* @return
|
||||
*/
|
||||
@Mappings({})
|
||||
UserProductSpuCollectionsAddDTO convert(ProductSpuCollectionMessage productSpuCollectionMessage);
|
||||
|
||||
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
package cn.iocoder.mall.user.biz.dao;
|
||||
|
||||
import cn.iocoder.mall.user.biz.dataobject.UserProductSpuCollectionsDO;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 用户_商品_收藏记录表
|
||||
*
|
||||
* @author xiaofeng
|
||||
* @date 2019-07-01 20:23:30
|
||||
*/
|
||||
public interface UserProductSpuCollectionsMapper extends BaseMapper<UserProductSpuCollectionsDO> {
|
||||
|
||||
/**
|
||||
* 根据用户id 和 spuId 查找用户商品收藏
|
||||
* @param userId
|
||||
* @param spuId
|
||||
* @return
|
||||
*/
|
||||
default UserProductSpuCollectionsDO getUserSpuCollectionsByUserIdAndSpuId(final Integer userId,
|
||||
final Integer spuId) {
|
||||
QueryWrapper<UserProductSpuCollectionsDO> query = new QueryWrapper<UserProductSpuCollectionsDO>()
|
||||
.eq("user_id", userId).eq("spu_id", spuId);
|
||||
return selectOne(query);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询用户收藏列表
|
||||
* @param userId
|
||||
* @param offset
|
||||
* @param limit
|
||||
* @return
|
||||
*/
|
||||
List<UserProductSpuCollectionsDO> selectListByUser(@Param("userId") Integer userId, @Param("offset") Integer offset,
|
||||
@Param("limit") Integer limit);
|
||||
|
||||
/**
|
||||
* 根据用户ID 查找总数
|
||||
* @param userId
|
||||
* @return
|
||||
*/
|
||||
Integer selectCountByUser(Integer userId);
|
||||
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
package cn.iocoder.mall.user.biz.dataobject;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
/**
|
||||
* 用户_商品_收藏记录表
|
||||
*
|
||||
* @author xiaofeng
|
||||
* @date 2019-07-01 20:23:30
|
||||
*/
|
||||
@TableName("user_spu_collections")
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class UserProductSpuCollectionsDO implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* id自增长
|
||||
*/
|
||||
private Integer id;
|
||||
|
||||
/**
|
||||
* 用户id
|
||||
*/
|
||||
private Integer userId;
|
||||
|
||||
/**
|
||||
* 用户名称
|
||||
*/
|
||||
private String nickname;
|
||||
|
||||
/**
|
||||
* 商品id
|
||||
*/
|
||||
private Integer spuId;
|
||||
|
||||
/**
|
||||
* 商品名字
|
||||
*/
|
||||
private String spuName;
|
||||
|
||||
/**
|
||||
* 图片名字
|
||||
*/
|
||||
private String spuImage;
|
||||
|
||||
/**
|
||||
* 卖点
|
||||
*/
|
||||
private String sellPoint;
|
||||
|
||||
/**
|
||||
* 价格,单位:分
|
||||
*/
|
||||
private Integer price;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
private Date createTime;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
private Date updateTime;
|
||||
|
||||
/**
|
||||
* 删除状态
|
||||
*/
|
||||
private Integer deleted;
|
||||
|
||||
|
||||
}
|
||||
@@ -1,124 +0,0 @@
|
||||
package cn.iocoder.mall.user.biz.mq;
|
||||
|
||||
import cn.iocoder.common.framework.constant.DeletedStatusEnum;
|
||||
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
||||
import cn.iocoder.mall.product.api.message.ProductSpuCollectionMessage;
|
||||
import cn.iocoder.mall.user.api.UserProductSpuCollectionsService;
|
||||
import cn.iocoder.mall.user.api.UserService;
|
||||
import cn.iocoder.mall.user.api.bo.UserBO;
|
||||
import cn.iocoder.mall.user.api.bo.UserProductSpuCollectionsBO;
|
||||
import cn.iocoder.mall.user.api.constant.UserErrorCodeEnum;
|
||||
import cn.iocoder.mall.user.api.dto.UserProductSpuCollectionsAddDTO;
|
||||
import cn.iocoder.mall.user.api.dto.UserProductSpuCollectionsUpdateDTO;
|
||||
import cn.iocoder.mall.user.biz.convert.UserProductSpuCollectionsConvert;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
||||
import org.apache.rocketmq.spring.core.RocketMQListener;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 商品收藏 消费者
|
||||
* @author xiaofeng
|
||||
* @date 2019/07/02 19:57
|
||||
* @version 1.0
|
||||
*/
|
||||
@Service
|
||||
@RocketMQMessageListener(topic = ProductSpuCollectionMessage.TOPIC, consumerGroup = "product-spu-consumer-group-"
|
||||
+ ProductSpuCollectionMessage.TOPIC)
|
||||
public class UserProductSpuCollectionsConsumer implements RocketMQListener<ProductSpuCollectionMessage> {
|
||||
|
||||
@Autowired
|
||||
private UserProductSpuCollectionsService userProductSpuCollectionsService;
|
||||
|
||||
@Autowired
|
||||
private UserService userService;
|
||||
|
||||
@Override
|
||||
public void onMessage(ProductSpuCollectionMessage productSpuCollectionMessage) {
|
||||
UserBO userBO = userService.getUser(productSpuCollectionMessage.getUserId());
|
||||
if (userBO == null) {
|
||||
throw ServiceExceptionUtil.exception(UserErrorCodeEnum.USER_NOT_EXISTS.getCode());
|
||||
}
|
||||
// 收藏
|
||||
if (productSpuCollectionMessage.getHasCollectionType().equals(1)) {
|
||||
this.saveUserProductSpuCollections(productSpuCollectionMessage, userBO.getNickname());
|
||||
} else if (productSpuCollectionMessage.getHasCollectionType().equals(2)) {
|
||||
// 取消收藏
|
||||
this.deleteUserProductSpuCollections(productSpuCollectionMessage.getUserId(),
|
||||
productSpuCollectionMessage.getSpuId());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存商品收藏
|
||||
* @param productSpuCollectionMessage
|
||||
* @param nickname
|
||||
* @return
|
||||
*/
|
||||
private int saveUserProductSpuCollections(final ProductSpuCollectionMessage productSpuCollectionMessage,
|
||||
final String nickname) {
|
||||
int result = 0;
|
||||
UserProductSpuCollectionsBO userProductSpuCollectionsBO = this.userProductSpuCollectionsService
|
||||
.getUserSpuCollectionsByUserIdAndSpuId(productSpuCollectionMessage.getUserId(),
|
||||
productSpuCollectionMessage.getSpuId());
|
||||
if (userProductSpuCollectionsBO == null) {
|
||||
UserProductSpuCollectionsAddDTO userProductSpuCollectionsAddDTO = UserProductSpuCollectionsConvert.INSTANCE
|
||||
.convert(productSpuCollectionMessage);
|
||||
userProductSpuCollectionsAddDTO.setNickname(StringUtils.isEmpty(nickname) ? "" : nickname);
|
||||
userProductSpuCollectionsAddDTO.setCreateTime(new Date());
|
||||
userProductSpuCollectionsAddDTO.setDeleted(DeletedStatusEnum.DELETED_NO.getValue());
|
||||
result = userProductSpuCollectionsService.addUserSkuCollections(userProductSpuCollectionsAddDTO);
|
||||
} else {
|
||||
// 存在重新收藏
|
||||
if (userProductSpuCollectionsBO.getDeleted().equals(DeletedStatusEnum.DELETED_YES.getValue())) {
|
||||
UserProductSpuCollectionsUpdateDTO userProductSpuCollectionsUpdateDTO = this
|
||||
.setUserProductSpuCollectionsUpdateDTO(userProductSpuCollectionsBO.getId(),
|
||||
DeletedStatusEnum.DELETED_NO);
|
||||
result = this.userProductSpuCollectionsService
|
||||
.updateUserProductSpuCollections(userProductSpuCollectionsUpdateDTO);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 取消收藏
|
||||
* @param userId
|
||||
* @param spuId
|
||||
* @return
|
||||
*/
|
||||
private int deleteUserProductSpuCollections(final Integer userId, final Integer spuId) {
|
||||
UserProductSpuCollectionsBO userProductSpuCollectionsBO = this.userProductSpuCollectionsService
|
||||
.getUserSpuCollectionsByUserIdAndSpuId(userId, spuId);
|
||||
int result = 0;
|
||||
if (userProductSpuCollectionsBO != null) {
|
||||
// 未取消收藏的数据
|
||||
if (userProductSpuCollectionsBO.getDeleted().equals(DeletedStatusEnum.DELETED_NO.getValue())) {
|
||||
UserProductSpuCollectionsUpdateDTO userProductSpuCollectionsUpdateDTO = this
|
||||
.setUserProductSpuCollectionsUpdateDTO(userProductSpuCollectionsBO.getId(),
|
||||
DeletedStatusEnum.DELETED_YES);
|
||||
result = this.userProductSpuCollectionsService
|
||||
.updateUserProductSpuCollections(userProductSpuCollectionsUpdateDTO);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置更新值
|
||||
* @param id
|
||||
* @param deletedStatusEnum
|
||||
* @return
|
||||
*/
|
||||
private UserProductSpuCollectionsUpdateDTO setUserProductSpuCollectionsUpdateDTO(final Integer id,
|
||||
final DeletedStatusEnum deletedStatusEnum) {
|
||||
return new UserProductSpuCollectionsUpdateDTO().setId(id).setUpdateTime(new Date())
|
||||
.setDeleted(deletedStatusEnum.getValue());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,132 +0,0 @@
|
||||
package cn.iocoder.mall.user.biz.service;
|
||||
|
||||
import cn.iocoder.common.framework.constant.DeletedStatusEnum;
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.mall.user.api.UserProductSpuCollectionsService;
|
||||
import cn.iocoder.mall.user.api.bo.UserProductSpuCollectionsBO;
|
||||
import cn.iocoder.mall.user.api.bo.UserProductSpuCollectionsPageBO;
|
||||
import cn.iocoder.mall.user.api.dto.UserProductSpuCollectionsAddDTO;
|
||||
import cn.iocoder.mall.user.api.dto.UserProductSpuCollectionsPageDTO;
|
||||
import cn.iocoder.mall.user.api.dto.UserProductSpuCollectionsUpdateDTO;
|
||||
import cn.iocoder.mall.user.biz.convert.UserProductSpuCollectionsConvert;
|
||||
import cn.iocoder.mall.user.biz.dao.UserProductSpuCollectionsMapper;
|
||||
import cn.iocoder.mall.user.biz.dataobject.UserProductSpuCollectionsDO;
|
||||
import com.google.common.base.Splitter;
|
||||
import com.google.common.collect.Lists;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* UserSkuCollectionsServiceImpl
|
||||
* @author xiaofeng
|
||||
* @date 2019/07/01 21:02
|
||||
* @version 1.0
|
||||
*/
|
||||
@Service
|
||||
@org.apache.dubbo.config.annotation.Service(validation = "true", version = "${dubbo.provider.UserProductSpuCollectionsService.version}")
|
||||
public class UserProductSpuCollectionsServiceImpl implements UserProductSpuCollectionsService {
|
||||
|
||||
|
||||
@Autowired
|
||||
private UserProductSpuCollectionsMapper userProductSpuCollectionsMapper;
|
||||
|
||||
// TODO 暂时先使用冗余字段,有需要在对接实时数据查询
|
||||
// @Reference(validation = "true", version = "${dubbo.consumer.PromotionActivityService.version}")
|
||||
// private ProductSpuService productSpuService;
|
||||
|
||||
|
||||
@Override
|
||||
public int addUserSkuCollections(UserProductSpuCollectionsAddDTO userProductSpuCollectionsAddDTO) {
|
||||
return userProductSpuCollectionsMapper
|
||||
.insert(UserProductSpuCollectionsConvert.INSTANCE.convert(userProductSpuCollectionsAddDTO));
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserProductSpuCollectionsBO getUserSpuCollectionsByUserIdAndSpuId(Integer userId, Integer spuId) {
|
||||
UserProductSpuCollectionsDO userProductSpuCollectionsDO = userProductSpuCollectionsMapper
|
||||
.getUserSpuCollectionsByUserIdAndSpuId(userId, spuId);
|
||||
return UserProductSpuCollectionsConvert.INSTANCE.convert(userProductSpuCollectionsDO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int updateUserProductSpuCollections(UserProductSpuCollectionsUpdateDTO userProductSpuCollectionsUpdateDTO) {
|
||||
return userProductSpuCollectionsMapper
|
||||
.updateById(UserProductSpuCollectionsConvert.INSTANCE.convert(userProductSpuCollectionsUpdateDTO));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResult<UserProductSpuCollectionsPageBO> getUserProductSpuCollectionsPage(
|
||||
UserProductSpuCollectionsPageDTO userProductSpuCollectionsPageDTO) {
|
||||
final int offset =
|
||||
(userProductSpuCollectionsPageDTO.getPageNo() - 1) * userProductSpuCollectionsPageDTO.getPageSize();
|
||||
final int totalCount = this.userProductSpuCollectionsMapper
|
||||
.selectCountByUser(userProductSpuCollectionsPageDTO.getUserId());
|
||||
if (totalCount == 0) {
|
||||
return CommonResult
|
||||
.success(new UserProductSpuCollectionsPageBO().setList(Collections.emptyList()).setTotal(0));
|
||||
}
|
||||
|
||||
List<UserProductSpuCollectionsDO> list = userProductSpuCollectionsMapper
|
||||
.selectListByUser(userProductSpuCollectionsPageDTO.getUserId(), offset,
|
||||
userProductSpuCollectionsPageDTO.getPageSize());
|
||||
if (CollectionUtils.isEmpty(list)) {
|
||||
return CommonResult.success(
|
||||
new UserProductSpuCollectionsPageBO().setList(Collections.emptyList()).setTotal(totalCount));
|
||||
}
|
||||
for (UserProductSpuCollectionsDO userProductSpuCollectionsDO : list
|
||||
) {
|
||||
List<String> result = Lists.newArrayList(Splitter.on(",").omitEmptyStrings().trimResults().split(userProductSpuCollectionsDO.getSpuImage()));
|
||||
userProductSpuCollectionsDO.setSpuImage(result.size() > 0 ? result.get(0) : "");
|
||||
}
|
||||
|
||||
UserProductSpuCollectionsPageBO userProductSpuCollectionsPageBO = new UserProductSpuCollectionsPageBO();
|
||||
userProductSpuCollectionsPageBO.setList(UserProductSpuCollectionsConvert.INSTANCE.convert(list));
|
||||
// 查询分页总数
|
||||
userProductSpuCollectionsPageBO.setTotal(totalCount);
|
||||
// 返回结果
|
||||
return CommonResult.success(userProductSpuCollectionsPageBO);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 取消收藏
|
||||
* @param userId
|
||||
* @param spuId
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public CommonResult<Boolean> deleteUserProductSpuCollections(final Integer userId, final Integer spuId) {
|
||||
UserProductSpuCollectionsBO userProductSpuCollectionsBO = this
|
||||
.getUserSpuCollectionsByUserIdAndSpuId(userId, spuId);
|
||||
int result = 0;
|
||||
if (userProductSpuCollectionsBO != null) {
|
||||
// 未取消收藏的数据
|
||||
if (userProductSpuCollectionsBO.getDeleted().equals(DeletedStatusEnum.DELETED_NO.getValue())) {
|
||||
UserProductSpuCollectionsUpdateDTO userProductSpuCollectionsUpdateDTO = new UserProductSpuCollectionsUpdateDTO()
|
||||
.setId(userProductSpuCollectionsBO.getId()).setUpdateTime(new Date())
|
||||
.setDeleted(DeletedStatusEnum.DELETED_YES.getValue());
|
||||
result = this.updateUserProductSpuCollections(userProductSpuCollectionsUpdateDTO);
|
||||
}
|
||||
}
|
||||
return CommonResult.success(result > 0 ? Boolean.TRUE : Boolean.FALSE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResult<Boolean> hasUserSpuFavorite(final Integer spuId, final Integer userId) {
|
||||
UserProductSpuCollectionsBO userProductSpuCollectionsBO = this
|
||||
.getUserSpuCollectionsByUserIdAndSpuId(userId, spuId);
|
||||
|
||||
if (userProductSpuCollectionsBO != null) {
|
||||
// 收藏
|
||||
final boolean hasCollect = userProductSpuCollectionsBO.getDeleted()
|
||||
.equals(DeletedStatusEnum.DELETED_NO.getValue());
|
||||
return CommonResult.success(hasCollect);
|
||||
}
|
||||
return CommonResult.success(Boolean.FALSE);
|
||||
}
|
||||
}
|
||||
@@ -32,7 +32,7 @@ dubbo:
|
||||
address: spring-cloud://s1.iocoder.cn:8848 # 指定 Dubbo 服务注册中心的地址
|
||||
# Spring Cloud Alibaba Dubbo 专属配置
|
||||
cloud:
|
||||
subscribed-services: admin-application, product-application # 设置订阅的应用列表,默认为 * 订阅所有应用
|
||||
subscribed-services: admin-application # 设置订阅的应用列表,默认为 * 订阅所有应用
|
||||
# Dubbo 提供者的协议
|
||||
protocol:
|
||||
name: dubbo
|
||||
@@ -51,8 +51,6 @@ dubbo:
|
||||
version: 1.0.0
|
||||
UserService:
|
||||
version: 1.0.0
|
||||
UserProductSpuCollectionsService:
|
||||
version: 1.0.0
|
||||
consumer:
|
||||
OAuth2Service:
|
||||
version: 1.0.0
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
<?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="cn.iocoder.mall.user.biz.dao.UserProductSpuCollectionsMapper">
|
||||
|
||||
<sql id="FIELDS">
|
||||
id, user_id, nickname, spu_id, spu_name,
|
||||
spu_image,sell_point,price, create_time, update_time,
|
||||
deleted
|
||||
</sql>
|
||||
|
||||
<select id="selectById" parameterType="Integer" resultType="cn.iocoder.mall.user.biz.dataobject.UserProductSpuCollectionsDO">
|
||||
SELECT
|
||||
<include refid="FIELDS" />
|
||||
FROM user_spu_collections
|
||||
WHERE id = #{id}
|
||||
AND deleted = 0
|
||||
</select>
|
||||
|
||||
|
||||
<select id="selectListByUser" resultType="cn.iocoder.mall.user.biz.dataobject.UserProductSpuCollectionsDO">
|
||||
SELECT
|
||||
<include refid="FIELDS" />
|
||||
FROM user_spu_collections
|
||||
<where>
|
||||
user_id = #{userId} AND deleted = 0
|
||||
</where>
|
||||
<if test="offset != null and limit != null">
|
||||
LIMIT #{offset}, #{limit}
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<select id="selectCountByUser" resultType="Integer">
|
||||
SELECT
|
||||
COUNT(1)
|
||||
FROM user_spu_collections
|
||||
<where>
|
||||
user_id = #{userId} AND deleted = 0
|
||||
</where>
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user