基于Express+vue+高德地图API实现的出行可视化APP

news/2025/1/11 5:51:58/

基于Express+vue+高德地图API实现的出行可视化APP

1.项目简介

解决出行问题,用于出行行程记录,路线规划,数据可视化分析的移动端webapp

1.1技术栈

  • 前端:移动端,vue全家桶,Mand组件库,Echarts.js,Scss
  • 后端:Node,Express框架,高德地图API
  • 数据库:Mysql

1.2功能模块

1.2.1个人出行

用户个人出行,不确定路程、目的地等信息,选择出行工具,点击开始,系统实时监听用户手机位置得到WGS84经纬度坐标(w3c HTML5 Geolocation地理定位标准),行程结束,记录本次出行信息,经纬度坐标转换GCJ-02坐标体系,通过高德地图提供三方API绘制出行轨迹。

1.2.2公共交通

用户确定出发地、目的地、交通工具,选择公共交通出行,用户输入位置关键字,选择合适出发/目的位置,选择乘坐交通工具,规划出行路线,选择某一条路线,确定后点击保存上传本次出行记录

1.2.3历史列表

按时间顺序查看所有出行的历史记录,可查看出行的详情信息、行程轨迹、路线规划

1.2.4我的信息(未完成)

查看我的详情信息,通过出行数据分析得到的出行趋势折线图,与出行数据相关的数据分析图表,其他功能未写

2.项目构建

2.1前端

前端vue-cli3基础上开发,在此之上根据项目需求对项目工程作出几点修改,前端代码在view/文件夹中

  • 移动端适配:对移动端分辨率用webpack在工程中配置。
  • 请求拦截器:在view/src/request/中,基于axios提供的interceptors对所有ajax的请求和响应添加相应操作,如请求头添加,token添加,响应后台错误状态码的识别与报错;简单封装了下axios请求,主要为get,post两种。
  • 导航守卫:在view/src/router/中,做了全局导航守卫,未登录用户只能访问项目登录页面。
  • 工具类:在view/src/utils/中,对常用枚举值、全局组件注册、常用类封装等功能做模块化封装。
  • css样式:在view/src/style/中,全局公共样式,初始化样式。
  • svg组件:在view/src/icons/中,封装用于svg展示组件,用做小icon的展示,svg保存该文件夹中。
  • 模块化:对路由与vuex做模块化封装。
  • 地图:所有地图、地理信息、轨迹、路线规划功能有高德地图第三方API提供

2.2后端

  • 使用Nodeexpress框架,连接Mysql数据库,做数据接口开发,数据的增删改查与简单封装。

3.系统设计

3.1项目配置

const path = require('path')function resolve (dir) {return path.join(__dirname, './', dir)
}module.exports = {chainWebpack: config => {// 为src下文件配别名,不使用相对路径config.resolve.alias.set('@', resolve('src')).set('assets', resolve('src/assets')).set('components', resolve('src/components')).set('views', resolve('src/views')).set('icons', resolve('src/icons')).set('router', resolve('src/router')).set('utils', resolve('src/utils')).set('style', resolve('src/style'))/** 设置处理svg的router,使svg可直接用名称调用,无需路径 */// svg rule loaderconst svgRule = config.module.rule('svg') // 找到svg-loadersvgRule.uses.clear() // 清除已有的loader, 如果不这样做会添加在此loader之后svgRule.exclude.add(/node_modules/) // 正则匹配排除node_modules目录svgRule // 添加svg新的loader处理.test(/\.svg$/).use('svg-sprite-loader').loader('svg-sprite-loader').options({symbolId: 'icon-[name]'})},publicPath: './',/** 开发环境代理 */devServer: {open: true,proxy: {'/api': {target: 'http://localhost:3000',ws: true,changeOrigin: true,pathRequires: {'^/api': ''}}}}
}

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');var indexRouter = require('./routes/index');
var userRouter = require('./routes/user');
var tripRouter = require('./routes/trip');var app = express();// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));app.use('/', indexRouter);
app.use('/user', userRouter);
app.use('/trip', tripRouter);// catch 404 and forward to error handler
app.use(function(req, res, next) {next(createError(404));
});// error handler
app.use(function(err, req, res, next) {// set locals, only providing error in developmentres.locals.message = err.message;res.locals.error = req.app.get('env') === 'development' ? err : {};// render the error pageres.status(err.status || 500);res.render('error');
});module.exports = app;

3.2路由转发

var express = require('express');
var fs = require("fs");
var router = express.Router();/* GET home page. */
router.get('/', function(req, res, next) {// res.statusCode = 200;// res.setHeader("Access-Control-Allow-Origin", "*");// res.setHeader('Content-Type', 'application/json');// res.json(data);function readImage(path,res){console.log(path)fs.readFile(path,'binary',function(err,  file)  {if  (err)  {console.log(err);return;}else{console.log("输出文件");res.writeHead(200,  {'Content-Type':'image/jpeg'});res.write(file,'binary');res.end();}});
}
readImage('/public/images/head.jpeg',res)
});module.exports = router;

3.3请求拦截

import Vue from 'vue'
import App from './App.vue'
import router from './router/index'
import store from './store/index'import './icons'
// 注册全局组件
import registerComponents from './utils/registerComponents'
import mandMobile from 'mand-mobile'
import 'mand-mobile/lib/mand-mobile.css'
// 请求拦截器
import requestPlugin from './request/http.js'Vue.use(mandMobile)Vue.use(registerComponents)
Vue.use(requestPlugin)Vue.config.productionTip = falsenew Vue({router,store,render: h => h(App)
}).$mount('#app')

