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

news2024/12/15 16:52:08

一、开放路由

        在根目录下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.coloradmin.cn/o/2260029.html

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

相关文章

无限弹窗?无限重启?

Windows开机自启目录&#xff1a; "%USERPROFILE%\AppData\Roaming\Microsoft\windows\StartMenu\Programs\Startup" 基于这个和 start 命令&#xff0c; shutdown 命令&#xff0c; 编写 bat 病毒程序。 无限弹窗 echo start cmd > hack.txt echo %0 >>…

6.1 初探MapReduce

MapReduce是一种分布式计算框架&#xff0c;用于处理大规模数据集。其核心思想是“分而治之”&#xff0c;通过Map阶段将任务分解为多个简单任务并行处理&#xff0c;然后在Reduce阶段汇总结果。MapReduce编程模型包括Map和Reduce两个阶段&#xff0c;数据来源和结果存储通常在…

Scripted Pipeline语法简单使用

一、JenkinsFile 语法参数 env_tools 环境工具变量的定义设置位置&#xff1a; “Manage Jenkins”-> “Tools” stage(env tools) {node(test){ //定义maven java环境def mvnHome tool MAVEN_HOME_CentOS//引用环境变量&#xff0c;配置PATH变量env.PATH &qu…

前端退出对话框也就是点击右上角的叉,显示灰色界面,已经解决

文章目录 遇到一个前端bug&#xff0c;点击生成邀请码 打开对话框 然后我再点击叉号&#xff0c;退出对话框&#xff0c;虽然退出了对话框&#xff0c;但是显示灰色界面。如下图&#xff1a; 导致界面就会失效&#xff0c;点击任何地方都没有反应。 发现是如下代码的问题&am…

在 Kibana 中为 Vega Sankey 可视化添加过滤功能

作者&#xff1a;来自 Elastic Tim Bosman 及 Miloš Mandić 有兴趣在 Kibana 中为 Vega 可视化添加交互式过滤器吗&#xff1f;了解如何利用 “kibanaAddFilter” 函数轻松创建动态且响应迅速的 Sankey 可视化。 在这篇博客中&#xff0c;我们将了解如何启用 Vega Sankey 可视…

【实验】【H3CNE邓方鸣】交换机端口安全实验+2024.12.11

实验来源&#xff1a;邓方鸣交换机端口安全实验 软件下载&#xff1a; 华三虚拟实验室: 华三虚拟实验室下载 wireshark&#xff1a;wireshark SecureCRT v8.7 版本: CRT下载分享与破解 文章目录 dot1x 开启802.1X身份验证 开启802.1X身份验证&#xff0c;需要在系统视图和接口视…

qt 封装 调用 dll

这个目录下 &#xff0c;第一个收藏的这个 &#xff0c;可以用&#xff0c; 但是有几个地方要注意 第一.需要将dll的头文件添加到qt的文件夹里面 第二&#xff0c;需要在pro文件里面添加动态库路径 第三&#xff0c;如果调用dll失败&#xff0c;那么大概需要将dll文件放在e…

JS原型及原型链

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

常见的汽车前灯方案

文章目录 1.前言2.前灯方案需求概述3.传统前灯方案3.1 方案描述3.2 常用芯片 4.智能前灯控制器方案4.1 方案描述4.2 常用芯片 5.投影灯方案5.1 DLP5.2 MicroLED模组5.2.1 方案描述5.2.2 常用芯片 1.前言 自从上次分享了汽车贯穿式尾灯之后&#xff0c;也有很多读者发私信咨询汽…

队列+宽搜_429. N 叉树的层序遍历_二叉树最大宽度

429. N 叉树的层序遍历 定义一个队列q&#xff0c;将一层的节点入队&#xff0c;并记录节点个数。根据节点的个数&#xff0c;出队列&#xff0c;并将其孩子入队列。出完队列&#xff0c;队列当前剩余节点的个数就是下次出队列的次数。直到队列为空 /* // Definition for a Nod…

深度剖析 ToF 技术:原理、优劣、数据纠错与工业应用全解析

