zoukankan      html  css  js  c++  java
  • Vue.js 项目接口管理

    在vue开发中,会涉及到很多接口的处理,当项目足够大时,就需要定义规范统一的接口,如何定义呢?

    本文使用vue-cli生成的项目举例。

    第一步.在src目录下新建一个文件夹http,在http目录下建文件夹moudules,后台提供的所有接口都在这里定义.

    第二步.在moudules目录下划分模块新建js文件,比如:

        a.会员中心模块: member.js

        b.登录注册模块: login.js

       c.合伙人模块: partner.js

    目录大概是这个样子:

     第三步,需要引入axios做相应的配置。

       1.首先安装axios

    npm install axios

       2.在http目录下新建axios.js:

    /* jshint esversion: 6 */
    
    import axios from 'axios';
    import Cookies from "js-cookie";
    import config from './config';
    import router from '@/router';
    import { Toast} from 'vant';
    
    export default function $axios(options) {
      return new Promise((resolve, reject) => {
        const instance = axios.create({
          baseURL: config.baseUrl,
          headers: config.headers,
          timeout: config.timeout,
          withCredentials: config.withCredentials,
        });
    
        // request 拦截器
        instance.interceptors.request.use(
          config => {
            //在发送之前做点什么
            let auth_token = Cookies.get('auth_token');
            if (auth_token) {
              config.headers.auth_token = auth_token;
            } else {
              let loginpage = Cookies.get('loginpage');
              if (loginpage) {
                router.push('/login');
              }
            }
            if (config.method === 'post') {}
            return config;
          },
          error => {
            // 判断请求超时
            if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
              Toast("信号不好,请求超时")
            }
          }
    
        );
    
        // response 拦截器
        instance.interceptors.response.use(
          response => {
            //对响应数据做点什么
            let data;
            if (response.data == undefined) {
              data = JSON.parse(response.request.responseText);
            } else {
              data = response.data;
            }
            return data;
          },
          err => {
            if (err && err.response) {
              console.log(err)
            }// 返回接口返回的错误信息
            return Promise.reject(err);
          }
        );
    
        // 请求处理
        instance(options).then(res => {
          resolve(res);
          return false;
        }).catch(error => {
          reject(error);
        });
      });
    }

    3.在http目录下新建config.js:

    export default {
      method: 'get',
      // 基础url前缀
      baseUrl: baseUrl,//请求的域名地址
      // 请求头信息
      headers: {
        'Content-Type': 'application/json;charset=UTF-8'
      },
      // 参数
      data: {},
      // 设置超时时间
      timeout: 10000,
      // 携带凭证
      withCredentials: false,
      // 返回数据类型
      responseType: 'json'
    }

    第四步,在http下面的js文件中引入api.js导出的函数,拿其中一个文件login.js说明:

      1.api.js:

    
     /* jshint esversion: 6 */
    
    import * as login from './moudules/login';
    // 默认导出
    export default {
        login,
    }

    2.login.js

    import axios from '../axios'
    
    /* 
     * 系统登录模块
     */
    
    // 登录
    export const login = (data) => {
        return axios({
            url: '/app/api/v1/user/phonelogin',
            method: 'post',
            data
        });
    };

    第五步:将api挂载在 Vue 原型的 $api 对象上

      1.在http文件下新建index.js文件:

    import api from './api';
    
    const install = Vue => {
        if (install.installed)
            return;
        install.installed = true;
        Object.defineProperties(Vue.prototype, {
            // 注意,此处挂载在 Vue 原型的 $api 对象上
            $api: {
                get() {
                    return api
                }
            }
        });
    };
    
    export default install

    2.在项目的main.js文件下导入api:

    import api from './http';
    
    Vue.use(api);

    第六步步,在组件中使用接口,比如在登陆页面中使用login的接口:

            let loginInfo = {
              phone: this.field.phone,
              code: this.field.sms,
              cityname: this.field.city
            };
            this.$api.login.login(loginInfo).then(res => {
              if (res.ret == 0) {
                Cookies.set("auth_token", res.data.authToken); 
                  this.$toast.success({message:"登录成功",duration:2000});
                setTimeout(() => {
                  this.loading = false;
                  this.$router.go(-1);
                }, 2000);
              }
            })

    最终http目录为:

    以上方法定义接口虽然看起来麻烦点,但有却有其好处:

    • 代码看起来规范,所有的接口都在一个文件夹定义,不用分散的各个组件,方便维护管理。

    • 可以做到接口一次定义,多处使用。

       

     

     

  • 相关阅读:
    adobe air ane 中有的java class 打包 apk 后却没有了报NoClassDefFoundError ,ClassNotFoundException
    厌烦了写findViewById 试试ButterKnife吧
    ios加载html5 audio标签用js无法自动播放
    一些css书写的小技巧
    canvas绘画基础(一):认识canvas画布
    H5新特性:video与audio的使用
    HTML5 进阶系列:文件上传下载
    h5移动端设备像素比dpr介绍
    HTML5 基础内容(元素/属性/格式化)
    前端如何将H5页面打包成本地app?
  • 原文地址:https://www.cnblogs.com/lwming/p/10987176.html
Copyright © 2011-2022 走看看