尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

campus-imaotai 项目深度解析:i茅台每日自动预约系统的架构、业务流程与 Docker 部署实战

campus-imaotai 项目深度解析:i茅台每日自动预约系统的架构、业务流程与 Docker 部署实战 campus-imaotai 项目深度解析i茅台每日自动预约系统的架构、业务流程与 Docker 部署实战【免费下载链接】campus-imaotaii茅台app自动预约每日自动预约支持docker一键部署本项目不提供成品使用的是已淘汰的算法项目地址: https://gitcode.com/GitHub_Trending/ca/campus-imaotai导读campus-imaotai 是一个基于 Spring Boot 与 Campus 开发框架构建的 i茅台 App 自动预约系统核心能力是每日定时自动完成茅台申购预约、小茅运旅行与申购结果消息推送。本文以项目 README.md 的功能清单为主线结合 campus-modular 业务模块源码逐层拆解其预约调度机制、接口加密签名、门店选择策略与消息推送链路并给出基于 doc/docker/docker-compose.yml 的一键部署方案帮助读者完整掌握该项目的运行原理与实战落地方法。项目概览与核心能力campus-imaotai 的目标非常聚焦替代人工在 i茅台 App 上每日重复进行的预约与签到操作。项目支持平台注册账号、同时管理多个用户、按计划自动预约并围绕预约链路覆盖了旅行、耐力值、结果推送等一整套自动化能力。README 中明确列出的功能清单如下平台注册账号添加多个用户自动预约类型选择本市出货量最大的门店或位置附近门店自动旅行首次旅行分享获取申购耐力值自定义时间/随机时间预约或旅行申购结果消息推送从项目结构看整个仓库采用 Maven 多模块架构共四个子模块campus-admin管理端 Controller 层、campus-common公共基础组件、campus-framework框架集成层、campus-modular业务模块而本项目全部业务逻辑都集中在 campus-modular/src/main/java/com/oddfar/campus/business 包下主要包含controller接口层、service业务层、task定时任务层、entity数据实体、api第三方推送 API五个部分架构清晰、职责分明。技术栈与模块定位从根目录 pom.xml 与各子模块的 pom.xml 可以确认项目的技术选型后端框架Spring Boot Spring Security MyBatis-Plus提供 REST API 与权限控制持久层MySQL 5.7 Redis分别存储业务数据与缓存版本号、门店列表、sessionId 等定时调度SpringScheduledEnableScheduling配合Async异步执行HTTP 客户端Hutool 的HttpUtil/HttpRequest用于模拟 i茅台 App 接口调用加解密Hutool AESCBC/PKCS5Padding与 JDK 原生 MD5用于请求参数加密与接口签名前端管理面板Vue 2 Element UI位于 vue_campus_admin提供用户、商品、门店、日志的 Web 管理界面部署方式Docker docker-compose 一键编排 MySQL、Redis、Nginx 与后端服务。整体上campus-imaotai 复用了名为 Campus 的快速开发框架README 明确说明此项目使用Campus进行编写并在其基础上实现 i 茅台相关的业务领域逻辑。核心业务流程源码级拆解业务入口在 IMTService.java该接口定义了版本获取、验证码、登录、预约、旅行奖励、批量任务、数据刷新、结果查询等全部核心能力实现类为 IMTServiceImpl.java。下面按真实运行链路逐一展开。1. App 版本号获取与缓存所有请求头都需要携带MT-APP-Version而 App 版本号不能写死。getMTVersion()的实现逻辑是先从 Redis 读取缓存的版本号key 为IMTCacheConstants.MT_VERSION若为空则请求 Apple App Store 的 i 茅台页面通过正则new__latest__version(.*?)/p抓取最新版本号并写入 Redis 缓存从而保证后续所有接口调用都使用最新版本。2. 验证码发送与登录平台注册账号发送验证码sendCode()向https://app.moutai519.com.cn/xhr/front/user/register/vcode发起 POST 请求请求体包含mobile、md5签名与timestamp其中签名由SALT mobile 时间戳做 MD5 生成见signature()方法SALT 硬编码于类常量中。请求头需要携带MT-Device-ID、MT-APP-Version返回code 2000视为发送成功。登录login()向/xhr/front/user/register/login提交mobile、vCode验证码与新的 md5 签名登录成功后调用IUserService.insertIUser()落库用户实体 IUser.java 会保存userId、token、cookie、deviceId并默认设置 30 天后的expireTimetoken 过期时间。已存在用户则复用其deviceId重新登录。这些接口通过 IUserController.java 暴露给管理端GET /imt/user/sendCode发送验证码、GET /imt/user/login完成登录均有PreAuthorize(ss.resourceAuth())权限控制。3. 自动预约核心链路预约是项目的核心reservation(IUser)的实现要点如下商品拆解用户配置的itemCode以分隔多个商品编码逐个预约门店选择调用IShopService.getShopId(shopType, itemId, provinceName, cityName, lat, lng)确定目标门店。shopType支持两种策略——1表示预约本市出货量最大的门店2表示预约位置附近门店见 IShopService.java 注释参数加密组装itemInfoList、sessionId、userId、shopId后调用AesEncrypt()使用固定的 AES 密钥与 IV类常量AES_KEY、AES_IV做 CBC/PKCS5Padding 加密得到actParam发起申购向https://app.moutai519.com.cn/xhr/front/mall/reservation/add提交请求携带MT-Lat、MT-Lng、MT-Token、MT-Info、MT-Device-ID等请求头返回code 2000视为预约成功防并发风控每个商品预约之间随机休眠 35 秒random.nextInt(3) 3批量预约时每个用户之间再固定延时 3 秒耐力值领取预约完成后通过独立线程延迟 10 秒调用getEnergyAward()领取申购耐力值对应功能清单中的获取申购耐力值日志记录预约结果通过IMTLogFactory.reservation()写入i_log表成为管理端日志页面的数据来源见 IMTLogServiceImpl.java。4. 自动旅行与小茅运对应 README 中的自动旅行首次旅行分享功能实现在travelReward()及其辅助方法中时间限制仅 9:0020:00 可领取旅行奖励否则抛出活动未开始异常状态判断通过getUserIsolationPageData()查询小茅运页面数据区分旅行status1 未开始 / 2 进行中 / 3 已完成与当日剩余旅行次数remainChance未开始时要求耐力值 ≥ 100进行中时提示本次旅行结束时间已完成时判断当月剩余奖励是否可领取奖励链路依次调用receiveReward()领取小茅运、shareReward()每日首次分享获取耐力、startTravel()开始新一轮旅行。这些接口均使用MT-Token-Wap、MT-Device-ID-WapCookie 与MT-Lat/MT-Lng头信息请求体与返回体全部为 JSON。5. 申购结果查询与消息推送每天 18:05 的定时任务会调用appointmentResults()遍历所有预约用户请求/xhr/front/mall/reservation/list/pageOne/query查询申购记录当某条记录的status 2且预约时间在 24 小时内时判定为申购成功写入成功日志。日志落库后PushPlusApi.java 会读取用户的pushPlusToken通过http://www.pushplus.plus/send推送消息——预约成功推送i茅台执行成功失败推送i茅台执行失败标题带用户备注名正文包含手机号与详细日志内容。推送任务通过AsyncManager.me().execute()异步执行不阻塞主流程。定时任务调度机制自动化能力的核心是 CampusIMTTask.java它通过EnableScheduling开启调度、Async异步执行定义了 5 个关键任务调度时间cron任务方法业务含义0 10 1 ? * *每日 01:10updateUserMinuteBatch批量修改用户的随机预约分钟数0 0/1 11 ? * *11:00–11:59 每分钟getTravelRewardBatch批量执行旅行奖励领取0 0/1 9 ? * *09:00–09:59 每分钟reservationBatchTask批量执行预约申购0 10,55 7,8 ? * *07:10/07:55/08:10/08:55refresh刷新版本号、预约商品、门店列表0 5 18 ? * *18:05appointmentResults查询当日申购结果批量预约的分钟对齐机制值得关注reservationBatch()会取当前分钟数通过IUserService.selectReservationUserByMinute(minute)精确捞出预约分钟 当前分钟的用户并执行预约从而实现自定义时间/随机时间预约。每个用户minute字段取值范围为 1–59IUser.getMinute()在越界时会回退为默认值 5randomMinute字段控制是否在 9 点随机分配预约时间0 随机1 不随机。每晚 01:10 的updateUserMinuteBatch()会根据用户总数决定随机策略超过 60 人时使用updateUserMinuteEven()均匀错峰否则使用updateUserMinuteBatch()见 IUserServiceImpl.java避免大量用户集中在同一分钟触发预约。此外IMTServiceImpl.java 通过PostConstruct在应用启动时异步执行一次refreshAll()保证首次启动即完成版本号、门店与商品数据初始化。门店与商品数据刷新refreshAll()依次执行refreshMTVersion()、refreshShop()、refreshItem()见 IMTServiceImpl.java分别刷新App 版本号清空 Redis 缓存后重新抓取门店列表由IShopService.refreshShop()拉取 i 茅台当日门店数据并写入i_shop表预约商品列表由IShopService.refreshItem()拉取可预约商品并写入i_item表sessionIdgetCurrentSessionId()从 Redis 获取当天有效的申购场次 ID供预约请求组装actParam使用。IShopService.getShopsByProvince(province, itemId)还支持按省份与商品查询所在省市的投放产品和数量这是管理端配置账号时选择门店的数据来源。值得说明的是IUserController.java 在新增/编辑用户时会根据所选iShopId自动回填门店的经纬度、省市区信息避免手工填写出错。多用户与权限模型README 强调添加多个用户这在数据层通过i_user表实现字段定义见 IUser.javamobile为表主键另有userIdi茅台侧用户 ID、token、cookie、deviceId、itemCode预约商品分隔、shopType门店策略、minute/randomMinute预约时间、pushPlusToken推送 token、remark备注等。权限层面做了用户数据隔离IUserServiceImpl.page()与IMTLogServiceImpl.page()中非管理员userId ! 1只能查询到自己创建的数据按create_user过滤管理员可查看全部updateIUser()同样校验只能修改自己创建的用户。这套模型支撑了单人部署、多账号托管的典型使用场景。Docker 一键部署实战项目支持 Docker 一键部署编排文件为 doc/docker/docker-compose.yml共编排 4 个服务均使用network_mode: host直连宿主机网络服务镜像说明mysqlmysql:5.7业务数据库root 密码123456789初始化库名campus_imaotai强制 utf8mb4 字符集与8:00时区redisredis:6.2.12缓存服务加载挂载的/docker/redis/conf/redis.conf配置启动nginx-webnginx:1.23.4前端静态页面/docker/nginx/html、证书/docker/nginx/cert与 nginx.conf 配置campus-servercampus/campus-imaotai:1.0.13后端服务端口8160外部配置通过spring.config.additional-location/home/campus/conf/application-prod.yml挂载后端容器的关键设计是通过spring.config.additional-location把宿主机目录/docker/server/conf挂载为容器内/home/campus/conf因此生产环境所需的application-prod.yml数据库连接、Redis 地址、账号密码等可以直接放在宿主机配置目录中无需重新构建镜像。Redis 与 Nginx 的参考配置分别位于 doc/docker/redis/conf/redis.conf 与 doc/docker/nginx/conf/nginx.conf。部署步骤可概括为准备 SQL 初始化脚本 doc/sql/campus_imaotai-1.0.5.sqldocker-compose 会自动在campus_imaotai库中执行初始化在宿主机创建/docker/mysql、/docker/redis、/docker/nginx、/docker/server等挂载目录并放入对应配置在doc/docker目录下执行docker-compose up -d启动全部容器访问 Nginx 暴露的管理页面在i茅台用户页面前端源码位于 vue_campus_admin/src/views/imt/user/index.vue添加用户、配置预约商品与门店策略。项目还提供了独立的前端 Dockerfilevue_campus_admin/Dockerfile与后端 Dockerfilecampus-modular/Dockerfile支持自行构建镜像。数据表与前端管理面板数据库初始化脚本 doc/sql/campus_imaotai-1.0.5.sql 定义了全部业务表与实体类一一对应i_user用户、i_shop门店、i_item商品、i_log执行日志以及 Campus 框架自带的系统权限相关表。管理面板方面vue_campus_admin/src/api/imt 目录下的user.js、shop.js、item.js、log.js封装了对应模块的前端请求页面视图位于 vue_campus_admin/src/views/imt包括用户管理、门店列表、商品列表与日志查看四个页面与 README 演示图中展示的管理界面相对应。使用须知与免责声明README 在声明章节明确了项目的使用边界使用前务必知晓项目涉及的数据由使用者自行填写项目不对数据真实性、准确性、合法性负责项目仅对部署和使用过程做客观描述不代表支持使用任何第三方硬件、软件项目内容仅限学习和研究使用不得用于违反法律法规或相关规定的用途基于本项目源码的任何修改均为使用者自发行为与本项目无关使用者应在 24 小时内完成学习研究并及时删除全部内容如有功能需求应自行开发。同时本项目在 README 中明确说明不提供成品使用的是已淘汰的算法因此该项目更适合作为学习 i 茅台预约接口签名、调度编排与消息推送实现的参考案例而非可直接商用的成品服务。小结campus-imaotai 的价值在于将一套完整的注册 → 登录 → 预约 → 旅行 → 结果推送业务闭环用 Spring Boot 实现了模块化落地CampusIMTTask负责时间编排IMTServiceImpl负责接口对接与加解密IShopService负责门店选择策略PushPlusApi负责结果触达docker-compose 则把整个依赖栈压缩为一条命令。读者既可以跟随本文的源码路径IMTServiceImpl.java → CampusIMTTask.java → docker-compose.yml完整还原其运行原理也可以借鉴其异步批量调度与第三方接口签名的设计模式应用到自己的自动化任务项目中。【免费下载链接】campus-imaotaii茅台app自动预约每日自动预约支持docker一键部署本项目不提供成品使用的是已淘汰的算法项目地址: https://gitcode.com/GitHub_Trending/ca/campus-imaotai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表