任务三
This commit is contained in:
@@ -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, "")
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user