You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

58 lines
1.6 KiB

package migration
import (
"fmt"
"gofaster/internal/auth/model"
"gorm.io/gorm"
)
// AddPermissionCodeField 为权限表添加code字段
func AddPermissionCodeField(db *gorm.DB) error {
fmt.Println("🔧 开始为权限表添加code字段...")
// 检查code字段是否已存在
var count int64
err := db.Raw("SELECT COUNT(*) FROM information_schema.columns WHERE table_name = 'permissions' AND column_name = 'code'").Count(&count).Error
if err != nil {
return fmt.Errorf("检查code字段失败: %v", err)
}
if count > 0 {
fmt.Println("✅ code字段已存在,跳过添加")
return nil
}
// 添加code字段
err = db.Exec("ALTER TABLE permissions ADD COLUMN code VARCHAR(50)").Error
if err != nil {
return fmt.Errorf("添加code字段失败: %v", err)
}
// 为现有权限记录生成code
var permissions []model.Permission
err = db.Find(&permissions).Error
if err != nil {
return fmt.Errorf("查询现有权限失败: %v", err)
}
fmt.Printf("🔧 为 %d 条现有权限记录生成code...\n", len(permissions))
for _, permission := range permissions {
code := fmt.Sprintf("%s:%s", permission.Resource, permission.Action)
err = db.Model(&permission).Update("code", code).Error
if err != nil {
return fmt.Errorf("更新权限 %d 的code失败: %v", permission.ID, err)
}
fmt.Printf("✅ 已为权限 '%s' 生成code: %s\n", permission.Name, code)
}
// 添加唯一索引
err = db.Exec("CREATE UNIQUE INDEX idx_permissions_code ON permissions(code)").Error
if err != nil {
return fmt.Errorf("创建code唯一索引失败: %v", err)
}
fmt.Println("✅ 权限表code字段添加完成")
return nil
}