diff --git a/internal/db/models/admin_dao.go b/internal/db/models/admin_dao.go index d7136530..1b6efb41 100644 --- a/internal/db/models/admin_dao.go +++ b/internal/db/models/admin_dao.go @@ -72,7 +72,7 @@ func (this *AdminDAO) ExistEnabledAdmin(adminId int64) (bool, error) { } // 获取管理员名称 -func (this *AdminDAO) FindAdminFullname(adminId int) (string, error) { +func (this *AdminDAO) FindAdminFullname(adminId int64) (string, error) { return this.Query(). Pk(adminId). Result("fullname"). diff --git a/internal/db/models/log_dao.go b/internal/db/models/log_dao.go index 1c0c0e47..801636c8 100644 --- a/internal/db/models/log_dao.go +++ b/internal/db/models/log_dao.go @@ -28,10 +28,28 @@ func init() { } // 创建管理员日志 -func (this *LogDAO) CreateAdminLog(adminId int64, level string, description string, action string, ip string) error { +func (this *LogDAO) CreateLog(adminType string, adminId int64, level string, description string, action string, ip string) error { op := NewLogOperator() + op.Type = adminType op.AdminId, op.Level, op.Description, op.Action, op.Ip = adminId, level, description, action, ip op.Type = LogTypeAdmin _, err := this.Save(op) return err } + +// 计算所有日志数量 +func (this *LogDAO) CountAllLogs() (int64, error) { + return this.Query(). + Count() +} + +// 列出单页日志 +func (this *LogDAO) ListLogs(offset int64, size int64) (result []*Log, err error) { + _, err = this.Query(). + Offset(offset). + Limit(size). + Slice(&result). + DescPk(). + FindAll() + return +} diff --git a/internal/db/models/provider_dao.go b/internal/db/models/provider_dao.go index aac71a5c..a3a14ccc 100644 --- a/internal/db/models/provider_dao.go +++ b/internal/db/models/provider_dao.go @@ -33,7 +33,7 @@ func init() { } // 启用条目 -func (this *ProviderDAO) EnableProvider(id uint32) (rowsAffected int64, err error) { +func (this *ProviderDAO) EnableProvider(id int64) (rowsAffected int64, err error) { return this.Query(). Pk(id). Set("state", ProviderStateEnabled). @@ -41,7 +41,7 @@ func (this *ProviderDAO) EnableProvider(id uint32) (rowsAffected int64, err erro } // 禁用条目 -func (this *ProviderDAO) DisableProvider(id uint32) (rowsAffected int64, err error) { +func (this *ProviderDAO) DisableProvider(id int64) (rowsAffected int64, err error) { return this.Query(). Pk(id). Set("state", ProviderStateDisabled). @@ -49,7 +49,7 @@ func (this *ProviderDAO) DisableProvider(id uint32) (rowsAffected int64, err err } // 查找启用中的条目 -func (this *ProviderDAO) FindEnabledProvider(id uint32) (*Provider, error) { +func (this *ProviderDAO) FindEnabledProvider(id int64) (*Provider, error) { result, err := this.Query(). Pk(id). Attr("state", ProviderStateEnabled). @@ -59,3 +59,11 @@ func (this *ProviderDAO) FindEnabledProvider(id uint32) (*Provider, error) { } return result.(*Provider), err } + +// 查找供应商名称 +func (this *ProviderDAO) FindProviderName(providerId int64) (string, error) { + return this.Query(). + Pk(providerId). + Result("name"). + FindStringCol("") +} diff --git a/internal/db/models/user_dao.go b/internal/db/models/user_dao.go index 85410159..774d1b8b 100644 --- a/internal/db/models/user_dao.go +++ b/internal/db/models/user_dao.go @@ -59,3 +59,11 @@ func (this *UserDAO) FindEnabledUser(id uint32) (*User, error) { } return result.(*User), err } + +// 获取管理员名称 +func (this *UserDAO) FindUserFullname(userId int64) (string, error) { + return this.Query(). + Pk(userId). + Result("fullname"). + FindStringCol("") +} diff --git a/internal/nodes/api_node.go b/internal/nodes/api_node.go index e69a80ce..a0a59b76 100644 --- a/internal/nodes/api_node.go +++ b/internal/nodes/api_node.go @@ -180,6 +180,7 @@ func (this *APINode) listenRPC(listener net.Listener, tlsConfig *tls.Config) err pb.RegisterRegionProvinceServiceServer(rpcServer, &services.RegionProvinceService{}) pb.RegisterIPListServiceServer(rpcServer, &services.IPListService{}) pb.RegisterIPItemServiceServer(rpcServer, &services.IPItemService{}) + pb.RegisterLogServiceServer(rpcServer, &services.LogService{}) err := rpcServer.Serve(listener) if err != nil { return errors.New("[API]start rpc failed: " + err.Error()) diff --git a/internal/rpc/services/service_admin.go b/internal/rpc/services/service_admin.go index 81868ad2..6b3bdc38 100644 --- a/internal/rpc/services/service_admin.go +++ b/internal/rpc/services/service_admin.go @@ -48,19 +48,6 @@ func (this *AdminService) LoginAdmin(ctx context.Context, req *pb.LoginAdminRequ }, nil } -// 创建操作日志 -func (this *AdminService) CreateAdminLog(ctx context.Context, req *pb.CreateAdminLogRequest) (*pb.CreateAdminLogResponse, error) { - _, userId, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) - if err != nil { - return nil, err - } - err = models.SharedLogDAO.CreateAdminLog(userId, req.Level, req.Description, req.Action, req.Ip) - if err != nil { - return nil, err - } - return &pb.CreateAdminLogResponse{}, nil -} - // 检查管理员是否存在 func (this *AdminService) CheckAdminExists(ctx context.Context, req *pb.CheckAdminExistsRequest) (*pb.CheckAdminExistsResponse, error) { _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) @@ -108,7 +95,7 @@ func (this *AdminService) FindAdminFullname(ctx context.Context, req *pb.FindAdm return nil, err } - fullname, err := models.SharedAdminDAO.FindAdminFullname(int(req.AdminId)) + fullname, err := models.SharedAdminDAO.FindAdminFullname(req.AdminId) if err != nil { utils.PrintError(err) return nil, err diff --git a/internal/rpc/services/service_log.go b/internal/rpc/services/service_log.go new file mode 100644 index 00000000..79c98c15 --- /dev/null +++ b/internal/rpc/services/service_log.go @@ -0,0 +1,88 @@ +package services + +import ( + "context" + "github.com/TeaOSLab/EdgeAPI/internal/db/models" + rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +// 管理员、用户或者其他系统用户日志 +type LogService struct { +} + +// 创建日志 +func (this *LogService) CreateLog(ctx context.Context, req *pb.CreateLogRequest) (*pb.CreateLogResponse, error) { + // 校验请求 + userType, userId, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin, rpcutils.UserTypeUser, rpcutils.UserTypeProvider) + if err != nil { + return nil, err + } + + err = models.SharedLogDAO.CreateLog(userType, userId, req.Level, req.Description, req.Action, req.Ip) + if err != nil { + return nil, err + } + return &pb.CreateLogResponse{}, nil +} + +// 计算日志数量 +func (this *LogService) CountLogs(ctx context.Context, req *pb.CountLogRequest) (*pb.CountLogResponse, error) { + // 校验请求 + _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) + if err != nil { + return nil, err + } + + count, err := models.SharedLogDAO.CountAllLogs() + if err != nil { + return nil, err + } + return &pb.CountLogResponse{Count: count}, nil +} + +// 列出单页日志 +func (this *LogService) ListLogs(ctx context.Context, req *pb.ListLogsRequest) (*pb.ListLogsResponse, error) { + // 校验请求 + _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) + if err != nil { + return nil, err + } + + logs, err := models.SharedLogDAO.ListLogs(req.Offset, req.Size) + if err != nil { + return nil, err + } + + result := []*pb.Log{} + for _, log := range logs { + userName := "" + if log.AdminId > 0 { + userName, err = models.SharedAdminDAO.FindAdminFullname(int64(log.AdminId)) + } else if log.UserId > 0 { + userName, err = models.SharedUserDAO.FindUserFullname(int64(log.UserId)) + } else if log.ProviderId > 0 { + userName, err = models.SharedProviderDAO.FindProviderName(int64(log.ProviderId)) + } + + if err != nil { + return nil, err + } + + result = append(result, &pb.Log{ + Id: int64(log.Id), + Level: log.Level, + Action: log.Action, + AdminId: int64(log.AdminId), + UserId: int64(log.UserId), + ProviderId: int64(log.ProviderId), + CreatedAt: int64(log.CreatedAt), + Type: log.Type, + Ip: log.Ip, + UserName: userName, + Description: log.Description, + }) + } + + return &pb.ListLogsResponse{Logs: result}, nil +}