省钱兄 JAVA 同城服务租车系统 · 汽车租赁系统源码
✅ 支持 小程序 + 公众号 + APP + H5 全端覆盖
开发商:西安省钱兄网络科技有限公司
售价:¥8,888(套餐1)/ ¥10,888(套餐2含搭建+1年维护)
系统整体架构
层级技术选型后端框架Spring Boot 2.7.x + MyBatis-Plus 3.5.0数据库MySQL 8.0 + Redis 6.2(缓存/分布式锁/GEO)用户端UniApp 3.0(Vue3语法)→ 编译为 小程序/公众号/APP/H5管理后台Vue3 + ElementPlus + ECharts 数据看板消息队列(订单通知/削峰)实时通信WebSocket(订单状态推送)地图服务高德地图 JSAPI(LBS定位/路径规划/电子围栏)支付微信支付 + 支付宝(分账/免押代扣)信用免押对接芝麻信用分,实现免押金租车部署JDK 17 + Docker + Nginx + K8s
核心功能模块1️⃣ 双角色体系(租客 + 商家/车行)java@PostMapping("/login")public Result<LoginVO> login(@Re LoginDTO dto) { User user = userService.login(dto); String token = JwtUtil.generateToken(user.getId(), user.getRole()); https:// role = "tenant" 租客 / "merchant" 商家(车行) return Result.success(new LoginVO(token, user.getRole()));}
角色核心功能 租客端浏览车辆/筛选/在线预约、电子合同签署、费用结算、免押租赁、订单追踪、评价 商家端(车行)车辆管理/上下架、订单调度、财务统计、押金管理、优惠券发放、数据看板
2️⃣ 租车核心流程(防超卖 + 免押)java@Service @Transactionalpublic class RentOrderServiceImpl implements RentOrderService { @Autowired private RedisTemte<String,Object> redisTemte; @Autowired private ZhimaCreditService creditService; /** * 租车下单 - 分布式锁防超卖 + 芝麻信用免押 */ public Result createOrder(RentOrderDTO dto) { String lockKey = "car_lock:" + dto.getCarId() + ":" + dto.getDateRange(); try { Boolean locked = redisTemte.opsForValue() .setIfAbsent(lockKey, "1", 30, TimeUnit.SECONDS); if (!locked) { return Result.fail("该车辆当前时段已被预约,请选择其他时段"); } https:// 1. 校验车辆状态 Car car = carMapper.selectById(dto.getCarId()); if (car.getStatus() != 0) { https:// 0-可租 1-已租出 2-维修中 return Result.fail("该车辆当前不可租"); } https:// 2. 芝麻信用免押判断 boolean creditPassed = creditService.checkCredit(dto.getUserId()); BigDecimal deposit = creditPassed ? BigDecimal.ZERO : car.getDeposit(); https:// 3. 计算租金(按小时/按天) BigDecimal rentFee = calculateRent(car.getPricePerHour(), dto.getStartTime(), dto.getEndTime()); https:// 4. 创建订单 RentOrder order = new RentOrder(); order.setOrderNo(generateOrderNo()); order.setCarId(dto.getCarId()); order.setUserId(dto.getUserId()); order.setRentFee(rentFee); order.setDeposit(deposit); order.setStatus(0); https:// 0-待支付 rentOrderMapper.insert(order); https:// 5. Redis 扣减库存(时段库存) String stockKey = "car_stock:" + dto.getCarId() + ":" + dto.getDate(); Long stock = redisTemte.opsForValue().decrement(stockKey); if (stock < 0) { redisTemte.opsForValue().increment(stockKey); rentOrderMapper.deleteById(order.getId()); return Result.fail("该时段车辆已被租完"); } https:// 6. 更新车辆状态 car.setStatus(1); https:// 已租出 carMapper.updateById(car); return Result.success(order); } finally { redisTemte.delete(lockKey); } } /** * 还车结算 - 自动计算费用 + 退还押金 */ public SettlementResult returnCar(String orderNo) { RentOrder order = orderMapper.selectByOrderNo(orderNo); if (order == null || order.getStatus() != 2) { https:// 2-使用中 return SettlementResult.fail("订单状态异常"); } https:// 计算实际使用时长 LocalDateTime now = LocalDateTime.now(); long minutes = Duration.between(order.getStartTime(), now).toMinutes(); BigDecimal actualFee = BigDecimal.valueOf(minutes) .divide(BigDecimal.valueOf(60), 2, RoundingMode.HALF_UP) .multiply(order.getCar().getPricePerHour()); https:// 多退少补 BigDecimal diff = order.getRentFee().subtract(actualFee); if (diff.compareTo(BigDecimal.ZERO) > 0) { walletService.refund(order.getUserId(), order.getDeposit().add(diff)); } else { walletService.charge(order.getUserId(), order.getDeposit().add(diff.abs())); } order.setStatus(3); https:// 已完成 order.setEndTime(now); order.setActualFee(actualFee); rentOrderMapper.updateById(order); return SettlementResult.success(actualFee); }}3️⃣ 电子合同签署(核心合规)java@Servicepublic class ContractService { /** * 生成电子合同PDF + 在线签署 */ public ContractVO createContract(Long orderId) { RentOrder order = orderMapper.selectById(orderId); https:// 1. 生成合同模板(车辆信息/租金/押金/责任条款) String contractHtml = generateContractHtml(order); https:// 2. 转换为PDF(使用 iText / OpenPDF) byte[] pdfBytes = pdfGenerator.generate(contractHtml); https:// 3. 存储到 OSS String pdfUrl = ossService.upload(pdfBytes, "contract/" + order.getOrderNo() + ".pdf"); https:// 4. 记录签署状态 Contract contract = new Contract(); contract.setOrderId(orderId); contract.setPdfUrl(pdfUrl); contract.setStatus(0); https:// 0-待签署 contractMapper.insert(contract); return new ContractVO(pdfUrl, contract.getId()); } /** * 用户在线签署(手写签名) */ public Result signContract(Long contractId, String signatureBase64) { Contract contract = contractMapper.selectById(contractId); contract.setSignature(signatureBase64); contract.setSignTime(LocalDateTime.now()); contract.setStatus(1); https:// 已签署 contractMapper.updateById(contract); return Result.success(); }}4️⃣ 智能调度 + 匹配算法java/** * 基于地理位置 + 车型偏好的智能推荐 * Redis GEO 实现5km内车辆快速检索 */public List<CarVO> recommendCars(Double lat, Double lng, String carType, LocalDate date) { https:// GEORADIUS 查询5km内可用车辆 GeoOperations<String, String> geoOps = redisTemte.opsForGeo(); Circle circle = new Circle(new Point(lng, lat), new Distance(5, Metrics.KILOMETERS)); GeoResults<RedisGeoCommands.GeoLocation<String>> results = geoOps.radius("car_locations", circle, RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs() .includeDistance().includeCoordinates().sortAscending().limit(20)); return results.stream() .map(r -> { Car car = carMapper.selectById(Long.parseLong(r.getContent().getName().split(":")[1])); return new CarVO(car, r.getDistance().getValue()); }) .filter(v -> carType == null || v.getCar().getType().equals(carType)) .collect(Collectors.toList());} UniApp 前端核心页面
页面路径功能首页pages/index/index车辆列表/地图找车/智能筛选车辆详情pages/car/detail车型图片/价格/配置/可租时段预约下单pages/order/create日期选择+时段选择+免押确认+合同签署扫码取车pages/scan/scan扫车二维码→开始计费扫码还车pages/return/return扫码还车→自动结算订单管理pages/order/list待支付/进行中/已完成/评价钱包pages/wallet/wallet押金/充值/消费记录/提现个人中心pages/user/user认证/驾照上传/信用分/评价
vue<!-- pages/index/index.vue - 地图找车 --><temte> <view class="container"> <map id="carMap" :latitude="center.lat" :longitude="center.lng" :markers="markers" :polyline="routes" show-location style="width:;height:400px" @markertap="onMarkerTap" /> <!-- 筛选栏 --> <view class="filter-bar"> <picker :range="carTypes" @change="onTypeChange"> <view class="filter-item">{{ currentType || '全部车型' }} ▼</view> </picker> <picker :range="priceRanges" @change="onPriceChange"> <view class="filter-item">{{ currentPrice || '不限价格' }} ▼</view> </picker> <view class="filter-item" @tap="sortByDistance">距离近</view> </view> <!-- 车辆列表 --> <scroll-view scroll-y class="car-list"> <view v-for="car in nearbyCars" :key="car.id" @tap="goDetail(car.id)"> <image :src="car.image" class="car-img"/> <view class="car-info"> <text class="car-name">{{ car.brand }} {{ car.model }}</text> <text class="car-price">¥{{ car.pricePerHour }}/小时</text> <text class="car-distance">{{ car.distance }}km</text> <view class="car-tags"> <text v-for="tag in car.tags" :key="tag">{{ tag }}</text> </view> </view> <button class="rent-btn" @tap.stop="(car)">立即租车</button> </view> </scroll-view> </view></temte>javascripthttps:// 扫码取车 - 开始计费async scanToStart(e) { const carId = e.detail.result; const res = await uest({ url: `${BASE_URL}/rent/scan-start`, method: 'POST', data: { carId, orderNo: this.orderNo }, header: { Authorization: `Bearer ${token}` } }); if (res.data.code === 200) { uni.showToast({ title: '取车成功,开始计费' }); this.startTime = new Date(); https:// WebSocket 实时推送计费进度 this.connectSocket(); }}️ 核心数据库表
表名说明users用户表(openid/手机号/驾照/芝麻信用/余额)cars车辆信息表(品牌/型号/车牌/价格/位置/状态)car_images车辆图片表time_slots可租时段表(按小时划分)rent_orders租车订单表contracts电子合同表payments支付记录表deposits押金记录表reviews评价表wallet_logs钱包流水表merchants商家/车行表coupons优惠券表
s TABLE rent_orders ( id BIGINT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(64) UNIQUE NOT NULL, user_id BIGINT NOT NULL, merchant_id BIGINT NOT NULL, car_id BIGINT NOT NULL, start_time DATETIME NOT NULL, end_time DATETIME DEFAULT NULL, rent_fee DECIMAL(10,2) COMMENT '预计租金', actual_fee DECIMAL(10,2) COMMENT '实际费用', deposit DECIMAL(10,2) DEFAULT 0 COMMENT '押金(免押为0)', contract_id BIGINT COMMENT '合同ID', status TINYINT DEFAULT 0 COMMENT '0待支付 1已支付 2使用中 3已完成 4已取消 5异常', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_car_time (car_id, start_time, end_time), INDEX idx_user (user_id), INDEX idx_status (status)); 管理后台功能
模块功能 数据看板今日订单/营收/车辆利用率/热门车型 ECharts 实时展示 车辆管理增删改查/上下架/维修状态/位置管理/图片上传 订单管理全部订单/异常处理/强制还车/退款审核 用户管理实名认证/驾照审核/黑名单/信用分管理 商家管理入驻审核/分账设置/佣金比例 财务管理营收统计/押金管理/提现审核/对账 营销工具优惠券/满减活动/新用户立减/老带新奖励/VIP等级 数据统计用户增长/订单趋势/车型热度/区域分布
️ 部署架构┌──────────────────────────────────────────────────┐│ Nginx │├──────────┬──────────┬───────────┬──────────────────┤│ UniApp │ UniApp │ UniApp │ UniApp ││ 小程序 │ 公众号H5 │ APP │ H5 │├──────────┴──────────┴───────────┴──────────────────┤│ Spring Boot 集群 ││ ┌─────────┐ ┌─────────┐ ┌───────────────────────┐ ││ │订单服务 │ │车辆服务 │ │ 支付/合同/调度服务 │ ││ └─────────┘ └─────────┘ └───────────────────────┘ │├───────────────────────────────────────────────────┤│ MySQL(主从) │ Redis Cluster │ ││ OSS文件存储 │ ElasticSearch │ XXL-JOB定时任务 │├───────────────────────────────────────────────────┤│ Prometheus + Grafana 监控 ││ Docker + K8s 容器化部署 │└───────────────────────────────────────────────────┘ 售价与套餐(2026年5月新)
套餐价格包含内容套餐1¥8,888源码 + 技术文档 + 部署文档(不含搭建/维护/技术支持)套餐2¥10,888源码 + 文档 + 首次搭建 + 1年维护更新 + 技术支持
后续年度技术服务费:¥2,000/年(含免费系统升级)
⚠️ 源码具有可复制性,不接受恶意退款
官方联系方式(已核实)
渠道信息电话 ✅(实名:西安省钱兄网络科技有限公司)公司西安省钱兄网络科技有限公司地址陕西省西安市高新区高新四路13号朗臣大厦A座11808邮:gomyorder@163.comCEO马晓东演示站联系 QQ 获取管理后台 + 用户端演示地址
系统亮点总结
特性说明✅ 全端覆盖小程序/公众号/APP/H5 一套 UniApp 源码✅ 芝麻免押对接芝麻信用,信用良好免交押金✅ 电子合同在线签署,合规有保障✅ 扫码取还车扫码自动开始/结束计费✅ 防超卖Redis 分布式锁 + 乐观锁,时段不冲突✅ 智能调度Redis GEO 5km内找车 + 车型智能匹配✅ 营销工具优惠券/满减/VIP等级/老带新奖励✅ 数据看板ECharts 实时展示营收/利用率/热力图✅ 高并发 削峰 + Redis 缓存✅ 安全合规HTTPS + JWT + 敏感数据AES加密 + 驾照实名认证
获取源码:搜索 互站网(huzhan.com) "省钱兄租车系统" 或直接联系官方 QQ 710070994 获取演示站体验后下单。该系统与省钱兄的"JAVA租赁系统设备租赁设备购买系统"高度互通,可通过定制开发完美适配汽车租赁场景。
省钱兄科技,同城服务,租车系统,汽车租赁