<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>PHP - 标签 - 菠菜眾長</title><link>https://lruihao.cn/tags/php/</link><description>PHP - 标签 - 菠菜眾長</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/php/" 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><item><title>php 同时主动推送链接到百度，神马等站长平台</title><link>https://lruihao.cn/posts/phppushurl/</link><pubDate>Sat, 28 Sep 2019 18:32:42 +0000</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/phppushurl/</guid><description><![CDATA[<blockquote>
<p>php 主动推送站点链接到百度站长，神马站长进行 SEO。</p>
</blockquote>
<h2 id="代码">代码</h2>
<p>把需要提交的链接和各站长 api 分别放在两个 txt 文件里面，然后运行 php 文件进行提交，不同站长提交成功一般返回的都是 <code>200</code> 状态码。</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><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></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="c1">//链接存放路径和站长 api 文件存放路径
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nv">$urls_path</span> <span class="o">=</span> <span class="s2">&#34;H:</span><span class="se">\\</span><span class="s2">lruihao.cn</span><span class="se">\\</span><span class="s2">public</span><span class="se">\\</span><span class="s2">baidu_urls.txt&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nv">$apis_path</span> <span class="o">=</span> <span class="s2">&#34;G:</span><span class="se">\\</span><span class="s2">Demo</span><span class="se">\\</span><span class="s2">lrh01</span><span class="se">\\</span><span class="s2">zhanzhang_api.txt&#34;</span><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="nv">$urls</span> <span class="o">=</span> <span class="nx">file</span><span class="p">(</span><span class="nv">$urls_path</span><span class="p">,</span> <span class="nx">FILE_IGNORE_NEW_LINES</span> <span class="o">|</span> <span class="nx">FILE_SKIP_EMPTY_LINES</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nv">$apis</span> <span class="o">=</span> <span class="nx">file</span><span class="p">(</span><span class="nv">$apis_path</span><span class="p">,</span> <span class="nx">FILE_IGNORE_NEW_LINES</span> <span class="o">|</span> <span class="nx">FILE_SKIP_EMPTY_LINES</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">for</span><span class="p">(</span><span class="nv">$x</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="nv">$x</span><span class="o">&lt;</span><span class="nx">count</span><span class="p">(</span><span class="nv">$apis</span><span class="p">);</span><span class="nv">$x</span><span class="o">++</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$ch</span> <span class="o">=</span> <span class="nx">curl_init</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$options</span> <span class="o">=</span>  <span class="k">array</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">      <span class="nx">CURLOPT_URL</span> <span class="o">=&gt;</span> <span class="nv">$apis</span><span class="p">[</span><span class="nv">$x</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">      <span class="nx">CURLOPT_POST</span> <span class="o">=&gt;</span> <span class="k">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nx">CURLOPT_RETURNTRANSFER</span> <span class="o">=&gt;</span> <span class="k">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nx">CURLOPT_POSTFIELDS</span> <span class="o">=&gt;</span> <span class="nx">implode</span><span class="p">(</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">,</span> <span class="nv">$urls</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">      <span class="nx">CURLOPT_HTTPHEADER</span> <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;Content-Type: text/plain&#39;</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">curl_setopt_array</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nv">$options</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$result</span> <span class="o">=</span> <span class="nx">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">echo</span> <span class="s2">&#34;API: &lt;br/&gt;&amp;emsp;&#34;</span><span class="o">.</span><span class="nv">$apis</span><span class="p">[</span><span class="nv">$x</span><span class="p">]</span><span class="o">.</span><span class="s2">&#34;&lt;br/&gt;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">echo</span> <span class="s2">&#34;result: &lt;br/&gt;&amp;emsp;&#34;</span><span class="o">.</span><span class="nv">$result</span><span class="o">.</span><span class="s2">&#34;&lt;hr/&gt;&#34;</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></span><span class="line"><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="提交结果">提交结果</h2>
<p></p>]]></description></item><item><title>php 按行读取文件信息</title><link>https://lruihao.cn/posts/phpfile/</link><pubDate>Sat, 28 Sep 2019 17:11:17 +0000</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/phpfile/</guid><description><![CDATA[<h2 id="普通方法">普通方法</h2>
<p>首先采用<code>fopen()</code>函数打开文件，得到返回值的就是资源类型。接着采用 while 循环一行行地读取文件，然后输出每行的文字。<code>feof()</code>判断是否到最后一行，<code>fgets()</code>读取一行文本。</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><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-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="c1">//首先采用“fopen”函数打开文件，得到返回值的就是资源类型。
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nv">$file_handle</span> <span class="o">=</span> <span class="nx">fopen</span><span class="p">(</span><span class="s2">&#34;C:</span><span class="se">\\</span><span class="s2">Users</span><span class="se">\\</span><span class="s2">李瑞豪、\Desktop</span><span class="se">\\</span><span class="s2">备忘录。txt&#34;</span><span class="p">,</span><span class="s2">&#34;r&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="nv">$file_handle</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">      <span class="c1">//接着采用 while 循环一行行地读取文件，然后输出每行的文字
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>      <span class="k">while</span> <span class="p">(</span><span class="o">!</span><span class="nx">feof</span><span class="p">(</span><span class="nv">$file_handle</span><span class="p">))</span> <span class="p">{</span> <span class="c1">//判断是否到最后一行
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>          <span class="nv">$line</span> <span class="o">=</span> <span class="nx">fgets</span><span class="p">(</span><span class="nv">$file_handle</span><span class="p">);</span> <span class="c1">//读取一行文本
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>          <span class="k">echo</span> <span class="nv">$line</span><span class="p">;</span> <span class="c1">//输出一行文本
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>          <span class="k">echo</span> <span class="s2">&#34;&lt;br /&gt;&#34;</span><span class="p">;</span> <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><span class="line"><span class="cl">  <span class="nx">fclose</span><span class="p">(</span><span class="nv">$file_handle</span><span class="p">);</span><span class="c1">//关闭文件
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><code>readfile（）</code>函数，返回一整个 String</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-php" data-lang="php"><span class="line"><span class="cl"><span class="k">echo</span> <span class="nx">readfile</span><span class="p">(</span><span class="s2">&#34;C:</span><span class="se">\\</span><span class="s2">Users</span><span class="se">\\</span><span class="s2">李瑞豪、\Desktop</span><span class="se">\\</span><span class="s2">备忘录。txt&#34;</span><span class="p">);</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="快速方法">快速方法</h2>
<p><code>file()</code>函数把整个文件读入一个数组中。<br>
数组中的每个元素都是文件中相应的一行，包括换行符在内。<br>
<strong>语法</strong></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-php" data-lang="php"><span class="line"><span class="cl"><span class="nx">file</span><span class="p">(</span><span class="nx">path</span><span class="p">,</span><span class="nx">include_path</span><span class="p">,</span><span class="nx">context</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><table>
<thead>
<tr>
<th style="text-align:center">参数</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">path</td>
<td style="text-align:left">必需。规定要读取的文件。</td>
</tr>
<tr>
<td style="text-align:center">include_path</td>
<td style="text-align:left">可选参数<code>include_path</code> 可以是以下一个或多个常量：<br/>**<code>FILE_USE_INCLUDE_PATH</code><strong>在 include_path 中查找文件。<br/></strong><code>FILE_IGNORE_NEW_LINES</code><strong>在数组每个元素的末尾不要添加换行符<br/></strong><code>FILE_SKIP_EMPTY_LINES</code>**跳过空行</td>
</tr>
<tr>
<td style="text-align:center">context</td>
<td style="text-align:left">可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。若使用 NULL，则忽略。</td>
</tr>
</tbody>
</table>
<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><span class="lnt">8
</span><span class="lnt">9
</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="nv">$filepath</span><span class="o">=</span><span class="s2">&#34;H:</span><span class="se">\\</span><span class="s2">lruihao.cn</span><span class="se">\\</span><span class="s2">public</span><span class="se">\\</span><span class="s2">baidu_urls.txt&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">echo</span> <span class="s2">&#34;&lt;hr/&gt;&#34;</span><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="nv">$texts</span> <span class="o">=</span> <span class="nx">file</span><span class="p">(</span><span class="nv">$filepath</span><span class="p">,</span> <span class="nx">FILE_IGNORE_NEW_LINES</span> <span class="o">|</span> <span class="nx">FILE_SKIP_EMPTY_LINES</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nx">var_dump</span><span class="p">(</span><span class="nv">$texts</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="结果">结果</h2>
<p></p>]]></description></item><item><title>NetBeans IDE 开发设置</title><link>https://lruihao.cn/posts/netbeans/</link><pubDate>Thu, 15 Aug 2019 18:36:15 +0000</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/netbeans/</guid><description><![CDATA[<h2 id="安裝">安裝</h2>
<p><a href="https://netbeans.org/"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="擴充功能">擴充功能</h2>
<h3 id="安裝擴充功能">安裝擴充功能</h3>
<ol>
<li>下載擴充套件包
<ul>
<li><a href="http://plugins.netbeans.org/PluginPortal/"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></li>
<li>或者在 NetBeans IDE 裏面下載插件（方便）</li>
</ul>
</li>
<li>開啟 NetBeans→Tools→Plugins→Downloaded→Add Plugins</li>
<li>選擇要安裝的擴充套件包</li>
</ol>
<h3 id="啟用已安裝的擴充功能">啟用已安裝的擴充功能</h3>
<ol>
<li>開啟 NetBeans→Tools→Plugins→Installed</li>
<li>選擇要啟用的套件 (*.npm)</li>
<li>點擊 Activate</li>
</ol>
<h3 id="匯入設定">匯入設定</h3>
<ol>
<li>開啟 NetBeans→Tools→Options</li>
<li>點擊 Import 匯入設定</li>
<li>選擇要匯入的套件包 (*.zip)</li>
</ol>
<h2 id="常用設定">常用設定</h2>
<h3 id="程式碼排版">程式碼排版</h3>
<blockquote>
<p>在程式開發中，程式碼排版很重要。一個好的排版利於開發人員程式閱讀，也便於後期維護人員閱讀。</p>
</blockquote>
<p>在 NetBeans 中設置程式碼排版</p>
<ol>
<li>打開 NetBeans-&gt;Tools-&gt;Options-&gt;Editor-&gt;Formatting；</li>
<li>Language 選擇 All Languages，勾選&quot;Expand Tabs to Spaces&quot;, 用兩個空格鍵代替 Tab 鍵，首行留兩個 Tab 鍵。</li>
<li>點擊 Apply 或 Ok 完成設置。具體設置及效果如下圖所示：</li>
</ol>
<p>

