Blogger Information
Blog 57
fans 3
comment 0
visits 60349
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
laravel实战-通用后台管理系统-管理员CURD和权限验证中间件
岂几岂几
Original
1089 people have browsed it

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.触发中间件.

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

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:学得时候 会感觉很多的, 实际工作中用得并不是太多的, 不必太担心
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!