新增部分游戏接口

This commit is contained in:
licong
2025-06-23 19:25:40 +08:00
parent da553da015
commit c1ec4b541d
30 changed files with 431 additions and 154 deletions

101
README.md
View File

@@ -4,43 +4,14 @@
<img src="https://img.shields.io/github/license/YunaiV/ruoyi-vue-pro"/> <img src="https://img.shields.io/github/license/YunaiV/ruoyi-vue-pro"/>
</p> </p>
**严肃声明:现在、未来都不会有商业版本,所有代码全部开源!**
**「我喜欢写代码,乐此不疲」**
**「我喜欢做开源,以此为乐」**
我 🐶 在上海艰苦奋斗,早中晚在 top3 大厂认真搬砖,夜里为开源做贡献。
如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。
## 🐶 新手必读 ## 🐶 新手必读
* 演示地址【Vue3 + element-plus】<http://dashboard-vue3.yudao.iocoder.cn>
* 演示地址【Vue3 + vben(ant-design-vue)】:<http://dashboard-vben.yudao.iocoder.cn>
* 演示地址【Vue2 + element-ui】<http://dashboard.yudao.iocoder.cn>
* 启动文档:<https://doc.iocoder.cn/quick-start/> * 启动文档:<https://doc.iocoder.cn/quick-start/>
* 视频教程:<https://doc.iocoder.cn/video/> * 视频教程:<https://doc.iocoder.cn/video/>
## 🐰 版本说明
| 版本 | JDK 8 + Spring Boot 2.7 | JDK 17/21 + Spring Boot 3.2 |
|---------------------------------------------------------------------|---------------------------------------------------------------------------|---------------------------------------------------------------------------------------|
| 【完整版】[ruoyi-vue-pro](https://gitee.com/zhijiantianya/ruoyi-vue-pro) | [`master`](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/) 分支 | [`master-jdk17`](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master-jdk17/) 分支 |
| 【精简版】[yudao-boot-mini](https://gitee.com/yudaocode/yudao-boot-mini) | [`master`](https://gitee.com/yudaocode/yudao-boot-mini/tree/master/) 分支 | [`master-jdk17`](https://gitee.com/yudaocode/yudao-boot-mini/tree/master-jdk17/) 分支 |
* 【完整版】包括系统功能、基础设施、会员中心、数据报表、工作流程、商城系统、微信公众号、CRM、ERP 等功能
* 【精简版】只包括系统功能、基础设施功能不包括会员中心、数据报表、工作流程、商城系统、微信公众号、CRM、ERP 等功能
可参考 [《迁移文档》](https://doc.iocoder.cn/migrate-module/) ,只需要 5-10 分钟,即可将【完整版】按需迁移到【精简版】
## 🐯 平台简介 ## 🐯 平台简介
**芋道**,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用。
> 有任何问题,或者想要的功能,可以在 _Issues_ 中提给艿艿。
>
> 😜 给项目点点 Star 吧,这对我们真的很重要!
![架构图](/.image/common/ruoyi-vue-pro-architecture.png) ![架构图](/.image/common/ruoyi-vue-pro-architecture.png)
* Java 后端:`master` 分支为 JDK 8 + Spring Boot 2.7`master-jdk17` 分支为 JDK 17/21 + Spring Boot 3.2 * Java 后端:`master` 分支为 JDK 8 + Spring Boot 2.7`master-jdk17` 分支为 JDK 17/21 + Spring Boot 3.2
@@ -59,31 +30,6 @@
* 集成阿里云、腾讯云等短信渠道,集成 MinIO、阿里云、腾讯云、七牛云等云存储服务 * 集成阿里云、腾讯云等短信渠道,集成 MinIO、阿里云、腾讯云、七牛云等云存储服务
* 集成报表设计器、大屏设计器,通过拖拽即可生成酷炫的报表与大屏 * 集成报表设计器、大屏设计器,通过拖拽即可生成酷炫的报表与大屏
## 🐳 项目关系
![架构演进](/.image/common/yudao-roadmap.png)
三个项目的功能对比,可见社区共同整理的 [国产开源项目对比](https://www.yuque.com/xiatian-bsgny/lm0ec1/wqf8mn) 表格。
### 后端项目
| 项目 | Star | 简介 |
|-----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------|
| [ruoyi-vue-pro](https://gitee.com/zhijiantianya/ruoyi-vue-pro) | [![Gitee star](https://gitee.com/zhijiantianya/ruoyi-vue-pro/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/ruoyi-vue-pro) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/ruoyi-vue-pro.svg?style=social&label=Stars)](https://github.com/YunaiV/ruoyi-vue-pro) | 基于 Spring Boot 多模块架构 |
| [yudao-cloud](https://gitee.com/zhijiantianya/yudao-cloud) | [![Gitee star](https://gitee.com/zhijiantianya/yudao-cloud/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/yudao-cloud) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/yudao-cloud.svg?style=social&label=Stars)](https://github.com/YunaiV/yudao-cloud) | 基于 Spring Cloud 微服务架构 |
| [Spring-Boot-Labs](https://gitee.com/yudaocode/SpringBoot-Labs) | [![Gitee star](https://gitee.com/yudaocode/SpringBoot-Labs/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/yudao-cloud) [![GitHub stars](https://img.shields.io/github/stars/yudaocode/SpringBoot-Labs.svg?style=social&label=Stars)](https://github.com/yudaocode/SpringBoot-Labs) | 系统学习 Spring Boot & Cloud 专栏 |
### 前端项目
| 项目 | Star | 简介 |
|----------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------|
| [yudao-ui-admin-vue3](https://gitee.com/yudaocode/yudao-ui-admin-vue3) | [![Gitee star](https://gitee.com/yudaocode/yudao-ui-admin-vue3/badge/star.svg?theme=white)](https://gitee.com/yudaocode/yudao-ui-admin-vue3) [![GitHub stars](https://img.shields.io/github/stars/yudaocode/yudao-ui-admin-vue3.svg?style=social&label=Stars)](https://github.com/yudaocode/yudao-ui-admin-vue3) | 基于 Vue3 + element-plus 实现的管理后台 |
| [yudao-ui-admin-vben](https://gitee.com/yudaocode/yudao-ui-admin-vben) | [![Gitee star](https://gitee.com/yudaocode/yudao-ui-admin-vben/badge/star.svg?theme=white)](https://gitee.com/yudaocode/yudao-ui-admin-vben) [![GitHub stars](https://img.shields.io/github/stars/yudaocode/yudao-ui-admin-vben.svg?style=social&label=Stars)](https://github.com/yudaocode/yudao-ui-admin-vben) | 基于 Vue3 + vben(ant-design-vue) 实现的管理后台 |
| [yudao-mall-uniapp](https://gitee.com/yudaocode/yudao-mall-uniapp) | [![Gitee star](https://gitee.com/yudaocode/yudao-mall-uniapp/badge/star.svg?theme=white)](https://gitee.com/yudaocode/yudao-mall-uniapp) [![GitHub stars](https://img.shields.io/github/stars/yudaocode/yudao-mall-uniapp.svg?style=social&label=Stars)](https://github.com/yudaocode/yudao-mall-uniapp) | 基于 uni-app 实现的商城小程序 |
| [yudao-ui-admin-vue2](https://gitee.com/yudaocode/yudao-ui-admin-vue2) | [![Gitee star](https://gitee.com/yudaocode/yudao-ui-admin-vue2/badge/star.svg?theme=white)](https://gitee.com/yudaocode/yudao-ui-admin-vue2) [![GitHub stars](https://img.shields.io/github/stars/yudaocode/yudao-ui-admin-vue2.svg?style=social&label=Stars)](https://github.com/yudaocode/yudao-ui-admin-vue2) | 基于 Vue2 + element-ui 实现的管理后台 |
| [yudao-ui-admin-uniapp](https://gitee.com/yudaocode/yudao-ui-admin-uniapp) | [![Gitee star](https://gitee.com/yudaocode/yudao-ui-admin-uniapp/badge/star.svg?theme=white)](https://gitee.com/yudaocode/yudao-ui-admin-uniapp) [![GitHub stars](https://img.shields.io/github/stars/yudaocode/yudao-ui-admin-uniapp.svg?style=social&label=Stars)](https://github.com/yudaocode/yudao-ui-admin-uniapp) | 基于 Vue2 + element-ui 实现的管理后台 |
| [yudao-ui-go-view](https://gitee.com/yudaocode/yudao-ui-go-view) | [![Gitee star](https://gitee.com/yudaocode/yudao-ui-go-view/badge/star.svg?theme=white)](https://gitee.com/yudaocode/yudao-ui-go-view) [![GitHub stars](https://img.shields.io/github/stars/yudaocode/yudao-ui-go-view.svg?style=social&label=Stars)](https://github.com/yudaocode/yudao-ui-go-view) | 基于 Vue3 + naive-ui 实现的大屏报表 |
## 😎 开源协议 ## 😎 开源协议
**为什么推荐使用本项目?** **为什么推荐使用本项目?**
@@ -96,30 +42,6 @@
③ 代码整洁、架构整洁,遵循《阿里巴巴 Java 开发手册》规范代码注释详细113770 行 Java 代码42462 行代码注释。 ③ 代码整洁、架构整洁,遵循《阿里巴巴 Java 开发手册》规范代码注释详细113770 行 Java 代码42462 行代码注释。
## 🤝 项目外包
我们也是接外包滴,如果你有项目想要外包,可以微信联系【**Aix9975**】。
团队包含专业的项目经理、架构师、前端工程师、后端工程师、测试工程师、运维工程师,可以提供全流程的外包服务。
项目可以是商城、SCRM 系统、OA 系统、物流系统、ERP 系统、CMS 系统、HIS 系统、支付系统、IM 聊天、微信公众号、微信小程序等等。
## 🐼 内置功能
系统内置多种多种业务功能,可以用于快速你的业务系统:
![功能分层](/.image/common/ruoyi-vue-pro-biz.png)
* 通用模块(必选):系统功能、基础设施
* 通用模块(可选):工作流程、支付系统、数据报表、会员中心
* 业务系统按需ERP 系统、CRM 系统、商城系统、微信公众号、AI 大模型
> 友情提示:本项目基于 RuoYi-Vue 修改,**重构优化**后端的代码,**美化**前端的界面。
>
> * 额外新增的功能,我们使用 🚀 标记。
> * 重新实现的功能,我们使用 ⭐️ 标记。
🙂 所有功能,都通过 **单元测试** 保证高质量。
### 系统功能 ### 系统功能
@@ -245,10 +167,6 @@
| 🚀 | 图文草稿箱 | 新增常用的图文素材到草稿箱,可发布到公众号 | | 🚀 | 图文草稿箱 | 新增常用的图文素材到草稿箱,可发布到公众号 |
| 🚀 | 图文发表记录 | 查看已发布成功的图文素材,支持删除操作 | | 🚀 | 图文发表记录 | 查看已发布成功的图文素材,支持删除操作 |
### 商城系统
演示地址:<https://doc.iocoder.cn/mall-preview/>
![功能图](/.image/common/mall-feature.png) ![功能图](/.image/common/mall-feature.png)
![功能图](/.image/common/mall-preview.png) ![功能图](/.image/common/mall-preview.png)
@@ -263,25 +181,6 @@
| 🚀 | 会员分组 | 对会员进行分组,用于用户画像、内容推送等运营手段 | | 🚀 | 会员分组 | 对会员进行分组,用于用户画像、内容推送等运营手段 |
| 🚀 | 积分签到 | 回馈给签到、消费等行为的积分,会员可订单抵现、积分兑换等途径消耗 | | 🚀 | 积分签到 | 回馈给签到、消费等行为的积分,会员可订单抵现、积分兑换等途径消耗 |
### ERP 系统
演示地址:<https://doc.iocoder.cn/erp-preview/>
![功能图](/.image/common/erp-feature.png)
### CRM 系统
演示地址:<https://doc.iocoder.cn/crm-preview/>
![功能图](/.image/common/crm-feature.png)
### AI 大模型
演示地址:<https://doc.iocoder.cn/ai-preview/>
![功能图](/.image/common/ai-feature.png)
![功能图](/.image/common/ai-preview.gif)
## 🐨 技术栈 ## 🐨 技术栈

View File

@@ -7,6 +7,13 @@ public interface GameErrorCodeConstants {
ErrorCode GAME_USER_NOT_EXISTS = new ErrorCode(2_001_110_002, "养蜂游戏用户不存在"); ErrorCode GAME_USER_NOT_EXISTS = new ErrorCode(2_001_110_002, "养蜂游戏用户不存在");
ErrorCode INSUFFICIENT_NECTAR = new ErrorCode(2_001_110_102, "花蜜不足"); ErrorCode INSUFFICIENT_NECTAR = new ErrorCode(2_001_110_102, "花蜜不足");
ErrorCode STAGE_CAP = new ErrorCode(2_001_110_202, "蜂箱已达到当前阶段上限,请选择升级或收获");
ErrorCode LEVEL_UP_EXCEPTION = new ErrorCode(2_001_110_702, "条件设置异常");
ErrorCode PROGRESS_NOT_ENOUGH = new ErrorCode(2_001_110_302, "未达到收获进度");
ErrorCode UPGRADE_CONDITIONS_ARE_NOT_MET = new ErrorCode(2_001_110_402, "不满足升级条件");
ErrorCode LEVEL_FULL = new ErrorCode(2_001_110_502, "蜂箱已完成,请收获");
ErrorCode LEVEL_NOT_ENOUGH = new ErrorCode(2_001_110_602, "蜂箱等级不足,无法收获");
ErrorCode GAME_STRATEGY_NOT_EXISTS = new ErrorCode(2_001_110_003, "养蜂游戏丰收攻略不存在"); ErrorCode GAME_STRATEGY_NOT_EXISTS = new ErrorCode(2_001_110_003, "养蜂游戏丰收攻略不存在");

View File

@@ -2,7 +2,6 @@ package cn.iocoder.yudao.bee.front.controller.admin.game.gameuserbeehive.vo;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.*;
import java.util.*;
import com.alibaba.excel.annotation.*; import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 养蜂游戏用户蜂箱中间 Response VO") @Schema(description = "管理后台 - 养蜂游戏用户蜂箱中间 Response VO")
@@ -26,8 +25,8 @@ public class GameUserBeehiveRespVO {
@ExcelProperty("进度") @ExcelProperty("进度")
private Integer progress; private Integer progress;
@Schema(description = "阶段") @Schema(description = "等级")
@ExcelProperty("阶段") @ExcelProperty("等级")
private Integer process; private Integer level;
} }

View File

@@ -2,14 +2,18 @@ package cn.iocoder.yudao.bee.front.controller.app.game;
import cn.iocoder.yudao.bee.front.controller.admin.game.gameactivity.vo.GameActivityRespVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gameactivity.vo.GameActivityRespVO;
import cn.iocoder.yudao.bee.front.controller.admin.game.gameannouncement.vo.GameAnnouncementRespVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gameannouncement.vo.GameAnnouncementRespVO;
import cn.iocoder.yudao.bee.front.controller.admin.game.gamebeehive.vo.GameBeehiveRespVO;
import cn.iocoder.yudao.bee.front.controller.admin.game.gameexchangerecords.vo.GameExchangeRecordsRespVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gameexchangerecords.vo.GameExchangeRecordsRespVO;
import cn.iocoder.yudao.bee.front.controller.admin.game.gameharvest.vo.GameHarvestRespVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gameharvest.vo.GameHarvestRespVO;
import cn.iocoder.yudao.bee.front.controller.admin.game.gamestrategy.vo.GameStrategyRespVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gamestrategy.vo.GameStrategyRespVO;
import cn.iocoder.yudao.bee.front.controller.admin.game.gametask.vo.GameTaskRespVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gametask.vo.GameTaskRespVO;
import cn.iocoder.yudao.bee.front.controller.admin.game.gameuser.vo.GameUserRespVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gameuser.vo.GameUserRespVO;
import cn.iocoder.yudao.bee.front.controller.app.game.dto.GameBeehiveInfoDTO; import cn.iocoder.yudao.bee.front.controller.app.game.dto.GameBeehiveInfoDTO;
import cn.iocoder.yudao.bee.front.controller.app.game.dto.GameUserRespDTO;
import cn.iocoder.yudao.bee.front.controller.app.game.dto.GameUserRespInfo;
import cn.iocoder.yudao.bee.front.service.beeuser.BeeUserService; import cn.iocoder.yudao.bee.front.service.beeuser.BeeUserService;
import cn.iocoder.yudao.bee.front.service.game.*; import cn.iocoder.yudao.bee.front.service.game.*;
import cn.iocoder.yudao.bee.front.controller.app.game.dto.LevelNeedDTO;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
@@ -19,6 +23,7 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.annotation.security.PermitAll; import javax.annotation.security.PermitAll;
import javax.servlet.http.HttpServletRequest;
import java.util.List; import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -91,9 +96,30 @@ public class AppGameIndexController {
return success(BeanUtils.toBean(gameAnnouncementService.getGameAnnouncement(id),GameAnnouncementRespVO.class)); return success(BeanUtils.toBean(gameAnnouncementService.getGameAnnouncement(id),GameAnnouncementRespVO.class));
} }
@GetMapping("/get/my/beehive") @GetMapping("/get/userList")
@Operation(summary = "获取其他用户列表")
@PermitAll
public CommonResult<List<GameUserRespDTO>> getUserList() {
return success(gameUserService.getUserList());
}
@GetMapping("/visit/user")
@Operation(summary = "访问其他用户")
@PermitAll
public CommonResult<GameUserRespInfo> getUserList(@RequestParam("userId") Integer userId) {
return success(gameUserService.getGameUserRespInfo(userId));
}
@GetMapping("/get/beehive")
@Operation(summary = "获取蜂箱列表") @Operation(summary = "获取蜂箱列表")
@PermitAll @PermitAll
public CommonResult<List<GameBeehiveRespVO>> getBeehiveList() {
return success(BeanUtils.toBean(gameBeehiveService.getBeehiveList(),GameBeehiveRespVO.class));
}
@GetMapping("/get/my/beehive")
@Operation(summary = "获取我的蜂箱列表")
@PermitAll
public CommonResult<List<GameBeehiveInfoDTO>> getMyBeehive() { public CommonResult<List<GameBeehiveInfoDTO>> getMyBeehive() {
return success(gameBeehiveService.getGameAnnouncementList()); return success(gameBeehiveService.getGameAnnouncementList());
} }
@@ -102,8 +128,34 @@ public class AppGameIndexController {
@Operation(summary = "领取蜜蜂") @Operation(summary = "领取蜜蜂")
@Parameter(name = "id", description = "蜂箱编号", required = true, example = "1024") @Parameter(name = "id", description = "蜂箱编号", required = true, example = "1024")
@PermitAll @PermitAll
public CommonResult<Boolean> receiveBee(@RequestParam("id")Integer id){ public CommonResult<Boolean> receiveBee(HttpServletRequest request, @RequestParam("id")Integer id){
gameBeehiveService.receiveBee(id); gameBeehiveService.receiveBee(request,id);
return success(true);
}
@GetMapping("/get/escalationConditions")
@Operation(summary = "查看升级条件")
@Parameter(name = "id", description = "蜂箱编号", required = true, example = "1024")
@PermitAll
public CommonResult<LevelNeedDTO> getEscalationConditions(@RequestParam("id") Integer id) {
return success(gameBeehiveService.getNeed(id));
}
@PostMapping("/upgrade/beehive")
@Operation(summary = "升级蜂箱")
@Parameter(name = "id", description = "蜂箱编号", required = true, example = "1024")
@PermitAll
public CommonResult<Boolean> upgrade(@RequestParam("id")Integer id){
gameBeehiveService.levelUp(id);
return success(true);
}
@PostMapping("/harvest/beehive")
@Operation(summary = "收获蜂箱")
@Parameter(name = "id", description = "蜂箱编号", required = true, example = "1024")
@PermitAll
public CommonResult<Boolean> harvestBeehive(@RequestParam("id")Integer id){
gameBeehiveService.HarvestBeehive(id);
return success(true); return success(true);
} }

View File

@@ -0,0 +1,17 @@
package cn.iocoder.yudao.bee.front.controller.app.game.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class GameUserRespDTO {
@Schema(description = "用户编号")
private Integer userId;
@Schema(description = "用户名", example = "张三")
private String name;
@Schema(description = "收获数量,单位:罐",example = "24")
private Long harvestNumber;
}

View File

@@ -0,0 +1,13 @@
package cn.iocoder.yudao.bee.front.controller.app.game.dto;
import cn.iocoder.yudao.bee.front.controller.admin.game.gameuserbeehive.vo.GameUserBeehiveRespVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "养蜂游戏-其他用户信息 RespVO")
public class GameUserRespInfo extends GameUserRespDTO {
private GameUserBeehiveRespVO gameBeehive;
}

View File

@@ -0,0 +1,15 @@
package cn.iocoder.yudao.bee.front.controller.app.game.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "蜂箱升级条件 DTO")
public class LevelNeedDTO {
@Schema(description = "当前等级")
private Integer level;
@Schema(description = "升级所需M币")
private Integer levelNeed;
}

View File

@@ -8,14 +8,17 @@ import cn.iocoder.yudao.bee.front.service.banner.BannerService;
import cn.iocoder.yudao.bee.front.service.index.WeiXinMiniService; import cn.iocoder.yudao.bee.front.service.index.WeiXinMiniService;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import com.alipay.api.kms.aliyun.http.HttpRequest;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.annotation.security.PermitAll; import javax.annotation.security.PermitAll;
import javax.servlet.http.HttpServletRequest;
import java.util.List; import java.util.List;
@RestController @RestController
@@ -55,7 +58,7 @@ public class WeiXinMiniController {
@GetMapping("/get/MyBeehiveInfo") @GetMapping("/get/MyBeehiveInfo")
@Operation(summary = "获取首页我的蜂箱列表") @Operation(summary = "获取首页我的蜂箱列表")
@PermitAll @PermitAll
public CommonResult<List<AppBeehiveAdoptRespVO>> getMyBeehiveInfo() { public CommonResult<List<AppBeehiveAdoptRespVO>> getMyBeehiveInfo(@RequestParam("id") Integer id) {
return CommonResult.success(weiXinMiniService.getMyBeehiveAdoptList()); return CommonResult.success(weiXinMiniService.getMyBeehiveAdoptList(id));
} }
} }

View File

@@ -1,7 +1,6 @@
package cn.iocoder.yudao.bee.front.dal.dataobject.game; package cn.iocoder.yudao.bee.front.dal.dataobject.game;
import lombok.*; import lombok.*;
import java.util.*;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
@@ -40,6 +39,6 @@ public class GameUserBeehiveDO extends BaseDO {
/** /**
* 阶段 * 阶段
*/ */
private Integer process; private Integer level;
} }

View File

@@ -20,7 +20,7 @@ public interface GameUserBeehiveMapper extends BaseMapperX<GameUserBeehiveDO> {
.eqIfPresent(GameUserBeehiveDO::getBeehiveId, reqVO.getBeehiveId()) .eqIfPresent(GameUserBeehiveDO::getBeehiveId, reqVO.getBeehiveId())
.eqIfPresent(GameUserBeehiveDO::getUserId, reqVO.getUserId()) .eqIfPresent(GameUserBeehiveDO::getUserId, reqVO.getUserId())
.eqIfPresent(GameUserBeehiveDO::getProgress, reqVO.getProgress()) .eqIfPresent(GameUserBeehiveDO::getProgress, reqVO.getProgress())
.eqIfPresent(GameUserBeehiveDO::getProcess, reqVO.getProcess()) .eqIfPresent(GameUserBeehiveDO::getLevel, reqVO.getProcess())
.orderByDesc(GameUserBeehiveDO::getId)); .orderByDesc(GameUserBeehiveDO::getId));
} }

View File

@@ -4,6 +4,7 @@ import java.util.*;
import cn.iocoder.yudao.bee.front.controller.admin.game.gameannouncement.vo.GameAnnouncementPageReqVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gameannouncement.vo.GameAnnouncementPageReqVO;
import cn.iocoder.yudao.bee.front.controller.admin.game.gameannouncement.vo.GameAnnouncementSaveReqVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gameannouncement.vo.GameAnnouncementSaveReqVO;
import cn.iocoder.yudao.bee.front.controller.app.game.dto.GameUserRespDTO;
import cn.iocoder.yudao.bee.front.dal.dataobject.game.GameAnnouncementDO; import cn.iocoder.yudao.bee.front.dal.dataobject.game.GameAnnouncementDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageParam;
@@ -56,4 +57,5 @@ public interface GameAnnouncementService {
PageResult<GameAnnouncementDO> getGameAnnouncementPage(GameAnnouncementPageReqVO pageReqVO); PageResult<GameAnnouncementDO> getGameAnnouncementPage(GameAnnouncementPageReqVO pageReqVO);
List<GameAnnouncementDO> getGameAnnouncementList(); List<GameAnnouncementDO> getGameAnnouncementList();
} }

View File

@@ -6,9 +6,11 @@ import cn.iocoder.yudao.bee.front.controller.admin.game.gamebeehive.vo.GameBeehi
import cn.iocoder.yudao.bee.front.controller.admin.game.gamebeehive.vo.GameBeehiveSaveReqVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gamebeehive.vo.GameBeehiveSaveReqVO;
import cn.iocoder.yudao.bee.front.controller.app.game.dto.GameBeehiveInfoDTO; import cn.iocoder.yudao.bee.front.controller.app.game.dto.GameBeehiveInfoDTO;
import cn.iocoder.yudao.bee.front.dal.dataobject.game.GameBeehiveDO; import cn.iocoder.yudao.bee.front.dal.dataobject.game.GameBeehiveDO;
import cn.iocoder.yudao.bee.front.controller.app.game.dto.LevelNeedDTO;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam; import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid; import javax.validation.Valid;
/** /**
@@ -58,7 +60,17 @@ public interface GameBeehiveService {
List<GameBeehiveInfoDTO> getGameAnnouncementList(); List<GameBeehiveInfoDTO> getGameAnnouncementList();
void receiveBee(Integer id); void receiveBee(HttpServletRequest request, Integer id);
void fedBee(Integer id); void fedBee(Integer id);
LevelNeedDTO getNeed(Integer id);
@Transactional(rollbackFor = Exception.class)
void levelUp(Integer id);
@Transactional(rollbackFor = Exception.class)
void HarvestBeehive(Integer id);
List<GameBeehiveDO> getBeehiveList();
} }

View File

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.bee.front.service.game;
import cn.iocoder.yudao.bee.front.controller.admin.game.gamebeehive.vo.GameBeehivePageReqVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gamebeehive.vo.GameBeehivePageReqVO;
import cn.iocoder.yudao.bee.front.controller.admin.game.gamebeehive.vo.GameBeehiveSaveReqVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gamebeehive.vo.GameBeehiveSaveReqVO;
import cn.iocoder.yudao.bee.front.controller.admin.game.gameharvest.vo.GameHarvestSaveReqVO;
import cn.iocoder.yudao.bee.front.controller.admin.game.gameuser.vo.GameUserSaveReqVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gameuser.vo.GameUserSaveReqVO;
import cn.iocoder.yudao.bee.front.controller.admin.game.gameuserbeehive.vo.GameUserBeehiveSaveReqVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gameuserbeehive.vo.GameUserBeehiveSaveReqVO;
import cn.iocoder.yudao.bee.front.controller.app.game.dto.GameBeehiveInfoDTO; import cn.iocoder.yudao.bee.front.controller.app.game.dto.GameBeehiveInfoDTO;
@@ -10,23 +11,31 @@ import cn.iocoder.yudao.bee.front.dal.dataobject.game.GameBeehiveDO;
import cn.iocoder.yudao.bee.front.dal.dataobject.game.GameUserBeehiveDO; import cn.iocoder.yudao.bee.front.dal.dataobject.game.GameUserBeehiveDO;
import cn.iocoder.yudao.bee.front.dal.dataobject.game.GameUserDO; import cn.iocoder.yudao.bee.front.dal.dataobject.game.GameUserDO;
import cn.iocoder.yudao.bee.front.dal.mysql.game.GameBeehiveMapper; import cn.iocoder.yudao.bee.front.dal.mysql.game.GameBeehiveMapper;
import cn.iocoder.yudao.bee.front.enums.game.GameHarvestStatusEnum;
import cn.iocoder.yudao.bee.front.service.beeuser.BeeUserService; import cn.iocoder.yudao.bee.front.service.beeuser.BeeUserService;
import cn.iocoder.yudao.bee.front.controller.app.game.dto.LevelNeedDTO;
import cn.iocoder.yudao.bee.front.util.AssertUtils; import cn.iocoder.yudao.bee.front.util.AssertUtils;
import cn.iocoder.yudao.module.pay.dal.dataobject.wallet.PayWalletDO;
import cn.iocoder.yudao.module.pay.service.wallet.PayWalletService;
import cn.iocoder.yudao.module.system.api.dict.DictDataApi;
import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO;
import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import static cn.iocoder.yudao.bee.front.enums.GameErrorCodeConstants.*; import static cn.iocoder.yudao.bee.front.enums.GameErrorCodeConstants.*;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -51,6 +60,14 @@ public class GameBeehiveServiceImpl implements GameBeehiveService {
@Resource @Resource
private GameUserBeehiveService gameUserBeehiveService; private GameUserBeehiveService gameUserBeehiveService;
@Autowired
private OAuth2TokenService oAuth2TokenService;
@Autowired
private GameHarvestService gameHarvestService;
@Autowired
private DictDataApi dictDataApi;
@Autowired
private PayWalletService payWalletService;
@Override @Override
public Integer createGameBeehive(GameBeehiveSaveReqVO createReqVO) { public Integer createGameBeehive(GameBeehiveSaveReqVO createReqVO) {
@@ -98,12 +115,9 @@ public class GameBeehiveServiceImpl implements GameBeehiveService {
@Override @Override
public List<GameBeehiveInfoDTO> getGameAnnouncementList() { public List<GameBeehiveInfoDTO> getGameAnnouncementList() {
// 获取当前用户 // 获取当前用户
BeeUserDO userInfo = beeUserService.getLoginUserInfo(); BeeUserDO userInfo = beeUserService.getLoginUserInfoException();
// 获取游戏用户信息,无则创建 // 获取游戏用户信息,无则创建
GameUserDO gameUser = gameUserService.getGameUserByUserId(userInfo.getId()); GameUserDO gameUser = gameUserService.getGameUserByUserId(userInfo.getId());
if (gameUser == null) {
return Collections.emptyList();
}
// 获取用户蜂箱列表 // 获取用户蜂箱列表
List<GameUserBeehiveDO> userBeehiveList = gameUserBeehiveService.getGameUserBeehiveList(gameUser.getId()); List<GameUserBeehiveDO> userBeehiveList = gameUserBeehiveService.getGameUserBeehiveList(gameUser.getId());
@@ -138,7 +152,7 @@ public class GameBeehiveServiceImpl implements GameBeehiveService {
for (GameUserBeehiveDO userBeehive : userBeehiveList) { for (GameUserBeehiveDO userBeehive : userBeehiveList) {
GameBeehiveInfoDTO dto = beehiveMap.get(userBeehive.getBeehiveId()); GameBeehiveInfoDTO dto = beehiveMap.get(userBeehive.getBeehiveId());
if (dto != null) { if (dto != null) {
dto.setProcess(userBeehive.getProcess()); dto.setProcess(userBeehive.getLevel());
dto.setProgress(userBeehive.getProgress()); dto.setProgress(userBeehive.getProgress());
} }
} }
@@ -147,10 +161,12 @@ public class GameBeehiveServiceImpl implements GameBeehiveService {
} }
@Override @Override
public void receiveBee(Integer id) { public void receiveBee(HttpServletRequest request, Integer id) {
Integer userId = beeUserService.getUserIdException(); Integer userId = beeUserService.getUserIdException();
GameUserDO gameUserDO = gameUserService.getGameUserByUserId(userId); GameUserDO gameUserDO = gameUserService.getGameUserByUserId(userId);
GameUserBeehiveSaveReqVO gameUserBeehiveDO = new GameUserBeehiveSaveReqVO(); GameUserBeehiveSaveReqVO gameUserBeehiveDO = new GameUserBeehiveSaveReqVO();
GameBeehiveDO gameBeehiveDO = gameBeehiveMapper.selectById(id);
if (gameBeehiveDO == null) throw exception(GAME_BEEHIVE_NOT_EXISTS);
gameUserBeehiveDO.setBeehiveId(id).setUserId(gameUserDO.getId()).setProcess(0).setProgress(0); gameUserBeehiveDO.setBeehiveId(id).setUserId(gameUserDO.getId()).setProcess(0).setProgress(0);
gameUserBeehiveService.createGameUserBeehive(gameUserBeehiveDO); gameUserBeehiveService.createGameUserBeehive(gameUserBeehiveDO);
} }
@@ -168,11 +184,113 @@ public class GameBeehiveServiceImpl implements GameBeehiveService {
else { else {
nectarNumber -= 500; nectarNumber -= 500;
gameUserService.updateGameUser(new GameUserSaveReqVO().setId(gameUser.getId()).setNectarNumber(nectarNumber)); gameUserService.updateGameUser(new GameUserSaveReqVO().setId(gameUser.getId()).setNectarNumber(nectarNumber));
gameUserBeehiveDO.setProgress(gameUserBeehiveDO.getProgress() + 1); Integer level = gameUserBeehiveDO.getLevel();
if (gameUserBeehiveDO.getProgress() == 10) { String levelUpCount = getDictValue("level_up_count", level);
gameUserBeehiveDO.setProcess(gameUserBeehiveDO.getProcess() + 1);
} if (gameUserBeehiveDO.getProgress() == Integer.parseInt(levelUpCount)) throw exception(STAGE_CAP);
else gameUserBeehiveDO.setProgress(gameUserBeehiveDO.getProgress() + 1);
gameUserBeehiveService.updateGameUserBeehive(BeanUtils.toBean(gameUserBeehiveDO, GameUserBeehiveSaveReqVO.class)); gameUserBeehiveService.updateGameUserBeehive(BeanUtils.toBean(gameUserBeehiveDO, GameUserBeehiveSaveReqVO.class));
} }
} }
@Override
public LevelNeedDTO getNeed(Integer id) {
Integer userId = beeUserService.getUserIdException();
GameUserBeehiveDO gameUserBeehiveDO = gameUserBeehiveService.getGameUserBeehiveByBeehiveId(id,userId);
AssertUtils.notNull(gameUserBeehiveDO,GAME_BEEHIVE_NOT_EXISTS);
GameUserDO gameUser = gameUserService.getGameUser(gameUserBeehiveDO.getUserId());
AssertUtils.notNull(gameUser,GAME_USER_NOT_EXISTS);
Integer level = gameUserBeehiveDO.getLevel();
LevelNeedDTO dto = new LevelNeedDTO();
dto.setLevel(level);
String levelNeed = getDictValue("level_need",level);
dto.setLevelNeed(Integer.parseInt(levelNeed));
return dto;
}
private String getDictValue(String type, Integer level) {
String levelName = (level +1) + "";
DictDataRespDTO dictDataRespDTO = dictDataApi.parseDictData(type, levelName);
if (dictDataRespDTO == null) throw exception(LEVEL_UP_EXCEPTION);
return dictDataRespDTO.getValue();
}
@Transactional(rollbackFor = Exception.class)
@Override
public void levelUp(Integer id) {
Integer userId = beeUserService.getUserIdException();
GameUserBeehiveDO gameUserBeehiveDO = gameUserBeehiveService.getGameUserBeehiveByBeehiveId(id,userId);
AssertUtils.notNull(gameUserBeehiveDO,GAME_BEEHIVE_NOT_EXISTS);
GameUserDO gameUser = gameUserService.getGameUser(gameUserBeehiveDO.getUserId());
AssertUtils.notNull(gameUser,GAME_USER_NOT_EXISTS);
Integer level = gameUserBeehiveDO.getLevel();
PayWalletDO wallet = payWalletService.getWalletByUserId(gameUser.getBeeUserId());
String levelNeed = getDictValue("level_need",level);
switch (level) {
case 1:
case 2:
case 3:
if (gameUserBeehiveDO.getProgress() == 10 && wallet.getCoin()>Integer.parseInt(levelNeed)) {
gameUserBeehiveDO.setLevel(level + 1);
gameUserBeehiveDO.setProgress(0);
wallet.setCoin(wallet.getCoin()-Integer.parseInt(levelNeed));
}else throw exception(UPGRADE_CONDITIONS_ARE_NOT_MET);
break;
case 4:throw exception(LEVEL_FULL);
default:throw exception(UPGRADE_CONDITIONS_ARE_NOT_MET);
}
payWalletService.updateCoins(wallet);
gameUserBeehiveService.updateGameUserBeehive(BeanUtils.toBean(gameUserBeehiveDO, GameUserBeehiveSaveReqVO.class));
}
@Transactional(rollbackFor = Exception.class)
@Override
public void HarvestBeehive(Integer id) {
Integer userId = beeUserService.getUserIdException();
GameUserBeehiveDO gameUserBeehiveDO = gameUserBeehiveService.getGameUserBeehiveByBeehiveId(id,userId);
AssertUtils.notNull(gameUserBeehiveDO,GAME_BEEHIVE_NOT_EXISTS);
GameUserDO gameUser = gameUserService.getGameUser(gameUserBeehiveDO.getUserId());
AssertUtils.notNull(gameUser,GAME_USER_NOT_EXISTS);
Integer level = gameUserBeehiveDO.getLevel();
String dictKey = level < 4 ? (level + 1) + "" : level + "";
//校验收获阶段是否满足
DictDataRespDTO dictDataRespDTO = dictDataApi.parseDictData("level_up_count", dictKey);
if (dictDataRespDTO == null) throw exception(LEVEL_UP_EXCEPTION);
String value = dictDataRespDTO.getValue();
Integer harvestCount = Integer.parseInt(value);
if (gameUserBeehiveDO.getProgress() < harvestCount) throw exception(PROGRESS_NOT_ENOUGH);
//创建收获
GameHarvestSaveReqVO gameHarvestDO = new GameHarvestSaveReqVO();
gameHarvestDO.setBeehiveId(id)
.setUserId(userId)
.setStatus(GameHarvestStatusEnum.REDEEMABLE.getStatus())
.setExpireTime(LocalDateTime.now().plusDays(7L));
//设置收获价值
switch (level) {
case 1:
gameHarvestDO.setName("普通蜂蜜").setPrice(Integer.parseInt(dictDataApi.parseDictData("harvest_level","普通蜂蜜").getValue()));
break;
case 2:
gameHarvestDO.setName("中级蜂蜜").setPrice(Integer.parseInt(dictDataApi.parseDictData("harvest_level","中级蜂蜜").getValue()));
break;
case 3:
gameHarvestDO.setName("高级蜂蜜").setPrice(Integer.parseInt(dictDataApi.parseDictData("harvest_level","高级蜂蜜").getValue()));
break;
case 4:
gameHarvestDO.setName("稀有蜂蜜").setPrice(Integer.parseInt(dictDataApi.parseDictData("harvest_level","稀有蜂蜜").getValue()));
break;
default:throw exception(LEVEL_NOT_ENOUGH);
}
//创建收获信息
gameHarvestService.createGameHarvest(gameHarvestDO);
//收获后清理蜂箱数据
gameUserBeehiveService.deleteGameUserBeehive(gameUserBeehiveDO.getUserId());
}
@Override
public List<GameBeehiveDO> getBeehiveList() {
return gameBeehiveMapper.selectList(null);
}
} }

View File

@@ -59,4 +59,5 @@ public interface GameHarvestService {
void redeemCoin(Integer id); void redeemCoin(Integer id);
Long getGameHarvestCount(Integer id);
} }

View File

@@ -10,7 +10,6 @@ import cn.iocoder.yudao.bee.front.enums.game.GameHarvestStatusEnum;
import cn.iocoder.yudao.bee.front.service.beeuser.BeeUserService; import cn.iocoder.yudao.bee.front.service.beeuser.BeeUserService;
import cn.iocoder.yudao.module.pay.dal.dataobject.wallet.PayWalletDO; import cn.iocoder.yudao.module.pay.dal.dataobject.wallet.PayWalletDO;
import cn.iocoder.yudao.module.pay.service.wallet.PayWalletService; import cn.iocoder.yudao.module.pay.service.wallet.PayWalletService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -18,7 +17,6 @@ import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@@ -94,9 +92,18 @@ public class GameHarvestServiceImpl implements GameHarvestService {
@Override @Override
public List<GameHarvestDO> getGameHarvestList() { public List<GameHarvestDO> getGameHarvestList() {
Integer userIdException = beeUserService.getUserIdException(); Integer loginUser = beeUserService.getUserIdException();
GameUserDO gameUserDO = gameUserService.getGameUserByUserId(userIdException); GameUserDO gameUserDO = gameUserService.getGameUserByUserId(loginUser);
return gameHarvestMapper.selectList(GameHarvestDO::getUserId, gameUserDO.getId()); if (gameUserDO == null) return Collections.emptyList();
List<GameHarvestDO> gameHarvestDOS = gameHarvestMapper.selectList(GameHarvestDO::getUserId, gameUserDO.getId());
if (gameHarvestDOS == null || gameHarvestDOS.isEmpty()) return Collections.emptyList();
gameHarvestDOS.forEach(gameHarvestDO -> {
if (LocalDateTime.now().isAfter(gameHarvestDO.getExpireTime())) {
gameHarvestDO.setStatus(GameHarvestStatusEnum.EXPIRED.getStatus());
gameHarvestMapper.updateById(gameHarvestDO);
}
});
return gameHarvestDOS;
} }
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@@ -108,8 +115,14 @@ public class GameHarvestServiceImpl implements GameHarvestService {
if (gameHarvest == null || gameHarvest.getExpireTime().isBefore(LocalDateTime.now())) throw exception(GAME_HARVEST_NOT_EXISTS); if (gameHarvest == null || gameHarvest.getExpireTime().isBefore(LocalDateTime.now())) throw exception(GAME_HARVEST_NOT_EXISTS);
if (!gameHarvest.getStatus().equals(GameHarvestStatusEnum.REDEEMABLE.getStatus()))throw exception(GAME_HARVEST_NOT_REDEEM); if (!gameHarvest.getStatus().equals(GameHarvestStatusEnum.REDEEMABLE.getStatus()))throw exception(GAME_HARVEST_NOT_REDEEM);
wallet.setCoin(wallet.getCoin()+gameHarvest.getPrice()); wallet.setCoin(wallet.getCoin()+gameHarvest.getPrice());
payWalletService.addCoins(new PayWalletDO().setId(wallet.getId()).setCoin(wallet.getCoin())); payWalletService.updateCoins(new PayWalletDO().setId(wallet.getId()).setCoin(wallet.getCoin()));
gameHarvest.setStatus(GameHarvestStatusEnum.REDEEMED.getStatus()); gameHarvest.setStatus(GameHarvestStatusEnum.REDEEMED.getStatus());
gameHarvestMapper.updateById(gameHarvest); gameHarvestMapper.updateById(gameHarvest);
} }
@Override
public Long getGameHarvestCount(Integer id) {
Long count = gameHarvestMapper.selectCount(GameHarvestDO::getUserId, id);
return count == null ? 0 : count;
}
} }

View File

@@ -94,7 +94,7 @@ public class GameTaskServiceImpl implements GameTaskService {
Integer userId = beeUserService.getUserIdException(); Integer userId = beeUserService.getUserIdException();
List<GameTaskDO> gameTaskDOS = taskMapper.selectList(null); List<GameTaskDO> gameTaskDOS = taskMapper.selectList(null);
GameUserDO gameUser = gameUserService.getGameUserByUserId(userId); GameUserDO gameUser = gameUserService.getGameUserByUserId(userId);
if (gameUser == null) return Collections.emptyList();
//获取今日任务记录 //获取今日任务记录
List<GameTaskRecordsDO> gameTaskRecordsDOS = gameTaskRecordsMapper List<GameTaskRecordsDO> gameTaskRecordsDOS = gameTaskRecordsMapper
.selectList(GameTaskRecordsDO::getGameUserId, gameUser.getId(), GameTaskRecordsDO::getCreateTime, LocalDate.now()); .selectList(GameTaskRecordsDO::getGameUserId, gameUser.getId(), GameTaskRecordsDO::getCreateTime, LocalDate.now());

View File

@@ -57,4 +57,6 @@ public interface GameUserBeehiveService {
List<GameUserBeehiveDO> getGameUserBeehiveList(Integer id); List<GameUserBeehiveDO> getGameUserBeehiveList(Integer id);
GameUserBeehiveDO getGameUserBeehiveByBeehiveId(Integer beehiveId, Integer userId); GameUserBeehiveDO getGameUserBeehiveByBeehiveId(Integer beehiveId, Integer userId);
GameUserBeehiveDO getGameUserBeehiveByUserId(Integer userId);
} }

View File

@@ -83,4 +83,9 @@ public class GameUserBeehiveServiceImpl implements GameUserBeehiveService {
public GameUserBeehiveDO getGameUserBeehiveByBeehiveId(Integer beehiveId, Integer userId) { public GameUserBeehiveDO getGameUserBeehiveByBeehiveId(Integer beehiveId, Integer userId) {
return gameUserBeehiveMapper.selectOne(GameUserBeehiveDO::getBeehiveId,beehiveId,GameUserBeehiveDO::getUserId,userId); return gameUserBeehiveMapper.selectOne(GameUserBeehiveDO::getBeehiveId,beehiveId,GameUserBeehiveDO::getUserId,userId);
} }
@Override
public GameUserBeehiveDO getGameUserBeehiveByUserId(Integer userId) {
return gameUserBeehiveMapper.selectOne(GameUserBeehiveDO::getUserId,userId);
}
} }

View File

@@ -2,11 +2,14 @@ package cn.iocoder.yudao.bee.front.service.game;
import cn.iocoder.yudao.bee.front.controller.admin.game.gameuser.vo.GameUserPageReqVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gameuser.vo.GameUserPageReqVO;
import cn.iocoder.yudao.bee.front.controller.admin.game.gameuser.vo.GameUserSaveReqVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gameuser.vo.GameUserSaveReqVO;
import cn.iocoder.yudao.bee.front.controller.app.game.dto.GameUserRespDTO;
import cn.iocoder.yudao.bee.front.controller.app.game.dto.GameUserRespInfo;
import cn.iocoder.yudao.bee.front.dal.dataobject.beeuser.BeeUserDO; import cn.iocoder.yudao.bee.front.dal.dataobject.beeuser.BeeUserDO;
import cn.iocoder.yudao.bee.front.dal.dataobject.game.GameUserDO; import cn.iocoder.yudao.bee.front.dal.dataobject.game.GameUserDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List;
/** /**
* 养蜂游戏用户 Service 接口 * 养蜂游戏用户 Service 接口
@@ -57,4 +60,7 @@ public interface GameUserService {
GameUserDO getOrCreateGameUserByUserId(BeeUserDO userDO); GameUserDO getOrCreateGameUserByUserId(BeeUserDO userDO);
List<GameUserRespDTO> getUserList();
GameUserRespInfo getGameUserRespInfo(Integer userId);
} }

View File

@@ -2,7 +2,11 @@ package cn.iocoder.yudao.bee.front.service.game;
import cn.iocoder.yudao.bee.front.controller.admin.game.gameuser.vo.GameUserPageReqVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gameuser.vo.GameUserPageReqVO;
import cn.iocoder.yudao.bee.front.controller.admin.game.gameuser.vo.GameUserSaveReqVO; import cn.iocoder.yudao.bee.front.controller.admin.game.gameuser.vo.GameUserSaveReqVO;
import cn.iocoder.yudao.bee.front.controller.admin.game.gameuserbeehive.vo.GameUserBeehiveRespVO;
import cn.iocoder.yudao.bee.front.controller.app.game.dto.GameUserRespDTO;
import cn.iocoder.yudao.bee.front.controller.app.game.dto.GameUserRespInfo;
import cn.iocoder.yudao.bee.front.dal.dataobject.beeuser.BeeUserDO; import cn.iocoder.yudao.bee.front.dal.dataobject.beeuser.BeeUserDO;
import cn.iocoder.yudao.bee.front.dal.dataobject.game.GameUserBeehiveDO;
import cn.iocoder.yudao.bee.front.dal.dataobject.game.GameUserDO; import cn.iocoder.yudao.bee.front.dal.dataobject.game.GameUserDO;
import cn.iocoder.yudao.bee.front.dal.mysql.game.GameUserMapper; import cn.iocoder.yudao.bee.front.dal.mysql.game.GameUserMapper;
import cn.iocoder.yudao.bee.front.service.beeuser.BeeUserService; import cn.iocoder.yudao.bee.front.service.beeuser.BeeUserService;
@@ -16,7 +20,11 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.bee.front.enums.GameErrorCodeConstants.GAME_USER_NOT_EXISTS; import static cn.iocoder.yudao.bee.front.enums.GameErrorCodeConstants.GAME_USER_NOT_EXISTS;
import static cn.iocoder.yudao.bee.front.util.ListUtils.getRandomElementsOptimized;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
/** /**
@@ -30,6 +38,12 @@ public class GameUserServiceImpl implements GameUserService {
@Resource @Resource
private GameUserMapper gameUserMapper; private GameUserMapper gameUserMapper;
@Autowired
private BeeUserService beeUserService;
@Autowired
private GameHarvestService gameHarvestService;
@Autowired
private GameUserBeehiveService gameUserBeehiveService;
@Override @Override
public Integer createGameUser(GameUserSaveReqVO createReqVO) { public Integer createGameUser(GameUserSaveReqVO createReqVO) {
@@ -92,4 +106,48 @@ public class GameUserServiceImpl implements GameUserService {
public GameUserDO getGameUserByUserId(Integer userId) { public GameUserDO getGameUserByUserId(Integer userId) {
return gameUserMapper.selectOne(GameUserDO::getBeeUserId, userId); return gameUserMapper.selectOne(GameUserDO::getBeeUserId, userId);
} }
@Override
public List<GameUserRespDTO> getUserList() {
// 获取当前用户信息
Integer userId = beeUserService.getUserIdException();
GameUserDO currentUser = getGameUserByUserId(userId);
// 构建当前用户响应对象
GameUserRespDTO currentUserResp = getGameUserRespDTO(currentUser);
// 获取所有用户
List<GameUserDO> allUsers = gameUserMapper.selectList(null);
// 移除当前用户(避免重复)
allUsers.removeIf(user -> user.getId().equals(userId));
// 随机选择4个用户
List<GameUserDO> randomUsers = getRandomElementsOptimized(allUsers, 4);
// 构建随机用户响应列表
List<GameUserRespDTO> randomUserResps = randomUsers.stream()
.map(this::getGameUserRespDTO)
.collect(Collectors.toList());
// 将当前用户添加到结果列表的第一个位置
randomUserResps.add(0, currentUserResp);
return randomUserResps;
}
private GameUserRespDTO getGameUserRespDTO(GameUserDO gameUser) {
return new GameUserRespDTO().setUserId(gameUser.getId())
.setName(gameUser.getName())
.setHarvestNumber(gameHarvestService.getGameHarvestCount(gameUser.getId()));
}
@Override
public GameUserRespInfo getGameUserRespInfo(Integer userId){
GameUserRespDTO gameUserRespDTO = getGameUserRespDTO(gameUserMapper.selectById(userId));
GameUserRespInfo gameUserRespInfo = BeanUtils.toBean(gameUserRespDTO, GameUserRespInfo.class);
GameUserBeehiveDO gameUserBeehiveDO= gameUserBeehiveService.getGameUserBeehiveByUserId(userId);
gameUserRespInfo.setGameBeehive(BeanUtils.toBean(gameUserBeehiveDO, GameUserBeehiveRespVO.class));
return gameUserRespInfo;
}
} }

View File

@@ -6,7 +6,9 @@ import cn.iocoder.yudao.bee.front.dal.dataobject.beehive.BeehiveDO;
import cn.iocoder.yudao.bee.front.dal.dataobject.beehiveadopt.BeehiveAdoptDO; import cn.iocoder.yudao.bee.front.dal.dataobject.beehiveadopt.BeehiveAdoptDO;
import cn.iocoder.yudao.bee.front.dal.dataobject.honeyproduct.HoneyProductDO; import cn.iocoder.yudao.bee.front.dal.dataobject.honeyproduct.HoneyProductDO;
import cn.iocoder.yudao.bee.front.dal.dataobject.product.ProductDO; import cn.iocoder.yudao.bee.front.dal.dataobject.product.ProductDO;
import com.alipay.api.kms.aliyun.http.HttpRequest;
import javax.servlet.http.HttpServletRequest;
import java.util.List; import java.util.List;
public interface WeiXinMiniService { public interface WeiXinMiniService {
@@ -38,5 +40,5 @@ public interface WeiXinMiniService {
*/ */
List<ProductDO> getProductList(); List<ProductDO> getProductList();
List<AppBeehiveAdoptRespVO> getMyBeehiveAdoptList(); List<AppBeehiveAdoptRespVO> getMyBeehiveAdoptList(Integer userId);
} }

View File

@@ -18,10 +18,14 @@ import cn.iocoder.yudao.bee.front.service.product.ProductService;
import cn.iocoder.yudao.bee.front.util.AssertUtils; import cn.iocoder.yudao.bee.front.util.AssertUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum; import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum;
import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService;
import com.alipay.api.kms.aliyun.http.HttpRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -33,13 +37,13 @@ import static cn.iocoder.yudao.bee.front.enums.ErrorCodeConstants.HONEY_PRODUCT_
public class WeiXinMiniServiceImpl implements WeiXinMiniService { public class WeiXinMiniServiceImpl implements WeiXinMiniService {
@Resource @Resource
BeeFarmService beeFarmService; private BeeFarmService beeFarmService;
@Resource @Resource
BeeUserService beeUserService; private BeeUserService beeUserService;
@Resource @Resource
BeehiveService beehiveService; private BeehiveService beehiveService;
@Resource @Resource
private ProductService productService; private ProductService productService;
@@ -50,6 +54,9 @@ public class WeiXinMiniServiceImpl implements WeiXinMiniService {
@Resource @Resource
HoneyProductService honeyProductService; HoneyProductService honeyProductService;
@Resource
private OAuth2TokenService oAuth2TokenService;
@Override @Override
public BeeFarmTotalRespVO getInfo() { public BeeFarmTotalRespVO getInfo() {
BeeFarmTotalRespVO result = new BeeFarmTotalRespVO(); BeeFarmTotalRespVO result = new BeeFarmTotalRespVO();
@@ -94,8 +101,7 @@ public class WeiXinMiniServiceImpl implements WeiXinMiniService {
} }
@Override @Override
public List<AppBeehiveAdoptRespVO> getMyBeehiveAdoptList() { public List<AppBeehiveAdoptRespVO> getMyBeehiveAdoptList(Integer userId) {
Integer userId = beeUserService.getUserId();
if (userId == null) return Collections.emptyList(); if (userId == null) return Collections.emptyList();
//获取用户蜂箱认养单信息 //获取用户蜂箱认养单信息
List<BeehiveAdoptDO> adoptDOS = beehiveAdoptService.getBeehiveAdoptListByUserId(userId); List<BeehiveAdoptDO> adoptDOS = beehiveAdoptService.getBeehiveAdoptListByUserId(userId);

View File

@@ -0,0 +1,34 @@
package cn.iocoder.yudao.bee.front.util;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class ListUtils {
public static <T> List<T> getRandomElementsOptimized(List<T> list, int count) {
if (list == null || list.isEmpty() || count <= 0) {
return new ArrayList<>();
}
int size = list.size();
if (count >= size) {
return new ArrayList<>(list);
}
List<T> result = new ArrayList<>(count);
Random random = new Random();
List<Integer> selectedIndices = new ArrayList<>(count);
// 随机选择不重复的索引
while (result.size() < count) {
int randomIndex = random.nextInt(size);
if (!selectedIndices.contains(randomIndex)) {
selectedIndices.add(randomIndex);
result.add(list.get(randomIndex));
}
}
return result;
}
}

View File

@@ -99,5 +99,5 @@ public interface PayWalletService {
PayWalletDO getWalletByUserId(Integer userId); PayWalletDO getWalletByUserId(Integer userId);
void addCoins(PayWalletDO wallet); void updateCoins(PayWalletDO wallet);
} }

View File

@@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.pay.service.wallet; package cn.iocoder.yudao.module.pay.service.wallet;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.module.pay.controller.admin.wallet.vo.wallet.PayWalletPageReqVO; import cn.iocoder.yudao.module.pay.controller.admin.wallet.vo.wallet.PayWalletPageReqVO;
@@ -228,7 +229,7 @@ public class PayWalletServiceImpl implements PayWalletService {
@Override @Override
public PayWalletDO getWalletByUserId(Integer userId) { public PayWalletDO getWalletByUserId(Integer userId) {
return walletMapper.selectOne(PayWalletDO::getUserId, userId); return getOrCreateWallet(userId.longValue(), UserTypeEnum.MEMBER.getValue());
} }
@Override @Override
@@ -240,7 +241,7 @@ public class PayWalletServiceImpl implements PayWalletService {
} }
@Override @Override
public void addCoins(PayWalletDO wallet) { public void updateCoins(PayWalletDO wallet) {
walletMapper.updateById(wallet); walletMapper.updateById(wallet);
} }
} }

View File

@@ -33,10 +33,12 @@ public interface OAuth2AccessTokenMapper extends BaseMapperX<OAuth2AccessTokenDO
} }
default OAuth2AccessTokenDO selectByRefreshToken(String refreshToken){ default OAuth2AccessTokenDO selectByRefreshToken(String refreshToken){
return selectList(new LambdaQueryWrapperX<OAuth2AccessTokenDO>() List<OAuth2AccessTokenDO> oAuth2AccessTokenDOS = selectList(new LambdaQueryWrapperX<OAuth2AccessTokenDO>()
.eq(OAuth2AccessTokenDO::getRefreshToken,refreshToken) .eq(OAuth2AccessTokenDO::getRefreshToken, refreshToken)
.orderByDesc(OAuth2AccessTokenDO::getExpiresTime) .orderByDesc(OAuth2AccessTokenDO::getExpiresTime)
.last("limit 1")) .last("limit 1"));
.get(0); if (oAuth2AccessTokenDOS != null && !oAuth2AccessTokenDOS.isEmpty()){
}; return oAuth2AccessTokenDOS.get(0);
}else return null;
}
} }

View File

@@ -78,4 +78,5 @@ public interface OAuth2TokenService {
*/ */
PageResult<OAuth2AccessTokenDO> getAccessTokenPage(OAuth2AccessTokenPageReqVO reqVO); PageResult<OAuth2AccessTokenDO> getAccessTokenPage(OAuth2AccessTokenPageReqVO reqVO);
Integer getUserIdByAccessToken(String token);
} }

View File

@@ -163,6 +163,16 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
return oauth2AccessTokenMapper.selectPage(reqVO); return oauth2AccessTokenMapper.selectPage(reqVO);
} }
@Override
public Integer getUserIdByAccessToken(String token) {
OAuth2AccessTokenDO oAuth2AccessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(token);
if (oAuth2AccessTokenDO != null && !DateUtils.isExpired(oAuth2AccessTokenDO.getExpiresTime())) {
Long userId = oAuth2AccessTokenDO.getUserId();
return userId.intValue();
}
return null;
}
private OAuth2AccessTokenDO createOAuth2AccessToken(OAuth2RefreshTokenDO refreshTokenDO, OAuth2ClientDO clientDO) { private OAuth2AccessTokenDO createOAuth2AccessToken(OAuth2RefreshTokenDO refreshTokenDO, OAuth2ClientDO clientDO) {
OAuth2AccessTokenDO accessTokenDO = new OAuth2AccessTokenDO().setAccessToken(generateAccessToken()) OAuth2AccessTokenDO accessTokenDO = new OAuth2AccessTokenDO().setAccessToken(generateAccessToken())
.setUserId(refreshTokenDO.getUserId()).setUserType(refreshTokenDO.getUserType()) .setUserId(refreshTokenDO.getUserId()).setUserType(refreshTokenDO.getUserType())

View File

@@ -124,10 +124,10 @@ rocketmq:
spring: spring:
# RabbitMQ 配置项,对应 RabbitProperties 配置类 # RabbitMQ 配置项,对应 RabbitProperties 配置类
rabbitmq: rabbitmq:
host: 124.220.236.38 # RabbitMQ 服务的地址 host: 8.153.204.174 # RabbitMQ 服务的地址
port: 5672 # RabbitMQ 服务的端口 port: 5672 # RabbitMQ 服务的端口
username: admin # RabbitMQ 服务的账号 username: rabbitmq # RabbitMQ 服务的账号
password: Cd5XhnCt # RabbitMQ 服务的密码 password: rabbitmq # RabbitMQ 服务的密码
# Kafka 配置项,对应 KafkaProperties 配置类 # Kafka 配置项,对应 KafkaProperties 配置类
kafka: kafka:
bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔

View File

@@ -48,7 +48,7 @@ springdoc:
default-flat-param-object: true # 参见 https://doc.xiaominfo.com/docs/faq/v4/knife4j-parameterobject-flat-param 文档 default-flat-param-object: true # 参见 https://doc.xiaominfo.com/docs/faq/v4/knife4j-parameterobject-flat-param 文档
knife4j: knife4j:
enable: false # TODO 芋艿:需要关闭增强具体原因见https://github.com/xiaoymin/knife4j/issues/874 enable: false # TODO 需要关闭增强具体原因见https://github.com/xiaoymin/knife4j/issues/874
setting: setting:
language: zh_cn language: zh_cn
@@ -361,7 +361,7 @@ yudao:
kd100: kd100:
key: pLXUGAwK5305 key: pLXUGAwK5305
customer: E77DF18BE109F454A5CD319E44BF5177 customer: E77DF18BE109F454A5CD319E44BF5177
pay: #微信支付配置 todo 请自行配置 pay: #微信支付配置 TODO 请自行配置
wechat: wechat:
app-id: wxed3e5106f6adce94 app-id: wxed3e5106f6adce94
mch-id: 1312305301 mch-id: 1312305301
@@ -370,7 +370,7 @@ yudao:
notify-url: https://www.weixin.qq.com/wxpay/pay.php notify-url: https://www.weixin.qq.com/wxpay/pay.php
debug: false debug: false
# 插件配置 TODO 芋艿:【IOT】需要处理下 # 插件配置 TODO 【IOT】需要处理下
pf4j: pf4j:
pluginsDir: /Users/anhaohao/code/gitee/ruoyi-vue-pro/plugins # 插件目录 pluginsDir: /Users/anhaohao/code/gitee/ruoyi-vue-pro/plugins # 插件目录