前言

最近在学习Spring Boot,之前看有人说学习编程最好的方法就是自己动手写程序,有个前辈推荐自己做一个模拟在线票务系统的服务。我便自己动手做了一个。

该项目的实现采用了Spring Boot + MyBatis,集成Spring Security和JWT实现用户的认证和授权。

项目结构如下:

图片描述

设计思路

主要有三个对象:用户、票和订单。

用户有ID、用户名、密码、头像在服务器地址URL等个人信息。用户的方法有:注册(/customer/register)、登录(/customer/login)、查看用户资料(/customer/myProfile)、上传头像(/customer/uploadAvatar)。

票有ID、车次、始发站、目的地、出发时间、到达时间、座位类型、座位号、价格、是否被预定及用户ID的属性。方法有:根据始发站、目的地和出发日查找可购买的车次信息(/ticket/search)。这里使用了MyBatis插件PageHelper来做分页查询。

订单的属性有:ID、用户、票。订单的方法有:购票(/order/new)、退票(/order/roll)、查看“我的订单”(/order/myOrder)。购票和退票的过程要使用数据库事务来处理。

GitHub上Release版本 0.9主要实现了以上的功能。1.0集成了Spring Security,使用JWT实现用户的认证和授权。

认证

认证的过程如下:向/login地址发送POST请求,提交包含用户名密码的表单,程序进入JWTLoginFilter的attemptAuthentication方法,接收并解析用户凭证。 然后进入CustomerAuthenticationProvider的authenticate方法将接受到的用户信息与数据库中信息做比较, 如果一致,生成令牌并进入JWTLoginFilter的successfulAuthentication方法,在该方法中生成JWT并将JWT作为response的header返回至前端。

在之后的请求中只要将JWT设置为request header的“Authorization”字段传给后端,后端就可以解析该header获取用户信息。

数据库

数据库名为ticketmanagement,有三张表:customer、ticket、orderform(这里因为order是SQL关键字,表名为order会产生运行时错误)。

customer:

图片描述

ticket:

图片描述

orderform:

图片描述

后续思路

1.SQL优化,数据库操作处理做的还比较粗糙,在高并发操作数据库的情况下可能产生响应时间较长等问题。后续可以通过优化SQL来提高性能。SQL优化这里博主还是掌握的还不是很好,希望有思路和建议的朋友可以在下面留言或者和我联系来帮助我。

2.将用户认证、授权和票务管理服务拆分,做成微服务形式。微服务是当下的热点,有解耦和分布式等优点。也是对自己技术栈的积累。

3.添加邮件服务功能,实现注册成功向注册邮箱发送邮件。

github:https://github.com/Gene1994/TicketManagement

我的微信:kyoccu