最近在学习Spring Boot,以前看有人说学习编程最好的方法就是本身动手写程序,有个前辈推荐本身作一个模拟在线票务系统的服务。我便本身动手作了一个。前端
该项目的实现采用了Spring Boot + MyBatis,集成Spring Security和JWT实现用户的认证和受权。git
项目结构以下:github
主要有三个对象:用户、票和订单。数据库
用户有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.添加邮件服务功能,实现注册成功向注册邮箱发送邮件。