基础架构

This commit is contained in:
liangzai
2025-07-13 16:36:20 +08:00
parent e3d64e7485
commit 807004f78d
128 changed files with 17232 additions and 11396 deletions

View File

@@ -0,0 +1,225 @@
package repositories
import (
"context"
"time"
"go.uber.org/zap"
"gorm.io/gorm"
"tyapi-server/internal/domains/admin/entities"
"tyapi-server/internal/domains/admin/repositories"
"tyapi-server/internal/domains/admin/repositories/queries"
"tyapi-server/internal/shared/interfaces"
)
// GormAdminLoginLogRepository 管理员登录日志GORM仓储实现
type GormAdminLoginLogRepository struct {
db *gorm.DB
logger *zap.Logger
}
// 编译时检查接口实现
var _ repositories.AdminLoginLogRepository = (*GormAdminLoginLogRepository)(nil)
// NewGormAdminLoginLogRepository 创建管理员登录日志GORM仓储
func NewGormAdminLoginLogRepository(db *gorm.DB, logger *zap.Logger) repositories.AdminLoginLogRepository {
return &GormAdminLoginLogRepository{
db: db,
logger: logger,
}
}
// ================ 基础CRUD操作 ================
// Create 创建登录日志
func (r *GormAdminLoginLogRepository) Create(ctx context.Context, log entities.AdminLoginLog) (entities.AdminLoginLog, error) {
r.logger.Info("创建管理员登录日志", zap.String("admin_id", log.AdminID))
err := r.db.WithContext(ctx).Create(&log).Error
return log, err
}
// GetByID 根据ID获取登录日志
func (r *GormAdminLoginLogRepository) GetByID(ctx context.Context, id string) (entities.AdminLoginLog, error) {
var log entities.AdminLoginLog
err := r.db.WithContext(ctx).Where("id = ?", id).First(&log).Error
return log, err
}
// Update 更新登录日志
func (r *GormAdminLoginLogRepository) Update(ctx context.Context, log entities.AdminLoginLog) error {
r.logger.Info("更新管理员登录日志", zap.String("id", log.ID))
return r.db.WithContext(ctx).Save(&log).Error
}
// Delete 删除登录日志
func (r *GormAdminLoginLogRepository) Delete(ctx context.Context, id string) error {
r.logger.Info("删除管理员登录日志", zap.String("id", id))
return r.db.WithContext(ctx).Delete(&entities.AdminLoginLog{}, "id = ?", id).Error
}
// SoftDelete 软删除登录日志
func (r *GormAdminLoginLogRepository) SoftDelete(ctx context.Context, id string) error {
r.logger.Info("软删除管理员登录日志", zap.String("id", id))
return r.db.WithContext(ctx).Delete(&entities.AdminLoginLog{}, "id = ?", id).Error
}
// Restore 恢复登录日志
func (r *GormAdminLoginLogRepository) Restore(ctx context.Context, id string) error {
r.logger.Info("恢复管理员登录日志", zap.String("id", id))
return r.db.WithContext(ctx).Unscoped().Model(&entities.AdminLoginLog{}).Where("id = ?", id).Update("deleted_at", nil).Error
}
// Count 统计登录日志数量
func (r *GormAdminLoginLogRepository) Count(ctx context.Context, options interfaces.CountOptions) (int64, error) {
var count int64
query := r.db.WithContext(ctx).Model(&entities.AdminLoginLog{})
if options.Filters != nil {
for key, value := range options.Filters {
query = query.Where(key+" = ?", value)
}
}
if options.Search != "" {
query = query.Where("admin_id LIKE ? OR ip_address LIKE ?", "%"+options.Search+"%", "%"+options.Search+"%")
}
return count, query.Count(&count).Error
}
// Exists 检查登录日志是否存在
func (r *GormAdminLoginLogRepository) Exists(ctx context.Context, id string) (bool, error) {
var count int64
err := r.db.WithContext(ctx).Model(&entities.AdminLoginLog{}).Where("id = ?", id).Count(&count).Error
return count > 0, err
}
// CreateBatch 批量创建登录日志
func (r *GormAdminLoginLogRepository) CreateBatch(ctx context.Context, logs []entities.AdminLoginLog) error {
r.logger.Info("批量创建管理员登录日志", zap.Int("count", len(logs)))
return r.db.WithContext(ctx).Create(&logs).Error
}
// GetByIDs 根据ID列表获取登录日志
func (r *GormAdminLoginLogRepository) GetByIDs(ctx context.Context, ids []string) ([]entities.AdminLoginLog, error) {
var logs []entities.AdminLoginLog
err := r.db.WithContext(ctx).Where("id IN ?", ids).Find(&logs).Error
return logs, err
}
// UpdateBatch 批量更新登录日志
func (r *GormAdminLoginLogRepository) UpdateBatch(ctx context.Context, logs []entities.AdminLoginLog) error {
r.logger.Info("批量更新管理员登录日志", zap.Int("count", len(logs)))
return r.db.WithContext(ctx).Save(&logs).Error
}
// DeleteBatch 批量删除登录日志
func (r *GormAdminLoginLogRepository) DeleteBatch(ctx context.Context, ids []string) error {
r.logger.Info("批量删除管理员登录日志", zap.Strings("ids", ids))
return r.db.WithContext(ctx).Delete(&entities.AdminLoginLog{}, "id IN ?", ids).Error
}
// List 获取登录日志列表
func (r *GormAdminLoginLogRepository) List(ctx context.Context, options interfaces.ListOptions) ([]entities.AdminLoginLog, error) {
var logs []entities.AdminLoginLog
query := r.db.WithContext(ctx).Model(&entities.AdminLoginLog{})
if options.Filters != nil {
for key, value := range options.Filters {
query = query.Where(key+" = ?", value)
}
}
if options.Search != "" {
query = query.Where("admin_id LIKE ? OR ip_address LIKE ?", "%"+options.Search+"%", "%"+options.Search+"%")
}
if options.Sort != "" {
order := "ASC"
if options.Order != "" {
order = options.Order
}
query = query.Order(options.Sort + " " + order)
}
if options.Page > 0 && options.PageSize > 0 {
offset := (options.Page - 1) * options.PageSize
query = query.Offset(offset).Limit(options.PageSize)
}
return logs, query.Find(&logs).Error
}
// WithTx 使用事务
func (r *GormAdminLoginLogRepository) WithTx(tx interface{}) interfaces.Repository[entities.AdminLoginLog] {
if gormTx, ok := tx.(*gorm.DB); ok {
return &GormAdminLoginLogRepository{
db: gormTx,
logger: r.logger,
}
}
return r
}
// ================ 业务方法 ================
// ListLogs 获取登录日志列表(带分页和筛选)
func (r *GormAdminLoginLogRepository) ListLogs(ctx context.Context, query *queries.ListAdminLoginLogQuery) ([]*entities.AdminLoginLog, int64, error) {
var logs []entities.AdminLoginLog
var total int64
dbQuery := r.db.WithContext(ctx).Model(&entities.AdminLoginLog{})
// 应用筛选条件
if query.AdminID != "" {
dbQuery = dbQuery.Where("admin_id = ?", query.AdminID)
}
if query.StartDate != "" {
dbQuery = dbQuery.Where("created_at >= ?", query.StartDate)
}
if query.EndDate != "" {
dbQuery = dbQuery.Where("created_at <= ?", query.EndDate)
}
// 统计总数
if err := dbQuery.Count(&total).Error; err != nil {
return nil, 0, err
}
// 应用分页
offset := (query.Page - 1) * query.PageSize
dbQuery = dbQuery.Offset(offset).Limit(query.PageSize)
// 默认排序
dbQuery = dbQuery.Order("created_at DESC")
// 查询数据
if err := dbQuery.Find(&logs).Error; err != nil {
return nil, 0, err
}
// 转换为指针切片
logPtrs := make([]*entities.AdminLoginLog, len(logs))
for i := range logs {
logPtrs[i] = &logs[i]
}
return logPtrs, total, nil
}
// GetTodayLoginCount 获取今日登录次数
func (r *GormAdminLoginLogRepository) GetTodayLoginCount(ctx context.Context) (int64, error) {
var count int64
today := time.Now().Truncate(24 * time.Hour)
err := r.db.WithContext(ctx).Model(&entities.AdminLoginLog{}).Where("created_at >= ?", today).Count(&count).Error
return count, err
}
// GetLoginCountByAdmin 获取指定管理员在指定天数内的登录次数
func (r *GormAdminLoginLogRepository) GetLoginCountByAdmin(ctx context.Context, adminID string, days int) (int64, error) {
var count int64
startDate := time.Now().AddDate(0, 0, -days)
err := r.db.WithContext(ctx).Model(&entities.AdminLoginLog{}).Where("admin_id = ? AND created_at >= ?", adminID, startDate).Count(&count).Error
return count, err
}

