befly-admin 3.4.5 → 3.4.7

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 (69) hide show
  1. package/.gitignore +2 -0
  2. package/bunfig.toml +1 -8
  3. package/index.html +2 -2
  4. package/package.json +12 -8
  5. package/src/config/index.ts +20 -0
  6. package/src/layouts/{internal/0.vue → default.vue} +51 -21
  7. package/src/main.ts +3 -5
  8. package/src/plugins/global.ts +17 -0
  9. package/src/plugins/{internal/http.ts → http.ts} +1 -1
  10. package/src/router/index.ts +55 -0
  11. package/src/styles/{internal/index.scss → global.scss} +29 -29
  12. package/src/types/auto-imports.d.ts +176 -637
  13. package/src/types/components.d.ts +28 -19
  14. package/src/types/typed-router.d.ts +32 -0
  15. package/src/utils/index.ts +21 -9
  16. package/src/views/index.vue +27 -0
  17. package/src/views/internal/login.vue +73 -0
  18. package/src/views/test.vue +60 -0
  19. package/tsconfig.json +4 -4
  20. package/vite.config.ts +134 -60
  21. package/src/components/internal/Icon.vue +0 -41
  22. package/src/components/internal/README.md +0 -27
  23. package/src/layouts/4.vue +0 -17
  24. package/src/layouts/internal/1.vue +0 -22
  25. package/src/layouts/internal/2.vue +0 -169
  26. package/src/layouts/internal/README.md +0 -27
  27. package/src/plugins/internal/README.md +0 -36
  28. package/src/plugins/internal/router.ts +0 -48
  29. package/src/plugins/internal/store.ts +0 -19
  30. package/src/styles/internal/README.md +0 -27
  31. package/src/styles/internal/mixins.scss +0 -98
  32. package/src/types/env.d.ts +0 -23
  33. package/src/utils/README.md +0 -37
  34. package/src/utils/internal/README.md +0 -21
  35. package/src/utils/internal/index.ts +0 -30
  36. package/src/views/internal/403/403.vue +0 -66
  37. package/src/views/internal/README.md +0 -27
  38. package/src/views/internal/admin/components/edit.vue +0 -147
  39. package/src/views/internal/admin/components/role.vue +0 -135
  40. package/src/views/internal/admin/index.vue +0 -169
  41. package/src/views/internal/dict/components/edit.vue +0 -156
  42. package/src/views/internal/dict/index.vue +0 -159
  43. package/src/views/internal/index/components/addonList.vue +0 -125
  44. package/src/views/internal/index/components/environmentInfo.vue +0 -97
  45. package/src/views/internal/index/components/operationLogs.vue +0 -112
  46. package/src/views/internal/index/components/performanceMetrics.vue +0 -148
  47. package/src/views/internal/index/components/quickActions.vue +0 -27
  48. package/src/views/internal/index/components/serviceStatus.vue +0 -193
  49. package/src/views/internal/index/components/systemNotifications.vue +0 -136
  50. package/src/views/internal/index/components/systemOverview.vue +0 -188
  51. package/src/views/internal/index/components/systemResources.vue +0 -104
  52. package/src/views/internal/index/components/userInfo.vue +0 -202
  53. package/src/views/internal/index/index.vue +0 -62
  54. package/src/views/internal/login/components/emailLoginForm.vue +0 -163
  55. package/src/views/internal/login/components/registerForm.vue +0 -168
  56. package/src/views/internal/login/components/welcomePanel.vue +0 -61
  57. package/src/views/internal/login/index_1.vue +0 -189
  58. package/src/views/internal/menu/components/edit.vue +0 -150
  59. package/src/views/internal/menu/index.vue +0 -168
  60. package/src/views/internal/news/detail/detail_2.vue +0 -26
  61. package/src/views/internal/news/detail/index.vue +0 -26
  62. package/src/views/internal/news/news.vue +0 -26
  63. package/src/views/internal/role/components/api.vue +0 -280
  64. package/src/views/internal/role/components/edit.vue +0 -129
  65. package/src/views/internal/role/components/menu.vue +0 -143
  66. package/src/views/internal/role/index.vue +0 -179
  67. package/src/views/internal/user/user.vue +0 -320
  68. /package/src/plugins/{internal/storage.ts → storage.ts} +0 -0
  69. /package/src/styles/{internal/variables.scss → variables.scss} +0 -0
