Initial commit: clean project structure

- Backend: FastAPI + SQLAlchemy + Celery (Python 3.11+)
- Frontend: Vue 3 + TypeScript + Pinia + Tailwind
- Admin Frontend: separate Vue 3 app for management
- Docker Compose: 9 services orchestration
- Specs: design prototypes, memory system PRD, product roadmap

Cleanup performed:
- Removed temporary debug scripts from backend root
- Removed deprecated admin_app.py (embedded UI)
- Removed duplicate docs from admin-frontend
- Updated .gitignore for Vite cache and egg-info
This commit is contained in:
zhangtuo
2026-01-20 18:20:03 +08:00
commit e9d7f8832a
241 changed files with 33070 additions and 0 deletions

243
frontend/src/style.css Normal file
View File

@@ -0,0 +1,243 @@
/* 引入霞鹜文楷 - @import 必须在所有其他语句之前 */
@import url('https://cdn.jsdelivr.net/npm/lxgw-wenkai-screen-web/style.css');
@tailwind base;
@tailwind components;
@tailwind utilities;
/* 全局基础样式 */
body {
/* 优先使用文楷,营造书卷气 */
font-family: 'LXGW WenKai Screen', 'Noto Sans SC', system-ui, sans-serif;
/* 米色纸张背景 */
background-color: #FDFBF7;
color: #292524; /* Stone-800 暖炭黑 */
/* 细微的纹理 (可选) */
background-image: radial-gradient(#E5E7EB 1px, transparent 1px);
background-size: 32px 32px;
}
/* 暗色模式适配 */
.dark body {
background-color: #1C1917; /* Stone-900 */
background-image: radial-gradient(#292524 1px, transparent 1px);
color: #E7E5E4; /* Stone-200 */
}
/* 自定义滚动条 - 更加柔和 */
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: #D6D3D1; /* Stone-300 */
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: #A8A29E; /* Stone-400 */
}
/* 卡片风格 - 实体书签感 */
.glass {
background-color: #FFFFFF;
border: 1px solid #E7E5E4; /* Stone-200 */
border-radius: 1rem; /* 16px */
box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.05), 0 1px 4px -1px rgba(0, 0, 0, 0.02);
transition: all 0.3s ease;
}
.dark .glass {
background-color: #292524;
border-color: #44403C;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3);
}
/* 标题风格 - 不再使用渐变,而是强调字重和颜色 */
.gradient-text {
background: none;
-webkit-background-clip: unset;
-webkit-text-fill-color: initial;
color: #1F2937; /* Gray-800 */
font-weight: 800; /* ExtraBold */
letter-spacing: -0.025em;
}
.dark .gradient-text {
color: #F3F4F6;
}
/* 按钮 - 暖色调琥珀色 */
.btn-magic {
background-color: #F59E0B; /* Amber-500 */
color: #FFFFFF;
border-radius: 0.75rem;
font-weight: 600;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 2px 4px rgba(245, 158, 11, 0.2);
}
.btn-magic:hover {
background-color: #D97706; /* Amber-600 */
transform: translateY(-1px);
box-shadow: 0 4px 6px rgba(245, 158, 11, 0.3);
}
.btn-magic:active {
transform: translateY(0);
}
/* 卡片悬浮 */
.card-hover:hover {
transform: translateY(-4px);
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.05), 0 4px 6px -2px rgba(0, 0, 0, 0.025);
border-color: #F59E0B; /* 悬浮时边框变黄 */
}
/* 输入框 - 极简白卡纸风格 */
.input-magic {
background: #FFFFFF;
border: 1px solid #E7E5E4; /* Stone-200 */
color: #292524;
border-radius: 0.75rem;
transition: all 0.2s ease;
}
.input-magic:focus {
outline: none;
border-color: #F59E0B; /* Amber-500 */
box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.1);
}
.dark .input-magic {
background: #292524;
border-color: #44403C;
color: #E7E5E4;
}
/* 装饰背景 - 移除复杂的动画光斑,保持干净 */
.bg-pattern {
background: none;
}
.dark body {
background: linear-gradient(135deg, #0f172a 0%, #111827 35%, #1f2937 70%, #111827 100%);
}
/* 自定义滚动条 */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: #f1f5f9;
border-radius: 4px;
}
::-webkit-scrollbar-thumb {
background: linear-gradient(135deg, #c084fc, #f472b6);
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: linear-gradient(135deg, #a855f7, #ec4899);
}
/* 玻璃态效果 */
.glass {
background: rgba(255, 255, 255, 0.7);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.3);
}
.dark .glass {
background: rgba(15, 23, 42, 0.6);
border: 1px solid rgba(148, 163, 184, 0.25);
}
/* 渐变文字 */
.gradient-text {
background: linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
/* 按钮样式 */
.btn-magic {
background: linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%);
background-size: 200% 200%;
transition: all 0.3s ease;
}
.btn-magic:hover {
background-position: 100% 100%;
transform: translateY(-2px);
box-shadow: 0 10px 40px rgba(102, 126, 234, 0.4);
}
.btn-magic:active {
transform: translateY(0);
}
.dark .btn-magic {
background: linear-gradient(135deg, #7c3aed 0%, #4c1d95 50%, #a855f7 100%);
}
/* 卡片悬浮效果 */
.card-hover {
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.card-hover:hover {
transform: translateY(-8px);
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15);
}
/* 输入框聚焦效果 */
.input-magic {
transition: all 0.3s ease;
border: 2px solid transparent;
background: linear-gradient(white, white) padding-box,
linear-gradient(135deg, #e9d5ff, #fbcfe8, #bfdbfe) border-box;
}
.input-magic:focus {
background: linear-gradient(white, white) padding-box,
linear-gradient(135deg, #a855f7, #ec4899, #3b82f6) border-box;
box-shadow: 0 0 0 4px rgba(168, 85, 247, 0.1);
}
.dark .input-magic {
background: linear-gradient(#0f172a, #0f172a) padding-box,
linear-gradient(135deg, #7c3aed, #db2777, #2563eb) border-box;
}
/* 装饰性背景 */
.bg-pattern {
background-image:
radial-gradient(circle at 20% 80%, rgba(168, 85, 247, 0.1) 0%, transparent 50%),
radial-gradient(circle at 80% 20%, rgba(236, 72, 153, 0.1) 0%, transparent 50%),
radial-gradient(circle at 40% 40%, rgba(59, 130, 246, 0.05) 0%, transparent 50%);
}
.dark .bg-pattern {
background-image:
radial-gradient(circle at 20% 80%, rgba(124, 58, 237, 0.18) 0%, transparent 55%),
radial-gradient(circle at 80% 20%, rgba(236, 72, 153, 0.18) 0%, transparent 55%),
radial-gradient(circle at 40% 40%, rgba(59, 130, 246, 0.12) 0%, transparent 55%);
}
@media (prefers-reduced-motion: reduce) {
.animate-float, .card-hover, .btn-magic {
animation: none;
transition: none;
}
}