View File

@@ -0,0 +1,236 @@
package repositories
import (
"context"
"time"
"go.uber.org/zap"
"gorm.io/gorm"
"tyapi-server/internal/domains/admin/entities"
"tyapi-server/internal/domains/admin/repositories"
"tyapi-server/internal/domains/admin/repositories/queries"
"tyapi-server/internal/shared/interfaces"
)
// GormAdminOperationLogRepository 管理员操作日志GORM仓储实现
type GormAdminOperationLogRepository struct {
db *gorm.DB
logger *zap.Logger
}
// 编译时检查接口实现
var _ repositories.AdminOperationLogRepository = (*GormAdminOperationLogRepository)(nil)
// NewGormAdminOperationLogRepository 创建管理员操作日志GORM仓储
func NewGormAdminOperationLogRepository(db *gorm.DB, logger *zap.Logger) repositories.AdminOperationLogRepository {
return &GormAdminOperationLogRepository{
db: db,
logger: logger,
}
}
// ================ 基础CRUD操作 ================
// Create 创建操作日志
func (r *GormAdminOperationLogRepository) Create(ctx context.Context, log entities.AdminOperationLog) (entities.AdminOperationLog, error) {
r.logger.Info("创建管理员操作日志", zap.String("admin_id", log.AdminID), zap.String("action", log.Action))
err := r.db.WithContext(ctx).Create(&log).Error
return log, err
}
// GetByID 根据ID获取操作日志
func (r *GormAdminOperationLogRepository) GetByID(ctx context.Context, id string) (entities.AdminOperationLog, error) {
var log entities.AdminOperationLog
err := r.db.WithContext(ctx).Where("id = ?", id).First(&log).Error
return log, err
}
// Update 更新操作日志
func (r *GormAdminOperationLogRepository) Update(ctx context.Context, log entities.AdminOperationLog) error {
r.logger.Info("更新管理员操作日志", zap.String("id", log.ID))
return r.db.WithContext(ctx).Save(&log).Error
}
// Delete 删除操作日志
func (r *GormAdminOperationLogRepository) Delete(ctx context.Context, id string) error {
r.logger.Info("删除管理员操作日志", zap.String("id", id))
return r.db.WithContext(ctx).Delete(&entities.AdminOperationLog{}, "id = ?", id).Error
}
// SoftDelete 软删除操作日志
func (r *GormAdminOperationLogRepository) SoftDelete(ctx context.Context, id string) error {
r.logger.Info("软删除管理员操作日志", zap.String("id", id))
return r.db.WithContext(ctx).Delete(&entities.AdminOperationLog{}, "id = ?", id).Error
}
// Restore 恢复操作日志
func (r *GormAdminOperationLogRepository) Restore(ctx context.Context, id string) error {
r.logger.Info("恢复管理员操作日志", zap.String("id", id))
return r.db.WithContext(ctx).Unscoped().Model(&entities.AdminOperationLog{}).Where("id = ?", id).Update("deleted_at", nil).Error
}
// Count 统计操作日志数量
func (r *GormAdminOperationLogRepository) Count(ctx context.Context, options interfaces.CountOptions) (int64, error) {
var count int64
query := r.db.WithContext(ctx).Model(&entities.AdminOperationLog{})
if options.Filters != nil {
for key, value := range options.Filters {
query = query.Where(key+" = ?", value)
}
}
if options.Search != "" {
query = query.Where("admin_id LIKE ? OR action LIKE ? OR module LIKE ?", "%"+options.Search+"%", "%"+options.Search+"%", "%"+options.Search+"%")
}
return count, query.Count(&count).Error
}
// Exists 检查操作日志是否存在
func (r *GormAdminOperationLogRepository) Exists(ctx context.Context, id string) (bool, error) {
var count int64
err := r.db.WithContext(ctx).Model(&entities.AdminOperationLog{}).Where("id = ?", id).Count(&count).Error
return count > 0, err
}
// CreateBatch 批量创建操作日志
func (r *GormAdminOperationLogRepository) CreateBatch(ctx context.Context, logs []entities.AdminOperationLog) error {
r.logger.Info("批量创建管理员操作日志", zap.Int("count", len(logs)))
return r.db.WithContext(ctx).Create(&logs).Error
}
// GetByIDs 根据ID列表获取操作日志
func (r *GormAdminOperationLogRepository) GetByIDs(ctx context.Context, ids []string) ([]entities.AdminOperationLog, error) {
var logs []entities.AdminOperationLog
err := r.db.WithContext(ctx).Where("id IN ?", ids).Find(&logs).Error
return logs, err
}
// UpdateBatch 批量更新操作日志
func (r *GormAdminOperationLogRepository) UpdateBatch(ctx context.Context, logs []entities.AdminOperationLog) error {
r.logger.Info("批量更新管理员操作日志", zap.Int("count", len(logs)))
return r.db.WithContext(ctx).Save(&logs).Error
}
// DeleteBatch 批量删除操作日志
func (r *GormAdminOperationLogRepository) DeleteBatch(ctx context.Context, ids []string) error {
r.logger.Info("批量删除管理员操作日志", zap.Strings("ids", ids))
return r.db.WithContext(ctx).Delete(&entities.AdminOperationLog{}, "id IN ?", ids).Error
}
// List 获取操作日志列表
func (r *GormAdminOperationLogRepository) List(ctx context.Context, options interfaces.ListOptions) ([]entities.AdminOperationLog, error) {
var logs []entities.AdminOperationLog
query := r.db.WithContext(ctx).Model(&entities.AdminOperationLog{})
if options.Filters != nil {
for key, value := range options.Filters {
query = query.Where(key+" = ?", value)
}
}
if options.Search != "" {
query = query.Where("admin_id LIKE ? OR action LIKE ? OR module LIKE ?", "%"+options.Search+"%", "%"+options.Search+"%", "%"+options.Search+"%")
}
if options.Sort != "" {
order := "ASC"
if options.Order != "" {
order = options.Order
}
query = query.Order(options.Sort + " " + order)
}
if options.Page > 0 && options.PageSize > 0 {
offset := (options.Page - 1) * options.PageSize
query = query.Offset(offset).Limit(options.PageSize)
}
return logs, query.Find(&logs).Error
}
// WithTx 使用事务
func (r *GormAdminOperationLogRepository) WithTx(tx interface{}) interfaces.Repository[entities.AdminOperationLog] {
if gormTx, ok := tx.(*gorm.DB); ok {
return &GormAdminOperationLogRepository{
db: gormTx,
logger: r.logger,
}
}
return r
}
// ================ 业务方法 ================
// ListLogs 获取操作日志列表(带分页和筛选)
func (r *GormAdminOperationLogRepository) ListLogs(ctx context.Context, query *queries.ListAdminOperationLogQuery) ([]*entities.AdminOperationLog, int64, error) {
var logs []entities.AdminOperationLog
var total int64
dbQuery := r.db.WithContext(ctx).Model(&entities.AdminOperationLog{})
// 应用筛选条件
if query.AdminID != "" {
dbQuery = dbQuery.Where("admin_id = ?", query.AdminID)
}
if query.Module != "" {
dbQuery = dbQuery.Where("module = ?", query.Module)
}
if query.Action != "" {
dbQuery = dbQuery.Where("action = ?", query.Action)
}
if query.StartDate != "" {
dbQuery = dbQuery.Where("created_at >= ?", query.StartDate)
}
if query.EndDate != "" {
dbQuery = dbQuery.Where("created_at <= ?", query.EndDate)
}
// 统计总数
if err := dbQuery.Count(&total).Error; err != nil {
return nil, 0, err
}
// 应用分页
offset := (query.Page - 1) * query.PageSize
dbQuery = dbQuery.Offset(offset).Limit(query.PageSize)
// 默认排序
dbQuery = dbQuery.Order("created_at DESC")
// 查询数据
if err := dbQuery.Find(&logs).Error; err != nil {
return nil, 0, err
}
// 转换为指针切片
logPtrs := make([]*entities.AdminOperationLog, len(logs))
for i := range logs {
logPtrs[i] = &logs[i]
}
return logPtrs, total, nil
}
// GetTotalOperations 获取总操作数
func (r *GormAdminOperationLogRepository) GetTotalOperations(ctx context.Context) (int64, error) {
var count int64
err := r.db.WithContext(ctx).Model(&entities.AdminOperationLog{}).Count(&count).Error
return count, err
}
// GetOperationsByAdmin 获取指定管理员在指定天数内的操作数
func (r *GormAdminOperationLogRepository) GetOperationsByAdmin(ctx context.Context, adminID string, days int) (int64, error) {
var count int64
startDate := time.Now().AddDate(0, 0, -days)
err := r.db.WithContext(ctx).Model(&entities.AdminOperationLog{}).Where("admin_id = ? AND created_at >= ?", adminID, startDate).Count(&count).Error
return count, err
}
// BatchCreate 批量创建操作日志
func (r *GormAdminOperationLogRepository) BatchCreate(ctx context.Context, logs []entities.AdminOperationLog) error {
r.logger.Info("批量创建管理员操作日志", zap.Int("count", len(logs)))
return r.db.WithContext(ctx).Create(&logs).Error
}

