自学实践前后端项目4 MMall商城 4

article/2025/10/31 4:57:35

一。实现商品详情展示

1.测试获取后台当个商品的信息

 2.实现通过点击商品名称和商品图片进入商品详情页面

1)查找出商品信息

 2)在前端进行映射

 

 

 

 

 3)设置库存选择限制

 

 判断逻辑

$(function(){//给type绑定点击事件$(".type").click(function () {var index = $(".type").index(this);var obj = $(".type").eq(index);$(".type").removeClass("checked");obj.addClass("checked");});//给color绑定点击事件$(".color").click(function () {var index = $(".color").index(this);var obj = $(".color").eq(index);$(".color").removeClass("checked");obj.addClass("checked");});
});//商品数量++
function increase() {var value = $("#quantity").val();var stock = $("#stock").text();value++;if(value > stock){value = stock;}$("#quantity").val(value);
}//商品数量--
function reduce() {var value = $("#quantity").val();value--;if(value == 0){value = 1;}$("#quantity").val(value);
}
二.接下里处理加入购物车的功能

1.商品选择以后创建相对应信息将数据存入数据库

需要将数据库以及product实体类里面的cost改为浮点型便于后面计算

private Float cost;

1)编写CartController

@Controller
@RequestMapping("/cart")
public class CartController {@Autowiredprivate CartService cartService;@GetMapping("/add/{productId}/{price}/{quantity}")public ModelAndView add(@PathVariable("productId") Integer productId,@PathVariable("price") Float price,@PathVariable("quantity") Integer quantity,HttpSession session){Cart cart = new Cart();cart.setProductId(productId);cart.setQuantity(quantity);cart.setCost(price*quantity);User user = (User) session.getAttribute("user");cart.setUserId(user.getId());ModelAndView modelAndView = new ModelAndView();if (cartService.save(cart)){modelAndView.setViewName("settlement1");}return modelAndView;}}

对应映射前端

 对应add的方法

//添加购物车
function addCart(productId,price){var quantity = $("#quantity").val();window.location.href="/cart/add/"+productId+"/"+price+"/"+quantity;
}

测试注意清理缓存

选择2个数量添加到购物车 

 存入数据库

 跳转到订单详情这个页面还没进行映射处理所以显示的是死数据

 2)接来下进行未登录时候选中添加出现的异常情况报错添加过滤器

[1]添加过滤器实现类UserFilter

package com.redhat.mmall002.filter;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class UserFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;HttpSession session = request.getSession();if (session.getAttribute("user")==null){response.sendRedirect("/productCategory/list");}else {filterChain.doFilter(servletRequest,servletResponse);}}
}

2)配置需要过滤的对象FilterConfig

package com.redhat.mmall002.config;import com.redhat.mmall002.filter.UserFilter;
import org.springframework.boot.web.servlet.AbstractFilterRegistrationBean;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FilterConfig {@Beanpublic AbstractFilterRegistrationBean filterRegistrationBean(){FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();filterRegistrationBean.setFilter(new UserFilter());filterRegistrationBean.addUrlPatterns("/cart/add/*");return filterRegistrationBean;}}
未登录时候测试访问直接返回首页

 已登录账户加入直接进入订单详情

 3)购物车减库存操作服务实现层CartServiceImpl

@Service
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements CartService {@Autowiredprivate CartMapper cartMapper;@Autowiredpublic ProductMapper productMapper;@Overridepublic boolean save(Cart entity) {//扣库存Product product = productMapper.selectById(entity.getProductId());Integer stock = product.getStock()-entity.getQuantity();product.setStock(stock);productMapper.updateById(product);if (cartMapper.insert(entity)==1){return true;}return false;}
}

打断点测试

 

 操作之前

 操作后

 4)自定义购买数量超出总数或者没有商品了时抛出异常

【1】 CartServiceImpl实现层代码

@Service
@Slf4j
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements CartService {@Autowiredprivate CartMapper cartMapper;@Autowiredpublic ProductMapper productMapper;@Overridepublic boolean save(Cart entity)  {//扣库存Product product = productMapper.selectById(entity.getProductId());Integer stock = product.getStock()-entity.getQuantity();if (stock < 0){log.error("[添加购物车]库存不足!stock={}",stock);throw new MallException(ResultEnum.STOCK_ERROR);}product.setStock(stock);productMapper.updateById(product);if (cartMapper.insert(entity)==1){return true;}return false;}
}

【2】CartController抛出异常页面路径跳转

@Controller
@RequestMapping("/cart")
public class CartController {@Autowiredprivate CartService cartService;@GetMapping("/add/{productId}/{price}/{quantity}")public String add(@PathVariable("productId") Integer productId,@PathVariable("price") Float price,@PathVariable("quantity") Integer quantity,HttpSession session){Cart cart = new Cart();cart.setProductId(productId);cart.setQuantity(quantity);cart.setCost(price*quantity);User user = (User) session.getAttribute("user");cart.setUserId(user.getId());try {if (cartService.save(cart)){return "settlement1";}} catch (Exception e) {return "redirect:/productCategory/list";}return null;}
}

【3】前端弹框显示

 

//添加购物车
function addCart(productId,price){var stockStr = $("#stock").text();var stock = parseInt(stockStr);if (stock==0){alert("库存不足!")return false;}var quantity = $("#quantity").val();window.location.href="/cart/add/"+productId+"/"+price+"/"+quantity;
}

【4】创建枚举类

package com.redhat.mmall002.enums;import lombok.Getter;@Getter
public enum ResultEnum {STOCK_ERROR(1,"库存不足");private Integer code;private String msg;ResultEnum(Integer code, String msg) {this.code = code;this.msg = msg;}
}

【5】创建异常处理

package com.redhat.mmall002.exception;import com.redhat.mmall002.enums.ResultEnum;public class MallException extends RuntimeException {public MallException(String error){super(error);}public MallException(ResultEnum resultEnum){super(resultEnum.getMsg());}
}
最后创造一个库存为零的测试

三.完成最后订单详情的页面调用

1.完成后台数据封装前端需要数据调用查询

1)新建CartVO类封装需要的数据

