目  录

一、实验目的和要求

二、实验实现思路及步骤

1、实验思路

2、实验步骤

3、实验方案

三、主要开发工具

四、实验效果及实现代码

1、购物车数据库构建实现

(1)建立javaee-project数据库

(2)建立t_cart数据表

(3)建立t_cartdetail数据表

(4)建立t_goods数据表

(5)建立t_goodstype数据表

(6)建立t_order数据表

(7)建立t_orderdetail数据表

(8)建立t_user数据表

(9)建立t_useraddress数据表

2、购物车注册模块功能实现

(1)购物车注册验证

(2)购物车注册重置

(3)购物车注册成功

(4)购物车注册激活

3、购物车登录模块功能实现

(1)购物车账号登录

(2)购物车登录信息重置

4、购物车前台商品展示模块功能实现

(1)购物车数据信息呈现

(2)购物车商品记录查询

(3)购物车酒水饮料信息查看

(4)购物车饼干糕点信息查看

(5)购物车休闲零食信息查看

5、购物车后台商品维护模块功能实现

(1)购物车购物信息查看

(2)购物车购物信息清空

(3)购物车订单信息查看

6、购物车购物模块功能实现

(1)购物车商品购买

(2)送货地址填写

五、遇到的问题和解决方法

六、心得体会


一、实验目的和要求

        (1) 掌握SpringBoot框架的使用。

        (2) 购物车系统的需求分析和设计。

        (3) 实现购物车系统的功能,包括:商城前台商品展示、商城后台商品维护、购物车模块等功能。


二、实验实现思路步骤

1、实验思路

        (1)设计一个包括购物车数据表(t_cart)、购物车细节数据表(t_cartdetail)、商品信息数据表(t_goods)、商品类型数据表(t_goodstype)、规则数据表(t_order)、规则描述数据表(t_orderdetail)、用户信息数据表(t_user)、用户地址数据表(t_useraddress)的数据库(javaee-project)来存储购物车数据信息。

        (2)创建SpringBoot项目并在Java中创建相关的包以及在包中创建对应的类文件,在entity包中创建商品实体类,定义需要展示的商品信息,如商品名称、价格、库存量、图片等。

        (3)在dao包中创建商品数据访问接口,定义与商品数据访问相关的方法,如获取商品列表、添加商品等。

        (4)在service包中创建商品服务类,实现商品维护和购物车管理等业务逻辑。

        (5)在controller包中创建商品控制器,处理前端请求,调用商品服务类的方法来处理请求,并返回相应的响应结果。

        (6)在utils包中创建工具类,封装常用的工具方法,如字符串处理、日期处理等。

        (7)创建Controller层:Controller层负责处理用户请求并调用服务层的业务逻辑,处理HTTP请求,将请求参数转化为entity对象,并调用service层的方法。

2、实验步骤

        (1)确定购物车数据表(t_cart)、购物车细节数据表(t_cartdetail)、商品信息数据表(t_goods)、商品类型数据表(t_goodstype)、规则数据表(t_order)、规则描述数据表(t_orderdetail)、用户信息数据表(t_user)、用户地址数据表(t_useraddress)的属性信息。

        (2)在entity包中实现商品实体类,定义需要展示的商品信息,如商品名称、价格、库存量、图片等。

        (3)在dao包中实现商品数据访问接口,定义与商品数据访问相关的方法,如获取商品列表、添加商品等,使用注解的方式进行数据库操作。

        (4)在service包中实现商品服务类,实现商品维护和购物车管理等业务逻辑,调用商品数据访问接口的方法来获取数据,处理业务逻辑,并返回结果。

        (5)在controller包中实现商品控制器,处理前端请求,调用商品服务类的方法来处理请求,并返回相应的响应结果。使用@RequestMapping注解或请求处理方法将请求映射到相应的处理方法。

        (6)在utils包中实现工具类,封装常用的工具方法,如字符串处理、日期处理等。

        (7)在SpringBoot应用程序的配置文件(application.yml)中配置数据库连接信息、缓存配置、消息队列配置等。

        (8)配置SpringBoot应用程序的启动类(Application),添加@SpringBootApplication注解,并启动应用程序。

3、实验方案

        (1)使用MySQL建立基于SpringBoot框架的购物车需要使用的数据库(javaee-project)以及数据表(t_cart、t_cartdetail、t_goods、t_goodstype、t_order、t_orderdetail、t_user、t_useraddress),并通过调用数据库中的购物车数据信息数据实现商城前台商品展示、商城后台商品维护、购物车模块等功能。

        (2)根据课本、PPT和老师课堂中讲解的内容,使用IDEA-Java编译软件制作基于Spring Boot框架的购物车。

        (3)将代码编写过程中遇到的问题及时的进行记录并在课后向老师进行提问,将遇到的问题进行及时的处理和解答,并将所有的问题和解决方法进行汇总归纳。

        (4)完成最终的项目以及基于SpringBoot框架的购物车的实验报告,最后进行实验报告排版的检查并提交。


三、主要开工具

        IDEA-Java开发工具、Navicat-MySQL开发工具


四、实验效果实现代码

1、购物车数据库构建实现

