微信小程序活动管理系统

项目介绍

该项目分为玩家用户,商户以及管理员三个角色,包含了店铺管理,活动管理,报名管理以及用户等核心模块,有普通玩家,商户和管理员三大角色:

1.玩家角色:

进入到小程序,筛选查看适合参与的活动,选择活动报名,系统根据报名用户的"信誉值"自动判断报名成功与否, 游戏结束后可对参与同期游戏的玩家进行评价,评价好坏决定玩家的信誉值.

2.商户角色:

创建游戏活动提交审核,审核通过后等待玩家报名,发起游戏.

3.管理员角色:

审核商户提交的游戏活动,管理商户帐号

开发环境:

  1. jdk 8
  2. intellij idea
  3. tomcat 8.5.40
  4. mysql 5.7
  5. 微信开发者工具

后端所用技术:

  1. springboot2.1
  2. quartz
  3. thymeleaf
  4. alibaba 连接池
  5. swagger
  6. mybatis

难点思路

  1. 不同角色登录显示不同的菜单页面

自定义底部导航栏,不同身份显示不同的tabbar,登录后根据设置的角色类型显示不同的导航栏

  1. 活动状态与报名状态关联

添加定时任务,根据设置的活动时间判断改变活动状态的同时,查询绑定该活动的报名记录,修改相应的状态

  1. 信誉值筛选

设定初始信誉值,根据评价好坏修改信誉值,报名人数超过活动人数,筛选信誉值高的玩家开始游戏,信誉值低的玩家自动出局

项目截图

  • 首页


    首页.png
  • 玩家-活动列表


    玩家-活动库.png
  • 玩家-我的活动


    玩家-我的活动.png
  • 玩家-活动详情


    玩家-活动详情.png
  • 玩家-评价


    玩家-用户评论.png
  • 玩家-个人中心


    玩家-个人中心.png
  • 店家-创建活动


    商户-创建活动.png
  • 店家-活动管理


    商户-活动管理.png
  • 店家-个人中心


    商户-个人中心.png
  • 管理员-活动审核


    admin-活动审核.png
  • 管理员-帐号管理


    admin-帐号管理.png
  • 管理员-创建店铺


    admin-创建店铺.png
  • 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
 

核心业务代码

  1. 活动模块
@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));
}
  1. 活动报名模块
@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));
}
  1. 活动结束后用户信誉值计算
//根据活动参与玩家对彼此评价做出信誉值计算
@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("评价失败,系统异常");
    }
}
  1. 活动开始与结束任务调度 ,同时筛选出信誉值高者用户入局活动中
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版本后续迭代更新,持续关注

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容