1 引言 飞行时间&#xff08;Time-of-Flight&#xff0c;简称ToF&#xff09;技术是一种先进的三维成像技术&#xff0c;其工作机制与三维激光扫描技术有着相似之处。ToF技术的主要优势在于其能够一次性捕获整个场景的深度信息&#xff0c;而不是通过逐点扫描的方式来获取&…

嵌入式硬件-- 元器件焊接

1.锡膏的使用 锡膏要保存在冰箱里。 焊接排线端子&#xff1b;138度的低温锡&#xff08;锡膏&#xff09;&#xff0c; 第一次使用&#xff0c;直接拿东西挑一点涂在引脚上&#xff0c;不知道多少合适&#xff0c;加热台加热到260左右&#xff0c;放在上面观察锡融化&#…

一区向量加权算法优化INFO-CNN-SVM卷积神经网络结合支持向量机多特征分类预测

一区向量加权算法优化INFO-CNN-SVM卷积神经网络结合支持向量机多特征分类预测 目录 一区向量加权算法优化INFO-CNN-SVM卷积神经网络结合支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现INFO-CNN-SVM向量加权算法优化卷积神经网络结…

给新ubuntu电脑配置远程控制环境和c++版本的opencv环境

目录 改用户密码安装ssh sever安装net-tools配置vscode安装vim配置C opencv1. 安装g, cmake, make2.安装opencv依赖库3.下载opencv源文件&#xff08;1&#xff09;方法一&#xff1a;官网下载&#xff08;2&#xff09;方法二&#xff1a;GitHub下载方式&#xff1a; 4. Cmake…

(3)spring security - 认识PasswordEncoder

目录 1.简介1.1.简单了解认证流程 2.密码验证3.PasswordEncoder的内置实现4.小结 目标&#xff1a; 简单了解认证的流程简单认识spring security中的Password Encoder 1.简介 还是以这幅图为基础&#xff0c;认识Password Encoder到底是什么&#xff1f; 1.1.简单了解认证流程…

29.在Vue 3中使用OpenLayers读取WKB数据并显示图形

在Web开发中&#xff0c;地理信息系统&#xff08;GIS&#xff09;应用越来越重要&#xff0c;尤其是在地图展示和空间数据分析的场景中。OpenLayers作为一个强大的开源JavaScript库&#xff0c;为开发者提供了丰富的地图展示和空间数据处理能力。在本篇文章中&#xff0c;我将…

LLM大语言模型私有化部署-OpenEuler22.03SP3上容器化部署Dify与Qwen2.5

背景 Dify 是一款开源的大语言模型(LLM) 应用开发平台。其直观的界面结合了 AI 工作流、 RAG 管道、 Agent 、模型管理、可观测性功能等&#xff0c;让您可以快速从原型到生产。相比 LangChain 这类有着锤子、钉子的工具箱开发库&#xff0c; Dify 提供了更接近生产需要的完整…

革新3D高保真数字人生成:无需深度摄像头,普通手机视频即可创建逼真面部动画

在数字化内容创作领域,特别是虚拟人物和增强现实(AR)应用中,高质量的3D数字人生成正变得越来越重要。然而,传统方法依赖于昂贵的深度摄像头和复杂的设备设置,这不仅增加了成本,也限制了其灵活性和易用性。为了解决这些问题,并降低进入门槛,一款基于MetaHuman的插件应运…

【前端 Uniapp】使用Vant打造Uniapp项目(避坑版)

一、基本介绍 Uniapp 是基于 Vue.js 的开发框架&#xff0c;通过一套代码可以同时发布到多个平台的应用框架。而 Vant 是针对移动端 Vue.js 的组件库。通过这样的组合&#xff0c;我们可以快速构建出一个跨平台的移动应用。Vant 已经支持多种小程序和 H5 平台&#xff0c;也对…

【记录】Django解决与VUE跨域问题

1 梗概 这里记录Django与VUE的跨域问题解决方法&#xff0c;主要修改内容是在 Django 中。当然其他的前端项目 Django 也可以这样处理。 2 安装辅助包 pip install django-cors-headers3 配置 settings.py INSTALLED_APPS [ # ... corsheaders, # ... ] 为了响应…