# ZJPB v3.0 服务端部署指南

**版本：** v3.0.1 (已修复5个代码问题)
**部署日期：** 2025-02-06
**重要程度：** 🔴 重大更新（需要数据库迁移）

---

## 🆕 v3.0.1 更新说明

**最新提交：** 7a6fd0c

已修复以下问题：
1. ✅ Collection 模型唯一约束逻辑错误
2. ✅ 用户注册重复提交数据库
3. ✅ JavaScript 未使用的变量
4. ✅ 文件夹计数逻辑缺失
5. ✅ JavaScript 错误处理不完善

详细修复记录请查看：`BUGFIX_v3.0.1.md`

---

## 📋 部署前准备

### 1. 系统要求

- Python 3.8+
- MySQL/MariaDB 数据库
- Git
- 足够的磁盘空间（建议至少 1GB）

### 2. 备份现有数据

**⚠️ 重要：在部署前务必备份数据库！**

```bash
# 备份数据库
mysqldump -u root -p zjpb > zjpb_backup_$(date +%Y%m%d_%H%M%S).sql

# 或者如果使用 SQLite
cp instance/zjpb.db instance/zjpb_backup_$(date +%Y%m%d_%H%M%S).db
```

---

## 🚀 部署步骤

### 步骤 1：登录服务器

```bash
ssh your_username@server.zjpb.net
```

### 步骤 2：进入项目目录

```bash
cd /opt/1panel/apps/zjpb
```

### 步骤 3：拉取最新代码

```bash
# 查看当前分支
git branch

# 拉取最新代码
git pull origin master
```

**预期输出：**
```
remote: Enumerating objects: 15, done.
remote: Counting objects: 100% (15/15), done.
...
Updating 34cd05b..2067fb1
Fast-forward
 11 files changed, 2542 insertions(+), 6 deletions(-)
 create mode 100644 CHANGELOG_v3.0.md
 create mode 100644 USER_SYSTEM_README.md
 ...
```

### 步骤 4：激活虚拟环境

```bash
# 如果使用 virtualenv
source venv/bin/activate

# 或者如果使用 conda
conda activate zjpb
```

### 步骤 5：安装/更新依赖

```bash
# 检查是否有新的依赖（v3.0 没有新增依赖）
pip install -r requirements.txt
```

### 步骤 6：运行数据库迁移 ⭐

**这是最关键的一步！**

```bash
python create_user_tables.py
```

**预期输出：**
```
开始创建用户系统表...
SUCCESS: Database tables created successfully!

Created tables:
- users
- folders
- collections

Migration completed!
```

**如果出现错误：**
- 检查数据库连接配置
- 确认数据库用户有 CREATE TABLE 权限
- 查看错误信息并根据提示修复

**⚠️ 如果之前已运行过 v3.0.0（未修复版本）：**

需要运行约束修复脚本：
```bash
python fix_collection_constraint.py
```

这将修复 Collection 表的唯一约束问题。

### 步骤 7：验证数据库表

```bash
# 进入数据库
mysql -u root -p zjpb

# 或者使用 Python 验证
python -c "from app import create_app; from models import db, User, Folder, Collection; app = create_app(); app.app_context().push(); print('Users table:', db.engine.has_table('users')); print('Folders table:', db.engine.has_table('folders')); print('Collections table:', db.engine.has_table('collections'))"
```

**预期输出：**
```
Users table: True
Folders table: True
Collections table: True
```

### 步骤 8：重启应用服务

根据您的部署方式选择对应的重启命令：

**如果使用 Systemd：**
```bash
sudo systemctl restart zjpb
sudo systemctl status zjpb
```

**如果使用 Supervisor：**
```bash
sudo supervisorctl restart zjpb
sudo supervisorctl status zjpb
```

**如果使用 PM2：**
```bash
pm2 restart zjpb
pm2 status
```

**如果使用 Gunicorn 手动启动：**
```bash
# 先停止旧进程
pkill -f gunicorn

# 启动新进程
gunicorn -w 4 -b 0.0.0.0:5000 app:app --daemon
```

### 步骤 9：验证部署成功

```bash
# 检查应用是否正常运行
curl http://localhost:5000/

# 检查新增的路由
curl http://localhost:5000/register
curl http://localhost:5000/login
```

