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

群控系统服务端开发模式-应用开发-登录退出发送邮件

一、登录成功发送邮件

        在根目录下app文件夹下controller文件夹下common文件夹下,修改Login.php,代码如下

<?php
/*** 登录退出操作* User: 龙哥·三年风水* Date: 2024/10/29* Time: 15:53*/
namespace app\controller\common;
use app\controller\Emptys;
use app\model\permission\Admin;
use app\model\param\System as SystemModel;
use Email\EmailSender;
use Redis\Redis;
use app\model\common\Token as TokenModel;
use Encipher\Encrypt;
class Login extends Emptys
{//验证码展示public function getCode(){$re = app()->make(\Other\Captcha::class)->create();$base64 = 'data:image/png;base64,' . base64_encode($re->getData());return succ('SUCCESS',$base64);}//登录public function doLogin(){$param = $this->request->param();$validate = new \app\validate\common\Login;$result = $validate->check($param);//参数验证if (!$result) return err($validate->getError());//验证码的正确性if (!app()->make(\Other\Captcha::class)->check($param['captcha_code'])) return err('验证码错误');if (time() + 5 < strtotime($param['login_time'])) return err('非法登录');$resData = Admin::dataFind(['email' => trim($param['username'])], 'id,realname,password,ip,status', true);//用户信息的正确性if (empty($resData) && empty($resData['id'])) return err('用户不存在');if ($resData['status'] !== 1) return err('该账号已被禁用');$systemParam = SystemModel::dataFind(['id' => 1],'security_password,platform_token_expira');if ($resData['password'] !== sha1($param['password'] . $systemParam['security_password'])) return err('账号对应的密码错误');if(!empty($resData['ip'])){if($resData['ip'] != $this->request->header('x-real-ip'))return err('禁止访问,不在IP白名单中');}//写入Token日志$data['token_type'] = 1;$data['menu_name'] = 'CommonLoginDoLogin';$data['admin_id'] = $resData['id'];$data['random_number'] = alnum();$data['create_time'] = date('Y-m-d',strtotime($param['login_time']));$data['login_time'] = $param['login_time'];$data['expire_time'] = strtotime($param['login_time']) + $systemParam['platform_token_expira'];$token = $data['admin_id'] . $data['random_number'];$data['token'] = sha1(sha1($token) . strtotime($data['login_time']));TokenModel::save($data,[]);//加入跨站攻击验证队列Redis::select(config('cache.stores.redis.token_db'))->setex('token_' . $data['token'],$systemParam['platform_token_expira'],$resData['id']);Redis::select(config('cache.stores.redis.token_db'))->setex('token_' . $resData['id'],$systemParam['platform_token_expira'],Encrypt::encryptRsa($data['token']));$emailSender = new EmailSender();$emailSender::send($param['username'],'登录系统',$resData['realname'].'于'.$param['login_time'].'登录系统');return succ('登录成功',Encrypt::encryptRsa($token));}
}

二、退出成功发送邮件

        1、更改前端apijs文件

                在根目录下src文件夹下api文件夹下,修改common.js文件,代码如下:

