使用 Laravel 快速构建网站系列 —— 内容管理系统:Laravel 5 Boilerplate


1、简介

Laravel 5 Boilerplate不是一个网站,也是一个建站工具,是基于当前Laravel最新版本(Laravel 5.1.*)并集成Boilerplate的项目。

2、GitHub

https://github.com/rappasoft/laravel-5-boilerplate

3、功能特性

  • 自定义访问控制系统(认证/用户/角色/权限)
  • 第三方登录(GitHub/Facebook/Twitter/Google)
  • 通过邮箱验证用户
  • 重新发送确认邮件
  • 登录次数限制(登录失败情况下)
  • 后台管理
    • 用户列表
    • 激活/冻结用户
    • 软删除&永久删除用户
    • 禁止用户
    • 重新发送确认邮件
    • 修改用户密码
    • 创建/管理角色
    • 创建/管理权限
    • 创建/管理权限组
    • 管理用户角色/权限
    • 权限依赖
  • 默认响应式布局
  • 前后端控制器
  • 用户面板
  • 使用 Admin LTE主题的管理员面板
  • 命名空间路由
  • 自带Form/HTML门面
  • 默认表单转化为表单帮助方法
  • 通过通用组件管理布局文件
  • Laravel Elixir 3.0
  • 使用Elixir编译CSS并自动将其置于HTML头部
  • 使用Elixir编译JS并自动将其置于HTML尾部
  • 帮助函数
  • JavaScript/jQuery片段
  • Bootstrap 3(LESS/SASS)
  • HTML5 Boilerplate v5.0
  • Font Awesome (LESS/SASS)
  • 全局消息/异常处理
  • 表单宏(状态和国家下拉框,可轻松扩展)
  • 社会化登录认证集成
  • Laracast生成器
  • Stripe封装类
  • Active Menu
  • PHP转化为JavaScript
  • ARCANEDEV日志查看器
  • 本地化,目前支持英语、意大利语、葡萄牙语(巴西)、俄语以及瑞典语等等
  • 前后端语言选择菜单
  • 头像
  • 标准
    • 干净的控制器
    • Repository/Contract实现
    • 请求类
    • 事件/处理器
    • 整个应用分割成前端/后端
    • 处处本地化

4、安装

composer install
npm install
创建.env文件(示例中已包含)
php artisan key:generate
php artisan migrate
在UserTableSeeder.php设置管理员信息
php artisan db:seed
npm install -g gulp
运行gulp或gulp watch

5、访问控制系统

配置文件

/** Access使用Role模型创建正确的关联 */
access.role

/** Access使用的Roles表用于保存角色到数据库 */
access.roles_table

/** Access使用的Permission模型用于创建正确的关联 */
access.permission

/** Permissions table used by Access to save permissions to the database. */
access.permissions_table

/** Access使用的PermissionGroup模型用于创建权限组. */
access.group

/** Access使用的Permissions表用于保存权限到数据库 */
access.permissions_group_table

/** Access使用的permission_role表用于保存权限和角色之间的关系到数据库 */
access.permission_role_table

/** Access使用的permission_user表用于保存权限和用户之间的关系到数据库,该表仅用于那些只归属于特定用户而不是角色的权限 */
access.permission_user_table
/** 指定权限之间依赖关系的表,例如用户在拥有编辑权限之前必须有对后台的访问权限 */
access.permission_dependencies_table

/** Access使用的assigned_roles用于保存分配的角色到数据库 */
access.assigned_roles_table

/** 用户配置 */
access.users.default_per_page

/** 当用户在前台注册后分配的角色 */
access.users.default_role

/** 用户注册时是否需要邮箱确认 */
access.users.confirm_email

/** 用户邮箱是否可以在编辑用户信息页面被修改 */
access.users.change_email

/** 一个角色是否必须至少包含一个权限还是可以单独存在*/
access.roles.role_must_contain_permission

应用路由中间件

内置的路由中间件允许你通过角色或权限实现登录认证:

