AdminLogRepository.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\common\repositories\system\admin;
  12. use app\common\dao\BaseDao;
  13. use app\common\dao\system\admin\LogDao;
  14. use app\common\repositories\BaseRepository;
  15. use app\Request;
  16. use think\db\exception\DataNotFoundException;
  17. use think\db\exception\DbException;
  18. use think\db\exception\ModelNotFoundException;
  19. use think\Model;
  20. /**
  21. * 管理员操作记录
  22. */
  23. class AdminLogRepository extends BaseRepository
  24. {
  25. /**
  26. * AdminLogRepository constructor.
  27. * @param LogDao $dao
  28. */
  29. public function __construct(LogDao $dao)
  30. {
  31. $this->dao = $dao;
  32. }
  33. /**
  34. * 查询管理员操作日志列表
  35. *
  36. * 该方法用于根据给定的条件和分页参数,从数据库中检索管理员的操作日志。
  37. * 它首先构造一个查询,包括与商家关联的条件,并指定要包含的关联数据(如菜单)。
  38. * 然后,它计算满足条件的日志总数,以便于分页。
  39. * 最后,它构造一个包含日志列表和总数的数组,并返回该数组。
  40. *
  41. * @param string $merId 商家ID,用于限定查询的商家范围
  42. * @param array $where 查询条件,用于过滤日志
  43. * @param int $page 当前页码,用于分页查询
  44. * @param int $limit 每页记录数,用于分页查询
  45. * @return array 返回一个包含日志总数和日志列表的数组
  46. */
  47. public function lst($merId, array $where, $page, $limit)
  48. {
  49. // 构造查询,包括指定的条件和商家ID,以及要加载的关联数据(这里指菜单)
  50. $query = $this->dao->search($where, $merId)->with([
  51. 'menu' => function($query){
  52. // 仅加载菜单的名称和路由
  53. $query->field('menu_name,route');
  54. }
  55. ]);
  56. // 计算满足条件的日志总数
  57. $count = $query->count($this->dao->getPk());
  58. // 确定查询的字段,进行分页查询,并按创建时间降序排序
  59. // 这里指定了要查询的字段,包括创建时间、日志ID、管理员名称、路由、方法、URL、IP和管理员ID
  60. $list = $query->setOption('field', [])->field(['create_time', 'log_id', 'admin_name', 'route', 'method', 'url', 'ip', 'admin_id'])
  61. ->page($page, $limit)->order('create_time DESC')->select();
  62. // 返回包含日志总数和日志列表的数组
  63. return compact('count', 'list');
  64. }
  65. /**
  66. * 添加日志记录
  67. *
  68. * 该方法用于根据传入的请求信息和商家ID添加一条日志记录。
  69. * 它首先解析请求数据,然后使用解析后的数据和商家ID来创建新的日志条目。
  70. *
  71. * @param Request $request 本次请求的对象,用于解析请求数据。
  72. * @param int $merId 商家ID,用于标识日志所属的商家。默认为0,表示系统日志。
  73. * @return mixed 返回添加日志的结果,具体类型取决于create方法的实现。
  74. */
  75. public function addLog(Request $request, int $merId = 0)
  76. {
  77. // 解析请求数据并创建日志条目
  78. return $this->create($merId, self::parse($request));
  79. }
  80. /**
  81. * 创建一个新的实体对象
  82. *
  83. * 本函数用于在数据库中创建一个新的实体记录。它首先将传入的商家ID添加到数据数组中,然后调用DAO层的创建方法来执行实际的数据库操作。
  84. * 这里的商家ID是作为外部传入的参数,它被用于指定新记录所属的商家。
  85. *
  86. * @param int $merId 商家ID,用于标识记录所属的商家。
  87. * @param array $data 包含新记录数据的数组,不包含商家ID。
  88. * @return mixed 返回DAO层创建方法的执行结果,可能是新创建记录的ID或其他数据。
  89. */
  90. public function create(int $merId, array $data)
  91. {
  92. // 将商家ID添加到数据数组中
  93. $data['mer_id'] = $merId;
  94. // 调用DAO层的创建方法,传入完整的数据数组,执行数据库插入操作
  95. return $this->dao->create($data);
  96. }
  97. /**
  98. * 解析请求信息并生成管理员操作日志的数组格式。
  99. *
  100. * 该方法旨在提取当前请求中的关键信息,如管理员ID、姓名、请求的路由、IP地址、URL和请求方法,
  101. * 用于构建管理员操作日志,以便后续存储和审计。通过对这些信息的提取和打包,可以方便地
  102. * 记录管理员在系统中的操作轨迹,增强系统的可审计性和安全性。
  103. *
  104. * @param Request $request 当前的请求对象,包含了所有的请求信息。
  105. * @return array 返回一个包含管理员ID、姓名、请求路由、IP地址、完整URL和请求方法的数组。
  106. */
  107. public static function parse(Request $request)
  108. {
  109. // 构建并返回包含管理员信息和请求信息的数组
  110. return [
  111. 'admin_id' => $request->adminId(), // 获取管理员ID
  112. 'admin_name' => $request->adminInfo()->real_name ?: '未定义', // 获取管理员真实姓名,如果未定义则显示为“未定义”
  113. 'route' => $request->rule()->getName(), // 获取当前请求的路由名称
  114. 'ip' => $request->ip(), // 获取客户端的IP地址
  115. 'url' => $request->url(true), // 获取完整的请求URL
  116. 'method' => $request->method() // 获取请求的方法(如GET、POST等)
  117. ];
  118. }
  119. }