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

143 lines
9.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`)
## 二、日常启动/停止
```bash
# 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
```
验证:
```bash
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 加密串(`|e` 后缀)→ 直接改明文 127.0.0.1/36379(加密器对无后缀值原样透传) |
| `lotteryOpen/.../open/jobs/LotteryOpenJob.java` | cron `"0/5 * * * *"`(5段)→ `"0/5 * * * * *"`(Spring 要求 6 段含秒) |
Druid 密码加密方法(换密码时用):
```bash
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
```