【免费】微信小程序网约车(打车,在线叫车,移动出行)系统(SpringBoot4+Vue3) 锋哥原创出品,必属精品
大家好我是Java1234_小锋老师分享一套锋哥原创的微信小程序网约车(打车在线叫车移动出行)系统(SpringBoot4Vue3)。项目介绍随着移动互联网与共享出行模式的快速发展网约车已成为城市居民日常出行的重要方式。传统电话召车或路边扬招方式存在信息不对称、匹配效率低、服务过程难追溯等问题。微信小程序具有即用即走、无需安装、传播成本低等优势适合作为网约车业务的移动入口。本文围绕“微信小程序网约车系统”开展需求分析、总体设计、数据库设计与系统实现构建覆盖乘客端、司机端与管理后台的一体化出行服务平台。系统采用前后端分离架构。后端基于Spring Boot构建RESTful接口结合MyBatis-Plus完成数据持久化使用JWT实现多端统一身份认证并通过WebSocket完成订单实时推送与状态同步管理后台采用Vue3、Vite、Element Plus与ECharts实现可视化运营管理乘客端与司机端分别使用微信小程序原生技术开发完成地图叫车、抢单接驾、行程推进、余额支付、评价投诉与个人中心等核心业务。数据库选用MySQL库名为db_taxi相关业务表均以t_为前缀进行规范化设计。论文详细给出了系统功能结构图、实体属性图、实体关系图与关键业务时序图并对每个数据表字段字段名、类型、长度、是否为空、备注进行了完整说明。系统实现章节结合核心代码阐述了登录注册、价格预估、下单派单、并发抢单、余额支付、司机审核与后台统计等关键模块。测试结果表明系统功能完整、流程闭环能够满足本科毕业设计对工程实践与文档规范的要求对同类校园或区域出行平台建设具有一定参考价值。源码下载链接: https://pan.baidu.com/s/1aL90CVm2HeRnpSSug4Rt1Q?pwd1234提取码: 1234系统展示核心代码package com.taxi.controller.app; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.taxi.common.Constants; import com.taxi.common.Result; import com.taxi.dto.*; import com.taxi.entity.*; import com.taxi.interceptor.JwtTokenInterceptor; import com.taxi.mapper.*; import com.taxi.service.DriverService; import com.taxi.service.OrderService; import com.taxi.utils.FileUploadUtil; import com.taxi.vo.LoginVO; import com.taxi.vo.OrderDetailVO; import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.List; /** * 司机端小程序控制器 * * author taxi */ RestController RequestMapping(/app/driver) public class AppDriverController { Autowired private DriverService driverService; Autowired private OrderService orderService; Autowired private VehicleMapper vehicleMapper; Autowired private CarTypeMapper carTypeMapper; Autowired private BalanceRecordMapper balanceRecordMapper; Autowired private FileUploadUtil fileUploadUtil; /** 司机登录 */ PostMapping(/login) public ResultLoginVO login(RequestBody LoginDTO dto) { return Result.success(driverService.login(dto)); } /** 司机注册入驻申请 */ PostMapping(/register) public ResultVoid register(RequestBody DriverRegisterDTO dto) { driverService.register(dto); return Result.success(); } /** 获取个人信息 */ GetMapping(/info) public ResultDriver info(HttpServletRequest request) { Long id (Long) request.getAttribute(JwtTokenInterceptor.ATTR_USER_ID); return Result.success(driverService.getInfo(id)); } /** 修改资料 */ PutMapping(/profile) public ResultVoid updateProfile(HttpServletRequest request, RequestBody Driver driver) { Long id (Long) request.getAttribute(JwtTokenInterceptor.ATTR_USER_ID); driverService.updateProfile(id, driver); return Result.success(); } /** 修改密码 */ PutMapping(/password) public ResultVoid updatePassword(HttpServletRequest request, RequestBody PasswordDTO dto) { Long id (Long) request.getAttribute(JwtTokenInterceptor.ATTR_USER_ID); driverService.updatePassword(id, dto); return Result.success(); } /** 上传头像 */ PostMapping(/upload) public ResultString upload(RequestParam(file) MultipartFile file) { return Result.success(fileUploadUtil.upload(file)); } /** 切换工作状态上线/下线 */ PutMapping(/workStatus) public ResultVoid toggleWorkStatus(HttpServletRequest request, RequestParam Integer workStatus) { Long id (Long) request.getAttribute(JwtTokenInterceptor.ATTR_USER_ID); driverService.toggleWorkStatus(id, workStatus); return Result.success(); } /** 获取车辆信息 */ GetMapping(/vehicle) public ResultVehicle vehicle(HttpServletRequest request) { Long id (Long) request.getAttribute(JwtTokenInterceptor.ATTR_USER_ID); Vehicle vehicle vehicleMapper.selectOne(new LambdaQueryWrapperVehicle() .eq(Vehicle::getDriverId, id)); return Result.success(vehicle); } /** 待接订单列表 */ GetMapping(/orders/pending) public ResultListOrderDetailVO pendingOrders() { return Result.success(orderService.pendingOrders()); } /** 抢单 */ PostMapping(/order/accept/{id}) public ResultVoid acceptOrder(HttpServletRequest request, PathVariable Long id) { Long driverId (Long) request.getAttribute(JwtTokenInterceptor.ATTR_USER_ID); orderService.acceptOrder(driverId, id); return Result.success(); } /** 到达乘客位置 */ PostMapping(/order/arrive/{id}) public ResultVoid arriveOrder(HttpServletRequest request, PathVariable Long id) { Long driverId (Long) request.getAttribute(JwtTokenInterceptor.ATTR_USER_ID); orderService.arriveOrder(driverId, id); return Result.success(); } /** 开始行程 */ PostMapping(/order/start/{id}) public ResultVoid startTrip(HttpServletRequest request, PathVariable Long id) { Long driverId (Long) request.getAttribute(JwtTokenInterceptor.ATTR_USER_ID); orderService.startTrip(driverId, id); return Result.success(); } /** 结束行程 */ PostMapping(/order/end/{id}) public ResultVoid endTrip(HttpServletRequest request, PathVariable Long id) { Long driverId (Long) request.getAttribute(JwtTokenInterceptor.ATTR_USER_ID); orderService.endTrip(driverId, id); return Result.success(); } /** 我的订单列表 */ GetMapping(/orders) public ResultListOrderDetailVO orders(HttpServletRequest request, RequestParam(required false) Integer status) { Long id (Long) request.getAttribute(JwtTokenInterceptor.ATTR_USER_ID); return Result.success(orderService.driverOrders(id, status)); } /** 订单详情 */ GetMapping(/order/{id}) public ResultOrderDetailVO orderDetail(PathVariable Long id) { return Result.success(orderService.getOrderDetail(id)); } /** 收入流水 */ GetMapping(/incomeRecords) public ResultListBalanceRecord incomeRecords(HttpServletRequest request) { Long id (Long) request.getAttribute(JwtTokenInterceptor.ATTR_USER_ID); ListBalanceRecord records balanceRecordMapper.selectList( new LambdaQueryWrapperBalanceRecord() .eq(BalanceRecord::getUserId, id) .eq(BalanceRecord::getUserType, Constants.USER_TYPE_DRIVER) .orderByDesc(BalanceRecord::getCreateTime)); return Result.success(records); } }template div classpage-container !-- 统计卡片 -- el-row :gutter20 stylemargin-bottom: 20px el-col :span6 div classstat-card div classstat-label订单总数/div div classstat-value{{ data.totalOrders || 0 }}/div /div /el-col el-col :span6 div classstat-card green div classstat-label乘客总数/div div classstat-value{{ data.totalPassengers || 0 }}/div /div /el-col el-col :span6 div classstat-card orange div classstat-label司机总数/div div classstat-value{{ data.totalDrivers || 0 }}/div /div /el-col el-col :span6 div classstat-card blue div classstat-label总营收(元)/div div classstat-value{{ data.totalRevenue || 0 }}/div /div /el-col /el-row !-- 图表区域 -- el-row :gutter20 el-col :span12 div classchart-card h3近7日订单量/h3 div reforderChartRef styleheight: 300px/div /div /el-col el-col :span12 div classchart-card h3近7日营收/h3 div refrevenueChartRef styleheight: 300px/div /div /el-col /el-row el-row :gutter20 el-col :span12 div classchart-card h3订单状态分布/h3 div refstatusChartRef styleheight: 300px/div /div /el-col el-col :span12 div classchart-card h3司机接单排行/h3 div refrankChartRef styleheight: 300px/div /div /el-col /el-row /div /template script setup import { ref, onMounted, onUnmounted } from vue import * as echarts from echarts import request from /utils/request import { orderStatusMap } from /utils/date const data ref({}) const orderChartRef ref(null) const revenueChartRef ref(null) const statusChartRef ref(null) const rankChartRef ref(null) let charts [] /** 加载统计数据并渲染图表 */ async function loadData() { const res await request.get(/admin/stat/dashboard) data.value res.data // 近7日订单折线图 const orderChart echarts.init(orderChartRef.value) const dailyOrders res.data.dailyOrders || [] orderChart.setOption({ tooltip: { trigger: axis }, xAxis: { type: category, data: dailyOrders.map(i i.date) }, yAxis: { type: value, minInterval: 1 }, series: [{ type: line, data: dailyOrders.map(i i.count), smooth: true, areaStyle: { opacity: 0.3 }, itemStyle: { color: #667eea } }] }) charts.push(orderChart) // 近7日营收柱状图 const revenueChart echarts.init(revenueChartRef.value) const dailyRevenue res.data.dailyRevenue || [] revenueChart.setOption({ tooltip: { trigger: axis }, xAxis: { type: category, data: dailyRevenue.map(i i.date) }, yAxis: { type: value }, series: [{ type: bar, data: dailyRevenue.map(i i.amount), itemStyle: { color: #11998e, borderRadius: [4, 4, 0, 0] } }] }) charts.push(revenueChart) // 订单状态饼图 const statusChart echarts.init(statusChartRef.value) const statusData (res.data.orderStatusDistribution || []).map(i ({ name: orderStatusMap[i.status] || 未知, value: i.count })) statusChart.setOption({ tooltip: { trigger: item }, legend: { bottom: 0 }, series: [{ type: pie, radius: [40%, 70%], data: statusData, emphasis: { itemStyle: { shadowBlur: 10 } } }] }) charts.push(statusChart) // 司机排行横向柱状图 const rankChart echarts.init(rankChartRef.value) const ranking res.data.driverRanking || [] rankChart.setOption({ tooltip: { trigger: axis }, yAxis: { type: category, data: ranking.map(i i.driverName).reverse() }, xAxis: { type: value, minInterval: 1 }, series: [{ type: bar, data: ranking.map(i i.orderCount).reverse(), itemStyle: { color: #f5576c, borderRadius: [0, 4, 4, 0] } }] }) charts.push(rankChart) } onMounted(() loadData()) onUnmounted(() charts.forEach(c c.dispose())) /script

