国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

vue項(xiàng)目接入mock&& axios 通用配置

Ilikewhite / 1175人閱讀

摘要:前言兵馬未動(dòng)糧草先行同理項(xiàng)目開發(fā)過(guò)程中經(jīng)常會(huì)出現(xiàn)接口未出前端頁(yè)面已搭建完畢的情況此時(shí)為了提高前端的開發(fā)效率解放生產(chǎn)力我們可以按照預(yù)定的接口文檔做一些接口模擬的工作等等后端小伙伴開發(fā)完接口后我們只需要替換一個(gè)接口基地址即可初始準(zhǔn)備這里已項(xiàng)目為

前言

兵馬未動(dòng),糧草先行; 同理,項(xiàng)目開發(fā)過(guò)程中經(jīng)常會(huì)出現(xiàn)接口未出, 前端頁(yè)面已搭建完畢的情況;此時(shí)為了提高前端的開發(fā)效率,解放生產(chǎn)力,我們 FE 可以按照預(yù)定的接口文檔做一些接口模擬的工作,等等后端小伙伴開發(fā)完接口后我們只需要替換一個(gè)接口基地址即可...

初始準(zhǔn)備

這里已 vue 項(xiàng)目為例, 所需模塊:mockjs, express; 直接 npm 進(jìn)行安裝即可

1.Mock.js  // 用來(lái)快速構(gòu)造隨機(jī)數(shù)據(jù)  http://mockjs.com/examples.html 
2.express // 用來(lái)快速搭建本地服務(wù) http://expressjs.jser.us/
項(xiàng)目中使用

一般會(huì)在 vue 項(xiàng)目中建一個(gè) mock 文件夾, 里面放上對(duì)應(yīng)處理文件:

接口分發(fā)模塊

主要是分發(fā)前端過(guò)來(lái)的請(qǐng)求 URL 以及啟動(dòng)本地服務(wù)

let Mock = require("mockjs");
let express = require("express");
let app = express();

let bodyParser = require("body-parser"); // 解析post請(qǐng)求

// mock 數(shù)據(jù)相關(guān) api
let homeAPI = require("./home");
let specialAPI = require("./special");
let appAPI = require("./app");

app.use(bodyParser.json());

// 設(shè)置跨域
app.all("*", function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS");
    // 此處根據(jù)前端請(qǐng)求攜帶的請(qǐng)求頭進(jìn)行配置
    res.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type");
    next();
});

// 1.首頁(yè)接口: post
app.post("/android/home", (req, res) => {
    // 模擬超時(shí)
    // setTimeout(() => {
    //     res.json(Mock.mock(homeAPI.getHome(req)));
    // }, 12000);
    res.json(Mock.mock(homeAPI.getHome(req)));
    console.log("請(qǐng)求首頁(yè)數(shù)據(jù)成功...");
})

// 2.專題接口: post
app.post("/android/special/list", (req, res) => {
    res.json(Mock.mock(specialAPI.getSpecialList(req)))
    console.log("請(qǐng)求專題列表數(shù)據(jù)成功...");
})
app.post("/android/special/detail", (req, res) => {
    res.json(Mock.mock(specialAPI.getSpecialDetail(req)))
    console.log("請(qǐng)求專題詳情數(shù)據(jù)成功...");
})

// 3.APP 應(yīng)用接口: post
app.post("/android/special/app", (req, res) => {
    res.json(Mock.mock(appAPI.getAppList(req)))
    console.log("請(qǐng)求app列表數(shù)據(jù)成功...");
})

app.listen("3000", () => {
    console.log("mock服務(wù)器啟動(dòng)ing中... port: 3000")
})
接口數(shù)據(jù)模塊

以上面的 specialApi 為例, 這是用來(lái)處理 xxx/special/list接口的模塊

