• 物联网架构成长之路(36)-Vue前端入门


    1. 前言
      物联网平台,需要有一个类似大屏看板的功能。

      找了一圈,发现阿里已经有对应的DataV产品,但是那个价格有点贵啊。所以找了这个【http://datav.jiaminghi.com/demo/】,这看起来也是挺不错的。就是需要了解一些前端Vue。说到前端,我之前好久就想入门了。断断续续看视频,写Demo,写小程序。但都处于入门阶段。而且前端变化太快了。半年没看,就各种更新了。不过还是迟早要学的。

    2. 安装环境
      安装IDE,这里推荐VSCode,然后安装Vetur 插件
      Google Chrome 浏览器 安装 Vue.js Devtools 一个Vue的调试工具
      安装 npm
      请到这里下载 https://nodejs.org/en/download/

     1 #现在npm 仓库的网络已经很不错了,如果还不行,那可以使用cnpm
     2 # 安装淘宝镜像
     3 npm install -g cnpm --registry=https://registry.npm.taobao.org
     4 #安装 vue-cli 全局安装vue-cli脚手架
     5 npm install -g vue-cli
     6 #查看是否安装成功
     7 vue -V
     8 #安装 @vue/cli-init
     9 npm install -g @vue/cli-init
    10 #使用vue-cli 创建项目
    11 vue init webpack projectName

      测试项目是否正常

    1 cd datav
    2 npm run dev

    3.修改部分参数
      1)修改datav/src/router/index.js 在第8行增加mode:'history'

     1 import Vue from 'vue'
     2 import Router from 'vue-router'
     3 import HelloWorld from '@/components/HelloWorld'
     4 
     5 Vue.use(Router)
     6 
     7 export default new Router({
     8   mode: 'history',
     9   routes: [
    10     {
    11       path: '/',
    12       name: 'HelloWorld',
    13       component: HelloWorld
    14     }
    15   ]
    16 })

      2)修改datav/config/index.js 第16行,host:'0.0.0.0'

    4. 安装部分组件

    1 npm install axios
    2 npm install vue-axios
    3 npm install @jiaminghi/data-view
    4 npm install --save-dev mockjs
    5 #安装依赖过程中,如果出现奇奇怪怪的问题,可以删除 node_modules 然后重新 npm install
    6 npm run dev

      最后在datav/package.json 文件里面的依赖为

    1   "dependencies": {
    2     "@jiaminghi/data-view": "^2.4.5",
    3     "axios": "^0.19.0",
    4     "vue": "^2.5.2",
    5     "vue-axios": "^2.1.5",
    6     "vue-router": "^3.0.1"
    7   },

      配置axios,在datav/src/main.js 文件配置axios

     1 // The Vue build version to load with the `import` command
     2 // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
     3 import Vue from 'vue'
     4 import App from './App'
     5 import router from './router'
     6 import axios from 'axios'
     7 import VueAxios from 'vue-axios'
     8 import dataV from '@jiaminghi/data-view'
     9 
    10 require('./mock/mock.js')
    11 require('./http/http.js')
    12 
    13 Vue.use(VueAxios, axios)
    14 Vue.use(dataV)
    15 Vue.config.productionTip = false
    16 
    17 /* eslint-disable no-new */
    18 new Vue({
    19   el: '#app',
    20   router,
    21   components: { App },
    22   template: '<App/>'
    23 })

      配置mockjs
      创建两个文件分别是 datav/src/http/http.js datav/src/mock/mock.js
      http.js

     1 import axios from 'axios'
     2 
     3 axios.defaults.headers.get['Conetnt-Type'] = 'application/json'
     4 
     5 //请求拦截
     6 axios.interceptors.request.use(
     7   config =>{
     8     const token = localStorage.getItem('userToken');
     9     //Authorization: Bearer AccessToken OAuth2.0认证时,需要从浏览器存储中获取AccessToken
    10     config.headers.Authorization = "Bearer " + "token";
    11     return config;
    12   },
    13   error =>{
    14     return Promise.reject(error);
    15   }
    16 )
    17 
    18 //响应拦截器
    19 axios.interceptors.response.use(
    20   response =>{
    21     return response;
    22   },
    23   error =>{
    24     return Promise.reject(error);
    25   }
    26 )
    27 
    28 export default axios

      mock.js

     1 import Mock from 'mockjs'
     2 
     3 Mock.setup({
     4   timeout: '200 - 400'
     5 })
     6 
     7 function loginFun(param){
     8   console.log(param);
     9   return {
    10     "value": 11
    11   }
    12 }
    13 
    14 Mock.mock('/login', 'post', loginFun); //虚拟数据

      除了通过mock模拟数据外,还可以通过proxy代理方式。
      两种方式的区别是,当前后端分离时,前后端定好协议后,双方同时进行开发,前端可以使用mockjs模拟数据,来继续前期开发。
      当后端开发完成后,会部署到服务器,此时,前端还需要进行集成和数据调试,这个时候,就需要前端开放时,能请求到服务器的API,但是由于浏览器的跨域请求限制,所以需要配置代理。实现本地开发。

      proxyTable方式,在 datav/config/index.js 的 module.exports 里面配置proxyTable

     1     /**
     2      * 代理服务器
     3      */
     4     proxyTable:{
     5       '/api':{
     6         target: 'https://api.wunaozai.com', //目标接口域名
     7         changeOrigin: true, //是否跨域
     8         pathRewrite:{
     9           '^/api': '/' //重写接口
    10         }
    11       }
    12     },

      没有后端的同学,可以用这个测试一下:https://api.ly522.com/yiyan

    5. 开始写代码
      修改后HelloWorld.vue 代码如下

     1 <template>
     2   <div class="hello">
     3     <h1>{{ msg }}</h1>
     4     <h1>{{ mockMsg }}</h1>
     5     <h1>{{ proxyMsg }}</h1>
     6   </div>
     7 </template>
     8 
     9 <script>
    10 export default {
    11   name: 'HelloWorld',
    12   data () {
    13     return {
    14       msg: 'Welcome to Your Vue.js App',
    15       mockMsg: 'mockMsg',
    16       proxyMsg: 'proxyMsg'
    17     }
    18   },
    19   mounted() {
    20     var that = this;
    21     //通过mockjs获取数据
    22     this.axios.post('/login').then((res)=>{
    23       console.log(res.data)
    24       that.mockMsg = res.data.value;
    25     }).catch((err)=>{
    26       console.log(err)
    27     })
    28     //通过proxyTable获取数据
    29     this.axios.get('/api/yan.php?format=json').then((res)=>{
    30       console.log(res.data)
    31       that.proxyMsg = res.data.text;
    32     }).catch((err)=>{
    33       console.log(err)
    34     })
    35   },
    36   methods:{
    37 
    38   }
    39 }
    40 </script>
    41 
    42 <!-- Add "scoped" attribute to limit CSS to this component only -->
    43 <style scoped>
    44 
    45 </style>

    6. 编译,部署

    npm run build

      编译后,在 datav 目录下有个dist文件夹,把这个文件夹下的所有文件,部署到服务器,就完成前端开发。
      部署时,可以通过Nginx代理后端和前端,也可以把dist文件夹复制到后端工程里面。

    7. 运行效果

    2020-04-21 11:54:11 更新一些笔记

    增加一个request.js

     1 import axios from 'axios'
     2 
     3 const service = axios.create({
     4   baseURL: '/wechat-api',
     5   timeout: 3000
     6 })
     7 
     8 service.defaults.headers.get['Content-Type'] = 'application/json'
     9 service.interceptors.request.use(
    10   config => {
    11     const jwt = localStorage.getItem('jwt-token')
    12     config.headers["jwt-token"] = jwt
    13     return config
    14   },
    15   error => {
    16     return Promise.reject(error)
    17   }
    18 )
    19 
    20 service.interceptors.response.use(
    21   response => {
    22     console.log(response)
    23   },
    24   error => {
    25     return Promise.reject(error)
    26   }
    27 )
    28 
    29 export default service

    增加一个API调用,统一请求

    1 import request from '@/http/request'
    2 
    3 export function demo(data){
    4   return request({
    5     url: '/error/demo',
    6     method: 'post',
    7     params: data
    8   })
    9 }

    调用请求

     1 import * as Demo from '@/api/demo'
     2 export default {
     3   name: 'HelloWorld',
     4   data () {
     5   },
     6   created(){
     7     this.demo()
     8   },
     9   methods: {
    10     demo() {
    11       Demo.demo({a: 1}).then(ret => {
    12         console.log(ret)
    13       })
    14     }
    15   }
    16 }

    出现 Invalid Host header

    配置 webpack.dev.conf.js 在devServer 下增加 disableHostCheck: true


    参考资料:
      http://datav.jiaminghi.com/demo/
      https://www.jianshu.com/p/6f8a8568e33a
      https://cli.vuejs.org/zh/guide/

    本文地址: https://www.cnblogs.com/wunaozai/p/11663516.html

  • 相关阅读:
    绝对定位position: absolute;
    加号选择器(ul>li + li)
    position: absolute;绝对定位水平居中问题
    nth-child 和 nth-of-type 的区别
    Scrapy Shell 待续。。。
    TypeError: write() argument must be str, not bytes
    ModuleNotFoundError :No module named 'win32api'
    scrapy 简介
    3月27下午(补交)
    软件工程作业二:需求分析
  • 原文地址:https://www.cnblogs.com/wunaozai/p/11663516.html
Copyright © 2020-2023  润新知