购物车

master
DongZeLiang 2024-04-08 10:47:59 +08:00
parent 132ea274f2
commit 945df9659b
22 changed files with 448 additions and 24 deletions

View File

@ -25,10 +25,10 @@
<artifactId>muyu-common-cache</artifactId>
</dependency>
<!-- 商品模块 common 依赖 -->
<!-- 商品模块 远程调用 依赖 -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>muyu-product-common</artifactId>
<artifactId>muyu-product-remote</artifactId>
</dependency>
</dependencies>

View File

@ -21,18 +21,6 @@ import java.util.function.Function;
@Component
public class ProjectInfoCache extends CacheAbs<Long, ProjectInfo> {
public static void main (String[] args) {
Long projectId = 10L;
HashCache<Long, Long, ProjectSkuInfo> hashCache = null;
List<ProjectSkuInfo> projectSkuInfoList = new ArrayList<>(){{
add(new ProjectSkuInfo());
add(new ProjectSkuInfo());
}};
hashCache.put(projectId, projectSkuInfoList, ProjectSkuInfo::getProjectId);
Long[] longArr = new Long[]{10L,11L,12L,13L,14L,15L};
hashCache.get(projectId, longArr);
}
@Autowired
private ProjectInfoData projectInfoData;

View File

@ -0,0 +1,60 @@
package com.muyu.product.cache;
import com.muyu.common.cache.abs.CacheAbs;
import com.muyu.common.core.text.Convert;
import com.muyu.product.cache.datasource.RuleCacheData;
import com.muyu.product.cache.model.RuleCacheModel;
import org.springframework.beans.factory.annotation.Autowired;
/**
* @author DongZl
* @description:
* @Date 2024/4/7 8:29
*/
public class RuleInfoCache extends CacheAbs<Long, RuleCacheModel> {
@Autowired
private RuleCacheData ruleCacheData;
/**
* key
*
* @return key
*/
@Override
public String keyPre () {
return "rule:info:";
}
/**
*
* @param redisKey
* @return ID
*/
@Override
public Long decode (String redisKey) {
return Convert.toLong(redisKey.replace(keyPre(), ""));
}
/**
*
*
* @param key ID
*
* @return
*/
@Override
public RuleCacheModel getData (Long key) {
return ruleCacheData.getRuleCacheModel(key);
}
/**
*
*/
@Override
public RuleCacheModel defaultValue () {
return new RuleCacheModel();
}
}

View File

@ -0,0 +1,13 @@
package com.muyu.product.cache.datasource;
import com.muyu.product.cache.model.RuleCacheModel;
/**
* @author DongZl
* @description:
* @Date 2024/4/7 8:31
*/
public interface RuleCacheData {
public RuleCacheModel getRuleCacheModel(Long ruleId);
}

View File

@ -1,7 +1,9 @@
package com.muyu.shop.cart.cache.impl;
package com.muyu.product.cache.datasource.impl;
import com.muyu.common.core.domain.Result;
import com.muyu.product.cache.datasource.ProjectInfoData;
import com.muyu.product.domain.ProjectInfo;
import com.muyu.product.remote.RemoteProjectInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -13,6 +15,9 @@ import org.springframework.stereotype.Service;
@Service
public class ProjectInfoDataImpl implements ProjectInfoData {
@Autowired
private RemoteProjectInfoService remoteProjectInfoService;
/**
*
* @param key ID
@ -20,6 +25,10 @@ public class ProjectInfoDataImpl implements ProjectInfoData {
*/
@Override
public ProjectInfo getData (Long key) {
Result<ProjectInfo> projectInfoResult = remoteProjectInfoService.getInfo(key);
if (Result.isError(projectInfoResult)){
return new ProjectInfo();
}
return projectInfoResult.getData();
}
}

View File

@ -1,15 +1,11 @@
package com.muyu.shop.cart.cache.impl;
package com.muyu.product.cache.datasource.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.muyu.product.cache.datasource.ProjectSkuData;
import com.muyu.product.domain.ProjectSkuInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author DongZl

View File

@ -1,4 +1,4 @@
package com.muyu.shop.cart.cache.impl;
package com.muyu.product.cache.datasource.impl;
import com.muyu.common.core.domain.Result;
import com.muyu.product.cache.datasource.ProjectSkuStockData;

View File

@ -0,0 +1,45 @@
package com.muyu.product.cache.datasource.impl;
import com.muyu.common.core.domain.Result;
import com.muyu.product.cache.datasource.RuleCacheData;
import com.muyu.product.cache.model.RuleAttrCacheModel;
import com.muyu.product.cache.model.RuleCacheModel;
import com.muyu.product.domain.RuleAttrInfo;
import com.muyu.product.domain.RuleInfo;
import com.muyu.product.remote.RemoteRuleAttrService;
import com.muyu.product.remote.RemoteRuleService;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/**
* @author DongZl
* @description:
* @Date 2024/4/7 8:32
*/
public class RuleCacheDataImpl implements RuleCacheData {
@Autowired
private RemoteRuleService remoteRuleService;
@Autowired
private RemoteRuleAttrService remoteRuleAttrService;
@Override
public RuleCacheModel getRuleCacheModel (Long ruleId) {
Result<RuleInfo> ruleInfoResult = remoteRuleService.getInfo(ruleId);
Result<List<RuleAttrInfo>> ruleAttrResult = remoteRuleAttrService.getInfoByRuleId(ruleId);
if (Result.isError(ruleInfoResult) || Result.isError(ruleAttrResult)) {
return new RuleCacheModel();
}
RuleInfo ruleInfo = ruleInfoResult.getData();
List<RuleAttrInfo> ruleAttrInfoList = ruleAttrResult.getData();
List<RuleAttrCacheModel> attrCacheModelList = ruleAttrInfoList.stream()
.map(RuleAttrCacheModel::ruleAttrBuild)
.toList();
return RuleCacheModel.builder()
.ruleName(ruleInfo.getName())
.ruleAttrModelList(attrCacheModelList)
.build();
}
}

View File

@ -0,0 +1,39 @@
package com.muyu.product.cache.model;
import com.muyu.product.domain.RuleAttrInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Arrays;
import java.util.List;
/**
* @author DongZl
* @description:
* @Date 2024/4/7 8:41
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RuleAttrCacheModel {
/**
*
*/
private String attrName;
/**
*
*/
private List<String> attrValueList;
public static RuleAttrCacheModel ruleAttrBuild (RuleAttrInfo ruleAttrInfo) {
return RuleAttrCacheModel.builder()
.attrName(ruleAttrInfo.getName())
.attrValueList(Arrays.stream(ruleAttrInfo.getAttrValue().split(",")).toList())
.build();
}
}

