所有操作拆成 「准备工作→分步操作→验证效果」 三个阶段,每一步都标注清楚操作位置和注意事项,你跟着做就行:
一、准备工作(必看!)
- 工具准备:
- 服务器管理工具(如宝塔面板,90% 的小白都用这个)
- 电脑端浏览器(Chrome/Edge)
- 文本编辑器(记事本就行,不用装复杂软件)
- 核心前提:
- 你能登录服务器 / 宝塔面板
- 能找到独角数卡的安装目录
- 知道数据库的账号密码(宝塔面板里能看)
二、分步操作(全程复制粘贴,零代码基础也能会)
步骤 1:给数据库添加密码字段(宝塔面板操作)
- 登录宝塔面板 → 找到左侧「数据库」→ 点击你独角数卡用的数据库(比如
dujiaoka)→ 点击「SQL」标签。 - 清空输入框里的默认内容,复制下面的代码粘贴进去,点击「执行」
ALTER TABLE `article` ADD COLUMN `need_password` TINYINT(1) DEFAULT 0 COMMENT '是否需要密码访问 0-否 1-是' AFTER `content`, ADD COLUMN `password` VARCHAR(255) NULL COMMENT '文章访问密码' AFTER `need_password`; - 执行成功会提示「运行成功」,如果提示报错,大概率是表名不对(比如你的文章表不是
article,可以问开发者或看数据库里的表名)。
步骤 2:添加密码验证页面(新建文件)
- 宝塔面板 → 左侧「文件」→ 找到独角数卡的安装目录(比如
/www/wwwroot/dujiaoka)→ 进入resources/views/hyper/目录。 - 点击「新建文件」,文件名填:
article_password.blade.php,点击「创建」。 - 打开新建的文件,清空默认内容,复制下面的代码粘贴进去保存
@extends('hyper.layouts.default') @section('content') <div class="row justify-content-center mt-5"> <div class="col-md-6 col-lg-4"> <div class="card shadow-sm border-0 rounded-lg"> <div class="card-header bg-primary text-white text-center"> <h4 class="mb-0">🔒 文章加密访问</h4> </div> <div class="card-body p-4"> <h5 class="text-center mb-4">{{ $article->title }}</h5> @if($error) <div class="alert alert-danger alert-dismissible fade show" role="alert"> {{ $error }} <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> </div> @endif <form method="POST" action="{{ url('/article/'.$article->id) }}"> @csrf <div class="mb-3"> <label class="form-label">请输入访问密码</label> <div class="input-group"> <span class="input-group-text">🔑</span> <input type="password" name="article_password" class="form-control" placeholder="输入密码解锁文章" required> </div> </div> <button type="submit" class="btn btn-primary w-100 py-2"> 验证并访问 </button> </form> </div> <div class="card-footer text-center text-muted"> <small>密码有效期:2小时 | 如有问题请联系管理员</small> </div> </div> </div> </div> @endsection @section('js') <script> document.querySelector('input[name="article_password"]').addEventListener('keydown', function(e) { if (e.key === 'Enter') { document.querySelector('form').submit(); } }); </script> @endsection步骤 3:修改文章详情控制器(核心逻辑)
- 宝塔面板 → 「文件」→ 进入
app/Http/Controllers/Hyper/目录(如果没有 Hyper 文件夹,就找ArticleController.php所在目录)。 - 找到
ArticleController.php文件,右键「编辑」,清空原有内容,复制下面的代码粘贴(如果原有文件有其他代码,保留原有use开头的行,只替换show方法):<?php namespace App\Http\Controllers\Hyper; use App\Models\Article; use Illuminate\Http\Request; use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\Hash; use Illuminate\Routing\Controller as BaseController; class ArticleController extends BaseController { // 文章详情页(带密码验证) public function show(Request $request, $id) { // 查询文章 $article = Article::with('category')->findOrFail($id); // 判断是否需要密码访问 if ($article->need_password == 1 && !empty($article->password)) { $sessionKey = 'article_auth_' . $article->id; // 检查是否已授权 if (!Session::get($sessionKey)) { // 处理密码提交 if ($request->isMethod('post')) { $inputPass = $request->input('article_password', ''); // 验证密码(简单验证,小白版) if ($inputPass == $article->password) { // 授权2小时 Session::put($sessionKey, true, 7200); return redirect()->to('/article/'.$article->id); } else { return view('hyper.article_password', [ 'article' => $article, 'error' => '密码错误,请重新输入!' ]); } } // 显示密码页 return view('hyper.article_password', [ 'article' => $article, 'error' => '' ]); } } // 无需密码/已授权,显示文章 return view('hyper.article', [ 'article' => $article ]); } // 保存文章(含密码设置) public function store(Request $request) { $data = $request->all(); // 处理密码 if (isset($data['need_password']) && $data['need_password'] == 1) { $data['need_password'] = 1; // 直接保存明文密码(小白版,简单易操作) $data['password'] = $data['password'] ?? ''; } else { $data['need_password'] = 0; $data['password'] = null; } // 保留原有保存逻辑(下面这行根据你原有代码调整,不懂就保留) Article::updateOrCreate(['id' => $data['id'] ?? null], $data); return redirect()->back()->with('success', '文章保存成功!'); } }步骤 4:修改文章详情页模板(添加加密标识)
- 找到你提供的
article.blade.php文件(resources/views/hyper/目录下),右键「编辑」,替换成下面的代码:@extends('hyper.layouts.article') @section('content') <div class="row"> <div class="col-12"> <div class="card"> <div class="card-body"> <div class="card-title"> <a href="/article">首页</a>-> <a href="/article?cat_id={{$article['category_id']}}"> {{$article['category']['category_name']}} </a>-> {{ $article['title'] }} </div> <hr> <div class="blog-content"> <div class="blog-post"> <h3 class="blog-post-title text-center"> {{ $article['title'] }} <!-- 加密文章显示标识 --> @if($article['need_password'] == 1) <span class="badge bg-danger ms-2">加密</span> @endif </h3> <p class="blog-post-meta text-right"> 日期:{{ $article['updated_at'] }} </p> <div class="mt-4"> {!! $article['content'] !!} </div> </div> </div> </div> </div> </div> </div> @stop
步骤 5:后台添加密码设置项(文章编辑页)
- 找到后台文章编辑的模板文件(通常是
resources/views/admin/article/edit.blade.php或create.blade.php),在表单末尾添加下面的代码:<!-- 密码访问设置 --> <div class="form-group mt-4"> <label class="form-label fs-6"> <input type="checkbox" name="need_password" value="1" @if(isset($article) && $article->need_password == 1) checked @endif> 开启密码访问 </label> </div> <div class="form-group" id="password_input" style="display: @if(isset($article) && $article->need_password == 1) block @else none @endif;"> <label class="form-label">访问密码</label> <input type="password" name="password" class="form-control" placeholder="设置文章访问密码" value=""> <div class="form-text text-muted mt-1">设置后访问该文章需要输入此密码</div> </div> <script> // 勾选后显示密码框 document.querySelector('input[name="need_password"]').addEventListener('change', function() { const passwordInput = document.getElementById('password_input'); passwordInput.style.display = this.checked ? 'block' : 'none'; }); </script>步骤 6:文章列表页添加加密标识(可选)
找到你文章列表的卡片代码(循环显示文章的地方),在标签区域添加:<!-- 加密标识 --> @if($article['need_password'] == 1) <span class="card-tag" style="background: #dc3545; color:white;">加密</span> @endif
- 找到你提供的
- 宝塔面板 → 「文件」→ 进入