资讯专栏INFORMATION COLUMN

iMap | 一款基于 Electron 和 Vue 的跨平台旅行地图生成器

dingda / 1639人阅读

摘要:请求错误请求代码封装与基本一致,只是将换成即可。关于的使用是个能把组件的共享状态抽取出来,当做一个全局单例模式进行管理。首先确保你的已经安装,运行来安装。

项目地址:https://huangxizhou.com/project/iMap

技术栈

Vue.js

Vuex

Axios

Webpack

Leancloud(express)

Echarts

Electron(electron-vue)

项目目录

</>复制代码

  1. .
  2. ├── LICENSE
  3. ├── README.md
  4. ├── build··········································electron-packager 打包出来的各平台应用
  5. │   └── icons······································各平台应用图标
  6. │   ├── icon.icns
  7. │   ├── icon.ico
  8. │   └── icon.png
  9. ├── dist···········································应用构建后的代码目录
  10. │   ├── electron
  11. ├── package.json···································应用层级的 package.json
  12. ├── src············································electron 入口文件文件夹
  13. │   ├── index.ejs
  14. │   ├── main·······································electron 主进程文件文件夹
  15. │   │   ├── index.dev.js
  16. │   │   └── index.js
  17. │   └── renderer···································Vue 相关的目录
  18. │   ├── App.vue································单页面的主结构
  19. │   ├── assets·································静态资源文件夹
  20. │   │   ├── img································项目配图
  21. │   │   │   ├── china.png
  22. │   │   │   ├── excel_example.png
  23. │   │   │   └── world.png
  24. │   │   └── my-theme···························iVew 自定义主题相关目录
  25. │   ├── components·····························Vue 相关组件目录
  26. │   │   ├── Layout·····························布局组件
  27. │   │   │   └── Header.vue·····················导航栏
  28. │   │   ├── Page·······························页面组件
  29. │   │   │   ├── Auth.vue·······················用户权限获取组件
  30. │   │   │   ├── Chart.vue······················制作地图组件
  31. │   │   │   ├── ForgetPassword.vue·············忘记密码组件
  32. │   │   │   ├── Help.vue·······················帮助文档组件
  33. │   │   │   ├── Home.vue·······················主页组件
  34. │   │   │   ├── Login.vue······················登录页组件
  35. │   │   │   ├── Map.vue························地图类型组件
  36. │   │   │   ├── MyProject.vue··················我的项目组件
  37. │   │   │   ├── Register.vue···················注册组件
  38. │   │   │   └── Update.vue·····················登录组件
  39. │   │   └── Ui·································功能组件
  40. │   │   ├── AddPointModal.vue··············添加地点组件
  41. │   │   ├── DelPointModal.vue··············删除地点组件
  42. │   │   └── EditPointModal.vue·············修改地点组件
  43. │   ├── data···································Echarts 相关数据存放文件夹
  44. │   │   ├── china.json·························中国地图 json 数据
  45. │   │   ├── map.js·····························导入坐标数据
  46. │   │   └── world.json·························世界地图 json 数据
  47. │   ├── filter·································Vue 过滤器目录
  48. │   │   └── index.js
  49. │   ├── main.js································Vue 入口文件
  50. │   ├── router·································Vue 路由文件
  51. │   │   └── index.js
  52. │   ├── server·································ajax相关操作文件
  53. │   │   ├── ajax.js····························二次封装ajax
  54. │   │   └── url.js·····························接口别名
  55. │   ├── store··································Vuex 数据目录
  56. │   │   ├── actions.js·························涉及多个 mutationsaction 集合
  57. │   │   ├── index.js···························Vuex 入口文件
  58. │   │   ├── modules····························模块目录
  59. │   │   │   ├── excel.js·······················Excel 数据相关模块
  60. │   │   │   └── user_info.js···················用户数据相关模块
  61. │   │   └── mutations_types.js·················mutation-types 声明
  62. │   ├── tool···································工具文件夹
  63. │   │   └── index.js
  64. │   └── version································应用版本文件夹
  65. │   └── version.js
  66. └── yarn.lock
接口与数据问题

本项目使用的是官方推荐的axios

</>复制代码

  1. Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

本来之前想使用 prototype 来写侵入式代码,但维护起来还是很麻烦,最终还是撸了个开箱即用的 axios 二次封装的js文件出来:

