项目概述
本项目的目的是实现软件创新实验室官网的开发,我选择的赛道是Java后端。本次项目采用SpringBoot集成SSM开发,旨在完成实验室官网的数据存储与后端处理。实现负责人给出的相应接口,并在此基础上进行适当的拓展(主要包括公告模块与活动模块)。
系统数据库设计
概念模型设计
本次设计,是通过负责人给出的接口,以及加上自己的理解和三范式的约束设计出来的数据库,主要包括了user_info,blog_info,activity_info,web_notice等实体,下面是各个主要实体的ER图。
用户信息概念模型
博文信息概念模型
活动信息概念模型
网站公告概念模型
各实体之间关系概念模型(为了可读性强,省略了实体的属性)
物理数据模型设计
设计时,将确定下来的实体对象的属性值映射为数据库表中的列,根据ER图中各个实体之间的关系向关系模型转换:
- 1:n的关系:将1对应的实体的主键当作外键,加入到n对应的实体的关系表中
- m:n的关系:转换为一个独立的关系模式,两个对应实体的主键都当作新的关系模式的外键
这样,我们就建立了一个初步的带有9个表的物理数据模型,系统的所有模块功能都围绕下面这9个表展开。
活动信息表(activity_info)
申请信息表(apply_info)
博文评论表(blog_comments)
博文信息表(blog_info)
博文点赞表(blog_like)
点赞通知表(message_like)
用户信息表(user_info)
公告用户是否已读表(user_notice)
网站公告表(web_notice)
系统功能设计
系统功能模块图
功能模块详细描述及演示
由于功能模块比较多,所以这里只挑一些比较复杂的模块进行描述。因为事先在数据库中保存了一些数据,所以还有每个功能模块的部分结果演示(所有的返回结果为了美观,直接展示JSON解析并格式化的结果!)
权限控制
发送验证码
用户在注册的时候,需要填写邮箱并向后台发送发送验证码的请求。后台接收到相应的邮箱,随机生成一个四位数的验证码,向该邮箱发送一封邮件,并返回JSON对象
请求url:http://localhost:8080/access/[email protected]
用户登录
用户登录网站,这里应该使用post进行传参,但是为了方便演示,使用了get的方法。登录的方式使用type来决定:1代表管理员登录,2代表实验室成员登录,3代表普通用户登录
请求url:http://localhost:8080/access/login?userName=admin&userPassword=123123&type=1
评论设计
获取博文评论
这里实现了两级评论的效果,可以通过参数来分页获取相应博文的评论
请求url:http://localhost:8080/blog/comments?blogId=1&pageNo=1&pageSize=2
博文信息管理
点赞操作
这里涉及到的东西比较多,用户点赞某篇博文,首先对点赞的表进行修改,然后对博文信息的表点赞数进行加一操作,然后返回相应的JSON对象(这里可以选择进行对作者发一封邮件,但是由于时间原因就没有去做,可以进行拓展)(取消点赞步骤类似,不再赘述)
请求url:http://localhost:8080/blog/like?blogId=1&userId=2
分页获取最近发布的博文
这是通过博文信息表中的发布时间进行排序,然后按照需要进行分页的读取
请求url:http://localhost:8080/blog/list?pageNum=1&pageSize=3
消息通知
获取自己的点赞消息通知
用户分页获得自己的博文的点赞消息,可以看到是哪个用户对自己的博文进行了点赞,已读的点赞消息不会在这里面(由于数据库记录了点赞者以及作者的id,所以后期可以拓展一些比如获得自己最近点赞的博文等等的请求)
请求url:http://localhost:8080/message/list?userId=1&pageNum=1&pageSize=2
根据消息id删除点赞消息
这里说一句,由于网站的规模比较小,所以这里采用的是逻辑删除,而不是物理删除,将消息的state修改为0即可
公告模块
发布公告请求
这里也是比较繁琐的,首先公告只有管理员可以发布,管理员发布公告之后,系统会向每个用户邮箱发送新的公告请求,然后会在数据库中,在公告用户是否已读表中添加该公告的相应的信息,用来表示用户是否已读该消息。
请求url:http://localhost:8080/notice/publish?userId=1&title=实验室公告3&content=这里是实验室公告3
活动模块
参加活动申请
这里涉及到的情况很多,比如活动的人数是否已满,活动是否在进行中还是已经结束等等。申请成功的话还要在活动信息表中的申请人数进行加一处理,然后返回JSON对象。
请求url:http://localhost:8080/activity/apply?activityId=1&userId=2
在这一模块的最后附上自己拓展的一些接口信息
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
总结本次项目开发遇到的问题
1.为了以后方便管理和拓展,如何设计源码的包结构?
使用开发的三层架构:在根据idea的Springboot自动生成的框架的基础上,在src/main/java包下又进行了分类管理,分出了controller,mapper,model,service,util这几个包,分别表示了控制层,数据访问层,模型层,业务逻辑层,以及一个常用的工具包。
2.如何格式化返给前端的JSON对象?
这里首先分析了接口信息中的JSON对象的共同特征,都是由成功标志,返回处理消息,返回状态码以及返回结果构成,所以就想到了用一个包装类把JSON包装起来,这样直接调用包装类的静态方法就可以获得一个格式化的JSON对象:
3.有关于返回的不同状态码的问题
这个问题是在用户注册以及用户登录的时候遇到的,因为这里有很多种情况,比如:用户名不存在,密码错误,服务器出错……每一个对应的状态码都不一样,所以就考虑在业务逻辑层返回给控制层的时候,直接返回一个状态码,然后控制层根据不同的状态码进行相应的JSON对象的返回(这里是使用了switch来实现的)。也比较容易实现日后的拓展,直接添加一条case语句即可。
4.发送邮箱验证码问题
这个由于以前没有遇到过,所以也是进行了百度,找到了几个比较有用的信息,可以直接使用springboot集成mail实现邮件服务。通过寻找资料也是很容易的就实现了相应的功能。
5.mybatis如何实现关联查询
这个问题出现在博文中要返回简要的用户信息,博文信息这个类中,有一个简要用户信息的类,所以通过查找资料,找到了一个association的关键词,它可以实现关联查询,也是成功解决了结果映射的这个问题。
6.一些零碎的小问题
开发中难免会遇到有些逻辑上想不通的情况,比如各种if语句的嵌套啊,代码怎么可以实现最简化……在遇到这些问题的时候,一定不能急躁,有的时候画一个流程图,可以更好地帮助你理清楚这其中的顺序,从而解决掉各种各样的bug!
项目完成后的感想与个人总结
首先十分感谢软件创新实验室可以给我们这些热爱项目开发的同学一个机会,可以学习到目前市面上主流使用的一些Java开发的框架,通过一个大作业来模拟真实项目开发,让我们能够提前了解和熟悉工作中是如何进行开发系统的。通过这不到两个月的学习,我大概的了解了maven,mybatis,spring,springmvc,springboot的相关基础知识,并通过大作业巩固了许多。在此也非常希望能够进入实验室,一起和志同道合的同学去追求自己心中的编程梦想。