引自免费微信小程序:皆我百晓生
为了帮助您解决这个问题,我会分步骤地解释如何完成每个任务,并提供相应的代码示例。这里假设您正在使用 Laravel 框架。
首先确保您的环境已经安装了Laravel,如果没有,请按照官方文档进行安装:https://laravel.com/docs/8.x/installation
第一步:修改数据库
- 使用Artisan命令行工具来迁移数据库结构。首先创建两个迁移文件,分别用于
member和post表:
php artisan make:migration add_remember_token_to_members --table=members
php artisan make:migration add_user_id_to_posts --table=posts
打开这两个文件(通常位于database/migrations目录),然后分别编辑它们:
add_remember_token_to_members.php:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddRememberTokenToMembers extends Migration
{
public function up()
{
Schema::table('members', function (Blueprint $table) {
$table->string('remember_token', 100)->nullable();
});
}
public function down()
{
Schema::table('members', function (Blueprint $table) {
$table->dropColumn('remember_token');
});
}
}
add_user_id_to_posts.php:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddUserIdToPosts extends Migration
{
public function up()
{
Schema::table('posts', function (Blueprint $table) {
$table->unsignedBigInteger('user_id')->after('id')->nullable();
$table->foreign('user_id')->references('id')->on('members');
});
}
public function down()
{
Schema::table('posts', function (Blueprint $table) {
$table->dropForeign(['user_id_foreign']);
$table->dropColumn('user_id');
});
}
}
运行迁移:
php artisan migrate
第二步:创建模型
在app/Models目录下创建Member.php和Post.php模型文件,内容如下:
Member.php:
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Member extends Authenticatable
{
use HasFactory, Notifiable;
protected $fillable = [
'name',
'email',
'password',
// 其他字段...
];
protected $hidden = [
'password',
'remember_token',
];
public function posts()
{
return $this->hasMany(Post::class);
}
}
Post.php:
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
protected $fillable = [
'title',
'content',
// 其他字段...
];
public function user()
{
return $this->belongsTo(Member::class);
}
}
第三步:创建控制器
创建一个名为ArticleController.php的控制器文件,用于处理文章相关操作:
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class ArticleController extends Controller
{
public function index()
{
$posts = Post::all();
return view('articles.index', ['posts' => $posts]);
}
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|string|max:255',
'content' => 'required|string',
]);
$post = new Post();
$post->title = $validatedData['title'];
$post->content = $validatedData['content'];
$post->user_id = Auth::guard('blog')->id();
$post->save();
return redirect('/articles');
}
}
第四步:创建视图
在resources/views/articles目录下创建index.blade.php,内容如下:
@extends('layouts.app')
@section('content')
<h1>文章列表</h1>
@foreach ($posts as $post)
<div>
<h2>{{ $post->title }}</h2>
<p>创建时间:{{ $post->created_at->format('Y年m月d H:i:s') }}</p>
</div>
@endforeach
@endsection
第五步:定义路由
在routes/web.php文件中添加以下路由:
Route::get('/articles', [App\Http\Controllers\ArticleController::class, 'index'])->name('articles.index');
Route::post('/articles', [App\Http\Controllers\ArticleController::class, 'store'])->name('articles.store');
第六步:实现登录状态判断与退出功能
在resources/views/layouts/app.blade.php中添加导航栏部分,并使用Laravel Blade模板引擎的@auth和@guest语句判断用户登录状态:
<nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
<div class="container">
<!-- Brand -->
<a class="navbar-brand" href="{{ url('/') }}">
{{ config('app.name', 'Laravel') }}
</a>
<!-- Toggler/collapsibe button -->
<button @click="toggleNavbar" class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false"
aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Navbar links -->
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<!-- Left Side Links -->
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#">首页</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">添加文章</a>
</li>
</ul>
<!-- Right Side Links -->
@auth('blog')
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" id="navbarDropdownMenuLink" role="button"
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{ auth('blog')->user()->nickname ?? '匿名' }}
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdownMenuLink">
<li><a class="dropdown-item" href="#">个人中心</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="{{ route('logout', ['guard' => 'blog']) }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
退出
</a>
<form id="logout-form" action="{{ route('logout', ['guard' => 'blog']) }}" method="POST"
style="display: none;">
@csrf
</form>
</li>
</ul>
</li>
</ul>
@else
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link" href="{{ route('login', ['guard' => 'blog']) }}">登录</a></li>
<li class="nav-item"><a class="nav-link" href="{{ route('register', ['guard' => 'blog']) }}">注册</a></li>
</ul>
@endauth
</div>
</div>
</nav>
第七步:创建登录和注册视图
在resources/views/auth目录下创建login.blade.php和register.blade.php,并根据需要配置表单和验证规则。
第八步:配置 guards
在config/auth.php文件中配置多租户 guards,例如:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
'blog' => [
'driver' => 'session',
'provider' => 'blog-users',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'blog-users' => [
'driver' => 'eloquent',
'model' => App\Models\Member::class,
],
],
这样就完成了所有的要求。记得运行以下命令来清除缓存和重新生成路由:
php artisan cache:clear
php artisan route:cache
现在你应该可以在本地服务器上访问http://127.0.0.1:8000/articles查看文章列表,并且根据登录状态展示不同的导航栏。