美文网首页Laravel开发实践laravel 笔记laravel
laravel中使用markdown及语法高亮

laravel中使用markdown及语法高亮

作者: 北极熊猫2017 | 来源:发表于2018-01-14 16:54 被阅读46次

    laravel中使用markdown及语法高亮

    [toc]

    一、 新建项目

    composer create-project laravel/laravel=5.3 blog --prefer-dist

    0

    二、安装所需要的扩展包

    1. 切换到项目目录
    cd blog
    
    1. 创建并修改数据库

    2. npm安装

        npm install
        如果是淘宝镜像源用
        cnpm install
    
    1

    没有报错就算安装好了

    1. artisan生成登录注册模块
    php artisan make:auth
    
    1. 执行迁移
    php artisan migrate
    

    因为上面的auth命令会生成这两个表,执行php artisan migrate迁移命令之后,就会自动创建好这两个表。

    3
    1. 安装中文语言包
    composer require "caouecs/laravel-lang:~3.0"
    

    如果你不确定要安装什么版本或者包名称以及版本等,也可以这样使用

    composer requre
    通过关键词`lang`搜索
    Search for a package: lang
    输入关键词之后会列出所有关键词相关的包
    Enter package # to add, or the complete package name if it is not listed: 1
    然后输入对应数字就可以安装了
    版本之类的默认可以了
    
    4

    安装之后将语言包移动到对应位置就好了,语言包默认位置是resources/lang

    cp -a vendor/caouecs/laravel-lang/src/zh-CN resources/lang
    

    最后我们将本地语言改成zh-CN就好了
    修改config/app.php
    local的值改为zh-CN

    5

    三、安装laravel-admin后台管理

    当然了,你也可以自己写一个后台模板。但毕竟费时费力,laravel后台有很多优秀的开源管理后台。为了方面快捷的演示,我们就选择laravel-admin这个管理后台。

    项目:GitHub地址: z-song/laravel-admin

    中文说明文档

    1. 安装laravel-admin
    composer require encore/laravel-admin "1.3.*"
    
    • 注意:因为我们演示是使用的laravel5.3版本

    当然也可以这样安装

    composer requre
    输入关键字`laravel-admin`
    Enter package # to add, or the complete package name if it is not listed: 3
    这列表项里选择 [3] `encore/laravel-admin`
    Enter the version constraint to require (or leave blank to use the latest version): 1.3
    注意我们这里版本不能选默认版本的,版本填1.3就好了。
    
    6

    config/app.php加入ServiceProvider:

    Encore\Admin\Providers\AdminServiceProvider::class
    

    然后运行下面的命令来发布资源:

    php artisan vendor:publish --tag=laravel-admin
    
    7

    在该命令会生成配置文件config/admin.php,可以在里面修改安装的地址、数据库连接、以及表名。

    然后运行下面的命令完成安装:

    php artisan admin:install
    
    8

    启动服务后,在浏览器打开 http://localhost:8000/admin/ ,使用用户名 admin 和密码 admin登陆.

    如果需要上传图片请参考文件上传设置

    四、快速创建文章管理

    1. 创建迁移表
    php artisan make:migration create_posts_table --create=posts
    
    1. 修改迁移表database/2018_01_13_165831_create_posts_table.php
        public function up()
        {
            Schema::create('posts', function (Blueprint $table) {
                $table->increments('id');
                $table->text('title');
                $table->text('subtitle');
                $table->text('cover');
                $table->enum('type', ['0', '1', '2', '3', '4', '5', '9'])->default('0');
                $table->text('content');
                $table->timestamps();
            });
        }
    
    1. 执行迁移php artisan migrate
    9
    1. 创建文章模型和控制器

    创建Post模型

    php artisan make:model App\\Models\\Post
    
    10

    创建PostController控制器

    php artisan admin:make PostController --model=App\\Models\\Post
    
    11
    1. 新增一条路由Admin/routes.php
    $router->resource('/post', 'PostController');
    
    1. 修改Admin/PostController里面的formgrid两个方法
        protected function grid()
        {
            return Admin::grid(Post::class, function (Grid $grid) {
    
                $grid->id('ID')->sortable();
                $grid->title('标题');
                $grid->subtitle('副标题');
                $grid->type('类型')->options([
                    '0' => 'php',
                    '1' => 'laravel',
                    '2' => 'javascript',
                    '3' => 'python',
                    '4' => 'golang',
                    '5' => 'linux',
                    '9' => 'other'
                ]);
                $grid->cover('封面')->image();
                $grid->content('内容')->limit(100);
                $grid->created_at('创建时间');
                $grid->updated_at('修改时间');
            });
        }
    
        protected function form()
        {
            return Admin::form(Post::class, function (Form $form) {
    
                $form->display('id', 'ID');
                $form->text('title', '标题');
                $form->textarea('subtitle', '副标题')->rows(3);
                $form->select('type', '类型')->options([
                    '0' => 'php',
                    '1' => 'laravel',
                    '2' => 'javascript',
                    '3' => 'python',
                    '4' => 'golang',
                    '5' => 'linux',
                    '9' => 'other'
                ]);
                $form->image('cover', '封面');
                $form->editor('content', '内容');
                $form->display('created_at', '创建时间');
                $form->display('updated_at', '修改时间');
            });
        }
    

    创建一个文章表单,打开是这样的。laravel_admin默认是集成了CKEditor

    12

    五、集成markdown编辑器

    如何修改默认编辑器,请参考form组件管理部分

    1. https://simplemde.com 下载simplemde的文件
      先下载前端库文件Simplemde, 解压到目录 public/packages/admin/simplemde

    2. 新建组件类app/Admin/Extensions/Simplemde.php

    <?php
    
    namespace App\Admin\Extensions;
    
    use Encore\Admin\Form\Field;
    
    class Simplemde extends Field
    {
        protected $view = 'admin::form.editor';
    
        protected static $css = [
            '/packages/admin/simplemde/dist/simplemde.min.css',
        ];
    
        protected static $js = [
            '/packages/admin/simplemde/dist/simplemde.min.js',
        ];
    
        public function render()
        {
            $this->script = <<<EOT
    
     var simplemde = new SimpleMDE({
                   autofocus: true,
                    autosave: {
                        enabled: true,
                        delay: 5000,
                        unique_id: "editor01",
                    },
                    spellChecker: false,
                });
    
    EOT;
            return parent::render();
    
        }
    }
    
    1. 注册组件
      app/Admin/bootstrap.php 中添加以下代码
    <?php
    
    /**
     * Laravel-admin - admin builder based on Laravel.
     * @author z-song <https://github.com/z-song>
     *
     * Bootstraper for Admin.
     *
     * Here you can remove builtin form field:
     * Encore\Admin\Form::forget(['map', 'editor']);
     *
     * Or extend custom form field:
     * Encore\Admin\Form::extend('php', PHPEditor::class);
     *
     * Or require js and css assets:
     * Admin::css('/packages/prettydocs/css/styles.css');
     * Admin::js('/packages/prettydocs/js/main.js');
     *
     */
    use App\Admin\Extensions\Simplemde;
    use Encore\Admin\Form;
    
    Form::extend('editor', Simplemde::class);
    
    1. 使用
      在控制器使用$form->editor('content');就可以使用markdown编辑器了。
    13

    六、前端解析及语法高亮

    1. npm安装simplemde
    npm install simplemde --save
    
    1. 引用
      resources/assets/js/bootsrap.js 中引入simplemde
    window.simplemde = require('simplemde');
    
    1. 编译
      使用命令编译刚引入的资源,这样才可以编辑在 public/app.js 中
    npm run dev
    
    14
    1. 创建markdown解析类
      segmentfault 的Markdown解析类:SegmentFault/HyperDown

    Laravel 引入第三方类文件,我们在app目录下新建一个路径,app/Markdown,并将下载的类文件 Parser.php 放在该目录下,然后再新建一个文件,引用该类,这样做的好处就是可以完全分离核心类文件,如同合约contacts 一样,如果以后我们的解析类变了,我们只需对核心类做改变,而其他应用的方法不需要再修改。

    markdown.php 引用 parse.php 类:

    15

    App\Markdown\Markdown.php

    <?php
    
    namespace App\Markdown;
    
    /**
     * Class Markdown
     *
     * @package \App\Markdown
     */
    class Markdown
    {
        protected $parser;
    
        /**
         * Markdown constructor.
         *
         * @param $parser
         */
        public function __construct(Parser $parser)
        {
            $this->parser = $parser;
        }
    
        public function markdown($text)
        {
            $html = $this->parser->makeHtml($text);
    
            return $html;
        }
    
    
    }
    

    在引用第三方类后,需要执行下面命令进行自动加载:

    composer dump-autoload
    

    使用方法

    <?php
    
    protected $markdown;
    public function __construct(Markdown $markdown)
    {
       $this->markdown = $markdown;
    }
    
    // 解析Markdown 内容
    $this->markdown->markdown($article->content);
    
    1. markdown语法高亮
      一个非常简洁的 Markdown 样式文件
      Gist: corwien/Markdown.scss

    将该文件下载放在Laravel中 resources/assets/css/vendor/markdown.scss,然后在 resources/sass/app.scss中引入

    // Markdown
    
    // 代码高亮
    import "./../css/vendor/highlight.min";
    
    // 编辑器样式文件
    import "./../css/vendor/simplemde.min";
    
    // 引入markdown样式文件
    import "./../css/vendor/markdown.scss";  
    

    然后编译前端资源文件:

    npm run dev
    

    这样,该markdwon样式文件就编译到前端资源文件中了。

    我们可以在前端的内容字段处引入 class="markdown" 样式,然后看看渲染效果:
    article.blade.php

        <div class="markdown" >
           {!! $article->content !!}
        </div>
    

    七、完成前台markdwon解析及高亮显示

    1. 创建一条路由 route/web.php
    Route::resource('/article', 'ArticleController');
    
    1. 创建控制器ArticleController
    php artisan make:controller ArticleController
    
    1. 创建文章列表及详情页模板
      resource\home\article下创建index.blade.phplist.blade.php

    index.blade.php

        @extends('layouts.app')
    
        @section('content')
        <div class="container">
                <div class="row">
                        <div class="col-md-8 col-md-offset-2">
                                <div class="panel">
                                        <h2>文章列表页</h2>
                                </div>
                                @foreach ($data as $list)
                                <div class="panel panel-default">
                                        <h3><a href="/article/{!! $list->id !!}">{!! $list->title !!}</a></h3>
                                        <div class="panel-heading">
                                                {!! $list->subtitle !!}
                                        </div>
    
                                        <div class="panel-body" style="max-width:100%;height:300px;overflow:hidden;">
                                                <a href="/article/{!! $list->id !!}">
                                                        <img src="/upload/{!! $list->cover !!}" style="max-width:100%;">
                                                </a>
                                        </div>
                                        <div class="panel-footer">
                                                {!! $list->created_at !!}
                                        </div>
                                </div>
                                @endforeach
    
                                {!! $data->links() !!}
                        </div>
                </div>
        </div>
        @endsection
    

    list.blade.php

    @extends('layouts.app')
    
    @section('content')
    <div class="container">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <div class="panel panel-default">
                    <h3><a href="/article/{!! $data->id !!}">{!! $data->title !!}</a></h3>
                    <div class="panel-heading">
                        {!! $data->subtitle !!}
                    </div>
                    <div class="panel-body">
                        <div class="markdown">
                            {!! $data->content !!}
                        </div>
                    </div>
                    <div class="panel-footer">
                        {!! $data->created_at !!}
                    </div>
                </div>
            </div>
        </div>
    </div>
    @endsection
    
    1. 修改ArticleController.php
    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    use App\Models\Post;
    use App\Markdown\Markdown;
    
    class ArticleController extends Controller
    {
        protected $markdown;
        public function __construct(Markdown $markdown)
        {
           $this->markdown = $markdown;
        }
    
        public function index()
        {
            $data = Post::paginate(5);
            return view('home.article.index', compact('data'));
        }
    
        public function show($id)
        {
            $data = Post::find($id);
            $data->content = $this->markdown->markdown($data->content);
            return view('home.article.list', compact('data'));
        }
    }
    

    列表页效果图

    16

    详情页及高亮效果图

    17
    1. google地图的问题
      因为laravel-admin默认加载了google地图,网页加载会非常慢。
      修改一下源码即可。
      /vendor/encore/laravel-admin/src/Form/Field/Map.php
        public static function getAssets()
        {
            // 将语言包判断`zh_CN`改为`zh-CN`,因为语言包我们默认的就是`zh-CN`
            if (config('app.locale') == 'zh-CN') {
                $js = 'http://map.qq.com/api/js?v=2.exp';
            } else {
                $js = 'https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&key='.env('GOOGLE_API_KEY');
            }
    
            return compact('js');
        }
    

    八、markdown侧边栏

    生成文章侧边栏

    <script type="text/javascript">
     $(document).ready(function(){
          $("h2,h3,h4,h5,h6").each(function(i,item){
            var tag = $(item).get(0).localName;
            $(item).attr("id","wow"+i);
            $("#category").append('<a class="new'+tag+'" href="#wow'+i+'">'+$(this).text()+'</a></br>');
            $(".newh2").css("margin-left",0);
            $(".newh3").css("margin-left",20);
            $(".newh4").css("margin-left",40);
            $(".newh5").css("margin-left",60);
            $(".newh6").css("margin-left",80);
          });
     });
    </script>
    <div id="category"></div>
    

    效果图

    18

    markdown解析部分基本上参考Corwlen大神的 Laravel5.4 博客开发

    关于laravel-admin使用,可以去laravel-admin官网阅读说明文档

    原文链接https://www.bear777.com/blog/laravel-markdown

    github地址https://github.com/pandoraxm/laravel-markdown

    相关文章

      网友评论

      本文标题:laravel中使用markdown及语法高亮

      本文链接:https://www.haomeiwen.com/subject/tkokoxtx.html