<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Laravel - 标签 - 菠菜眾長</title><link>https://lruihao.cn/tags/laravel/</link><description>Laravel - 标签 - 菠菜眾長</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><managingEditor>1024@lruihao.cn (Lruihao)</managingEditor><webMaster>1024@lruihao.cn (Lruihao)</webMaster><lastBuildDate>Sat, 25 Jul 2020 20:51:11 +0000</lastBuildDate><atom:link href="https://lruihao.cn/tags/laravel/" rel="self" type="application/rss+xml"/><item><title>cell-blog 功能介绍与安装</title><link>https://lruihao.cn/projects/cell-blog/</link><pubDate>Sat, 25 Jul 2020 20:51:11 +0000</pubDate><author>Lruihao</author><guid>https://lruihao.cn/projects/cell-blog/</guid><description><![CDATA[<div class="featured-image">
        <img src="https://i.loli.net/2020/05/11/vHeNRG4Qi7ljrM8.png" referrerpolicy="no-referrer">
      </div><blockquote>
<p>基于 Laravel7 开发，Markdown 语法的个人独立博客。<a href="https://github.com/Lruihao/cell-blog"target="_blank" rel="external nofollow noopener noreferrer">Cell Blog<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>, 也是我的毕业设计作品，目前已開源。</p>
</blockquote>
<h2 id="功能">功能</h2>
<ul>
<li>支持 Markdown, 文章实时预览效果</li>
<li>支持多种编程语言代码高亮</li>
<li>编辑器图片上传</li>
<li>后台上传文件管理</li>
<li>文章搜索</li>
<li>文章分类</li>
<li>文章标签</li>
<li>热门文章</li>
<li>随机格言</li>
<li>文章管理（发布，评论开关，排序）</li>
<li>自定义导航（显示开关，排序）</li>
<li>自定义页面（发布开关）</li>
<li>友情链接（显示开关，排序）</li>
<li><a href="https://github.com/Lruihao/cos-album"target="_blank" rel="external nofollow noopener noreferrer">COS 桶相册<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li>丰富的博客配置（方便扩展，支持自定义 JS 脚本）</li>
<li>不蒜子计数</li>
<li>Leancloud 计数</li>
<li>Valine 评论插件</li>
<li>文章分享插件</li>
</ul>
<h2 id="截图">截图</h2>
<p><br>
<br>
</p>
<h2 id="安装">安装</h2>
<blockquote>
<p>注意事项：PHP 取消禁用函数<code>putenv()</code>和<code>symlink()</code>，安装<code>fileinfo</code>扩展。</p>
</blockquote>
<p>下载</p>
<div class="highlight" id="id-1"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">git clone https://github.com/Lruihao/cell-blog.git</span></span></code></pre></td></tr></table>
</div>
</div><p>进入站点</p>
<div class="highlight" id="id-2"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">cd cell-blog</span></span></code></pre></td></tr></table>
</div>
</div><p>生成。env</p>
<div class="highlight" id="id-3"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">cp .env.example .env</span></span></code></pre></td></tr></table>
</div>
</div><p>编辑。env 环境配置</p>
<div class="highlight" id="id-4"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nv">APP_URL</span><span class="o">=</span>http://localhost <span class="c1">#使用本地文件系统存储文件时，必须填写正确地址</span>
</span></span><span class="line"><span class="cl"><span class="nv">APP_DEBUG</span><span class="o">=</span><span class="nb">false</span> <span class="c1">#关闭调试</span>
</span></span><span class="line"><span class="cl"><span class="nv">DB_HOST</span><span class="o">=</span> <span class="c1">#数据库地址</span>
</span></span><span class="line"><span class="cl"><span class="nv">DB_PORT</span><span class="o">=</span><span class="m">3306</span> <span class="c1">#数据库端口</span>
</span></span><span class="line"><span class="cl"><span class="nv">DB_DATABASE</span><span class="o">=</span> <span class="c1">#数据库名称</span>
</span></span><span class="line"><span class="cl"><span class="nv">DB_USERNAME</span><span class="o">=</span> <span class="c1">#数据库用户</span>
</span></span><span class="line"><span class="cl"><span class="nv">DB_PASSWORD</span><span class="o">=</span> <span class="c1">#数据库密码</span></span></span></code></pre></td></tr></table>
</div>
</div><p>打开<code>app\Providers\AppServiceProvider.php</code>, 注释<code>SystemController:load()</code> 防止后续步骤报错</p>
<div class="highlight" id="id-5"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">    public function boot()
</span></span><span class="line"><span class="cl">    {
</span></span><span class="line"><span class="cl">        Schema::defaultStringLength(191);
</span></span><span class="line"><span class="cl">        //SystemController::load();
</span></span><span class="line"><span class="cl">    }</span></span></code></pre></td></tr></table>
</div>
</div><p>安装项目依赖</p>
<div class="highlight" id="id-6"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">composer install</span></span></code></pre></td></tr></table>
</div>
</div><p>生成 key</p>
<div class="highlight" id="id-7"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">php artisan key:generate</span></span></code></pre></td></tr></table>
</div>
</div><p>运行数据迁移和后台数据填充</p>
<blockquote>
<p><code>php artisan admin:install</code>已包含数据迁移命令<code>php artisan migrate</code><br>
<code>G:\cell-blog\app\Admin directory already exists !</code>无需理会，继续执行剩下命令即可。</p>
</blockquote>
<div class="highlight" id="id-8"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">php artisan admin:install
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">php artisan admin:import media-manager
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">php artisan db:seed</span></span></code></pre></td></tr></table>
</div>
</div><p>默认下使用了本地文件系统，创建 storage 目录在 public 的软链接</p>
<div class="highlight" id="id-9"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">php artisan storage:link</span></span></code></pre></td></tr></table>
</div>
</div><p>打开<code>app\Providers\AppServiceProvider.php</code>, 取消注释<code>SystemController:load()</code></p>
<div class="highlight" id="id-10"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">    public function boot()
</span></span><span class="line"><span class="cl">    {
</span></span><span class="line"><span class="cl">        Schema::defaultStringLength(191);
</span></span><span class="line"><span class="cl">        SystemController::load();
</span></span><span class="line"><span class="cl">    }</span></span></code></pre></td></tr></table>
</div>
</div><p>将博客网站根目录指向入口 public 目录</p>
<p>如果使用 Nginx，要设置伪静态</p>
<div class="highlight" id="id-11"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">location / {
</span></span><span class="line"><span class="cl">    try_files $uri $uri/ /index.php?$query_string;
</span></span><span class="line"><span class="cl">}</span></span></code></pre></td></tr></table>
</div>
</div><p>启动服务后，在浏览器打开<code>http://localhost/admin/</code>, 使用用户名<code>admin</code>和密码<code>admin</code>登录。</p>
<h2 id="license">License</h2>
<p>Cell Blog is open-sourced software licensed under the MIT license.</p>
<p></p>]]></description></item><item><title>cell-blog 开发记录</title><link>https://lruihao.cn/posts/cell-blog-dev/</link><pubDate>Sat, 25 Jul 2020 20:42:42 +0000</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/cell-blog-dev/</guid><description><![CDATA[<blockquote>
<p>Cell Blog 开发记录，<a href="https://github.com/Lruihao/cell-blog"target="_blank" rel="external nofollow noopener noreferrer">项目地址<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
</blockquote>
<h2 id="搭建-php-环境">搭建 php 环境</h2>
<ol>
<li>安装 wampserver</li>
<li>安装 composer</li>
<li>更换 aliyun 源</li>
</ol>
<div class="highlight" id="id-1"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="新建-laravel-项目">新建 laravel 项目</h2>
<div class="highlight" id="id-2"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">composer create-project --prefer-dist laravel/laravel cell-blog &#34;7.*&#34;</span></span></code></pre></td></tr></table>
</div>
</div><p>或者</p>
<div class="highlight" id="id-3"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">composer global require laravel/installer
</span></span><span class="line"><span class="cl">laravel new blog</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="下载-debugbar">下载 debugbar</h2>
<div class="highlight" id="id-4"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">composer require barryvdh/laravel-debugbar --dev</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="修改语言时区">修改语言时区</h2>
<p>修改 config/app.php，将 local 的值 en 改成 zh-CN(laravel-admin 自带 zh-CN)：</p>
<div class="highlight" id="id-5"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">## 时区
</span></span><span class="line"><span class="cl">&#39;timezone&#39; =&gt; &#39;Asia/Shanghai&#39;,
</span></span><span class="line"><span class="cl">## 语言
</span></span><span class="line"><span class="cl">&#39;locale&#39; =&gt; &#39;zh-CN&#39;,</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="配置数据库">配置数据库</h2>
<p>首先确保安装好了 laravel，并且数据库连接设置正确。</p>
<div class="highlight" id="id-6"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">APP_URL=http://cell.blog
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">DB_CONNECTION=mysql
</span></span><span class="line"><span class="cl">DB_HOST=127.0.0.1
</span></span><span class="line"><span class="cl">DB_PORT=3307
</span></span><span class="line"><span class="cl">DB_DATABASE=cell_blog
</span></span><span class="line"><span class="cl">DB_USERNAME=root
</span></span><span class="line"><span class="cl">DB_PASSWORD=123456</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="下载-laravel-admin">下载 laravel-admin</h2>
<div class="highlight" id="id-7"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">cd cell-blog
</span></span><span class="line"><span class="cl">composer require encore/laravel-admin</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>卸载命令<code>composer remove xxx</code></p>
</blockquote>
<p>然后运行下面的命令来发布资源：</p>
<div class="highlight" id="id-8"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">php artisan vendor:publish --provider=&#34;Encore\Admin\AdminServiceProvider&#34;</span></span></code></pre></td></tr></table>
</div>
</div><p>在该命令会生成配置文件<code>config/admin.php</code>，可以在里面修改安装的地址、数据库连接、以及表名，建议都是用默认配置不修改。</p>
<p>然后运行下面的命令完成安装：</p>
<div class="highlight" id="id-9"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">php artisan admin:install</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>运行这个命令的时候，如果遇到了下面的错误：
<code>SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes (SQL: alter tableusersadd uniqueusers_email_unique(email))</code><br>
参考这个 issue 来解决 <a href="https://github.com/z-song/laravel-admin/issues/1541"target="_blank" rel="external nofollow noopener noreferrer">https://github.com/z-song/laravel-admin/issues/1541<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a><br>
在<code>app\Providers\AppServiceProvider.php</code>添加默认值</p>
</blockquote>
<div class="highlight" id="id-10"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">namespace</span> <span class="nx">App\Providers</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">Illuminate\Support\ServiceProvider</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">Illuminate\Support\Facades\Schema</span><span class="p">;</span> <span class="c1">//add fixed sql
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">AppServiceProvider</span> <span class="k">extends</span> <span class="nx">ServiceProvider</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd">     * Bootstrap any application services.
</span></span></span><span class="line"><span class="cl"><span class="sd">     *
</span></span></span><span class="line"><span class="cl"><span class="sd">     * @return void
</span></span></span><span class="line"><span class="cl"><span class="sd">     */</span>
</span></span><span class="line"><span class="cl">    <span class="k">public</span> <span class="k">function</span> <span class="nf">boot</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">Schema</span><span class="o">::</span><span class="na">defaultStringLength</span><span class="p">(</span><span class="mi">191</span><span class="p">);</span> <span class="c1">//add fixed sql
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd">     * Register any application services.
</span></span></span><span class="line"><span class="cl"><span class="sd">     *
</span></span></span><span class="line"><span class="cl"><span class="sd">     * @return void
</span></span></span><span class="line"><span class="cl"><span class="sd">     */</span>
</span></span><span class="line"><span class="cl">    <span class="k">public</span> <span class="k">function</span> <span class="nf">register</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">//
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><p>启动服务后，在浏览器打开 <code>http://localhost/admin/</code> , 使用用户名 <code>admin</code> 和密码 <code>admin</code> 登录。</p>
<blockquote>
<p>报错<code>Disk [admin] not configured, please add a disk config in config/filesystems.php</code></p>
</blockquote>
<p>在<code>config/filesystems.php</code>中 disks 处添加以下配置后执行<code>php artisan storage:link</code>来创建软链接（windows 和 linux 的软链接不一样不能直接复制！）</p>
<blockquote>
<p>宝塔执行时删除禁用函数 putenv(),symlink()</p>
</blockquote>
<div class="highlight" id="id-11"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&#39;admin&#39; =&gt; [
</span></span><span class="line"><span class="cl">    &#39;driver&#39; =&gt; &#39;local&#39;,
</span></span><span class="line"><span class="cl">    &#39;root&#39; =&gt; storage_path(&#39;app/public/system&#39;),
</span></span><span class="line"><span class="cl">    &#39;url&#39; =&gt; env(&#39;APP_URL&#39;).&#39;/storage/system&#39;,
</span></span><span class="line"><span class="cl">    &#39;visibility&#39; =&gt; &#39;public&#39;,
</span></span><span class="line"><span class="cl">],
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">或
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&#39;admin&#39; =&gt; [
</span></span><span class="line"><span class="cl">    &#39;driver&#39; =&gt; &#39;local&#39;,
</span></span><span class="line"><span class="cl">    &#39;root&#39; =&gt; public_path(&#39;uploads&#39;),
</span></span><span class="line"><span class="cl">    &#39;url&#39; =&gt; env(&#39;APP_URL&#39;).&#39;/public/uploads/&#39;,
</span></span><span class="line"><span class="cl">    &#39;visibility&#39; =&gt; &#39;public&#39;,
</span></span><span class="line"><span class="cl">],</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="下载-dcat-admin">下载 dcat-admin</h2>
<div class="highlight" id="id-12"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">composer require dcat/laravel-admin</span></span></code></pre></td></tr></table>
</div>
</div><p>然后运行下面的命令来发布资源：</p>
<div class="highlight" id="id-13"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">php artisan admin:publish</span></span></code></pre></td></tr></table>
</div>
</div><p>在该命令会生成配置文件<code>config/admin.php</code>，可以在里面修改安装的地址、数据库连接、以及表名，建议都是用默认配置不修改。</p>
<p>然后运行下面的命令完成安装：</p>
<div class="highlight" id="id-14"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">php artisan admin:install</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="迁移文件创建表">迁移文件创建表</h2>
<div class="highlight" id="id-15"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">php artisan make:migration create_articles_table
</span></span><span class="line"><span class="cl">php artisan make:migration create_tags_table
</span></span><span class="line"><span class="cl">php artisan make:migration create_categories_table
</span></span><span class="line"><span class="cl">php artisan make:migration create_article_tags_table
</span></span><span class="line"><span class="cl">php artisan make:migration create_navigations_table
</span></span><span class="line"><span class="cl">php artisan make:migration create_friendship_links_table
</span></span><span class="line"><span class="cl">php artisan make:migration create_pages_table
</span></span><span class="line"><span class="cl">php artisan make:migration create_systems_table
</span></span><span class="line"><span class="cl">php artisan make:migration create_mottoes_table</span></span></code></pre></td></tr></table>
</div>
</div><p>运行迁移</p>
<div class="highlight" id="id-16"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">php artisan migrate</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="创建模型-model">创建模型 model</h2>
<div class="highlight" id="id-17"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">php artisan make:model Models/Article
</span></span><span class="line"><span class="cl">php artisan make:model Models/Category
</span></span><span class="line"><span class="cl">php artisan make:model Models/Tag
</span></span><span class="line"><span class="cl">php artisan make:model Models/Navigation
</span></span><span class="line"><span class="cl">php artisan make:model Models/FriendshipLink
</span></span><span class="line"><span class="cl">php artisan make:model Models/Page
</span></span><span class="line"><span class="cl">php artisan make:model Models/System
</span></span><span class="line"><span class="cl">php artisan make:model Models/Motto</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="创建控制器">创建控制器</h2>
<div class="highlight" id="id-18"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">php artisan admin:make ArticleController --model<span class="o">=</span>App<span class="se">\M</span>odels<span class="se">\A</span>rticle
</span></span><span class="line"><span class="cl">php artisan admin:make CategoryController --model<span class="o">=</span>App<span class="se">\M</span>odels<span class="se">\C</span>ategory
</span></span><span class="line"><span class="cl">php artisan admin:make TagController --model<span class="o">=</span>App<span class="se">\M</span>odels<span class="se">\T</span>ag
</span></span><span class="line"><span class="cl">php artisan admin:make NavigationController --model<span class="o">=</span>App<span class="se">\M</span>odels<span class="se">\N</span>avigation
</span></span><span class="line"><span class="cl">php artisan admin:make FriendshipLinkController --model<span class="o">=</span>App<span class="se">\M</span>odels<span class="se">\F</span>riendshipLink
</span></span><span class="line"><span class="cl">php artisan admin:make PageController --model<span class="o">=</span>App<span class="se">\M</span>odels<span class="se">\P</span>age
</span></span><span class="line"><span class="cl">php artisan admin:make SystemController --model<span class="o">=</span>App<span class="se">\M</span>odels<span class="se">\S</span>ystem
</span></span><span class="line"><span class="cl">php artisan admin:make MottoController --model<span class="o">=</span>App<span class="se">\M</span>odels<span class="se">\M</span>otto</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="添加后台路由">添加后台路由</h2>
<p>app/Admin/routes.php</p>
<div class="highlight" id="id-19"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">$router-&gt;resource(&#39;articles&#39;, ArticleController::class);
</span></span><span class="line"><span class="cl">$router-&gt;resource(&#39;categories&#39;, CategoryController::class);
</span></span><span class="line"><span class="cl">$router-&gt;resource(&#39;tags&#39;, TagController::class);
</span></span><span class="line"><span class="cl">$router-&gt;resource(&#39;navigations&#39;, NavigationController::class);
</span></span><span class="line"><span class="cl">$router-&gt;resource(&#39;friendship-links&#39;, FriendshipLinkController::class);
</span></span><span class="line"><span class="cl">$router-&gt;resource(&#39;pages&#39;, PageController::class);
</span></span><span class="line"><span class="cl">$router-&gt;resource(&#39;systems&#39;, SystemController::class);
</span></span><span class="line"><span class="cl">$router-&gt;resource(&#39;mottoes&#39;, MottoController::class);</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="editormd-安装">editormd 安装</h2>
<p><a href="https://github.com/ShareManT/laravel-admin-ext-editormd"target="_blank" rel="external nofollow noopener noreferrer">editormd<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>
<a href="https://github.com/ShareManT/laravel-admin-ext-editormd/issues/3"target="_blank" rel="external nofollow noopener noreferrer">github 图像问题<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<h3 id="存放本地表情">存放本地表情</h3>
<div class="highlight" id="id-20"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">public\vendor\laravel-admin-ext\editormd\editormd-1.5.0\images\emojis</span></span></code></pre></td></tr></table>
</div>
</div><p>修改 editormd.js 及 editormd.min.js</p>
<div class="highlight" id="id-21"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">// Emoji graphics files url path
</span></span><span class="line"><span class="cl">editormd.emoji     = {
</span></span><span class="line"><span class="cl">    path  : &#34;/iamges/emojis/&#34;,
</span></span><span class="line"><span class="cl">    ext   : &#34;.png&#34;
</span></span><span class="line"><span class="cl">};</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="图片上传">图片上传</h3>
<h4 id="csrf-419-错误">csrf 419 错误</h4>
<p>可以在<code>VerifyCsrfToken.php</code>中添加白名单跳过验证，或者手动添加 csrf 验证器：</p>
<p>修改 image-dialog.js 的<code>var dialogContent</code><br>
<a href="https://www.jianshu.com/p/8101f7bc80f6"target="_blank" rel="external nofollow noopener noreferrer">参考<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<div class="highlight" id="id-22"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">if (settings.crossDomainUpload)
</span></span><span class="line"><span class="cl">{
</span></span><span class="line"><span class="cl">    action += &#34;&amp;callback=&#34; + settings.uploadCallbackURL + &#34;&amp;dialog_id=editormd-image-dialog-&#34; + guid;
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">//添加 csrf 验证
</span></span><span class="line"><span class="cl">var csrfToken = $(&#39;meta[name=&#34;csrf-token&#34;]&#39;).attr(&#39;content&#39;);
</span></span><span class="line"><span class="cl">var csrfField = &#34;&#34;;
</span></span><span class="line"><span class="cl">if (csrfToken) {
</span></span><span class="line"><span class="cl">    csrfField = &#34;&lt;input type=&#39;hidden&#39; name=&#39;_token&#39; value=&#39;&#34; + csrfToken + &#34;&#39; /&gt;&#34;;
</span></span><span class="line"><span class="cl">}</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="markdown-转-html">markdown 转 HTML</h2>
<p><a href="https://www.zhiqiexing.com/119.html"target="_blank" rel="external nofollow noopener noreferrer">https://www.zhiqiexing.com/119.html<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>
<a href="https://github.com/GrahamCampbell/Laravel-Markdown"target="_blank" rel="external nofollow noopener noreferrer">Laravel Markdown 安装<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<div class="highlight" id="id-23"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">composer require graham-campbell/markdown
</span></span><span class="line"><span class="cl">php artisan vendor:publish</span></span></code></pre></td></tr></table>
</div>
</div><p>扩展表格</p>
<div class="highlight" id="id-24"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">composer require league/commonmark</span></span></code></pre></td></tr></table>
</div>
</div><p>config/markdown.php</p>
<div class="highlight" id="id-25"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&#39;extensions&#39; =&gt; [
</span></span><span class="line"><span class="cl">        League\CommonMark\Extension\TaskList\TaskListExtension::class,
</span></span><span class="line"><span class="cl">    ],</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="eloquent-模型事件">Eloquent 模型事件</h2>
<p>Eloquent 模型可以触发事件，允许你在模型生命周期中的多个时间点调用如下这些方法：retrieved, creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored。事件允许你在一个指定模型类每次保存或更新的时候执行代码。</p>
<p>retrieved 事件会在从数据库中获取已存在模型时触发。当一个新模型被首次保存的时候，creating 和 created 事件会被触发。如果一个模型已经在数据库中存在并调用 save 方法，updating/updated 事件会被触发，无论是创建还是更新，saving/saved 事件都会被触发。</p>
<h2 id="添加后台验证码">添加后台验证码</h2>
<p>依赖 php 扩展<code>fileinfo</code><br>
<a href="https://learnku.com/articles/32842"target="_blank" rel="external nofollow noopener noreferrer">添加验证码<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<h2 id="media-manager">Media manager</h2>
<div class="highlight" id="id-26"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">composer require laravel-admin-ext/media-manager
</span></span><span class="line"><span class="cl">php artisan admin:import media-manager</span></span></code></pre></td></tr></table>
</div>
</div><p>&rsquo;extensions&rsquo; =&gt; [
&lsquo;media-manager&rsquo; =&gt; [
// Select a local disk that you configured in <code>config/filesystem.php</code>
&lsquo;disk&rsquo; =&gt; &lsquo;public&rsquo;
],
],</p>
<div class="highlight" id="id-27"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## 给 laravel-admin 增加锁屏功能</span></span></code></pre></td></tr></table>
</div>
</div><p>composer require laravel-admin-ext/lock-screen</p>
<div class="highlight" id="id-28"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&#39;route&#39; =&gt; [
</span></span><span class="line"><span class="cl">    &#39;prefix&#39; =&gt; &#39;demo&#39;,
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    &#39;namespace&#39;     =&gt; &#39;App\\Admin\\Controllers&#39;,
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    // 在中间件数组中加上&#39;admin.lock&#39;
</span></span><span class="line"><span class="cl">    &#39;middleware&#39;    =&gt; [&#39;web&#39;, &#39;admin&#39;, &#39;admin.lock&#39;],
</span></span><span class="line"><span class="cl">],</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="前台设计">前台设计</h2>
<p>创建控制器</p>
<div class="highlight" id="id-29"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">php artisan make:controller HomeController
</span></span><span class="line"><span class="cl">php artisan make:controller ArticleController
</span></span><span class="line"><span class="cl">php artisan make:controller CategoryController
</span></span><span class="line"><span class="cl">php artisan make:controller TagController
</span></span><span class="line"><span class="cl">php artisan make:controller PageController</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="后台-img-灯箱">后台 img 灯箱</h2>
<p><a href="https://github.com/laravel-admin-extensions/grid-lightbox"target="_blank" rel="external nofollow noopener noreferrer">https://github.com/laravel-admin-extensions/grid-lightbox<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<div class="highlight" id="id-30"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">composer require laravel-admin-ext/grid-lightbox
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">php artisan vendor:publish --tag=laravel-admin-grid-lightbox</span></span></code></pre></td></tr></table>
</div>
</div>]]></description></item></channel></rss>