// 退出
export function logout() {return request({url: '/permission/member/logout',method: 'post'})
}

        2、后端api更改路由

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

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
use think\facade\Route;Route::get('think', function () {return 'hello,ThinkPHP6!';
});
Route::post('index/index','Index/index');// 测试使用
Route::post('index/generate_rsa','Index/generateRsa');// 生成rsa公私钥文件使用
// 特殊操作
Route::get('login/get_code', 'common.Login/getCode');// 获取验证码使用
Route::post('login/do_login', 'common.Login/doLogin');// 登录提交接口
Route::post('upload/file','common.Upload/file');// 上传文件接口
Route::post('publics/get_info','common.Publics/getInfo');// 获取公有数据接口
Route::group('permission',function (){// 个人资料Route::post('member/personal_data','permission.Member/personalData');// 获取个人信息接口Route::post('member/personal_menu','permission.Member/personalMenu');// 获取个人菜单接口Route::post('member/update_personal','permission.Member/updatePersonal');// 修改个人信息接口Route::post('member/logout', 'permission.Member/logout');// 退出登录接口// 管理员操作Route::get('admin/get_list','permission.Admin/getList');// 获取管理员列表Route::post('admin/get_all','permission.Admin/getAll');// 获取管理员所有数据Route::post('admin/get_info','permission.Admin/getInfo');// 获取管理员单条数据Route::post('admin/save_info','permission.Admin/saveInfo');// 保存管理员数据Route::post('admin/status_info','permission.Admin/statusInfo');// 启禁用管理员Route::post('admin/delete_info','permission.Admin/deleteInfo');// 删除管理员// 角色操作Route::get('role/get_list','permission.Role/getList');// 获取角色列表Route::post('role/get_all','permission.Role/getAll');// 获取所有角色数据Route::post('role/get_info','permission.Role/getInfo');// 获取单个角色数据Route::post('role/save_info','permission.Role/saveInfo');// 保存角色数据Route::post('role/status_info','permission.Role/statusInfo');// 启禁用角色数据Route::post('role/delete_info','permission.Role/deleteInfo');// 删除角色数据// 菜单操作Route::post('menu/get_all','permission.Menu/getAll');// 获取所有菜单数据Route::post('menu/get_info','permission.Menu/getInfo');// 获取单个菜单数据Route::post('menu/save_info','permission.Menu/saveInfo');// 保存菜单数据Route::post('menu/status_info','permission.Menu/statusInfo');// 启禁用菜单数据Route::post('menu/delete_info','permission.Menu/deleteInfo');// 删除菜单数据});
Route::group('param',function (){//系统配置Route::post('system/get_info','param.System/getInfo');// 获取系统参数数据Route::post('system/save_info','param.System/saveInfo');// 保存系统参数数据//上传配置Route::post('upload/get_info','param.Upload/getInfo');// 获取上传参数数据Route::post('upload/save_info','param.Upload/saveInfo');// 保存上传参数数据//短信配置Route::post('channel_sms/get_info','param.ChannelSms/getInfo');// 获取邮箱短信参数数据Route::post('channel_sms/save_info','param.ChannelSms/saveInfo');// 保存邮箱短信参数数据//邮件配置Route::post('channel_email/get_info','param.ChannelEmail/getInfo');// 获取邮箱短信参数数据Route::post('channel_email/save_info','param.ChannelEmail/saveInfo');// 保存邮箱短信参数数据// 图片格式操作Route::get('image/get_list','param.Image/getList');// 获取图片格式列表Route::post('image/get_all','param.Image/getAll');// 获取所有图片格式数据Route::post('image/get_info','param.Image/getInfo');// 获取单个图片格式数据Route::post('image/save_info','param.Image/saveInfo');// 保存图片格式数据Route::post('image/status_info','param.Image/statusInfo');// 启禁用图片格式数据Route::post('image/delete_info','param.Image/deleteInfo');// 删除图片格式数据// 视频格式操作Route::get('video/get_list','param.Video/getList');// 获取视频格式列表Route::post('video/get_all','param.Video/getAll');// 获取所有视频格式数据Route::post('video/get_info','param.Video/getInfo');// 获取单个视频格式数据Route::post('video/save_info','param.Video/saveInfo');// 保存视频格式数据Route::post('video/status_info','param.Video/statusInfo');// 启禁用视频格式数据Route::post('video/delete_info','param.Video/deleteInfo');// 删除视频格式数据// 文件格式操作Route::get('filedoc/get_list','param.Filedoc/getList');// 获取文件格式列表Route::post('filedoc/get_all','param.Filedoc/getAll');// 获取所有文件格式数据Route::post('filedoc/get_info','param.Filedoc/getInfo');// 获取单个文件格式数据Route::post('filedoc/save_info','param.Filedoc/saveInfo');// 保存文件格式数据Route::post('filedoc/status_info','param.Filedoc/statusInfo');// 启禁用文件格式数据Route::post('filedoc/delete_info','param.Filedoc/deleteInfo');// 删除文件格式数据// 部门配置操作Route::get('department/get_list','param.Department/getList');// 获取部门配置列表Route::post('department/get_all','param.Department/getAll');// 获取所有部门配置数据Route::post('department/get_info','param.Department/getInfo');// 获取单个部门配置数据Route::post('department/save_info','param.Department/saveInfo');// 保存部门配置数据Route::post('department/status_info','param.Department/statusInfo');// 启禁用部门配置数据Route::post('department/delete_info','param.Department/deleteInfo');// 删除部门配置数据// 级别配置操作Route::get('grade/get_list','param.Grade/getList');// 获取级别配置列表Route::post('grade/get_all','param.Grade/getAll');// 获取所有级别配置数据Route::post('grade/get_info','param.Grade/getInfo');// 获取单个级别配置数据Route::post('grade/save_info','param.Grade/saveInfo');// 保存级别配置数据Route::post('grade/status_info','param.Grade/statusInfo');// 启禁用级别配置数据Route::post('grade/delete_info','param.Grade/deleteInfo');// 删除级别配置数据// 邮箱配置操作Route::get('sms/get_list','param.Sms/getList');// 获取短信配置列表Route::post('sms/get_all','param.Sms/getAll');// 获取所有短信配置数据Route::post('sms/get_info','param.Sms/getInfo');// 获取单个短信配置数据Route::post('sms/save_info','param.Sms/saveInfo');// 保存短信配置数据Route::post('sms/status_info','param.Sms/statusInfo');// 启禁用短信配置数据Route::post('sms/delete_info','param.Sms/deleteInfo');// 删除短信配置数据
});
Route::miss('Emptys/index');

        3、添加退出方法

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

<?php
/*** 个人信息控制-也就是登录者信息及角色对外方法* User: 龙哥·三年风水* Date: 2024/10/30* Time: 14:18*/
namespace app\controller\permission;
use app\controller\Base;
use app\model\param\Department as PDModel;
use app\model\param\Grade as PGModel;
use app\model\permission\Role as PRModel;
use app\model\param\System as PSModel;
use app\model\permission\Admin as PAModel;
use Other\Tree;
use Redis\Redis;
use app\model\permission\Menu as PMModel;
use Email\EmailSender;
use app\model\common\Token as TokenModel;
class Member extends Base
{/*** 获取个人信息* User: 龙哥·三年风水* Date: 2024/10/30* Time: 14:23* @ return \think\response\Json*/public function personalData(){$data = [];$data['username'] = $this->username;$data['avatar'] = $this->avatar;$data['email'] = $this->email;$data['realname'] = $this->realname;$data['ip'] = empty($this->ip) ? '' : $this->ip;$departmentTitle = PDModel::dataFind(['id' => $this->departmentId],'title',false);$data['department_title'] = empty($departmentTitle) ? '' : $departmentTitle;$gradeTitle = PGModel::dataFind(['id' => $this->gradeId],'title',false);$data['grade_title'] = empty($gradeTitle) ? '' : $gradeTitle;$data['rolename'] = PRModel::dataFind(['id' => $this->roleId],'rolename',false);$res = $this->getRoleMenu();$data['key'] = $res['key'];$data['butt'] = $res['butts'];return succ('操作成功',$data);}/*** 登录者菜单权限* User: 龙哥·三年风水* Date: 2024/11/5* Time: 17:32* @ return \think\response\Json*/public function personalMenu(){$listMenu = unserialize(Redis::select(config('cache.stores.redis.cache_db'))->get('menu_list'.$this->userId));if($listMenu === false){if(count($this->rules) == 0)$this->setAuth();$listMenu = PMModel::getAll([['id', 'in', $this->rules], ['status', '=', 1], ['is_menu', '=', 1]], 'id,menuname,pid,title,path,component,icon,redirect,always_show,is_hidden,is_icon,is_cache','sort DESC,id DESC');if(empty($listMenu)) return err("该用户没有权限");$seconds = rand(60,120);Redis::select(config('cache.stores.redis.cache_db'))->setex('menu_list'.$this->userId,$seconds,serialize($listMenu));}$data['menu'] = Tree::list_to_tree($listMenu,0, 'id', 'pid', 'children');return succ('操作成功',$data);}/*** 修改个人资料* User: 龙哥·三年风水* Date: 2024/11/5* Time: 9:31*/public function updatePersonal(){$param = $this->request->param();$validate = new \app\validate\permission\UpdateAdmin;$param['id'] = $this->userId;if (!$validate->check($param)) return err($validate->getError());if(!empty($param['password'])){$securityPassword = PSModel::dataFind(['id' => 1],'security_password')['security_password'];$data['password'] = sha1($param['password'] . $securityPassword);}$data['username'] = $param['username'];$data['avatar'] = empty($param['avatar']) ? $this->avatar : $param['avatar'];$data['realname'] = $param['realname'];$data['email'] = $param['email'];PAModel::redisSave($data, $this->userId);return succ('操作成功',[]);}//退出public function logout(){$redisToken = Redis::select(config('cache.stores.redis.token_db'))->get('token_' . $this->token);if(!empty($redisToken)){$emailSender = new EmailSender();$emailSender::send($this->email,'退出系统',$this->realname.'于'.date('Y-m-d H:i:s',time()).'退出系统');TokenModel::save(['expire_time' => time()], ['token' => $this->token]);Redis::select(config('cache.stores.redis.token_db'))->del('token_' . $redisToken);Redis::select(config('cache.stores.redis.token_db'))->del('token_' . $this->token);}return succ('退出成功');}
}

        4、删除登录文件里面的退出方法

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

<?php
/*** 登录退出操作* User: 龙哥·三年风水* Date: 2024/10/29* Time: 15:53*/
namespace app\controller\common;
use app\controller\Emptys;
use app\model\permission\Admin;
use app\model\param\System as SystemModel;
use Email\EmailSender;
use Redis\Redis;
use app\model\common\Token as TokenModel;
use Encipher\Encrypt;
class Login extends Emptys
{//验证码展示public function getCode(){$re = app()->make(\Other\Captcha::class)->create();$base64 = 'data:image/png;base64,' . base64_encode($re->getData());return succ('SUCCESS',$base64);}//登录public function doLogin(){$param = $this->request->param();$validate = new \app\validate\common\Login;$result = $validate->check($param);//参数验证if (!$result) return err($validate->getError());//验证码的正确性if (!app()->make(\Other\Captcha::class)->check($param['captcha_code'])) return err('验证码错误');if (time() + 5 < strtotime($param['login_time'])) return err('非法登录');$resData = Admin::dataFind(['email' => trim($param['username'])], 'id,realname,password,ip,status', true);//用户信息的正确性if (empty($resData) && empty($resData['id'])) return err('用户不存在');if ($resData['status'] !== 1) return err('该账号已被禁用');$systemParam = SystemModel::dataFind(['id' => 1],'security_password,platform_token_expira');if ($resData['password'] !== sha1($param['password'] . $systemParam['security_password'])) return err('账号对应的密码错误');if(!empty($resData['ip'])){if($resData['ip'] != $this->request->header('x-real-ip'))return err('禁止访问,不在IP白名单中');}//写入Token日志$data['token_type'] = 1;$data['menu_name'] = 'CommonLoginDoLogin';$data['admin_id'] = $resData['id'];$data['random_number'] = alnum();$data['create_time'] = date('Y-m-d',strtotime($param['login_time']));$data['login_time'] = $param['login_time'];$data['expire_time'] = strtotime($param['login_time']) + $systemParam['platform_token_expira'];$token = $data['admin_id'] . $data['random_number'];$data['token'] = sha1(sha1($token) . strtotime($data['login_time']));TokenModel::save($data,[]);//加入跨站攻击验证队列Redis::select(config('cache.stores.redis.token_db'))->setex('token_' . $data['token'],$systemParam['platform_token_expira'],$resData['id']);Redis::select(config('cache.stores.redis.token_db'))->setex('token_' . $resData['id'],$systemParam['platform_token_expira'],Encrypt::encryptRsa($data['token']));$emailSender = new EmailSender();$emailSender::send($param['username'],'登录系统',$resData['realname'].'于'.$param['login_time'].'登录系统');return succ('登录成功',Encrypt::encryptRsa($token));}
}

相关文章:

群控系统服务端开发模式-应用开发-登录退出发送邮件

一、登录成功发送邮件 在根目录下app文件夹下controller文件夹下common文件夹下&#xff0c;修改Login.php&#xff0c;代码如下 <?php /*** 登录退出操作* User: 龙哥三年风水* Date: 2024/10/29* Time: 15:53*/ namespace app\controller\common; use app\controller\Em…...

app-2 App 应用抓包之 Postern+Charles

一、前言 本篇是基于 Postern Charles 方式对安卓应用数据包进行抓取。可以抓取到市面上大多数的app数据包。 二、环境准备 postern&#xff1a;postern下载地址 charles&#xff1a;Charles 4.5.6 中文版(便携免安装).rar 提取码&#xff1a;6d8f 三、配置及抓包测试 3.…...

cnocr配置及训练测试

cnocr配置及训练测试 1&#xff0c;相关链接2&#xff0c;已有模型调用测试&#xff08;1&#xff09;下载相关模型&#xff08;2&#xff09;Cnstd文本检测模型&#xff08;3&#xff09;模型调用解析脚本 3&#xff0c;自定义数据集训练测试&#xff08;1&#xff09;标签转换…...

【优选算法 前缀和】前缀和算法模板详解:一维前缀 & 与二维前缀和

一维前缀和 题目解析 算法原理 解法一&#xff1a;暴力解法 简单模拟&#xff0c;读完题意有 q 次询问&#xff0c;给哪两个数&#xff0c;就求哪段区间的和并且返回&#xff0c;这样的做法&#xff0c;时间复杂度为O(N*q)&#xff0c;这个时间复杂度会超时&#xf…...

【记录】用JUnit 4的@Test注解时报错java.lang.NullPointerException的原因与解决方法

项目场景&#xff1a; 在练习黑马点评的逻辑过期解决缓存击穿时&#xff0c;编写了一个预热缓存数据的单元测试 SpringBootTest public class HmDianPingApplicationTests {Resourceprivate ShopServiceImpl shopService;Testpublic void testSaveShop() throws InterruptedE…...

Transformer入门(6)Transformer编码器的前馈网络、加法和归一化模块

文章目录 7.前馈网络8.加法和归一化组件9.组合所有编码器组件构成完整编码器 7.前馈网络 编码器块中的前馈网络子层如下图所示&#xff1a; 图1.32 – 编码器块 前馈网络由两个带有ReLU激活函数的全连接层组成。全连接层&#xff08;Fully Connected Layer&#xff09;有时也…...

(七)腾讯cloudstudio+Stable-Diffusion-webui AI绘画教程-安装Stable-Diffusion-WebUI

一、说明 本文选择安装stable-diffusion-webui最新版本 cloud studio 免费版最大的问题是空间不足&#xff0c;我晚上上传时超过了硬盘大小&#xff0c;直接不能启动&#xff0c;没办法&#xff0c;删除&#xff0c;又建了一个工作空间 二、安装 1、打开终端 2、配置Git代理…...

算法基础Day7(动态规划)

文章目录 1.题目2.题目解答1.第N个泰波那契数题目及题目解析动态规划算法学习1.状态表示2.状态转移方程3.初始化4.填表顺序5.空间优化 代码提交空间优化 2.三步问题题目及题目解析算法学习代码提交 1.题目 1137. 第 N 个泰波那契数 - 力扣&#xff08;LeetCode&#xff09;面试…...

代理IP地址和端口是什么?怎么进行设置?

保护个人隐私、突破地域限制、提升网络安全性是我们不断追求的目标。IP地址与端口一种实现这些目标的重要工具。但是&#xff0c;你可能对它是什么&#xff0c;以及如何设置感到困惑。别担心&#xff0c;本文将为你揭开这些神秘的面纱&#xff0c;让你轻松掌握这项技能。 1.IP…...

一文详解TCP协议 [图文并茂, 明了易懂]

欢迎来到啊妮莫的学习小屋! 目录 什么是TCP协议 TCP协议特点✨ TCP报文格式 三次握手和四次挥手✨ 可靠性 效率性 基于字节流✨ 基于TCP的应用层协议 什么是TCP协议 TCP(传输控制协议, Transmission Control Protocol) 是一种面向连接的, 可靠的, 基于字节流的传输层通…...

js后端开发之Next.js、Nuxt.js 与 Express.js

后端js之Next.js、Nuxt.js 与 Express.js 在现代 Web 开发中&#xff0c;JavaScript 已经成为前后端通用的编程语言&#xff0c;而选择合适的后端框架则是构建高效、可扩展应用程序的关键。本文将带你深入了解三个流行的 JavaScript 后端框架&#xff1a;Next.js、Nuxt.js 和 …...

人工智能概要

目录 前言1.什么是人工智能&#xff08;Artificial Intelligence, AI&#xff09;2.人工智能发展的三次浪潮2.1 人工智能发展的第一次浪潮2.2 人工智能发展的第二次浪潮2.3 人工智能发展的第三次浪潮 3.人工智能发展的必备三要素3.1 数据3.2 算法&#xff08;algorithm&#xf…...

spring boot 3集成swagger

Spring Boot 3 集成 Swagger 的过程与之前版本相比有一些变化&#xff0c;主要是因为 springfox 库已经停止更新&#xff0c;并且不再支持新的 Spring Boot 版本。因此&#xff0c;对于 Spring Boot 3 来说&#xff0c;推荐使用 springdoc-openapi 作为集成 Swagger 的解决方案…...

【PlantUML系列】状态图(六)

一、状态图的组成部分 状态&#xff1a;对象在其生命周期内可能处于的条件或情形&#xff0c;使用 state "State Name" as Statename 表示。初始状态&#xff1a;表示对象生命周期的开始&#xff0c;使用 [*] 表示。最终状态&#xff1a;表示对象生命周期的结束&…...

前端缓存页面处理方法

当前一个前端应用新发布时&#xff0c;重新编译后&#xff0c;原来引用的资源文件名都会有变化。如果这个应用的页面在前端浏览器中有缓存&#xff0c;则会导致加载资源失败。怎样去除这种缓存&#xff0c;同时也能尽可能的保证前端访问的性能 ChatGPT said: ChatGPT 这是一个经…...

每日一题 284. 窥视迭代器

284. 窥视迭代器 想要提前知道下一个内容&#xff0c;就需要缓存 class PeekingIterator : public Iterator { public:PeekingIterator(const vector<int>& nums) : Iterator(nums) {// Initialize any member here.// **DO NOT** save a copy of nums and manipula…...

Cesium-(Primitive)-(BoxGeometry)

含实现代码 GISer世界 效果: 以下是 BoxGeometry 类的构造函数属性,以表格形式展示: 属性名类型默认值描述minimumCartesian3盒子的最小 x, y, 和 z 坐标。maximumCartesian3盒子的最大 x, y, 和 z 坐标。vertexFormatVertexFormatVertexFormat.DEFAULT要计算的顶点属性。以下…...

CSS元素宽高特点、类型转化、显式和隐藏(display)

元素的宽高特点 块级元素 可以设置宽高&#xff0c;不可以和其他元素在一行设置宽高时&#xff0c;元素的宽高为设置的值没有设置宽高时&#xff0c;宽度和父级宽高一样&#xff0c;高度由元素内容决定 行级元素 不可以设置宽高&#xff0c;可以和其他元素在一行元素的宽高…...

上市公司投资效率Biddle模型数据(包括最终数据、原始数据及构造说明)2003-2022年

一、计算方式&#xff1a;参考《Journal of accounting and economics》Biddle G C&#xff0c;构建Biddle模型使用企业投资对成长机会的回归模型来估计企业的投资效率&#xff0c;这里成长机会用销售增长率来衡量。回归模型如下图所示: 二、资料范围&#xff1a;包括原始数据…...

矩阵的乘(包括乘方)和除

矩阵的乘分为两种&#xff1a; 一种是高等代数中对矩阵的乘的定义&#xff1a;可以去这里看看包含矩阵的乘。总的来说&#xff0c;若矩阵 A s ∗ n A_{s*n} As∗n​列数和矩阵 B n ∗ t B_{n*t} Bn∗t​的行数相等&#xff0c;则 A A A和 B B B可相乘&#xff0c;得到一个矩阵 …...

Spring Security6.3 自定义AuthorizationManager问题

项目环境&#xff1a; Springboot3.3.5, 对应的SpringFrameWork6.1&#xff0c;Security为6.3 问题&#xff1a;我想自定义AuthorizationManager接口实现类&#xff0c;在里面判断如果角色为amdin则放行请求&#xff1b; 在AdminAuthorizationManager类的check()方法中pass变量…...

第一部分:基础知识 9 . 视图 --[MySQL轻松入门教程]

在MySQL中,视图(View)是一个命名的SQL查询,它被存储在数据库目录中。视图可以包含来自一个或多个表的数据,并且可以像真实表一样被查询。下面是对MySQL视图的详细讲解: 创建视图 使用 CREATE VIEW 语句来创建视图。语法如下: CREATE [OR REPLACE] [ALGORITHM = {UNDEFIN…...

用GPT零负担学单片机之点亮一颗cpu 第3节 训练or特征匹配?用GPT开发嵌入式

用GPT零负担学单片机之点亮一颗cpu 第3节 训练or特征匹配?AI写代码 大家好,我是小杰学长 如果你是大学生 遇到电子技术 学习 成长 入行难题 我曾经通过大学比赛赚钱 从事嵌入式AI 航天军工 用特别的学习和求职方法线下半年带50+学弟学妹入行开发 主页佳喔威信,给你提供一定资…...

2.6、vue2中侦听属性的变化

2.6.1、侦听属性作用侦听属性的变化其实就是监视某个属性的变化。当被监视的属性一旦发生改变时,执行某段代码。2.6.2、watch配置项监视属性变化时需要使用watch配置项 可以监视多个属性,监视哪个属性,请把这个属性的名字拿过来即可。 i.可以监视Vue的原有属性 ii.如果监视的…...

enable_shared_from_this

用途 struct S {shared_ptr<S> dangerous(){return shared_ptr<S>(this); // dont do this!} };int main() {shared_ptr<S> sp1(new S);shared_ptr<S> sp2 sp1->dangerous();return 0; }考虑以上代码&#xff0c;从一个被shared_ptr管理的struc…...

重生之我在异世界学智力题(2)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言智力题&#xff1a;逃离孤岛智力题&a…...

深入解析下oracle的number底层存储格式

oracle数据库中&#xff0c;number数据类型用来存储数值数据&#xff0c;它既可以存储负数数值&#xff0c;也可以存储正数数值。相对于其他类型数据&#xff0c;number格式的数据底层存储格式要复杂得多。今天我们就详细探究下oracle的number底层存储格式。 一、环境搭建 1.…...

prometheus

1.安装&#xff0c;tar包&#xff0c;解压即用 tar xf prometheus-2.33.3.linux-amd64.tar.gz -C /app/tools/ 2.创建软链接 ln -s prometheus-2.33.3.linux-amd64/ /app/tools/prometheus 3.进入目录 cd /app/tools/prometheus 4.运行 ./prometheus 5.此时&#xff0…...

C# 23种设计模式(1)单例模式(单件模式)

一、单例模式介绍 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点。这个模式在需要一个对象被共享且全局唯一的情况下非常有用&#xff0c;比如配置对象、日志对象、数据库连接…...

Javaweb:HTML、CSS

学习 资源1 学习资源 2 黑马javaweb HTML 1、基础标签、样式 图片标签&#xff1a;<img> src:绝对路径、相对路径(绝对磁盘路径&#xff0c;网络路径&#xff1b;./当前目录&#xff09;width:宽度&#xff08;百分比&#xff09;height:高度&#xff08;百分比&…...

SmartDV将SDIO系列IP授权给RANiX开发车联网(V2X)产品

双方的合作将增强符合ISO 26262标准的车联网&#xff08;V2X&#xff09;系统的通信和连接能力&#xff0c;加速实现更安全、更智能的汽车系统和车辆创新 加利福尼亚州圣何塞市&#xff0c;2024年12月——灵活、高度可配置、可定制化的半导体设计知识产权&#xff08;IP&#…...

【Android】创建型设计模式—单例模式、工厂模式、建造者模式

单例模式 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供全局访问点。 单例模式类图&#xff1a; #mermaid-svg-kzf6IdXdYeNOHtP0 {font-family:"trebuchet ms",verdana,arial,sa…...

ida9pro压缩包

资源类型的博客大部分都是为了自己某天换新机了用 下载链接2&#xff1a;ida9.zip 下载链接1&#xff1a;https://mega.nz/folder/yiAiVDAa#T0kogEE7ufqy0x0EpCuOLQ 主目录下该文件为证书文件 ida9中选择它&#xff0c;就可以了...

前端入门之VUE--vue组件化编程

前言 VUE是前端用的最多的框架&#xff1b;这篇文章是本人大一上学习前端的笔记&#xff1b;欢迎点赞 收藏 关注&#xff0c;本人将会持续更新。 文章目录 2、Vue组件化编程2.1、组件2.2、基本使用2.2.1、VueComponent 2、Vue组件化编程 2.1、组件 组件&#xff1a;用来实现…...

C++是如何工作的?

首先来看一个最基本的C程序段。 #include <iostream>int main() {std::cout << "HelloWorld" << std::endl;std::cin.get(); } 第一行 #include 的含义是预处理的意思&#xff0c;这条语句的作用是将一个名为iostream的文件拷贝到源代码中这个…...

JavaScript中的this, 究竟指向什么?

在JavaScript代码的不同位置中&#xff0c;this所指向的数据是不一样的。比如大部分同学都知道&#xff0c;在对象的函数属性方法中&#xff0c;this指向对象本身&#xff1b;在构造函数中&#xff0c;this指向要生成的新对象。事实上&#xff0c;this指向的逻辑不止这几种&…...

JavaWeb学习(3)(Servlet详细、Servlet的三种实现方式(面试)、Servlet的生命周期、传统web.xml配置Servlet(了解))

目录 一、Servlet详细。 &#xff08;1&#xff09;基本介绍。 &#xff08;2&#xff09;基本作用。 1、接收客户端请求数据。 2、处理请求。 3、完成响应结果。 二、Servlet的三种实现方式。 &#xff08;1&#xff09;实现javax.servlet.Servlet接口。 1、基本介绍。 2、代码…...

【图像去雾数据集】URHI数据集介绍

URHI数据集对应论文&#xff1a;RESIDE: A Benchmark for Single Image Dehazing&#xff08;2017&#xff09; URHI数据集下载链接&#xff1a;https://sites.google.com/site/boyilics/website-builder/reside 为便于下载&#xff0c;将上述官方提供的链接中百度云链接粘贴如…...

Playwright中Page类的方法

导航和页面操作 goto(url: str, **kwargs: Any): 导航到一个URL。 reload(**kwargs: Any): 重新加载当前页面。 go_back(**kwargs: Any): 导航到会话历史记录中的前一个页面。 go_forward(**kwargs: Any): 导航到会话历史记录中的下一个页面。 set_default_navigation_tim…...

算力介绍与解析

算力&#xff08;Computing Power&#xff09;是指计算机系统在单位时间内处理数据和执行计算任务的能力。算力是衡量计算机性能的重要指标&#xff0c;直接影响计算任务的速度和效率。 算力的分类和单位 a. 基础算力&#xff1a;以CPU的计算能力为主。适用于各个领域的计算。…...

CentOS 上如何查看 SSH 服务使用的端口号?

我们知道&#xff0c;linux操作系统中的SSH默认情况下&#xff0c;端口是使用22&#xff0c;但是有些线上服务器并不是使用的默认端口&#xff0c;那么这个时候&#xff0c;我们应该如何快速知道SSH使用的哪个端口呢&#xff1f; 1、通过配置文件查看 cat /etc/ssh/sshd_confi…...

每日算法Day03

1.19.删除链表的倒数第N个节点 算法链接: 19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 类型: 链表 难度: 中等 思路&#xff1a;采用双指针法&#xff0c;控制两个指针之间的距离为n个节点 易错点&#xff1a;返回节点的确定和头节点的处理&…...

【漏洞复现】Apache Solr 身份认证绕过导致任意文件读取漏洞复现(CVE-2024-45216)

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦 【漏洞复现】Apache Solr 身份认证绕过导致任意文件读取漏洞复现(CVE-2024-45216) 一、漏洞概述1.1漏洞简介1.2组件描述1.3漏洞描述二、漏洞复现2.1 应用协议2.2 环境…...

若依将数据库更改为SQLite

文章目录 1. 添加依赖项2. 更新配置文件 application-druid.yml2.1. 配置数据源2.2. 配置连接验证 3. 更新 MybatisPlusConfig4. 解决 mapper 中使用 sysdate() 的问题4.1. 修改 BaseEntity4.2. 修改 Mapper 5. 更新 YML 配置 正文开始&#xff1a; 前提条件&#xff1a;在您的…...

ubuntu远程桌面开启opengl渲染权限

背景 最近用windows的【远程桌面连接】登录ubuntu后&#xff08;xrdp协议&#xff09;&#xff0c;发现gl环境是集显的&#xff0c;但是本地登录ubuntu桌面后是独显&#xff08;英伟达&#xff09;&#xff0c;想要在远程桌面上也用独显渲染环境。 一、查看是独显还是集显环境…...

Scala的泛型

需求:定义一个名为getMiddleEle 的方法用它来获取当前的列表的中间位置的值中间位置的下标 长度/2目标:getMiddleEle(List(1,2,3,4,5)) > 5/2 2 > 下标为2的元素是:3 getMiddleEle(List(1,2,3,4)) > 4/2 2 > 下标为2的元素是:3格式如下: 定义一个函数的格式:def…...

每隔一秒单片机向电脑发送一个16进制递增数据

SCON0x50 SM00 SM11&#xff08;工作方式为方式一&#xff09; REN1允许单片机从电脑接收数据 TB8 RB8 SM2是方式2和方式3直接配置为0 TI为发送中断请求标志位 由硬件配置为1 必须由 软件复位为0&#xff0c;RI为接收中断请求标志位&#xff0c;同理TI UART.c #include &l…...

轻量级日志管理平台:Grafana Loki搭建及应用(详细篇)

前言 Grafana Loki是Grafana Lab团队提供的一个水平可扩展、高可用性、多租户的日志聚合系统&#xff0c;与其他日志系统不同的是&#xff0c;Loki最初设计的理念是为了为日志建立标签索引&#xff0c;而非将原日志内容进行索引。 现在目前成熟的方案基本上都是&#xff1a;L…...

React和Vue.js的相似性和差异性是什么?

React和Vue.js都是现代前端开发中广泛使用的JavaScript框架&#xff0c;它们都旨在提高开发效率和组件化开发。以下是他们的一些相似性和差异性&#xff1a; 相似性 组件化&#xff1a;两者都支持组件化开发&#xff0c;允许开发者将UI拆分成独立的、可复用的组件。虚拟DOM&a…...

跨域 Cookie 共享

跨域请求经常遇到需要携带 cookie 的场景&#xff0c;为了确保跨域请求能够携带用户的认证信息或其他状态&#xff0c;浏览器提供了 withCredentials 这个属性。 如何在 Axios 中使用 withCredentials 为了在跨域请求中携带 cookie&#xff0c;需要在 Axios 配置中设置 withCr…...