diff --git a/gulimall-common/pom.xml b/gulimall-common/pom.xml index e1d9044681576a0bf9cea664ffe5eff8c022c0c8..361e8be2b34479a59eff097ccff685593ca8ac96 100644 --- a/gulimall-common/pom.xml +++ b/gulimall-common/pom.xml @@ -71,6 +71,7 @@ + org.springframework.boot spring-boot-starter-validation diff --git a/gulimall-common/src/main/java/com/forth/common/constant/ProductConstant.java b/gulimall-common/src/main/java/com/forth/common/constant/ProductConstant.java new file mode 100644 index 0000000000000000000000000000000000000000..d12c61c9898a40b883c0fa666467187782c7cd56 --- /dev/null +++ b/gulimall-common/src/main/java/com/forth/common/constant/ProductConstant.java @@ -0,0 +1,24 @@ +package com.forth.common.constant; + +public class ProductConstant { + + public enum AttrEnum{ + ATTR_TYPE_BASE(1,"基本属性"),ATTR_TYPE_SALE(0,"销售属性"); + + private int code; + private String msg; + + AttrEnum(int code,String msg){ + this.code = code; + this.msg = msg; + } + + public int getCode() { + return code; + } + + public String getMsg() { + return msg; + } + } +} diff --git a/gulimall-common/src/main/java/com/forth/common/valid/AddGroup.java b/gulimall-common/src/main/java/com/forth/common/valid/AddGroup.java new file mode 100644 index 0000000000000000000000000000000000000000..635bfe73889580c8189f08581fe919ef027d80b3 --- /dev/null +++ b/gulimall-common/src/main/java/com/forth/common/valid/AddGroup.java @@ -0,0 +1,4 @@ +package com.forth.common.valid; + +public interface AddGroup { +} diff --git a/gulimall-common/src/main/java/com/forth/common/valid/ListValue.java b/gulimall-common/src/main/java/com/forth/common/valid/ListValue.java new file mode 100644 index 0000000000000000000000000000000000000000..da8b5b247967e74cd92184b43b061e8adf508a7b --- /dev/null +++ b/gulimall-common/src/main/java/com/forth/common/valid/ListValue.java @@ -0,0 +1,25 @@ +package com.forth.common.valid; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.ElementType.TYPE_USE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Documented +@Constraint(validatedBy = { ListValueConstraintValidator.class }) +@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) +@Retention(RUNTIME) +public @interface ListValue { + String message() default "{com.forth.common.valid.ListValue.message}"; + + Class[] groups() default {}; + + Class[] payload() default {}; + + int[] vals() default {}; +} diff --git a/gulimall-common/src/main/java/com/forth/common/valid/ListValueConstraintValidator.java b/gulimall-common/src/main/java/com/forth/common/valid/ListValueConstraintValidator.java new file mode 100644 index 0000000000000000000000000000000000000000..1754604a6334e3d454a4fe13209551976d518d9d --- /dev/null +++ b/gulimall-common/src/main/java/com/forth/common/valid/ListValueConstraintValidator.java @@ -0,0 +1,31 @@ +package com.forth.common.valid; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.HashSet; +import java.util.Set; + +public class ListValueConstraintValidator implements ConstraintValidator { + + private Set set = new HashSet<>(); + + //初始化方法 + @Override + public void initialize(ListValue constraintAnnotation) { + int[] vals = constraintAnnotation.vals(); + for (int val : vals) { + set.add(val); + } + } + + /** + * 判断是否校验成功 + * @param value 需要校验的值 + * @param context + * @return + */ + @Override + public boolean isValid(Integer value, ConstraintValidatorContext context) { + return set.contains(value); + } +} diff --git a/gulimall-common/src/main/java/com/forth/common/valid/UpdateGroup.java b/gulimall-common/src/main/java/com/forth/common/valid/UpdateGroup.java new file mode 100644 index 0000000000000000000000000000000000000000..db4d34415867afcb61d4a833abebac38a3ab4859 --- /dev/null +++ b/gulimall-common/src/main/java/com/forth/common/valid/UpdateGroup.java @@ -0,0 +1,4 @@ +package com.forth.common.valid; + +public interface UpdateGroup { +} diff --git a/gulimall-common/src/main/java/com/forth/common/valid/UpdateStatusGroup.java b/gulimall-common/src/main/java/com/forth/common/valid/UpdateStatusGroup.java new file mode 100644 index 0000000000000000000000000000000000000000..e74e5c87a8f1a9ba05c5cf42c37cc8e2920c8761 --- /dev/null +++ b/gulimall-common/src/main/java/com/forth/common/valid/UpdateStatusGroup.java @@ -0,0 +1,4 @@ +package com.forth.common.valid; + +public interface UpdateStatusGroup { +} diff --git a/gulimall-common/src/main/resources/ValidationMessages.properties b/gulimall-common/src/main/resources/ValidationMessages.properties new file mode 100644 index 0000000000000000000000000000000000000000..6a8d74f394cbe4e5e4a116aa087067c3918b00d5 --- /dev/null +++ b/gulimall-common/src/main/resources/ValidationMessages.properties @@ -0,0 +1 @@ +com.forth.common.valid.ListValue.message=必须提交指定的值 \ No newline at end of file diff --git a/gulimall-gateway/src/main/resources/application.yml b/gulimall-gateway/src/main/resources/application.yml index 181c026c532151e6af229ac7d98c5b0921953b16..5e1ec67c9173d15053589b6aba3c80b2c62defb9 100644 --- a/gulimall-gateway/src/main/resources/application.yml +++ b/gulimall-gateway/src/main/resources/application.yml @@ -25,10 +25,12 @@ spring: uri: lb://gulimall-auth-server predicates: - Host=auth.gulimall.com + - id: gulimall_auth_route uri: lb://gulimall-cart predicates: - Host=cart.gulimall.com + - id: product_route uri: lb://gulimall-product predicates: @@ -36,6 +38,13 @@ spring: filters: - RewritePath=/api/(?/?.*), /$\{segment} + - id: third_party_route + uri: lb://gulimall-third-party + predicates: + - Path=/api/thirdparty/** + filters: + - RewritePath=/api/thirdparty/(?/?.*), /$\{segment} + - id: admin_route uri: lb://renren-fast predicates: diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/GulimallProductApplication.java b/gulimall-product/src/main/java/com/forth/gulimall/product/GulimallProductApplication.java index 3c21e94a3a784ae1a85a26da67e018a75eeb50b5..dbcee2eeccfcc3d094d04d0b8843d0643becfcc1 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/GulimallProductApplication.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/GulimallProductApplication.java @@ -4,10 +4,7 @@ import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; -//整合redis 作为session -@EnableRedisHttpSession @EnableDiscoveryClient @MapperScan("com.forth.gulimall.product.dao") @SpringBootApplication diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/config/GulimallSessionConfig.java b/gulimall-product/src/main/java/com/forth/gulimall/product/config/GulimallSessionConfig.java deleted file mode 100644 index 8a723fe6743638f3bf88ef22af7d35705889a205..0000000000000000000000000000000000000000 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/config/GulimallSessionConfig.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.forth.gulimall.product.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; -import org.springframework.data.redis.serializer.RedisSerializer; -import org.springframework.session.web.http.CookieSerializer; -import org.springframework.session.web.http.DefaultCookieSerializer; - -@Configuration -public class GulimallSessionConfig { - @Bean - public CookieSerializer cookieSerializer(){ - DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer(); - - cookieSerializer.setDomainName("localhost"); - cookieSerializer.setCookieName("GULISESSION"); - return cookieSerializer; - } - public RedisSerializer springSessionDefaultCookieSerializer(){ - return new GenericJackson2JsonRedisSerializer(); - } -} diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/config/MyBatisConfig.java b/gulimall-product/src/main/java/com/forth/gulimall/product/config/MyBatisConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..fb9a4148a18842073ad92bd6687e739d3ee0da82 --- /dev/null +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/config/MyBatisConfig.java @@ -0,0 +1,27 @@ +package com.forth.gulimall.product.config; + +import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; +import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@Configuration +@EnableTransactionManagement//开启事务 +@MapperScan("com.forth.gulimall.product.dao") +public class MyBatisConfig { + //引入分页插件 + + @Bean + public PaginationInterceptor paginationInterceptor() { + PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); + // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false + paginationInterceptor.setOverflow(true); + // 设置最大单页限制数量,默认 500 条,-1 不受限制 + paginationInterceptor.setLimit(500); + // 开启 count 的 join 优化,只针对部分 left join + paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); + return paginationInterceptor; + } +} diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/controller/AttrController.java b/gulimall-product/src/main/java/com/forth/gulimall/product/controller/AttrController.java index 13b6a1184f805b67d0725d4ba3536690629608ae..433b865c336f93bef0c453378c1e041186bff912 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/controller/AttrController.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/controller/AttrController.java @@ -4,12 +4,11 @@ import java.util.Arrays; import java.util.Map; //import org.apache.shiro.authz.annotation.RequiresPermissions; +import com.forth.gulimall.product.vo.AttrGroupRelationVo; +import com.forth.gulimall.product.vo.AttrRespVo; +import com.forth.gulimall.product.vo.AttrVo; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import com.forth.gulimall.product.entity.AttrEntity; import com.forth.gulimall.product.service.AttrService; @@ -31,6 +30,14 @@ public class AttrController { @Autowired private AttrService attrService; + @GetMapping("/{attrType}/list/{catelogId}") + public R baseAttrList(@RequestParam Map params, + @PathVariable("attrType") String type, + @PathVariable("catelogId") Long catelogId){ + PageUtils page = attrService.queryBaseAttrPage(params,catelogId,type); + return R.ok().put("page", page); + } + /** * 列表 */ @@ -49,9 +56,9 @@ public class AttrController { @RequestMapping("/info/{attrId}") //@RequiresPermissions("product:attr:info") public R info(@PathVariable("attrId") Long attrId){ - AttrEntity attr = attrService.getById(attrId); - - return R.ok().put("attr", attr); + //AttrEntity attr = attrService.getById(attrId); + AttrRespVo attrRespVo = attrService.getAttrInfo(attrId); + return R.ok().put("attr", attrRespVo); } /** @@ -59,8 +66,8 @@ public class AttrController { */ @RequestMapping("/save") //@RequiresPermissions("product:attr:save") - public R save(@RequestBody AttrEntity attr){ - attrService.save(attr); + public R save(@RequestBody AttrVo attr){ + attrService.saveAttr(attr); return R.ok(); } @@ -70,8 +77,8 @@ public class AttrController { */ @RequestMapping("/update") //@RequiresPermissions("product:attr:update") - public R update(@RequestBody AttrEntity attr){ - attrService.updateById(attr); + public R update(@RequestBody AttrVo attr){ + attrService.updateAttr(attr); return R.ok(); } diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/controller/AttrGroupController.java b/gulimall-product/src/main/java/com/forth/gulimall/product/controller/AttrGroupController.java index 517483d9265d813a4d3664c0d58bd919c4e1ccd0..45788af32c8f2b57748dd8e408b72ee759792c1a 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/controller/AttrGroupController.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/controller/AttrGroupController.java @@ -1,15 +1,17 @@ package com.forth.gulimall.product.controller; import java.util.Arrays; +import java.util.List; import java.util.Map; //import org.apache.shiro.authz.annotation.RequiresPermissions; +import com.forth.gulimall.product.entity.AttrEntity; +import com.forth.gulimall.product.service.AttrAttrgroupRelationService; +import com.forth.gulimall.product.service.AttrService; +import com.forth.gulimall.product.service.CategoryService; +import com.forth.gulimall.product.vo.AttrGroupRelationVo; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import com.forth.gulimall.product.entity.AttrGroupEntity; import com.forth.gulimall.product.service.AttrGroupService; @@ -31,14 +33,49 @@ public class AttrGroupController { @Autowired private AttrGroupService attrGroupService; + @Autowired + private CategoryService categoryService; + + @Autowired + private AttrService attrService; + + @Autowired + private AttrAttrgroupRelationService relationService; + + @PostMapping("/attr/relation") + public R addRelation(@RequestBody List vos){ + relationService.saveBatch(vos); + return R.ok(); + } + + @GetMapping("/{attrgroupId}/attr/relation") + public R attrRelation(@PathVariable("attrgroupId") Long attrgroupId){ + List entities = attrService.getRelationAttr(attrgroupId); + return R.ok().put("data",entities); + } + + @GetMapping("/{attrgroupId}/noattr/relation") + public R attrNoRelation(@PathVariable("attrgroupId") Long attrgroupId, + @RequestParam Map params){ + PageUtils page = attrService.getNoRelationAttr(params,attrgroupId); + return R.ok().put("page",page); + } + + @PostMapping("/attr/relation/delete") + public R deleteRelation(@RequestBody AttrGroupRelationVo[] vos){ + attrService.deleteRelation(vos); + return R.ok(); + } + /** * 列表 */ - @RequestMapping("/list") + @RequestMapping("/list/{catelogId}") //@RequiresPermissions("product:attrgroup:list") - public R list(@RequestParam Map params){ - PageUtils page = attrGroupService.queryPage(params); + public R list(@RequestParam Map params, @PathVariable("catelogId") Long catelogId){ + //PageUtils page = attrGroupService.queryPage(params); + PageUtils page = attrGroupService.queryPage(params,catelogId); return R.ok().put("page", page); } @@ -51,6 +88,10 @@ public class AttrGroupController { public R info(@PathVariable("attrGroupId") Long attrGroupId){ AttrGroupEntity attrGroup = attrGroupService.getById(attrGroupId); + Long catelogId = attrGroup.getCatelogId(); + Long[] path = categoryService.findCatelogPath(catelogId); + + attrGroup.setCatelogPath(path); return R.ok().put("attrGroup", attrGroup); } diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/controller/BrandController.java b/gulimall-product/src/main/java/com/forth/gulimall/product/controller/BrandController.java index 00efac663303a148c435084445819cc48de27637..7d80f0ce927de289affdcbb13433eb4e0be009f4 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/controller/BrandController.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/controller/BrandController.java @@ -4,7 +4,11 @@ import java.util.Arrays; import java.util.Map; //import org.apache.shiro.authz.annotation.RequiresPermissions; +import com.forth.common.valid.AddGroup; +import com.forth.common.valid.UpdateGroup; +import com.forth.common.valid.UpdateStatusGroup; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -17,7 +21,6 @@ import com.forth.common.utils.PageUtils; import com.forth.common.utils.R; - /** * 品牌 * @@ -59,19 +62,31 @@ public class BrandController { */ @RequestMapping("/save") //@RequiresPermissions("product:brand:save") - public R save(@RequestBody BrandEntity brand){ + public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brand){ brandService.save(brand); return R.ok(); } + /** + * 修改品牌展示状态 + * @param brand + * @return + */ + @RequestMapping("/update/status") + public R updateStatus(@Validated(UpdateStatusGroup.class) @RequestBody BrandEntity brand){ + brandService.updateById(brand); + + return R.ok(); + } + /** * 修改 */ @RequestMapping("/update") //@RequiresPermissions("product:brand:update") - public R update(@RequestBody BrandEntity brand){ - brandService.updateById(brand); + public R update(@Validated(UpdateGroup.class) @RequestBody BrandEntity brand){ + brandService.updateDetail(brand); return R.ok(); } diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/controller/CategoryBrandRelationController.java b/gulimall-product/src/main/java/com/forth/gulimall/product/controller/CategoryBrandRelationController.java index 6f9bb2b7399c6694f7655f8f870ce3aff15e7bf7..3f61dae5386ba9cfe9ebb57431c9aecc58177051 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/controller/CategoryBrandRelationController.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/controller/CategoryBrandRelationController.java @@ -1,15 +1,13 @@ package com.forth.gulimall.product.controller; import java.util.Arrays; +import java.util.List; import java.util.Map; //import org.apache.shiro.authz.annotation.RequiresPermissions; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import com.forth.gulimall.product.entity.CategoryBrandRelationEntity; import com.forth.gulimall.product.service.CategoryBrandRelationService; @@ -31,6 +29,18 @@ public class CategoryBrandRelationController { @Autowired private CategoryBrandRelationService categoryBrandRelationService; + /** + * 获取当前品牌关联的所有分类列表 + */ + @GetMapping("/catelog/list") + //@RequiresPermissions("product:categorybrandrelation:list") + public R catelogList(@RequestParam("brandId") Long brandId){ + List data = categoryBrandRelationService.list( + new QueryWrapper().eq("brand_id",brandId) + ); + return R.ok().put("data", data); + } + /** * 列表 */ @@ -60,7 +70,7 @@ public class CategoryBrandRelationController { @RequestMapping("/save") //@RequiresPermissions("product:categorybrandrelation:save") public R save(@RequestBody CategoryBrandRelationEntity categoryBrandRelation){ - categoryBrandRelationService.save(categoryBrandRelation); + categoryBrandRelationService.saveDetail(categoryBrandRelation); return R.ok(); } diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/controller/CategoryController.java b/gulimall-product/src/main/java/com/forth/gulimall/product/controller/CategoryController.java index 45d27bdd23878bcce1a9a5fa4718f6f77582b650..e1a299a504e8955314a0465675baa4c7183aae33 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/controller/CategoryController.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/controller/CategoryController.java @@ -52,7 +52,7 @@ public class CategoryController { public R info(@PathVariable("catId") Long catId){ CategoryEntity category = categoryService.getById(catId); - return R.ok().put("category", category); + return R.ok().put("data", category); } /** @@ -66,26 +66,40 @@ public class CategoryController { return R.ok(); } + @RequestMapping("/update/sort") + //@RequiresPermissions("product:category:update") + public R updateSort(@RequestBody CategoryEntity[] category){ + categoryService.updateBatchById(Arrays.asList(category)); + + return R.ok(); + } + + /** * 修改 */ @RequestMapping("/update") //@RequiresPermissions("product:category:update") public R update(@RequestBody CategoryEntity category){ - categoryService.updateById(category); + categoryService.updateCascade(category); return R.ok(); } /** * 删除 + * @RequestBody:获取请求体,必须发送post请求 + * SpringMVC自动将请求体的数据(json)转换为对应的对象 */ @RequestMapping("/delete") //@RequiresPermissions("product:category:delete") public R delete(@RequestBody Long[] catIds){ - categoryService.removeByIds(Arrays.asList(catIds)); + //categoryService.removeByIds(Arrays.asList(catIds)); - return R.ok(); + //1.检查当前删除的菜单,是否被别的地方引用 + categoryService.removeMenuByIds(Arrays.asList(catIds)); + + return R.ok(); } } diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/dao/AttrAttrgroupRelationDao.java b/gulimall-product/src/main/java/com/forth/gulimall/product/dao/AttrAttrgroupRelationDao.java index 89f75a9cea6848fa07b3e23265bd4b6f5cb09971..d99351ad89df1e281a04d7898ef5f8e53c245019 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/dao/AttrAttrgroupRelationDao.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/dao/AttrAttrgroupRelationDao.java @@ -3,6 +3,9 @@ package com.forth.gulimall.product.dao; import com.forth.gulimall.product.entity.AttrAttrgroupRelationEntity; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 属性&属性分组关联 @@ -13,5 +16,7 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface AttrAttrgroupRelationDao extends BaseMapper { - + + void deleteBatchRelation(@Param("entities") List entities); + } diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/dao/CategoryBrandRelationDao.java b/gulimall-product/src/main/java/com/forth/gulimall/product/dao/CategoryBrandRelationDao.java index 44bd3562514a03bcabecb21ff41249aebfb18049..5f9ebee03a15daddfa18243f9f6b82ed60aa6aeb 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/dao/CategoryBrandRelationDao.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/dao/CategoryBrandRelationDao.java @@ -3,6 +3,7 @@ package com.forth.gulimall.product.dao; import com.forth.gulimall.product.entity.CategoryBrandRelationEntity; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; /** * 品牌分类关联 @@ -13,5 +14,7 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface CategoryBrandRelationDao extends BaseMapper { - + + void updateCategory(@Param("catId") Long catId, @Param("name") String name); + } diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/entity/AttrEntity.java b/gulimall-product/src/main/java/com/forth/gulimall/product/entity/AttrEntity.java index 897d979c800b4d853d18e2885594331755537245..ec898e4338d602e2fb0d17bd597a0b892d83046c 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/entity/AttrEntity.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/entity/AttrEntity.java @@ -1,5 +1,6 @@ package com.forth.gulimall.product.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/entity/AttrGroupEntity.java b/gulimall-product/src/main/java/com/forth/gulimall/product/entity/AttrGroupEntity.java index 3bdd41f135e85906ec4ea2015d43ce0dd961cd12..ed45e3456df6534bcada7685834734cb070e6943 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/entity/AttrGroupEntity.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/entity/AttrGroupEntity.java @@ -1,5 +1,6 @@ package com.forth.gulimall.product.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -45,4 +46,7 @@ public class AttrGroupEntity implements Serializable { */ private Long catelogId; + @TableField(exist = false) + private Long[] catelogPath; + } diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/entity/BrandEntity.java b/gulimall-product/src/main/java/com/forth/gulimall/product/entity/BrandEntity.java index 63f2af4f66bbf93bc29ef59d6b4b94f6f0c7ac71..62ef634ee17975cd0651fcb557ece4a8be655cdc 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/entity/BrandEntity.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/entity/BrandEntity.java @@ -5,7 +5,16 @@ import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.util.Date; + + +import com.forth.common.valid.AddGroup; +import com.forth.common.valid.ListValue; +import com.forth.common.valid.UpdateGroup; +import com.forth.common.valid.UpdateStatusGroup; import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.*; /** * 品牌 @@ -22,15 +31,20 @@ public class BrandEntity implements Serializable { /** * 品牌id */ + @NotNull(message = "修改必须指定品牌id",groups = UpdateGroup.class) + @Null(message = "新增不能指定id",groups = AddGroup.class) @TableId private Long brandId; /** * 品牌名 */ + @NotBlank(message = "品牌名必须提交",groups = {AddGroup.class,UpdateGroup.class}) private String name; /** * 品牌logo地址 */ + @NotBlank(groups = {AddGroup.class}) + @URL(message = "logo必须是一个合法的url地址",groups = {AddGroup.class,UpdateGroup.class}) private String logo; /** * 介绍 @@ -39,14 +53,20 @@ public class BrandEntity implements Serializable { /** * 显示状态[0-不显示;1-显示] */ + @NotNull(groups = {AddGroup.class, UpdateStatusGroup.class}) + @ListValue(vals = {0,1},message = "必须提交指定的值",groups = {AddGroup.class, UpdateStatusGroup.class}) private Integer showStatus; /** * 检索首字母 */ + @NotEmpty(groups = {AddGroup.class}) + @Pattern(regexp = "^[a-zA-Z]$",message = "检索首字母必须是一个字母",groups = {AddGroup.class,UpdateGroup.class}) private String firstLetter; /** * 排序 */ + @NotNull(groups = {AddGroup.class}) + @Min(value = 0,message = "排序必须大于等于0",groups = {AddGroup.class,UpdateGroup.class}) private Integer sort; } diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/entity/CategoryEntity.java b/gulimall-product/src/main/java/com/forth/gulimall/product/entity/CategoryEntity.java index 409c43caa0729c7dc5fb4a2c71ecdb64788ced5b..20cb246302ce766f46b0dbfeca59051dfe1b2bb6 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/entity/CategoryEntity.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/entity/CategoryEntity.java @@ -2,12 +2,14 @@ package com.forth.gulimall.product.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.util.Date; import java.util.List; +import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; /** @@ -42,6 +44,7 @@ public class CategoryEntity implements Serializable { /** * 是否显示[0-不显示,1显示] */ + @TableLogic(value = "1",delval = "0") private Integer showStatus; /** * 排序 @@ -60,6 +63,7 @@ public class CategoryEntity implements Serializable { */ private Integer productCount; + @JsonInclude(JsonInclude.Include.NON_EMPTY) @TableField(exist = false) private List children; diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/exception/GulimallExceptionControllerAdvice.java b/gulimall-product/src/main/java/com/forth/gulimall/product/exception/GulimallExceptionControllerAdvice.java new file mode 100644 index 0000000000000000000000000000000000000000..6cbaac59dedaf8efa387cf3f3db333c0758943df --- /dev/null +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/exception/GulimallExceptionControllerAdvice.java @@ -0,0 +1,38 @@ +package com.forth.gulimall.product.exception; + +import com.forth.common.exception.BizCodeEnume; +import com.forth.common.utils.R; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.util.HashMap; +import java.util.Map; + +/** + * 集中处理所有异常 + */ +@Slf4j +@RestControllerAdvice(basePackages = "com.forth.gulimall.product.controller") +public class GulimallExceptionControllerAdvice { + + @ExceptionHandler(value = MethodArgumentNotValidException.class) + public R handVaildException(MethodArgumentNotValidException e){ + log.error("数据校验出现问题",e.getMessage(),e.getClass()); + BindingResult bindingResult = e.getBindingResult(); + + Map errorMap = new HashMap<>(); + bindingResult.getFieldErrors().forEach((fieldError)->{ + errorMap.put(fieldError.getField(),fieldError.getDefaultMessage()); + }); + return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(), BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data",errorMap); + } + + @ExceptionHandler(value = Throwable.class) + public R handleException(Throwable throwable){ + log.error("错误:",throwable); + return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(), BizCodeEnume.UNKNOW_EXCEPTION.getMsg()); + } +} diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/service/AttrAttrgroupRelationService.java b/gulimall-product/src/main/java/com/forth/gulimall/product/service/AttrAttrgroupRelationService.java index d1794dbd7df4726c9f3d81032d85a319950bd7d5..a076db2f8deadba4bd6d33a3a4b6e1e880adafb8 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/service/AttrAttrgroupRelationService.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/service/AttrAttrgroupRelationService.java @@ -3,7 +3,9 @@ package com.forth.gulimall.product.service; import com.baomidou.mybatisplus.extension.service.IService; import com.forth.common.utils.PageUtils; import com.forth.gulimall.product.entity.AttrAttrgroupRelationEntity; +import com.forth.gulimall.product.vo.AttrGroupRelationVo; +import java.util.List; import java.util.Map; /** @@ -16,5 +18,8 @@ import java.util.Map; public interface AttrAttrgroupRelationService extends IService { PageUtils queryPage(Map params); + + void saveBatch(List vos); + } diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/service/AttrGroupService.java b/gulimall-product/src/main/java/com/forth/gulimall/product/service/AttrGroupService.java index 25c9ab4f6b04732ff0b336985388868468d423e8..e8bbeacd36b3fc46b99e05a862d853a7f8a4c855 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/service/AttrGroupService.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/service/AttrGroupService.java @@ -16,5 +16,8 @@ import java.util.Map; public interface AttrGroupService extends IService { PageUtils queryPage(Map params); + + PageUtils queryPage(Map params, Long catelogId); + } diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/service/AttrService.java b/gulimall-product/src/main/java/com/forth/gulimall/product/service/AttrService.java index d386b44e93894123ff22b07238a97b7a70f34973..eec5bb8a983bd11161748f229e3bbd2c15d7c9e6 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/service/AttrService.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/service/AttrService.java @@ -3,7 +3,11 @@ package com.forth.gulimall.product.service; import com.baomidou.mybatisplus.extension.service.IService; import com.forth.common.utils.PageUtils; import com.forth.gulimall.product.entity.AttrEntity; +import com.forth.gulimall.product.vo.AttrGroupRelationVo; +import com.forth.gulimall.product.vo.AttrRespVo; +import com.forth.gulimall.product.vo.AttrVo; +import java.util.List; import java.util.Map; /** @@ -16,5 +20,19 @@ import java.util.Map; public interface AttrService extends IService { PageUtils queryPage(Map params); + + void saveAttr(AttrVo attr); + + PageUtils queryBaseAttrPage(Map params, Long catelogId, String type); + + AttrRespVo getAttrInfo(Long attrId); + + void updateAttr(AttrVo attr); + + List getRelationAttr(Long attrgroupId); + + void deleteRelation(AttrGroupRelationVo[] vos); + + PageUtils getNoRelationAttr(Map params, Long attrgroupId); } diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/service/BrandService.java b/gulimall-product/src/main/java/com/forth/gulimall/product/service/BrandService.java index a98bffb28aa49a124c4c7ab9f588ddabfdb601f4..2e831513904dcbd1af5f09664f9022b87dcfa94f 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/service/BrandService.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/service/BrandService.java @@ -16,5 +16,7 @@ import java.util.Map; public interface BrandService extends IService { PageUtils queryPage(Map params); + + void updateDetail(BrandEntity brand); } diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/service/CategoryBrandRelationService.java b/gulimall-product/src/main/java/com/forth/gulimall/product/service/CategoryBrandRelationService.java index c7c76f3d0bb48ca94bcd31aa67e458ded5a3a38f..0c348cfce0cfaa92e772732cd29dc922fa19c0fb 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/service/CategoryBrandRelationService.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/service/CategoryBrandRelationService.java @@ -16,5 +16,11 @@ import java.util.Map; public interface CategoryBrandRelationService extends IService { PageUtils queryPage(Map params); + + void saveDetail(CategoryBrandRelationEntity categoryBrandRelation); + + void updateBrand(Long brandId, String name); + + void updateCategory(Long catId, String name); } diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/service/CategoryService.java b/gulimall-product/src/main/java/com/forth/gulimall/product/service/CategoryService.java index 93d8a47210952fa26332cfd2324ddae8e040759a..47405c98a798712ed67596ce2dc507a739cb0846 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/service/CategoryService.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/service/CategoryService.java @@ -19,5 +19,13 @@ public interface CategoryService extends IService { PageUtils queryPage(Map params); List listWithTree(); + + void removeMenuByIds(List asList); + + //找到catelogId的完整路径 [父/子/孙] + Long[] findCatelogPath(Long catelogId); + + void updateCascade(CategoryEntity category); + } diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/AttrAttrgroupRelationServiceImpl.java b/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/AttrAttrgroupRelationServiceImpl.java index 3df21039aaeb7ce3c0c960dde87ab35b0db6937a..41dfec6ca2d641604bdd53d9c1f7445ed3056f72 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/AttrAttrgroupRelationServiceImpl.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/AttrAttrgroupRelationServiceImpl.java @@ -1,7 +1,13 @@ package com.forth.gulimall.product.service.impl; +import com.forth.gulimall.product.vo.AttrGroupRelationVo; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; + +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; + import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -26,4 +32,14 @@ public class AttrAttrgroupRelationServiceImpl extends ServiceImpl vos) { + List collect = vos.stream().map(item -> { + AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity(); + BeanUtils.copyProperties(item, relationEntity); + return relationEntity; + }).collect(Collectors.toList()); + this.saveBatch(collect); + } + } \ No newline at end of file diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/AttrGroupServiceImpl.java b/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/AttrGroupServiceImpl.java index e874a0fed156fb7aa7fe6d5f26da9ce34e8c9c1b..427829a3fb093fc77f053438acb4a61c2190869f 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/AttrGroupServiceImpl.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/AttrGroupServiceImpl.java @@ -11,6 +11,7 @@ import com.forth.common.utils.Query; import com.forth.gulimall.product.dao.AttrGroupDao; import com.forth.gulimall.product.entity.AttrGroupEntity; import com.forth.gulimall.product.service.AttrGroupService; +import org.springframework.util.StringUtils; @Service("attrGroupService") @@ -22,8 +23,28 @@ public class AttrGroupServiceImpl extends ServiceImpl().getPage(params), new QueryWrapper() ); - return new PageUtils(page); } + @Override + public PageUtils queryPage(Map params, Long catelogId) { + //select * from pms_attr_group = where catelog_id=? and (attr_group_id=key or attr_group_name like "%key%") + String key = (String) params.get("key"); + QueryWrapper wrapper = new QueryWrapper(); + if (!StringUtils.isEmpty(key)){ + wrapper.and((obj)->{ + obj.eq("attr_group_id",key).or().like("attr_group_name",key); + }); + } + + if(catelogId == 0){ + IPage page = this.page(new Query().getPage(params), wrapper); + return new PageUtils(page); + }else { + wrapper.eq("catelog_id",catelogId); + IPage page = this.page(new Query().getPage(params), wrapper); + return new PageUtils(page); + } + } + } \ No newline at end of file diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/AttrServiceImpl.java b/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/AttrServiceImpl.java index 7f7b227f0ffd6f428e9d32ab4c73d0068685497e..e8014485a529ad105bd16d2c7a693f3e443b10e4 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/AttrServiceImpl.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/AttrServiceImpl.java @@ -1,7 +1,27 @@ package com.forth.gulimall.product.service.impl; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.forth.common.constant.ProductConstant; +import com.forth.gulimall.product.dao.AttrAttrgroupRelationDao; +import com.forth.gulimall.product.dao.AttrGroupDao; +import com.forth.gulimall.product.dao.CategoryDao; +import com.forth.gulimall.product.entity.AttrAttrgroupRelationEntity; +import com.forth.gulimall.product.entity.AttrGroupEntity; +import com.forth.gulimall.product.entity.CategoryEntity; +import com.forth.gulimall.product.service.CategoryService; +import com.forth.gulimall.product.vo.AttrGroupRelationVo; +import com.forth.gulimall.product.vo.AttrRespVo; +import com.forth.gulimall.product.vo.AttrVo; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; + import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -11,11 +31,25 @@ import com.forth.common.utils.Query; import com.forth.gulimall.product.dao.AttrDao; import com.forth.gulimall.product.entity.AttrEntity; import com.forth.gulimall.product.service.AttrService; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; @Service("attrService") public class AttrServiceImpl extends ServiceImpl implements AttrService { + @Autowired + private AttrAttrgroupRelationDao relationDao; + + @Autowired + private AttrGroupDao attrGroupDao; + + @Autowired + private CategoryDao categoryDao; + + @Autowired + private CategoryService categoryService; + @Override public PageUtils queryPage(Map params) { IPage page = this.page( @@ -26,4 +60,183 @@ public class AttrServiceImpl extends ServiceImpl implements return new PageUtils(page); } + @Transactional + @Override + public void saveAttr(AttrVo attr) { + AttrEntity attrEntity = new AttrEntity(); + BeanUtils.copyProperties(attr,attrEntity); + //保存基本数据 + this.save(attrEntity); + //保存关联关系 + if (attr.getAttrType()== ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode() && attr.getAttrGroupId()!=null){ + AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity(); + relationEntity.setAttrGroupId(attr.getAttrGroupId()); + relationEntity.setAttrId(attrEntity.getAttrId()); + relationDao.insert(relationEntity); + } + } + + @Override + public PageUtils queryBaseAttrPage(Map params, Long catelogId, String type) { + QueryWrapper queryWrapper = new QueryWrapper().eq("attr_type","base".equalsIgnoreCase(type)?ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode():ProductConstant.AttrEnum.ATTR_TYPE_SALE.getCode()); + + if (catelogId != 0){ + queryWrapper.eq("catelog_id",catelogId); + } + + String key = (String) params.get("key"); + if (!StringUtils.isEmpty(key)){ + queryWrapper.and((wrapper)->{ + wrapper.eq("attr_id",key).or().like("attr_name",key); + }); + } + + IPage page = this.page( + new Query().getPage(params), + queryWrapper + ); + PageUtils pageUtils = new PageUtils(page); + List records = page.getRecords(); + List respVos = records.stream().map((attrEntity) -> { + AttrRespVo attrRespVo = new AttrRespVo(); + BeanUtils.copyProperties(attrEntity, attrRespVo); + + //1.设置分类和分组的名字 + if ("base".equalsIgnoreCase(type)){ + AttrAttrgroupRelationEntity attrId = relationDao.selectOne(new QueryWrapper().eq("attr_id", attrEntity.getAttrId())); + if (attrId != null && attrId.getAttrGroupId()!=null) { + AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrId.getAttrGroupId()); + attrRespVo.setGroupName(attrGroupEntity.getAttrGroupName()); + } + } + + CategoryEntity categoryEntity = categoryDao.selectById(attrEntity.getCatelogId()); + if (categoryEntity != null) { + attrRespVo.setCatelogName(categoryEntity.getName()); + } + + return attrRespVo; + }).collect(Collectors.toList()); + pageUtils.setList(respVos); + return pageUtils; + } + + @Override + public AttrRespVo getAttrInfo(Long attrId) { + AttrRespVo respVo = new AttrRespVo(); + AttrEntity attrEntity = this.getById(attrId); + BeanUtils.copyProperties(attrEntity,respVo); + + if (attrEntity.getAttrType() == ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode()){ + //1.设置分组信息 + AttrAttrgroupRelationEntity attrgroupRelation = relationDao.selectOne(new QueryWrapper().eq("attr_id", attrId)); + if (attrgroupRelation!=null){ + respVo.setAttrGroupId(attrgroupRelation.getAttrGroupId()); + AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrgroupRelation.getAttrGroupId()); + if (attrGroupEntity!=null){ + respVo.setGroupName(attrGroupEntity.getAttrGroupName()); + } + } + } + + //2.设置分类信息 + Long catelogId = attrEntity.getCatelogId(); + Long[] catelogPath = categoryService.findCatelogPath(catelogId); + respVo.setCatelogPath(catelogPath); + CategoryEntity categoryEntity = categoryDao.selectById(catelogId); + if (categoryEntity!=null){ + respVo.setGroupName(categoryEntity.getName()); + } + + return respVo; + } + + @Transactional + @Override + public void updateAttr(AttrVo attr) { + AttrEntity attrEntity = new AttrEntity(); + BeanUtils.copyProperties(attr,attrEntity); + this.updateById(attrEntity); + + if (attrEntity.getAttrType() == ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode()){ + //1.修改分组关联 + AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity(); + relationEntity.setAttrGroupId(attr.getAttrGroupId()); + relationEntity.setAttrId(attr.getAttrId()); + Integer count = relationDao.selectCount(new QueryWrapper().eq("attr_id", attr.getAttrId())); + if (count>0){ + relationDao.update(relationEntity,new UpdateWrapper().eq("attr_id",attr.getAttrId())); + }else { + relationDao.insert(relationEntity); + } + } + } + + /** + * 根据分组id查找关联的所有基本属性 + * @param attrgroupId + * @return + */ + @Override + public List getRelationAttr(Long attrgroupId) { + List entities = relationDao.selectList(new QueryWrapper().eq("attr_group_id", attrgroupId)); + List attrIds = entities.stream().map((attr) -> { + return attr.getAttrId(); + }).collect(Collectors.toList()); + + if (attrIds == null || attrIds.size() == 0){ + return null; + } + Collection attrEntities = this.listByIds(attrIds); + return (List) attrEntities; + } + + @Override + public void deleteRelation(AttrGroupRelationVo[] vos) { + List entities = Arrays.asList(vos).stream().map((item) -> { + AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity(); + BeanUtils.copyProperties(item, relationEntity); + return relationEntity; + }).collect(Collectors.toList()); + relationDao.deleteBatchRelation(entities); + } + + /** + * 获取当前分组没有关联的所有属性 + * @param params + * @param attrgroupId + * @return + */ + @Override + public PageUtils getNoRelationAttr(Map params, Long attrgroupId) { + //1.当前分组只能关联自己所属的分类里面的所有属性 + AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrgroupId); + Long catelogId = attrGroupEntity.getCatelogId(); + //2.当前分组只能关联别的分组没有引用的属性 + //2.1)、当前分类下的其他分组 + List group = attrGroupDao.selectList(new QueryWrapper().eq("catelog_id", catelogId)); + List collect = group.stream().map(item -> { + return item.getAttrGroupId(); + }).collect(Collectors.toList()); + //2.2)、这些分组关联的属性 + List groupId = relationDao.selectList(new QueryWrapper().in("attr_group_id", collect)); + List attrIds = groupId.stream().map(item -> { + return item.getAttrId(); + }).collect(Collectors.toList()); + //2.3)、从当前分类的所有属性中移除这些属性 + QueryWrapper wrapper = new QueryWrapper().eq("catelog_id", catelogId).eq("attr_type",ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode()); + if (attrIds!=null && attrIds.size()>0){ + wrapper.notIn("attr_id", attrIds); + } + String key = (String) params.get("key"); + if (!StringUtils.isEmpty(key)){ + wrapper.and((w)->{ + w.eq("attr_id",key).or().like("attr_name",key); + }); + } + IPage page = this.page(new Query().getPage(params), wrapper); + PageUtils pageUtils = new PageUtils(page); + return pageUtils; + } + } \ No newline at end of file diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/BrandServiceImpl.java b/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/BrandServiceImpl.java index 1098cfc9b65420851bec91db85e38cc254ff39ee..6b767c2953ae7ae6735e1c48747d69fbc1d54db4 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/BrandServiceImpl.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/BrandServiceImpl.java @@ -1,5 +1,7 @@ package com.forth.gulimall.product.service.impl; +import com.forth.gulimall.product.service.CategoryBrandRelationService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Map; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -11,19 +13,42 @@ import com.forth.common.utils.Query; import com.forth.gulimall.product.dao.BrandDao; import com.forth.gulimall.product.entity.BrandEntity; import com.forth.gulimall.product.service.BrandService; +import org.springframework.util.StringUtils; @Service("brandService") public class BrandServiceImpl extends ServiceImpl implements BrandService { + @Autowired + CategoryBrandRelationService categoryBrandRelationService; + @Override public PageUtils queryPage(Map params) { + //1.获取key + String key = (String) params.get("key"); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (!StringUtils.isEmpty(key)){ + queryWrapper.eq("brand_id",key).or().like("name",key); + } + IPage page = this.page( new Query().getPage(params), - new QueryWrapper() + queryWrapper ); return new PageUtils(page); } + @Override + public void updateDetail(BrandEntity brand) { + //保证冗余字段的数据一致 + this.updateById(brand); + if (!StringUtils.isEmpty(brand.getName())){ + //同步更新其他关联表中的数据 + //TODO 更新其他关联 + categoryBrandRelationService.updateBrand(brand.getBrandId(),brand.getName()); + + } + } + } \ No newline at end of file diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/CategoryBrandRelationServiceImpl.java b/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/CategoryBrandRelationServiceImpl.java index 6a09bcaea762403a4d311f3611341ad39b41c9a7..000bd66cd4b980ce7afafee3c423327d7f2d0e34 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/CategoryBrandRelationServiceImpl.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/CategoryBrandRelationServiceImpl.java @@ -1,5 +1,11 @@ package com.forth.gulimall.product.service.impl; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.forth.gulimall.product.dao.BrandDao; +import com.forth.gulimall.product.dao.CategoryDao; +import com.forth.gulimall.product.entity.BrandEntity; +import com.forth.gulimall.product.entity.CategoryEntity; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Map; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -16,6 +22,12 @@ import com.forth.gulimall.product.service.CategoryBrandRelationService; @Service("categoryBrandRelationService") public class CategoryBrandRelationServiceImpl extends ServiceImpl implements CategoryBrandRelationService { + @Autowired + private BrandDao brandDao; + + @Autowired + private CategoryDao categoryDao; + @Override public PageUtils queryPage(Map params) { IPage page = this.page( @@ -26,4 +38,31 @@ public class CategoryBrandRelationServiceImpl extends ServiceImpl().eq("brand_id",brandId)); + } + + @Override + public void updateCategory(Long catId, String name) { + this.baseMapper.updateCategory(catId,name); + } + } \ No newline at end of file diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/CategoryServiceImpl.java b/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/CategoryServiceImpl.java index d0f123d14a962fa85be46b30ee503d1870ae6fff..5c51b38da8524e3f9af02d02a9aa8b10ccfa88d3 100644 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/CategoryServiceImpl.java +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/service/impl/CategoryServiceImpl.java @@ -1,7 +1,11 @@ package com.forth.gulimall.product.service.impl; +import com.forth.gulimall.product.service.CategoryBrandRelationService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -20,6 +24,9 @@ import com.forth.gulimall.product.service.CategoryService; @Service("categoryService") public class CategoryServiceImpl extends ServiceImpl implements CategoryService { + @Autowired + CategoryBrandRelationService categoryBrandRelationService; + @Override public PageUtils queryPage(Map params) { IPage page = this.page( @@ -49,6 +56,42 @@ public class CategoryServiceImpl extends ServiceImpl asList) { + //TODO 1.检查当前删除的菜单,是否被别的地方引用 + baseMapper.deleteBatchIds(asList); + } + + //[2,25,225] + @Override + public Long[] findCatelogPath(Long catelogId) { + List paths = new ArrayList<>(); + List parentPath = findParentPath(catelogId, paths); + Collections.reverse(parentPath); + return (Long[]) parentPath.toArray(new Long[parentPath.size()]); + } + + /** + * 级联更新所有关联的数据 + * @param category + */ + @Override + public void updateCascade(CategoryEntity category) { + this.updateById(category); + categoryBrandRelationService.updateCategory(category.getCatId(),category.getName()); + } + + //[225,25,2] + private List findParentPath(Long catelogId,List paths){ + //1.收集当前节点id + paths.add(catelogId); + CategoryEntity byId = this.getById(catelogId); + if (byId.getParentCid()!=0){ + findParentPath(byId.getParentCid(),paths); + } + return paths; + } + /** * 递归查找所有菜单的子菜单 * @param root diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/vo/AttrGroupRelationVo.java b/gulimall-product/src/main/java/com/forth/gulimall/product/vo/AttrGroupRelationVo.java new file mode 100644 index 0000000000000000000000000000000000000000..109267d93eda7133a5ad77ce0b8c416d9d7758ee --- /dev/null +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/vo/AttrGroupRelationVo.java @@ -0,0 +1,10 @@ +package com.forth.gulimall.product.vo; + +import lombok.Data; + +@Data +public class AttrGroupRelationVo { + + private Long attrId; + private Long attrGroupId; +} diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/vo/AttrRespVo.java b/gulimall-product/src/main/java/com/forth/gulimall/product/vo/AttrRespVo.java new file mode 100644 index 0000000000000000000000000000000000000000..d568a45216e39cce2f42efc1ebce7738ae14ab44 --- /dev/null +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/vo/AttrRespVo.java @@ -0,0 +1,22 @@ +package com.forth.gulimall.product.vo; + +import lombok.Data; + +@Data +public class AttrRespVo extends AttrVo{ + + /** + * 所属分类名字 + */ + private String catelogName; + + /** + * 所属分组名字 + */ + private String groupName; + + /** + * 分类路径 + */ + private Long[] catelogPath; +} diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/vo/AttrVo.java b/gulimall-product/src/main/java/com/forth/gulimall/product/vo/AttrVo.java new file mode 100644 index 0000000000000000000000000000000000000000..3be33a7a523f26fa2071450f213799f7cc1c3497 --- /dev/null +++ b/gulimall-product/src/main/java/com/forth/gulimall/product/vo/AttrVo.java @@ -0,0 +1,45 @@ +package com.forth.gulimall.product.vo; + +import lombok.Data; + +@Data +public class AttrVo { + /** + * 属性id + */ + private Long attrId; + /** + * 属性名 + */ + private String attrName; + /** + * 是否需要检索[0-不需要,1-需要] + */ + private Integer searchType; + /** + * 属性图标 + */ + private String icon; + /** + * 可选值列表[用逗号分隔] + */ + private String valueSelect; + /** + * 属性类型[0-销售属性,1-基本属性,2-既是销售属性又是基本属性] + */ + private Integer attrType; + /** + * 启用状态[0 - 禁用,1 - 启用] + */ + private Long enable; + /** + * 所属分类 + */ + private Long catelogId; + /** + * 快速展示【是否展示在介绍上;0-否 1-是】,在sku中仍然可以调整 + */ + private Integer showDesc; + + private Long attrGroupId; +} diff --git a/gulimall-product/src/main/java/com/forth/gulimall/product/vo/MemberRespVo.java b/gulimall-product/src/main/java/com/forth/gulimall/product/vo/MemberRespVo.java deleted file mode 100644 index f89980b36046c654e09800d81d19ba033d112d94..0000000000000000000000000000000000000000 --- a/gulimall-product/src/main/java/com/forth/gulimall/product/vo/MemberRespVo.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.forth.gulimall.product.vo; - -import lombok.Data; -import lombok.ToString; - -import java.io.Serializable; -import java.util.Date; -@ToString -@Data -public class MemberRespVo implements Serializable { - /** - * id - */ - - private Long id; - /** - * 会员等级id - */ - private Long levelId; - /** - * 用户名 - */ - private String username; - /** - * 密码 - */ - private String password; - /** - * 昵称 - */ - private String nickname; - /** - * 手机号码 - */ - private String mobile; - /** - * 邮箱 - */ - private String email; - /** - * 头像 - */ - private String header; - /** - * 性别 - */ - private Integer gender; - /** - * 生日 - */ - private Date birth; - /** - * 所在城市 - */ - private String city; - /** - * 职业 - */ - private String job; - /** - * 个性签名 - */ - private String sign; - /** - * 用户来源 - */ - private Integer sourceType; - /** - * 积分 - */ - private Integer integration; - /** - * 成长值 - */ - private Integer growth; - /** - * 启用状态 - */ - private Integer status; - /** - * 注册时间 - */ - private Date createTime; - - private String socialUid; - private String accessToken; - private Long expiresIn; - -} diff --git a/gulimall-product/src/main/resources/application.yml b/gulimall-product/src/main/resources/application.yml index 8c6095b9bafb454db9c44c0d927d52d3771ac257..6bcb286a0cb56922b39556b7c1a16a23b493e40f 100644 --- a/gulimall-product/src/main/resources/application.yml +++ b/gulimall-product/src/main/resources/application.yml @@ -10,7 +10,11 @@ spring: nacos: discovery: server-addr: 39.97.249.66:8848 - + alicloud: + access-key: LTAI4GDX99wA75oVsdzZygVW + secret-key: 7hxQWldF6jHl4Y45vsifIV7qawbj7e + oss: + endpoint: oss-cn-beijing.aliyuncs.com application: name: product mybatis-plus: @@ -18,5 +22,10 @@ mybatis-plus: global-config: db-config: id-type: auto + logic-delete-value: 1 # 逻辑已删除值(默认为 1) + logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) - +#打印sql日志 +logging: + level: + com.forth.gulimall: debug diff --git a/gulimall-third-party/src/main/java/com/forth/gulimall/thirdparty/controller/OssController.java b/gulimall-third-party/src/main/java/com/forth/gulimall/thirdparty/controller/OssController.java index 58c45f09e313ca85ec8fe18e99ab914415fe87c1..8e2430ab0e9865076c1d939ab422f02d5902e213 100644 --- a/gulimall-third-party/src/main/java/com/forth/gulimall/thirdparty/controller/OssController.java +++ b/gulimall-third-party/src/main/java/com/forth/gulimall/thirdparty/controller/OssController.java @@ -71,6 +71,8 @@ public class OssController { } catch (Exception e) { // Assert.fail(e.getMessage()); System.out.println(e.getMessage()); + } finally { + ossClient.shutdown(); } return R.ok().put("data",respMap); diff --git a/gulimall-third-party/src/main/resources/application.yml b/gulimall-third-party/src/main/resources/application.yml index 5edc5eb2af8bbf9566f60afd6d4b423297b7aecf..06490657c620ce4b97cac9499c227fd20477d298 100644 --- a/gulimall-third-party/src/main/resources/application.yml +++ b/gulimall-third-party/src/main/resources/application.yml @@ -12,6 +12,11 @@ spring: path: /smsApi/verifyCode/send templateId: 540 appCode: 0995740d4ffe4f64bd63dcea04160b07 + access-key: LTAI4GDX99wA75oVsdzZygVW + secret-key: 7hxQWldF6jHl4Y45vsifIV7qawbj7e + oss: + endpoint: oss-cn-beijing.aliyuncs.com + bucket: gulimall-hjp application: name: gulimall-third-party