// +---------------------------------------------------------------------- namespace App\Models; use Illuminate\Support\Facades\DB; /** * 行为日志-模型 * @author laravel开发员 * @since 2020/11/10 * Class ActionLogModel * @package App\Models */ class ActionLogModel extends BaseModel { // 设置数据表 protected $table = null; // 自定义日志标题 protected static $recordUserId = 0; protected static $recordType = 1; protected static $module = 'admin'; protected static $title = ''; // 自定义日志内容 protected static $content = ''; public function __construct() { // 设置表名 $this->table = 'action_log_' . date('Y') . '_' . date('m'); // 初始化行为日志表 $this->initTable(); } /** * 初始化行为日志表 * @return string|null * @since 2020/11/10 * @author laravel开发员 */ private function initTable() { $tbl = DB_PREFIX . $this->table; if (!$this->tableExists($tbl)) { $sql = "CREATE TABLE `{$tbl}` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '唯一性标识', `username` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '操作人用户名', `method` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '请求类型', `module` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模型', `action` varchar(255) NOT NULL COMMENT '操作方法', `url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '操作页面', `param` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '请求参数(JSON格式)', `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '日志标题', `type` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '操作类型:1-后台 2-APP', `content` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '内容', `ip` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'IP地址', `user_agent` varchar(360) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'User-Agent', `create_user` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '添加人', `create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间', `update_user` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新人', `update_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间', `mark` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '有效标识:1正常 0删除', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='系统行为日志表';"; DB::select($sql); } return $tbl; } /** * 设置标题 * @param $title 标题 * @since 2020/11/10 * @author laravel开发员 */ public static function setTitle($title) { self::$title = $title; } /** * 设置内容 * @param $content 内容 * @since 2020/11/10 * @author laravel开发员 */ public static function setContent($content) { self::$content = $content; } /** * 设置内容 * @param $content 内容 * @since 2020/11/10 * @author laravel开发员 */ public static function setRecord($userId, $params) { self::$recordUserId = $userId; self::$module = isset($params['module']) && $params['module']? $params['module'] : 'app'; self::$recordType = isset($params['type']) && $params['type']? $params['type'] : 1; self::$title = isset($params['title'])? $params['title'] : ''; self::$content = isset($params['content'])? $params['content'] : ''; } /** * 创建行为日志 * @author laravel开发员 * @since 2020/11/10 */ public static function record($username='') { if (!self::$title) { // 操作控制器名 $menuModel = new MenuModel(); $info = $menuModel->getOne([ ['url', '=', request()->url()], ]); if ($info) { if ($info['type'] == 1) { $menuInfo = $menuModel->getInfo($info['pid']); self::$title = $menuInfo['title']; } else { self::$title = $info['title']; } } } // 登录用户ID if(self::$recordUserId){ $userInfo = MemberModel::where(['id'=>self::$recordUserId])->select(['id','nickname as username'])->first(); }else{ $userId = session('userId'); $userInfo = UserModel::where(['id'=> $userId])->select(['id','username'])->first(); } // 日志数据 $data = [ 'username' => $username? $username : (isset($userInfo['username']) ? $userInfo['username'] : '未知'), 'module' => self::$module? self::$module : 'admin', 'action' => request()->path(), 'method' => request()->method(), 'url' => request()->url(true), // 获取完成URL 'param' => request()->all() ? json_encode(request()->all()) : '', 'title' => self::$title ? self::$title : '操作日志', 'type' => self::$recordType, 'content' => self::$content, 'ip' => request()->ip(), 'user_agent' => request()->server('HTTP_USER_AGENT'), 'create_user' => empty(session('userId')) ? 0 : session('userId'), 'create_time' => time(), ]; // 日志入库 self::insert($data); } }