Initial commit

This commit is contained in:
2026-04-23 16:58:11 +08:00
commit 267eba1eca
2582 changed files with 273338 additions and 0 deletions

View File

@@ -0,0 +1,177 @@
区分动态数据表和静态数据表,动态数据表是网站运行过程中用户产生的数据记录,重置网站时,可以清理掉。
静态数据表是网站功能需要的基础数据,不能清理掉,清理掉会让网站不能运行。
# 系统表
gen_table
gen_table_column
qrtz_blob_triggers
qrtz_calendars
qrtz_cron_triggers
qrtz_fired_triggers
qrtz_job_details
qrtz_locks
qrtz_paused_trigger_grps
qrtz_scheduler_state
qrtz_simple_triggers
qrtz_simprop_triggers
qrtz_triggers
sys_config
sys_dept
sys_dict_data
sys_dict_type
sys_job
sys_job_log
sys_logininfor
sys_menu
sys_notice
sys_oper_log
sys_post
sys_role
sys_role_dept
sys_role_menu
sys_user
sys_user_post
sys_user_role
# 开箱游戏
tt_box 开箱游戏共用的箱子数据, boxType字段用来区分是哪种开箱游戏的
tt_box_ornaments 箱子中的饰品数据,主要是开出概率。
tt_box_records 动态数据表开箱记录。箱子id-饰品id-开出人-拥有人
tt_box_third_explosive_user 开箱三级爆率用户,拥有特殊的开箱奖池
tt_box_type 开箱
tt_ornament 饰品元信息,所有开箱游戏共享相同的饰品信息,如名字,价格等
tt_ornaments_level
tt_comp_record 箱子的补偿奖池记录?
# 百变竞技
tt_robot_fight_group
tt_robot_fight_group_box
tt_fight 动态数据表
tt_fight_ranking_reward 对战排行榜奖励
tt_fight_result 动态数据表
tt_fight_round 动态数据表
tt_fight_user 动态数据表
# 指数盲盒
tt_exponent
tt_exponent_user
tt_exponent_user_box
# roll房
tt_roll
tt_roll_jackpot
tt_roll_jackpot_ornaments
tt_roll_user
tt_roll_user_prize
tt_time_roll
tt_time_roll_user
# 极速永痕
game_sugar_record 动态数据表
game_sugar_spin
game_sugar_spin_free
game_sugar_spin_super
game_sugar_step_info
game_sugar_step_info_free
game_sugar_step_info_super
game_sugar_user 动态数据表
game_sugar_win 动态数据表
# 疯狂转盘
game_wheel_round 动态数据表
game_wheel_round_bet 动态数据表
game_wheel_user 动态数据表
# 充值支付系统 包含CDK
tt_order 动态数据表。用户购买的充值订单
tt_recharge_card 充值卡密
tt_recharge_config
tt_recharge_prod
tt_recharge_ranking_reward 对战排行榜奖励
tt_recharge_record
tianxin_order 无用
# 提货与转增
tt_box_transfer_record 动态数据表。 转增记录
# 发货记录
tt_delivery_record 动态数据表
# 公告 ApiAnnouncementController
tt_announcement
tt_announcement_read
# 签到记录
tt_attendance_record
# 首页大屏广告banner
tt_advertisement
# 网站设置 -- 更偏向于网页功能
tt_banner 和tt_advertisement功能一模一样
tt_content 文章
tt_content_type 文章
# 推广
tt_commission_record 动态数据表,推广佣金记录 无用
tt_promotion_level 动态数据表
tt_promotion_record 动态数据表
tt_promotion_update 动态数据表
# 后台操作向用户消息
tt_message
tt_message_send
# 系统异步向用户推送结果通知
tt_notice 前端的消息通知是这个
## 福利红包
与CDK相比福利红包不记录到充值流水。
tt_red_pack 动态数据表,红包模板
tt_red_packet 动态数据表,红包数据
tt_red_packet_record 动态数据表,红包领取记录
# 任务中心
tt_task_center
tt_task_center_user
# 黄金装备
tt_upgrade_fail_ornaments
tt_upgrade_ornaments
tt_upgrade_record
# 用户系统
tt_user 动态数据表。删除数据需谨慎
tt_user_avatar 用户头像表
tt_user_blend_ercash 动态数据表。流水日志
tt_user_amount_records 淘汰。被tt_user_blend_ercash替换了
tt_user_credits_records 淘汰。被tt_user_blend_ercash替换了
# vip系统
tt_vip_level 用户VIP等级配置
# 福利系统
tt_welfare
tt_welfare_monthly_recharges
tt_welfare_record
tt_welfare_vip_level
# 奖金
tt_bonus 福利元信息
tt_bonus_receive_record 福利领取记录
# 首充赠送
tt_first_recharge
# 无用
tt_replacement_record 汰换记录
tt_ornament_yy yy市场的饰品信息
tt_ornament_zbt zbt市场的饰品信息
tt_box_open_chance 开箱机会,可以干掉
tt_user_box_open_chance
tt_user_label
tt_game_mould 未知
tt_game_mould_box 未知