Route::group(['middleware' => 'access.routeNeedsPermission:view-backend', function()
{
     Route::group(['prefix' => 'access'], function ()
     {
         /* 用户管理 */
         Route::resource('users', 'Backend\Access\UserController');
     });
});

下面的中间件处理boilerplate:

  • access.routeNeedsRole
  • access.routeNeedsPermission

创建自己的中间件

如果你想要创建属于自己的中间件,可以使用如下方法:

/**
 * 通过名字判断用户是否拥有某个角色
 * @param string $name
 * @return bool
 */
Access::hasRole($role);

/**
 * 判断用户是否拥有某个角色数组,以及认证时是否全部包含才必须返回true
 * @param array $roles
 * @param boolean $needsAll
 * @return bool
 */
Access::hasRoles($roles, $needsAll);

/**
 * 通过名字判断用户是否拥有某个权限
 * 还有一个封装方法hasPermission这个传入参数一样
 * @param string $permission.
 * @return bool
 */
Access::can($permission);

/**
 * 判断权限数组以及是否所有权限都具备才能继续
 * 还有一个封装方法hasPermissions和此传入参数一样
 * @param array $permissions
 * @param boolean $needsAll
 * @return bool
 */
Access::canMultiple($permissions, $needsAll);

Access默认使用当前登录用户,你还可以:

$user->hasRole($role);
$user->hasRoles($roles, $needsAll);
$user->can($permission);
$user->canMultiple($permissions, $needsAll);
$user->hasPermission($permission); //Wrapper function for can()
$user->hasPermissions($permissions, $needsAll); //Wrapper function for canMultiple()

Blade扩展

可以定义一个blade扩展命令将访问控制应用到页面数据的显示与否:

@role

接收角色名称或ID

@role('User')
   只有认证用户有User角色才会显示这里的内容
@endauth

@role(1)
    只有认证用户有ID为1的角色才会显示这里的内容
@endauth

@roles

接收角色名称或ID数组

@roles(['Administrator', 'User'])
    只有认证用户拥有`Administrator`或`User`角色才会显示这里的内容
@endauth

@roles([1, 2])
    只有认证用户拥有ID为1或2的角色才会显示这里的内容
@endauth

@needsroles

接收角色或角色ID数组并且只有用户拥有提供的全部角色时才返回true

@needsroles(['Administrator', 'User'])
    只有认证用户拥有`Administrator`和`User`角色才会显示这里的内容
@endauth

@needsroles([1, 2])
    只有认证用户拥有ID为1和2的角色才会显示这里的内容
@endauth

@permission

接收单个权限名称或ID

@permission('view-backend')
    只有用户拥有`view-backend`权限时才会显示这里的内容
@endauth

@permission(1)
    只有用户拥有ID为1的权限时才会显示这里的内容
@endauth

@permissions

接收权限名称或ID数组

@permissions(['view-backend', 'view-some-content'])
    只有用户拥有`view-backend`或`view-some-content`权限时才会显示这里的内容
@endauth

@permissions([1, 2])
    只有用户拥有ID为1或2的权限时才会显示这里的内容
@endauth

@needspermissions

接收权限或权限ID数组并且用户拥有提供的全部权限时才返回true

@needspermissions(['view-backend', 'view-some-content'])
    只有用户拥有`view-backend`和`view-some-content`权限时才会显示这里的内容
@endauth

@needspermissions([1, 2])
    只有用户拥有ID为1和2的权限时才会显示这里的内容
@endauth
注意:你还可以使用@else用于if/else语句

如果你想要显示或隐藏特定区块,可以在布局文件中这样做:

@role('User')
    @section('special_content')
@endauth

@permission('can_view_this_content')
    @section('special_content')
@endauth

你还可以追加更多blade扩展命令到App\Providers\AccessServiceProvider@registerBladeExtensions

6、权限依赖

权限依赖允许你告诉系统某个权限基于一个或多个其它权限。

例如:如果用户有创建用户权限,那么还要具备查看后台和查看访问管理的权限,否则他们不能到达创建用户界面。因此我们说创建用户权限依赖于查看后台和查看访问管理权限。

你可以在每个权限依赖设置中指定该权限依赖于哪些其他权限。

7、社交媒体

要配置社交媒体登录,添加你的凭证到.env文件。重定向必须遵循这个约定:http://mysite.com/auth/login/SERVICE。目前支持的社交媒体包括github, facebook, twitter, 和google,每一个的登录链接内置于login.blade.php

如果你在本地locahost获取了cURL error 60错误,查看这些指导说明

8、PHP转化为JavaScript

PHP->JavaScript转换器已经包含在本项目中,配置文件是config/javascript.php

默认情况下JavaScript变量绑定到前端布局文件frontend/layouts/master.blade.php,因此你可以在任何前端控制器绑定任何JavaScript方法。

如果你需要在前端和后端控制器都绑定变量,应该创建一个全局总布局文件,并且使用前端/后端布局文件作为其子文件。再然后可以在javascript.bind_js_vars_to_this_view配置选项指定当前布局。

javascript()帮助函数已经添加到全局因此你不再需要在控制器中引入其它文件,只需要像这样调用该方法:

javascript()->put([
    'test' => 'it works!'
]);

这是一个FrontendController@index的示例,并且可以在frontend.index视图文件中打印出来。

9、可能出现的问题及解决办法

如果由于某种原因导致出错,试试下面的解决办法:

删除composer.lock文件

运行dumpautoload命令:

$ composer dumpautoload -o

如果上面的修复失败,并且命令行报错,错误信息指向compiled.php,则删除storage/framework/compiled.php文件。

如果上面的办法都没有奏效,那么只能给我们报告错误了。


Vote Vote Cancel Collect Collect Cancel

<< 上一篇: 快速构建 RESTful API 以及现代化 Web 应用的 Laravel 原型项目 —— Someline

>> 下一篇: 使用 Laravel 快速构建网站系列 —— Laravel 5 Angular Material Starter