群控系統服務端開發模式-應用開發-登錄退出發送郵件

一、登錄成功發送郵件

? ? ? ? 在根目錄下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));}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62676.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62676.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62676.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[游戲開發] Unity中使用FlatBuffer

什么是FlatBuffer 官網&#xff1a; GitHub - google/flatbuffers: FlatBuffers: Memory Efficient Serialization LibraryFlatBuffers: Memory Efficient Serialization Library - google/flatbuffershttps://github.com/google/flatbuffers 為什么用FloatBuffer&#xff0c…

MySQL其一,概念學習,可視化軟件安裝以及增刪改查語句

目錄 MySQL 1、數據庫的概念 2、數據庫分類 3、MySQL的安裝 4、安裝過程中的問題 DataGrip的使用&#xff1a; SQLynx的使用&#xff1a; 5、編寫SQL語句 6、DDL語句 7、DML 新增數據&#xff1a; 刪除數據&#xff1a; 修改數據&#xff1a; MySQL SQL其實是一門…

05 在 Linux 使用 AXI DMA

DMA簡介 DMA 是一種采用硬件實現存儲器與存儲器之間或存儲器與外設之間直接進行高速數據傳輸的技術&#xff0c;傳輸過程無需 CPU 參與&#xff08;但是CPU需要提前配置傳輸規則&#xff09;&#xff0c;可以大大減輕 CPU 的負擔。 DMA 存儲傳輸的過程如下&#xff1a; CPU 向…

linux 安裝 vsftpd 服務以及配置全攻略,vsftpd 虛擬多用戶多目錄配置,為每個用戶配置不同的使用權限

linux 安裝 vsftpd 服務以及配置全攻略&#xff0c;vsftpd 虛擬多用戶多目錄配置&#xff0c;為每個用戶配置不同的使用權限。 linux 安裝 vsftpd 服務以及配置全攻略 FTP 是 File Transfer Protocol 的簡稱&#xff0c;用于 Internet 上的控制文件的雙向傳輸。同時&#xff0…

SQL語句在MySQL中如何執行

MySQL的基礎架構 首先就是客戶端&#xff0c;其次Server服務層&#xff0c;大多數MySQL的核心服務都在這一層&#xff0c;包括連接、分析、優化、緩存以及所有的內置函數&#xff08;時間、日期、加密函數&#xff09;&#xff0c;所有跨存儲引擎功能都在這一層實現&#xff1…

ragflow連不上ollama的解決方案

由于前期wsl默認裝在C盤&#xff0c;后期部署好RagFlow后C盤爆紅&#xff0c;在連接ollama的時候一直在轉圈圈&#xff0c;問其他人沒有遇到這種情況&#xff0c;猜測是因為內存不足無法加載模型導致&#xff0c;今天重新在E盤安裝wsl 使用wsl裝Ubuntu Win11 wsl-安裝教程 如…

力扣-漢明距離

1.兩個整數之間的 漢明距離 指的是這兩個數字對應二進制位不同的位置的數目。 給你兩個整數 x 和 y&#xff0c;計算并返回它們之間的漢明距離。 看到這題&#xff0c;當然想到了按位異或^,并且c內置了計算二進制數中1數量的函數__builtin_popcount() class Solution { publ…

關于成功插入 SQLite 但沒有數據的問題

背景 技術棧&#xff1a;SpringBoot Mybatis-flex SQLite 項目中集成了SQLite&#xff0c;配置如下&#xff1a; spring:datasource:url: jdbc:sqlite::resource:db/project.dbdriver-class-name: org.sqlite.JDBC在進行測試時&#xff0c;使用Mybatis-flex往表中插入數據&…

C#常見錯誤—空對象錯誤

System.NullReferenceException&#xff1a;未將對象引用設置到對象的實例 在C#編程中&#xff0c;System.NullReferenceException是一個常見的運行時異常&#xff0c;其錯誤信息“未將對象引用設置到對象的實例”意味著代碼試圖訪問一個未被初始化或已被設置為null的對象的成…