package com.redhat.mmall002.vo;import lombok.Data;@Data
public class CartVO {private Integer id;private Integer quantity;private Float cost;private String name;private Float price;private String fileName;
}

2)CartService类里面定义查询方法

public List<CartVO> findAllCartVOByUserId(Integer id);

public interface CartService extends IService<Cart> {public List<CartVO> findAllCartVOByUserId(Integer id);
}

3)CartServiceImpl类重写需要对应实现的方法

    @Overridepublic List<CartVO> findAllCartVOByUserId(Integer id) {List<CartVO> cartVOList = new ArrayList<>();QueryWrapper wrapper = new QueryWrapper();wrapper.eq("user_id",id);List<Cart> cartList = cartMapper.selectList(wrapper);for (Cart cart :cartList){CartVO cartVO = new CartVO();BeanUtils.copyProperties(cart,cartVO);Product product = productMapper.selectById(cart.getProductId());BeanUtils.copyProperties(product,cartVO);cartVOList.add(cartVO);}return cartVOList;}
}

4)go-to测试类测试功能是否实现

package com.redhat.mmall002.service;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class CartServiceTest {@Autowiredprivate CartService cartService;@Testvoid findAllCartVOByUserId(){cartService.findAllCartVOByUserId(12).forEach(System.out::println);}
}

测试结果

 2.实现对应前端的映射

1)后端查找所有购物车路径CartController类里面添加

    @GetMapping("/findAllCart")public ModelAndView findAllCart(HttpSession session){ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("settlement1");User user = (User) session.getAttribute("user");modelAndView.addObject("list",cartService.findAllCartVOByUserId(user.getId()));return modelAndView;}}
前面在执行保存创建订单的时候返回
return "redirect:/cart/findAllCart";

2)前端迭代映射

 加完购物车测试商品详情页面

 

 

 加上前面的测试数据完成查找并且显示


http://chatgpt.dhexx.cn/article/KL9w6V2r.shtml

相关文章

mmall 项目实战(一)项目初始化

1.创建 数据库 及 表 数据脚本&#xff1a; /* Navicat Premium Data Transfer Source Server : 182.92.82.103 Source Server Type : MySQL Source Server Version : 50173 Source Host : 182.92.82.103 Source Database : mmall Target Se…

B2C购物商城---MMALL商城概览

注意&#xff1a; 商品小图原图缺失后续上传到图片服务器。不影响使用支付宝二维码是支付宝沙箱开发环境生成&#xff0c;不会产生真实交易&#xff0c;若需体验&#xff0c;请下载支付宝沙箱版扫描体验项目仍需优化 本项目的完成参考了慕课网happymmall的设计 项目源码在&…

MMall项目完整分析总结

Linux服务器 线上环境&#xff1a; 1.jdk 2.vsftpd 3.nginx 4.mysql 5.tomcat 6.git 7.maven 8.Redis 项目采用Tomcat集群方式: 在此架构图中&#xff0c;nginx使用的是轮询的负载均衡策略。session不交给tomcat自己管理&#xff0c;已经交由左侧的redis分布式…

python flask-sqlalchemy flask-marshmallow基本使用

首先安装 pip install marshmallow-sqlalchemy pip install flask-sqlalchemy pip install flask-marshmallow 参考 sqlalchemy query 官网 app.py文件内容 from flask import Flask,jsonify import config from flask_sqlalchemy import SQLAlchemy from flask_marshmallow i…

Flask_使用flask_marshmallow序列化数据

代码如下&#xff1a; from flask import Flask from flask_marshmallow import Marshmallow from flask_sqlalchemy import SQLAlchemy from marshmallow import fieldsapp Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] "mysqlpymysql://root:12…

【Python】Marshmallow:Python中的“棉花糖”

博主&#xff1a;&#x1f44d;不许代码码上红 欢迎&#xff1a;&#x1f40b;点赞、收藏、关注、评论。 文章目录 一、Marshmallow简介1.1、基础概念 二、序列化2.1、User类2.2、UserSchema类2.3、Serializing(序列化)2.4、运行2.5、过滤输出 三、反序列化四、验证数据4.1、V…

