博客地址: https://blog.csdn.net/2303_76227485/article/details/151068976
视频演示: https://www.bilibili.com/video/BV1tNaJzYEkn/
毕业设计所有选题地址: https://github.com/codegitpro/allProject
本项目前后端分离(可以改为ssm版本),分为用户、管理员两种角色。
- 注册、登录、公告信息、公交路线查看、车站信息查看、车票购买、支付、评价、订单取消、个人信息、密码修改
- 车票售票统计、车票收入统计、用户管理、公交路线管理、车站管理、车票管理、订单管理、评价管理、通知管理、轮播图管理、公告管理、菜单管理
后端技术栈:
- Springboot
- mybatisPlus
- Mysql
- Maven
前端技术栈:
- Vue3
- Vue-router
- axios
- elementPlus
- echarts
基础环境 :IDEA/eclipse, JDK1.8, Mysql5.7及以上, Maven3.6, node14, navicat
所有项目以及源代码本人均调试运行无问题 可支持远程调试运行
前台访问地址:http://localhost:8082
用户账户密码:用户账号1/123456
后台访问地址:http://localhost:8083
管理员账户密码:admin/admin
-
使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并执行项目的sql文件
-
使用IDEA/Eclipse导入server_code项目,若为maven项目请选择maven,等待依赖下载完成
-
修改application.yml里面的数据库配置,src/main/java/com/SpringbootSchemaApplication.java启动后端项目
-
vscode或idea打开client_code后台项目
-
在编译器中打开terminal,执行npm install 依赖下载完成后执行 npm run serve,执行成功后会显示访问地址
-
vscode或idea打开manage_code后台项目
-
在编译器中打开terminal,执行npm install 依赖下载完成后执行 npm run serve,执行成功后会显示访问地址
1、使用redis保存用户登录信息,可显著减少用户登录验证的响应时间。在高并发场景下,相比传统数据库查询,Redis能显著降低延迟并提升系统吞吐量。 可以设置合适的过期时间,这样可以确保用户的登录状态在一定时间后自动失效,提高系统的安全性和可靠性
2、使用javamail来实现邮件发送,在用户注册的时候可以发送邮件来进行验证码校验,保护用户的安全
public <T> T get(String key, Class<T> clazz, long expire) {
String value = valueOperations.get(key);
if(expire != NOT_EXPIRE){
redisTemplate.expire(key, expire, TimeUnit.SECONDS);
}
return value == null ? null : fromJson(value, clazz);
}
public <T> T get(String key, Class<T> clazz) {
return get(key, clazz, NOT_EXPIRE);
}
public String get(String key, long expire) {
String value = valueOperations.get(key);
if(expire != NOT_EXPIRE){
redisTemplate.expire(key, expire, TimeUnit.SECONDS);
}
return value;
}
public String get(String key) {
return get(key, NOT_EXPIRE);
}
public void delete(String key) {
redisTemplate.delete(key);
}
@RestController
@RequestMapping("/menu")
public class MenuController {
@Autowired
private MenuService menuService;
/**
* 后台列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,MenuEntity menu,
HttpServletRequest request){
EntityWrapper<MenuEntity> ew = new EntityWrapper<MenuEntity>();
PageUtils page = menuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, menu), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,MenuEntity menu,
HttpServletRequest request){
EntityWrapper<MenuEntity> ew = new EntityWrapper<MenuEntity>();
PageUtils page = menuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, menu), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( MenuEntity menu){
EntityWrapper<MenuEntity> ew = new EntityWrapper<MenuEntity>();
ew.allEq(MPUtil.allEQMapPre( menu, "menu"));
return R.ok().put("data", menuService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(MenuEntity menu){
EntityWrapper< MenuEntity> ew = new EntityWrapper< MenuEntity>();
ew.allEq(MPUtil.allEQMapPre( menu, "menu"));
MenuView menuView = menuService.selectView(ew);
return R.ok("查询菜单成功").put("data", menuView);
}
}








































