feat: 登录mock,修改了全局token、axios的请求头的携带方式,路由守卫的token修改,全局的token字段修改为AdminToken

This commit is contained in:
wf 2024-10-31 14:47:46 +08:00
parent bf841a9d4c
commit 1c27fab1b2
11 changed files with 80 additions and 77 deletions

View File

@ -2,26 +2,22 @@ import axios from "axios";
import router from "@/router"; import router from "@/router";
import { Message } from "@arco-design/web-vue"; import { Message } from "@arco-design/web-vue";
const MockFlag = import.meta.env.VITE_APP_OPEN_MOCK === "true"; // 是否开启本地mock
console.log("在这里axios", import.meta.env.VITE_APP_OPEN_MOCK, MockFlag); const MOCK_FLAG = import.meta.env.VITE_APP_OPEN_MOCK === "true";
// 创建axios实例 // 创建axios实例
const service = axios.create({ const service = axios.create({
baseURL: MockFlag ? "" : "/api" baseURL: MOCK_FLAG ? "" : "/api"
}); });
// 请求拦截器 // 请求拦截器
service.interceptors.request.use( service.interceptors.request.use(
function (config: any) { function (config: any) {
// 发送请求之前做什么 // 发送请求之前做什么
// 获取token鉴权 // 获取token鉴权
let userInfo: any = {}; if (localStorage.getItem("AdminToken")) {
if (localStorage.getItem("user-info")) {
userInfo = JSON.parse(localStorage.getItem("user-info") as string);
}
if (userInfo.token) {
// 有token在请求头中携带token // 有token在请求头中携带token
config.headers.Authorization = userInfo.token; config.headers.Authorization = localStorage.getItem("AdminToken");
} }
console.log("请求拦截", config);
return config; return config;
}, },
function (error: any) { function (error: any) {
@ -33,7 +29,6 @@ service.interceptors.request.use(
// 响应拦截器 // 响应拦截器
service.interceptors.response.use( service.interceptors.response.use(
function (response: any) { function (response: any) {
console.log("响应了", response);
if (response.status != 200) { if (response.status != 200) {
Message.error("服务器异常,请联系管理员"); Message.error("服务器异常,请联系管理员");
return Promise.reject(response.data); return Promise.reject(response.data);
@ -47,7 +42,7 @@ service.interceptors.response.use(
Message.error("请求连接超时"); Message.error("请求连接超时");
return Promise.reject(res); return Promise.reject(res);
} else if (res.code != 200) { } else if (res.code != 200) {
Message.error(res.msg); Message.error(res.message);
return Promise.reject(res); return Promise.reject(res);
} else { } else {
// 返回数据 // 返回数据
@ -55,7 +50,7 @@ service.interceptors.response.use(
} }
}, },
function (error: any) { function (error: any) {
localStorage.removeItem("user-info"); localStorage.removeItem("AdminToken");
router.push("/login"); router.push("/login");
return Promise.reject(error); return Promise.reject(error);
} }

View File

@ -1,10 +0,0 @@
import axios from "@/api";
// 登录
export const LoginAPI = (data: any) => {
return axios({
url: "store/store.php?action=Login",
method: "post",
data
});
};

View File

@ -0,0 +1,20 @@
import axios from "@/api";
// 登录
export const loginAPI = (data: any) => {
return axios({
url: "/mock/login",
method: "post",
data
});
};
// 获取用户信息
export const getUserInfoAPI = () => {
return axios({
url: "/mock/user/info",
method: "get"
});
};

View File

@ -1,7 +1,7 @@
import { createProdMockServer } from "vite-plugin-mock/es/createProdMockServer"; import { createProdMockServer } from "vite-plugin-mock/es/createProdMockServer";
import testModule from "./test/index"; import testModule from "./test/index";
// import userModule from './user/index' import userModule from "./user/index";
// import tableModule from './person/index' // import tableModule from './person/index'
// import systemModule from './system/index' // import systemModule from './system/index'
// import fileModule from './file/index' // import fileModule from './file/index'
@ -9,5 +9,5 @@ import testModule from "./test/index";
// import areaModule from './area/index' // import areaModule from './area/index'
export function setupProdMockServer() { export function setupProdMockServer() {
createProdMockServer([...testModule]); createProdMockServer([...testModule, ...userModule]);
} }

View File

@ -5,7 +5,7 @@ export default [
{ {
url: "/mock/test/success", url: "/mock/test/success",
method: "get", method: "get",
timeout: 500, timeout: 300,
response: () => { response: () => {
return resultSuccess("mock数据成功了"); return resultSuccess("mock数据成功了");
} }
@ -13,7 +13,7 @@ export default [
{ {
url: "/mock/test/fail", url: "/mock/test/fail",
method: "get", method: "get",
timeout: 500, timeout: 300,
response: () => { response: () => {
return resultError(null, "请求数据出错了", 500); return resultError(null, "请求数据出错了", 500);
} }

31
src/mock/user/index.ts Normal file
View File

@ -0,0 +1,31 @@
import type { MockMethod } from "vite-plugin-mock";
import { resultSuccess, resultError } from "../_utils";
// post请求body,get请求query
export default [
{
url: "/mock/login",
method: "post",
timeout: 300,
response: ({ body }) => {
let { username, password } = body;
if (username === "admin" && password === "123456") {
// 请求成功返回token
return resultSuccess({ token: "Your-Token" });
}
return resultError(null, "账号或者密码错误", 500);
}
},
{
url: "/mock/user/info",
method: "get",
timeout: 300,
response: () => {
let data = {
username: "admin", // 用户名
roles: ["admin"] // 角色
};
return resultSuccess(data);
}
}
] as MockMethod[];

View File

@ -39,16 +39,16 @@ const router = createRouter({
router.beforeEach(async (to, from, next) => { router.beforeEach(async (to, from, next) => {
NProgress.start(); // 开启进度条 NProgress.start(); // 开启进度条
const store = useUserInfoStore(pinia); const store = useUserInfoStore(pinia);
const { token } = storeToRefs(store); const { AdminToken } = storeToRefs(store);
console.log("去", to, "来自", from); console.log("去", to, "来自", from);
// next()内部加了path等于跳转指定路由会再次触发router.beforeEach内部无参数等于放行不会触发router.beforeEach // next()内部加了path等于跳转指定路由会再次触发router.beforeEach内部无参数等于放行不会触发router.beforeEach
if (to.path === "/login" && !token.value) { if (to.path === "/login" && !AdminToken.value) {
// 1、去登录页无token放行 // 1、去登录页无token放行
next(); next();
} else if (!token.value) { } else if (!AdminToken.value) {
// 2、没有token直接重定向到登录页 // 2、没有token直接重定向到登录页
next("/login"); next("/login");
} else if (to.path === "/login" && token.value) { } else if (to.path === "/login" && AdminToken.value) {
// 3、去登录页有token直接重定向到home页 // 3、去登录页有token直接重定向到home页
next("/home"); next("/home");
// 项目内的跳转,处理跳转路由高亮 // 项目内的跳转,处理跳转路由高亮

View File

@ -12,18 +12,18 @@ export const useUserInfoStore = defineStore("user-info", {
username: "", username: "",
roles: [] roles: []
}, // 账号信息 }, // 账号信息
token: "" // token AdminToken: "" // token
}), }),
actions: { actions: {
async setAccount(data: Array<string>) { async setAccount(data: Array<string>) {
this.account = data; this.account = data;
}, },
async setToken(data: string) { async setToken(data: string) {
this.token = data; this.AdminToken = data;
}, },
async logOut() { async logOut() {
this.account = {}; this.account = {};
this.token = ""; this.AdminToken = "";
} }
}, },
persist: persistedstateConfig("user-info") persist: persistedstateConfig("user-info")

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="banner_box"> <div class="banner_box">
<div class="banner_title"> <div class="banner_title">
<SvgIcon name="snow" size="25" @click="onMock" /> <SvgIcon name="snow" size="25" />
{{ title }} {{ title }}
</div> </div>
<div class="banner_img"> <div class="banner_img">
@ -10,15 +10,8 @@
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { mockTestAPI } from "@/api/modules/test/index";
// title // title
const title = import.meta.env.VITE_GLOB_APP_TITLE; const title = import.meta.env.VITE_GLOB_APP_TITLE;
const onMock = async () => {
console.log("模拟数据");
let res = await mockTestAPI();
console.log("数据在这", res);
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -41,6 +41,7 @@
import { Message } from "@arco-design/web-vue"; import { Message } from "@arco-design/web-vue";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import { useUserInfoStore } from "@/store/modules/user-info"; import { useUserInfoStore } from "@/store/modules/user-info";
import { loginAPI, getUserInfoAPI } from "@/api/modules/user/index";
const router = useRouter(); const router = useRouter();
const form = ref({ const form = ref({
@ -54,30 +55,12 @@ const rules = ref({
{ {
required: true, required: true,
message: "请输入账号" message: "请输入账号"
},
{
validator: (value: string, cb: any) => {
if (value !== verify.value.username) {
cb("请输入正确的账号");
} else {
cb();
}
}
} }
], ],
password: [ password: [
{ {
required: true, required: true,
message: "请输入密码" message: "请输入密码"
},
{
validator: (value: string, cb: any) => {
if (value !== verify.value.password) {
cb("请输入正确的密码");
} else {
cb();
}
}
} }
], ],
verifyCode: [ verifyCode: [
@ -87,7 +70,7 @@ const rules = ref({
}, },
{ {
validator: (value: string, cb: any) => { validator: (value: string, cb: any) => {
if (value !== verify.value.verifyCode) { if (value !== verifyCode.value) {
cb("请输入正确的验证码"); cb("请输入正确的验证码");
} else { } else {
cb(); cb();
@ -96,26 +79,16 @@ const rules = ref({
} }
] ]
}); });
const verify = ref({ const verifyCode = ref("");
username: "admin", const verifyCodeChange = (code: string) => (verifyCode.value = code);
password: "123456",
verifyCode: ""
});
const verifyCodeChange = (code: string) => (verify.value.verifyCode = code);
const onSubmit = async ({ errors }: any) => { const onSubmit = async ({ errors }: any) => {
if (errors) return; if (errors) return;
// let res = await loginAPI(form.value);
// ......
// -
let stores = useUserInfoStore(); let stores = useUserInfoStore();
let account = { stores.setToken(res.data.token);
username: form.value.username, // let account = await getUserInfoAPI();
roles: ["admin"] // stores.setAccount(account.data); //
};
stores.setAccount(account); //
stores.setToken("Your-Token");
Message.success("登录成功"); Message.success("登录成功");
router.replace("/home"); router.replace("/home");
}; };

1
src/vite-env.d.ts vendored
View File

@ -16,3 +16,4 @@ declare module "@codemirror/lang-vue";
declare module "nprogress"; declare module "nprogress";
declare module "@wangeditor/editor-for-vue"; declare module "@wangeditor/editor-for-vue";
declare module "@/directives/modules/custom"; declare module "@/directives/modules/custom";
declare module "mockjs";