后台全部完成

day9
xiaohuang 2024-04-02 17:32:32 +08:00
parent 61460bdf89
commit 291d1816a5
44 changed files with 1214 additions and 176 deletions

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.muyu</groupId>
<artifactId>muyu-common</artifactId>
<version>3.6.3</version>
</parent>
<artifactId>muyu-common-cache</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- common 缓存 -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>muyu-common-redis</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,43 @@
package com.muyu.common.cache;
import com.muyu.common.cache.decoration.DecorationKey;
/**
* @author DongZl
* @description:
* @Date 2024-3-26 03:25
*/
public interface Cache <K, V> extends DecorationKey<K> {
/**
* Keyvalue
* @param key
* @return
*/
public V get(K key);
/**
* /
* @param key
* @param value
*/
public void put(K key, V value);
/**
*
* @param key
*/
public void remove(K key);
/**
*
* @param key
*/
public void refreshTime (K key);
/**
*
* @param key
*/
public void refreshData (K key);
}

View File

@ -0,0 +1,97 @@
package com.muyu.common.cache;
import com.muyu.common.cache.decoration.DecorationKey;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
/**
* @author DongZl
* @description: Hash
* @Date 2024-3-29 03:16
*/
public interface HashCache <K, HK, HV> extends DecorationKey<K> {
/**
*
* @param hashKey ID
* @return
*/
public String encodeHashKey(HK hashKey);
/**
*
* @param redisHashKey
* @return ID
*/
public HK decodeHashKey(String redisHashKey);
/**
* Keymap
* @param key
* @return Map
*/
public Map<HK, HV> get(K key);
/**
* hashKeyhashValue
* @param key
* @param hashKey hash
* @return hash
*/
public HV get(K key, HK hashKey);
/**
* hashKeyhashValue
* @param key
* @param hashKeyList hash
* @return hash
*/
public List<HV> get(K key, HK... hashKeyList);
/**
* hash
* @param key
* @return hash
*/
public List<HV> getToList(K key);
/**
*
* @param key redis
* @param map hashMap
*/
public void put(K key, Map<HK, HV> map);
/**
*
* @param key redis
* @param dataList
* @param hashKey hash
*/
public void put(K key, List<HV> dataList, Function<HV, HK> hashKey);
/**
*
* @param key redis
* @param hashKey hash
* @param hashValue hash
*/
public void put(K key, HK hashKey, HV hashValue);
/**
* redis
* @param key hash
*/
public void remove(K key);
/**
* redishash
* @param key redis
* @param hashKey hash
*/
public void remove(K key, HK hashKey);
}

View File

@ -0,0 +1,96 @@
package com.muyu.common.cache.abs;
import com.muyu.common.cache.Cache;
import com.muyu.common.redis.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.concurrent.TimeUnit;
/**
* @author DongZl
* @description:
* @Date 2024-3-27 03:10
*/
public abstract class CacheAbs<K, V> implements Cache<K, V> {
@Autowired
private RedisService redisService;
/**
*
* @param key ID
* @return
*/
@Override
public String encode (K key) {
return keyPre() + key;
}
/**
* Keyvalue
* @param key
* @return
*/
@Override
public V get (K key) {
V value = redisService.getCacheObject(encode(key));
if (value == null){
value = getData(key);
if (value == null){
value = defaultValue();
}
}
this.put(key, value);
return value;
}
/**
* /
* @param key
* @param value
*/
@Override
public void put (K key, V value) {
this.redisService.setCacheObject(encode(key), value);
}
/**
*
* @param key
*/
@Override
public void remove (K key) {
this.redisService.deleteObject(encode(key));
}
/**
*
* @param key
*/
@Override
public void refreshTime (K key) {
this.redisService.expire(encode(key), 60, TimeUnit.SECONDS);
}
/**
*
*
* @param key
*/
@Override
public void refreshData (K key) {
this.put(key, getData(key));
}
/**
*
* @param key ID
* @return
*/
public abstract V getData(K key);
/**
*
*/
public abstract V defaultValue();
}

View File

