ActionLogModel.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2017~2021 LARAVEL研发中心
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://www.laravel.cn
  8. // +----------------------------------------------------------------------
  9. // | Author: laravel开发员 <laravel.qq.com>
  10. // +----------------------------------------------------------------------
  11. namespace App\Models;
  12. use App\Services\RedisService;
  13. use Illuminate\Support\Facades\DB;
  14. /**
  15. * 行为日志-模型
  16. * @author laravel开发员
  17. * @since 2020/11/10
  18. * Class ActionLogModel
  19. * @package App\Models
  20. */
  21. class ActionLogModel extends BaseModel
  22. {
  23. // 设置数据表
  24. protected $table = null;
  25. // 自定义日志标题
  26. protected static $title = '';
  27. // 自定义日志内容
  28. protected static $content = '';
  29. public function __construct()
  30. {
  31. // 设置表名
  32. $this->table = 'action_log_' . date('Y') . '_' . date('m');
  33. // 初始化行为日志表
  34. $this->initTable();
  35. }
  36. /**
  37. * 初始化行为日志表
  38. * @return string|null
  39. * @since 2020/11/10
  40. * @author laravel开发员
  41. */
  42. private function initTable()
  43. {
  44. $tbl = DB_PREFIX . $this->table;
  45. if (!$this->tableExists($tbl)) {
  46. $sql = "CREATE TABLE `lev_action_log_2026_05` (
  47. `id` int UNSIGNED NOT NULL COMMENT '唯一性标识',
  48. `username` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '操作人用户名',
  49. `method` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '请求类型',
  50. `module` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模型',
  51. `action` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '操作方法',
  52. `url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '操作页面',
  53. `param` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '请求参数(JSON格式)',
  54. `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '日志标题',
  55. `type` tinyint UNSIGNED NOT NULL DEFAULT '0' COMMENT '操作类型:1-后台 2-APP',
  56. `content` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '内容',
  57. `ip` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'IP地址',
  58. `user_agent` varchar(360) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'User-Agent',
  59. `create_user` int UNSIGNED NOT NULL DEFAULT '0' COMMENT '添加人',
  60. `create_time` int UNSIGNED NOT NULL DEFAULT '0' COMMENT '添加时间',
  61. `update_user` int UNSIGNED NOT NULL DEFAULT '0' COMMENT '更新人',
  62. `update_time` int UNSIGNED NOT NULL DEFAULT '0' COMMENT '更新时间',
  63. `mark` tinyint UNSIGNED NOT NULL DEFAULT '1' COMMENT '有效标识:1正常 0删除'
  64. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统行为日志表'";
  65. DB::select($sql);
  66. }
  67. return $tbl;
  68. }
  69. /**
  70. * 设置标题
  71. * @param $title 标题
  72. * @since 2020/11/10
  73. * @author laravel开发员
  74. */
  75. public static function setTitle($title)
  76. {
  77. self::$title = $title;
  78. }
  79. /**
  80. * 设置内容
  81. * @param $content 内容
  82. * @since 2020/11/10
  83. * @author laravel开发员
  84. */
  85. public static function setContent($content)
  86. {
  87. self::$content = $content;
  88. }
  89. /**
  90. * 创建行为日志
  91. * @author laravel开发员
  92. * @since 2020/11/10
  93. */
  94. public static function record()
  95. {
  96. if (!self::$title) {
  97. // 操作控制器名
  98. $menuModel = new MenuModel();
  99. $info = $menuModel->getOne([
  100. ['url', '=', request()->url()],
  101. ]);
  102. if ($info) {
  103. if ($info['type'] == 1) {
  104. $menuInfo = $menuModel->getInfo($info['pid']);
  105. self::$title = $menuInfo['title'];
  106. } else {
  107. self::$title = $info['title'];
  108. }
  109. }
  110. }
  111. // 登录用户ID
  112. $userId = session('userId');
  113. if(empty($userId)){
  114. $userId = RedisService::get("caches:admin:".get_client_ip());
  115. }
  116. $userModel = new UserModel();
  117. $userInfo = $userModel->getInfo($userId);
  118. // 日志数据
  119. $data = [
  120. 'username' => isset($userInfo['username']) ? $userInfo['username'] : '未知',
  121. 'module' => 'admin',
  122. 'action' => request()->path(),
  123. 'method' => request()->method(),
  124. 'url' => request()->url(true), // 获取完成URL
  125. 'param' => request()->all() ? json_encode(request()->all()) : '',
  126. 'title' => self::$title ? self::$title : '操作日志',
  127. 'type' => self::$title == '登录系统' ? 1 : (self::$title == '注销系统' ? 2 : 0),
  128. 'content' => self::$content,
  129. 'ip' => request()->ip(),
  130. 'user_agent' => request()->server('HTTP_USER_AGENT'),
  131. 'create_user' => $userId? $userId : 0,
  132. 'create_time' => time(),
  133. ];
  134. // 日志入库
  135. self::insert($data);
  136. }
  137. }