软件工程个人总结-社团管理系统
组号:第一组
一、引言
1.1 项目介绍——社团管理系统
1.1.1 项目背景
在当代大学生的日常生活中,社团是必不可少的一个部分。如果仅仅是通过纸质文档进行管理的话,不但需要耗费大量的人力和资源,也会给管理造成不便。为了提升社团组织者对社团管理的便利性,我们小组选择社团管理这一主题,开发一款便于社团管理的系统。
1.1.2 系统简介
社团管理系统的操作角色分为游客、学生、管理员三种类型,集成了社团浏览、活动浏览、社团申请、活动创建、活动审批、入社申请审批、社团内部事务管理等功能模块,为社团管理者与学生提供一个方便的数字化管理平台。
1.2 相关文档汇总
二、项目制作过程——个人分工
2.1 起步
2.1.1 需求分析
参与组内讨论,根据学生、普通社员、社长、管理员4种角色来提出需求
2.1.2 墨刀原型
两项简易墨刀原型
2.2 设计图
详见 设计图文档
2.2.1 用例图
全部用例图
2.2.2 顺序图
仅参与确认
2.2.3 类图
整个类图的绘制与类图说明
2.3 技术选型
2.3.1 查阅与学习
由于组内成员没有相关项目开发经验,如前端框架、路由、接口信息接受发送,后端框架、信息接受与发送。因此学习、试错花费大量时间。
查找资料,并最终选定的技术选型如下:
-
前端
- Vue 2.0 前端框架,优点:数据动态绑定、将模块封装成组件以便重复使用、利于分工
- Element UI 提供大量实用性组件
- Vue-admin-template 集成了路由、本地存储、Token携带、Api发送接收等功能,使项目开发更高效
- Easy-mock 接口未完善前,提供前端随机生成的mock数据
-
后端
-
Java 编程语言选择
-
JWT 服务器生成Token令牌,客户端将其存储在RequstHeader中自动发送,便于用户认证
-
MD5 密码二次加密
-
Shiro 安全框架,用于角色及权限判断,并提供过滤器
-
Redis 利用redis自带的生命周期功能,做token缓存
-
Maven 模块化管理
-
Mongodb 尝试NoSql数据库
-
SpringBoot SOA服务核心框架、使用其封装的annotation,便于request请求接收与自定义异常信息
-
-
开发工具
-
Webstorm WEB端开发工具
-
Idea Java后端开发工具,自带SFTP上传服务器功能,共享后端代码
-
Postman 团队分享型接口数据测试工具。优点:可保存、可共享、分类清晰、reques请求选项充沛等
-
Mongodb Compass 连接Mongodb的GUI。缺点:自动断开连接后必须重启
-
2.3.2 准备工作
编码前做的工作如下
-
前端:
- 提前用过vue和部分模版,为前端组员解释部分框架使用方法,及分析模版的部分设计思路与实现。
-
后端:
- Redis服务器环境搭建、部分Java框架搭建
- 接口异常控制类、Jedis测试类、自定义Realm类、JWTFilter类
- 登录注册等接口测试成功
2.3.3 分工策略
前后端各两人。
我负责后端接口、权限认证,另一名后端组员搭建Spring和数据库环境、提供数据库调用、逻辑操作方法及数据库维护。由我进行与前端的沟通,并向另一名后端组员提出方法逻辑与参数,有种分层不干扰的感觉。
2.4 后端接口
2.4.1 权限验证
- 利用JWT包将用户登录id与登录期限时间进行HMAC256加密获得Token
- 运用Shiro框架,当客户访问接口时先验证token,角色权限符合则通过,否则过滤
了解机制:Shiro整合JWT实现无状态鉴权机制(Token)
参考代码: shiro 框架的构建以及与 JWT 的整合
2.4.2 Redis缓存
- 利用Redis自带的Expire为token添加生命周期
- 当token未过期时,如果再次进行操作则自动延长Redis中的生命周期,jedis.set中的参数创建状态为 “XX”
2.4.3 接口
-
Java接口类汇总
- ActivityController 活动管理接口
- AnnouncementController 通知管理接口
- AssociationController 社团管理接口
- AwardController 奖项管理接口
- ExceptionController 异常类
- JoinFormController 社团申请表管理接口
- UserController 用户管理接口
-
接口使用说明
- 接口具体细节可查看我编写的接口文档
-
遇到的困难(网上没找到的)
-
前端 Request Payload 和 RequestBody 的数据如何获取?
- 解决: 在Controller中前者通过 @RequestBody捕获,后者是 @Valid
-
Jedist 连接时 出现protected mode错误
- 解决: 为redis设置auth,即在redis.conf中添加requirepassword
-
@RestControllerAdvice 和@ExceptionHandler 不能处理Shiro Realm中抛出的异常AuthenticationException,在网上找不到可行的方法。。。
理想:
现实:
-
解决: 建立一个捕获/unauthorized 的Controller类
代码:
结果返回:
-
-
2.4.4 部署
与前端组员测试所有接口,与后端另一位组员修复已知bug,非常重要且花时间的环节。
基本测试结束之后,将后端程序打包部署到服务器。
2.5 不足
- 仅通过角色分配权限,没有另外的权限表
- 后端的二次加密没能理解MD5的加盐,仅在前端加密基础上再次进行MD5加密
- 初次使用Java各类框架,没有查看过相关文档,理解浅薄,比如某些annotation的作用范围只在一个包内。
- ·········
三、项目总结
做的时候砍了很多一开始想到的东西,组内针对某些需求如何实现进行了许多争论。分析原因,是当初需求分析不够具体。
例如一开始想到有活动通知、社团通知,前端人员在编写页面时本打算在创建活动时一并发送该活动的创建通知,如果这样做考虑到活动需要审批,那么通知也需要设置状态,显然不合理,其实只要在活动申请通过后系统自动生成通知即可。
在项目进行中必然存在关键路径,其中某个人的延误(例如bug、技术难点、摸鱼等)会导致整个项目的停滞。但仔细一想,如果需求分析做的足够具体那其他人至少可以做好应接工作,当然也不能只埋头干自己的。
另外,社团管理作为我的第一个小组作业,让我受益良多,比如:
- 分工要明确,如WEB前端可以细分到每张页面、模块,角色权限路由管理等
- 借鉴别的组,加入惩罚制度(防止个别人基本没有进度)
- 周报告中每个人完成了什么要仔细记录,对比工作量
- 每周进行一次组内汇报,记录好进度、规划好计划
从我做后端接口的角度来看,盲目的堆砌代码对项目没有太大帮助,而与前端和数据库的沟通、对接口需要提前约定、及时解决对接问题、按时完成任务才是对团队最大的帮助。其次,团队气氛非常重要,假设某人一周只做了5分钟的工作量,不仅加重相同模块其他组员的负担,还影响团队氛围,汇报时尴尬的不行。
四、课程建议
上啥课都发呆型选手。。。上课风格与理论知识没啥建议
-
需求分析很重要,但我们一开始写的东西完全像是介绍有什么功能,而不是具体如何实现,后来看了老师给的参考才恍然大悟。可能提前给出参考会更好
-
在大三之前基本没有需要合作的大作业,对于下一届计科,或许可以让他们在暑假短学期做一些预备。例如:
- 团队类型的项目(选做),提前熟悉团队工作模式,让大家熟悉一下彼此的能力与耐力(谁比较水)
- 积累一些前后端的经验
-
在原型检查阶段,经老师提醒目前市场APP开发经验的重要性。那么在公布大作业的时候可以顺带做一下说明,引起学生注意。
来源:oschina
链接:https://my.oschina.net/u/4392850/blog/4282038