@ -0,0 +1,169 @@
package com.muyu.common.cache.abs;
import com.muyu.common.cache.HashCache;
import com.muyu.common.redis.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.*;
import java.util.function.Function;
/**
* @author DongZl
* @description: hash
* @Date 2024-3-29 07:40
*/
public abstract class HashCacheAbs<K, HK, HV> implements HashCache<K, HK, HV> {
@Autowired
private RedisService redisService;
/**
*
*
* @param key ID
*
* @return
*/
@Override
public String encode (K key) {
return keyPre() + key;
}
/**
*
* @param hashKey ID
* @return
*/
@Override
public String encodeHashKey (HK hashKey) {
return hashKey.toString();
}
/**
* Keymap
* @param key
* @return Map
*/
@Override
public Map<HK, HV> get (K key) {
return decodeMap(redisService.getCacheMap(encode(key)));
}
/**
* hashKeyhashValue
*
* @param key
* @param hashKey hash
*
* @return hash
*/
@Override
public HV get (K key, HK hashKey) {
return redisService.getCacheMapValue(encode(key), encodeHashKey(hashKey));
}
/**
* hashKeyhashValue
*
* @param key
* @param hashKeyList hash
*
* @return hash
*/
@Override
public List<HV> get (K key, HK... hashKeyList) {
List<String> encodeHashKeyList = Arrays.stream(hashKeyList).map(this::encodeHashKey).toList();
return redisService.getMultiCacheMapValue(encode(key), encodeHashKeyList);
}
/**
* hash
*
* @param key
*
* @return hash
*/
@Override
public List<HV> getToList (K key) {
Map<HK, HV> hkhvMap = get(key);
return hkhvMap.values().stream().toList();
}
/**
*
*
* @param key redis
* @param map hashMap
*/
@Override
public void put (K key, Map<HK, HV> map) {
redisService.setCacheMap(encode(key), encodeMap(map));
}
/**
*
*
* @param key redis
* @param dataList
* @param hashKey hash
*/
@Override
public void put (K key, List<HV> dataList, Function<HV, HK> hashKey) {
}
/**
*
*
* @param key redis
* @param hashKey hash
* @param hashValue hash
*/
@Override
public void put (K key, HK hashKey, HV hashValue) {
}
/**
* redis
*
* @param key hash
*/
@Override
public void remove (K key) {
}
/**
* redishash
*
* @param key redis
* @param hashKey hash
*/
@Override
public void remove (K key, HK hashKey) {
}
/**
*
* @param dataMap
* @return
*/
private Map<String, HV> encodeMap(Map<HK, HV> dataMap){
Map<String, HV> encodeDataMap = new HashMap<>();
dataMap.forEach((hashKey, HashValue) -> encodeDataMap.put(encodeHashKey(hashKey), HashValue));
return encodeDataMap;
}
/**
*
* @param encodeDataMap
* @return
*/
private Map<HK, HV> decodeMap(Map<String, HV> encodeDataMap){
Map<HK, HV> dataMap = new HashMap<>();
encodeDataMap.forEach((hashKey, hashValue) -> dataMap.put(decodeHashKey(hashKey), hashValue));
return dataMap;
}
}

View File

@ -0,0 +1,30 @@
package com.muyu.common.cache.decoration;
/**
* @author DongZl
* @description: Key
* @Date 2024-3-29 03:19
*/
public interface DecorationKey <K>{
/**
* key
* @return key
*/
public String keyPre();
/**
*
* @param key ID
* @return
*/
public String encode(K key);
/**
*
* @param redisKey
* @return ID
*/
public K decode(String redisKey);
}

View File

@ -7,6 +7,7 @@
<artifactId>muyu-common</artifactId>
<version>3.6.3</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>muyu-common-core</artifactId>

View File