View File

View File

@@ -0,0 +1,12 @@
application.yml 是项目的通用配置文件
application-{profile}.yml 是项目不同环境的配置文件如果与application.yml配置内容重复则以application-{profile}.yml配置为准
当前有三个环境的配置文件:
- application-dev.yml 开发环境配置。本地测试用
- application-test.yml 测试环境配置。服务器上测试环境用
- application-pro.yml 生产环境配置
application.yml中默认启用的是application-dev.yml。可以通过环境变量进行修改。
在IDEA中编辑启动配置添加环境变量`SPRING_PROFILES_ACTIVE=test`, 即可启用application-test.yml配置。以此类推

View File

@@ -0,0 +1,3 @@
任何被用户使用的接口都是用POST方法并使用加密传输。
这里的用户包括游戏用户,也包括主播用户。

View File

@@ -0,0 +1,70 @@
JDK与时间相关的包和API:
# 包
包 | 引入 | 描述
-------|------|-------------
java.time | 1.8+ | 推荐使用
java.util | 旧版 | 不推荐
java.text | 旧版 | 日期字符串格式化相关,不推荐使用
java.sql | 1.1 | 数据库相关,业务不推荐使用
java.time.chrono| 1.8 | 可选,能不用就不用。支持非 ISO 历法系统
# java.time包中的类
| 类/接口 | 用途 |
| ------------------- | --------------------- |
| `LocalDate` | 日期(年-月-日) |
| `LocalTime` | 时间(时:分:秒.纳秒) |
| `LocalDateTime` | 日期+时间 |
| `ZonedDateTime` | 带时区的日期时间 |
| `Instant` | 时间戳从1970-01-01的秒/毫秒) |
| `Duration` | 时间间隔(基于秒和纳秒) |
| `Period` | 日期间隔(基于年月日) |
| `DateTimeFormatter` | 日期时间格式化 |
LocalDate,LocalTimeLocalDateTime都是指表示一个时间数字没有时区概念。比如LocalTime表示8:20并不能表示出具体的时间需要结合时区才能知道是哪里的8:20。
java.time.format
DateTimeFormatter 及其相关类
用于格式化与解析日期时间
java.time.temporal
时间访问和调整的底层接口
包含 Temporal, TemporalField, TemporalUnit 等
java.time.zone
时区相关类
ZoneId, ZoneOffset, ZoneRules 等
# java.util包中的类
| 类 | 说明 |
| ---------- |-------------------|
| `Date` | 传统日期类(已不推荐),不带时区 |
| `Calendar` | 日历计算(已不推荐),默认系统时区 |
| `TimeZone` | 时区信息 |
# java.text包中的类
SimpleDateFormat - 旧版日期格式化(线程不安全)
# java.sql
这些也都没有时区概念,只表示时间值
| 类 | 用途 |
| ----------- | ------- |
| `Date` | SQL 日期 |
| `Time` | SQL 时间 |
| `Timestamp` | SQL 时间戳 |
# 最佳实践
关于时区:
1. 系统内部应该只用java.time下的LocalDate,LocalTime,LocalDateTime这些不带时区的概念。
2. 只有与外部交互时,才应该转成带时区的概念。 比如把前端请求的日期转成LocalDateTime返回给前端的时间应该转成前端对应时区的时间。或者请求外部依赖时需要传递时间应该确定好时区的概念。
3. 定时任务的时间设置应该带上时区,否则将会按照系统所在时区执行,切换服务器时,时区会变,定时任务的执行时间也会变。
作为中国开发者,应该都用东八区时间。`@Scheduled(cron = "2 15 0 * * ?", zone = "Asia/Shanghai")`
4. 服务器的时区都设置成东八区时间
查看时区:`timedatectl`
列出可支持的时区:`timedatectl list-timezones | grep Shanghai`
设置时区:`sudo timedatectl set-timezone Asia/Shanghai`
关于存储时间的格式:
1. 系统中只允许使用LocalDateTime或者Long时间戳存储时间。优先用LocalDateTime既拥有时间戳的所有信息也有丰富的API操作时间。

