添加购物车 完善

master
rouchen 2024-04-08 19:11:35 +08:00
parent 4d2c371407
commit bef7a05ae6
24 changed files with 868 additions and 0 deletions

View File

@ -0,0 +1,58 @@
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;
/**
* RuleInfoCache
*
* @author LeYang
* on 2024/4/8
*/
public class RuleInfoCache extends CacheAbs<Long, RuleCacheModel> {
@Autowired
private RuleCacheData ruleCacheData;
/**
*
* @param key ID
* @return
*/
@Override
public RuleCacheModel getData(Long key) {
return ruleCacheData.getRulerCacheModel(key);
}
/**
*
* @return
*/
@Override
public RuleCacheModel defaultValue() {
return new RuleCacheModel();
}
/**
*
* @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(), ""));
}
}

View File

@ -0,0 +1,10 @@
[
{
image:""
商品信息:{}
sku:""
价格:""
数量:""
小计:""
}
]

View File

@ -0,0 +1,16 @@
package com.muyu.product.cache.datasource;
import com.muyu.product.cache.model.RuleCacheModel;
/**
* RuleCacheData
*
* @author LeYang
* on 2024/4/8
*/
public interface RuleCacheData {
public RuleCacheModel getRulerCacheModel(Long ruleId);
}

View File

@ -0,0 +1,44 @@
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.cache.datasource.ProjectSkuData;
import com.muyu.product.domain.ProjectInfo;
import com.muyu.product.domain.ProjectSkuInfo;
import com.muyu.product.remote.RemoteProjectInfoService;
import com.muyu.product.remote.RemoteProjectSkuService;
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 yangle
* @description:
* @Date 2024-3-27 03:37
*/
@Service
public class ProjectInfoDataRemoteImpl implements ProjectInfoData {
@Autowired
private RemoteProjectInfoService remoteProjectInfoService;
/**
*
* @param key ID
* @return
*/
@Override
public ProjectInfo getData (Long key) {
Result<ProjectInfo> projectInfoResult = remoteProjectInfoService.getInfo(key);
if (Result.isError(projectInfoResult)){
return new ProjectInfo();
}
return projectInfoResult.getData();
}
}

View File

@ -0,0 +1,65 @@
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.cache.datasource.ProjectSkuData;
import com.muyu.product.domain.ProjectInfo;
import com.muyu.product.domain.ProjectSkuInfo;
import com.muyu.product.remote.RemoteProjectInfoService;
import com.muyu.product.remote.RemoteProjectSkuService;
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 yangle
* @description: SKU
* @Date 2024-4-1 11:38
*/
@Service
public class ProjectSkuDataRemoteImpl implements ProjectSkuData {
@Autowired
private RemoteProjectSkuService remoteProjectSkuService;
/**
* hash
* @param projectId ID
* @return
*/
@Override
public Map<String, ProjectSkuInfo> getData (Long projectId) {
Result<List<ProjectSkuInfo>> projectListResult
= remoteProjectSkuService.listByProjectId(projectId);
if (Result.isError(projectListResult)){
return new HashMap<>();
}
List<ProjectSkuInfo> projectSkuInfoList = projectListResult.getData();
return projectSkuInfoList.stream()
.collect(Collectors.toMap(ProjectSkuInfo::getSku, projectSkuInfo -> projectSkuInfo));
}
/**
* hashhash
* @param projectId ID
* @param projectSku SKU
* @return hash
*/
@Override
public ProjectSkuInfo getData (Long projectId, String projectSku) {
Result<ProjectSkuInfo> projectSkuInfoResult = remoteProjectSkuService.getInfoByProjectIdAndSku(
projectId, projectSku
);
if (Result.isError(projectSkuInfoResult)){
return new ProjectSkuInfo();
}
return projectSkuInfoResult.getData();
}
}

View File

@ -0,0 +1,37 @@
package com.muyu.product.cache.datasource.impl;
import com.muyu.common.core.domain.Result;
import com.muyu.product.cache.datasource.ProjectSkuStockData;
import com.muyu.product.cache.key.SkuStockKey;
import com.muyu.product.domain.ProjectSkuInfo;
import com.muyu.product.remote.RemoteProjectSkuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Objects;
/**
* @author yangle
* @description: sku
* @Date 2024-4-2 10:53
*/
@Service
public class ProjectSkuStockDataRemoteImpl implements ProjectSkuStockData {
@Autowired
private RemoteProjectSkuService remoteProjectSkuService;
@Override
public Long getData (SkuStockKey key) {
Result<ProjectSkuInfo> result
= remoteProjectSkuService.getInfoByProjectIdAndSku(key.getProjectId(), key.getSku());
if (Result.isSuccess(result)){
ProjectSkuInfo projectSkuInfo = result.getData();
if (!Objects.isNull(projectSkuInfo)){
return projectSkuInfo.getStock();
}
}
return 0L;
}
}

View File

@ -0,0 +1,48 @@
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;
/**
* RuleCacheDataImpl
*
* @author LeYang
* on 2024/4/8
*/
public class RuleCacheDataRemoteImpl implements RuleCacheData {
@Autowired
private RemoteRuleService remoteRuleService;
@Autowired
private RemoteRuleAttrService remoteRuleAttrService;
@Override
public RuleCacheModel getRulerCacheModel(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,42 @@
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 LeYang
* on 2024/4/8
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
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,29 @@
package com.muyu.product.cache.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* RuleCacheModel
*
* @author LeYang
* on 2024/4/8
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RuleCacheModel {
/**
*
*/
private String ruleName;
/**
*
*/
private List<RuleAttrCacheModel> ruleAttrModelList;
}

View File

@ -0,0 +1,9 @@
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.RuleCacheDataRemoteImpl
com.muyu.product.cache.datasource.impl.ProjectInfoDataRemoteImpl
com.muyu.product.cache.datasource.impl.ProjectSkuDataRemoteImpl
com.muyu.product.cache.datasource.impl.ProjectSkuStockDataRemoteImpl

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.ProjectInfo;
import com.muyu.product.remote.factory.RemoteProjectInfoFactory;
import com.muyu.product.remote.factory.RemoteProjectSkuFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
*
*
* @author LeYang
* on 2024/4/8
*/
@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,43 @@
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.remote.factory.RemoteProjectSkuFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.List;
/**
* RemoteProjectSkuService
*
* @author LeYang
* on 2024/4/7
*/
@FeignClient(
contextId = "remoteProjectSkuService",
value = ServiceNameConstants.PRODUCT_SERVICE,
fallbackFactory = RemoteProjectSkuFactory.class,
path = "/sku"
)
public interface RemoteProjectSkuService {
/**
* IDskusku
* @param projectId id
* @param projectSku sku
* @return sku
*/
@GetMapping("/info/{projectId}/{projectSku}")
public Result<ProjectSkuInfo> getInfoByProjectIdAndSku(@PathVariable("projectId") Long projectId,
@PathVariable("projectSku") String projectSku);
/**
* IDSKU
* @param projectId ID
* @return SKU
*/
@GetMapping("/list/{projectId}")
public Result<List<ProjectSkuInfo>> listByProjectId(@PathVariable("projectId")Long projectId);
}

View File

@ -0,0 +1,28 @@
package com.muyu.product.remote;
import com.muyu.common.core.constant.ServiceNameConstants;
import com.muyu.common.core.domain.Result;
import com.muyu.product.domain.RuleAttrInfo;
import com.muyu.product.remote.factory.RemoteRuleAttrFactory;
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 LeYang
* on 2024/4/8
*/
@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("id") Long id);
}

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.RuleInfo;
import com.muyu.product.remote.factory.RemoteRuleFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
*
*
* @author LeYang
* on 2024/4/8
*/
@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,30 @@
package com.muyu.product.remote.factory;
import com.muyu.common.core.domain.Result;
import com.muyu.product.domain.ProjectInfo;
import com.muyu.product.remote.RemoteProjectInfoService;
import org.springframework.cloud.openfeign.FallbackFactory;
/**
* RemoteProjectInfoFactory
*
* @author LeYang
* on 2024/4/8
*/
public class RemoteProjectInfoFactory implements FallbackFactory<RemoteProjectInfoService> {
@Override
public RemoteProjectInfoService create(Throwable cause) {
return new RemoteProjectInfoService() {
/**
*
* @param id
* @return
*/
@Override
public Result<ProjectInfo> getInfo(Long id) {
return Result.error(cause.getMessage());
}
};
}
}

View File

@ -0,0 +1,37 @@
package com.muyu.product.remote.factory;
import com.muyu.common.core.domain.Result;
import com.muyu.product.domain.ProjectSkuInfo;
import com.muyu.product.remote.RemoteProjectSkuService;
import org.springframework.cloud.openfeign.FallbackFactory;
import java.rmi.Remote;
import java.util.List;
/**
* RemoteProjectSkuFactory
*
* @author LeYang
* on 2024/4/7
*/
public class RemoteProjectSkuFactory implements FallbackFactory<RemoteProjectSkuService> {
@Override
public RemoteProjectSkuService create(Throwable cause) {
return new RemoteProjectSkuService() {
@Override
public Result<ProjectSkuInfo> getInfoByProjectIdAndSku(Long projectId, String projectSku) {
return Result.error(cause.getMessage());
}
/**
* IDskusku
* @param projectId ID
* @return sku
*/
@Override
public Result<List<ProjectSkuInfo>> listByProjectId(Long projectId) {
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.RuleAttrInfo;
import com.muyu.product.remote.RemoteRuleAttrService;
import org.springframework.cloud.openfeign.FallbackFactory;
import java.util.List;
/**
* RemoteRuleAttrFactory
*
* @author LeYang
* on 2024/4/8
*/
public class RemoteRuleAttrFactory implements FallbackFactory<RemoteRuleAttrService> {
@Override
public RemoteRuleAttrService create(Throwable cause) {
return new RemoteRuleAttrService() {
/**
*
* @param id
* @return
*/
@Override
public Result<List<RuleAttrInfo>> getInfoByRuleId(Long id) {
return Result.error(cause.getMessage());
}
};
}
}

View File

@ -0,0 +1,30 @@
package com.muyu.product.remote.factory;
import com.muyu.common.core.domain.Result;
import com.muyu.product.domain.RuleInfo;
import com.muyu.product.remote.RemoteRuleService;
import org.springframework.cloud.openfeign.FallbackFactory;
/**
*
*
* @author LeYang
* on 2024/4/8
*/
public class RemoteRuleFactory implements FallbackFactory<RemoteRuleService> {
@Override
public RemoteRuleService create(Throwable cause) {
return new RemoteRuleService() {
/**
*
* @param id
* @return
*/
@Override
public Result<RuleInfo> getInfo(Long id) {
return Result.error(cause.getMessage());
}
};
}
}

View File

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

View File

@ -0,0 +1,79 @@
package com.muyu.shop.cart.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import com.muyu.common.core.web.domain.BaseEntity;
import com.muyu.shop.cart.domain.model.SkuRuleModel;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.math.BigDecimal;
import java.util.List;
/**
* builder Executor
*
* @author LeYang
* on 2024/4/8
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class ExecutorBuilder extends BaseEntity {
/**
* ID
*/
private Long cartInfoId;
/**
*
*/
private String image;
/**
* ID
*/
private Long projectId;
/**
*
*/
private String name;
/**
* sku
*/
private BigDecimal price;
/**
* sku
*/
private List<SkuRuleModel> skuRuleList;
/**
*
*/
private Long num;
/**
*
*/
private Long stock;
/**
*
*/
private BigDecimal subtotal;
/**
*
*/
private String isSelected;
public static ExecutorBuilder create() {
return ExecutorBuilder.builder()
.cartInfoId(new CartInfo().getId())
.build();
}
}

View File

@ -0,0 +1,66 @@
package com.muyu.shop.cart.domain.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.List;
/**
* CartSkuModel
*
* @author LeYang
* on 2024/4/7
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CartSkuModel {
/**
* ID
*/
private Long cartInfoId;
/**
*
*/
private String image;
/**
* ID
*/
private Long projectId;
/**
*
*/
private String name;
/**
* sku
*/
private BigDecimal price;
/**
* sku
*/
private List<SkuRuleModel> skuRuleList;
/**
*
*/
private Long num;
/**
*
*/
private Long stock;
/**
*
*/
private BigDecimal subtotal;
/**
*
*/
private String isSelected;
}

View File

@ -0,0 +1,29 @@
package com.muyu.shop.cart.domain.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* sku SkuRuleModel
*
* @author LeYang
* on 2024/4/7
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SkuRuleModel {
/**
*
*/
private String ruleName;
/**
*
*/
private String ruleValue;
}

View File

@ -0,0 +1,38 @@
package com.muyu.shop.cart.domain.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* StaticsCartModel
*
* @author LeYang
* on 2024/4/7
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class StatisticsCartModel {
/**
*
*/
private Long total;
/**
*
*/
private Long selectTotal;
/**
*
*/
private BigDecimal priceTotal;
/**
*
*/
private BigDecimal actualTotal;
}

View File

@ -0,0 +1,34 @@
package com.muyu.shop.cart.domain.req;
import com.muyu.shop.cart.domain.model.CartSkuModel;
import com.muyu.shop.cart.domain.model.StatisticsCartModel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* CartDetailResp
*
* @author LeYang
* on 2024/4/7
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CartDetailResp {
/**
*
*/
private List<CartSkuModel> cartSkuList;
/**
*
*/
private StatisticsCartModel statisticsCart;
}