# lab-booking **Repository Path**: pei-bingyan/lab-booking ## Basic Information - **Project Name**: lab-booking - **Description**: 基于springboot的实验室预约管理系统 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-22 - **Last Updated**: 2026-09-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于 Spring Boot 与 Vue3 的高校实验室预约管理系统 一套前后端分离的高校实验室在线预约与共享管理系统,支持学生预约、教师审核、管理员运维三类角色的完整业务闭环,并内置两个算法亮点(时间冲突检测优化、基于用户画像的智能推荐)。 --- ## 一、技术栈 | 层次 | 技术选型 | | --- | --- | | 后端框架 | Spring Boot 3.3.5 | | 持久层 | MyBatis-Plus 3.5.7 | | 数据库 | MySQL 8.0 | | 身份认证 | JWT(jjwt 0.12.6)+ 自定义拦截器 | | 密码加密 | BCrypt(spring-security-crypto) | | 接口文档 | Knife4j 4.5.0(OpenAPI 3) | | 前端框架 | Vue 3.5 + Vite 5 | | 状态管理 | Pinia 2 | | 路由 | Vue Router 4 | | UI 组件库 | Element Plus 2.8 | | 图表 | ECharts 5 | | 网络请求 | Axios 1 | | 运行环境 | JDK 17、Maven 3.9、Node.js 18+ | --- ## 二、项目结构 ``` springboot/ ├── lab-booking-server/ 后端服务(Spring Boot) │ └── src/main/java/com/campus/lab/ │ ├── algorithm/ 算法核心:时间冲突检测、智能推荐 │ ├── common/ 统一响应、异常处理、常量 │ ├── config/ 跨域、MyBatis-Plus、Jackson、Knife4j 配置 │ ├── controller/ 11 个 REST 控制器 │ ├── dto/ 请求参数对象 │ ├── entity/ 9 个实体类 │ ├── mapper/ 数据访问层 │ ├── security/ JWT 工具、登录上下文、角色校验拦截器 │ ├── service/ 业务逻辑层 │ ├── task/ 定时任务 │ └── vo/ 响应视图对象 ├── lab-booking-web/ 前端工程(Vue3 + Vite) │ └── src/ │ ├── api/ 接口封装 │ ├── components/ 公共组件(图表容器) │ ├── layout/ 主框架布局与动态菜单 │ ├── router/ 路由与权限守卫 │ ├── stores/ Pinia 状态管理 │ ├── styles/ 全局样式 │ ├── utils/ Axios 封装 │ └── views/ 21 个页面 ├── sql/ 数据库脚本 │ ├── init.sql 建库建表(9 张表) │ ├── 02-data.sql 基础数据(用户、实验室、设备、公告) │ └── 03-demo-data.sql 演示数据(近 30 天预约、借用、违规记录) │ └── 04-repair-data.sql 演示数据(设备报修工单) ├── tools/ 辅助工具 │ ├── api-test.ps1 接口自动化测试(59 项检查) │ ├── gen_demo_data.py 演示数据生成脚本 │ ├── browser-check/ 网页端自动化截图与错误检查 │ └── mp-auto/ 小程序自动化巡检(学生端 9 页 + 管理端 11 项) ├── 启动系统.bat 一键启动:MySQL + 后端 + 前端 ├── 停止系统.bat 一键关闭:后端 + 前端(可选关 MySQL) ├── 打开小程序.bat 一键打开微信开发者工具 ├── docs/ 项目文档 │ ├── 01-功能清单.md │ ├── 02-数据库设计.md │ └── 03-接口文档.md └── logs/ 运行日志 ``` --- ## 三、环境准备 | 软件 | 版本要求 | 说明 | | --- | --- | --- | | JDK | 17 及以上 | 后端编译运行 | | Maven | 3.6 及以上 | 后端依赖管理 | | MySQL | 8.0 及以上 | 数据库,需启动在 3306 端口 | | Node.js | 18 及以上 | 前端构建运行 | --- ## 四、启动步骤 ### 第 0 步:把项目拿到本地 ```bash git clone https://gitee.com/pei-bingyan/lab-booking.git cd lab-booking ``` 不想敲命令也行:打开上面的仓库页面 → 点「克隆/下载」→「下载 ZIP」→ 解压。 拿到代码后这样打开(三个部分可以分别用不同的 IDE): | 部分 | 怎么打开 | | --- | --- | | 后端 `lab-booking-server` | IDEA → `File → Open` 选中**这个目录**(里面是 `pom.xml`),等右下角 Maven 依赖下载完 | | 网页端 `lab-booking-web` | IDEA 或 VS Code 打开这个目录,首次要先在终端跑 `npm install` | | 小程序 `lab-booking-mp` | 微信开发者工具 → 「导入项目」→ 目录选这个文件夹 | > 注意:IDEA 要**分别打开** `lab-booking-server` 和 `lab-booking-web` 两个目录,不要直接打开最外层的 `springboot` 文件夹,否则 Maven 识别不到 `pom.xml`。 ### 在 IDEA 里使用 Git 仓库根目录(含 `.git` 的那一层)就是最外层的 `springboot` 文件夹。用 IDEA 打开子目录时,它会**自动向上查找**到这个仓库,不需要重新 `git init`。 首次配置: 1. `File → Settings → Version Control → Git`,把 `Path to Git executable` 填成 `D:\develop\Git\cmd\git.exe`,点 `Test`,出现版本号就说明通了 2. 打开项目时如果弹出「Git root detected」,把列出的目录都勾上并点 `Add Roots`,让 `springboot`、`lab-booking-server`、`lab-booking-web` 归到同一个仓库 3. 在 `Settings → Version Control → Directory Mappings` 里应能看到 ` = C:\Users\Lenovo\Desktop\springboot` 日常操作: | 操作 | 快捷键 / 位置 | | --- | --- | | 提交 | `Ctrl+K` 打开左下角 Commit 面板,勾选文件、填说明,点 `Commit` | | 提交并推送 | Commit 面板里的 `Commit and Push` | | 推送 | `Ctrl+Shift+K` | | 拉取 | 右上角工具栏的 ↙ 箭头 | | 查看历史 | 底部 `Git` 标签页,或 `Alt+9` | | 看某一行是谁改的 | 文件内右键 → `Git → Annotate with Git Blame` | | 切换分支 | 点右下角状态栏的 `master` | > IDEA 的提交面板只显示**当前打开目录范围内**的改动。改了小程序或根目录的脚本时,要么在打开 `springboot` 根目录的窗口里提交,要么直接用命令行:`git add -A` → `git commit -m "说明"` → `git push`。 > IDEA 会在项目里生成 `.idea` 文件夹,它已经被 `.gitignore` 忽略,不会被提交,不用管它。 ### 快捷方式(推荐) 项目根目录下有四个双击即可运行的脚本,日常开发不用敲命令: | 脚本 | 作用 | | --- | --- | | `启动系统.bat` | 依次检查并启动 MySQL、后端 8080、前端 5173,最后自动打开浏览器 | | `停止系统.bat` | 关闭后端与前端,并询问是否连 MySQL 一起关 | | `打开小程序.bat` | 用微信开发者工具打开 `lab-booking-mp` 工程 | | `恢复演示数据.bat` | 把用户、预约单、违规记录、报修记录恢复成初始演示状态(**答辩/演示前建议先跑一遍**) | > 脚本带端口占用检测:服务已经在运行时自动跳过,不会重复启动,也不会报「端口被占用」。 ### 第 1 步:初始化数据库 确保 MySQL 已启动,然后依次执行三个脚本(顺序不能颠倒): ```bash mysql -uroot -p123456 < sql/init.sql mysql -uroot -p123456 < sql/02-data.sql mysql -uroot -p123456 < sql/03-demo-data.sql mysql -uroot -p123456 < sql/04-repair-data.sql ``` 也可以在 Navicat 等工具中直接打开并按顺序运行这四个文件。(`04-repair-data.sql` 只影响报修工单表,可以单独重复执行。) 脚本会自动创建数据库 `lab_booking` 与 9 张表,并写入演示数据。 > 如果本机 MySQL 的 root 密码不是 `123456`,请同步修改 `lab-booking-server/src/main/resources/application.yml` 中的 `spring.datasource.password`。 ### 第 2 步:启动后端 ```bash cd lab-booking-server mvn spring-boot:run ``` 看到以下提示说明启动成功: ``` 高校实验室预约管理系统 后端服务启动成功 接口文档: http://localhost:8080/doc.html ``` ### 第 3 步:启动前端 另开一个命令行窗口: ```bash cd lab-booking-web npm install # 首次运行需要执行,已安装过可跳过 npm run dev ``` 浏览器访问: ### 第 4 步:打包部署(可选) ```bash # 后端打可执行 jar cd lab-booking-server mvn clean package -DskipTests java -jar target/lab-booking-server-1.0.0.jar # 前端打包静态资源,产物在 lab-booking-web/dist cd lab-booking-web npm run build ``` --- ## 五、演示账号 密码统一为 `123456` | 账号 | 姓名 | 角色 | 说明 | | --- | --- | --- | --- | | admin | 系统管理员 | 管理员 | 全部管理权限 | | teacher1 | 张建华 | 教师 | 负责 A-301、A-505、A-306、C-102、E-201,可审核预约、处理报修 | | teacher2 | 李文博 | 教师 | 负责 B-205、D-401 | | stu1 | 王小明 | 学生 | 有历史预约记录 | | stu2 | 李思琪 | 学生 | 有多条违规扣分记录 | | stu3 | 赵天宇 | 学生 | 信用分较低,可用于演示预约受限 | | stu4 | 刘佳怡 | 学生 | 预约记录较多 | | stu5 | 陈浩然 | 学生 | 有借用与报修记录 | | stu6 | 孙梦琪 | 学生 | 有超时未归还记录 | > 信用分不是固定值:定时任务会把超时未签到、爽约、超期未归还的预约记为违规并自动扣分,因此分数会随时间变化。 登录页下方有演示账号快捷标签,点击即可自动填入。 --- ## 六、功能模块 ### 学生端 - 工作台:我的近期预约、推荐实验室、公告、信用分概览 - 实验室预约:按类型 / 关键字筛选实验室,查看详情与空闲时段 - 在线预约:选择日期时间段、填写用途人数、勾选随单借用设备,提交时实时检测时间冲突 - 我的预约:查看状态、签到、签退、取消 - 智能推荐:按匹配度排序推荐最合适的实验室 - 我的借用 / 我的报修 / 我的信用(违规记录与信用分明细) - 个人中心:修改资料、修改密码 ### 教师端 - 学生端全部功能 - 预约审核:通过 / 驳回并填写审核意见,支持只看自己负责的实验室 - 报修处理:受理、填写处理说明并完成 - 数据统计与算法演示 ### 管理端 - 用户管理:新增、修改、启用禁用、重置密码、删除 - 实验室管理:台账维护、开放时段、负责教师、启停用 - 设备管理:台账维护、状态流转(可借用 / 已借出 / 维修中 / 报废) - 预约管理:全量预约查询、代审核、签到签退 - 借用管理 / 报修管理 / 违规管理(可撤销违规并恢复信用分) - 公告管理 - 数据统计:趋势、状态分布、使用率排行、时段热度、学院排行、热门设备、算法性能对比 --- ## 七、算法亮点 ### 1. 时间冲突检测算法优化 **问题**:判断某个时间段能否预约时,朴素做法是把该实验室已有预约逐条做区间重叠比较,单次检测复杂度 O(n),在提交预约、实时冲突提示等场景下反复调用,整体达到 O(n²)。 **优化**:预先将已有预约按开始时间排序,并计算「前缀最大结束时间」数组,查询时用两次二分查找把候选区间缩小到常数规模,整体复杂度降为 O(n log n)。 **实测对比**(同一批数据下执行 n 次查询,两种算法判定结果完全一致): | 已有预约数 | 查询次数 | 朴素算法 | 优化算法(建索引 + 查询) | 提速 | | --- | --- | --- | --- | --- | | 500 | 500 | 6.89 ms | 0.64 + 0.28 = 0.92 ms | 7.5 倍 | | 1000 | 1000 | 28.33 ms | 0.97 + 0.50 = 1.47 ms | 19.2 倍 | | 2000 | 2000 | 96.51 ms | 2.03 + 1.51 = 3.55 ms | 27.2 倍 | | 5000 | 5000 | 671.82 ms | 6.21 + 9.38 = 15.59 ms | 43.1 倍 | | 10000 | 10000 | 2751.35 ms | 13.60 + 33.21 = 46.80 ms | 58.8 倍 | 数据量越大优势越明显,且结果一致率 100%。此对比可在「数据统计」页面点击「重新测试」实时复现。 ### 2. 基于用户画像的实验室智能推荐 构造用户偏好向量(按历史预约的实验室类型分布)与实验室特征向量,用余弦相似度计算匹配度,再融合近 30 天热度(25%)与未来 3 天空闲度(30%)加权排序,输出带推荐理由的结果。 ### 3. 信用分闭环治理 超时未签到、爽约、超期未归还等行为由定时任务自动记违规并扣信用分,信用分低于 60 分禁止预约,管理员可撤销违规并恢复分值,形成完整闭环。 --- ## 八、测试与验证 ### 接口自动化测试 ```powershell powershell -ExecutionPolicy Bypass -File tools\api-test.ps1 ``` 覆盖 11 组共 59 项检查:登录鉴权、实验室、设备、预约全流程、冲突检测、空闲时段、审核、借用归还、报修、违规信用、统计报表、权限控制、算法性能对比。 脚本会在运行前后自动清理自己产生的测试预约(按预约用途标记识别),因此可以反复执行,不会因为「每人每天最多预约 3 次」的限制而失败。 ### 页面自动化检查 ```bash cd tools/browser-check npm install node check.mjs # 逐个页面截图到 shots/ 并收集控制台错误 ``` 覆盖学生端 10 个页面、教师端 2 个页面、管理端 9 个页面。 ### 小程序自动化巡检 ```bash cd tools/mp-auto npm install # 首次运行需要执行 node verify.js # 依次进入 9 个页面、自动截图、收集控制台报错 ``` 脚本会逐个打开小程序全部 9 个页面,打印每页实际加载到的数据条数,把截图输出到 `tools/mp-check/auto-*.png`,最后汇总控制台错误。全部正常时控制台错误列表为空 `[]`。 ```bash node verify-admin.js # 管理端巡检:切换管理员账号,跑 8 个管理页面 + 3 项权限检查 ``` 管理端巡检会自动用 `admin` 账号登录、把令牌写进小程序、依次进入全部管理页面,额外验证「报修三种状态都能渲染」与「学生账号看不到管理入口」,截图输出到 `tools/mp-check/adm-*.png`。 需要单独看某个页面时,可以用截图小工具:`node shot.js /pages/admin/repair 自定义名字.png admin`(最后一个参数是账号,不填就用当前登录的账号)。 --- ## 九、常见问题 **Q:启动后端报数据库连接失败?** 检查 MySQL 是否已启动、root 密码是否为 123456、`lab_booking` 数据库是否已创建。 **Q:前端页面能打开但接口全部报错?** 确认后端已在 8080 端口运行。前端通过 Vite 代理访问后端,后端未启动时所有接口都会失败。 **Q:端口被占用?** 后端改 `application.yml` 的 `server.port`;前端改 `vite.config.js` 的 `server.port`,同时需要同步修改代理目标地址。后端换端口时,还要改前端的代理 `target`。 **Q:双击脚本后 MySQL 提示权限不足?** 启停 MySQL 服务需要管理员权限。右键脚本 → 「以管理员身份运行」即可,或者 Win+R 输入 `services.msc`,找到 `MySQL80` 手动点「启动」。 **Q:手机扫码预览后,一点登录就报「网络异常,请确认后端已启动」?** 接口地址写成了 `127.0.0.1` 导致的 —— **手机上的 `127.0.0.1` 指的是手机自己,不是你的电脑**,所以永远连不上。按顺序做: 1. 手机和电脑必须在同一个局域网(连同一个 Wi-Fi,或者手机连电脑开的热点) 2. 先用手机浏览器打开 `http://电脑IP:8080/api/notice/list`,能看到一段 JSON 就说明网络通了 3. 小程序登录页 → 点「服务器地址」→「修改服务器地址」→ 填 `http://电脑IP:8080/api` 4. 点「测试当前连接」确认能通,再登录 小程序启动时会自动探测一次常用地址(`127.0.0.1`、`192.168.137.1` 移动热点、`172.17.210.28`),探测到就直接用;都不通才需要手动填,填过会用 storage 记住。 查电脑 IP:命令行输入 `ipconfig`,看「以太网」或「无线局域网适配器 WLAN」的 IPv4 地址。电脑没有 Wi-Fi 时,可以在 Windows「设置 → 网络和 Internet → 移动热点」里开热点,手机连上后用 `http://192.168.137.1:8080/api`。 > 答辩用开发者工具的模拟器演示不受影响,模拟器和后端在同一台机器上,`127.0.0.1` 就是对的。 **Q:手机上「打开调试就能登录,关掉调试就报网络错误」?** 这是微信的域名校验规则,不是接口地址的问题。小程序只允许访问小程序后台「开发设置 → 服务器域名」白名单里的域名,而白名单要求域名**必须经过 ICP 备案** —— 本项目用的局域网 IP 和内网穿透域名都备不了案,所以在真机上只有**调试模式**会跳过校验。官方原文([服务器域名 - 跳过域名校验](https://developers.weixin.qq.com/miniprogram/dev/framework/ability/network.html)): > 在微信开发者工具中,可以临时开启「开发环境不校验请求域名、TLS 版本及 HTTPS 证书」选项,跳过服务器域名的校验。此时,在微信开发者工具中**及手机开启调试模式时**,不会进行服务器域名的校验。……如果手机上出现「打开调试模式可以发出请求,关闭调试模式无法发出请求」的现象,请确认是否跳过了域名校验。 所以:**真机演示时把调试开着就行** —— 小程序右上角 `···` → 「打开调试」,小程序会重启一次,之后所有请求都正常。界面底部会出现 vConsole 面板,点它右下角可以收起,不影响演示观感。 > 重新扫预览码后,这个开关有时会被重置成「关闭调试」,演示前先确认一眼(能看到 vConsole 就说明开着)。 > 想彻底不用开调试只有两条路:① 买域名 + ICP 备案 + cpolar 付费版绑定自定义域名,再配置小程序白名单;② 改造小程序改用微信云托管的 `wx.cloud.callContainer`(走微信内部链路,无需备案)。两条都不建议在答辩前动。 **Q:想重置演示数据?** 双击根目录的 `恢复演示数据.bat`,等价于重新按顺序执行 `sql/init.sql`、`sql/02-data.sql`、`sql/03-demo-data.sql`、`sql/04-repair-data.sql`。 > **为什么要复位**:后端有定时任务每分钟扫描一次,把「已通过但没签到」的预约判为爽约并自动扣信用分。演示或自动化测试跑几轮后,学生信用分会低于可预约下限 60 分,再点预约就会被拦住(提示「信用分不足,暂时无法预约」)。这不是 Bug,是信用分治理机制在正常起作用 —— **答辩演示前先跑一遍 `恢复演示数据.bat`** 就能回到初始状态。 > 同一原因:直接运行 `tools/api-test.ps1` 时,如果测试账号信用分低于 60 分,脚本会在开头直接提示先去复位,不会报出一片看不懂的失败。 **Q:Knife4j 接口文档打不开?** 确认后端已启动,访问 。该地址由后端提供,与前端端口无关。 --- ## 十、微信小程序端 小程序工程在 `lab-booking-mp/`,使用微信原生小程序框架(非 uni-app 转换),与网页端共用同一套后端接口。 ### 页面清单(9 个) | 页面 | 路径 | 说明 | | --- | --- | --- | | 实验室列表 | `pages/room/list` | 搜索、类型筛选、智能推荐卡片 | | 实验室详情 | `pages/room/detail` | 实验室信息、排期时段、在线预约表单、随单借用设备 | | 我的预约 | `pages/reservation/my` | 预约列表、状态标签、取消 / 签到 / 签退 | | 公告列表 | `pages/notice/list` | 公告与规则分类展示 | | 公告详情 | `pages/notice/detail` | 正文、类型标签、发布时间 | | 个人中心 | `pages/profile/index` | 个人资料、信用分、功能入口 | | 我的借用 | `pages/borrow/my` | 设备借用记录与归还时间 | | 信用与违规 | `pages/violation/my` | 信用分、违规记录与扣分明细 | | 登录 / 注册 | `pages/login/index` | 演示账号快捷填充 | ### 管理端页面(8 个,教师 / 管理员可见) 入口在「我的 → 管理工作台」,学生账号看不到该入口。 | 页面 | 路径 | 说明 | | --- | --- | --- | | 管理工作台 | `pages/admin/index` | 待办数量概览(待审核预约 / 待处理报修 / 实验室 / 公告)+ 功能入口 | | 预约审核 | `pages/admin/review` | 待我审核列表、全部预约查询、通过 / 驳回(可填审核意见)、代为签到签退 | | 报修处理 | `pages/admin/repair` | 按待受理 / 处理中 / 已完成分页,受理与完成维修时填写处理说明 | | 公告管理 | `pages/admin/notice-manage` | 公告检索、发布 / 下架 / 编辑 / 删除 | | 发布·编辑公告 | `pages/admin/notice-edit` | 标题、类型(公告 / 规则)、正文,支持存草稿 | | 实验室管理 | `pages/admin/room-manage` | 台账检索、开放 / 停用、编辑、删除 | | 新增·编辑实验室 | `pages/admin/room-edit` | 名称、房间号、楼栋、类型、容量、开放时段、负责教师、简介 | | — | — | 权限与网页端一致:教师只能审核自己负责的实验室,公告与实验室维护仅管理员可操作 | ### 运行方式 1. 微信开发者工具 → 导入项目 → 目录选择 `lab-booking-mp`(或直接双击根目录的 `打开小程序.bat`) 2. 右上角「详情 → 本地设置」勾选 **不校验合法域名**:小程序要访问本机 `http://127.0.0.1:8080`,不勾会全部请求失败 3. **真机预览时,手机上还要「打开调试」**(小程序右上角 `···` → 打开调试):关掉调试后所有请求会被微信域名校验拦住、报「网络异常」,这是微信规则而非配置错误,原理见第九节常见问题 4. 后端必须已启动,否则所有列表都是空的 > 后端地址写在 `lab-booking-mp/config.js`,换电脑或换端口时只改这一处。 > 页面白屏时先点一下工具栏的「编译」按钮重新编译,通常是编译缓存没跟上,不是代码问题。 --- ## 十一、毕业设计论文 论文正文已按本科毕业设计(论文)的常规格式撰写并排版,位于 `thesis/` 目录: | 文件 | 说明 | | --- | --- | | `thesis/毕业论文-基于SpringBoot与Vue3的高校实验室预约管理系统.docx` | 可编辑的 Word 版(正文约 1.5 万字,含 6 张系统截图、5 张自绘插图、9 张表格) | | `thesis/毕业论文-基于SpringBoot与Vue3的高校实验室预约管理系统.pdf` | 排版后的 PDF 版,用于预览与打印 | 论文结构:封面、中英文摘要、目录(页码已对齐正文)、七章正文、参考文献 22 条、致谢。 正文的分节页码为「封面无页码 / 摘要与目录用罗马数字 / 正文从 1 开始」,表题在表上方、图题在图下方,表格为三线表。 **需要自己填写的部分** 1. 封面上的学校、学院、专业、班级、姓名、学号、指导教师(文档中以下划线留空) 2. 参考文献请核对一遍,替换成自己实际查阅过的文献,并按学校要求的著录格式调整 3. 如果学校有统一模板,把正文内容套进模板即可,图表与文字都可直接复制 **重新生成论文(改了数据或图表后)** ```powershell python thesis\make_figures.py # 1. 生成插图(架构图、状态图、E-R 图、性能图、索引示意图) python thesis\build_thesis.py # 2. 生成 Word(目录页码暂为占位) powershell -File thesis\render.ps1 -DocxPath "<绝对路径>\thesis\毕业论文-....docx" -PdfPath "<绝对路径>\thesis\out.pdf" python thesis\qa.py # 3. 渲染每页图片并提取各标题真实页码到 thesis\toc.json python thesis\build_thesis.py thesis\toc.json # 4. 用真实页码重新生成 Word(目录页码自动对齐) ``` > `thesis/render.ps1` 依赖本机安装的 Microsoft Word(用 COM 导出 PDF);`thesis/qa/` 下的逐页截图只做排版检查,已加入 `.gitignore`。 --- ## 十二、手机外网访问(内网穿透) 默认情况下小程序只能连**同一个局域网**里的后端(笔记本开热点、手机连热点)。想让手机用 4G/5G 直接访问,用 cpolar 把本机 8080 映射成公网地址即可,**Java 代码一行都不用改**。 **用法** 1. 双击根目录的 `开启外网访问.bat`(内部执行 `cpolar http 8080`) 2. 窗口里出现 `Forwarding https://xxxxxxxx.r34.cpolar.top -> http://localhost:8080` 后,复制那个 `https://` 开头的地址 3. 末尾加上 `/api`,填到小程序登录页的「服务器地址」,例如 `https://xxxxxxxx.r34.cpolar.top/api` 4. 微信开发者工具 → 详情 → 本地设置,勾选 **不校验合法域名、TLS 版本以及 HTTPS 证书**(cpolar 免费域名没有备案,不勾会被拒绝) **注意** - cpolar 免费版每次重启隧道,子域名都会变;变了改小程序登录页的地址,或改 `lab-booking-mp/config.js` 里的 `CANDIDATE_URLS` - 真机预览时小程序会对 `CANDIDATE_URLS` 里的地址做**并发探测**(各 3 秒超时,谁先返回正常响应就用谁),所以热点地址和穿透地址都在列表里时,手机连不连热点都能自动找到后端 - 这个地址只用于**开发、预览、答辩演示**:微信正式发布要求 HTTPS + 已备案域名,内网穿透地址不能上线 - 只映射 8080,不要映射 3306(数据库);演示完关掉那个窗口即断开 - 本机安装位置:`D:\develop\cpolar\cpolar.exe`;cpolar 账号:peibingyan@qq.com - **真机上必须打开调试**(右上角 `···` → 打开调试):cpolar 的免费域名没有备案,进不了小程序后台的服务器域名白名单,只有调试模式会跳过域名校验。这不影响答辩演示