基于Java+SpringBoot+vue+node.js的图书购物商城系统详细设计和实现
Posted java李杨勇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Java+SpringBoot+vue+node.js的图书购物商城系统详细设计和实现相关的知识,希望对你有一定的参考价值。
🍅 作者主页:Java李杨勇
🍅 简介:Java领域优质创作者🏆、【java李杨勇】公号作者✌ 简历模板、学习资料、面试题库【关注我,都给你】
🍅文末获取源码联系🍅
前言介绍:
随着信息技术的不断发展,我们现在已经步入了信息化的时代了,而信息时代的代表便是网络技术的日渐成熟,而现在网络已经和我们的生活紧密的联系起来了,我们不敢想象没有网络我们的生活会像怎么样,也许就像食物中没有调料现在的生活离开了网络会变得索然无味。通过网络我们可以足不出户的做许多事情,例如图书、工作、娱乐、学习,购物、交友和购物等等许多我们数之不尽的事情,而就是因为网络我们的生活变得多姿多彩,或许有时甚至帮我们省下不少的时间和给予了我们更多的机遇。图书商城网站对我们来说就有这些意义。图书网站商城主要是一些企业为了不流失因为某种原因而没有到商店店里选购商品的图书商品客人而设计的一个通过 Internet 就能进行方便购物的系统,图书商城网站的诞生为商家们提供了很多的机遇。另外一个原因是现在网上购物对图书商品人们生活和工作中所产生的压力是很有用的,所以现在网购的需求量在不断的提升,然而有很大一部分人还是没有时间去选购自己喜欢的图书商品, 所以图书商城网站应运而生。在图书商城网站诞生之后,用户可以在空余的时间通过互联网来查看大量品种的家具商品信息,从而很方便地购买到自己心仪的图书之类的、在另外一方面就是提高了图书商家的销售额。总的来说,图书商城网站既满足了很多人的需要,也不会影响到工作或者浪费了休息的时间,它是一个很有意义的系统
完整地址:2022Java毕业设计项目:图书购物商城系统(java+springboot+vue实现)-寒假了快卷起来
功能截图:
用户登录:分为管理员和普通用户进行登录、也可以在这里进行用户注册。
录入相关用户信息进行用户注册。
前端用户首页:用户登录后、可以查看新上架的书籍和新闻等书籍、点击进入详情查看购买书籍、加入购物车以及对自己感兴趣的图书书籍收藏等操作和查看修改个人信息等。
管理员首页:图书商城系统管理员登录后主要有如下功能模块:用户个人信息管理、修改密码、图书分类管理、图书商品详情管理、首页轮播图管理、新闻资讯管理、书籍列表管理、订单信息管理和发货信息管理等。
书籍分类管理:
新闻资讯管理:
添加和修改:
书籍列表管理:管理员可以添加、修改、删除和查询书籍列表信息
书籍详情:
订单管理:管理员可以查看订单信息、对订单状态进行修改、以及发货状态等操作 。
发货信息管理:
前端书籍详情页:
书籍详情页:查看书籍详情信息、可以加入购物车和收藏等查看、也可以查看用户评论信息等
填写购物车信息等。
我的个人中心:
工具语言:
开发工具:IDEA 2021.3、navicat for mysql 、postman。
开发语言:java、jdk1.8、mysql5、node.js 14。
硬件环境:Windows 10操作系统、Google浏览器等。
主要技术:springboot、mybatis-plus、vue、element UI、mysql等
关键代码:
用户相关:
package com.controller;
/**
* 登录相关
*/
@RequestMapping("users")
@RestController
public class UserController
@Autowired
private UserService userService;
@Autowired
private TokenService tokenService;
/**
* 登录
*/
@IgnoreAuth
@PostMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request)
UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
if(user==null || !user.getPassword().equals(password))
return R.error("账号或密码不正确");
String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
return R.ok().put("token", token);
/**
* 注册
*/
@IgnoreAuth
@PostMapping(value = "/register")
public R register(@RequestBody UserEntity user)
// ValidatorUtils.validateEntity(user);
if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null)
return R.error("用户已存在");
userService.insert(user);
return R.ok();
/**
* 退出
*/
@GetMapping(value = "logout")
public R logout(HttpServletRequest request)
request.getSession().invalidate();
return R.ok("退出成功");
/**
* 密码重置
*/
@IgnoreAuth
@RequestMapping(value = "/resetPass")
public R resetPass(String username, HttpServletRequest request)
UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
if(user==null)
return R.error("账号不存在");
user.setPassword("123456");
userService.update(user,null);
return R.ok("密码已重置为:123456");
/**
* 列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,UserEntity user)
EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
return R.ok().put("data", page);
/**
* 列表
*/
@RequestMapping("/list")
public R list( UserEntity user)
EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
ew.allEq(MPUtil.allEQMapPre( user, "user"));
return R.ok().put("data", userService.selectListView(ew));
/**
* 信息
*/
@RequestMapping("/info/id")
public R info(@PathVariable("id") String id)
UserEntity user = userService.selectById(id);
return R.ok().put("data", user);
/**
* 获取用户的session用户信息
*/
@RequestMapping("/session")
public R getCurrUser(HttpServletRequest request)
Long id = (Long)request.getSession().getAttribute("userId");
UserEntity user = userService.selectById(id);
return R.ok().put("data", user);
/**
* 保存
*/
@PostMapping("/save")
public R save(@RequestBody UserEntity user)
// ValidatorUtils.validateEntity(user);
if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null)
return R.error("用户已存在");
userService.insert(user);
return R.ok();
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody UserEntity user)
// ValidatorUtils.validateEntity(user);
userService.updateById(user);//全部更新
return R.ok();
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids)
userService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
拦截配置:
package com.config;
@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport
@Bean
public AuthorizationInterceptor getAuthorizationInterceptor()
return new AuthorizationInterceptor();
@Override
public void addInterceptors(InterceptorRegistry registry)
registry.addInterceptor(getAuthorizationInterceptor()).addPathPatterns("/**").excludePathPatterns("/static/**");
registry.addInterceptor(getAuthorizationInterceptor()).addPathPatterns("/**").excludePathPatterns("/upload/**");
// registry.addInterceptor(getAuthorizationInterceptor()).addPathPatterns("/**").excludePathPatterns("/virtuel/**");
super.addInterceptors(registry);
/**
* springboot 2.0配置WebMvcConfigurationSupport之后,会导致默认配置被覆盖,要访问静态资源需要重写addResourceHandlers方法
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/resources/")
.addResourceLocations("classpath:/static/")
.addResourceLocations("classpath:/upload/")
.addResourceLocations("classpath:/admin/")
.addResourceLocations("classpath:/front/")
.addResourceLocations("classpath:/public/");
registry.addResourceHandler("/upload/**").addResourceLocations("file:D:/work/");
super.addResourceHandlers(registry);
全局yml配置:
# Tomcat
server:
tomcat:
uri-encoding: UTF-8
port: 8080
servlet:
context-path: /springbootUCW7v
spring:
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/springbootUCW7v?useUnicode=true&characterEncoding=utf-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
username: root
password: 123456
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
resources:
static-locations: classpath:/testStatic/,classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
#mybatis
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.entity
global-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: 1
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
field-strategy: 2
#驼峰下划线转换
db-column-underline: true
#刷新mapper 调试神器
refresh-mapper: true
#逻辑删除配置
logic-delete-value: -1
logic-not-delete-value: 0
#自定义SQL注入器
sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
call-setters-on-nulls: true
#springboot 项目mybatis plus 设置 jdbcTypeForNull (oracle数据库需配置JdbcType.NULL, 默认是Other)
jdbc-type-for-null: 'null'
#文件虚拟路径
virtuel:
filePath: C:/Users/Administrator/Desktop/lyy/
数据库设计:
数据库名:springboot-book
文档版本:V1.0.0
文档描述:图书商城系统数据库表设计描述
表config (配置文件)
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 说明 |
1 | id | bigint | 20 | 0 | N | Y | |
2 | name | varchar | 100 | 0 | N | N | 配置参数名称 |
3 | value | varchar | 100 | 0 | Y | N | 配置参数值 |
表dingdanxinxi (订单信息)
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 说明 |
1 | id | bigint | 20 | 0 | N | Y | |
2 | addtime | timestamp | 19 | 0 | N | N | |
3 | dingdanbianhao | varchar | 200 | 0 | Y | N | 订单编号 |
4 | shujimingcheng | varchar | 200 | 0 | Y | N | 书籍名称 |
5 | fenlei | varchar | 200 | 0 | Y | N | 分类 |
6 | fengmian | varchar | 200 | 0 | Y | N | 封面 |
7 | jiage | varchar | 200 | 0 | Y | N | 价格 |
8 | shuliang | int | 10 | 0 | Y | N | 数量 |
9 | zongjiage | varchar | 200 | 0 | Y | N | 总价格 |
10 | xiadanriqi | date | 10 | 0 | Y | N | 下单日期 |
11 | beizhu | varchar | 200 | 0 | Y | N | 备注 |
12 | yonghuming | varchar | 200 | 0 | Y | N | 用户名 |
13 | shouji | varchar | 200 | 0 | Y | N | 手机 |
14 | dizhi | varchar | 200 | 0 | Y | N | 地址 |
15 | ispay | varchar | 200 | 0 | Y | N | 是否支付 |
表discussshuji (书籍评论表)
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 说明 |
1 | id | bigint | 20 | 0 | N | Y | |
2 | addtime | timestamp | 19 | 0 | N | N | |
3 | refid | bigint | 20 | 0 | N | N | 关联表id |
4 | content | varchar | 200 | 0 | N | N | 评论内容 |
5 | userid | bigint | 20 | 0 | N | N | 用户id |
表fahuoxinxi (发货信息)
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 说明 |
1 | id | bigint | 20 | 0 | N | Y | |
2 | addtime | timestamp | 19 | 0 | N | N | |
3 | dingdanbianhao | varchar | 200 | 0 | Y | N | 订单编号 |
4 | shujimingcheng | varchar | 200 | 0 | Y | N | 书籍名称 |
5 | fengmian | varchar | 200 | 0 | Y | N | 封面 |
6 | shuliang | varchar | 200 | 0 | Y | N | 数量 |
7 | fahuoriqi | date | 10 | 0 | Y | N | 发货日期 |
8 | yonghuming | varchar | 200 | 0 | Y | N | 用户名 |
9 | shouji | varchar | 200 | 0 | Y | N | 手机 |
10 | dizhi | varchar | 200 | 0 | Y | N | 地址 |
11 | dingdanzhuangtai | varchar | 200 | 0 | N | N | 订单状态 |
表news (新闻资讯)
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | id | bigint | 20 | 0 | N | Y | ||
2 | addtime | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | |
3 | title | varchar | 200 | 0 | N | N | 标题 | |
4 | picture | varchar | 200 | 0 | N | N | 图片 | |
5 | content | longtext | 2147483647 | 0 | N | N | 内容 |
表shuji (书籍)
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 |
1 | id | bigint | 20 | 0 | N | Y |
2 | addtime | timestamp | 19 | 0 | N | N |
3 | shujibianhao | varchar | 200 | 0 | Y | N |
4 | shujimingcheng | varchar | 200 | 0 | N | N |
5 | fenlei | varchar | 200 | 0 | N | N |
6 | fengmian | varchar | 200 | 0 | Y | N |
7 | zuozhe | varchar | 200 | 0 | Y | N |
8 | <