* 媒体库增加分类,图库多选择时优化。

* 重构 JWT token 生成,使用 `New()` 函数代替直接创建实例

* 上传组件支持查看大图 (#1982)

* 将参数缓存,媒体库增加分类,图库多选择时优化。 (#1978)

* 媒体库增加分类,图库多选择时优化。

*修复文件上传进度显示bug&按钮样式优化 (#1986)

* fix:添加内部 iframe 展示网页,优化 permission 代码

* 俩个uuid库合并一个,更新库到当前版本。

* 优化关于我们界面

* feat: 个人中心头像调整,媒体库兼容性调整。

* feat: 自动化代码前端页面美化,多余按钮收入专家模式

* feat: 增加单独生成server功能

* feat: 限制单独生成前后端的情况下的细节配置

* feat: 修复全选失败报错的问题

---------

Co-authored-by: task <121913992@qq.com>
Co-authored-by: Feng.YJ <32027253+huiyifyj@users.noreply.github.com>
Co-authored-by: will0523 <dygsunshine@163.com>
Co-authored-by: task <ms.yangdan@gmail.com>
Co-authored-by: sslee <57312216+GIS142857@users.noreply.github.com>
Co-authored-by: bypanghu <bypanghu@163.com>
Co-authored-by: Azir <2075125282@qq.com>
Co-authored-by: piexlMax(奇淼 <qimiaojiangjizhao@gmail.com>
Co-authored-by: krank <emosick@qq.com>
This commit is contained in:
PiexlMax(奇淼
2025-02-13 15:25:10 +08:00
committed by GitHub
co-authored by task Feng.YJ will0523 task sslee bypanghu Azir piexlMax(奇淼 krank
parent ea39d83907
commit d40c815760
61 changed files with 2288 additions and 1529 deletions
+105 -96
View File
@@ -4,134 +4,143 @@ import getPageTitle from '@/utils/page'
import router from '@/router'
import Nprogress from 'nprogress'
import 'nprogress/nprogress.css'
Nprogress.configure({ showSpinner: false, ease: 'ease', speed: 500 })
const whiteList = ['Login', 'Init']
// 配置 NProgress
Nprogress.configure({
showSpinner: false,
ease: 'ease',
speed: 500
})
const getRouter = async (userStore) => {
const routerStore = useRouterStore()
await routerStore.SetAsyncRouter()
await userStore.GetUserInfo()
const asyncRouters = routerStore.asyncRouters
asyncRouters.forEach((asyncRouter) => {
router.addRoute(asyncRouter)
})
}
// 白名单路由
const WHITE_LIST = ['Login', 'Init']
const removeLoading = () => {
const element = document.getElementById('gva-loading-box')
if (element) {
element.remove()
// 处理路由加载
const setupRouter = async (userStore) => {
try {
const routerStore = useRouterStore()
await Promise.all([routerStore.SetAsyncRouter(), userStore.GetUserInfo()])
routerStore.asyncRouters.forEach((route) => router.addRoute(route))
return true
} catch (error) {
console.error('Setup router failed:', error)
return false
}
}
async function handleKeepAlive(to) {
if (to.matched.some((item) => item.meta.keepAlive)) {
if (to.matched && to.matched.length > 2) {
for (let i = 1; i < to.matched.length; i++) {
const element = to.matched[i - 1]
if (element.name === 'layout') {
to.matched.splice(i, 1)
await handleKeepAlive(to)
}
// 如果没有按需加载完成则等待加载
if (typeof element.components.default === 'function') {
await element.components.default()
await handleKeepAlive(to)
}
// 移除加载动画
const removeLoading = () => {
const element = document.getElementById('gva-loading-box')
element?.remove()
}
// 处理组件缓存
const handleKeepAlive = async (to) => {
if (!to.matched.some((item) => item.meta.keepAlive)) return
if (to.matched?.length > 2) {
for (let i = 1; i < to.matched.length; i++) {
const element = to.matched[i - 1]
if (element.name === 'layout') {
to.matched.splice(i, 1)
await handleKeepAlive(to)
continue
}
if (typeof element.components.default === 'function') {
await element.components.default()
await handleKeepAlive(to)
}
}
}
}
// 处理路由重定向
const handleRedirect = (to, userStore) => {
if (router.hasRoute(userStore.userInfo.authority.defaultRouter)) {
return { ...to, replace: true }
}
return { path: '/layout/404' }
}
// 路由守卫
router.beforeEach(async (to, from) => {
const routerStore = useRouterStore()
Nprogress.start()
const userStore = useUserStore()
to.meta.matched = [...to.matched]
handleKeepAlive(to)
const routerStore = useRouterStore()
const token = userStore.token
// 在白名单中的判断情况
Nprogress.start()
// 处理元数据和缓存
to.meta.matched = [...to.matched]
await handleKeepAlive(to)
// 设置页面标题
document.title = getPageTitle(to.meta.title, to)
if (to.meta.client) {
return true
}
if (whiteList.indexOf(to.name) > -1) {
if (token) {
if (!routerStore.asyncRouterFlag && whiteList.indexOf(from.name) < 0) {
await getRouter(userStore)
}
// token 可以解析但是却是不存在的用户 id 或角色 id 会导致无限调用
if (userStore.userInfo?.authority?.defaultRouter != null) {
if (router.hasRoute(userStore.userInfo.authority.defaultRouter)) {
return { name: userStore.userInfo.authority.defaultRouter }
} else {
return { path: '/layout/404' }
}
} else {
// 强制退出账号
userStore.ClearStorage()
return {
name: 'Login',
query: {
redirect: document.location.hash
}
}
}
} else {
return true
// 白名单路由处理
if (WHITE_LIST.includes(to.name)) {
if (
token &&
!routerStore.asyncRouterFlag &&
!WHITE_LIST.includes(from.name)
) {
await setupRouter(userStore)
}
} else {
// 不在白名单中并且已经登录的时候
if (token) {
if (sessionStorage.getItem('needToHome') === 'true') {
sessionStorage.removeItem('needToHome')
return { path: '/' }
}
// 添加flag防止多次获取动态路由和栈溢出
if (!routerStore.asyncRouterFlag && whiteList.indexOf(from.name) < 0) {
await getRouter(userStore)
if (userStore.token) {
if (router.hasRoute(userStore.userInfo.authority.defaultRouter)) {
return { ...to, replace: true }
} else {
return { path: '/layout/404' }
}
} else {
return {
name: 'Login',
query: { redirect: to.href }
}
}
} else {
if (to.matched.length) {
return true
} else {
return { path: '/layout/404' }
}
}
return true
}
// 需要登录的路由处理
if (token) {
// 处理需要跳转到首页的情况
if (sessionStorage.getItem('needToHome') === 'true') {
sessionStorage.removeItem('needToHome')
return { path: '/' }
}
// 不在白名单中并且未登录的时候
if (!token) {
// 处理异步路由
if (!routerStore.asyncRouterFlag && !WHITE_LIST.includes(from.name)) {
const setupSuccess = await setupRouter(userStore)
if (setupSuccess && userStore.token) {
return handleRedirect(to, userStore)
}
return {
name: 'Login',
query: {
redirect: document.location.hash
}
query: { redirect: to.href }
}
}
return to.matched.length ? true : { path: '/layout/404' }
}
// 未登录跳转登录页
return {
name: 'Login',
query: {
redirect: document.location.hash
}
}
})
// 路由加载完成
router.afterEach(() => {
// 路由加载完成后关闭进度条
document.getElementsByClassName('main-cont main-right')[0]?.scrollTo(0, 0)
document.querySelector('.main-cont.main-right')?.scrollTo(0, 0)
Nprogress.done()
})
router.onError(() => {
// 路由发生错误后销毁进度条
// 路由错误处理
router.onError((error) => {
console.error('Router error:', error)
Nprogress.remove()
})
// 移除初始加载动画
removeLoading()