3.4正则验证规则

/** 正则验证规则 *//* 合法uri */
export function validateURL (textval) {const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/return urlregex.test(textval)
}/* 小写字母 */
export function validateLowerCase (str) {const reg = /^[a-z]+$/return reg.test(str)
}/* 大写字母 */
export function validateUpperCase (str) {const reg = /^[A-Z]+$/return reg.test(str)
}/* 大小写字母 */
export function validatAlphabets (str) {const reg = /^[A-Za-z]+$/return reg.test(str)
}export function getTime () {let now = new Date()let year = now.getFullYear() // 年let month = now.getMonth() + 1 // 月let day = now.getDate() // 日let hh = now.getHours() // 时let mm = now.getMinutes() // 分let ss = now.getSeconds()let time = {date1: `${year}年${month}月${day}日`,date2: `${year}/${month}/${day}`,date3: `${year}年${month}月${day}日/${hh}:${mm}:${ss}`,date4: `${hh}:${mm}:${ss}`}return time
}

4.项目运行

# 分别进入view/,server/文件夹分别下载依赖
cd view/servernpm install# 导入mysql数据库表# view下前端项目 打开端口localhost:8080
npm run serve
# 也可以不运行后端,项目已上线会访问线上接口,想连接本地服务器需改变接口地址
# serve下运行后端项目(必须先导入数据库表)
DEBUG=myapp:* npm start# 前端项目打包
npm run build

5.项目截图

私人出行

公共交通

历史列表

我的信息

6.小结

6.1项目简结

  • 难度:简单
  • 开发时长:前期调研,编码一周
  • 关键字:移动端,出行,可视化,高德地图,Echart图表

6.2过程总结

  • 想法产出:因为在滴滴出行的实习经历,准备做款有关出行平台的,有关前端可视化的产品。
  • 需求调研:结合出行 可视化 关键字做需求分析,调研悦动圈悦跑圈滴滴出行百度地图高德地图确定几个主要功能
    1. 实时定位,绘制出行轨迹(悦跑圈,已完成)
    2. 路线规划,规划路线绘制路径图(百度地图,已完成)
    3. 网约车,快车,专车,顺风车在线叫车(滴滴出行,未完成)
    4. 可视化分析,出行数据的可视化分析(已完成)
  • 技术调研
    1. 选取HTML5 Geolocation提供的物理位置实时监听功能,获取到WGS84经纬坐标
    2. 选取高德地图第三方API提供地图,地理位置,轨迹绘制,路线规划等功能
    3. 选择开发移动端项目,用滴滴的Mand作为移动端UI组件库
    4. 选取Node为服务端,Express为后端框架,Mysql为数据库

6.3难点总结

产品从无到有是最困难的,项目虽然不难,可前期产品调研,技术调研,项目构建确花费了大量时间,相比照着成品写多了很多不一样的体验

6.4补充

注:因为马上毕业,这只是为了应对毕业设计临时写的小项目,没想到会有这么多star,时间有限主要实现核心功能,产品还是很粗糙,我会找时间完善下,谢谢

因为浏览器端定位本身受限因素很多,定位成功率也不是很高,很可能出现没有权限,定位失败问题,可尝试开启权限或更换浏览器。


http://www.ppmy.cn/news/1562165.html

相关文章

数据结构——栈的实现

今天,我们来写一下关于栈的博文。 1.首先我们先了解一下什么是栈? 一:概念: 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶,另…

conda相关操作

conda 是一个开源的包管理和环境管理工具,主要用于 Python 和数据科学领域。它可以帮助用户安装、更新、删除和管理软件包,同时支持创建和管理虚拟环境。以下是关于 conda 的所有常见操作: 1. 安装 Conda Conda 通常通过安装 Anaconda 或 Mi…

Word快捷键汇总

Word 中的键盘快捷方式 - Microsoft 支持 1 常用到的快捷键 执行的操作 按 打开文档。 CtrlO 创建新文档。 CtrlN 保存文档。 CtrlS 关闭文档 CtrlW 将所选内容剪切到剪贴板中。 CtrlX 将所选内容复制到剪贴板中。 CtrlC 粘贴剪贴板的内容。 CtrlV 选择所有文档…

大数据学习(32)-spark基础总结

&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦&#x1f91e…

栈与队列OJ题精选,数据结构的实践应用

系列文章目录 🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼 🎉🎉我的C语言初阶合集:C语言初阶合集,希望能…

【爬虫】单个网站链接爬取文献数据:标题、摘要、作者等信息

源码链接: https://github.com/Niceeggplant/Single—Site-Crawler.git 一、项目概述 从指定网页中提取文章关键信息的工具。通过输入文章的 URL,程序将自动抓取网页内容 二、技术选型与原理 requests 库:这是 Python 中用于发送 HTTP 请求…

Git 的引用规格(refspec)语法

目录 引用规格语法格式常见用法强制 -f 和 的区别git fetch origin remote-branch:local-branch 和 git push origin local-branch:remote-branch 区别 引用规格语法格式 格式如下&#xff1a;[]<src>:<dst> 常见用法 # fetch git fetch origin <remote-bra…

【linux系统】mysql 数据库迁移至新服务器

文章目录 前言一、新服务器停止数据库服务&#x1f6d1;二、旧服务器打包数据库的data目录&#x1f9f3;三、进入新服务器中打包整个数据库的 data 目录&#xff08;备份&#xff09;四、在新服务器中解压旧服务器打包数据库的 data 目录到数据库data 目录中五、修改新数据库 m…