【vue实战项目】通用管理系统:封装token操作和网络请求

简介: 【vue实战项目】通用管理系统:封装token操作和网络请求

1.概述

前文我们已经完成了登录页:

【vue实战项目】通用管理系统:登录页-CSDN博客

接下来我们要封装一下对token的操作和网络请求操作。之所以要封装这部分内容是因为token我们登陆后的所有请求都要携带,不可能每次都去重复的去手写:

token=localStorage.getToken('token')
this.axios.post('接口API',参数+token)
          .then(res=>{
            //业务逻辑
          })

这样每次都重复的去手写明显不具有复用性,一旦token的存取逻辑或者API地址变了,到处都要去改。所以将他们抽出来封装是很有必要的。本文的主要内容就是讲解如何去封装token的操作和网络请求。

2.封装对token的操作

对一个应用系统来说,当用户登陆过后,后续的操作都是要进行权限校验的,也就是在请求后端接口的时候都要带上token。所以我们要将token存起来,首先封装一个对token的操作集合。在utils下面新建一个setToken的js:

setToken的内容很简单就是用localStorage来对token进行缓存:

export function setToken(tokenKey,token){
    return localStorage.setItem(tokenKey,token)
}
 
export function getToken(tokenKey){
    return localStorage.getItem(tokenKey)
}
 
export function removeToken(tokenKey){
    return localStorage.removeItem(tokenKey)
}

由于setToken只在登录的时候才需要用到,所以这里没必要将它引入到main.js中去让全局都能调用到,直接在Login组件中引入,在Login组件中能被调用就行了。这里我们换一种方式来引入,import的时候除了用相对路径和绝对路径来导入外,还可以用@来导入,@会自动帮我们定位到资源所在路径


import {setItem} from '@/utils/setToken.js'


Login组件:

<script>
import {usernameAndPassWorldRule} from '../utils/validate.js'
//引入想要的操作token的方法
import {setToken} from '@/utils/setToken.js'
export default {
  data() {
    return {
      form: {
        username: "",
        password: "",
      },
      rules:{
        username:[{validator:usernameAndPassWorldRule,trigger:'blur'}],
        password:[{validator:usernameAndPassWorldRule,trigger:'blur'}]
      }
    };
  },
  methods:{
    login(form){
      this.$refs[form].validate((valid)=>{
        if(valid){
          console.log(this.form)
          this.$router.push('/home')
          this.axios.post('https://rapserver.sunmi.com/app/moc/340/login',this.form)
          .then(res=>{
            console.log(res)
            if(res.data.status===200){
              //使用引入的操作token的方法
              setToken('username',res.data.username)
              this.$message({message:res.data.message,type:'success'})
              this.$router.push('/home')
            }
          })
        }else{
          console.error(this.form)
        }
      })
    }
  }
};
</script>

ok,到了这一步我们已经完成了对token操作的封装,但是这就够了吗?很显然还不够的,至少还有两个地方还需要继续进行封装:

  • 每次网络请求都要调用axios去写一大串地址,一旦地址变了,全局到处都要修改,很明显这里应该继续封装,免得搞得遍地都是。
  • 后续的请求都要携带token,所以很显然还需要封装将token放到请求中去这个动作,免得搞得遍地都是。

这就是接下来我们要继续做的事儿——封装axios操作

3.封装axios

首先我们来解决前面提到的两点中的第一点:


每次网络请求都要调用axios去写一大串地址,一旦地址变了,全局到处都要修改,很明显这里应该继续封装,免得搞得遍地都是。


这个问题可以通过设置代理去解决,在vue.config.js中设置代理写好目标服务的URL前缀,顺便开启一下跨域:

module.exports = {  
    devServer:{
      open:true,
      host:'localhost',
      //配置代理
      proxy:{
        '/api':{
          //目标地址
          target:'http://127.0.0.1:8081/api/',
          //开启跨域
          changeOrigin:true,
          pathRewrite:{
            '^/api':''
          }
        }
      }
    }
  }

接下来解决第二个问题:

后续的请求都要携带token,所以很显然还需要封装将token放到请求中去这个动作,免得搞得遍地都是。

封装一个axios的工具js,service.js:

service.js里面通过拦截器的方式来拦截request和response,在请求发起时放入token,在响应回来时处理报错:

import axios from "axios";
import { getToken } from "@/utils/setToken.js";
import { Message } from "element-ui";
const service= axios.create({
    baseURL:'/api',
    timeout:3000
})
 
//添加请求拦截器
service.interceptors.request.use((config)=>{
    //在请求之前做些什么(获取并设置token)
    config.headers['token']=getToken('token')
    return config
},(error)=>{
    return Promise.reject(error)
})
 
//响应拦截器
service.interceptors.response.use((response)=>{
    //对响应数据做些什么
    let{status,message}=response.data
    if(status!=200){
        //用elementUI的message来提升错误或者告警
        Message({message:message||'error',type:'warning'})
    }
    return response
},(error)=>{
    return Promise.reject(error)
})
 
export default service

service.js是全局都要用到的,所以在main.js里引入:

import Vue from 'vue'
import App from './App.vue'
// import '../plugins/element.js'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
 
import 'font-awesome/css/font-awesome.min.css'
// import axios from 'axios'
import router from './router'
 
import service from './utils/service';
 
Vue.use(ElementUI)
//挂载到原型,可以在全局使用
// Vue.prototype.axios=axios
Vue.prototype.service=service;
Vue.config.productionTip = false
 
new Vue({
  //挂在router
  router,
  render: h => h(App),
}).$mount('#app')

最后来改一下Login组件,完整的用上setToken.js和service.js:

<template>
  <div class="login">
    <el-card class="box-card">
      <div slot="header" class="clearfix">
        <span>通用后台管理系统</span>
      </div>
      <el-form
        label-width="80px"
        :model="form"
        ref="form"
        :rules="rules"
      >
        <el-form-item label="用户名" prop="username">
          <el-input v-model="form.username"></el-input>
        </el-form-item>
        <el-form-item label="密码" prop="password">
          <el-input type="password" v-model="form.password"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="login('form')">登录</el-button>
        </el-form-item>
      </el-form>
    </el-card>
  </div>
</template>
 
<script>
import {usernameAndPassWorldRule} from '../utils/validate.js'
//引入想要的操作token的方法
import {setToken} from '@/utils/setToken.js'
export default {
  data() {
    return {
      form: {
        username: "",
        password: "",
      },
      rules:{
        username:[{validator:usernameAndPassWorldRule,trigger:'blur'}],
        password:[{validator:usernameAndPassWorldRule,trigger:'blur'}]
      }
    };
  },
  methods:{
    login(form){
      this.$refs[form].validate((valid)=>{
        if(valid){
          console.log(this.form)
          this.service.post('/login',this.form)
          .then(res=>{
            console.log(res.status)
            if(res.status===200){
              setToken('username',res.data.username)
              setToken('token',res.data.token)
              this.$router.push('/home')
 
            }
          })
        }else{
          console.error(this.form)
        }
      })
    }
  }
};
</script>
 
<style lang="less">
.login{
  width: 100%;
  height:100%;
  position: absolute;
  background: #409EFF;
  .box-card{
    width:450px;
    margin: 200px auto;
    .el-card__header{
      font-size: 30px;
    }
    .el-button{
      width: 100%;
    }
 
  }
}
</style>

目录
相关文章
|
5月前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
581 55
|
4月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
324 5
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
3月前
|
机器学习/深度学习 数据可视化 算法
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
神经常微分方程(Neural ODEs)是深度学习领域的创新模型,将神经网络的离散变换扩展为连续时间动力系统。本文基于Torchdyn库介绍Neural ODE的实现与训练方法,涵盖数据集构建、模型构建、基于PyTorch Lightning的训练及实验结果可视化等内容。Torchdyn支持多种数值求解算法和高级特性,适用于生成模型、时间序列分析等领域。
239 77
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
|
1月前
|
小程序 UED
拓展校友网络的创新解决方案:校园论坛圈子小程序+跑腿+二手市场系统
这是一款基于小程序的校园跑腿服务平台,支持多种注册登录方式、下单支付、跑腿接单配送、订单跟踪评价及物流查询功能,并配备客服模块提升用户体验。系统包含用户、客服、物流、跑腿员和订单五大核心模块,功能完善。此外,平台还拓展了校友网络功能,如信息咨询发布、校园社区建设和活动组织等,旨在增强校友互动与联系,形成紧密的校友生态。
64 4
|
2月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【害虫识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
害虫识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了12种常见的害虫种类数据集【"蚂蚁(ants)", "蜜蜂(bees)", "甲虫(beetle)", "毛虫(catterpillar)", "蚯蚓(earthworms)", "蜚蠊(earwig)", "蚱蜢(grasshopper)", "飞蛾(moth)", "鼻涕虫(slug)", "蜗牛(snail)", "黄蜂(wasp)", "象鼻虫(weevil)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Djan
160 1
基于Python深度学习的【害虫识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
2月前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
112 23
|
2月前
|
JSON 前端开发 JavaScript
HarmonyOS NEXT 实战系列10-网络通信
本文介绍了网络通信相关知识,包括HTTP协议的工作原理、鸿蒙系统中HTTP模块的使用方法、Promise异步操作处理机制及async/await语法糖的应用,以及JSON数据格式的语法规则与转换方法。重点讲解了HTTP请求响应流程、鸿蒙开发中的网络权限申请与代码实现、Promise三种状态及创建方式,并通过示例说明异步编程技巧和JSON在数据传递中的应用。
85 10
|
2月前
|
前端开发 Java 关系型数据库
基于ssm的网络直播带货管理系统,附源码+数据库+论文
该项目为网络直播带货网站,包含管理员和用户两个角色。管理员可进行主页、个人中心、用户管理、商品分类与信息管理、系统及订单管理;用户可浏览主页、管理个人中心、收藏和订单。系统基于Java开发,采用B/S架构,前端使用Vue、JSP等技术,后端为SSM框架,数据库为MySQL。项目运行环境为Windows,支持JDK8、Tomcat8.5。提供演示视频和详细文档截图。
76 10
|
3月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
蘑菇识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了9种常见的蘑菇种类数据集【"香菇(Agaricus)", "毒鹅膏菌(Amanita)", "牛肝菌(Boletus)", "网状菌(Cortinarius)", "毒镰孢(Entoloma)", "湿孢菌(Hygrocybe)", "乳菇(Lactarius)", "红菇(Russula)", "松茸(Suillus)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,
199 11
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
2月前
|
监控 安全 网络协议
Hyper V上网实战:多虚拟机网络环境配置
在Hyper-V环境中配置多虚拟机网络以实现上网功能,需完成以下步骤:1. 确认Hyper-V安装与物理网络连接正常;2. 配置虚拟交换机(外部、内部或专用)以支持不同网络需求;3. 设置虚拟机网络适配器并关联对应虚拟交换机;4. 验证虚拟机网络连接状态;5. 根据场景需求优化多虚拟机网络环境。此外,还需注意网络隔离、性能监控及数据备份等事项,确保网络安全稳定运行。