🚀 基于 Vue3 + Vite 的交通能力评价大屏系统实战
📋 项目简介
这是一个基于 Vue 3 + Vite 构建的交通能力评价可视化大屏系统,主要用于展示公交、轨道、分公司等交通运营数据,通过数据可视化帮助管理者快速了解交通运营状况。
✨ 核心特性
- 🎨 现代化 UI 设计:采用深色主题,适配大屏展示
- 📊 丰富的数据可视化:集成 ECharts 实现多种图表展示
- 🗺️ 地图集成:基于高德地图展示地理信息
- 🔐 完善的权限管理:基于 RBAC 的权限控制系统
- 🧩 微前端架构:支持 iframe 嵌入和 postMessage 通信
- 📱 响应式适配:支持不同分辨率屏幕的自适应缩放
- 🚀 性能优化:代码分割、资源压缩、懒加载等优化策略
🛠️ 技术栈
核心框架
- Vue 3.5.13 - 渐进式 JavaScript 框架
- Vite 6.3.5 - 下一代前端构建工具
- Vue Router 4.5.1 - 官方路由管理器
- Pinia 3.0.3 - Vue 官方状态管理库
UI 组件库
- Element Plus 2.10.2 - 基于 Vue 3 的组件库
- @element-plus/icons-vue - Element Plus 图标库
数据可视化
- ECharts 5.6.0 - 强大的数据可视化图表库
地图服务
- @amap/amap-jsapi-loader - 高德地图 JS API 加载器
微前端
- @micro-zoe/micro-app - 微前端框架
工具库
- axios - HTTP 客户端
- js-cookie - Cookie 操作
- jsencrypt - RSA 加密
- crypto-js - 加密算法库
- vue3-seamless-scroll - 无缝滚动组件
📁 项目结构
traffic-capacity-bigscreen/
├── src/
│ ├── api/ # API 接口封装
│ │ ├── auth.js # 认证相关接口
│ │ └── bus.js # 公交模块接口
│ ├── components/ # 公共组件
│ │ ├── echarts/ # ECharts 图表组件
│ │ ├── mapLeft/ # 地图左侧组件
│ │ ├── header/ # 头部导航组件
│ │ ├── scaleBox/ # 屏幕适配组件
│ │ └── ...
│ ├── router/ # 路由配置
│ │ └── index.js # 路由守卫和权限控制
│ ├── store/ # 状态管理
│ │ └── model/ # Pinia stores
│ ├── utils/ # 工具函数
│ │ ├── http/ # HTTP 请求封装
│ │ └── auth.js # 认证工具
│ └── view/ # 页面组件
│ ├── home/ # 能力评价首页
│ ├── bus/ # 公交模块
│ ├── rail/ # 轨道模块
│ ├── filiale/ # 分公司模块
│ ├── erp-home/ # ERP 首页
│ └── login/ # 登录页面
├── vite.config.js # Vite 配置文件
└── package.json # 项目依赖
🎯 核心功能模块
1. 能力评价首页 (/home)
展示交通运营能力的综合评价,包括:
- 左侧:关键指标展示
- 中间:核心数据图表(柱状图、折线图等)
- 右侧:详细数据列表
2. 公交模块 (/bus)
公交运营数据可视化:
- 地图展示:公交线路和站点分布
- 数据统计:运营车辆数、客流量等
- 实时监控:线路运行状态
3. 轨道模块 (/rail)
轨道交通数据展示:
- 线路图:轨道线路可视化
- 运营数据:发车频次、客流量统计
- 站点信息:各站点详细数据
4. 分公司模块 (/filiale)
分公司运营情况:
- 分公司列表:各分公司基本信息
- 数据对比:不同分公司数据对比
- 趋势分析:运营趋势图表
5. ERP 集成 (/erp-home)
通过 iframe 集成 ERP 系统:
- Token 认证:自动获取 ERP token
- 跨域处理:通过代理解决跨域问题
- 环境适配:开发/测试/生产环境自动切换
🔑 核心技术实现
1. 路由权限控制
// src/router/index.js
router.beforeEach(async (to, from, next) => {
const authStore = useAuthStore()
// 权限检查函数
const hasPermission = (permission) => {
if (!permission) return true
if (authStore.permissions?.includes('*:*:*')) return true
return authStore.permissions?.includes(permission)
}
// 根据权限动态路由
const resolveDefaultRoute = () => {
const hasErpHome = hasPermission('bigScreen:homes')
const hasBus = hasPermission('bigScreen:bus')
const hasRail = hasPermission('bigScreen:rail')
const hasHome = hasPermission('bigScreen:home')
if (hasErpHome) return '/erp-home'
if (hasBus && hasRail) return hasHome ? '/home' : '/bus'
// ... 其他逻辑
}
// 路由守卫逻辑
// ...
})
特点:
- 基于 RBAC 的权限模型
- 动态路由解析
- Token 自动刷新机制
- 支持 URL 参数自动登录
2. 屏幕自适应缩放
<!-- src/components/scaleBox/index.vue -->
<template>
<div class="scale-box" :style="scaleStyle">
<slot></slot>
</div>
</template>
<script setup>
import { computed, onMounted, onBeforeUnmount, ref } from 'vue'
const scale = ref(1)
const baseWidth = 1920 // 设计稿宽度
const baseHeight = 1080 // 设计稿高度
const scaleStyle = computed(() => {
return {
transform: `scale(${scale.value})`,
transformOrigin: 'top left'
}
})
const updateScale = () => {
const { innerWidth, innerHeight } = window
const scaleX = innerWidth / baseWidth
const scaleY = innerHeight / baseHeight
scale.value = Math.min(scaleX, scaleY)
}
onMounted(() => {
updateScale()
window.addEventListener('resize', updateScale)
})
onBeforeUnmount(() => {
window.removeEventListener('resize', updateScale)
})
</script>
特点:
- 基于设计稿的等比缩放
- 自动适配不同分辨率
- 保持宽高比不变形
3. iframe 通信机制
// src/App.vue
onMounted(() => {
messageHandler = (event) => {
const data = event?.data || {}
if (data && data.path === 'nnts') {
// 收到父页面 postMessage,跳转到指定页面
router.replace('/home')
}
}
window.addEventListener('message', messageHandler)
})
应用场景:
- 支持被其他系统通过 iframe 嵌入
- 通过 postMessage 接收外部指令
- 实现跨域页面通信
4. 环境配置管理
// src/api/auth.js
export function getErpToken(tokenParam) {
const isDev = import.meta.env.DEV
const apiUrl = import.meta.env.VITE_API_URL || ''
let erpApiUrl
if (isDev) {
// 开发环境:使用代理
erpApiUrl = `/erpbackend/system/auth/tokenLogin`
} else {
// 判断测试/生产环境
const isTestEnv = apiUrl.includes('10.88.128.50') ||
apiUrl.includes('test') ||
apiUrl.includes('18080')
if (isTestEnv) {
// 测试环境:HTTP
erpApiUrl = `http://10.99.213.43/erpbackend/system/auth/tokenLogin`
} else {
// 生产环境:HTTPS
erpApiUrl = `https://10.99.213.43/erpbackend/system/auth/tokenLogin`
}
}
return axios.get(erpApiUrl, { params: { token: tokenParam } })
}
特点:
- 开发/测试/生产环境自动切换
- 支持不同协议(HTTP/HTTPS)
- 通过环境变量灵活配置
5. HTTP 请求封装
// src/utils/http/index.js
const service = axios.create({
baseURL: import.meta.env.VITE_API_URL,
timeout: 50000
})
// 请求拦截器:自动添加 token
service.interceptors.request.use(config => {
const token = authStore.token || getToken()
if (token) {
config.headers['Authorization'] = `Bearer ${token}`
}
return config
})
// 响应拦截器:统一错误处理
service.interceptors.response.use(
response => {
const res = response.data
if (res.code === 200) return res
// Token 过期自动刷新
if ([401, 50008, 50012, 50014].includes(res.code)) {
return refreshToken().then(newToken => {
// 重新发起请求
})
}
// ... 其他错误处理
}
)
特点:
- 统一错误处理
- Token 自动刷新
- 请求/响应拦截
- 支持文件上传
🚀 性能优化
1. 代码分割
// vite.config.js
build: {
rollupOptions: {
output: {
manualChunks: {
vendor: ['vue', 'vue-router', 'pinia'],
echarts: ['echarts'],
elementPlus: ['element-plus']
}
}
}
}
2. 资源压缩
// vite.config.js
plugins: [
viteCompression({
algorithm: 'gzip',
threshold: 10240, // 10KB 以上才压缩
deleteOriginFile: false
})
]
3. 组件懒加载
// 路由懒加载
component: () => import('@/view/home/index.vue')
4. 自动导入
// vite.config.js
plugins: [
Components({
resolvers: [ElementPlusResolver()],
dirs: ['src/components']
}),
AutoImport({
imports: ['vue', 'vue-router', '@vueuse/core', 'pinia']
})
]
🔧 开发指南
安装依赖
npm install
# 或
pnpm install
启动开发服务器
npm run dev
构建生产版本
# 测试环境
npm run build:test
# 生产环境
npm run build:prod
环境变量配置
创建 .env.test 文件:
VITE_API_URL=http://10.88.128.50:18080
VITE_BASE_URL=/traffic-capacity-bigscreen/
VITE_PORT=5173
VITE_VERSION=1.0.0
📦 部署说明
Nginx 配置
server {
listen 80;
server_name your-domain.com;
root /path/to/traffic-capacity-bigscreen;
index index.html;
# 前端路由
location /traffic-capacity-bigscreen {
try_files $uri $uri/ /traffic-capacity-bigscreen/index.html;
}
# API 代理
location /capacityApi {
proxy_pass http://10.88.128.52:18080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# ERP API 代理(解决跨域)
location /erpbackend {
proxy_pass https://10.99.213.43;
add_header Access-Control-Allow-Origin * always;
}
}
🎨 UI 设计亮点
- 深色主题:采用深蓝色背景(
#000e1f),适合大屏展示 - 数据卡片:使用渐变边框和阴影效果,突出数据展示
- 动画效果:数字滚动动画、图表过渡动画
- 响应式布局:三栏布局,左右固定,中间自适应
🔐 安全特性
- Token 认证:基于 JWT 的 token 认证机制
- 权限控制:路由级别的权限验证
- 加密传输:敏感数据加密传输
- XSS 防护:Vue 内置的 XSS 防护
📈 项目亮点总结
✅ 现代化技术栈:Vue 3 + Vite + Pinia,开发体验优秀
✅ 完善的权限系统:基于 RBAC 的权限控制
✅ 丰富的可视化:ECharts + 高德地图,数据展示直观
✅ 微前端支持:支持 iframe 嵌入和跨域通信
✅ 性能优化:代码分割、懒加载、资源压缩
✅ 环境适配:开发/测试/生产环境自动切换
✅ 响应式设计:适配不同分辨率屏幕
🤝 技术交流
如果这个项目对你有帮助,欢迎:
- ⭐ Star 本项目
- 🐛 提交 Issue
- 💡 提出建议
- 📝 分享使用经验
📄 许可证
本项目采用 MIT 许可证。
作者:谈深
日期:2026-01-27
版本:v1.0.0
💡 提示:本文档基于实际项目代码编写,涵盖了项目的核心技术点和实现细节。如果你也在开发类似的大屏项目,希望这些经验能对你有所帮助!