WuYongJie 5821d73291 初始提交:3D家具安装展示系统
包含:
- furniture-3d-system:Next.js 16 全栈应用(资产中心、产品管理、3D装配动画)
- autocad-plugin:AutoCAD 家具导出插件源码
- 资产中心改造:编辑弹窗化、删除功能、Toast反馈、自定义Select组件

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 14:00:19 +08:00

7.6 KiB
Raw Blame History

Phase 2 完成报告 - 认证系统实现

✅ 完成时间

2025-12-12

📊 完成情况

已完成任务

  • 系统初始化
  • 注册功能
  • 登录功能
  • 首次登录强制修改
  • 密码管理工具
  • JWT Token 工具
  • 认证中间件

🔧 实现的功能

1. 系统初始化

文件:src/lib/init.ts

功能:

  • 检查数据库连接
  • 创建默认超级管理员
  • 数据完整性检查
  • 获取系统状态

默认超级管理员:

邮箱: admin@system.local
姓名: SuperAdmin
密码: Admin@123456
角色: SUPER_ADMIN
首次登录: true

初始化脚本:scripts/init-system.ts

npx tsx scripts/init-system.ts

2. 密码管理工具

文件:src/lib/password.ts

功能:

  • 密码强度验证
  • 密码加密(bcrypt)
  • 密码验证
  • 随机密码生成

密码强度要求:

  • 最小长度:8 位
  • 最大长度:50 位
  • 必须包含大写字母
  • 必须包含小写字母
  • 必须包含数字
  • 必须包含特殊字符

3. JWT Token 工具

文件:src/lib/jwt.ts

功能:

  • 生成 JWT Token
  • 验证 Token
  • 解析 Token
  • 从请求头提取 Token
  • 检查 Token 是否过期

Token Payload:

{
  userId: string;
  email: string;
  name: string;
  role: Role;
  status: UserStatus;
  isFirstLogin: boolean;
  departmentId?: string;
  teamId?: string;
}

配置:

  • 密钥:JWT_SECRET 环境变量
  • 过期时间:JWT_EXPIRES_IN 环境变量(默认 7 天)

4. 认证中间件

文件:src/lib/auth-middleware.ts

功能:

  • 验证请求的认证信息
  • 检查用户角色权限
  • 提供便捷的权限检查函数
  • API 路由保护包装器

权限检查函数:

  • hasRole() - 检查是否有指定角色
  • isAdmin() - 检查是否为管理员
  • isDepartmentManagerOrAbove() - 检查是否为部门管理员或更高
  • isTeamLeaderOrAbove() - 检查是否为组长或更高

使用示例:

export const GET = withAuth(
  async (request, payload) => {
    // 处理逻辑
  },
  { allowedRoles: ['SUPER_ADMIN', 'ADMIN'] }
);

5. 注册 API

接口:POST /api/auth/register

请求体:

{
  "email": "user@example.com",
  "name": "张三",
  "password": "Password@123",
  "role": "DESIGNER",
  "departmentId": "xxx",
  "teamId": "xxx"
}

功能:

  • 邮箱格式验证
  • 姓名格式验证(2-20个字符,支持中文、英文、数字、下划线)
  • 密码强度验证
  • 邮箱唯一性检查
  • 姓名唯一性检查
  • 部门和小组验证
  • 创建用户
  • 记录操作日志

响应:

{
  "message": "注册成功",
  "user": {
    "id": "xxx",
    "email": "user@example.com",
    "name": "张三",
    "role": "DESIGNER",
    "status": "ACTIVE",
    "createdAt": "2025-12-12T..."
  }
}

6. 登录 API

接口:POST /api/auth/login

请求体:

{
  "identifier": "user@example.com",  // 邮箱或姓名
  "password": "Password@123"
}

功能:

  • 支持邮箱或姓名登录
  • 智能提示(邮箱/姓名格式识别)
  • 密码验证
  • 用户状态检查(在职/离职/暂停)
  • 生成 JWT Token
  • 更新最后登录时间
  • 记录登录日志

智能提示示例:

  • 输入邮箱但找不到 → "该邮箱未注册,如果您想使用姓名登录,请直接输入姓名"
  • 输入姓名但找不到 → "该姓名未注册,如果您想使用邮箱登录,请输入完整邮箱地址"
  • 密码错误 → "密码错误,您正在使用邮箱登录,如果忘记密码,请联系管理员重置"

