群控系统服务端开发模式-应用开发-操作记录功能开发

一、开放路由

        在根目录下route文件夹下修改app.php文件,代码如下:

    // 操作日志Route::get('token/get_list','permission.Token/getList');// 获取操作日志列表Route::post('token/get_all','permission.Token/getAll');// 获取操作日志所有数据Route::post('token/get_info','permission.Token/getInfo');// 获取操作日志单条数据

二、开发日志控制管理

        在根目录下app文件夹下controller文件夹下permission文件夹下添加操作日志控制文件类并命名为Token.php,代码如下

<?php
/*** 用户操作记录管理* User: 龙哥·三年风水* Date: 2024/12/13* Time: 15:54*/
namespace app\controller\permission;
use app\controller\Base;
use app\model\common\Token as TokenModel;
use app\model\permission\Admin as AdminModel;
use app\model\permission\Menu as PMModel;
class Token extends Base
{//分页数据public function getList(){$where = [];$param = $this->request->param();if (!empty($param['username'])) $where[] = ['pa.username', 'LIKE', '%' . $param['username'] . '%'];if (!empty($param['create_time'])) $where[] = ['a.create_time', '=', $param['create_time']];if (!empty($param['token_type']))$where[] = ['a.token_type', '=', $param['token_type']];$join[] = ['permission_admin pa','a.admin_id = pa.id'];$resList = TokenModel::dataList($where,'a.id,a.token_type,a.menu_name,pa.username,a.login_time', [$param['currentPage'], $param['currentSize']],'a.login_time DESC',$join);$list = $resList['info'];foreach ($list as $k => $v) {$list[$k]['token_type'] = TokenModel::tokenType($v['token_type']);$list[$k]['menu_name'] = PMModel::menunameTitle($v['menu_name']);}$res['list'] = $list;$res['meat'] = $resList['page'];$this->setToken(4,'PermissionTokenIndexList');return succ('操作成功',$res);}//所有数据public function getAll(){$this->setToken(5,'PermissionTokenIndexAll');$param = $this->request->param();if (!empty($param['username'])) $where[] = ['pa.username', 'LIKE', '%' . $param['username'] . '%'];if (!empty($param['create_time'])) $where[] = ['a.create_time', '=', $param['create_time']];if (!empty($param['token_type']))$where[] = ['a.token_type', '=', $param['token_type']];$join[] = ['permission_admin pa','a.admin_id = pa.id'];$list = TokenModel::dataAll(['status' => 1], 'a.id,a.token_type,a.menu_name,pa.username,a.login_time', 'a.login_time DESC',$join);foreach ($list as $k => $v) {$list[$k]['token_type'] = TokenModel::tokenType($v['token_type']);$list[$k]['menu_name'] = PMModel::menunameTitle($v['menu_name']);}return succ('操作成功',$list);}//单条数据public function getInfo(){$this->setToken(6,'PermissionTokenIndexDetails');$id = $this->request->param('id', 0);if(empty($id))return err('主键参数必须上传');$data = TokenModel::dataFind(['id' => $id], 'token_type,menu_name,token,admin_id,random_number,create_time,login_time,expire_time',true);if(!empty($data)){$data['token_type'] = TokenModel::tokenType($data['token_type']);$data['menu_name'] = PMModel::menunameTitle($data['menu_name']);$data['username'] = AdminModel::dataFind(['id' => $data['admin_id']],'username',false);$data['expire_time'] = date('Y-m-d H:i:s',$data['expire_time']);unset($data['admin_id']);}return succ('操作成功',$data);}
}

三、修改日志数据控制层

        在根目录下app文件夹下model文件夹下common文件夹下,修改Token.php文件,代码如下:

