11月最新版付费进群源码自动定位+开源
Nginx 1.22.1 php5.6 mysql5.6
数据库配置:/config/database.php
配置后台域名:config/extra/ip.php
设置伪静态thinkphp
后台账号88886666 密码12345
代码结构

关键代码剖析
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2011 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: luofei614 <weibo.com/luofei614>
// +----------------------------------------------------------------------
// | 修改者: anuo (本权限类在原3.2.3的基础上修改过来的)
// +----------------------------------------------------------------------
use think\Db;
use think\Config;
use think\Session;
use think\Request;
use think\Loader; /*** 权限认证类* 功能特性:* 1,是对规则进行认证,不是对节点进行认证。用户可以把节点当作规则名称实现对节点进行认证。* $auth=new Auth(); $auth->check('规则名称','用户id')* 2,可以同时对多条规则进行认证,并设置多条规则的关系(or或者and)* $auth=new Auth(); $auth->check('规则1,规则2','用户id','and')* 第三个参数为and时表示,用户需要同时具有规则1和规则2的权限。 当第三个参数为or时,表示用户值需要具备其中一个条件即可。默认为or* 3,一个用户可以属于多个用户组(think_auth_group_access表 定义了用户所属用户组)。我们需要设置每个用户组拥有哪些规则(think_auth_group 定义了用户组权限)* 4,支持规则表达式。* 在think_auth_rule 表中定义一条规则时,如果type为1, condition字段就可以定义规则表达式。 如定义{score}>5 and {score}<100* 表示用户的分数在5-100之间时这条规则才会通过。*/
//数据库
/*
-- ----------------------------
-- think_auth_rule,规则表,
-- id:主键,name:规则唯一标识, title:规则中文名称 status 状态:为1正常,为0禁用,condition:规则表达式,为空表示存在就验证,不为空表示按照条件验证
-- ----------------------------
DROP TABLE IF EXISTS `think_auth_rule`;
CREATE TABLE `think_auth_rule` (`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,`name` char(80) NOT NULL DEFAULT '',`title` char(20) NOT NULL DEFAULT '',`type` tinyint(1) NOT NULL DEFAULT '1',`status` tinyint(1) NOT NULL DEFAULT '1',`condition` char(100) NOT NULL DEFAULT '', # 规则附件条件,满足附加条件的规则,才认为是有效的规则PRIMARY KEY (`id`),UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- think_auth_group 用户组表,
-- id:主键, title:用户组中文名称, rules:用户组拥有的规则id, 多个规则","隔开,status 状态:为1正常,为0禁用
-- ----------------------------
DROP TABLE IF EXISTS `think_auth_group`;CREATE TABLE `think_auth_group` (`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,`title` char(100) NOT NULL DEFAULT '',`status` tinyint(1) NOT NULL DEFAULT '1',`rules` char(80) NOT NULL DEFAULT '',PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- think_auth_group_access 用户组明细表
-- uid:用户id,group_id:用户组id
-- ----------------------------
DROP TABLE IF EXISTS `think_auth_group_access`;CREATE TABLE `think_auth_group_access` (`uid` mediumint(8) unsigned NOT NULL,`group_id` mediumint(8) unsigned NOT NULL,UNIQUE KEY `uid_group_id` (`uid`,`group_id`),KEY `uid` (`uid`),KEY `group_id` (`group_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;*/class Auth
{/*** @var object 对象实例*/protected static $instance;/*** 当前请求实例* @var Request*/protected $request;//默认配置protected $config = ['auth_on' => 1, // 权限开关'auth_type' => 1, // 认证方式,1为实时认证;2为登录认证。'auth_group' => 'auth_group', // 用户组数据表名'auth_group_access' => 'auth_group_access', // 用户-用户组关系表'auth_rule' => 'auth_rule', // 权限规则表'auth_user' => 'users', // 用户信息表];public $AuthList_GL = []; //给于外部调用使用/*** 类架构函数* Auth constructor.*/public function __construct(){//可设置配置项 auth, 此配置项为数组。if ($auth = Config::get('auth')) {$this->config = array_merge($this->config, $auth);}// 初始化request$this->request = Request::instance();}/*** 初始化* @access public* @param array $options 参数* @return \think\Request*/public static function instance($options = []){if (is_null(self::$instance)) {self::$instance = new static($options);}return self::$instance;}/*** 检查权限* @param $name string|array 需要验证的规则列表,支持逗号分隔的权限规则或索引数组* @param $uid int 认证用户的id* @param int $type 认证类型* @param string $mode 执行check的模式* @param string $relation 如果为 'or' 表示满足任一条规则即通过验证;如果为 'and'则表示需满足所有规则才能通过验证* @return bool 通过验证返回true;失败返回false*/public function check($name, $uid, $type = 1, $mode = 'url', $relation = 'or'){if (!$this->config['auth_on']) {return true;}// 获取用户需要验证的所有有效规则列表$authList = $this->getAuthList($uid, $type);if (is_string($name)) {$name = strtolower($name);if (strpos($name, ',') !== false) {$name = explode(',', $name);} else {$name = [$name];}}$list = []; //保存验证通过的规则名if ('url' == $mode) {$REQUEST = unserialize(strtolower(serialize($this->request->param())));}foreach ($authList as $auth) {$query = preg_replace('/^.+\?/U', '', $auth);if ('url' == $mode && $query != $auth) {parse_str($query, $param); //解析规则中的param$intersect = array_intersect_assoc($REQUEST, $param);$auth = preg_replace('/\?.*$/U', '', $auth);if (in_array($auth, $name) && $intersect == $param) {//如果节点相符且url参数满足$list[] = $auth;}} else {if (in_array($auth, $name)) {$list[] = $auth;}}}$this->AuthList_GL = $authList;if ('or' == $relation && !empty($list)) {return true;}$diff = array_diff($name, $list);if ('and' == $relation && empty($diff)) {return true;}return false;}/*** 根据用户id获取用户组,返回值为数组* @param $uid int 用户id* @return array 用户所属的用户组 array(* array('uid'=>'用户id','group_id'=>'用户组id','title'=>'用户组名称','rules'=>'用户组拥有的规则id,多个,号隔开'),* ...)*/public function getGroups($uid){static $groups = [];if (isset($groups[$uid])) {return $groups[$uid];}// 转换表名$auth_group_access = Loader::parseName($this->config['auth_group_access'], 1);$auth_group = Loader::parseName($this->config['auth_group'], 1);// 执行查询$user_groups = Db::view($auth_group_access, 'uid,group_id')->view($auth_group, 'title,rules', "{$auth_group_access}.group_id={$auth_group}.id", 'LEFT')->where("{$auth_group_access}.uid='{$uid}' and {$auth_group}.status='1'")->select();$groups[$uid] = $user_groups ?: [];return $groups[$uid];}/*** 获得权限列表* @param integer $uid 用户id* @param integer $type* @return array*/protected function getAuthList($uid, $type){static $_authList = []; //保存用户验证通过的权限列表$t = implode(',', (array)$type);if (isset($_authList[$uid . $t])) {return $_authList[$uid . $t];}if (2 == $this->config['auth_type'] && Session::has('_auth_list_' . $uid . $t)) {return Session::get('_auth_list_' . $uid . $t);}//读取用户所属用户组$groups = $this->getGroups($uid);$ids = []; //保存用户所属用户组设置的所有权限规则idforeach ($groups as $g) {$ids = array_merge($ids, explode(',', trim($g['rules'], ',')));}$ids = array_unique($ids);if (empty($ids)) {$_authList[$uid . $t] = [];return [];}$map = ['id' => ['in', $ids],'type' => $type,'status' => 1];//读取用户组所有权限规则$rules = Db::name($this->config['auth_rule'])->where($map)->field('condition,name')->select();//循环规则,判断结果。$authList = []; //foreach ($rules as $rule) {if (!empty($rule['condition'])) {//根据condition进行验证$user = $this->getUserInfo($uid); //获取用户信息,一维数组$command = preg_replace('/\{(\w*?)\}/', '$user[\'\\1\']', $rule['condition']);@(eval('$condition=(' . $command . ');'));if ($condition) {$authList[] = strtolower($rule['name']);}} else {//只要存在就记录$authList[] = strtolower($rule['name']);}}$_authList[$uid . $t] = $authList;if (2 == $this->config['auth_type']) {//规则列表结果保存到sessionSession::set('_auth_list_' . $uid . $t, $authList);}return array_unique($authList);}/*** 获得用户资料* @param $uid* @return mixed*/protected function getUserInfo($uid){static $user_info = [];$user = Db::name($this->config['auth_user']);// 获取用户表主键$_pk = is_string($user->getPk()) ? $user->getPk() : 'uid';if (!isset($user_info[$uid])) {$user_info[$uid] = $user->where($_pk, $uid)->find();}return $user_info[$uid];}
}
源码获取方式:

相关文章:
11月最新版付费进群源码自动定位+开源
Nginx 1.22.1 php5.6 mysql5.6 数据库配置:/config/database.php 配置后台域名:config/extra/ip.php 设置伪静态thinkphp 后台账号88886666 密码12345 代码结构 关键代码剖析 <?php // ----------------------------------------------------…...
Python算法题集_旋转图像
Python算法题集_旋转图像 题目48:旋转图像1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【矩阵复本】2) 改进版一【矩阵转置矩阵反转】3) 改进版二【四值旋转】 4. 最优算法 题目48:旋转图像 本文为Python算法题集之一…...
[ChatGPT们】ChatGPT 如何辅助编程初探
主页:元存储的博客 全文 9000 字, 原创请勿转载。 我没有写过诗,但有人说我的代码像诗一样优雅 -- 雷军 图片来源:https://www.bilibili.com/video/BV1zL411X7oS/ 1. 引言 作为一个程序员,我们不仅要熟悉各种编程语…...
深入Spring MVC的工作流程
深入Spring MVC的工作流程 在Spring MVC的面试问题中,常常被询问到的一个问题。Spring MVC的程序中,HTTP请求是如何从开始到结束被处理的。为了研究这个问题,我们将需要深入学习一下Spring MVC框架的核心过程和工作流程。 1. 启动请求生命周…...
我的数据结构c(给自己用的)
目录 顺序表: 链表: 栈: 队列: 我想在之后的大学数据结构课上需要自己写来做题,但每次都自己写,那太麻烦了,所以我就将这个博客来把所有的C语言的数据结构弄上去, 问我为什么不…...
使用Arcgis对欧洲雷达高分辨率降水数据重投影
当前需要使用欧洲高分辨雷达降水数据,但是这个数据的投影问题非常头疼。实际的投影应该长这样(https://gist.github.com/kmuehlbauer/645e42a53b30752230c08c20a9c964f9?permalink_comment_id2954366https://gist.github.com/kmuehlbauer/645e42a53b307…...
[Python] scikit-learn中数据集模块介绍和使用案例
sklearn.datasets模块介绍 在scikit-learn中,可以使用sklearn.datasets模块中的函数来构建数据集。这个模块提供了用于加载和生成数据集的函数。 API Reference — scikit-learn 1.4.0 documentation 以下是一些常用的sklearn.datasets模块中的函数 load_iris() …...
Qt-互斥量-临界区-QMutex-QMutexLocker-QReadWriteLock
文章目录 1.QMutex2.QMutexLocker3.QReadWriteLock 在Qt中,互斥量(Mutex)是用于同步多线程访问共享资源的一种机制。临界区(Critical Section)是指一段必须由单个线程执行的代码区域,防止多个线程同时执行这…...
《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述(6)
接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述(5) 4.1 PCIe总线的基础知识 与PCI总线不同,PCIe总线使用端到端的连接方式,在一条PCIe链路的两端只能各连接一个设备,这两个…...
uniapp 高德地图显示
1. uniapp 高德地图显示 使用前需到**高德开放平台(https://lbs.amap.com/)**创建应用并申请Key 登录 高德开放平台,进入“控制台”,如果没有注册账号请先根据页面提示注册账号 打开 “应用管理” -> “我的应用”页面…...
2024年最新幻兽帕鲁服务器搭建教程
玩转幻兽帕鲁服务器,阿里云推出新手0基础一键部署幻兽帕鲁服务器教程,傻瓜式一键部署,3分钟即可成功创建一台Palworld专属服务器,成本仅需26元,阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…...
重新配置vue项目时出现的:连接已断开问题
在新机器上配置完node.js、vue-cli,配置了node_modules后,命令行运行vue ui后,出现了如下报错: C:\Users\LEN>vue ui 🚀 Starting GUI... 🌠 Ready on http://localhost:8000 node:events:496throw e…...
四、Redis之配置文件
redis配置文件的名称 redis.conf 通过命令 find / -name redis.confvim redis.conf通过 : set nu 设置行号: set nonu 取消行号/关键字 搜索关键字: set noh 取消高亮选择4.1 Units 配置大小单位,开头定义了一些基本的度量单位,只支持 bytes&#…...
libevent源码解析--event,event_callback,event_base
1.概述 实现一个基础tcp网络库,以基于tcp网络库构建服务端应用,客户端应用为起点,我们的核心诉求有: a. tcp网络库管理工作线程。 b. tcp网络库产生服务端对象,通过启动接口,开启服务端监听。进一步&…...
C语言进阶之文件操作
一、什么是文件 磁盘上的文件是文件。 但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。 1)程序文件 包括源程序文件(后缀为.c),目标文件ÿ…...
互联网摸鱼日报(2024-02-02)
互联网摸鱼日报(2024-02-02) 博客园新闻 马斯克:Neuralink已探测到神经信号 Linus新年首骂:和谷歌大佬大吵4天,“你的代码就是垃圾” 从零手搓MoE大模型,大神级教程来了 无人出租车深圳中心区收费载客,硅谷同款&am…...
2024美赛C题:网球中的动量
解析:https://mp.weixin.qq.com/s/TOPvJ-5pjgsvjvYXt6E9Fg 2023年温网男篮决赛,20岁的西班牙新星卡洛斯阿尔卡拉斯 击败了36岁的诺瓦克德约科维奇。这场失利是德约科维奇自2013年以来首次在温布尔登输球 并结束了大满贯历史上最伟大的球员之一的非凡表现…...
20.HarmonyOS App(JAVA)表格布局Layout使用方法
ability_main.xml,实现计算器键盘按钮 <?xml version"1.0" encoding"utf-8"?> <TableLayoutxmlns:ohos"http://schemas.huawei.com/res/ohos"ohos:height"match_parent"ohos:width"match_parent"oho…...
Android使用ScrollView导致鼠标点击事件无效
平台 测试平台: RK3288 Android8.1RK3588 Android 12 问题 首先, 这个问题的前提是, 使用的输入设备是**鼠标**, 普通的触摸屏并不会出现这个问题. 大致的流程是APP的UI布局中采用ScrollView作为根容器, 之后添加各类子控件, 在一起准备就绪后, 使用鼠标进行功能测试, 出现…...
【开源】SpringBoot框架开发大学计算机课程管理平台
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2.3 学生实验模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 实验课程档案表3.2.2 实验资源表3.2.3 学生实验表 四、系统展示五、核心代码5.1 一键生成实验5.2 提交实验5.3 批阅实…...
2025届毕业生推荐的降重复率神器实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于学术写作跟内容创作范畴之中,降重网站已然成了规避文本重复率过高的关键辅助工…...
ComfyUI实战:LivePortrait对口型技术深度解析,打造动态人像新体验
1. LivePortrait对口型技术:让静态人像活起来的黑科技 第一次看到LivePortrait生成的效果时,我盯着屏幕愣了三分钟——一张普通的照片竟然能跟着我的语音节奏自然地"说话",连嘴角的微妙颤动都和真人无异。这种魔法般的体验&#x…...
Vibe Coding 有哪些实用技巧?这篇文章讲透工作流、提示词和避坑方法
Vibe Coding 是什么?一篇讲清它的技巧、工作流与避坑方法 这两年,AI 编程工具越来越强,很多开发者开始用自然语言驱动代码生成。围绕这种开发方式,一个很火的词出现了:Vibe Coding。 简单说,Vibe Coding 就…...
如何用MiniAGI进行技术分析:比特币价格预测实战指南
如何用MiniAGI进行技术分析:比特币价格预测实战指南 【免费下载链接】mini-agi MiniAGI is a minimal general-purpose autonomous agent based on GPT-3.5 / GPT-4. Can analyze stock prices, perform network security tests, create art, and order pizza. 项…...
AI赋能:借助快马平台探索openclaw的强化学习与智能任务规划
最近在尝试为机械臂项目openclaw增加AI能力时,发现传统编程方式在复杂任务规划上存在瓶颈。通过InsCode(快马)平台的AI辅助开发功能,我探索出了一套结合强化学习与大语言模型的解决方案框架,分享下具体实现思路: 强化学习环境搭建…...
d2s-editor:突破暗黑破坏神2存档修改限制的网页解决方案
d2s-editor:突破暗黑破坏神2存档修改限制的网页解决方案 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor d2s-editor是一款基于Vue.js开发的网页版暗黑破坏神2存档编辑器,它通过浏览器端即开即用的特性消除…...
简单工厂、工厂方法、抽象工厂的PHP代码区别?
这三个模式名字很像,但解决的问题层级和代码结构完全不同。 简单工厂 (Simple Factory):一个类包办所有创建逻辑(违反开闭原则)。工厂方法 (Factory Method):每个产品对应一个工厂子类(针对一个产品等级&am…...
细说杨乃武与小白菜案
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、案件二、精神分析学---心理防御机制三、关于我自己总结前言 一、案件 略,后面补 二、精神分析学—心理防御机制 在这个案件我主要关注县令和小…...
5W功耗实现25TOPS算力,LM2-100-V0算力模组破解AI安防核心难题
在智慧安防边缘AI应用快速部署需求的背景下,设备制造商常面临终端设备算力不足、功耗超标、体积受限、部署太慢等困境。模型越复杂,终端越吃力;设备要小型化,算力要打折扣;长期稳定运行,散热与功耗又成瓶颈…...
GraceTheme定义“优雅大气”的WordPress主题新标准
网站不仅是信息的载体,更是品牌气质的延伸。无论是企业官网、个人博客还是作品集展示,如何在茫茫网海中脱颖而出,给用户留下深刻的第一印象?答案往往就藏在网站的“气质”之中。如果你正在寻找一款能够完美平衡美学设计与功能实用性的WordPr…...