(1)建立javaee-project数据库

        打开SQLYog进行数据库的创建,数据库创建完毕以后再在数据库中添加购物车数据表(t_cart)、购物车细节数据表(t_cartdetail)、商品信息数据表(t_goods)、商品类型数据表(t_goodstype)、规则数据表(t_order)、规则描述数据表(t_orderdetail)、用户信息数据表(t_user)、用户地址数据表(t_useraddress),对应的数据库构建界面如图1-1所示:

图1-1 数据库构建界面

        核心代码:

CREATE DATABASE javaee-project;USE javaee-project;

(2)建立t_cart数据表

        a、t_cart数据表属性设置

        购物车数据信息数据表(t_cart)包括商品ID(id)、关联IDuid)、商品价格money,对应的t_cart属性设置界面如图1-2所示:

图1-2 t_cart属性设置界面

        核心代码:

CREATE TABLE `t_cart` (`id` int NOT NULL AUTO_INCREMENT,`uid` int DEFAULT NULL,`money` bigint DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb3

        b、t_cart数据表信息

        通过Sql语句进行购物车数据信息数据表(t_cart)的创建并在数据表中添加一部分购物数据信息记录,对应的t_cart数据信息界面如图1-3所示:

图1-3 t_cart数据表信息界面

(3)建立t_cartdetail数据表

        a、t_cartdetail数据表属性设置

        购物车描述信息数据表(t_cartdetail)包括ID(id)、购物车ID(cid)、购物ID(gid)、数量(num)和价格(money),对应的t_cartdetail属性设置界面如图1-4所示:

图1-4 t_cartdetail属性设置界面

        核心代码:

CREATE TABLE `t_cartdetail` (`id` int NOT NULL AUTO_INCREMENT,`cid` int DEFAULT NULL,`gid` int DEFAULT NULL,`num` int DEFAULT NULL,`money` bigint DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3

        b、t_cartdetail数据表信息

        通过Sql语句进行购物车描述信息数据表(t_cartdetail)的创建并在数据表中添加一部分购物数据信息记录,对应的t_cartdetail数据信息界面如图1-5所示:

图1-5 t_cartdetail数据表信息界面

(4)建立t_goods数据表

        a、t_goods数据表属性设置

        商品信息数据表(t_goods)包括商品ID(id)、商品名称(name)、价格(price)、公共数据(pubdate)、商品类型(typeName)、信息值(intro)、图片(picture)、标记(flag)和标识(star),对应的t_goods属性设置界面如图1-6所示:

图1-6 t_goods属性设置界面

        核心代码:

CREATE TABLE `t_goods` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(50) DEFAULT NULL,`price` bigint DEFAULT NULL,`pubdate` date DEFAULT NULL,`typeName` varchar(20) DEFAULT NULL,`intro` varchar(200) DEFAULT NULL,`picture` varchar(150) DEFAULT NULL,`flag` int DEFAULT NULL COMMENT '1上架 2下架',`star` int DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb3

        b、t_goods数据表信息

        通过Sql语句进行商品信息数据表(t_goods)的创建并在数据表中添加一部分商品数据信息记录,对应的t_goods数据信息界面如图1-7所示:

图1-7 t_goods数据表信息界面

(5)建立t_goodstype数据表

        a、t_goodstype数据表属性设置

        商品类型信息数据表(t_goodstype)包括ID(id)、商品名称(name)、等级(level)、大类名称(parentName)和标志(flag),对应的t_goodstype属性设置界面如图1-8所示:

图1-8 t_goodstype属性设置界面

        核心代码:

CREATE TABLE `t_goodstype` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,`level` int DEFAULT NULL COMMENT '1或2',`parentName` varchar(20) DEFAULT NULL,`flag` int DEFAULT NULL COMMENT '1有效 2无效',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb3

        b、t_goodstype数据表信息

        通过Sql语句进行商品类型信息数据表(t_goodstype)的创建并在数据表中添加一部分商品类型数据信息记录,对应的t_goodstype数据信息界面如图1-9所示:

图1-9 t_goodstype数据表信息界面

(6)建立t_order数据表

        a、t_order数据表属性设置

        规则信息数据表(t_order)包括ID(id)、用户ID(uaid)、商品ID(uid)、商品价格(money)、标志(flag)和创建时间(createtime),对应的t_order属性设置界面如图1-10所示:

图1-10 t_order属性设置界面

        核心代码:

CREATE TABLE `t_order` (`id` varchar(100) NOT NULL,`uaid` int DEFAULT NULL,`uid` int DEFAULT NULL,`createtime` datetime DEFAULT NULL,`money` bigint DEFAULT NULL,`flag` int DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3

        b、t_order数据表信息

        通过Sql语句进行规则信息数据表(t_order)的创建并在数据表中添加一部分规则数据信息记录,对应的t_order数据信息界面如图1-11所示:

图1-11 t_order数据表信息界面

(7)建立t_orderdetail数据表

        a、t_orderdetail数据表属性设置

        规则描述信息数据表(t_orderdetail)包括ID(id)、商品ID(gid)、规则ID(oid)、商品价格(money)和商品数量(num),对应的t_orderdetail属性设置界面如图1-12所示:

图1-12 t_orderdetail属性设置界面

        核心代码:

CREATE TABLE `t_orderdetail` (`id` int NOT NULL AUTO_INCREMENT,`gid` int DEFAULT NULL,`oid` varchar(100) DEFAULT NULL,`money` bigint DEFAULT NULL,`num` int DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb3

        b、t_orderdetail数据表信息

        通过Sql语句进行规则描述信息数据表(t_orderdetail)的创建并在数据表中添加一部分规则描述数据信息记录,对应的t_orderdetail数据信息界面如图1-13所示:

图1-13 t_orderdetail数据表信息界面

(8)建立t_user数据表

        a、t_user数据表属性设置

        用户信息数据表(t_user)包括ID(id)、角色(role)、用户名(username)、密码(password)、等级(gender)、创建时间(createtime)、标志(flag)和活动号(activatecode),对应的t_user属性设置界面如图1-14所示:

图1-14 t_user属性设置界面

        核心代码:

CREATE TABLE `t_user` (`id` int NOT NULL AUTO_INCREMENT,`role` int DEFAULT NULL COMMENT '角色类型 0管理员 1会员',`username` varchar(50) DEFAULT NULL,`password` varchar(50) DEFAULT NULL,`email` varchar(30) DEFAULT NULL,`gender` varchar(2) DEFAULT NULL,`createtime` datetime DEFAULT NULL,`flag` int DEFAULT NULL COMMENT,`activatecode` varchar(50) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb3

        b、t_user数据表信息

        通过Sql语句进行用户信息数据表(t_user)的创建并在数据表中添加一部分用户数据信息记录,对应的t_user数据信息界面如图1-15所示:

图1-15 t_user数据表信息界面

(9)建立t_useraddress数据表

        a、t_useraddress数据表属性设置

        用户地址信息数据表(t_useraddress)包括ID(id)、用户名(name)、手机号(phone)、细节(detail)、用户ID(uid)和标识(flag),对应的t_useraddress属性设置界面如图1-16所示:

图1-16 t_useraddress属性设置界面

        核心代码:

CREATE TABLE `t_useraddress` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(50) DEFAULT NULL,`phone` varchar(20) DEFAULT NULL,`detail` varchar(150) DEFAULT NULL,`uid` int DEFAULT NULL,`flag` int DEFAULT n m  NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3

        b、t_useraddress数据表信息

        通过Sql语句进行用户地址信息数据表(t_useraddress)的创建并在数据表中添加一部分用户地址数据信息记录,对应的t_useraddress数据信息界面如图1-17所示:

图1-17 t_useraddress数据表信息界面

2、购物车注册模块功能实现

(1)购物车注册验证

        在用户进行购物车注册的时候,直接点击购物车页面右上角的注册按钮即可进行相关信息的注册,对应的用户注册界面如图2-1所示:

图2-1 用户注册界面

        核心代码:

@RequestMapping("userregister")public String register(User user, Model model, HttpSession session) {// 创建激活码String acode = RandomUtils.createActive();user.setActivatecode(acode);if (userService.save(user)) {// 新增成功session.setAttribute("acode", acode);// 发送激活码EmailUtils.sendEmail(user);return "registerSuccess";} else {model.addAttribute("registerMsg", "服务器开小差,请稍后再来");return "register";}}@RequestMapping("goodstypejson")@ResponseBodypublic List<GoodsType> showjson() {return service.queryByLevel();}

(2)购物车注册重置

        注册内容全部输入完成后如果需要改变大量的数据信息则点击重置按钮进行填写信息的重置清空,对应的购物车注册重置界面如图2-2所示:

图2-2 购物车注册重置界面

        核心代码:

@RequestMapping("userloginout")public String loginout(String t, HttpSession session) {if (t != null) {session.removeAttribute("adminuser");return "admin/login";} else {session.removeAttribute("user");return "index";}}

(3)购物车注册成功

        注册内容全部输入成功后即可进行对应账号的注册操作,对应的购物车注册成功界面如图2-3所示:

图2-3 购物车注册成功界面

        核心代码:

@RequestMapping("usercheckname")@ResponseBodypublic ResultBean checkname(String name) {// 创建激活码if (userService.checkName(name)) {return ResultBean.setSuccess("OK");} else {return ResultBean.setError("ERROR");}}

(4)购物车注册激活

        a、购物车注册激活界面

        用户注册完毕购物车后需要对自己的账号进行激活处理,只有激活后才可以正常登录,点击现在激活按钮进行账号激活,如果不想激活则可以点击返回主页进入到主页界面,对应的购物车注册激活界面如图2-4所示:

图2-4 购物车注册激活界面

        核心代码:

@RequestMapping("/activate")public String checkCode(String e, String c, HttpSession session) {if (userService.activateUser(e, c)) {// 激活成功return "login";} else {return "index";}}

        b、QQ邮箱跳转界面

        进入到注册页面后选择使用QQ邮箱进行账号注册后页面会跳转到对应的QQ邮箱界面,对应的QQ邮箱界面如图2-5所示:

图2-5 QQ邮箱界面

        核心代码:

@RequestMapping("usercheckemail")@ResponseBodypublic ResultBean chakeemail(String email) {// 创建激活码if (userService.checkEmail(email)) {return ResultBean.setSuccess("OK");} else {return ResultBean.setError("ERROR");}}

        c、QQ邮箱链接激活界面

        进入到QQ邮箱界面后点击收件箱进行激活链接的查看,然后点击对应的链接即可完成账号的激活操作,对应的QQ邮箱链接激活界面如图2-6所示:

图2-6 QQ邮箱链接激活界面

        核心代码:

@RequestMapping("userregister")public String register(User user, Model model, HttpSession session) {// 创建激活码String acode = RandomUtils.createActive();user.setActivatecode(acode);if (userService.save(user)) {// 新增成功session.setAttribute("acode", acode);// 发送激活码EmailUtils.sendEmail(user);return "registerSuccess";} else {model.addAttribute("registerMsg", "服务器开小差,请稍后再来");return "register";}}

3、购物车登录模块功能实现

(1)购物车账号登录

        a、账号密码信息填写

        点击购物车右上角的登录按钮进行对应账号的登录操作,在对应的输入框中输入对应的内容信息即可,对应的账号密码信息填写界面如图2-1所示:

图2-1 账号密码信息填写界面

        核心代码:

@RequestMapping("/userlogin")public String login(String username, String password, Model model, HttpSession session,String code) {String code1 = (String) session.getAttribute("code");if(StrUtils.empty(code1,code)||code1.compareTo(code)!=0){model.addAttribute("loginMsg", "验证码错误");return "login";}if (!StrUtils.empty(username, password)) {User user = userService.getUserByName(username);if (user != null) {// 校验密码if (user.getPassword().equals(MD5Utils.md5(password))) {// 正确// 记录登录信息到会话中session.setAttribute("user", user);Cart cart = cartService.queryByUid(user.getId());session.setAttribute("cart", cartService.queryByUid(user.getId()));// 页面跳转return "index";}}}model.addAttribute("loginMsg", "用户名或密码错误");return "login";}

        b、账号登录成功

        自己的账号、密码以及验证码填写完毕并且无误后点击对应的登录按钮即可完成对应的登录操作,对应的账号登录成功界面如图2-2所示:

图2-2 账号登录成功界面

        核心代码:

@RequestMapping("adminLogin")public String adminLogin(String username, String password, HttpServletRequest request) {if (!StrUtils.empty(username, password)) {User user = userService.getUserByName(username);if (user != null) {// 校验密码if (user.getPassword().equals(MD5Utils.md5(password))) {// 正确// 记录登录信息到会话中request.getSession().setAttribute("adminuser", user);// 页面跳转return "admin/admin";}}}request.setAttribute("loginMsg", "用户名或密码错误");return "admin/login";}

(2)购物车登录信息重置

        登录的相关信息填写完毕后如果需要修改的内容比较多的话可以点击对应的重置按钮进行输入内容的重置清空操作,对应的购物车登录信息重置界面如图3-3所示:

图3-3 购物车登录信息重置界面

        核心代码:

@RequestMapping("userdel")@ResponseBodypublic int checkname(int id) {return userService.deleteByid(id);}

4、购物车前台商品展示模块功能实现

(1)购物车数据信息呈现

        项目创建完毕后启动项目,在购物车的首页可以看到所有商家发布的商品以及商品的数据信息,并会将购物数据按4条为一行进行分行划分处理操作,为购物车添加了色彩渲染,对应的购物车信息呈现界面如图4-1所示:

图4-1 购物车信息呈现界面

        核心代码:

@RequestMapping("getGoodsListByTn")public String goodsbytn(String tn, Model model) {model.addAttribute("glist", goodsService.queryByType(tn));return "goodsList";}

(2)购物车商品记录查询

        a、键入查询信息

        当需要查看指定商品数据信息时,可以在购物车最上方的搜索框中输入自己想要查询的数据记录,此处采用了模糊查询的方式,对应的键入查询界面如图4-2所示:

图4-2 键入查询界面

        核心代码:

@RequestMapping("addGoods")public String save(MultipartFile file, Goods goods, HttpServletRequest request)throws IllegalStateException, IOException {File dir = FileUtils.createDir("D:\\eclipse-workspace\\chapter16\\WebContent\\fmwimages");File desFile = new File(dir, FileUtils.createFileName(file.getOriginalFilename()));file.transferTo(desFile);goods.setPicture(dir.getName() + "/" + desFile.getName());goods.setFlag(1);//上架if (goodsService.save(goods)) {return "addGoods";} else {request.setAttribute("msg", "添加失败,重新再来");return "addGoods";}}

        b、查看查询结果

        在搜索框中输入自己想要查询的内容后点击回车键即可完成查询操作,对应的查询结果会显示输出到页面中,对应的查询结果界面如图4-3所示:

图4-3 查询结果界面

        核心代码:

@RequestMapping("getGoodsIndex")@ResponseBodypublic List<List<Goods>> goodsindex(HttpServletResponse response) throws IOException {return goodsService.queryIndex();}

(3)购物车酒水饮料信息查看

        在购物车页面的最上方点击酒水饮料模块后即可进入到对应的酒水饮料模块,对应的酒水饮料结果界面如图4-4所示:

图4-4 酒水饮料结果界面

        核心代码:

@RequestMapping("getGoodsById")public String goodsbyid(int id, Model model) {model.addAttribute("goods", goodsService.querySingle(id));return "goodsDetail";}

(4)购物车饼干糕点信息查看

        在购物车页面的最上方点击饼干糕点模块后即可进入到对应的饼干糕点模块,对应的饼干糕点查看结果界面如图4-5所示:

图4-5 饼干糕点结果界面

        核心代码:

@RequestMapping("getGoodsList")public String goodslist(Model model) {model.addAttribute("goodsList", goodsService.queryAll());return "admin/showGoods";}@RequestMapping("deleteGoodsType")@ResponseBodypublic String deleteGoodsType(HttpServletRequest req, int count) {service.deleteType(count);return "success";}

(5)购物车休闲零食信息查看

        在购物车页面的最上方点击休闲零食模块后即可进入到对应的休闲零食模块,对应的休闲零食结果界面如图4-6所示:

图4-6 休闲零食结果界面

        核心代码:

@RequestMapping("selectByNameAndPub")public String queryNameAndPub(String name, String pubdate, Model model) {List<Goods> goods = goodsService.queryNameAndPub(name, pubdate);model.addAttribute("goodsList", goods);return "admin/showGoods";}

5、购物车后台商品维护模块功能实现

(1)购物车购物信息查看

        用户将商品添加到自己的购物车后可以通过点击页面右上角的购物车进行购物车购物信息的查看操作,对应的购物车购物信息查看界面如图5-1所示:

图5-1 购物车购物信息查看界面

        核心代码:

@RequestMapping("selectOrderByNameAndFlag")public String selectByNameAndFlag(String username, Integer status, Model model) {model.addAttribute("orderList", service.selectByNameAndFlag(username, status));return "admin/showAllOrder";}

(2)购物车购物信息清空

        如果需要清空自己的购物车购物信息的话可以直接点击清空购物车按钮进行相关数据信息的清空操作,对应的购物车购物信息清空界面如图5-2所示:

图5-2 购物车购物信息清空界面

        核心代码:

@RequestMapping("deleteOrder")public String deleteById(int id, Model model) {model.addAttribute("od", service.deleteById(id));return "orderDetail";}

(3)购物车订单信息查看

        用户将商品订单提交到自己的购物车后可以通过点击页面右上角的我的订单进行商品订单信息的查看操作,对应的购物车订单信息查看界面如图5-3所示:

图5-3 购物车订单信息查看界面

        核心代码:

@RequestMapping("getOrderDetail")public String list(String oid, HttpSession session, Model model) {model.addAttribute("od", service.queryOrderDetailById(oid));return "orderDetail";}@RequestMapping("goodstypeshowadd")public String showadd(HttpServletRequest request, Model model) {model.addAttribute("gtlist", service.queryByLevel());return "addGoodsType";}

6、购物车购物模块功能实现

(1)购物车商品购买

        a、购物车商品信息查看

        通过账号进入到购物车后点击自己喜欢的商品后即可进入到对应的商品信息界面,对应的购物车商品信息界面如图6-1所示:

图6-1 购物车商品信息界面

        核心代码:

@RequestMapping("addOrder")public String add(int t, int aid, HttpSession session, Model model) {User user = (User) session.getAttribute("user");String oid = RandomUtils.createOrderId();boolean res = false;if (t == 1) {// 直接下单res = service.insertDirect(user.getId(), oid, aid, (CartDetail) session.getAttribute("direct"));} else {// 购物车下单res = service.save(oid, user.getId(), aid);}}

        b、商品加入购物车

        选择商品后如果还需要购买其他的商品则可以点击加入购物车按钮将商品加入到购物车中,对应的商品加入购物车成功界面如图6-2所示:

图6-2 商品加入购物车成功界面

        核心代码:

@RequestMapping("getAllOrder")public String all(Integer t, Integer aid, Model model) {model.addAttribute("orderList", service.queryAll());return "admin/showAllOrder";}

        c、商品直接购买

        选择商品后如果直接购买选中的商品则可以点击直接购买按钮即可进行直接购买,对应的商品直接购买界面如图6-3所示:

图6-3 商品直接购买界面

        核心代码:

@RequestMapping("getDirectOrder")public String direct(Goods gs, Model model, HttpSession session) {User user = (User) session.getAttribute("user");List<ViewCart> cds = new ArrayList<>();ViewCart cd = new ViewCart();cd.setGid(gs.getId());cd.setMoney(gs.getPrice());cd.setPrice(gs.getPrice());cd.setNum(1);cd.setName(gs.getName());cds.add(cd);CartDetail detail = new CartDetail();model.addAttribute("cartList", cds);model.addAttribute("addList", uaSrervice.queryByUid(user.getId()));model.addAttribute("type", 1);// 转发return "order";}

        d、商品订单提交

        进入页面后选择自己的收货地址并进行订单的提交即可完成对应的购买工作,对应的商品订单提交界面如图6-4所示:

图6-4 商品订单提交界面

        核心代码:

@RequestMapping("getOrderList")public String olist(HttpSession session, Model model) {User user = (User) session.getAttribute("user");model.addAttribute("orderList", service.queryByUid(user.getId()));return "orderList";}

        e、商品订单支付

        完成订单提交后进入到对应的支付界面,在支付界面可以选择自己的支付方式进行相关商品的支付,对应的商品订单支付界面如图6-5所示:

图6-5 商品订单支付界面

        核心代码:

@RequestMapping("selectOrderByNameAndFlag")public String selectByNameAndFlag(String username, Integer status, Model model) {model.addAttribute("orderList", service.selectByNameAndFlag(username, status));return "admin/showAllOrder";}

(2)送货地址填写

        a、收货地址信息填写

        进入到收获信息界面后在对应的输入框中输入对应的个人数据信息,对应的收货地址信息填写界面如图6-6所示:

图6-6 收货地址信息填写界面

        核心代码:

@RequestMapping("goodstypeadd")public String add(GoodsType goodsType, HttpServletRequest request, Model model) {if ("1".equals(goodsType.getParentName())) {goodsType.setLevel(1);goodsType.setParentName(null);} else {goodsType.setLevel(2);}goodsType.setFlag(1);if (service.save(goodsType)) {return "redirect:getGoodsType";} else {model.addAttribute("msg", "服务器异常,请稍后再来");return "redirect:goodstypeshowadd";}}

        b、收货地址信息添加

        收获信息填写完毕后检查无误即可对自己的数据信息进行添加处理,对应的收货地址信息添加界面如图6-7所示:

图6-7 收货地址信息添加界面

        核心代码:

@RequestMapping("selectByNameAndFlag")public String queryNameAndFlag(String name, int flag, Model model) {model.addAttribute("gtlist", service.queryNameAndFlag(name, flag));return "/admin/showGoodsType";}

        c、收货地址信息设置

        收货地址信息添加完毕后即可对相应的数据信息进行设置操作,可以将其中的数据信息设置为默认收货地址,对应的收货地址信息设置界面如图6-8所示:

图6-8 收货地址信息设置界面

        核心代码:

@RequestMapping("getOrderView")public String viewlist(HttpServletRequest request, Model model) {Cart cart = (Cart) request.getSession().getAttribute("cart");User user = (User) request.getSession().getAttribute("user");model.addAttribute("type", 2);request.setAttribute("cartList", cartService.queryCart(cart.getId()));request.setAttribute("addList", uaSrervice.queryByUid(user.getId()));return "order";}

五、遇到的问题和解决方法

        1、运行问题:启动Tomcat的过程中,出现端口被占用的情况。

解决方法:对服务器进行配置,将服务器运行的端口号改为别的端口即可(找到Tomcat安装目录下的文件“/conf/server.xml”->使用记事本或写字板打开文件,在文件中找到“Connector port=8080”->将“8080”改为“8888”,然后保存配置文件->重启Tomcat服务器)。

        2、运行问题:无法成功引入Spring Boot Starter Web依赖。

解决方法:检查项目配置文件(如pom.xml)确保正确添加了Spring Boot Starter Web的依赖项,并且与Spring Boot版本兼容,如果问题仍然存在,尝试更新Maven或Gradle插件。

        3、项目问题:JSP页面中遇到编码问题。

解决方法:可以先检查JSP页面、JavaBean以及数据库的编码设置是否一致,可以手动在代码中设置编码格式,也可以在web.xml文件中配置全局的编码过滤器。

        4、项目问题:JSP页面无法正确地显示数据。

解决方法:检查JSP页面中是否包含错误的HTML标签、CSS样式或JavaScript代码,这些代码可能会干扰数据的显示,也可以检查JavaBean中的数据是否被正确地存储、处理和输出。

        5、项目问题:JSP页面无法获取到JavaBean中的数据。

解决方法:确保JavaBean中需要获取的数据已经被正确地赋值,可以在JSP页面中使用EL表达式或者使用Java代码片段的方式获取数据。

        6、项目问题:JSP页面中的表单无法提交。

解决方法:检查表单中的请求方法是否正确,是否存在未填写的必填项,是否存在重复的表单参数等错误,同时也可以检查网络连接是否正常。

        7、项目问题:页面跳转异常。

解决方法:检查代码实现,确保页面跳转的 URL 是否正确,是否遗漏了必要的转发或者重定向操作;另外还可以通过在浏览器中查看控制台日志来定位问题。

        8、项目问题:请求参数获取失败。

解决方法:检查代码实现,确保请求参数的名称、类型和格式都与服务器端代码中一致,还可以通过在浏览器中查看网络请求信息来定位问题。

        9、项目问题:项目运行后页面出现了404错误。

解决方法:由于在连接数据库的配置文件中数据库名错误导致的,将数据库的名字修改为自己的数据库名称后再次启动错误消息。

        10、项目问题:项目运行后页面出现了500错误。

解决方法:由于没有把类名写到配置文件的中,所以Tomcat就找不该类,此时我们把类名加入进去就可以正常访问了。

        11、项目问题:无法创建Spring Boot项目。

解决方法:检查开发工具是否已经正确配置了Spring Boot的模板和插件,确保按照官方文档的步骤来创建项目。

        12、项目问题:无法正确显示商品信息。

解决方法:检查数据模型和数据访问层是否正确设计,并且商品信息的获取和展示逻辑是否正确实现。可以使用debug模式进行排查,查看是否有数据返回以及返回的数据是否正确。

        13、项目问题:无法实现商品的分类展示和热门推荐。

解决方法:是由于数据模型设计不合理或者算法实现有问题,需要重新审视数据结构和算法设计并考虑使用合适的算法来计算商品的分类和热门程度。

        14、项目问题:购物车模块无法正常工作。

解决方法:检查购物车模型和数据访问层的设计是否合理,购物车的增删改查操作是否正确实现,同时需要检查订单生成和支付逻辑是否有问题。可以使用debug模式进行排查,查看是否有数据被正确修改或者新的订单被正确生成。

        15、项目问题:用户无法登录或注册。

解决方法:检查身份验证和注册逻辑是否正确实现,同时需要确保应用已经正确配置了合适的认证服务和密码哈希算法。如果问题仍然存在,可以检查网络连接和服务器状态。

        16、项目问题:管理员无法登录后台页面。

解决方法:确认管理员的账户和密码是否正确,如果问题依然存在检查Spring Security配置是否正确,包括认证方式、角色权限等。

        17、项目问题:商城前台页面样式混乱。

解决方法:是由于CSS样式冲突或者缺失导致的,需要检查CSS文件和HTML结构,确保样式的优先级和覆盖规则被正确使用,还需要确保前端资源(如CSS、JS文件)已经被正确引入和加载。

        18、项目问题:商品图片无法加载。

解决方法:确认图片资源路径是否正确,并且图片文件已经存在,检查服务器配置确保图片资源可以被正确访问和加载,还需要考虑图片格式的兼容性和文件大小的问题。

        19、项目问题:购物车结算金额计算错误。

解决方法:是由于商品价格或数量在购物车中存储或计算时出错导致的,需要检查购物车模型和结算逻辑,确保商品的价格和数量被正确处理,可以使用单元测试来验证购物车结算功能的正确性。

        20、项目问题:订单生成失败或重复生成。

解决方法:确认订单生成逻辑是否正确实现,并且订单的唯一性被保证,检查数据库操作是否正确处理事务和并发请求,可以考虑使用乐观锁或悲观锁来避免并发问题。


六、心得体会

        1、通过这次实验我更加深入地理解了SpringBoot框架的使用和价值,从项目创建、依赖管理到具体的业务逻辑实现,SpringBoot都为我提供了一个快速、稳定的开发环境。特别是在解决一些常见问题时,如数据库连接、安全问题等,SpringBoot的自动配置和约定大于配置的理念使得问题迅速得到解决。

        2、在进行购物车系统的需求分析和设计时,我深深体会到了系统设计的重要性,一个好的系统设计不仅能提高开发效率,更能确保系统的稳定性和扩展性。而在这个过程中,我也学到了如何根据业务需求进行合理的数据模型设计、模块划分以及接口定义。

        3、在这次实验中我实践了前后端分离的开发模式,通过使用API进行前后端的数据交互,我更加清晰地认识到了前后端分离的优势,如提高开发效率、增强系统扩展性等。同时也学到了如何设计合理的API接口和使用合适的数据传输格式。

        4、在开发过程中我体验到了测试的重要性,无论是单元测试、集成测试还是性能测试,都为确保系统的质量和稳定性提供了有力的保障。通过这次实验,我学到了如何编写有效的测试用例,如何进行性能测试和安全测试,以及如何根据测试结果进行针对性的优化。

        5、在实验过程中我遇到了各种各样的问题,从环境配置、框架使用到具体的业务逻辑实现。通过查阅文档、搜索资料和不断尝试,我逐渐解决了这些问题,这个过程不仅锻炼了我的问题解决能力,更让我体会到了不断学习和探索的重要性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88506.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88506.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88506.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DAS3D: Dual-modality Anomaly Synthesis for 3D Anomaly Detection 论文精读

题目&#xff1a;DAS3D: Dual-modality Anomaly Synthesis for 3D Anomaly Detection 题目&#xff1a;DAS3D&#xff1a;用于三维异常检测的双模态异常合成 论文地址&#xff1a;ECCVW 2024 2410 Dual-modality 双模态 Anomaly Synthesis 异常合成 for 3D Anomaly Detection…

EasyCVR视频汇聚平台国标接入设备TCP主动播放失败排查指南

部分客户现场的下级平台通过国标级联接入安防监控系统EasyCVR后&#xff0c;只能通过TCP主动的播放方式进行播放&#xff08;并不是所有下级平台都支持tcp主动播放&#xff0c;模式需下级平台支持&#xff09;&#xff0c;但是有些平台刚接入的时候发现不能播放。核心原因分析&…

linux打包指令和移动指令

在Linux中&#xff0c;常用的文件夹打包命令是 tar&#xff0c;它可以将文件夹压缩打包成 .tar、.tar.gz、.tar.bz2 等格式的文件。以下是具体用法&#xff1a; 1. 基础打包&#xff08;不压缩&#xff0c;生成 .tar 文件&#xff09; 将文件夹 folder 打包为 folder.tar&#…

神经符号AI:结合深度学习和符号逻辑的下一代AI

神经符号AI&#xff1a;结合深度学习和符号逻辑的下一代AI当AI医生解释诊断时&#xff0c;它不仅能指出医学影像中的异常像素模式&#xff0c;还能引用临床指南中的第三条第二款&#xff0c;推演病理发展的逻辑链条——这正是神经符号AI赋予机器的“理性之光”。2025年初&#…

SpringBoot JWT

jsonwebtoken 引依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.12.3</version></dependency> 测试一下&#xff0c;jwt是2个带逗号的3段字符串 官网参考&#xff1a;JSON …

读取QPS 10万,写入QPS 1000,如何设计系统架构?

你是否也曾深陷在臃肿的领域模型&#xff08;Domain Model&#xff09;的泥潭&#xff0c;一个 User 或 Order 实体类&#xff0c;既要处理复杂的业务逻辑和数据校验&#xff0c;又要承载各种为前端展示而生的DTO转换&#xff0c;导致模型越来越胖&#xff0c;读写性能相互掣肘…

UE5 Rotate 3 Axis In One Material

首先没有用旋转矩阵&#xff0c;我用过旋转矩阵&#xff0c;传进去的角度旋转的角度和欧拉角传进去角度旋转出来的不一样&#xff0c;就没有用最后用的RotateAboutAxis&#xff0c;这个玩意儿研究老半天&#xff0c;只能转一个轴&#xff0c;角度和欧拉角的一样的最后研究出Rot…

计算机网络实验——访问H3C网络设备

一、实验目的1. 熟悉H3C路由器的开机界面&#xff1b;2. 通过Console端口实现对上电的H3C路由器的第一次本地访问&#xff1b;3. 掌握H3C设备命名等几个常用指令&#xff1b;4. 掌握如何将H3C设备配置为Telnet服务器&#xff1b;5. 掌握如何将H3C设备配置为Telnet客户端并实现访…

【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(四)

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题 &#x1f349;学习方向&#xff1a;C/C方向 ⭐️人生格言&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为…

Vim 指令

Vim 是一款功能强大但学习曲线陡峭的文本编辑器&#xff0c;核心在于其模式化操作。掌握常用指令能极大提升效率。以下是指令分类整理&#xff1a;一、核心模式切换 (必须掌握&#xff01;)i&#xff1a;在光标前进入 插入模式 (Insert Mode)a&#xff1a;在光标后进入 插入模式…

vue2中使用xgplayer播放流视频

1、官网 2、安装后无法播放时&#xff0c;经测试&#xff0c;需要降低版本 "xgplayer-hls": "2.2.2","xgplayer": "2.31.6"改为以上版本可以正常播放 3、完整使用 &#xff08;1&#xff09;引入 import xgplayer import hlsjsPlayer…

Jmeter进阶篇(35)完美解决Jmeter转换HTML报告报错“Begin size 0 is not equal to fixed size 5”

今天博主在使用Jmeter运行完压测,使用生成的csv文件,运行以下命令: C:\apache-jmeter-5.2.1\bin>jmeter -g C:\res.csv -o C:\report生成HTML报告时,发现报错“Begin size 0 is not equal to fixed size 5”。 问题原因 原因是我:本地用的是JDK17,但Jmeter5.2.1仅支…

linux中tcpdump抓包中有组播数据,应用程序收不到数据问题

问题描述服务器运行正常&#xff0c;维保需要&#xff0c;重启服务器后应用程序无法收到组播的媒体数据。百思不得其解。原因分析最终的定位原因是 linux系统的自我保护机制导致的。rp_filter&#xff08;反向路径过滤&#xff09;是Linux内核的一个安全特性&#xff0c;用于防…

人工智能-基础篇-29-什么是低代码平台?

低代码平台&#xff08;Low-Code Development Platform, LCDP&#xff09;是一种通过可视化界面和少量代码&#xff08;或无需代码&#xff09;快速构建应用程序的开发工具。它的核心目标是通过简化开发流程&#xff0c;降低技术门槛&#xff0c;使企业能够更高效地响应业务需求…

PyTorch随机擦除:提升模型抗遮挡能力

PyTorch中内置的随机擦除&#xff08;Random Erasing&#xff09;数据增强通过torchvision.transforms.RandomErasing实现&#xff0c;以下是原理和用法的详细说明&#xff1a;核心原理正则化作用&#xff1a; 随机擦除在训练图像上随机遮盖一个矩形区域&#xff0c;模拟遮挡场…

微信小程序交互精髓:点击操作与状态管理实战

目录 一、点击事件绑定&#xff1a;bindtap 与 catchtap 的正确使用 基础语法对比 事件对象详解 二、点击切换选中状态&#xff1a;数据驱动视图的实现 1. 单元素状态切换 2. 多元素单选状态 3. 多元素多选状态 三、样式动态切换&#xff1a;数据绑定与 CSS 的完美结合 …

Language Models are Few-Shot Learners: 开箱即用的GPT-3(二)

接上一篇 Approach 前面的摘要和Introduction做了一些概要性的介绍,论文在第二章,也就是approach中,介绍了模型的设计,zero,one,few-shot的设计等等。 这一章一开头就说,GPT-3的结构和GPT-2的结构一样,只是在相应的把模型尺寸,数据规模,训练时间等增加了。Our bas…

【养老机器人】核心技术

1. 毫米波雷达如何检测心跳和呼吸&#xff1f;毫米波雷达&#xff08;通常工作在60GHz或77GHz频段&#xff09;可以探测到人体胸腔的微米级位移&#xff0c;而心跳和呼吸会引起胸腔的周期性运动&#xff1a;呼吸&#xff1a;幅度较大&#xff08;约5-10毫米&#xff09;&#x…

二 Javascript 入门

我们 从已经知道了 Javascript的历史以及什么是Javascript&#xff0c;那实际编写的时候在哪里编写&#xff1f; script 标签 HTML 为我们提供了无数的标签来做无数的事情。例如&#xff0c; 用于为段落添加边距&#xff0c; 用于使文本加粗&#xff0c; 用于在网页上嵌入音…

《信息技术服务监理 第5部分:软件工程监理规范》(GB/T 19668.5-2018)标准解读

《信息技术服务监理 第 5 部分&#xff1a;软件工程监理规范》&#xff08;GB/T 19668.5-2018&#xff09;是规范软件工程监理服务的国家标准&#xff0c;旨在为软件工程监理的规划设计、招标、设计、实施、验收等阶段及相关支持过程提供明确的监理要求、服务内容和实施要点。 …