diff --git a/src/main/java/com/sport/sportsmailserver/controller/CartController.java b/src/main/java/com/sport/sportsmailserver/controller/CartController.java new file mode 100644 index 0000000..2b09db4 --- /dev/null +++ b/src/main/java/com/sport/sportsmailserver/controller/CartController.java @@ -0,0 +1,63 @@ +package com.sport.sportsmailserver.controller; + +import com.sport.sportsmailserver.dto.LoginUser; +import com.sport.sportsmailserver.dto.RestModel; +import com.sport.sportsmailserver.security.MustUserLogin; +import com.sport.sportsmailserver.service.CartService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.web.PageableDefault; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author itning + * @date 2020/2/12 16:44 + */ +@RestController +public class CartController { + private final CartService cartService; + + @Autowired + public CartController(CartService cartService) { + this.cartService = cartService; + } + + /** + * 添加到购物车 + * + * @param loginUser 登录用户 + * @param commodityId 商品ID + * @param num 数量 + * @param cumulative 累加 + * @return 添加的商品 + */ + @PostMapping("/cart") + public ResponseEntity addToCart(@MustUserLogin LoginUser loginUser, + @RequestParam String commodityId, + @RequestParam(defaultValue = "1") int num, + @RequestParam(defaultValue = "true") boolean cumulative) { + return RestModel.created(cartService.addToCart(loginUser, commodityId, num, cumulative)); + } + + /** + * 获取某用户所有购物车 + * + * @param loginUser 登录用户 + * @param pageable 分页 + * @return ResponseEntity + */ + @GetMapping("carts") + public ResponseEntity getCarts(@MustUserLogin LoginUser loginUser, + @PageableDefault( + size = 20, sort = {"gmtModified"}, + direction = Sort.Direction.DESC + ) + Pageable pageable) { + return RestModel.ok(cartService.getAll(loginUser, pageable)); + } +} diff --git a/src/main/java/com/sport/sportsmailserver/controller/UserController.java b/src/main/java/com/sport/sportsmailserver/controller/UserController.java index ca3bff5..ef3d34d 100644 --- a/src/main/java/com/sport/sportsmailserver/controller/UserController.java +++ b/src/main/java/com/sport/sportsmailserver/controller/UserController.java @@ -1,13 +1,14 @@ package com.sport.sportsmailserver.controller; import com.fasterxml.jackson.core.JsonProcessingException; +import com.sport.sportsmailserver.dto.LoginUser; import com.sport.sportsmailserver.dto.RestModel; +import com.sport.sportsmailserver.entity.User; +import com.sport.sportsmailserver.security.MustUserLogin; import com.sport.sportsmailserver.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * @author itning @@ -35,4 +36,18 @@ public ResponseEntity login(@RequestParam String username, @RequestParam String password) throws JsonProcessingException { return RestModel.ok(userService.login(username, password)); } + + /** + * 修改用户信息 + * + * @param loginUser 登录用户 + * @param user 新用户信息 + * @return ResponseEntity + */ + @PatchMapping("/user") + public ResponseEntity modifyUserInfo(@MustUserLogin LoginUser loginUser, + @RequestBody User user) { + userService.modifyUser(loginUser, user); + return RestModel.noContent(); + } } diff --git a/src/main/java/com/sport/sportsmailserver/entity/CommodityType.java b/src/main/java/com/sport/sportsmailserver/entity/CommodityType.java index 899d947..5bad6e8 100644 --- a/src/main/java/com/sport/sportsmailserver/entity/CommodityType.java +++ b/src/main/java/com/sport/sportsmailserver/entity/CommodityType.java @@ -5,10 +5,12 @@ import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.UpdateTimestamp; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; import java.io.Serializable; import java.util.Date; -import java.util.List; /** * 商品分类 diff --git a/src/main/java/com/sport/sportsmailserver/repository/CartRepository.java b/src/main/java/com/sport/sportsmailserver/repository/CartRepository.java index 0a4ed96..9bde013 100644 --- a/src/main/java/com/sport/sportsmailserver/repository/CartRepository.java +++ b/src/main/java/com/sport/sportsmailserver/repository/CartRepository.java @@ -2,6 +2,9 @@ import com.sport.sportsmailserver.entity.Cart; import com.sport.sportsmailserver.entity.CartPrimaryKey; +import com.sport.sportsmailserver.entity.User; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; /** @@ -9,4 +12,12 @@ * @date 2020/2/11 21:12 */ public interface CartRepository extends JpaRepository { + /** + * 查找某个用户的购物车信息 + * + * @param user 用户 + * @param pageable 分页 + * @return 购物车集合 + */ + Page findAllByUser(User user, Pageable pageable); } diff --git a/src/main/java/com/sport/sportsmailserver/repository/UserRepository.java b/src/main/java/com/sport/sportsmailserver/repository/UserRepository.java index 2c296b7..f3b0b2f 100644 --- a/src/main/java/com/sport/sportsmailserver/repository/UserRepository.java +++ b/src/main/java/com/sport/sportsmailserver/repository/UserRepository.java @@ -8,4 +8,11 @@ * @date 2020/2/11 20:17 */ public interface UserRepository extends JpaRepository { + /** + * 查询邮箱是否存在 + * + * @param email 邮箱 + * @return 存在? + */ + boolean existsByEmail(String email); } diff --git a/src/main/java/com/sport/sportsmailserver/service/CartService.java b/src/main/java/com/sport/sportsmailserver/service/CartService.java new file mode 100644 index 0000000..e5d3c34 --- /dev/null +++ b/src/main/java/com/sport/sportsmailserver/service/CartService.java @@ -0,0 +1,35 @@ +package com.sport.sportsmailserver.service; + +import com.sport.sportsmailserver.dto.LoginUser; +import com.sport.sportsmailserver.entity.Cart; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +/** + * 购物车服务 + * + * @author itning + * @date 2020/2/12 16:45 + */ +public interface CartService { + /** + *

商品加入购物车 + *

每调用一次商品数量变为num + * + * @param loginUser 登录用户 + * @param commodityId 商品ID + * @param num 数量 + * @param cumulative 累加 + * @return 加入的购物车 + */ + Cart addToCart(LoginUser loginUser, String commodityId, int num, boolean cumulative); + + /** + * 获取所有购物车 + * + * @param loginUser 登录用户 + * @param pageable 分页 + * @return 购物车集合 + */ + Page getAll(LoginUser loginUser, Pageable pageable); +} diff --git a/src/main/java/com/sport/sportsmailserver/service/UserService.java b/src/main/java/com/sport/sportsmailserver/service/UserService.java index e4df4c0..083af93 100644 --- a/src/main/java/com/sport/sportsmailserver/service/UserService.java +++ b/src/main/java/com/sport/sportsmailserver/service/UserService.java @@ -1,6 +1,8 @@ package com.sport.sportsmailserver.service; import com.fasterxml.jackson.core.JsonProcessingException; +import com.sport.sportsmailserver.dto.LoginUser; +import com.sport.sportsmailserver.entity.User; /** * 用户服务 @@ -18,4 +20,12 @@ public interface UserService { * @throws JsonProcessingException JWT构建失败 */ String login(String username, String password) throws JsonProcessingException; + + /** + * 修改用户信息 + * + * @param loginUser 登录用户 + * @param user 新用户信息 + */ + void modifyUser(LoginUser loginUser, User user); } diff --git a/src/main/java/com/sport/sportsmailserver/service/impl/CartServiceImpl.java b/src/main/java/com/sport/sportsmailserver/service/impl/CartServiceImpl.java new file mode 100644 index 0000000..0ddcf96 --- /dev/null +++ b/src/main/java/com/sport/sportsmailserver/service/impl/CartServiceImpl.java @@ -0,0 +1,75 @@ +package com.sport.sportsmailserver.service.impl; + +import com.sport.sportsmailserver.dto.LoginUser; +import com.sport.sportsmailserver.entity.Cart; +import com.sport.sportsmailserver.entity.CartPrimaryKey; +import com.sport.sportsmailserver.entity.Commodity; +import com.sport.sportsmailserver.entity.User; +import com.sport.sportsmailserver.exception.IdNotFoundException; +import com.sport.sportsmailserver.exception.SecurityServerException; +import com.sport.sportsmailserver.repository.CartRepository; +import com.sport.sportsmailserver.repository.CommodityRepository; +import com.sport.sportsmailserver.service.CartService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; + +/** + * @author itning + * @date 2020/2/12 16:46 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class CartServiceImpl implements CartService { + private final CartRepository cartRepository; + private final CommodityRepository commodityRepository; + + @Autowired + public CartServiceImpl(CartRepository cartRepository, CommodityRepository commodityRepository) { + this.cartRepository = cartRepository; + this.commodityRepository = commodityRepository; + } + + @Override + public Cart addToCart(LoginUser loginUser, String commodityId, int num, boolean cumulative) { + Commodity cc = commodityRepository.findById(commodityId).orElseThrow(() -> new IdNotFoundException("商品不存在")); + if (cc.isTakeOff()) { + throw new SecurityServerException("商品已下架", HttpStatus.NOT_FOUND); + } + CartPrimaryKey cartPrimaryKey = new CartPrimaryKey(); + cartPrimaryKey.setUser(loginUser.getUsername()); + cartPrimaryKey.setCommodity(commodityId); + Optional cartOptional = cartRepository.findById(cartPrimaryKey); + Cart cart; + if (cartOptional.isPresent()) { + // 商品已经在购物车里了 + cart = cartOptional.get(); + if (cumulative) { + cart.setCountNum(cart.getCountNum() + num); + } else { + cart.setCountNum(num); + } + } else { + User user = new User(); + user.setUsername(loginUser.getUsername()); + + cart = new Cart(); + cart.setCountNum(num); + cart.setUser(user); + cart.setCommodity(cc); + } + return cartRepository.save(cart); + } + + @Override + public Page getAll(LoginUser loginUser, Pageable pageable) { + User user = new User(); + user.setUsername(loginUser.getUsername()); + return cartRepository.findAllByUser(user, pageable); + } +} diff --git a/src/main/java/com/sport/sportsmailserver/service/impl/UserServiceImpl.java b/src/main/java/com/sport/sportsmailserver/service/impl/UserServiceImpl.java index 159a89c..e2b8007 100644 --- a/src/main/java/com/sport/sportsmailserver/service/impl/UserServiceImpl.java +++ b/src/main/java/com/sport/sportsmailserver/service/impl/UserServiceImpl.java @@ -7,6 +7,7 @@ import com.sport.sportsmailserver.exception.IdNotFoundException; import com.sport.sportsmailserver.exception.NullFiledException; import com.sport.sportsmailserver.exception.SecurityServerException; +import com.sport.sportsmailserver.exception.TokenException; import com.sport.sportsmailserver.repository.RoleRepository; import com.sport.sportsmailserver.repository.UserRepository; import com.sport.sportsmailserver.service.UserService; @@ -56,4 +57,25 @@ public String login(String username, String password) throws JsonProcessingExcep LoginUser loginUser = OrikaUtils.a2b(user, LoginUser.class); return JwtUtils.buildJwt(loginUser); } + + @Override + public void modifyUser(LoginUser loginUser, User user) { + User savedUser = userRepository.findById(loginUser.getUsername()).orElseThrow(() -> new TokenException("用户不存在", HttpStatus.BAD_REQUEST)); + if (StringUtils.isNotBlank(user.getPassword())) { + savedUser.setPassword(user.getPassword()); + } + if (StringUtils.isNotBlank(user.getAddress())) { + savedUser.setAddress(user.getAddress()); + } + if (StringUtils.isNotBlank(user.getEmail())) { + if (userRepository.existsByEmail(user.getEmail())) { + throw new NullFiledException("该邮箱已经被注册"); + } + savedUser.setEmail(user.getEmail()); + } + if (StringUtils.isNotBlank(user.getTel())) { + savedUser.setTel(user.getTel()); + } + userRepository.save(savedUser); + } }