feat: refactor layouts and login components

This commit is contained in:
skytek_xinliang
2026-03-30 15:04:27 +08:00
parent f7413111c0
commit 79b20ded3b
21 changed files with 159 additions and 210 deletions
+5 -5
View File
@@ -185,8 +185,8 @@ import {
} from '@mdi/js'
import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import SKAdminLayout from '@/components/layouts/SKAdminLayout.vue'
import SKEmptyLayout from '@/components/layouts/SKEmptyLayout.vue'
import MainLayout from '@/components/layouts/MainLayout.vue'
import PlainLayout from '@/components/layouts/PlainLayout.vue'
import { HTTP_TOAST_EVENT } from './services/http-toast'
import { SESSION_FORCE_LOGOUT_EVENT } from './services/session'
import { useAuthStore } from './stores/auth'
@@ -238,13 +238,13 @@ const _menuItemsExample = [
* 佈局對映表
*/
const layoutMap = {
default: SKAdminLayout,
none: SKEmptyLayout,
default: MainLayout,
none: PlainLayout,
}
// 取得當前應使用的組件
const activeLayout = computed(() => {
return layoutMap[route.meta.layout] || SKAdminLayout
return layoutMap[route.meta.layout] || MainLayout
})
function buildMergedMenuItems(items) {
+6 -6
View File
@@ -225,12 +225,12 @@
<script setup lang="ts">
import { mdiBullhornVariantOutline } from '@mdi/js'
import { computed, ref } from 'vue'
import LoginAnnouncementBoard from './base/login/LoginAnnouncementBoard.vue'
import LoginBrand from './base/login/LoginBrand.vue'
import LoginForm from './base/login/LoginForm.vue'
import LoginHeader from './base/login/LoginHeader.vue'
import LoginToolBar from './base/login/LoginToolBar.vue'
import LoginVerify from './base/login/LoginVerify.vue'
import LoginAnnouncementBoard from './login/LoginAnnouncementBoard.vue'
import LoginBrand from './login/LoginBrand.vue'
import LoginForm from './login/LoginForm.vue'
import LoginHeader from './login/LoginHeader.vue'
import LoginToolBar from './login/LoginToolBar.vue'
import LoginVerify from './login/LoginVerify.vue'
interface BrandingConfig {
title?: string
-62
View File
@@ -1,62 +0,0 @@
<template>
<SKAdminLayout
:favorite-items="favoriteItems"
:favorites-config="favoritesConfig"
:menu-items="menuItems"
:system-title="systemTitle"
:theme-toggle-label="themeToggleLabel"
:logout-label="logoutLabel"
:features="features"
@logout="$emit('logout')"
@select="$emit('select', $event)"
>
<slot />
</SKAdminLayout>
</template>
<script setup lang="ts">
import type { AdminLayoutFavoritesConfig, AdminLayoutMenuItem } from './sk-admin-layout/types'
import { computed } from 'vue'
import SKAdminLayout from './SKAdminLayout.vue'
interface Props {
systemTitle?: string
themeToggleLabel?: string
logoutLabel?: string
favoriteHeaderLabel?: string
favoriteItems?: AdminLayoutMenuItem[]
menuItems?: AdminLayoutMenuItem[]
}
const props = withDefaults(defineProps<Props>(), {
systemTitle: '管理系統',
themeToggleLabel: '切換主題',
logoutLabel: '登出',
favoriteHeaderLabel: '我的最愛',
favoriteItems: () => [],
menuItems: () => [
{ title: '首頁', path: '/' },
{ title: '設定', path: '/settings' },
],
})
defineEmits<{
logout: []
select: [item: AdminLayoutMenuItem]
}>()
const features = {
showThemeToggle: true,
showFavorites: true,
showBreadcrumb: false,
showSearch: false,
showToolbarActions: false,
showUserInfo: false,
}
const favoritesConfig = computed<AdminLayoutFavoritesConfig>(() => ({
label: props.favoriteHeaderLabel,
addLabel: props.favoriteHeaderLabel,
showAdd: false,
}))
</script>
-39
View File
@@ -1,39 +0,0 @@
<template>
<SKAdminLayout
:menu-items="menuItems"
:system-title="systemTitle"
:features="features"
@select="$emit('select', $event)"
>
<slot />
</SKAdminLayout>
</template>
<script setup lang="ts">
import type { AdminLayoutMenuItem } from './sk-admin-layout/types'
import SKAdminLayout from './SKAdminLayout.vue'
withDefaults(
defineProps<{
systemTitle?: string
menuItems?: AdminLayoutMenuItem[]
}>(),
{
systemTitle: '簡潔模式',
menuItems: () => [],
}
)
defineEmits<{
select: [item: AdminLayoutMenuItem]
}>()
const features = {
showThemeToggle: false,
showFavorites: false,
showBreadcrumb: false,
showSearch: false,
showToolbarActions: false,
showUserInfo: false,
}
</script>
+1 -1
View File
@@ -429,7 +429,7 @@ import DetailSidePanel from '@/components/maint/master-detail/DetailSidePanel.vu
import MasterFileFormFields from '@/components/maint/MasterFileFormFields.vue'
import MntDialogCard from '@/components/maint/MntDialogCard.vue'
import MntRecordNavToolbar from '@/components/maint/MntRecordNavToolbar.vue'
import PageMaint from '@/components/maint/PageMaint.vue'
import PageMaint from '@/components/PageMaint.vue'
import { useMaintenanceCrudFlow } from '@/composables/maint/useMaintenanceCrudFlow'
import { useStudentMaintenanceForm } from '@/composables/maint/useStudentMaintenanceForm'
import { type SemesterRecord, useSemesterStore } from '@/stores/semesters'
+1 -1
View File
@@ -508,7 +508,7 @@ import DetailFullHeightPanel from '@/components/maint/master-detail/DetailFullHe
import MasterFileFormFields from '@/components/maint/MasterFileFormFields.vue'
import MntDialogCard from '@/components/maint/MntDialogCard.vue'
import MntRecordNavToolbar from '@/components/maint/MntRecordNavToolbar.vue'
import PageMaint from '@/components/maint/PageMaint.vue'
import PageMaint from '@/components/PageMaint.vue'
import { useMaintenanceCrudFlow } from '@/composables/maint/useMaintenanceCrudFlow'
import { useStudentMaintenanceForm } from '@/composables/maint/useStudentMaintenanceForm'
import { type CourseRecord, type SemesterRecord, useSemesterStore } from '@/stores/semesters'
+1 -1
View File
@@ -495,7 +495,7 @@ import DetailSimpleList from '@/components/maint/master-detail/DetailSimpleList.
import MasterFileFormFields from '@/components/maint/MasterFileFormFields.vue'
import MntDialogCard from '@/components/maint/MntDialogCard.vue'
import MntRecordNavToolbar from '@/components/maint/MntRecordNavToolbar.vue'
import PageMaint from '@/components/maint/PageMaint.vue'
import PageMaint from '@/components/PageMaint.vue'
import { useMaintenanceCrudFlow } from '@/composables/maint/useMaintenanceCrudFlow'
import { useStudentMaintenanceForm } from '@/composables/maint/useStudentMaintenanceForm'
import { type CourseRecord, type SemesterRecord, useSemesterStore } from '@/stores/semesters'
+1 -1
View File
@@ -504,7 +504,7 @@ import { useDisplay } from 'vuetify'
import ConfirmDialog from '@/components/maint/CommonConfirmDialog.vue'
import MntDialogCard from '@/components/maint/MntDialogCard.vue'
import MntRecordNavToolbar from '@/components/maint/MntRecordNavToolbar.vue'
import PageMaint from '@/components/maint/PageMaint.vue'
import PageMaint from '@/components/PageMaint.vue'
import { useMaintenanceCrudFlow } from '@/composables/maint/useMaintenanceCrudFlow'
import { useStudentMaintenanceForm } from '@/composables/maint/useStudentMaintenanceForm'
import { type StudentRecord, useStudentStore } from '@/stores/students'