Files
feng0207 3fc4dcc777 initial commit: lottery 项目集(三工程统一管理)
- apps/lotteryServer, lotteryCapture, lotteryOpen 三个业务工程
- 忽略 archive/, tools/, infra/data/ 大目录与敏感配置文件
- 移除 lotteryServer 原嵌套 git,并入顶层统一管理
2026-09-17 19:03:32 +08:00

9.9 KiB
Raw Permalink Blame History

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

四、踩坑实录(按遇到顺序)

  1. 必须 JDK 8:本机默认 JDK 25 跑不动 2018 年的依赖栈(sun.misc 内部 API、老 Spring)。dev-tools 里装了 Temurin 8,启动命令都显式设 JAVA_HOME。
  2. mvn tomcat7:run 起不来:pom 里配的是 tomcat7 插件,但 Spring 4.1 WebSocket 需要 Tomcat 8 的 WsHttpUpgradeHandler,报 No suitable default RequestUpgradeStrategy found。原项目实际部署在 WebLogic。解决:mvn package 打 WAR 部署到外置 Tomcat 8.5。
  3. Tomcat 默认应用抢占路径:webapps/ 里的默认 ROOT、manager、host-manager 必须删掉,否则首页显示 Tomcat 欢迎页、/manager(项目自己的代理后台路由)被 Tomcat manager 拦截返回 401。
  4. 端口被占:本机 3306/6379/16379 已有别的服务(crmchat、监控栈等),docker 映射改用 33206/36379。
  5. Druid 密码是 RSA 加密的:db.properties 的 password 不能直接写明文(spring-config.xml 配了 config.decrypt=true + publicKey),要用 druid 的 ConfigTools 生成密文+公钥成对写入。
  6. redis.passs 占位符:lotteryOpen 的 spring-config.xml 里写的是 redis.passs(三个 s),properties 里只有 redis.pass,Spring 启动直接报 Could not resolve placeholder。补一行即可。
  7. cron 表达式 5 段:LotteryOpenJob 的 @Scheduled(cron="0/5 * * * *") 是 Unix 风格 5 段,Spring 4.1 要求 6 段(含秒),启动抛 Cron expression must consist of 6 fields。补一个 *。
  8. lotteryCapture 的 redis 配置是 DES 加密的:redis.host=d8Hh...==|e 这种带 |e 后缀的值会被 EncryptPropertyPlaceholderConfigurer 解密;写成无后缀明文即透传,不必逆向加密算法。
  9. 验证码坑(调试登录时):
    • 验证码 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。
  10. 密码规则:数据库存 MD5大写^3(明文);登录传输 MD5大写(MD5^3(明文) + 一次性token),token 由 POST /DisposableToken 获取。
  11. 前台没有 admin 用户:admin/admin 在 admin_user 表(运营后台,源码缺失)。前台 user 表现有 test1/test2(123456)、65xr5ucv(代理,密码已重置 123456)。
  12. ** lotteryOpen 启动后**:每 5 秒会对彩种 401/402(依赖外部采号的历史彩种)报"开奖获取当前期数时为空",属预期(外部源死了);自主彩(jssm、az5fc、xyk3 等 9 个)由 SelfLotteryLastOpenCodeJob 每 30 秒自动生成号码,链路完整可验证。
  13. lotteryCapture 的爬虫目标站大多已死(2018 年代的 apiplus/caipiaokong/168kai/shishicai 等,实测超时或关停),彩票控(CaipiaokongJob)目前还能返回数据。进程本身正常,只是部分任务报错。
  14. 下载慢:本地代理 curl -x http://127.0.0.1:17890(JDK/Maven/Tomcat 均 1-2 分钟内下完)。
  15. 后台进程启动方式:在 Git Bash 里用 java -jar & 或 bat 的 start 启动,进程会挂在调用方的控制台会话上——会话结束(或工具调用的 10 分钟超时)就被连带杀掉,表现为"跑着跑就没了"且日志无任何崩溃痕迹。用 start-bg.ps1(PowerShell Start-Process -WindowStyle Hidden)才是完全分离的进程,随机器存活。另外 bat 文件里写中文注释在 cmd 的 GBK 代码页下会解析报错,bat 一律用 ASCII。

五、已验证的完整链路

  • ✅ MySQL/Redis 容器 + ecai 库 110 表导入
  • ✅ nine_surplus 登录(接口与页面两种方式)、会员中心、代理后台 /manager
  • ✅ lotteryOpen 自主彩开奖:日志每 30 秒出新号码 → Redis OPEN_CODE:*(9 个彩种)→ MySQL lottery_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