feat(auth): 完整认证系统 — 注册/登录/JWT/路由(Task 4 + Task 5)

Task 4 — 认证服务层:
- pkg/utils/password.go: bcrypt 密码加密与校验
- pkg/utils/jwt.go: Access/Refresh Token 生成与解析(jwt/v5@v5.2.1,兼容 Go 1.23)
- app/dto/auth_dto.go: 认证相关请求/响应 DTO(含参数校验 binding tag)
- app/auth/service/auth_service.go: 核心业务逻辑(注册、登录、管理员登录、Token 刷新、个人信息、改密码)
- pkg/middleware/auth.go: JWT 认证中间件 + 角色权限检查中间件

Task 5 — Controller 与路由注册:
- app/auth/controller/auth_controller.go: 前台认证接口(7 个 API)
- app/auth/controller/admin_auth_controller.go: 后台管理认证接口
- app/auth/router.go: auth 模块路由定义(模块自包含)
- router/router.go: 主路由汇总入口(仅做调度,不含具体路由定义)
- cmd/server/main.go: 路由注册迁移到 router.Setup()

已验证全部接口:注册 ✓ 登录 ✓ 获取 profile ✓ 错误密码 ✓ 未认证拒绝 ✓ 非管理员拒绝 ✓

Made-with: Cursor
This commit is contained in:
bujinyuan
2026-02-28 16:42:28 +08:00
parent 4d3d486902
commit d975adaf2a
18 changed files with 1097 additions and 41 deletions

View File

@@ -3,12 +3,13 @@ package model
import "time"
// Role 角色表模型,对应 auth_roles 表
// 系统预置三种角色user普通用户、admin管理员、super_admin超级管理员
type Role struct {
ID int `json:"id" gorm:"primaryKey;autoIncrement"`
Code string `json:"code" gorm:"uniqueIndex;size:50;not null"` // 角色代码: user/admin/super_admin
Name string `json:"name" gorm:"size:50;not null"` // 角色显示名称
Description string `json:"description" gorm:"size:200;default:''"`
CreatedAt time.Time `json:"created_at" gorm:"not null;autoCreateTime"`
ID int `json:"id" gorm:"primaryKey;autoIncrement"` // 角色唯一标识,自增主键
Code string `json:"code" gorm:"uniqueIndex;size:50;not null"` // 角色代码,全局唯一,如 user/admin/super_admin(对应 constants.RoleCode*
Name string `json:"name" gorm:"size:50;not null"` // 角色中文显示名称,如「普通用户」「管理员」
Description string `json:"description" gorm:"size:200;default:''"` // 角色描述说明,用于后台管理界面展示
CreatedAt time.Time `json:"created_at" gorm:"not null;autoCreateTime"` // 创建时间,由 GORM 自动填充
}
// TableName 指定数据库表名
@@ -17,10 +18,11 @@ func (Role) TableName() string {
}
// UserRole 用户角色关联表模型,对应 auth_user_roles 表
// 采用联合主键user_id + role_id一个用户可拥有多个角色
type UserRole struct {
UserID int64 `json:"user_id" gorm:"primaryKey"`
RoleID int `json:"role_id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at" gorm:"not null;autoCreateTime"`
UserID int64 `json:"user_id" gorm:"primaryKey"` // 关联的用户 ID外键指向 auth_users.id
RoleID int `json:"role_id" gorm:"primaryKey"` // 关联的角色 ID外键指向 auth_roles.id
CreatedAt time.Time `json:"created_at" gorm:"not null;autoCreateTime"` // 角色分配时间,由 GORM 自动填充
}
// TableName 指定数据库表名

View File

@@ -5,19 +5,19 @@ import "time"
// User 用户主表模型,对应 auth_users 表
type User struct {
ID int64 `json:"id" gorm:"primaryKey;autoIncrement"`
Username string `json:"username" gorm:"uniqueIndex;size:50;not null"`
Email string `json:"email" gorm:"uniqueIndex;size:100;not null"`
PasswordHash string `json:"-" gorm:"column:password_hash;size:255;not null"` // JSON 序列化时隐藏密码
Nickname string `json:"nickname" gorm:"size:50;not null;default:''"`
Avatar string `json:"avatar" gorm:"size:500;not null;default:''"`
Gender int `json:"gender" gorm:"not null;default:0"` // 0=未知, 1=男, 2=女
Phone *string `json:"phone" gorm:"size:20"` // 可选字段
Status int `json:"status" gorm:"not null;default:1"` // 1=正常, 2=禁用, 3=注销
LastLoginAt *time.Time `json:"last_login_at"`
LastLoginIP *string `json:"last_login_ip" gorm:"column:last_login_ip;size:50"`
CreatedAt time.Time `json:"created_at" gorm:"not null;autoCreateTime"`
UpdatedAt time.Time `json:"updated_at" gorm:"not null;autoUpdateTime"`
ID int64 `json:"id" gorm:"primaryKey;autoIncrement"` // 用户唯一标识,自增主键
Username string `json:"username" gorm:"uniqueIndex;size:50;not null"` // 登录用户名,全局唯一
Email string `json:"email" gorm:"uniqueIndex;size:100;not null"` // 邮箱地址,全局唯一,用于登录和找回密码
PasswordHash string `json:"-" gorm:"column:password_hash;size:255;not null"` // bcrypt 加密后的密码哈希,JSON 序列化时隐藏
Nickname string `json:"nickname" gorm:"size:50;not null;default:''"` // 用户昵称,用于页面展示,允许重复
Avatar string `json:"avatar" gorm:"size:500;not null;default:''"` // 头像 URL 地址,为空则使用默认头像
Gender int `json:"gender" gorm:"not null;default:0"` // 性别:0=未知, 1=男, 2=女(对应 constants.Gender*
Phone *string `json:"phone" gorm:"size:20"` // 手机号,可选字段,指针类型允许 NULL
Status int `json:"status" gorm:"not null;default:1"` // 账号状态:1=正常, 2=禁用, 3=注销(对应 constants.UserStatus*
LastLoginAt *time.Time `json:"last_login_at"` // 最后登录时间,首次注册时为 NULL
LastLoginIP *string `json:"last_login_ip" gorm:"column:last_login_ip;size:50"` // 最后登录 IP 地址,用于安全审计
CreatedAt time.Time `json:"created_at" gorm:"not null;autoCreateTime"` // 账号创建时间,由 GORM 自动填充
UpdatedAt time.Time `json:"updated_at" gorm:"not null;autoUpdateTime"` // 最后更新时间,由 GORM 自动更新
}
// TableName 指定数据库表名