@ -229,7 +229,7 @@ public class RedisService {
*
* @return Hash
*/
public <T> List<T> getMultiCacheMapValue (final String key, final Collection<Object> hKeys) {
public <T> List<T> getMultiCacheMapValue (final String key, final Collection<String> hKeys) {
return redisTemplate.opsForHash().multiGet(key, hKeys);
}

View File

@ -18,6 +18,7 @@
<module>muyu-common-datascope</module>
<module>muyu-common-datasource</module>
<module>muyu-common-system</module>
<module>muyu-common-cache</module>
</modules>
<artifactId>muyu-common</artifactId>

View File

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.muyu</groupId>
<artifactId>muyu-product</artifactId>
<version>3.6.3</version>
</parent>
<artifactId>muyu-product-cache</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.muyu</groupId>
<artifactId>muyu-common-cache</artifactId>
</dependency>
<!-- 商品模块 common 依赖 -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>muyu-product-common</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,78 @@
package com.muyu.product.cache;
import com.muyu.common.cache.HashCache;
import com.muyu.common.cache.abs.CacheAbs;
import com.muyu.common.core.text.Convert;
import com.muyu.product.cache.datasource.ProjectInfoData;
import com.muyu.product.domain.ProjectInfo;
import com.muyu.product.domain.ProjectSkuInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* @author DongZl
* @description:
* @Date 2024-3-27 03:30
*/
@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;
/**
* key
*
* @return key
*/
@Override
public String keyPre () {
return "project:info:";
}
/**
*
*
* @param redisKey
*
* @return ID
*/
@Override
public Long decode (String redisKey) {
return Convert.toLong(redisKey.replace(keyPre(),""), 0L);
}
/**
*
*
* @param key ID
*
* @return
*/
@Override
public ProjectInfo getData (Long key) {
return projectInfoData.getData(key);
}
/**
*
*/
@Override
public ProjectInfo defaultValue () {
return new ProjectInfo();
}
}

View File

@ -0,0 +1,9 @@
package com.muyu.product.cache;
/**
* @author DongZl
* @description: sku
* @Date 2024-3-29 03:06
*/
public class ProjectSkuCache {
}

View File

@ -0,0 +1,9 @@
package com.muyu.product.cache;
/**
* @author DongZl
* @description: SKU
* @Date 2024-3-29 03:06
*/
public class ProjectSkuStockCache {
}

View File

@ -0,0 +1,19 @@
package com.muyu.product.cache.datasource;
import com.muyu.product.domain.ProjectInfo;
/**
* @author DongZl
* @description:
* @Date 2024-3-27 03:34
*/
public interface ProjectInfoData {
/**
*
*
* @param key ID
* @return
*/
public ProjectInfo getData (Long key);
}

View File

@ -22,6 +22,7 @@
<dependency>
<groupId>com.muyu</groupId>
<artifactId>muyu-common-core</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -1,10 +1,13 @@
package com.muyu.product.domain;
import java.util.Date;
import java.util.function.Supplier;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.muyu.product.domain.model.AttrValueModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@ -51,4 +54,11 @@ public class AsProductAttributeInfo extends BaseEntity {
@ApiModelProperty(name = "属性值", value = "属性值", required = true)
private String value;
public static AsProductAttributeInfo attrValueModelBuild(AttrValueModel attrValueModel, Supplier<Long> projectId){
return AsProductAttributeInfo.builder()
.productId(projectId.get())
.attributeId(attrValueModel.getId())
.value(attrValueModel.getValue())
.build();
}
}

View File

@ -3,6 +3,7 @@ package com.muyu.product.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.muyu.product.domain.model.ProjectAddModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@ -15,6 +16,9 @@ import com.muyu.product.domain.req.ProjectInfoSaveReq;
import com.muyu.product.domain.req.ProjectInfoEditReq;
import com.muyu.common.core.web.domain.BaseEntity;
import java.util.Date;
import java.util.function.Supplier;
/**
* project_info
*
@ -50,17 +54,17 @@ public class ProjectInfo extends BaseEntity {
/** 主类型 */
@Excel(name = "主类型")
@ApiModelProperty(name = "主类型", value = "主类型")
private String mianType;
private Long mianType;
/** 父类型 */
@Excel(name = "父类型")
@ApiModelProperty(name = "父类型", value = "父类型")
private String parentType;
private Long parentType;
/** 商品类型 */
@Excel(name = "商品类型")
@ApiModelProperty(name = "商品类型", value = "商品类型")
private String type;
private Long type;
/** 商品图片 */
@Excel(name = "商品图片")
@ -108,18 +112,20 @@ public class ProjectInfo extends BaseEntity {
/**
*
*/
public static ProjectInfo saveBuild(ProjectInfoSaveReq projectInfoSaveReq){
public static ProjectInfo saveModelBuild(ProjectAddModel projectAddModel, Supplier<String> createBy){
return ProjectInfo.builder()
.name(projectInfoSaveReq.getName())
.introduction(projectInfoSaveReq.getIntroduction())
.mianType(projectInfoSaveReq.getMianType())
.parentType(projectInfoSaveReq.getParentType())
.type(projectInfoSaveReq.getType())
.image(projectInfoSaveReq.getImage())
.carouselImages(projectInfoSaveReq.getCarouselImages())
.status(projectInfoSaveReq.getStatus())
.ruleId(projectInfoSaveReq.getRuleId())
.brandId(projectInfoSaveReq.getBrandId())
.name(projectAddModel.getName())
.introduction(projectAddModel.getIntroduction())
.mianType(projectAddModel.getMianType())
.parentType(projectAddModel.getParentType())
.type(projectAddModel.getType())
.image(projectAddModel.getImage())
.carouselImages(projectAddModel.getCarouselImages())
.status(projectAddModel.getStatus())
.ruleId(projectAddModel.getRuleId())
.brandId(projectAddModel.getBrandId())
.createBy(createBy.get())
.createTime(new Date())
.build();
}

View File

@ -1,9 +1,12 @@
package com.muyu.product.domain;
import java.math.BigDecimal;
import java.util.function.Supplier;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.muyu.product.domain.model.ProductSkuModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@ -103,4 +106,14 @@ public class ProjectSkuInfo extends BaseEntity {
.build();
}
public static ProjectSkuInfo productSkuModelBuild(ProductSkuModel productSkuModel, Supplier<Long> projectId){
return ProjectSkuInfo.builder()
.projectId(projectId.get())
.sku(productSkuModel.getSku())
.image(productSkuModel.getImage())
.stock(productSkuModel.getStock())
.price(productSkuModel.getPrice())
.build();
}
}

View File

@ -1,42 +0,0 @@
package com.muyu.product.domain.demo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class ShiTi {
//属性组id
private Integer id;
//属性集合id
private Integer ids;
//属性组名称
private String name;
//属性集合里面的属性名称
private String names;
//编码
private Integer code;
//分组
private String attrinuteName;
//品牌ID
private Integer brandId;
//商品ID
private Integer projectId;
}

View File

@ -0,0 +1,29 @@
package com.muyu.product.domain.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author DongZl
* @description:
* @Date 2024-3-22 10:53
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AttrValueModel {
/**
* ID
*/
private Long id;
/**
*
*/
private String value;
}

View File

@ -1,31 +0,0 @@
package com.muyu.product.domain.model;
import com.muyu.common.core.web.domain.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.util.List;
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class AttributeGroupAddModel extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
*
*/
private Long id;
private String name;
private String states;
private List<Long> attributeIdList;
}

View File

@ -40,7 +40,7 @@ public class AttributeGroupSaveModel extends BaseEntity {
public static AttributeGroupSaveModel saveReqBuild (AttributeGroupSaveReq req){
return AttributeGroupSaveModel.builder()
.name(req.getName())// 组名称
.name(req.getName())
.states(req.getStates())
.attributeIdList(req.getAttributeIdList())
.build();

View File

@ -0,0 +1,38 @@
package com.muyu.product.domain.model;
import com.muyu.common.core.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* @author DongZl
* @description: Sku
* @Date 2024-3-22 10:54
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ProductSkuModel {
/** sku */
@ApiModelProperty(name = "sku", value = "sku", required = true)
private String sku;
/** 商品库存 */
@ApiModelProperty(name = "商品库存", value = "商品库存", required = true)
private Long stock;
/** 商品价格 */
@ApiModelProperty(name = "商品价格", value = "商品价格", required = true)
private BigDecimal price;
/** 规格图片 */
@ApiModelProperty(name = "规格图片", value = "规格图片", required = true)
private String image;
}

View File

@ -0,0 +1,59 @@
package com.muyu.product.domain.model;
import com.muyu.common.core.web.domain.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.SuperBuilder;
/**
* @author DongZl
* @description:
* @Date 2024-3-22 10:50
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class ProjectAddModel extends BaseEntity {
/** 商品名称 */
@ApiModelProperty(name = "商品名称", value = "商品名称")
private String name;
/** 商品描述 */
@ApiModelProperty(name = "商品描述", value = "商品描述")
private String introduction;
/** 主类型 */
@ApiModelProperty(name = "主类型", value = "主类型")
private Long mianType;
/** 父类型 */
@ApiModelProperty(name = "父类型", value = "父类型")
private Long parentType;
/** 商品类型 */
@ApiModelProperty(name = "商品类型", value = "商品类型")
private Long type;
/** 商品图片 */
@ApiModelProperty(name = "商品图片", value = "商品图片")
private String image;
/** 商品轮播图 */
@ApiModelProperty(name = "商品轮播图", value = "商品轮播图")
private String carouselImages;
/** 商品状态 */
@ApiModelProperty(name = "商品状态", value = "商品状态")
private String status;
/** 规格 */
@ApiModelProperty(name = "规格", value = "规格")
private Long ruleId;
/** 品牌 */
@ApiModelProperty(name = "品牌", value = "品牌")
private Long brandId;
}

View File

@ -1,6 +1,7 @@
package com.muyu.product.domain.model;
import com.muyu.common.core.web.domain.BaseEntity;
import com.muyu.product.domain.AttributeInfo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -33,4 +34,12 @@ public class TemplateAttributeModel extends BaseEntity {
*
*/
private String code;
public static TemplateAttributeModel attributeInfoBuild(AttributeInfo attributeInfo){
return TemplateAttributeModel.builder()
.id(attributeInfo.getId())
.name(attributeInfo.getName())
.code(attributeInfo.getCode())
.build();
}
}

View File

@ -33,15 +33,15 @@ public class ProjectInfoEditReq extends BaseEntity {
/** 主类型 */
@ApiModelProperty(name = "主类型", value = "主类型")
private String mianType;
private Long mianType;
/** 父类型 */
@ApiModelProperty(name = "父类型", value = "父类型")
private String parentType;
private Long parentType;
/** 商品类型 */
@ApiModelProperty(name = "商品类型", value = "商品类型")
private String type;
private Long type;
/** 商品图片 */
@ApiModelProperty(name = "商品图片", value = "商品图片")

View File

@ -33,15 +33,15 @@ public class ProjectInfoQueryReq extends BaseEntity {
/** 主类型 */
@ApiModelProperty(name = "主类型", value = "主类型")
private String mianType;
private Long mianType;
/** 父类型 */
@ApiModelProperty(name = "父类型", value = "父类型")
private String parentType;
private Long parentType;
/** 商品类型 */
@ApiModelProperty(name = "商品类型", value = "商品类型")
private String type;
private Long type;
/** 商品图片 */
@ApiModelProperty(name = "商品图片", value = "商品图片")

View File

@ -1,5 +1,8 @@
package com.muyu.product.domain.req;
import com.muyu.product.domain.model.AttrValueModel;
import com.muyu.product.domain.model.ProductSkuModel;
import com.muyu.product.domain.model.ProjectAddModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@ -8,6 +11,8 @@ import lombok.experimental.SuperBuilder;
import io.swagger.annotations.*;
import com.muyu.common.core.web.domain.BaseEntity;
import java.util.List;
/**
* project_info
*
@ -23,59 +28,19 @@ public class ProjectInfoSaveReq extends BaseEntity {
private static final long serialVersionUID = 1L;
/** 主键 */
/**
*
*/
private ProjectAddModel projectAddModel;
@ApiModelProperty(name = "主键", value = "主键")
private Long id;
/**
*
*/
private List<AttrValueModel> attrValueList;
/** 商品名称 */
@ApiModelProperty(name = "商品名称", value = "商品名称")
private String name;
/** 商品描述 */
@ApiModelProperty(name = "商品描述", value = "商品描述")
private String introduction;
/** 主类型 */
@ApiModelProperty(name = "主类型", value = "主类型")
private String mianType;
/** 父类型 */
@ApiModelProperty(name = "父类型", value = "父类型")
private String parentType;
/** 商品类型 */
@ApiModelProperty(name = "商品类型", value = "商品类型")
private String type;
/** 商品图片 */
@ApiModelProperty(name = "商品图片", value = "商品图片")
private String image;
/** 商品轮播图 */
@ApiModelProperty(name = "商品轮播图", value = "商品轮播图")
private String carouselImages;
/** 商品状态 */
@ApiModelProperty(name = "商品状态", value = "商品状态")
private String status;
/** 规格 */
@ApiModelProperty(name = "规格", value = "规格")
private Long ruleId;
/** 品牌 */
@ApiModelProperty(name = "品牌", value = "品牌")
private Long brandId;
/**
* SKu
*/
private List<ProductSkuModel> productSkuList;
}

View File

@ -0,0 +1,64 @@
package com.muyu.product.domain.resp;
import com.muyu.product.domain.*;
import com.muyu.product.domain.model.RuleAttrAddModel;
import com.muyu.product.domain.model.TemplateAttributeGroupModel;
import com.muyu.product.domain.model.TemplateAttributeModel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author DongZl
* @description:
* @Date 2024-3-25 10:46
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ProjectDetailResp {
/**
*
*/
private List<CategoryInfo> categoryInfoList;
/**
*
*/
private ProjectInfo projectInfo;
/**
*
*/
private BrandInfo brandInfo;
/**
* Sku
*/
private List<ProjectSkuInfo> projectSkuInfoList;
/**
*
*/
private List<AsProductAttributeInfo> productAttributeInfoList;
/**
*
*/
private List<RuleAttrAddModel> ruleAttrModelList;
/**
*
*/
private List<TemplateAttributeModel> attributeInfoList;
/**
*
*/
private List<TemplateAttributeGroupModel> attributeGroupList;
}

View File

@ -18,6 +18,12 @@
</properties>
<dependencies>
<!-- 商品模块 缓存 依赖 -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>muyu-product-cache</artifactId>
</dependency>
<!-- 商品模块 common 依赖 -->
<dependency>
<groupId>com.muyu</groupId>
@ -84,6 +90,12 @@
<groupId>com.muyu</groupId>
<artifactId>muyu-common-swagger</artifactId>
</dependency>
<dependency>
<groupId>com.muyu</groupId>
<artifactId>muyu-product-cache</artifactId>
<version>3.6.3</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>

View File

@ -0,0 +1,30 @@
package com.muyu.product.cache.impl;
import com.muyu.product.cache.datasource.ProjectInfoData;
import com.muyu.product.domain.ProjectInfo;
import com.muyu.product.service.ProjectInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author DongZl
* @description:
* @Date 2024-3-27 03:37
*/
@Service
public class ProjectInfoDataImpl implements ProjectInfoData {
@Autowired
private ProjectInfoService projectInfoService;
/**
*
*
* @param key ID
* @return
*/
@Override
public ProjectInfo getData (Long key) {
return projectInfoService.getById(key);
}
}

View File

@ -45,10 +45,10 @@ public class AttributeGroupController extends BaseController {
*
*/
@ApiOperation("获取属性组列表")
@RequiresPermissions("product:attributeGroup:list") //权限认证,必须具有指定权限才能进入该方法
@RequiresPermissions("product:attributeGroup:list")
@GetMapping("/list")
public Result<TableDataInfo<AttributeGroupPageResp>> list(AttributeGroupQueryReq attributeGroupQueryReq) {
startPage(); //设置请求分页数据
startPage();
TableDataInfo<AttributeGroupPageResp> tableDataInfo =
attributeGroupService.page(AttributeGroup.queryBuild(attributeGroupQueryReq));
return Result.success(tableDataInfo);

View File

@ -3,6 +3,8 @@ package com.muyu.product.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.muyu.product.cache.ProjectInfoCache;
import com.muyu.product.domain.resp.ProjectDetailResp;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@ -39,6 +41,9 @@ public class ProjectInfoController extends BaseController {
@Autowired
private ProjectInfoService projectInfoService;
@Autowired
private ProjectInfoCache projectInfoCache;
/**
*
*/
@ -72,9 +77,31 @@ public class ProjectInfoController extends BaseController {
@GetMapping(value = "/{id}")
@ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Long", paramType = "path", dataTypeClass = Long.class)
public Result<ProjectInfo> getInfo(@PathVariable("id") Long id) {
return Result.success(projectInfoCache.get(id));
}
/**
*
*/
@ApiOperation("获取商品信息详细信息")
@RequiresPermissions("product:info:query")
@GetMapping(value = "/cache/{id}")
@ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Long", paramType = "path", dataTypeClass = Long.class)
public Result<ProjectInfo> getCacheInfo(@PathVariable("id") Long id) {
return Result.success(projectInfoService.getById(id));
}
/**
*
*/
@ApiOperation("获取商品信息详细信息")
@RequiresPermissions("product:info:query")
@GetMapping(value = "/detail/{id}")
@ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Long", paramType = "path", dataTypeClass = Long.class)
public Result<ProjectDetailResp> getDetailInfo(@PathVariable("id") Long id) {
return Result.success(projectInfoService.getDetailInfo(id));
}
/**
*
*/
@ -83,7 +110,7 @@ public class ProjectInfoController extends BaseController {
@PostMapping
@ApiOperation("新增商品信息")
public Result<String> add(@RequestBody ProjectInfoSaveReq projectInfoSaveReq) {
return toAjax(projectInfoService.save(ProjectInfo.saveBuild(projectInfoSaveReq)));
return toAjax(projectInfoService.save(projectInfoSaveReq));
}
/**

View File

@ -17,7 +17,7 @@ public interface AttributeInfoService extends IService<AttributeInfo> {
* @param attributeInfo
* @return
*/
public List<AttributeInfo> list(AttributeInfo attributeInfo); // 商品属性对象 attribute_info | 商品属性对象 attribute_info
public List<AttributeInfo> list(AttributeInfo attributeInfo);
/**
* groupId

View File

@ -67,4 +67,6 @@ public interface CategoryInfoService extends IService<CategoryInfo> {
* @return
*/
CategoryCommonElementResp getTemplateAttributeByCateGoryId (Long cateGoryId);
public <T, AS> List<T> getCommon (Long categoryId, IService<AS> iService, IService<T> bsiService);
}

View File

@ -3,6 +3,8 @@ package com.muyu.product.service;
import java.util.List;
import com.muyu.product.domain.ProjectInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import com.muyu.product.domain.req.ProjectInfoSaveReq;
import com.muyu.product.domain.resp.ProjectDetailResp;
/**
* Service
@ -19,4 +21,17 @@ public interface ProjectInfoService extends IService<ProjectInfo> {
*/
public List<ProjectInfo> list(ProjectInfo projectInfo);
/**
*
* @param projectInfoSaveReq
* @return
*/
boolean save (ProjectInfoSaveReq projectInfoSaveReq);
/**
* ID
* @param id ID
* @return
*/
ProjectDetailResp getDetailInfo (Long id);
}

View File

@ -48,7 +48,6 @@ public class AttributeGroupServiceImpl extends ServiceImpl<AttributeGroupMapper,
*/
@Override
public TableDataInfo<AttributeGroupPageResp> page (AttributeGroup attributeGroupQuery) {
// List<AttributeGroup> list = this.list(attributeGroupQuery);
List<AttributeGroup> list = this.list(attributeGroupQuery);
List<AttributeGroupPageResp> pageRespList = list.stream()
.map(attributeGroup ->
@ -71,18 +70,18 @@ public class AttributeGroupServiceImpl extends ServiceImpl<AttributeGroupMapper,
* @return
*/
@Override
public List<AttributeGroup> list (AttributeGroup attributeGroup) { //属性组对象 attribute_group | 属性组对象 attribute_group
LambdaQueryWrapper<AttributeGroup> queryWrapper = new LambdaQueryWrapper<>(); //属性组对象 attribute_group
public List<AttributeGroup> list (AttributeGroup attributeGroup) {
LambdaQueryWrapper<AttributeGroup> queryWrapper = new LambdaQueryWrapper<>();
if (ObjUtils.notNull(attributeGroup.getName())) { //兼容 charSequence: 如果长度为0, 则认为为空 | 组名称
queryWrapper.like(AttributeGroup::getName, attributeGroup.getName()); //组名称 | 组名称
if (ObjUtils.notNull(attributeGroup.getName())) {
queryWrapper.like(AttributeGroup::getName, attributeGroup.getName());
}
if (ObjUtils.notNull(attributeGroup.getStates())) { //兼容CharSequence: 如果长度为0 则认为为空 | 状态
queryWrapper.eq(AttributeGroup::getStates, attributeGroup.getStates()); // 状态 | 状态
if (ObjUtils.notNull(attributeGroup.getStates())) {
queryWrapper.eq(AttributeGroup::getStates, attributeGroup.getStates());
}
return list(queryWrapper); //查询列表
return list(queryWrapper);
}
/**
@ -95,14 +94,13 @@ public class AttributeGroupServiceImpl extends ServiceImpl<AttributeGroupMapper,
@Override
@Transactional
public Boolean save (AttributeGroupSaveModel attributeGroupSaveModel) {
AttributeGroup attributeGroup = attributeGroupSaveModel.buildAttributeGroup(); //属性组对象
boolean save = this.save(attributeGroup); //插入一条记录(选择字段, 策略插入)
AttributeGroup attributeGroup = attributeGroupSaveModel.buildAttributeGroup();
boolean save = this.save(attributeGroup);
// 处理属性ID
Long attributeGroupId = attributeGroup.getId(); //属性组编号
List<Long> attributeIdList = attributeGroupSaveModel.getAttributeIdList(); //属性ID集合
Long attributeGroupId = attributeGroup.getId();
List<Long> attributeIdList = attributeGroupSaveModel.getAttributeIdList();
attributeGroupService.saveBatch( //插入(批量)
attributeGroupService.saveBatch(
attributeIdList.stream()
.map(attributeId -> AsAttributeGroup.buildGroup(attributeGroupId, attributeId))
.toList()

View File

@ -73,6 +73,5 @@ public class AttributeInfoServiceImpl extends ServiceImpl<AttributeInfoMapper, A
return this.listByIds(
list
);
}
}

View File

@ -232,7 +232,7 @@ public class CategoryInfoServiceImpl extends ServiceImpl<CategoryInfoMapper, Cat
return attributeInfoList;
}
@Override
public <T, AS> List<T> getCommon (Long categoryId, IService<AS> iService, IService<T> bsiService) {
List<T> list = new ArrayList();
QueryWrapper<AS> asQueryWrapper = new QueryWrapper<>();
@ -307,16 +307,18 @@ public class CategoryInfoServiceImpl extends ServiceImpl<CategoryInfoMapper, Cat
}};
List<AsCategoryAttributeGroup> categoryAttributeGroupList = asCategoryAttributeGroupService.list(asCategoryAttributeGroupLambdaQueryWrapper);
List<TemplateAttributeGroupModel> attributeGroupModelList = categoryAttributeGroupList.stream()
.map(asCategoryAttributeGroup -> TemplateAttributeGroupModel.attributeGroupBuild(
attributeGroupService.getById(asCategoryAttributeGroup.getAttributeGroupId()),
attributeGroupId -> {
.map(AsCategoryAttributeGroup::getAttributeGroupId)
.distinct()
.map(attributeGroupId -> TemplateAttributeGroupModel.attributeGroupBuild(
attributeGroupService.getById(attributeGroupId),
applyAttributeGroupId -> {
LambdaQueryWrapper<AsAttributeGroup> asAttributeGroupQueryWrapper = new LambdaQueryWrapper<>() {{
eq(AsAttributeGroup::getGroupId, asCategoryAttributeGroup.getAttributeGroupId());
eq(AsAttributeGroup::getGroupId, applyAttributeGroupId);
}};
List<Long> attributeIdList = asAttributeGroupService.list(asAttributeGroupQueryWrapper).stream()
.map(AsAttributeGroup::getAttributeId)
.toList();
if (attributeIdList.isEmpty()){
if (attributeIdList.isEmpty()) {
return new ArrayList<>();
}
return attributeInfoService.listByIds(attributeIdList).stream()

View File

@ -1,13 +1,21 @@
package com.muyu.product.service.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.muyu.common.core.utils.ObjUtils;
import com.muyu.common.security.utils.SecurityUtils;
import com.muyu.product.domain.*;
import com.muyu.product.domain.model.*;
import com.muyu.product.domain.req.ProjectInfoSaveReq;
import com.muyu.product.domain.resp.CategoryCommonElementResp;
import com.muyu.product.domain.resp.ProjectDetailResp;
import com.muyu.product.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.muyu.product.mapper.ProjectInfoMapper;
import com.muyu.product.domain.ProjectInfo;
import com.muyu.product.service.ProjectInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -21,6 +29,25 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@Service
public class ProjectInfoServiceImpl extends ServiceImpl<ProjectInfoMapper, ProjectInfo> implements ProjectInfoService {
@Autowired
private AsProductAttributeInfoService asProductAttributeInfoService;
@Autowired
private ProjectSkuInfoService projectSkuInfoService;
@Autowired
private CategoryInfoService categoryInfoService;
@Autowired
private RuleAttrInfoService ruleAttrInfoService;
@Autowired
private BrandInfoService brandInfoService;
@Autowired
private AttributeInfoService attributeInfoService;
/**
*
*
@ -78,4 +105,128 @@ public class ProjectInfoServiceImpl extends ServiceImpl<ProjectInfoMapper, Proje
return list(queryWrapper);
}
/**
*
*
* @param projectInfoSaveReq
*
* @return
*/
@Override
public boolean save (ProjectInfoSaveReq projectInfoSaveReq) {
ProjectAddModel projectAddModel = projectInfoSaveReq.getProjectAddModel();
ProjectInfo projectInfo = ProjectInfo.saveModelBuild(projectAddModel, SecurityUtils::getUsername);
boolean save = this.save(projectInfo);
if (save){
// 属性值
List<AttrValueModel> attrValueList = projectInfoSaveReq.getAttrValueList();
List<AsProductAttributeInfo> asProductAttributeInfoList = attrValueList.stream()
.map(attrValueModel -> AsProductAttributeInfo.attrValueModelBuild(attrValueModel, projectInfo::getId))
.toList();
if (!asProductAttributeInfoList.isEmpty()){
asProductAttributeInfoService.saveBatch(asProductAttributeInfoList);
}
// sku ProductSkuModel -》 ProjectSkuInfo
List<ProductSkuModel> productSkuModelList = projectInfoSaveReq.getProductSkuList();
List<ProjectSkuInfo> projectSkuInfoList = productSkuModelList.stream().map(
productSkuModel -> ProjectSkuInfo.productSkuModelBuild(productSkuModel, projectInfo::getId)
).toList();
if (!projectSkuInfoList.isEmpty()){
projectSkuInfoService.saveBatch(projectSkuInfoList);
}
}
return save;
}
/**
* ID
*
* @param id ID
* @return
*/
@Override
public ProjectDetailResp getDetailInfo (Long id) {
// 商品信息获取
ProjectInfo projectInfo = this.getById(id);
// 品牌信息
BrandInfo brandInfo = this.brandInfoService.getById(projectInfo.getBrandId());
// 品类集合
List<CategoryInfo> categoryInfoList = categoryInfoService.listByIds(new ArrayList<>() {{
add(projectInfo.getMianType());
add(projectInfo.getParentType());
add(projectInfo.getType());
}});
// 商品Sku集合
List<ProjectSkuInfo> projectSkuInfoList = this.projectSkuInfoService.list(new LambdaQueryWrapper<>() {{
eq(ProjectSkuInfo::getProjectId, id);
}});
// 商品和属性集合
List<AsProductAttributeInfo> productAttributeInfoList = this.asProductAttributeInfoService.list(new LambdaQueryWrapper<>() {{
eq(AsProductAttributeInfo::getProductId, id);
}});
// 商品规格
List<RuleAttrAddModel> ruleAttrModelList = ruleAttrInfoService.list(new LambdaQueryWrapper<>() {{
eq(RuleAttrInfo::getRuleId, projectInfo.getRuleId());
}}).stream()
.map(RuleAttrAddModel::infoBuild).toList();
CategoryCommonElementResp templateAttribute = this.categoryInfoService.getTemplateAttributeByCateGoryId(projectInfo.getType());
List<TemplateAttributeGroupModel> templateAttributeGroupList = templateAttribute.getTemplateAttributeGroupList();
List<TemplateAttributeModel> templateAttributeList = new ArrayList<>(){{
addAll(templateAttribute.getTemplateAttributeList());
}};
// 属性组和商品属性的ID
List<Long> notInAttributeIdList = new ArrayList<>();
List<Long> attributeGroupIdList = templateAttributeGroupList.stream()
.flatMap(templateAttributeGroupModel -> templateAttributeGroupModel.getAttributeList().stream())
.map(TemplateAttributeModel::getId)
.toList();
List<Long> attributeIdList = templateAttributeList.stream()
.map(TemplateAttributeModel::getId)
.toList();
if (!attributeGroupIdList.isEmpty()){
notInAttributeIdList.addAll( attributeGroupIdList );
}
if (!attributeIdList.isEmpty()){
notInAttributeIdList.addAll( attributeIdList );
}
// 添加上,商品的自有属性
List<AsProductAttributeInfo> productAttributeList = this.asProductAttributeInfoService.list(
new LambdaQueryWrapper<>() {{
eq(AsProductAttributeInfo::getProductId, projectInfo.getId());
notIn(AsProductAttributeInfo::getAttributeId, notInAttributeIdList);
}}
);
List<TemplateAttributeModel> projectAttributeList = new ArrayList<>();
if (!productAttributeList.isEmpty()){
List<Long> attrIdList = productAttributeList.stream()
.map(AsProductAttributeInfo::getAttributeId)
.toList();
projectAttributeList = attributeInfoService.list(
new LambdaQueryWrapper<>() {{
in(AttributeInfo::getId, attrIdList);
}}
).stream()
.map(TemplateAttributeModel::attributeInfoBuild)
.toList();
}
// 把自有属性添加到商品属性的集合当中,进行合并
if (!projectAttributeList.isEmpty()){
templateAttributeList.addAll(projectAttributeList);
}
return ProjectDetailResp.builder()
.projectInfo(projectInfo)
.brandInfo(brandInfo)
.categoryInfoList(categoryInfoList)
.projectSkuInfoList(projectSkuInfoList)
.productAttributeInfoList(productAttributeInfoList)
.ruleAttrModelList(ruleAttrModelList)
.attributeInfoList(templateAttributeList)
.attributeGroupList(templateAttributeGroupList)
.build();
}
}

View File

@ -15,6 +15,7 @@
<module>muyu-product-common</module>
<module>muyu-product-remote</module>
<module>muyu-product-server</module>
<module>muyu-product-cache</module>
</modules>
<properties>

View File

@ -0,0 +1,26 @@
{ 基本信息: {
name: "",
introduction: "",
mianType: "",
parentType: "",
type: "",
image: "",
carouselImages: "",
status: "",
ruleId: "",
branId: "",
remark: ""
},
品类属性: [ {
id: "",
value: "",
} …………
],
商品规格: [ {
SKU: "",(所有的规格属性拼接而成)
"images": "",
库存: "",
价格: "",
} …………
]
}

View File

@ -227,12 +227,17 @@
<version>${muyu.version}</version>
</dependency>
<!-- 缓存基准模块 -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>muyu-common-cache</artifactId>
<version>${muyu.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<modules>
<module>muyu-auth</module>
<module>muyu-gateway</module>
<module>muyu-visual</module>
<module>muyu-modules</module>