View File

@@ -0,0 +1,19 @@
# controller 请求参数
使用一个自定义的Request类来接收参数。
# controller 返回的类型
现状目前返回的类型有R,AjaxResult,PageDataInfo等
标准统一返回R<具体类型>类型。
# mapper
mapper继承Mybatis-Plus的BaseMapper。
```java
@Mapper
public interface AdminGameSugarUserMapper extends BaseMapper<GameSugarUser> {
}
```
单表查询时使用mybatis-plus的Lambda查询方式。
要执行复杂的查询逻辑时用Lambda查询不好实现或者很复杂时可以使用@Select注解在mapper类中写sql实现。

View File

@@ -0,0 +1,3 @@
1.查询roll房的基本信息是否存在是否开奖是否有参与者
2.查看是否有系统指定用户获取饰品调用rollSurplusOrnaments()方法,传入全部参与用户和饰品,将该饰品指定给需要指定的用户,扣除该饰品并返回剩下的饰品,并且将指定用户过滤出
3.获取没有指定获取饰品的用户再将这些没指定的用户打乱顺序再去遍历有库存饰品按顺序给随机用户每人一件保存结果更新roll房状态

View File

@@ -0,0 +1,8 @@
1.先效验传入的下注金额是否正确再去给每个用户申请一把锁根据用户id去redis中读取游戏缓存数据缓存为空扣费并且更新用户累计的投注在去更新用户的总投注额再去查找今天0点的统计记录不存在则创建否则将今日统计表中下注金额累计再将redis中的全局奖励池累加
再去初始化缓存数据再去通过selectGame()方法去挑选一局游戏
1.1selectGame()方法首先去查询用户的历史数据历史投钱数游戏多少次查询不到就去初始化一条全新数据再去redis中读取游戏的配置信息在去读取配置表有rtp=0.8再从redis中拿到全局的奖励池所有玩家总投注所有玩家总获奖再将StrategyContext对象组装
再去执行三个策略分别是普通旋转免费旋转超级旋转三个旋转只是查询条件不同最后封装GameSpin对象返回
2.处理免费旋转再去更新缓存再去检测并且去累加S出现的次数再去累加倍数到累计赢取额然后写回缓存保存更新
3.判断游戏是否结束,去计算最终的奖励,总得分(score) × 单注(bet) = 本局实际奖励金额若计算结果≤0强制设为0.01保底,再将赢取的金额加到玩家账号
4.本局游戏结束之后将该用户的redis缓存为空去更新用户累计的输赢金额再去更新统计表和Redis的全局奖励池
5.构建完整数据并且返回

View File

@@ -0,0 +1,10 @@
1.开奖算法:决定转盘停在哪个格子
1.1 无人下注的话过滤特殊效果S从剩下的格子里面随机选择一个
1.2 有人下注的话需要去计算每个格子的纯利润需要去遍历每个格子符号去获取每个格子的位置将特殊符号S过滤去计算需要赔付多少钱payoutIf方法计算出赔付金额
通过本局的总注额减去赔付金额就能计算出净利润,再将格子下标和净利润加入列表
1.2.1payoutIf()方法,根据下注的符号,去计算需要赔付多少钱,赔付金额是 = 总下注额*赔率
1.3 判断是否触发特殊效果S生成一个0到1的随机数如果小于特殊效果S的概率则触发特殊效果S然后再去随机选择一种特殊效果记录特殊效果名
1.3.1 如果是系统赢随机找一个非s的下标将下标和:S0组装表示为系统赢直接返回
1.3.2 免费旋转默认是1次随机找一个非s的下标将下标和:S1组装表示为免费旋转1次,可以旋转3次
1.4 普通开奖计算出净利润大于0的格子的集合再从盈利的格子随机选一个如果没有净利润大于0的格子就去选亏得最少的格子将结果加入

