1. 项目概述
作为一名长期从事企业信息化系统开发的工程师,我最近完成了一个基于微信小程序的汽车租赁管理系统开发项目。这个系统从需求分析到最终上线历时6个月,期间遇到了不少技术挑战和业务逻辑难题。今天我想把这个项目的完整开发过程分享出来,希望能给正在做类似项目的同学一些参考。
这个系统主要解决了传统汽车租赁行业的几个痛点:
- 用户租车流程繁琐,需要线下多次往返
- 企业车辆管理效率低下,人工调度成本高
- 租赁过程不透明,容易产生纠纷
- 缺乏数据分析能力,难以优化运营
系统采用微信小程序作为前端入口,后端使用Java Spring Boot框架,数据库选用MySQL,整体架构遵循微服务设计原则。下面我将从技术实现角度详细解析这个项目的开发过程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术栈选型
在项目启动阶段,我们进行了详细的技术评估和选型:
前端技术栈:
- 微信小程序:选择微信小程序而非原生App主要考虑用户使用门槛低、开发成本低、推广容易
- WXML/WXSS:小程序原生开发语言,性能优于第三方框架
- ECharts:用于数据可视化展示
- Vant Weapp:UI组件库,加速开发
后端技术栈:
- Spring Boot 2.7:简化配置,快速开发
- Spring Security:权限控制
- MyBatis-Plus:简化数据库操作
- Redis:缓存、分布式锁
- RabbitMQ:异步消息处理
数据库:
- MySQL 8.0:关系型数据库
- MongoDB:存储非结构化数据如用户行为日志
基础设施:
- 阿里云ECS:应用服务器
- 阿里云RDS:数据库服务
- 阿里云OSS:文件存储
- Nginx:负载均衡
2.2 系统架构图
整个系统采用分层架构设计:
code复制┌───────────────────────────────────────┐
│ 客户端层 │
│ ┌───────────┐ ┌───────────┐ │
│ │ 微信小程序 │ │ 管理后台 │ │
│ └───────────┘ └───────────┘ │
└───────────────────────────────────────┘
↓ HTTPS ↑
┌───────────────────────────────────────┐
│ API网关层 │
│ ┌───────────────────────────────┐ │
│ │ Nginx │ │
│ └───────────────────────────────┘ │
└───────────────────────────────────────┘
↓ RPC ↑
┌───────────────────────────────────────┐
│ 微服务应用层 │
│ ┌───────────┐ ┌───────────┐ │
│ │ 用户服务 │ │ 车辆服务 │ ... │
│ └───────────┘ └───────────┘ │
└───────────────────────────────────────┘
↓ SQL/NoSQL ↑
┌───────────────────────────────────────┐
│ 数据存储层 │
│ ┌───────┐ ┌───────┐ ┌───────┐ │
│ │ MySQL │ │Redis │ │MongoDB│ │
│ └───────┘ └───────┘ └───────┘ │
└───────────────────────────────────────┘
2.3 微服务拆分
根据业务领域,我们将系统拆分为以下微服务:
- 用户服务:处理用户注册、登录、权限管理
- 车辆服务:车辆信息管理、状态更新
- 订单服务:订单创建、支付、状态管理
- 调度服务:车辆调度算法实现
- 支付服务:对接微信支付、支付宝
- 消息服务:短信、模板消息推送
- 数据分析服务:用户行为分析、报表生成
每个服务独立部署,通过Spring Cloud实现服务发现和调用。
3. 核心功能实现
3.1 用户模块实现
用户模块采用JWT实现无状态认证,关键代码实现:
java复制// 登录接口
@PostMapping("/login")
public Result<LoginVO> login(@RequestBody LoginDTO dto) {
// 1. 验证验证码
String cacheCode = redisTemplate.opsForValue().get("SMS_CODE:" + dto.getPhone());
if(!dto.getCode().equals(cacheCode)){
return Result.fail("验证码错误");
}
// 2. 查询用户
User user = userService.getByPhone(dto.getPhone());
if(user == null){
// 新用户自动注册
user = new User();
user.setPhone(dto.getPhone());
userService.save(user);
}
// 3. 生成token
String token = JwtUtil.generateToken(user.getId());
// 4. 返回结果
LoginVO vo = new LoginVO();
vo.setToken(token);
vo.setUser(user);
return Result.success(vo);
}
关键点说明:
- 采用手机号+验证码登录,降低用户使用门槛
- 新用户自动注册,简化流程
- JWT token有效期为7天,减少频繁登录
- 敏感操作需要二次验证
3.2 车辆展示与筛选
车辆列表接口需要考虑高并发和复杂筛选条件:
java复制@GetMapping("/list")
public Result<Page<VehicleVO>> list(VehicleQueryDTO query, Pageable pageable) {
// 1. 构建查询条件
LambdaQueryWrapper<Vehicle> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(query.getBrand() != null, Vehicle::getBrand, query.getBrand())
.eq(query.getModel() != null, Vehicle::getModel, query.getModel())
.between(query.getMinPrice() != null && query.getMaxPrice() != null,
Vehicle::getPricePerDay, query.g