View File

@@ -0,0 +1,222 @@
package repositories
import (
"context"
"go.uber.org/zap"
"gorm.io/gorm"
"tyapi-server/internal/domains/admin/entities"
"tyapi-server/internal/domains/admin/repositories"
"tyapi-server/internal/shared/interfaces"
)
// GormAdminPermissionRepository 管理员权限GORM仓储实现
type GormAdminPermissionRepository struct {
db *gorm.DB
logger *zap.Logger
}
// 编译时检查接口实现
var _ repositories.AdminPermissionRepository = (*GormAdminPermissionRepository)(nil)
// NewGormAdminPermissionRepository 创建管理员权限GORM仓储
func NewGormAdminPermissionRepository(db *gorm.DB, logger *zap.Logger) repositories.AdminPermissionRepository {
return &GormAdminPermissionRepository{
db: db,
logger: logger,
}
}
// ================ 基础CRUD操作 ================
// Create 创建权限
func (r *GormAdminPermissionRepository) Create(ctx context.Context, permission entities.AdminPermission) (entities.AdminPermission, error) {
r.logger.Info("创建管理员权限", zap.String("code", permission.Code))
err := r.db.WithContext(ctx).Create(&permission).Error
return permission, err
}
// GetByID 根据ID获取权限
func (r *GormAdminPermissionRepository) GetByID(ctx context.Context, id string) (entities.AdminPermission, error) {
var permission entities.AdminPermission
err := r.db.WithContext(ctx).Where("id = ?", id).First(&permission).Error
return permission, err
}
// Update 更新权限
func (r *GormAdminPermissionRepository) Update(ctx context.Context, permission entities.AdminPermission) error {
r.logger.Info("更新管理员权限", zap.String("id", permission.ID))
return r.db.WithContext(ctx).Save(&permission).Error
}
// Delete 删除权限
func (r *GormAdminPermissionRepository) Delete(ctx context.Context, id string) error {
r.logger.Info("删除管理员权限", zap.String("id", id))
return r.db.WithContext(ctx).Delete(&entities.AdminPermission{}, "id = ?", id).Error
}
// SoftDelete 软删除权限
func (r *GormAdminPermissionRepository) SoftDelete(ctx context.Context, id string) error {
r.logger.Info("软删除管理员权限", zap.String("id", id))
return r.db.WithContext(ctx).Delete(&entities.AdminPermission{}, "id = ?", id).Error
}
// Restore 恢复权限
func (r *GormAdminPermissionRepository) Restore(ctx context.Context, id string) error {
r.logger.Info("恢复管理员权限", zap.String("id", id))
return r.db.WithContext(ctx).Unscoped().Model(&entities.AdminPermission{}).Where("id = ?", id).Update("deleted_at", nil).Error
}
// Count 统计权限数量
func (r *GormAdminPermissionRepository) Count(ctx context.Context, options interfaces.CountOptions) (int64, error) {
var count int64
query := r.db.WithContext(ctx).Model(&entities.AdminPermission{})
if options.Filters != nil {
for key, value := range options.Filters {
query = query.Where(key+" = ?", value)
}
}
if options.Search != "" {
query = query.Where("code LIKE ? OR name LIKE ? OR module LIKE ?", "%"+options.Search+"%", "%"+options.Search+"%", "%"+options.Search+"%")
}
return count, query.Count(&count).Error
}
// Exists 检查权限是否存在
func (r *GormAdminPermissionRepository) Exists(ctx context.Context, id string) (bool, error) {
var count int64
err := r.db.WithContext(ctx).Model(&entities.AdminPermission{}).Where("id = ?", id).Count(&count).Error
return count > 0, err
}
// CreateBatch 批量创建权限
func (r *GormAdminPermissionRepository) CreateBatch(ctx context.Context, permissions []entities.AdminPermission) error {
r.logger.Info("批量创建管理员权限", zap.Int("count", len(permissions)))
return r.db.WithContext(ctx).Create(&permissions).Error
}
// GetByIDs 根据ID列表获取权限
func (r *GormAdminPermissionRepository) GetByIDs(ctx context.Context, ids []string) ([]entities.AdminPermission, error) {
var permissions []entities.AdminPermission
err := r.db.WithContext(ctx).Where("id IN ?", ids).Find(&permissions).Error
return permissions, err
}
// UpdateBatch 批量更新权限
func (r *GormAdminPermissionRepository) UpdateBatch(ctx context.Context, permissions []entities.AdminPermission) error {
r.logger.Info("批量更新管理员权限", zap.Int("count", len(permissions)))
return r.db.WithContext(ctx).Save(&permissions).Error
}
// DeleteBatch 批量删除权限
func (r *GormAdminPermissionRepository) DeleteBatch(ctx context.Context, ids []string) error {
r.logger.Info("批量删除管理员权限", zap.Strings("ids", ids))
return r.db.WithContext(ctx).Delete(&entities.AdminPermission{}, "id IN ?", ids).Error
}
// List 获取权限列表
func (r *GormAdminPermissionRepository) List(ctx context.Context, options interfaces.ListOptions) ([]entities.AdminPermission, error) {
var permissions []entities.AdminPermission
query := r.db.WithContext(ctx).Model(&entities.AdminPermission{})
if options.Filters != nil {
for key, value := range options.Filters {
query = query.Where(key+" = ?", value)
}
}
if options.Search != "" {
query = query.Where("code LIKE ? OR name LIKE ? OR module LIKE ?", "%"+options.Search+"%", "%"+options.Search+"%", "%"+options.Search+"%")
}
if options.Sort != "" {
order := "ASC"
if options.Order != "" {
order = options.Order
}
query = query.Order(options.Sort + " " + order)
}
if options.Page > 0 && options.PageSize > 0 {
offset := (options.Page - 1) * options.PageSize
query = query.Offset(offset).Limit(options.PageSize)
}
return permissions, query.Find(&permissions).Error
}
// WithTx 使用事务
func (r *GormAdminPermissionRepository) WithTx(tx interface{}) interfaces.Repository[entities.AdminPermission] {
if gormTx, ok := tx.(*gorm.DB); ok {
return &GormAdminPermissionRepository{
db: gormTx,
logger: r.logger,
}
}
return r
}
// ================ 业务方法 ================
// FindByCode 根据权限代码查找权限
func (r *GormAdminPermissionRepository) FindByCode(ctx context.Context, code string) (*entities.AdminPermission, error) {
var permission entities.AdminPermission
err := r.db.WithContext(ctx).Where("code = ?", code).First(&permission).Error
if err != nil {
return nil, err
}
return &permission, nil
}
// FindByModule 根据模块查找权限
func (r *GormAdminPermissionRepository) FindByModule(ctx context.Context, module string) ([]entities.AdminPermission, error) {
var permissions []entities.AdminPermission
err := r.db.WithContext(ctx).Where("module = ?", module).Find(&permissions).Error
return permissions, err
}
// ListActive 获取所有激活的权限
func (r *GormAdminPermissionRepository) ListActive(ctx context.Context) ([]entities.AdminPermission, error) {
var permissions []entities.AdminPermission
err := r.db.WithContext(ctx).Where("is_active = ?", true).Find(&permissions).Error
return permissions, err
}
// GetPermissionsByRole 根据角色获取权限
func (r *GormAdminPermissionRepository) GetPermissionsByRole(ctx context.Context, role entities.AdminRole) ([]entities.AdminPermission, error) {
var permissions []entities.AdminPermission
query := r.db.WithContext(ctx).
Joins("JOIN admin_role_permissions ON admin_permissions.id = admin_role_permissions.permission_id").
Where("admin_role_permissions.role = ? AND admin_permissions.is_active = ?", role, true)
return permissions, query.Find(&permissions).Error
}
// AssignPermissionsToRole 为角色分配权限
func (r *GormAdminPermissionRepository) AssignPermissionsToRole(ctx context.Context, role entities.AdminRole, permissionIDs []string) error {
// 先删除现有权限
if err := r.db.WithContext(ctx).Where("role = ?", role).Delete(&entities.AdminRolePermission{}).Error; err != nil {
return err
}
// 批量插入新权限
var rolePermissions []entities.AdminRolePermission
for _, permissionID := range permissionIDs {
rolePermissions = append(rolePermissions, entities.AdminRolePermission{
Role: role,
PermissionID: permissionID,
})
}
return r.db.WithContext(ctx).Create(&rolePermissions).Error
}
// RemovePermissionsFromRole 从角色移除权限
func (r *GormAdminPermissionRepository) RemovePermissionsFromRole(ctx context.Context, role entities.AdminRole, permissionIDs []string) error {
return r.db.WithContext(ctx).Where("role = ? AND permission_id IN ?", role, permissionIDs).Delete(&entities.AdminRolePermission{}).Error
}

