关于Android工程师转成vue的三两事儿(1)--数据的配置

我刚开始选择职业方向的时候我是主要想主攻android的,但是由于现在所在的公司正处于业务转型期:公司由以往主要做android平板定制任务到现在准备往前端等互联网上面转型。外加上我对很多语言稍有涉猎。然后就由我开始从零开始搭建一个vue前端的框架,现在网站的大体都出来了。主要的大功能包括:im、直播、另外包含一些后台登陆、权限系统、数据的增删改查等等。写这些文章呢?本意是想:

  1. 为同样处于初期的工程师一些指导,让看了我文章的工程师能够少花点时间在我做过的项目上面。
  2. 因为刚转vue前端,有很多的东西都不怎么懂,也希望与诸位看官一起讨论,相互学习 相互进步吧。

  话不多说,现在开始谈一谈vue吧,因为我可能最近每天都会写着一个系列的文章,所以我现在写的东西并没有先后之分,如果我后来有时间。我会做一些简单的整理、更新。今天第一天就来谈一下 我对vue网络请求的一些封装吧。
  今天第一天,我就从四个步骤去谈及这个东西吧,从头到尾依次是mock数据、代理、封装axios到最后的根据不同环境去访问不同分服务器的一系列工作吧。

一、 mock数据

   有的时候,可能会存在一种情况--前端和后端同时开发的时候。传统的开发模式是等后端服务器全部开发的差不多了之后才开始去写前端。但是现在的前端和后端是分离开发的。所以还是这种思维就必定会处于落后的地位,并且我们现在本身在开发react native、vue等语言的时候本身就自己带一个nodejs的后台。既然本身就有一个后台,我就顺着这个思路去研究vue-cli(嗯,我是采用这个工具框架的)里面的配置文件,外加上一些大佬的协助下,终于找到了一个这个东西。
   首先我查看vue的启动器,里面的代码是:

 webpack-dev-server --inline --progress --config build/webpack.dev.conf.js

然后我就顺着这个思路渠道webpack.dev.conf.js里面去找

const express = require('express')
const app = express()
const appData = require('../static/data/user.json')
const apiRouter = express.Router()
app.use('/api',apiRouter)

我就顺着build.js的意思,将一个json数据导入到数据中,然后把本地服务器的模拟数据的开头同意都写成api开头的数据,以便于管理。最后在本文件下面的devServer下面加入下面代码:

 before(app) {
  app.get('/api/user',(req, res) => {
    res.json({
      data: appData
    })
  })
}

最后打开http://localhost:8080/api/user就会得到user.json的内容了。当然这都只是为了本来调试方便而弄出来的

image.png

  当然,当发展到一定的程度上面了,服务器已经弄好了部分接口,需要将数据从本地转移到正式的服务器上面 ,这时就要谈到所谓的代理了。

二、 代理

  其实刚开始的时候,我在弄代理的时候,我遇到了很多的问题,比如跨域等问题。当然可能处于刚开始学习vue的你也可能存在这类问题。首先解释一下跨域的原因,我自己的理解就是:从一个域上加载的脚本不允许访问另外一个域的文档属性。我刚开始弄这个的时候很不理解,为什么会产生这个现象呢?这是android开发不可能存在的问题。

image.png

最后想了一想,也想通了,要是不存在跨域,那岂不是随便弄一个脚本就可以访问对方服务器。那么服务器早就会炸了。反正2014年的雅虎的事件历历在目(刚好在看黑客简史)。好了闲话不多说了。直接上代码吧。
  这次我是找到index.js目录下面proxyTable下可以直接配置一个跨域的东西,当然有关proxyTable的具体,请查看proxyTable官网做详细了解,我这里就不画蛇添足了。主要是快一点了。紧接着我就顺着网上的教程直接配置:

'/lesson': {
        target: 'http://xxx/v2/webapi/lesson', // 代理的网址
        changeOrigin: true, // 允许跨域
        pathRewrite: {
         '^/lesson': '/'
       }
  }

然后通过axios进行get、post请求:

 axios({
        method: 'get',
        url:'/lesson' ,
        params: qs.stringify(data)
      }).then(function (res) {
        if (res) {
          //...
        }
      });
    }).catch(function (error) {
      console.error(error);
    })

最后发现根本不能访问到,最后几经纠缠,才发现原来是少了一个包 http-proxy-middleware。这个东西很强大,我刚开始的socket都是参考它文档使用跨域操作的,如果有兴趣也可以去参考了解一下。