</>复制代码

  1. // POST 请求
  2. post({...obj}) {
  3. return new Promise((resolve, reject) => {
  4. axios.post(obj.url, obj.data, {
  5. headers: {
  6. "Authorization": user && user.accessToken
  7. }
  8. }).then((data) => {
  9. if(data.data.code === 0) {
  10. // ...
  11. } else if (data.data.code === 1) {
  12. // ...
  13. } else {
  14. // ...
  15. }
  16. }).catch((data) => {
  17. reject(data)
  18. })
  19. })
  20. }

一般来说,在接收到后端返回的数据时,可以使用resolve(data.data)来直接处理数据,当然也可以按需引入一些 UI 组件与过滤器,直接在 ajax 封装文件中就可以过滤数据并进行全局提示,提升用户体验。

对于 GET 请求,由于项目有使用到百度地图开放 API 来获取城市经纬度,涉及到 jsonp 跨域问题,尴尬的是 axios 官方说明不会支持 jsonp ,所以只能引入 jsonp 这个 npm 包,并且将请求此接口从 GET 请求中多带带提取出来。

</>复制代码

  1. getLocation({...obj}) {
  2. return new Promise((resolve, reject) => {
  3. jsonp(obj.url + "?" + qs.stringify(obj.data) , null, (err, data) => {
  4. if (err) {
  5. Message.error("请求错误")
  6. } else {
  7. if(data.status === 0) {
  8. resolve(data)
  9. }
  10. }
  11. })
  12. })
  13. }

GET 请求 ajax 代码封装与 POST 基本一致,只是将 obj.data 换成 { paramas: obj.data } 即可。

关于 Vuex 的使用

Vuex是个能把组件的共享状态抽取出来,当做一个全局单例模式进行管理。这样不管你在何处改变状态,都会通知使用该状态的组件做出相应修改。

在本项目中,需要提取到全局管理的数据有 userInfoexcelData,前者保存在全局中,可以减少请求用户信息接口的数量,节约资源,后者由于 Excel 文件上传到后端后只做解析,不保存,所以全局管理 excelData 很重要。

在这里就多带带说一说添加城市坐标的操作好了:
首先是 mutations_types 声明文件

</>复制代码

  1. // mutations_types.js
  2. export const ADD_EXCEL_DATA = "ADD_EXCEL_DATA"
  3. ...

声明 statemutations
在 Vuex 中,更改 Vuex 的 store 中的状态的唯一方法就是 mutations

</>复制代码

  1. // modules/excel.js
  2. import * as types from "../mutations_types"
  3. // state
  4. const state = {
  5. excelData: {}
  6. }
  7. // mutations
  8. const mutations = {
  9. ...
  10. // 添加 excelData
  11. [types.ADD_EXCEL_DATA] (state, data) {
  12. state.excelData.data.push(data)
  13. },
  14. ...
  15. }
  16. // 导出 state, mutations
  17. export default {
  18. state,
  19. mutations
  20. }

然而,Mutations 必须是同步函数,所以我们还需要 actions

</>复制代码

  1. // actions.js
  2. import * as types from "./mutations_types"
  3. ...
  4. // 添加 excelData
  5. export const addExcelData = ({ commit }, data) => {
  6. commit(types.ADD_EXCEL_DATA, data)
  7. }
  8. ...

最后,再在入口文件注入 modules 和 actions即可

</>复制代码

  1. ...
  2. export default new Vuex.Store({
  3. actions,
  4. modules: {
  5. excel
  6. }
  7. })

这样一来,关于 excelData 的 数据管理的任督二脉已经打通,现在就看如何来使用了

在组件中可以使用 mapStatemapActions 辅助函数来简化代码
mapState函数用在计算属性中

</>复制代码

  1. // AddPointModal.vue
  2. computed: {
  3. ...mapState({
  4. excelData: state => state.excel.excelData,
  5. countAlias: "excelData"
  6. })
  7. }

mapActions 函数在本项目中用于 methods 中

</>复制代码

  1. methods: {
  2. ...mapActions({
  3. addExcelData: "addExcelData"
  4. })
  5. ...
  6. }

在函数中调用

</>复制代码

  1. this.addExcelData(Arrary)

这样就成功将一个新的数组元素添加到 excelData 中了。

如何获取 Excel 数据

本项目采用 Leancloud 来作为后端支持,使用的是Node.js(express),对于获取用户的 Excel 数据并不想保存数据的话,本项目的思路是将 Node 作为一个文件中转的存在,上传用户 Excel 文件至服务器后,在 /public 目录下保存Excel文件,再在下次用户上传时,清空 /public 目录。

用户 Excel 处理的库本项目选择的是 node-xlsx

