项目介绍
该项目分为玩家用户,商户以及管理员三个角色,包含了店铺管理,活动管理,报名管理以及用户等核心模块,有普通玩家,商户和管理员三大角色:
1.玩家角色:
进入到小程序,筛选查看适合参与的活动,选择活动报名,系统根据报名用户的"信誉值"自动判断报名成功与否, 游戏结束后可对参与同期游戏的玩家进行评价,评价好坏决定玩家的信誉值.
2.商户角色:
创建游戏活动提交审核,审核通过后等待玩家报名,发起游戏.
3.管理员角色:
审核商户提交的游戏活动,管理商户帐号
开发环境:
- jdk 8
- intellij idea
- tomcat 8.5.40
- mysql 5.7
- 微信开发者工具
后端所用技术:
- springboot2.1
- quartz
- thymeleaf
- alibaba 连接池
- swagger
- mybatis
难点思路
- 不同角色登录显示不同的菜单页面
自定义底部导航栏,不同身份显示不同的tabbar,登录后根据设置的角色类型显示不同的导航栏
- 活动状态与报名状态关联
添加定时任务,根据设置的活动时间判断改变活动状态的同时,查询绑定该活动的报名记录,修改相应的状态
- 信誉值筛选
设定初始信誉值,根据评价好坏修改信誉值,报名人数超过活动人数,筛选信誉值高的玩家开始游戏,信誉值低的玩家自动出局
项目截图
-
首页
-
玩家-活动列表
-
玩家-我的活动
-
玩家-活动详情
-
玩家-评价
-
玩家-个人中心
-
店家-创建活动
-
店家-活动管理
-
店家-个人中心
-
管理员-活动审核
-
管理员-帐号管理
-
管理员-创建店铺
-
swagger接口
数据库配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
url: jdbc:mysql://localhost:3306/board_game?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root123
模版配置
spring:
thymeleaf:
mode: HTML
encoding: utf-8
核心业务代码
- 活动模块
@ApiOperation(value = "新增活动",response = AjaxResult.class)
@PostMapping("/add")
public AjaxResult addSave(ActivityAddReq activityReq)
{
Store store=storeService.selectStoreByUserId(activityReq.getBoosId());//查询店铺id
if(store==null){
return AjaxResult.error("店铺不存在");
}
Activity activity=new Activity();
BeanUtils.copyProperties(activityReq,activity);
activity.setStatus(-1); //活动待审核
activity.setCityId(store.getCityId()); //获取店铺所在城市
activity.setAddress(store.getAddress()); //获取店铺所在地址
activity.setBoosId(activityReq.getBoosId());
return toAjax(activityService.insertActivity(activity));
}
@ApiOperation(value = "审核活动",response = AjaxResult.class)
@PostMapping( "/audit")
public AjaxResult audit(ActivityAuditReq req)
{
Activity activity=new Activity();
activity.setId(req.getId());
activity.setStatus(req.getStatus()); //设置审核状态
return toAjax(activityService.updateActivity(activity));
}
- 活动报名模块
@ApiOperation(value = "活动报名",response = AjaxResult.class)
@PostMapping( "/sign")
public AjaxResult sign(SignUpReq signUpReq)
{
Activity activity= activityService.selectActivityById(signUpReq.getActivityId());
if(activity==null){
return AjaxResult.error("活动不存在");
}else if(!activity.getStatus().equals(0)){ //活动未开始才能报名--不需要判断时间,时间能控制活动状态
return AjaxResult.error("活动状态不正常");
}
SignUp search=new SignUp();
search.setUserId(signUpReq.getUserId());
search.setActivityId(signUpReq.getActivityId());
List<SignUp> list=signUpService.selectSignUpList(search);
if(list.size()>0){
return AjaxResult.error("该活动您已经报名,请忽重复报名");
}
SignUp signUp=new SignUp();
BeanUtils.copyProperties(signUpReq,signUp);
signUp.setAddTime(DateUtils.getTime());
signUp.setStatus(0);
signUpService.insertSignUp(signUp);
activity.setsNum(activity.getsNum()+1);
return toAjax(activityService.updateActivity(activity));
}
@ApiOperation(value = "取消报名",response = AjaxResult.class)
@PostMapping( "/cancelSign")
public AjaxResult cancelSign(SignUpReq signUpReq)
{
Activity activity= activityService.selectActivityById(signUpReq.getActivityId());
if(activity==null){
return AjaxResult.error("活动不存在");
}
SignUp search=new SignUp();
search.setUserId(signUpReq.getUserId());
search.setActivityId(signUpReq.getActivityId());
List<SignUp> list=signUpService.selectSignUpList(search);
if(list.size()==0){
return AjaxResult.error("该活动您未报名,取消失败");
}
SignUp signUp=list.get(0);
signUp.setStatus(3);
signUpService.updateSignUpByAId(signUp);
activity.setsNum(activity.getsNum()-1);
return toAjax(activityService.updateActivity(activity));
}
- 活动结束后用户信誉值计算
//根据活动参与玩家对彼此评价做出信誉值计算
@ApiOperation(value = "活动结束-玩家评论",response = ActivityVo.class)
@PostMapping( "/playComment")
public AjaxResult playComment(CommentReq req)
{
try{
GameUser gameUser=gameUserService.selectGameUserById(req.getUserId());
if(gameUser==null){
return AjaxResult.error("评论失败,评论人信息不存在");
}
gameUser=gameUserService.selectGameUserById(req.getCommentId());
if(gameUser==null){
return AjaxResult.error("评论失败,被评论人信息不存在");
}
ActivityComment activityComment=new ActivityComment();
activityComment.setUserId(req.getUserId());
activityComment.setActivityId(req.getActivityId());
activityComment.setCommentId(req.getCommentId());
List<ActivityComment> list=activityCommentService.selectActivityCommentList(activityComment);
if(list.size()>0){
return AjaxResult.error("评论失败,已经评论过,请忽重复评论");
}
BeanUtils.copyProperties(req,activityComment);
activityComment.setCalculate(1); //设置成没有计算过
activityCommentService.insertActivityComment(activityComment);//添加评论记录
//扣分规则:一个玩家在一局游戏里被>=1玩家负面评价,就会扣分,迟到扣5分,缺席扣10分,不遵守游戏规则扣2分 整体印象 10分
//如果评论次数坏印象大于1次,累积计算评论值
int reputationValue=gameUser.getReputation(); //原来的信誉值
//迟到扣除5分
if(req.getBelate()==1){
reputationValue=reputationValue-5;
}else{
reputationValue=reputationValue+5;
}
//缺席扣除10分
if(req.getAbsent()==1){
reputationValue=reputationValue-10;
}else{
reputationValue=reputationValue+10;
}
//不遵守游戏规则扣2分
if(req.getAbsent()==1){
reputationValue=reputationValue-2;
}else{
reputationValue=reputationValue+2;
}
//整体印象 1分
if(req.getAbsent()==1){
reputationValue=reputationValue-1;
}else{
reputationValue=reputationValue+1;
}
gameUser.setReputation(reputationValue); //最终更新被评论人的信誉值
gameUserService.updateGameUser(gameUser); //更新数据
return AjaxResult.success("评价成功");
}catch (Exception e){
e.printStackTrace();
return AjaxResult.error("评价失败,系统异常");
}
}
- 活动开始与结束任务调度 ,同时筛选出信誉值高者用户入局活动中
public void activityTask() {
List<Activity> list = activityService.getListByNoEnd();
if (list.size() > 0) {
for (Activity activity : list) {
String startTime = activity.getStartTime();//开始时间
String endTime = activity.getEndTime(); //结束时间
if (activity.getStatus() == 0) { //未开始的活动
if (DateUtils.isGreater(startTime) && !DateUtils.isGreater(endTime)) {
//报名人数大于活动人数,则活动正常开始
if(activity.getsNum()>=activity.getpNum()){
activity.setStatus(1);//设置已经开始
activityService.updateActivity(activity);
//筛选出信誉值较高的玩家
List<SignUp> signUps=signUpService.getSignUpListByAId(activity.getId());
for(int i=0;i<signUps.size();i++){
SignUp signUp=signUps.get(i);
if(i<activity.getpNum()){
signUp.setStatus(1); //设置活动中,信誉值低者出局
signUp.setRemark("活动报名成功");
}else{
signUp.setStatus(3);//出局
signUp.setRemark("信誉值低于其他报名玩家,出局");
//todo 可发送消息推送
}
signUpService.updateSignUp(signUp);
}
}else{
activity.setStatus(2);//设置2已经结束
activity.setRemark("活动报名人数未满足活动人数要求,自动结束活动");
activityService.updateActivity(activity);
//更新当前活动的报名状态为已结束
SignUp signUp=new SignUp();
signUp.setActivityId(activity.getId());
signUp.setStatus(3);//报名状态 0未开始,1活动中 2已结束 3报名失败
signUp.setRemark("活动报名人数未满足活动人数要求,自动结束活动");
signUpService.updateSignUpByAId(signUp);
}
}
} else if (activity.getStatus() == 1) {//已经开始的活动
if (DateUtils.isGreater(endTime)) {
activity.setStatus(2);//设置已经结束
activityService.updateActivity(activity);
SignUp signUp=new SignUp();
signUp.setActivityId(activity.getId());
signUp.setStatus(2);//报名状态2已结束
signUp.setRemark("活动时间已过,结束活动");
signUpService.updateStatusByAcIng(signUp);
}
}
}
}
}
项目后续
其他ssh,ssm版本后续迭代更新,持续关注