marshmallow——简介

一、marshmallow简介 在marshmallow诞生之前,已经有很多优秀的模块来用于数据的格式化和数据校验中。 因此书写mashmallow这个库的作者受这些库的启发,例如Django REST Framework, Flask-RESTful, 和colander这些。他同样从这些库中大量借用了设计和实现序列化、反序列化以及…

flask---》Marshmallow介绍及基础使用

0. Marshmallow背景介绍 介绍 Marshmallow&#xff0c;中文译作&#xff1a;棉花糖。是一个轻量级的数据格式转换的模块&#xff0c;也叫序列化和反序列化模块&#xff0c;常用于将复杂的orm模型对象与python原生数据类型之间相互转换。一般用于flaskmarshmallow提供了丰富的…

YApi接口平台-接口挡板

YApi是一个开源的平台&#xff0c;官方平台链接&#xff0c;如下https://hellosean1025.github.io/yapi/index.html,目前很多大公司在使用&#xff0c;主要优势我认为有2个&#xff0c;第一该平台开源&#xff0c;搭建方便&#xff1b;第二该平台解决了前后端分离开发的痛点&am…

open source HTML 5移动应用 -Exlive 人员定位客户端(BlackBerry 10, Android, iPhone)

下图是exlive人员定位系统的宣传页&#xff0c;其官方主站在这里 www.exlive.cn 下图是BlackBerry OS 7.0上面的运行效果&#xff0c;更多截图见这里 http://blog.csdn.net/berryreload/article/details/8099674 Update: Remove BlackBerry OS 7.0支持 升级到PhoneGap 3.0&…

My BlackBerry

什么是黑莓 RIM公司成立于1984年。 黑莓手机&#xff08;Blackberry&#xff09;&#xff0c;是指由加拿大Reserach In Motion&#xff08;RIM&#xff09;公司推出的一种无线手持邮件解决终端设备&#xff0c;也就是我们平时称的手机。 2013年1月30日&#xff0c;RIM公司今…

解决联网下载服务端返回405问题

最近遇到了一个问题&#xff0c;在项目中有一个启动页广告图片下载的功能&#xff0c;之前能够正常下载&#xff0c;由于这个版本遇到了运营商DNS劫持的问题&#xff0c;服务端要调整图片的下载路径&#xff0c;也就是改变了图片的链接地址。修改地址之后下载就出现异常了&…

IIS 405 Method Not Allowed

今天将项目发布到IIS上后&#xff0c;发现Delete方法用不了&#xff0c;可进行如下设置&#xff1a; 打开处理程序映射 找到WebDAV点击请求限制&#xff0c;勾选全部谓词 这个方法如果无效的话 方法二&#xff1a;因为是WebDAVModule限制的请求&#xff0c;所以直接将WebDAV…

前端请求接口时报405错误

他说方法不存在 他的问题所在就是没有找到后端对应的接口 意思就是说没有找到我后端put这个对应的接口 我记得写了不知道为啥没了纳闷

IIS put请求 报HTTP Error 405 - Method Not Allowed

在新的服务器上部署了一个.net core的项目&#xff0c;部分请求地址使用了put、delete方式&#xff0c;导致无法正常请求&#xff0c;报Error 405 - Method Not Allowed。 由于配置IIS时把“WebDAV 发布”给勾选了&#xff0c;所以会导致拦截。 服务器和IIS 10配置如下图&…

405 Method Not Allowed 解决方案

背景描述 前端发送请求到后端&#xff0c;可是经过swagger测试&#xff0c;后端接口是没问题的 可是一旦调用就发生405报错 解决方案 一般这种情况发生是因为前后端请求方式不一致 写在前端的接口声明方式是post 我们来看后端 很明显了&#xff0c;后端是get&#xff0c;因…

405 Method Not Allowed(亲测,实用)

今天在发布一个网站的时候遇到 标题上的问题&#xff0c;一直不明白是为何&#xff0c;刚开始以为是我的程序写的有问题&#xff0c;随即将项目发给同事来发布试试&#xff0c;在他的IIS上发布却没出现问题&#xff0c;一切正常&#xff0c;这可就怪了&#xff0c;于是想到了应…

宝塔面板数据库出现405 Not Allowed 错误的原因和解决办法

我们在网站建设和网站维护过程中&#xff0c;除了云服务器需要小心维护之外&#xff0c;还要应对突然出现的一些问题&#xff0c;比如今天网站突然打不开了&#xff0c;根据页面提示&#xff0c;貌似是数据库的原因&#xff0c;于是登录宝塔面板&#xff0c;想要看看数据库怎么…

浏览器页面报错405!

首先看浏览器的报错页面 后端控制台正常 可以明显的看出是因为我们提交的method是不被允许的&#xff0c;这就说明是我们的 请求方式的问题&#xff0c;常见的请求方式有 post,get.大家如果不知道自己默认的请求方式是get或者post,我们可以在继承HttpServlet的时候继承doGet(),…