sys_oper_log.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /*
  2. * @desc:后台操作日志业务处理
  3. * @company:云南奇讯科技有限公司
  4. * @Author: yixiaohu<yxh669@qq.com>
  5. * @Date: 2022/9/21 16:14
  6. */
  7. package sysOperLog
  8. import (
  9. "context"
  10. "github.com/gogf/gf/v2/frame/g"
  11. "github.com/gogf/gf/v2/net/ghttp"
  12. "github.com/gogf/gf/v2/os/grpool"
  13. "github.com/gogf/gf/v2/os/gtime"
  14. "github.com/gogf/gf/v2/text/gstr"
  15. "github.com/tiger1103/gfast/v3/api/v1/system"
  16. "github.com/tiger1103/gfast/v3/internal/app/system/consts"
  17. "github.com/tiger1103/gfast/v3/internal/app/system/dao"
  18. "github.com/tiger1103/gfast/v3/internal/app/system/model"
  19. "github.com/tiger1103/gfast/v3/internal/app/system/model/do"
  20. "github.com/tiger1103/gfast/v3/internal/app/system/model/entity"
  21. "github.com/tiger1103/gfast/v3/internal/app/system/service"
  22. "github.com/tiger1103/gfast/v3/library/libUtils"
  23. "github.com/tiger1103/gfast/v3/library/liberr"
  24. )
  25. type sOperateLog struct {
  26. Pool *grpool.Pool
  27. }
  28. func init() {
  29. service.RegisterOperateLog(New())
  30. }
  31. func New() *sOperateLog {
  32. return &sOperateLog{
  33. Pool: grpool.New(100),
  34. }
  35. }
  36. // OperationLog 操作日志写入
  37. func (s *sOperateLog) OperationLog(r *ghttp.Request) {
  38. userInfo := service.Context().GetLoginUser(r.GetCtx())
  39. if userInfo == nil {
  40. return
  41. }
  42. url := r.Request.URL //请求地址
  43. //获取菜单
  44. //获取地址对应的菜单id
  45. menuList, err := service.SysAuthRule().GetMenuList(r.GetCtx())
  46. if err != nil {
  47. g.Log().Error(r.GetCtx(), err)
  48. return
  49. }
  50. var menu *model.SysAuthRuleInfoRes
  51. path := gstr.TrimLeft(url.Path, "/")
  52. for _, m := range menuList {
  53. if gstr.Equal(m.Name, path) {
  54. menu = m
  55. break
  56. }
  57. }
  58. data := &model.SysOperLogAdd{
  59. User: userInfo,
  60. Menu: menu,
  61. Url: url,
  62. Params: r.GetMap(),
  63. Method: r.Method,
  64. ClientIp: libUtils.GetClientIp(r.GetCtx()),
  65. OperatorType: 1,
  66. }
  67. s.Invoke(r.GetCtx(), data)
  68. }
  69. func (s *sOperateLog) Invoke(ctx context.Context, data *model.SysOperLogAdd) {
  70. s.Pool.Add(ctx, func(ctx context.Context) {
  71. //写入日志数据
  72. s.operationLogAdd(ctx, data)
  73. })
  74. }
  75. // OperationLogAdd 添加操作日志
  76. func (s *sOperateLog) operationLogAdd(ctx context.Context, data *model.SysOperLogAdd) {
  77. menuTitle := ""
  78. if data.Menu != nil {
  79. menuTitle = data.Menu.Title
  80. }
  81. dept, err := service.SysDept().GetByDeptId(ctx, data.User.DeptId)
  82. if err != nil {
  83. g.Log().Error(ctx, err)
  84. return
  85. }
  86. if dept == nil {
  87. dept = &entity.SysDept{}
  88. }
  89. insertData := &do.SysOperLog{
  90. Title: menuTitle,
  91. Method: data.Url.Path,
  92. RequestMethod: data.Method,
  93. OperatorType: data.OperatorType,
  94. OperName: data.User.UserName,
  95. DeptName: dept.DeptName,
  96. OperIp: data.ClientIp,
  97. OperLocation: libUtils.GetCityByIp(data.ClientIp),
  98. OperTime: gtime.Now(),
  99. OperParam: data.Params,
  100. }
  101. rawQuery := data.Url.RawQuery
  102. if rawQuery != "" {
  103. rawQuery = "?" + rawQuery
  104. }
  105. insertData.OperUrl = data.Url.Path + rawQuery
  106. _, err = dao.SysOperLog.Ctx(ctx).Insert(insertData)
  107. if err != nil {
  108. g.Log().Error(ctx, err)
  109. }
  110. }
  111. func (s *sOperateLog) List(ctx context.Context, req *system.SysOperLogSearchReq) (listRes *system.SysOperLogSearchRes, err error) {
  112. listRes = new(system.SysOperLogSearchRes)
  113. err = g.Try(ctx, func(ctx context.Context) {
  114. m := dao.SysOperLog.Ctx(ctx)
  115. if req.Title != "" {
  116. m = m.Where(dao.SysOperLog.Columns().Title+" = ?", req.Title)
  117. }
  118. if req.RequestMethod != "" {
  119. m = m.Where(dao.SysOperLog.Columns().RequestMethod+" = ?", req.RequestMethod)
  120. }
  121. if req.OperName != "" {
  122. m = m.Where(dao.SysOperLog.Columns().OperName+" like ?", "%"+req.OperName+"%")
  123. }
  124. if len(req.DateRange) != 0 {
  125. m = m.Where("oper_time >=? AND oper_time <=?", req.DateRange[0], req.DateRange[1])
  126. }
  127. listRes.Total, err = m.Count()
  128. liberr.ErrIsNil(ctx, err, "获取总行数失败")
  129. if req.PageNum == 0 {
  130. req.PageNum = 1
  131. }
  132. listRes.CurrentPage = req.PageNum
  133. if req.PageSize == 0 {
  134. req.PageSize = consts.PageSize
  135. }
  136. order := "oper_id DESC"
  137. if req.OrderBy != "" {
  138. order = req.OrderBy
  139. }
  140. var res []*model.SysOperLogInfoRes
  141. err = m.Fields(system.SysOperLogSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res)
  142. liberr.ErrIsNil(ctx, err, "获取数据失败")
  143. listRes.List = make([]*model.SysOperLogListRes, len(res))
  144. for k, v := range res {
  145. listRes.List[k] = &model.SysOperLogListRes{
  146. OperId: v.OperId,
  147. Title: v.Title,
  148. RequestMethod: v.RequestMethod,
  149. OperName: v.OperName,
  150. DeptName: v.DeptName,
  151. LinkedDeptName: v.LinkedDeptName,
  152. OperUrl: v.OperUrl,
  153. OperIp: v.OperIp,
  154. OperLocation: v.OperLocation,
  155. OperParam: v.OperParam,
  156. OperTime: v.OperTime,
  157. }
  158. }
  159. })
  160. return
  161. }
  162. func (s *sOperateLog) GetByOperId(ctx context.Context, operId uint64) (res *model.SysOperLogInfoRes, err error) {
  163. err = g.Try(ctx, func(ctx context.Context) {
  164. err = dao.SysOperLog.Ctx(ctx).WithAll().Where(dao.SysOperLog.Columns().OperId, operId).Scan(&res)
  165. liberr.ErrIsNil(ctx, err, "获取信息失败")
  166. })
  167. return
  168. }
  169. func (s *sOperateLog) DeleteByIds(ctx context.Context, ids []uint64) (err error) {
  170. err = g.Try(ctx, func(ctx context.Context) {
  171. _, err = dao.SysOperLog.Ctx(ctx).Delete("oper_id in (?)", ids)
  172. liberr.ErrIsNil(ctx, err, "删除失败")
  173. })
  174. return
  175. }
  176. func (s *sOperateLog) ClearLog(ctx context.Context) (err error) {
  177. err = g.Try(ctx, func(ctx context.Context) {
  178. _, err = g.DB().Ctx(ctx).Exec(ctx, "truncate "+dao.SysOperLog.Table())
  179. liberr.ErrIsNil(ctx, err, "清除失败")
  180. })
  181. return
  182. }