特别注意的是,在前端文件中,上传用户 Excel 文件是需要使用 formData 来上传的

</>复制代码

  1. let formData = new FormData()
  2. formData.append("file", this.file)

后端使用 formidable 这个库来接收 Excel 文件并使用 form.parse 来解析。

关于使用 Echarts

</>复制代码

  1. ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖轻量级的 Canvas 类库 ZRender,提供直观,生动,可交互,可高度个性化定制的数据可视化图表。

对于在 Vue 项目中使用 Echarts , 本项目采用的是 vue-echarts
chart.vue 文件中,我们利用一个三元运算符来动态切换地图类型

</>复制代码

  1. this.selectMapType === "china" ? ECharts.registerMap("china", chinaMap) : ECharts.registerMap("world", worldMap)

对于地图数据的导入,本项目的方法是的是导入一个对象,返回地图 option 数据:

</>复制代码

  1. // map.js
  2. ...
  3. export default {
  4. getMapData({...obj}) {
  5. ...
  6. return {
  7. // 地图配置数据
  8. }
  9. }
  10. }

再在前端文件中使用这个函数即可: this.option = map.getMapData(this.excelData)

Vue 中父子组件双向绑定

在本项目中,我将添加、编辑、删除地点的弹窗全部提取到公用 Ui 组件文件夹中,然而这就需要利用 v-model 来实现组件 props 双向绑定

</>复制代码

  1. // template
  2. // script
  3. export default {
  4. props: {
  5. value: {
  6. type: Boolean,
  7. default: false
  8. }
  9. },
  10. data() {
  11. return: {
  12. showModal: false
  13. }
  14. },
  15. watch:{
  16. value(val) {
  17. this.showModal = val
  18. },
  19. showModal(val) {
  20. this.$emit("input", val)
  21. }
  22. },
  23. mounted() {
  24. if (this.value) {
  25. this.showModal = true;
  26. }
  27. }
  28. }

这样就能使用value来保存 v-model 的值,从而进行双向绑定。

在MacOS 上打包 Win32 软件包

在 electron-vue 文档中有这么一句话:

</>复制代码

  1. If you are wanting to build for Windows with a custom icon using a non-Windows platform, you must have wine installed.

那么我们就来安装wine。首先确保你的 Mac 已经安装 homebrew,运行 brew install wine 来安装wine。

接下来,会出现一个错误提示,提示我们需要安装 Xquartz,按照错误提示给的下载网址下载即可。

再次运行 brew install wine

安装成功后在项目目录下运行 npm run build:win32 就可以打包成Win32 安装包了

求一份工作~

2019年毕业生求带走

我的简历

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89071.html

相关文章

  • 大模型时代小红书+马蜂窝:华人团队开发 AI旅行app

    简介一周前,由红杉投资的硅谷初创公司UTA AI推出了其核心产品Wanderboat AI,这是一个基于GPT-4技术的智能旅行规划工具。该平台允许用户通过对话交互来明确旅行的偏好和需求,并提供包括目的地、活动和实用建议在内的定制化旅行建议。Wanderboat AI整合了视频、图片、地图和评价等多种媒体资源,以增强用户体验。它还具备智能互动特性,用户可以随时查询并得到立即答复。Wanderboa...

    UCloud小助手 评论0 收藏0
  • Hola~ 一款基于Electron聊天软件

    摘要:前言本项目旨在从零到壹,制作一款界面精美的聊天软件。因为本人是开发,设计功底欠缺,所以软件设计的有点丑,如果有大神有更好的,欢迎。 Hola 前言 本项目旨在从零到壹,制作一款界面精美的聊天软件。 Github 地址因为已工作,所以可能没有多少时间来继续跟进这个项目了,项目可优化的点已在下文列出,欢迎大家 Fork 或 Star。 ps: 征 logo 一枚。因为本人是开发,设计功底...

    Kaede 评论0 收藏0
  • 【收藏】2019年最新Vue相关精品开源项目库汇总

    摘要:前言本文的前身是源自上的项目但由于该项目上次更新时间为年月日,很多内容早已过期或是很多近期优秀组件未被收录,所以小肆今天重新更新了内容并新建项目。提交的项目格式如下项目名称子标题相关介绍如果收录的项目有错误,可以通过反馈给小肆。 前言 本文的前身是源自github上的项目awesome-github-vue,但由于该项目上次更新时间为2017年6月12日,很多内容早已过期或是很多近期优...

    williamwen1986 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<