任务三

This commit is contained in:
Yvan
2026-01-07 19:10:02 +08:00
parent 3c0f3b7165
commit be3b6641a6
50 changed files with 2916 additions and 1167 deletions
+17
View File
@@ -4,7 +4,9 @@ import (
"fmt"
"kra/internal/conf"
datasystem "kra/internal/data/system"
pkgcasbin "kra/pkg/casbin"
"github.com/casbin/casbin/v2"
_ "github.com/go-sql-driver/mysql"
"github.com/google/wire"
"gorm.io/driver/mysql"
@@ -16,8 +18,18 @@ import (
var ProviderSet = wire.NewSet(
NewDB,
NewData,
NewCasbinEnforcer,
datasystem.NewUserRepo,
datasystem.NewApiRepo,
datasystem.NewAuthorityRepo,
datasystem.NewAuthorityBtnRepo,
datasystem.NewCasbinRepo,
datasystem.NewMenuRepo,
datasystem.NewDictionaryRepo,
datasystem.NewDictionaryDetailRepo,
datasystem.NewJwtBlacklistRepo,
datasystem.NewOperationRecordRepo,
datasystem.NewParamsRepo,
)
// Data 数据层包装器
@@ -49,3 +61,8 @@ func NewDB(c *conf.Mysql) (*gorm.DB, error) {
}
return db, nil
}
// NewCasbinEnforcer 创建Casbin Enforcer
func NewCasbinEnforcer(db *gorm.DB) (*casbin.SyncedCachedEnforcer, error) {
return pkgcasbin.InitCasbin(db, "")
}
-74
View File
@@ -1,74 +0,0 @@
package data
import (
"time"
"kra/internal/conf"
"github.com/go-kratos/kratos/v2/log"
"gorm.io/driver/mysql"
"gorm.io/driver/postgres"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
)
// NewGormDB 创建GORM数据库连接
func NewGormDB(c *conf.Data, l log.Logger) (*gorm.DB, func(), error) {
helper := log.NewHelper(l)
var dialector gorm.Dialector
switch c.Database.Driver {
case "mysql":
dialector = mysql.Open(c.Database.Source)
case "postgres":
dialector = postgres.Open(c.Database.Source)
case "sqlite":
dialector = sqlite.Open(c.Database.Source)
default:
dialector = mysql.Open(c.Database.Source)
}
gormConfig := &gorm.Config{
NamingStrategy: schema.NamingStrategy{
TablePrefix: c.Database.TablePrefix,
SingularTable: true,
},
DisableForeignKeyConstraintWhenMigrating: true,
}
// 设置日志级别
if c.Database.LogMode {
gormConfig.Logger = logger.Default.LogMode(logger.Info)
} else {
gormConfig.Logger = logger.Default.LogMode(logger.Silent)
}
db, err := gorm.Open(dialector, gormConfig)
if err != nil {
helper.Errorf("failed to connect database: %v", err)
return nil, nil, err
}
sqlDB, err := db.DB()
if err != nil {
helper.Errorf("failed to get sql.DB: %v", err)
return nil, nil, err
}
// 连接池配置
sqlDB.SetMaxIdleConns(int(c.Database.MaxIdleConns))
sqlDB.SetMaxOpenConns(int(c.Database.MaxOpenConns))
sqlDB.SetConnMaxLifetime(time.Duration(c.Database.MaxLifetime) * time.Second)
cleanup := func() {
helper.Info("closing database connection")
if err := sqlDB.Close(); err != nil {
helper.Errorf("failed to close database: %v", err)
}
}
helper.Info("database connected successfully")
return db, cleanup, nil
}
-47
View File
@@ -1,47 +0,0 @@
package data
import (
"context"
"kra/internal/conf"
"github.com/go-kratos/kratos/v2/log"
"github.com/redis/go-redis/v9"
)
// NewRedisClient 创建Redis客户端
func NewRedisClient(c *conf.Data, l log.Logger) (redis.UniversalClient, func(), error) {
helper := log.NewHelper(l)
var client redis.UniversalClient
if c.Redis.UseCluster {
client = redis.NewClusterClient(&redis.ClusterOptions{
Addrs: c.Redis.ClusterAddrs,
Password: c.Redis.Password,
})
} else {
client = redis.NewClient(&redis.Options{
Addr: c.Redis.Addr,
Password: c.Redis.Password,
DB: int(c.Redis.Db),
})
}
// 测试连接
ctx := context.Background()
if _, err := client.Ping(ctx).Result(); err != nil {
helper.Errorf("failed to connect redis: %v", err)
return nil, nil, err
}
cleanup := func() {
helper.Info("closing redis connection")
if err := client.Close(); err != nil {
helper.Errorf("failed to close redis: %v", err)
}
}
helper.Info("redis connected successfully")
return client, cleanup, nil
}
+139
View File
@@ -0,0 +1,139 @@
package system
import (
"context"
"time"
"kra/internal/biz/system"
"kra/internal/data/model"
"kra/internal/data/query"
"gorm.io/gorm"
)
// ParamsRepo 系统参数仓储实现
type ParamsRepo struct {
data *gorm.DB
}
// NewParamsRepo 创建系统参数仓储
func NewParamsRepo(data *gorm.DB) system.ParamsRepo {
return &ParamsRepo{data: data}
}
// Create 创建参数
func (r *ParamsRepo) Create(ctx context.Context, params *system.Params) error {
m := toParamsModel(params)
return query.Use(r.data).SysParam.WithContext(ctx).Create(m)
}
// Delete 删除参数
func (r *ParamsRepo) Delete(ctx context.Context, id uint) error {
q := query.Use(r.data).SysParam
_, err := q.WithContext(ctx).Where(q.ID.Eq(int64(id))).Delete()
return err
}
// DeleteByIds 批量删除参数
func (r *ParamsRepo) DeleteByIds(ctx context.Context, ids []uint) error {
q := query.Use(r.data).SysParam
int64Ids := make([]int64, len(ids))
for i, id := range ids {
int64Ids[i] = int64(id)
}
_, err := q.WithContext(ctx).Where(q.ID.In(int64Ids...)).Delete()
return err
}
// Update 更新参数
func (r *ParamsRepo) Update(ctx context.Context, params *system.Params) error {
q := query.Use(r.data).SysParam
_, err := q.WithContext(ctx).Where(q.ID.Eq(int64(params.ID))).Updates(toParamsModel(params))
return err
}
// FindByID 根据ID查找参数
func (r *ParamsRepo) FindByID(ctx context.Context, id uint) (*system.Params, error) {
q := query.Use(r.data).SysParam
m, err := q.WithContext(ctx).Where(q.ID.Eq(int64(id))).First()
if err != nil {
return nil, err
}
return toParamsBiz(m), nil
}
// FindByKey 根据Key查找参数
func (r *ParamsRepo) FindByKey(ctx context.Context, key string) (*system.Params, error) {
q := query.Use(r.data).SysParam
m, err := q.WithContext(ctx).Where(q.Key.Eq(key)).First()
if err != nil {
return nil, err
}
return toParamsBiz(m), nil
}
// FindList 查找参数列表
func (r *ParamsRepo) FindList(ctx context.Context, page, pageSize int, filters map[string]interface{}) ([]*system.Params, int64, error) {
q := query.Use(r.data).SysParam
do := q.WithContext(ctx)
// 应用过滤条件
if name, ok := filters["name"].(string); ok && name != "" {
do = do.Where(q.Name.Like("%" + name + "%"))
}
if key, ok := filters["key"].(string); ok && key != "" {
do = do.Where(q.Key.Like("%" + key + "%"))
}
if startTime, ok := filters["start_time"].(*time.Time); ok && startTime != nil {
do = do.Where(q.CreatedAt.Gte(*startTime))
}
if endTime, ok := filters["end_time"].(*time.Time); ok && endTime != nil {
do = do.Where(q.CreatedAt.Lte(*endTime))
}
// 获取总数
total, err := do.Count()
if err != nil {
return nil, 0, err
}
// 分页查询
if pageSize > 0 {
do = do.Limit(pageSize).Offset((page - 1) * pageSize)
}
list, err := do.Find()
if err != nil {
return nil, 0, err
}
result := make([]*system.Params, len(list))
for i, m := range list {
result[i] = toParamsBiz(m)
}
return result, total, nil
}
// toParamsModel 转换为数据模型
func toParamsModel(p *system.Params) *model.SysParam {
return &model.SysParam{
ID: int64(p.ID),
Name: p.Name,
Key: p.Key,
Value: p.Value,
Desc: p.Desc,
}
}
// toParamsBiz 转换为业务实体
func toParamsBiz(m *model.SysParam) *system.Params {
return &system.Params{
ID: uint(m.ID),
CreatedAt: m.CreatedAt,
UpdatedAt: m.UpdatedAt,
Name: m.Name,
Key: m.Key,
Value: m.Value,
Desc: m.Desc,
}
}