三、 封装axios

  也差不多12点了,我室友已经在骂我了。说实话今天刚去医院,我也渐渐写不下去了。我就直接上我的代码了。首先我对axios 进行封装(写安卓的一些习惯,一想到很多地方就会想封装)。直接上代码.

service.js:

 import * as myapis from './apis'
  const loginModule = {
  login: {
    url: myapis.LOGIN_URL, // 网址
    method: 'post'
  },
  logout: {
    url: myapis.LOGOUT_URL, // 网址
    method: 'post'
  }
}
const LoginApi = { ...loginModule }

myhttp.js:

import axios from 'axios'
import qs from 'qs'
import * as myapis from './apis'
import store from '../store'
import router from '../router'

axios.interceptors.request.use(config => {
  if (store.state.token) {
    config.headers.Authorization = store.state.token
  }
  return config
}, error => {
  return Promise.reject(error)
})

axios.interceptors.response.use(response => {
  return response
}, error => {
  return Promise.resolve(error.response)
})

function errorState (res) {
  return res
}

function successState (res) {
  if (res && res.status === 200) {
    return res.data
  }
  // if()
  return '服务器值返回为空'
}
const httpServer = (opts, data) => {
   let httpDefaultOpts = { // http默认配置
    method: opts.method,
    baseURL: myapis.BASE_URL,
    url: opts.url,
    timeout: 20000,
    // responseType: 'json',
    params: Object.assign(Public, data),
    data: qs.stringify(Object.assign(Public, data)),
    withCredentials: false,
    headers: opts.method === 'get' ? {
      'Accept': 'application/json',
      ' Content-Type': 'application/json; charset=UTF-8'
    } : {
      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    }
  }

  if (opts.method === 'get' && httpDefaultOpts.data) {
    delete httpDefaultOpts.data
  } else {
    delete httpDefaultOpts.params
  }

  let promise = new Promise(function (resolve, reject) {
    axios(httpDefaultOpts).then(
      res => {
        resolve(successState(res))
      }
    ).catch(
      error => {
        reject(errorState(error))
      }
    )
  })
  return promise
}
export default httpServer

四、分环境访问

   嗯,要睡觉了要睡觉了,就不扯了,反正也没人看。嗯,就这样。
  想了一想,还是简单的介绍一下吧。我一共在config目录下面建了三个目录,共分为本地测试服务器、测试服务器、正式服务器三种。我 这里就拿测试服务器、正式服务器为例子。就当敲门砖吧:
prod.env.js :

'use strict'
module.exports = {
  NODE_ENV: '"production"',
  MY_MODE: '"prod"'
}

dev.env.js

'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')

module.exports = merge(prodEnv, { 
  NODE_ENV: '"development"',
  MY_MODE: '"debug"'
})

mode.js

var url = process.env. MY_MODE
export default {
  url
}

apis.js

import base from '../../config/mode'
let baseurl = ''
if (base.url === 'prod') {
  // 正式
  baseurl = 'http://prod...'
} else if (base.url === 'local') {
  // 本地
  baseurl = 'http://local...'
} else {
  // 测试
  baseurl = 'http://test...'
}

   嗯,本次代码呢?写的并不是很深,可能很多的地方都存在着精进的地方。但是这是我一步一步自己的成果。如果对以上的内容存在有疑虑,请私聊、或者直接对本文进行评论。我看到了之后会对您的建议和疑惑做一一解答,之后我也会就这次网站的编写做一个系列的文章。对搭建一个框架(可能在很多人眼里都不算框架的东西)做一个代码的review。一是对我的知识点做回顾;二是希望能对同阶段的小伙子们有正向作用。
   不扯了不扯了,要睡觉了。好困 呼呼~~

推荐同期作品:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容

  • 关于孵化器的发展模式,在现阶段出现了大量的专家学者对此高谈阔论,孵化器发展模式的高峰论坛也铺天盖地在各大...
    常五言阅读 488评论 3 5
  • 01 大学毕业后,我来到济南闯荡,现已过去三年。三年,不长不短的时间,在济南稍好点的位置贷款买了房,每月还款压力不...
    生活巧克力阅读 536评论 0 2
  • 1 序列 1.1 序列类型操作符 1.2 内建函数 字符串 2.1 字符串操作符 比较操作符:字符串大小按照ASC...
    Ke爺阅读 234评论 0 0
  • “帅哥,你是单身吗?务必老实回答我。” “是的,怎么啦?” “旁边的这个大叔一直骚扰我,待会如果他过来的时候,你帮...
    爱上世界的张大路阅读 1,088评论 4 8