博客列表 >laravel实战-通用后台管理系统-管理员CURD和权限验证中间件

laravel实战-通用后台管理系统-管理员CURD和权限验证中间件

岂几岂几
岂几岂几原创
2020年06月25日 17:15:581103浏览

laravel实战-通用后台管理系统-管理员CURD和权限验证中间件

1. 管理员管理CURD

  • 管理员列表

    • 在开发时, 尽量避免使用关联查询. 而管理员列表查询, 除开查询管理员表 admin 外, 还需要获取用户组表 admin_group 的”角色名称”字段值. 暂时先用循环管理员查询结果的方式, 从 admin_group 表中查询对应的角色名称.
      • 在循环中执行数据库操作, 可能会有很大的资源开销. 嵌套查询中避免使用此方式.
  • 新增/修改管理员

    • 使用 layui.open() 弹出iframe层的方式打开新增/修改界面.
    • 提交保存记得带上 laravel 的 post 请求必需的 _token (@csrf).
    • 提交保存前必须做数据验证. 前后端都要做.
    • 使用PHP提供的密码加密函数 password_hash(待加密数据, 加密方式) 来给管理员密码加密. 如: $admin['password'] = password_hash($admin['password'], PASSWORD_DEFAULT); .
    • jQuery 获取checkbox的选中情况: $('input[name="status"]').prop('checked'); , 返回 true / false ; 设置checkbox的选中情况: $('input[name="status"]').prop('checked', true/false) .

弹出iframe层的代码片段:

  1. function add() {
  2. // 打开iframe弹出层
  3. layer.open({
  4. // 弹出层的类型, 2 表示已iframe的方式弹出.
  5. type: 2,
  6. // 弹出界面标题
  7. title: '添加新管理员',
  8. // 点击弹出窗口外的阴影区域是否关闭弹出窗口
  9. shadeClose: false,
  10. // 阴影区域的透明度
  11. shade: 0.8,
  12. // 弹出界面的大小, 可以设置像素值和百分比.
  13. area: ['400px', '55%'],
  14. // 弹出界面的iframe区域的url地址, 即iframe中要渲染的页面地址
  15. content: '/admin/admin/add' //iframe的url
  16. });
  17. }