---

## ✅ 功能测试清单

部署完成后，请按以下步骤测试所有功能：

### 1. 用户注册测试

1. 访问 `https://your-domain.com/register`
2. 输入用户名（至少3个字符）
3. 输入密码（至少6个字符）
4. 确认密码
5. 点击"注册"按钮
6. ✅ 应该自动登录并跳转到首页
7. ✅ 导航栏右上角应显示用户名

### 2. 用户登录测试

1. 点击导航栏的"退出登录"
2. 访问 `https://your-domain.com/login`
3. 输入刚才注册的用户名和密码
4. 点击"登录"按钮
5. ✅ 应该跳转到首页并显示登录状态

### 3. 收藏功能测试

1. 登录后访问任意工具详情页
2. 找到"收藏"按钮（在"访问网站"按钮下方）
3. 点击"收藏"按钮
4. ✅ 按钮应变为金色并显示"已收藏"
5. ✅ 页面顶部应显示"收藏成功"提示
6. 再次点击按钮
7. ✅ 应取消收藏并恢复原状

### 4. 用户中心测试

1. 点击导航栏的用户头像/用户名
2. 选择"个人中心"
3. ✅ 应显示用户信息和统计数据
4. ✅ 收藏数应该正确显示
5. ✅ 最近收藏列表应显示刚才收藏的工具

### 5. 收藏列表测试

1. 在用户中心点击"我的收藏"
2. 或访问 `https://your-domain.com/user/collections`
3. ✅ 应显示所有收藏的工具
4. ✅ 文件夹标签应正常显示
5. ✅ 点击工具卡片应跳转到详情页

### 6. 权限隔离测试 ⚠️

**测试普通用户无法访问管理后台：**

1. 使用普通用户账号登录
2. 尝试访问 `https://your-domain.com/admin/`
3. ✅ 应该被拒绝访问（403错误或跳转）
4. 尝试访问 `https://your-domain.com/admin/seo-tools`
5. ✅ 应该被拒绝访问

**测试管理员登录：**

1. 退出普通用户账号
2. 访问 `https://your-domain.com/admin/login`
3. 使用管理员账号登录
4. ✅ 应该能正常访问管理后台

---

## 🔧 故障排查

### 问题 1：数据库迁移失败

**错误信息：**
```
ERROR: Failed to create tables: (pymysql.err.OperationalError) ...
```

**解决方案：**
```bash
# 1. 检查数据库连接
python -c "from app import create_app; app = create_app(); print('Database URI:', app.config['SQLALCHEMY_DATABASE_URI'])"

# 2. 检查数据库用户权限
mysql -u root -p
GRANT ALL PRIVILEGES ON zjpb.* TO 'your_db_user'@'localhost';
FLUSH PRIVILEGES;

# 3. 重新运行迁移
python create_user_tables.py
```

### 问题 2：应用启动失败

**错误信息：**
```
ImportError: cannot import name 'User' from 'models'
```

**解决方案：**
```bash
# 1. 确认代码已正确拉取
git log -1 --oneline
# 应该显示：2067fb1 feat: v3.0 - 用户系统和收藏功能

# 2. 重新安装依赖
pip install -r requirements.txt --force-reinstall

# 3. 清除 Python 缓存
find . -type d -name __pycache__ -exec rm -r {} +
find . -type f -name "*.pyc" -delete
```

### 问题 3：收藏按钮不显示

**可能原因：**
- 静态文件缓存
- JavaScript 加载失败

**解决方案：**
```bash
# 1. 清除浏览器缓存（Ctrl + Shift + Delete）

# 2. 检查模板文件是否正确更新
grep -n "collectBtn" templates/detail_new.html

# 3. 强制刷新页面（Ctrl + F5）
```

### 问题 4：管理员需要重新登录

**这是正常现象！**

由于 v3.0 修改了 `Admin.get_id()` 的返回格式（从 `id` 改为 `admin:id`），所有管理员需要重新登录一次。

**解决步骤：**
1. 访问 `/admin/login`
2. 使用管理员账号重新登录
3. 之后就可以正常使用了

### 问题 5：普通用户仍能访问管理后台

**这是严重的安全问题！**