沁恒CH32V208藍牙串口透傳例程:修改透傳的串口;UART-CH32V208-APP代碼分析;APP-CH32V208-UART代碼分析

從事嵌入式單片機的工作算是符合我個人興趣愛好的,當面對一個新的芯片我即想把芯片盡快搞懂完成項目賺錢,也想著能夠把自己遇到的坑和注意事項記錄下來,即方便自己后面查閱也可以分享給大家,這是一種沖動,但是這個或許并不是原廠希望的,盡管這樣有可能會犧牲一些時間也有哪天原…

Scala的隱式對象

Scala中&#xff0c;隱式對象&#xff08;implicit object&#xff09;是一種特殊的對象&#xff0c;它可以使得其成員&#xff08;如方法和值&#xff09;在特定的上下文中自動可用&#xff0c;而無需顯式地傳遞它們。隱式對象通常與隱式參數和隱式轉換一起使用&#xff0c;以…

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

矩陣的乘分為兩種&#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;得到一個矩陣 …

DVWA親測sql注入漏洞

LOW等級 我們先輸入1 我們加上一個單引號&#xff0c;頁面報錯 我們看一下源代碼&#xff1a; <?php if( isset( $_REQUEST[ Submit ] ) ) { // Get input $id $_REQUEST[ id ]; // Check database $query "SELECT first_name, last_name FROM users WHERE user_id …

C++,提供函數接口,函數如何做到接收外部變量隨時結束

在C中&#xff0c;如果你想要創建一個函數&#xff0c;該函數可以接收外部變量并在變量改變時作出響應&#xff0c;你可以使用回調函數或者將變量包裝在可以觀察其變化的設計模式中&#xff0c;例如觀察者模式。 以下是一個使用標準庫中的std::function和std::bind來創建響應外…

機器學習01-發展歷史

機器學習01-發展歷史 文章目錄 機器學習01-發展歷史1-傳統機器學習的發展進展1. 初始階段&#xff1a;統計學習和模式識別2. 集成方法和核方法的興起3. 特征工程和模型優化4. 大規模數據和分布式計算5. 自動化機器學習和特征選擇總結 2-隱馬爾科夫鏈為什么不能解決較長上下文問…

想了解操作系統,有什么書籍推薦?

推薦一本操作系統經典書&#xff1a; 操作系統導論 《操作系統導論》虛擬化(virtualization)、并發(concurrency)和持久性(persistence)。這是我們要學習的3個關鍵概念。通過學習這3個概念&#xff0c;我們將理解操作系統是如何工作的&#xff0c;包括它如何決定接下來哪個程序…

[Collection與數據結構] 位圖與布隆過濾器

&#x1f338;個人主頁:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;?熱門專欄: &#x1f9ca; Java基本語法(97平均質量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection與…

【大數據學習 | 面經】Spark的shuffle hash join的具體細節

1. 前言 shuffle hash join是Spark中一種常見的連接策略&#xff0c;尤其適用于兩個數據集都比較大且無法通過廣播來優化的情況。其核心思想是通過對連接鍵進行哈希分區&#xff0c;使得相同鍵值的數據被分配到相同的分區中&#xff0c;從而可以在每個分區獨立的執行連接操作。…

設計模式從入門到精通之(一)工廠模式

工廠模式&#xff1a;為每個工廠找到"生意經" 在現實生活中&#xff0c;我們隨處可見"工廠"的影子&#xff0c;比如汽車工廠生產汽車&#xff0c;食品工廠生產食品。但你有沒有想過&#xff0c;為什么我們需要工廠&#xff1f;如果沒有工廠&#xff0c;我們…

談談你對vue這種框架理解

發現寶藏 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。【寶藏入口】。 Vue.js 是一個漸進式的前端 JavaScript 框架&#xff0c;旨在通過提供易于理解、上手簡單且功能強大的工具來構建現代化的 Web …