package model import ( "log" "gorm.io/gorm" "gorm.io/gorm/logger" ) // AutoMigrate 自动迁移所有表 func AutoMigrate(db *gorm.DB) error { return db.AutoMigrate( &Role{}, &Permission{}, &User{}, &APIKey{}, &Project{}, &File{}, &TempLink{}, &TrafficLog{}, &Webhook{}, &SystemSetting{}, &OperationLog{}, &SystemLog{}, ) } var defaultRoles = []Role{ {Name: "超级管理员", Code: "super_admin", Description: "系统超级管理员,拥有所有权限", IsSystem: true}, {Name: "管理员", Code: "admin", Description: "系统管理员,可管理用户和内容", IsSystem: true}, {Name: "普通用户", Code: "user", Description: "普通用户,管理自己的项目和文件", IsSystem: true}, } var defaultPermissions = []Permission{ // 用户管理 {Name: "查看用户列表", Code: "user:list", Module: "user", Description: "查看所有用户列表"}, {Name: "查看用户详情", Code: "user:detail", Module: "user", Description: "查看用户详细信息"}, {Name: "创建用户", Code: "user:create", Module: "user", Description: "创建新用户"}, {Name: "编辑用户", Code: "user:edit", Module: "user", Description: "编辑用户信息"}, {Name: "删除用户", Code: "user:delete", Module: "user", Description: "删除用户"}, {Name: "禁用用户", Code: "user:disable", Module: "user", Description: "禁用/启用用户"}, {Name: "分配角色", Code: "user:assign_role", Module: "user", Description: "修改用户角色"}, {Name: "重置密码", Code: "user:reset_password", Module: "user", Description: "重置用户密码"}, // 项目管理 {Name: "查看项目列表", Code: "project:list", Module: "project", Description: "查看项目列表"}, {Name: "创建项目", Code: "project:create", Module: "project", Description: "创建新项目"}, {Name: "编辑项目", Code: "project:edit", Module: "project", Description: "编辑项目信息"}, {Name: "删除项目", Code: "project:delete", Module: "project", Description: "删除项目"}, // 文件管理 {Name: "上传文件", Code: "file:upload", Module: "file", Description: "上传文件"}, {Name: "下载文件", Code: "file:download", Module: "file", Description: "下载文件"}, {Name: "删除文件", Code: "file:delete", Module: "file", Description: "删除文件"}, {Name: "查看文件列表", Code: "file:list", Module: "file", Description: "查看文件列表"}, // 系统管理 {Name: "查看系统设置", Code: "system:settings:view", Module: "system", Description: "查看系统设置"}, {Name: "修改系统设置", Code: "system:settings:edit", Module: "system", Description: "修改系统设置"}, {Name: "查看操作日志", Code: "system:logs:operation", Module: "system", Description: "查看操作日志"}, {Name: "查看系统日志", Code: "system:logs:system", Module: "system", Description: "查看系统日志"}, {Name: "清理日志", Code: "system:logs:cleanup", Module: "system", Description: "清理历史日志"}, } // admin角色不拥有的权限 var adminExcluded = map[string]bool{ "user:delete": true, "user:assign_role": true, "system:settings:edit": true, } // 普通用户拥有的权限 var userPerms = map[string]bool{ "project:list": true, "project:create": true, "project:edit": true, "project:delete": true, "file:upload": true, "file:download": true, "file:delete": true, "file:list": true, } var defaultSettings = []SystemSetting{ {Key: "site_name", Value: "云泽文件存储云平台", Description: "站点名称", GroupName: "site"}, {Key: "site_description", Value: "高效、安全的文件存储服务", Description: "站点描述", GroupName: "site"}, {Key: "site_logo", Value: "/assets/logo.png", Description: "站点Logo路径", GroupName: "site"}, {Key: "site_icp", Value: "", Description: "ICP备案号", GroupName: "site"}, {Key: "site_copyright", Value: "© 2024 FileStorageSystem", Description: "版权信息", GroupName: "site"}, {Key: "register_enabled", Value: "true", Description: "是否开放注册", GroupName: "feature"}, {Key: "site_enabled", Value: "true", Description: "站点是否启用", GroupName: "feature"}, {Key: "site_maintenance_msg", Value: "系统维护中,请稍后再访问", Description: "维护提示信息", GroupName: "feature"}, {Key: "default_storage_limit", Value: "10737418240", Description: "默认用户存储配额(字节)", GroupName: "storage"}, {Key: "default_project_limit", Value: "5368709120", Description: "默认项目存储配额(字节)", GroupName: "storage"}, {Key: "max_file_size", Value: "104857600", Description: "单文件最大限制(字节)", GroupName: "storage"}, {Key: "allowed_file_types", Value: "*", Description: "允许的文件类型(*表示所有)", GroupName: "storage"}, {Key: "api_rate_limit", Value: "100", Description: "API请求频率限制(次/分钟)", GroupName: "api"}, {Key: "temp_link_max_age", Value: "3600", Description: "临时链接默认有效期(秒)", GroupName: "api"}, {Key: "webhook_enabled", Value: "true", Description: "是否启用Webhook回调", GroupName: "api"}, } // SeedData 初始化种子数据(幂等) func SeedData(db *gorm.DB) error { db.Logger = db.Logger.LogMode(logger.Warn) // 1. 角色 for i := range defaultRoles { var r Role if err := db.Where("code = ?", defaultRoles[i].Code).First(&r).Error; err != nil { if err := db.Create(&defaultRoles[i]).Error; err != nil { return err } } } // 2. 权限 for i := range defaultPermissions { var p Permission if err := db.Where("code = ?", defaultPermissions[i].Code).First(&p).Error; err != nil { if err := db.Create(&defaultPermissions[i]).Error; err != nil { return err } } } // 3. 角色权限关联 var perms []Permission if err := db.Find(&perms).Error; err != nil { return err } rolePerms := map[string]func(code string) bool{ "super_admin": func(string) bool { return true }, "admin": func(code string) bool { return !adminExcluded[code] }, "user": func(code string) bool { return userPerms[code] }, } for roleCode, match := range rolePerms { var role Role if err := db.Where("code = ?", roleCode).First(&role).Error; err != nil { continue } for _, p := range perms { if !match(p.Code) { continue } var count int64 db.Table("role_permissions"). Where("role_id = ? AND permission_id = ?", role.ID, p.ID). Count(&count) if count == 0 { if err := db.Exec("INSERT INTO role_permissions (role_id, permission_id) VALUES (?, ?)", role.ID, p.ID).Error; err != nil { log.Printf("插入角色权限失败: %v", err) } } } } // 4. 系统设置 for i := range defaultSettings { var s SystemSetting if err := db.Where("`key` = ?", defaultSettings[i].Key).First(&s).Error; err != nil { if err := db.Create(&defaultSettings[i]).Error; err != nil { return err } } } return nil }