diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index 39b8297..78c8dee 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -59,7 +59,6 @@ public class SysLoginController { public AjaxResult login(@RequestBody PhoneLoginBody loginBody) { AjaxResult ajax = AjaxResult.success(); SysUser user = loginService.phoneLogin(loginBody.getPhone(), loginBody.getCode(), loginBody.getUuid()); - // lcUserService.initVipUser(user); ajax.put(Constants.TOKEN, loginService.createToken(user)); return ajax; } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/controller/CartController.java b/ruoyi-mall/src/main/java/com/cyl/h5/controller/CartController.java index 4370f21..dd238b5 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/controller/CartController.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/CartController.java @@ -1,13 +1,21 @@ package com.cyl.h5.controller; -import com.cyl.pms.domain.ProductCategory; +import com.cyl.pms.pojo.dto.MemberCartDTO; +import com.cyl.ums.convert.MemberCartConvert; +import com.cyl.ums.domain.MemberCart; +import com.cyl.ums.pojo.query.MemberCartQuery; +import com.cyl.ums.pojo.vo.form.AddMemberCartForm; +import com.cyl.ums.pojo.vo.form.UpdateMemberCartForm; import com.cyl.ums.service.MemberCartService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; +import java.util.ArrayList; import java.util.List; @RestController @@ -15,6 +23,8 @@ import java.util.List; public class CartController { @Autowired private MemberCartService memberCartService; + @Autowired + private MemberCartConvert memberCartConvert; /** * 当前用户的购物车商品数量 @@ -22,7 +32,60 @@ public class CartController { * @return */ @GetMapping("goodscount") - public ResponseEntity allCategories() { + public ResponseEntity goodscount() { return ResponseEntity.ok(memberCartService.mineCartNum()); } + /** + * 当前用户的购物车商品id列表 + * + * @return + */ + @GetMapping("cart-ids") + public ResponseEntity> cartIds() { + return ResponseEntity.ok(memberCartService.mineCartIds()); + } + + /** + * 添加购物车 + * + * @return 购物车商品 + */ + @PostMapping("add") + public ResponseEntity add(@Valid @RequestBody AddMemberCartForm form) { + return ResponseEntity.ok(memberCartService.insert(form)); + } + + /** + * 修改购物车 + * + * @return 是否修改 + */ + @PostMapping("modify") + public ResponseEntity modify(@Valid @RequestBody UpdateMemberCartForm form) { + return ResponseEntity.ok(memberCartService.update(form)); + } + + /** + * 修改购物车 + * + * @return 是否修改 + */ + @DeleteMapping("remove") + public ResponseEntity remove(@RequestBody List ids) { + return ResponseEntity.ok(memberCartService.deleteByIds(ids)); + } + + /** + * 购物车列表 + * + * @return 购物车列表 + */ + @PostMapping("list") + public ResponseEntity> remove(@RequestBody MemberCartQuery query, Pageable pageable) { + List list = memberCartService.selectList(query, pageable); + com.github.pagehelper.Page p = (com.github.pagehelper.Page)list; + List resList = memberCartConvert.dos2Dtos(list); + memberCartService.injectSku(resList); + return ResponseEntity.ok(new PageImpl<>(resList, pageable, p.getTotal())); + } } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/controller/WechatController.java b/ruoyi-mall/src/main/java/com/cyl/h5/controller/WechatController.java index 0656759..3e1e38f 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/controller/WechatController.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/WechatController.java @@ -28,4 +28,13 @@ public class WechatController { } return "err"; } + /** + * 微信公众号服务器认证 + * @return + */ + @GetMapping("/no-auth/wechat/h5-login") + public String h5Login(HttpServletRequest request) { + // TODO + return "err"; + } } diff --git a/ruoyi-mall/src/main/java/com/cyl/pms/pojo/dto/MemberCartDTO.java b/ruoyi-mall/src/main/java/com/cyl/pms/pojo/dto/MemberCartDTO.java new file mode 100644 index 0000000..eaf6676 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/pms/pojo/dto/MemberCartDTO.java @@ -0,0 +1,11 @@ +package com.cyl.pms.pojo.dto; + +import com.cyl.ums.domain.MemberCart; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class MemberCartDTO extends MemberCart { + private BigDecimal price; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/convert/MemberCartConvert.java b/ruoyi-mall/src/main/java/com/cyl/ums/convert/MemberCartConvert.java index dfbf6e6..f03b092 100644 --- a/ruoyi-mall/src/main/java/com/cyl/ums/convert/MemberCartConvert.java +++ b/ruoyi-mall/src/main/java/com/cyl/ums/convert/MemberCartConvert.java @@ -1,16 +1,34 @@ package com.cyl.ums.convert; +import com.cyl.pms.domain.Product; +import com.cyl.pms.domain.Sku; +import com.cyl.pms.pojo.dto.MemberCartDTO; +import org.mapstruct.BeanMapping; import org.mapstruct.Mapper; import com.cyl.ums.domain.MemberCart; import com.cyl.ums.pojo.vo.MemberCartVO; +import org.mapstruct.Mapping; +import org.mapstruct.MappingTarget; + import java.util.List; + /** * 购物车 DO <=> DTO <=> VO / BO / Query * * @author zcc */ @Mapper(componentModel = "spring") -public interface MemberCartConvert { +public interface MemberCartConvert { List dos2vos(List list); + + @Mapping(target = "id", ignore = true) + @Mapping(target = "skuId", source = "id") + MemberCart sku2Cart(Sku sku); + + @BeanMapping(ignoreByDefault = true) + @Mapping(source = "name", target = "productName") + void injectProduct(@MappingTarget MemberCart memberCart, Product p); + + List dos2Dtos(List list); } diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/form/AddMemberCartForm.java b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/form/AddMemberCartForm.java new file mode 100644 index 0000000..1c2896a --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/form/AddMemberCartForm.java @@ -0,0 +1,23 @@ +package com.cyl.ums.pojo.vo.form; + +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +@Data +public class AddMemberCartForm { + /** + * 规格id + */ + @NotNull(message = "规格必填!") + private Long skuId; + /** + * 数量 + */ + @NotNull(message = "数量必填!") + @Min(value = 1, message = "数量不小于1") + @Max(value = Integer.MAX_VALUE, message = "数量不大于" + Integer.MAX_VALUE) + private Integer num; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/form/UpdateMemberCartForm.java b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/form/UpdateMemberCartForm.java new file mode 100644 index 0000000..760ee38 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/form/UpdateMemberCartForm.java @@ -0,0 +1,18 @@ +package com.cyl.ums.pojo.vo.form; + +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +@Data +public class UpdateMemberCartForm { + @NotNull(message = "id 不能为空") + private Long id; + + @NotNull(message = "数量必填") + @Min(value = 0, message = "数量不小于0") + @Max(value = Integer.MAX_VALUE, message = "数量不大于" + Integer.MAX_VALUE) + private Integer num; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/service/MemberCartService.java b/ruoyi-mall/src/main/java/com/cyl/ums/service/MemberCartService.java index 4495371..60040c9 100644 --- a/ruoyi-mall/src/main/java/com/cyl/ums/service/MemberCartService.java +++ b/ruoyi-mall/src/main/java/com/cyl/ums/service/MemberCartService.java @@ -1,21 +1,33 @@ package com.cyl.ums.service; -import java.util.Arrays; -import java.util.List; -import java.time.LocalDateTime; - -import cn.hutool.crypto.SecureUtil; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.pms.domain.Product; +import com.cyl.pms.domain.Sku; +import com.cyl.pms.mapper.ProductMapper; +import com.cyl.pms.mapper.SkuMapper; +import com.cyl.pms.pojo.dto.MemberCartDTO; +import com.cyl.ums.convert.MemberCartConvert; +import com.cyl.ums.domain.MemberCart; +import com.cyl.ums.mapper.MemberCartMapper; +import com.cyl.ums.pojo.query.MemberCartQuery; +import com.cyl.ums.pojo.vo.form.AddMemberCartForm; +import com.cyl.ums.pojo.vo.form.UpdateMemberCartForm; import com.github.pagehelper.PageHelper; +import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.SortUtil; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; -import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; -import com.cyl.ums.mapper.MemberCartMapper; -import com.cyl.ums.domain.MemberCart; -import com.cyl.ums.pojo.query.MemberCartQuery; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * 购物车Service业务层处理 @@ -26,6 +38,12 @@ import com.cyl.ums.pojo.query.MemberCartQuery; public class MemberCartService { @Autowired private MemberCartMapper memberCartMapper; + @Autowired + private SkuMapper skuMapper; + @Autowired + private ProductMapper productMapper; + @Autowired + private MemberCartConvert memberCartConvert; /** * 查询购物车 @@ -46,7 +64,7 @@ public class MemberCartService { */ public List selectList(MemberCartQuery query, Pageable page) { if (page != null) { - PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize(), SortUtil.sort2string(page.getSort(),"id desc")); } QueryWrapper qw = new QueryWrapper<>(); Integer status = query.getStatus(); @@ -56,6 +74,8 @@ public class MemberCartService { Long memberId = query.getMemberId(); if (memberId != null) { qw.eq("member_id", memberId); + } else { + qw.eq("member_id", SecurityUtils.getUserId()); } Long productId = query.getProductId(); if (productId != null) { @@ -95,6 +115,25 @@ public class MemberCartService { return memberCartMapper.insert(memberCart); } + /** + * 新增购物车 + * + * @param form 添加购物车表单 + * @return 结果 + */ + public MemberCart insert(AddMemberCartForm form) { + // 查询规格 + Sku sku = skuMapper.selectById(form.getSkuId()); + MemberCart memberCart = memberCartConvert.sku2Cart(sku); + Product p = productMapper.selectById(sku.getProductId()); + memberCartConvert.injectProduct(memberCart, p); + memberCart.setQuantity(form.getNum()); + memberCart.setMemberId(SecurityUtils.getUserId()); + memberCart.setStatus(1) ; + memberCartMapper.insert(memberCart); + return memberCart; + } + /** * 修改购物车 * @@ -104,6 +143,21 @@ public class MemberCartService { public int update(MemberCart memberCart) { return memberCartMapper.updateById(memberCart); } + public int update(UpdateMemberCartForm form) { + if (form.getNum() == null || form.getId() == null) { + throw new BaseException("参数错误"); + } + Long userId = SecurityUtils.getUserId(); + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(MemberCart::getMemberId, userId); + qw.eq(MemberCart::getId, form.getId()); + if (form.getNum() <= 0) { + return memberCartMapper.delete(qw); + } + MemberCart e = new MemberCart(); + e.setQuantity(form.getNum()); + return memberCartMapper.update(e, qw); + } /** * 删除购物车信息 @@ -115,16 +169,58 @@ public class MemberCartService { return memberCartMapper.deleteById(id); } + /** + * 删除购物车信息 + * + * @param ids 购物车主键 + * @return 结果 + */ + public int deleteByIds(List ids) { + Long userId = SecurityUtils.getUserId(); + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(MemberCart::getMemberId, userId); + qw.in(MemberCart::getId, ids); + return memberCartMapper.delete(qw); + } + public Integer mineCartNum() { Long userId = SecurityUtils.getUserId(); QueryWrapper qw = new QueryWrapper<>(); qw.eq("member_id", userId); qw.eq("status", 1); - qw.select("sum(quantity) quantity"); + qw.select("count(quantity) quantity"); MemberCart c = memberCartMapper.selectOne(qw); if (c == null) { return 0; } return c.getQuantity(); } + + public void injectSku(List resList) { + List skuIds = resList.stream().map(MemberCartDTO::getSkuId).distinct().collect(Collectors.toList()); + if (CollUtil.isEmpty(skuIds)) { + return; + } + List skus = skuMapper.selectBatchIds(skuIds); + Map map = new HashMap<>(); + skus.forEach(it -> { + map.put(it.getId(), it); + }); + resList.forEach(it -> { + Sku s = map.get(it.getSkuId()); + if (s == null) { + return; + } + it.setPrice(s.getPrice()); + }); + } + + public List mineCartIds() { + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("member_id", SecurityUtils.getUserId()); + qw.eq("status", 1); + qw.select("id"); + List list = memberCartMapper.selectList(qw); + return list.stream().map(MemberCart::getId).collect(Collectors.toList()); + } }