View File

@@ -0,0 +1,10 @@
1.创建对战房间先效验创建房间参数0是欧皇1是非酋几人对战配置宝箱的信息以及费用回合数是1-15次验证余额是否足够初始化座位
再去构建对战对象再去扣减房主的报名费房主自动入第一个座再去保存对战人员的信息创建房间成功通过异步WebSocket广播通知大厅有新房间
2.玩家加入对战房间先获取锁防止并发加入再去效验对战信息joinFightCheck方法方法首先查询未对战信息
再去查询是否报名再去检查余额是否足够再去寻找空位入座检查是否重复加入更新对战座位信息扣除加入人员报名费保存参与记录异步WebSocket广播用户加入房间
3.fightBegin开始游戏方法获取锁防止重复开始检查游戏是否开始执行多回合的抽奖newComputerFight()方法再去计算胜负computerWinner()方法,该方法包含对战模式,座位信息,抽奖结果,
去分配奖品,如果是多个赢家,失败者的奖品价值平分,赢家的奖品归自己,失败者的奖品累计,去平分失败者的总价值,如果是单个玩家或全员平局,单个赢家,将失败者奖品分给赢家,全员平局的话就轮流分配,
最后再去批量保存开箱记录更新对战状态为进行中在异步WebSocket广播构建开箱结果广播给房间用户和大厅
3.1.newComputerFight()方法获取宝箱配置获取所有玩家的id设置回合计数器外层遍历每一个宝箱内层记录宝箱开启的次数执行一回合的抽奖roundLottery()方法将对局结果addAll全部加入宝箱记录集合中回合数累加再去更新宝箱历史开箱统计在补充对战的id
3.1.1.roundLottery()方法遍历当前回合所有的玩家再去使用经典开箱方法singleLottery(),获取饰品详情,再去构建开箱的记录
3.2 computerWinner()方法,有两个模式,欧皇模式(总价值最高者胜)和非酋模式(总价值最低者胜),欧皇模式去累加该玩家获得的所有的饰品价值,比较是否为最高或者平局,非酋模式是否为最低或者平局

View File

@@ -0,0 +1,12 @@
1.根据用户类型确定使用哪个奖池,普通奖池,补偿奖池,三级爆率奖池,
在再根据宝箱id和用户类型获取锁防止同一个宝箱同一个用户类型的并发抽奖持续10秒重试三次
2.获取三个奖池对象,判断三个奖池是否为空,如果为空,就初始化创建空奖池
3.查询用户是否拥有三级爆率,如果不为空,说明有三级爆率
4.根据是否有三级爆率权限选择使用哪个奖池checkPool() 方法首先查看当前prizePool对象是否有数据
是直接返回否则去redis中查看是否有数据有则将数据加入prizePool对象中
否则去数据库中查询并加入prizePool对象中有三级爆率就使用thirdExplosivePrizePool否则使用prizePool
5.补偿机制,先查询用户的补偿记录是否有值,如果是补偿箱并且没有补偿记录,创建空的补偿记录,如果有补偿记录,查看是否到达补偿阈值,
如果是补偿箱并且补偿值>=阈值,将切换到补偿奖池,并将补偿值清楚,将补偿记录删除
6.执行抽奖的算法doLottery方法箱子里面包含饰品及其数量获取饰品总数量并且随机五次并记录最后一次的值
然后循环每个饰品的位置如果这个位置的值和记录的最后一次的值相同拿到当前饰品的id
如果循环多次没有拿到,就取饰品的第一个(按序给),库存减一

6
doc/数据库变更.md Normal file
View File