let Mock = require("mockjs");
let Random = Mock.Random;
// 專題模塊
// 1.專題列表
let specialList = [];
let total = 100;
// 準(zhǔn)備 100 條專題列表數(shù)據(jù)
for (let index = 0; index < total; index++) {
    specialList.push(
        Mock.mock({
            id: "@increment",
            title: "@ctitle",
            desc: "

"+Random.cparagraph()+"

", icon: "photo/special/1380/special_1380.jpg", view_count: "@natural(60, 1000)", comment_count: "@natural(60, 100)", save_money: "@float(10, 50, 2, 2)", app_count: "@natural(10, 100)", detail_icon: "https://images.tutuapp.com/photo/special/000/001/" + "@natural(100, 200)" + "/414x155.jpg", }) ); } module.exports = { // 列表數(shù)據(jù)返回 getSpecialList: config => { // 參數(shù)解析 console.log(config.body); let { page = 1, size, lang, order_by } = config.body; let tempList = []; let pageList; // 排序類型 tempList = order_by === "view" ? specialList.reverse() : specialList; // 分頁(yè)處理 pageList = tempList.filter((item, index) => index < page * size && index >= (page-1)*size); // 返回處理結(jié)果, 這里沒(méi)做異常狀態(tài)碼處理 return { status: { code: 0, message: "請(qǐng)求成功", time: "2019-07-03 16:45:12", }, data: pageList, }; }, // 列表詳情數(shù)據(jù)返回 getSpecialDetail: config => { let { id, page = 1, size, lang } = config.body; return { status: { code: 0, message: "請(qǐng)求成功", time: "2019-07-03 16:45:12", }, data: { detail: specialList[Math.ceil(1 + Math.random() * 98)], total: Math.ceil(Math.random() * 100), }, }; }, };
啟動(dòng)本地服務(wù)

這里我們需要在package.json 文件script 字段下新建一行命令去開啟服務(wù)器

    "mock": "node src/mock/index.js"
    在終端下執(zhí)行 npm run mock 即可開啟服務(wù), 接下來(lái)我們就可以放心去請(qǐng)求數(shù)據(jù)了
axios 通用配置 1.創(chuàng)建 axios 實(shí)例
// 1.引入所需依賴: axios,Vue,store,router,工具函數(shù) toast 等等...
import axios from "axios";
import Vue from "vue";

// 創(chuàng)建 axios 實(shí)例
const Axios = axios.create({
    // 添加初始化配置
    baseURL: process.env.BASE_API, // 基地址
    timeout: 10000, // 超時(shí)
    // withCredentials: true, // send cookies when cross-domain requests
});

// const TOKEN = window.sessionStorage.getItem("token"); // when set token

// 請(qǐng)求攔截器
Axios.interceptors.request.use(
    config => {
        // TODO: 添加請(qǐng)求頭處理邏輯,如添加 token; 還可以設(shè)置開啟請(qǐng)求 loading 動(dòng)畫
        // config.headers["X-Token"] = TOKEN
        return config;
    },
    error => {
        console.log("request error:", error); // for debug
        return Promise.reject(error);
    }
);

/**
 * 兩種方式做統(tǒng)一處理
 * 1.通過(guò) http狀態(tài)碼status:   response.status 和 error.response.status處理
 * 2.通過(guò) response.data中自定義的狀態(tài)碼code:  response.data.code 處理(異常處理直接在第一個(gè)回調(diào)重處理)
 */

// 響應(yīng)攔截器
Axios.interceptors.response.use(
    response => {
        const res = response.data;
        // 1.通過(guò)自定義 code 做統(tǒng)一處理
        // 2.也可以通過(guò) response.status === 200 處理; 這里采用 1
        if (res.status.code === 0) {
            return res.data; // 成功
        } else {
            // for example: 異常的 code 進(jìn)行自定義處理
            if (res.status.code === 50008 || res.status.code === 50012) {
                // 做一些提示的 toast 處理或者跳轉(zhuǎn)
                alert("有錯(cuò)誤!!!");
            }
            return Promise.reject(new Error(res.status.message || "Error"));
        }
        
    },
    error => {
        // 響應(yīng)錯(cuò)誤處理: 如超時(shí),斷網(wǎng),權(quán)限等...
        console.log("response error:", error); // for debug 本地開發(fā)下沒(méi)有狀態(tài)碼顯示
        console.log(error.response); // for debug
        // const res = error.response;
        // if (res) {
        //     // 請(qǐng)求已發(fā)出,但是不在2xx的范圍
        //     errorHandle(response.status, response.data.message);
        //     return Promise.reject(res);
        // } else {
        //     // 處理斷網(wǎng)或超時(shí)...
        //     // 網(wǎng)絡(luò)狀態(tài)可以在app.vue中控制著一個(gè)全局的斷網(wǎng)提示組件的顯示隱藏
        //     if (!window.navigator.onLine) {
        //         console.log("斷網(wǎng)了....");
        //     } else {
        //         return Promise.reject(error);
        //     }
        // }
    }
);

/**
 * 請(qǐng)求失敗后的錯(cuò)誤統(tǒng)一處理
 * @param {Number} status 請(qǐng)求失敗的狀態(tài)碼
 */
const errorHandle = (status, tips) => {
    // 狀態(tài)碼判斷
    switch (status) {
        //     // 401: 未登錄狀態(tài),跳轉(zhuǎn)登錄頁(yè)
        //     case 401:
        //         toLogin();
        //         break;
        //     // 403 token過(guò)期
        //     // 清除token并跳轉(zhuǎn)登錄頁(yè)
        //     case 403:
        //         tip("登錄過(guò)期,請(qǐng)重新登錄");
        //         localStorage.removeItem("token");
        //         store.commit("loginSuccess", null);
        //         setTimeout(() => {
        //             toLogin();
        //         }, 1000);
        //         break;
        // 404請(qǐng)求不存在
        case 404:
            console.log("請(qǐng)求的資源不存在");
            break;
        default:
            console.log(tips);
    }
};

// 實(shí)現(xiàn)插件, 暴露install方法, 可以給 vue 實(shí)例使用
// 通過(guò) this.$http.post 或者 get 去請(qǐng)求
export const http = {
    install(Vue) {
        Vue.prototype.$http = Axios;
    }
}

// 導(dǎo)出 Axios實(shí)例
export default Axios
2.使用
1.通過(guò)插件使用, 在 mian.js 導(dǎo)入
    import { http } from "./api/http";
    Vue.use(http);
    在組件實(shí)例中通過(guò) this.$http.post | get去請(qǐng)求
    
2.將請(qǐng)求方法抽離, 引入上面導(dǎo)出的 Axios 實(shí)例
    import request from "./http";

    // 首頁(yè)請(qǐng)求
    export function getHomeData(data) {
        return request({
            url: "/home",
            method: "post",
            data
        })
    }
            
            


文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/106371.html

相關(guān)文章

  • 淺談使用 Vue 構(gòu)建前端 10w+ 代碼量的單頁(yè)面應(yīng)用開發(fā)底層

    摘要:其實(shí)就是我們開始掛載上去的我們?cè)谶@里出去,我們就可以在回調(diào)里面只處理我們的業(yè)務(wù)邏輯,而其他如斷網(wǎng)超時(shí)服務(wù)器出錯(cuò)等均通過(guò)攔截器進(jìn)行統(tǒng)一處理。 showImg(https://segmentfault.com/img/remote/1460000015472616?w=845&h=622); 開始之前 隨著業(yè)務(wù)的不斷累積,目前我們 ToC 端主要項(xiàng)目,除去 node_modules, bu...

    rickchen 評(píng)論0 收藏0
  • 淺談使用 Vue 構(gòu)建前端 10w+ 代碼量的單頁(yè)面應(yīng)用開發(fā)底層

    摘要:其實(shí)就是我們開始掛載上去的我們?cè)谶@里出去,我們就可以在回調(diào)里面只處理我們的業(yè)務(wù)邏輯,而其他如斷網(wǎng)超時(shí)服務(wù)器出錯(cuò)等均通過(guò)攔截器進(jìn)行統(tǒng)一處理。 showImg(https://segmentfault.com/img/remote/1460000015472616?w=845&h=622); 開始之前 隨著業(yè)務(wù)的不斷累積,目前我們 ToC 端主要項(xiàng)目,除去 node_modules, bu...

    Backache 評(píng)論0 收藏0
  • vue項(xiàng)目如何去掉URL中#符號(hào)的方法

      你們是否想過(guò)如何優(yōu)化訪問(wèn)路徑里的/#/,看起來(lái)有簡(jiǎn)單又美觀,現(xiàn)在我們一起看看實(shí)現(xiàn)。現(xiàn)在就為大家展示解決方法。  正常解決步驟  1. 設(shè)置路由mode  先說(shuō)下router的默認(rèn)mode為hash模式,有關(guān)于hash模式介紹如下:  hash并不能作為傳遞,也無(wú)法將URL發(fā)送到服務(wù)器中,因此,無(wú)法到服務(wù)器中進(jìn)行處理。而且它對(duì)于SEO優(yōu)化也有不好的影響。我們可以換換想法,用可以使用 HTML5 ...

    3403771864 評(píng)論0 收藏0
  • 基于 HTTP 請(qǐng)求攔截,快速解決跨域和代理 Mock

    摘要:今天這篇文章,我們會(huì)介紹幾種常見的方法和其中存在的問(wèn)題,并提出如何基于請(qǐng)求攔截,快速解決跨域和代理問(wèn)題的方案。因?yàn)闆](méi)有修改該請(qǐng)求,只是延遲發(fā)送,這樣就保持了原請(qǐng)求與業(yè)務(wù)服務(wù)器之間的所有鑒權(quán)等相關(guān)信息,由此解決了跨域訪問(wèn)無(wú)法攜帶的問(wèn)題。 近幾年,隨著 Web 開發(fā)逐漸成熟,前后端分離的架構(gòu)設(shè)計(jì)越來(lái)越被眾多開發(fā)者認(rèn)可,使得前端和后端可以專注各自的職能,降低溝通成本,提高開發(fā)效率。 在前后端...

    dreamGong 評(píng)論0 收藏0
  • Vue+Mockjs模擬curd實(shí)現(xiàn)接口請(qǐng)求

      當(dāng)你遇見前端頁(yè)面開發(fā)完成,可后端接口還沒(méi)好,I這樣就直接無(wú)法聯(lián)調(diào),這時(shí)候我們用到mock數(shù)據(jù)。  先說(shuō)說(shuō)curd接口模擬  注:這邊可以和后端先約定好接口路徑以及入?yún)⒎祬⒌淖侄危苊舛涡薷摹 ?.我們先看看下面代碼,在安裝,新建js文件,在文件中導(dǎo)入mock.js,模擬列表數(shù)據(jù)  yarnaddmockjs   constMock=require("mockjs")   ...

    3403771864 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<