插件开发的目的是不影响主体程序,主体程序加了钩子,通过实现钩子的功能来扩展主体程序。后台管理员注册功能看样子是无法通过开发插件来实现吧,因此直接改主体程序:
一:applicationadmincontrollerIndex.php增加以下方法:
/** * 管理员注册 */ public function register() { $url = $this->request->get('url', 'index/index'); if ($this->request->isPost()) { //$this->token(); $params = []; //$params = $this->request->post("row/a"); $params['username'] = $this->request->post("username"); $params['nickname'] = $this->request->post("username"); $params['password'] = $this->request->post("password"); $params['email'] = $this->request->post("email"); $captcha = $this->request->post('captcha'); $token = $this->request->post('__token__'); //验证数据 $rule = [ 'username' => 'require|length:3,30', 'password' => 'require|length:6,30', 'email' => 'require|email', '__token__' => 'require|token', ]; $msg = [ 'username.require' => 'Username can not be empty', 'username.length' => 'Username must be 3 to 30 characters', 'password.require' => 'Password can not be empty', 'password.length' => 'Password must be 6 to 30 characters', 'email' => 'Email is incorrect', ]; $data = [ 'username' => $params['username'], 'password' => $params['password'], 'email' => $params['email'], '__token__' => $token, ]; $captchaResult = thinkValidate::is($captcha, 'captcha'); if (!$captchaResult) { $this->error(__('Captcha is incorrect')); } $validate = new Validate($rule, $msg); $result = $validate->check($data); if (!$result) { $this->error(__($validate->getError()), null, ['token' => $this->request->token()]); }else { $params['salt'] = fastRandom::alnum(); $params['password'] = md5(md5($params['password']) . $params['salt']); $params['avatar'] = '/assets/img/avatar.png'; //设置新管理员默认头像。 $result = $this->model->save($params); if ($result === false) { $this->error($this->model->getError()); } //设置所属权限组 $group = [5]; //设置默认权限组 $dataset = []; foreach ($group as $value) { $dataset[] = ['uid' => $this->model->id, 'group_id' => $value]; } model('AuthGroupAccess')->saveAll($dataset); $this->success(__('Sign up successful'), $url ? $url : url('index/index')); //$this->success(); } $this->error(); } $background = Config::get('fastadmin.login_background'); $background = stripos($background, 'http') === 0 ? $background : config('site.cdnurl') . $background; $this->view->assign('background', $background); $this->view->assign('url', $url); return $this->view->fetch(); }
二、public/assets/js/backend/index.js增加以下方法
register: function () { //本地验证未通过时提示 $("#register-form").data("validator-options", validatoroptions); //为表单绑定事件 Form.api.bindevent($("#register-form"), function (data, ret) { setTimeout(function () { location.href = ret.url ? ret.url : "/"; }, 1000); }, function (data) { $("input[name=captcha]").next(".input-group-addon").find("img").trigger("click"); }); },
三:前端页面增加以下页面:
applicationadminviewindexregister.html
<!DOCTYPE html><html lang="{$config.language}"> <head> {include file="common/meta" /} <style type="text/css"> body { color:#999; background:url('{$background}'); background-size:cover; } a { color:#fff; } .login-panel{margin-top:150px;} .login-screen { max-width:400px; padding:0; margin:100px auto 0 auto; } .login-screen .well { border-radius: 3px; -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); background: rgba(255,255,255, 0.2); } .login-screen .copyright { text-align: center; } @media(max-width:767px) { .login-screen { padding:0 20px; } } .profile-img-card { width: 100px; height: 100px; margin: 10px auto; display: block; -moz-border-radius: 50%; -webkit-border-radius: 50%; border-radius: 50%; } .profile-name-card { text-align: center; } #login-form { margin-top:20px; } #login-form .input-group { margin-bottom:15px; } </style> </head> <body> <style> .user-section { background: #fff; padding: 15px; margin-bottom: 20px; -webkit-border-radius: 4px; -webkit-background-clip: padding-box; -moz-border-radius: 4px; -moz-background-clip: padding; border-radius: 4px; background-clip: padding-box; border: 1px solid #e4ecf3; } .login-section { margin: 50px auto; width: 460px; -webkit-border-radius: 0; -webkit-background-clip: padding-box; -moz-border-radius: 0; -moz-background-clip: padding; border-radius: 0; background-clip: padding-box; } .login-section.login-section-weixin { min-height: 315px; } .login-section .logon-tab { margin: -15px -15px 0 -15px; } .login-section .logon-tab > a { display: block; padding: 20px; float: left; width: 50%; font-size: 16px; text-align: center; color: #616161; background-color: #f5f5f5; -webkit-transition: all 0.3s ease; -moz-transition: all 0.3s ease; -o-transition: all 0.3s ease; transition: all 0.3s ease; } .login-section .logon-tab > a:hover { background-color: #fafafa; -webkit-transition: all 0.3s ease; -moz-transition: all 0.3s ease; -o-transition: all 0.3s ease; transition: all 0.3s ease; } .login-section .logon-tab > a.active { background-color: #fff; -webkit-transition: all 0.3s ease; -moz-transition: all 0.3s ease; -o-transition: all 0.3s ease; transition: all 0.3s ease; } .login-section .login-main { padding: 40px 45px 20px 45px; } .login-section .control-label { font-size: 13px; } .login-section .n-bootstrap .form-group { position: relative; } .login-section .n-bootstrap .input-group { position: inherit; } .login-section .n-bootstrap .n-right { margin-top: 0; top: 0; position: absolute; left: 0; text-align: right; width: 100%; } .login-section .n-bootstrap .n-right .msg-wrap { position: relative; }</style> <div id="content-container" class="container"> <div class="user-section login-section"> <div class="logon-tab clearfix"> <a href="{:url('index/login')}?url={$url|urlencode}">{:__('Sign in')}</a> <a class="active">{:__('Sign up')}</a> </div> <div class="login-main"> <form name="form1" id="register-form" class="form-vertical" method="POST" action=""> <input type="hidden" name="url" value="{$url}" /> {:token()} <div class="form-group"> <label class="control-label required">{:__('Email')}<span class="text-success"></span></label> <div class="controls"> <input type="text" name="email" id="email" data-rule="required;email" class="form-control input-lg" placeholder="{:__('Email')}"> <p class="help-block"></p> </div> </div> <div class="form-group"> <label class="control-label">{:__('Username')}</label> <div class="controls"> <input type="text" id="username" name="username" data-rule="required;username" class="form-control input-lg" placeholder="{:__('Username must be 3 to 30 characters')}"> <p class="help-block"></p> </div> </div> <div class="form-group"> <label class="control-label">{:__('Password')}</label> <div class="controls"> <input type="password" id="password" name="password" data-rule="required;password" class="form-control input-lg" placeholder="{:__('Password must be 6 to 30 characters')}"> <p class="help-block"></p> </div> </div> <div class="form-group"> <label class="control-label">{:__('Mobile')}</label> <div class="controls"> <input type="text" id="mobile" name="mobile" data-rule="required;mobile" class="form-control input-lg" placeholder="{:__('Mobile')}"> <p class="help-block"></p> </div> </div> {if $config.fastadmin.login_captcha} <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" class="form-control" placeholder="{:__('Captcha')}" data-rule="{:__('Captcha')}:required;length(4)" /> <span class="input-group-addon" style="padding:0;border:none;cursor:pointer;"> <img src="{:rtrim('__PUBLIC__', '/')}/index.php?s=/captcha" width="100" height="30" onclick="this.src = '{:rtrim('__PUBLIC__', '/')}/index.php?s=/captcha&r=' + Math.random();"/> </span> </div> {/if} <div class="form-group"> <button type="submit" class="btn btn-primary btn-lg btn-block">{:__('Sign up')}</button> </div> </form> </div> </div> </div> {include file="common/script" /} </body></html>
四、applicationadminviewindexlogin.html做如下修改
<!DOCTYPE html><html lang="{$config.language}"> <head> {include file="common/meta" /} <style type="text/css"> body { color:#999; background:url('{$background}'); background-size:cover; } a { color:#fff; } .login-panel{margin-top:150px;} .login-screen { max-width:400px; padding:0; margin:100px auto 0 auto; } .login-screen .well { border-radius: 3px; -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); background: rgba(255,255,255, 0.2); } .login-screen .copyright { text-align: center; } @media(max-width:767px) { .login-screen { padding:0 20px; } } .profile-img-card { width: 100px; height: 100px; margin: 10px auto; display: block; -moz-border-radius: 50%; -webkit-border-radius: 50%; border-radius: 50%; } .profile-name-card { text-align: center; } #login-form { margin-top:20px; } #login-form .input-group { margin-bottom:15px; } </style> </head> <body><style> .user-section { background: #fff; padding: 15px; margin-bottom: 20px; -webkit-border-radius: 4px; -webkit-background-clip: padding-box; -moz-border-radius: 4px; -moz-background-clip: padding; border-radius: 4px; background-clip: padding-box; border: 1px solid #e4ecf3; } .login-section { margin: 50px auto; width: 460px; -webkit-border-radius: 0; -webkit-background-clip: padding-box; -moz-border-radius: 0; -moz-background-clip: padding; border-radius: 0; background-clip: padding-box; } .login-section.login-section-weixin { min-height: 315px; } .login-section .logon-tab { margin: -15px -15px 0 -15px; } .login-section .logon-tab > a { display: block; padding: 20px; float: left; width: 50%; font-size: 16px; text-align: center; color: #616161; background-color: #f5f5f5; -webkit-transition: all 0.3s ease; -moz-transition: all 0.3s ease; -o-transition: all 0.3s ease; transition: all 0.3s ease; } .login-section .logon-tab > a:hover { background-color: #fafafa; -webkit-transition: all 0.3s ease; -moz-transition: all 0.3s ease; -o-transition: all 0.3s ease; transition: all 0.3s ease; } .login-section .logon-tab > a.active { background-color: #fff; -webkit-transition: all 0.3s ease; -moz-transition: all 0.3s ease; -o-transition: all 0.3s ease; transition: all 0.3s ease; } .login-section .login-main { padding: 40px 45px 20px 45px; } .login-section .control-label { font-size: 13px; } .login-section .n-bootstrap .form-group { position: relative; } .login-section .n-bootstrap .input-group { position: inherit; } .login-section .n-bootstrap .n-right { margin-top: 0; top: 0; position: absolute; left: 0; text-align: right; width: 100%; } .login-section .n-bootstrap .n-right .msg-wrap { position: relative; }</style> <div id="content-container" class="container"> <div class="user-section login-section"> <div class="logon-tab clearfix"> <a class="active">{:__('Sign in')}</a> <a href="{:url('index/register')}?url={$url|urlencode}">{:__('Sign up')}</a> </div> <div class="login-main"> <form name="form" id="login-form" class="form-vertical" method="POST" action=""> <input type="hidden" name="url" value="{$url}" /> <div id="errtips" class="hide"></div> {:token()} <div class="form-group"> <label class="control-label" for="account">{:__('Account')}</label> <div class="controls"> <input class="form-control input-lg" id="pd-form-username" type="text" name="username" value="" data-rule="required" placeholder="{:__('Email/Mobile/Username')}" autocomplete="off"> <div class="help-block"></div> </div> </div> <div class="form-group"> <label class="control-label" for="password">{:__('Password')}</label> <div class="controls"> <input class="form-control input-lg" id="pd-form-password" type="password" name="password" data-rule="required;password" placeholder="{:__('Password')}" autocomplete="off"> </div> </div> {if $config.fastadmin.login_captcha} <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" class="form-control" placeholder="{:__('Captcha')}" data-rule="{:__('Captcha')}:required;length(4)" /> <span class="input-group-addon" style="padding:0;border:none;cursor:pointer;"> <img src="{:rtrim('__PUBLIC__', '/')}/index.php?s=/captcha" width="100" height="30" onclick="this.src = '{:rtrim('__PUBLIC__', '/')}/index.php?s=/captcha&r=' + Math.random();"/> </span> </div> {/if} <div class="form-group"> <label class="inline" for="keeplogin"> <input type="checkbox" name="keeplogin" id="keeplogin" value="1" /> {:__('Keep login')} </label> </div> <div class="form-group"> <button type="submit" class="btn btn-primary btn-lg btn-block">{:__('Sign in')}</button> </div> </form> </div> </div> </div> {include file="common/script" /} </body></html>
至此后台注册管理员的功能实现,欢迎各位小伙伴指正不足的地方。
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。