<?php
/*** 登录用户数据管理* User: 龙哥 三年风水* Date: 2024/10/29* Time: 10:26*/
namespace app\model\common;
use app\model\Tools;
use Redis\Redis;
use app\model\param\System as SystemModel;
use app\model\permission\Admin;
class Token extends Tools
{protected static $name = 'permission_token';protected static $connection = 'mysql';protected $pk = 'token';//查询列表public static function dataList($where,$field,$limit,$order,$join = []){return self::dataLists(self::$name, $where, $field, $limit, $order, $join, self::$connection);}//所有数据public static function dataAll($where,$field,$order,$join = []){return self::dataAlls(self::$name, $where, $field, $order, $join, self::$connection);}//查询数据public static function dataFind($where = [], $field, $findType = true){return self::dataFinds(self::$name, $where, $field, $findType, self::$connection);}//保存数据public static function save($data, $where = []){return self::dataSaves(self::$name, $data, $where, self::$connection);}//修改token整个状态public static function setToken($token, $attack, $clientIp){$data['admin_id'] = 0;$data['username'] = '';$data['avatar'] = '';$data['realname'] = '';$data['email'] = '';$data['ip'] = '';$data['department_id'] = 0;$data['grade_id'] = 0;$data['role_id'] = 0;$data['random_number'] = '';$redisToken = Redis::select(config('cache.stores.redis.token_db'))->get('token_'.$token);if(empty($redisToken))return array('status' => false, 'info' => 'token已经过期咯,请重新登录!', 'data' => $data);//获取系统配置的过期时间$systemParam = SystemModel::dataFind(['id' => 1],'platform_token_expira');//验证是否跨站攻击$attackToken = Redis::select(config('cache.stores.redis.token_db'))->get('token_' . $redisToken);if(!empty($attackToken)){if ($attackToken === $attack){//如果传过来加密后的token与Redis里面记录的一样,就禁止访问、延长过期时间并加入黑名单Redis::select(config('cache.stores.redis.token_db'))->expire('token_'.$token, $systemParam['platform_token_expira']);//加入黑名单//Redis::select(config('cache.stores.redis.default_db'))->sadd('black-list', $clientIp);//return array('status' => false, 'info' => '跨站攻击', 'data' => $data);}}Redis::select(config('cache.stores.redis.token_db'))->expire('token_'.$token, $systemParam['platform_token_expira']);Redis::select(config('cache.stores.redis.token_db'))->setex('token_' . $redisToken, $systemParam['platform_token_expira'], $attack);$resAdminFind = Admin::dataFind(['id' => $redisToken], 'username,avatar,realname,email,ip,department_id,grade_id,role_id,status',true);if ($resAdminFind['status'] !== 1) return array('status' => false, 'info' => '该用户已被禁用', 'data' => $data);$data['admin_id'] = $redisToken;$data['username'] = $resAdminFind['username'];$data['avatar'] = $resAdminFind['avatar'];$data['realname'] = $resAdminFind['realname'];$data['email'] = $resAdminFind['email'];$data['ip'] = $resAdminFind['ip'];$data['department_id'] = $resAdminFind['department_id'];$data['grade_id'] = $resAdminFind['grade_id'];$data['role_id'] = $resAdminFind['role_id'];$data['random_number'] = self::dataFind(['token' => $token],'random_number',false);return array('status' => true, 'info' => '', 'data' => $data);}/*** 返回类型属性* User: 龙哥·三年风水* Date: 2024/12/13* Time: 11:22* @ param $tokenType 类型编号* @ return mixed*/public static function tokenType($tokenType){$arr = ["","登录","退出","自动退出","列表","所有","详情","保存","启禁用","删除","获取个人资料","修改个人资料","获取菜单权限","上传文件"];return $arr[$tokenType];}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/64086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQLite Update 语句

SQLite Update 语句 SQLite 的 UPDATE 语句用于更新数据库表中的现有记录。使用 UPDATE 语句&#xff0c;您可以修改一个或多个列的值。本教程将详细介绍如何使用 SQLite UPDATE 语句&#xff0c;包括语法、示例以及一些最佳实践。 语法 SQLite UPDATE 语句的基本语法如下&a…

SQL 单表查询练习题(一)

在 SQL 的学习过程中&#xff0c;单表查询是非常重要的基础部分&#xff0c;下面为大家分享一些单表查询的练习题以及对应的正确答案&#xff0c;希望能帮助大家更好地掌握相关知识。 一、题目及答案详情 1. 查询课程表中&#xff0c;没有前序课程的课程信息&#xff0c;查询…

评估一套呼叫中心大模型呼出机器人的投入回报比?

评估一套呼叫中心大模型呼出机器人的投入回报比&#xff1f; 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 评估一套呼叫中心大模型呼出机器人的投入回报比&#xff08;ROI&#xff09;&#xff0c;是一个涉…

探索 HTTP 请求头中的 “Host” 字段及其安全风险

探索 HTTP 请求头中的 “Host” 字段及其安全风险 大家好&#xff0c;今天我们来聊聊 HTTP 请求头中的“Host”字段&#xff0c;以及它的使用方法和安全风险。 什么是Host字段 在 HTTP 请求头中&#xff0c;“Host”字段是一个至关重要的部分。它告诉服务器&#xff0c;我们…

Type-C接口电热毯的创新之旅

在科技日新月异的今天&#xff0c;智能家居产品正逐步渗透到我们生活的每一个角落&#xff0c;从智能灯光到温控系统&#xff0c;无一不展现着科技带来的便捷与舒适。而在这个追求高效与智能化的浪潮中&#xff0c;一款结合了最新科技元素的电热毯——Type-C接口电热毯&#xf…

计算机网络知识点全梳理(一.TCP/IP网络模型)

目录 TCP/IP网络模型概述 应用层 什么是应用层 应用层功能 应用层协议 传输层 什么是传输层 传输层功能 传输层协议 网络层 什么是网络层 网络层功能 网络层协议 数据链路层 什么是数据链路层 数据链路层功能 物理层 物理层的概念和功能 TCP/IP网络模型概述…

C++ 整型数据范围

类型范围int (-2^31~2^31-1) (-2,147,483,648~2,147,483,647) 大概范围(2e9) unsigned int (0~2^32-1) (0~4,294,967,295) 大概范围(4e9) long long (-2^63~2^63-1) (-9,223,372,036,854,775,808,9,223,372,036,854,775,807) 大概范围(9e18) unsigned long long (0~2^64-1) (0~…

【MySQL 保姆级教学】用户管理和数据库权限(16)

数据库账户管理是指对数据库用户进行创建、修改和删除等操作&#xff0c;以控制用户对数据库的访问权限。通过账户管理&#xff0c;可以设置用户名、密码、主机地址等信息&#xff0c;确保数据库的安全性和可控性。例如&#xff0c;使用 CREATE USER 创建用户&#xff0c;ALTER…

.NET Core 各版本特点、差异及适用场景详解

随着 .NET Core 的不断发展&#xff0c;微软推出了一系列版本来满足不同场景下的开发需求。这些版本随着时间的推移逐渐演变为统一的 .NET 平台&#xff08;从 .NET 5 开始&#xff09;。本文将详细说明每个版本的特点、差异以及适用场景&#xff0c;帮助开发者更好地选择和使用…

【Unity】【VR开发】实现VR屏幕共享应用的几个重要插件和参考资料分享

【背景】 做了一个可以在局域网远程屏幕的VR应用&#xff0c;如果有相同兴趣的朋友也可以参考下我用的几个插件。 【使用或相关的关键插件】 piping server&#xff1a;这个是最基底的插件&#xff0c;基于它实现的信令通信。 https://github.com/nwtgck/piping-server/blob…

SpringSecurity使用教程

一、基本使用 Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架&#xff0c;专门设计用于保护基于 Spring 的应用程序。它不仅提供了全面的安全服务&#xff0c;还与 Spring 框架及其生态系统&#xff08;如 Spring Boot、Spring MVC 等&#xff09;紧密集…

docker 安装mysql 5.7 详细保姆级教程

1. 安装mysql(5.7) docker pull mysql:5.7 若是拉取不了&#xff0c;可以配置下 docker 源 2. 查看是否安装成功 docker images 下图就是成功了 3.创建mysql专用目录、数据挂载目录、配置文件目录 &#xff0c;演示目录在于/home/下 //命令逐条执行cd /home/ mkdir mysql …

活动预告 | Microsoft 365 在线技术公开课:让组织针对 Microsoft Copilot 做好准备

课程介绍 通过Microsoft Learn免费参加Microsoft 365在线技术公开课&#xff0c;建立您需要的技能&#xff0c;以创造新的机会并加速您对Microsoft云技术的理解。参加我们举办的“让组织针对 Microsoft Copilot for Microsoft 365 做好准备” 在线技术公开课活动&#xff0c;学…

fixture装饰器

普通代码案例&#xff1a; python本身执行 import pytestdef init_new():print("init_new...")return Truedef test_case(init_new):if init_new is True:print("如果init_new返回True&#xff0c;就执行用例test_case")if __name__ __main__:#用python本…

【韩顺平Java JDBC学习笔记】

Java JDBC 文章目录 jdbc概述基本介绍jdbc原理示意图 jdbc快速入门JDBC程序编写步骤获取数据库连接5种方式ResultSet[结果集]SQL注入Statement PreparedStatement预处理好处基本使用 JDBC APIJDBCUtils工具类使用工具类 事务基本介绍应用实例模拟经典的转帐业务 - 未使用事务模…

KeepAlive与RouterView缓存

参考 vue动态组件&#xff1c;Component&#xff1e;与&#xff1c;KeepAlive&#xff1e; KeepAlive官网介绍 缓存之keep-alive的理解和应用 Vue3Vite KeepAlive页面缓存问题 vue多级菜单(路由)导致缓存(keep-alive)失效 vue3 router-view keeperalive对于同一路径但路径…

【经验分享】搭建本地训练环境知识点及方法

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…

为什么要使用数据仓库?

现状和需求 大量的企业经营性数据&#xff08;订单&#xff0c;库存&#xff0c;原料&#xff0c;付款等&#xff09;在企业的业务运营系统以及其后台的(事务型)数据库中产生的。 企业的决策者需要及时地对这些数据进行归类分析&#xff0c;从中获得企业运营的各种业务特征&a…

CSS|07 标准文档流

标准文档流 一、什么是标准文档流 在制作的 HTML 网页和 PS 画图软件画图时有本质上面的区别: HTML 网页在制作的时候都得遵循一个“流的规则:从左至右、从上至下。 使用 Ps 软件画图时可以在任意地方画图。 <!DOCTYPE html> <html lang"en"> <hea…

JS设计模式之访问者模式

前言 访问者模式&#xff08;Visitor Pattern&#xff09;是一种 行为设计模式&#xff0c;它允许在不改变对象结构的情况下&#xff0c;定义新的操作。 这种模式通过将操作封装在访问者对象中&#xff0c;使得可以在不修改被访问对象的情况下&#xff0c;增加新的功能。 本…