xto-fronted 0.4.102 → 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 (144) hide show
  1. package/dist/{index-3ekBp4iW.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-B5DLfOYb.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/api/index.ts +7 -7
  13. package/src/assets/styles/_dark.scss +639 -639
  14. package/src/assets/styles/_root.scss +183 -183
  15. package/src/assets/styles/_variables.scss +69 -69
  16. package/src/assets/styles/index.scss +460 -460
  17. package/src/components/Layout/Header.vue +2 -2
  18. package/src/components/Layout/MixTopMenu.vue +1185 -1185
  19. package/src/components/Layout/Sidebar.vue +229 -229
  20. package/src/components/Layout/SidebarMenuItem.vue +163 -163
  21. package/src/components/Layout/TopMenu.vue +1177 -1177
  22. package/src/components/Layout/index.vue +199 -199
  23. package/src/composables/useI18n.ts +43 -43
  24. package/src/index.ts +114 -100
  25. package/src/router/layoutRoute.ts +70 -70
  26. package/src/stores/app.ts +9 -0
  27. package/src/stores/index.ts +15 -15
  28. package/src/stores/locale.ts +66 -66
  29. package/src/stores/user.ts +0 -2
  30. package/src/types/api.d.ts +0 -1
  31. package/src/types/json-bigint.d.ts +18 -18
  32. package/src/types/xto.d.ts +172 -172
  33. package/src/utils/request.ts +184 -184
  34. package/src/views/dashboard/index.vue +545 -545
  35. package/src/views/error/403.vue +251 -251
  36. package/src/views/error/404.vue +253 -253
  37. package/src/views/login/index.vue +586 -586
  38. package/src/views/system/menu/index.vue +690 -690
  39. package/src/views/system/role/index.vue +583 -583
  40. package/src/views/system/user/index.vue +655 -655
  41. package/vite.config.ts +139 -139
  42. package/dist/assets/404-C9Uh6Uu-.css +0 -1
  43. package/dist/assets/404-fVB40gfP.js +0 -1
  44. package/dist/assets/404-zjGLLssH.js +0 -1
  45. package/dist/assets/_plugin-vue_export-helper-DlAUqK2U.js +0 -1
  46. package/dist/assets/index-B2Y_ySNp.js +0 -2
  47. package/dist/assets/index-B5xc4gQB.css +0 -1
  48. package/dist/assets/index-B75sburk.js +0 -1
  49. package/dist/assets/index-BBdRdMfs.js +0 -1
  50. package/dist/assets/index-BDgOY6Rp.js +0 -1
  51. package/dist/assets/index-BIoRANs0.js +0 -1
  52. package/dist/assets/index-BRR97dc6.js +0 -1
  53. package/dist/assets/index-Bz0BgZQ1.js +0 -1
  54. package/dist/assets/index-CAdztNsv.css +0 -1
  55. package/dist/assets/index-CCXrcISf.css +0 -1
  56. package/dist/assets/index-CDPHn9Pd.js +0 -1
  57. package/dist/assets/index-CfpZmcpk.css +0 -1
  58. package/dist/assets/index-Cpew6d-v.css +0 -1
  59. package/dist/assets/index-CwJSA85U.js +0 -1
  60. package/dist/assets/index-CwRA10ac.js +0 -1
  61. package/dist/assets/index-D8NDxq9d.js +0 -1
  62. package/dist/assets/index-DEB6-Iv_.js +0 -2
  63. package/dist/assets/index-DM4Ezclc.css +0 -1
  64. package/dist/assets/index-DYv7nImj.css +0 -1
  65. package/dist/assets/index-Dm3Gq6SY.js +0 -1
  66. package/dist/assets/index-DxbgF-OR.js +0 -1
  67. package/dist/assets/index-RUdXk1fA.css +0 -1
  68. package/dist/assets/index-_xB0udHf.js +0 -1
  69. package/dist/assets/index-t-2Y0KhA.css +0 -1
  70. package/dist/assets/vendor-CUVPinTg.js +0 -13
  71. package/dist/assets/vue-vendor-Bpie-0gH.js +0 -29
  72. package/dist/assets/vue-vendor-DeJXJVbN.js +0 -29
  73. package/dist/assets/xto-base-C3XNcx7i.js +0 -1
  74. package/dist/assets/xto-base-CL2NKZJJ.css +0 -1
  75. package/dist/assets/xto-base-PwLGsxxb.js +0 -1
  76. package/dist/assets/xto-business--V1F5Gwb.css +0 -1
  77. package/dist/assets/xto-core-B1Ho_Ytu.js +0 -1
  78. package/dist/assets/xto-core-CtL4zKiV.js +0 -1
  79. package/dist/assets/xto-data-Coeo_ZYH.js +0 -1
  80. package/dist/assets/xto-data-MxZsiJgi.css +0 -1
  81. package/dist/assets/xto-data-bCXQa7fT.js +0 -1
  82. package/dist/assets/xto-feedback-Bxx38c3P.css +0 -1
  83. package/dist/assets/xto-feedback-CFysasJi.js +0 -1
  84. package/dist/assets/xto-feedback-CPydp0kn.js +0 -1
  85. package/dist/assets/xto-form-Cu6q3VLG.css +0 -1
  86. package/dist/assets/xto-form-DBlhgyXp.js +0 -1
  87. package/dist/assets/xto-form-bywohdAf.js +0 -1
  88. package/dist/assets/xto-layout-BDD6sSlM.css +0 -1
  89. package/dist/assets/xto-navigation-Bbdpine9.js +0 -1
  90. package/dist/assets/xto-navigation-I2o1CycT.js +0 -1
  91. package/dist/assets/xto-navigation-XfpyMpEo.css +0 -1
  92. package/dist/index-58aI1w0v.js +0 -515
  93. package/dist/index-A_B_Ap_A.js +0 -4240
  94. package/dist/index-B-lMqzxZ.js +0 -479
  95. package/dist/index-B6s_uLJE.js +0 -189
  96. package/dist/index-BAmYUT0G.js +0 -189
  97. package/dist/index-BJlOXgu5.js +0 -515
  98. package/dist/index-BMQao91y.js +0 -189
  99. package/dist/index-BRvi9qW-.js +0 -515
  100. package/dist/index-BVGW4DDQ.js +0 -189
  101. package/dist/index-BXg94yA2.js +0 -515
  102. package/dist/index-BYAkZ2gD.js +0 -641
  103. package/dist/index-BfXnrw05.js +0 -515
  104. package/dist/index-Bmb0rt9C.js +0 -641
  105. package/dist/index-Bmf0YbVq.js +0 -189
  106. package/dist/index-C1BnOFy7.js +0 -3145
  107. package/dist/index-C1j4f3mM.js +0 -479
  108. package/dist/index-C2-a5KSQ.js +0 -4233
  109. package/dist/index-C3K89jzC.js +0 -515
  110. package/dist/index-C92NkXAn.js +0 -479
  111. package/dist/index-CAHSv7LK.js +0 -4285
  112. package/dist/index-CVH7bDsl.js +0 -4285
  113. package/dist/index-Ccp6zfq-.js +0 -4290
  114. package/dist/index-CeZ0CSSs.js +0 -641
  115. package/dist/index-Cf8E7FM1.js +0 -4270
  116. package/dist/index-CgyQqbdx.js +0 -189
  117. package/dist/index-ChowNrlU.js +0 -641
  118. package/dist/index-CvQgEgUM.js +0 -641
  119. package/dist/index-D25KzR0I.js +0 -479
  120. package/dist/index-D4LWXVnG.js +0 -515
  121. package/dist/index-DCApv1oX.js +0 -641
  122. package/dist/index-DCBIjLHy.js +0 -515
  123. package/dist/index-DEYOivza.js +0 -641
  124. package/dist/index-DHH8Os_2.js +0 -189
  125. package/dist/index-DReodgBw.js +0 -4233
  126. package/dist/index-DTRJONCd.js +0 -515
  127. package/dist/index-DgffG7KK.js +0 -641
  128. package/dist/index-DjERNRXX.js +0 -515
  129. package/dist/index-DjXyzwL0.js +0 -479
  130. package/dist/index-DkOqM4e2.js +0 -3147
  131. package/dist/index-Ds8IV04t.js +0 -189
  132. package/dist/index-LSdsO2Ox.js +0 -479
  133. package/dist/index-UJixTdep.js +0 -479
  134. package/dist/index-WPRGF_GX.js +0 -189
  135. package/dist/index-WPWzllES.js +0 -641
  136. package/dist/index-Wl2Qg26t.js +0 -3147
  137. package/dist/index-dk0diNwi.js +0 -479
  138. package/dist/index-gBlRG4kk.js +0 -479
  139. package/dist/index-mVol7F2K.js +0 -479
  140. package/dist/index-xWU3J3OH.js +0 -641
  141. package/dist/index-zKJLxthI.js +0 -189
  142. package/dist/index.es.js +0 -95
  143. package/dist/index.html +0 -28
  144. package/dist/index.umd.js +0 -8
@@ -1,163 +1,163 @@
1
- <script setup lang="ts">
2
- import { computed } from 'vue'
3
- import { MenuItem, SubMenu } from '@xto/navigation'
4
- import { Icon } from '@xto/base'
5
-
6
- // Props
7
- const props = defineProps<{
8
- menu: any
9
- }>()
10
-
11
- // 已知的图标名称列表
12
- const knownIcons = new Set([
13
- 'arrow-up', 'arrow-down', 'arrow-left', 'arrow-right',
14
- 'caret-down', 'caret-right', 'plus', 'minus', 'close', 'check',
15
- 'edit', 'delete', 'copy', 'download', 'upload', 'refresh', 'search',
16
- 'filter', 'more', 'setting', 'share', 'loading', 'info', 'success',
17
- 'warning', 'error', 'question', 'user', 'user-add', 'user-group',
18
- 'logout', 'login', 'file', 'folder', 'folder-open', 'document',
19
- 'image', 'video', 'music', 'camera', 'mail', 'phone', 'chat',
20
- 'bell', 'message', 'eye', 'eye-off', 'calendar', 'clock', 'history',
21
- 'timer', 'location', 'map', 'globe', 'star', 'heart', 'thumb-up',
22
- 'link', 'external-link', 'lock', 'unlock', 'key', 'home', 'menu',
23
- 'menu-fold', 'menu-unfold', 'sidebar-fold', 'sidebar-expand',
24
- 'sidebar-left', 'dashboard', 'chart', 'chart-pie', 'chart-line',
25
- 'report', 'analytics', 'system', 'permission', 'role', 'user-manage',
26
- 'log', 'notification', 'app', 'list', 'grid', 'fullscreen',
27
- 'fullscreen-exit', 'zoom-in', 'zoom-out', 'print', 'bookmark',
28
- 'tag', 'code', 'terminal', 'database', 'server', 'cloud', 'gift',
29
- 'moon', 'sun', 'theme', 'skin'
30
- ])
31
-
32
- // 获取菜单图标名称
33
- const getMenuIcon = (icon?: string): string => {
34
- if (!icon || icon === '') return ''
35
-
36
- if (icon.startsWith('tineco-icon-')) {
37
- const iconName = icon.replace('tineco-icon-', '')
38
- const tinecoIconMap: Record<string, string> = {
39
- home: 'home',
40
- dashboard: 'dashboard',
41
- system: 'system',
42
- user: 'user',
43
- role: 'role',
44
- menu: 'list',
45
- setting: 'setting',
46
- file: 'file',
47
- folder: 'folder',
48
- chart: 'chart',
49
- report: 'report',
50
- analytics: 'analytics'
51
- }
52
- return tinecoIconMap[iconName] || iconName
53
- }
54
-
55
- const iconMap: Record<string, string> = {
56
- dashboard: 'dashboard',
57
- system: 'system',
58
- user: 'user',
59
- role: 'role',
60
- menu: 'list',
61
- setting: 'setting',
62
- home: 'home',
63
- chart: 'chart',
64
- report: 'report',
65
- analytics: 'analytics',
66
- permission: 'permission',
67
- log: 'log',
68
- notification: 'notification',
69
- app: 'app',
70
- list: 'list',
71
- grid: 'grid'
72
- }
73
-
74
- return iconMap[icon] || icon
75
- }
76
-
77
- // 获取菜单名称第一个字
78
- const getFirstChar = (name?: string): string => {
79
- if (!name) return ''
80
- return name.charAt(0)
81
- }
82
-
83
- // 判断图标是否存在
84
- const iconExists = (iconName: string): boolean => {
85
- return knownIcons.has(iconName)
86
- }
87
-
88
- // 获取菜单的唯一标识(优先使用 menuId,其次 menuCode,最后 menuUrl)
89
- const menuIndex = computed(() => {
90
- return props.menu.menuId || props.menu.menuCode || props.menu.menuUrl || ''
91
- })
92
-
93
- // 是否有子菜单
94
- const hasChildren = computed(() => {
95
- return props.menu.children && props.menu.children.length > 0
96
- })
97
- </script>
98
-
99
- <template>
100
- <!-- 有子菜单 -->
101
- <SubMenu v-if="hasChildren" :index="menuIndex">
102
- <template #title>
103
- <span class="menu-item__content">
104
- <span class="menu-item__icon">
105
- <Icon v-if="iconExists(getMenuIcon(menu.icon))" :name="getMenuIcon(menu.icon)" :size="16" />
106
- <span v-else class="menu-item__char">{{ getFirstChar(menu.menuName) }}</span>
107
- </span>
108
- <span class="menu-item__text">{{ menu.menuName }}</span>
109
- </span>
110
- </template>
111
- <!-- 递归渲染子菜单 -->
112
- <template v-for="child in menu.children" :key="child.menuId || child.menuCode || child.menuUrl">
113
- <SidebarMenuItem :menu="child" />
114
- </template>
115
- </SubMenu>
116
-
117
- <!-- 无子菜单 -->
118
- <MenuItem v-else :index="menu.menuUrl || menuIndex">
119
- <span class="menu-item__content">
120
- <span v-if="menu.menuName !== '首页'" class="menu-item__icon">
121
- <Icon v-if="iconExists(getMenuIcon(menu.icon))" :name="getMenuIcon(menu.icon)" :size="16" />
122
- <span v-else class="menu-item__char">{{ getFirstChar(menu.menuName) }}</span>
123
- </span>
124
- <span class="menu-item__text">{{ menu.menuName }}</span>
125
- </span>
126
- </MenuItem>
127
- </template>
128
-
129
- <style lang="scss" scoped>
130
- .menu-item__content {
131
- display: inline-flex;
132
- align-items: center;
133
- line-height: 1;
134
- }
135
-
136
- .menu-item__text {
137
- flex: 1;
138
- line-height: 1;
139
- }
140
-
141
- .menu-item__icon {
142
- display: inline-flex;
143
- align-items: center;
144
- justify-content: center;
145
- width: 16px;
146
- height: 16px;
147
- margin-right: 8px;
148
- flex-shrink: 0;
149
- }
150
-
151
- .menu-item__char {
152
- display: inline-flex;
153
- align-items: center;
154
- justify-content: center;
155
- width: 16px;
156
- height: 16px;
157
- font-size: 12px;
158
- font-weight: 600;
159
- color: var(--color-primary);
160
- background-color: var(--color-primary-light-8);
161
- border-radius: 4px;
162
- }
163
- </style>
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+ import { MenuItem, SubMenu } from '@xto/navigation'
4
+ import { Icon } from '@xto/base'
5
+
6
+ // Props
7
+ const props = defineProps<{
8
+ menu: any
9
+ }>()
10
+
11
+ // 已知的图标名称列表
12
+ const knownIcons = new Set([
13
+ 'arrow-up', 'arrow-down', 'arrow-left', 'arrow-right',
14
+ 'caret-down', 'caret-right', 'plus', 'minus', 'close', 'check',
15
+ 'edit', 'delete', 'copy', 'download', 'upload', 'refresh', 'search',
16
+ 'filter', 'more', 'setting', 'share', 'loading', 'info', 'success',
17
+ 'warning', 'error', 'question', 'user', 'user-add', 'user-group',
18
+ 'logout', 'login', 'file', 'folder', 'folder-open', 'document',
19
+ 'image', 'video', 'music', 'camera', 'mail', 'phone', 'chat',
20
+ 'bell', 'message', 'eye', 'eye-off', 'calendar', 'clock', 'history',
21
+ 'timer', 'location', 'map', 'globe', 'star', 'heart', 'thumb-up',
22
+ 'link', 'external-link', 'lock', 'unlock', 'key', 'home', 'menu',
23
+ 'menu-fold', 'menu-unfold', 'sidebar-fold', 'sidebar-expand',
24
+ 'sidebar-left', 'dashboard', 'chart', 'chart-pie', 'chart-line',
25
+ 'report', 'analytics', 'system', 'permission', 'role', 'user-manage',
26
+ 'log', 'notification', 'app', 'list', 'grid', 'fullscreen',
27
+ 'fullscreen-exit', 'zoom-in', 'zoom-out', 'print', 'bookmark',
28
+ 'tag', 'code', 'terminal', 'database', 'server', 'cloud', 'gift',
29
+ 'moon', 'sun', 'theme', 'skin'
30
+ ])
31
+
32
+ // 获取菜单图标名称
33
+ const getMenuIcon = (icon?: string): string => {
34
+ if (!icon || icon === '') return ''
35
+
36
+ if (icon.startsWith('tineco-icon-')) {
37
+ const iconName = icon.replace('tineco-icon-', '')
38
+ const tinecoIconMap: Record<string, string> = {
39
+ home: 'home',
40
+ dashboard: 'dashboard',
41
+ system: 'system',
42
+ user: 'user',
43
+ role: 'role',
44
+ menu: 'list',
45
+ setting: 'setting',
46
+ file: 'file',
47
+ folder: 'folder',
48
+ chart: 'chart',
49
+ report: 'report',
50
+ analytics: 'analytics'
51
+ }
52
+ return tinecoIconMap[iconName] || iconName
53
+ }
54
+
55
+ const iconMap: Record<string, string> = {
56
+ dashboard: 'dashboard',
57
+ system: 'system',
58
+ user: 'user',
59
+ role: 'role',
60
+ menu: 'list',
61
+ setting: 'setting',
62
+ home: 'home',
63
+ chart: 'chart',
64
+ report: 'report',
65
+ analytics: 'analytics',
66
+ permission: 'permission',
67
+ log: 'log',
68
+ notification: 'notification',
69
+ app: 'app',
70
+ list: 'list',
71
+ grid: 'grid'
72
+ }
73
+
74
+ return iconMap[icon] || icon
75
+ }
76
+
77
+ // 获取菜单名称第一个字
78
+ const getFirstChar = (name?: string): string => {
79
+ if (!name) return ''
80
+ return name.charAt(0)
81
+ }
82
+
83
+ // 判断图标是否存在
84
+ const iconExists = (iconName: string): boolean => {
85
+ return knownIcons.has(iconName)
86
+ }
87
+
88
+ // 获取菜单的唯一标识(优先使用 menuId,其次 menuCode,最后 menuUrl)
89
+ const menuIndex = computed(() => {
90
+ return props.menu.menuId || props.menu.menuCode || props.menu.menuUrl || ''
91
+ })
92
+
93
+ // 是否有子菜单
94
+ const hasChildren = computed(() => {
95
+ return props.menu.children && props.menu.children.length > 0
96
+ })
97
+ </script>
98
+
99
+ <template>
100
+ <!-- 有子菜单 -->
101
+ <SubMenu v-if="hasChildren" :index="menuIndex">
102
+ <template #title>
103
+ <span class="menu-item__content">
104
+ <span class="menu-item__icon">
105
+ <Icon v-if="iconExists(getMenuIcon(menu.icon))" :name="getMenuIcon(menu.icon)" :size="16" />
106
+ <span v-else class="menu-item__char">{{ getFirstChar(menu.menuName) }}</span>
107
+ </span>
108
+ <span class="menu-item__text">{{ menu.menuName }}</span>
109
+ </span>
110
+ </template>
111
+ <!-- 递归渲染子菜单 -->
112
+ <template v-for="child in menu.children" :key="child.menuId || child.menuCode || child.menuUrl">
113
+ <SidebarMenuItem :menu="child" />
114
+ </template>
115
+ </SubMenu>
116
+
117
+ <!-- 无子菜单 -->
118
+ <MenuItem v-else :index="menu.menuUrl || menuIndex">
119
+ <span class="menu-item__content">
120
+ <span v-if="menu.menuName !== '首页'" class="menu-item__icon">
121
+ <Icon v-if="iconExists(getMenuIcon(menu.icon))" :name="getMenuIcon(menu.icon)" :size="16" />
122
+ <span v-else class="menu-item__char">{{ getFirstChar(menu.menuName) }}</span>
123
+ </span>
124
+ <span class="menu-item__text">{{ menu.menuName }}</span>
125
+ </span>
126
+ </MenuItem>
127
+ </template>
128
+
129
+ <style lang="scss" scoped>
130
+ .menu-item__content {
131
+ display: inline-flex;
132
+ align-items: center;
133
+ line-height: 1;
134
+ }
135
+
136
+ .menu-item__text {
137
+ flex: 1;
138
+ line-height: 1;
139
+ }
140
+
141
+ .menu-item__icon {
142
+ display: inline-flex;
143
+ align-items: center;
144
+ justify-content: center;
145
+ width: 16px;
146
+ height: 16px;
147
+ margin-right: 8px;
148
+ flex-shrink: 0;
149
+ }
150
+
151
+ .menu-item__char {
152
+ display: inline-flex;
153
+ align-items: center;
154
+ justify-content: center;
155
+ width: 16px;
156
+ height: 16px;
157
+ font-size: 12px;
158
+ font-weight: 600;
159
+ color: var(--color-primary);
160
+ background-color: var(--color-primary-light-8);
161
+ border-radius: 4px;
162
+ }
163
+ </style>