feat: 新增消息模板聚合接口及通知类站内信邮箱状态更新功能

- 在 setting.js 中添加了消息模板聚合分页接口和更新通知类站内信邮箱渠道开关的功能。
- 在 axios.js 中重构了 token 刷新和登录重定向逻辑,避免循环依赖。
- 新增 router-holder.js 文件以延迟持有 router 实例,优化依赖管理。
- 更新 util.js 中的动态路由管理逻辑,确保在无 router 实例时不执行相关操作。
This commit is contained in:
田香琪
2026-07-01 11:41:49 +08:00
parent f4b17254ec
commit 2e5be29a43
5 changed files with 59 additions and 21 deletions

View File

@@ -196,3 +196,13 @@ export const verificationPage = (params) => {
export const getNoticeMessageDetail = (id, params) => {
return getRequest(`/setting/noticeMessage/${id}`, params)
}
// 消息模板聚合分页(站内信 + 微信服务号 + 小程序)
export const getMessageTemplateAggregatePage = params => {
return getRequest("/setting/noticeMessage/aggregate", params);
};
// 修改通知类站内信邮箱渠道开关
export const updateNoticeMessageEmailStatus = (id, status) => {
return putRequest(`/setting/noticeMessage/${id}/email/${status}`);
};

View File

@@ -1,9 +1,8 @@
import axios from "axios";
import { getStore, setStore } from "./storage.js";
import { router } from "../router/index";
import { getRouter } from "./router-holder";
import { Message } from "@/utils/message";
import Cookies from "js-cookie";
import { handleRefreshToken } from "../api/index";
import {v4 as uuidv4} from 'uuid';
// 统一请求路径前缀
@@ -23,6 +22,27 @@ const service = axios.create({
timeout: 8000,
baseURL: managerUrl
});
function refreshAccessToken(token) {
return service({
method: "get",
url: `/passport/user/refresh/${token}`,
});
}
function redirectToLogin(message) {
const router = getRouter();
Cookies.set("userInfoManager", "");
setStore("accessToken", "");
if (router && router.currentRoute.value.name !== "login") {
if (message) {
Message.error(message);
} else {
Message.error("未知错误,请重新登录");
}
router.push("/login");
}
}
var isRefreshToken = 0;
const refreshToken = getTokenDebounce();
service.interceptors.request.use(
@@ -65,17 +85,7 @@ service.interceptors.response.use(
break;
case 20004:
case 401:
// 未登录 清除已登录状态
Cookies.set("userInfoManager", "");
setStore("accessToken", "");
if (router.history.current.name != "login") {
if (data.message !== null) {
Message.error(data.message);
} else {
Message.error("未知错误,请重新登录");
}
router.push("/login");
}
redirectToLogin(data.message !== null ? data.message : null);
return data;
break;
case 500:
@@ -109,11 +119,11 @@ service.interceptors.response.use(
);
return service(error.response.config);
} else {
router.go(0);
const router = getRouter();
if (router) router.go(0);
}
} else {
Cookies.set("userInfoManager", "");
router.push("/login");
redirectToLogin(null);
}
isRefreshToken = 0;
}
@@ -135,7 +145,7 @@ function getTokenDebounce() {
if (!lock) {
lock = true;
let oldRefreshToken = getStore("refreshToken");
handleRefreshToken(oldRefreshToken)
refreshAccessToken(oldRefreshToken)
.then(res => {
if (res.success) {
let { accessToken, refreshToken } = res.result;
@@ -147,7 +157,7 @@ function getTokenDebounce() {
} else {
success = false;
lock = false;
router.push("/login");
redirectToLogin(null);
}
})
.catch(err => {

View File

@@ -0,0 +1,10 @@
/** 延迟持有 router 实例,避免 router ↔ util ↔ axios ↔ api 循环依赖 */
let routerInstance = null;
export function setRouter(router) {
routerInstance = router;
}
export function getRouter() {
return routerInstance;
}

View File

@@ -1,6 +1,5 @@
import { getCurrentPermissionList } from "@/api/index";
import lazyLoading from "./lazyLoading.js";
import { router } from "@/router/index";
import { getRouter } from "./router-holder";
import Cookies from "js-cookie";
let util = {};
@@ -9,6 +8,8 @@ let util = {};
util.dynamicRouteNames = [];
util.clearDynamicRoutes = function () {
const router = getRouter();
if (!router) return;
util.dynamicRouteNames.forEach((name) => {
if (router.hasRoute(name)) {
router.removeRoute(name);
@@ -44,6 +45,8 @@ util.collectLeafRoutes = function (routes, result = [], parentPath = "") {
/** Vue Router 4动态路由必须挂到 otherRouter 下,且刷新/热更新后需重新注册 */
util.registerDynamicRoutes = function (menuData, options = {}) {
const router = getRouter();
if (!router) return;
const { rematch = true } = options;
const pendingPath = router.currentRoute.value.fullPath;
const pendingUnmatched = router.currentRoute.value.matched.length === 0;
@@ -231,6 +234,7 @@ util.initRouter = function(vm) {
if (!vm.$store.state.app.added) {
// 第一次加载 读取数据
// 加载菜单
import("@/api/index").then(({ getCurrentPermissionList }) => {
getCurrentPermissionList().then(res => {
if (!res.success) return false;
let menuData = res.result;
@@ -262,6 +266,7 @@ util.initRouter = function(vm) {
window.localStorage.setItem("menuData", JSON.stringify(menuData));
vm.$store.commit("setAdded", true);
});
});
} else {
// 读取缓存数据
let data = window.localStorage.getItem("menuData");

View File

@@ -2,6 +2,7 @@ import { createRouter, createWebHistory } from "vue-router";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import Util from "../libs/util";
import { setRouter } from "../libs/router-holder";
import Cookies from "js-cookie";
import store from "@/store";
import { routers } from "./router";
@@ -13,6 +14,8 @@ export const router = createRouter({
routes: routers,
});
setRouter(router);
router.beforeEach((to, from, next) => {
NProgress.start();
Util.title(to.meta.title);