# 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 /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:` 的 `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 ```