- apps/lotteryServer, lotteryCapture, lotteryOpen 三个业务工程 - 忽略 archive/, tools/, infra/data/ 大目录与敏感配置文件 - 移除 lotteryServer 原嵌套 git,并入顶层统一管理
9.9 KiB
9.9 KiB
lottery 项目集启动指南(踩坑实录)
2026-09-17 整理。适用环境:Windows + Git Bash + Docker Desktop。 三进程全部本地跑通:nine_surplus(Web 主站)、lotteryOpen(开奖结算)、lotteryCapture(采号爬虫)。
一、系统全貌
三个独立 Java 进程,通过共享 MySQL + Redis 通信,互相之间没有 HTTP 调用:
外部开奖网站(大多已失效)
│ HTTP 爬取
▼
lotteryCapture ──写入──┐
(采号爬虫进程) │
▼
MySQL `ecai`.lottery_open_code
Redis OPEN_CODE:<彩种>(每彩种留最近50期)
▲
lotteryOpen ───读写────┘
(开奖+结算进程, │ 每5秒扫 user_bets 未开奖注单
自主彩自己生成号码) ▼
user_bill 派奖 / user.lotteryMoney 余额
▲
nine_surplus ───读写───┘
(Web 主站,Tomcat WAR, 每2秒读 OPEN_CODE:* 经 WebSocket 推给投注页
用户/投注/充值提现)
| 进程 | 位置 | 运行形态 | 端口 |
|---|---|---|---|
| lotteryServer(原 nine_surplus) | apps/lotteryServer |
WAR → 外置 Tomcat 8.5 | http://localhost:8080 |
| lotteryOpen | apps/lotteryOpen |
jar,主类 lottery.bin.StartUp |
无(纯后台进程) |
| lotteryCapture | apps/lotteryCapture |
jar,主类 lottery.bin.StartUp |
无(纯后台进程) |
基础设施(docker compose,见 infra/docker-compose.yml):
- MySQL 5.7:容器
lottery-mysql,宿主端口 33206,root/devpass123,库ecai(110 表,初始数据database/ecai.sql) - Redis 5:容器
lottery-redis,宿主端口 36379(本机 3306/6379/16379 都被占)
工具链全部装在 tools/dev-tools/(不动系统环境):
- JDK 8(Temurin
jdk8u504-b01)——必须 JDK 8 - Maven 3.9.9(
apache-maven-3.9.9) - Tomcat 8.5.100(
apache-tomcat-8.5.100)
二、日常启动/停止
# 0. 基础设施
cd /c/data/src/lottery && docker compose -f infra/docker-compose.yml up -d
# 1. Web 主站(lotteryServer)
scripts\dev.bat # 或 scripts\dev.bat build 先重新编译
# 访问 http://localhost:8080
# 2. 开奖结算 + 采号爬虫(完全分离的后台进程)
powershell -ExecutionPolicy Bypass -File C:\data\src\lottery\scripts\start-bg.ps1 all # 两个都起
powershell -ExecutionPolicy Bypass -File C:\data\src\lottery\scripts\start-bg.ps1 open # 只起 lotteryOpen
powershell -ExecutionPolicy Bypass -File C:\data\src\lottery\scripts\start-bg.ps1 capture # 只起 lotteryCapture
# 改代码后先重新编译再启动:
# cd apps\lotteryOpen && mvn -q -DskipTests package (lotteryCapture 同理)
# 停止:taskkill /PID <pid> /F(启动时控制台会打印 pid;也可 tasklist 查 java.exe)
# 日志:<模块目录>\lotteryOpen.jar-run.log / lotteryCapture.jar-run.log
验证:
docker exec lottery-redis redis-cli keys 'OPEN_CODE*' # 应有 9+ 个 key
docker exec lottery-mysql mysql -uroot -pdevpass123 -N \
-e "SELECT COUNT(*) FROM ecai.lottery_open_code" # 持续增长
tail -f /tmp/lotteryOpen.log # 可见"XX彩第XXX期生成开奖号码为..."
登录账号:
- 前台会员:
test1 / 123456(普通用户 type=1) - 前台代理:
65xr5ucv / 123456(type=2,登录后访问/manager看代理后台) admin/admin是缺失的运营后台(admin_user 表)的账号,本项目内无登录入口
三、配置改动清单(相对原始仓库)
| 文件 | 改动 |
|---|---|
infra/docker-compose.yml(新建) |
mysql 33206 / redis 36379,数据卷 ./data/ |
apps/lotteryServer/.../datasource/db.properties |
三组连接 → 127.0.0.1:33206/ecai;密码用 druid ConfigTools 按 devpass123 重新加密 |
apps/lotteryServer/.../datasource/redis.properties |
端口 → 36379 |
apps/lotteryOpen/.../db.properties |
同上 |
apps/lotteryOpen/.../redis.properties |
端口 → 36379;补了 redis.passs=(spring-config.xml 里就是这个拼错的占位符) |
apps/lotteryCapture/.../db.properties |
同上 |
apps/lotteryCapture/.../redis.properties |
原 host/port 是 DES 加密串(` |
lotteryOpen/.../open/jobs/LotteryOpenJob.java |
cron "0/5 * * * *"(5段)→ "0/5 * * * * *"(Spring 要求 6 段含秒) |
Druid 密码加密方法(换密码时用):
java -cp tools/dev-tools/druid-1.0.31.jar com.alibaba.druid.filter.config.ConfigTools <明文>
# 输出的 password + publicKey 写回 db.properties
四、踩坑实录(按遇到顺序)
- 必须 JDK 8:本机默认 JDK 25 跑不动 2018 年的依赖栈(sun.misc 内部 API、老 Spring)。dev-tools 里装了 Temurin 8,启动命令都显式设 JAVA_HOME。
mvn tomcat7:run起不来:pom 里配的是 tomcat7 插件,但 Spring 4.1 WebSocket 需要 Tomcat 8 的WsHttpUpgradeHandler,报No suitable default RequestUpgradeStrategy found。原项目实际部署在 WebLogic。解决:mvn package打 WAR 部署到外置 Tomcat 8.5。- Tomcat 默认应用抢占路径:
webapps/里的默认ROOT、manager、host-manager必须删掉,否则首页显示 Tomcat 欢迎页、/manager(项目自己的代理后台路由)被 Tomcat manager 拦截返回 401。 - 端口被占:本机 3306/6379/16379 已有别的服务(crmchat、监控栈等),docker 映射改用 33206/36379。
- Druid 密码是 RSA 加密的:db.properties 的 password 不能直接写明文(spring-config.xml 配了
config.decrypt=true+ publicKey),要用 druid 的 ConfigTools 生成密文+公钥成对写入。 redis.passs占位符:lotteryOpen 的 spring-config.xml 里写的是redis.passs(三个 s),properties 里只有redis.pass,Spring 启动直接报Could not resolve placeholder。补一行即可。- cron 表达式 5 段:
LotteryOpenJob的@Scheduled(cron="0/5 * * * *")是 Unix 风格 5 段,Spring 4.1 要求 6 段(含秒),启动抛Cron expression must consist of 6 fields。补一个*。 - lotteryCapture 的 redis 配置是 DES 加密的:
redis.host=d8Hh...==|e这种带|e后缀的值会被EncryptPropertyPlaceholderConfigurer解密;写成无后缀明文即透传,不必逆向加密算法。 - 验证码坑(调试登录时):
- 验证码 4 位纯数字(ImageCodeUtil 字符集写死 0-9),图上 80 条干扰线,肉眼/OCR 都容易错;
- 会话存 Redis
spring:session:sessions:<SID>的sessionAttr:LOGIN_VALIDATE_CODE(JDK 序列化字符串,结尾 4 字节即验证码); - 注意有两个 session cookie:
JSESSIONID和SESSION(spring-session 的),验证码在后者。grep cookie 时用\tSESSION\t精确匹配,别匹配到 JSESSIONID。
- 密码规则:数据库存
MD5大写^3(明文);登录传输MD5大写(MD5^3(明文) + 一次性token),token 由 POST/DisposableToken获取。 - 前台没有 admin 用户:
admin/admin在admin_user表(运营后台,源码缺失)。前台user表现有 test1/test2(123456)、65xr5ucv(代理,密码已重置 123456)。 - ** lotteryOpen 启动后**:每 5 秒会对彩种 401/402(依赖外部采号的历史彩种)报"开奖获取当前期数时为空",属预期(外部源死了);自主彩(jssm、az5fc、xyk3 等 9 个)由
SelfLotteryLastOpenCodeJob每 30 秒自动生成号码,链路完整可验证。 - lotteryCapture 的爬虫目标站大多已死(2018 年代的 apiplus/caipiaokong/168kai/shishicai 等,实测超时或关停),彩票控(CaipiaokongJob)目前还能返回数据。进程本身正常,只是部分任务报错。
- 下载慢:本地代理
curl -x http://127.0.0.1:17890(JDK/Maven/Tomcat 均 1-2 分钟内下完)。 - 后台进程启动方式:在 Git Bash 里用
java -jar &或 bat 的start启动,进程会挂在调用方的控制台会话上——会话结束(或工具调用的 10 分钟超时)就被连带杀掉,表现为"跑着跑就没了"且日志无任何崩溃痕迹。用start-bg.ps1(PowerShellStart-Process -WindowStyle Hidden)才是完全分离的进程,随机器存活。另外 bat 文件里写中文注释在 cmd 的 GBK 代码页下会解析报错,bat 一律用 ASCII。
五、已验证的完整链路
- ✅ MySQL/Redis 容器 + ecai 库 110 表导入
- ✅ nine_surplus 登录(接口与页面两种方式)、会员中心、代理后台
/manager - ✅ lotteryOpen 自主彩开奖:日志每 30 秒出新号码 → Redis
OPEN_CODE:*(9 个彩种)→ MySQLlottery_open_code持续增长 - ✅ lotteryCapture 进程存活,彩票控抓取任务可完成,其余外部源报错(预期)
- ⬜ 完整"下注→开奖→派奖到账"闭环:用 test1 在自主彩下注后观察
user_bets状态流转与user_bill派奖记录(链路组件已全部就绪,未实测)
六、目录速查
C:\data\src\lottery\
├── apps\ # 三个业务工程
│ ├── lotteryServer\ # Web 主站(原 nine_surplus,WAR)
│ ├── lotteryCapture\ # 采号爬虫(jar)
│ └── lotteryOpen\ # 开奖结算(jar)
├── database\ # 数据库初始数据 ecai.sql
├── infra\ # 容器编排 + 数据卷
│ ├── docker-compose.yml # mysql+redis
│ └── data\ # 容器数据卷(删掉即重置)
├── tools\dev-tools\ # JDK8 / Maven / Tomcat8.5 / druid jar
├── scripts\ # dev.bat(Web 主站一键启动)、start-bg.ps1(后台进程)
├── docs\ # DEV-README.md、SETUP-GUIDE.md
└── archive\ # 历史压缩包 .rar / .7z