这个项目实际上是我服务计算概论课的一部分,题目要求是:编写简单的旅行预算管理服务的接口并做一个调用它的程序。因为最近正好学习了springboot框架,就以此框架来完成我的作业。
Github项目:travel-springboot-demo
功能
按最开始的想法,有两张表,分别记录预算和记录开支。
id | total |
---|---|
int | double |
id,主键,自增长 | 预算金额 |
id | matter | spend |
---|---|---|
int | varchar | double |
id,主键,自增长 | 开支事项 | 花费金额 |
有四个接口,分别能添加开支,更改预算(实际写的过程中是添加预算记录,然后取id最大的条数),获取预算,获取已开支的总金额。
因为只是demo,重点是想体现着两类api的实现过程,所以功能上有些简陋。
项目说明
项目结构
SpendController对外提供接口,接收和发出数据;
SpendMapper:数据控制层,和UserMapper.xml一起实现对数据库的操纵
ItemSpend,TotalSpend:实体类
SpendService:服务层,数据和服务之间的连接,并在SpendServiceImpl中实现
application.properties:springboot配置文件,此处仅用户配置数据库及更改端口
application.properties
1 | # 数据库连接uri,最后的demo更改为自己的数据库名 |
实体类
放在entity包下,下面以ItemSpend类为例说明:
1 | // 此注解可用于替代getter和setter方法 |
dao
此类下存放操纵数据库的接口,此项目中以Mybatis为例,你也可以使用Jpa等。SpendMapper
类和mapper/SpendMapper.xml
配合使用,也可以直接采用@Select
等注解的形式直接写在SpendMapper中。以List\<ItemSpend\> getItemSpendList()
为例:
1 | //声明此类为mapper |
1 |
|
Service层
此层常以接口+实现的方式组织,用于处理从数据库中查询得到的数据和前台发来的请求,以TotalBudget getTotalBudget();
为例:
1 | // 声明此类为Service层 |
Controller层
实现对外的接口,主要是调用者请求数据的解析和被请求数据的内部获取和封装,以/add/budget
和/get/budget
为例:
1 | // 支持跨域 |
这样该方法的对外接口(以在本机运行为例):http://localhost:8098/api/trip/add/budget
已知bug
没有进行重复提交的限制,会因为网络卡顿出现重复提交;使用自定义注解@NoRepeatSubmit+Redis|内存缓存的形式解决了重复提交问题
原博主刚开始使用的是内存缓存的方法限制刷新时间为2秒,后来有评论提问集群下的如何解决,就又推出了使用Redis的解决方案。
该博主GitHub项目:gzz2017gzz/spring-boot2-example,第53/54
该文章链接:spring boot 防止重复提交