3管理员+权限+退出及登录
在线教育平台
1. 管理员
1.1 管理员添加
分析:
1. 加载并显示视图
2. 修改表单
3. 使用ajax提交数据[ webuploader图片上传插件的使用 ]
4. 控制器接收并校验数据
5. 保存数据并返回结果
1.1.1 加载并显示视图
把h-ui内置的管理员添加页面直接拿过来。

调整页面样式:

效果:

1.1.2 修改表单
控制器:

视图代码:

1.1.3 提交数据
视图代码:

1.1.4 控制器接收并校验数据
控制器代码:

1.1.5 保存数据并返回结果

1.1.6 完善添加管理员功能
使用webuploader上传图片插件来完成图像的上传。这个插件是百度前端团队开发的。

详见附件中的 7-Laravel框架 - webuploader.doc
因为整个项目后台不仅管理员的头像需要使用图片上传,其他的功能也可能使用文件上传,所以建议创建一个统一的方法和路由来处理文件上传。
路由:

控制器:

视图代码:


实例化webuploader插件

HTML标签:

效果:

1.1.6.1 完善头像上传功能,添加一个进度条
HTML代码:

js代码:

效果:

1.1.7 保存上传文件
之前,我们保存文件都是使用本地存储,通过move、store、storeAs进行本地存储,通过store、storeAs第一个参数可以设置存储位置(设备,设备名称在config/filesystem.php文件中)。
接下来,我们使用云存储来保存我们的文件资源。
云存储,也叫对象存储,OSS。
常见的云存储有腾讯云v4,阿里云的OSS,七牛云的对象存储,亚马逊的S3云存储。
我们这里使用的七牛云的对象存储。
七牛云的个人中心:

创建存储空间

创建完成以后,接下来,我们需要在Laravel中使用七牛云的云存储接口,把文件上传到七牛云服务器上,那么我们就使用七牛云提供的sdk开发工具,那么,我们Laravel其实在github上找到对应的七牛云相关的安装包直接下载。


1.1.7.1 安装laravel-storage-qiniu
composer require itbdw/laravel-storage-qiniu
cmd命令行:

打开config/app.php文件。
在providers下标对应的数组中添加
itbdw\QiniuStorage\QiniuFilesystemServiceProvider::class,
代码:

接下来在config/filesystem.php文件中在disks下标对应的数组中加上以下存储设备:

代码:

填写对应的密钥和存储空间名称(bucket)和域名(domain)
密钥在个人面板中可以找到
AK(access_key): UhYWJIgbXnIzPHiZdVCenSnWVksXLlOY4WBAYc91
SK(secret_key): kVIfTnGjvMU6U9f7l5n_0cTzG4rlGh_v-MXdcKlf
获取AK 和 SK

域名(域名要加 协议 ):
存储空间名字:


配置完成以后,直接参考github上面的操作,把上传文件同步到七牛云上面。
代码:

接下来,我们需要把上传文件的地址保存到数据库中。
我们因为使用的webuploader插件ajax上传的,所以需要在控制器返回数据时,设置一个隐藏域来存储这个地址,等待用户提交。
uploader.on( 'uploadSuccess', function( file ) {
$( '#'+file.id ).find('p.state').text('已上传');
});
控制器,代码;
操作时,注意参考https://github.com/itbdw/laravel-storage-qiniu 上面的例子和用法。

视图代码:
html

js

效果:

最终添加头像,一并上传添加管理员数据,效果:

上面改成 img 图片即可。
1.2 管理员删除
因为我们前面直接拿了 角色管理的模型和控制器,所以AdminController就直接拥有了软删除的功能,所以这块我们不需要开发,直接可以使用。
1.3 管理员编辑
这里也是因为我们复制了角色管理的模型和控制器,所以后台大部分直接可以使用,修改的几处地方在于:
- 验证的代码和规则
- 密码是否进行修改
- 帐号的禁用状态是否变化
控制器,代码:


视图,代码:

路由地址(因为我们需要在用户上传图片的时候需要删除旧的图片):
路由地址:

控制器,代码:

2. 权限
直接把整个管理员功能的所有的文件复制一份,修改成权限即可。
2.1 权限相关的路由创建
代码:

2.2 创建资源控制器
php artisan make:controller Admin\AuthController --resource

2.2.1 把AdminController中的代码复制过来
修改以下:
- 把“管理员”改成“权限”
- 把“AdminController” 改成 “AuthController”
- 把“App\Models\Admin” 改成“App\Models\Auth”
- 把 “return view(‘admin.admin.’) 中的“admin.admin” 改成 “admin.auth”
- 把“Admin $admin”改成“Auth $auth”
- 把“$admin” 改成 “$auth”
- 把“adminInfo” 改成 “authInfo”
- 把“new Admin” 改成 “new Auth”
- 把“username” 改成“auth_name”
- 去掉 “use App\Models\Role”
- 把“unique:admin” 修改成 “unique:auth”
2.3 添加权限模型
php artisan make:model Models\Auth
命令行:

代码:
把Admin模型里面的代码,复制一份到Auth模型中。

2.4 权限测试数据添加
php artisan make:seeder AuthTableSeeder
命令行:

代码:

执行数据填充种子文件
php artisan db:seed --class=AuthTableSeeder
命令行:

效果:

2.5 权限列表
2.5.1 调整权限列表的链接
代码:

2.5.2 把角色列表的模板复制过来,并调整代码以及关键词

效果:

修改代码:
修改如下:
- 把“管理员”改成“权限”
- 表格的表头改成输出权限的内容

- 把“admin/admin”改成“admin/auth”
接下来,在控制器中查询对应的权限数据并返回给页面中的ajax
控制器,代码:

HTML表格:

js代码:

效果:

同时,上面的删除功能已经具备了软删除。
2.5.3 完善权限列表的显示
控制器代码:

效果:

2.6 添加权限
2.6.1 修改AuthController@create的代码
控制器,代码:

2.6.2 复制管理员的添加页面

2.6.2.1 修改添加页面的代码
视图,代码:

效果:

2.6.3 控制器接收数据

2.7 给角色分配权限
我们这里要在添加角色的时候,显示所有的顶级权限和子权限出来,供管理员勾选

视图中的权限是三层结构,我们项目中只需要两层即可。

效果:

控制器,代码:

2.7.1 在视图中输出所有的权限
视图代码:

效果:

接下来,我们需要让对应的子权限只出现在其父级权限下面。

效果:

接下来,我们可以继续给权限数据增加多一点的测试数据。例如,权限管理部分的, 角色部分的,或者我们后面的专业、专业分类之类的、会员等。
// 权限
$auth->truncate();
// 顶级权限
$auth->create(['id'=>1,'auth_pid'=>0,'auth_name'=>'专业分类','is_menu'=>1]);
$auth->create(['id'=>2,'auth_pid'=>0,'auth_name'=>'专业管理','is_menu'=>1]);
$auth->create(['id'=>3,'auth_pid'=>0,'auth_name'=>'点播课程','is_menu'=>1]);
$auth->create(['id'=>4,'auth_pid'=>0,'auth_name'=>'点播课时','is_menu'=>1]);
$auth->create(['id'=>5,'auth_pid'=>0,'auth_name'=>'会员管理','is_menu'=>1]);
$auth->create(['id'=>6,'auth_pid'=>0,'auth_name'=>'直播管理','is_menu'=>1]);
$auth->create(['id'=>7,'auth_pid'=>0,'auth_name'=>'试卷管理','is_menu'=>1]);
$auth->create(['id'=>8,'auth_pid'=>0,'auth_name'=>'试题管理','is_menu'=>1]);
$auth->create(['id'=>9,'auth_pid'=>0,'auth_name'=>'管理员管理','is_menu'=>1]);
$auth->create(['id'=>10,'auth_pid'=>0,'auth_name'=>'角色管理','is_menu'=>1]);
$auth->create(['id'=>11,'auth_pid'=>0,'auth_name'=>'权限管理','is_menu'=>1]);
// 专业分类的子权限
$auth->create(['auth_pid'=>1,'auth_name'=>'添加专业分类','auth_action'=>'create','auth_controller'=>'ProfessionCate','auth_address'=>'admin/profession_cate/create']);
$auth->create(['auth_pid'=>1,'auth_name'=>'保存专业分类','auth_action'=>'store','auth_controller'=>'ProfessionCate','auth_address'=>'']);
$auth->create(['auth_pid'=>1,'auth_name'=>'编辑专业分类','auth_action'=>'edit','auth_controller'=>'ProfessionCate','auth_address'=>'']);
$auth->create(['auth_pid'=>1,'auth_name'=>'更新专业分类','auth_action'=>'update','auth_controller'=>'ProfessionCate','auth_address'=>'']);
$auth->create(['auth_pid'=>1,'auth_name'=>'删除专业分类','auth_action'=>'destory','auth_controller'=>'ProfessionCate','auth_address'=>'']);
$auth->create(['auth_pid'=>1,'auth_name'=>'专业分类列表','auth_action'=>'index','auth_controller'=>'ProfessionCate','auth_address'=>'admin/profession_cate','is_menu'=>1]);
// 专业的子权限
$auth->create(['auth_pid'=>2,'auth_name'=>'添加专业','auth_action'=>'create','auth_controller'=>'Profession','auth_address'=>'admin/profession/create']);
$auth->create(['auth_pid'=>2,'auth_name'=>'保存专业','auth_action'=>'store','auth_controller'=>'Profession','auth_address'=>'']);
$auth->create(['auth_pid'=>2,'auth_name'=>'编辑专业','auth_action'=>'edit','auth_controller'=>'Profession','auth_address'=>'']);
$auth->create(['auth_pid'=>2,'auth_name'=>'更新专业','auth_action'=>'update','auth_controller'=>'Profession','auth_address'=>'']);
$auth->create(['auth_pid'=>2,'auth_name'=>'删除专业','auth_action'=>'destory','auth_controller'=>'Profession','auth_address'=>'']);
$auth->create(['auth_pid'=>2,'auth_name'=>'专业列表','auth_action'=>'index','auth_controller'=>'Profession','auth_address'=>'admin/profession','is_menu'=>1]);
// 课程的子权限
$auth->create(['auth_pid'=>3,'auth_name'=>'添加课程','auth_action'=>'create','auth_controller'=>'Course','auth_address'=>'admin/course/create']);
$auth->create(['auth_pid'=>3,'auth_name'=>'保存课程','auth_action'=>'store','auth_controller'=>'Course','auth_address'=>'']);
$auth->create(['auth_pid'=>3,'auth_name'=>'编辑课程','auth_action'=>'edit','auth_controller'=>'Course','auth_address'=>'']);
$auth->create(['auth_pid'=>3,'auth_name'=>'更新课程','auth_action'=>'update','auth_controller'=>'Course','auth_address'=>'']);
$auth->create(['auth_pid'=>3,'auth_name'=>'删除课程','auth_action'=>'destory','auth_controller'=>'Course','auth_address'=>'']);
$auth->create(['auth_pid'=>3,'auth_name'=>'课程列表','auth_action'=>'index','auth_controller'=>'Course','auth_address'=>'admin/course','is_menu'=>1]);
// 课时的子权限
$auth->create(['auth_pid'=>4,'auth_name'=>'添加课时','auth_action'=>'create','auth_controller'=>'Lesson','auth_address'=>'admin/lesson/create']);
$auth->create(['auth_pid'=>4,'auth_name'=>'保存课时','auth_action'=>'store','auth_controller'=>'Lesson','auth_address'=>'']);
$auth->create(['auth_pid'=>4,'auth_name'=>'编辑课时','auth_action'=>'edit','auth_controller'=>'Lesson','auth_address'=>'']);
$auth->create(['auth_pid'=>4,'auth_name'=>'更新课时','auth_action'=>'update','auth_controller'=>'Lesson','auth_address'=>'']);
$auth->create(['auth_pid'=>4,'auth_name'=>'删除课时','auth_action'=>'destory','auth_controller'=>'Lesson','auth_address'=>'']);
$auth->create(['auth_pid'=>4,'auth_name'=>'课时列表','auth_action'=>'index','auth_controller'=>'Lesson','auth_address'=>'admin/lesson','is_menu'=>1]);
// 会员的子权限
$auth->create(['auth_pid'=>5,'auth_name'=>'添加会员','auth_action'=>'create','auth_controller'=>'Member','auth_address'=>'admin/member/create']);
$auth->create(['auth_pid'=>5,'auth_name'=>'保存会员','auth_action'=>'store','auth_controller'=>'Member','auth_address'=>'']);
$auth->create(['auth_pid'=>5,'auth_name'=>'编辑会员','auth_action'=>'edit','auth_controller'=>'Member','auth_address'=>'']);
$auth->create(['auth_pid'=>5,'auth_name'=>'更新会员','auth_action'=>'update','auth_controller'=>'Member','auth_address'=>'']);
$auth->create(['auth_pid'=>5,'auth_name'=>'删除会员','auth_action'=>'destory','auth_controller'=>'Member','auth_address'=>'']);
$auth->create(['auth_pid'=>5,'auth_name'=>'会员列表','auth_action'=>'index','auth_controller'=>'Member','auth_address'=>'admin/member','is_menu'=>1]);
// 管理员的子权限
$auth->create(['auth_pid'=>9,'auth_name'=>'添加管理员','auth_action'=>'create','auth_controller'=>'Admin','auth_address'=>'admin/admin/create']);
$auth->create(['auth_pid'=>9,'auth_name'=>'保存管理员','auth_action'=>'store','auth_controller'=>'Admin','auth_address'=>'']);
$auth->create(['auth_pid'=>9,'auth_name'=>'编辑管理员','auth_action'=>'edit','auth_controller'=>'Admin','auth_address'=>'']);
$auth->create(['auth_pid'=>9,'auth_name'=>'更新管理员','auth_action'=>'update','auth_controller'=>'Admin','auth_address'=>'']);
$auth->create(['auth_pid'=>9,'auth_name'=>'删除管理员','auth_action'=>'destory','auth_controller'=>'Admin','auth_address'=>'']);
$auth->create(['auth_pid'=>9,'auth_name'=>'管理员列表','auth_action'=>'index','auth_controller'=>'Admin','auth_address'=>'admin/admin','is_menu'=>1]);
// 角色的子权限
$auth->create(['auth_pid'=>10,'auth_name'=>'添加角色','auth_action'=>'create','auth_controller'=>'Role','auth_address'=>'admin/role/create']);
$auth->create(['auth_pid'=>10,'auth_name'=>'保存角色','auth_action'=>'store','auth_controller'=>'Role','auth_address'=>'']);
$auth->create(['auth_pid'=>10,'auth_name'=>'编辑角色','auth_action'=>'edit','auth_controller'=>'Role','auth_address'=>'']);
$auth->create(['auth_pid'=>10,'auth_name'=>'更新角色','auth_action'=>'update','auth_controller'=>'Role','auth_address'=>'']);
$auth->create(['auth_pid'=>10,'auth_name'=>'删除角色','auth_action'=>'destory','auth_controller'=>'Role','auth_address'=>'']);
$auth->create(['auth_pid'=>10,'auth_name'=>'角色列表','auth_action'=>'index','auth_controller'=>'Role','auth_address'=>'admin/role','is_menu'=>1]);
// 权限的子权限
$auth->create(['auth_pid'=>11,'auth_name'=>'添加权限','auth_action'=>'create','auth_controller'=>'Auth','auth_address'=>'admin/auth/create']);
$auth->create(['auth_pid'=>11,'auth_name'=>'保存权限','auth_action'=>'store','auth_controller'=>'Auth','auth_address'=>'']);
$auth->create(['auth_pid'=>11,'auth_name'=>'编辑权限','auth_action'=>'edit','auth_controller'=>'Auth','auth_address'=>'']);
$auth->create(['auth_pid'=>11,'auth_name'=>'更新权限','auth_action'=>'update','auth_controller'=>'Auth','auth_address'=>'']);
$auth->create(['auth_pid'=>11,'auth_name'=>'删除权限','auth_action'=>'destory','auth_controller'=>'Auth','auth_address'=>'']);
$auth->create(['auth_pid'=>11,'auth_name'=>'权限列表','auth_action'=>'index','auth_controller'=>'Auth','auth_address'=>'admin/auth','is_menu'=>1]);
2.7.2 执行数据填充种子

