【信贷后台管理系统之axios的二次封装(四)】

打印 上一主题 下一主题

主题 995|帖子 995|积分 2985


一、axios的二次封装

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
src下新建utils,新建request.js用来封装axios
控制台安装axios依赖

在request.js文件里引入axios,router
requeset.js文件代码如下:
  1. import axios from 'axios'
  2. import router from '@/router'
  3. import { Notification,Message} from "element-ui";
  4. const requset = axios.create(
  5.     {
  6.         // 添加api前缀
  7.         baseURL:'/api',
  8.         // 请求过期时间
  9.         timeout:5000
  10.     }
  11. )
  12. // 请求拦截器
  13. requset.interceptors.request.use(config=>{
  14.     // 给header添加token
  15.     let token = localStorage.getItem('token')
  16.     if(token){
  17.         config.headers.token = token
  18.     }
  19.     return config
  20. })
  21. // 响应拦截器
  22. requset.interceptors.response.use(
  23.     response=>{
  24.         // 后端状态码20000表示成功
  25.         if(response?.data?.code === 20000){
  26.             // 后端返回的结构没有统一,兼容处理一下
  27.             if (typeof response?.data?.data === 'string')
  28.                 Message.success(response?.data?.data)
  29.             if (typeof response?.data?.data?.info === 'string')
  30.                 Message.success(response?.data?.data?.info)
  31.             return response
  32.         }else if(response?.data?.code === 603){
  33.             // 603表示token失效
  34.             Notification.error({
  35.                 title:'错误',
  36.                 message:'token失效,请重新登录'
  37.             })
  38.             // 替换到登录页面
  39.             let url = window.location.href.split('/')
  40.             if (url[url.length - 1] !== 'login'){
  41.                 router.replace('/login')
  42.             }
  43.         }else{
  44.             if(response?.status !== 200){
  45.                 Notification.error({
  46.                     title:'错误',
  47.                     message:'响应错误'
  48.                 })
  49.             }
  50.         }
  51.         return response
  52.     }
  53. )
  54. export default requset
复制代码
二、设置后端接口地址

在vue.config.js里,设置代理服务器
三、登录接口api联调

src下新建api文件,user.js,引入封装的reques(axios的二次封装),登录后可以打印20000数据,打印出token,然后将token加上

user.js代码如下:
  1. import request from "@/utils/request";
  2. export const  doLogin=(user)=>{
  3.     return request.post('/user/login',{
  4.         account:user.username,
  5.         password:user.pass
  6.     })
  7. }
复制代码
接口api文件写好后,到LoginView.vue文件引入import {doLogin} from "@/api/user";引入后进行调用

LoginView.vue代码如下
  1. <template>
  2.   <div class="login-box">
  3.     <div class="login-input-box">
  4.       <h1>信贷后台管理系统</h1>
  5.       <el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" label-width="70px" class="demo-ruleForm">
  6.         <el-form-item label="用户名" prop="username">
  7.           <el-input  v-model="ruleForm.username" autocomplete="off"></el-input>
  8.         </el-form-item>
  9.         <el-form-item label="密码" prop="pass">
  10.           <el-input type="password" v-model="ruleForm.pass" autocomplete="off"></el-input>
  11.         </el-form-item>
  12.         <el-form-item>
  13.           <el-button type="primary" @click="submitForm('ruleForm')">提交</el-button>
  14.         </el-form-item>
  15.       </el-form>
  16.     </div>
  17.   </div>
  18. </template>
  19. <script >
  20. import {doLogin} from "@/api/user";
  21. export default {
  22.   data(){
  23.     // 密码校验,长度不小于8位且不大于20位字符,必须包含大写字母,小写字母,数字和特殊符号
  24.     // var ISPWD =/^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*,\._\+(){}])[0-9a-zA-Z!@#$%^&*,\\._\+(){}]{8,20}$/;
  25.     // // 密码校验
  26.     // const validatePass = (rule, value, callback) =>{
  27.     //   if (!ISPWD.test(this.registerForm.password)) {
  28.     //     callback(new Error("用户密码必须包含大写字母、小写字母、数字和特殊符号"));
  29.     //   } else {
  30.     //     callback();
  31.     //   }
  32.     // }
  33.     // const validatePass = (rule,value,callback){
  34.     //   if(this.ruleForm.pass === '') {
  35.     //     callback(new Error('请输入密码'))
  36.     //   }else if(this.ruleForm.pass.length < 6){
  37.     //     callback(new Error('密码长度不能小于6'))
  38.     //   }else{
  39.     //     callback();
  40.     //   }
  41.     // },
  42.     return{
  43.       ruleForm: {
  44.         username:'',
  45.         pass:'',
  46.       },
  47.       rules:{
  48.         username: [
  49.           {required:true,trigger:'blur',message:'请输入用户名'}
  50.         ],
  51.         pass:[
  52.           {required:true,trigger:'blur',validator:this.validatePass},
  53.         ],
  54.       },
  55.     };
  56.   },
  57.   methods:{
  58.     // 校验规则
  59.     validatePass(rule,value,callback){
  60.       if (value === ""){
  61.         callback(new Error("请输入密码"));
  62.       }else if (value.length < 6){
  63.         callback(new Error("密码不能小于6位数"));
  64.       }else{
  65.         callback();
  66.       }
  67.     },
  68.     submitForm(){
  69.       // 验证规则
  70.       this.$refs.ruleForm.validate((valid) => {
  71.         if (valid) {
  72.           this.login(this.ruleForm);
  73.         }else{
  74.           return false;
  75.         }
  76.       });
  77.     },
  78.     async login(form){
  79.       console.log(form);
  80.       let res = await doLogin(form);
  81.       if(res.data.code === 20000){
  82.         if(res?.data?.data?.token){
  83.           localStorage.setItem("token",res.data?.data?.token);
  84.         }
  85.         this.$router.replace("/home");
  86. }
  87.     },
  88.   },
  89. };
  90. </script>
  91. <style lagn="scss" scoped>
  92. .login-box{
  93.   display: flex;   /* div可成为flex容器*/
  94.   justify-content: center;  /*上面贴着父元素,居于中间*/
  95.   align-items: center;  /* 左侧贴着父元素,把项目位置调整到中间 */
  96.   height: 100vh; /* 元素撑开和屏幕一致*/
  97.   background-image: url("../assets/login-background.jpg");
  98.   background-size: cover;
  99. }
  100. .login-input-box{
  101.   width: 650px;
  102.   height: 320px;
  103.   background-color: #fff;
  104.   text-align: center;
  105.   padding: 40px 40px 12px 12px;
  106. }
  107. .el-button{
  108.   width: 600px;
  109. }
  110. .el-input{
  111.   width: 600px;
  112.   margin-bottom: 16px;
  113. }
  114. ::v-deep .el-input_inner{
  115.   background: #e5e5e5;
  116. }
  117. </style>
复制代码
在request.js里的请求拦截器添加个token

四、贷款申请接口api编写联调

在src下新建api文件,该文件下新建loan.js,引入request
loan.js代码如下
  1. import requset from "@/utils/request";
  2. export const createLoan =(data)=>{
  3.     return requset({
  4.         url:'/loan/create',
  5.         method:'POST',
  6.         data
  7.     })
  8. }
复制代码
在src文件的views的loan文件下的IndexView.vue文件里引入并使用
引入import {createLoan} from "@/api/loan";




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

不到断气不罢休

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表