源码及数据库文件在文末链接中
🎉电脑商城项目
✨欢迎大家访问我的个人博客:随风起の博客🕶️详细信息如下
💖如果觉得本篇文章还不错的话,欢迎大家点赞👍+收藏❤️+评论🤞
目录
一、项目介绍
1.项目技术
springboot + mybatis + maven + ajax
2.项目数据库
t_user:用户表
t_product:产品表
t_address:用户地址表
t_order:订单主表
t_cart:购物车
t_order_item:订单详情表
t_dict_district:中国省市区表
t_product_cateory:产品分类表
3.项目截图及说明
说明:除了注册、登录、首页、商品详情页及静态页面未设置拦截,其余功能都需用户进行登录才能操作。
首页及购物车模块
- 热销排行以出售数量排序并从数据库中获取
商品详细页
点击加入购物车后,进入购物车界面
- 采用Pagehelper进行分页处理
- 多选商品点击结算一并进入结算界面
- 增减商品金额变化,同时在数据库发生变化
点击结算会将选中的商品进行结算
- 结算后会在数据库中生成对应的订单信息
用户模块
修改密码
- 用户的密码经过md5加密处理
修改个人资料
- 用户自定义信息,如果已经存在这些信息会异步显示
修改头像
- 用户上传头像,保存在服务器中
- 上传完成后,会异步显示
收货地址
- 查看用户的收货地址
新增收货地址
- 省市区从数据库中获取并异步显示
- 保存完信息后,会跳转到收货地址界面并进行显示
登录及注册模块
- 注册后的密码经过MD5加密
二、代码部分
部分代码如下:
1.application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/store
spring.datasource.username=root
spring.datasource.password=123456
mybatis.mapper-locations=classpath:mapper/*.xml
user.address.max-count=20
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB
mybatis.configuration.map-underscore-to-camel-case=true
pagehelper.helper-dialect=mysql
pagehelper.reasonable=true
2.UserController
package com.xxx.store.controller;
import com.xxx.store.controller.exception.*;
import com.xxx.store.entity.User;
import com.xxx.store.service.UserService;
import com.xxx.store.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@RestController
@RequestMapping("/users")
public class UserController extends BaseController{
@Autowired
private UserService userService;
@RequestMapping("regist")
public JsonResult<Void> regist(User user){
userService.regist(user);
return new JsonResult<>(OK);
}
@RequestMapping("login")
public JsonResult<User> login(String username, String password, HttpSession session){
User login = userService.login(username, password);
session.setAttribute("uid",login.getUid());
session.setAttribute("username",login.getUsername());
System.out.println("用户id:"+getUidFromSession(session)+"密码:"+getUsernameFromSession(session));
return new JsonResult<User>(OK,login);
}
@RequestMapping("change_password")
public JsonResult<Void> changePassword(String oldPassword,String newPassword,HttpSession session){
Integer uid=getUidFromSession(session);
String username = getUsernameFromSession(session);
userService.changePassword(uid,username,oldPassword,newPassword);
return new JsonResult<Void>(OK);
}
@RequestMapping("getInfo")
public JsonResult<User> getInfo(HttpSession session){
User user = userService.getByUid(getUidFromSession(session));
return new JsonResult<>(OK, user);
}
@RequestMapping("changeInfo")
public JsonResult<Void> changeInfo(HttpSession session,User user){
userService.changeInfo(getUidFromSession(session),getUsernameFromSession(session),user);
return new JsonResult<>(OK);
}
public static final int AVATAR_SIZE=10*1024*1024;
public static final List<String> AVATAR_TYPE=new ArrayList<>();
static {
AVATAR_TYPE.add("image/png");
AVATAR_TYPE.add("image/jpeg");
AVATAR_TYPE.add("image/gif");
AVATAR_TYPE.add("image/bmp");
}
@RequestMapping("changeAvatar")
public JsonResult<String> changeAvatar(HttpSession session, MultipartFile file){
if (file.isEmpty()){
throw new FileEmptyException("文件为空");
}
if (file.getSize()>AVATAR_SIZE){
throw new FileSizeException("文件大小超出限制");
}
if (!AVATAR_TYPE.contains(file.getContentType())){
throw new FileTypeException("文件类型不支持");
}
String upload = "E:\\JavaCode\\store\\src\\main\\resources\\static\\upload";
File dir = new File(upload);
if (!dir.exists()){
dir.mkdir();
}
String originalFilename = file.getOriginalFilename();
//获取后缀
String suffix=originalFilename.substring(originalFilename.lastIndexOf("."));
String filename=UUID.randomUUID().toString()+suffix;
File dest = new File(dir,filename);//空文件
try {
file.transferTo(dest);
}catch (FileStateException e){
throw new FileStateException("文件状态异常");
} catch (IOException e) {
throw new FileUploadException("文件读写异常");
}
String avatar="/upload/"+filename;
userService.changeAvatar(getUidFromSession(session),avatar,getUsernameFromSession(session));
return new JsonResult<>(OK,avatar);
}
}
3. 单元测试
订单Mapper测试
package com.xxx.store.mapper;
import com.xxx.store.entity.Cart;
import com.xxx.store.entity.Order;
import com.xxx.store.entity.OrderItem;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;
@SpringBootTest
public class OrderMapperTests {
@Autowired
OrderMapper orderMapper;
@Test
void insertOrder(){
Order order = new Order();
order.setUid(14);
order.setRecvName("456");
order.setRecvPhone("19345231589");
orderMapper.insertOrder(order);
}
@Test
void insertOrderItem(){
OrderItem orderItem = new OrderItem();
orderItem.setOid(1);
orderItem.setPid(10000001);
orderItem.setTitle("施耐德(Schneider) K15 经典款圆珠笔 (5支混色装)");
orderMapper.insertOrderItem(orderItem);
}
}
三、注意事项
这里是一些使用时的注意事项
1.修改路径
config文件中的LoginInterceptorConfigurer的资源地址,这里配置addResourceHandler和addResourceLocations,使得可以从磁盘中读取图片、视频、音频等,使用时注意改到自己的磁盘路径,这里我使用的是项目下的static/upload的绝对路径
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/upload/**")
.addResourceLocations("file:E:/JavaCode/store/src/main/resources/static/upload/");
}
UserController中创建upload文件夹的位置,这里我使用的是项目下的static/upload的绝对路径
2.分页数据设置
在CartController中我设置的是一页展示三条数据,每次显示两页
@RequestMapping({"","/"})
public JsonResult<PageInfo<CartVO>> getCart(@RequestParam(value = "pn",defaultValue = "1")Integer pn,HttpSession session){
PageHelper.startPage(pn,3);
List<CartVO> cart = cartService.getCartByUid(getUidFromSession(session));
PageInfo<CartVO> page = new PageInfo<>(cart,2);
return new JsonResult<>(OK,page);
}
四、源码链接
链接:https://pan.baidu.com/s/15XCUlqeIV3eUsILkJ3cJgQ
提取码:f31d
本文含有隐藏内容,请 开通VIP 后查看