响应:

{
  "message": "登录成功",
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "user": {
    "id": "xxx",
    "email": "user@example.com",
    "name": "张三",
    "role": "DESIGNER",
    "status": "ACTIVE",
    "isFirstLogin": false,
    "department": { "id": "xxx", "name": "设计部" },
    "team": { "id": "xxx", "name": "建模组" },
    "avatar": null,
    "lastLoginAt": "2025-12-12T..."
  }
}

7. 首次登录强制修改 API

接口:POST /api/auth/first-login-update

请求头:

Authorization: Bearer <token>

请求体:

{
  "email": "new@example.com",
  "name": "新姓名",
  "password": "NewPassword@123"
}

功能:

  • 验证 Token
  • 检查是否为首次登录
  • 邮箱格式验证
  • 姓名格式验证
  • 密码强度验证
  • 邮箱唯一性检查(排除自己)
  • 姓名唯一性检查(排除自己)
  • 更新用户信息
  • 生成新的 Token
  • 记录操作日志

响应:

{
  "message": "信息修改成功",
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "user": {
    "id": "xxx",
    "email": "new@example.com",
    "name": "新姓名",
    "role": "SUPER_ADMIN",
    "status": "ACTIVE",
    "isFirstLogin": false
  }
}

8. 登录页面

路由:/login

功能:

  • Apple HIG 2025 风格设计
  • 支持邮箱或姓名登录
  • 实时错误提示
  • 智能建议显示
  • 加载状态
  • 自动跳转(首次登录 → /first-login,否则 → /)

设计特点:

  • 毛玻璃背景
  • 渐变装饰元素
  • 大圆角卡片(20px)
  • 流畅的过渡动画
  • 清晰的错误提示

9. 首次登录修改页面

路由:/first-login

功能:

  • Apple HIG 2025 风格设计
  • 强制修改邮箱、姓名和密码
  • 实时密码强度验证
  • 密码确认验证
  • 安全警告提示
  • 修改成功后自动跳转

密码强度提示:

  • 实时显示密码强度要求
  • 绿色勾号表示符合要求
  • 红色叉号表示不符合要求
  • 禁用提交按钮直到密码符合要求

📝 环境变量

需要在 .env 文件中添加:

# JWT 配置
JWT_SECRET=your-secret-key-change-in-production
JWT_EXPIRES_IN=7d

🧪 测试

1. 系统初始化测试

npx tsx scripts/init-system.ts

预期结果:

  • ✅ 数据库连接成功
  • ✅ 创建默认超级管理员
  • ✅ 显示默认账号信息

2. 登录测试

测试用例 1:使用邮箱登录

邮箱: admin@system.local
密码: Admin@123456

测试用例 2:使用姓名登录

姓名: SuperAdmin
密码: Admin@123456

预期结果:

  • ✅ 登录成功
  • ✅ 返回 Token
  • ✅ 跳转到首次登录修改页面

3. 首次登录修改测试

测试数据:

新邮箱: admin@company.com
新姓名: 管理员
新密码: NewAdmin@123456

预期结果:

  • ✅ 修改成功
  • ✅ 返回新的 Token
  • ✅ 跳转到首页

📊 操作日志

所有认证相关操作都会记录到 ActivityLog 表:

  • USER_REGISTER - 用户注册
  • USER_LOGIN - 用户登录
  • USER_LOGIN_FAILED - 登录失败
  • USER_FIRST_LOGIN_UPDATE - 首次登录修改信息

🔒 安全特性

1. 密码安全

  • bcrypt 加密(10 轮)
  • 强密码策略
  • 密码不会在响应中返回

2. Token 安全

  • JWT 签名验证
  • Token 过期时间控制
  • 首次登录后 Token 失效

3. 输入验证

  • 邮箱格式验证
  • 姓名格式验证
  • 密码强度验证
  • SQL 注入防护(Prisma ORM)

4. 操作日志

  • 记录所有关键操作
  • 包含操作者、时间、详情
  • 支持审计追踪

🎯 下一步

Phase 3: 权限系统实现

  1. 权限检查函数
  2. 权限中间件
  3. 前端权限控制
  4. 用户管理界面

预计时间:1-2 周


📚 相关文档


Phase 2 完成!准备开始 Phase 3! 🚀