为任何 Laravel 应用/网站添加 CMS,以控制:页面、博客、相册、事件、自定义模块、图片等。

维护者

详细信息

github.com/Vestin/CMS

源代码

安装次数: 2

依赖者: 0

建议者: 0

安全性: 0

星标: 0

关注者: 1

分支: 104

语言:CSS

v3.4.3 2020-03-22 02:20 UTC

README

Graphite 已归档此项目,不再支持或开发此代码。我们建议仅将其作为您自己代码的灵感来源。

CMS - 为任何 Laravel 应用添加 CMS,以控制:页面、博客、相册、事件、自定义模块、图片等。

Build Status Packagist license

Graphite CMS 是一个完整的 CMS,可以添加到任何 Laravel 应用程序中。它为您提供了对页面、菜单、链接、小部件、博客、事件、常见问题解答等内容的全面控制。Graphite CMS 包含一个模块构建器,以满足您所有自定义 CMS 需求,以及模块发布工具。因此,如果您决定在未来的项目中重用某些模块,您可以轻松无缝地发布它们的资源。如果您希望将 Graphite CMS 模块转换为 PHP 包,则需要将其资源发布到 cms/modules 目录。

简单设置与复杂设置有何不同?

简单设置使用 Grafite Builder 作为 Laravel 应用的骨架,一旦运行了设置命令,您将拥有一个完整的 CMS 应用。复杂设置是专门为希望将其添加到现有应用的开发者设计的。

作者(s)

一般要求

  1. PHP 7.1.3+
  2. MySQL 5.7+
  3. OpenSSL

兼容性和支持

文档

安装

创建一个新的 Laravel 应用程序,并在某处创建一个数据库,然后更新 .env 文件。

  • 运行以下命令
composer require grafite/cms
  • 然后运行 vendor publish
php artisan vendor:publish --provider="Grafite\Cms\GrafiteCmsProvider"

!!! 提示 "如果您希望使用发布日期时间选择器 - 请将应用程序的时区配置设置为与您的位置相匹配"

简单设置

!!! 警告 "简单设置需要一个全新的 Laravel 应用程序。"

如果您想要一个功能强大的 CMS 的简单网站,并且只有 CMS 管理员登录到应用程序,那么您可以运行设置命令,它会安装所需的一切,运行其迁移,并为您提供一个登录以开始使用。在几秒钟内控制您的网站。

php artisan grafite:cms-setup

现在您已完成了设置。登录,并开始构建您令人惊叹的新网站!

您可以使用以下凭据作为管理员登录

U: admin@example.com
P: admin

复杂设置

!!! 警告 "复杂设置对于已包含现有代码(包括登录/注销设置)的应用程序是必需的。"

如果您只想将 Graphite CMS 添加到现有的应用程序,并且已经运行了自己的应用程序,请按照以下说明操作

  • 将以下内容添加到您的 routes provider 中
require base_path('routes/cms.php');
  • 将以下内容添加到您的 app.scss 文件中,您将需要根据您选择的主题进行修改。
@import "resources/themes/default/assets/sass/_theme.scss";
  • 然后迁移
php artisan migrate
  • 然后将它添加到 Kernel Route Middleware 中
'cms' => \App\Http\Middleware\GrafiteCms::class,
'cms-api' => \App\Http\Middleware\GrafiteCmsApi::class,
'cms-language' => \App\Http\Middleware\GrafiteCmsLanguage::class,
'cms-analytics' => \Grafite\Cms\Middleware\GrafiteCmsAnalytics::class,

为了使模块也能加载,请编辑 composer 文件中的 autoload psr-4 部分

"autoload": {
    ...
    "psr-4": {
        "App\\": "app/",
        ...
        "Cms\\": "cms/"
        }
}

CMS 访问

管理仪表板的路由是 "/cms/dashboard"。

石墨CMS需要石墨构建器才能运行(仅限表单制作器),但石墨CMS不需要您使用石墨构建器版本的角色。但您仍然需要确保对石墨CMS访问的一定程度的控制。这是通过石墨CMS中间件,使用门和石墨CMS策略来完成的。如果您选择使用石墨构建器提供的角色系统,则可以将'cms'替换为admin来处理石墨CMS授权,如果不选择,则需要为石墨CMS的访问设置自己的安全策略。为此,只需将石墨CMS策略添加到您的app/Providers/AuthServiceProvider.php文件中,并确保您希望它使用的任何规则都在策略方法中。我们建议的策略如下。

