diff --git a/docs/add-page-example.md b/docs/add-page-example.md index fcd9a95..b5c4063 100644 --- a/docs/add-page-example.md +++ b/docs/add-page-example.md @@ -7,9 +7,9 @@ 目前新增一般頁面的預設資料流: ```txt -router -> view -> (page driver) -> page component -> sections/items - ↓ - store/composable -> service +router -> view -> sections/items + ↓ + composable -> store -> service ``` Page driver 不是必備層:若頁面邏輯只有簡單的 `computed` page model(無搜尋、無 dialog、無複雜事件協調),直接在 view 裡寫即可,不需要建立 page driver。 @@ -22,7 +22,6 @@ Page driver 不是必備層:若頁面邏輯只有簡單的 `computed` page mod - - - - {{ page.title }} - - - - 名稱 - 負責單位 - 操作 - - - - - {{ row.title }} - {{ row.owner }} - - - 開啟 - - - - - - - -``` - 若畫面是固定的「篩選條件 + 查詢按鈕 + 結果表格」,優先使用 `components/sections/SectionQueryPage.vue`。若是「表單欄位 + 送出/存檔按鈕」,優先使用 `components/sections/SectionFormPage.vue`。 -## 3. 加入 route +## 2. 加入 route route 加在 `src/router/routes.ts` 的 `routes` 陣列中,並放在 `/:pathMatch(.*)*` catch-all route 前面。 @@ -125,7 +79,7 @@ route 加在 `src/router/routes.ts` 的 `routes` 陣列中,並放在 `/:pathMa - 新功能若使用後端選單,優先調整後端選單資料或對應 API mock,不要把頁面專屬選單邏輯塞進 layout。 - 若只是新增 route,通常不需要修改 `MainLayout.vue` 或 `src/shell/*`。 -## 4. 需要 API 時新增 service module +## 3. 需要 API 時新增 service module ```ts // src/services/modules/reports.ts @@ -148,7 +102,7 @@ service 只封裝 HTTP 細節,不持有 UI 狀態。 `httpClient` 的 `baseURL` 來自 `VITE_API_BASE_URL`,沒有設定時預設 `/service/api`。開發模式下,Vite proxy 會將 `/service/*` 轉送到 `VITE_PROXY_TARGET`。 -## 5. 需要共享狀態時新增 store +## 4. 需要共享狀態時新增 store 只有跨頁共享、需要快取、或全域狀態才新增 store。單頁暫時狀態留在 view、component 或 composable。 @@ -180,7 +134,7 @@ export const useReportsStore = defineStore('reports', () => { }) ``` -## 6. 驗證 +## 5. 驗證 至少執行: diff --git a/docs/architecture-strategy.md b/docs/architecture-strategy.md index 42fbc28..7ee804f 100644 --- a/docs/architecture-strategy.md +++ b/docs/architecture-strategy.md @@ -24,17 +24,11 @@ Read only when needed: [analyse now](./analyse-now.md) │ App Shell │ │ (App.vue → Layout → Global Overlays: Snackbar/Dialogs) │ └──────────────────────────┬──────────────────────────────────┘ - │ page model (reactive) + │ reactive / props ▼ ┌─────────────────────────────────────────────────────────────┐ -│ Page Driver │ -│ (views/*.vue — 極薄,只負責:組裝 page model / 事件轉發) │ -└──────────────────────────┬──────────────────────────────────┘ - │ props / emits - ▼ -┌─────────────────────────────────────────────────────────────┐ -│ Page Component │ -│ (PageXxx.vue — 組裝完整頁面,決定 Section 順序與 override) │ +│ View │ +│ (views/*.vue — 自含 page model、頁面 UI 與 section 組合) │ └──────────────────────────┬──────────────────────────────────┘ │ section data ▼ @@ -58,7 +52,7 @@ Read only when needed: [analyse now](./analyse-now.md) ### 3.2 Page Model 作為主要資料單位 - **新增 `src/models/page.ts`**:定義各頁面的統一介面。 -- View 的職責從「管理資料 + 管理狀態 + 組裝模板」縮減為「呼叫 usePageDriver() 取得 page model,傳給 Page component」。 +- View 的職責從「管理資料 + 管理狀態 + 組裝模板」縮減為「呼叫 composable 取得 page model,組裝 section 元件」。 - Page model 可以來自: - store(已有快取) - service(直接 API) @@ -130,15 +124,11 @@ src/ │ ├── GlobalOverlays.vue ← snackbar、確認 dialog、toast │ └── AppTabs.vue ← 頁籤(從 App.vue 抽出) │ -├── views/ ← 維持:Page Driver(極薄) +├── views/ ← 維持:自含頁面,邏輯與 UI 同檔 │ └── maint/ -│ └── SingleRecord.vue ← ~50 行:組裝 pageModel + 掛載 PageMaintDriver +│ └── SingleRecord.vue ← ~50 行:組裝 pageModel + MaintShell 外殼 │ ├── components/ -│ ├── pages/ ← 新增:Page Component 層 -│ │ ├── PageMaintenance.vue -│ │ └── PageReport.vue -│ │ │ ├── sections/ ← 新增:Section / Shelf 層 │ │ ├── SectionSearchPanel.vue │ │ ├── SectionDataTable.vue @@ -193,10 +183,10 @@ src/ ```vue @@ -204,31 +194,25 @@ const { pageModel, commands, formPanelProps, formPanelEvents } = useSingleRecord ``` -#### Layer 3: Page Component(`src/components/pages/`) +#### Layer 3: View(`src/views/`) -- **職責**:組裝完整頁面的 section 順序、處理 page-level slot override、分發頁面級事件。 -- **命名**:一律 `Page` 前綴。 -- **對齊**:App Store 的 `ProductPage.svelte`、`TodayPage.svelte`、`DefaultPage.svelte`。 +- **職責**:自含頁面的完整入口 — 組裝 page model、協調 composable、撰寫頁面 template。 +- **禁止**:頁面 UI 不再拆到另一個 page component 層。 +- **對齊**:標準 Vue SPA 慣例。 ```vue - - - - - - - - - - + + + + + + ... + ``` @@ -343,7 +327,7 @@ views/xxx.vue - `src/shell/GlobalOverlays.vue`:snackbar、搜尋 dialog、訊息 dialog。 3. [x] 新增 `src/components/pages/`:建立第一個 `PageMaintenance.vue`(可從 `PageMaint.vue` 擴展)。 - 定義 `MaintenancePageModel` props 與 `create/edit/view/delete/search` emits。 - - 使用 `PageMaint.vue` 作為佈局外殼,搜尋與表格區塊以 slot 開放,不綁定特定領域型別。 + - 使用 `MaintShell.vue` 作為佈局外殼,搜尋與表格區塊以 slot 開放,不綁定特定領域型別。 4. [x] 新增 `src/composables/page-drivers/`:建立第一個 page driver 範例。 - 協調搜尋條件、分頁與 `pageModel`。 - 提供 `load()` 與 `resetSearch()` 供 Page Driver 呼叫。 @@ -399,7 +383,11 @@ views/xxx.vue 2. [x] `App.vue` 最終只保留 shell 掛載。 - `src/App.vue` 縮減為 7 行,只掛載 `AppShell`。 - `src/shell/AppShell.vue` 承接 layout 切換、layout props/events、breadcrumb actions、tabs router-view 與 `GlobalOverlays` 掛載。 - - `src/composables/layout/useAppShell.ts` 承接 menu 合併、favorite、breadcrumb、layout action、手動/強制登出流程。 + - `src/composables/layout/useAppShell.ts` 承接 menu 合併、favorite、breadcrumb、layout action、手動/強制登出流程。 + +### Phase 5:移除 Page Component 層 ✅ 已完成 + +> 所有 page component 已合併回對應的 view,`src/components/pages/` 目錄已刪除。page driver 簡化為僅複雜頁面才使用的選配層,view 回歸標準 Vue SPA 慣例:自含 page model + 頁面 UI + section 組合。 --- @@ -408,8 +396,7 @@ views/xxx.vue | 層級 | 目錄 | 檔名前綴/範例 | |------|------|---------------| | App Shell | `src/shell/` | `AppShell.vue`、`GlobalOverlays.vue` | -| Page Driver | `src/views/` | `SingleRecord.vue`(route view,不改名) | -| Page Component | `src/components/pages/` | `PageMaintenance.vue` | +| View(自含頁面) | `src/views/` | `SingleRecord.vue` | | Section / Shelf | `src/components/sections/` | `SectionDataTable.vue`、`SectionSearchPanel.vue` | | Item / Atom | `src/components/items/` | `ItemDataRow.vue`、`ItemFormField.vue` | | Layout | `src/components/layouts/` | `MainLayout.vue`(維持) | @@ -425,7 +412,7 @@ views/xxx.vue ## 七、對齊檢查清單(新增/重構時使用) -- [ ] 這個 view 超過 100 行了嗎?→ 考慮抽出 Page Component。 +- [ ] 這個 view 超過 200 行了嗎?→ 考慮抽出 Section 或 composable。 - [ ] 這個元件知道自己是水平捲軸還是網格嗎?→ Item 層不該知道,移到 Section 層。 - [ ] 這個 dialog 定義在 view 裡嗎?→ 抽出到 SectionFormPanel。 - [ ] 這個元件直接呼叫 `studentStore.updateStudent()` 嗎?→ 改為觸發 command 或 emit event。 diff --git a/docs/llm-development-guide.md b/docs/llm-development-guide.md index b9db877..00dc504 100644 --- a/docs/llm-development-guide.md +++ b/docs/llm-development-guide.md @@ -10,7 +10,7 @@ 1. `src/GUIDE.md` 2. `docs/architecture-strategy.md` -3. 依 `maintenanceContract.pageKind` 閱讀對應的 `src/**/GUIDE.md`(查 `src/GUIDE.md` 中的「依 pageKind 選擇起點」表格) +3. 依 `maintenanceContract.pageKind` 閱讀對應的 demo 與 `src/**/GUIDE.md`(查 `docs/architecture-strategy.md` 的分層說明) 4. `docs/add-page-example.md`(需要新增頁面時) `frontend-layering.md` 是歷史參考,後續以 `docs/architecture-strategy.md` 與 `src/**/GUIDE.md` 為準。 @@ -40,7 +40,6 @@ 一般功能需求優先修改: - `src/views/*` -- `src/components/pages/*` - `src/components/sections/*` - `src/components/items/*` - `src/composables/page-drivers/*` @@ -72,7 +71,7 @@ - 是否碰到 template core。 - 是否已有同類型範例可沿用。 - 是否需要新增 route。 -- 是否應拆成 page / section / item。 +- 是否應拆成 section / item。 - 是否應新增 page driver 或 command composable。 - 是否需要 store,或只需要頁面內 state。 - 是否應定義新的 model 型別(`src/models/`)。 @@ -97,11 +96,13 @@ ### query(查詢頁)→ `SectionQueryPage` -參考:`src/views/demos/SectionQueryPageDemo.vue`、`src/components/pages/PageSectionQueryPageDemo.vue`、`src/composables/page-drivers/useSectionsDemoPage.ts` +參考:`src/views/demos/SectionQueryPageDemo.vue`、`src/composables/page-drivers/useSectionsDemoPage.ts` 架構: ``` -View (薄層) → composable (page driver) → PageSectionQueryPageDemo → SectionQueryPage +View(自含 page model + UI) → SectionQueryPage + ↓ + composable (page driver) ``` **composable 必須回傳:** @@ -124,11 +125,13 @@ View (薄層) → composable (page driver) → PageSectionQueryPageDemo → Sect ### application(申請/表單頁)→ `SectionFormPage` -參考:`src/views/demos/SectionFormPageDemo.vue`、`src/components/pages/PageSectionFormPageDemo.vue` +參考:`src/views/demos/SectionFormPageDemo.vue` 架構: ``` -View (薄層) → composable (page driver) → PageSectionFormPageDemo → SectionFormPage +View(自含 page model + UI) → SectionFormPage + ↓ + composable (page driver) ``` **composable 必須回傳:** @@ -145,11 +148,6 @@ View (薄層) → composable (page driver) → PageSectionFormPageDemo → Secti - `apiCatalog.fieldRules` 中的 `field` 與 `rule` 決定必填、長度、格式驗證 - 型別轉換依 `field.type`:number 欄位不可包成 string 送出 -**page component emits:** -- `@submit` → 呼叫 `handleFormSubmit` -- `@reset` → 呼叫 `resetForm` -- `@back` → 呼叫 `handleFormBack` - ### maintenance(維護/CRUD 頁)→ `maint/*` 參考:`src/views/maint/README.md` — 依資料結構選擇最接近的範本(EditableGrid / SingleRecord / MasterDetail A/B/C) diff --git a/src/GUIDE.md b/src/GUIDE.md index cd4a774..8cb86a6 100644 --- a/src/GUIDE.md +++ b/src/GUIDE.md @@ -57,8 +57,7 @@ router -> AppShell -> layout -> view -> Section -> Item - `views/FncPage.vue` - `views/Settings.vue` - `views/maint/*` -- `components/PageIndex.vue` -- `components/PageMaint.vue` +- `components/MaintShell.vue` - `components/maint/*` - `components/sections/*` - `components/items/*` diff --git a/src/README.md b/src/README.md index 00fc500..931eed2 100644 --- a/src/README.md +++ b/src/README.md @@ -84,7 +84,7 @@ Layout composables: `src/router/routes.ts` 是功能開發時可新增 route 的入口,但不要改壞既有 layout meta、auth meta 與 catch-all route 規則。 -登入 route 入口是 `src/views/Login.vue`。若只是調整登入畫面內容,優先修改 `src/components/PageLogin.vue` 與 `src/components/login/*`。 +登入 route 入口是 `src/views/Login.vue`。若只是調整登入畫面內容,優先修改 `src/views/Login.vue` 與 `src/components/login/*`。 `src/services/modules/auth.ts` 與 `src/services/modules/menu.ts` 是預設後端契約的 API adapter。接新後端時常需要調整,但不要把 UI 狀態放進 service module。 @@ -93,11 +93,11 @@ Layout composables: 以下內容偏向示範資料與範例頁,建立新專案時可依需求替換或刪除: - `src/views/Home.vue` -- `src/components/PageIndex.vue` + - `src/views/maint/*` - `src/components/maint/*` - `src/composables/maint/*` -- `src/components/PageMaint.vue` +- `src/components/MaintShell.vue` - `src/stores/students.ts` - `src/stores/semesters.ts` - `src/views/FncPage.vue` diff --git a/src/components/GUIDE.md b/src/components/GUIDE.md index 519bce5..b4ad7ec 100644 --- a/src/components/GUIDE.md +++ b/src/components/GUIDE.md @@ -9,7 +9,7 @@ - `layouts/`:App Shell 層的 layout 元件。詳見 `src/components/layouts/GUIDE.md`。 - `base/`:真正跨頁共用的基礎元件。詳見 `src/components/base/GUIDE.md`。 -`PageMaint.vue` 是 maintenance 頁面的通用外殼元件,放在 `src/components/` 頂層。 +`MaintShell.vue` 是 maintenance 頁面的通用外殼元件,放在 `src/components/` 頂層。 ## 規則 diff --git a/src/components/PageMaint.vue b/src/components/MaintShell.vue similarity index 100% rename from src/components/PageMaint.vue rename to src/components/MaintShell.vue diff --git a/src/components/PageIndex.vue b/src/components/PageIndex.vue deleted file mode 100644 index 467d6cb..0000000 --- a/src/components/PageIndex.vue +++ /dev/null @@ -1,234 +0,0 @@ - - - - - - 👋 - - - 歡迎使用校務資訊系統 - - 使用頂部搜尋框快速找到功能,或從左側選單瀏覽所有系統模組 - - - - - - 📰 最新消息 - - - - - - - - - {{ resolveNewsItem(wrapped).date }} - {{ resolveNewsItem(wrapped).month }} - - - - {{ resolveNewsItem(wrapped).title }} - - NEW - - - - {{ resolveNewsItem(wrapped).desc }} - - - - - {{ resolveNewsItem(wrapped).dept }} - - - - {{ resolveNewsItem(wrapped).views }} 次瀏覽 - - - - - - - - - - - - - - ✉️ - - - 訊息中心 - 12 筆未讀 - - - 查看全部 → - - - - 🚀 快速存取 - - - - {{ item.icon }} - {{ item.title }} - - - - - - - - - - - {{ props.selectedNews.title }} - - - {{ props.selectedNews.month }} {{ props.selectedNews.date }} · - {{ props.selectedNews.dept }} · {{ props.selectedNews.views }} 次瀏覽 - - - {{ props.selectedNews.desc }} - - - - 關閉 - - - - - - - - - - diff --git a/src/components/PageLogin.vue b/src/components/PageLogin.vue deleted file mode 100644 index 919303f..0000000 --- a/src/components/PageLogin.vue +++ /dev/null @@ -1,548 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - {{ mobileAnnouncementBannerText }} - - - {{ props.mobileAnnouncement.viewAllText }} - - - - - - - - - - - - - - - - - Copyright © {{ new Date().getFullYear() }} {{ props.branding.organization }} - - - - - - - - - - - - - - - - - - - - Copyright © {{ new Date().getFullYear() }} {{ props.branding.organization }} - - - - - - - - {{ props.mobileAnnouncement.listTitle }} - - - - {{ item.content }} - - {{ item.title }} ・ {{ item.createdAt }} - - - - {{ props.mobileAnnouncement.emptyText }} - - - - - {{ props.mobileAnnouncement.closeText }} - - - - - - - - - - diff --git a/src/composables/useLoginAnnouncements.ts b/src/composables/useLoginAnnouncements.ts index 8239cdc..38394c4 100644 --- a/src/composables/useLoginAnnouncements.ts +++ b/src/composables/useLoginAnnouncements.ts @@ -143,6 +143,8 @@ export function useLoginAnnouncements(options: UseLoginAnnouncementsOptions) { schoolHeader: '公告學校', titleHeader: '公告標題', paginationLabel: '總筆數:', + allTabLabel: '全部', + emptyText: '目前沒有公告資料', })) const selectedAnnouncement = computed(() => { diff --git a/src/views/GUIDE.md b/src/views/GUIDE.md index 22264b2..93578c5 100644 --- a/src/views/GUIDE.md +++ b/src/views/GUIDE.md @@ -29,15 +29,15 @@ const pageModel = computed(() => ({ title: '我的頁面' })) ```vue - + ... - + ``` @@ -45,14 +45,14 @@ const { pageModel, search, handleSave, ... } = useXxxPage() ## Login.vue 開關 -`Login.vue` 是登入頁的組合層,登入頁功能開關集中在 view 內宣告,再透過 `PageLogin` / composable 往下傳遞,不在子元件各自決定是否啟用。 +`Login.vue` 是登入頁的完整入口,登入頁功能開關集中在 view 內宣告,透過 composable 往下傳遞,不在子元件各自決定是否啟用。 - `withCaptcha`:控制驗證碼 UI、captcha API 載入/刷新,以及登入 payload 是否帶 captcha 資料。關閉時不應發出 captcha API,也不應檢查或送出 captcha 欄位。 - `withAnnouncement`:控制公告 UI、公告 mock data/composable 資料流與公告詳情互動。關閉時公告板、手機公告列與公告對話框資料來源都應停用。 - `withForgotPassword`:控制忘記密碼連結與事件。關閉時 UI 不顯示,也不應觸發忘記密碼事件。 - `withRememberAccount`:控制記住帳號 UI 與 localStorage 讀寫。關閉時不顯示 checkbox、不讀寫記住帳號 storage,送出資料固定視為未記住帳號。 -新增登入頁選配功能時,優先維持同樣模式:view 宣告開關、composable 負責資料流與 side effect、page/form component 只依 props 呈現 UI 與發出事件。 +新增登入頁選配功能時,優先維持同樣模式:view 宣告開關、composable 負責資料流與 side effect、form component 只依 props 呈現 UI 與發出事件。 ## 子目錄 diff --git a/src/views/Home.vue b/src/views/Home.vue index 5f75877..c10f4da 100644 --- a/src/views/Home.vue +++ b/src/views/Home.vue @@ -1,18 +1,203 @@ - + + + + + 👋 + + + 歡迎使用校務資訊系統 + + 使用頂部搜尋框快速找到功能,或從左側選單瀏覽所有系統模組 + + + + + + 📰 最新消息 + + + + + + + {{ resolveNewsItem(wrapped).date }} + {{ resolveNewsItem(wrapped).month }} + + + + {{ resolveNewsItem(wrapped).title }} + + NEW + + + + {{ resolveNewsItem(wrapped).desc }} + + + + + {{ resolveNewsItem(wrapped).dept }} + + + + {{ resolveNewsItem(wrapped).views }} 次瀏覽 + + + + + + + + + + + + + + ✉️ + + + 訊息中心 + 12 筆未讀 + + + 查看全部 → + + + + 🚀 快速存取 + + + + {{ item.icon }} + {{ item.title }} + + + + + + + + + + {{ selectedNews.title }} + + + {{ selectedNews.month }} {{ selectedNews.date }} · + {{ selectedNews.dept }} · {{ selectedNews.views }} 次瀏覽 + + + {{ selectedNews.desc }} + + + + 關閉 + + + + + + + diff --git a/src/views/Login.vue b/src/views/Login.vue index e57a465..d737307 100644 --- a/src/views/Login.vue +++ b/src/views/Login.vue @@ -1,63 +1,15 @@ - - - - - - {{ dialogTitle }} - {{ dialogMessage }} - - - - {{ t('common.ok') }} - - - - - - - - - {{ selectedAnnouncement?.title }} - - - {{ selectedAnnouncement?.date }} ・ {{ selectedAnnouncement?.school }} - - - {{ selectedAnnouncementDetail }} - - - - - 關閉 - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + {{ mobileAnnouncementBannerText }} + + + {{ mobileAnnouncement.viewAllText }} + + + + + + + + + + + + + + + + + Copyright © {{ new Date().getFullYear() }} {{ branding.organization }} + + + + + + + + + + + + + + + + + + + Copyright © {{ new Date().getFullYear() }} {{ branding.organization }} + + + + + + + + {{ mobileAnnouncement.listTitle }} + + + + {{ item.content }} + + {{ item.title }} ・ {{ item.createdAt }} + + + + {{ mobileAnnouncement.emptyText }} + + + + + {{ mobileAnnouncement.closeText }} + + + + + + + + + {{ dialogTitle }} + {{ dialogMessage }} + + + + {{ t('common.ok') }} + + + + + + + + + {{ selectedAnnouncement?.title }} + + + {{ selectedAnnouncement?.date }} ・ {{ selectedAnnouncement?.school }} + + + {{ selectedAnnouncementDetail }} + + + + + 關閉 + + + + + + + diff --git a/src/views/maint/GUIDE.md b/src/views/maint/GUIDE.md index 4b7defa..768c8e6 100644 --- a/src/views/maint/GUIDE.md +++ b/src/views/maint/GUIDE.md @@ -1,6 +1,6 @@ # Maintenance Views Guide -`views/maint` 是維護頁 demo。所有檔案都是自含的 route entry,UI 與流程直接在 view 中組合 `PageMaint`、`components/sections`、`components/items` 與 composable。 +`views/maint` 是維護頁 demo。所有檔案都是自含的 route entry,UI 與流程直接在 view 中組合 `MaintShell`、`components/sections`、`components/items` 與 composable。 ## 目前範本 diff --git a/src/views/maint/MasterDetailA.vue b/src/views/maint/MasterDetailA.vue index faf475c..4b06601 100644 --- a/src/views/maint/MasterDetailA.vue +++ b/src/views/maint/MasterDetailA.vue @@ -5,7 +5,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/PageMaint.vue' +import MaintShell from '@/components/MaintShell.vue' import SectionDataTable from '@/components/sections/SectionDataTable.vue' import SectionSearchPanel from '@/components/sections/SectionSearchPanel.vue' import { useMasterDetailAMaintenancePage } from '@/composables/page-drivers/useMasterDetailAMaintenancePage' @@ -20,7 +20,7 @@ const { - - + - - + - + 學號 @@ -173,7 +173,7 @@ - + @@ -511,7 +511,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/PageMaint.vue' +import MaintShell from '@/components/MaintShell.vue' import { useMaintenanceCrudFlow } from '@/composables/maint/useMaintenanceCrudFlow' import { useStudentMaintenanceForm } from '@/composables/maint/useStudentMaintenanceForm' import { type CourseRecord, type SemesterRecord, useSemesterStore } from '@/stores/semesters' diff --git a/src/views/maint/MasterDetailC.vue b/src/views/maint/MasterDetailC.vue index d1ed213..4abd33d 100644 --- a/src/views/maint/MasterDetailC.vue +++ b/src/views/maint/MasterDetailC.vue @@ -1,12 +1,12 @@ - - + - + 學號 @@ -173,7 +173,7 @@ - + @@ -498,7 +498,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/PageMaint.vue' +import MaintShell from '@/components/MaintShell.vue' import { useMaintenanceCrudFlow } from '@/composables/maint/useMaintenanceCrudFlow' import { useStudentMaintenanceForm } from '@/composables/maint/useStudentMaintenanceForm' import { type CourseRecord, type SemesterRecord, useSemesterStore } from '@/stores/semesters' diff --git a/src/views/maint/SingleRecord.vue b/src/views/maint/SingleRecord.vue index be975ae..d3311a7 100644 --- a/src/views/maint/SingleRecord.vue +++ b/src/views/maint/SingleRecord.vue @@ -1,5 +1,5 @@ - - +