**检查步骤：**
```bash
# 1. 确认代码版本
git log -1 --grep="v3.0"

# 2. 检查 app.py 中的权限检查
grep -A 3 "isinstance(current_user, AdminModel)" app.py | head -20

# 3. 重启应用
sudo systemctl restart zjpb
```

---

## 📊 性能优化建议

### 1. 数据库索引验证

```sql
-- 进入数据库
mysql -u root -p zjpb

-- 检查索引
SHOW INDEX FROM users;
SHOW INDEX FROM folders;
SHOW INDEX FROM collections;
```

**应该看到以下索引：**
- users: username, email
- folders: user_id, public_slug
- collections: user_id, site_id, folder_id, (user_id, folder_id)

### 2. 静态文件缓存

如果使用 Nginx，建议添加静态文件缓存：

```nginx
location /static/ {
    expires 30d;
    add_header Cache-Control "public, immutable";
}
```

### 3. 数据库连接池

检查 `app.py` 中的数据库配置：

```python
SQLALCHEMY_POOL_SIZE = 10
SQLALCHEMY_POOL_RECYCLE = 3600
SQLALCHEMY_MAX_OVERFLOW = 20
```

---

## 🔐 安全检查清单

部署后请确认以下安全措施：

- [ ] 普通用户无法访问 `/admin/` 路径
- [ ] 普通用户无法访问管理员 API 端点
- [ ] 管理员无法使用收藏功能（这是设计行为）
- [ ] 密码已正确哈希存储（不是明文）
- [ ] HTTPS 已启用（生产环境必须）
- [ ] 数据库备份已完成

---

## 📝 部署记录模板

建议在部署后记录以下信息：

```
部署日期：2025-02-06
部署版本：v3.0.0
部署人员：[您的名字]
服务器：server.zjpb.net
数据库迁移：✅ 成功
应用重启：✅ 成功
功能测试：✅ 通过
权限测试：✅ 通过

备注：
- 数据库备份文件：zjpb_backup_20250206_HHMMSS.sql
- 管理员已重新登录
- 所有功能测试通过
```

---

## 🎯 后续维护建议

### 1. 监控用户注册

```bash
# 查看用户数量
mysql -u root -p zjpb -e "SELECT COUNT(*) as user_count FROM users;"

# 查看最近注册的用户
mysql -u root -p zjpb -e "SELECT id, username, created_at FROM users ORDER BY created_at DESC LIMIT 10;"
```

### 2. 监控收藏数据

```bash
# 查看收藏总数
mysql -u root -p zjpb -e "SELECT COUNT(*) as collection_count FROM collections;"

# 查看最活跃的用户
mysql -u root -p zjpb -e "SELECT user_id, COUNT(*) as count FROM collections GROUP BY user_id ORDER BY count DESC LIMIT 10;"
```

### 3. 定期备份

建议设置定时任务自动备份：

```bash
# 编辑 crontab
crontab -e

# 添加每天凌晨3点备份
0 3 * * * mysqldump -u root -p'your_password' zjpb > /backup/zjpb_$(date +\%Y\%m\%d).sql
```

### 4. 日志监控

```bash
# 查看应用日志
tail -f /var/log/zjpb/app.log

# 或者如果使用 systemd
journalctl -u zjpb -f
```

---

## 📞 技术支持

如遇到问题，请查看：

1. **用户系统文档**：`USER_SYSTEM_README.md`
2. **版本更新日志**：`CHANGELOG_v3.0.md`
3. **Flask-Login 文档**：https://flask-login.readthedocs.io/
4. **SQLAlchemy 文档**：https://docs.sqlalchemy.org/

---

## ✅ 部署完成确认

当您完成以上所有步骤后，请确认：

- ✅ 代码已成功拉取（commit: 2067fb1）
- ✅ 数据库表已创建（users, folders, collections）
- ✅ 应用已重启并正常运行
- ✅ 用户注册功能正常
- ✅ 用户登录功能正常
- ✅ 收藏功能正常
- ✅ 用户中心正常显示
- ✅ 权限隔离正常（普通用户无法访问管理后台）
- ✅ 管理员已重新登录

**恭喜！v3.0 部署成功！** 🎉

---

**文档版本：** v1.0
**最后更新：** 2025-02-06
**作者：** Claude Sonnet 4.5