@@ -0,0 +1,6 @@
添加机器人爆率
ALTER TABLE `tt_box_ornaments` ADD COLUMN `robot_odds` int DEFAULT '0' COMMENT '机器人数量' AFTER `anchor_odds`;
ALTER TABLE game_sugar_record
ADD COLUMN multiplier decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '倍率';

6
doc/数据库备份.md Normal file
View File

@@ -0,0 +1,6 @@
mysqldump -ufire -piTSJSPPZM3LSGAPC fire --no-tablespaces game_sugar_spin > game_sugar_spin.sql
mysqldump -ufire -piTSJSPPZM3LSGAPC fire --no-tablespaces game_sugar_step_info > game_sugar_step_info.sql
mysql -u fire -piTSJSPPZM3LSGAPC fire < game_sugar_spin.sql

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -0,0 +1,29 @@
1.本地安装jdk21
配置jdk环境变量idea官网下载版本2024.3.3 破解版 ——》 https://docs.qq.com/doc/DWkdRQVZRV0RoZHdh
2.本地安装maven3.6.1
配置settings.xml文件
1). 复制<localRepository>标签粘贴到注释的外面55行左右
<localRepository>D:\software\apache-maven-3.6.1\local_repo</localRepository> //自己的maven安装路径
2. 打开settings.xml文件定位到160行左右
2). 在<mirrors>标签下为其添加子标签<mirror>,内容如下:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
3.配置Maven环境变量MVN -V 查看是否配置成功
3.安装docker for windows
1).配置教程 https://developer.aliyun.com/article/1604556
2).国内镜像加速 ![img.png](img.png) 图片所示 加速器链接 "https://docker.1ms.run"
4.下载git 拉取代码
1).创建文件夹存放项目git init初始化使用git clone http://39.107.124.211:13000/cocos/ruoyi.git 拉取代码
2).账号密码是 cocos02 cocos02@163.com
3).在ruoyi项目docker目录下cmd使用命令docker compose up -d启动mysqlredisrabbitmq
4).导入sql文件
5.安装vs code
1).安装node.js 版本 node v22.22.0 npm版本 10.9.4 安装教程——》https://blog.csdn.net/Natsuago/article/details/145567734
2).npm run dev

57
doc/清理数据.md Normal file
View File

@@ -0,0 +1,57 @@
"game_sugar_record",
"game_sugar_user",
"game_wheel_round_bet",
"game_wheel_user",
"tt_announcement_read",
"tt_attendance_record",
"tt_bonus_receive_record",
"tt_box_records",
"tt_commission_record",
"tt_delivery_record",
"tt_exponent_user",
"tt_exponent_user_box",
"tt_fight",
"tt_fight_user",
"tt_notice",
"tt_order",
"tt_promotion_record",
"tt_recharge_record",
"tt_red_packet",
"tt_red_packet_record",
"tt_roll",
"tt_roll_user",
"tt_task_center_user",
"tt_time_roll_user",
"tt_upgrade_record",
"tt_user_blend_ercash",
"tt_welfare_record",
"tt_recharge_record",
"game_sugar_win",
"game_wheel_round",
"tt_recharge_card",
```python
tables = [
"tt_box",
"tt_box_open_chance",
"tt_box_ornaments",
"tt_box_records",
"tt_ornament",
"tt_upgrade_fail_ornaments",
"tt_upgrade_ornaments",
"tt_upgrade_record",
"tt_roll",
"tt_roll_jackpot",
"tt_roll_jackpot_ornaments",
"tt_roll_user_prize"
]
for table in tables:
print(f"""CREATE TABLE {table}_new LIKE {table};
RENAME TABLE {table} TO {table}_old, {table}_new TO {table};""")
```

23
doc/网站迁移.md Normal file
View File

@@ -0,0 +1,23 @@
服务器时区设置sudo timedatectl set-timezone Asia/Shanghai
数据库时区设置:
查看时区SHOW GLOBAL VARIABLES LIKE '%time_zone%';
SET GLOBAL time_zone = '+08:00';
同步的文件资源:
图片
数据库文件
安装依赖:
docker/nginx/mysql/redis/git
jdk21/maven3.6.3
需要启动的服务
docker rabbitmq coder-doc
ruoyi
nginx admin zhubo
需要加白的服务:
支付/发货