优化日志模块,添加操作日志白名单;修改获取操作日志列表接口
This commit is contained in:
parent
36d955cfad
commit
64af9e9df3
2
Makefile
2
Makefile
|
@ -21,5 +21,5 @@ dev-windows:
|
||||||
|
|
||||||
|
|
||||||
dev:
|
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"
|
"go-admin/tools/app"
|
||||||
)
|
)
|
||||||
|
|
||||||
// @Summary 登录日志列表
|
// GetOperLogList
|
||||||
|
// @Summary 操作日志列表(update)
|
||||||
// @Description 获取JSON
|
// @Description 获取JSON
|
||||||
// @Tags system/日志
|
// @Tags system/日志
|
||||||
// @Param status query string false "status"
|
// @Param status query string false "status"
|
||||||
|
@ -19,6 +20,8 @@ import (
|
||||||
// @Param dictType query string false "dictType"
|
// @Param dictType query string false "dictType"
|
||||||
// @Param pageSize query int false "页条数"
|
// @Param pageSize query int false "页条数"
|
||||||
// @Param pageIndex 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": [...]}"
|
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
|
||||||
// @Router /api/v1/operloglist [get]
|
// @Router /api/v1/operloglist [get]
|
||||||
// @Security Bearer
|
// @Security Bearer
|
||||||
|
@ -41,7 +44,9 @@ func GetOperLogList(c *gin.Context) {
|
||||||
data.OperName = c.Request.FormValue("operName")
|
data.OperName = c.Request.FormValue("operName")
|
||||||
data.Status = c.Request.FormValue("status")
|
data.Status = c.Request.FormValue("status")
|
||||||
data.OperIp = c.Request.FormValue("operIp")
|
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)
|
tools.HasError(err, "", -1)
|
||||||
|
|
||||||
var mp = make(map[string]interface{}, 3)
|
var mp = make(map[string]interface{}, 3)
|
||||||
|
|
|
@ -79,6 +79,9 @@ func StoreAdd(c *gin.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
store.IsOnline = 1
|
store.IsOnline = 1
|
||||||
|
if store.MemberService != 2 { // 会员服务:1 开启 2 不开启
|
||||||
|
store.MemberService = 1 // 默认开启会员;没开启的门店默认在小程序端不展示,需前端判断
|
||||||
|
}
|
||||||
err := store.Add()
|
err := store.Add()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Errorf("err:", err)
|
logger.Errorf("err:", err)
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
package middleware
|
package middleware
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"go-admin/common/global"
|
||||||
"go-admin/logger"
|
"go-admin/logger"
|
||||||
|
config2 "go-admin/tools/config"
|
||||||
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -10,38 +14,63 @@ import (
|
||||||
|
|
||||||
"go-admin/app/admin/models"
|
"go-admin/app/admin/models"
|
||||||
"go-admin/tools"
|
"go-admin/tools"
|
||||||
config2 "go-admin/tools/config"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// 日志记录到文件
|
// LoggerToFile 日志记录到文件
|
||||||
func LoggerToFile() gin.HandlerFunc {
|
func LoggerToFile() gin.HandlerFunc {
|
||||||
|
|
||||||
return func(c *gin.Context) {
|
return func(c *gin.Context) {
|
||||||
// 开始时间
|
RequestInLog(c)
|
||||||
startTime := time.Now()
|
defer RequestOutLog(c)
|
||||||
|
|
||||||
// 处理请求
|
|
||||||
c.Next()
|
c.Next()
|
||||||
|
|
||||||
// 结束时间
|
}
|
||||||
endTime := time.Now()
|
}
|
||||||
|
|
||||||
// 执行时间
|
// RequestInLog 请求进入日志
|
||||||
latencyTime := endTime.Sub(startTime)
|
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
|
reqMethod := c.Request.Method
|
||||||
|
|
||||||
// 请求路由
|
// 请求路由
|
||||||
reqUri := c.Request.RequestURI
|
reqUri := c.Request.RequestURI
|
||||||
|
|
||||||
// 状态码
|
|
||||||
statusCode := c.Writer.Status()
|
|
||||||
|
|
||||||
// 请求IP
|
// 请求IP
|
||||||
clientIP := c.ClientIP()
|
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",
|
fmt.Printf("%s [INFO] %s %s %3d %13v %15s \r\n",
|
||||||
startTime.Format("2006-01-02 15:04:05"),
|
startTime.Format("2006-01-02 15:04:05"),
|
||||||
reqMethod,
|
reqMethod,
|
||||||
|
@ -54,21 +83,27 @@ func LoggerToFile() gin.HandlerFunc {
|
||||||
logger.Info(
|
logger.Info(
|
||||||
"log request",
|
"log request",
|
||||||
logger.Field("status", statusCode),
|
logger.Field("status", statusCode),
|
||||||
logger.Field("spend_time", latencyTime),
|
logger.Field("spendTime", latencyTime),
|
||||||
logger.Field("client_id", clientIP),
|
logger.Field("clientId", clientIP),
|
||||||
logger.Field("method", reqMethod),
|
logger.Field("method", reqMethod),
|
||||||
logger.Field("uri", reqUri),
|
logger.Field("uri", reqUri),
|
||||||
|
logger.Field("reqBody", req),
|
||||||
|
logger.Field("response", response),
|
||||||
|
logger.Field("requestId", tools.GenerateMsgIDFromContext(c)),
|
||||||
)
|
)
|
||||||
|
|
||||||
if c.Request.Method != "GET" && c.Request.Method != "OPTIONS" && config2.LoggerConfig.EnabledDB {
|
//只有在白名单中的url才记录操作日志
|
||||||
SetDBOperLog(c, clientIP, statusCode, reqUri, reqMethod, latencyTime)
|
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,
|
||||||
func SetDBOperLog(c *gin.Context, clientIP string, statusCode int, reqUri string, reqMethod string, latencyTime time.Duration) {
|
latencyTime time.Duration, req string, resp string) {
|
||||||
menu := models.Menu{}
|
menu := models.Menu{}
|
||||||
menu.Path = reqUri
|
menu.Path = reqUri
|
||||||
menu.Action = reqMethod
|
menu.Action = reqMethod
|
||||||
|
@ -113,5 +148,9 @@ func SetDBOperLog(c *gin.Context, clientIP string, statusCode int, reqUri string
|
||||||
} else {
|
} else {
|
||||||
sysOperLog.Status = "1"
|
sysOperLog.Status = "1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sysOperLog.OperParam = req
|
||||||
|
sysOperLog.JsonResult = resp
|
||||||
|
|
||||||
_, _ = sysOperLog.Create()
|
_, _ = sysOperLog.Create()
|
||||||
}
|
}
|
||||||
|
|
|
@ -1181,7 +1181,7 @@ func (m *ErpStockCommodityListReq) GetDetailList() (*ErpStockCommodityListResp,
|
||||||
|
|
||||||
var count int64
|
var count int64
|
||||||
if err := qs.Count(&count).Error; err != nil {
|
if err := qs.Count(&count).Error; err != nil {
|
||||||
//logger.Error("count err:", err)
|
logger.Error("count err:", logger.Field("err", err))
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1253,7 +1253,7 @@ func (m *ErpStockCommodityListReq) buildQueryConditions(qs *gorm.DB) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if m.SupplierId != 0 { //供应商id
|
if m.SupplierId != 0 { //供应商id
|
||||||
qs = qs.Where("supplier_id=?", m.SupplierId)
|
qs = qs.Where("erp_supplier_id=?", m.SupplierId)
|
||||||
}
|
}
|
||||||
|
|
||||||
if m.State != 0 { //库存状态
|
if m.State != 0 { //库存状态
|
||||||
|
|
|
@ -55,7 +55,7 @@ func (e *SysOperLog) Get() (SysOperLog, error) {
|
||||||
return doc, nil
|
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
|
var doc []SysOperLog
|
||||||
|
|
||||||
table := orm.Eloquent.Table(e.TableName())
|
table := orm.Eloquent.Table(e.TableName())
|
||||||
|
@ -71,6 +71,12 @@ func (e *SysOperLog) GetPage(pageSize int, pageIndex int) ([]SysOperLog, int, er
|
||||||
if e.BusinessType != "" {
|
if e.BusinessType != "" {
|
||||||
table = table.Where("business_type = ?", 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
|
var count int64
|
||||||
|
|
||||||
|
|
|
@ -220,6 +220,11 @@ func (m *Store) getModifyPara() map[string]interface{} {
|
||||||
if m.Latitude != 0 {
|
if m.Latitude != 0 {
|
||||||
paraMap["latitude"] = m.Latitude
|
paraMap["latitude"] = m.Latitude
|
||||||
}
|
}
|
||||||
|
if m.MemberService != 0 {
|
||||||
|
paraMap["member_service"] = m.MemberService
|
||||||
|
}
|
||||||
|
|
||||||
|
paraMap["sales_comm_rate"] = m.SalesCommRate
|
||||||
|
|
||||||
return paraMap
|
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
|
enabledreq: false
|
||||||
# 数据库日志开关 dev模式,将自动开启
|
# 数据库日志开关 dev模式,将自动开启
|
||||||
enableddb: false
|
enableddb: true
|
||||||
# 自动任务日志开关 dev模式,将自动开启
|
# 自动任务日志开关 dev模式,将自动开启
|
||||||
enabledjob: false
|
enabledjob: false
|
||||||
jwt:
|
jwt:
|
||||||
|
|
14
docs/docs.go
14
docs/docs.go
|
@ -2223,7 +2223,7 @@ const docTemplate = `{
|
||||||
"tags": [
|
"tags": [
|
||||||
"system/日志"
|
"system/日志"
|
||||||
],
|
],
|
||||||
"summary": "登录日志列表",
|
"summary": "操作日志列表(update)",
|
||||||
"parameters": [
|
"parameters": [
|
||||||
{
|
{
|
||||||
"type": "string",
|
"type": "string",
|
||||||
|
@ -2254,6 +2254,18 @@ const docTemplate = `{
|
||||||
"description": "页码",
|
"description": "页码",
|
||||||
"name": "pageIndex",
|
"name": "pageIndex",
|
||||||
"in": "query"
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "开时时间",
|
||||||
|
"name": "startTime",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "结束时间",
|
||||||
|
"name": "endTime",
|
||||||
|
"in": "query"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"responses": {
|
"responses": {
|
||||||
|
|
|
@ -2212,7 +2212,7 @@
|
||||||
"tags": [
|
"tags": [
|
||||||
"system/日志"
|
"system/日志"
|
||||||
],
|
],
|
||||||
"summary": "登录日志列表",
|
"summary": "操作日志列表(update)",
|
||||||
"parameters": [
|
"parameters": [
|
||||||
{
|
{
|
||||||
"type": "string",
|
"type": "string",
|
||||||
|
@ -2243,6 +2243,18 @@
|
||||||
"description": "页码",
|
"description": "页码",
|
||||||
"name": "pageIndex",
|
"name": "pageIndex",
|
||||||
"in": "query"
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "开时时间",
|
||||||
|
"name": "startTime",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "结束时间",
|
||||||
|
"name": "endTime",
|
||||||
|
"in": "query"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"responses": {
|
"responses": {
|
||||||
|
|
|
@ -3511,6 +3511,14 @@ paths:
|
||||||
in: query
|
in: query
|
||||||
name: pageIndex
|
name: pageIndex
|
||||||
type: integer
|
type: integer
|
||||||
|
- description: 开时时间
|
||||||
|
in: query
|
||||||
|
name: startTime
|
||||||
|
type: string
|
||||||
|
- description: 结束时间
|
||||||
|
in: query
|
||||||
|
name: endTime
|
||||||
|
type: string
|
||||||
responses:
|
responses:
|
||||||
"200":
|
"200":
|
||||||
description: '{"code": 200, "data": [...]}'
|
description: '{"code": 200, "data": [...]}'
|
||||||
|
@ -3518,7 +3526,7 @@ paths:
|
||||||
$ref: '#/definitions/app.Response'
|
$ref: '#/definitions/app.Response'
|
||||||
security:
|
security:
|
||||||
- Bearer: []
|
- Bearer: []
|
||||||
summary: 登录日志列表
|
summary: 操作日志列表(update)
|
||||||
tags:
|
tags:
|
||||||
- system/日志
|
- system/日志
|
||||||
/api/v1/post:
|
/api/v1/post:
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
package app
|
package app
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"go-admin/tools"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"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.Msg = msg
|
||||||
}
|
}
|
||||||
res.RequestId = tools.GenerateMsgIDFromContext(c)
|
res.RequestId = tools.GenerateMsgIDFromContext(c)
|
||||||
|
//traceId, _ := c.Get("trace")
|
||||||
|
//res.RequestId = traceId.(string)
|
||||||
|
|
||||||
c.JSON(http.StatusOK, res.ReturnError(code))
|
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.Msg = msg
|
||||||
}
|
}
|
||||||
res.RequestId = tools.GenerateMsgIDFromContext(c)
|
res.RequestId = tools.GenerateMsgIDFromContext(c)
|
||||||
|
//traceId, _ := c.Get("trace")
|
||||||
|
//res.RequestId = traceId.(string)
|
||||||
|
|
||||||
c.JSON(http.StatusOK, res.ReturnOK())
|
c.JSON(http.StatusOK, res.ReturnOK())
|
||||||
|
response, _ := json.Marshal(res)
|
||||||
|
c.Set("response", string(response))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 分页数据处理
|
// 分页数据处理
|
||||||
|
|
Loading…
Reference in New Issue
Block a user