xto-fronted 0.4.101 → 0.4.103

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.
Files changed (123) hide show
  1. package/dist/{index-C1j4f3mM.js → index-BlN5yXBT.js} +2 -2
  2. package/dist/{index-BKj-34y6.js → index-BsPaXQak.js} +2 -2
  3. package/dist/{index-CJSTBnGF.js → index-CNx4xpUG.js} +981 -971
  4. package/dist/{index-BK4Mut6H.js → index-DEChud2_.js} +2 -2
  5. package/dist/{index-B6s_uLJE.js → index-DdACCkye.js} +23 -23
  6. package/dist/index.js +1 -1
  7. package/dist/stores/app.d.ts +8 -2
  8. package/dist/stores/auth.d.ts +2 -2
  9. package/dist/style.css +1 -1
  10. package/package.json +94 -94
  11. package/src/App.vue +48 -48
  12. package/src/assets/styles/_dark.scss +639 -639
  13. package/src/assets/styles/_root.scss +183 -183
  14. package/src/assets/styles/_variables.scss +69 -69
  15. package/src/assets/styles/index.scss +460 -460
  16. package/src/components/Layout/Header.vue +1 -1
  17. package/src/components/Layout/MixTopMenu.vue +1185 -1185
  18. package/src/components/Layout/Sidebar.vue +229 -229
  19. package/src/components/Layout/SidebarMenuItem.vue +163 -163
  20. package/src/components/Layout/TopMenu.vue +1177 -1177
  21. package/src/components/Layout/index.vue +199 -199
  22. package/src/composables/useI18n.ts +43 -43
  23. package/src/index.ts +114 -100
  24. package/src/router/layoutRoute.ts +70 -70
  25. package/src/stores/app.ts +9 -0
  26. package/src/stores/index.ts +15 -15
  27. package/src/stores/locale.ts +66 -66
  28. package/src/types/json-bigint.d.ts +18 -18
  29. package/src/types/xto.d.ts +172 -172
  30. package/src/utils/request.ts +184 -184
  31. package/src/views/dashboard/index.vue +545 -545
  32. package/src/views/error/403.vue +251 -251
  33. package/src/views/error/404.vue +253 -253
  34. package/src/views/login/index.vue +586 -586
  35. package/src/views/system/menu/index.vue +690 -690
  36. package/src/views/system/role/index.vue +583 -583
  37. package/src/views/system/user/index.vue +655 -655
  38. package/dist/assets/404-C9Uh6Uu-.css +0 -1
  39. package/dist/assets/404-zjGLLssH.js +0 -1
  40. package/dist/assets/_plugin-vue_export-helper-DlAUqK2U.js +0 -1
  41. package/dist/assets/index-B5xc4gQB.css +0 -1
  42. package/dist/assets/index-BDgOY6Rp.js +0 -1
  43. package/dist/assets/index-BIoRANs0.js +0 -1
  44. package/dist/assets/index-BRR97dc6.js +0 -1
  45. package/dist/assets/index-Bz0BgZQ1.js +0 -1
  46. package/dist/assets/index-CAdztNsv.css +0 -1
  47. package/dist/assets/index-CCXrcISf.css +0 -1
  48. package/dist/assets/index-CfpZmcpk.css +0 -1
  49. package/dist/assets/index-CwJSA85U.js +0 -1
  50. package/dist/assets/index-CwRA10ac.js +0 -1
  51. package/dist/assets/index-D8NDxq9d.js +0 -1
  52. package/dist/assets/index-DEB6-Iv_.js +0 -2
  53. package/dist/assets/index-DM4Ezclc.css +0 -1
  54. package/dist/assets/index-DYv7nImj.css +0 -1
  55. package/dist/assets/index-t-2Y0KhA.css +0 -1
  56. package/dist/assets/vendor-CUVPinTg.js +0 -13
  57. package/dist/assets/vue-vendor-DeJXJVbN.js +0 -29
  58. package/dist/assets/xto-base-CL2NKZJJ.css +0 -1
  59. package/dist/assets/xto-base-PwLGsxxb.js +0 -1
  60. package/dist/assets/xto-business--V1F5Gwb.css +0 -1
  61. package/dist/assets/xto-core-CtL4zKiV.js +0 -1
  62. package/dist/assets/xto-data-MxZsiJgi.css +0 -1
  63. package/dist/assets/xto-data-bCXQa7fT.js +0 -1
  64. package/dist/assets/xto-feedback-Bxx38c3P.css +0 -1
  65. package/dist/assets/xto-feedback-CPydp0kn.js +0 -1
  66. package/dist/assets/xto-form-Cu6q3VLG.css +0 -1
  67. package/dist/assets/xto-form-bywohdAf.js +0 -1
  68. package/dist/assets/xto-layout-BDD6sSlM.css +0 -1
  69. package/dist/assets/xto-navigation-Bbdpine9.js +0 -1
  70. package/dist/assets/xto-navigation-XfpyMpEo.css +0 -1
  71. package/dist/index-3ekBp4iW.js +0 -479
  72. package/dist/index-58aI1w0v.js +0 -515
  73. package/dist/index-A_B_Ap_A.js +0 -4240
  74. package/dist/index-B-lMqzxZ.js +0 -479
  75. package/dist/index-B5DLfOYb.js +0 -189
  76. package/dist/index-BAmYUT0G.js +0 -189
  77. package/dist/index-BJlOXgu5.js +0 -515
  78. package/dist/index-BMQao91y.js +0 -189
  79. package/dist/index-BRvi9qW-.js +0 -515
  80. package/dist/index-BVGW4DDQ.js +0 -189
  81. package/dist/index-BXg94yA2.js +0 -515
  82. package/dist/index-BYAkZ2gD.js +0 -641
  83. package/dist/index-BfXnrw05.js +0 -515
  84. package/dist/index-Bmb0rt9C.js +0 -641
  85. package/dist/index-Bmf0YbVq.js +0 -189
  86. package/dist/index-C1BnOFy7.js +0 -3145
  87. package/dist/index-C2-a5KSQ.js +0 -4233
  88. package/dist/index-C3K89jzC.js +0 -515
  89. package/dist/index-C92NkXAn.js +0 -479
  90. package/dist/index-CAHSv7LK.js +0 -4285
  91. package/dist/index-CVH7bDsl.js +0 -4285
  92. package/dist/index-Ccp6zfq-.js +0 -4290
  93. package/dist/index-CeZ0CSSs.js +0 -641
  94. package/dist/index-Cf8E7FM1.js +0 -4270
  95. package/dist/index-CgyQqbdx.js +0 -189
  96. package/dist/index-ChowNrlU.js +0 -641
  97. package/dist/index-CvQgEgUM.js +0 -641
  98. package/dist/index-D25KzR0I.js +0 -479
  99. package/dist/index-D4LWXVnG.js +0 -515
  100. package/dist/index-DCApv1oX.js +0 -641
  101. package/dist/index-DCBIjLHy.js +0 -515
  102. package/dist/index-DEYOivza.js +0 -641
  103. package/dist/index-DHH8Os_2.js +0 -189
  104. package/dist/index-DReodgBw.js +0 -4233
  105. package/dist/index-DTRJONCd.js +0 -515
  106. package/dist/index-DgffG7KK.js +0 -641
  107. package/dist/index-DjERNRXX.js +0 -515
  108. package/dist/index-DjXyzwL0.js +0 -479
  109. package/dist/index-DkOqM4e2.js +0 -3147
  110. package/dist/index-Ds8IV04t.js +0 -189
  111. package/dist/index-LSdsO2Ox.js +0 -479
  112. package/dist/index-UJixTdep.js +0 -479
  113. package/dist/index-WPRGF_GX.js +0 -189
  114. package/dist/index-WPWzllES.js +0 -641
  115. package/dist/index-Wl2Qg26t.js +0 -3147
  116. package/dist/index-dk0diNwi.js +0 -479
  117. package/dist/index-gBlRG4kk.js +0 -479
  118. package/dist/index-mVol7F2K.js +0 -479
  119. package/dist/index-xWU3J3OH.js +0 -641
  120. package/dist/index-zKJLxthI.js +0 -189
  121. package/dist/index.es.js +0 -95
  122. package/dist/index.html +0 -28
  123. package/dist/index.umd.js +0 -8
