diff --git a/src/composables/useSystemConfig.ts b/src/composables/useSystemConfig.ts
new file mode 100644
index 0000000..e69de29
diff --git a/src/layout/AdminLayout/AdminLayout.vue b/src/layout/AdminLayout/AdminLayout.vue
new file mode 100644
index 0000000..a9b4040
--- /dev/null
+++ b/src/layout/AdminLayout/AdminLayout.vue
@@ -0,0 +1,239 @@
+
+
+
+
+
+
+
diff --git a/src/router/index.ts b/src/router/index.ts
index d08c0b1..57f9108 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -14,9 +14,32 @@ const router = createRouter({
component: () => import('@/views/SendFileView.vue')
},
{
- path: '/manage',
+ path: '/admin',
name: 'Manage',
- component: () => import('@/views/ManageView.vue')
+ component: () => import('@/layout/AdminLayout/AdminLayout.vue'),
+ redirect: '/admin/dashboard',
+ children: [
+ {
+ path: '/admin/dashboard',
+ name: 'Dashboard',
+ component: () => import('@/views/manage/DashboardView.vue')
+ },
+ {
+ path: '/admin/files',
+ name: 'FileManage',
+ component: () => import('@/views/manage/FileManageView.vue')
+ },
+ {
+ path: '/admin/settings',
+ name: 'Settings',
+ component: () => import('@/views/manage/SystemSettingsView.vue')
+ }
+ ]
+ },
+ {
+ path: '/login',
+ name: 'Login',
+ component: () => import('@/views/LoginView.vue')
}
]
})
diff --git a/src/stores/adminStore.ts b/src/stores/adminStore.ts
new file mode 100644
index 0000000..9986d22
--- /dev/null
+++ b/src/stores/adminStore.ts
@@ -0,0 +1,11 @@
+import { defineStore } from 'pinia'
+import { ref } from 'vue'
+
+export const useAdminData = defineStore('adminData', () => {
+ const adminPassword = ref(localStorage.getItem('adminPassword') || '')
+ function updateAdminPwd(pwd: string) {
+ adminPassword.value = pwd
+ localStorage.setItem('token', pwd)
+ }
+ return { adminPassword, updateAdminPwd }
+})
diff --git a/src/stores/counter.ts b/src/stores/counter.ts
deleted file mode 100644
index b6757ba..0000000
--- a/src/stores/counter.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { ref, computed } from 'vue'
-import { defineStore } from 'pinia'
-
-export const useCounterStore = defineStore('counter', () => {
- const count = ref(0)
- const doubleCount = computed(() => count.value * 2)
- function increment() {
- count.value++
- }
-
- return { count, doubleCount, increment }
-})
diff --git a/src/utils/api.ts b/src/utils/api.ts
index bbad035..85c879c 100644
--- a/src/utils/api.ts
+++ b/src/utils/api.ts
@@ -1,4 +1,5 @@
import axios from 'axios'
+import { useRouter } from 'vue-router'
// 从环境变量中获取 API 基础 URL
const baseURL =
@@ -38,7 +39,6 @@ api.interceptors.request.use(
return Promise.reject(error)
}
)
-
// 响应拦截器
api.interceptors.response.use(
(response) => {
@@ -49,8 +49,9 @@ api.interceptors.response.use(
if (error.response) {
switch (error.response.status) {
case 401:
- // 未授权,可能需要重新登录
console.error('未授权,请重新登录')
+ localStorage.clear()
+ window.location.href = '/login'
break
case 403:
// 禁止访问
diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue
new file mode 100644
index 0000000..4192b3c
--- /dev/null
+++ b/src/views/LoginView.vue
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
diff --git a/src/views/ManageView.vue b/src/views/ManageView.vue
index 812762b..52eec51 100644
--- a/src/views/ManageView.vue
+++ b/src/views/ManageView.vue
@@ -631,7 +631,7 @@
-
diff --git a/src/views/SendFileView.vue b/src/views/SendFileView.vue
index d3f7b0d..f543119 100644
--- a/src/views/SendFileView.vue
+++ b/src/views/SendFileView.vue
@@ -662,9 +662,13 @@ const handleSubmit = async () => {
} else {
throw new Error('服务器响应异常')
}
- } catch (error) {
+ } catch (error: any) {
console.error('发送失败:', error)
- alertStore.showAlert('发送失败,请稍后重试', 'error')
+ if (error.response.data.detail) {
+ alertStore.showAlert(error.response.data.detail, 'error')
+ } else {
+ alertStore.showAlert('发送失败,请稍后重试', 'error')
+ }
} finally {
// 确保无论成功还是失败,最后都重置进度条
uploadProgress.value = 0
diff --git a/src/views/manage/DashboardView.vue b/src/views/manage/DashboardView.vue
new file mode 100644
index 0000000..9f5f9fb
--- /dev/null
+++ b/src/views/manage/DashboardView.vue
@@ -0,0 +1,257 @@
+
+
+
+ 仪表盘
+
+
+
+
+
+
+
+
+ 总文件数
+
+
+ {{ dashboardData.totalFiles }}
+
+
+
+
+
+
+
+ 昨天:
+ {{ dashboardData.yesterdayCount }}
+ 今天:
+ {{ dashboardData.todayCount }}
+
+
+
+
+
+
+
+ 存储空间
+
+
+ {{ dashboardData.storageUsed }}
+
+
+
+
+
+
+
+
+ 昨天:
+ {{ dashboardData.yesterdaySize }}
+ 今天:
+ {{ dashboardData.todaySize }}
+
+
+
+
+
+
+
+
+ 服务器运行时间: {{ dashboardData.sysUptime }}
+
+
+
+
+
+
+
+
+ 最近活动
+
+
+
+
+
+
+
+
+
+
+ {{ activity.description }}
+
+
+ {{ activity.time }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/manage/FileManageView.vue b/src/views/manage/FileManageView.vue
new file mode 100644
index 0000000..a118031
--- /dev/null
+++ b/src/views/manage/FileManageView.vue
@@ -0,0 +1,369 @@
+
+
+
+ 文件管理
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 所有文件
+
+
+
+
+
+
+ |
+ {{ header }}
+ |
+
+
+
+
+ |
+
+
+
+ {{ file.name }}
+
+
+ |
+
+
+ {{ file.size }}
+
+ |
+
+
+ {{ file.type }}
+
+ |
+
+
+ {{ file.lastModified }}
+
+ |
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+ 显示第 {{ (params.page - 1) * params.size + 1 }} 到
+ {{ Math.min(params.page * params.size, params.total) }} 条,共 {{ params.total }} 条
+
+
+
+
+
+
+
+
+
+
+
+
+ ...
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/manage/SystemSettingsView.vue b/src/views/manage/SystemSettingsView.vue
new file mode 100644
index 0000000..b6aa6bd
--- /dev/null
+++ b/src/views/manage/SystemSettingsView.vue
@@ -0,0 +1,750 @@
+
+
+
+
+
+