优化日志模块,添加操作日志白名单;修改获取操作日志列表接口
This commit is contained in:
parent
36d955cfad
commit
64af9e9df3
2
Makefile
2
Makefile
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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 { //库存状态
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
22
common/global/constant.go
Normal 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,
|
||||
}
|
|
@ -27,7 +27,7 @@ settings:
|
|||
# 请求日志开关
|
||||
enabledreq: false
|
||||
# 数据库日志开关 dev模式,将自动开启
|
||||
enableddb: false
|
||||
enableddb: true
|
||||
# 自动任务日志开关 dev模式,将自动开启
|
||||
enabledjob: false
|
||||
jwt:
|
||||
|
|
14
docs/docs.go
14
docs/docs.go
|
@ -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": {
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
|
||||
// 分页数据处理
|
||||
|
|
Loading…
Reference in New Issue
Block a user