feat(account): 实现平台账号管理功能

- 新增平台账号列表查询接口(自动筛选超级管理员和平台用户)
- 新增密码修改和状态切换专用接口
- 增强角色分配功能,支持空数组清空所有角色
- 新增超级管理员保护机制,禁止分配角色
- 新增完整的集成测试和OpenSpec规范文档
This commit is contained in:
2026-01-14 17:00:30 +08:00
parent 5556b1028c
commit b1195c16df
15 changed files with 1713 additions and 51 deletions

View File

@@ -14,7 +14,7 @@ import (
"github.com/break/junhong_cmp_fiber/internal/model"
)
// SetupTestDB 设置测试数据库和 Redis
// SetupTestDB 设置测试数据库和 Redis(使用事务)
func SetupTestDB(t *testing.T) (*gorm.DB, *redis.Client) {
t.Helper()
@@ -42,11 +42,15 @@ func SetupTestDB(t *testing.T) (*gorm.DB, *redis.Client) {
t.Fatalf("数据库迁移失败: %v", err)
}
// 连接测试 Redis使用远程 Redis
txDB := db.Begin()
if txDB.Error != nil {
t.Fatalf("开启事务失败: %v", txDB.Error)
}
redisClient := redis.NewClient(&redis.Options{
Addr: "cxd.whcxd.cn:16299",
Password: "cpNbWtAaqgo1YJmbMp3h",
DB: 15, // 使用测试数据库
DB: 15,
})
ctx := context.Background()
@@ -54,35 +58,28 @@ func SetupTestDB(t *testing.T) (*gorm.DB, *redis.Client) {
t.Skipf("跳过测试:无法连接 Redis: %v", err)
}
// 清空 Redis 测试数据库
redisClient.FlushDB(ctx)
testPrefix := fmt.Sprintf("test:%s:", t.Name())
keys, _ := redisClient.Keys(ctx, testPrefix+"*").Result()
if len(keys) > 0 {
redisClient.Del(ctx, keys...)
}
return db, redisClient
return txDB, redisClient
}
// TeardownTestDB 清理测试数据库
// TeardownTestDB 清理测试数据库(回滚事务)
func TeardownTestDB(t *testing.T, db *gorm.DB, redisClient *redis.Client) {
t.Helper()
// 清空测试数据
ctx := context.Background()
db.Exec("TRUNCATE TABLE tb_account_role CASCADE")
db.Exec("TRUNCATE TABLE tb_role_permission CASCADE")
db.Exec("TRUNCATE TABLE tb_account CASCADE")
db.Exec("TRUNCATE TABLE tb_role CASCADE")
db.Exec("TRUNCATE TABLE tb_permission CASCADE")
db.Exec("TRUNCATE TABLE tb_shop CASCADE")
db.Exec("TRUNCATE TABLE tb_enterprise CASCADE")
db.Exec("TRUNCATE TABLE tb_personal_customer CASCADE")
// 清空 Redis
redisClient.FlushDB(ctx)
// 关闭连接
sqlDB, _ := db.DB()
if sqlDB != nil {
_ = sqlDB.Close()
testPrefix := fmt.Sprintf("test:%s:", t.Name())
keys, _ := redisClient.Keys(ctx, testPrefix+"*").Result()
if len(keys) > 0 {
redisClient.Del(ctx, keys...)
}
db.Rollback()
_ = redisClient.Close()
}