fastadmin管理员页面实现手机验证码登录功能-腾讯云短信插件

配置信息

  1. 安装插件
    在这里插入图片描述

  2. 配置腾讯云短信信息
    在这里插入图片描述

代码实现

  1. 新建页面/application/admin/view/index/phone_login.html(我直接复制登录login.html魔改的)

    <form method="post" id="login-form" action="{:url('index/phone_login')}"><!--@AdminLoginFormBegin--><div id="errtips" class="hide"></div>{:token()}<div class="input-group"><div class="input-group-addon"><span class="glyphicon glyphicon-user" aria-hidden="true"></span></div><input type="text" id="mobile" name="mobile" class="form-control" placeholder="{:__('Phone')}" data-rule="{:__('Phone')}:required;mobile"/><br></div><div class="input-group"><div class="input-group-addon"><span class="glyphicon glyphicon-option-horizontal" aria-hidden="true"></span></div><input type="text" name="captcha" id="mobile-captcha" class="form-control" data-rule="required;length(4);" placeholder="{:__('验证码')}"/><input type="hidden" value="changemobile" name="event"><span class="input-group-addon" style="padding:0;border:none;cursor:pointer;"><a href="javascript:;" class="btn btn-info btn-captcha" data-url="/api/sms/send" data-type="mobile" data-event="changemobile">获取验证码</a></span></div><div class="form-group checkbox"><label class="inline" for="keeplogin"><a href="{:url('login')}" style="float: left;">账号密码登录</a></label></div><div class="form-group"><button type="submit" class="btn btn-success btn-lg btn-block" style="background:#708eea;">{:__('Sign in')}</button></div><!--@AdminLoginFormEnd-->
    </form>
  2. 在/public/assets/js/backend-init.js绑定发送短信事件

    define(['backend'], function (Backend) {var Frontend = {api: Fast.api,init: function () {var si = {};//发送验证码$(document).on("click", ".btn-captcha", function (e) {var type = $(this).data("type") ? $(this).data("type") : 'mobile';var btn = this;Frontend.api.sendcaptcha = function (btn, type, data, callback) {$(btn).addClass("disabled", true).text("发送中...");Frontend.api.ajax({url: $(btn).data("url"), data: data}, function (data, ret) {clearInterval(si[type]);var seconds = 60;si[type] = setInterval(function () {seconds--;if (seconds <= 0) {clearInterval(si);$(btn).removeClass("disabled").text("发送验证码");} else {$(btn).addClass("disabled").text(seconds + "秒后可再次发送");}}, 1000);if (typeof callback == 'function') {callback.call(this, data, ret);}}, function () {$(btn).removeClass("disabled").text('发送验证码');});};if (['mobile', 'email'].indexOf(type) > -1) {var element = $(this).data("input-id") ? $("#" + $(this).data("input-id")) : $("input[name='" + type + "']", $(this).closest("form"));var text = type === 'email' ? '邮箱' : '手机号码';if (element.val() === "") {Layer.msg(text + "不能为空!");element.focus();return false;} else if (type === 'mobile' && !element.val().match(/^1[3-9]\d{9}$/)) {Layer.msg("请输入正确的" + text + "!");element.focus();return false;} else if (type === 'email' && !element.val().match(/^[\w\+\-]+(\.[\w\+\-]+)*@[a-z\d\-]+(\.[a-z\d\-]+)*\.([a-z]{2,4})$/)) {Layer.msg("请输入正确的" + text + "!");element.focus();return false;}element.isValid(function (v) {if (v) {var data = {event: $(btn).data("event")};data[type] = element.val();Frontend.api.sendcaptcha(btn, type, data);} else {Layer.msg("请确认已经输入了正确的" + text + "!");}});} else {var data = {event: $(btn).data("event")};Frontend.api.sendcaptcha(btn, type, data, function (data, ret) {Layer.open({title: false, area: ["400px", "430px"], content: "<img src='" + data.image + "' width='400' height='400' /><div class='text-center panel-title'>扫一扫关注公众号获取验证码</div>", type: 1});});}return false;});}};Frontend.init();
    });
    
  3. 实际操作时,你会发现前端提示有问题,在/public/assets/js/backend/index.js让phone_login的错误提示框绑定toastr弹窗即可(这里我也是直接复制前面login的方法而已

    phone_login: function () {var lastlogin = localStorage.getItem("lastlogin");if (lastlogin) {lastlogin = JSON.parse(lastlogin);$("#profile-img").attr("src", Backend.api.cdnurl(lastlogin.avatar));$("#profile-name").val(lastlogin.username);}//让错误提示框居中Fast.config.toastr.positionClass = "toast-top-center";//本地验证未通过时提示$("#login-form").data("validator-options", {invalid: function (form, errors) {$.each(errors, function (i, j) {Toastr.error(j);});},target: '#errtips'});//为表单绑定事件Form.api.bindevent($("#login-form"), function (data) {localStorage.setItem("lastlogin", JSON.stringify({id: data.id,username: data.username,avatar: data.avatar}));location.href = Backend.api.fixurl(data.url);}, function (data) {$("input[name=captcha]").next(".input-group-addon").find("img").trigger("click");});
    }
    
  4. 在/application/admin/controller/Index.php写phone_login方法

    /*** 手机号登录*/
    public function phone_login()
    {if (request()->isPost()) {$url = $this->request->get('url', 'index/index');$mobile = $this->request->post('mobile');$captcha = $this->request->post('captcha');$event = $this->request->post('event');if (!\app\common\library\Sms::check($mobile, $captcha, $event)) {$this->error(__('验证码不正确'));}$admin = Admin::get(['mobile' => $mobile]);if(!$admin){$this->error('该手机号还没有绑定账号');}if ($admin['status'] == 'hidden') {$this->error('Admin is forbidden');} $admin->loginfailure = 0;$admin->logintime = time();$admin->loginip = request()->ip();$this->token = Random::uuid();$admin->token = $this->token;$admin->save();Session::set("admin", $admin->toArray());$this->keeplogin(86400);Hook::listen("admin_login_after", $this->request);$this->success(__('Login successful'), $url, ['url' => $url, 'id' => $this->auth->id, 'username' => $admin->username, 'avatar' => $this->auth->avatar]);} else {$background = Config::get('fastadmin.login_background');$background = $background ? (stripos($background, 'http') === 0 ? $background : config('site.cdnurl') . $background) : '';$this->view->assign('background', $background);$url = $this->request->get('url', 'index/index');}// 根据客户端的cookie,判断是否可以自动登录if ($this->auth->autologin()) {Session::delete("referer");$this->redirect($url);}return $this->view->fetch();
    }/*** 刷新保持登录的Cookie** @param int $keeptime* @return  boolean*/
    protected function keeplogin($keeptime = 0)
    {$expiretime = time() + $keeptime;$key = md5(md5($this->auth->id) . md5($keeptime) . md5($expiretime) . $this->token . config('token.key'));$data = [$this->auth->id, $keeptime, $expiretime, $key];Cookie::set('keeplogin', implode('|', $data), 86400 * 7);
    }
    
  5. 记得前面先引入类库,配置新方法免登录验证,以及token,做登录刷新

    use think\Cookie;
    use fast\Random;
    
    protected $noNeedLogin = ['login', 'phone_login','keeplogin'];
    protected $noNeedRight = ['index', 'logout'];
    protected $token = '';
    
  6. 数据库admin表新增手机字段
    在这里插入图片描述

演示

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/68021.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WhatsApp私域流量营销,蜂巢SCRM助你触达20亿用户

说起WhatsApp&#xff0c;做海外的朋友并不陌生&#xff0c;WhatsApp在 26-35 岁的美国互联网用户中最受欢迎。在 26-35 岁之间的所有美国人中&#xff0c;有 27%使用 WhatsApp。 以下是按年龄组使用 WhatsApp 的美国互联网用户百分比的完整细分&#xff1a; 按最大受众排名的前…

腾讯云轻量应用服务器月流量包用完超额了怎么计费?

腾讯云轻量应用服务器套餐内月流量包是免费的&#xff0c;超出套餐流量为0.8元/GB&#xff0c;轻量服务器地域不同流量费也有所不同&#xff0c;腾讯云百科来详细说下腾讯云轻量应用服务器流量、超出套餐后流量收费以及流量计费说明&#xff1a; 轻量应用服务器流量 腾讯云轻…

如何外网登录管理云通信短信网关平台?——快解析映射方案

云通信&#xff08;Cloud Communications &#xff09;是基于云计算商业模式应用的通信平台服务&#xff0c;简单易用,满足企业一键群发场景,支持多种语言SDK和API 接入。各个通信平台软件都集中在云端&#xff0c;且互通兼容&#xff0c;用户只要登录云通信平台&#xff0c;不…

腾讯云服务器公网流量是如何计算的?出流量还是入流量?

腾讯云服务器公网流量费直接算出流量&#xff0c;云服务器入方向流量是免费的&#xff0c;例如使用公网从云服务器上下载文件到本地产生的流量是收费的&#xff0c;从本地上传文件到云服务器上产生的流量是免费的。腾讯云服务器公网带宽可以按带宽计费&#xff0c;也可以按使用…

AI 工具合辑盘点(四)持续更新

AI 视频生成和编辑工具 当今&#xff0c;视频已经成为最受欢迎的媒介之一。我们喜欢观看视频&#xff0c;但是制作高质量的视频需要耗费大量时间和精力。 无论你是内容创作者、专业视频编辑师&#xff0c;还是完全的新手&#xff0c;按照传统方式制作视频需要掌握各种知识、技…

聚观早报 | 中国大语言模型和GPT-4差距在两三年;美团注册新专利

今日要闻&#xff1a;中国大语言模型和GPT-4差距在两三年&#xff1b;摩尔定律提出者Gordon Moore离世&#xff1b;美团注册外卖配送员头盔新专利&#xff1b;比亚迪汽车宣布联合抵制网络水军&#xff1b;OpenAI就ChatGPT漏洞道歉 中国大语言模型和GPT-4差距在两三年 3 月 25 …

一文盘点令人惊艳AI神器(附项目代码)

‍‍2023可以称得上是脑洞大开的一年&#xff01;人工智能的风口由‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍OpenAI的ChatGPT率先引爆。 今天&#xff0c;我们给大家推荐10款惊艳的AI工具&#xff0c;欢迎补充&#xff01; 一、AI围棋机器人&#xff1a;AlphaGo A…

一文盘点最近特别火的 10 款惊艳的 AI 工具(附项目代码)

‍‍2023可以称得上是脑洞大开的一年&#xff01;人工智能的风口由‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍OpenAI的ChatGPT率先引爆。 今天&#xff0c;我们给大家推荐10款惊艳的AI工具&#xff0c;欢迎补充&#xff01; 文章目录 一、AI围棋机器人&#xff1a…

chatgpt赋能python:Python好玩的包——ExploringtheFunSideofProgramming

Python好玩的包——Exploring the Fun Side of Programming Python是一门富有表达力和功能的编程语言&#xff0c;有着一个庞大而活跃的社区。这个社区中&#xff0c;你可以找到许多好玩和实用的包。这些包可以让你更加轻松愉快地编程&#xff0c;同时也可以帮助你完成许多任务…

如何自己搭建一个个人网站?

个人网站是一个私域流量平台&#xff0c;对比起在社交媒体上宣传自己&#xff0c;个人网站更有助于其他人深入了解你的某一方面特长、经历、或者你想推出的产品或想法&#xff0c;对提升自己的知名度非常有帮助。 以前&#xff0c;搭建个人网站可能需要耗费很大的精力去设计前…

腾讯云服务器配置哪个比价好?轻量和云服务器有什么区别?

腾讯云服务器配置CPU内存如何选择&#xff1f;公网带宽多少M合适&#xff1f;选轻量应用服务器还是云服务器CVM&#xff1f;建网站小程序APP云服务器配置推荐&#xff0c;腾讯云百科来详细腾讯云服务器CPU内存带宽系统盘选择以及轻量应用服务器和云服务器哪个比较好&#xff1a…

用这招监听 Vue 的插槽变化

微信搜索 【大迁世界】, 我会第一时间和你分享前端行业趋势&#xff0c;学习途径等等。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录&#xff0c;有一线大厂面试完整考点、资料以及我的系列文章。 快来免费体验ChatGpt plus版本的&#xff0c;我们出的钱 体验地…

chatgpt赋能python:Python怎么建网站的SEO

Python怎么建网站的SEO 介绍 Python是一种流行的编程语言&#xff0c;其灵活性和可靠性使其成为了许多网站开发人员的首选语言之一。Python可以用于构建各种类型的网站&#xff0c;包括电子商务和企业级应用程序等。但是&#xff0c;构建一个网站是不够的&#xff0c;您还需要…

egg--使用中间件封禁ip

学习资源推荐 egg--使用中间件封禁ip 中间件的使用效果图 中间件的使用 app目录下新建middleware文件夹middleware文件夹下新建forbiddenIp.js书写封禁方法 module.exports options > {return async (ctx, next) > {if (options.ip 127.0.0.1) {ctx.status 403;ctx…

linux防火墙封禁端口段

漏洞扫描时会遇到端口漏洞&#xff0c;一般只需将端口封禁&#xff0c;并将需要访问的IP添加到白名单即可。 操作如下&#xff1a; 1、查看防火墙状态 sudo firewall-cmd --state如果没有开启防火墙&#xff0c;需要开启防火墙 2、开启防火墙 sudo systemctl start firewalld3…

iptables封禁端口

需求&#xff1a;之前运维的服务器&#xff0c;爆出漏洞&#xff0c;我要做的就是把5000接口封禁。 然后找了一些iptables的教程。最终解决方案如下&#xff1a; iptables -I FORWARD -p tcp --dport 5000 -j DROP执行完&#xff0c;立即生效 配套资料 1. 禁止指定 IP ipt…

Nginx IP封禁

1、先查找服务器所有访问者的ip: awk {print $1} /data/logs/nginx/tg-ga-access.log |sort |uniq -c |sort -ntg-ga-access.log 为域名的访问日志文件所在路径 会到如下结果&#xff0c;前面是ip的访问次数&#xff0c;后面是ip&#xff0c;很明显我们需要把访问次数多的ip…

人工智能ai写作系统,ai智能写作机器人

人工智能AI大数据深度&#xff1a;基于伪原创算法&#xff0c;采用神经网络算法&#xff0c;在超过1535000篇文章中进行自动学习、聚合算法进行人工智能的创建&#xff0c;内容语义不变&#xff0c;媒体阿里、腾讯、百度均于日前在百家号内容创作者盛典上推出人工智能创作支撑平…

深度学习实战1-(keras框架)企业数据分析与预测

大家好&#xff0c;我是微学AI&#xff0c;今天给大家带来深度学习框架keras的实战项目&#xff0c;用于基本的企业数据分析&#xff0c;预测企业净利润情况&#xff0c;并利用灰色预测函数GM11进行预测模型。我们拿到企业数据&#xff0c;这里参数抽象成x1-x9&#xff0c;y表示…

chatgpt赋能python:Python动态数据分析

Python 动态数据分析 随着互联网时代的到来&#xff0c;数据分析成为了越来越重要的一个领域。作为一种全功能性的编程语言&#xff0c;Python 已被广泛使用于动态数据分析领域。在这篇文章中&#xff0c;我们将介绍 Python 动态数据分析的相关内容。 什么是动态数据分析 动…