可能的CMS访问策略

Gate::define('cms', function ($user) {
    return (bool) $user;
});

Gate::define('cms-api', function ($user) {
    return true;
});

或使用石墨构建器

Gate::define('cms', function ($user) {
    return ($user->roles->first()->name === 'admin');
});

有趣的路由技巧

如果您正在寻找无需在URL前加上pagep的干净URL页面,则可以将此添加到您的路由中。

确保将其放在路由的底部,否则可能会与其他路由冲突。

Route::get('{url}', function ($url) {
    return app(App\Http\Controllers\Cms\PagesController::class)->show($url);
})->where('url', '([A-z\d-\/_.]+)?');

角色和权限(仅简单设置)

使用角色中间件,您可以指定哪些角色适用,用管道分隔它们:['middleware' => ['roles:admin|moderator|member']]

石墨CMS中间件利用角色确保用户是'admin'。但您可以对其进行大量扩展,可以创建多个角色,然后使用角色中间件在您的应用程序中设置它们的访问权限。但是,当您想允许多个角色访问CMS但仅允许管理员访问您的自定义模块时怎么办?您可以使用权限来实现这一点。类似于角色中间件,您可以设置权限['middleware' => ['permissions:admin|cms']]。您可以在config/permissions.php中设置自定义权限。这意味着您可以为CMS的不同部分设置不同的角色权限,从而提供更多控制。

API端点

如果您想使用它们,石墨CMS附带了一系列有用的API端点。您可以为访问定义自己的策略,并根据需要自定义中间件。

令牌

基本石墨CMS API端点必须携带在应用配置中定义的石墨CMS apiToken。这可以通过向任何请求添加以下内容来提供

?token={your token}

** 默认情况下,所有已发布和面向公众的数据将通过API提供。

/cms/api/blog
/cms/api/blog/{id}
/cms/api/events
/cms/api/events/{id}
/cms/api/faqs
/cms/api/faqs/{id}
/cms/api/files
/cms/api/files/{id}
/cms/api/images
/cms/api/images/{id}
/cms/api/pages
/cms/api/pages/{id}
/cms/api/widgets
/cms/api/widgets/{id}

图像

图像在上传时会被调整大小以提高响应时间。它们遵循在config下的cms.max-image-size中指定的指南。

S3

关于S3存储桶的使用。您需要设置相应的权限,以便允许将图像保存到您的存储桶中。然后您需要设置您的存储桶以允许公共查看访问。这是一个这样的策略示例。

{
    "Version":"2008-10-17",
    "Statement":[{
        "Sid":"AllowPublicRead",
        "Effect":"Allow",
        "Principal": {
            "AWS": "*"
        },
        "Action":["s3:GetObject"],
        "Resource":["arn:aws:s3:::MY_BUCKET/public/images/*"]
    }]
}

MY_BUCKET替换为您的存储桶名称。

文件系统配置

如果使用S3,您需要将以下行添加到您的文件系统配置中:'visibility' => 'public',

此外还提供

石墨CMS包还提供了以下包

  • DevFactory/Minify
  • Grafte/Builder

配置

石墨CMS有一个相当复杂的配置,提供了许多选项。您可以扩展核心模块,启用/禁用功能,并配置更多内容。

API

石墨CMS的API非常简单,并且它使用一个非常简单的认证系统,使用一个单一代码令牌,该令牌可以在您的env中定义。您可以使用它轻松管理与各种平台的集成等。所有API请求的一般基本路由是

/cms/api/{resource-url}?token={CMS_API_TOKEN}

您可以通过调用这些路由中的任何一个,或者您也可以通过ID获取特定的资源实例

示例

/cms/api/blog/1?token=9a78sd6f9as6df9

多语言

翻译

在我们的网站和应用程序中,常常需要翻译。Grafite CMS 提供了一种非常简单的方式来处理多语言。在配置中,如果您向 languages 数组添加任何语言,您将能够为这些语言定义自定义条目。

自动翻译

auto-translate: false

