- apps/lotteryServer, lotteryCapture, lotteryOpen 三个业务工程 - 忽略 archive/, tools/, infra/data/ 大目录与敏感配置文件 - 移除 lotteryServer 原嵌套 git,并入顶层统一管理
143 lines
9.9 KiB
Markdown
143 lines
9.9 KiB
Markdown
# 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
|
||
```
|