142
社区成员




这个作业属于哪个课程 | 福大软工实践W班 |
---|---|
这个作业要求在哪里 | 软工实践——团队编程实战 |
这个作业的目标 | 开发一个抽奖平台 |
其他参考文献 | 《构建之法》、CSDN |
仓库地址:https://gitcode.net/SoftwareEngineering2022ClassW/followers/teampractice4/-/tree/master
访问地址:http://47.95.151.202/index.html#/
commit次数统计
学号 | commit次数 |
---|---|
051904112 | 20 |
221900223 | 13 |
221900225 | 7 |
221900305 | 4 |
221900309 | 10 |
221900325 | 4 |
221900331 | 4 |
221900334 | 12 |
221900413 | 6 |
221900424 | 17 |
本项目为web项目,搭载在阿里云服务器上。
前端:
开发工具为Visual Studio Code,开发语言为Ajax、js、css、HTML,框架为vue;运行环境为各类浏览器(谷歌浏览器、火狐浏览器等)。
后端:
开发工具为IntelliJ IDEA,开发语言为java,框架为springboot;运行环境为java环境。
本次开发基本完成基础功能要求,部分实现附加功能1和附加功能2。
前端设计实现过程
前端采用vue框架,并且引入了element ui。
通过axios请求与后端数据进行交互。
后端设计实现过程
后端采用springboot框架,集成了mybatis对数据库进行操作,项目结构图如下:
数据库创建了4张表:activity(抽奖活动信息表)、admin(管理员表)、user(用户表)、participant(参与活动信息表)。
activity:
participant:
user:
admin:
这里以实现返回抽奖活动信息为例子,来介绍如何通过springboot框架向前端提供接口。
首先在数据库里建立一张表格activity,里面存储了所有的抽奖活动信息。
然后创建一个POJO(Plain Ordinary Java Objects)实体类Activity,每一个成员变量对应数据库里的字段,实现相应的构造函数、set、get方法等。
接着创建一个dao(Data Access Object)ActivityDao类,该类为接口。Dao层实际上就是定义了简单的CRUD操作,相当于sql中的单条select,insert,upate,delete语句。这里定义了一些数据库的操作方法,主要是根据条件查找,返回相应数据。该接口通过mybatis来实现,创建一个ActivityMapper.xml,通过mybatis的语法实现对数据库的操作。
再创建service层:ActivityService接口和ActivityServiceImpl实现类。service层就是具体业务的实现,一般多次组合dao层的方法(dao层方法达到了重用目的)。
最后是控制层Controller,创建了ActivityController,在这里调用service类的方法,返回数据供前端调用。通过注解@RequestMapping("/activity"),前端可以访问该接口获取数据。
Tigger能够被持久化,这样即使在发布后,任务依然能够执行,不需要重新设定,同时也能够轻松暂停恢复触发器。SpringBoot中的定时任务都需要新建一个Java类并继承QuartzJobBean、实现executeInternal()。
- Scheduler:Quartz 中的任务调度器,通过 Trigger 和 JobDetail 可以用来调度、暂停和删除任务。
- Trigger:Quartz 中的触发器,是一个类,描述触发 Job 执行的时间触发规则。
- JobDetail:Quartz 中需要执行的任务详情,JobExecutionContext参数支持对定时任务的参数传递,通过jobDataMap的get方法即可取出参数。
- Job:Quartz 中具体的任务,包含了执行任务的具体方法。是一个接口,只定义一个方法 execute() 方法,在实现接口的 execute() 方法中编写所需要定时执行的 Job
JobDetail jobDetail = JobBuilder.newJob(Draw.class)
.withIdentity(String.valueOf(activityID))
.usingJobData("id", activityID) //传入参数
.storeDurably()
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.forJob(jobDetail)//关联上述的JobDetail
.withIdentity(String.valueOf(activityID))//给Trigger以ID起名
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withRepeatCount(0))// 重复次数 执行一次不重复
.startAt(date) //定时运行
.build();
后端接受前端传来的表单参数,在用户表中查找是否有相关记录;若数据库中存在该用户且密码正确,则返回登录成功的信息以及用户的姓名、手机号、地址等信息。
public Map<String,Object> login(@RequestBody Map<String,String> user, HttpServletRequest req){
Map<String,Object> result=new HashMap<>();
String phone=user.get("username");
String password=user.get("password");
User userInfo=userService.selectUserByPhone(phone,password);
if(userInfo!=null) {
HttpSession session = req.getSession();//先创建session
session.setAttribute("user", userInfo);
result.put("msg", "success");
result.put("name", userInfo.getName());
result.put("phone", userInfo.getPhone());
result.put("address", userInfo.getAddress());
result.put("ip", IpUtil.getIpAddr(req));
}
else{
result.put("msg", "failed");
}
return result;
}
前端建立store.js并引入vue和vuex,在接受到登录成功的信息后,将数据传入store.js中,并将vuex实例暴露出去,则用户中心等页面即可通过store获取并显示出用户的基本信息。
if(res.data.msg==="success"){
this.$store.commit('setUserData', {
name: res.data.name,
phone: res.data.phone,
address: res.data.address,
})
this.$router.push('/homePage');
通过session中的removeAttribute方法销毁用户的session,实现账号的登出。
public Object logout(HttpSession session){
session.removeAttribute("user");
return null;
}
用户通过填写以下表单发布活动,发布抽奖时可以选择奖品等级,如二等奖、三等奖:
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
<el-form-item label="活动名称" prop="name">
<el-input v-model="ruleForm.name"></el-input>
</el-form-item>
<el-form-item label="开始时间" required>
<el-col :span="11">
<el-form-item prop="date1">
<el-date-picker type="date" placeholder="选择日期" v-model="ruleForm.date1" style="width: 100%;"></el-date-picker>
</el-form-item>
</el-col>
<el-col class="line" :span="1">-</el-col>
<el-col :span="10">
...
</el-form>
点击发布活动的按钮后,将表单的信息通过axios传到后端,后端通过insert语句将活动信息加入activity表中。
public Object addActivity(@RequestBody Map<String,Object> activity) throws ParseException {
Activity activity1=new Activity();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
activity1.setFirst((String) activity.get("first"));
activity1.setSecond((String) activity.get("second"));
activity1.setThird((String) activity.get("third"));
...
activityService.addActivity(activity1);
return null;
}
后端通过数据库查询语句得到所有的活动信息列表,返回给前端:
public List<Activity> list() {
List<Activity> list = activityService.getActivityList();
return list;
}
提示输入用户名、密码,普通用户的用户名即为注册时的手机号,管理员为固定用户名:admin,密码:123456。
点击去注册进入注册界面。
确认密码可以对密码进行二次验证。
注册成功弹出提示信息。
登录成功后进入主页面。
点击抽奖活动展示活动列表。
点击发布抽奖,基础设置部分可以进行活动名称,开始时间,结束时间,参与人数,活动概要等设置。
奖品设置进行相关设置。
消息通知页面通知用户参与的抽奖信息。
用户中心提示基础信息和中奖信息。
管理员中心后端接口暂时没有实现,只是在前端填充了一些静态数据。
学号 | 工作内容 |
---|---|
051904112 | 后端小组长;数据库设计;后端部分(26%):开奖功能完善。 |
221900223 | 数据库设计;后端部分(18%):开奖功能初步实现。 |
221900225 | 数据库设计;前端部分(22%):登录注册页面的实现。 |
221900305 | 前端部分(18%):代码审查、界面设计。 |
221900309 | 数据库设计;后端部分(28%):登录注册接口的实现。 |
221900325 | 前端部分(14%):代码审查、界面设计。 |
221900331 | 组长;数据库设计;前端部分;博客撰写;后勤等。 |
221900334 | 数据库设计;后端部分(28%):开奖功能完善。 |
221900413 | 数据库设计;前端部分(22%):消息中心、用户中心、管理员中心页面的实现。 |
221900424 | 前端小组长;数据库设计;前端部分(22%):抽奖活动、发布抽奖页面的实现、前端架构。 |
学号 | 贡献度 |
---|---|
051904112 | 12.4% |
221900223 | 8.2% |
221900225 | 10.46% |
221900305 | 7.74% |
221900309 | 12.2% |
221900325 | 6.02% |
221900331 | 8.86% |
221900334 | 12.2% |
221900413 | 10.46% |
221900424 | 11.46% |
贡献度(100%)= 前端(43%)+ 后端(40%)+ 数据库设计(8%)+ 博客(6%)+ 组长/小组长(3%)
051904112
困难:
- 之前没怎么当过组长,对组员的了解和分工还不是很合理和清晰。编程的时候也感觉到后端的分工好像没那么容易,还需要多琢磨一下。
- 设计数据库没有理论上那么简单,如何在短时间内把具体的客户需求设计成合理的数据信息是挺难的一件事,在后面编码的时候也确实遇到了许多需要和组员协调的地方。
- 在向数据库插入数据时报错, Data too long for column 'password' 。
解决方法:
- 下次尽力在开始的时候明确合理分工,争取高效率、及时的和队友交流
- 理论还需要更多的实战经验去完善,在设计数据库之前也要很好的和组员们沟通后续的使用,避免在后面还出现数据不一致的情况
- 通过提示信息发现是数据库中的字段太短了,后面将它设长了
221900223
困难:
刚接触springboot,只会一些比较基本的,不是很会用,然后后端接口设计的时候不太明白要返回什么。
解决方法:
查询资料以后知道了前后端分离后端应该返回给前端数据形式。
221900225
困难:
前几次作业没有进行前后端分离,前端请求方面遇到一些困难,登录注册页面表单验证方面也比较繁琐。
解决方法:
通过百度和csdn查询,表单验证方面理清了验证的思路,添加合理的判断进行验证,巩固了vue的知识。
221900305
困难:
首先在技术上,刚学习了vue框架不久,并且没有进行过多的实战,导致一些看似简单的编码在动手实现时都会遇到预料之外的问题。例如,在项目启动时经常遇到This dependency was not found的问题,老是会忽略一些必要的依赖。有时vue中修改了数据,但视图却无法更新。还遇到了状态码400,并提示用户名和密码错误。
在团队合作上,这算是第一次的多人团队作业,从一开始就和自己做有很大的不同。一开始就用了许多时间在查询资料和工作的分配上,在编码过程中也经常遇到各个不同分工组员之间要相互协调的情况,所以我认为在团队合作上是比较困难的。
解决方法:
在技术上,编码过程中更加注意细节,时刻注意所写代码是否需要依赖。对于400的报错,经百度查询资料以及前后端的核对后发现,是由于前后端字段类型不一致。在合作上,我们为了解决团队协作问题,在各个时间段都找了可以一起编码的场所,面对面使得效率更高,沟通更充分。
221900309
困难:
- 提前学习过springboot的登录系统,不过在实战的时候还是出了许多问题。
- 启动项目时遇到Tomcat connector in failed state的错误
- 在和前端的队友对接的时候,就会发现刚开始的沟通不一致,导致了代码完成后 会出现冲突。
解决方法:
- 多和组员沟通和协调,主要是数据一致性的问题
- 发现是NI server占据了8080端口
- 更加意识到团队合作的重要性,以后在编程前会先协调好前后端的需求。
221900325
困难:
由于能力有限,刚开始花了不少时间在学习框架上。然而在连接数据库时,还是遇到了数据库无法正确加载的问题。
解决方法:
在团队协作过程中,积极学习,并且求助能力较强的队友来帮助自己更快的提高。最后查了很多资料,发现是yml文件中没有正确添加数据库配置信息。
221900331
困难:
- 面对未经历过的任务,任务细节不明确,困难未知,成员技术掌握情况不够了解,分工难以进行。
- 所需技术不熟悉,不能够较快上手编写。
- 工作场地有限,妨碍了成员的交流合作。
解决方法:
- 先是召开了一个接近1小时的短会,迅速地商量此次任务的内容详情,商讨了如何完成此次任务,确定了每个人大致的工作方向。
- 在有限的时间内,花了一定的时间去学习技术视频,更多的是对症下药,在网络上寻求问题的解答以及寻求队友的帮助。
- 进行了场外联系,早上进行短会后立马组织组员进行进餐,12点的时候就提前到机房办公,充分利用机房的便利。
221900334
困难:
- 时间太紧迫,没办法很好的处理功能质量与数量之间的关系。
- 对接口的测试不熟练,当写完模块需要测试时,花费了较多的时间。
- 出现错误Spring Boot Error: java.lang.NoSuchMethodError
解决方法:
- 以首先完成老师所要求的功能为主,质量方面没有做到最优
- 通过查询资料,学习使用辅助软件测试接口
- 查看出错类中是否缺少某方法。查询了官网的信息发现:当移除parent依赖时,需要增加spring-boot-dependencies的依赖。因此在pom.xml中新增依赖。
221900413
困难:
由于开发项目经验欠缺,对于一天内的项目实训确实遇到了不少的麻烦,在前端方面对于vue的一些基础没有掌握好,导致在实现的时候出现不少的bug。
解决方法:
通过百度搜索解决问题,在团队的帮助下解决困难。
221900424
困难:
- 一天的时间感觉很紧,所以我对于界面细节的处理就没有把控的很好。
- 在和后端交接的时候,返回值和传入参数没有处理的很好。
解决方法:
- 想着先完成任务,没有考虑太多的细节,界面差不多简介明了就好。
- 在确定这些参数的时候就先和后端沟通好,多问一下队友的意见,不然就会经常有大家的想法不一致然后浪费许多时间修改写好的代码的问题。
051904112
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 20 | 30 |
• Estimate | • 估计这个任务需要多少时间 | 20 | 30 |
Development | 开发 | 595 | 770 |
• Analysis | • 需求分析 (包括学习新技术) | 120 | 150 |
• Design Database Table | • 设计数据库表 | 30 | 75 |
• Design Review | • 设计复审 | 20 | 25 |
• Design | • 具体设计 | 20 | 30 |
• Coding | • 具体编码 | 360 | 450 |
• Code Review | • 代码复审 | 15 | 20 |
• Test | • 测试(自我测试,修改代码,提交修改) | 30 | 20 |
Reporting | 报告 | 20 | 20 |
• Size Measurement | • 计算工作量 | 10 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 10 | 10 |
合计 | 635 | 820 |
221900223
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 15 | 30 |
• Estimate | • 估计这个任务需要多少时间 | 15 | 30 |
Development | 开发 | 615 | 755 |
• Analysis | • 需求分析 (包括学习新技术) | 60 | 90 |
• Design Database Table | • 设计数据库表 | 45 | 75 |
• Design Review | • 设计复审 | 15 | 20 |
• Design | • 具体设计 | 30 | 50 |
• Coding | • 具体编码 | 420 | 480 |
• Code Review | • 代码复审 | 15 | 20 |
• Test | • 测试(自我测试,修改代码,提交修改) | 30 | 20 |
Reporting | 报告 | 20 | 20 |
• Size Measurement | • 计算工作量 | 10 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 10 | 10 |
合计 | 650 | 805 |
221900225
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 20 | 30 |
• Estimate | • 估计这个任务需要多少时间 | 20 | 30 |
Development | 开发 | 490 | 720 |
• Analysis | • 需求分析 (包括学习新技术) | 60 | 80 |
• Design Database Table | • 设计数据库表 | 60 | 75 |
• Design Review | • 设计复审 | 15 | 20 |
• Design | • 具体设计 | 30 | 90 |
• Coding | • 具体编码 | 300 | 420 |
• Code Review | • 代码复审 | 10 | 15 |
• Test | • 测试(自我测试,修改代码,提交修改) | 15 | 20 |
Reporting | 报告 | 20 | 25 |
• Size Measurement | • 计算工作量 | 10 | 5 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 10 | 20 |
合计 | 530 | 775 |
221900305
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 15 | 30 |
• Estimate | • 估计这个任务需要多少时间 | 15 | 30 |
Development | 开发 | 475 | 625 |
• Analysis | • 需求分析 (包括学习新技术) | 60 | 120 |
• Design Database Table | • 设计数据库表 | 45 | 75 |
• Design Review | • 设计复审 | 15 | 15 |
• Design | • 具体设计 | 30 | 30 |
• Coding | • 具体编码 | 300 | 360 |
• Code Review | • 代码复审 | 10 | 10 |
• Test | • 测试(自我测试,修改代码,提交修改) | 15 | 15 |
Reporting | 报告 | 20 | 10 |
• Size Measurement | • 计算工作量 | 10 | 5 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 10 | 5 |
合计 | 510 | 665 |
221900309
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 30 | 30 |
• Estimate | • 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 680 | 785 |
• Analysis | • 需求分析 (包括学习新技术) | 120 | 120 |
• Design Database Table | • 设计数据库表 | 60 | 75 |
• Design Review | • 设计复审 | 20 | 20 |
• Design | • 具体设计 | 30 | 45 |
• Coding | • 具体编码 | 400 | 480 |
• Code Review | • 代码复审 | 20 | 20 |
• Test | • 测试(自我测试,修改代码,提交修改) | 30 | 25 |
Reporting | 报告 | 25 | 25 |
• Size Measurement | • 计算工作量 | 10 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 15 | 15 |
合计 | 735 | 840 |
221900325
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 15 | 30 |
• Estimate | • 估计这个任务需要多少时间 | 15 | 30 |
Development | 开发 | 445 | 505 |
• Analysis | • 需求分析 (包括学习新技术) | 90 | 120 |
• Design Database Table | • 设计数据库表 | 50 | 75 |
• Design Review | • 设计复审 | 10 | 10 |
• Design | • 具体设计 | 30 | 30 |
• Coding | • 具体编码 | 240 | 240 |
• Code Review | • 代码复审 | 10 | 10 |
• Test | • 测试(自我测试,修改代码,提交修改) | 15 | 20 |
Reporting | 报告 | 20 | 10 |
• Size Measurement | • 计算工作量 | 10 | 5 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 10 | 5 |
合计 | 480 | 545 |
221900331
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 25 | 30 |
• Estimate | • 估计这个任务需要多少时间 | 25 | 30 |
Development | 开发 | 495 | 580 |
• Analysis | • 需求分析 (包括学习新技术) | 120 | 120 |
• Design Database Table | • 设计数据库表 | 60 | 75 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
• Design Review | • 设计复审 | 15 | 15 |
• Design | • 具体设计 | 45 | 60 |
• Coding | • 具体编码 | 180 | 200 |
• Code Review | • 代码复审 | 30 | 60 |
• Test | • 测试(自我测试,修改代码,提交修改) | 15 | 20 |
Reporting | 报告 | 150 | 180 |
• Size Measurement | • 计算工作量 | 30 | 30 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 120 | 150 |
合计 | 670 | 790 |
221900334
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 30 | 30 |
• Estimate | • 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 710 | 775 |
• Analysis | • 需求分析 (包括学习新技术) | 120 | 120 |
• Design Database Table | • 设计数据库表 | 60 | 75 |
• Design Review | • 设计复审 | 20 | 20 |
• Design | • 具体设计 | 45 | 60 |
• Coding | • 具体编码 | 420 | 450 |
• Code Review | • 代码复审 | 20 | 20 |
• Test | • 测试(自我测试,修改代码,提交修改) | 30 | 30 |
Reporting | 报告 | 25 | 20 |
• Size Measurement | • 计算工作量 | 10 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 15 | 10 |
合计 | 765 | 825 |
221900413
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 25 | 30 |
• Estimate | • 估计这个任务需要多少时间 | 25 | 30 |
Development | 开发 | 495 | 670 |
• Analysis | • 需求分析 (包括学习新技术) | 45 | 60 |
• Design Database Table | • 设计数据库表 | 45 | 75 |
• Design Review | • 设计复审 | 15 | 20 |
• Design | • 具体设计 | 60 | 120 |
• Coding | • 具体编码 | 300 | 360 |
• Code Review | • 代码复审 | 15 | 15 |
• Test | • 测试(自我测试,修改代码,提交修改) | 15 | 20 |
Reporting | 报告 | 20 | 15 |
• Size Measurement | • 计算工作量 | 10 | 5 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 10 | 10 |
合计 | 540 | 715 |
221900424
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 20 | 30 |
• Estimate | • 估计这个任务需要多少时间 | 20 | 30 |
Development | 开发 | 640 | 730 |
• Analysis | • 需求分析 (包括学习新技术) | 60 | 60 |
• Design Database Table | • 设计数据库表 | 60 | 75 |
• Design Review | • 设计复审 | 15 | 20 |
• Design | • 具体设计 | 120 | 120 |
• Coding | • 具体编码 | 360 | 420 |
• Code Review | • 代码复审 | 10 | 15 |
• Test | • 测试(自我测试,修改代码,提交修改) | 15 | 20 |
Reporting | 报告 | 35 | 50 |
• Size Measurement | • 计算工作量 | 15 | 20 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 20 | 30 |
合计 | 695 | 810 |