为了启用自动翻译,请确保在您的配置中将它设置为 true。

可翻译模块

只需将可翻译特征添加到您模块的模型中,然后更新您的模块以遵循类似 Grafite CMS 页面结构的模式,参考以下文件

Grafite\Cms\Controllers\PagesController
Grafite\Cms\Repositories\PageRepository
Grafite\Cms\Models\Page

存档和清理

您需要扩展 CmsModel 而不是默认的 Model。它还需要使用 Translatable 特征。

use Grafite\Cms\Models\CmsModel;
use Grafite\Cms\Traits\Translatable;

class Books extends CmsModel
{
    use Translatable;
}

您还需要在模块事件提供者中设置类似以下的绑定。

'eloquent.saved: Grafite\Cms\Models\Page' => [
    'Grafite\Cms\Models\Page@afterSaved',
],
'eloquent.created: Grafite\Cms\Models\Page' => [
    'Grafite\Cms\Models\Page@afterCreate',
],
'eloquent.deleting: Grafite\Cms\Models\Page' => [
    'Grafite\Cms\Models\Page@beingDeleted',
],

这些绑定确保在您保存时创建前一个条目的存档,并在删除项目时,系统清除任何翻译和留下的存档。创建的绑定允许自动翻译,因此您可以使用 Google Translate 的功能。

语言链接

Grafite CMS 随带一个 blade 指令,可以生成您支持的语言的链接,并提供了一种简单的方法,在保持同一 URL 的情况下,在单个页面或博客条目的语言之间切换。

支持语言 URL 前缀

默认情况下,我们支持使用 cookie 来处理语言和切换它们。由于每个页面/博客/事件等都可以有与其语言相关的特定 URL,在当前构建中,语言前缀并没有太大的意义。但是,话虽如此,有时这很方便,因此这里有一个简单的方法来添加对其的支持。

只需将此代码添加到 RouteServiceProvider.php 中的 map() 方法中。

$segments = request()->segments();
$supportedLanguages = array_keys(config('cms.languages'));

if (isset($segments[0]) && in_array($segments[0], $supportedLanguages)) {
    $language = $segments[0];
    unset($segments[0]);
    return redirect(implode('/', $segments))->withCookie('language', encrypt($language))->send();
}

促销

正如其名称所暗示的那样,促销就像广告。它们旨在像小工具一样处理,主要区别在于它们有时间范围。这意味着您可以组合促销材料和内容,并设置它们的发布日期和时间,以及完成的日期和时间,以便促销消失。这使得安排活动的推出等变得非常容易。

@promotion('slug')

您可以在任何主题文件上设置这些。我们建议您将它们留在主题文件中,并在需要时更改内容和日期。

主题

Grafite CMS 内置了一个完整的主题工具。您可以轻松生成基本主题,这些主题可以在此基础上构建,并且可以保持您的视图清晰。所有带有星号的列表模板都是可选的 - 否则,所有其他内容都是基本支持所必需的。

基本主题结构

  • assets
    • js
      • theme.js
    • sass
      • _basic.scss
      • _theme.scss
  • blog
    • all.blade.php
    • featured-template.blade.php
    • show.blade.php
  • events
    • all.blade.php
    • date.blade.php
    • calendar.blade.php
    • featured-template.blade.php
    • show.blade.php
  • faqs
    • all.blade.php
  • gallery
    • all.blade.php
    • show.blade.php
  • layout
    • master.blade.php
  • pages
    • all.blade.php
    • featured-template.blade.php
    • home.blade.php
    • show.blade.php
  • partials
    • navigation.blade.php
  • public
    • img

您可以使用 @theme('path') 指令通过 Blade 将其他主题视图包含到您的视图中。否则,基本上是 Blade 可以做的任何事情,包括您希望扩展的任何指令。

Blade 指令

Grafite CMS 为 Blade 添加了一些自定义指令,这使得您可以轻松地将文件从您的主题中包含进来,以及其他部分。

@theme('path.to.view')

您始终可以向 @include('path') 添加 cms-frontend:: 命名空间,或者使用 @theme('path')

@block('slug')

使用模板中的块指令在页面和博客中创建独特而优雅的设计。