2. 使用中间件验证登录用户操作权限

  • 权限中间件业务实现中的一些知识点

    • 使用 Auth::user() 可以从 session 中获取保存在其中的登录用户信息.
    • 中间件对象中的 haldler() 方法中, 使用传入的 $request 参数获取请求的控制器名称和方法名称: $request->route()->action['controller'] .
      • 该表达式获取到的值的格式是: namespace\Controller@action , 可以用字符串函数分离出控制器名和方法名.
    • $request 对象的 ajax() 方法, 返回当前请求是否是ajax请求. 当权限验证没有通过时, 可以利用它判断当前请求类型, ajax请求则返回json格式字符串信息, 普通get/post请求返回原始的response相应信息.
    • 创建权限认证中间件, 注册到 $routeMiddleware 属性组.
    • 路由中, 使用 namespace() 方法给路由加上命名空间, 简化给每条路由添加验证中间件的步骤:

      • 加上前:
      1. // 每一条需要中间件的路由都要调用middleware()方法
      2. Route::get('/admin/home/index', 'admins\Home@index')->middleware(['auth', 'right.check']);
      3. Route::get('/admin/home/welcome', 'admins\Home@welcome')->middleware(['auth', 'right.check']);
      • 加上后:
      1. // 使用namespace()方法给路由添加命名空间
      2. Route::namespace('admins')->middleware(['auth', 'right.check'])->group(function() {
      3. // 用户管理
      4. /* 因为加了命名空间, 所以Admin控制前相对Controllers的命名空间前缀admins就可以不写了. 对比上面的'admins\Home@index'... */
      5. Route::get('/admin/admin/index', 'Admin@index');
      6. Route::get('/admin/admin/add', 'Admin@add');
      7. Route::post('/admin/admin/save', 'Admin@save');
      8. // 其他路由...
      9. }

3. 实现代码

3.1 管理员管理CURD

  • 1-管理员列表视图
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>账号列表</title>
  7. <link rel="stylesheet" href="/static/plugin/layui/css/layui.css">
  8. <script src="/static/plugin/layui/layui.js"></script>
  9. </head>
  10. <body>
  11. <div style="text-align: center; color: #666;">
  12. <h2>管理员列表</h2>
  13. </div>
  14. <div style="float: right; height: 50px; line-height: 50px; padding: 0 10px;">
  15. <button class="layui-btn layui-btn-success layui-btn-sm" onclick="add()">新增</button>
  16. </div>
  17. <table class="layui-table">
  18. <thead>
  19. <tr style="text-align: center">
  20. <th>ID</th>
  21. <th>用户名</th>
  22. <th>分组</th>
  23. <th>真实姓名</th>
  24. <th>最后登录时间</th>
  25. <th>用户状态</th>
  26. <th>操作</th>
  27. </tr>
  28. </thead>
  29. <tbody>
  30. @csrf
  31. @foreach($admins as $admin)
  32. <tr>
  33. <td>{{$admin['id']}}</td>
  34. <td>{{$admin['username']}}</td>
  35. <!-- 如果后端的keyval()方法没有指定value列名,则使用这个调用取值 -->
  36. <!-- <td>大括号 大括号 $groups【$admin【'gid'】】【'title'】反大括号 反大括号</td> -->
  37. <!-- 如果后端的keyval()方法指定了value列名,则使用这个调用取值 -->
  38. <td>{{$groups[$admin['gid']]}}</td>
  39. <td>{{$admin['real_name']}}</td>
  40. <td>{{$admin['lastlogin'] ? date('Y-m-d H:i:s', $admin['lastlogin']) : ''}}</td>
  41. <td>{{$admin['status'] == 0 ? '正常' : '禁用'}}</td>
  42. <td>
  43. <button class="layui-btn layui-btn-xs" onclick="edit({{$admin['id']}})">修改</button>
  44. @if($admin['status'] == 0)
  45. <button class="layui-btn layui-btn-danger layui-btn-xs" onclick="delOrResume(1, {{$admin['id']}}, '{{$admin['username']}}')">删除</button>
  46. @else
  47. <button class="layui-btn layui-btn-normal layui-btn-xs" onclick="delOrResume(0, {{$admin['id']}}, '{{$admin['username']}}')">恢复</button>
  48. @endif
  49. </td>
  50. </tr>
  51. @endforeach
  52. </tbody>
  53. </table>
  54. </body>
  55. <script>
  56. layui.use(['layer'], function() {
  57. layer = layui.layer;
  58. $ = layui.jquery;
  59. });
  60. function edit(id) {
  61. layer.open({
  62. type: 2,
  63. title: '修改管理员信息',
  64. shadeClose: false,
  65. // 应该是阴影区域的透明度
  66. shade: 0.8,
  67. // 分别是宽,高
  68. area: ['400px', '55%'],
  69. content: '/admin/admin/edit?id=' + id
  70. });
  71. }
  72. function add() {
  73. layer.open({
  74. type: 2,
  75. title: '添加新管理员',
  76. // 点击弹出窗口外的阴影区域是否关闭弹出窗口
  77. shadeClose: false,
  78. shade: 0.8,
  79. area: ['400px', '55%'],
  80. content: '/admin/admin/add' //iframe的url
  81. });
  82. }
  83. function delOrResume(status, id, username) {
  84. var msg = status == 1 ? '删除' : '恢复';
  85. //询问框
  86. layer.confirm('确定要' + msg + username + '吗?', {
  87. btn: ['确定','取消'] //按钮
  88. }, function(){
  89. var _token = $('input[name="_token"]').val();
  90. $.post('/admin/admin/del_resume', {id: id, resume: status, _token: _token}, function(res) {
  91. if(res.status != undefined && res.status == "0") {
  92. layer.msg(res.message, {icon: 1});
  93. setTimeout(() => {
  94. window.location.reload();
  95. }, 1000);
  96. } else if(res.status != undefined) {
  97. layer.alert(res.message, {icon: 2});
  98. } else {
  99. layer.alert('操作失败', {icon: 2});
  100. }
  101. // layer.alert(res);
  102. }, 'json');
  103. }, function() {
  104. });
  105. }
  106. </script>
  107. </html>

2-添加管理员视图

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>添加新管理员</title>
  7. <link rel="stylesheet" href="/static/plugin/layui/css/layui.css">
  8. <script src="/static/plugin/layui/layui.js"></script>
  9. <style>
  10. body {
  11. padding: 10px;
  12. }
  13. .cms-label {
  14. text-align-last: justify;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <form action="" class="layui-form">
  20. @csrf
  21. <div class="layui-form-item">
  22. <label for="username" class="layui-form-label cms-label">用户名</label>
  23. <div class="layui-input-inline">
  24. <input type="text" class="layui-input" name="username" id="username">
  25. </div>
  26. </div>
  27. <div class="layui-form-item">
  28. <label for="gid" class="layui-form-label cms-label">角色</label>
  29. <div class="layui-input-inline">
  30. <select name="gid" id="gid">
  31. <option value=""></option>
  32. @foreach($groups as $group)
  33. <option value="{{$group['gid']}}">{{$group['title']}}</option>
  34. @endforeach
  35. </select>
  36. </div>
  37. </div>
  38. <div class="layui-form-item">
  39. <label for="password" class="layui-form-label cms-label">密码</label>
  40. <div class="layui-input-inline">
  41. <input type="password" name="password" id="password" class="layui-input">
  42. </div>
  43. </div>
  44. <div class="layui-form-item">
  45. <label for="real_name" class="layui-form-label cms-label">姓名</label>
  46. <div class="layui-input-inline">
  47. <input type="text" name="real_name" id="real_name" class="layui-input">
  48. </div>
  49. </div>
  50. <div class="layui-form-item">
  51. <label for="status" class="layui-form-label cms-label">状态</label>
  52. <div class="layui-input-inline">
  53. <input type="checkbox" name="status" id="status" class="layui-input" title="禁用">
  54. </div>
  55. </div>
  56. <div class="layui-form-item">
  57. <div class="layui-input-block">
  58. <!-- 设置form中的button是普通button, 给button加type="button" -->
  59. <button type="button" class="layui-btn" onclick="save()">保存</button>
  60. </div>
  61. </div>
  62. </form>
  63. </body>
  64. <script>
  65. layui.use(['layer', 'form'], function() {
  66. layer = layui.layer;
  67. form = layui.form;
  68. $ = layui.jquery;
  69. });
  70. /* 提交保存 */
  71. function save() {
  72. var username = $.trim($('input[name="username"]').val());
  73. var gid = $.trim($("input[name='gid']").val());
  74. var password = $.trim($("input[name='password']").val());
  75. var status = $('input[name="status"]').prop('checked') ? 0 : 1;
  76. if (username == '') {
  77. return layer.alert('用户名不能为空', {
  78. icon: 2
  79. });
  80. }
  81. if (isNaN(gid)) {
  82. return layer.alert('请选择一个角色', {
  83. icon: 2
  84. });
  85. }
  86. if (password == '') {
  87. return layer.alert('密码不能为空', {
  88. icon: 2
  89. });
  90. }
  91. // 提交数据
  92. $.post('/admin/admin/save', $('form').serialize(), function(res) {
  93. if (res.status != 'undefined' && res.status == '0') {
  94. layer.msg(res.message, {
  95. icon: 1
  96. });
  97. setTimeout(() => {
  98. window.parent.location.reload();
  99. }, 1000);
  100. } else if (res.status != 'undefined') {
  101. layer.alert(res.message, {
  102. icon: 2
  103. });
  104. } else {
  105. layer.alert('保存出错', {
  106. icon: 2
  107. });
  108. }
  109. }, 'json');
  110. }
  111. </script>
  112. </html>

3- 修改管理员视图

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>修改管理员</title>
  7. <link rel="stylesheet" href="/static/plugin/layui/css/layui.css">
  8. <script src="/static/plugin/layui/layui.js"></script>
  9. <style>
  10. body {
  11. padding: 10px;
  12. }
  13. .cms-label {
  14. text-align-last: justify;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <form action="" class="layui-form">
  20. @csrf
  21. <input type="hidden" name="id" value="{{$admin['id']}}">
  22. <div class="layui-form-item">
  23. <label for="username" class="layui-form-label cms-label">用户名</label>
  24. <div class="layui-input-inline">
  25. <input type="text" class="layui-input" name="username" id="username" value="{{$admin['username']}}">
  26. </div>
  27. </div>
  28. <div class="layui-form-item">
  29. <label for="gid" class="layui-form-label cms-label">角色</label>
  30. <div class="layui-input-inline">
  31. <select name="gid" id="gid" value="{{$admin['gid']}}">
  32. <option value=""></option>
  33. @foreach($groups as $group)
  34. <option {{$admin['gid'] == $group['gid'] ? 'selected' : ''}} value="{{$group['gid']}}">{{$group['title']}}</option>
  35. @endforeach
  36. </select>
  37. </div>
  38. </div>
  39. <div class="layui-form-item">
  40. <label for="password" class="layui-form-label cms-label">密码</label>
  41. <div class="layui-input-inline">
  42. <input type="password" name="password" id="password" class="layui-input">
  43. </div>
  44. </div>
  45. <div class="layui-form-item">
  46. <label for="real_name" class="layui-form-label cms-label">姓名</label>
  47. <div class="layui-input-inline">
  48. <input type="text" name="real_name" id="real_name" class="layui-input" value="{{$admin['real_name']}}">
  49. </div>
  50. </div>
  51. <div class="layui-form-item">
  52. <label for="status" class="layui-form-label cms-label">状态</label>
  53. <div class="layui-input-inline">
  54. <input type="checkbox" name="status" id="status" class="layui-input" title="禁用" {{$admin['status'] ? 'checked' : ''}}>
  55. </div>
  56. </div>
  57. <div class="layui-form-item">
  58. <div class="layui-input-block">
  59. <!-- 设置form中的button是普通button, 给button加type="button" -->
  60. <button type="button" class="layui-btn" onclick="save()">提交</button>
  61. </div>
  62. </div>
  63. </form>
  64. </body>
  65. <script>
  66. layui.use(['layer', 'form'], function() {
  67. layer = layui.layer;
  68. form = layui.form;
  69. $ = layui.jquery;
  70. });
  71. /* 提交修改 */
  72. function save() {
  73. var username = $.trim($('input[name="username"]').val());
  74. var gid = $.trim($("input[name='gid']").val());
  75. var password = $.trim($("input[name='password']").val());
  76. if(username == '') {
  77. return layer.alert('用户名不能为空', {icon: 2});
  78. }
  79. if(isNaN(gid)) {
  80. return layer.alert('请选择一个角色', {icon: 2});
  81. }
  82. // if(password == '') {
  83. // return layer.alert('密码不能为空', {icon: 2});
  84. // }
  85. // 提交数据
  86. $.post('/admin/admin/update', $('form').serialize(), function(res) {
  87. if(res.status != 'undefined' && res.status == '0') {
  88. layer.msg(res.message, {icon: 1});
  89. setTimeout(() => {
  90. window.parent.location.reload();
  91. }, 1000);
  92. } else if(res.status != 'undefined') {
  93. layer.alert(res.message, {icon: 2});
  94. } else {
  95. layer.alert('提交出错', {icon: 2});
  96. }
  97. }, 'json');
  98. }
  99. </script>
  100. </html>

4-管理员控制器

  1. <?php
  2. namespace App\Http\Controllers\admins;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. use Illuminate\Support\Facades\Auth;
  6. use Illuminate\Support\Facades\DB;
  7. class Admin extends Controller {
  8. public function index() {
  9. //print_r(DB::table('admin')->lists());die;
  10. $data['admins'] = DB::table('admin')->lists();
  11. // printf('<pre>%s</pre>', print_r($data, true));die;
  12. // 取代关联查询的方法1:遍历表1查询结果集A,通过结果集A中的外键去查询表2对应的记录,返回想要的字段值
  13. foreach($data['admins'] as &$admin) {
  14. $gid = $admin['gid'];
  15. // 在循环中查询数据库,效率不好,
  16. $adminGroup = DB::table('admin_group')->select('title')->where('gid', $gid)->first();
  17. // printf('<pre>%s</pre>', print_r($gName));
  18. $admin['gName'] = $adminGroup->title;
  19. }
  20. // 传给视图渲染
  21. $data['groups'] = $groups;
  22. return view('admins/admin/index', $data);
  23. }
  24. /* 跳转到新增管理员界面 */
  25. public function add() {
  26. $data['groups'] = DB::table('admin_group')->select(['gid', 'title'])->lists();
  27. return view('admins/admin/add', $data);
  28. }
  29. public function save(Request $req) {
  30. $admin['username'] = trim($req->username);
  31. $admin['password'] = trim($req->password);
  32. $admin['gid'] = trim($req->gid);
  33. $admin['real_name'] = trim($req->real_name);
  34. $admin['status'] = $req->status == 'on' ? 1 : 0;
  35. // 判空
  36. if($admin['username'] == '') {
  37. return json_encode(['status' => 1, 'message' => '用户名不能为空']);
  38. }
  39. if($admin['password'] == '') {
  40. return json_encode(['status' => 1, 'message' => '密码不能为空']);
  41. }
  42. // 判断该用户名是否已存在
  43. $admin_user = DB::table('admin')->where('username', $admin['username'])->first();
  44. if($admin_user) {
  45. return json_encode(['status' => 1, 'message' => '该用户名已存在']);
  46. }
  47. // 执行保存
  48. /* php提供的密码加密函数 */
  49. $admin['password'] = password_hash($admin['password'], PASSWORD_DEFAULT);
  50. $admin['add_time'] = time();
  51. // 保存数据
  52. $res = DB::table('admin')->insert($admin);
  53. if($res) {
  54. return json_encode(['status' => 0, 'message' => '用户添加成功']);
  55. }
  56. }
  57. public function delOrResume(Request $req) {
  58. $id = $req->id;
  59. $status = $req->resume == '' ? 1 : $req->resume;
  60. $msg = $status ? '删除' : '恢复';
  61. // 一般删除是执行update用户状态, 不要物理删除
  62. // $res = DB::table('admin')->where('id', $id)->delete();
  63. $res = DB::table('admin')->where('id', $id)->update(['status'=>$status]);
  64. if($res) {
  65. return json_encode(['status' => 0, 'message' => '用户' . $msg . '成功']);
  66. } else {
  67. return json_encode(['status' => 1, 'message' => '用户' . $msg . '失败']);
  68. }
  69. }
  70. public function edit(Request $req) {
  71. $id = $req->id;
  72. // 验证$id是否有效
  73. if(!filter_var($id, FILTER_VALIDATE_INT, ['option' => [`min_range` => 1]])) {
  74. if($req->ajax())
  75. return json_encode(['status' => 1, 'message' => '无效的id值']);
  76. else
  77. return response('无效的id值', 200);
  78. }
  79. // 验证$id是否存在
  80. $admin = DB::table('admin')->where('id', $id)->getFirst();
  81. // printf('<pre>%s</pre>', print_r($admin, true));
  82. if(empty($admin)) {
  83. if($req->ajax())
  84. return json_encode(['status' => 1, 'message' => '该管理员不存在']);
  85. else
  86. return response('该管理员不存在', 200);
  87. }
  88. $data['admin'] = $admin;
  89. $data['groups'] = DB::table('admin_group')->select(['gid', 'title'])->lists();
  90. return view('/admins/admin/edit', $data);
  91. }
  92. public function update(Request $req) {
  93. /* echo '<pre>';
  94. dump(isset($req->password)); */
  95. // 获取所有参数
  96. $admin = $req->all();
  97. // token不是更新字段项
  98. unset($admin['_token']);
  99. // 状态值
  100. $admin['status'] = (isset($admin['status']) && $admin['status']) == 'on' ? 1 : 0;
  101. // 真实姓名
  102. $admin['real_name'] = isset($admin['real_name']) ? $admin['real_name'] : '';
  103. // 如果
  104. if(isset($admin['password'])) {
  105. $admin['password'] = password_hash($admin['password'], PASSWORD_DEFAULT);
  106. } else {
  107. unset($admin['password']);
  108. }
  109. $id = $admin['id'];
  110. unset($admin['id']);
  111. // DB::connection()->enableQueryLog(); // 开启QueryLog
  112. $res = DB::table('admin')->where('id', $id)->update($admin);
  113. // dump(DB::getQueryLog());die;
  114. if($res) {
  115. return $this->returns($req, '修改成功!', 0);
  116. } else {
  117. return $this->returns($req, '修改失败!');
  118. }
  119. }
  120. private function returns($req, $msg, $status = 1) {
  121. if($req->ajax())
  122. return json_encode(['status' => $status, 'message' => $msg]);
  123. else
  124. return response($msg, 200);
  125. }
  126. }

5-权限验证中间件

  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. use Illuminate\Support\Facades\Auth;
  5. use Illuminate\Support\Facades\DB;
  6. /* 权限验证中间件 */
  7. class RightCheck {
  8. public function handle($request, Closure $next, $guard = null) {
  9. $loginAdmin = Auth::user();
  10. // 当前用户的角色id
  11. $gid = $loginAdmin->gid;
  12. // 获取角色信息
  13. $group = DB::table('admin_group')->where('gid', $gid)->getFirst();
  14. // 角色所拥有的权限(json字符串)
  15. $rights = [];
  16. // 如果角色的权限字段有值
  17. if($group && $group['rights']) {
  18. // 把json字符串转为php数组(入参的第二个参数为true, 则转为数组; 为false, 则返回php对象)
  19. $rights = json_decode($group['rights'], true);
  20. } else {
  21. return json_encode(['status' => 1, 'message' => '你无权执行此操作']);
  22. }
  23. // 获取当前请求的控制器和方法
  24. /* $routeController的值: namespace\Controller@action */
  25. $routeController = $request->route()->action['controller'];
  26. /* 转成数组, 拿到最后一个数组元素值 */
  27. $routeController = explode('\\', $routeController);
  28. /* 弹出最后一个元素 */
  29. $routeController = array_pop($routeController);
  30. /* 把Controller@action拆分成两个值 */
  31. list($controller, $action) = explode('@', $routeController);
  32. // dump($controller);dump($action);die;
  33. /* 查询当前请求的控制器和方法对应的权限id */
  34. $menu = DB::table('admin_menu')->select('mid', 'status')->where('controller', $controller)->where('action', $action)->getFirst();
  35. /* 查不到这个请求权限 */
  36. if(!$menu) {
  37. // return response('该功能不存在', 200);
  38. return $this->noRight($request, '该功能不存在');
  39. }
  40. // dump($menu['mid']); dump($rights);die;
  41. // 没有权限
  42. if(!in_array($menu['mid'], $rights)) {
  43. // 注意,返回必须是底层 response相应, 否则,VerifyCsrfToken.php会报错。
  44. return $this->noRight($request, '权限不足');
  45. }
  46. // 有该权限, 但是该权限被禁用了
  47. if($menu['status'] == 1) {
  48. // 注意,返回必须是底层 response相应, 否则,VerifyCsrfToken.php会报错。
  49. return $this->noRight($request, '该功能已被禁用');
  50. }
  51. $loginAdmin->rights = $rights;
  52. // 把用户信息存到$request对象中
  53. $request->loginInfo = $loginAdmin;
  54. // 放行
  55. return $next($request);
  56. }
  57. /**
  58. * 判断请求是否是ajax请求,若是,则response封装json格式字符串,若不是,则response封装普通文本字符串。
  59. */
  60. private function noRight($request, $msg) {
  61. // 注意,返回必须是底层 response相应, 否则,VerifyCsrfToken.php会报错。
  62. if($request->ajax()) {
  63. return response(json_encode(['status'=>1, 'message'=>$msg]), 200);
  64. } else {
  65. return response($msg, 200);
  66. }
  67. }
  68. }

7-路由

  1. Route::namespace('admins')->middleware(['auth', 'right.check'])->group(function() {
  2. // 用户管理
  3. /* 因为加了命名空间, 所以Admin控制前相对Controllers的命名空间前缀admins就可以不写了. 对比上面的'admins\Home@index'... */
  4. Route::get('/admin/admin/index', 'Admin@index');
  5. Route::get('/admin/admin/add', 'Admin@add');
  6. Route::post('/admin/admin/save', 'Admin@save');
  7. Route::post('/admin/admin/del_resume', 'Admin@delOrResume');
  8. Route::get('/admin/admin/edit', 'Admin@edit');
  9. Route::post('/admin/admin/update', 'Admin@update');
  10. }

学习心得

  • 通用后台管理系统的权限设置: “管理员”被指定”角色/用户组”, “角色/用户组”被分配”菜单访问权限”. 通过”角色/用户组”这个桥梁, 就可以给”管理员”分配”权限”.
  • 可以使用PHP提供的密码加密函数 password_hash(待加密数据, 加密方式) 给管理员密码加密.

  • 使用namespace()方法给多条路由设置命名空间, 把需要在各条路由指定的中间件改成在命名空间指定, 简化路由指定中间件的写法.

  • 复习中间件的使用: 1.创建中间件; 2.注册中间件; 3.触发中间件.

  • 实战课用到的知识好多, 干货太多, 作业很难总结完.

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议