@@ -1,200 +1,200 @@
1
- <script setup lang="ts">
2
- import { computed } from 'vue'
3
- import { useAppStore } from '@/stores/app'
4
- import { useMenuStore } from '@/stores/menu'
5
- import Sidebar from './Sidebar.vue'
6
- import Header from './Header.vue'
7
- import TopMenu from './TopMenu.vue'
8
- import MixTopMenu from './MixTopMenu.vue'
9
-
10
- // Props
11
- const props = withDefaults(defineProps<{
12
- logoSrc?: string
13
- }>(), {
14
- logoSrc: '/vite.svg'
15
- })
16
-
17
- const appStore = useAppStore()
18
- const menuStore = useMenuStore()
19
-
20
- const sidebarWidth = computed(() =>
21
- appStore.isCollapsed ? '64px' : '210px'
22
- )
23
-
24
- // 布局模式
25
- const layoutMode = computed(() => appStore.layout)
26
-
27
- // 是否显示混合模式(mix模式)
28
- const isMixMode = computed(() => layoutMode.value === 'mix')
29
-
30
- // 左侧菜单数据
31
- // sidebar模式:显示全部菜单
32
- // mix模式:显示当前选中一级菜单的子菜单
33
- const sidebarMenuList = computed(() => {
34
- if (layoutMode.value === 'sidebar') {
35
- return menuStore.menuList
36
- } else if (layoutMode.value === 'mix') {
37
- // mix模式下显示当前选中一级菜单的子菜单
38
- return appStore.mixSubMenus
39
- }
40
- return []
41
- })
42
-
43
- // mix模式下是否显示左侧菜单(有子菜单时才显示)
44
- const showMixSidebar = computed(() => {
45
- if (!isMixMode.value) return false
46
- return sidebarMenuList.value.length > 0
47
- })
48
- </script>
49
-
50
- <template>
51
- <!-- sidebar模式:左侧菜单 + 顶部Header + 主内容 -->
52
- <div v-if="layoutMode === 'sidebar'" class="layout layout--sidebar">
53
- <aside class="layout__aside" :style="{ width: sidebarWidth }">
54
- <Sidebar :menu-list="sidebarMenuList" :show-logo="true" :show-user="true" :logo-src="props.logoSrc" />
55
- </aside>
56
- <div class="layout__main">
57
- <header class="layout__header">
58
- <Header />
59
- </header>
60
- <main class="layout__content">
61
- <router-view />
62
- </main>
63
- </div>
64
- </div>
65
-
66
- <!-- top模式:顶部菜单 + 主内容 -->
67
- <div v-if="layoutMode === 'top'" class="layout layout--top">
68
- <div class="layout__top-menu">
69
- <TopMenu :logo-src="props.logoSrc" />
70
- </div>
71
- <div class="layout__main">
72
- <main class="layout__content">
73
- <router-view />
74
- </main>
75
- </div>
76
- </div>
77
-
78
- <!-- mix模式:顶部一级菜单 + (左侧子菜单 + 主内容) -->
79
- <div v-if="layoutMode === 'mix'" class="layout layout--mix">
80
- <!-- 顶部一级菜单 -->
81
- <div class="layout__mix-top-menu">
82
- <MixTopMenu :logo-src="props.logoSrc" />
83
- </div>
84
- <!-- 下方:左侧子菜单 + 主内容 -->
85
- <div class="layout__mix-body">
86
- <aside v-if="showMixSidebar" class="layout__aside" :style="{ width: sidebarWidth }">
87
- <Sidebar :menu-list="sidebarMenuList" :show-logo="false" :show-user="false" />
88
- </aside>
89
- <main class="layout__content">
90
- <router-view />
91
- </main>
92
- </div>
93
- </div>
94
- </template>
95
-
96
- <style lang="scss" scoped>
97
- .layout {
98
- display: flex;
99
- width: 100%;
100
- height: 100%;
101
-
102
- // 左侧菜单模式
103
- &--sidebar {
104
- flex-direction: row;
105
-
106
- .layout__aside {
107
- height: 100%;
108
- }
109
-
110
- .layout__main {
111
- flex: 1;
112
- display: flex;
113
- flex-direction: column;
114
- height: 100%;
115
- }
116
- }
117
-
118
- // 顶部菜单模式
119
- &--top {
120
- flex-direction: column;
121
-
122
- .layout__main {
123
- flex: 1;
124
- display: flex;
125
- flex-direction: column;
126
- height: calc(100% - 50px);
127
- }
128
-
129
- .layout__content {
130
- flex: 1;
131
- }
132
- }
133
-
134
- // 混合菜单模式
135
- &--mix {
136
- flex-direction: column;
137
-
138
- .layout__mix-top-menu {
139
- width: 100%;
140
- height: 50px;
141
- background-color: var(--bg-color);
142
- border-bottom: 1px solid var(--color-border-lighter);
143
- flex-shrink: 0;
144
- }
145
-
146
- .layout__mix-body {
147
- flex: 1;
148
- display: flex;
149
- flex-direction: row;
150
- height: calc(100% - 50px);
151
- }
152
- }
153
-
154
- &__aside {
155
- transition: width 0.3s;
156
- overflow: hidden;
157
- flex-shrink: 0;
158
- height: 100%;
159
- }
160
-
161
- &__top-menu {
162
- width: 100%;
163
- height: 50px;
164
- box-sizing: border-box;
165
- background-color: var(--bg-color);
166
- border-bottom: 1px solid var(--color-border-lighter);
167
- flex-shrink: 0;
168
- }
169
-
170
- &__mix-top-menu {
171
- width: 100%;
172
- height: 50px;
173
- box-sizing: border-box;
174
- flex-shrink: 0;
175
- }
176
-
177
- &__main {
178
- flex: 1;
179
- display: flex;
180
- flex-direction: column;
181
- overflow: hidden;
182
- height: 100%;
183
- }
184
-
185
- &__header {
186
- height: 50px;
187
- box-sizing: border-box;
188
- background-color: var(--bg-color);
189
- border-bottom: 1px solid var(--color-border-lighter);
190
- flex-shrink: 0;
191
- }
192
-
193
- &__content {
194
- flex: 1;
195
- overflow: auto;
196
- background-color: var(--bg-color-page);
197
- padding: 0;
198
- }
199
- }
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+ import { useAppStore } from '@/stores/app'
4
+ import { useMenuStore } from '@/stores/menu'
5
+ import Sidebar from './Sidebar.vue'
6
+ import Header from './Header.vue'
7
+ import TopMenu from './TopMenu.vue'
8
+ import MixTopMenu from './MixTopMenu.vue'
9
+
10
+ // Props
11
+ const props = withDefaults(defineProps<{
12
+ logoSrc?: string
13
+ }>(), {
14
+ logoSrc: '/vite.svg'
15
+ })
16
+
17
+ const appStore = useAppStore()
18
+ const menuStore = useMenuStore()
19
+
20
+ const sidebarWidth = computed(() =>
21
+ appStore.isCollapsed ? '64px' : '210px'
22
+ )
23
+
24
+ // 布局模式
25
+ const layoutMode = computed(() => appStore.layout)
26
+
27
+ // 是否显示混合模式(mix模式)
28
+ const isMixMode = computed(() => layoutMode.value === 'mix')
29
+
30
+ // 左侧菜单数据
31
+ // sidebar模式:显示全部菜单
32
+ // mix模式:显示当前选中一级菜单的子菜单
33
+ const sidebarMenuList = computed(() => {
34
+ if (layoutMode.value === 'sidebar') {
35
+ return menuStore.menuList
36
+ } else if (layoutMode.value === 'mix') {
37
+ // mix模式下显示当前选中一级菜单的子菜单
38
+ return appStore.mixSubMenus
39
+ }
40
+ return []
41
+ })
42
+
43
+ // mix模式下是否显示左侧菜单(有子菜单时才显示)
44
+ const showMixSidebar = computed(() => {
45
+ if (!isMixMode.value) return false
46
+ return sidebarMenuList.value.length > 0
47
+ })
48
+ </script>
49
+
50
+ <template>
51
+ <!-- sidebar模式:左侧菜单 + 顶部Header + 主内容 -->
52
+ <div v-if="layoutMode === 'sidebar'" class="layout layout--sidebar">
53
+ <aside class="layout__aside" :style="{ width: sidebarWidth }">
54
+ <Sidebar :menu-list="sidebarMenuList" :show-logo="true" :show-user="true" :logo-src="props.logoSrc" />
55
+ </aside>
56
+ <div class="layout__main">
57
+ <header class="layout__header">
58
+ <Header />
59
+ </header>
60
+ <main class="layout__content">
61
+ <router-view />
62
+ </main>
63
+ </div>
64
+ </div>
65
+
66
+ <!-- top模式:顶部菜单 + 主内容 -->
67
+ <div v-if="layoutMode === 'top'" class="layout layout--top">
68
+ <div class="layout__top-menu">
69
+ <TopMenu :logo-src="props.logoSrc" />
70
+ </div>
71
+ <div class="layout__main">
72
+ <main class="layout__content">
73
+ <router-view />
74
+ </main>
75
+ </div>
76
+ </div>
77
+
78
+ <!-- mix模式:顶部一级菜单 + (左侧子菜单 + 主内容) -->
79
+ <div v-if="layoutMode === 'mix'" class="layout layout--mix">
80
+ <!-- 顶部一级菜单 -->
81
+ <div class="layout__mix-top-menu">
82
+ <MixTopMenu :logo-src="props.logoSrc" />
83
+ </div>
84
+ <!-- 下方:左侧子菜单 + 主内容 -->
85
+ <div class="layout__mix-body">
86
+ <aside v-if="showMixSidebar" class="layout__aside" :style="{ width: sidebarWidth }">
87
+ <Sidebar :menu-list="sidebarMenuList" :show-logo="false" :show-user="false" />
88
+ </aside>
89
+ <main class="layout__content">
90
+ <router-view />
91
+ </main>
92
+ </div>
93
+ </div>
94
+ </template>
95
+
96
+ <style lang="scss" scoped>
97
+ .layout {
98
+ display: flex;
99
+ width: 100%;
100
+ height: 100%;
101
+
102
+ // 左侧菜单模式
103
+ &--sidebar {
104
+ flex-direction: row;
105
+
106
+ .layout__aside {
107
+ height: 100%;
108
+ }
109
+
110
+ .layout__main {
111
+ flex: 1;
112
+ display: flex;
113
+ flex-direction: column;
114
+ height: 100%;
115
+ }
116
+ }
117
+
118
+ // 顶部菜单模式
119
+ &--top {
120
+ flex-direction: column;
121
+
122
+ .layout__main {
123
+ flex: 1;
124
+ display: flex;
125
+ flex-direction: column;
126
+ height: calc(100% - 50px);
127
+ }
128
+
129
+ .layout__content {
130
+ flex: 1;
131
+ }
132
+ }
133
+
134
+ // 混合菜单模式
135
+ &--mix {
136
+ flex-direction: column;
137
+
138
+ .layout__mix-top-menu {
139
+ width: 100%;
140
+ height: 50px;
141
+ background-color: var(--bg-color);
142
+ border-bottom: 1px solid var(--color-border-lighter);
143
+ flex-shrink: 0;
144
+ }
145
+
146
+ .layout__mix-body {
147
+ flex: 1;
148
+ display: flex;
149
+ flex-direction: row;
150
+ height: calc(100% - 50px);
151
+ }
152
+ }
153
+
154
+ &__aside {
155
+ transition: width 0.3s;
156
+ overflow: hidden;
157
+ flex-shrink: 0;
158
+ height: 100%;
159
+ }
160
+
161
+ &__top-menu {
162
+ width: 100%;
163
+ height: 50px;
164
+ box-sizing: border-box;
165
+ background-color: var(--bg-color);
166
+ border-bottom: 1px solid var(--color-border-lighter);
167
+ flex-shrink: 0;
168
+ }
169
+
170
+ &__mix-top-menu {
171
+ width: 100%;
172
+ height: 50px;
173
+ box-sizing: border-box;
174
+ flex-shrink: 0;
175
+ }
176
+
177
+ &__main {
178
+ flex: 1;
179
+ display: flex;
180
+ flex-direction: column;
181
+ overflow: hidden;
182
+ height: 100%;
183
+ }
184
+
185
+ &__header {
186
+ height: 50px;
187
+ box-sizing: border-box;
188
+ background-color: var(--bg-color);
189
+ border-bottom: 1px solid var(--color-border-lighter);
190
+ flex-shrink: 0;
191
+ }
192
+
193
+ &__content {
194
+ flex: 1;
195
+ overflow: auto;
196
+ background-color: var(--bg-color-page);
197
+ padding: 0;
198
+ }
199
+ }
200
200
  </style>
