refactor(ui): Migrate router guard from env.js to routes.js

- Move beforeEnter router guard logic from env.js to routes.js export function
    - Update $env references to $mod in env.js, ico.html, and layout/default.html
    - Export routes as function that receives $mod context for dependency injection
    - Remove router guard from env.js initialization module
master
veypi 4 weeks ago
parent d987ac2fac
commit 6552ebf832

@ -1,63 +1,27 @@
import VBase from './vbase.js' import VBase from './vbase.js'
export default async ($env) => { export default async ($mod) => {
// Load i18n // Load i18n
try { try {
const langs = await (await fetch($env.scoped + '/langs.json')).json() const langs = await (await fetch($mod.scoped + '/langs.json')).json()
$env.$i18n.load(langs) $mod.$i18n.load(langs)
} catch (e) { } catch (e) {
console.error('Failed to load langs.json', e) console.error('Failed to load langs.json', e)
} }
// Initialize VBase Service // Initialize VBase Service
const vbase = new VBase('vb', $env.scoped); // Relative path const vbase = new VBase('vb', $mod.scoped); // Relative path
$env.$vbase = vbase; $mod.$vbase = vbase;
// Wrap Axios: add auth header // Wrap Axios: add auth header
vbase.wrapAxios($env.$axios); vbase.wrapAxios($mod.$axios);
$env.$axios.interceptors.response.use(function(response) { $mod.$axios.interceptors.response.use(function(response) {
return response?.data return response?.data
}, function(error) { }, function(error) {
let data = error.response ? error.response.data : error.response let data = error.response ? error.response.data : error.response
return Promise.reject(data?.message || data); return Promise.reject(data?.message || data);
}); });
// Router Guard
$env.$router.beforeEnter = async (to, from, next) => {
const isAuth = to.meta && to.meta.auth;
const roles = to.meta && to.meta.roles; // Array of required roles
if (isAuth) {
if (vbase.isExpired()) {
try {
await vbase.refresh();
} catch (e) {
vbase.logout('/login?redirect=' + encodeURIComponent(to.fullPath));
return false;
}
}
if (!vbase.user) {
try {
await vbase.fetchUser();
} catch (e) {
vbase.logout('/login?redirect=' + encodeURIComponent(to.fullPath));
return false;
}
}
// Permission Check
if (to.meta.perm) {
if (!vbase.PermAdmin(to.meta.perm)) {
console.warn('Access denied: requires permission', to.meta.perm);
$env.$router.push('/403');
return false;
}
}
}
next();
};
} }

@ -45,13 +45,14 @@
</v-dropdown> </v-dropdown>
</div> </div>
<div v-else> <div v-else>
<v-btn size="sm" variant="ghost" :click="() => $router.push('/login')" style="color: inherit; border-color: currentColor;"> <v-btn size="sm" variant="ghost" :click="() => $router.push('/login')"
style="color: inherit; border-color: currentColor;">
登录 登录
</v-btn> </v-btn>
</div> </div>
</body> </body>
<script setup> <script setup>
user = $env.$vbase.user; user = $mod.$vbase.user;
dropdownItems = [ dropdownItems = [
{label: "个人中心", value: "profile"}, {label: "个人中心", value: "profile"},
{label: "退出登录", value: "logout", divided: true} {label: "退出登录", value: "logout", divided: true}
@ -61,7 +62,7 @@
if (val === 'profile') { if (val === 'profile') {
$router.push('/profile'); $router.push('/profile');
} else if (val === 'logout') { } else if (val === 'logout') {
$env.$vbase.logout(); $mod.$vbase.logout();
} }
}; };
</script> </script>

@ -123,7 +123,7 @@
</body> </body>
<script setup> <script setup>
collapsed = false; collapsed = false;
user = $env.$vbase.user; user = $mod.$vbase.user;
// Define Menu Items // Define Menu Items
menuItems = [ menuItems = [

@ -35,4 +35,42 @@ const routes = [
{ path: '*', component: '/page/404.html' } { path: '*', component: '/page/404.html' }
] ]
export default routes export default ({ $mod }) => ({
routes: routes,
beforeEnter: async (to, from, next) => {
const isAuth = to.meta && to.meta.auth;
const roles = to.meta && to.meta.roles; // Array of required roles
const vbase = $mod.$vbase
if (isAuth) {
if (vbase.isExpired()) {
try {
await vbase.refresh();
} catch (e) {
vbase.logout('/login?redirect=' + encodeURIComponent(to.fullPath));
return false;
}
}
if (!vbase.user) {
try {
await vbase.fetchUser();
} catch (e) {
vbase.logout('/login?redirect=' + encodeURIComponent(to.fullPath));
return false;
}
}
// Permission Check
if (to.meta.perm) {
if (!vbase.PermAdmin(to.meta.perm)) {
console.warn('Access denied: requires permission', to.meta.perm);
$mod.$router.push('/403');
return false;
}
}
}
next();
}
})

Loading…
Cancel
Save