目 录
一、实验目的和要求
(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)、关联ID(uid)、商品价格(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")
@ResponseBody
public 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")
@ResponseBody
public 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")
@ResponseBody
public 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")
@ResponseBody
public 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")
@ResponseBody
public 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")
@ResponseBody
public 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、在实验过程中我遇到了各种各样的问题,从环境配置、框架使用到具体的业务逻辑实现。通过查阅文档、搜索资料和不断尝试,我逐渐解决了这些问题,这个过程不仅锻炼了我的问题解决能力,更让我体会到了不断学习和探索的重要性。