优化日志模块,添加操作日志白名单;修改获取操作日志列表接口

This commit is contained in:
chenlin 2023-12-05 17:21:11 +08:00
parent 36d955cfad
commit 64af9e9df3
13 changed files with 184 additions and 62 deletions

View File

@ -21,5 +21,5 @@ dev-windows:
dev:
GOOS=linux GOARCH=amd64 go build -o dev-go-admin main.go
GOOS=linux GOARCH=amd64 go build -o dev_mh_goadmin_server main.go

View File

@ -11,7 +11,8 @@ import (
"go-admin/tools/app"
)
// @Summary 登录日志列表
// GetOperLogList
// @Summary 操作日志列表update
// @Description 获取JSON
// @Tags system/日志
// @Param status query string false "status"
@ -19,6 +20,8 @@ import (
// @Param dictType query string false "dictType"
// @Param pageSize query int false "页条数"
// @Param pageIndex query int false "页码"
// @Param startTime query string false "开时时间"
// @Param endTime query string false "结束时间"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/operloglist [get]
// @Security Bearer
@ -41,7 +44,9 @@ func GetOperLogList(c *gin.Context) {
data.OperName = c.Request.FormValue("operName")
data.Status = c.Request.FormValue("status")
data.OperIp = c.Request.FormValue("operIp")
result, count, err := data.GetPage(pageSize, pageIndex)
startTime := c.Request.FormValue("startTime")
endTime := c.Request.FormValue("endTime")
result, count, err := data.GetPage(pageSize, pageIndex, startTime, endTime)
tools.HasError(err, "", -1)
var mp = make(map[string]interface{}, 3)

View File

@ -79,6 +79,9 @@ func StoreAdd(c *gin.Context) {
return
}
store.IsOnline = 1
if store.MemberService != 2 { // 会员服务1 开启 2 不开启
store.MemberService = 1 // 默认开启会员;没开启的门店默认在小程序端不展示,需前端判断
}
err := store.Add()
if err != nil {
logger.Errorf("err:", err)

View File

@ -1,8 +1,12 @@
package middleware
import (
"bytes"
"fmt"
"go-admin/common/global"
"go-admin/logger"
config2 "go-admin/tools/config"
"io"
"strings"
"time"
@ -10,65 +14,96 @@ import (
"go-admin/app/admin/models"
"go-admin/tools"
config2 "go-admin/tools/config"
)
// 日志记录到文件
// LoggerToFile 日志记录到文件
func LoggerToFile() gin.HandlerFunc {
return func(c *gin.Context) {
// 开始时间
startTime := time.Now()
// 处理请求
RequestInLog(c)
defer RequestOutLog(c)
c.Next()
// 结束时间
endTime := time.Now()
// 执行时间
latencyTime := endTime.Sub(startTime)
// 请求方式
reqMethod := c.Request.Method
// 请求路由
reqUri := c.Request.RequestURI
// 状态码
statusCode := c.Writer.Status()
// 请求IP
clientIP := c.ClientIP()
// 日志格式
fmt.Printf("%s [INFO] %s %s %3d %13v %15s \r\n",
startTime.Format("2006-01-02 15:04:05"),
reqMethod,
reqUri,
statusCode,
latencyTime,
clientIP,
)
logger.Info(
"log request",
logger.Field("status", statusCode),
logger.Field("spend_time", latencyTime),
logger.Field("client_id", clientIP),
logger.Field("method", reqMethod),
logger.Field("uri", reqUri),
)
if c.Request.Method != "GET" && c.Request.Method != "OPTIONS" && config2.LoggerConfig.EnabledDB {
SetDBOperLog(c, clientIP, statusCode, reqUri, reqMethod, latencyTime)
}
}
}
// 写入操作日志表
// 该方法后续即将弃用
func SetDBOperLog(c *gin.Context, clientIP string, statusCode int, reqUri string, reqMethod string, latencyTime time.Duration) {
// RequestInLog 请求进入日志
func RequestInLog(c *gin.Context) {
// 开始时间
startTime := time.Now()
c.Set("startExecTime", startTime)
// 请求参数
bodyBytes, _ := io.ReadAll(c.Request.Body)
c.Request.Body = io.NopCloser(bytes.NewBuffer(bodyBytes))
c.Set("req", string(bodyBytes))
}
// RequestOutLog 请求输出日志
func RequestOutLog(c *gin.Context) {
// 请求方式
reqMethod := c.Request.Method
// 请求路由
reqUri := c.Request.RequestURI
// 请求IP
clientIP := c.ClientIP()
// 请求参数
req, _ := c.Get("req")
fmt.Println(req)
// 状态码
statusCode := c.Writer.Status()
// 返回参数
response, _ := c.Get("response")
fmt.Println(response)
// 结束时间
endTime := time.Now()
// 执行时间
st, _ := c.Get("startExecTime")
startTime, _ := st.(time.Time)
latencyTime := endTime.Sub(startTime)
/// 日志格式
fmt.Printf("%s [INFO] %s %s %3d %13v %15s \r\n",
startTime.Format("2006-01-02 15:04:05"),
reqMethod,
reqUri,
statusCode,
latencyTime,
clientIP,
)
logger.Info(
"log request",
logger.Field("status", statusCode),
logger.Field("spendTime", latencyTime),
logger.Field("clientId", clientIP),
logger.Field("method", reqMethod),
logger.Field("uri", reqUri),
logger.Field("reqBody", req),
logger.Field("response", response),
logger.Field("requestId", tools.GenerateMsgIDFromContext(c)),
)
//只有在白名单中的url才记录操作日志
resultUrl := strings.Replace(c.Request.RequestURI, "/api/v1", "", 1)
_, ok := global.WHILTE[resultUrl]
if c.Request.Method != "GET" && c.Request.Method != "OPTIONS" && config2.LoggerConfig.EnabledDB && ok {
SetDBOperLog(c, clientIP, statusCode, reqUri, reqMethod, latencyTime, req.(string), response.(string))
}
}
// SetDBOperLog 写入操作日志表
func SetDBOperLog(c *gin.Context, clientIP string, statusCode int, reqUri string, reqMethod string,
latencyTime time.Duration, req string, resp string) {
menu := models.Menu{}
menu.Path = reqUri
menu.Action = reqMethod
@ -113,5 +148,9 @@ func SetDBOperLog(c *gin.Context, clientIP string, statusCode int, reqUri string
} else {
sysOperLog.Status = "1"
}
sysOperLog.OperParam = req
sysOperLog.JsonResult = resp
_, _ = sysOperLog.Create()
}

View File

@ -1181,7 +1181,7 @@ func (m *ErpStockCommodityListReq) GetDetailList() (*ErpStockCommodityListResp,
var count int64
if err := qs.Count(&count).Error; err != nil {
//logger.Error("count err:", err)
logger.Error("count err:", logger.Field("err", err))
return resp, err
}
@ -1253,7 +1253,7 @@ func (m *ErpStockCommodityListReq) buildQueryConditions(qs *gorm.DB) {
}
if m.SupplierId != 0 { //供应商id
qs = qs.Where("supplier_id=?", m.SupplierId)
qs = qs.Where("erp_supplier_id=?", m.SupplierId)
}
if m.State != 0 { //库存状态

View File

@ -6,7 +6,7 @@ import (
orm "go-admin/common/global"
)
//sys_operlog
// sys_operlog
type SysOperLog struct {
OperId int `json:"operId" gorm:"primary_key;AUTO_INCREMENT"` //日志编码
Title string `json:"title" gorm:"size:255;"` //操作模块
@ -55,7 +55,7 @@ func (e *SysOperLog) Get() (SysOperLog, error) {
return doc, nil
}
func (e *SysOperLog) GetPage(pageSize int, pageIndex int) ([]SysOperLog, int, error) {
func (e *SysOperLog) GetPage(pageSize int, pageIndex int, startTime string, endTime string) ([]SysOperLog, int, error) {
var doc []SysOperLog
table := orm.Eloquent.Table(e.TableName())
@ -71,6 +71,12 @@ func (e *SysOperLog) GetPage(pageSize int, pageIndex int) ([]SysOperLog, int, er
if e.BusinessType != "" {
table = table.Where("business_type = ?", e.BusinessType)
}
if startTime != "" {
table = table.Where("oper_time > ?", startTime)
}
if endTime != "" {
table = table.Where("oper_time < ?", endTime)
}
var count int64

View File

@ -220,6 +220,11 @@ func (m *Store) getModifyPara() map[string]interface{} {
if m.Latitude != 0 {
paraMap["latitude"] = m.Latitude
}
if m.MemberService != 0 {
paraMap["member_service"] = m.MemberService
}
paraMap["sales_comm_rate"] = m.SalesCommRate
return paraMap
}

22
common/global/constant.go Normal file
View File

@ -0,0 +1,22 @@
package global
var WHILTE = map[string]int{
"/supplier/create": 1, //供应商
"/supplier/update": 2,
"/supplier/delete": 3,
"/category/create": 4, //商品分类
"/category/update": 5,
"/category/delete": 6,
"/category/import_category": 7,
"/commodity/create": 8, //商品资料
"/commodity/edit": 9,
"/commodity/delete": 10,
"/commodity/import_commodity": 11,
"/cashier/create": 12, //收付款设置
"/cashier/edit": 13,
"/cashier/delete": 14,
"/inventory/delivery": 15, //库存管理
"/inventory/print": 16,
"/inventory/import": 17,
"/inventory/add_remark": 18,
}

View File

@ -27,7 +27,7 @@ settings:
# 请求日志开关
enabledreq: false
# 数据库日志开关 dev模式将自动开启
enableddb: false
enableddb: true
# 自动任务日志开关 dev模式将自动开启
enabledjob: false
jwt:

View File

@ -2223,7 +2223,7 @@ const docTemplate = `{
"tags": [
"system/日志"
],
"summary": "登录日志列表",
"summary": "操作日志列表update",
"parameters": [
{
"type": "string",
@ -2254,6 +2254,18 @@ const docTemplate = `{
"description": "页码",
"name": "pageIndex",
"in": "query"
},
{
"type": "string",
"description": "开时时间",
"name": "startTime",
"in": "query"
},
{
"type": "string",
"description": "结束时间",
"name": "endTime",
"in": "query"
}
],
"responses": {

View File

@ -2212,7 +2212,7 @@
"tags": [
"system/日志"
],
"summary": "登录日志列表",
"summary": "操作日志列表update",
"parameters": [
{
"type": "string",
@ -2243,6 +2243,18 @@
"description": "页码",
"name": "pageIndex",
"in": "query"
},
{
"type": "string",
"description": "开时时间",
"name": "startTime",
"in": "query"
},
{
"type": "string",
"description": "结束时间",
"name": "endTime",
"in": "query"
}
],
"responses": {

View File

@ -3511,6 +3511,14 @@ paths:
in: query
name: pageIndex
type: integer
- description: 开时时间
in: query
name: startTime
type: string
- description: 结束时间
in: query
name: endTime
type: string
responses:
"200":
description: '{"code": 200, "data": [...]}'
@ -3518,7 +3526,7 @@ paths:
$ref: '#/definitions/app.Response'
security:
- Bearer: []
summary: 登录日志列表
summary: 操作日志列表update
tags:
- system/日志
/api/v1/post:

View File

@ -1,11 +1,11 @@
package app
import (
"encoding/json"
"go-admin/tools"
"net/http"
"github.com/gin-gonic/gin"
"go-admin/tools"
)
// 失败数据处理
@ -18,7 +18,12 @@ func Error(c *gin.Context, code int, err error, msg string) {
res.Msg = msg
}
res.RequestId = tools.GenerateMsgIDFromContext(c)
//traceId, _ := c.Get("trace")
//res.RequestId = traceId.(string)
c.JSON(http.StatusOK, res.ReturnError(code))
response, _ := json.Marshal(res)
c.Set("response", string(response))
}
// 通常成功数据处理
@ -29,7 +34,12 @@ func OK(c *gin.Context, data interface{}, msg string) {
res.Msg = msg
}
res.RequestId = tools.GenerateMsgIDFromContext(c)
//traceId, _ := c.Get("trace")
//res.RequestId = traceId.(string)
c.JSON(http.StatusOK, res.ReturnOK())
response, _ := json.Marshal(res)
c.Set("response", string(response))
}
// 分页数据处理