View File

@ -0,0 +1,30 @@
package com.muyu.product.cache.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author DongZl
* @description:
* @Date 2024/4/7 8:27
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RuleCacheModel {
/**
*
*/
private String ruleName;
/**
*
*/
private List<RuleAttrCacheModel> ruleAttrModelList;
}

View File

@ -1,3 +1,5 @@
com.muyu.product.cache.ProjectInfoCache
com.muyu.product.cache.ProjectSkuCache
com.muyu.product.cache.ProjectSkuStockCache
com.muyu.product.cache.RuleInfoCache
com.muyu.product.cache.datasource.impl.RuleCacheDataImpl

View File

@ -0,0 +1,29 @@
package com.muyu.product.remote;
import com.muyu.common.core.constant.ServiceNameConstants;
import com.muyu.common.core.domain.Result;
import com.muyu.product.domain.ProjectInfo;
import com.muyu.product.remote.factory.RemoteProjectInfoFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @author DongZl
* @description:
* @Date 2024-4-7 10:58
*/
@FeignClient(
contextId = "remoteProjectInfoService",
value = ServiceNameConstants.PRODUCT_SERVICE,
fallbackFactory = RemoteProjectInfoFactory.class,
path = "/info"
)
public interface RemoteProjectInfoService {
/**
*
*/
@GetMapping(value = "/{id}")
public Result<ProjectInfo> getInfo(@PathVariable("id") Long id) ;
}

View File

@ -0,0 +1,34 @@
package com.muyu.product.remote;
import com.muyu.common.core.constant.ServiceNameConstants;
import com.muyu.common.core.domain.Result;
import com.muyu.product.domain.ProjectSkuInfo;
import com.muyu.product.domain.RuleAttrInfo;
import com.muyu.product.remote.factory.RemoteProjectSkuFactory;
import com.muyu.product.remote.factory.RemoteRuleAttrFactory;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.List;
/**
* @author DongZl
* @description:
* @Date 2024-4-7 10:58
*/
@FeignClient(
contextId = "remoteRuleAttrService",
value = ServiceNameConstants.PRODUCT_SERVICE,
fallbackFactory = RemoteRuleAttrFactory.class,
path = "/ruleAttr"
)
public interface RemoteRuleAttrService {
/**
*
*/
@GetMapping(value = "/list/ruleId/{ruleId}")
public Result<List<RuleAttrInfo>> getInfoByRuleId(@PathVariable("ruleId") Long id);
}

