操作日志
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m10s

This commit is contained in:
2026-04-27 12:16:38 +08:00
parent 95104100c9
commit cb75b5668b
33 changed files with 3860 additions and 112 deletions

View File

@@ -0,0 +1,58 @@
package constants
// 资产审计日志结果状态常量
const (
AssetAuditResultSuccess = "success" // 成功
AssetAuditResultFailed = "failed" // 失败
AssetAuditResultDenied = "denied" // 拒绝
)
// 资产审计日志操作者类型常量
const (
AssetAuditOperatorTypeSystem = "system" // 系统任务
AssetAuditOperatorTypeAdmin = "admin_user" // 平台/超管用户
AssetAuditOperatorTypeAgent = "agent_user" // 代理用户
AssetAuditOperatorTypeEnterprise = "enterprise_user" // 企业用户
AssetAuditOperatorTypePersonal = "personal_customer" // 个人客户
)
// 资产审计日志操作类型常量
const (
AssetAuditOpCardAllocate = "card_allocate" // 单卡分配
AssetAuditOpCardRecall = "card_recall" // 单卡回收
AssetAuditOpCardSeriesBinding = "card_series_binding" // 卡系列绑定
AssetAuditOpCardPollingStatus = "card_polling_status" // 卡轮询状态更新
AssetAuditOpCardRealnamePolicy = "card_realname_policy" // 卡实名策略更新
AssetAuditOpCardRealnameStatus = "card_realname_status" // 卡实名状态更新
AssetAuditOpCardDelete = "card_delete" // 删除卡
AssetAuditOpCardBatchDelete = "card_batch_delete" // 批量删除卡
AssetAuditOpCardManualStop = "card_manual_stop" // 手动停卡
AssetAuditOpCardManualStart = "card_manual_start" // 手动复机
AssetAuditOpCardAutoStop = "card_auto_stop" // 自动停卡
AssetAuditOpCardAutoStart = "card_auto_start" // 自动复机
AssetAuditOpDeviceDelete = "device_delete" // 删除设备
AssetAuditOpDeviceAllocate = "device_allocate" // 设备分配
AssetAuditOpDeviceRecall = "device_recall" // 设备回收
AssetAuditOpDeviceSeriesBinding = "device_series_binding" // 设备系列绑定
AssetAuditOpDeviceBindCard = "device_bind_card" // 设备绑卡
AssetAuditOpDeviceUnbindCard = "device_unbind_card" // 设备解绑卡
AssetAuditOpDeviceStop = "device_stop" // 设备停机
AssetAuditOpDeviceStart = "device_start" // 设备复机
AssetAuditOpDeviceSpeedLimit = "device_speed_limit" // 设备限速
AssetAuditOpDeviceSetWiFi = "device_set_wifi" // 设备 WiFi 设置
AssetAuditOpDeviceSwitchCard = "device_switch_card" // 设备切卡
AssetAuditOpDeviceSwitchMode = "device_switch_mode" // 设备切卡模式
AssetAuditOpDeviceReboot = "device_reboot" // 设备重启
AssetAuditOpDeviceReset = "device_reset" // 设备恢复出厂
AssetAuditOpAssetDeactivate = "asset_deactivate" // 资产停用
AssetAuditOpAssetPollingStatus = "asset_polling_status" // 统一入口轮询状态更新
AssetAuditOpAssetRealnamePolicy = "asset_realname_policy" // 统一入口实名策略更新
AssetAuditOpDeviceImportTaskCreate = "device_import_task_create" // 设备导入任务创建
AssetAuditOpIotCardImportTaskCreate = "iot_card_import_task_create" // 卡导入任务创建
)
// 资产审计日志数据裁剪常量
const (
AssetAuditDataMaxBytes = 16 * 1024 // before/after 数据最大字节数
AssetAuditPreviewMaxBytes = 2048 // 裁剪预览最大字节数
)

View File

@@ -14,6 +14,8 @@ const (
ContextKeyUserInfo = "user_info" // 完整的用户信息
ContextKeyIP = "ip_address" // IP地址
ContextKeyUserAgent = "user_agent" // User-Agent
ContextKeyRequestPath = "request_path" // 请求路径
ContextKeyRequestMethod = "request_method" // 请求方法
ContextKeySubordinateShopIDs = "subordinate_shop_ids" // 下级店铺ID列表代理用户预计算
)

View File

@@ -1,6 +1,7 @@
package logger
import (
"context"
"time"
"github.com/break/junhong_cmp_fiber/pkg/constants"
@@ -35,6 +36,19 @@ func Middleware() fiber.Handler {
startTime := time.Now()
c.Locals(constants.ContextKeyStartTime, startTime)
// 注入请求上下文,供 Service 层审计日志复用
ctx := c.UserContext()
if rid := c.Locals(constants.ContextKeyRequestID); rid != nil {
if requestID, ok := rid.(string); ok && requestID != "" {
ctx = context.WithValue(ctx, constants.ContextKeyRequestID, requestID)
}
}
ctx = context.WithValue(ctx, constants.ContextKeyIP, c.IP())
ctx = context.WithValue(ctx, constants.ContextKeyUserAgent, c.Get("User-Agent"))
ctx = context.WithValue(ctx, constants.ContextKeyRequestPath, c.Path())
ctx = context.WithValue(ctx, constants.ContextKeyRequestMethod, c.Method())
c.SetUserContext(ctx)
// 获取请求 body在 c.Next() 之前读取)
requestBody := truncateBody(c.Body(), MaxBodyLogSize)

View File

@@ -132,6 +132,28 @@ func GetUserAgentFromContext(ctx context.Context) *string {
return nil
}
// GetRequestPathFromContext 从 context 中提取请求路径。
func GetRequestPathFromContext(ctx context.Context) *string {
if ctx == nil {
return nil
}
if requestPath, ok := ctx.Value(constants.ContextKeyRequestPath).(string); ok {
return &requestPath
}
return nil
}
// GetRequestMethodFromContext 从 context 中提取请求方法。
func GetRequestMethodFromContext(ctx context.Context) *string {
if ctx == nil {
return nil
}
if requestMethod, ok := ctx.Value(constants.ContextKeyRequestMethod).(string); ok {
return &requestMethod
}
return nil
}
// SetUserToFiberContext 将用户信息设置到 Fiber context 的 Locals 中
// 同时也设置到标准 context 中,便于 GORM 查询使用
func SetUserToFiberContext(c *fiber.Ctx, info *UserContextInfo) {

View File

@@ -57,7 +57,7 @@ func BuildDocHandlers() *bootstrap.Handlers {
PollingAlert: admin.NewPollingAlertHandler(nil),
PollingCleanup: admin.NewPollingCleanupHandler(nil),
PollingManualTrigger: admin.NewPollingManualTriggerHandler(nil),
Asset: admin.NewAssetHandler(nil, nil, nil, nil, nil),
Asset: admin.NewAssetHandler(nil, nil, nil, nil, nil, nil),
AssetLifecycle: admin.NewAssetLifecycleHandler(nil),
AssetWallet: admin.NewAssetWalletHandler(nil),
WechatConfig: admin.NewWechatConfigHandler(nil),

View File

@@ -19,6 +19,7 @@ type OrderExpirer interface {
// WorkerStores Worker 侧所有 Store 的集合
type WorkerStores struct {
AssetOperationLog *postgres.AssetOperationLogStore
IotCardImportTask *postgres.IotCardImportTaskStore
IotCard *postgres.IotCardStore
DeviceImportTask *postgres.DeviceImportTaskStore