ActionLogModel.php 6.4 KB

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