Vue3.0商店后台管理系统项目实战-axios的封装

参考资料

Vue3.0官方文档:https://cn.vuejs.org/
Element Plus文档:https://element-plus.gitee.io/zh-CN/

在项目里面安装

npm i axios -S

封装一个axios
在文件里面新建一个util/service.js

import { ElLoading } from 'element-plus'
import { ElMessage } from 'element-plus'


import axios from "axios"
//使用create 创建axios实例

let loadingObj=null

const Service=axios.create({
    timeout:8000,
    baseURL:"http://xx",
    headers:{
        "Content-type":"application/json;charset=utf-8"
    }
    
})
//请求拦截-增加loading,对请求进行统一的处理
Service.interceptors.request.use(config=>{
    loadingObj=ElLoading.service({
        lock: true,
        text: 'Loading',
        background: 'rgba(0, 0, 0, 0.7)',
      })

      return config
})

//响应拦截--对返回值做统一处理
Service.interceptors.response.use(response=>{
    return response.data
},err=>{
    loadingObj.close()
    ElMessage({
        message:"服务器错误",
        type:"error",
        duration:2000

    })
})

//post请求
export const post=config=>{
    return Service({
        ...config,
        method:"post",
        data:config.data
    })
}


//get请求
export const get=config=>{
    return Service({
        ...config,
        method:"get",
        data:config.data
    })
}

新建一个request.js

request.js

import {post,get} from "./service"
export const  loginApi=data=>{
    return post({
        url:"./login",
        data
    })
}

在login.vue里面引入request

在实际项目里面 封装使用
service.js

import axios from "axios"

import { ElLoading } from 'element-plus'
import { ElMessage } from 'element-plus'
// //使用create 创建axios实例

// let loadingObj=null

// const Service=axios.create({
//     timeout:8000,
//     baseURL:"http://192.168.16.103:8091/chem/login",
//     headers:{
//         "Content-type":"application/json;charset=utf-8"
//     }
    
// })

// 使用create创建axios实例
let loadingObj = null
const Service = axios.create({
    timeout:8000,
    baseURL:"http://47.100.36.235:8091/check/login",
    headers:{
        "Content-type":"application/json;charset=utf-8",
      //  "Authorization":store.state.uInfo.userInfo.token
    }
})

// 请求拦截-增加loading,对请求做统一处理
Service.interceptors.request.use(config=>{
    loadingObj=ElLoading.service({
        lock: true,
        text: 'Loading',
        background: 'rgba(0, 0, 0, 0.7)',
    })
    return config
})
// 响应拦截-对返回值做统一处理
Service.interceptors.response.use(response=>{
    loadingObj.close()
    const data = response.data
    if(data.meta.status!=200 && data.meta.status!=201){
        ElMessage.error(data.meta.msg||"服务器出错")
        // 请求出错 
        return data
    }
    return data

},error=>{
    loadingObj.close()
    ElMessage({
        message:"服务器错误",
        type:"error",
        duration:2000
    })
})

// post请求
export const post=config=>{
    return Service({
        ...config,
        method:"post",
        data:config.data
    })
}
// get请求
export const get=config=>{
    return Service({
        ...config,
        method:"get",
        params:config.data
    })
}

request.js

import {post,get} from "./service"
export const loginApi=data=>{ 
    return post({
        url:"/login",
        data
    })
}

login.vue

<template>
  <div class="login_wrap">
    <div class="form_wrap">
      <el-form
        ref="formRef"
        :model="loginData"
        label-width="100px"
        class="demo-dynamic"
      >
        <el-form-item
          prop="username"
          label="用户名"
          :rules="[
            {
              required: true,
              message: '此项为必填项',
              trigger: 'blur',
            },
          ]"
        >
          <el-input v-model="loginData.username" />
        </el-form-item>

        <el-form-item
          prop="password"
          label="密码"
          :rules="[
            {
              required: true,
              message: '此项为必填项',
              trigger: 'blur',
            },
          ]"
        >
          <el-input type="password" v-model="loginData.password" />
        </el-form-item>

        <el-form-item>
          <el-button type="primary" @click="handleLogin()">登录</el-button>
        
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script>
import { reactive, toRefs } from "vue";

