去年帮朋友规划云南自由行时,我深刻体会到传统旅游攻略的局限性——景点信息碎片化、路线规划费时费力、个性化需求难以满足。这促使我着手开发这套智能行程规划系统,用技术手段解决旅行者的实际痛点。
系统采用前后端分离架构,后端基于SpringBoot实现算法引擎和业务逻辑,前端通过Vue构建交互界面。其核心价值在于:
开发过程中发现,行程规划本质上是个多目标优化问题,需要平衡时间成本、交通方式、用户偏好等多个维度。这也是系统算法设计的难点所在。
后端技术矩阵:
前端技术方案:
选择这套技术栈主要基于:
混合算法架构:
python复制# 行程优化算法伪代码
def optimize_route(user_prefs, pois):
# 阶段一:基于规则的初筛
candidates = rule_based_filter(pois, user_prefs)
# 阶段二:遗传算法优化
best_route = genetic_algorithm(
population_size=100,
generations=50,
fitness_func=calculate_score,
candidates=candidates
)
# 阶段三:人工规则微调
return apply_human_rules(best_route)
性能优化设计:
数据处理流程:
java复制// Java实现的核心权重算法
public double calculateAttractionScore(UserPreference pref, POI poi) {
double typeMatch = pref.getTypeWeight(poi.getType());
double durationFit = 1 - Math.abs(poi.getAvgDuration() - pref.getPreferredDuration());
double popularity = poi.getRating() * 0.2;
return typeMatch * 0.6 + durationFit * 0.3 + popularity * 0.1;
}
路线优化算法:
技术实现要点:
关键配置示例:
yaml复制# application.yml中的高德配置
amap:
key: your_api_key
endpoints:
direction: https://restapi.amap.com/v3/direction/driving
traffic: https://restapi.amap.com/v3/traffic/status/rectangle
cache-ttl: 3600 # 1小时缓存
实现效果:
关键技术点:
vue复制<!-- Vue组件代码片段 -->
<template>
<div class="map-container">
<amap @init="handleMapInit">
<amap-marker
v-for="poi in pois"
:position="poi.location"
@click="showDetail(poi)">
<template #content>
<div class="custom-marker">{{ poi.name }}</div>
</template>
</amap-marker>
<amap-polyline :path="routePath" />
</amap>
</div>
</template>
<script setup>
// 使用Vue3组合式API
const routePath = computed(() =>
props.route.map(point => [point.lng, point.lat])
)
</script>
手势操作优化:
性能优化手段:
离线模式设计:
Docker编排文件:
dockerfile复制# backend/Dockerfile
FROM openjdk:17-jdk
COPY target/trip-planner.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
# frontend/Dockerfile
FROM node:16 as build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
Nginx关键配置:
nginx复制server {
listen 80;
location /api {
proxy_pass http://backend:8080;
proxy_set_header Host $host;
}
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
}
ELK日志收集架构:
关键指标监控:
现象:
排查过程:
bash复制trace com.example.algorithm.RouteGenerator generate
解决方案:
java复制@Cacheable(value = "poiScores", key = "#poi.id + '-' + #pref.hash")
public double calculateScore(POI poi, Preference pref) {
// 计算逻辑
}
问题复现:
根本原因:
最终方案:
javascript复制// 确保AMap加载完成再渲染组件
const setup = async () => {
await loadAMapSDK();
return () => h(MapComponent);
}
算法层面:
工程层面:
体验层面:
这个项目让我深刻认识到,一个好的旅游规划系统需要在算法精度和用户体验间找到平衡点。后续计划接入实时公交数据,让路线推荐更加精准。对于想开发类似系统的朋友,建议先从单一城市的小规模验证开始,逐步迭代扩展功能范围。