thinkphp6项目初始化配置方案二次修正版本
数据返回统一格式
app/BaseController.php新增文件内容在末尾,并在构造函数中实例化数据模型类
// 成功统一返回格式
function Result($data, $msg = '', $code = 200, $httpCode = 200): \think\response\Json
{$res = ['code' => $code,'msg' => $msg,'data' => $data];return json($res, $httpCode);
}// 成功返回,无数据格式
function ResultOK($msg = 'ok', $code = 200, $httpCode = 200): \think\response\Json
{$res = ['code' => $code,'msg' => $msg,'data' => null];return json($res, $httpCode);
}// 失败返回
function ResultError($msg = "error", $code = 400, $httpCode = 200): \think\response\Json
{$res = ['code' => $code,'msg' => $msg,'data' => null];return json($res, $httpCode);
}
在config目录新建redis.php
<?php
return [//激活Token"active_pre" => "active_account_pre_",//登录Token"token_pre" => "access_token_pre_",//登录Token过期时间"login_expire" => 24 * 3600,//重置密码Token"reset_pre" => "reset_password_pre_",//登录验证码"code_pre" => "login_pre_",//登录验证码过期时间"code_expire" => 120,//登录验证码错误次数"code_error" => 3,//文件数据过期时间"file_expire" => 3600 / 4,
];
修改全局报错返回数据样式app/ExceptionHandle.php
<?php
namespace app;use think\db\exception\DataNotFoundException;
use think\db\exception\ModelNotFoundException;
use think\exception\Handle;
use think\exception\HttpException;
use think\exception\HttpResponseException;
use think\exception\ValidateException;
use think\Response;
use Throwable;/*** 应用异常处理类*/
class ExceptionHandle extends Handle
{/*** 不需要记录信息(日志)的异常类列表* @var array*/protected $ignoreReport = [HttpException::class,HttpResponseException::class,ModelNotFoundException::class,DataNotFoundException::class,ValidateException::class,];/*** 记录异常信息(包括日志或者其它方式记录)** @access public* @param Throwable $exception* @return void*/public function report(Throwable $exception): void{// 使用内置的方式记录异常日志parent::report($exception);}/*** Render an exception into an HTTP response.** @access public* @param \think\Request $request* @param Throwable $e* @return Response*/public function render(\think\Request $request, Throwable $e): Response{// 自定义异常处理机制$response = ['code' => 500,'msg' => $e->getMessage(),'data' => null,];return json($response);}
}
修改缓存配置config/cache.php
<?php// +----------------------------------------------------------------------
// | 缓存设置
// +----------------------------------------------------------------------return [// 默认缓存驱动'default' => 'redis',// 缓存连接方式配置'stores' => ['file' => [// 驱动方式'type' => 'File',// 缓存保存目录'path' => '',// 缓存前缀'prefix' => '',// 缓存有效期 0表示永久缓存'expire' => 0,// 缓存标签前缀'tag_prefix' => 'tag:',// 序列化机制 例如 ['serialize', 'unserialize']'serialize' => [],],// 更多的缓存连接'redis'=>[// 驱动方式'type' => 'redis',// 服务器地址'host' => '****',// 服务器端口'port' => 6379,// 密码'password' => '',// 缓存有效期 0表示永久缓存'expire' => 0]],
];
给用户颁发jwt鉴权证书
安装 firebase/php-jwt:
composer require firebase/php-jwt
创建自定义中间件 Auth:
前置中间件
<?php
namespace app\middleware;use think\Middleware;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use think\facade\Db;
use think\facade\Config;
use think\Request;
use think\Response;class Auth extends Middleware
{public function handle(Request $request, \Closure $next){// 从请求头获取JWT$token = $request->header('Authorization');if (!$token) {return json(['code' => 401, 'msg' => '未提供Token', 'data' => null], 401);}try {// 解析JWT$decoded = JWT::decode($token, new Key(Config::get('app.jwt_secret'), 'HS256'));$userId = $decoded->uid;// 查询用户信息$user = Db::table('staff')->where('id', $userId)->where('status', 1)->find();if (!$user) {return json(['code' => 403, 'msg' => '账户异常', 'data' => null], 403);}// 将用户信息传递给控制器$request->user = $user;} catch (\Exception $e) {return json(['code' => 401, 'msg' => '账号或密码错误', 'data' => null], 401);}return $next($request);}
}相关文章:
thinkphp6项目初始化配置方案二次修正版本
数据返回统一格式 app/BaseController.php新增文件内容在末尾,并在构造函数中实例化数据模型类 // 成功统一返回格式 function Result($data, $msg , $code 200, $httpCode 200): \think\response\Json {$res [code > $code,msg > $msg,data > $data];return j…...
XXE靶机教学
arp-scan -l主机发现 arp-scan -l 端口扫描 nmap -p- 192.168.48.139 服务探测 nmap -p80,5355 -sT -sC -sV 192.168.48.139 目录扫描 dirsearch -u http://192.168.48.139 访问robots.txt 发现两个可访问路径 burp抓包 测试是否存在xxe漏洞 <?xml version "1.…...
干货 | 2024步入数字化转型深水区,云原生业务稳定性如何保障(免费下载)
云原生业务的稳定性保障是一个涉及多个层面的复杂任务,以下是一些关键措施和策略,以确保云原生业务的高效稳定运行: 一、平台安全性评估与加固 云原生平台安全评估:对云原生平台(如Kubernetes、Docker等)…...
for(char c:s),std::vector<int> numbers 和std::int numbers[],.size()和.sizeof()区别
在C中当需要对某个容器或数组进行遍历时我们可以使用以下语句,c将会被赋值为s中的元素 for(char c:s)://s可以是任何满足条件的容器或数组for(int c:s):for(double c:s):for(float c:s):在C中我们来区分std::vector numbers {1, 2, 3, 4, 5};和std::int numbers[] …...
桌面云备份可以删除吗?安不安全
桌面云备份可以删除吗?答案是可以的。如果用户不需要这些备份或者想要释放存储空间,桌面云备份是可以进行删除的,并且删除桌面云备份是一个相对安全的过程,但需要注意以下几点来确保操作的安全性和数据的完整性。 一、桌面云备份…...
【爬虫实战】利用代理爬取电商数据
文章目录 前言工具介绍实战获取网站数据编写代码数据展示 推荐总结 前言 当今电商平台正经历着快速的转型与升级。随着技术的进步和用户需求的多样化,电商不仅从简单的在线购物演变为综合性的购物生态系统,还融合了人工智能、大数据和云计算等先进技术。…...
python如何统计列表中元素出现的次数
在 Python 中,可以使用多种方法来统计列表中元素出现的次数。以下是一些常用的方法: 方法 1: 使用 count() 方法 list 对象有一个内置的 count() 方法,可以直接统计某个元素在列表中出现的次数。 my_list [1, 2, 3, 2, 1, 4, 2] count_of…...
【算法】山脉数组的峰顶索引
难度:中等 题目描述: 给定一个长度为 n 的整数 山脉 数组 arr ,其中的值递增到一个 峰值元素 然后递减。 返回峰值元素的下标。 你必须设计并实现时间复杂度为 O(log(n)) 的解决方案。 示例 1: 输入:arr [0,1,0]…...
牛客 JZ31.栈的压入,弹出序列 C++写法
牛客 JZ31.栈的压入,弹出序列 C写法 思路🤔: 创建一个栈,push压入序列,然后用栈顶跟弹出序列比,如果一样就出栈并且继续比较,不一样就再次push入栈,直到压入序列走完,如果…...
PageHelper在Mybatis的一对多表关联时total数错误
最近在学习PageHelper遇到一个bug记录一下: 在Mybatis的一对多表中,PageHelper获取的total是所有的记录数,而不是我想要的第一次sql的记录数。 解决方案1: 不要在mapper层获取一对多关联,在service层先获取一&#…...
(20240806)硫氧镁 / 碱式硫酸镁-混凝土
一、目录 一篇博士论文,5篇硕士论文,南京航空航天大学双一流211,60。余红发团队 具体涉及到 (1) 碱式硫酸镁水泥的混凝土应用 、(一篇博士论文) 有微观分析 (2)混…...
string类的模拟实现(C++)
一、前言 想要模拟实现一个库中的类,那就要首先要熟悉如何使用这个类。建议通过下面博客,完成对Cstring类的学习。 C的string类-CSDN博客 二、模拟实现 我们将从string的成员函数即成员变量入手,模拟实现string类。 成员变量 string类的…...
C++_sizeof的相关知识点
1.指针的大小永远是固定的,取决于处理器位数,32位就是 4 字节,64位就是 8 字节 2.数组作为函数参数时会退化为指针,大小要按指针的计算 int func(char array[]) {printf("sizeof%d\n", sizeof(array));printf("s…...
Istio Proxy的Envoy代理架构中,Upstream提供的功能是:
Istio Proxy的Envoy代理架构中,Upstream提供的功能是: A. 接收来自Envoy连接和请求的主机,并返回响应 B. 连接的一组逻辑相同的上游主机 C. 将下游主机连接到Envoy的主机,用来发送请求并接受响应 选择A Istio Proxy的Envoy代理架…...
LeetCode 热题 HOT 100 (015/100)【宇宙最简单版】
【栈】No. 0155 最小栈【中等】👉力扣对应题目指路 希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持! …...
【HarmonyOS】鸿蒙应用实现截屏
【HarmonyOS】鸿蒙应用实现截屏 组件截屏 通过componentSnapshot的get函数,将需要截图的组件设置id传进去即可。 import { componentSnapshot } from kit.ArkUI; import { image } from kit.ImageKit;/*** 截图*/ Entry Component Preview struct SnapShotPage {S…...
Conda包依赖侦探:conda inspect命令全解析
Conda包依赖侦探:conda inspect命令全解析 在Conda环境中,管理包及其依赖关系是一项重要任务。conda inspect命令是一个强大的工具,它可以提供包的详细信息,包括依赖关系、链接、版本等。这对于诊断环境问题、理解包的依赖结构以…...
数模——灰色关联分析算法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 一、基本概念了解 1.什么是灰色系统? 2.什么是关联分析? 二、模型原理 三、建模过程 1.找母序列(参考序列&am…...
Python爬虫技术 第27节 API和RESTful服务
Python 爬虫技术是一种自动化获取网页内容的方法,通常用于数据收集、信息抽取或自动化测试。在讲解 Python 爬虫技术时,我们通常会涉及到以下几个关键概念: HTTP 请求:爬虫通过发送 HTTP 请求来获取网页内容,这是爬虫与…...
音视频入门基础:WAV专题(4)——FFmpeg源码中获取WAV文件音频压缩编码格式、采样频率、声道数量、采样位数、码率的实现
音视频入门基础:WAV专题系列文章: 音视频入门基础:WAV专题(1)——使用FFmpeg命令生成WAV音频文件 音视频入门基础:WAV专题(2)——WAV格式简介 音视频入门基础:WAV专题…...
为什么92.7%的企业AIGC项目在2026Q1前将遭遇语义坍塌?——奇点大会文本生成分论坛深度解码
第一章:语义坍塌:AIGC产业演进中的隐性奇点 2026奇点智能技术大会(https://ml-summit.org) 当生成式模型在训练数据中反复采样、蒸馏、再合成,语言不再是意义的载体,而退化为统计共振的残响——这并非模型失效,而是语…...
从ISO 17987协议到代码:一文搞懂LIN唤醒信号的CANoe自动化测试怎么写
从ISO 17987协议到代码:LIN唤醒信号的CANoe自动化测试实战指南 在汽车电子系统开发中,LIN总线作为CAN总线的补充,广泛应用于车门模块、座椅控制、空调系统等对实时性要求不高的场景。网络管理是LIN总线开发中的关键环节,其中唤醒机…...
SparkFun SPI SerialFlash库深度解析:嵌入式Flash驱动开发指南
1. SparkFun SPI SerialFlash Arduino 库深度解析:面向嵌入式工程师的串行 Flash 驱动开发指南串行 Flash 存储器(Serial Flash)是嵌入式系统中不可或缺的非易失性数据载体,广泛应用于固件存储、配置参数保存、日志记录、OTA 升级…...
Simcenter 3D声学仿真避坑指南:直接法vs模态法,响应计算到底选哪个?(基于SOL 108和SOL 111)
Simcenter 3D声学仿真方法论抉择:直接法与模态法的深度技术解析 当面对一个声学仿真项目时,工程师们常常站在十字路口犹豫不决——是选择直接频率响应法(SOL 108)还是基于模态的频率响应法(SOL 111)&#x…...
FT62X6电容触摸驱动开发:嵌入式裸机与RTOS双环境实践
1. TAMC_FT62X6 库深度解析:面向嵌入式系统的 FT62X6 电容式触摸屏驱动开发实践1.1 芯片级认知:FT62X6 的硬件本质与工程定位FT62X6 是由敦泰电子(FocalTech Systems)推出的单点/多点电容式触摸控制器,广泛应用于中小尺…...
Zotero茉莉花插件:中文文献管理神器,让你告别繁琐的手动录入
Zotero茉莉花插件:中文文献管理神器,让你告别繁琐的手动录入 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum …...
all-MiniLM-L6-v2技术解析:为何22.7MB模型能在256token长度下保持鲁棒性
all-MiniLM-L6-v2技术解析:为何22.7MB模型能在256token长度下保持鲁棒性 1. 模型架构与设计理念 all-MiniLM-L6-v2是一个令人印象深刻的轻量级句子嵌入模型,它基于BERT架构但进行了精心的优化设计。这个模型的核心目标是在保持高质量语义表示能力的同时…...
从极简设计到高效标注:gInk屏幕标注工具的技术解析与实践指南
从极简设计到高效标注:gInk屏幕标注工具的技术解析与实践指南 【免费下载链接】gInk An easy to use on-screen annotation software inspired by Epic Pen. 项目地址: https://gitcode.com/gh_mirrors/gi/gInk gInk是一款面向Windows平台的轻量级屏幕标注工…...
如何用Office RibbonX Editor轻松实现Office功能区定制
如何用Office RibbonX Editor轻松实现Office功能区定制 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/gh_mirrors/of/office-ribbonx-editor 你是…...
Phi-3 Forest Lab应用场景:技术布道师内容生成器——将复杂概念转化为森林隐喻文案
Phi-3 Forest Lab应用场景:技术布道师内容生成器——将复杂概念转化为森林隐喻文案 1. 项目背景与核心价值 在技术传播领域,如何将复杂的AI概念转化为大众易于理解的内容,一直是技术布道师面临的挑战。Phi-3 Forest Lab通过创新的自然隐喻系…...