!!! 注意:使用块刀指令时,您没有指定需要加载的模块,它将从请求URL中的第一个字符串中确定。如果没有匹配的模块名称与URL匹配,则默认为页面。在类似 events 的情况下,它期望模板中的变量为 $event。它被包裹在 optional 方法中,以保护视图不会破坏应用程序。

@menu('slug')

使用菜单刀指令轻松将菜单添加到您的视图中。

@modules(['modules-to-ignore'], 'link-class', 'list-item-class')

自动生成模块链接(默认为Bootstrap 4)。

@widget('slug')

使用菜单刀指令将小部件添加到您的视图中,只需指定SLUG即可。

@image('id', 'class')

提供带有html标签和额外类名的图片URL。

@image_link('ID')

提供图片URL。

@images('tag')

图片将作为数组提供,如果您跳过标签,则方法将返回所有图片,否则将遵循标签。

@edit('module', 'id')

还有Grafite CMS服务可以在您的刀片视图中运行。它很简单,就像 {{ Cms::method() }}。

@markdown('content')

将您的Markdown博客或页面条目转换为HTML。

@languages('link-class', 'list-item-class')

为您的网站中支持的每种语言生成链接。

可用助手方法

  • menu('slug', 'optional-view-path')
  • images('tag')
  • widget('slug')
  • editBtn('module', 'id')

页面和块

页面有一些特殊功能,这些功能在其他网站部分不可用。

页面是特殊的,通常需要复杂的设计。如果您的应用程序需要一些更抽象的设计,您仍然可以使用Grafite CMS通过使用块系统来管理页面。

{!! $page->block('main') !!}

{{ block('main') }}

通过在模板中放置此类代码,Grafite CMS将在不存在时生成 main 块。如果它已经存在并且有内容,它将渲染内容。这真的很简单。

发布

命令

php artisan theme:publish {name}

Grafite CMS主题发布者只会发布公共目录。如果您想集成资产,您需要使用您的 webpackgulp 文件来完成,具体取决于您使用的设置。

基本主题(顶级)

  • assets
  • blog
  • events
  • faqs
  • gallery
  • layout
  • pages
  • partials
  • public
    • img

符号链接

命令

php artisan theme:link {name}

Grafite CMS主题链接工具将在您的公共文件夹和公共目录中的名为 theme 的文件夹之间创建符号链接。这可以使在主题内管理资产更容易。

基本主题(顶级)

  • assets
  • blog
  • events
  • faqs
  • gallery
  • layout
  • pages
  • partials
  • public -> {app_directory}/public/theme
    • img

模块

Grafite CMS附带了一些用于处理基本应用程序/网站的模块,包括:图片、文件、博客、页面、常见问题解答等。下面您将找到Grafite CMS预包装的所有模块的完整列表。为了创建您自己的模块并确保它们被加载,您必须在您的 composer.json 文件中的PSR-4组中添加 "Cms\\": "cms/"

预包装模块

  • 博客
  • 页面
  • 菜单
  • 小部件
  • 常见问题解答
  • 图像
  • 文件
  • 事件

您有制作任何模块的自由。您可以使用 artisan module:makeartisan module:crud 生成它们,然后使用 artisan module:publish 发布它们的内容。

资产

Grafite CMS模块有一个 Assets 目录,该目录旨在包含所有您的JS和SASS或CSS。为了在您的模块中加载资产,您可以使用 Cms 门面。

Grafite CMS附带了一个压缩包,您可以使用类似于下面的调用轻松加载模块资产。您不需要设置内容类型。但根据您加载的内容,您可能希望覆盖Cms服务确定的内容类型。

因此,如果您想在示例模块的资产中加载CSS文件,您可以执行以下操作

Assets/css/styles.css 是我们要获取的文件。

<link rel="stylesheet" type="text/css" href="{{ Cms::moduleAsset('sample', 'css/styles.css', 'text/css') }}">

或者我们可以加载一些JavaScript,是的,jQuery已经包含在Grafite CMS中了。

Assets/js/module.js 是我们要抓取的文件。

<script type="text/javascript" src="{{ Cms::moduleAsset('sample', 'js/module.js', 'application/javascript') }}"></script>

Composer