相关新闻

终极免费方案:IDM激活脚本完整使用指南

终极免费方案:IDM激活脚本完整使用指南

终极免费方案:IDM激活脚本完整使用指南 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为Internet Download Manager(IDM&#xff09…

2026/10/16 5:05:50 阅读更多 →
卢卡帕利 Rucaparib:卵巢癌术后维持治疗,让BRCA突变患者复发时间从5个月延长到近11个月

卢卡帕利 Rucaparib:卵巢癌术后维持治疗,让BRCA突变患者复发时间从5个月延长到近11个月

卵巢癌被称为”沉默的杀手”,因为早期几乎没有症状,约70%的患者确诊时已是晚期。即使手术切除了肿瘤,化疗后达到了完全缓解,复发率仍然高达70%到80%。如何让这来之不易的缓解期尽可能延长,是卵巢癌治疗的核心难题。卢卡…

2026/10/16 5:05:51 阅读更多 →
3大核心功能+7步部署方案:鸣潮自动化工具ok-ww的智能解放之旅

3大核心功能+7步部署方案:鸣潮自动化工具ok-ww的智能解放之旅

3大核心功能7步部署方案:鸣潮自动化工具ok-ww的智能解放之旅 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 你是否曾在…

2026/10/17 23:04:34 阅读更多 →

最新新闻

MoE混合专家模型:万亿参数背后的稀疏激活原理与工程实践

MoE混合专家模型:万亿参数背后的稀疏激活原理与工程实践

1. 从“万亿参数”说起:MoE到底在解决什么问题第一次看到“万亿参数”这个词,很多人的直觉反应是:这得多少张显卡才能跑起来?训练成本是不是天文数字?推理一次是不是要等到天荒地老?但实际情况是&#xff0…

2026/10/18 4:22:29 阅读更多 →
Colibri:Oracle新一代JIT编译器,能否取代HotSpot C2?

Colibri:Oracle新一代JIT编译器,能否取代HotSpot C2?

最近Oracle实验室那边放出了一个新项目,代号叫Colibri,来自法语里的“蜂鸟”。名字很轻巧,做的事情却不小——它要做HotSpot JVM的新一代JIT编译器。说白了,就是以后Java程序的运行效率,很大程度会押在这个小家伙身上。…

2026/10/18 4:22:29 阅读更多 →
AI论文工具推荐:8款论文AI改稿、引用、排版与导出对比|TaoToken统一Key接入实测

AI论文工具推荐:8款论文AI改稿、引用、排版与导出对比|TaoToken统一Key接入实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 4:22:29 阅读更多 →
基于U2Net的Python证件照生成:人像分割与背景替换实战

基于U2Net的Python证件照生成:人像分割与背景替换实战

简介:基于 Python U2Net 深度学习的证件照生成完整项目,面向具备图像处理基础或对深度学习分割感兴趣的开发者,从模型原理到代码实现均有覆盖,旨在通过 U2Net 对人像区域进行高精度分割,再配合背景替换与尺寸调整自动生…

2026/10/18 4:22:29 阅读更多 →
喘振与旋转失速怎么治?压缩机动态建模与主动控制解析

喘振与旋转失速怎么治?压缩机动态建模与主动控制解析

简介:《压缩机喘振与旋转失速:建模与控制》是一本面向压缩机设计、运行与控制方向的专业书籍,重点围绕轴流式和离心式压缩机中喘振与旋转失速的诱发机理、动态建模及控制策略展开,适合机械工程师、过程控制研究人员及工业自动化从…

2026/10/18 4:22:29 阅读更多 →
火星系品牌矩阵发布会策划复盘:从循环经济叙事到外宾接待全流程解析

火星系品牌矩阵发布会策划复盘:从循环经济叙事到外宾接待全流程解析

一个发布会能把"酿酒"和"循环经济"绑在一起,还能请到外方高级别嘉宾到场,本身已经赢了一半传播话题。火星贡酒、火星集市循环经济、火星盾这三个名字同时出现在一场活动里,乍看像科幻片混搭,实际上是一个典型…

2026/10/18 4:21:29 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →