xto-fronted 0.1.2 → 0.1.3

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 (60) hide show
  1. package/.env.development +3 -0
  2. package/.env.production +3 -0
  3. package/bin/cli.js +104 -0
  4. package/index.html +13 -0
  5. package/package.json +16 -3
  6. package/public/vite.svg +10 -0
  7. package/src/App.vue +20 -0
  8. package/src/api/auth.ts +35 -0
  9. package/src/api/menu.ts +13 -0
  10. package/src/api/system.ts +65 -0
  11. package/src/api/user.ts +12 -0
  12. package/src/assets/styles/_dark.scss +407 -0
  13. package/src/assets/styles/_reset.scss +126 -0
  14. package/src/assets/styles/_root.scss +140 -0
  15. package/src/assets/styles/_transition.scss +119 -0
  16. package/src/assets/styles/_variables.scss +45 -0
  17. package/src/assets/styles/index.scss +187 -0
  18. package/src/components/Layout/Footer.vue +17 -0
  19. package/src/components/Layout/Header.vue +335 -0
  20. package/src/components/Layout/Sidebar.vue +213 -0
  21. package/src/components/Layout/Tabs.vue +20 -0
  22. package/src/components/Layout/index.vue +62 -0
  23. package/src/composables/index.ts +9 -0
  24. package/src/composables/useApp.ts +170 -0
  25. package/src/composables/useAuth.ts +70 -0
  26. package/src/composables/useForm.ts +79 -0
  27. package/src/composables/useMenu.ts +141 -0
  28. package/src/composables/useTable.ts +97 -0
  29. package/src/config/index.ts +19 -0
  30. package/src/directives/permission.ts +41 -0
  31. package/src/enums/index.ts +63 -0
  32. package/src/env.d.ts +17 -0
  33. package/src/index.ts +44 -0
  34. package/src/main.ts +34 -0
  35. package/src/router/dynamicRoutes.ts +163 -0
  36. package/src/router/index.ts +71 -0
  37. package/src/router/staticRoutes.ts +43 -0
  38. package/src/stores/app.ts +145 -0
  39. package/src/stores/auth.ts +45 -0
  40. package/src/stores/index.ts +15 -0
  41. package/src/stores/menu.ts +158 -0
  42. package/src/stores/user.ts +41 -0
  43. package/src/types/api.d.ts +103 -0
  44. package/src/types/global.d.ts +45 -0
  45. package/src/types/router.d.ts +48 -0
  46. package/src/types/xto.d.ts +149 -0
  47. package/src/utils/auth.ts +86 -0
  48. package/src/utils/permission.ts +30 -0
  49. package/src/utils/request.ts +126 -0
  50. package/src/utils/storage.ts +72 -0
  51. package/src/views/dashboard/index.vue +32 -0
  52. package/src/views/error/403.vue +57 -0
  53. package/src/views/error/404.vue +57 -0
  54. package/src/views/login/index.vue +141 -0
  55. package/src/views/system/menu/index.vue +32 -0
  56. package/src/views/system/role/index.vue +32 -0
  57. package/src/views/system/user/index.vue +32 -0
  58. package/tsconfig.json +26 -0
  59. package/tsconfig.node.json +11 -0
  60. package/vite.config.ts +139 -0
@@ -0,0 +1,407 @@
1
+ // ==============================================
2
+ // Dark Theme Override - 暗黑主题覆盖
3
+ // ==============================================
4
+
5
+ .dark {
6
+ // 侧边栏
7
+ .sidebar,
8
+ .layout__aside {
9
+ background-color: #1d1e1f;
10
+ }
11
+
12
+ .sidebar {
13
+ border-right: 1px solid #363637;
14
+ }
15
+
16
+ .sidebar__search-results {
17
+ background-color: #1d1e1f;
18
+ border-color: #363637;
19
+ }
20
+
21
+ .sidebar__search-item:hover {
22
+ background-color: #262727;
23
+ }
24
+
25
+ .sidebar__search-item-title {
26
+ color: #cfd3dc;
27
+ }
28
+
29
+ .sidebar__search-item-parent {
30
+ color: #a3a6ad;
31
+ }
32
+
33
+ .sidebar__logo {
34
+ border-bottom-color: #363637;
35
+ }
36
+
37
+ .sidebar__user {
38
+ border-top-color: #363637;
39
+ }
40
+
41
+ .sidebar__user-name {
42
+ color: #cfd3dc;
43
+ }
44
+
45
+ .sidebar__user-role {
46
+ color: #a3a6ad;
47
+ }
48
+
49
+ // 菜单
50
+ .x-menu {
51
+ background-color: #1d1e1f !important;
52
+ border-color: #363637;
53
+ color: #cfd3dc;
54
+
55
+ &.x-menu--vertical {
56
+ border-right-color: #363637;
57
+ }
58
+
59
+ &.x-menu--horizontal {
60
+ border-bottom-color: #363637;
61
+ }
62
+ }
63
+
64
+ .x-menu-item {
65
+ color: #cfd3dc !important;
66
+
67
+ &:hover {
68
+ background-color: #262727 !important;
69
+ }
70
+
71
+ &.is-active {
72
+ color: #409eff !important;
73
+ background-color: rgba(64, 158, 255, 0.1) !important;
74
+
75
+ &::before {
76
+ background-color: #409eff;
77
+ }
78
+ }
79
+ }
80
+
81
+ .x-sub-menu {
82
+ &__title {
83
+ color: #cfd3dc !important;
84
+
85
+ &:hover {
86
+ background-color: #262727 !important;
87
+ }
88
+ }
89
+
90
+ &__menu {
91
+ background-color: #1d1e1f !important;
92
+ border: 1px solid #363637;
93
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.5);
94
+ }
95
+
96
+ &__arrow {
97
+ color: #a3a6ad;
98
+ }
99
+
100
+ &.is-opened > .x-sub-menu__title {
101
+ background-color: #262727 !important;
102
+ }
103
+
104
+ &.is-active > .x-sub-menu__title {
105
+ color: #409eff !important;
106
+ }
107
+ }
108
+
109
+ // 顶部导航
110
+ .header {
111
+ background-color: #1d1e1f;
112
+ border-bottom-color: #363637;
113
+ }
114
+
115
+ .header__collapse {
116
+ color: #cfd3dc;
117
+ }
118
+
119
+ .header__breadcrumb {
120
+ color: #a3a6ad;
121
+ }
122
+
123
+ .header__user-name {
124
+ color: #cfd3dc;
125
+ }
126
+
127
+ .header__user-arrow {
128
+ color: #a3a6ad;
129
+ }
130
+
131
+ .header__action:hover {
132
+ background-color: #262727;
133
+ }
134
+
135
+ .header__user-trigger:hover {
136
+ background-color: #262727;
137
+ }
138
+
139
+ // 下拉菜单
140
+ .header__dropdown {
141
+ background-color: #1d1e1f;
142
+ border: 1px solid #363637;
143
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.5);
144
+ }
145
+
146
+ .header__dropdown-name {
147
+ color: #e5eaf3;
148
+ }
149
+
150
+ .header__dropdown-role {
151
+ color: #a3a6ad;
152
+ }
153
+
154
+ .header__dropdown-divider {
155
+ background-color: #363637;
156
+ }
157
+
158
+ .header__dropdown-item {
159
+ color: #cfd3dc;
160
+
161
+ &:hover {
162
+ background-color: #262727;
163
+ color: #e5eaf3;
164
+ }
165
+ }
166
+
167
+ // 按钮
168
+ .x-button {
169
+ &.x-button--default {
170
+ background-color: #1d1e1f;
171
+ border-color: #4c4d4f;
172
+ color: #cfd3dc;
173
+
174
+ &:hover {
175
+ border-color: #409eff;
176
+ color: #409eff;
177
+ }
178
+ }
179
+
180
+ &.x-button--text {
181
+ color: #409eff;
182
+ }
183
+ }
184
+
185
+ // 表单
186
+ .x-form-item__label {
187
+ color: #cfd3dc;
188
+ }
189
+
190
+ .x-form-item__error {
191
+ color: #f56c6c;
192
+ }
193
+
194
+ // 输入框
195
+ .x-input {
196
+ background-color: #1d1e1f;
197
+ border-color: #4c4d4f;
198
+
199
+ &.is-focus {
200
+ border-color: #409eff;
201
+ }
202
+
203
+ .x-input__inner {
204
+ background-color: transparent;
205
+ color: #e5eaf3;
206
+
207
+ &::placeholder {
208
+ color: #6c6e72;
209
+ }
210
+ }
211
+
212
+ .x-input__suffix,
213
+ .x-input__prefix {
214
+ color: #a3a6ad;
215
+ }
216
+ }
217
+
218
+ // 选择器
219
+ .x-select {
220
+ background-color: #1d1e1f;
221
+ border-color: #4c4d4f;
222
+ }
223
+
224
+ // 卡片
225
+ .x-card {
226
+ background-color: #1d1e1f;
227
+ border-color: #363637;
228
+ }
229
+
230
+ .x-card__header {
231
+ border-bottom-color: #363637;
232
+ color: #e5eaf3;
233
+ }
234
+
235
+ // 表格
236
+ .data-table {
237
+ th {
238
+ background-color: #262727;
239
+ color: #cfd3dc;
240
+ border-bottom-color: #363637;
241
+ }
242
+
243
+ td {
244
+ border-bottom-color: #363637;
245
+ color: #cfd3dc;
246
+ }
247
+
248
+ tr:hover td {
249
+ background-color: #262727;
250
+ }
251
+ }
252
+
253
+ // 弹窗
254
+ .x-modal {
255
+ &__wrapper {
256
+ background-color: rgba(0, 0, 0, 0.7);
257
+ }
258
+
259
+ &__container {
260
+ background-color: #1d1e1f;
261
+ border: 1px solid #363637;
262
+ }
263
+
264
+ &__header {
265
+ border-bottom-color: #363637;
266
+ color: #e5eaf3;
267
+ }
268
+
269
+ &__footer {
270
+ border-top-color: #363637;
271
+ }
272
+ }
273
+
274
+ // 消息提示
275
+ .x-message {
276
+ background-color: #1d1e1f;
277
+ border: 1px solid #363637;
278
+ }
279
+
280
+ // 标签
281
+ .x-tag {
282
+ &.x-tag--primary {
283
+ background-color: rgba(64, 158, 255, 0.2);
284
+ color: #79bbff;
285
+ border-color: rgba(64, 158, 255, 0.3);
286
+ }
287
+
288
+ &.x-tag--success {
289
+ background-color: rgba(103, 194, 58, 0.2);
290
+ color: #95d475;
291
+ border-color: rgba(103, 194, 58, 0.3);
292
+ }
293
+
294
+ &.x-tag--warning {
295
+ background-color: rgba(230, 162, 60, 0.2);
296
+ color: #eebe77;
297
+ border-color: rgba(230, 162, 60, 0.3);
298
+ }
299
+
300
+ &.x-tag--danger {
301
+ background-color: rgba(245, 108, 108, 0.2);
302
+ color: #fab6b6;
303
+ border-color: rgba(245, 108, 108, 0.3);
304
+ }
305
+
306
+ &.x-tag--info {
307
+ background-color: rgba(144, 147, 153, 0.2);
308
+ color: #c0c4cc;
309
+ border-color: rgba(144, 147, 153, 0.3);
310
+ }
311
+ }
312
+
313
+ // 开关
314
+ .x-switch {
315
+ background-color: #4c4d4f;
316
+
317
+ &.is-checked {
318
+ background-color: #409eff;
319
+ }
320
+ }
321
+
322
+ // 分页
323
+ .x-pagination {
324
+ color: #cfd3dc;
325
+
326
+ &__item {
327
+ background-color: #1d1e1f;
328
+ border-color: #4c4d4f;
329
+ color: #cfd3dc;
330
+
331
+ &:hover {
332
+ color: #409eff;
333
+ }
334
+
335
+ &.is-active {
336
+ background-color: #409eff;
337
+ border-color: #409eff;
338
+ color: #fff;
339
+ }
340
+ }
341
+ }
342
+
343
+ // 登录页面
344
+ .login {
345
+ background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
346
+ }
347
+
348
+ .login__container {
349
+ background-color: #1d1e1f;
350
+ border: 1px solid #363637;
351
+ }
352
+
353
+ .login__title {
354
+ color: #409eff;
355
+ }
356
+
357
+ .login__subtitle {
358
+ color: #a3a6ad;
359
+ }
360
+
361
+ .login__footer {
362
+ color: #6c6e72;
363
+ }
364
+
365
+ // 仪表盘
366
+ .stat-card__title {
367
+ color: #a3a6ad;
368
+ }
369
+
370
+ .quick-link {
371
+ background-color: #262727;
372
+
373
+ &:hover {
374
+ background-color: rgba(64, 158, 255, 0.1);
375
+ }
376
+
377
+ &__title {
378
+ color: #cfd3dc;
379
+ }
380
+ }
381
+
382
+ .activity-item {
383
+ border-bottom-color: #363637;
384
+
385
+ &__action {
386
+ color: #cfd3dc;
387
+ }
388
+ }
389
+
390
+ // 搜索卡片
391
+ .search-card {
392
+ background-color: #1d1e1f;
393
+ border: 1px solid #363637;
394
+ }
395
+
396
+ // 表格卡片
397
+ .table-card {
398
+ background-color: #1d1e1f;
399
+ border: 1px solid #363637;
400
+ }
401
+
402
+ // Popconfirm
403
+ .x-popconfirm {
404
+ background-color: #1d1e1f;
405
+ border: 1px solid #363637;
406
+ }
407
+ }
@@ -0,0 +1,126 @@
1
+ // ==============================================
2
+ // CSS Reset - 样式重置
3
+ // ==============================================
4
+
5
+ *,
6
+ *::before,
7
+ *::after {
8
+ box-sizing: border-box;
9
+ margin: 0;
10
+ padding: 0;
11
+ }
12
+
13
+ html {
14
+ width: 100%;
15
+ height: 100%;
16
+ font-size: var(--font-size-base);
17
+ -webkit-text-size-adjust: 100%;
18
+ -webkit-tap-highlight-color: transparent;
19
+ text-rendering: optimizeLegibility;
20
+ -webkit-font-smoothing: antialiased;
21
+ -moz-osx-font-smoothing: grayscale;
22
+ }
23
+
24
+ body {
25
+ width: 100%;
26
+ height: 100%;
27
+ font-family: var(--font-family);
28
+ font-size: var(--font-size-base);
29
+ line-height: 1.5;
30
+ color: var(--color-text-primary);
31
+ background-color: var(--bg-color-page);
32
+ }
33
+
34
+ #app {
35
+ width: 100%;
36
+ height: 100%;
37
+ }
38
+
39
+ a {
40
+ color: var(--color-primary);
41
+ text-decoration: none;
42
+ cursor: pointer;
43
+ transition: color var(--transition-duration-fast);
44
+
45
+ &:hover {
46
+ color: var(--color-primary-light-3);
47
+ }
48
+ }
49
+
50
+ ul,
51
+ ol {
52
+ list-style: none;
53
+ }
54
+
55
+ img {
56
+ max-width: 100%;
57
+ height: auto;
58
+ vertical-align: middle;
59
+ }
60
+
61
+ button {
62
+ cursor: pointer;
63
+ font-family: inherit;
64
+ font-size: inherit;
65
+ border: none;
66
+ background: none;
67
+ outline: none;
68
+
69
+ &:disabled {
70
+ cursor: not-allowed;
71
+ }
72
+ }
73
+
74
+ input,
75
+ textarea,
76
+ select {
77
+ font-family: inherit;
78
+ font-size: inherit;
79
+ outline: none;
80
+ }
81
+
82
+ table {
83
+ border-collapse: collapse;
84
+ border-spacing: 0;
85
+ }
86
+
87
+ h1,
88
+ h2,
89
+ h3,
90
+ h4,
91
+ h5,
92
+ h6 {
93
+ margin: 0;
94
+ font-weight: 500;
95
+ color: var(--color-text-primary);
96
+ }
97
+
98
+ p {
99
+ margin: 0;
100
+ }
101
+
102
+ // 滚动条样式
103
+ ::-webkit-scrollbar {
104
+ width: 6px;
105
+ height: 6px;
106
+ }
107
+
108
+ ::-webkit-scrollbar-track {
109
+ background-color: var(--color-fill-light);
110
+ border-radius: 3px;
111
+ }
112
+
113
+ ::-webkit-scrollbar-thumb {
114
+ background-color: var(--color-border);
115
+ border-radius: 3px;
116
+
117
+ &:hover {
118
+ background-color: var(--color-text-secondary);
119
+ }
120
+ }
121
+
122
+ // 选中文本样式
123
+ ::selection {
124
+ background-color: var(--color-primary-light-8);
125
+ color: var(--color-primary);
126
+ }
@@ -0,0 +1,140 @@
1
+ // ==============================================
2
+ // CSS Variables - 主题变量
3
+ // ==============================================
4
+
5
+ :root {
6
+ // 主题色
7
+ --color-primary: #409eff;
8
+ --color-primary-light-3: #79bbff;
9
+ --color-primary-light-5: #a0cfff;
10
+ --color-primary-light-7: #c6e2ff;
11
+ --color-primary-light-8: #d9ecff;
12
+ --color-primary-light-9: #ecf5ff;
13
+ --color-primary-dark-2: #337ecc;
14
+
15
+ // 功能色
16
+ --color-success: #67c23a;
17
+ --color-success-light: #e1f3d8;
18
+ --color-success-dark: #529b2e;
19
+
20
+ --color-warning: #e6a23c;
21
+ --color-warning-light: #fdf6ec;
22
+ --color-warning-dark: #b88230;
23
+
24
+ --color-danger: #f56c6c;
25
+ --color-danger-light: #fde2e2;
26
+ --color-danger-dark: #c45656;
27
+
28
+ --color-info: #909399;
29
+ --color-info-light: #f4f4f5;
30
+ --color-info-dark: #73767a;
31
+
32
+ // 文字颜色
33
+ --color-text-primary: #303133;
34
+ --color-text-regular: #606266;
35
+ --color-text-secondary: #909399;
36
+ --color-text-placeholder: #a8abb2;
37
+ --color-text-disabled: #c0c4cc;
38
+
39
+ // 边框颜色
40
+ --color-border: #dcdfe6;
41
+ --color-border-light: #e4e7ed;
42
+ --color-border-lighter: #ebeef5;
43
+ --color-border-extra-light: #f2f6fc;
44
+ --color-border-dark: #d4d7de;
45
+
46
+ // 填充颜色
47
+ --color-fill: #f5f7fa;
48
+ --color-fill-light: #fafafa;
49
+ --color-fill-lighter: #fafcff;
50
+ --color-fill-blank: #ffffff;
51
+
52
+ // 背景颜色
53
+ --bg-color: #ffffff;
54
+ --bg-color-page: #f2f3f5;
55
+ --bg-color-overlay: #ffffff;
56
+
57
+ // 盒子阴影
58
+ --box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
59
+ --box-shadow-light: 0 2px 8px 0 rgba(0, 0, 0, 0.06);
60
+ --box-shadow-lighter: 0 1px 4px 0 rgba(0, 0, 0, 0.04);
61
+ --box-shadow-dark: 0 4px 16px 0 rgba(0, 0, 0, 0.12);
62
+
63
+ // 字体
64
+ --font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,
65
+ 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
66
+ 'Noto Color Emoji';
67
+ --font-size-base: 14px;
68
+ --font-size-small: 12px;
69
+ --font-size-large: 16px;
70
+ --font-size-extra-large: 18px;
71
+
72
+ // 圆角
73
+ --border-radius-base: 4px;
74
+ --border-radius-small: 2px;
75
+ --border-radius-large: 8px;
76
+ --border-radius-round: 20px;
77
+ --border-radius-circle: 50%;
78
+
79
+ // 间距
80
+ --spacing-xs: 4px;
81
+ --spacing-sm: 8px;
82
+ --spacing-md: 16px;
83
+ --spacing-lg: 24px;
84
+ --spacing-xl: 32px;
85
+
86
+ // 尺寸
87
+ --component-size-large: 40px;
88
+ --component-size-default: 32px;
89
+ --component-size-small: 24px;
90
+
91
+ // 过渡时间
92
+ --transition-duration: 0.3s;
93
+ --transition-duration-fast: 0.2s;
94
+ --transition-duration-slow: 0.5s;
95
+
96
+ // z-index
97
+ --z-index-dropdown: 1000;
98
+ --z-index-sticky: 1020;
99
+ --z-index-fixed: 1030;
100
+ --z-index-modal-backdrop: 1040;
101
+ --z-index-modal: 1050;
102
+ --z-index-popover: 1060;
103
+ --z-index-tooltip: 1070;
104
+
105
+ // 布局
106
+ --sidebar-width: 210px;
107
+ --sidebar-collapsed-width: 64px;
108
+ --header-height: 50px;
109
+ --tabs-height: 40px;
110
+ --footer-height: 30px;
111
+ }
112
+
113
+ // 暗色主题
114
+ .dark {
115
+ --color-text-primary: #e5eaf3;
116
+ --color-text-regular: #cfd3dc;
117
+ --color-text-secondary: #a3a6ad;
118
+ --color-text-placeholder: #8d9095;
119
+ --color-text-disabled: #6c6e72;
120
+
121
+ --color-border: #4c4d4f;
122
+ --color-border-light: #414243;
123
+ --color-border-lighter: #363637;
124
+ --color-border-extra-light: #2b2b2c;
125
+ --color-border-dark: #58585b;
126
+
127
+ --color-fill: #303030;
128
+ --color-fill-light: #262727;
129
+ --color-fill-lighter: #1d1d1d;
130
+ --color-fill-blank: #141414;
131
+
132
+ --bg-color: #1d1e1f;
133
+ --bg-color-page: #0a0a0a;
134
+ --bg-color-overlay: #1d1e1f;
135
+
136
+ --box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.3);
137
+ --box-shadow-light: 0 2px 8px 0 rgba(0, 0, 0, 0.24);
138
+ --box-shadow-lighter: 0 1px 4px 0 rgba(0, 0, 0, 0.2);
139
+ --box-shadow-dark: 0 4px 16px 0 rgba(0, 0, 0, 0.36);
140
+ }