@@ -1,159 +0,0 @@
1
- <template>
2
- <div class="page-dict page-table">
3
- <div class="main-tool">
4
- <div class="left">
5
- <tiny-button type="primary" @click="$Method.onAction('add', {})">
6
- <template #icon>
7
- <Icon name="Plus" :size="16" />
8
- </template>
9
- 添加字典
10
- </tiny-button>
11
- </div>
12
- <div class="right">
13
- <tiny-button @click="$Method.handleRefresh">
14
- <template #icon>
15
- <Icon name="RotateCw" :size="16" />
16
- </template>
17
- 刷新
18
- </tiny-button>
19
- </div>
20
- </div>
21
- <div class="main-table">
22
- <tiny-grid :data="$Data.dictList" header-cell-class-name="custom-table-cell-class" size="small" height="100%" seq-serial>
23
- <tiny-grid-column type="index" title="序号" :width="60" />
24
- <tiny-grid-column field="name" title="字典名称" />
25
- <tiny-grid-column field="code" title="字典代码" :width="150" />
26
- <tiny-grid-column field="value" title="字典值" :width="200" />
27
- <tiny-grid-column field="pid" title="父级ID" :width="100" />
28
- <tiny-grid-column field="sort" title="排序" :width="80" />
29
- <tiny-grid-column field="description" title="描述" />
30
- <tiny-grid-column field="state" title="状态" :width="100">
31
- <template #default="{ row }">
32
- <tiny-tag v-if="row.state === 1" type="success">正常</tiny-tag>
33
- <tiny-tag v-else-if="row.state === 2" type="warning">禁用</tiny-tag>
34
- <tiny-tag v-else type="danger">已删除</tiny-tag>
35
- </template>
36
- </tiny-grid-column>
37
- <tiny-grid-column title="操作" :width="120" align="right">
38
- <template #default="{ row }">
39
- <tiny-dropdown title="操作" trigger="click" size="small" border visible-arrow @item-click="(data) => $Method.onAction(data.itemData.command, row)">
40
- <template #dropdown>
41
- <tiny-dropdown-menu>
42
- <tiny-dropdown-item :item-data="{ command: 'upd' }">
43
- <Icon name="Edit" />
44
- 编辑
45
- </tiny-dropdown-item>
46
- <tiny-dropdown-item :item-data="{ command: 'del' }" divided>
47
- <Icon name="Trash2" />
48
- 删除
49
- </tiny-dropdown-item>
50
- </tiny-dropdown-menu>
51
- </template>
52
- </tiny-dropdown>
53
- </template>
54
- </tiny-grid-column>
55
- </tiny-grid>
56
- </div>
57
-
58
- <div class="main-page">
59
- <tiny-pager :current-page="$Data.pagerConfig.currentPage" :page-size="$Data.pagerConfig.pageSize" :total="$Data.pagerConfig.total" @current-change="$Method.onPageChange" @size-change="$Method.handleSizeChange" />
60
- </div>
61
-
62
- <!-- 编辑对话框组件 -->
63
- <EditDialog v-if="$Data.editVisible" v-model="$Data.editVisible" :action-type="$Data.actionType" :row-data="$Data.rowData" @success="$Method.apiDictList" />
64
- </div>
65
- </template>
66
-
67
- <script setup>
68
- import EditDialog from './components/edit.vue';
69
-
70
- // 响应式数据
71
- const $Data = $ref({
72
- dictList: [],
73
- pagerConfig: {
74
- currentPage: 1,
75
- pageSize: 30,
76
- total: 0,
77
- align: 'right',
78
- layout: 'total, prev, pager, next, jumper'
79
- },
80
- editVisible: false,
81
- actionType: 'add',
82
- rowData: {}
83
- });
84
-
85
- // 方法
86
- const $Method = {
87
- async initData() {
88
- await $Method.apiDictList();
89
- },
90
-
91
- // 加载字典列表
92
- async apiDictList() {
93
- try {
94
- const res = await $Http('/addon/admin/dict/list', {
95
- page: $Data.pagerConfig.currentPage,
96
- limit: $Data.pagerConfig.pageSize
97
- });
98
- $Data.dictList = res.data.lists || [];
99
- $Data.pagerConfig.total = res.data.total || 0;
100
- } catch (error) {
101
- console.error('加载字典列表失败:', error);
102
- Modal.message({
103
- message: '加载数据失败',
104
- status: 'error'
105
- });
106
- }
107
- },
108
-
109
- // 删除字典
110
- async apiDictDel(row) {
111
- Modal.confirm({
112
- header: '确认删除',
113
- body: `确定要删除字典"${row.name}" 吗?`,
114
- status: 'warning'
115
- }).then(async () => {
116
- try {
117
- const res = await $Http('/addon/admin/dict/del', { id: row.id });
118
- if (res.code === 0) {
119
- Modal.message({ message: '删除成功', status: 'success' });
120
- $Method.apiDictList();
121
- } else {
122
- Modal.message({ message: res.msg || '删除失败', status: 'error' });
123
- }
124
- } catch (error) {
125
- console.error('删除失败:', error);
126
- Modal.message({ message: '删除失败', status: 'error' });
127
- }
128
- });
129
- },
130
-
131
- // 刷新
132
- handleRefresh() {
133
- $Method.apiDictList();
134
- },
135
-
136
- // 分页改变
137
- onPageChange({ currentPage }) {
138
- $Data.pagerConfig.currentPage = currentPage;
139
- $Method.apiDictList();
140
- },
141
-
142
- // 操作菜单点击
143
- onAction(command, rowData) {
144
- $Data.actionType = command;
145
- $Data.rowData = rowData;
146
- if (command === 'add' || command === 'upd') {
147
- $Data.editVisible = true;
148
- } else if (command === 'del') {
149
- $Method.apiDictDel(rowData);
150
- }
151
- }
152
- };
153
-
154
- $Method.initData();
155
- </script>
156
-
157
- <style scoped lang="scss">
158
- // 样式继承自全局 page-table
159
- </style>
@@ -1,125 +0,0 @@
1
- <template>
2
- <div class="section-block">
3
- <div class="section-header">
4
- <Icon name="Package" :size="20" />
5
- <h2>已安装插件</h2>
6
- </div>
7
- <div class="section-content">
8
- <div class="addon-list">
9
- <div v-for="addon in addonList" :key="addon.name" class="addon-item">
10
- <div class="addon-status-badge" :class="{ active: addon.enabled }"></div>
11
- <div class="addon-icon">
12
- <Icon name="Box" :size="20" />
13
- </div>
14
- <div class="addon-info">
15
- <div class="addon-title">
16
- <span class="addon-name">{{ addon.title }}</span>
17
- <tiny-tag type="success" size="small">{{ addon.version }}</tiny-tag>
18
- </div>
19
- <div class="addon-desc">{{ addon.description }}</div>
20
- </div>
21
- </div>
22
- </div>
23
- </div>
24
- </div>
25
- </template>
26
-
27
- <script setup>
28
- // 组件内部数据
29
- const addonList = $ref([]);
30
-
31
- // 获取数据
32
- const fetchData = async () => {
33
- try {
34
- const { data } = await $Http('/addon/admin/dashboard/addonList');
35
- addonList.splice(0, addonList.length, ...data);
36
- } catch (error) {
37
- console.error('获取插件列表失败:', error);
38
- }
39
- };
40
-
41
- fetchData();
42
- </script>
43
-
44
- <style scoped lang="scss">
45
- .addon-list {
46
- display: flex;
47
- flex-direction: column;
48
- gap: 8px;
49
-
50
- .addon-item {
51
- position: relative;
52
- background: $bg-color-container;
53
- border: 1px solid $border-color;
54
- border-left: 3px solid $primary-color;
55
- border-radius: $border-radius-small;
56
- padding: 10px 12px;
57
- display: flex;
58
- align-items: center;
59
- gap: 10px;
60
- transition: all 0.3s;
61
-
62
- &:hover {
63
- border-left-color: $success-color;
64
- box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06);
65
- transform: translateY(-2px);
66
- }
67
-
68
- .addon-status-badge {
69
- position: absolute;
70
- top: 8px;
71
- right: 8px;
72
- width: 8px;
73
- height: 8px;
74
- border-radius: 50%;
75
- background: $text-disabled;
76
- transition: all 0.3s;
77
-
78
- &.active {
79
- background: $success-color;
80
- box-shadow: 0 0 0 2px rgba($success-color, 0.2);
81
- }
82
- }
83
-
84
- .addon-icon {
85
- width: 32px;
86
- height: 32px;
87
- background: linear-gradient(135deg, $primary-color, #764ba2);
88
- border-radius: $border-radius-small;
89
- display: flex;
90
- align-items: center;
91
- justify-content: center;
92
- color: white;
93
- flex-shrink: 0;
94
- }
95
-
96
- .addon-info {
97
- flex: 1;
98
- min-width: 0;
99
- padding-right: 16px;
100
-
101
- .addon-title {
102
- display: flex;
103
- align-items: center;
104
- gap: 6px;
105
- margin-bottom: 2px;
106
-
107
- .addon-name {
108
- font-size: 14px;
109
- font-weight: 600;
110
- color: $text-primary;
111
- }
112
- }
113
-
114
- .addon-desc {
115
- font-size: 14px;
116
- color: $text-secondary;
117
- line-height: 1.3;
118
- overflow: hidden;
119
- text-overflow: ellipsis;
120
- white-space: nowrap;
121
- }
122
- }
123
- }
124
- }
125
- </style>
@@ -1,97 +0,0 @@
1
- <template>
2
- <div class="section-block">
3
- <div class="section-header">
4
- <Icon name="Server" :size="20" />
5
- <h2>运行环境</h2>
6
- </div>
7
- <div class="section-content">
8
- <div class="env-grid-compact">
9
- <div class="env-compact-item">
10
- <span class="env-label">操作系统</span>
11
- <span class="env-value">{{ environmentInfo.os }}</span>
12
- </div>
13
- <div class="env-compact-item">
14
- <span class="env-label">服务器</span>
15
- <span class="env-value">{{ environmentInfo.server }}</span>
16
- </div>
17
- <div class="env-compact-item">
18
- <span class="env-label">Node版本</span>
19
- <span class="env-value">{{ environmentInfo.nodeVersion }}</span>
20
- </div>
21
- <div class="env-compact-item">
22
- <span class="env-label">数据库</span>
23
- <span class="env-value">{{ environmentInfo.database }}</span>
24
- </div>
25
- <div class="env-compact-item">
26
- <span class="env-label">缓存</span>
27
- <span class="env-value">{{ environmentInfo.cache }}</span>
28
- </div>
29
- <div class="env-compact-item">
30
- <span class="env-label">时区</span>
31
- <span class="env-value">{{ environmentInfo.timezone }}</span>
32
- </div>
33
- </div>
34
- </div>
35
- </div>
36
- </template>
37
-
38
- <script setup>
39
- // 组件内部数据
40
- const environmentInfo = $ref({
41
- os: '',
42
- server: '',
43
- nodeVersion: '',
44
- database: '',
45
- cache: '',
46
- timezone: ''
47
- });
48
-
49
- // 获取数据
50
- const fetchData = async () => {
51
- try {
52
- const { data } = await $Http('/addon/admin/dashboard/environmentInfo');
53
- Object.assign(environmentInfo, data);
54
- } catch (error) {
55
- console.error('获取运行环境信息失败:', error);
56
- }
57
- };
58
-
59
- fetchData();
60
- </script>
61
-
62
- <style scoped lang="scss">
63
- .env-grid-compact {
64
- display: grid;
65
- grid-template-columns: repeat(4, 1fr);
66
- gap: 10px;
67
-
68
- .env-compact-item {
69
- display: flex;
70
- justify-content: space-between;
71
- align-items: center;
72
- padding: 10px 12px;
73
- background: $bg-color-container;
74
- border-radius: 6px;
75
- border: 1px solid $border-color;
76
- transition: all 0.2s ease;
77
-
78
- &:hover {
79
- background: rgba($primary-color, 0.03);
80
- border-color: rgba($primary-color, 0.2);
81
- }
82
-
83
- .env-label {
84
- font-size: 14px;
85
- color: $text-secondary;
86
- font-weight: 500;
87
- }
88
-
89
- .env-value {
90
- font-size: 14px;
91
- color: $text-primary;
92
- font-weight: 600;
93
- text-align: right;
94
- }
95
- }
96
- }
97
- </style>
@@ -1,112 +0,0 @@
1
- <template>
2
- <div class="section-block">
3
- <div class="section-header">
4
- <Icon name="List" :size="20" />
5
- <h2>操作日志</h2>
6
- </div>
7
- <div class="section-content">
8
- <div class="operation-table">
9
- <div class="operation-header">
10
- <span class="col-time">时间</span>
11
- <span class="col-user">操作人</span>
12
- <span class="col-action">操作</span>
13
- <span class="col-module">模块</span>
14
- <span class="col-ip">IP地址</span>
15
- <span class="col-status">状态</span>
16
- </div>
17
- <div class="operation-body">
18
- <div v-for="log in operationLogs" :key="log.id" class="operation-row">
19
- <span class="col-time">{{ formatTime(log.createdAt) }}</span>
20
- <span class="col-user">{{ log.userName }}</span>
21
- <span class="col-action">{{ log.action }}</span>
22
- <span class="col-module">{{ log.module }}</span>
23
- <span class="col-ip">{{ log.ip }}</span>
24
- <span class="col-status">
25
- <tiny-tag :type="log.status === 'success' ? 'success' : 'danger'" size="small">
26
- {{ log.status === 'success' ? '成功' : '失败' }}
27
- </tiny-tag>
28
- </span>
29
- </div>
30
- </div>
31
- </div>
32
- </div>
33
- </div>
34
- </template>
35
-
36
- <script setup>
37
- // 组件内部数据
38
- const operationLogs = $ref([
39
- { id: 1, userName: '管理员', action: '创建角色', module: '权限管理', ip: '192.168.1.100', status: 'success', createdAt: Date.now() - 120000 },
40
- { id: 2, userName: '张三', action: '修改菜单', module: '系统设置', ip: '192.168.1.101', status: 'success', createdAt: Date.now() - 900000 },
41
- { id: 3, userName: '李四', action: '删除接口', module: '接口管理', ip: '192.168.1.102', status: 'failed', createdAt: Date.now() - 3600000 },
42
- { id: 4, userName: '管理员', action: '同步数据库', module: '数据库', ip: '192.168.1.100', status: 'success', createdAt: Date.now() - 7200000 },
43
- { id: 5, userName: '王五', action: '登录系统', module: '系统', ip: '192.168.1.103', status: 'success', createdAt: Date.now() - 10800000 }
44
- ]);
45
-
46
- const formatTime = (timestamp) => {
47
- const date = new Date(timestamp);
48
- const month = String(date.getMonth() + 1).padStart(2, '0');
49
- const day = String(date.getDate()).padStart(2, '0');
50
- const hours = String(date.getHours()).padStart(2, '0');
51
- const minutes = String(date.getMinutes()).padStart(2, '0');
52
- return `${month}-${day} ${hours}:${minutes}`;
53
- };
54
- </script>
55
-
56
- <style scoped lang="scss">
57
- .operation-table {
58
- .operation-header,
59
- .operation-row {
60
- display: grid;
61
- grid-template-columns: 100px 100px 1fr 120px 120px 80px;
62
- gap: 12px;
63
- align-items: center;
64
- }
65
-
66
- .operation-header {
67
- padding: 10px 12px;
68
- background: linear-gradient(135deg, rgba($primary-color, 0.05) 0%, rgba($primary-color, 0.02) 100%);
69
- border-radius: 6px;
70
- font-size: 14px;
71
- font-weight: 600;
72
- color: $text-secondary;
73
- margin-bottom: 6px;
74
- }
75
-
76
- .operation-body {
77
- display: flex;
78
- flex-direction: column;
79
- gap: 4px;
80
- }
81
-
82
- .operation-row {
83
- padding: 10px 12px;
84
- background: $bg-color-container;
85
- border-radius: 6px;
86
- border: 1px solid $border-color;
87
- font-size: 14px;
88
- transition: all 0.2s ease;
89
-
90
- &:hover {
91
- background: rgba($primary-color, 0.02);
92
- border-color: rgba($primary-color, 0.2);
93
- }
94
-
95
- .col-time {
96
- color: $text-secondary;
97
- font-size: 14px;
98
- }
99
-
100
- .col-user,
101
- .col-action,
102
- .col-module,
103
- .col-ip {
104
- color: $text-primary;
105
- }
106
-
107
- .col-action {
108
- font-weight: 600;
109
- }
110
- }
111
- }
112
- </style>
@@ -1,148 +0,0 @@
1
- <template>
2
- <div class="section-block">
3
- <div class="section-header">
4
- <Icon name="Zap" :size="20" />
5
- <h2>性能指标</h2>
6
- </div>
7
- <div class="section-content">
8
- <div class="performance-grid">
9
- <div class="perf-metric">
10
- <div class="perf-icon">
11
- <Icon name="Clock" :size="18" />
12
- </div>
13
- <div class="perf-info">
14
- <div class="perf-label">平均响应</div>
15
- <div class="perf-value">{{ performanceMetrics.avgResponseTime }}ms</div>
16
- </div>
17
- </div>
18
- <div class="perf-metric">
19
- <div class="perf-icon">
20
- <Icon name="TrendingUp" :size="18" />
21
- </div>
22
- <div class="perf-info">
23
- <div class="perf-label">QPS</div>
24
- <div class="perf-value">{{ performanceMetrics.qps }}/s</div>
25
- </div>
26
- </div>
27
- <div class="perf-metric">
28
- <div class="perf-icon">
29
- <Icon name="AlertCircle" :size="18" />
30
- </div>
31
- <div class="perf-info">
32
- <div class="perf-label">错误率</div>
33
- <div class="perf-value">{{ performanceMetrics.errorRate }}%</div>
34
- </div>
35
- </div>
36
- <div class="perf-metric">
37
- <div class="perf-icon">
38
- <Icon name="Activity" :size="18" />
39
- </div>
40
- <div class="perf-info">
41
- <div class="perf-label">活跃连接</div>
42
- <div class="perf-value">{{ performanceMetrics.activeConnections }}</div>
43
- </div>
44
- </div>
45
- </div>
46
- <!-- 最慢接口提示 -->
47
- <div v-if="performanceMetrics.slowestApi" class="perf-slowest">
48
- <Icon name="AlertTriangle" :size="14" />
49
- <span>最慢接口: {{ performanceMetrics.slowestApi.path }} ({{ performanceMetrics.slowestApi.time }}ms)</span>
50
- </div>
51
- </div>
52
- </div>
53
- </template>
54
-
55
- <script setup>
56
- // 组件内部数据
57
- const performanceMetrics = $ref({
58
- avgResponseTime: 0,
59
- qps: 0,
60
- errorRate: 0,
61
- activeConnections: 0,
62
- slowestApi: null
63
- });
64
-
65
- // 获取数据
66
- const fetchData = async () => {
67
- try {
68
- const { data } = await $Http('/addon/admin/dashboard/performanceMetrics');
69
- Object.assign(performanceMetrics, data);
70
- } catch (error) {
71
- console.error('获取性能指标失败:', error);
72
- }
73
- };
74
-
75
- fetchData();
76
- </script>
77
-
78
- <style scoped lang="scss">
79
- .performance-grid {
80
- display: grid;
81
- grid-template-columns: repeat(4, 1fr);
82
- gap: $spacing-sm;
83
- margin-bottom: $spacing-sm;
84
-
85
- .perf-metric {
86
- display: flex;
87
- align-items: center;
88
- gap: $spacing-sm;
89
- padding: $spacing-sm $spacing-md;
90
- background: rgba($primary-color, 0.02);
91
- border-radius: $border-radius;
92
- border: 1px solid $border-color;
93
- transition: all 0.2s ease;
94
-
95
- &:hover {
96
- background: rgba($primary-color, 0.05);
97
- border-color: $primary-color;
98
- }
99
-
100
- .perf-icon {
101
- display: flex;
102
- align-items: center;
103
- justify-content: center;
104
- width: 36px;
105
- height: 36px;
106
- border-radius: $border-radius-small;
107
- background: linear-gradient(135deg, rgba($success-color, 0.1) 0%, rgba($success-color, 0.05) 100%);
108
- color: $success-color;
109
- flex-shrink: 0;
110
- }
111
-
112
- .perf-info {
113
- flex: 1;
114
-
115
- .perf-label {
116
- font-size: 14px;
117
- color: $text-secondary;
118
- margin-bottom: 2px;
119
- }
120
-
121
- .perf-value {
122
- font-size: 16px;
123
- font-weight: 700;
124
- color: $primary-color;
125
- }
126
- }
127
- }
128
- }
129
-
130
- .perf-slowest {
131
- display: flex;
132
- align-items: center;
133
- gap: 6px;
134
- padding: $spacing-sm $spacing-md;
135
- background: rgba($warning-color, 0.05);
136
- border-radius: $border-radius-small;
137
- border: 1px solid rgba($warning-color, 0.2);
138
- font-size: 14px;
139
- color: $warning-color;
140
-
141
- span {
142
- flex: 1;
143
- overflow: hidden;
144
- text-overflow: ellipsis;
145
- white-space: nowrap;
146
- }
147
- }
148
- </style>
@@ -1,27 +0,0 @@
1
- <template>
2
- <div class="section-block">
3
- <div class="section-content">
4
- <tiny-button type="primary" size="large" @click="handleClearCache">
5
- <template #prefix>
6
- <Icon name="RotateCw" :size="18" />
7
- </template>
8
- 刷新缓存
9
- </tiny-button>
10
- </div>
11
- </div>
12
- </template>
13
-
14
- <script setup>
15
- const handleClearCache = () => {
16
- console.log('刷新缓存');
17
- };
18
- </script>
19
-
20
- <style scoped lang="scss">
21
- .section-block {
22
- .section-content {
23
- display: flex;
24
- justify-content: center;
25
- }
26
- }
27
- </style>