@@ -1,44 +1,44 @@
1
- /**
2
- * 国际化组合式函数
3
- * 提供便捷的国际化操作
4
- */
5
-
6
- import { useLocaleStore } from '@/stores/locale'
7
- import type { LocaleCode, LocaleMessages } from '@xto/core/locale'
8
-
9
- /**
10
- * 使用国际化
11
- * 封装 locale store,提供更简洁的 API
12
- */
13
- export function useI18n() {
14
- const localeStore = useLocaleStore()
15
-
16
- return {
17
- /** 当前语言代码 */
18
- locale: localeStore.locale,
19
- /** 当前语言名称 */
20
- localeName: localeStore.localeName,
21
- /** 支持的语言列表 */
22
- locales: localeStore.locales,
23
- /** 翻译函数 */
24
- t: localeStore.t,
25
- /** 当前语言包 */
26
- messages: localeStore.messages,
27
- /** 切换语言 */
28
- setLocale: localeStore.changeLocale,
29
- /** 添加自定义翻译 */
30
- addMessages: localeStore.addMessages
31
- }
32
- }
33
-
34
- /**
35
- * 创建翻译函数
36
- * 用于在非组件上下文中使用翻译
37
- */
38
- export function createTranslator() {
39
- const localeStore = useLocaleStore()
40
- return localeStore.t
41
- }
42
-
43
- // 导出类型
1
+ /**
2
+ * 国际化组合式函数
3
+ * 提供便捷的国际化操作
4
+ */
5
+
6
+ import { useLocaleStore } from '@/stores/locale'
7
+ import type { LocaleCode, LocaleMessages } from '@xto/core/locale'
8
+
9
+ /**
10
+ * 使用国际化
11
+ * 封装 locale store,提供更简洁的 API
12
+ */
13
+ export function useI18n() {
14
+ const localeStore = useLocaleStore()
15
+
16
+ return {
17
+ /** 当前语言代码 */
18
+ locale: localeStore.locale,
19
+ /** 当前语言名称 */
20
+ localeName: localeStore.localeName,
21
+ /** 支持的语言列表 */
22
+ locales: localeStore.locales,
23
+ /** 翻译函数 */
24
+ t: localeStore.t,
25
+ /** 当前语言包 */
26
+ messages: localeStore.messages,
27
+ /** 切换语言 */
28
+ setLocale: localeStore.changeLocale,
29
+ /** 添加自定义翻译 */
30
+ addMessages: localeStore.addMessages
31
+ }
32
+ }
33
+
34
+ /**
35
+ * 创建翻译函数
36
+ * 用于在非组件上下文中使用翻译
37
+ */
38
+ export function createTranslator() {
39
+ const localeStore = useLocaleStore()
40
+ return localeStore.t
41
+ }
42
+
43
+ // 导出类型
44
44
  export type { LocaleCode, LocaleMessages }