laravel 7 在线教育项目实操笔记(2)--后台基础功能开发
基础功能:后台登录、退出、后台首页页面的展示
1、创建管理员数据表
数据字典:在以后开发项目的时候经常的去用到。数据字典就是通过表格化的形式展示了数据表中应该有的字段信息。
表名:manager
1、创建迁移文件
php artisan make:migration create_manager_table
2、编写迁移文件的代码,文件位置:database/migrations/
public function up()
{
schema::create('manager', function (blueprint $table) {
$table->increments('id'); //主键
$table->string('username',20)->notnull(); //用户名
$table->string('password')->notnull(); //密码
$table->enum('gender',[1,2,3])->notnull()->default('1'); //性别 1男 2女 3保密
$table->string('mobile',11); //手机
$table->string('email',50); //邮箱
$table->tinyinteger('role_id'); //角色
$table->timestamps(); //时间
$table->remembertoken(); //记住登录
$table->enum('status',[1,2])->notnull()->default('2'); //账号状态
});
}
public function down()
{
//删表方法
schema::dropifexists('manager');
}
3、执行迁移文件
php artisan migrate:install //首次使用迁移先生成迁移记录表
php artisan migrate
4、快速填充数据
插件 faker
创建填充器文件 php artisan make:seeder managertableseeder
编写填充器的代码文件 使用方法参考:https://packagist.org/packages/fzaninotto/faker
提示:在laravel中系统提供了一个用户密码加密的函数:bcrypt,语法:bcrypt(密码文明)
database\seeds\managertableseeder.php
<?php
use illuminate\database\seeder;
class managertableseeder extends seeder
{
/**
* run the database seeds.
*
* @return void
*/
public function run()
{
$faker = faker\factory::create("zh_cn");
for($i=0;$i<100;$i++) {
$data[] = [
'username' => $faker->username,
'password' => bcrypt("123456"),
'gender' => mt_rand(1, 3),
'mobile' => $faker->phonenumber,
'email' => $faker -> email,
'role_id' => mt_rand(1, 6),
'created_at' => date('y-m-d h:i:s', time()),
'status' => mt_rand(1, 2)
];
}
db::table('manager')->insert($data);
}
}
执行填充器文件 php artisan db:seed --class=managertableseeder
5、后台登录页面的展示
确定路由 /admin/public/login
到routes/web.php中添加路由
route::group(['prefix'=>'admin'],function () {
route::get('public/login', 'admin\publiccontroller@login');
});
6、创建控制器文件
php artisan make:controller admin\publiccontroller
7、创建需要的login方法 在app\http\controllers\admin\publiccontroller.php中添加
public function login(){
return view('admin.public.login');
}
8、创建需要的视图文件 以h-ui admin模板演示 http://www.h-ui.net/h-ui.admin.shtml
将login.html文件复制到 /resources/views/admin/public/下 如无admin/public文件夹 自己手动创建
改login.html名为login.blade.php 将页面中使用的js css文件地址替换为项目中实际的文件地址
9、登录页面验证码添加
验证码的下载地址:https://packagist.org/packages/mews/captcha 安装命令:composer require mews/captcha
10、配置config/app.php文件中的providers和aliases数组
providers中加 mews\captcha\captchaserviceprovider::class,
aliases中加 'captcha' => 'mews\captcha\facades\captcha',
11、修改模板验证码图片url地址为 {{captcha::src('edu')}}
edu为自己配置 配置地址 vendor\mews\captcha\config\config.php
'edu' => [
'length' => 4,
'width' => 120,
'height' => 36,
'quality' => 90,
'math' => false,
],
12、管理员登录的自动验证 提交的路由地址路由:/admin/public/check post
将模板文件中接收用户名 密码的 url修改为 /admin/public/check
13、添加csrf验证的隐藏域 添加位置 :from表单内的任何位置 如 {{csrf_field()}}</from>
14 记住登录功能 给“使我保持登录状态”复选框添加一个默认值如 value=1
<input type="checkbox" name="online" id="online" value="1">
使我保持登录状态</label>
15 编写check方法
语法:$this -> validate($request,[规则数组]);
public function check(request $request){
$this->validate($request,[
'username' =>'required|min:2|max:20', //最小2 最大20位
'password' =>'required|min:6', //最小6位
'captcha' =>'required|size:4|captcha', //验证码长度
]);
16 在登录模板页面上显示自动验证没有通过的时候的错误信息
<script type="text/javascript">
@if (count($errors) > 0)
var allerror="";
@foreach ($errors->all() as $error)
allerror +="{{$error}}<br>";
@endforeach
layer.alert(allerror,{title:'错误提示'});
layer.msg(allerror, {
time: 20000, //20s后自动关闭
btn: ['确定']
});
@endif
</script> //使用layerjs插件 记得引入layer
17、管理员身份验证
语法:auth::guard(指定guard实例) -> attempt(需要验证的用户信息关联数组,[bool值]);
因需要auth门面 所以在publiccontroller.php中引入
use auth;
18、在/config/auth.php中添加guard实例
仿照官方原有的实例 guards数组中添加
'admin' => [
'driver' => 'session',
'provider' => 'admin',
],
providers数组中添加
'admin' => [
'driver' => 'eloquent',
'model' => app\admin\manager::class,
],
// 'model' => app\admin\manager::class 为创建实例所用到的模型 稍后添加
19、创建需要使用的模型(guard需要使用)
php artisan make:model admin/manager
20、定义模型的基本属性:app\admin\manager.php文件中 添加
protected $table = 'manager'; //定义当前模型需要关联的mysql表
记得在class manager extends......内添加
21、继续身份验证 publiccontroller.php文件
添加 $data= $request -> only(['username','password']);
$data['status'] = '2';
$result=auth::guard('admin')->attempt($data,$request->get('online'));
dd($result); 打印结果 false为验证不成功
22、在验证对的情况下会产生报错
修改app\admin\manager.php
添加 use illuminate\auth\authenticatable;
class manager extends model implements \illuminate\contracts\auth\authenticatable
添加 use authenticatable;
完整代码:
<?php
namespace app\admin;
use illuminate\database\eloquent\model;
use illuminate\auth\authenticatable;
class manager extends model implements \illuminate\contracts\auth\authenticatable
{
//
protected $table = 'manager';
use authenticatable;
}
23、根据错误信息判断跳转方向:
语法:return redirect(路由) -> witherrors([错误信息的数组]);
if($result){
return redirect("/admin/index/index");
}
else{
return redirect("/admin/public/login")->witherrors(['loginerror'=>'用户名密码错误']);
}
完整代码:
<?php
namespace app\http\controllers\admin;
use app\http\controllers\controller;
use illuminate\http\request;
use auth;
class publiccontroller extends controller
{
//登录页面的展示
public function login(){
return view('admin.public.login');
}
public function check(request $request){
$this->validate($request,[
'username' =>'required|min:2|max:20',
'password' =>'required|min:6',
'captcha' =>'required|size:4|captcha',
]);
//继续开始进行身份核实
$data= $request -> only(['username','password']);
$data['status'] = '2';
$result=auth::guard('admin')->attempt($data,$request->get('online'));
if($result){
return redirect("/admin/index/index");
}
else{
return redirect("/admin/public/login")->witherrors(['loginerror'=>'用户名密码错误']);
}
}
//logout为添加的退出登录方法
public function logout(){
auth::guard('admin')->logout();
return redirect("/admin/public/login");
}
}
//记得在web.php中添加 logout规则 route::get('public/logout', 'admin\publiccontroller@logout');
后台首页的展示
定义后台首页的路由约定:/admin/index/index /admin/index/welcome
24、添加路由 web.php中
route::get('index/welcome','admin\indexcontroller@welcome');
route::get('manager/index','admin\managercontroller@index');
25、 创建需要的控制器文件
php artisan make:controller admin/indexcontroller
26、编写index方法、welcome方法,展示各自的视图
public function index(){
return view('admin.index.index');
}
public function welcome(){
return view('admin.index.welcome');
}
27、创建需要的两个视图文件(index.blade.php和welcome.blade.php)
复制h-ui admin模板文件夹中的 index.html welcome.html文件到resources\views\admin\index\下 并改名为 index.blade.php welcome.blade.php
如无文件夹 手动创建
记得修改模板所需的js css路径
28、获取已经登录的用户名
{{auth::guard('admin')->user()->username}}
29、路由保护 语法:-> middleware(中间件名称)
在web.php中需要保护的路由 如
route::get('index/welcome','admin\indexcontroller@welcome')->middleware('auth:admin');
route::get('manager/index','admin\managercontroller@index')->middleware('auth:admin');
也可以分组如
route::group(['prefix'=>'admin'],function () {
route::get('public/login', 'admin\publiccontroller@login')->name('login');
route::post('public/check', 'admin\publiccontroller@check');
route::get('public/logout', 'admin\publiccontroller@logout');
});
route::group(['prefix'=>'admin','middleware'=>'auth:admin'],function () {
route::get('index/index','admin\indexcontroller@index');
route::get('index/welcome','admin\indexcontroller@welcome');
route::get('manager/index','admin\managercontroller@index');
});
注意:a. 需要判断是否登录页面全部都加上中间件的保护;
b. 在跳转的时候,系统默认使用login路由别名,如果没有则报“路由找不到”的错误,因此需要给登录路由添加“login”别名;