效果:

接下来就要在添加角色的时候,保存权限。
2.7.3 修改添加角色的表单

2.7.4 控制器接收数据
代码:

效果:

接下来,我们需要把这些数据保存到数据库中,但是正常情况下,我们的mysql数据无法直接保存数组格式的数据。
laravel的模型有一个类型转换的功能,可以帮我们自动转换数据类型,通过这种自动转换,我们可以实现在存储数据时,把数组转成json格式数据存储到数据库中,同时在获取数据时,Laravel的模型也可以帮我们把json格式的数据转换成数组提供给我们。

Role模型,代码:

接下来,我们完成登录和退出,以及输出当前管理员的权限菜单
3. 登录和退出
前面我们已经创建了路由和引入了登录页面,同时,登录的方法在创建在了IndexController控制器里面了。
3.0.1 调整登录页面的样式

效果:

3.0.2 显示验证码
3.0.2.1 使用composer安装验证码安装包

3.0.2.2 配置验证码

3.0.2.3 生成配置文件

配置文件:

3.0.2.4 显示验证码
代码:

效果:

3.0.2.5 调整表单

3.0.3 控制器接收数据
代码:

3.0.4 使用Auth授权认证类完成登录操作
配置auth.php文件,创建admin后台管理员的登录授权规则。代码:
3.0.4.1 创建新的guard授权认证规则

3.0.4.2 创建新的授权认证服务

最后,修改Admin模型,然后Admin支持使用Auth授权认证类。

3.0.4.3 控制器代码使用Auth授权认证的方法完成登录

视图中显示错误

接下来,我们可以在后台首页和登录方法中,继续完善登录操作,例如登录次数
- 完善记住登录功能。

- 完善登录次数

3.1 使用中间件完成防FQ
3.1.1 创建中间件

3.1.2 把中间件注册到项目中

3.1.3 在路由中调用中间件

3.1.4 中间件检测用户是否已经登录了

3.2 输出当前管理员的权限菜单【作业】
对于用户的权限的防FQ,我们设置在后台功能完善的差不多的时候,再讲。
4. 会员管理
5. 专业和课程模块
专业分类的CURD
专业管理的CURD
点播课程的CURD
点播课时的CURD
6. 直播课程

浙公网安备 33010602011771号