——————————DescriptionStart——————————
运行环境
Java≥8、MySQL≥5.7、Node.js≥14
开发工具
后端:eclipse/idea/myeclipse/sts等均可配置运行
前端:WebStorm/VSCode/HBuilderX等均可
❗没学过node.js的不要搞前后端分离项目
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明






基于javaweb的SpringBoot水果生鲜商城系统(java+springboot+maven+mybatis+vue+mysql+redis)
一、项目简述 本系统功能包括: 商品的分类展示,用户的注册登录,购物车,订单结算,购物车加减,后台商品管理,分类管理,订单管理等等功能。
二、项目运行 环境配置:
Jdk1.8 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。
项目技术:
Springboot + Maven + mybatis+ Vue 等等组成,B/S模式 + Maven管理等等。
——————————CodeStart——————————
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
@RestController public class UserController {
@Autowired UserService userService;
@ApiOperation("注册") @PostMapping("register") public ApiRestResponse<Object> register(@RequestParam("username") String username, @RequestParam("password") String password) throws GobMallException { if (StringUtils.isEmpty(username)) { return ApiRestResponse.error(GobMallExceptionEnum.NEED_USER_NAME); } if (StringUtils.isEmpty(password)) { return ApiRestResponse.error(GobMallExceptionEnum.NEED_PASSWORD); } if (password.length() < 8) { return ApiRestResponse.error(GobMallExceptionEnum.PASSWORD_TOO_SHORT); }
userService.register(username, password); return ApiRestResponse.success(); }
@ApiOperation("登录") @PostMapping("login") public ApiRestResponse<User> login(@RequestParam("username") String username, @RequestParam("password") String password, HttpSession session) throws GobMallException { if (StringUtils.isEmpty(username)) {
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
User currentUser = UserHandler.checkUserLogin(request, response);
response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=utf-8"); if (currentUser != null) { UserFilter.currentUser.set(currentUser);
chain.doFilter(request,response); }
}
@Override public void destroy() {
} } package cn.goodboyding.mall.util;
public class UserHandler {
public static User checkUserLogin(ServletRequest request, ServletResponse response) throws IOException { HttpServletRequest httpServletRequest = (HttpServletRequest) request;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
@Aspect @Component public class WebLogAspect {
private final Logger log = LoggerFactory.getLogger(WebLogAspect .class);
@Pointcut("execution(public * cn.goodboyding.mall.controller.*.*(..))") public void webLog() {
}
@Before("webLog()") public void doBefore(JoinPoint joinPoint) { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest();
log.info("URL : " + request.getRequestURL().toString()); log.info("HTTP_METHOD : " + request.getMethod()); log.info("IP : " + request.getRemoteAddr()); log.info("ClASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); log.info("ARGS : " + Arrays.toString(joinPoint.getArgs())); }
@AfterReturning(returning = "res",pointcut = "webLog()") public void doAfterReturning(Object res) throws JsonProcessingException { log.info("RESPONSE : " + new ObjectMapper().writeValueAsString(res)); }
} package cn.goodboyding.mall.filter;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
@RestController @RequestMapping("/cart") public class CartController {
private final CartService cartService;
public CartController(CartService cartService) { this.cartService = cartService; }
@ApiOperation("购物车列表") @GetMapping("/list") public ApiRestResponse list() { List<CartVO> list = cartService.list(UserFilter.currentUser.get().getId()); return ApiRestResponse.success(list); }
@ApiOperation("购物车中选中商品") @GetMapping("/list/selected") public ApiRestResponse listOfSelected() { List<CartVO> cartVOList = cartService.listOfSelected(UserFilter.currentUser.get().getId()); return ApiRestResponse.success(cartVOList); }
@ApiOperation("添加商品到购物车") @PostMapping("/add") public ApiRestResponse add(@RequestParam Integer productId, @RequestParam Integer count) {
if (count < 0) { throw new GobMallException(GobMallExceptionEnum.REQUEST_PARAM_ERROR); } List<CartVO> cartVOList = cartService.add(UserFilter.currentUser.get().getId(), productId, count); return ApiRestResponse.success(cartVOList); }
@ApiOperation("更新购物车信息")
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| if (order == null) { throw new GobMallException(GobMallExceptionEnum.ORDER_EXISTED); } Integer userId = UserFilter.currentUser.get().getId(); if (!order.getUserId().equals(userId)) { throw new GobMallException(GobMallExceptionEnum.NOT_YOUR_ORDER); } return order; }
private Order isOrderNotNull(String orderNo) { Order oldOrder = orderMapper.selectByOrderNO(orderNo); if (oldOrder == null) { throw new GobMallException(GobMallExceptionEnum.ORDER_EXISTED); } return oldOrder; }
@Transactional(rollbackFor = Exception.class) @Override public String create(CreateOrderRequest createOrderRequest) {
Integer userId = UserFilter.currentUser.get().getId(); List<CartVO> cartVOList = cartService.list(userId); cartVOList = cartVOList.stream().filter(cartVO -> cartVO.getSelected().equals(Constant.Cart.CHECKED)).collect(Collectors.toList()); if (CollectionUtils.isEmpty(cartVOList)) { throw new GobMallException(GobMallExceptionEnum.CART_EMPTY); } validSaleStatusAndStock(cartVOList); List<OrderItem> orderItemList = cartVOListToOrderItemList(cartVOList); for (OrderItem orderItem : orderItemList) { Product product = productMapper.selectByPrimaryKey(orderItem.getProductId()); int stock = product.getStock() - orderItem.getQuantity(); if (stock < 0) { throw new GobMallException(GobMallExceptionEnum.NOT_ENOUGH); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| out.flush(); out.close(); } }
}
@Override public void destroy() {
} } package cn.goodboyding.mall.filter;
public class CorsFilter implements Filter { @Override public void init(FilterConfig filterConfig) { }
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (request instanceof HttpServletRequest) { String [] allowDomain= {"http://localhost:81","http://localhost:8081","http://192.168.43.69","http://192.168.43.69:8080"}; Set<String> allowedOrigins= new HashSet<String>(Arrays.asList(allowDomain)); String originHeader=((HttpServletRequest) request).getHeader("Origin"); if (!allowedOrigins.contains(originHeader)) { originHeader = "http://localhost"; } HttpServletResponse httpServletResponse = (HttpServletResponse) response; httpServletResponse.setHeader("Access-Control-Allow-Origin", originHeader); httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE"); httpServletResponse.setHeader("Access-Control-Max-Age", "3600"); httpServletResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, x-requested-with, X-Custom-Header, Authorization"); httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true"); } chain.doFilter(request, response); }
|
——————————PayStart——————————
项目链接:
https://javayms.github.io?id=341122532008200qu
https://javayms.pages.dev?id=341122532008200qu