View File

@ -0,0 +1,32 @@
package com.muyu.product.remote;
import com.muyu.common.core.constant.ServiceNameConstants;
import com.muyu.common.core.domain.Result;
import com.muyu.product.domain.ProjectSkuInfo;
import com.muyu.product.domain.RuleInfo;
import com.muyu.product.remote.factory.RemoteProjectSkuFactory;
import com.muyu.product.remote.factory.RemoteRuleFactory;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @author DongZl
* @description:
* @Date 2024-4-7 10:58
*/
@FeignClient(
contextId = "remoteRuleService",
value = ServiceNameConstants.PRODUCT_SERVICE,
fallbackFactory = RemoteRuleFactory.class,
path = "/rule"
)
public interface RemoteRuleService {
/**
*
*/
@GetMapping(value = "/{id}")
public Result<RuleInfo> getInfo(@PathVariable("id") Long id);
}

View File

@ -0,0 +1,31 @@
package com.muyu.product.remote.factory;
import com.muyu.common.core.domain.Result;
import com.muyu.product.domain.ProjectInfo;
import com.muyu.product.domain.RuleInfo;
import com.muyu.product.remote.RemoteProjectInfoService;
import com.muyu.product.remote.RemoteRuleService;
import org.springframework.cloud.openfeign.FallbackFactory;
/**
* @author DongZl
* @description:
* @Date 2024-4-7 10:59
*/
public class RemoteProjectInfoFactory implements FallbackFactory<RemoteProjectInfoService> {
@Override
public RemoteProjectInfoService create (Throwable cause) {
return new RemoteProjectInfoService() {
/**
*
*
* @param id
*/
@Override
public Result<ProjectInfo> getInfo (Long id) {
return Result.error(cause.getMessage());
}
};
}
}

View File

@ -0,0 +1,34 @@
package com.muyu.product.remote.factory;
import com.muyu.common.core.domain.Result;
import com.muyu.product.domain.ProjectSkuInfo;
import com.muyu.product.domain.RuleAttrInfo;
import com.muyu.product.remote.RemoteProjectSkuService;
import com.muyu.product.remote.RemoteRuleAttrService;
import com.muyu.product.remote.RemoteRuleService;
import org.springframework.cloud.openfeign.FallbackFactory;
import java.util.List;
/**
* @author DongZl
* @description:
* @Date 2024-4-7 10:59
*/
public class RemoteRuleAttrFactory implements FallbackFactory<RemoteRuleAttrService> {
@Override
public RemoteRuleAttrService create (Throwable cause) {
return new RemoteRuleAttrService() {
/**
*
*
* @param id
*/
@Override
public Result<List<RuleAttrInfo>> getInfoByRuleId (Long id) {
return Result.error(cause.getMessage());
}
};
}
}

View File

@ -0,0 +1,31 @@
package com.muyu.product.remote.factory;
import com.muyu.common.core.domain.Result;
import com.muyu.product.domain.ProjectSkuInfo;
import com.muyu.product.domain.RuleInfo;
import com.muyu.product.remote.RemoteProjectSkuService;
import com.muyu.product.remote.RemoteRuleService;
import org.springframework.cloud.openfeign.FallbackFactory;
/**
* @author DongZl
* @description:
* @Date 2024-4-7 10:59
*/
public class RemoteRuleFactory implements FallbackFactory<RemoteRuleService> {
@Override
public RemoteRuleService create (Throwable cause) {
return new RemoteRuleService() {
/**
*
*
* @param id
*/
@Override
public Result<RuleInfo> getInfo (Long id) {
return Result.error(cause.getMessage());
}
};
}
}

View File

@ -1 +1,4 @@
com.muyu.product.remote.factory.RemoteProjectSkuFactory
com.muyu.product.remote.factory.RemoteRuleAttrFactory
com.muyu.product.remote.factory.RemoteRuleFactory
com.muyu.product.remote.factory.RemoteProjectInfoFactory

View File

