常见前后端交互项目踩坑

155 阅读3分钟

1. 确认需求

  1. 未登入时,默认跳转到【登录页面】
  2. 用户在未登录的时候可以注册或者登录
  3. 在注册页面用户可输入用户名密码进行注册
  4. 登录成功后默认跳转到【列表页面】, 用户进行增删改查
  5. 怎么处理 笔记
  6. 怎么处理回收站
  7. 当用户点击注销时,回到登录页面

2. 怎么和后端约定

要约定什么信息

  1. 接口的路径 例如 XXX\register
  2. 数据请求的方式 例如GET进行获取 POST进行提交或者创建
  3. 参数的类型和格式 是JSON还是其他
  4. 参数的字段和约束 例如密码的最小位数
  5. 请求成功时返回的数据格式
  6. 请求失败时返回的数据格式

3.如何封装请求API

1. 封装Axios请求

import axios from "axios"
// 配置通用参数
axios.defaults.headers.post["Content-Type"] = 'application/x-www-form-urlencoded'
axios.defaults.baseURL = process.env.VUE_APP_BASEURL
axios.defaults.withCredentials = true
export default function request (url, type = "GET", data = {}) {
    return new Promise((resolve, reject) => {
        let option = {
            url,
            method: type,
            ValidateStatus: function (status) {
                return (status >= 200 && status < 300) || status === 400
            }
        }
        if (type.toLowerCase() === "get") {
            option.params = data
        } else {
            option.data = data
        }
        axios(option).then(res => {
            if (res.status === 200) {
                resolve(res.data)
            } else {
                reject(res.data)
            }
        }).catch(err => {
            reject({ msg: err.response.data.msg })
        })
    })
}

总结而言

  1. 引入基础的配置项,包括请求类型、是否携带Cokkie等问题
  2. option的处理和封装
  3. axios发送与处理
  4. Promise封装

2. API设计

import request from "@/helpers/request";

const URL = {
    REGISTER: "/XXX/register",
}

export default {
    register ({ username, password }) {
        return request(URL.REGISTER, "POST", { username, password })
    }
  1. 通过表存储约定的接口地址
  2. 按规定的请求方式和参数进行封装

4.如何在本地调试时解决跨域不携带Cookie的问题

在Vue的默认设置中,本地调试使用的是http协议,而chrome在2020年3月份升级了安全策略,对于跨域请求如果想写入cookie,必须是https协议才能携带Cookie。

1. 启动HTTPS

vue-cli 2

修改build/webpack.dev.conf 文件,在devServer里添加https: true

vue-cli 3+

修改vue.config.js

module.exports = {
    devServer: {
        https: true
    }
};

2.启动项目

yarn serve 进入HTTPS链接

3. 处理不安全

image.png

出现这种情况后,在当前页面用键盘输入 thisisunsafe ,不是在地址栏输入,页面即会自动刷新进入网页

5. 如何实现生产环境与测试环境分离

此处一般使用Vue-cli3以上的版本

1. 编写环境文件

.env.development 编写一个.env开头的文件,结尾代表环境名 然后在内部写需要的参数

2. 使用参数

baseURL = process.env.VUE_APP_BASEURL 在其他文件中使用对应的参数名进行调用

3.调用环境

package.json

"serve:dev": "vue-cli-service serve --mode development",

即可使用以对应环境为结尾的参数对应的环境

6.路由传参和路由守卫

1. 传参

直接在路径中传递

父组件<router-link to = "/XX/YY"></router-link>

子组件:  this.$route.params.YY接收父组件传递过来的参数

路由:{path: '/路径/:传参', }

利用对象

父组件

      this.$router.push({
        path: `/XX/${YY}`
      })

子组件:  this.$route.params.YY

路由:{path: '/路径/:传参', }

3.query

父组件

      this.$router.push({
        path: '/c',
        query: {
          XX: 'YY'
        }
      })

子组件

this.$route.query.YY

路由不更改,不需要动态参数

地址:#/组件?XX=YY

2. 路由守卫

以beforeEach为例

router.beforeEach((to, from, next) => {
  // ...
})

每个守卫方法接收三个参数:

to: Route即将要进入的目标 路由对象

from: Route当前导航正要离开的路由

next: Function一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。

7. eslint不支持扩展运算符

Vue 默认的解析器存在部分情况无法解析扩展运算符

1 安装新的解析器

$ npm install eslint @babel/core @babel/eslint-parser --save-dev
# or
$ yarn add eslint @babel/core @babel/eslint-parser -D

2. 配置

.eslintrc.js

module.exports = {
    root: true,
    parserOptions: {
        sourceType: 'module'
    },
    parser: "@babel/eslint-parser",
    env: {
        browser: true,
        node: true,
        es6: true,
    },
    rules: {
        'no-console': 'off',
    }
}

8. 如何对请求数据统一使用Vuex进行处理

const users = {
    state: {
        user: null
    },
    getters: {
        username: state => state.user
    },
    mutations: {
        setUser (state, payload) {
            state.user = payload.user
        }
    },
    actions: {
        login ({ commit }, { username, password }) {
            return Auth.login({ username, password }).then(res => {
                commit("setUser", { user: res.data })
            })
        },// 如果需要处理的话在commit之前再套一层Promise进行处理
    }
}
  • state:原始的数据
  • getters:根据原始的数据,进行一个扩展
  • mutations:修改数据
  • actions:一些异步操作

9. 路由

先确定有几个页面,然后根据实际的开发过程进行修改

懒加载

component: () => import("@/components/Login.vue")