因此,现在你已经创建了一个CMS模块,并且它很好地为你的应用程序服务,但现在你决定最好将其作为一个composer包,这样你就可以在任何应用程序中运行它,以便更容易维护。这也让你有更大的自由来决定如何将模块集成到你的应用程序中。

module:composer {name} {namespace}

这将生成一个composer文件,同时将你的模块命名空间设置为一个新的包命名空间。

配置

配置自动加载并添加到cms配置中。

config('cms.modules.sample') // would retrieve the sample modules internal config.php contents

如果你想访问一个可以自定义你模块的配置,你可以发布一个

php artisan vendor:publish

CRUD

Grafite CMS可以为你的应用程序生成自定义CRUD模块,为你提供你想要的所有功能,并且尽可能快。只需运行命令:php artisan module:crud,并发现Grafite CMS内部的许多隐藏功能。CRUD生成器将生成一个包含基本单元测试的模块。然后你需要设置你的迁移等,然后将模块发布到你的应用程序中。查看发布以获取更多详细信息。

表单

你可以使用由Grafite Builder提供的表单制作工具。

Redactor

你可以在CRUD中利用redactor(所见即所得)通过将.redactor添加到任何textarea类中。

图片和文件

在redactor实例中,你可以轻松添加已上传到Grafite CMS的图片和文件。只需点击它们即可将它们添加到条目中。

前端/ 主题

当你生成一个模块时,系统也会生成一个前端或主题组件,它保存在Publishes目录中。这是你的访问者将看到的代码部分。你需要使用php artisan module:publish {name}命令发布此代码。只要你将模块保留在cms/modules目录中,就可以这样做。然而,你还可以将你的模块制作成一个composer包。

文件 & 图片

Grafite CMS始终关注你提供的内容的安全性,以及你网站/应用程序中的潜在开放门户。因此,上传到CMS的文件在公共访问点之外被锁定。

这意味着什么?

这意味着当你的网站向访客提供这些内容时,他们实际上是通过一个API访问点获取的。这样做是为了确保文件不泄露其位置。这意味着没有任何网络爬虫可以爬取你的目录并提取不应该提取的文件,包括尚未发布的文件。

存储位置

你可以在配置中设置文件上传的存储位置。这可以是S3或本地。要正确配置S3,你需要像配置S3一样配置Laravel。Grafite CMS将接管余下的工作。所以只需将你的详细信息添加到配置中,它应该就能正常工作。CMS加载所有你需要的三方包。

制作

Grafite CMS有一个强大的CRUD构建器。但假设你想要一个与另一个服务集成或根本不涉及CRUD的自定义模块。那么php artisan module:make命令将是你的最佳工具。它将创建一个具有非常基本的行政层和客户端层的最小可行模块,你可以根据自己的需求进行自定义。

Redactor

你可以在模块中利用redactor,通过将.redactor添加到任何textarea类中。

图片和文件

在redactor实例中,你可以轻松添加已上传到CMS的图片和文件。只需点击它们即可将它们添加到条目中。

前端/ 主题

当您生成模块时,系统还会生成一个前端或主题组件,它保存在Publishes目录中。这是您的访问者将看到的代码部分。您需要使用php artisan module:publish {name}命令发布此代码。

发布

所有自定义模块都需要发布其《发布》文件夹,以便将代码添加到您的应用程序中。我们已将其封装为一个简单的命令

php artisan module:publish

运行此命令将文件放置在应用程序中相应的文件夹中。因此,如果您想将文件放在迁移中,请确保您的《发布》文件夹中有一个类似这样的迁移文件

Publishes/database/migrations/migration_file.php

如果您在Grafite CMS中更改主题,您需要重新发布您的模块。视图直接添加到主题中。

许可证

Grafite CMS是开源软件,受MIT许可证许可。

Redactor许可证

Grafite为Grafite CMS包中Redactor的使用提供OEM许可证。您完全欢迎使用Grafite CMS包并将其集成到您构建的任何应用程序中,您有权将这些应用程序作为SaaS或其他产品提供。但是,您无权剥离Redactor的部分并重新销售,请参阅此许可证以获取更多信息

错误报告和功能请求

请尽可能详细地提供有关提交问题和功能请求的详细信息

免责声明

本软件按“原样”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、特定用途的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论是基于合同、侵权或其他方式,源自、因或与软件或软件的使用或其他交易有关。