</p>
<h3 id="程式碼樣板">程式碼樣板</h3>
<blockquote>
<p>程式碼樣板可以幫助你快速書寫程序，不必繁瑣地聲明函數或其他代碼塊，更專注與邏輯的書寫。</p>
</blockquote>
<p>在 NetBeans 中設置程式碼樣板</p>
<ol>
<li>打開 NetBeans→Tools→Options→Editor→Code Templates；</li>
<li>選擇你所用的語言（這裡以 JavaScript 為例）；</li>
<li>點擊&quot;New&quot;新建屬於你的或修改原有的程式碼樣板（例子僅為演示）；</li>
<li>在編程中應用它。</li>
</ol>
<p>


</p>
<h3 id="前端壓縮">前端壓縮</h3>
<p>下載擴充套件<code>netbeans minify</code> 或者 <code>minifierBeans</code></p>
<ol>
<li>開啟 NetBeans→Tools→Plugins→Downloaded→Add Plugins</li>
<li>選擇你下載的擴充套件開啟</li>
<li>開啟 NetBeans→Tools→options</li>
</ol>
<p>
</p>
<h3 id="快捷鍵">快捷鍵</h3>
<table>
<thead>
<tr>
<th style="text-align:left">键位</th>
<th style="text-align:left">作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Ctrl+/</td>
<td style="text-align:left">注释一行（或选中部分）</td>
</tr>
<tr>
<td style="text-align:left">Ctrl+X</td>
<td style="text-align:left">剪切一行（或选中部分）</td>
</tr>
<tr>
<td style="text-align:left">Ctrl+E</td>
<td style="text-align:left">删除一行（或选中部分）</td>
</tr>
<tr>
<td style="text-align:left">Shift+Alt+上下方向键</td>
<td style="text-align:left">移动当前行</td>
</tr>
<tr>
<td style="text-align:left">Ctrl+Shift+上下方向键</td>
<td style="text-align:left">复制当前行（该操作并非复制到粘贴板）</td>
</tr>
<tr>
<td style="text-align:left">Shift+Alt+F</td>
<td style="text-align:left">整理代码</td>
</tr>
<tr>
<td style="text-align:left">TAB</td>
<td style="text-align:left">代碼自動補全/缩进/選中文字同時缩进</td>
</tr>
<tr>
<td style="text-align:left">Shift+TAB</td>
<td style="text-align:left">選中文字同時取消缩进</td>
</tr>
<tr>
<td style="text-align:left">Ctrl+F</td>
<td style="text-align:left">查找某个字</td>
</tr>
<tr>
<td style="text-align:left">Ctrl+Shift+F</td>
<td style="text-align:left">整个项目中查找某个字</td>
</tr>
<tr>
<td style="text-align:left">Ctrl+H</td>
<td style="text-align:left">替换某个字</td>
</tr>
<tr>
<td style="text-align:left">Ctrl+Enter</td>
<td style="text-align:left">增加空白行，光标不动。</td>
</tr>
<tr>
<td style="text-align:left">Ctrl+(0~7)</td>
<td style="text-align:left">打开各种小窗口</td>
</tr>
<tr>
<td style="text-align:left">Shift+方向键</td>
<td style="text-align:left">選中文字</td>
</tr>
<tr>
<td style="text-align:left">Ctrl+Alt+Space</td>
<td style="text-align:left">代码输入提示，不习惯的可以设置为 (Alt+/)，超级好用！！！</td>
</tr>
<tr>
<td style="text-align:left">Ctrl+Shift+F5</td>
<td style="text-align:left">调试当前程序</td>
</tr>
<tr>
<td style="text-align:left">Shift+F6</td>
<td style="text-align:left">运行当前程序</td>
</tr>
<tr>
<td style="text-align:left">F6</td>
<td style="text-align:left">运行主程序</td>
</tr>
<tr>
<td style="text-align:left">Alt+Enter</td>
<td style="text-align:left">显示程式 bug 建议或者警示等</td>
</tr>
</tbody>
</table>
<ul>
<li>NetBeans 中常用的快捷鍵 ↑：</li>
<li>三種複製行方法</li>
</ul>
<ol>
<li>复制一行：Ctrl + Shift + 上下方向键（该操作并非复制到粘贴板）；</li>
<li>复制一行：在该行任何地方连续三击选中一样，然后 Ctrl + C 即可复制一行。；</li>
<li>复制一行（使用宏）: 编辑-开始录制宏 (Home,Shift + End,Ctrl + C)-停止录制宏-设置宏名称（如 select-entire-line)-设置快捷键（如 Ctrl + Alt + C)；</li>
</ol>
<ul>
<li>也可自己修改快捷鍵 (Tools→Options→Keympa), 如下圖</li>
</ul>
<p>{% asset_img quickkey.png quickkey %}</p>
<h3 id="遠程開發-ftp">遠程開發 (FTP)</h3>
<blockquote>
<p>工作为例</p>
</blockquote>
<ol>
<li>新建项目
<ol>
<li>打开软件，进入新建项目页面（File-New Project），新建 php 项目，选择第一个（PHP-PHP Application）</li>
<li>项目名和地址自己选择（注意，选择地址后需在地址最后面加上&quot;/项目名&quot;）</li>
</ol>
</li>
<li>FTP 设置
<ol>
<li>点击下一步，进入 FTP 设置，Run As 选择 Remote Web Site(FTP,SFTP)</li>
<li>Project URL 填写<code>http://127.0.0.1/training/工号</code></li>
</ol>
</li>
<li>Manage 设置
<ol>
<li>点击 Manage, 进入页面。名字自取。Host Name 填写：127.0.0.1</li>
<li>Encryption 选择 Pure FTP,User Name 和 Password（填写工号/课务系统登录密码）</li>
<li>Initial Directory 填写_training</li>
<li>点击 Test Connection 测试是否连接成功</li>
</ol>
</li>
<li>其他设置
<ol>
<li>Upload Directory, 上传目录不填，直接上传至个人根目录</li>
<li>Upload File 改为保存时上传文件（On Save）</li>
</ol>
</li>
</ol>
<h3 id="chrome-with-netneans-connector">Chrome with NetNeans Connector</h3>
<ol>
<li>打開 chrome 中的應用程式商店（使用 chrome 瀏覽器點擊下方鏈接即可）<br>
<a href="https://chrome.google.com/webstore/category/themes?hl=en-US/"target="_blank" rel="external nofollow noopener noreferrer">chrome 應用程式商店<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li>在搜索框中輸入 NetNeans Connector 后搜索，然後點擊右邊的加到 Chrome 即可，安裝成功后右上角會顯示 NetBeans 圖標。</li>
<li>開啟 netbeans 選擇 Run→Set Project Browser→ 選中 Chrome with NetBeans Connector</li>
<li>選擇 default 下的 Customize → 選擇 Browser → 選擇 Browser 下 Chrome with NetBeans Connector 即可</li>
</ol>
<p>

