1. 项目概述:城市公交查询系统的核心价值
这个基于SpringBoot+微信小程序的公交查询系统,本质上解决的是城市公共交通信息不对称的痛点。我在实际开发中发现,市面上很多公交查询应用要么功能臃肿,要么数据更新不及时。而这个毕设项目的亮点在于:它用最精简的技术栈实现了核心功能闭环。
系统主要包含三大模块:
- 实时公交查询:通过对接公交公司API或本地数据库获取车辆到站时间
- 线路规划:支持起点-终点的多方案路径推荐
- 站点收藏:用户常用站点的快速访问
特别提示:选择SpringBoot+小程序组合,既保证了后台服务的稳定性(SpringBoot的自动配置和起步依赖极大简化了开发),又获得了微信生态的流量红利(无需单独安装App)。
2. 技术架构设计解析
2.1 后端SpringBoot方案选型
采用SpringBoot 2.7.x版本(目前企业主流稳定版)搭建RESTful API,关键配置如下:
// 示例:公交线路查询接口 @RestController @RequestMapping("/api/route") public class RouteController { @Autowired private BusService busService; @GetMapping("/search") public Result<List<RouteVO>> searchRoutes( @RequestParam String start, @RequestParam String end) { return Result.success(busService.findRoutes(start, end)); } }数据库选型建议:
- MySQL 8.0(关系型数据存储线路、站点等结构化数据)
- Redis 6.x(缓存高频查询的到站信息)
2.2 微信小程序端关键技术点
小程序端需要特别注意的坑:
- 地图组件必须使用微信原生map组件(需申请腾讯位置服务key)
- 页面路由传参长度限制(不适合直接传递复杂JSON)
- 用户授权策略调整(2023年后必须使用button触发授权)
// 小程序端获取实时位置示例 wx.getLocation({ type: 'gcj02', success (res) { const {latitude, longitude} = res this.setData({userLocation: {lat: latitude, lng: longitude}}) } })3. 核心功能实现细节
3.1 实时公交数据获取方案
推荐两种实现路径:
对接官方API(首选但需申请权限)
- 高德/腾讯地图开放平台
- 本地公交集团数据接口
本地数据库维护(适合毕设演示)
CREATE TABLE `bus_arrival` ( `id` int NOT NULL AUTO_INCREMENT, `line_id` varchar(20) NOT NULL COMMENT '线路ID', `station_id` varchar(20) NOT NULL COMMENT '站点ID', `arrival_time` int DEFAULT NULL COMMENT '预计到达时间(秒)', `update_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.2 路径规划算法实现
采用改进的Dijkstra算法(考虑换乘权重):
public List<RoutePlan> findRoutes(Station start, Station end) { // 构建邻接表 Map<Station, List<RouteSegment>> graph = buildGraph(); // 优先级队列(按耗时排序) PriorityQueue<RouteNode> queue = new PriorityQueue<>(); queue.add(new RouteNode(start, null, 0)); // 核心算法逻辑... }性能优化点:对高频查询的线路组合做预计算缓存
4. 部署与上线全流程
4.1 后端部署方案对比
| 部署方式 | 适用场景 | 成本估算 |
|---|---|---|
| 本地Tomcat | 毕业答辩演示 | 0元 |
| 阿里云ECS | 长期运行 | 600元/年 |
| Docker容器化 | 跨平台部署 | 视资源而定 |
推荐毕业设计使用Docker-compose一键部署:
version: '3' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root redis: image: redis:6-alpine app: build: . ports: - "8080:8080"4.2 小程序发布避坑指南
- 域名备案:必须使用HTTPS且域名已完成ICP备案
- 业务域名配置:在小程序后台添加request合法域名
- 体验版测试:至少邀请5个同学测试核心流程
- 审核材料准备:
- 《软件著作权登记证书》(可选但加分)
- 测试账号信息(审核人员专用)
5. 典型问题排查实录
5.1 地图显示偏移问题
现象:小程序地图标记点与实际位置偏差500米 解决方案:
- 确认使用的是GCJ-02坐标系(中国火星坐标系)
- 检查后端返回的经纬度是否经过加密处理
- 调用wx.chooseLocation时添加coordType参数
5.2 高并发查询超时
优化方案三步走:
- 增加Redis缓存层(缓存时间30秒)
@Cacheable(value = "arrival", key = "#stationId") public List<ArrivalInfo> getArrivalTimes(String stationId) { // 数据库查询逻辑 } - 数据库添加复合索引
ALTER TABLE bus_arrival ADD INDEX idx_line_station (line_id, station_id); - 启用SpringBoot Actuator监控接口响应时间
6. 项目扩展方向建议
在实际交付后,可以考虑以下增值功能:
- 拥挤度预测:基于历史数据训练LSTM模型
- 个性化推荐:根据用户作息时间智能推荐线路
- 无障碍模式:语音播报+大字体显示
技术栈延伸:
- 接入Elasticsearch实现模糊搜索(站名拼音首字母匹配)
- 使用WebSocket推送车辆实时位置更新
- 结合TensorFlow Lite做端侧客流预测
我在开发过程中最大的收获是:公交系统的状态变化频率(通常1-2分钟更新)与缓存策略的平衡需要反复调试。建议在开发初期就建立完整的模拟数据生成器,方便压力测试。