softleader-nuxt-core 1.0.5 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/config/app.ts +49 -0
- package/core/config/build.ts +12 -0
- package/core/config/components.ts +35 -0
- package/core/config/css.ts +20 -0
- package/core/config/features.ts +52 -0
- package/core/config/i18n.ts +52 -0
- package/core/config/imports.ts +28 -0
- package/core/config/layout.ts +156 -0
- package/core/config/modules.ts +54 -0
- package/core/config/nitro.ts +52 -0
- package/core/config/runtime.ts +62 -0
- package/core/config/security/README.md +381 -0
- package/core/config/security/headers.ts +71 -0
- package/core/config/security/index.ts +14 -0
- package/core/config/security/messages.ts +47 -0
- package/core/config/security/options.ts +94 -0
- package/core/config/theme-tokens.ts +276 -0
- package/core/config/typescript.ts +16 -0
- package/core/config/vite.ts +33 -0
- package/core/options/common.ts +69 -0
- package/core/options/modules/geography.ts +57 -0
- package/core/options/modules/index.ts +1 -0
- package/core/options/registry.ts +21 -0
- package/core/options/types.ts +144 -0
- package/core/sidebar/buildSidebar.ts +108 -0
- package/core/sidebar/registry.ts +6 -0
- package/package.json +8 -1
- package/router/flows/onboardingFlow.ts +6 -0
- package/router/routes-scanner.ts +79 -0
- package/scripts/package-filter.mjs +141 -0
- package/scripts/product-loader.ts +82 -0
- package/scripts/reindex_lessons.js +95 -0
- package/stores/app.ts +84 -0
- package/stores/common.ts +33 -0
- package/stores/features.ts +43 -0
- package/stores/sidebar.ts +47 -0
- package/stores/user.ts +57 -0
- package/tsconfig.json +3 -0
- package/types/api.d.ts +21 -0
- package/types/api.ts +34 -0
- package/types/nuxt-shim.d.ts +27 -0
- package/types/runtime.d.ts +23 -0
- package/types/svg.d.ts +21 -0
- package/utils/api/error.ts +16 -0
- package/utils/api/interceptors/request.ts +56 -0
- package/utils/api/interceptors/response.ts +59 -0
- package/utils/common/useDeepClone.ts +10 -0
- package/utils/config/table-action-btns.ts +47 -0
- package/utils/security/blur.ts +171 -0
- package/utils/security/index.ts +7 -0
- package/utils/security/mask.ts +199 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { NuxtConfig } from 'nuxt/schema'
|
|
2
|
+
import { productConfig } from '../../scripts/product-loader'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* App 設定檔案
|
|
6
|
+
*
|
|
7
|
+
* 主要用途:
|
|
8
|
+
* - 定義 APP 的基本資訊(標題、描述、圖示等)
|
|
9
|
+
* - 設定 HTML <head> 標籤內容
|
|
10
|
+
* - 設定 SEO 相關的 meta 標籤
|
|
11
|
+
*
|
|
12
|
+
* @see https://nuxt.com/docs/api/nuxt-config#app
|
|
13
|
+
*/
|
|
14
|
+
export const appConfig: NuxtConfig['app'] = {
|
|
15
|
+
head: {
|
|
16
|
+
/** 網頁標題 - 顯示在瀏覽器分頁上 */
|
|
17
|
+
title: productConfig.meta?.title || 'Nuxt 3 Development Kit',
|
|
18
|
+
|
|
19
|
+
/** 標題模板 - 用於動態設定頁面標題,%s 會被替換成頁面標題
|
|
20
|
+
* @example 產品列表 - Nuxt 3 Kit
|
|
21
|
+
*/
|
|
22
|
+
titleTemplate: '%s - Nuxt 3 Kit',
|
|
23
|
+
|
|
24
|
+
/** HTML 語言屬性 */
|
|
25
|
+
htmlAttrs: {
|
|
26
|
+
lang: 'zh-TW'
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
// Meta 標籤
|
|
30
|
+
meta: [
|
|
31
|
+
{ charset: 'utf-8' },
|
|
32
|
+
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
|
|
33
|
+
{
|
|
34
|
+
name: 'description',
|
|
35
|
+
content:
|
|
36
|
+
productConfig.meta?.description ||
|
|
37
|
+
'Enterprise-grade Nuxt 3 Development Kit - Streamlining your frontend development'
|
|
38
|
+
},
|
|
39
|
+
{ name: 'author', content: 'Demo App' },
|
|
40
|
+
{ name: 'robots', content: 'index, follow' }, // SEO:允許搜尋引擎索引
|
|
41
|
+
{ name: 'format-detection', content: 'telephone=no' }
|
|
42
|
+
],
|
|
43
|
+
|
|
44
|
+
// 網站圖示
|
|
45
|
+
link: [
|
|
46
|
+
{ rel: 'icon', type: 'image/x-icon', href: productConfig.meta?.favicon || '/favicon.ico' }
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { NuxtConfig } from 'nuxt/schema'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 元件設定
|
|
5
|
+
*
|
|
6
|
+
* 控制 Vue 元件的自動註冊和命名規則
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* // components/user/Profile.vue → <Profile />(去掉路徑前綴)
|
|
11
|
+
* // components/form/Input.vue → <FormInput />(強制加上 Form 前綴)
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* @see https://nuxt.com/docs/api/nuxt-config#components
|
|
15
|
+
*/
|
|
16
|
+
export const componentsConfig: NuxtConfig['components'] = [
|
|
17
|
+
/**
|
|
18
|
+
* 一般元件:去掉路徑前綴
|
|
19
|
+
*
|
|
20
|
+
* 讓 `components/user/Profile.vue` 變成 `<Profile />` 而不是 `<UserProfile />`
|
|
21
|
+
*
|
|
22
|
+
* 優點:名稱簡短
|
|
23
|
+
* 缺點:需注意不同資料夾下的同名檔案衝突
|
|
24
|
+
*/
|
|
25
|
+
{ path: './components', pathPrefix: false }
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 表單元件:強制加上 Form 前綴
|
|
29
|
+
*
|
|
30
|
+
* 讓 `components/form/Input.vue` 變成 `<FormInput />`
|
|
31
|
+
*
|
|
32
|
+
* 優點:避免與 HTML 原生標籤衝突,且語意明確
|
|
33
|
+
*/
|
|
34
|
+
// { path: '~/components/form/', prefix: 'Form' }
|
|
35
|
+
]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { NuxtConfig } from 'nuxt/schema'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* CSS 設定
|
|
5
|
+
*
|
|
6
|
+
* 定義全域 CSS 檔案的載入順序
|
|
7
|
+
* 這些 CSS 會在所有頁面中自動載入
|
|
8
|
+
*
|
|
9
|
+
* 載入順序很重要:
|
|
10
|
+
* 1. 先載入框架樣式(Vuetify)
|
|
11
|
+
* 2. 再載入自訂樣式(main.css)
|
|
12
|
+
*
|
|
13
|
+
* 這樣可以確保自訂樣式能覆蓋框架的預設樣式
|
|
14
|
+
*
|
|
15
|
+
* @see https://nuxt.com/docs/api/nuxt-config#css
|
|
16
|
+
*/
|
|
17
|
+
export const cssConfig: NuxtConfig['css'] = [
|
|
18
|
+
// 使用相對路徑以確保 Layer 正確解析
|
|
19
|
+
'./assets/css/main.css'
|
|
20
|
+
]
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 功能開關設定
|
|
3
|
+
*
|
|
4
|
+
* 這個檔案定義了系統中所有可用的功能開關。
|
|
5
|
+
* 不同的前端專案或客戶可以根據需求啟用或停用特定功能。
|
|
6
|
+
*
|
|
7
|
+
* @module config/features
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export interface FeatureConfig {
|
|
11
|
+
/** 功能是否啟用 */
|
|
12
|
+
enabled: boolean
|
|
13
|
+
/** 功能描述 */
|
|
14
|
+
description: string
|
|
15
|
+
/** 對應的環境變數名稱 (可選) */
|
|
16
|
+
envKey?: string
|
|
17
|
+
/** 建議使用的環境 (development, staging, production, all) */
|
|
18
|
+
environments?: ('development' | 'staging' | 'production' | 'all')[]
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface FeatureFlags {
|
|
22
|
+
/** 開發工具相關功能 */
|
|
23
|
+
devTools: {
|
|
24
|
+
/** 自動產生函式歷史記錄文件 */
|
|
25
|
+
historyGeneration: FeatureConfig
|
|
26
|
+
/** API Mock 功能 */
|
|
27
|
+
apiMock: FeatureConfig
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* 預設功能開關設定
|
|
33
|
+
*
|
|
34
|
+
* 可以透過環境變數覆蓋這些預設值
|
|
35
|
+
* 環境變數格式: NUXT_PUBLIC_FEATURE_<CATEGORY>_<FEATURE_NAME>=true|false
|
|
36
|
+
*/
|
|
37
|
+
export const defaultFeatures: FeatureFlags = {
|
|
38
|
+
devTools: {
|
|
39
|
+
historyGeneration: {
|
|
40
|
+
enabled: true,
|
|
41
|
+
description: '自動產生函式歷史記錄文件,追蹤業務邏輯演進',
|
|
42
|
+
envKey: 'NUXT_PUBLIC_FEATURE_HISTORY_GENERATION',
|
|
43
|
+
environments: ['development', 'staging']
|
|
44
|
+
},
|
|
45
|
+
apiMock: {
|
|
46
|
+
enabled: true,
|
|
47
|
+
description: '開發環境使用 Mock API 數據',
|
|
48
|
+
envKey: 'NUXT_PUBLIC_FEATURE_API_MOCK',
|
|
49
|
+
environments: ['development']
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* i18n 國際化設定
|
|
3
|
+
*
|
|
4
|
+
* 使用 @nuxtjs/i18n 模組進行多語言管理
|
|
5
|
+
* - 支援英文 (en) 與繁體中文 (zh)
|
|
6
|
+
* - 預設語言為繁體中文
|
|
7
|
+
* - 自動偵測瀏覽器語言
|
|
8
|
+
*/
|
|
9
|
+
export const i18nConfig = {
|
|
10
|
+
/**
|
|
11
|
+
* 支援的語言清單
|
|
12
|
+
*/
|
|
13
|
+
locales: [
|
|
14
|
+
{
|
|
15
|
+
code: 'en',
|
|
16
|
+
name: 'English',
|
|
17
|
+
iso: 'en-US', // ISO 語言代碼 (Language Code) + 地區代碼 (Country Code)
|
|
18
|
+
file: 'en-US.json' // 對應檔案路徑:i18n/locales/en-US.json
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
code: 'zh',
|
|
22
|
+
name: '中文',
|
|
23
|
+
iso: 'zh-TW', // ISO 語言代碼 (Language Code) + 地區代碼 (Country Code)
|
|
24
|
+
file: 'zh-TW.json' // 對應檔案路徑:i18n/locales/zh-TW.json
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 預設語言
|
|
30
|
+
*/
|
|
31
|
+
defaultLocale: 'zh',
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* 語言檔存放目錄
|
|
35
|
+
*/
|
|
36
|
+
langDir: 'locales/',
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 路由策略
|
|
40
|
+
* prefix_except_default: 預設語言不加前綴,其他語言加前綴
|
|
41
|
+
*/
|
|
42
|
+
strategy: 'no_prefix',
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* 瀏覽器語言偵測設定
|
|
46
|
+
*/
|
|
47
|
+
detectBrowserLanguage: {
|
|
48
|
+
useCookie: true,
|
|
49
|
+
cookieKey: 'i18n_redirected',
|
|
50
|
+
redirectOn: 'root' // 只在根目錄偵測並重定向
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { NuxtConfig } from 'nuxt/schema'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 自動引入設定
|
|
5
|
+
*
|
|
6
|
+
* 控制哪些資料夾下的檔案可以自動引入,不需要手動 import
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* // utils/global/formatDate.ts
|
|
11
|
+
* export function formatDate(date) { ... }
|
|
12
|
+
*
|
|
13
|
+
* // 在任何檔案中直接使用,不用 import
|
|
14
|
+
* formatDate(new Date()) // ✅ 自動可用
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @see https://nuxt.com/docs/api/nuxt-config#imports
|
|
18
|
+
*/
|
|
19
|
+
export const importsConfig: NuxtConfig['imports'] = {
|
|
20
|
+
/**
|
|
21
|
+
* 自動引入的資料夾清單
|
|
22
|
+
*
|
|
23
|
+
* - `utils/global`:全域工具,自動引入(無需 import)
|
|
24
|
+
* - `utils` 根目錄:Nuxt 預設強制自動引入
|
|
25
|
+
* - `utils/xxx`(子目錄):預設不會引入,需手動 import
|
|
26
|
+
*/
|
|
27
|
+
dirs: ['utils/global', 'stores']
|
|
28
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 選單項目介面
|
|
3
|
+
* 用於定義 Header 和 Sidebar 的選單項目
|
|
4
|
+
*/
|
|
5
|
+
export interface MenuItem {
|
|
6
|
+
/** 選單項目標題 */
|
|
7
|
+
title?: string
|
|
8
|
+
/** Material Design Icons 圖示名稱(例如:'mdi-home') */
|
|
9
|
+
icon?: string
|
|
10
|
+
/** 路由路徑(用於導覽) */
|
|
11
|
+
to?: string
|
|
12
|
+
/** 動作名稱(用於觸發事件,例如:'logout') */
|
|
13
|
+
action?: string
|
|
14
|
+
/** 是否為分隔線 */
|
|
15
|
+
divider?: boolean
|
|
16
|
+
/** 顏色(例如:'primary', 'error') */
|
|
17
|
+
color?: string
|
|
18
|
+
/** 徽章文字 */
|
|
19
|
+
badge?: string
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Layout 設定介面
|
|
24
|
+
* 定義整個應用程式的版面設定
|
|
25
|
+
*
|
|
26
|
+
* 此設定支援熱重載(HMR),修改後會自動更新 UI
|
|
27
|
+
* 設定儲存在 stores/app.ts 中,可透過 useAppStore() 存取
|
|
28
|
+
*/
|
|
29
|
+
export interface LayoutConfig {
|
|
30
|
+
/** 品牌設定 - 顯示在 Sidebar 頂部 */
|
|
31
|
+
branding: {
|
|
32
|
+
/** Logo 設定 */
|
|
33
|
+
logo: {
|
|
34
|
+
/** Material Design Icons 圖示名稱(例如:'mdi-rocket-launch') */
|
|
35
|
+
icon: string
|
|
36
|
+
/** Logo 圖片 URL(選填,優先於 icon) */
|
|
37
|
+
image?: string
|
|
38
|
+
}
|
|
39
|
+
/** 企業主標題 */
|
|
40
|
+
title: string
|
|
41
|
+
/** 企業副標題 */
|
|
42
|
+
subtitle: string
|
|
43
|
+
}
|
|
44
|
+
/** Header(頂部導覽列)設定 */
|
|
45
|
+
header: {
|
|
46
|
+
/** 是否顯示 Header */
|
|
47
|
+
visible: boolean
|
|
48
|
+
/** Header 高度(像素) */
|
|
49
|
+
height: number
|
|
50
|
+
/** 是否顯示麵包屑導覽 */
|
|
51
|
+
breadcrumbs: boolean
|
|
52
|
+
/** 是否顯示搜尋框 */
|
|
53
|
+
search: boolean
|
|
54
|
+
/** 搜尋框的 placeholder 文字 */
|
|
55
|
+
searchPlaceholder: string
|
|
56
|
+
/** 是否顯示通知鈴鐺 */
|
|
57
|
+
notifications: boolean
|
|
58
|
+
/** 使用者選單設定 */
|
|
59
|
+
userMenu: {
|
|
60
|
+
/** 是否顯示使用者選單 */
|
|
61
|
+
visible: boolean
|
|
62
|
+
/** 選單項目清單 */
|
|
63
|
+
items: MenuItem[]
|
|
64
|
+
}
|
|
65
|
+
/** 是否顯示主題切換按鈕(明/暗模式) */
|
|
66
|
+
themeToggle: boolean
|
|
67
|
+
/** Header 右側的額外動作按鈕 */
|
|
68
|
+
actions: MenuItem[]
|
|
69
|
+
}
|
|
70
|
+
/** Sidebar(側邊欄)設定 */
|
|
71
|
+
sidebar: {
|
|
72
|
+
/** 是否顯示 Sidebar */
|
|
73
|
+
visible: boolean
|
|
74
|
+
/** Sidebar 寬度(像素) */
|
|
75
|
+
width: number
|
|
76
|
+
/** 是否可摺疊 */
|
|
77
|
+
collapsible: boolean
|
|
78
|
+
/** 主選單標題文字 */
|
|
79
|
+
mainMenuTitle: string
|
|
80
|
+
}
|
|
81
|
+
/** Footer(頁尾)設定 */
|
|
82
|
+
footer: {
|
|
83
|
+
/** 是否顯示 Footer */
|
|
84
|
+
visible: boolean
|
|
85
|
+
/** 是否固定在底部(fixed positioning) */
|
|
86
|
+
fixed: boolean
|
|
87
|
+
/** Footer 顯示的文字內容 */
|
|
88
|
+
content: string
|
|
89
|
+
}
|
|
90
|
+
/** 主題設定 */
|
|
91
|
+
theme: {
|
|
92
|
+
/** 預設主題模式 */
|
|
93
|
+
defaultTheme: 'light' | 'dark'
|
|
94
|
+
/** 主要顏色(HEX 格式,例如:'#1976D2') */
|
|
95
|
+
primaryColor: string
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* 預設 Layout 設定
|
|
101
|
+
*
|
|
102
|
+
* 定義應用程式的預設版面設定
|
|
103
|
+
* 此設定會在應用程式啟動時載入到 stores/app.ts
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```typescript
|
|
107
|
+
* // 在元件中使用
|
|
108
|
+
* const appStore = useAppStore()
|
|
109
|
+
* console.log(appStore.config.branding.title) // 'Demo App Framework'
|
|
110
|
+
* ```
|
|
111
|
+
*
|
|
112
|
+
* @see {@link LayoutConfig} 完整的設定介面定義
|
|
113
|
+
*/
|
|
114
|
+
export const defaultLayoutConfig: LayoutConfig = {
|
|
115
|
+
branding: {
|
|
116
|
+
logo: {
|
|
117
|
+
icon: 'mdi-rocket-launch'
|
|
118
|
+
},
|
|
119
|
+
title: 'Demo App Framework',
|
|
120
|
+
subtitle: 'Enterprise Framework'
|
|
121
|
+
},
|
|
122
|
+
header: {
|
|
123
|
+
visible: true,
|
|
124
|
+
height: 64,
|
|
125
|
+
breadcrumbs: true,
|
|
126
|
+
search: true,
|
|
127
|
+
searchPlaceholder: '搜尋全站...',
|
|
128
|
+
notifications: true,
|
|
129
|
+
userMenu: {
|
|
130
|
+
visible: true,
|
|
131
|
+
items: [
|
|
132
|
+
{ title: '個人設定', icon: 'mdi-account-cog', action: 'profile' },
|
|
133
|
+
{ title: '系統設定', icon: 'mdi-cog', action: 'settings' },
|
|
134
|
+
{ divider: true },
|
|
135
|
+
{ title: '登出系統', icon: 'mdi-logout', action: 'logout', color: 'error' }
|
|
136
|
+
]
|
|
137
|
+
},
|
|
138
|
+
themeToggle: true,
|
|
139
|
+
actions: []
|
|
140
|
+
},
|
|
141
|
+
sidebar: {
|
|
142
|
+
visible: true,
|
|
143
|
+
width: 280,
|
|
144
|
+
collapsible: true,
|
|
145
|
+
mainMenuTitle: '主選單'
|
|
146
|
+
},
|
|
147
|
+
footer: {
|
|
148
|
+
visible: true,
|
|
149
|
+
fixed: false,
|
|
150
|
+
content: 'Copyright © 2026 Demo App. All rights reserved.'
|
|
151
|
+
},
|
|
152
|
+
theme: {
|
|
153
|
+
defaultTheme: 'light',
|
|
154
|
+
primaryColor: '#1976D2'
|
|
155
|
+
}
|
|
156
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import fs from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { createResolver } from '@nuxt/kit'
|
|
4
|
+
import type { NuxtConfig } from 'nuxt/schema'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 檢查套件是否已安裝 (存在於 package.json)
|
|
8
|
+
* @param name
|
|
9
|
+
*/
|
|
10
|
+
const isInstalled = (name: string) => {
|
|
11
|
+
try {
|
|
12
|
+
// 使用 import.meta.url 取得目前檔案路徑,並解析到 layer 的 package.json
|
|
13
|
+
const resolver = createResolver(import.meta.url)
|
|
14
|
+
const pkgPath = resolver.resolve('../../package.json')
|
|
15
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))
|
|
16
|
+
return !!(pkg.dependencies?.[name] || pkg.devDependencies?.[name])
|
|
17
|
+
} catch {
|
|
18
|
+
return false
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Nuxt 模組設定
|
|
24
|
+
*
|
|
25
|
+
* 定義專案中「全域通用」的第三方模組
|
|
26
|
+
* 這些模組無論在哪個產品 (Product) 都會被載入
|
|
27
|
+
*/
|
|
28
|
+
export const modulesConfig: NuxtConfig['modules'] = [
|
|
29
|
+
// 裝置偵測 (手機/平板/桌機)
|
|
30
|
+
// 裝置偵測 (手機/平板/桌機)
|
|
31
|
+
isInstalled('@nuxtjs/device') && '@nuxtjs/device',
|
|
32
|
+
|
|
33
|
+
// 國際化多語系支援
|
|
34
|
+
isInstalled('@nuxtjs/i18n') && '@nuxtjs/i18n',
|
|
35
|
+
|
|
36
|
+
// 狀態管理工具 (取代 Vuex) [Core Provided]
|
|
37
|
+
'@pinia/nuxt',
|
|
38
|
+
|
|
39
|
+
// ESLint 整合 (程式碼品質檢查)
|
|
40
|
+
isInstalled('@nuxt/eslint') && '@nuxt/eslint',
|
|
41
|
+
|
|
42
|
+
// Ant Design Vue 整合
|
|
43
|
+
// 雖然在 devDependencies 但在 monorepo 中通常可用,改為檢查是否可解析比較保險,或是保持 isInstalled
|
|
44
|
+
isInstalled('@ant-design-vue/nuxt') && '@ant-design-vue/nuxt',
|
|
45
|
+
|
|
46
|
+
// Tailwind CSS 整合
|
|
47
|
+
isInstalled('@nuxtjs/tailwindcss') && '@nuxtjs/tailwindcss',
|
|
48
|
+
|
|
49
|
+
// 圖示模組 [Core Provided]
|
|
50
|
+
'@nuxt/icon',
|
|
51
|
+
|
|
52
|
+
// 字體模組 [Core Provided]
|
|
53
|
+
'@nuxt/fonts'
|
|
54
|
+
].filter(Boolean) as string[]
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { NuxtConfig } from 'nuxt/schema'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Nitro 伺服器設定檔案
|
|
5
|
+
*
|
|
6
|
+
* 主要用途:
|
|
7
|
+
* - 關於伺服器引擎的相關設定
|
|
8
|
+
* - 部署相關設定 (Deployment)
|
|
9
|
+
* - 輸出資源壓縮優化 (Compression)
|
|
10
|
+
*
|
|
11
|
+
* @see https://nitro.unjs.io/config
|
|
12
|
+
*/
|
|
13
|
+
export const nitroConfig: NuxtConfig['nitro'] = {
|
|
14
|
+
/**
|
|
15
|
+
* 壓縮 Public Assets
|
|
16
|
+
*
|
|
17
|
+
* 開啟後,Nuxt 會在建置時自動產生 .gz 與 .br 壓縮檔
|
|
18
|
+
* 有助於減少傳輸流量並提升載入速度
|
|
19
|
+
*/
|
|
20
|
+
compressPublicAssets: true,
|
|
21
|
+
|
|
22
|
+
typescript: {
|
|
23
|
+
tsConfig: {
|
|
24
|
+
compilerOptions: {
|
|
25
|
+
composite: true,
|
|
26
|
+
emitDeclarationOnly: true,
|
|
27
|
+
noEmit: false
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 開發環境代理 (Development Proxy)
|
|
34
|
+
*
|
|
35
|
+
* 僅在 `npm run dev` 模式下生效
|
|
36
|
+
* 用於解決本機開發時的 CORS 跨域問題,或將 API 請求轉發到後端測試主機
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* devProxy: {
|
|
40
|
+
* '/api': {
|
|
41
|
+
* target: 'https://dev-api.example.com',
|
|
42
|
+
* changeOrigin: true,
|
|
43
|
+
* }
|
|
44
|
+
* }
|
|
45
|
+
*/
|
|
46
|
+
devProxy: {
|
|
47
|
+
'/api': {
|
|
48
|
+
target: process.env.NUXT_PROXY_TARGET || 'http://localhost:8080',
|
|
49
|
+
changeOrigin: true
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { productConfig } from '../../scripts/product-loader'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Runtime Configuration
|
|
5
|
+
*
|
|
6
|
+
* 這裡定義了所有的環境變數與設定值。
|
|
7
|
+
* 結構分為 private (根層級) 和 public (public 屬性內)。
|
|
8
|
+
*/
|
|
9
|
+
export const runtimeConfig = {
|
|
10
|
+
// --- 私密區 (Server Only) ---
|
|
11
|
+
// npm run generate 私密區並無作用
|
|
12
|
+
|
|
13
|
+
// --- 公開區 (Client & Server) ---
|
|
14
|
+
public: {
|
|
15
|
+
// 應用程式相關設定
|
|
16
|
+
app: {
|
|
17
|
+
// 當前執行環境 (development, production, test)
|
|
18
|
+
env: process.env.NODE_ENV,
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
|
|
22
|
+
* App 識別字串 (User-Agent)
|
|
23
|
+
* 用於判斷網頁是否在 App 的 Webview 中開啟
|
|
24
|
+
*/
|
|
25
|
+
uaIdentifier: process.env.NUXT_PUBLIC_APP_UA_IDENTIFIER || 'MyApp',
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 產品設定檔注入
|
|
29
|
+
* 將 YAML 讀取到的設定 (如 modules 列表) 注入到前端。
|
|
30
|
+
* 這樣前端頁面也能知道目前啟用哪些模組,或讀取產品特定的 UI 設定。
|
|
31
|
+
* 注意:這是 Build Time 決定的,Runtime 無法動態改變 YAML 內容。
|
|
32
|
+
*/
|
|
33
|
+
productConfig
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
// 資安模式開關(預設關閉)
|
|
37
|
+
enableSecurityMode: process.env.NUXT_PUBLIC_ENABLE_SECURITY_MODE === 'true',
|
|
38
|
+
|
|
39
|
+
// API 連線相關設定
|
|
40
|
+
api: {
|
|
41
|
+
// API 伺服器的基礎路徑 (Base URL)
|
|
42
|
+
baseUrl: process.env.VITE_API_BASE_URL,
|
|
43
|
+
// 請求超時時間 (毫秒),預設 30 秒
|
|
44
|
+
timeout: Number(process.env.VITE_API_TIMEOUT) || 30000,
|
|
45
|
+
// 請求失敗後的自動重試次數,預設 0 次 (不重試)
|
|
46
|
+
retry: Number(process.env.VITE_API_RETRY_COUNT) || 0,
|
|
47
|
+
// 是否預設開啟全域 Loading 條 (上方藍色進度條)
|
|
48
|
+
globalLoading: true
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
// 身分認證相關設定
|
|
52
|
+
auth: {
|
|
53
|
+
// 儲存 Token 的 Cookie 名稱
|
|
54
|
+
tokenKey: 'auth_token',
|
|
55
|
+
// Token 的有效期限 (秒),預設 7 天
|
|
56
|
+
maxAge: 60 * 60 * 24 * 7
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
// Mock API 開關 (預設開啟以進行展示)
|
|
60
|
+
featureApiMock: true
|
|
61
|
+
}
|
|
62
|
+
}
|