Files

1 line
94 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "chuang1234/photomanager", "files": {"README.md": {"a2d159203691e625d991973774af2ed6c235ef65": {"t": 1785747240.2845814, "n": 14354, "h": "ec833026c60b2f9b", "c": "<div align=\"center\">\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</div>\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 <your-repo-url>\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": "<div align=\"center\">\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</div>\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 <your-repo-url>\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": "<div align=\"center\">\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</div>\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 <your-repo-url>\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": "<div align=\"center\">\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</div>\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 <your-repo-url>\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": "<div align=\"center\">\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</div>\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 <your-repo-url>\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"}}}}