View File

@@ -0,0 +1,319 @@
package repositories
import (
"context"
"encoding/json"
"fmt"
"time"
"go.uber.org/zap"
"gorm.io/gorm"
"tyapi-server/internal/domains/admin/entities"
"tyapi-server/internal/domains/admin/repositories"
"tyapi-server/internal/domains/admin/repositories/queries"
"tyapi-server/internal/shared/interfaces"
)
// GormAdminRepository 管理员GORM仓储实现
type GormAdminRepository struct {
db *gorm.DB
logger *zap.Logger
}
// 编译时检查接口实现
var _ repositories.AdminRepository = (*GormAdminRepository)(nil)
// NewGormAdminRepository 创建管理员GORM仓储
func NewGormAdminRepository(db *gorm.DB, logger *zap.Logger) *GormAdminRepository {
return &GormAdminRepository{
db: db,
logger: logger,
}
}
// Create 创建管理员
func (r *GormAdminRepository) Create(ctx context.Context, admin entities.Admin) (entities.Admin, error) {
r.logger.Info("创建管理员", zap.String("username", admin.Username))
err := r.db.WithContext(ctx).Create(&admin).Error
return admin, err
}
// GetByID 根据ID获取管理员
func (r *GormAdminRepository) GetByID(ctx context.Context, id string) (entities.Admin, error) {
var admin entities.Admin
err := r.db.WithContext(ctx).Where("id = ?", id).First(&admin).Error
return admin, err
}
// Update 更新管理员
func (r *GormAdminRepository) Update(ctx context.Context, admin entities.Admin) error {
r.logger.Info("更新管理员", zap.String("id", admin.ID))
return r.db.WithContext(ctx).Save(&admin).Error
}
// Delete 删除管理员
func (r *GormAdminRepository) Delete(ctx context.Context, id string) error {
r.logger.Info("删除管理员", zap.String("id", id))
return r.db.WithContext(ctx).Delete(&entities.Admin{}, "id = ?", id).Error
}
// SoftDelete 软删除管理员
func (r *GormAdminRepository) SoftDelete(ctx context.Context, id string) error {
r.logger.Info("软删除管理员", zap.String("id", id))
return r.db.WithContext(ctx).Delete(&entities.Admin{}, "id = ?", id).Error
}
// Restore 恢复管理员
func (r *GormAdminRepository) Restore(ctx context.Context, id string) error {
r.logger.Info("恢复管理员", zap.String("id", id))
return r.db.WithContext(ctx).Unscoped().Model(&entities.Admin{}).Where("id = ?", id).Update("deleted_at", nil).Error
}
// Count 统计管理员数量
func (r *GormAdminRepository) Count(ctx context.Context, options interfaces.CountOptions) (int64, error) {
var count int64
query := r.db.WithContext(ctx).Model(&entities.Admin{})
// 应用过滤条件
if options.Filters != nil {
for key, value := range options.Filters {
query = query.Where(key+" = ?", value)
}
}
// 应用搜索条件
if options.Search != "" {
query = query.Where("username LIKE ? OR email LIKE ? OR real_name LIKE ?",
"%"+options.Search+"%", "%"+options.Search+"%", "%"+options.Search+"%")
}
return count, query.Count(&count).Error
}
// Exists 检查管理员是否存在
func (r *GormAdminRepository) Exists(ctx context.Context, id string) (bool, error) {
var count int64
err := r.db.WithContext(ctx).Model(&entities.Admin{}).Where("id = ?", id).Count(&count).Error
return count > 0, err
}
// CreateBatch 批量创建管理员
func (r *GormAdminRepository) CreateBatch(ctx context.Context, admins []entities.Admin) error {
r.logger.Info("批量创建管理员", zap.Int("count", len(admins)))
return r.db.WithContext(ctx).Create(&admins).Error
}
// GetByIDs 根据ID列表获取管理员
func (r *GormAdminRepository) GetByIDs(ctx context.Context, ids []string) ([]entities.Admin, error) {
var admins []entities.Admin
err := r.db.WithContext(ctx).Where("id IN ?", ids).Find(&admins).Error
return admins, err
}
// UpdateBatch 批量更新管理员
func (r *GormAdminRepository) UpdateBatch(ctx context.Context, admins []entities.Admin) error {
r.logger.Info("批量更新管理员", zap.Int("count", len(admins)))
return r.db.WithContext(ctx).Save(&admins).Error
}
// DeleteBatch 批量删除管理员
func (r *GormAdminRepository) DeleteBatch(ctx context.Context, ids []string) error {
r.logger.Info("批量删除管理员", zap.Strings("ids", ids))
return r.db.WithContext(ctx).Delete(&entities.Admin{}, "id IN ?", ids).Error
}
// List 获取管理员列表
func (r *GormAdminRepository) List(ctx context.Context, options interfaces.ListOptions) ([]entities.Admin, error) {
var admins []entities.Admin
query := r.db.WithContext(ctx).Model(&entities.Admin{})
// 应用过滤条件
if options.Filters != nil {
for key, value := range options.Filters {
query = query.Where(key+" = ?", value)
}
}
// 应用搜索条件
if options.Search != "" {
query = query.Where("username LIKE ? OR email LIKE ? OR real_name LIKE ?",
"%"+options.Search+"%", "%"+options.Search+"%", "%"+options.Search+"%")
}
// 应用排序
if options.Sort != "" {
order := "ASC"
if options.Order != "" {
order = options.Order
}
query = query.Order(options.Sort + " " + order)
}
// 应用分页
if options.Page > 0 && options.PageSize > 0 {
offset := (options.Page - 1) * options.PageSize
query = query.Offset(offset).Limit(options.PageSize)
}
return admins, query.Find(&admins).Error
}
// WithTx 使用事务
func (r *GormAdminRepository) WithTx(tx interface{}) interfaces.Repository[entities.Admin] {
if gormTx, ok := tx.(*gorm.DB); ok {
return &GormAdminRepository{
db: gormTx,
logger: r.logger,
}
}
return r
}
// FindByUsername 根据用户名查找管理员
func (r *GormAdminRepository) FindByUsername(ctx context.Context, username string) (*entities.Admin, error) {
var admin entities.Admin
err := r.db.WithContext(ctx).Where("username = ?", username).First(&admin).Error
if err != nil {
return nil, err
}
return &admin, nil
}
// FindByEmail 根据邮箱查找管理员
func (r *GormAdminRepository) FindByEmail(ctx context.Context, email string) (*entities.Admin, error) {
var admin entities.Admin
err := r.db.WithContext(ctx).Where("email = ?", email).First(&admin).Error
if err != nil {
return nil, err
}
return &admin, nil
}
// ListAdmins 获取管理员列表(带分页和筛选)
func (r *GormAdminRepository) ListAdmins(ctx context.Context, query *queries.ListAdminsQuery) ([]*entities.Admin, int64, error) {
var admins []entities.Admin
var total int64
dbQuery := r.db.WithContext(ctx).Model(&entities.Admin{})
// 应用筛选条件
if query.Username != "" {
dbQuery = dbQuery.Where("username LIKE ?", "%"+query.Username+"%")
}
if query.Email != "" {
dbQuery = dbQuery.Where("email LIKE ?", "%"+query.Email+"%")
}
if query.Role != "" {
dbQuery = dbQuery.Where("role = ?", query.Role)
}
if query.IsActive != nil {
dbQuery = dbQuery.Where("is_active = ?", *query.IsActive)
}
// 统计总数
if err := dbQuery.Count(&total).Error; err != nil {
return nil, 0, err
}
// 应用分页
offset := (query.Page - 1) * query.PageSize
dbQuery = dbQuery.Offset(offset).Limit(query.PageSize)
// 默认排序
dbQuery = dbQuery.Order("created_at DESC")
// 查询数据
if err := dbQuery.Find(&admins).Error; err != nil {
return nil, 0, err
}
// 转换为指针切片
adminPtrs := make([]*entities.Admin, len(admins))
for i := range admins {
adminPtrs[i] = &admins[i]
}
return adminPtrs, total, nil
}
// GetStats 获取管理员统计信息
func (r *GormAdminRepository) GetStats(ctx context.Context, query *queries.GetAdminInfoQuery) (*repositories.AdminStats, error) {
var stats repositories.AdminStats
// 总管理员数
if err := r.db.WithContext(ctx).Model(&entities.Admin{}).Count(&stats.TotalAdmins).Error; err != nil {
return nil, err
}
// 激活管理员数
if err := r.db.WithContext(ctx).Model(&entities.Admin{}).Where("is_active = ?", true).Count(&stats.ActiveAdmins).Error; err != nil {
return nil, err
}
// 今日登录数
today := time.Now().Truncate(24 * time.Hour)
if err := r.db.WithContext(ctx).Model(&entities.AdminLoginLog{}).Where("created_at >= ?", today).Count(&stats.TodayLogins).Error; err != nil {
return nil, err
}
// 总操作数
if err := r.db.WithContext(ctx).Model(&entities.AdminOperationLog{}).Count(&stats.TotalOperations).Error; err != nil {
return nil, err
}
return &stats, nil
}
// GetPermissionsByRole 根据角色获取权限
func (r *GormAdminRepository) GetPermissionsByRole(ctx context.Context, role entities.AdminRole) ([]entities.AdminPermission, error) {
var permissions []entities.AdminPermission
query := r.db.WithContext(ctx).
Joins("JOIN admin_role_permissions ON admin_permissions.id = admin_role_permissions.permission_id").
Where("admin_role_permissions.role = ? AND admin_permissions.is_active = ?", role, true)
return permissions, query.Find(&permissions).Error
}
// UpdatePermissions 更新管理员权限
func (r *GormAdminRepository) UpdatePermissions(ctx context.Context, adminID string, permissions []string) error {
permissionsJSON, err := json.Marshal(permissions)
if err != nil {
return fmt.Errorf("序列化权限失败: %w", err)
}
return r.db.WithContext(ctx).
Model(&entities.Admin{}).
Where("id = ?", adminID).
Update("permissions", string(permissionsJSON)).Error
}
// UpdateLoginStats 更新登录统计
func (r *GormAdminRepository) UpdateLoginStats(ctx context.Context, adminID string) error {
return r.db.WithContext(ctx).
Model(&entities.Admin{}).
Where("id = ?", adminID).
Updates(map[string]interface{}{
"last_login_at": time.Now(),
"login_count": gorm.Expr("login_count + 1"),
}).Error
}
// UpdateReviewStats 更新审核统计
func (r *GormAdminRepository) UpdateReviewStats(ctx context.Context, adminID string, approved bool) error {
updates := map[string]interface{}{
"review_count": gorm.Expr("review_count + 1"),
}
if approved {
updates["approved_count"] = gorm.Expr("approved_count + 1")
} else {
updates["rejected_count"] = gorm.Expr("rejected_count + 1")
}
return r.db.WithContext(ctx).
Model(&entities.Admin{}).
Where("id = ?", adminID).
Updates(updates).Error
}