【Alpha阶段】第七次Scrum Meeting
【Alpha阶段】第七次Scrum Meeting
这个作业属于哪个课程 | 软件工程 |
---|---|
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | 会议+项目燃尽图+成员代码/文档签入记录+每人每日总结 |
团队队员
学号 | 姓名 |
---|---|
3119005415 | 黄奕威 |
3219005447 | 连婉玲 |
3119005417 | 黄智权 |
3119005431 | 欧智昕 |
3219005448 | 刘淑婷 |
3119005410 | 冯波昌 |
3219005445 | 何婉莹 |
一、例会图片
二、Burndown Chart
三、代码/文档签入记录
四、项目进度
队员 | 昨日已完成任务 | 任务概述 | 今日待完成任务 |
---|---|---|---|
黄奕威 | 完成了最主要的战斗交互逻辑 · Issue #39 | 完成精灵对战的交互逻辑,目前还需要对动画进行优化 | 明日继续优化前端交互效果,出现部分小bug,明日解决 |
连婉玲 | 最后冲刺 · Issue #35 | 编写博客 | 讨论后续安排 |
黄智权 | 收尾阶段 · Issue #38 | 和前端的小伙伴对接了一下主要接口功能,完善精灵战斗中的行为定义 | 项目收尾阶段,准备进行测试 |
欧智昕 | 最后阶段· Issue #40 | 与精灵类的对接 | 根据需要对精灵类进行功能的增删改 |
刘淑婷 | 收尾 · Issue #36 | 重新修改参数校验的信息显示,请求method的异常处理,修改精灵类字段的修饰符 | 根据交互的错误来修改 |
冯波昌 | 最后冲刺 · Issue #32 | 编写博客,和其他小伙伴讨论项目进程 | 帮忙测试 |
何婉莹 | 收尾· Issue #34 | 新增战斗结果上传接口 | 与队员讨论后续安排,查漏补缺 |
五、最新模块代码
config(点击查看)
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import ruangong.our_land.model.ResultInfo;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
/**
* @Author: Lsutin
@@ -31,13 +27,9 @@
*/
@ExceptionHandler(BindException.class)
public ResultInfo bindExceptionHandler(BindException e){
HashMap<String, String> map = new HashMap<>();
List<FieldError> fieldErrors = e.getFieldErrors();
for (FieldError fieldError:fieldErrors){
map.put(fieldError.getField(),fieldError.getRejectedValue()+","+fieldError.getDefaultMessage());
}
log.warn("参数错误:{}",map);
return ResultInfo.error(map);
String error=e.getFieldError().getDefaultMessage();
log.warn("参数错误:{}",error);
return ResultInfo.error(error);
}
/**
@@ -47,14 +39,9 @@ public ResultInfo bindExceptionHandler(BindException e){
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResultInfo methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e){
BindingResult result = e.getBindingResult();
HashMap<String, String> map = new HashMap<>();
List<FieldError> fieldErrors = result.getFieldErrors();
for (FieldError fieldError:fieldErrors){
map.put(fieldError.getField(),fieldError.getRejectedValue()+","+fieldError.getDefaultMessage());
}
log.warn("参数错误:{}",map);
return ResultInfo.error(map);
String error=e.getFieldError().getDefaultMessage();
log.warn("参数错误:{}",error);
return ResultInfo.error(error);
}
/**
@@ -64,14 +51,25 @@ public ResultInfo methodArgumentNotValidExceptionHandler(MethodArgumentNotValidE
*/
@ExceptionHandler(ConstraintViolationException.class)
public ResultInfo constraintViolationExceptionHandler(ConstraintViolationException e){
Set<ConstraintViolation<?>> set = e.getConstraintViolations();
HashMap<String, String> map = new HashMap<>();
for (ConstraintViolation violation:set){
String path = violation.getPropertyPath().toString();
map.put(path.substring(path.lastIndexOf(".")+1),violation.getMessage());
String error="";
System.out.println(e.getMessage());
for (ConstraintViolation violation:e.getConstraintViolations()){
error=violation.getMessage();
break;
}
log.warn("参数错误:{}",map);
return ResultInfo.error(map);
log.warn("参数错误:{}",error);
return ResultInfo.error(error);
}
/**
* 用于请求的method是否正确
* @param e
* @return
*/
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public ResultInfo httpRequestMethodNotSupportedExceptionHandler(HttpRequestMethodNotSupportedException e){
System.out.println(e.getMethod());
return ResultInfo.error(e.getMessage());
}
/**
UseMapper(点击查看)
package ruangong.our_land.mapper;
import org.apache.ibatis.annotations.Param;
import ruangong.our_land.model.user.User;
import ruangong.our_land.model.user.UserProp;
import ruangong.our_land.model.user.UserSpirit;
import java.util.List;
import java.util.Map;
/**
* @Author: Lsutin
* @Date: 2021/11/2 14:35
* @describe:
*/
public interface UserMapper {
/**
* 根据用户名获取用户实体
* @param uName 用户名
* @return
*/
User findByName(@Param("uName") String uName);
/**
* 根据用户id获取用户实体
* @param uId 用户id
* @return
*/
User findById(@Param("uId") Integer uId);
/**
* 添加用户
* @param uName 用户名
* @param uPwd 用户密码
* @return
*/
Integer insertUser(@Param("uName") String uName,
@Param("uPwd") String uPwd);
/**
* 更新用户
* @param param 参数map
* @return
*/
Integer updateUser(Map<String, Object> param);
/**
* 根据用户id获取拥有道具
* @param uId 用户id
* @return
*/
List<UserProp> findProp(@Param("uId") Integer uId);
/**
* 根据用户id获取拥有精灵
* @param uId 用户id
* @return
*/
List<UserSpirit> findSpirit(@Param("uId") Integer uId);
/**
* 用户添加精灵
* @param uId 用户id
* @param sId 精灵id
* @return
*/
Integer insertUserSpirit(@Param("uId") Integer uId,
@Param("sId") Integer sId);
} }
}
SpiritController(点击查看)
package ruangong.our_land.controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import ruangong.our_land.model.ResultInfo;
import ruangong.our_land.model.spirit.Spirit;
import ruangong.our_land.model.spirit.boss.Boss;
import ruangong.our_land.model.spirit.monster.Monster;
import ruangong.our_land.model.user.User;
import ruangong.our_land.model.user.UserSpirit;
import ruangong.our_land.service.SpiritService;
import ruangong.our_land.service.UserService;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Author hwy
* @Date 2021/11/26
*/
@RestController
@RequestMapping("/spirit")
public class SpiritController {
@Resource
private SpiritService spiritService;
@Resource
private UserService userService;
/**
* 获取战斗信息
* @param uId 用户id
* @param bossId 关卡的怪物id
* @return
*/
@PostMapping("/getInfo")
public ResultInfo getBattleInfo(@RequestParam("userId") @Valid Integer uId,
@RequestParam("bossId") @Valid Integer bossId){
Boss bossInfo = spiritService.findBoss(bossId);
List<Integer> sIdList = userService.findSpirit(uId).stream().map(UserSpirit::getS_id).collect(Collectors.toList());
List<Monster> userInfo = new ArrayList<>();
for (Integer sId : sIdList) {
userInfo.add(spiritService.findMonster(sId));
}
Map<String, Object> map = new HashMap<>();
map.put("bossInfo", bossInfo);
map.put("userInfo", userInfo);
return ResultInfo.success(map);
}
/**
* 战斗结果上传
* @param uId 用户id
* @param bossId 关卡的怪物id
* @param isWin 战斗是否胜利
* @param isCatch 精灵是否被捕捉
* @return
*/
@PostMapping("/save")
public ResultInfo uploadResult(@RequestParam("userId") @Valid Integer uId,
@RequestParam("bossId") @Valid Integer bossId,
Boolean isWin,
Boolean isCatch){
User user = userService.findById(uId);
if (user != null){
if (isWin){
Boss boss = spiritService.findBoss(bossId);
Monster monster = spiritService.findMonster(bossId);
Map<String, Object> param = new HashMap<>();
param.put("uId", uId);
param.put("uProgress", user.getProgress() + 1);
if (boss != null){
param.put("uExp", user.getExp() + boss.getExp());
userService.updateUser(param);
}else if (monster != null){
param.put("uExp", user.getExp() + monster.getExp());
userService.updateUser(param);
}else {
return ResultInfo.success("上传失败:怪物id有误");
}
}
if (isCatch){
List<Integer> sIdList = userService.findSpirit(uId).stream().map(UserSpirit::getS_id).collect(Collectors.toList());
if (!sIdList.contains(bossId)){
userService.insertUserSpirit(uId, bossId);
}else {
return ResultInfo.success("背包已存在该精灵");
}
}
}else {
return ResultInfo.success("上传失败:用户id有误");
}
return ResultInfo.success("战斗结果已上传");
}
}
六、遇到的困难
进展顺利,暂时没遇到什么困难
七、每人每日总结
黄奕威:今天完成了最主要的战斗交互逻辑,但还有小部分bug需要解决
连婉玲:终于结束了,感觉这几天学到了很多
黄智权:多善于总结经验,才能避免下次再犯
欧智昕:完成了与同伴的对接,明天再继续改善设计
刘淑婷:今天进行了测试,排查修改了些bug,接下来继续完善
冯波昌:完成了最后的冲刺,接下来再与小伙伴讨论一下项目进程
何婉莹:顺利完成了今天的任务,之后再与队员讨论后续安排,查漏补缺