当前位置: 首页 > news >正文

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 数据库配置&#xff1a;/config/database.php 配置后台域名&#xff1a;config/extra/ip.php 设置伪静态thinkphp 后台账号88886666 密码12345 代码结构 关键代码剖析 <?php // ----------------------------------------------------…...

Python算法题集_旋转图像

Python算法题集_旋转图像 题目48&#xff1a;旋转图像1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【矩阵复本】2) 改进版一【矩阵转置矩阵反转】3) 改进版二【四值旋转】 4. 最优算法 题目48&#xff1a;旋转图像 本文为Python算法题集之一…...

[ChatGPT们】ChatGPT 如何辅助编程初探

主页&#xff1a;元存储的博客 全文 9000 字&#xff0c; 原创请勿转载。 我没有写过诗&#xff0c;但有人说我的代码像诗一样优雅 -- 雷军 图片来源&#xff1a;https://www.bilibili.com/video/BV1zL411X7oS/ 1. 引言 作为一个程序员&#xff0c;我们不仅要熟悉各种编程语…...

深入Spring MVC的工作流程

深入Spring MVC的工作流程 在Spring MVC的面试问题中&#xff0c;常常被询问到的一个问题。Spring MVC的程序中&#xff0c;HTTP请求是如何从开始到结束被处理的。为了研究这个问题&#xff0c;我们将需要深入学习一下Spring MVC框架的核心过程和工作流程。 1. 启动请求生命周…...

我的数据结构c(给自己用的)

目录 顺序表&#xff1a; 链表&#xff1a; 栈&#xff1a; 队列&#xff1a; 我想在之后的大学数据结构课上需要自己写来做题&#xff0c;但每次都自己写&#xff0c;那太麻烦了&#xff0c;所以我就将这个博客来把所有的C语言的数据结构弄上去&#xff0c; 问我为什么不…...

使用Arcgis对欧洲雷达高分辨率降水数据重投影

当前需要使用欧洲高分辨雷达降水数据&#xff0c;但是这个数据的投影问题非常头疼。实际的投影应该长这样&#xff08;https://gist.github.com/kmuehlbauer/645e42a53b30752230c08c20a9c964f9?permalink_comment_id2954366https://gist.github.com/kmuehlbauer/645e42a53b307…...

[Python] scikit-learn中数据集模块介绍和使用案例

sklearn.datasets模块介绍 在scikit-learn中&#xff0c;可以使用sklearn.datasets模块中的函数来构建数据集。这个模块提供了用于加载和生成数据集的函数。 API Reference — scikit-learn 1.4.0 documentation 以下是一些常用的sklearn.datasets模块中的函数 load_iris() …...

Qt-互斥量-临界区-QMutex-QMutexLocker-QReadWriteLock

文章目录 1.QMutex2.QMutexLocker3.QReadWriteLock 在Qt中&#xff0c;互斥量&#xff08;Mutex&#xff09;是用于同步多线程访问共享资源的一种机制。临界区&#xff08;Critical Section&#xff09;是指一段必须由单个线程执行的代码区域&#xff0c;防止多个线程同时执行这…...

《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述(6)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述&#xff08;5&#xff09; 4.1 PCIe总线的基础知识 与PCI总线不同&#xff0c;PCIe总线使用端到端的连接方式&#xff0c;在一条PCIe链路的两端只能各连接一个设备&#xff0c;这两个…...

uniapp 高德地图显示

1. uniapp 高德地图显示 使用前需到**高德开放平台&#xff08;https://lbs.amap.com/&#xff09;**创建应用并申请Key   登录 高德开放平台&#xff0c;进入“控制台”&#xff0c;如果没有注册账号请先根据页面提示注册账号   打开 “应用管理” -> “我的应用”页面…...

2024年最新幻兽帕鲁服务器搭建教程

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…...

重新配置vue项目时出现的:连接已断开问题

在新机器上配置完node.js、vue-cli&#xff0c;配置了node_modules后&#xff0c;命令行运行vue ui后&#xff0c;出现了如下报错&#xff1a; C:\Users\LEN>vue ui &#x1f680; Starting GUI... &#x1f320; 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 配置大小单位&#xff0c;开头定义了一些基本的度量单位&#xff0c;只支持 bytes&#…...

libevent源码解析--event,event_callback,event_base

1.概述 实现一个基础tcp网络库&#xff0c;以基于tcp网络库构建服务端应用&#xff0c;客户端应用为起点&#xff0c;我们的核心诉求有&#xff1a; a. tcp网络库管理工作线程。 b. tcp网络库产生服务端对象&#xff0c;通过启动接口&#xff0c;开启服务端监听。进一步&…...

C语言进阶之文件操作

一、什么是文件 磁盘上的文件是文件。 但是在程序设计中&#xff0c;我们一般谈的文件有两种&#xff1a;程序文件、数据文件&#xff08;从文件功能的角度来分类的&#xff09;。 1&#xff09;程序文件 包括源程序文件&#xff08;后缀为.c&#xff09;,目标文件&#xff…...

互联网摸鱼日报(2024-02-02)

互联网摸鱼日报(2024-02-02) 博客园新闻 马斯克&#xff1a;Neuralink已探测到神经信号 Linus新年首骂&#xff1a;和谷歌大佬大吵4天&#xff0c;“你的代码就是垃圾” 从零手搓MoE大模型&#xff0c;大神级教程来了 无人出租车深圳中心区收费载客&#xff0c;硅谷同款&am…...

2024美赛C题:网球中的动量

解析&#xff1a;https://mp.weixin.qq.com/s/TOPvJ-5pjgsvjvYXt6E9Fg 2023年温网男篮决赛&#xff0c;20岁的西班牙新星卡洛斯阿尔卡拉斯 击败了36岁的诺瓦克德约科维奇。这场失利是德约科维奇自2013年以来首次在温布尔登输球 并结束了大满贯历史上最伟大的球员之一的非凡表现…...

20.HarmonyOS App(JAVA)表格布局Layout使用方法

ability_main.xml&#xff0c;实现计算器键盘按钮 <?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 批阅实…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...