赞
踩
1.先在项目中下载aiXos和pinia
npm i pinia --save
npm install axios --save
2.封装axios请求-----
下载js-cookie
npm i JS-cookie -s
- //引入aixos
- import type { AxiosRequestConfig, AxiosResponse } from "axios";
- import axios from 'axios';
- import { ElMessage } from 'element-plus';
- import { useUserInfoStore } from '@/stores/modules/UserInfo'
- import router from '@/router';
- import qs from 'qs';
- import Cookie from "js-cookie";
- let baseURL = "";
- // console.log(process.env.NODE_ENV);//判断环境
- if (process.env.NODE_ENV === 'development') {
- baseURL = '/m.api'//后台请求接口地址
- } else {
- baseURL = 'http://xxxx.cn:8080';//这里是项目上线后的地址
-
- }
- declare interface TypeResponse extends AxiosResponse {
- /**
- * 错误号,200表示成功,10006令牌过期
- */
- errno: number,
- /**
- * 返回的信息
- */
- errmsg: string
- }
-
- //创建axios实例
-
- const instance = axios.create({
- baseURL, // 接口地址
- timeout: 3000,
- headers: {
- "Content-Type": 'application/x-www-form-urlencoded'
- }
-
- });
-
-
- //添加拦截器
- instance.interceptors.request.use((config) => {
- // 在发送请求之前做些什么--给请求头添加令牌token
- (config as any).headers['AdminToken'] = Cookie.get('token')//从cookie中拿token值,
- //这里是使用了js-cookie插件。
- // console.log(config, "请求拦截器")
- return config
- }, reeor => {
- // 对请求错误做些什么
- return Promise.reject(reeor);
- });
- // 需要无痛刷新的操作页面
- const METHOD_TYPE = ["_mt=edit", "_mt=create", "_mt=delete"]
- // //响应拦截器
- instance.interceptors.response.use(async (response: AxiosResponse) => {
- // 对响应数据做点什么
- let data = response.data;
- let { errno, errmsg } = data;
- console.log(response, "响应拦截器");
- let path = router.currentRoute.value.fullPath;//当前路由路径
- if (10006 === errno) {
- const configData = response.config.data || ''
- // 判断请求类型是否需要无痛刷新,index !== -1则需要无痛刷新
- let index = METHOD_TYPE.findIndex(item => configData.includes(item))
- if (-1 === index) {//需要重新登入获取令牌
- router.replace({ path: "/login", query: { back: path } })//登入后需要跳回的地址
- return
- } else {//需要无痛刷新令牌
- const store = useUserInfoStore();
- const { username, password } = store.LoginInfo//在状态管理里面定义一个loginInfo
- // 1.重新获取令牌
- let loginData = { _gp: 'admin', _mt: 'login', username, password };
- const { errno, errmsg, data } = await post(loginData)//这里是通过async 将异步序列化改为同步
- if (200 == errno) {
- Cookie.set('token', data)//保存令牌
- } else {
- router.replace({ path: "/login", query: { back: path } })//登入后需要跳回的地址
- return Promise.reject({ errno, errmsg, data })
- }
- return instance.request(response.config)
- }
- // ElMessage.error(errmsg);//错误信息
- }
- return data;
- }, reeor => {
- console.log(reeor);
-
- return Promise.reject(reeor);
- })
-
- function get(params?: object): Promise<TypeResponse> {
- return instance.get('', { params });
- };
- function post(data: object, params?: object): Promise<TypeResponse> {
- return instance.post('', qs.stringify(data), { params });
- };
-
-
- //暴露实列
- export {
- post, get,
- }

3.qs.stringify(data)是将请求的数据转成表单格式,如果不需要直接去掉就可以了;
4.重新登录后跳转路由需要设置,不需要可以去掉
5。状态管理--数据
下载持久化工具
npm install pinia-plugin-persistedstate --s
在main.js中配置持久化
- //引入数据持久化插件
- import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
- const pinia = createPinia()
- pinia.use(piniaPluginPersistedstate);
- app.use(pinia)
- import { defineStore } from 'pinia'
- export const useUserInfoStore = defineStore('UserInfo', {
- state:() => ({
-
- LoginInfo:{
- username:'',
- password:''
- }
- }),
-
- persist:true;//状态存储持久化
- })
6.登录页面--存储表单数据,也就是用户名和密码
npm i lodash --s
- import Cookies from 'js-cookie';//引入cookie
- import * as _ from 'lodash';//防抖节流插件
- import {post} from '@/util';
- import {useUserInfoStore} from '@/stores/modules/UserInfo' ;//用户信息
- import { useRouter,useRoute } from 'vue-router' ;//引入路由
- //这里是表单输入的数据
- const ruleForm = reactive({
- password: '123456',
- username: 'admin'
- });
- //请求接口数据
- let data = {
- _gp: "admin",
- _mt: 'login',
- ...ruleForm
- };
-
- let LoginInfo = useUserInfoStore().LoginInfo;//状态管理定义的数据
- async function init() {
- await post(data).then((res:any) => {
- let { data: token, errno, errmsg } = res
- if (200 === errno) {
- let time = new Date() //设置过期时间
- time.setTime(time.getTime() + 1000 * 60 * 30)
- Cookies.set('token', token, { expires: time });
- Object.assign(LoginInfo,ruleForm)
- if (route.query.back) { //如果存在参数
- let paths = route.query.back+''//拼接字符串
- console.log(paths);
- if (paths=='/') {
- //因为我的home是'/',所有需要判断
- router.replace('/Surface')//跳转至主页
- return
- }else{
- router.replace(paths)//则跳转至进入登录页前的路由
- }
-
- } else {
- router.replace('/Surface')//否则跳转至首页
- }
-
- } else {
- ElMessage.error(errmsg)
- }
- }).catch((err:any) => {
- ElMessage.error('登录异常!')
- })
- let info = {//用户信息请求信息接口数据
- _gp: "admin",
- _mt: 'info',
- }
- //下面这个函数是请求用户信息的,不需要可以不写
- await post(info).then((res:any) => {
- let {data} = res
- console.log(data);
- infos(data)
-
- }).catch((err:any)=>{
- ElMessage.error('登录异常!')
- })
- }
- //防抖节流
- const fangdou = _.debounce(init, 1500, {
- leading: true, // 延长开始后调用
- trailing: false // 延长结束前调用
- })
- //移除组件时,取消防抖
- onUnmounted(() => {
- fangdou.cancel()
- })

7.main.js设置路由守卫
- import Cookie from 'js-cookie'
- import router from './router'//引入路由
-
- //路由守卫
- router.beforeEach(async (to, from ) => {
- let tokent:string|undefined = Cookie.get('token')
- if (!tokent && to.path == '/login') {
- return true
- }
- // 没有登录,强制跳转登录页
- if (!tokent && to.path !== '/login') {
- router.replace({path:'/login',query:{back:to.path}});
- }
- // 防止重复登录
- if (tokent && to.path === '/login') {
- return {
- path: from.path ? from.path : '/Surface'
- }
- }
- return true
- })

大概就是这么多,有什么问题可以直接问
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。