@ -75,6 +75,14 @@ public class RuleAttrInfoController extends BaseController {
return Result.success(ruleAttrInfoService.getById(id));
}
/**
*
*/
@GetMapping(value = "/list/ruleId/{ruleId}")
public Result<List<RuleAttrInfo>> getInfoByRuleId(@PathVariable("ruleId") Long ruleId){
return Result.success(ruleAttrInfoService.getInfoByRuleId(ruleId));
}
/**
*
*/

View File

@ -19,4 +19,10 @@ public interface RuleAttrInfoService extends IService<RuleAttrInfo> {
*/
public List<RuleAttrInfo> list(RuleAttrInfo ruleAttrInfo);
/**
* ruleId
* @param ruleId ID
* @return
*/
List<RuleAttrInfo> getInfoByRuleId (Long ruleId);
}

View File

@ -50,4 +50,18 @@ public class RuleAttrInfoServiceImpl extends ServiceImpl<RuleAttrInfoMapper, Rul
return list(queryWrapper);
}
/**
* ruleId
*
* @param ruleId ID
*
* @return
*/
@Override
public List<RuleAttrInfo> getInfoByRuleId (Long ruleId) {
LambdaQueryWrapper<RuleAttrInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(RuleAttrInfo::getRuleId, ruleId);
return this.list(queryWrapper);
}
}

View File

@ -13,12 +13,16 @@ import com.muyu.common.security.utils.SecurityUtils;
import com.muyu.product.cache.ProjectInfoCache;
import com.muyu.product.cache.ProjectSkuCache;
import com.muyu.product.cache.ProjectSkuStockCache;
import com.muyu.product.cache.RuleInfoCache;
import com.muyu.product.cache.key.SkuStockKey;
import com.muyu.product.cache.model.RuleAttrCacheModel;
import com.muyu.product.cache.model.RuleCacheModel;
import com.muyu.product.domain.ProjectInfo;
import com.muyu.product.domain.ProjectSkuInfo;
import com.muyu.shop.cart.cache.CartCache;
import com.muyu.shop.cart.cache.key.CartHashKey;
import com.muyu.shop.cart.domain.model.CartSkuModel;
import com.muyu.shop.cart.domain.model.SkuRuleModel;
import com.muyu.shop.cart.domain.model.StatisticsCartModel;
import com.muyu.shop.cart.domain.resp.CartDetailResp;
import lombok.extern.slf4j.Slf4j;
@ -52,6 +56,9 @@ public class CartInfoServiceImpl extends ServiceImpl<CartInfoMapper, CartInfo>
@Autowired
private ProjectSkuStockCache projectSkuStockCache;
@Autowired
private RuleInfoCache ruleInfoCache;
/**
*
*
@ -155,11 +162,25 @@ public class CartInfoServiceImpl extends ServiceImpl<CartInfoMapper, CartInfo>
.build()
);
// RuleCache
RuleCacheModel ruleInfoCacheModel = ruleInfoCache.getData(projectInfo.getRuleId());
List<RuleAttrCacheModel> ruleAttrModelList = ruleInfoCacheModel.getRuleAttrModelList();
List<SkuRuleModel> ruleModelList = new ArrayList<>();
String projectSku = cartInfo.getProjectSku();
String[] skuArr = projectSku.split("-");
for (int index = 0 ; index < skuArr.length ; index++) {
ruleModelList.add(
SkuRuleModel.builder()
.ruleName(ruleAttrModelList.get(index).getAttrName())
.ruleValue(skuArr[index])
.build()
);
}
return CartSkuModel.builder()
.projectId(cartInfo.getProjectId())
.name(projectInfo.getName())
.image(projectSkuInfo.getImage())
.stock(stock)
.skuRuleList(ruleModelList)
.price(projectSkuInfo.getPrice())
.cartInfoId(cartInfo.getId())
.num(cartInfo.getNum())
@ -168,7 +189,6 @@ public class CartInfoServiceImpl extends ServiceImpl<CartInfoMapper, CartInfo>
}).toList();
List<CartSkuModel> cartSkuList = new ArrayList<>();
StatisticsCartModel statisticsCartModel = StatisticsCartModel.builder()
.total(0L)
.selectTotal(0L)
@ -176,7 +196,7 @@ public class CartInfoServiceImpl extends ServiceImpl<CartInfoMapper, CartInfo>
.actualTotal(BigDecimal.ZERO)
.build();
return CartDetailResp.builder()
.cartSkuList(cartSkuList)
.cartSkuList(cartSkuModelList)
.statisticsCart(statisticsCartModel)
.build();
}