出差商旅B2B商务出行住行订购小程序是一款基于SpringBoot框架开发的商务出行管理系统。这个系统主要面向企业用户,提供一站式的差旅预订服务,包括机票、酒店、用车等预订功能,同时集成了费用管理和审批流程,帮助企业实现差旅费用的有效管控。
作为一名有10年开发经验的Java全栈工程师,我认为这类系统在企业数字化转型过程中扮演着重要角色。传统的差旅管理往往存在流程繁琐、费用不透明、审批效率低等问题,而通过数字化解决方案,可以显著提升企业的差旅管理效率和员工体验。
在技术选型上,我们采用了当前主流的Java技术栈:
后端技术栈:
前端技术栈:
选择这些技术主要基于以下考虑:
系统采用典型的分层架构设计:
code复制表现层(Web) → 业务逻辑层(Service) → 数据访问层(DAO) → 数据库
这种分层架构的优势在于:
用户认证采用JWT(JSON Web Token)方案,结合Spring Security实现。主要流程包括:
关键代码示例:
java复制// JWT工具类
public class JwtTokenUtil {
private static final String SECRET = "your-secret-key";
private static final long EXPIRATION = 86400000; // 24小时
public static String generateToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<>();
return Jwts.builder()
.setClaims(claims)
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
}
public static Boolean validateToken(String token, UserDetails userDetails) {
final String username = getUsernameFromToken(token);
return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
}
}
差旅预订是系统的核心功能,主要包括:
技术实现要点:
企业差旅通常需要审批流程,我们实现了灵活的审批配置:
技术实现上使用了Activiti工作流引擎,关键表设计包括:
approval_flow:审批流程定义approval_instance:审批实例approval_task:审批任务approval_history:审批历史系统包含50+数据表,核心表包括:
sql复制CREATE TABLE `sys_user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(100) NOT NULL COMMENT '密码',
`real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名',
`mobile` varchar(20) DEFAULT NULL COMMENT '手机号',
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
`dept_id` bigint DEFAULT NULL COMMENT '部门ID',
`status` tinyint DEFAULT '1' COMMENT '状态 0:禁用 1:正常',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统用户表';
sql复制CREATE TABLE `travel_order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_no` varchar(32) NOT NULL COMMENT '订单编号',
`user_id` bigint NOT NULL COMMENT '用户ID',
`trip_type` tinyint NOT NULL COMMENT '行程类型 1:单程 2:往返 3:多程',
`start_city` varchar(50) NOT NULL COMMENT '出发城市',
`end_city` varchar(50) NOT NULL COMMENT '到达城市',
`start_date` date NOT NULL COMMENT '出发日期',
`end_date` date DEFAULT NULL COMMENT '返回日期',
`total_amount` decimal(10,2) NOT NULL COMMENT '订单总金额',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '订单状态',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_order_no` (`order_no`),
KEY `idx_user_id` (`user_id`),
KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='差旅订单表';
yaml复制spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
idle-timeout: 30000
max-lifetime: 1800000
connection-timeout: 30000
我们采用测试金字塔模型,从下到上包括:
GitLab CI配置示例:
yaml复制stages:
- build
- test
- deploy
build:
stage: build
script:
- mvn clean package -DskipTests
unit_test:
stage: test
script:
- mvn test
integration_test:
stage: test
script:
- mvn verify -Pintegration-test
deploy_dev:
stage: deploy
script:
- scp target/*.jar dev-server:/app/
- ssh dev-server "systemctl restart app"
only:
- dev
我们采用Docker+Kubernetes部署方案:
dockerfile复制FROM openjdk:11-jre
WORKDIR /app
COPY target/app.jar /app
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
yaml复制apiVersion: apps/v1
kind: Deployment
metadata:
name: travel-app
spec:
replicas: 3
selector:
matchLabels:
app: travel-app
template:
metadata:
labels:
app: travel-app
spec:
containers:
- name: travel-app
image: registry.example.com/travel-app:1.0.0
ports:
- containerPort: 8080
resources:
limits:
cpu: "1"
memory: 1Gi
requests:
cpu: "0.5"
memory: 512Mi
在实际开发过程中,我们遇到并解决了诸多挑战:
第三方API集成:不同供应商的API规范差异大,我们设计了统一的适配层来处理这些差异。
高并发预订:热门航线/酒店可能出现超卖问题,我们通过分布式锁+库存预占机制解决。
复杂审批流程:企业审批需求多变,我们实现了可配置的审批流程引擎。
未来可能的改进方向包括:
这个项目让我深刻体会到,一个好的差旅管理系统不仅要技术过硬,更需要深入理解企业差旅管理的实际痛点和需求。在后续版本中,我们将继续优化用户体验,提升系统智能化水平,为企业客户创造更大价值。