+
-
-
-
📊
-
-
数据更新
-
月度报告已生成
-
30分钟前
-
-
-
-
-
⚠️
-
-
系统警告
-
服务器负载较高
-
1小时前
-
-
-
-
-
📁
-
-
文件上传
-
项目文档已上传
-
2小时前
+
-
-
-
快速操作
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
🧩
+
暂无组件
+
点击自定义按钮添加组件
+
+
+
+
+
+
+
+
+
+
+
+
+
工作台快捷链接
+
+
+
+
+ {{ link.icon }}
+
+ {{ link.name }}
+
+
+
+
+
+
+
+
+
组件显示
+
+
+
+
+ {{ widget.icon }}
+
+ {{ widget.name }}
+
+
+
+
+
+
+
+
@@ -119,55 +373,199 @@
opacity: 0;
transform: translateY(10px);
}
-
to {
opacity: 1;
transform: translateY(0);
}
}
+/* 头部样式 */
+.dashboard-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 24px;
+ flex-wrap: wrap;
+ gap: 16px;
+}
+
.page-title {
font-size: 28px;
font-weight: 600;
color: #333;
- margin-bottom: 24px;
+ margin: 0;
}
-.dashboard-cards {
+.mode-switcher {
+ display: flex;
+ gap: 8px;
+ background: #f5f5f5;
+ padding: 4px;
+ border-radius: 8px;
+}
+
+.mode-btn {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ padding: 8px 16px;
+ border: none;
+ background: transparent;
+ border-radius: 6px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ font-size: 14px;
+ color: #666;
+}
+
+.mode-btn:hover {
+ background: rgba(0, 0, 0, 0.05);
+}
+
+.mode-btn.active {
+ background: white;
+ color: #1890ff;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+}
+
+.mode-icon {
+ font-size: 16px;
+}
+
+.customize-btn {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ padding: 8px 16px;
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ border: none;
+ border-radius: 8px;
+ color: white;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ font-size: 14px;
+ font-weight: 500;
+}
+
+.customize-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
+}
+
+/* 工作台模式样式 */
+.welcome-banner {
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ border-radius: 16px;
+ padding: 32px;
+ margin-bottom: 24px;
+ color: white;
+}
+
+.welcome-content h2 {
+ font-size: 24px;
+ margin: 0 0 8px;
+}
+
+.welcome-content p {
+ font-size: 16px;
+ margin: 0;
+ opacity: 0.9;
+}
+
+.work-links-grid {
display: grid;
- grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 20px;
- margin-bottom: 24px;
}
-.stat-card {
- background: #fff;
+.work-link-card {
+ background: white;
border-radius: 12px;
- padding: 20px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ padding: 24px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
display: flex;
align-items: center;
gap: 16px;
+ cursor: pointer;
transition: all 0.3s ease;
+ border-left: 4px solid var(--accent-color);
}
-.stat-card:hover {
+.work-link-card:hover {
transform: translateY(-4px);
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
}
-.stat-icon {
+.link-icon {
width: 56px;
height: 56px;
border-radius: 12px;
- background: linear-gradient(135deg, rgba(102, 126, 234, 0.1) 0%, rgba(118, 75, 162, 0.1) 100%);
display: flex;
align-items: center;
justify-content: center;
font-size: 28px;
}
-.stat-info {
+.link-name {
+ flex: 1;
+ font-size: 16px;
+ font-weight: 600;
+ color: #333;
+}
+
+.link-arrow {
+ font-size: 20px;
+ color: var(--accent-color);
+ transition: transform 0.3s ease;
+}
+
+.work-link-card:hover .link-arrow {
+ transform: translateX(4px);
+}
+
+/* 组件模式样式 */
+.widgets-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
+ gap: 20px;
+}
+
+.widgets-grid .large {
+ grid-column: span 2;
+}
+
+.widget-card {
+ background: white;
+ border-radius: 12px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+ overflow: hidden;
+}
+
+.widget-header {
+ padding: 16px 20px;
+ border-bottom: 1px solid #f0f0f0;
+}
+
+.widget-title {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-size: 16px;
+ font-weight: 600;
+ color: #333;
+}
+
+.widget-body {
+ padding: 20px;
+}
+
+/* 统计组件 */
+.stat-row {
+ display: flex;
+ gap: 24px;
+}
+
+.stat-item {
flex: 1;
}
@@ -178,92 +576,78 @@
}
.stat-value {
- font-size: 24px;
+ font-size: 28px;
font-weight: 700;
color: #333;
- margin-bottom: 4px;
}
-.stat-change {
+/* 图表组件 */
+.chart-placeholder {
+ padding: 10px 0;
+}
+
+.chart-bars {
+ display: flex;
+ align-items: flex-end;
+ gap: 12px;
+ height: 120px;
+ margin-bottom: 12px;
+}
+
+.chart-bar {
+ flex: 1;
+ background: linear-gradient(180deg, #667eea 0%, #764ba2 100%);
+ border-radius: 4px 4px 0 0;
+ transition: height 0.3s ease;
+}
+
+.chart-labels {
+ display: flex;
+ justify-content: space-between;
font-size: 12px;
- font-weight: 500;
-}
-
-.stat-change.positive {
- color: #52c41a;
-}
-
-.stat-change.negative {
- color: #f5222d;
-}
-
-.dashboard-content {
- display: grid;
- grid-template-columns: 2fr 1fr;
- gap: 20px;
-}
-
-.content-card {
- background: #fff;
- border-radius: 12px;
- padding: 20px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-}
-
-.content-card h2 {
- font-size: 18px;
- font-weight: 600;
- color: #333;
- margin: 0 0 16px;
+ color: #999;
}
+/* 活动列表 */
.activity-list {
display: flex;
flex-direction: column;
- gap: 16px;
+ gap: 12px;
}
.activity-item {
- display: flex;
- align-items: flex-start;
- gap: 12px;
- padding: 12px;
- border-radius: 8px;
- transition: background 0.3s ease;
-}
-
-.activity-item:hover {
- background: #f8f9ff;
-}
-
-.activity-icon {
- width: 36px;
- height: 36px;
- border-radius: 50%;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- color: white;
display: flex;
align-items: center;
- justify-content: center;
- font-size: 16px;
+ gap: 12px;
+}
+
+.activity-dot {
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
flex-shrink: 0;
}
-.activity-info {
+.activity-dot.success {
+ background: #52c41a;
+}
+
+.activity-dot.warning {
+ background: #fa8c16;
+}
+
+.activity-dot.info {
+ background: #1890ff;
+}
+
+.activity-content {
flex: 1;
}
-.activity-title {
+.activity-text {
font-size: 14px;
- font-weight: 600;
color: #333;
- margin-bottom: 4px;
-}
-
-.activity-desc {
- font-size: 13px;
- color: #666;
- margin-bottom: 4px;
+ margin-bottom: 2px;
}
.activity-time {
@@ -271,53 +655,303 @@
color: #999;
}
+/* 快速操作 */
.quick-actions {
display: grid;
grid-template-columns: repeat(2, 1fr);
- gap: 12px;
+ gap: 10px;
}
-.action-btn {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 8px;
- padding: 20px 16px;
- background: linear-gradient(135deg, rgba(102, 126, 234, 0.05) 0%, rgba(118, 75, 162, 0.05) 100%);
+.quick-action-btn {
+ padding: 12px 16px;
+ background: #f8f9ff;
border: 2px solid transparent;
border-radius: 8px;
cursor: pointer;
transition: all 0.3s ease;
font-size: 14px;
color: #333;
- background: #f8f9ff;
}
-.action-btn:hover {
+.quick-action-btn:hover {
border-color: #667eea;
- transform: translateY(-2px);
+ background: white;
}
-.action-icon {
+/* 空状态 */
+.empty-state {
+ grid-column: 1 / -1;
+ text-align: center;
+ padding: 60px 20px;
+ background: #fafafa;
+ border-radius: 12px;
+}
+
+.empty-icon {
+ font-size: 48px;
+ margin-bottom: 16px;
+}
+
+.empty-text {
+ font-size: 18px;
+ font-weight: 600;
+ color: #333;
+ margin-bottom: 8px;
+}
+
+.empty-desc {
+ font-size: 14px;
+ color: #999;
+}
+
+/* 弹窗样式 */
+.modal-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: rgba(0, 0, 0, 0.5);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 1000;
+ padding: 20px;
+ animation: fadeIn 0.2s ease;
+}
+
+.modal-content {
+ background: white;
+ border-radius: 16px;
+ width: 100%;
+ max-width: 600px;
+ max-height: 90vh;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ animation: slideUp 0.3s ease;
+}
+
+@keyframes slideUp {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.modal-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 20px 24px;
+ border-bottom: 1px solid #f0f0f0;
+}
+
+.modal-header h2 {
+ font-size: 20px;
+ font-weight: 600;
+ color: #333;
+ margin: 0;
+}
+
+.modal-close {
+ width: 32px;
+ height: 32px;
+ border: none;
+ background: #f5f5f5;
+ border-radius: 6px;
+ cursor: pointer;
font-size: 24px;
+ color: #666;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: all 0.3s ease;
}
+.modal-close:hover {
+ background: #e5e5e5;
+}
+
+.modal-body {
+ flex: 1;
+ overflow-y: auto;
+ padding: 24px;
+}
+
+.config-section {
+ margin-bottom: 32px;
+}
+
+.config-section:last-child {
+ margin-bottom: 0;
+}
+
+.config-section h3 {
+ font-size: 16px;
+ font-weight: 600;
+ color: #333;
+ margin: 0 0 16px;
+}
+
+.config-items {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.config-item {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 12px 16px;
+ background: #fafafa;
+ border-radius: 8px;
+ transition: background 0.3s ease;
+}
+
+.config-item:hover {
+ background: #f5f5f5;
+}
+
+.item-info {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+}
+
+.item-icon {
+ width: 40px;
+ height: 40px;
+ border-radius: 8px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 20px;
+}
+
+.item-name {
+ font-size: 14px;
+ font-weight: 500;
+ color: #333;
+}
+
+/* 切换开关 */
+.toggle-switch {
+ position: relative;
+ width: 48px;
+ height: 24px;
+}
+
+.toggle-switch input {
+ opacity: 0;
+ width: 0;
+ height: 0;
+}
+
+.toggle-slider {
+ position: absolute;
+ cursor: pointer;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-color: #d9d9d9;
+ transition: 0.3s;
+ border-radius: 24px;
+}
+
+.toggle-slider:before {
+ position: absolute;
+ content: '';
+ height: 18px;
+ width: 18px;
+ left: 3px;
+ bottom: 3px;
+ background-color: white;
+ transition: 0.3s;
+ border-radius: 50%;
+}
+
+.toggle-switch input:checked + .toggle-slider {
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+}
+
+.toggle-switch input:checked + .toggle-slider:before {
+ transform: translateX(24px);
+}
+
+.modal-footer {
+ display: flex;
+ gap: 12px;
+ justify-content: flex-end;
+ padding: 16px 24px;
+ border-top: 1px solid #f0f0f0;
+}
+
+.btn {
+ padding: 10px 20px;
+ border: none;
+ border-radius: 8px;
+ cursor: pointer;
+ font-size: 14px;
+ font-weight: 500;
+ transition: all 0.3s ease;
+}
+
+.btn-secondary {
+ background: #f5f5f5;
+ color: #666;
+}
+
+.btn-secondary:hover {
+ background: #e5e5e5;
+}
+
+.btn-primary {
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ color: white;
+}
+
+.btn-primary:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
+}
+
+/* 响应式设计 */
@media (max-width: 1024px) {
- .dashboard-content {
- grid-template-columns: 1fr;
+ .widgets-grid .large {
+ grid-column: span 1;
}
}
@media (max-width: 768px) {
+ .dashboard-header {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
.page-title {
font-size: 22px;
}
- .dashboard-cards {
+ .mode-switcher {
+ justify-content: center;
+ }
+
+ .customize-btn {
+ justify-content: center;
+ }
+
+ .work-links-grid {
grid-template-columns: 1fr;
}
- .quick-actions {
+ .widgets-grid {
grid-template-columns: 1fr;
}
}
diff --git a/src/pages/system/setting/index.vue b/src/pages/system/setting/index.vue
new file mode 100644
index 0000000..3db9e7c
--- /dev/null
+++ b/src/pages/system/setting/index.vue
@@ -0,0 +1,314 @@
+
+
+
+
+
+
+
+
+
结果:
+
{{ singleImage || '暂无图片' }}
+
+
+
+
+
+
+
+
结果:
+
+ {{ multipleImages.join(', ') }}
+
+
暂无图片
+
+
+
+
+
+
+
+
+
+
+
+
+
结果:
+
{{ sizeImage || '暂无图片' }}
+
+
+
+
+
+
+
+
结果:
+
{{ customImage || '暂无图片' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
结果:
+
{{ eventImage || '暂无图片' }}
+
+ 事件日志:
+
{{ eventLog }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
结果:
+
{{ singleFile || '暂无文件' }}
+
+
+
+
+
+
+
+
结果:
+
+ {{ multipleFiles.join(', ') }}
+
+
暂无文件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
完整文件列表:
+
{{ JSON.stringify(fullFileList, null, 2) }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/upload/index.vue b/src/pages/upload/index.vue
new file mode 100644
index 0000000..3db9e7c
--- /dev/null
+++ b/src/pages/upload/index.vue
@@ -0,0 +1,314 @@
+
+
+
+
+
+
+
+
+
结果:
+
{{ singleImage || '暂无图片' }}
+
+
+
+
+
+
+
+
结果:
+
+ {{ multipleImages.join(', ') }}
+
+
暂无图片
+
+
+
+
+
+
+
+
+
+
+
+
+
结果:
+
{{ sizeImage || '暂无图片' }}
+
+
+
+
+
+
+
+
结果:
+
{{ customImage || '暂无图片' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
结果:
+
{{ eventImage || '暂无图片' }}
+
+ 事件日志:
+
{{ eventLog }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
结果:
+
{{ singleFile || '暂无文件' }}
+
+
+
+
+
+
+
+
结果:
+
+ {{ multipleFiles.join(', ') }}
+
+
暂无文件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
完整文件列表:
+
{{ JSON.stringify(fullFileList, null, 2) }}
+
+
+
+
+
+
+
+
+
+
+