//引入useStore
import { useStore } from "vuex";
//引入路由
import { useRouter } from "vue-router";

//import {loginApi} from "@util/request"
import {loginApi} from "@/util/request"

export default {
  name: "login",
  setup() {
    const store = useStore();
    const router = useRouter();

    const count = store.state.number.count;

    const data = reactive({
      loginData: {
        username: "",
        password: "",
      },
      num: count,
      // countStatus:
    });

    const handleLogin = () => {
      //请求后台接口
      loginApi(data.loginData).then(res=>{
        console.log("登录的返回",res)

        if(res.data){
                    store.commit('setUserInfo', res.data);
                    localStorage.setItem("loginData",JSON.stringify(res.data))
                    // 跳转/user
                    router.push({
                        path:"/"
                    })
                }
                
      })
      // store.commit("setUserInfo", data.loginData);
      // localStorage.setItem("loginData",JSON.stringify(data.loginData))
      
      // //跳转user页面
      // router.push({
      //   path:"/user"
      // })
    };

    // console.log("修改前getters", store.getters["number/countStatus"]);
    // const handleLogin = () => {

    //   store
    //     .dispatch("number/setCountPromise", -100)
    //     .then((res) => {
    //       alert("修改成功");
    //     })
    //     .catch((err) => {
    //       alert(err);
    //     });
    //   console.log(store.state.number.count);
    //   console.log("修改后getters",store.getters["number/countStatus"]);
    // };
    return {
      ...toRefs(data),
      handleLogin,
    };
  },
};
</script>
<style scoped>
.login_wrap {
  width: 100%;
  height: 100vh;
  background: #2d3761;
  position: relative;
}
.form_wrap {
  position: fixed;
  top: 50%;
  transform: translate(130%, -50%);
  background: #fff;
  padding: 30px 50px;
  border-radius: 5px;
}
</style>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3.0 TS 后台管理系统项目文档 一、项目介绍 该项目是一个使用 Vue3.0 和 TypeScript 开发的后台管理系统。主要功能包括用户登录、权限管理、数据展示、数据编辑等。 二、项目结构 1. src 目录:项目主要代码存放位置 - components:组件目录,存放通用组件和业务组件 - views:视图目录,存放各个页面的逻辑和模板 - utils:工具目录,存放与业务无关的工具函数、网络请求等 - router.ts:路由配置文件 - main.ts:项目入口文件 2. assets 目录:存放静态资源,如图片、样式等 3. types 目录:存放 TypeScript 类型定义文件 三、功能模块 1. 用户登录模块 - 用户名、密码验证 - 登录成功后,保存用户信息到本地 2. 权限管理模块 - 管理员、普通用户权限划分 - 根据不同的权限显示不同的菜单和页面 3. 数据展示模块 - 获取后台数据 - 在页面中展示数据,支持分页和搜索功能 4. 数据编辑模块 - 支持对页面数据的修改、增加和删除操作 四、技术栈 1. Vue3.0:使用 Vue3.0 版本进行开发,享受其更优秀的性能和开发体验 2. TypeScript:使用 TypeScript 进行开发,增强代码的可维护性和可读性 3. Vue Router:用于管理页面的路由跳转和权限控制 4. Vuex:用于状态管理,方便组件间的数据共享和通信 5. Element Plus:使用 Element Plus UI 组件库来构建页面,提供丰富的组件和样式 五、项目配置与启动 1. 安装依赖:使用 npm 或 yarn 安装项目依赖包 2. 配置环境:根据实际需求修改 API 地址和其他配置项 3. 启动项目:运行 npm run serve 或 yarn serve 命令启动项目 六、总结 该项目是一个基于 Vue3.0 和 TypeScript 开发的后台管理系统,具备用户登录、权限管理、数据展示和编辑等功能。通过项目结构、功能模块、技术栈以及项目配置与启动进行了详细说明,希望对项目的开发和使用提供一定的参考和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值