{"repo": "chuang1234/photomanager", "files": {"README.md": {"a2d159203691e625d991973774af2ed6c235ef65": {"t": 1785747240.2845814, "n": 14354, "h": "ec833026c60b2f9b", "c": "
\n\n# 📷 家庭盞册 Family Photo Manager\n\n**记圕每䞀䞪枩銚瞬闎让家人之闎的距犻曎近䞀点 💖**\n\n[![Python](https://img.shields.io/badge/Python-3.8+-blue?logo=python)](https://www.python.org/)\n[![Flask](https://img.shields.io/badge/Flask-2.3-green?logo=flask)](https://flask.palletsprojects.com/)\n[![React](https://img.shields.io/badge/React-19-61DAFB?logo=react)](https://react.dev/)\n[![Ant Design](https://img.shields.io/badge/Ant%20Design-6-0170F8?logo=ant-design)](https://ant.design/)\n[![MySQL](https://img.shields.io/badge/MySQL-5.7+-4479A1?logo=mysql)](https://www.mysql.com/)\n\n
\n\n---\n\n## 📖 项目简介\n\n家庭盞册是䞀䞪䞓䞺家庭讟计的私密照片管理系统。支持倚家庭成员共享盞册、照片䞊䌠/拍照、收藏管理并内眮 AI 智胜助手提䟛枩銚互劚。所有数据存傚圚本地保技家庭隐私。\n\n### ✹ 栞心功胜\n\n| 功胜暡块 | 描述 |\n|---------|------|\n| 📁 **盞册管理** | 创建、重呜名、删陀盞册自定义封面 |\n| 📀 **照片䞊䌠** | 支持批量䞊䌠记圕拍摄时闎、園属成员、倇泚 |\n| 📷 **拍照功胜** | 调甚摄像倎盎接拍照并䞊䌠需 HTTPS 环境 |\n| 🔍 **照片搜玢** | 按名称、園属人、䞊䌠者、日期范囎筛选 |\n| 💖 **收藏管理** | 创建收藏倹照片加入收藏/移出支持倚䞪收藏倹 |\n| 👚‍👩‍👧 **家庭成员** | 倚成员管理照片记圕園属人和䞊䌠者 |\n| 🀖 **AI 助手** | 内眮 AI 对话功胜支持 OpenAI / Ollama 等倚种提䟛商 |\n| 🔐 **登圕鉎权** | JWT Token 讀证SHA256 + bcrypt 双重密码加密 |\n\n---\n\n## 🏗 技术架构\n\n```\n┌─────────────────────────────────────────────────────┐\n│ 前端 (React 19) │\n│ Ant Design 6 · React Router 7 · Axios · Less │\n│ :3000 (craco) │\n└──────────────────────┬──────────────────────────────┘\n │ /api/* /uploads/*\n â–Œ\n┌─────────────────────────────────────────────────────┐\n│ 后端 (Flask 2.3) │\n│ PyJWT · bcrypt · PyMySQL · Werkzeug · python-dotenv│\n│ :5000 │\n└───────┬─────────────────────────┬───────────────────┘\n â–Œ â–Œ\n┌───────────────┐ ┌──────────────────┐\n│ MySQL 5.7+ │ │ 本地文件系统 │\n│ family_photo │ │ uploads/photos │\n│ │ │ uploads/covers │\n└───────────────┘ └──────────────────┘\n```\n\n---\n\n## 📂 项目结构\n\n```\nPhotoManager/\n├── family-photo-backend/ # 🔧 后端 (Flask)\n│ ├── config/\n│ │ ├── config.py # 数据库/JWT/密码加密配眮\n│ │ └── log_config.py # 日志配眮按倩蜮蜬\n│ ├── src/\n│ │ ├── main.py # Flask 应甚入口\n│ │ ├── auth.py # 登圕/登出/Token 鉎权\n│ │ ├── album.py # 盞册 CRUD + 封面䞊䌠\n│ │ ├── photo.py # 照片䞊䌠/搜玢/删陀\n│ │ ├── favorite.py # 收藏倹 & 收藏照片管理\n│ │ ├── member.py # 家庭成员查询\n│ │ ├── file.py # 静态文件服务路埄遍历防技\n│ │ ├── chat.py # AI 对话接口\n│ │ ├── ai_service.py # AI 服务OpenAI/Ollama\n│ │ └── utils.py # 数据库连接 & 工具凜数\n│ ├── sql/\n│ │ └── table_info.sql # 数据库建衚 SQL\n│ ├── uploads/ # 䞊䌠文件存傚\n│ │ ├── photos/ # 照片文件按 album_id 分目圕\n│ │ └── covers/ # 盞册封面\n│ ├── logs/ # 日志文件自劚生成\n│ ├── .env.example # 环境变量暡板\n│ └── requirements.txt # Python 䟝赖\n│\n├── family-photo-frontend/ # 🎚 前端 (React)\n│ ├── src/\n│ │ ├── pages/\n│ │ │ ├── Login/ # 登圕页\n│ │ │ ├── AlbumList/ # 盞册列衚\n│ │ │ ├── AlbumDetail/ # 盞册诊情\n│ │ │ │ ├── components/\n│ │ │ │ │ ├── AlbumPhotoList/ # 照片列衚分页\n│ │ │ │ │ ├── UploadArare/ # 照片䞊䌠区\n│ │ │ │ │ └── PhotoCapture/ # 摄像倎拍照\n│ │ │ │ └── popwin/\n│ │ │ │ ├── FilterPopwin/ # 搜玢筛选匹窗\n│ │ │ │ └── FavoriteConfirmModal/ # 收藏确讀匹窗\n│ │ │ ├── CreateAlbum/ # 创建盞册\n│ │ │ └── FavoriteManager/ # 收藏管理\n│ │ ├── components/\n│ │ │ ├── PrivateRoute.js # 路由守卫\n│ │ │ ├── HeaderComponent.js # 顶郚富航\n│ │ │ ├── AiChat/ # AI 对话悬浮窗\n│ │ │ └── ButtonWrapper/ # 按钮封装\n│ │ ├── contexts/\n│ │ │ └── MemberContext.js # 圓前登圕成员䞊䞋文\n│ │ ├── utils/\n│ │ │ ├── request.js # Axios 封装Token 拊截噚\n│ │ │ └── dateUtil.js # 日期栌匏化工具\n│ │ └── App.js # 路由配眮入口\n│ ├── craco.config.js # Craco 配眮Less/代理\n│ └── package.json\n│\n└── README.md\n```\n\n---\n\n## 🐳 Docker 䞀键郚眲掚荐\n\n> 无需手劚安装 Python、Node.js、MySQL䞀条呜什搞定党郚郚眲。\n\n### 前眮芁求\n\n- [Docker Desktop](https://www.docker.com/products/docker-desktop)Windows/Mac或 Docker EngineLinux\n\n### 䞀键郚眲\n\n**Windows**\n```bash\n# 双击运行 deploy.bat或圚呜什行执行\ndeploy.bat\n```\n\n**Linux / macOS**\n```bash\nchmod +x deploy.sh\n./deploy.sh\n```\n\n**手劚执行等效于脚本**\n```bash\n# 1. 倍制环境配眮\ncp .env.docker .env\n# → 猖蟑 .env 修改数据库密码、JWT密钥等可选\n\n# 2. 构建并启劚\ndocker compose up -d --build\n\n# 3. 查看状态\ndocker compose ps\n```\n\n### 访问地址\n\n| 服务 | 地址 |\n|------|------|\n| 🌐 前端 | http://localhost |\n| 🔧 后端 API | http://localhost:5000 |\n| 🗄 MySQL | localhost:3306 |\n\n### Docker 架构\n\n```\n┌──────────────────────────────────────────────────────────┐\n│ Docker Compose │\n│ │\n│ ┌─────────────┐ ┌──────────────┐ ┌──────────────┐ │\n│ │ Frontend │ │ Backend │ │ MySQL │ │\n│ │ (Nginx) │──▶│ (Gunicorn) │──▶│ (5.7) │ │\n│ │ :80 │ │ :5000 │ │ :3306 │ │\n│ │ React 静态 │ │ Flask API │ │ family_photo│ │\n│ └─────────────┘ └──────┬───────┘ └──────────────┘ │\n│ │ │\n│ ┌──────▌───────┐ │\n│ │ Volumes │ │\n│ │ uploads_data │ │\n│ │ mysql_data │ │\n│ └──────────────┘ │\n└──────────────────────────────────────────────────────────┘\n```\n\n### 配眮诎明\n\n环境配眮文件 `.env`从 `.env.docker` 倍制支持以䞋变量\n\n| 变量 | 诎明 | 默讀倌 |\n|------|------|--------|\n| `DB_PASSWORD` | MySQL root 密码 | Chuang@123456 |\n| `JWT_SECRET` | JWT 筟名密钥 | 内眮默讀倌建议修改 |\n| `AI_PROVIDER` | AI 服务提䟛商 | ollama |\n| `AI_MODEL` | AI 暡型名称 | qwen2.5:14b |\n| `FRONTEND_PORT` | 前端端口 | 80 |\n| `BACKEND_PORT` | 后端端口 | 5000 |\n| `MYSQL_PORT` | MySQL 端口 | 3306 |\n\n### 垞甚呜什\n\n```bash\ndocker compose ps # 查看容噚状态\ndocker compose logs -f # 实时查看日志\ndocker compose down # 停止所有服务\ndocker compose up -d --build # 重新构建并启劚\ndocker compose down -v # 停止并删陀数据卷⚠ 枅空数据\n```\n\n### Docker 郚眲文件诎明\n\n```\nPhotoManager/\n├── docker-compose.yml # 猖排文件MySQL + 后端 + 前端\n├── .env.docker # 环境配眮暡板\n├── deploy.bat # Windows 䞀键郚眲脚本\n├── deploy.sh # Linux/Mac 䞀键郚眲脚本\n├── docker/\n│ └── mysql/\n│ └── init.sql # MySQL 自劚初始化脚本\n├── family-photo-backend/\n│ ├── Dockerfile # 后端镜像构建\n│ ├── .dockerignore\n│ └── docker-entrypoint.sh # 启劚脚本等埅MySQL + Gunicorn\n└── family-photo-frontend/\n ├── Dockerfile # 前端镜像构建倚阶段Node构建 + Nginx郚眲\n ├── .dockerignore\n └── nginx.conf # Nginx 配眮SPA路由 + API代理\n```\n\n---\n\n## 🚀 手劚郚眲快速匀始\n\n### 环境芁求\n\n| 䟝赖 | 版本芁求 |\n|------|---------|\n| Python | 3.8+ |\n| Node.js | 16+ |\n| MySQL | 5.7+ |\n| npm / yarn | 最新皳定版 |\n\n### 1⃣ 克隆项目\n\n```bash\ngit clone \ncd PhotoManager\n```\n\n### 2⃣ 初始化数据库\n\n```bash\n# 登圕 MySQL 创建数据库\nmysql -u root -p\n\nCREATE DATABASE family_photo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\nUSE family_photo;\n\n# 富入建衚 SQL新建数据库时䜿甚\nsource family-photo-backend/sql/table_info.sql;\n\n# 可选插入测试家庭成员\nINSERT INTO family_member (name, relation, username, password, email) VALUES\n('爞爞', 'father', 'father', '歀倄填SHA256哈垌', 'father@example.com'),\n('劈劈', 'mother', 'mother', '歀倄填SHA256哈垌', 'mother@example.com');\n```\n\n> 💡 密码存傚流皋**前端 SHA256** → **后端 bcrypt 加密** → 存入数据库。 \n> 初始密码可先甚 `config/config.py` 侭的 `encrypt_password()` 凜数生成哈垌。\n\n### 3⃣ 启劚后端\n\n```bash\ncd family-photo-backend\n\n# 创建虚拟环境掚荐\npython -m venv venv\n# Windows:\nvenv\\Scripts\\activate\n# macOS/Linux:\nsource venv/bin/activate\n\n# 安装䟝赖\npip install -r requirements.txt\n\n# 配眮环境变量必须\ncp .env.example .env\n# 猖蟑 .env填入以䞋必芁配眮\n# DB_PASSWORD — 数据库密码\n# JWT_SECRET — JWT 密钥甚 python -c \"import secrets; print(secrets.token_hex(32))\" 生成\n# AI_API_KEY — AI 服务密钥可选\n\n# 启劚服务\npython -m src.main\n# 后端运行圚 http://localhost:5000\n```\n\n### 4⃣ 启劚前端\n\n```bash\ncd family-photo-frontend\n\n# 安装䟝赖\nnpm install\n\n# 启劚匀发服务噚\nnpm start\n# 前端运行圚 http://localhost:3000\n# 已配眮代理/api/* 和 /uploads/* 自劚蜬发到后端 5000 端口\n```\n\n---\n\n## ⚙ 环境变量配眮\n\n圚 `family-photo-backend/.env` 䞭配眮参考 `.env.example`\n\n```bash\n# ── 数据库配眮必填─────────────────────\nDB_HOST=localhost\nDB_USER=root\nDB_PASSWORD=䜠的数据库密码\nDB_NAME=family_photo\n\n# ── JWT 密钥必填──────────────────────\n# 生成方匏python -c \"import secrets; print(secrets.token_hex(32))\"\nJWT_SECRET=䜠的JWT密钥\nJWT_EXPIRE_HOURS=24\n\n# ── AI 服务配眮 ──────────────────────────────\n# 提䟛商openai默讀| ollama本地郚眲无需 API Key\nAI_PROVIDER=openai\n\n# OpenAI / DeepSeek / 通义千问\nAI_API_KEY=sk-xxx\nAI_API_BASE=https://api.openai.com/v1\nAI_MODEL=gpt-3.5-turbo\n\n# ── 䜿甚 Ollama 本地郚眲时改䞺以䞋配眮 ───────\n# AI_PROVIDER=ollama\n# AI_MODEL=llama3\n# AI_API_BASE=http://localhost:11434\n\n# ── 通甹 ─────────────────────────────────────\nAI_TIMEOUT=60\n\n# ── Flask 环境 ───────────────────────────────\nFLASK_ENV=dev\n```\n\n> ⚠ **安党提瀺** \n> - `DB_PASSWORD` 和 `JWT_SECRET` 䞺必填项未配眮时服务启劚䌚报错 \n> - `.env` 文件已圚 `.gitignore` 䞭䞍䌚被提亀到代码仓库 \n> - 生产环境请务必䜿甚区随机字笊䞲䜜䞺 `JWT_SECRET`\n\n---\n\n## 🗄 数据库讟计\n\n```\nfamily_member (家庭成员)\n │\n ├──< album (盞册)\n │ │\n │ └──< photo (照片)\n │ │\n │ └──< favorite_photo (收藏记圕) >── favorite_folder (收藏倹)\n │\n └──< ai_chat_message (AI 聊倩记圕)\n```\n\n| 衚名 | 诎明 | 关键字段 |\n|------|------|---------|\n| `family_member` | 家庭成员 / 登圕莊号 | `username`(唯䞀), `password`(bcrypt), **`is_admin`**(权限标识) |\n| `album` | 盞册 | `album_name`, `cover_path`, **`creator_id`**(创建者), `last_upload_user_id` |\n| `photo` | 照片 | `file_path`, `album_id`, `member_id`(園属), `operator_id`(䞊䌠者) |\n| `favorite_folder` | 收藏倹 | `folder_name`, `member_id`, `is_default` |\n| `favorite_photo` | 收藏记圕 | `folder_id`, `photo_id`, `member_id`唯䞀纊束防重倍 |\n| `ai_chat_message` | AI 聊倩记圕 | `member_id`, `role`(user/assistant), `content` |\n\n> 加粗字段䞺本次新增。完敎建衚 SQL 见 `family-photo-backend/sql/table_info.sql`\n\n---\n\n## 📡 API 接口\n\n### 讀证\n\n| 方法 | 路埄 | 诎明 |\n|------|------|------|\n| POST | `/api/login` | 登圕返回 JWT Token |\n| POST | `/api/logout` | 登出 |\n\n### 盞册\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/api/albums` | ✅ | 获取所有盞册列衚 |\n| POST | `/api/album/create` | ✅ | 创建盞册可䞊䌠封面 |\n| POST | `/api/album/rename` | ✅ | 修改盞册名称 |\n| POST | `/api/album/delete` | ✅ | 删陀盞册级联删陀照片 |\n| POST | `/api/album/cover/upload` | ✅ | 䞊䌠/曎换盞册封面 |\n| GET | `/api/photos/album/:id` | ✅ | 获取盞册䞋照片分页 |\n\n### 照片\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| POST | `/api/photos/upload` | ✅ | 䞊䌠照片 |\n| POST | `/api/photos/delete` | ✅ | 删陀照片 |\n| GET | `/api/photos/search` | ✅ | 搜玢照片支持倚条件筛选 |\n\n### 收藏\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/api/favorite/folders` | ✅ | 获取收藏倹列衚 |\n| POST | `/api/favorite/folders` | ✅ | 创建收藏倹 |\n| PUT | `/api/favorite/folders/:id` | ✅ | 修改收藏倹名称 |\n| DELETE | `/api/favorite/folders/:id` | ✅ | 删陀收藏倹 |\n| POST | `/api/favorite/photos` | ✅ | 照片加入收藏 |\n| DELETE | `/api/favorite/photos` | ✅ | 照片移出收藏 |\n| GET | `/api/favorite/photos/:folder_id` | ✅ | 获取收藏倹内照片 |\n\n### 成员 & AI\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/api/current-member` | ✅ | 获取圓前登圕成员信息 |\n| GET | `/api/members` | ✅ | 获取所有家庭成员 |\n| GET | `/api/chat/history` | ✅ | 获取聊倩记圕默讀近 3 䞪月 |\n| POST | `/api/chat/send` | ✅ | 发送消息 & 获取 AI 回倍 |\n| GET | `/api/chat/models` | ✅ | 查询 AI 提䟛商 & 可甚暡型 |\n| POST | `/api/chat/clear` | ✅ | 枅空聊倩记圕 |\n\n### 静态文件\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/uploads/photos/:filename` | ✅ | 获取照片文件 |\n| GET | `/uploads/covers/:filename` | ✅ | 获取封面文件 |\n\n---\n\n## 🔐 安党机制\n\n| 层面 | 措斜 |\n|------|------|\n| **讀证** | JWT TokenHS25624h 过期`@login_required` 装饰噚保技所有接口 |\n| **密码** | 前端 SHA256 + 后端 bcryptsalt rounds=12双重加密 |\n| **权限隔犻** | `is_admin` 字段区分管理员/普通甚户普通甚户只胜操䜜自己创建的盞册及照片 |\n| **文件䞊䌠** | 扩展名癜名单校验、`secure_filename` 过滀、唯䞀文件名防芆盖 |\n| **路埄安党** | 䞊䌠目圕限制 + `_safe_path()` 绝对路埄校验防止路埄遍历 |\n| **数据校验** | `album_id` 等参数区制正敎数校验存圚性校验防止对䞍存圚资源操䜜 |\n| **SQL 泚入** | 党郚䜿甚 PyMySQL 参数化查询 (`%s`) |\n| **CORS** | Flask-CORS 配眮 `supports_credentials=True` |\n\n---\n\n## 👥 权限䜓系\n\n### 角色诎明\n\n| 角色 | `is_admin` 倌 | 权限范囎 |\n|------|--------------|---------|\n| **管理员** | `1` | 查看所有盞册操䜜所有资源 |\n| **普通成员** | `0`默讀 | 只胜查看/操䜜**自己创建的**盞册及照片 |\n\n### 权限配眮\n\n圚数据库䞭手劚讟眮\n\n```sql\n-- 将某甚户讟䞺管理员\nUPDATE family_member SET is_admin = 1 WHERE username = 'father';\n\n-- 取消管理员权限\nUPDATE family_member SET is_admin = 0 WHERE username = 'father';\n\n-- 查看所有成员的权限\nSELECT id, name, username, is_admin FROM family_member;\n```\n\n### 权限芆盖范囎\n\n| 操䜜 | 管理员 | 普通成员 |\n|------|--------|---------|\n| 查看盞册列衚 | 所有盞册 | 仅自己创建的 |\n| 查看盞册照片 | 任意盞册 | 仅自己创建的盞册 |\n| 创建盞册 | ✅ | ✅自劚成䞺创建者 |\n| 重呜名/删陀盞册 | 任意盞册 | 仅自己创建的 |\n| 曎换盞册封面 | 任意盞册 | 仅自己创建的 |\n| 䞊䌠照片 | 任意盞册 | 仅自己创建的盞册 |\n| 删陀照片 | 任意照片 | 仅自己盞册䞭的照片 |\n| 搜玢照片 | 任意盞册 | 仅自己创建的盞册 |\n| 收藏/取消收藏 | ✅ | ✅收藏䞺䞪人行䞺无需权限 |\n\n---\n\n## 🀖 AI 助手\n\n支持䞉种 AI 提䟛商通过环境变量 `AI_PROVIDER` 切换\n\n| 提䟛商 | 配眮方匏 | 特点 |\n|--------|---------|------|\n| **OpenAI** | 配眮 `AI_API_KEY` + `AI_API_BASE` | 支持 OpenAI / DeepSeek / 通义千问等兌容接口 |\n| **Ollama** | `AI_PROVIDER=ollama` | 本地郚眲无需 API Key完党犻线 |\n| **暡拟暡匏** | 䞍配眮 `AI_API_KEY` | 自劚䜿甚预讟回倍方䟿䜓验功胜 |\n\n---\n\n## 📞 功胜预览\n\n| 页面 | 功胜 |\n|------|------|\n| 🔑 登圕页 | 枩銚风栌登圕SHA256 密码加密䌠蟓 |\n| 📁 盞册列衚 | 展瀺所有盞册星瀺封面、最后䞊䌠人和时闎 |\n| 🖌 盞册诊情 | 照片眑栌展瀺、分页加蜜、搜玢筛选 |\n| 📀 䞊䌠区域 | 填写園属成员、拍摄时闎、倇泚后批量䞊䌠 |\n| 📷 拍照䞊䌠 | 调甚摄像倎拍照 → 预览 → 选择園属人 → 䞊䌠 |\n| 💖 收藏管理 | 收藏倹列衚 + 收藏照片眑栌支持增删改 |\n| 🀖 AI 助手 | 党局悬浮对话窗聊倩记圕按莊号隔犻 |\n\n---\n\n## 🛠 匀发诎明\n\n### 前端代理配眮`craco.config.js`\n\n```javascript\n// 匀发环境䞋自劚代理到后端\n'/api' → http://localhost:5000/api\n'/uploads' → http://localhost:5000/uploads\n```\n\n### 日志系统\n\n- 日志目圕`family-photo-backend/logs/`\n- `info.log`垞规操䜜日志保留 30 倩\n- `error.log`错误日志保留 90 倩\n- 按倩自劚蜮蜬Windows 䞋安党倄理文件锁定\n\n### 密码加密流皋\n\n```\n甚户蟓入明文密码\n │\n â–Œ\n前端 CryptoJS.SHA256(password) ──→ SHA256 哈垌\n │\n â–Œ\nPOST /api/login { password: sha256_hash }\n │\n â–Œ\n后端 bcrypt.checkpw(sha256_hash, db_bcrypt_hash) ──→ 验证结果\n```\n\n---\n\n## 📋 埅办事项\n\n- [ ] 实现 Token 黑名单机制䜿 Logout 真正生效\n- [ ] 添加照片 EXIF 信息自劚提取拍摄时闎、GPS 等\n- [ ] 支持照片压猩䞊䌠减少存傚空闎\n- [ ] 添加照片分享功胜生成䞎时铟接\n\n---\n\n## 📄 License\n\nMIT License © 2026 Family Photo Manager"}, "50547fdfec0822bc60189a109af0db1cd0cb289e": {"t": 1785771641.277322, "n": 14354, "h": "ec833026c60b2f9b", "c": "
\n\n# 📷 家庭盞册 Family Photo Manager\n\n**记圕每䞀䞪枩銚瞬闎让家人之闎的距犻曎近䞀点 💖**\n\n[![Python](https://img.shields.io/badge/Python-3.8+-blue?logo=python)](https://www.python.org/)\n[![Flask](https://img.shields.io/badge/Flask-2.3-green?logo=flask)](https://flask.palletsprojects.com/)\n[![React](https://img.shields.io/badge/React-19-61DAFB?logo=react)](https://react.dev/)\n[![Ant Design](https://img.shields.io/badge/Ant%20Design-6-0170F8?logo=ant-design)](https://ant.design/)\n[![MySQL](https://img.shields.io/badge/MySQL-5.7+-4479A1?logo=mysql)](https://www.mysql.com/)\n\n
\n\n---\n\n## 📖 项目简介\n\n家庭盞册是䞀䞪䞓䞺家庭讟计的私密照片管理系统。支持倚家庭成员共享盞册、照片䞊䌠/拍照、收藏管理并内眮 AI 智胜助手提䟛枩銚互劚。所有数据存傚圚本地保技家庭隐私。\n\n### ✹ 栞心功胜\n\n| 功胜暡块 | 描述 |\n|---------|------|\n| 📁 **盞册管理** | 创建、重呜名、删陀盞册自定义封面 |\n| 📀 **照片䞊䌠** | 支持批量䞊䌠记圕拍摄时闎、園属成员、倇泚 |\n| 📷 **拍照功胜** | 调甚摄像倎盎接拍照并䞊䌠需 HTTPS 环境 |\n| 🔍 **照片搜玢** | 按名称、園属人、䞊䌠者、日期范囎筛选 |\n| 💖 **收藏管理** | 创建收藏倹照片加入收藏/移出支持倚䞪收藏倹 |\n| 👚‍👩‍👧 **家庭成员** | 倚成员管理照片记圕園属人和䞊䌠者 |\n| 🀖 **AI 助手** | 内眮 AI 对话功胜支持 OpenAI / Ollama 等倚种提䟛商 |\n| 🔐 **登圕鉎权** | JWT Token 讀证SHA256 + bcrypt 双重密码加密 |\n\n---\n\n## 🏗 技术架构\n\n```\n┌─────────────────────────────────────────────────────┐\n│ 前端 (React 19) │\n│ Ant Design 6 · React Router 7 · Axios · Less │\n│ :3000 (craco) │\n└──────────────────────┬──────────────────────────────┘\n │ /api/* /uploads/*\n â–Œ\n┌─────────────────────────────────────────────────────┐\n│ 后端 (Flask 2.3) │\n│ PyJWT · bcrypt · PyMySQL · Werkzeug · python-dotenv│\n│ :5000 │\n└───────┬─────────────────────────┬───────────────────┘\n â–Œ â–Œ\n┌───────────────┐ ┌──────────────────┐\n│ MySQL 5.7+ │ │ 本地文件系统 │\n│ family_photo │ │ uploads/photos │\n│ │ │ uploads/covers │\n└───────────────┘ └──────────────────┘\n```\n\n---\n\n## 📂 项目结构\n\n```\nPhotoManager/\n├── family-photo-backend/ # 🔧 后端 (Flask)\n│ ├── config/\n│ │ ├── config.py # 数据库/JWT/密码加密配眮\n│ │ └── log_config.py # 日志配眮按倩蜮蜬\n│ ├── src/\n│ │ ├── main.py # Flask 应甚入口\n│ │ ├── auth.py # 登圕/登出/Token 鉎权\n│ │ ├── album.py # 盞册 CRUD + 封面䞊䌠\n│ │ ├── photo.py # 照片䞊䌠/搜玢/删陀\n│ │ ├── favorite.py # 收藏倹 & 收藏照片管理\n│ │ ├── member.py # 家庭成员查询\n│ │ ├── file.py # 静态文件服务路埄遍历防技\n│ │ ├── chat.py # AI 对话接口\n│ │ ├── ai_service.py # AI 服务OpenAI/Ollama\n│ │ └── utils.py # 数据库连接 & 工具凜数\n│ ├── sql/\n│ │ └── table_info.sql # 数据库建衚 SQL\n│ ├── uploads/ # 䞊䌠文件存傚\n│ │ ├── photos/ # 照片文件按 album_id 分目圕\n│ │ └── covers/ # 盞册封面\n│ ├── logs/ # 日志文件自劚生成\n│ ├── .env.example # 环境变量暡板\n│ └── requirements.txt # Python 䟝赖\n│\n├── family-photo-frontend/ # 🎚 前端 (React)\n│ ├── src/\n│ │ ├── pages/\n│ │ │ ├── Login/ # 登圕页\n│ │ │ ├── AlbumList/ # 盞册列衚\n│ │ │ ├── AlbumDetail/ # 盞册诊情\n│ │ │ │ ├── components/\n│ │ │ │ │ ├── AlbumPhotoList/ # 照片列衚分页\n│ │ │ │ │ ├── UploadArare/ # 照片䞊䌠区\n│ │ │ │ │ └── PhotoCapture/ # 摄像倎拍照\n│ │ │ │ └── popwin/\n│ │ │ │ ├── FilterPopwin/ # 搜玢筛选匹窗\n│ │ │ │ └── FavoriteConfirmModal/ # 收藏确讀匹窗\n│ │ │ ├── CreateAlbum/ # 创建盞册\n│ │ │ └── FavoriteManager/ # 收藏管理\n│ │ ├── components/\n│ │ │ ├── PrivateRoute.js # 路由守卫\n│ │ │ ├── HeaderComponent.js # 顶郚富航\n│ │ │ ├── AiChat/ # AI 对话悬浮窗\n│ │ │ └── ButtonWrapper/ # 按钮封装\n│ │ ├── contexts/\n│ │ │ └── MemberContext.js # 圓前登圕成员䞊䞋文\n│ │ ├── utils/\n│ │ │ ├── request.js # Axios 封装Token 拊截噚\n│ │ │ └── dateUtil.js # 日期栌匏化工具\n│ │ └── App.js # 路由配眮入口\n│ ├── craco.config.js # Craco 配眮Less/代理\n│ └── package.json\n│\n└── README.md\n```\n\n---\n\n## 🐳 Docker 䞀键郚眲掚荐\n\n> 无需手劚安装 Python、Node.js、MySQL䞀条呜什搞定党郚郚眲。\n\n### 前眮芁求\n\n- [Docker Desktop](https://www.docker.com/products/docker-desktop)Windows/Mac或 Docker EngineLinux\n\n### 䞀键郚眲\n\n**Windows**\n```bash\n# 双击运行 deploy.bat或圚呜什行执行\ndeploy.bat\n```\n\n**Linux / macOS**\n```bash\nchmod +x deploy.sh\n./deploy.sh\n```\n\n**手劚执行等效于脚本**\n```bash\n# 1. 倍制环境配眮\ncp .env.docker .env\n# → 猖蟑 .env 修改数据库密码、JWT密钥等可选\n\n# 2. 构建并启劚\ndocker compose up -d --build\n\n# 3. 查看状态\ndocker compose ps\n```\n\n### 访问地址\n\n| 服务 | 地址 |\n|------|------|\n| 🌐 前端 | http://localhost |\n| 🔧 后端 API | http://localhost:5000 |\n| 🗄 MySQL | localhost:3306 |\n\n### Docker 架构\n\n```\n┌──────────────────────────────────────────────────────────┐\n│ Docker Compose │\n│ │\n│ ┌─────────────┐ ┌──────────────┐ ┌──────────────┐ │\n│ │ Frontend │ │ Backend │ │ MySQL │ │\n│ │ (Nginx) │──▶│ (Gunicorn) │──▶│ (5.7) │ │\n│ │ :80 │ │ :5000 │ │ :3306 │ │\n│ │ React 静态 │ │ Flask API │ │ family_photo│ │\n│ └─────────────┘ └──────┬───────┘ └──────────────┘ │\n│ │ │\n│ ┌──────▌───────┐ │\n│ │ Volumes │ │\n│ │ uploads_data │ │\n│ │ mysql_data │ │\n│ └──────────────┘ │\n└──────────────────────────────────────────────────────────┘\n```\n\n### 配眮诎明\n\n环境配眮文件 `.env`从 `.env.docker` 倍制支持以䞋变量\n\n| 变量 | 诎明 | 默讀倌 |\n|------|------|--------|\n| `DB_PASSWORD` | MySQL root 密码 | Chuang@123456 |\n| `JWT_SECRET` | JWT 筟名密钥 | 内眮默讀倌建议修改 |\n| `AI_PROVIDER` | AI 服务提䟛商 | ollama |\n| `AI_MODEL` | AI 暡型名称 | qwen2.5:14b |\n| `FRONTEND_PORT` | 前端端口 | 80 |\n| `BACKEND_PORT` | 后端端口 | 5000 |\n| `MYSQL_PORT` | MySQL 端口 | 3306 |\n\n### 垞甚呜什\n\n```bash\ndocker compose ps # 查看容噚状态\ndocker compose logs -f # 实时查看日志\ndocker compose down # 停止所有服务\ndocker compose up -d --build # 重新构建并启劚\ndocker compose down -v # 停止并删陀数据卷⚠ 枅空数据\n```\n\n### Docker 郚眲文件诎明\n\n```\nPhotoManager/\n├── docker-compose.yml # 猖排文件MySQL + 后端 + 前端\n├── .env.docker # 环境配眮暡板\n├── deploy.bat # Windows 䞀键郚眲脚本\n├── deploy.sh # Linux/Mac 䞀键郚眲脚本\n├── docker/\n│ └── mysql/\n│ └── init.sql # MySQL 自劚初始化脚本\n├── family-photo-backend/\n│ ├── Dockerfile # 后端镜像构建\n│ ├── .dockerignore\n│ └── docker-entrypoint.sh # 启劚脚本等埅MySQL + Gunicorn\n└── family-photo-frontend/\n ├── Dockerfile # 前端镜像构建倚阶段Node构建 + Nginx郚眲\n ├── .dockerignore\n └── nginx.conf # Nginx 配眮SPA路由 + API代理\n```\n\n---\n\n## 🚀 手劚郚眲快速匀始\n\n### 环境芁求\n\n| 䟝赖 | 版本芁求 |\n|------|---------|\n| Python | 3.8+ |\n| Node.js | 16+ |\n| MySQL | 5.7+ |\n| npm / yarn | 最新皳定版 |\n\n### 1⃣ 克隆项目\n\n```bash\ngit clone \ncd PhotoManager\n```\n\n### 2⃣ 初始化数据库\n\n```bash\n# 登圕 MySQL 创建数据库\nmysql -u root -p\n\nCREATE DATABASE family_photo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\nUSE family_photo;\n\n# 富入建衚 SQL新建数据库时䜿甚\nsource family-photo-backend/sql/table_info.sql;\n\n# 可选插入测试家庭成员\nINSERT INTO family_member (name, relation, username, password, email) VALUES\n('爞爞', 'father', 'father', '歀倄填SHA256哈垌', 'father@example.com'),\n('劈劈', 'mother', 'mother', '歀倄填SHA256哈垌', 'mother@example.com');\n```\n\n> 💡 密码存傚流皋**前端 SHA256** → **后端 bcrypt 加密** → 存入数据库。 \n> 初始密码可先甚 `config/config.py` 侭的 `encrypt_password()` 凜数生成哈垌。\n\n### 3⃣ 启劚后端\n\n```bash\ncd family-photo-backend\n\n# 创建虚拟环境掚荐\npython -m venv venv\n# Windows:\nvenv\\Scripts\\activate\n# macOS/Linux:\nsource venv/bin/activate\n\n# 安装䟝赖\npip install -r requirements.txt\n\n# 配眮环境变量必须\ncp .env.example .env\n# 猖蟑 .env填入以䞋必芁配眮\n# DB_PASSWORD — 数据库密码\n# JWT_SECRET — JWT 密钥甚 python -c \"import secrets; print(secrets.token_hex(32))\" 生成\n# AI_API_KEY — AI 服务密钥可选\n\n# 启劚服务\npython -m src.main\n# 后端运行圚 http://localhost:5000\n```\n\n### 4⃣ 启劚前端\n\n```bash\ncd family-photo-frontend\n\n# 安装䟝赖\nnpm install\n\n# 启劚匀发服务噚\nnpm start\n# 前端运行圚 http://localhost:3000\n# 已配眮代理/api/* 和 /uploads/* 自劚蜬发到后端 5000 端口\n```\n\n---\n\n## ⚙ 环境变量配眮\n\n圚 `family-photo-backend/.env` 䞭配眮参考 `.env.example`\n\n```bash\n# ── 数据库配眮必填─────────────────────\nDB_HOST=localhost\nDB_USER=root\nDB_PASSWORD=䜠的数据库密码\nDB_NAME=family_photo\n\n# ── JWT 密钥必填──────────────────────\n# 生成方匏python -c \"import secrets; print(secrets.token_hex(32))\"\nJWT_SECRET=䜠的JWT密钥\nJWT_EXPIRE_HOURS=24\n\n# ── AI 服务配眮 ──────────────────────────────\n# 提䟛商openai默讀| ollama本地郚眲无需 API Key\nAI_PROVIDER=openai\n\n# OpenAI / DeepSeek / 通义千问\nAI_API_KEY=sk-xxx\nAI_API_BASE=https://api.openai.com/v1\nAI_MODEL=gpt-3.5-turbo\n\n# ── 䜿甚 Ollama 本地郚眲时改䞺以䞋配眮 ───────\n# AI_PROVIDER=ollama\n# AI_MODEL=llama3\n# AI_API_BASE=http://localhost:11434\n\n# ── 通甹 ─────────────────────────────────────\nAI_TIMEOUT=60\n\n# ── Flask 环境 ───────────────────────────────\nFLASK_ENV=dev\n```\n\n> ⚠ **安党提瀺** \n> - `DB_PASSWORD` 和 `JWT_SECRET` 䞺必填项未配眮时服务启劚䌚报错 \n> - `.env` 文件已圚 `.gitignore` 䞭䞍䌚被提亀到代码仓库 \n> - 生产环境请务必䜿甚区随机字笊䞲䜜䞺 `JWT_SECRET`\n\n---\n\n## 🗄 数据库讟计\n\n```\nfamily_member (家庭成员)\n │\n ├──< album (盞册)\n │ │\n │ └──< photo (照片)\n │ │\n │ └──< favorite_photo (收藏记圕) >── favorite_folder (收藏倹)\n │\n └──< ai_chat_message (AI 聊倩记圕)\n```\n\n| 衚名 | 诎明 | 关键字段 |\n|------|------|---------|\n| `family_member` | 家庭成员 / 登圕莊号 | `username`(唯䞀), `password`(bcrypt), **`is_admin`**(权限标识) |\n| `album` | 盞册 | `album_name`, `cover_path`, **`creator_id`**(创建者), `last_upload_user_id` |\n| `photo` | 照片 | `file_path`, `album_id`, `member_id`(園属), `operator_id`(䞊䌠者) |\n| `favorite_folder` | 收藏倹 | `folder_name`, `member_id`, `is_default` |\n| `favorite_photo` | 收藏记圕 | `folder_id`, `photo_id`, `member_id`唯䞀纊束防重倍 |\n| `ai_chat_message` | AI 聊倩记圕 | `member_id`, `role`(user/assistant), `content` |\n\n> 加粗字段䞺本次新增。完敎建衚 SQL 见 `family-photo-backend/sql/table_info.sql`\n\n---\n\n## 📡 API 接口\n\n### 讀证\n\n| 方法 | 路埄 | 诎明 |\n|------|------|------|\n| POST | `/api/login` | 登圕返回 JWT Token |\n| POST | `/api/logout` | 登出 |\n\n### 盞册\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/api/albums` | ✅ | 获取所有盞册列衚 |\n| POST | `/api/album/create` | ✅ | 创建盞册可䞊䌠封面 |\n| POST | `/api/album/rename` | ✅ | 修改盞册名称 |\n| POST | `/api/album/delete` | ✅ | 删陀盞册级联删陀照片 |\n| POST | `/api/album/cover/upload` | ✅ | 䞊䌠/曎换盞册封面 |\n| GET | `/api/photos/album/:id` | ✅ | 获取盞册䞋照片分页 |\n\n### 照片\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| POST | `/api/photos/upload` | ✅ | 䞊䌠照片 |\n| POST | `/api/photos/delete` | ✅ | 删陀照片 |\n| GET | `/api/photos/search` | ✅ | 搜玢照片支持倚条件筛选 |\n\n### 收藏\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/api/favorite/folders` | ✅ | 获取收藏倹列衚 |\n| POST | `/api/favorite/folders` | ✅ | 创建收藏倹 |\n| PUT | `/api/favorite/folders/:id` | ✅ | 修改收藏倹名称 |\n| DELETE | `/api/favorite/folders/:id` | ✅ | 删陀收藏倹 |\n| POST | `/api/favorite/photos` | ✅ | 照片加入收藏 |\n| DELETE | `/api/favorite/photos` | ✅ | 照片移出收藏 |\n| GET | `/api/favorite/photos/:folder_id` | ✅ | 获取收藏倹内照片 |\n\n### 成员 & AI\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/api/current-member` | ✅ | 获取圓前登圕成员信息 |\n| GET | `/api/members` | ✅ | 获取所有家庭成员 |\n| GET | `/api/chat/history` | ✅ | 获取聊倩记圕默讀近 3 䞪月 |\n| POST | `/api/chat/send` | ✅ | 发送消息 & 获取 AI 回倍 |\n| GET | `/api/chat/models` | ✅ | 查询 AI 提䟛商 & 可甚暡型 |\n| POST | `/api/chat/clear` | ✅ | 枅空聊倩记圕 |\n\n### 静态文件\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/uploads/photos/:filename` | ✅ | 获取照片文件 |\n| GET | `/uploads/covers/:filename` | ✅ | 获取封面文件 |\n\n---\n\n## 🔐 安党机制\n\n| 层面 | 措斜 |\n|------|------|\n| **讀证** | JWT TokenHS25624h 过期`@login_required` 装饰噚保技所有接口 |\n| **密码** | 前端 SHA256 + 后端 bcryptsalt rounds=12双重加密 |\n| **权限隔犻** | `is_admin` 字段区分管理员/普通甚户普通甚户只胜操䜜自己创建的盞册及照片 |\n| **文件䞊䌠** | 扩展名癜名单校验、`secure_filename` 过滀、唯䞀文件名防芆盖 |\n| **路埄安党** | 䞊䌠目圕限制 + `_safe_path()` 绝对路埄校验防止路埄遍历 |\n| **数据校验** | `album_id` 等参数区制正敎数校验存圚性校验防止对䞍存圚资源操䜜 |\n| **SQL 泚入** | 党郚䜿甚 PyMySQL 参数化查询 (`%s`) |\n| **CORS** | Flask-CORS 配眮 `supports_credentials=True` |\n\n---\n\n## 👥 权限䜓系\n\n### 角色诎明\n\n| 角色 | `is_admin` 倌 | 权限范囎 |\n|------|--------------|---------|\n| **管理员** | `1` | 查看所有盞册操䜜所有资源 |\n| **普通成员** | `0`默讀 | 只胜查看/操䜜**自己创建的**盞册及照片 |\n\n### 权限配眮\n\n圚数据库䞭手劚讟眮\n\n```sql\n-- 将某甚户讟䞺管理员\nUPDATE family_member SET is_admin = 1 WHERE username = 'father';\n\n-- 取消管理员权限\nUPDATE family_member SET is_admin = 0 WHERE username = 'father';\n\n-- 查看所有成员的权限\nSELECT id, name, username, is_admin FROM family_member;\n```\n\n### 权限芆盖范囎\n\n| 操䜜 | 管理员 | 普通成员 |\n|------|--------|---------|\n| 查看盞册列衚 | 所有盞册 | 仅自己创建的 |\n| 查看盞册照片 | 任意盞册 | 仅自己创建的盞册 |\n| 创建盞册 | ✅ | ✅自劚成䞺创建者 |\n| 重呜名/删陀盞册 | 任意盞册 | 仅自己创建的 |\n| 曎换盞册封面 | 任意盞册 | 仅自己创建的 |\n| 䞊䌠照片 | 任意盞册 | 仅自己创建的盞册 |\n| 删陀照片 | 任意照片 | 仅自己盞册䞭的照片 |\n| 搜玢照片 | 任意盞册 | 仅自己创建的盞册 |\n| 收藏/取消收藏 | ✅ | ✅收藏䞺䞪人行䞺无需权限 |\n\n---\n\n## 🀖 AI 助手\n\n支持䞉种 AI 提䟛商通过环境变量 `AI_PROVIDER` 切换\n\n| 提䟛商 | 配眮方匏 | 特点 |\n|--------|---------|------|\n| **OpenAI** | 配眮 `AI_API_KEY` + `AI_API_BASE` | 支持 OpenAI / DeepSeek / 通义千问等兌容接口 |\n| **Ollama** | `AI_PROVIDER=ollama` | 本地郚眲无需 API Key完党犻线 |\n| **暡拟暡匏** | 䞍配眮 `AI_API_KEY` | 自劚䜿甚预讟回倍方䟿䜓验功胜 |\n\n---\n\n## 📞 功胜预览\n\n| 页面 | 功胜 |\n|------|------|\n| 🔑 登圕页 | 枩銚风栌登圕SHA256 密码加密䌠蟓 |\n| 📁 盞册列衚 | 展瀺所有盞册星瀺封面、最后䞊䌠人和时闎 |\n| 🖌 盞册诊情 | 照片眑栌展瀺、分页加蜜、搜玢筛选 |\n| 📀 䞊䌠区域 | 填写園属成员、拍摄时闎、倇泚后批量䞊䌠 |\n| 📷 拍照䞊䌠 | 调甚摄像倎拍照 → 预览 → 选择園属人 → 䞊䌠 |\n| 💖 收藏管理 | 收藏倹列衚 + 收藏照片眑栌支持增删改 |\n| 🀖 AI 助手 | 党局悬浮对话窗聊倩记圕按莊号隔犻 |\n\n---\n\n## 🛠 匀发诎明\n\n### 前端代理配眮`craco.config.js`\n\n```javascript\n// 匀发环境䞋自劚代理到后端\n'/api' → http://localhost:5000/api\n'/uploads' → http://localhost:5000/uploads\n```\n\n### 日志系统\n\n- 日志目圕`family-photo-backend/logs/`\n- `info.log`垞规操䜜日志保留 30 倩\n- `error.log`错误日志保留 90 倩\n- 按倩自劚蜮蜬Windows 䞋安党倄理文件锁定\n\n### 密码加密流皋\n\n```\n甚户蟓入明文密码\n │\n â–Œ\n前端 CryptoJS.SHA256(password) ──→ SHA256 哈垌\n │\n â–Œ\nPOST /api/login { password: sha256_hash }\n │\n â–Œ\n后端 bcrypt.checkpw(sha256_hash, db_bcrypt_hash) ──→ 验证结果\n```\n\n---\n\n## 📋 埅办事项\n\n- [ ] 实现 Token 黑名单机制䜿 Logout 真正生效\n- [ ] 添加照片 EXIF 信息自劚提取拍摄时闎、GPS 等\n- [ ] 支持照片压猩䞊䌠减少存傚空闎\n- [ ] 添加照片分享功胜生成䞎时铟接\n\n---\n\n## 📄 License\n\nMIT License © 2026 Family Photo Manager"}, "85ce0ce91ead6f3f61c551e62487a7300377a43b": {"t": 1785771642.7517693, "n": 11497, "h": "53b32a548ab312ae", "c": "
\n\n# 📷 家庭盞册 Family Photo Manager\n\n**记圕每䞀䞪枩銚瞬闎让家人之闎的距犻曎近䞀点 💖**\n\n[![Python](https://img.shields.io/badge/Python-3.8+-blue?logo=python)](https://www.python.org/)\n[![Flask](https://img.shields.io/badge/Flask-2.3-green?logo=flask)](https://flask.palletsprojects.com/)\n[![React](https://img.shields.io/badge/React-19-61DAFB?logo=react)](https://react.dev/)\n[![Ant Design](https://img.shields.io/badge/Ant%20Design-6-0170F8?logo=ant-design)](https://ant.design/)\n[![MySQL](https://img.shields.io/badge/MySQL-5.7+-4479A1?logo=mysql)](https://www.mysql.com/)\n\n
\n\n---\n\n## 📖 项目简介\n\n家庭盞册是䞀䞪䞓䞺家庭讟计的私密照片管理系统。支持倚家庭成员共享盞册、照片䞊䌠/拍照、收藏管理并内眮 AI 智胜助手提䟛枩銚互劚。所有数据存傚圚本地保技家庭隐私。\n\n### ✹ 栞心功胜\n\n| 功胜暡块 | 描述 |\n|---------|------|\n| 📁 **盞册管理** | 创建、重呜名、删陀盞册自定义封面 |\n| 📀 **照片䞊䌠** | 支持批量䞊䌠记圕拍摄时闎、園属成员、倇泚 |\n| 📷 **拍照功胜** | 调甚摄像倎盎接拍照并䞊䌠需 HTTPS 环境 |\n| 🔍 **照片搜玢** | 按名称、園属人、䞊䌠者、日期范囎筛选 |\n| 💖 **收藏管理** | 创建收藏倹照片加入收藏/移出支持倚䞪收藏倹 |\n| 👚‍👩‍👧 **家庭成员** | 倚成员管理照片记圕園属人和䞊䌠者 |\n| 🀖 **AI 助手** | 内眮 AI 对话功胜支持 OpenAI / Ollama 等倚种提䟛商 |\n| 🔐 **登圕鉎权** | JWT Token 讀证SHA256 + bcrypt 双重密码加密 |\n\n---\n\n## 🏗 技术架构\n\n```\n┌─────────────────────────────────────────────────────┐\n│ 前端 (React 19) │\n│ Ant Design 6 · React Router 7 · Axios · Less │\n│ :3000 (craco) │\n└──────────────────────┬──────────────────────────────┘\n │ /api/* /uploads/*\n â–Œ\n┌─────────────────────────────────────────────────────┐\n│ 后端 (Flask 2.3) │\n│ PyJWT · bcrypt · PyMySQL · Werkzeug · python-dotenv│\n│ :5000 │\n└───────┬─────────────────────────┬───────────────────┘\n â–Œ â–Œ\n┌───────────────┐ ┌──────────────────┐\n│ MySQL 5.7+ │ │ 本地文件系统 │\n│ family_photo │ │ uploads/photos │\n│ │ │ uploads/covers │\n└───────────────┘ └──────────────────┘\n```\n\n---\n\n## 📂 项目结构\n\n```\nPhotoManager/\n├── family-photo-backend/ # 🔧 后端 (Flask)\n│ ├── config/\n│ │ ├── config.py # 数据库/JWT/密码加密配眮\n│ │ └── log_config.py # 日志配眮按倩蜮蜬\n│ ├── src/\n│ │ ├── main.py # Flask 应甚入口\n│ │ ├── auth.py # 登圕/登出/Token 鉎权\n│ │ ├── album.py # 盞册 CRUD + 封面䞊䌠\n│ │ ├── photo.py # 照片䞊䌠/搜玢/删陀\n│ │ ├── favorite.py # 收藏倹 & 收藏照片管理\n│ │ ├── member.py # 家庭成员查询\n│ │ ├── file.py # 静态文件服务路埄遍历防技\n│ │ ├── chat.py # AI 对话接口\n│ │ ├── ai_service.py # AI 服务OpenAI/Ollama\n│ │ └── utils.py # 数据库连接 & 工具凜数\n│ ├── sql/\n│ │ └── table_info.sql # 数据库建衚 SQL\n│ ├── uploads/ # 䞊䌠文件存傚\n│ │ ├── photos/ # 照片文件按 album_id 分目圕\n│ │ └── covers/ # 盞册封面\n│ ├── logs/ # 日志文件自劚生成\n│ ├── .env.example # 环境变量暡板\n│ └── requirements.txt # Python 䟝赖\n│\n├── family-photo-frontend/ # 🎚 前端 (React)\n│ ├── src/\n│ │ ├── pages/\n│ │ │ ├── Login/ # 登圕页\n│ │ │ ├── AlbumList/ # 盞册列衚\n│ │ │ ├── AlbumDetail/ # 盞册诊情\n│ │ │ │ ├── components/\n│ │ │ │ │ ├── AlbumPhotoList/ # 照片列衚分页\n│ │ │ │ │ ├── UploadArare/ # 照片䞊䌠区\n│ │ │ │ │ └── PhotoCapture/ # 摄像倎拍照\n│ │ │ │ └── popwin/\n│ │ │ │ ├── FilterPopwin/ # 搜玢筛选匹窗\n│ │ │ │ └── FavoriteConfirmModal/ # 收藏确讀匹窗\n│ │ │ ├── CreateAlbum/ # 创建盞册\n│ │ │ └── FavoriteManager/ # 收藏管理\n│ │ ├── components/\n│ │ │ ├── PrivateRoute.js # 路由守卫\n│ │ │ ├── HeaderComponent.js # 顶郚富航\n│ │ │ ├── AiChat/ # AI 对话悬浮窗\n│ │ │ └── ButtonWrapper/ # 按钮封装\n│ │ ├── contexts/\n│ │ │ └── MemberContext.js # 圓前登圕成员䞊䞋文\n│ │ ├── utils/\n│ │ │ ├── request.js # Axios 封装Token 拊截噚\n│ │ │ └── dateUtil.js # 日期栌匏化工具\n│ │ └── App.js # 路由配眮入口\n│ ├── craco.config.js # Craco 配眮Less/代理\n│ └── package.json\n│\n└── README.md\n```\n\n---\n\n## 🚀 快速匀始\n\n### 环境芁求\n\n| 䟝赖 | 版本芁求 |\n|------|---------|\n| Python | 3.8+ |\n| Node.js | 16+ |\n| MySQL | 5.7+ |\n| npm / yarn | 最新皳定版 |\n\n### 1⃣ 克隆项目\n\n```bash\ngit clone \ncd PhotoManager\n```\n\n### 2⃣ 初始化数据库\n\n```bash\n# 登圕 MySQL 创建数据库\nmysql -u root -p\n\nCREATE DATABASE family_photo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\nUSE family_photo;\n\n# 富入建衚 SQL新建数据库时䜿甚\nsource family-photo-backend/sql/table_info.sql;\n\n# 可选插入测试家庭成员\nINSERT INTO family_member (name, relation, username, password, email) VALUES\n('爞爞', 'father', 'father', '歀倄填SHA256哈垌', 'father@example.com'),\n('劈劈', 'mother', 'mother', '歀倄填SHA256哈垌', 'mother@example.com');\n```\n\n> 💡 密码存傚流皋**前端 SHA256** → **后端 bcrypt 加密** → 存入数据库。 \n> 初始密码可先甚 `config/config.py` 侭的 `encrypt_password()` 凜数生成哈垌。\n\n### 3⃣ 启劚后端\n\n```bash\ncd family-photo-backend\n\n# 创建虚拟环境掚荐\npython -m venv venv\n# Windows:\nvenv\\Scripts\\activate\n# macOS/Linux:\nsource venv/bin/activate\n\n# 安装䟝赖\npip install -r requirements.txt\n\n# 配眮环境变量必须\ncp .env.example .env\n# 猖蟑 .env填入以䞋必芁配眮\n# DB_PASSWORD — 数据库密码\n# JWT_SECRET — JWT 密钥甚 python -c \"import secrets; print(secrets.token_hex(32))\" 生成\n# AI_API_KEY — AI 服务密钥可选\n\n# 启劚服务\npython -m src.main\n# 后端运行圚 http://localhost:5000\n```\n\n### 4⃣ 启劚前端\n\n```bash\ncd family-photo-frontend\n\n# 安装䟝赖\nnpm install\n\n# 启劚匀发服务噚\nnpm start\n# 前端运行圚 http://localhost:3000\n# 已配眮代理/api/* 和 /uploads/* 自劚蜬发到后端 5000 端口\n```\n\n---\n\n## ⚙ 环境变量配眮\n\n圚 `family-photo-backend/.env` 䞭配眮参考 `.env.example`\n\n```bash\n# ── 数据库配眮必填─────────────────────\nDB_HOST=localhost\nDB_USER=root\nDB_PASSWORD=䜠的数据库密码\nDB_NAME=family_photo\n\n# ── JWT 密钥必填──────────────────────\n# 生成方匏python -c \"import secrets; print(secrets.token_hex(32))\"\nJWT_SECRET=䜠的JWT密钥\nJWT_EXPIRE_HOURS=24\n\n# ── AI 服务配眮 ──────────────────────────────\n# 提䟛商openai默讀| ollama本地郚眲无需 API Key\nAI_PROVIDER=openai\n\n# OpenAI / DeepSeek / 通义千问\nAI_API_KEY=sk-xxx\nAI_API_BASE=https://api.openai.com/v1\nAI_MODEL=gpt-3.5-turbo\n\n# ── 䜿甚 Ollama 本地郚眲时改䞺以䞋配眮 ───────\n# AI_PROVIDER=ollama\n# AI_MODEL=llama3\n# AI_API_BASE=http://localhost:11434\n\n# ── 通甹 ─────────────────────────────────────\nAI_TIMEOUT=60\n\n# ── Flask 环境 ───────────────────────────────\nFLASK_ENV=dev\n```\n\n> ⚠ **安党提瀺** \n> - `DB_PASSWORD` 和 `JWT_SECRET` 䞺必填项未配眮时服务启劚䌚报错 \n> - `.env` 文件已圚 `.gitignore` 䞭䞍䌚被提亀到代码仓库 \n> - 生产环境请务必䜿甚区随机字笊䞲䜜䞺 `JWT_SECRET`\n\n---\n\n## 🗄 数据库讟计\n\n```\nfamily_member (家庭成员)\n │\n ├──< album (盞册)\n │ │\n │ └──< photo (照片)\n │ │\n │ └──< favorite_photo (收藏记圕) >── favorite_folder (收藏倹)\n │\n └──< ai_chat_message (AI 聊倩记圕)\n```\n\n| 衚名 | 诎明 | 关键字段 |\n|------|------|---------|\n| `family_member` | 家庭成员 / 登圕莊号 | `username`(唯䞀), `password`(bcrypt), **`is_admin`**(权限标识) |\n| `album` | 盞册 | `album_name`, `cover_path`, **`creator_id`**(创建者), `last_upload_user_id` |\n| `photo` | 照片 | `file_path`, `album_id`, `member_id`(園属), `operator_id`(䞊䌠者) |\n| `favorite_folder` | 收藏倹 | `folder_name`, `member_id`, `is_default` |\n| `favorite_photo` | 收藏记圕 | `folder_id`, `photo_id`, `member_id`唯䞀纊束防重倍 |\n| `ai_chat_message` | AI 聊倩记圕 | `member_id`, `role`(user/assistant), `content` |\n\n> 加粗字段䞺本次新增。完敎建衚 SQL 见 `family-photo-backend/sql/table_info.sql`\n\n---\n\n## 📡 API 接口\n\n### 讀证\n\n| 方法 | 路埄 | 诎明 |\n|------|------|------|\n| POST | `/api/login` | 登圕返回 JWT Token |\n| POST | `/api/logout` | 登出 |\n\n### 盞册\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/api/albums` | ✅ | 获取所有盞册列衚 |\n| POST | `/api/album/create` | ✅ | 创建盞册可䞊䌠封面 |\n| POST | `/api/album/rename` | ✅ | 修改盞册名称 |\n| POST | `/api/album/delete` | ✅ | 删陀盞册级联删陀照片 |\n| POST | `/api/album/cover/upload` | ✅ | 䞊䌠/曎换盞册封面 |\n| GET | `/api/photos/album/:id` | ✅ | 获取盞册䞋照片分页 |\n\n### 照片\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| POST | `/api/photos/upload` | ✅ | 䞊䌠照片 |\n| POST | `/api/photos/delete` | ✅ | 删陀照片 |\n| GET | `/api/photos/search` | ✅ | 搜玢照片支持倚条件筛选 |\n\n### 收藏\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/api/favorite/folders` | ✅ | 获取收藏倹列衚 |\n| POST | `/api/favorite/folders` | ✅ | 创建收藏倹 |\n| PUT | `/api/favorite/folders/:id` | ✅ | 修改收藏倹名称 |\n| DELETE | `/api/favorite/folders/:id` | ✅ | 删陀收藏倹 |\n| POST | `/api/favorite/photos` | ✅ | 照片加入收藏 |\n| DELETE | `/api/favorite/photos` | ✅ | 照片移出收藏 |\n| GET | `/api/favorite/photos/:folder_id` | ✅ | 获取收藏倹内照片 |\n\n### 成员 & AI\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/api/current-member` | ✅ | 获取圓前登圕成员信息 |\n| GET | `/api/members` | ✅ | 获取所有家庭成员 |\n| GET | `/api/chat/history` | ✅ | 获取聊倩记圕默讀近 3 䞪月 |\n| POST | `/api/chat/send` | ✅ | 发送消息 & 获取 AI 回倍 |\n| GET | `/api/chat/models` | ✅ | 查询 AI 提䟛商 & 可甚暡型 |\n| POST | `/api/chat/clear` | ✅ | 枅空聊倩记圕 |\n\n### 静态文件\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/uploads/photos/:filename` | ✅ | 获取照片文件 |\n| GET | `/uploads/covers/:filename` | ✅ | 获取封面文件 |\n\n---\n\n## 🔐 安党机制\n\n| 层面 | 措斜 |\n|------|------|\n| **讀证** | JWT TokenHS25624h 过期`@login_required` 装饰噚保技所有接口 |\n| **密码** | 前端 SHA256 + 后端 bcryptsalt rounds=12双重加密 |\n| **权限隔犻** | `is_admin` 字段区分管理员/普通甚户普通甚户只胜操䜜自己创建的盞册及照片 |\n| **文件䞊䌠** | 扩展名癜名单校验、`secure_filename` 过滀、唯䞀文件名防芆盖 |\n| **路埄安党** | 䞊䌠目圕限制 + `_safe_path()` 绝对路埄校验防止路埄遍历 |\n| **数据校验** | `album_id` 等参数区制正敎数校验存圚性校验防止对䞍存圚资源操䜜 |\n| **SQL 泚入** | 党郚䜿甚 PyMySQL 参数化查询 (`%s`) |\n| **CORS** | Flask-CORS 配眮 `supports_credentials=True` |\n\n---\n\n## 👥 权限䜓系\n\n### 角色诎明\n\n| 角色 | `is_admin` 倌 | 权限范囎 |\n|------|--------------|---------|\n| **管理员** | `1` | 查看所有盞册操䜜所有资源 |\n| **普通成员** | `0`默讀 | 只胜查看/操䜜**自己创建的**盞册及照片 |\n\n### 权限配眮\n\n圚数据库䞭手劚讟眮\n\n```sql\n-- 将某甚户讟䞺管理员\nUPDATE family_member SET is_admin = 1 WHERE username = 'father';\n\n-- 取消管理员权限\nUPDATE family_member SET is_admin = 0 WHERE username = 'father';\n\n-- 查看所有成员的权限\nSELECT id, name, username, is_admin FROM family_member;\n```\n\n### 权限芆盖范囎\n\n| 操䜜 | 管理员 | 普通成员 |\n|------|--------|---------|\n| 查看盞册列衚 | 所有盞册 | 仅自己创建的 |\n| 查看盞册照片 | 任意盞册 | 仅自己创建的盞册 |\n| 创建盞册 | ✅ | ✅自劚成䞺创建者 |\n| 重呜名/删陀盞册 | 任意盞册 | 仅自己创建的 |\n| 曎换盞册封面 | 任意盞册 | 仅自己创建的 |\n| 䞊䌠照片 | 任意盞册 | 仅自己创建的盞册 |\n| 删陀照片 | 任意照片 | 仅自己盞册䞭的照片 |\n| 搜玢照片 | 任意盞册 | 仅自己创建的盞册 |\n| 收藏/取消收藏 | ✅ | ✅收藏䞺䞪人行䞺无需权限 |\n\n---\n\n## 🀖 AI 助手\n\n支持䞉种 AI 提䟛商通过环境变量 `AI_PROVIDER` 切换\n\n| 提䟛商 | 配眮方匏 | 特点 |\n|--------|---------|------|\n| **OpenAI** | 配眮 `AI_API_KEY` + `AI_API_BASE` | 支持 OpenAI / DeepSeek / 通义千问等兌容接口 |\n| **Ollama** | `AI_PROVIDER=ollama` | 本地郚眲无需 API Key完党犻线 |\n| **暡拟暡匏** | 䞍配眮 `AI_API_KEY` | 自劚䜿甚预讟回倍方䟿䜓验功胜 |\n\n---\n\n## 📞 功胜预览\n\n| 页面 | 功胜 |\n|------|------|\n| 🔑 登圕页 | 枩銚风栌登圕SHA256 密码加密䌠蟓 |\n| 📁 盞册列衚 | 展瀺所有盞册星瀺封面、最后䞊䌠人和时闎 |\n| 🖌 盞册诊情 | 照片眑栌展瀺、分页加蜜、搜玢筛选 |\n| 📀 䞊䌠区域 | 填写園属成员、拍摄时闎、倇泚后批量䞊䌠 |\n| 📷 拍照䞊䌠 | 调甚摄像倎拍照 → 预览 → 选择園属人 → 䞊䌠 |\n| 💖 收藏管理 | 收藏倹列衚 + 收藏照片眑栌支持增删改 |\n| 🀖 AI 助手 | 党局悬浮对话窗聊倩记圕按莊号隔犻 |\n\n---\n\n## 🛠 匀发诎明\n\n### 前端代理配眮`craco.config.js`\n\n```javascript\n// 匀发环境䞋自劚代理到后端\n'/api' → http://localhost:5000/api\n'/uploads' → http://localhost:5000/uploads\n```\n\n### 日志系统\n\n- 日志目圕`family-photo-backend/logs/`\n- `info.log`垞规操䜜日志保留 30 倩\n- `error.log`错误日志保留 90 倩\n- 按倩自劚蜮蜬Windows 䞋安党倄理文件锁定\n\n### 密码加密流皋\n\n```\n甚户蟓入明文密码\n │\n â–Œ\n前端 CryptoJS.SHA256(password) ──→ SHA256 哈垌\n │\n â–Œ\nPOST /api/login { password: sha256_hash }\n │\n â–Œ\n后端 bcrypt.checkpw(sha256_hash, db_bcrypt_hash) ──→ 验证结果\n```\n\n---\n\n## 📋 埅办事项\n\n- [ ] 实现 Token 黑名单机制䜿 Logout 真正生效\n- [ ] 添加照片 EXIF 信息自劚提取拍摄时闎、GPS 等\n- [ ] 支持照片压猩䞊䌠减少存傚空闎\n- [ ] 添加照片分享功胜生成䞎时铟接\n\n---\n\n## 📄 License\n\nMIT License © 2026 Family Photo Manager"}, "da8bc81128da1c501ef5b7f9432e9480b2020993": {"t": 1785771645.0000422, "n": 11146, "h": "2eacf59d05c05175", "c": "
\n\n# 📷 家庭盞册 Family Photo Manager\n\n**记圕每䞀䞪枩銚瞬闎让家人之闎的距犻曎近䞀点 💖**\n\n[![Python](https://img.shields.io/badge/Python-3.8+-blue?logo=python)](https://www.python.org/)\n[![Flask](https://img.shields.io/badge/Flask-2.3-green?logo=flask)](https://flask.palletsprojects.com/)\n[![React](https://img.shields.io/badge/React-19-61DAFB?logo=react)](https://react.dev/)\n[![Ant Design](https://img.shields.io/badge/Ant%20Design-6-0170F8?logo=ant-design)](https://ant.design/)\n[![MySQL](https://img.shields.io/badge/MySQL-5.7+-4479A1?logo=mysql)](https://www.mysql.com/)\n\n
\n\n---\n\n## 📖 项目简介\n\n家庭盞册是䞀䞪䞓䞺家庭讟计的私密照片管理系统。支持倚家庭成员共享盞册、照片䞊䌠/拍照、收藏管理并内眮 AI 智胜助手提䟛枩銚互劚。所有数据存傚圚本地保技家庭隐私。\n\n### ✹ 栞心功胜\n\n| 功胜暡块 | 描述 |\n|---------|------|\n| 📁 **盞册管理** | 创建、重呜名、删陀盞册自定义封面 |\n| 📀 **照片䞊䌠** | 支持批量䞊䌠记圕拍摄时闎、園属成员、倇泚 |\n| 📷 **拍照功胜** | 调甚摄像倎盎接拍照并䞊䌠需 HTTPS 环境 |\n| 🔍 **照片搜玢** | 按名称、園属人、䞊䌠者、日期范囎筛选 |\n| 💖 **收藏管理** | 创建收藏倹照片加入收藏/移出支持倚䞪收藏倹 |\n| 👚‍👩‍👧 **家庭成员** | 倚成员管理照片记圕園属人和䞊䌠者 |\n| 🀖 **AI 助手** | 内眮 AI 对话功胜支持 OpenAI / Ollama 等倚种提䟛商 |\n| 🔐 **登圕鉎权** | JWT Token 讀证SHA256 + bcrypt 双重密码加密 |\n\n---\n\n## 🏗 技术架构\n\n```\n┌─────────────────────────────────────────────────────┐\n│ 前端 (React 19) │\n│ Ant Design 6 · React Router 7 · Axios · Less │\n│ :3000 (craco) │\n└──────────────────────┬──────────────────────────────┘\n │ /api/* /uploads/*\n â–Œ\n┌─────────────────────────────────────────────────────┐\n│ 后端 (Flask 2.3) │\n│ PyJWT · bcrypt · PyMySQL · Werkzeug · python-dotenv│\n│ :5000 │\n└───────┬─────────────────────────┬───────────────────┘\n â–Œ â–Œ\n┌───────────────┐ ┌──────────────────┐\n│ MySQL 5.7+ │ │ 本地文件系统 │\n│ family_photo │ │ uploads/photos │\n│ │ │ uploads/covers │\n└───────────────┘ └──────────────────┘\n```\n\n---\n\n## 📂 项目结构\n\n```\nPhotoManager/\n├── family-photo-backend/ # 🔧 后端 (Flask)\n│ ├── config/\n│ │ ├── config.py # 数据库/JWT/密码加密配眮\n│ │ └── log_config.py # 日志配眮按倩蜮蜬\n│ ├── src/\n│ │ ├── main.py # Flask 应甚入口\n│ │ ├── auth.py # 登圕/登出/Token 鉎权\n│ │ ├── album.py # 盞册 CRUD + 封面䞊䌠\n│ │ ├── photo.py # 照片䞊䌠/搜玢/删陀\n│ │ ├── favorite.py # 收藏倹 & 收藏照片管理\n│ │ ├── member.py # 家庭成员查询\n│ │ ├── file.py # 静态文件服务路埄遍历防技\n│ │ ├── chat.py # AI 对话接口\n│ │ ├── ai_service.py # AI 服务OpenAI/Ollama\n│ │ └── utils.py # 数据库连接 & 工具凜数\n│ ├── sql/\n│ │ └── table_info.sql # 数据库建衚 SQL\n│ ├── uploads/ # 䞊䌠文件存傚\n│ │ ├── photos/ # 照片文件按 album_id 分目圕\n│ │ └── covers/ # 盞册封面\n│ ├── logs/ # 日志文件自劚生成\n│ ├── .env.example # 环境变量暡板\n│ └── requirements.txt # Python 䟝赖\n│\n├── family-photo-frontend/ # 🎚 前端 (React)\n│ ├── src/\n│ │ ├── pages/\n│ │ │ ├── Login/ # 登圕页\n│ │ │ ├── AlbumList/ # 盞册列衚\n│ │ │ ├── AlbumDetail/ # 盞册诊情\n│ │ │ │ ├── components/\n│ │ │ │ │ ├── AlbumPhotoList/ # 照片列衚分页\n│ │ │ │ │ ├── UploadArare/ # 照片䞊䌠区\n│ │ │ │ │ └── PhotoCapture/ # 摄像倎拍照\n│ │ │ │ └── popwin/\n│ │ │ │ ├── FilterPopwin/ # 搜玢筛选匹窗\n│ │ │ │ └── FavoriteConfirmModal/ # 收藏确讀匹窗\n│ │ │ ├── CreateAlbum/ # 创建盞册\n│ │ │ └── FavoriteManager/ # 收藏管理\n│ │ ├── components/\n│ │ │ ├── PrivateRoute.js # 路由守卫\n│ │ │ ├── HeaderComponent.js # 顶郚富航\n│ │ │ ├── AiChat/ # AI 对话悬浮窗\n│ │ │ └── ButtonWrapper/ # 按钮封装\n│ │ ├── contexts/\n│ │ │ └── MemberContext.js # 圓前登圕成员䞊䞋文\n│ │ ├── utils/\n│ │ │ ├── request.js # Axios 封装Token 拊截噚\n│ │ │ └── dateUtil.js # 日期栌匏化工具\n│ │ └── App.js # 路由配眮入口\n│ ├── craco.config.js # Craco 配眮Less/代理\n│ └── package.json\n│\n└── README.md\n```\n\n---\n\n## 🚀 快速匀始\n\n### 环境芁求\n\n| 䟝赖 | 版本芁求 |\n|------|---------|\n| Python | 3.8+ |\n| Node.js | 16+ |\n| MySQL | 5.7+ |\n| npm / yarn | 最新皳定版 |\n\n### 1⃣ 克隆项目\n\n```bash\ngit clone \ncd PhotoManager\n```\n\n### 2⃣ 初始化数据库\n\n```bash\n# 登圕 MySQL 创建数据库\nmysql -u root -p\n\nCREATE DATABASE family_photo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\nUSE family_photo;\n\n# 富入建衚 SQL新建数据库时䜿甚\nsource family-photo-backend/sql/table_info.sql;\n\n# 可选插入测试家庭成员\nINSERT INTO family_member (name, relation, username, password, email) VALUES\n('爞爞', 'father', 'father', '歀倄填SHA256哈垌', 'father@example.com'),\n('劈劈', 'mother', 'mother', '歀倄填SHA256哈垌', 'mother@example.com');\n```\n\n> 💡 密码存傚流皋**前端 SHA256** → **后端 bcrypt 加密** → 存入数据库。 \n> 初始密码可先甚 `config/config.py` 侭的 `encrypt_password()` 凜数生成哈垌。\n\n### 3⃣ 启劚后端\n\n```bash\ncd family-photo-backend\n\n# 创建虚拟环境掚荐\npython -m venv venv\n# Windows:\nvenv\\Scripts\\activate\n# macOS/Linux:\nsource venv/bin/activate\n\n# 安装䟝赖\npip install -r requirements.txt\n\n# 配眮环境变量\ncp .env.example .env\n# 猖蟑 .env 填入数据库密码和 AI 配眮\n\n# 修改 config/config.py 䞭的数据库连接信息\n# DB_CONFIG = { 'host': 'localhost', 'user': 'root', 'password': '䜠的密码', ... }\n\n# 启劚服务\npython -m src.main\n# 后端运行圚 http://localhost:5000\n```\n\n### 4⃣ 启劚前端\n\n```bash\ncd family-photo-frontend\n\n# 安装䟝赖\nnpm install\n\n# 启劚匀发服务噚\nnpm start\n# 前端运行圚 http://localhost:3000\n# 已配眮代理/api/* 和 /uploads/* 自劚蜬发到后端 5000 端口\n```\n\n---\n\n## ⚙ 环境变量配眮\n\n圚 `family-photo-backend/.env` 䞭配眮\n\n```bash\n# ── AI 服务配眮 ──────────────────────────────\n# 提䟛商openai默讀| ollama本地郚眲无需 API Key\nAI_PROVIDER=openai\n\n# OpenAI / DeepSeek / 通义千问\nAI_API_KEY=sk-xxx\nAI_API_BASE=https://api.openai.com/v1\nAI_MODEL=gpt-3.5-turbo\n\n# ── 䜿甚 Ollama 本地郚眲时改䞺以䞋配眮 ───────\n# AI_PROVIDER=ollama\n# AI_MODEL=llama3\n# AI_API_BASE=http://localhost:11434\n\n# ── 通甹 ─────────────────────────────────────\nAI_TIMEOUT=60\n\n# ── Flask 环境 ───────────────────────────────\nFLASK_ENV=dev\n```\n\n---\n\n## 🗄 数据库讟计\n\n```\nfamily_member (家庭成员)\n │\n ├──< album (盞册)\n │ │\n │ └──< photo (照片)\n │ │\n │ └──< favorite_photo (收藏记圕) >── favorite_folder (收藏倹)\n │\n └──< ai_chat_message (AI 聊倩记圕)\n```\n\n| 衚名 | 诎明 | 关键字段 |\n|------|------|---------|\n| `family_member` | 家庭成员 / 登圕莊号 | `username`(唯䞀), `password`(bcrypt), **`is_admin`**(权限标识) |\n| `album` | 盞册 | `album_name`, `cover_path`, **`creator_id`**(创建者), `last_upload_user_id` |\n| `photo` | 照片 | `file_path`, `album_id`, `member_id`(園属), `operator_id`(䞊䌠者) |\n| `favorite_folder` | 收藏倹 | `folder_name`, `member_id`, `is_default` |\n| `favorite_photo` | 收藏记圕 | `folder_id`, `photo_id`, `member_id`唯䞀纊束防重倍 |\n| `ai_chat_message` | AI 聊倩记圕 | `member_id`, `role`(user/assistant), `content` |\n\n> 加粗字段䞺本次新增。完敎建衚 SQL 见 `family-photo-backend/sql/table_info.sql`\n\n---\n\n## 📡 API 接口\n\n### 讀证\n\n| 方法 | 路埄 | 诎明 |\n|------|------|------|\n| POST | `/api/login` | 登圕返回 JWT Token |\n| POST | `/api/logout` | 登出 |\n\n### 盞册\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/api/albums` | ✅ | 获取所有盞册列衚 |\n| POST | `/api/album/create` | ✅ | 创建盞册可䞊䌠封面 |\n| POST | `/api/album/rename` | ✅ | 修改盞册名称 |\n| POST | `/api/album/delete` | ✅ | 删陀盞册级联删陀照片 |\n| POST | `/api/album/cover/upload` | ✅ | 䞊䌠/曎换盞册封面 |\n| GET | `/api/photos/album/:id` | ✅ | 获取盞册䞋照片分页 |\n\n### 照片\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| POST | `/api/photos/upload` | ✅ | 䞊䌠照片 |\n| POST | `/api/photos/delete` | ✅ | 删陀照片 |\n| GET | `/api/photos/search` | ✅ | 搜玢照片支持倚条件筛选 |\n\n### 收藏\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/api/favorite/folders` | ✅ | 获取收藏倹列衚 |\n| POST | `/api/favorite/folders` | ✅ | 创建收藏倹 |\n| PUT | `/api/favorite/folders/:id` | ✅ | 修改收藏倹名称 |\n| DELETE | `/api/favorite/folders/:id` | ✅ | 删陀收藏倹 |\n| POST | `/api/favorite/photos` | ✅ | 照片加入收藏 |\n| DELETE | `/api/favorite/photos` | ✅ | 照片移出收藏 |\n| GET | `/api/favorite/photos/:folder_id` | ✅ | 获取收藏倹内照片 |\n\n### 成员 & AI\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/api/current-member` | ✅ | 获取圓前登圕成员信息 |\n| GET | `/api/members` | ✅ | 获取所有家庭成员 |\n| GET | `/api/chat/history` | ✅ | 获取聊倩记圕默讀近 3 䞪月 |\n| POST | `/api/chat/send` | ✅ | 发送消息 & 获取 AI 回倍 |\n| GET | `/api/chat/models` | ✅ | 查询 AI 提䟛商 & 可甚暡型 |\n| POST | `/api/chat/clear` | ✅ | 枅空聊倩记圕 |\n\n### 静态文件\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/uploads/photos/:filename` | ✅ | 获取照片文件 |\n| GET | `/uploads/covers/:filename` | ✅ | 获取封面文件 |\n\n---\n\n## 🔐 安党机制\n\n| 层面 | 措斜 |\n|------|------|\n| **讀证** | JWT TokenHS25624h 过期`@login_required` 装饰噚保技所有接口 |\n| **密码** | 前端 SHA256 + 后端 bcryptsalt rounds=12双重加密 |\n| **权限隔犻** | `is_admin` 字段区分管理员/普通甚户普通甚户只胜操䜜自己创建的盞册及照片 |\n| **文件䞊䌠** | 扩展名癜名单校验、`secure_filename` 过滀、唯䞀文件名防芆盖 |\n| **路埄安党** | 䞊䌠目圕限制 + `_safe_path()` 绝对路埄校验防止路埄遍历 |\n| **数据校验** | `album_id` 等参数区制正敎数校验存圚性校验防止对䞍存圚资源操䜜 |\n| **SQL 泚入** | 党郚䜿甚 PyMySQL 参数化查询 (`%s`) |\n| **CORS** | Flask-CORS 配眮 `supports_credentials=True` |\n\n---\n\n## 👥 权限䜓系\n\n### 角色诎明\n\n| 角色 | `is_admin` 倌 | 权限范囎 |\n|------|--------------|---------|\n| **管理员** | `1` | 查看所有盞册操䜜所有资源 |\n| **普通成员** | `0`默讀 | 只胜查看/操䜜**自己创建的**盞册及照片 |\n\n### 权限配眮\n\n圚数据库䞭手劚讟眮\n\n```sql\n-- 将某甚户讟䞺管理员\nUPDATE family_member SET is_admin = 1 WHERE username = 'father';\n\n-- 取消管理员权限\nUPDATE family_member SET is_admin = 0 WHERE username = 'father';\n\n-- 查看所有成员的权限\nSELECT id, name, username, is_admin FROM family_member;\n```\n\n### 权限芆盖范囎\n\n| 操䜜 | 管理员 | 普通成员 |\n|------|--------|---------|\n| 查看盞册列衚 | 所有盞册 | 仅自己创建的 |\n| 查看盞册照片 | 任意盞册 | 仅自己创建的盞册 |\n| 创建盞册 | ✅ | ✅自劚成䞺创建者 |\n| 重呜名/删陀盞册 | 任意盞册 | 仅自己创建的 |\n| 曎换盞册封面 | 任意盞册 | 仅自己创建的 |\n| 䞊䌠照片 | 任意盞册 | 仅自己创建的盞册 |\n| 删陀照片 | 任意照片 | 仅自己盞册䞭的照片 |\n| 搜玢照片 | 任意盞册 | 仅自己创建的盞册 |\n| 收藏/取消收藏 | ✅ | ✅收藏䞺䞪人行䞺无需权限 |\n\n---\n\n## 🀖 AI 助手\n\n支持䞉种 AI 提䟛商通过环境变量 `AI_PROVIDER` 切换\n\n| 提䟛商 | 配眮方匏 | 特点 |\n|--------|---------|------|\n| **OpenAI** | 配眮 `AI_API_KEY` + `AI_API_BASE` | 支持 OpenAI / DeepSeek / 通义千问等兌容接口 |\n| **Ollama** | `AI_PROVIDER=ollama` | 本地郚眲无需 API Key完党犻线 |\n| **暡拟暡匏** | 䞍配眮 `AI_API_KEY` | 自劚䜿甚预讟回倍方䟿䜓验功胜 |\n\n---\n\n## 📞 功胜预览\n\n| 页面 | 功胜 |\n|------|------|\n| 🔑 登圕页 | 枩銚风栌登圕SHA256 密码加密䌠蟓 |\n| 📁 盞册列衚 | 展瀺所有盞册星瀺封面、最后䞊䌠人和时闎 |\n| 🖌 盞册诊情 | 照片眑栌展瀺、分页加蜜、搜玢筛选 |\n| 📀 䞊䌠区域 | 填写園属成员、拍摄时闎、倇泚后批量䞊䌠 |\n| 📷 拍照䞊䌠 | 调甚摄像倎拍照 → 预览 → 选择園属人 → 䞊䌠 |\n| 💖 收藏管理 | 收藏倹列衚 + 收藏照片眑栌支持增删改 |\n| 🀖 AI 助手 | 党局悬浮对话窗聊倩记圕按莊号隔犻 |\n\n---\n\n## 🛠 匀发诎明\n\n### 前端代理配眮`craco.config.js`\n\n```javascript\n// 匀发环境䞋自劚代理到后端\n'/api' → http://localhost:5000/api\n'/uploads' → http://localhost:5000/uploads\n```\n\n### 日志系统\n\n- 日志目圕`family-photo-backend/logs/`\n- `info.log`垞规操䜜日志保留 30 倩\n- `error.log`错误日志保留 90 倩\n- 按倩自劚蜮蜬Windows 䞋安党倄理文件锁定\n\n### 密码加密流皋\n\n```\n甚户蟓入明文密码\n │\n â–Œ\n前端 CryptoJS.SHA256(password) ──→ SHA256 哈垌\n │\n â–Œ\nPOST /api/login { password: sha256_hash }\n │\n â–Œ\n后端 bcrypt.checkpw(sha256_hash, db_bcrypt_hash) ──→ 验证结果\n```\n\n---\n\n## 📋 埅办事项\n\n- [ ] 实现 Token 黑名单机制䜿 Logout 真正生效\n- [ ] 添加盞册/照片的访问权限控制按成员隔犻\n- [ ] 将数据库密码和 JWT 密钥迁移到环境变量\n- [ ] 前端 Token 改甚 HttpOnly Cookie 䌠递避免 URL 暎露\n- [ ] 添加照片 EXIF 信息自劚提取拍摄时闎、GPS 等\n- [ ] 支持照片压猩䞊䌠减少存傚空闎\n- [ ] 添加照片分享功胜生成䞎时铟接\n\n---\n\n## 📄 License\n\nMIT License © 2026 Family Photo Manager"}, "0aa5d81b56e4d304b430f28bb0de91f9d83db520": {"t": 1785771648.1729136, "n": 10278, "h": "c23fc6b52522f050", "c": "
\n\n# 📷 家庭盞册 Family Photo Manager\n\n**记圕每䞀䞪枩銚瞬闎让家人之闎的距犻曎近䞀点 💖**\n\n[![Python](https://img.shields.io/badge/Python-3.8+-blue?logo=python)](https://www.python.org/)\n[![Flask](https://img.shields.io/badge/Flask-2.3-green?logo=flask)](https://flask.palletsprojects.com/)\n[![React](https://img.shields.io/badge/React-19-61DAFB?logo=react)](https://react.dev/)\n[![Ant Design](https://img.shields.io/badge/Ant%20Design-6-0170F8?logo=ant-design)](https://ant.design/)\n[![MySQL](https://img.shields.io/badge/MySQL-5.7+-4479A1?logo=mysql)](https://www.mysql.com/)\n\n
\n\n---\n\n## 📖 项目简介\n\n家庭盞册是䞀䞪䞓䞺家庭讟计的私密照片管理系统。支持倚家庭成员共享盞册、照片䞊䌠/拍照、收藏管理并内眮 AI 智胜助手提䟛枩銚互劚。所有数据存傚圚本地保技家庭隐私。\n\n### ✹ 栞心功胜\n\n| 功胜暡块 | 描述 |\n|---------|------|\n| 📁 **盞册管理** | 创建、重呜名、删陀盞册自定义封面 |\n| 📀 **照片䞊䌠** | 支持批量䞊䌠记圕拍摄时闎、園属成员、倇泚 |\n| 📷 **拍照功胜** | 调甚摄像倎盎接拍照并䞊䌠需 HTTPS 环境 |\n| 🔍 **照片搜玢** | 按名称、園属人、䞊䌠者、日期范囎筛选 |\n| 💖 **收藏管理** | 创建收藏倹照片加入收藏/移出支持倚䞪收藏倹 |\n| 👚‍👩‍👧 **家庭成员** | 倚成员管理照片记圕園属人和䞊䌠者 |\n| 🀖 **AI 助手** | 内眮 AI 对话功胜支持 OpenAI / Ollama 等倚种提䟛商 |\n| 🔐 **登圕鉎权** | JWT Token 讀证SHA256 + bcrypt 双重密码加密 |\n\n---\n\n## 🏗 技术架构\n\n```\n┌─────────────────────────────────────────────────────┐\n│ 前端 (React 19) │\n│ Ant Design 6 · React Router 7 · Axios · Less │\n│ :3000 (craco) │\n└──────────────────────┬──────────────────────────────┘\n │ /api/* /uploads/*\n â–Œ\n┌─────────────────────────────────────────────────────┐\n│ 后端 (Flask 2.3) │\n│ PyJWT · bcrypt · PyMySQL · Werkzeug · python-dotenv│\n│ :5000 │\n└───────┬─────────────────────────┬───────────────────┘\n â–Œ â–Œ\n┌───────────────┐ ┌──────────────────┐\n│ MySQL 5.7+ │ │ 本地文件系统 │\n│ family_photo │ │ uploads/photos │\n│ │ │ uploads/covers │\n└───────────────┘ └──────────────────┘\n```\n\n---\n\n## 📂 项目结构\n\n```\nPhotoManager/\n├── family-photo-backend/ # 🔧 后端 (Flask)\n│ ├── config/\n│ │ ├── config.py # 数据库/JWT/密码加密配眮\n│ │ └── log_config.py # 日志配眮按倩蜮蜬\n│ ├── src/\n│ │ ├── main.py # Flask 应甚入口\n│ │ ├── auth.py # 登圕/登出/Token 鉎权\n│ │ ├── album.py # 盞册 CRUD + 封面䞊䌠\n│ │ ├── photo.py # 照片䞊䌠/搜玢/删陀\n│ │ ├── favorite.py # 收藏倹 & 收藏照片管理\n│ │ ├── member.py # 家庭成员查询\n│ │ ├── file.py # 静态文件服务路埄遍历防技\n│ │ ├── chat.py # AI 对话接口\n│ │ ├── ai_service.py # AI 服务OpenAI/Ollama\n│ │ └── utils.py # 数据库连接 & 工具凜数\n│ ├── sql/\n│ │ └── table_info.sql # 数据库建衚 SQL\n│ ├── uploads/ # 䞊䌠文件存傚\n│ │ ├── photos/ # 照片文件按 album_id 分目圕\n│ │ └── covers/ # 盞册封面\n│ ├── logs/ # 日志文件自劚生成\n│ ├── .env.example # 环境变量暡板\n│ └── requirements.txt # Python 䟝赖\n│\n├── family-photo-frontend/ # 🎚 前端 (React)\n│ ├── src/\n│ │ ├── pages/\n│ │ │ ├── Login/ # 登圕页\n│ │ │ ├── AlbumList/ # 盞册列衚\n│ │ │ ├── AlbumDetail/ # 盞册诊情\n│ │ │ │ ├── components/\n│ │ │ │ │ ├── AlbumPhotoList/ # 照片列衚分页\n│ │ │ │ │ ├── UploadArare/ # 照片䞊䌠区\n│ │ │ │ │ └── PhotoCapture/ # 摄像倎拍照\n│ │ │ │ └── popwin/\n│ │ │ │ ├── FilterPopwin/ # 搜玢筛选匹窗\n│ │ │ │ └── FavoriteConfirmModal/ # 收藏确讀匹窗\n│ │ │ ├── CreateAlbum/ # 创建盞册\n│ │ │ └── FavoriteManager/ # 收藏管理\n│ │ ├── components/\n│ │ │ ├── PrivateRoute.js # 路由守卫\n│ │ │ ├── HeaderComponent.js # 顶郚富航\n│ │ │ ├── AiChat/ # AI 对话悬浮窗\n│ │ │ └── ButtonWrapper/ # 按钮封装\n│ │ ├── contexts/\n│ │ │ └── MemberContext.js # 圓前登圕成员䞊䞋文\n│ │ ├── utils/\n│ │ │ ├── request.js # Axios 封装Token 拊截噚\n│ │ │ └── dateUtil.js # 日期栌匏化工具\n│ │ └── App.js # 路由配眮入口\n│ ├── craco.config.js # Craco 配眮Less/代理\n│ └── package.json\n│\n└── README.md\n```\n\n---\n\n## 🚀 快速匀始\n\n### 环境芁求\n\n| 䟝赖 | 版本芁求 |\n|------|---------|\n| Python | 3.8+ |\n| Node.js | 16+ |\n| MySQL | 5.7+ |\n| npm / yarn | 最新皳定版 |\n\n### 1⃣ 克隆项目\n\n```bash\ngit clone \ncd PhotoManager\n```\n\n### 2⃣ 初始化数据库\n\n```bash\n# 登圕 MySQL 创建数据库\nmysql -u root -p\n\nCREATE DATABASE family_photo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\nUSE family_photo;\n\n# 富入建衚 SQL\nsource family-photo-backend/sql/table_info.sql;\n\n# 可选插入测试家庭成员\nINSERT INTO family_member (name, relation, username, password, email) VALUES\n('爞爞', 'father', 'father', '歀倄填SHA256哈垌', 'father@example.com'),\n('劈劈', 'mother', 'mother', '歀倄填SHA256哈垌', 'mother@example.com');\n```\n\n> 💡 密码存傚流皋**前端 SHA256** → **后端 bcrypt 加密** → 存入数据库。 \n> 初始密码可先甚 `config/config.py` 侭的 `encrypt_password()` 凜数生成哈垌。\n\n### 3⃣ 启劚后端\n\n```bash\ncd family-photo-backend\n\n# 创建虚拟环境掚荐\npython -m venv venv\n# Windows:\nvenv\\Scripts\\activate\n# macOS/Linux:\nsource venv/bin/activate\n\n# 安装䟝赖\npip install -r requirements.txt\n\n# 配眮环境变量\ncp .env.example .env\n# 猖蟑 .env 填入数据库密码和 AI 配眮\n\n# 修改 config/config.py 䞭的数据库连接信息\n# DB_CONFIG = { 'host': 'localhost', 'user': 'root', 'password': '䜠的密码', ... }\n\n# 启劚服务\npython -m src.main\n# 后端运行圚 http://localhost:5000\n```\n\n### 4⃣ 启劚前端\n\n```bash\ncd family-photo-frontend\n\n# 安装䟝赖\nnpm install\n\n# 启劚匀发服务噚\nnpm start\n# 前端运行圚 http://localhost:3000\n# 已配眮代理/api/* 和 /uploads/* 自劚蜬发到后端 5000 端口\n```\n\n---\n\n## ⚙ 环境变量配眮\n\n圚 `family-photo-backend/.env` 䞭配眮\n\n```bash\n# ── AI 服务配眮 ──────────────────────────────\n# 提䟛商openai默讀| ollama本地郚眲无需 API Key\nAI_PROVIDER=openai\n\n# OpenAI / DeepSeek / 通义千问\nAI_API_KEY=sk-xxx\nAI_API_BASE=https://api.openai.com/v1\nAI_MODEL=gpt-3.5-turbo\n\n# ── 䜿甚 Ollama 本地郚眲时改䞺以䞋配眮 ───────\n# AI_PROVIDER=ollama\n# AI_MODEL=llama3\n# AI_API_BASE=http://localhost:11434\n\n# ── 通甹 ─────────────────────────────────────\nAI_TIMEOUT=60\n\n# ── Flask 环境 ───────────────────────────────\nFLASK_ENV=dev\n```\n\n---\n\n## 🗄 数据库讟计\n\n```\nfamily_member (家庭成员)\n │\n ├──< album (盞册)\n │ │\n │ └──< photo (照片)\n │ │\n │ └──< favorite_photo (收藏记圕) >── favorite_folder (收藏倹)\n │\n └──< ai_chat_message (AI 聊倩记圕)\n```\n\n| 衚名 | 诎明 | 关键字段 |\n|------|------|---------|\n| `family_member` | 家庭成员 / 登圕莊号 | `username`(唯䞀), `password`(bcrypt) |\n| `album` | 盞册 | `album_name`, `cover_path`, `last_upload_user_id` |\n| `photo` | 照片 | `file_path`, `album_id`, `member_id`(園属), `operator_id`(䞊䌠者) |\n| `favorite_folder` | 收藏倹 | `folder_name`, `member_id`, `is_default` |\n| `favorite_photo` | 收藏记圕 | `folder_id`, `photo_id`, `member_id`唯䞀纊束防重倍 |\n| `ai_chat_message` | AI 聊倩记圕 | `member_id`, `role`(user/assistant), `content` |\n\n> 完敎建衚 SQL 见 `family-photo-backend/sql/table_info.sql`\n\n---\n\n## 📡 API 接口\n\n### 讀证\n\n| 方法 | 路埄 | 诎明 |\n|------|------|------|\n| POST | `/api/login` | 登圕返回 JWT Token |\n| POST | `/api/logout` | 登出 |\n\n### 盞册\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/api/albums` | ✅ | 获取所有盞册列衚 |\n| POST | `/api/album/create` | ✅ | 创建盞册可䞊䌠封面 |\n| POST | `/api/album/rename` | ✅ | 修改盞册名称 |\n| POST | `/api/album/delete` | ✅ | 删陀盞册级联删陀照片 |\n| POST | `/api/album/cover/upload` | ✅ | 䞊䌠/曎换盞册封面 |\n| GET | `/api/photos/album/:id` | ✅ | 获取盞册䞋照片分页 |\n\n### 照片\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| POST | `/api/photos/upload` | ✅ | 䞊䌠照片 |\n| POST | `/api/photos/delete` | ✅ | 删陀照片 |\n| GET | `/api/photos/search` | ✅ | 搜玢照片支持倚条件筛选 |\n\n### 收藏\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/api/favorite/folders` | ✅ | 获取收藏倹列衚 |\n| POST | `/api/favorite/folders` | ✅ | 创建收藏倹 |\n| PUT | `/api/favorite/folders/:id` | ✅ | 修改收藏倹名称 |\n| DELETE | `/api/favorite/folders/:id` | ✅ | 删陀收藏倹 |\n| POST | `/api/favorite/photos` | ✅ | 照片加入收藏 |\n| DELETE | `/api/favorite/photos` | ✅ | 照片移出收藏 |\n| GET | `/api/favorite/photos/:folder_id` | ✅ | 获取收藏倹内照片 |\n\n### 成员 & AI\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/api/current-member` | ✅ | 获取圓前登圕成员信息 |\n| GET | `/api/members` | ✅ | 获取所有家庭成员 |\n| GET | `/api/chat/history` | ✅ | 获取聊倩记圕默讀近 3 䞪月 |\n| POST | `/api/chat/send` | ✅ | 发送消息 & 获取 AI 回倍 |\n| GET | `/api/chat/models` | ✅ | 查询 AI 提䟛商 & 可甚暡型 |\n| POST | `/api/chat/clear` | ✅ | 枅空聊倩记圕 |\n\n### 静态文件\n\n| 方法 | 路埄 | 鉎权 | 诎明 |\n|------|------|------|------|\n| GET | `/uploads/photos/:filename` | ✅ | 获取照片文件 |\n| GET | `/uploads/covers/:filename` | ✅ | 获取封面文件 |\n\n---\n\n## 🔐 安党机制\n\n| 层面 | 措斜 |\n|------|------|\n| **讀证** | JWT TokenHS25624h 过期`@login_required` 装饰噚保技所有接口 |\n| **密码** | 前端 SHA256 + 后端 bcryptsalt rounds=12双重加密 |\n| **文件䞊䌠** | 扩展名癜名单校验、`secure_filename` 过滀、唯䞀文件名防芆盖 |\n| **路埄安党** | 䞊䌠目圕限制 + `_safe_path()` 绝对路埄校验防止路埄遍历 |\n| **数据校验** | `album_id` 等参数区制正敎数校验存圚性校验防止对䞍存圚资源操䜜 |\n| **SQL 泚入** | 党郚䜿甚 PyMySQL 参数化查询 (`%s`) |\n| **CORS** | Flask-CORS 配眮 `supports_credentials=True` |\n\n---\n\n## 🀖 AI 助手\n\n支持䞉种 AI 提䟛商通过环境变量 `AI_PROVIDER` 切换\n\n| 提䟛商 | 配眮方匏 | 特点 |\n|--------|---------|------|\n| **OpenAI** | 配眮 `AI_API_KEY` + `AI_API_BASE` | 支持 OpenAI / DeepSeek / 通义千问等兌容接口 |\n| **Ollama** | `AI_PROVIDER=ollama` | 本地郚眲无需 API Key完党犻线 |\n| **暡拟暡匏** | 䞍配眮 `AI_API_KEY` | 自劚䜿甚预讟回倍方䟿䜓验功胜 |\n\n---\n\n## 📞 功胜预览\n\n| 页面 | 功胜 |\n|------|------|\n| 🔑 登圕页 | 枩銚风栌登圕SHA256 密码加密䌠蟓 |\n| 📁 盞册列衚 | 展瀺所有盞册星瀺封面、最后䞊䌠人和时闎 |\n| 🖌 盞册诊情 | 照片眑栌展瀺、分页加蜜、搜玢筛选 |\n| 📀 䞊䌠区域 | 填写園属成员、拍摄时闎、倇泚后批量䞊䌠 |\n| 📷 拍照䞊䌠 | 调甚摄像倎拍照 → 预览 → 选择園属人 → 䞊䌠 |\n| 💖 收藏管理 | 收藏倹列衚 + 收藏照片眑栌支持增删改 |\n| 🀖 AI 助手 | 党局悬浮对话窗聊倩记圕按莊号隔犻 |\n\n---\n\n## 🛠 匀发诎明\n\n### 前端代理配眮`craco.config.js`\n\n```javascript\n// 匀发环境䞋自劚代理到后端\n'/api' → http://localhost:5000/api\n'/uploads' → http://localhost:5000/uploads\n```\n\n### 日志系统\n\n- 日志目圕`family-photo-backend/logs/`\n- `info.log`垞规操䜜日志保留 30 倩\n- `error.log`错误日志保留 90 倩\n- 按倩自劚蜮蜬Windows 䞋安党倄理文件锁定\n\n### 密码加密流皋\n\n```\n甚户蟓入明文密码\n │\n â–Œ\n前端 CryptoJS.SHA256(password) ──→ SHA256 哈垌\n │\n â–Œ\nPOST /api/login { password: sha256_hash }\n │\n â–Œ\n后端 bcrypt.checkpw(sha256_hash, db_bcrypt_hash) ──→ 验证结果\n```\n\n---\n\n## 📋 埅办事项\n\n- [ ] 实现 Token 黑名单机制䜿 Logout 真正生效\n- [ ] 添加盞册/照片的访问权限控制按成员隔犻\n- [ ] 将数据库密码和 JWT 密钥迁移到环境变量\n- [ ] 前端 Token 改甚 HttpOnly Cookie 䌠递避免 URL 暎露\n- [ ] 添加照片 EXIF 信息自劚提取拍摄时闎、GPS 等\n- [ ] 支持照片压猩䞊䌠减少存傚空闎\n- [ ] 添加照片分享功胜生成䞎时铟接\n\n---\n\n## 📄 License\n\nMIT License © 2026 Family Photo Manager"}, "e1a416675c1e98239e1344166314c35445cf7309": {"t": 1785771651.5670063, "n": 14, "h": "0f7000c56434d403", "c": "# PhotoManager"}}}}