From 969a46a81baa4daebf2c025cbe7def0509c263c2 Mon Sep 17 00:00:00 2001 From: dash <1549469775@qq.com> Date: Sat, 22 Nov 2025 15:04:03 +0800 Subject: [PATCH] Refactor project structure and enhance UI components. Added health check endpoint, improved styles, and updated form elements. Removed index.html and added variables.css for better styling management. Updated various components for a cohesive design and user experience. --- .gitignore | 2 + backend/database/dev.sqlite3 | Bin 65536 -> 65536 bytes backend/src/routes/index.ts | 5 + frontend/src/App.vue | 44 ++- frontend/src/api/auth.ts | 8 +- frontend/src/components/Drawer.vue | 82 +++-- frontend/src/components/NavBar.vue | 163 ++++++--- frontend/src/components/ProjectCard.vue | 247 +++++++++----- frontend/src/main.ts | 1 + frontend/src/styles/variables.css | 157 +++++++++ frontend/src/views/Home.vue | 230 +++++++++---- frontend/src/views/Login.vue | 217 +++++++----- frontend/src/views/Project.vue | 366 ++++++++++++++------- frontend/src/views/Register.vue | 240 +++++++++----- frontend/src/views/Settings.vue | 232 +++++++++---- frontend/src/views/Upload.vue | 566 +++++++++++++++++++++----------- index.html | 11 - 17 files changed, 1784 insertions(+), 787 deletions(-) create mode 100644 frontend/src/styles/variables.css delete mode 100644 index.html diff --git a/.gitignore b/.gitignore index cddf356..47eed78 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,6 @@ database/*.sqlite3 uploads/ .vscode/ .idea/ +backup/ +*.zip diff --git a/backend/database/dev.sqlite3 b/backend/database/dev.sqlite3 index 8ca0d6454c8bbeef4efed935907fdd40203a3033..8a29b04066f3900cd8ee24584f12c1d50d8a9f01 100644 GIT binary patch delta 882 zcmaKqUr19?9LLYyo%?_9*GVO-L~Z#vcJJ=y{*W;1!G|8K7k!Yh%XX#NY~rT%QrkmC z6zJq81sR2fMHCYEMU*n72s98QgkJKYObyZ~q);C^TZ)y|%i(u^hwt}u&hLCP8GR6!b7BSL$eDpsA)IvVhJIfSx%+o$cYvOM%Kw} zY)++;I$Hr-!nC#}nw3Z@$!kOI8o|jG6W%n)SmzMq57;hp{ah8lXib@WEvuFbmLhYB zX;3RKylP5EcpEX>39;8Y9FkOB-Ed5FuX{C${z}R3^9ljKFA#7mXHso)B&9@~67i^# zD`OpsNAUPuqUiF7WnwVo6+<5XHm$Q9g*aTqe$+`JNjWMfqh$-%N9ME6`?GiN&35+B z_FUddmI7YCROwa4le^T0=AzxfkmTP2$hXwqSclMRqm)wmlstvnf4upWx^Lqvd3~Zc z@SCqE7!rJcUOeB@&NpWY%6JSDtl>Mp;xp#)9`EoLZ!n2*yudRI)1SHq=vgzv=N2xv z*wpcKh$=OLZ&<_vK41n@c!if3!xIcb!!&+SWmir~a!Qg@5~>{QI%we$CaA+S!(x%F{?id*K5cE*jE3n3NCc>1*bdtoWw+9?1-^Msc2P*dedz2O$ zHU=vME7ax_x{nx&3Rs5WbR0d<8K#M~-Y`wGGj8B6ony^}ab#;El%XjTPW`^W!?VtG zM-!3u7KNtOtxiqu{LfEn^%IZuCLNXuR0Np*B7V5AWgLPAijU3!qKX&i;VFNHq=3xN5o delta 660 zcmZ9KOH31C5XZl5OUv%IJ1y~5lqeyD6P8je(#S;*9>s&cXV8O*z8#s%xg7!xu{=kh;%gsm_A;i(w zTLZTX%35SBquOq@23rD=Fe@#&F4mMWC5WYyh}D4S&RJu&DO)4A%|_@XlV>`ma{FBx zC;2;8+ffvzD-m*Bu5jW+uo1WMCHQObnA8~*ib`2nN3aXO;RkGi4x8`=KEo$?59?&M zS-|Up?+6QP2!6sgNodHse>?70`QO6h6-i$t%R)_AX6O-D?kP;hK?vLs1*`1ZR z+7nZ{V!5QK&PR!qmmg}&F;yJV#dacz5_~LPOGCY)zJ=Rp-X$xp-&Ge zOH%|9^x=e(=~g { + ctx.body = { status: 'ok', timestamp: new Date().toISOString() }; +}); + router.use('/api/auth', authRoutes.routes()); router.use('/api/projects', projectRoutes.routes()); router.use('/api/files', fileRoutes.routes()); diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 7a6fd72..e178efa 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -24,20 +24,48 @@ onMounted(async () => { diff --git a/frontend/src/api/auth.ts b/frontend/src/api/auth.ts index f2bca92..9f3f7f7 100644 --- a/frontend/src/api/auth.ts +++ b/frontend/src/api/auth.ts @@ -12,9 +12,9 @@ export interface RegisterData { } export const authApi = { - login: (data: LoginData) => api.post('/auth/login', data), - register: (data: RegisterData) => api.post('/auth/register', data), - logout: () => api.post('/auth/logout'), - getMe: () => api.get('/auth/me') + login: (data: LoginData) => api.post('/auth/login', data) as Promise, + register: (data: RegisterData) => api.post('/auth/register', data) as Promise, + logout: () => api.post('/auth/logout') as Promise, + getMe: () => api.get('/auth/me') as Promise }; diff --git a/frontend/src/components/Drawer.vue b/frontend/src/components/Drawer.vue index 7e73eb5..e9f398b 100644 --- a/frontend/src/components/Drawer.vue +++ b/frontend/src/components/Drawer.vue @@ -3,10 +3,10 @@
-

{{ title }}

+

{{ title }}

-
+
@@ -42,69 +42,110 @@ const handleOverlayClick = () => { left: 0; right: 0; bottom: 0; - background: rgba(0, 0, 0, 0.5); + background: rgba(0, 0, 0, 0.7); + backdrop-filter: blur(8px); z-index: 1000; display: flex; justify-content: flex-end; } .drawer-content { - background: white; - width: 400px; + background: rgba(18, 18, 20, 0.95); + width: 500px; max-width: 90vw; height: 100%; display: flex; flex-direction: column; - box-shadow: -2px 0 10px rgba(0, 0, 0, 0.1); + box-shadow: -10px 0 40px rgba(0, 0, 0, 0.5); + border-left: 1px solid var(--primary); + position: relative; +} + +.drawer-content::before { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 1px; + background: var(--primary); + box-shadow: 0 0 15px var(--primary); } .drawer-header { - padding: 1.5rem; - border-bottom: 1px solid #eee; + padding: 2rem; + border-bottom: 1px solid rgba(255,255,255,0.1); display: flex; justify-content: space-between; align-items: center; + background: rgba(255,255,255,0.02); } .drawer-header h2 { margin: 0; - font-size: 1.5rem; - color: #333; + font-size: 1.8rem; + font-weight: 800; + color: white; + letter-spacing: -1px; + text-transform: uppercase; } .close-btn { - background: none; - border: none; + background: transparent; + border: 1px solid transparent; font-size: 2rem; - color: #999; + color: var(--color-text-muted); cursor: pointer; line-height: 1; padding: 0; - width: 32px; - height: 32px; + width: 40px; + height: 40px; + border-radius: 50%; display: flex; align-items: center; justify-content: center; + transition: all var(--transition-fast); } .close-btn:hover { - color: #333; + color: var(--primary); + border-color: var(--primary); + box-shadow: 0 0 10px rgba(var(--color-primary-rgb), 0.3); + transform: rotate(90deg); } .drawer-body { flex: 1; overflow-y: auto; - padding: 1.5rem; + padding: 2rem; +} + +.custom-scrollbar::-webkit-scrollbar { + width: 6px; } +.custom-scrollbar::-webkit-scrollbar-track { + background: rgba(0,0,0,0.2); +} + +.custom-scrollbar::-webkit-scrollbar-thumb { + background-color: #333; + border-radius: 3px; +} + +.custom-scrollbar::-webkit-scrollbar-thumb:hover { + background-color: var(--primary); +} + +/* Drawer Transition */ .drawer-enter-active, .drawer-leave-active { - transition: opacity 0.3s; + transition: opacity 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); } .drawer-enter-active .drawer-content, .drawer-leave-active .drawer-content { - transition: transform 0.3s; + transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); } .drawer-enter-from { @@ -122,5 +163,4 @@ const handleOverlayClick = () => { .drawer-leave-to .drawer-content { transform: translateX(100%); } - - + \ No newline at end of file diff --git a/frontend/src/components/NavBar.vue b/frontend/src/components/NavBar.vue index cc16564..4f1c1cb 100644 --- a/frontend/src/components/NavBar.vue +++ b/frontend/src/components/NavBar.vue @@ -2,33 +2,38 @@