</p>
]]></description></item><item><title>Web 开发规则，代码规范</title><link>https://lruihao.cn/posts/dev-rules/</link><pubDate>Thu, 15 Aug 2019 18:30:31 +0000</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/dev-rules/</guid><description><![CDATA[<h2 id="精神">精神</h2>
<ul>
<li>绝不写死代码，硬编码</li>
<li>不留不要用的、垃圾代码</li>
</ul>
<h2 id="git">Git</h2>
<ul>
<li>Master 的 BUG 必须最少且趋近于零，为最稳定的版本</li>
<li>每次 Commit 信息应该准确填写。不可模棱两可，eg: 修复 BUG、增加功能</li>
<li>禁止 Commit IDE 的 project data，e.g: .vscode</li>
<li>禁止上传垃圾代码</li>
</ul>
<blockquote>
<p>更多规则详见文档 <a href="/posts/commit-spec/">Commit 规范</a></p>
</blockquote>
<h3 id="分支branch">分支（Branch）</h3>
<ul>
<li>命名规则：应以此分支主要目的命名（修复什么 BUG，新增特定功能）</li>
<li>合并后的分支应该删除</li>
</ul>
<h3 id="commit">commit</h3>
<ul>
<li>遵循一个功能一个 commit 的原则</li>
</ul>
<h2 id="restful">Restful</h2>
<ul>
<li>
<p>资源名词站在 API 的角度思考</p>
<ul>
<li>
<p>复数名词：可以复数笔数据，回传结果为 Array</p>
<p>举例：GET/users 取得多笔使用者资料</p>
<ul>
<li>刪除，放在复数名词內，让 Router 保持一致性</li>
<li>增加，放在复数名詞內，让 Router 保持一致性</li>
</ul>
</li>
<li>
<p>单数名词：仅取得单笔数据，必须指定 PK，两两一组，回传结果为 Object
举例：GET/user/{accont} 取得单笔使用者资料，必须指定 PK</p>
</li>
</ul>
</li>
<li>
<p>URL 中一律不带 id 参数</p>
</li>
</ul>
<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><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">正确范例： calendar_manager/calendar/29
</span></span><span class="line"><span class="cl">错误范例： calendar_manager/calendar/29?id=29</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>更多规则详见文档 <a href="/posts/restful/">RESTful</a></p>
</blockquote>
<h2 id="命名">命名</h2>
<ul>
<li>命名应根据内容做有意义的命名，让后续维护人员可以顾名思义！</li>
<li>即使不会发生错误，代码英文大小写也需明确区分。</li>
</ul>
<h3 id="语意">语意</h3>
<table>
<thead>
<tr>
<th style="text-align:left">类型</th>
<th style="text-align:left">命名规则</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">属性 (Attribute, Property)</td>
<td style="text-align:left">名词 user_name、userName</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">方法 (Method, Function)</td>
<td style="text-align:left">动词 + 名词 getUserName、get_user_name</td>
<td style="text-align:left">常見的动词有：get、set、update、delete、remove</td>
</tr>
</tbody>
</table>
<h3 id="字母与分隔">字母与分隔</h3>
<table>
<thead>
<tr>
<th>语言</th>
<th>变量 (Variable, Parameter, Argument)</th>
<th>常量 (Constant)</th>
<th>面向对象 - 类名 (Class Name)</th>
<th>面向对象 - 成员 (mebmer)</th>
</tr>
</thead>
<tbody>
<tr>
<td>HTML</td>
<td>全部小写，不同单词以「-」分隔<br />e.g: user-id</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>CSS、SCSS</td>
<td>全部小写，不同单词以「-」分隔，CSS 变量以「&ndash;」开头，SCSS 变量以「$」开头<br />e.g: .user-id、&ndash;header-height、$header-height</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>JavaScript</td>
<td>驼峰式命名法<br />首字小写，不同单字「首字以大写」分隔<br /> e.g: userId</td>
<td>全部大写，不同单字以「_」分隔 MAX_COUNT</td>
<td>驼峰式命名法<br />首字大写，不同单字「首字以大写」分隔<br />一个文件放一个 Class, 文件名即为 Class Name <br />e.g: User</td>
<td>驼峰式命名法<br />公有 (public) : 首字小写，不同单词「首字以大写」分隔<br />e.g: name, getName<br />私有 (private): _公有命名规则<br />e.g: _name,_getName</td>
</tr>
<tr>
<td>Vue</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Java</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>PHP</td>
<td>全部小写，不同单词以「_」分隔<br />e.g: user_id</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Python</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>SQL</td>
<td>由使用者定义的：表名、字段名<br />全部小写，不同单词以「_」分隔</td>
<td>SQL 语法、函数全部大写<br />e.g: SELECT、INSERT INTO</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="通用">通用</h2>
<ul>
<li>代码编写</li>
<li><strong>每个函数应该使用块注释，注释应包含函数功能说明、参数说明</strong>。规则见：JSDoc、JavaDoc</li>
<li>不必要的代码不要写，也应禁止放到注释里面！</li>
<li>if-else 的 {} 严禁省略</li>
<li>
</li>
<li>代码规范、代码排版等可通过 eslint 等工具做统一处理</li>
</ul>
<h3 id="正确写法">正确写法</h3>
<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><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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">public</span> <span class="kd">function</span> <span class="nx">test</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// do something
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">if</span> <span class="p">(</span><span class="nx">a</span> <span class="o">===</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// do something
</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><h2 id="错误写法">错误写法</h2>
<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><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-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">public</span> <span class="kd">function</span> <span class="nx">test</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">// do something
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">if</span> <span class="p">(</span><span class="nx">a</span> <span class="o">===</span> <span class="nx">b</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">// do something
</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><ul>
<li>代码排版
<ul>
<li>任何代码应该以 2 个 space 为一个缩进做好排版、不可使用 tab</li>
</ul>
</li>
<li>函数 (Function, Methd)
<ul>
<li>函数声明时需在函数上方加上函数注释，注释应包含函数说明、参数内容（参数类型、参数英文名称、参数说明）、返回值内容（返回值类型、返回值说明）</li>
</ul>
</li>
<li>类 (Class)
<ul>
<li>一个类（Class）的声明只能存在一个文件</li>
<li>类（Class）的声明文件，文件名必须为类名</li>
</ul>
</li>
<li>其他
<ul>
<li>连接本地任何其他资源（图片、文件、网站）皆使用相对路径，禁止使用绝对路径，非本地资源除外</li>
</ul>
</li>
</ul>
<h2 id="html">HTML</h2>
<h3 id="代码编写">代码编写</h3>
<ul>
<li>禁止在 HTML 使用 <code>&lt;style&gt;</code>、<code>&lt;script&gt;</code>，一律使用外部档案引用方式引用 CSS、JavaScript 文件</li>
<li>HTML 标签需成双成对，有头有尾</li>
<li>块级标签：<code>&lt;tag&gt;&lt;/tag&gt;</code></li>
<li>单标签：<code>&lt;tag /&gt;</code></li>
<li>禁止使用已被 HTML 舍弃的旧标签、属性，如：</li>
</ul>
<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><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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="c">&lt;!-- html tag --&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">center</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">font</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">basefont</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">s</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">strike</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">u</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">listing</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">plaintext</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">xmp</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c">&lt;!-- html attribute --&gt;</span>
</span></span><span class="line"><span class="cl">align
</span></span><span class="line"><span class="cl">bgcolor
</span></span><span class="line"><span class="cl">color</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="css">CSS</h2>
<blockquote>
<p>CSS 的定义应该独立一个 CSS 文件，禁止使用 <code>&lt;style&gt;</code> 或 <code>style</code> 属性直接在 HTML 中定义样式。</p>
</blockquote>
<h2 id="javascript">JavaScript</h2>
<blockquote>
<p>禁止使用 HTML 字串，一律使用 Dom 产生 HTML, e.g: <code>document.createDocumentFragment()</code></p>
</blockquote>
<h3 id="注释">注释</h3>
<p>JavaScript 注释应该遵循 JSDoc 的标准撰写</p>
<h4 id="全局变量-global">全局变量 (Global)</h4>
<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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="cm">/* global ZT */</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="常量-constant">常量 (Constant)</h4>
<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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 常量說明
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @type {常量类型}
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Example</strong></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><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-js" data-lang="js"><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 请求地址
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @type {String}
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">REQUEST_URL</span> <span class="o">=</span> <span class="s1">&#39;http://localhost:8080&#39;</span><span class="p">;</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="函數方法-function-method">函數、方法 (Function, Method)</h4>
<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><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 函数用途说明
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {参数类型} 参数名称参数说明
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {参数类型} [选择性参数名称] 参数说明
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {参数类型} [选择性参数名称=参数预设值] 参数说明
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @returns {返回值类型} 返回值说明
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Example</strong></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><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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 取得使用者
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {Int} userId 使用者 ID
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {Object} [options] 其他选项
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {String} [options.query=&#39;a&#39;] 查询关键词 默认为 &#39;a&#39;
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @returns {Object} 使用者资料
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getUser</span><span class="p">(</span><span class="nx">userId</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// do something
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">return</span> <span class="nx">user</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><h2 id="vue">Vue</h2>
<ul>
<li><i class="fa-regular fa-square fa-fw" aria-hidden="true"></i> 待补充</li>
</ul>
<h2 id="java">Java</h2>
<p>Java 注释应该遵循 JavaDoc 的标准撰写</p>
<ul>
<li><i class="fa-regular fa-square fa-fw" aria-hidden="true"></i> 待补充</li>
</ul>
<h2 id="php">PHP</h2>
<h3 id="前端参数取得">前端参数取得</h3>
<p>参数取得需通过 filter_input 函数取得，不得使用 _GET 、_POST</p>
<h3 id="输出到前台">输出到前台</h3>
<p>参数命名必须为：全部小写，不同单字以「_」分隔</p>
<h3 id="注解">注解</h3>
<p>PHP 注解应该遵循 PHPDoc 的标准撰写</p>
<h3 id="成员变量-member">成员变量 (Member)</h3>
<p>成员变量只的是 Class 内的成员变数，我们都会要求替成员变量增加注解说明。通常 Function 的变量除非太特别否则都不需要特别注解说明。</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></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="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd"> * 成员变量說明
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @type {类型}
</span></span></span><span class="line"><span class="cl"><span class="sd"> */</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Example</strong></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><span class="lnt">4
</span><span class="lnt">5
</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="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd"> * 使用者 ID
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @type {String}
</span></span></span><span class="line"><span class="cl"><span class="sd"> */</span>
</span></span><span class="line"><span class="cl"><span class="nv">$userId</span> <span class="o">=</span> <span class="s1">&#39;Hello&#39;</span><span class="p">;</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="函数方法-function-method">函数、方法 (Function, Method)</h3>
<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><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-php" data-lang="php"><span class="line"><span class="cl"><span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd"> * 函数用途说明
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @param 参数型态 参数名称 参数说明
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @option 参数选项类型 参数选项名称 参数选项说明
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @uses 全局变量 全域变数说明
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @returns 返回值类型 返回值说明
</span></span></span><span class="line"><span class="cl"><span class="sd"> */</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Example</strong></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><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></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="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd"> * 取得使用者
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @param int userId 使用者 ID
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @param object options 其他选项
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @option string options[&#39;query&#39;] 查询关键字
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @uses $_POST[&#39;role_id&#39;] 从前端以 POST 取得角色 ID
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @returns object 使用者资料
</span></span></span><span class="line"><span class="cl"><span class="sd"> */</span>
</span></span><span class="line"><span class="cl"><span class="k">function</span> <span class="nf">getUser</span> <span class="p">(</span><span class="nv">$userId</span><span class="p">,</span> <span class="nv">$options</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// do something
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">return</span> <span class="nv">$user</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><h2 id="python">Python</h2>
<ul>
<li><i class="fa-regular fa-square fa-fw" aria-hidden="true"></i> 待补充</li>
</ul>
<h2 id="database">Database</h2>
<ul>
<li>禁止使用 Table Join。</li>
<li>禁止使用 Oracle Trigger。</li>
<li>禁止将查询数据库的 SQL 放在循环中查询</li>
</ul>
<h3 id="sql-撰写">SQL 撰写</h3>
<ul>
<li>属于 SQL 语法使用大写（SELECT，WHERE，INSERT etc..）</li>
<li>属于使用者自己定义的使用小写（表名 table name，字段名 column name etc..）</li>
<li>表名、字段名前后需加上 `</li>
</ul>
<p><strong>Example</strong></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-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="o">`</span><span class="k">user</span><span class="o">`</span><span class="w"> </span><span class="k">VALUES</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;b&#39;</span><span class="p">);</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="统一用词">统一用词</h2>
<blockquote>
<p>系统中常用词，例如弹出框按钮、搜索框等，仅为举例，不限与此。</p>
</blockquote>
<table>
<thead>
<tr>
<th style="text-align:left">用词</th>
<th style="text-align:left">统一</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">最后、最终</td>
<td style="text-align:left">最后</td>
</tr>
<tr>
<td style="text-align:left">关闭、Cancel、取消</td>
<td style="text-align:left">取消</td>
</tr>
<tr>
<td style="text-align:left">存储、保存、修改、OK、确定</td>
<td style="text-align:left">确定</td>
</tr>
<tr>
<td style="text-align:left">搜寻、查询、查找、搜索</td>
<td style="text-align:left">搜索</td>
</tr>
</tbody>
</table>
]]></description></item><item><title>简单评论模块--php 表单练习</title><link>https://lruihao.cn/posts/phpform/</link><pubDate>Fri, 19 Jul 2019 11:38:59 +0000</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/phpform/</guid><description><![CDATA[<blockquote>
<p>简单模仿了一个评论模板，当然肯定是没有博客的 valine 这么强大的 hhhh，<br>
<strong>PHP 表单安全性的重要提示</strong><br>
<code>$_SERVER[&quot;PHP_SELF&quot;]</code>变量能够被黑客利用！<br>
如果页面中使用了<code>PHP_SELF</code>，用户能够输入下划线然后执行跨站点脚本（XSS）。<br>
比如说注入 js 脚本等，valine 以前的版本也有过这样的漏洞。</p>
<p><code>跨站点脚本（Cross-site scripting，XSS）</code>是一种计算机安全漏洞类型，常见于 Web 应用程序。XSS 能够使攻击者向其他用户浏览的网页中输入客户端脚本。</p>
</blockquote>
<p>可以像 valine 一样在用户输入完后保留输入，还有一些正则控制输入提示等简单功能。UI 就丑爆了算了。</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><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><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="cp">&lt;!DOCTYPE HTML&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;html&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;head&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;style&gt;</span>
</span></span><span class="line"><span class="cl">.error {color: #FF0000;}
</span></span><span class="line"><span class="cl">.main{
</span></span><span class="line"><span class="cl">   width: 20%;
</span></span><span class="line"><span class="cl">   height: 100%;
</span></span><span class="line"><span class="cl">   border: 1px #000 solid;
</span></span><span class="line"><span class="cl">   padding: 20px;
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/style&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/head&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;body&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cp">&lt;?php
</span></span></span><span class="line"><span class="cl"><span class="cp">// 定义变量并设置为空值
</span></span></span><span class="line"><span class="cl"><span class="cp">$nameErr = $emailErr = $genderErr = $websiteErr = &#34;&#34;;
</span></span></span><span class="line"><span class="cl"><span class="cp">$name = $email = $gender = $comment = $website = &#34;&#34;;
</span></span></span><span class="line"><span class="cl"><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">if ($_SERVER[&#34;REQUEST_METHOD&#34;] == &#34;POST&#34;) {
</span></span></span><span class="line"><span class="cl"><span class="cp">  if (empty($_POST[&#34;name&#34;])) {
</span></span></span><span class="line"><span class="cl"><span class="cp">    $nameErr = &#34;Name is required&#34;;
</span></span></span><span class="line"><span class="cl"><span class="cp">  } else {
</span></span></span><span class="line"><span class="cl"><span class="cp">    $name = test_input($_POST[&#34;name&#34;]);
</span></span></span><span class="line"><span class="cl"><span class="cp">    // 检查名字是否包含字母和空格
</span></span></span><span class="line"><span class="cl"><span class="cp">    if (!preg_match(&#34;/^[a-zA-Z ]*$/&#34;,$name)) {
</span></span></span><span class="line"><span class="cl"><span class="cp">      $nameErr = &#34;Only letters and white space allowed&#34;;
</span></span></span><span class="line"><span class="cl"><span class="cp">    }
</span></span></span><span class="line"><span class="cl"><span class="cp">  }
</span></span></span><span class="line"><span class="cl"><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">  if (empty($_POST[&#34;email&#34;])) {
</span></span></span><span class="line"><span class="cl"><span class="cp">    $emailErr = &#34;Email is required&#34;;
</span></span></span><span class="line"><span class="cl"><span class="cp">  } else {
</span></span></span><span class="line"><span class="cl"><span class="cp">    $email = test_input($_POST[&#34;email&#34;]);
</span></span></span><span class="line"><span class="cl"><span class="cp">    // 检查电邮地址语法是否有效
</span></span></span><span class="line"><span class="cl"><span class="cp">    if (!preg_match(&#34;/([\w\-]+\@[\w\-]+\.[\w\-]+)/&#34;,$email)) {
</span></span></span><span class="line"><span class="cl"><span class="cp">      $emailErr = &#34;Invalid email format&#34;;
</span></span></span><span class="line"><span class="cl"><span class="cp">    }
</span></span></span><span class="line"><span class="cl"><span class="cp">  }
</span></span></span><span class="line"><span class="cl"><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">  if (empty($_POST[&#34;website&#34;])) {
</span></span></span><span class="line"><span class="cl"><span class="cp">    $website = &#34;&#34;;
</span></span></span><span class="line"><span class="cl"><span class="cp">  } else {
</span></span></span><span class="line"><span class="cl"><span class="cp">    $website = test_input($_POST[&#34;website&#34;]);
</span></span></span><span class="line"><span class="cl"><span class="cp">    // 检查 URL 地址语言是否有效（此正则表达式同样允许 URL 中的下划线）
</span></span></span><span class="line"><span class="cl"><span class="cp">    if (!preg_match(&#34;/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&amp;@#\/%?=~_|!:,.;]*[-a-z0-9+&amp;@#\/%
</span></span></span><span class="line"><span class="cl"><span class="cp">    =~_|]/i&#34;,$website)) {
</span></span></span><span class="line"><span class="cl"><span class="cp">      $websiteErr = &#34;Invalid URL&#34;;
</span></span></span><span class="line"><span class="cl"><span class="cp">    }
</span></span></span><span class="line"><span class="cl"><span class="cp">  }
</span></span></span><span class="line"><span class="cl"><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">  if (empty($_POST[&#34;comment&#34;])) {
</span></span></span><span class="line"><span class="cl"><span class="cp">    $comment = &#34;&#34;;
</span></span></span><span class="line"><span class="cl"><span class="cp">  } else {
</span></span></span><span class="line"><span class="cl"><span class="cp">    $comment = test_input($_POST[&#34;comment&#34;]);
</span></span></span><span class="line"><span class="cl"><span class="cp">  }
</span></span></span><span class="line"><span class="cl"><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">  if (empty($_POST[&#34;gender&#34;])) {
</span></span></span><span class="line"><span class="cl"><span class="cp">    $genderErr = &#34;Gender is required&#34;;
</span></span></span><span class="line"><span class="cl"><span class="cp">  } else {
</span></span></span><span class="line"><span class="cl"><span class="cp">    $gender = test_input($_POST[&#34;gender&#34;]);
</span></span></span><span class="line"><span class="cl"><span class="cp">  }
</span></span></span><span class="line"><span class="cl"><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">}
</span></span></span><span class="line"><span class="cl"><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">function test_input($data) {
</span></span></span><span class="line"><span class="cl"><span class="cp">   $data = trim($data);
</span></span></span><span class="line"><span class="cl"><span class="cp">   $data = stripslashes($data);
</span></span></span><span class="line"><span class="cl"><span class="cp">   $data = htmlspecialchars($data);
</span></span></span><span class="line"><span class="cl"><span class="cp">   return $data;
</span></span></span><span class="line"><span class="cl"><span class="cp">}
</span></span></span><span class="line"><span class="cl"><span class="cp">?&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&#34;main&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="nt">&lt;h2&gt;</span>PHP 验证实例<span class="nt">&lt;/h2&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="nt">&lt;form</span> <span class="na">method=</span><span class="s">&#34;post&#34;</span> <span class="na">action=</span><span class="s">&#34;&lt;?php echo htmlspecialchars($_SERVER[&#39;PHP_SELF&#39;]);?&gt;&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">      姓名：<span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&#34;text&#34;</span> <span class="na">name=</span><span class="s">&#34;name&#34;</span> <span class="na">value=</span><span class="s">&#34;&lt;?php echo $name;?&gt;&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&#34;error&#34;</span><span class="nt">&gt;</span>* <span class="cp">&lt;?php echo $nameErr;?&gt;</span><span class="nt">&lt;/span&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;br&gt;&lt;br&gt;</span>
</span></span><span class="line"><span class="cl">      性别：
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&#34;radio&#34;</span> <span class="na">name=</span><span class="s">&#34;gender&#34;</span> <span class="err">&lt;?php</span> <span class="err">if</span> <span class="err">(isset($gender)</span> <span class="err">&amp;&amp;</span> <span class="err">$</span><span class="na">gender=</span><span class="s">=&#34;女性&#34;)</span> <span class="err">echo</span> <span class="err">&#34;checked&#34;;?</span><span class="nt">&gt;</span> value=&#34;女性&#34;&gt;女性
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&#34;radio&#34;</span> <span class="na">name=</span><span class="s">&#34;gender&#34;</span> <span class="err">&lt;?php</span> <span class="err">if</span> <span class="err">(isset($gender)</span> <span class="err">&amp;&amp;</span> <span class="err">$</span><span class="na">gender=</span><span class="s">=&#34;男性&#34;)</span> <span class="err">echo</span> <span class="err">&#34;checked&#34;;?</span><span class="nt">&gt;</span> value=&#34;男性&#34;&gt;男性
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&#34;error&#34;</span><span class="nt">&gt;</span>* <span class="cp">&lt;?php echo $genderErr;?&gt;</span><span class="nt">&lt;/span&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;br&gt;&lt;br&gt;</span>
</span></span><span class="line"><span class="cl">      电邮：<span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&#34;text&#34;</span> <span class="na">name=</span><span class="s">&#34;email&#34;</span> <span class="na">value=</span><span class="s">&#34;&lt;?php echo $email;?&gt;&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&#34;error&#34;</span><span class="nt">&gt;</span>* <span class="cp">&lt;?php echo $emailErr;?&gt;</span><span class="nt">&lt;/span&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;br&gt;&lt;br&gt;</span>
</span></span><span class="line"><span class="cl">      网址：<span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&#34;text&#34;</span> <span class="na">name=</span><span class="s">&#34;website&#34;</span> <span class="na">value=</span><span class="s">&#34;&lt;?php echo $website;?&gt;&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&#34;error&#34;</span><span class="nt">&gt;</span><span class="cp">&lt;?php echo $websiteErr;?&gt;</span><span class="nt">&lt;/span&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;br&gt;&lt;br&gt;</span>
</span></span><span class="line"><span class="cl">      评论：<span class="nt">&lt;textarea</span> <span class="na">name=</span><span class="s">&#34;comment&#34;</span> <span class="na">rows=</span><span class="s">&#34;5&#34;</span> <span class="na">cols=</span><span class="s">&#34;40&#34;</span><span class="nt">&gt;</span><span class="cp">&lt;?php echo $comment;?&gt;</span><span class="nt">&lt;/textarea&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;br&gt;&lt;br&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&#34;submit&#34;</span> <span class="na">name=</span><span class="s">&#34;submit&#34;</span> <span class="na">value=</span><span class="s">&#34;提交&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;h2&gt;</span>你的输入是：<span class="nt">&lt;/h2&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="cp">&lt;?php
</span></span></span><span class="line"><span class="cl"><span class="cp">         echo $name.&#34;&lt;br/&gt;&#34;;
</span></span></span><span class="line"><span class="cl"><span class="cp">         echo $gender.&#34;&lt;br/&gt;&#34;;
</span></span></span><span class="line"><span class="cl"><span class="cp">         echo $email.&#34;&lt;br/&gt;&#34;;
</span></span></span><span class="line"><span class="cl"><span class="cp">         echo $website.&#34;&lt;br/&gt;&#34;;
</span></span></span><span class="line"><span class="cl"><span class="cp">         echo $comment.&#34;&lt;br/&gt;&#34;;
</span></span></span><span class="line"><span class="cl"><span class="cp">      ?&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;br/&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="nt">&lt;/form&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/div&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/body&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/html&gt;</span></span></span></code></pre></td></tr></table>
</div>
</div><p></p>]]></description></item><item><title>php 函数学习</title><link>https://lruihao.cn/posts/phpfunc/</link><pubDate>Mon, 15 Jul 2019 11:37:33 +0000</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/phpfunc/</guid><description><![CDATA[<blockquote>
<p>练习 php 函数的基本使用。<br>
注：<br>
必选参数在可选参数的前面。<br>
可在函数中定义函数，需要先调用外层函数才能调用内层函数。</p>
</blockquote>
<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><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></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 class="cm">/*
</span></span></span><span class="line"><span class="cl"><span class="cm">创建表格
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span><span class="line"><span class="cl"><span class="k">function</span> <span class="nf">createTable</span><span class="p">(</span><span class="nv">$rows</span><span class="p">,</span><span class="nv">$cols</span><span class="p">,</span><span class="nv">$bgcolor</span><span class="o">=</span><span class="s1">&#39;pink&#39;</span><span class="p">,</span><span class="nv">$content</span><span class="o">=</span><span class="s1">&#39;x&#39;</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="nv">$table</span> <span class="o">=</span> <span class="s2">&#34;&lt;table border=&#39;1&#39; bgcolor=&#39;</span><span class="si">{</span><span class="nv">$bgcolor</span><span class="si">}</span><span class="s2">&#39; cellpadding=&#39;10&#39; cellspacing=&#39;0&#39; width=&#39;50%&#39; &gt;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span><span class="p">(</span><span class="nv">$i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span><span class="nv">$i</span><span class="o">&lt;=</span><span class="nv">$rows</span><span class="p">;</span><span class="nv">$i</span><span class="o">++</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">		<span class="nv">$table</span><span class="o">.=</span><span class="s2">&#34;&lt;tr&gt;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span><span class="p">(</span><span class="nv">$j</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span><span class="nv">$j</span><span class="o">&lt;=</span><span class="nv">$cols</span><span class="p">;</span><span class="nv">$j</span><span class="o">++</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">			<span class="nv">$table</span><span class="o">.=</span><span class="s2">&#34;&lt;td&gt;</span><span class="si">{</span><span class="nv">$content</span><span class="si">}</span><span class="s2">&lt;/td&gt;&#34;</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="nv">$table</span> <span class="o">.=</span><span class="s2">&#34;&lt;/tr&gt;&#34;</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="nv">$table</span><span class="o">.=</span><span class="s2">&#34;&lt;/table&gt;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nv">$table</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="k">echo</span> <span class="nx">createTable</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="s1">&#39;pink&#39;</span><span class="p">,</span><span class="s1">&#39;hello lruihao&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p></p>]]></description></item><item><title>WAMPServer 自定义网站根目录等设置</title><link>https://lruihao.cn/posts/wamproot/</link><pubDate>Fri, 12 Jul 2019 18:44:36 +0000</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/wamproot/</guid><description><![CDATA[<blockquote>
<p>使用 WAMPServer 时自定义网站根目录。</p>
</blockquote>
<h2 id="wampserver-自定义网站根目录">WAMPServer 自定义网站根目录</h2>
<h3 id="修改-apache-配置文件">修改 apache 配置文件</h3>
<p>打开<code>httpd.conf</code>文件搜索<code>documentroot</code>后，找到路径修改为自定义的。<br>
</p>
<p>再打开<code>httpd-vhost.conf</code>文件修改对应的路径。<br>
<code>修改完配置文件需要重启所有服务！</code></p>
<h3 id="修改-wampmanager-文件">修改 wampmanager 文件</h3>
<p>在 wampserver 安装路径根目录知道<code>wampmanager.ini</code>和<code>wampmanager.tpl</code>两个文件。搜索<code>menu.left</code>, 然后也修改为自定义的路径。
<code>然后退出，重启软件！</code></p>
<p><br>
</p>
<h3 id="编写-php-文件测试">编写 php 文件测试</h3>
<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><span class="lnt">2
</span><span class="lnt">3
</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 class="k">echo</span> <span class="s2">&#34;hello world&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p></p>
<h2 id="wampserver-多站点配置">WAMPServer 多站点配置</h2>
<p>打开<code>httpd-vhost.conf</code>文件，复制原有的几行配置文件，粘贴修改路径和域名等配置。比如</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><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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">## Virtual Hosts
</span></span><span class="line"><span class="cl">#
</span></span><span class="line"><span class="cl">&lt;VirtualHost *:80&gt;
</span></span><span class="line"><span class="cl">  ServerName localhost
</span></span><span class="line"><span class="cl">  ServerAlias localhost
</span></span><span class="line"><span class="cl">  DocumentRoot &#34;g:/Demo&#34;
</span></span><span class="line"><span class="cl">  &lt;Directory &#34;g:/Demo&#34;&gt;
</span></span><span class="line"><span class="cl">    Options +Indexes +Includes +FollowSymLinks +MultiViews
</span></span><span class="line"><span class="cl">    AllowOverride All
</span></span><span class="line"><span class="cl">    Require local
</span></span><span class="line"><span class="cl">  &lt;/Directory&gt;
</span></span><span class="line"><span class="cl">&lt;/VirtualHost&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&lt;VirtualHost *:80&gt;
</span></span><span class="line"><span class="cl">  ServerName test01.com
</span></span><span class="line"><span class="cl">  DocumentRoot &#34;g:/Demo/test01&#34;
</span></span><span class="line"><span class="cl">&lt;/VirtualHost&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&lt;VirtualHost *:80&gt;
</span></span><span class="line"><span class="cl">  ServerName test02.com
</span></span><span class="line"><span class="cl">  DocumentRoot &#34;g:/Demo/test02&#34;
</span></span><span class="line"><span class="cl">&lt;/VirtualHost&gt;</span></span></code></pre></td></tr></table>
</div>
</div><p>再打开<code>C:\Windows\System32\drivers\etc\hosts</code>文件，在文件最后添加类似于云服务器的域名解析，进行本地域名解析，当输入域名时优先从本地申请资源。</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><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">...
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## For example:
</span></span><span class="line"><span class="cl">#
</span></span><span class="line"><span class="cl">## 102.54.94.97 rhino.acme.com ## source server
</span></span><span class="line"><span class="cl">## 38.25.63.10 x.acme.com ## x client host
</span></span><span class="line"><span class="cl">## localhost name resolution is handled within DNS itself.
</span></span><span class="line"><span class="cl">#	127.0.0.1 localhost
</span></span><span class="line"><span class="cl">#	::1 localhost
</span></span><span class="line"><span class="cl">127.0.0.1 steamcommunity.com
</span></span><span class="line"><span class="cl">192.168.28.1 windows10.microdone.cn
</span></span><span class="line"><span class="cl">127.0.0.1 localhost
</span></span><span class="line"><span class="cl">::1 localhost
</span></span><span class="line"><span class="cl">127.0.0.1 test01.com
</span></span><span class="line"><span class="cl">127.0.0.1 test02.com</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="wampserver-自拟定端口">WAMPServer 自拟定端口</h2>
<p>WAMP 服务我安装了好几次，每次因为修改配置文件搞崩了。第一次装的时候发现 80 端口被占用了，因为以前玩了一下 Windows 的 IIS，暂停 IIS 的网站，再使用命令或者直接在控制面板关掉就好了。</p>
<ol>
<li>如果不使用 80 多为默认端口，比如修改为 8080，还是在<code>httpd.conf</code>文件里修改。搜索<code>80</code>都改成<code>8080</code>然后，Ctrl+S 保存，重新启动 WampServer<br>
在浏览器地址栏输入<code>localhost:8000</code></li>
</ol>
<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></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">Listen 0.0.0.0:8080
</span></span><span class="line"><span class="cl">Listen [::0]:8080
</span></span><span class="line"><span class="cl">ServerName localhost:8080</span></span></code></pre></td></tr></table>
</div>
</div><ol start="2">
<li>使用 Notepad++打开 C:\wamp 目录下的 wampmanager.ini 和 wampmanager.tpl<br>
Ctrl+F 查找 <code>localhost</code><br>
将其全部替换为<code>localhost:8000</code><br>
然后，Ctrl+S 保存，重新启动 WampServer</li>
</ol>]]></description></item><item><title>宅音乐播放器</title><link>https://lruihao.cn/posts/player/</link><pubDate>Tue, 19 Mar 2019 23:32:56 +0000</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/player/</guid><description><![CDATA[<div class="featured-image">
        <img src="/posts/player/images/index.png" referrerpolicy="no-referrer">
      </div><blockquote>
<p>宅音乐播放器，HTML5 网页播放器，集成后台管理及 API 调用，目前正在开发中，敬请关注~<br>
<a href="https://github.com/lzx8589561/zhai-music"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> 由 <a href="https://www.ilt.me"target="_blank" rel="external nofollow noopener noreferrer">IT 技术宅<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> 开源，使用 thinkPHP 开发后台。 <a href="https://github.com/Lruihao/zhai-music"target="_blank" rel="external nofollow noopener noreferrer">fork 地址<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> 是我个人学习模仿的库，也是相当于备份源码。<br>
<em>注： 插件修改于明月浩空免费版，仅用于学习交流，无商业价值，如发现商业传播，将禁止软件的免费使用。</em></p>
</blockquote>
<h2 id="技术栈">技术栈</h2>
<ul>
<li>后端：thinkphp 5.1</li>
<li>前端：layui</li>
<li>数据库：mysql</li>
</ul>
<h2 id="演示站">演示站</h2>
<blockquote>
<p>已兼容移动端，测试账号仅供测试请勿修改密码！</p>
</blockquote>
<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><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">test
</span></span><span class="line"><span class="cl">test123</span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li><a href="https://player.ilt.me/"target="_blank" rel="external nofollow noopener noreferrer">https://player.ilt.me/<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://player.lruihao.cn/"target="_blank" rel="external nofollow noopener noreferrer">https://player.lruihao.cn/<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
</ul>
<h2 id="安装">安装</h2>
<h3 id="视频安装教程">视频安装教程</h3>
<p><a href="https://www.bilibili.com/video/av46476706"target="_blank" rel="external nofollow noopener noreferrer">https://www.bilibili.com/video/av46476706<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>
<ul>
<li>composer</li>
<li>php 5.6+</li>
<li>mysql 5.5+</li>
</ul>
<h3 id="步骤">步骤</h3>
<p>安装 php 依赖包</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">composer install</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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">/config/database.php</span></span></code></pre></td></tr></table>
</div>
</div><p>创建数据库</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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">字符编码：utf8 -- UTF-8 Unicode
</span></span><span class="line"><span class="cl">导入数据库脚本，脚本位置 extend/database</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="伪静态配置">伪静态配置</h3>
<h4 id="nginx">nginx</h4>
<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><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">  location / {
</span></span><span class="line"><span class="cl">      index  index.htm index.html index.php;
</span></span><span class="line"><span class="cl">      #访问路径的文件不存在则重写 URL 转交给 ThinkPHP 处理
</span></span><span class="line"><span class="cl">      if (!-e $request_filename) {
</span></span><span class="line"><span class="cl">         rewrite  ^/(.*)$  /index.php?s=$1  last;
</span></span><span class="line"><span class="cl">         break;
</span></span><span class="line"><span class="cl">      }
</span></span><span class="line"><span class="cl">  }</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="apache">apache</h4>
<p>项目自带 apache 静态化无需配置</p>
<h3 id="启动项目">启动项目</h3>
<ul>
<li>添加 public 为 web 根目录</li>
<li>若为 apache 服务器则默认伪静态，nginx 可自行配置伪静态</li>
</ul>
<h2 id="预览">预览</h2>
<p></p>
<h3 id="首页">首页</h3>
<p></p>
<h3 id="登陆页面">登陆页面</h3>
<p></p>
<h3 id="后台首页">后台首页</h3>
<p></p>
<h3 id="后台播放器管理页面">后台播放器管理页面</h3>
<p></p>
<h3 id="后台歌单管理页面">后台歌单管理页面</h3>
<p></p>]]></description></item></channel></rss>