vue项目封装axios

先看一下 我们的结构:
在这里插入图片描述


第一阶段 配置:

api文件夹说明
api文件夹存放接口
在这里插入图片描述

user.js

import request from "../utils/request";

//保存游戏类型
export function saveGame(data) {
  return request({
    url: "/user-setting/xxxx",
    method: "post",
    data
  });
}

//获取游戏类型
export function getGame(data) {
  return request({
    url: "/user-setting/xxxxx",
    method: "get",
    data
  });
}

这里我们引入了,utils文件夹下的request.js

utils文件夹说明*
utils文件夹存放工具文件
在这里插入图片描述

request.js

在这里插入图片描述
首先需要安装axios,和qs,以及 ant-design-vue(也可以别的UI库 或者 不是使用也行)

import axios from "axios";
import qs from "qs";
import { getToken } from "../utils/auth";
import Message from "ant-design-vue/es/message";

// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  withCredentials: true,
  timeout: 5000,
  headers: {
    "Content-Type": "application/x-www-form-urlencoded"
  }
});

// 请求拦截
service.interceptors.request.use(
  config => {
    // do something before request is sent
    if (config.method === "post" || config.method === "put") {
      config.data = qs.stringify(config.data);
    }
    if (config.method === "get") {
      config.url = config.url + "?" + qs.stringify(config.data);
    }
    // if (store.getters.token) {
    // let each request carry token
    // ['X-Token'] is a custom headers key
    // please modify it according to the actual situation
    // config.headers['X-Token'] = getToken()
    // Cookie: APPMGRID=5dcf8572f7c74ee28309b3ff67063686
    if (getToken()) {
      config.headers["token"] = getToken();  //这里换成你的token名字
    }
    // }
    return config;
  },
  error => {
    // do something with request error
    console.log(error);
    return Promise.reject(error);
  }
);

// 响应拦截
service.interceptors.response.use(
  response => {
    const data = response.data;
    switch (data.code) {
      case 0:
        return Promise.resolve(data);
      case 301:
        Message.warn(data.msg || "请先登录");
        break;
      case 400:
        Message.warn(data.message || res.data.msg || "资源不在收藏列表中");
        break;
      case 401:
        Message.error(data.msg || "请先登录");
        break;
      case 403:
        Message.error(data.msg || "权限不足");
        break;
      case 404:
        Message.error(data.msg || "请求资源不存在");
        break;
      case 408:
        Message.error(data.message || "已经收藏过该视频");
        break;
      case 500:
        Message.error(data.msg || "服务器开小差啦");
        break;
      case 504:
        Message.error(data.msg || "网络请求失败");
        break;
      default:
        Message.error(data.msg || "请求失败");
    }
  },
  error => {
    console.log("err" + error);
    // Message({
    //   message: error.message,
    //   type: 'error',
    //   duration: 5 * 1000
    // })
    return Promise.reject(error);
  }
);

export default service;

上述代码引入了,getToken ,这里主要是auth.js 中设置的,主要作用是在 完成登录后,后面的请求 都在头部添加上token。


auth.js
需要安装 js-cookie

import Cookies from "js-cookie";

const TokenKey = "token";  //这里是你的token名
const UseridKey = "USERID";

export function getToken() {
  return Cookies.get(TokenKey);
}

export function setToken(token) {
  return Cookies.set(TokenKey, token);
}

export function removeToken() {
  return Cookies.remove(TokenKey);
}

export function getUserid() {
  return Cookies.get(UseridKey);
}

export function setUserid(Userid) {
  return Cookies.set(UseridKey, Userid);
}

export function removeUserid() {
  return Cookies.remove(UseridKey);
}

第二阶段 使用:

在这里插入图片描述

store主要用于数据处理:

index.js

import Vue from "vue";
import Vuex from "vuex";
import state from "./state";
import mutations from "./mutations";
import getters from "./getters";
import user from './modules/user'; //用户信息
import app from './modules/app';  //离线数据库

Vue.use(Vuex);

export default new Vuex.Store({
  state,
  getters,
  mutations,
  modules:{
    user:user,
    app:app
  }
});

user.js

import {
  saveGame,
  getGame,
} from "../../api/user.js";

let state = {
  gameType: "",
  userInfos: ""
};
let getters = {
  userId: state =>
    (Object.keys(state.userInfo).length > 0 && state.userInfo.profile.userId) ||
    "",
  userPlaylists: state => state.userPlaylists,
  createdList: state => {
    return state.userPlaylists.filter(item => {
      return !item.subscribed;
    });
  },
  likedPlaylistIds: state => state.userPlaylists.map(item => item.id),
  likedsongIds: state => state.likedsongIds
};

let mutations = {
  SET_USER_INFOS(state, data) {
    state.userInfos = data.data;
  },
  SET_GAME_TYPE(state, data) {
    state.gameType = data;
  }
};

let actions = {
  GET_USER_INFO({ commit }, data) {
    getGame({}).then(data => {
      commit("SET_USER_INFOS", data);
    });
  },
  CHOOSE_GAME({ commit }, data) {
    let postData = {
      game_abbr: data
    };
    saveGame(postData).then(data => {
      commit("SET_GAME_TYPE", data);
    });
  }
};

export default {
  namespaced: true,
  state,
  getters,
  mutations,
  actions
};

在项目中使用,例如这里的的保存游戏,去调用一个接口:
在这里插入图片描述

当单机确定的时候,去发送请求

choose_game.vue

<template>
  <div class="choose-game">
    <div class="m-t">
      <div class="header">请选择您常用的游戏</div>
      <div class="determine">
        <a href="#" class="animBtn themeA" @click="close">确定</a>
      </div>
    </div>
  </div>
</template>

<script>
import { mapState, mapMutations, mapActions } from "vuex";
export default {
  name: "ChooseGame",
  data() {
    return {
      choose: false,
      type: "csgo"
    };
  },
  methods: {
    ...mapActions("user", ["CHOOSE_GAME"]), //调引入mapActions 里面的接口
    close() {
      this.showDial = false;
      this.CHOOSE_GAME(this.type).then(rev => {}); //调用接口
    }
  }
};
</script>

第三阶段 配置环境:

在这里插入图片描述

这里有两种环境,开发 和生产环境

.env.development

# just a flag
ENV = 'development'

# base api
VUE_APP_BASE_API = 'https://test/xxxxxxx.csgo.com/'
# vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable,
# to control whether the babel-plugin-dynamic-import-node plugin is enabled.
# It only does one thing by converting all import() to require().
# This configuration can significantly increase the speed of hot updates,
# when you have a large number of pages.
# Detail:  https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/babel-preset-app/index.js

VUE_CLI_BABEL_TRANSPILE_MODULES = true


.env.production

# just a flag
ENV = 'production'

# base api
#VUE_APP_BASE_API = '/prod-api'
VUE_APP_BASE_API = 'https://xxxxxxx.csgo.com/'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值