初始化

This commit is contained in:
2026-08-08 18:27:38 +08:00
parent efc150c937
commit 060eb79c09
336 changed files with 24613 additions and 15 deletions
@@ -0,0 +1,26 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('users');
}
};
@@ -0,0 +1,22 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('password_reset_tokens', function (Blueprint $table) {
$table->string('email')->primary();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
}
public function down(): void
{
Schema::dropIfExists('password_reset_tokens');
}
};
@@ -0,0 +1,26 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('failed_jobs', function (Blueprint $table) {
$table->id();
$table->string('uuid')->unique();
$table->text('connection');
$table->text('queue');
$table->longText('payload');
$table->longText('exception');
$table->timestamp('failed_at')->useCurrent();
});
}
public function down(): void
{
Schema::dropIfExists('failed_jobs');
}
};
@@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('contact_messages', function (Blueprint $table) {
$table->id();
$table->string('name', 40);
$table->string('email', 120);
$table->string('phone', 20)->nullable();
$table->string('subject', 80);
$table->text('message');
$table->string('ip', 45)->nullable();
$table->timestamps();
$table->index('email');
$table->index('created_at');
});
}
public function down(): void
{
Schema::dropIfExists('contact_messages');
}
};
@@ -0,0 +1,22 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->boolean('is_admin')->default(false)->after('password');
});
}
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('is_admin');
});
}
};
@@ -0,0 +1,26 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('slug')->unique();
$table->string('type')->default('product'); // product | article
$table->unsignedBigInteger('parent_id')->nullable();
$table->integer('sort')->default(0);
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('categories');
}
};
@@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('category_id')->nullable();
$table->string('name');
$table->string('slug')->unique();
$table->string('model')->nullable();
$table->string('summary')->nullable();
$table->text('description')->nullable();
$table->text('specs')->nullable();
$table->string('cover')->nullable();
$table->string('status')->default('published'); // published | draft
$table->integer('sort')->default(0);
$table->timestamps();
$table->softDeletes();
$table->foreign('category_id')->references('id')->on('categories')->onDelete('set null');
});
}
public function down(): void
{
Schema::dropIfExists('products');
}
};
@@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('articles', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('category_id')->nullable();
$table->string('title');
$table->string('slug')->unique();
$table->string('summary')->nullable();
$table->text('body')->nullable();
$table->string('cover')->nullable();
$table->string('author')->nullable();
$table->string('status')->default('published'); // published | draft
$table->timestamp('published_at')->nullable();
$table->timestamps();
$table->softDeletes();
$table->foreign('category_id')->references('id')->on('categories')->onDelete('set null');
});
}
public function down(): void
{
Schema::dropIfExists('articles');
}
};
@@ -0,0 +1,26 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('glossary_terms', function (Blueprint $table) {
$table->id();
$table->string('term');
$table->string('slug')->unique();
$table->text('definition');
$table->string('aliases')->nullable();
$table->string('category')->nullable();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('glossary_terms');
}
};
@@ -0,0 +1,25 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('forum_boards', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('slug')->unique();
$table->text('description')->nullable();
$table->integer('sort')->default(0);
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('forum_boards');
}
};
@@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('forum_threads', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('board_id');
$table->unsignedBigInteger('user_id');
$table->string('title');
$table->text('body');
$table->boolean('is_pinned')->default(false);
$table->boolean('is_locked')->default(false);
$table->unsignedInteger('views')->default(0);
$table->timestamp('last_reply_at')->nullable();
$table->timestamps();
$table->softDeletes();
$table->foreign('board_id')->references('id')->on('forum_boards')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
public function down(): void
{
Schema::dropIfExists('forum_threads');
}
};
@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('forum_replies', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('thread_id');
$table->unsignedBigInteger('user_id');
$table->text('body');
$table->timestamps();
$table->softDeletes();
$table->foreign('thread_id')->references('id')->on('forum_threads')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
public function down(): void
{
Schema::dropIfExists('forum_replies');
}
};
@@ -0,0 +1,24 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('settings', function (Blueprint $table) {
$table->id();
$table->string('key')->unique();
$table->text('value')->nullable();
$table->string('group')->default('general');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('settings');
}
};
@@ -0,0 +1,22 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->unsignedInteger('points')->default(0)->after('is_admin');
});
}
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('points');
});
}
};
@@ -0,0 +1,24 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('articles', function (Blueprint $table) {
$table->string('template')->default('standard')->after('status');
$table->string('seo_title')->nullable()->after('template');
$table->string('seo_description')->nullable()->after('seo_title');
});
}
public function down(): void
{
Schema::table('articles', function (Blueprint $table) {
$table->dropColumn(['template', 'seo_title', 'seo_description']);
});
}
};
@@ -0,0 +1,23 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('products', function (Blueprint $table) {
$table->string('seo_title')->nullable()->after('slug');
$table->string('seo_description')->nullable()->after('seo_title');
});
}
public function down(): void
{
Schema::table('products', function (Blueprint $table) {
$table->dropColumn(['seo_title', 'seo_description']);
});
}
};
@@ -0,0 +1,27 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* 5 级角色 + 细粒度权限(内部员工由管理员分配)。
* 存量用户默认 role='user';种子管理员会在 Seeder 中置为 super_admin。
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->string('role')->default('user')->after('is_admin');
$table->json('permissions')->nullable()->after('role');
});
}
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['role', 'permissions']);
});
}
};
@@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* 论坛楼/回帖增加审核状态。
* 默认 approved:存量内容(迁移前已存在)保持公开,不回流到待审。
* 新发布内容由控制器显式置为 pending。
*/
public function up(): void
{
Schema::table('forum_threads', function (Blueprint $table) {
$table->string('status')->default('approved')->after('body');
});
Schema::table('forum_replies', function (Blueprint $table) {
$table->string('status')->default('approved')->after('body');
});
}
public function down(): void
{
Schema::table('forum_threads', function (Blueprint $table) {
$table->dropColumn('status');
});
Schema::table('forum_replies', function (Blueprint $table) {
$table->dropColumn('status');
});
}
};
@@ -0,0 +1,46 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* 文章支持用户投稿:增加 user_id(投稿人,管理员发稿为 null)。
*
* 注意:articles.status 列在 000005 迁移中已存在(原语义 published/draft)。
* 此处不再重复加列,而是把语义扩展为统一集:
* approved(公开)| pending(用户投稿待审)| rejected(用户投稿驳回)| draft(管理员草稿)
* 存量 published 视为已审核公开,统一映射为 approved。
*
* 容错:user_id 可能已在一次失败的迁移中被 MySQL 隐式提交创建,故加存在性判断。
*/
public function up(): void
{
if (! Schema::hasColumn('articles', 'user_id')) {
Schema::table('articles', function (Blueprint $table) {
$table->foreignId('user_id')
->nullable()
->after('category_id')
->constrained('users')
->nullOnDelete();
});
}
DB::table('articles')
->where('status', 'published')
->update(['status' => 'approved']);
}
public function down(): void
{
if (Schema::hasColumn('articles', 'user_id')) {
Schema::table('articles', function (Blueprint $table) {
$table->dropConstrainedForeignId('user_id');
});
}
// 不回滚 status 取值,避免误伤已发布内容。
}
};
@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* 详细注册:在 users 表补充资料字段(均允许为空,降低注册门槛)。
* - real_name:真实姓名(与昵称 name 区分)
* - phone:手机号
* - company:公司名称
* - industry:行业/领域
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->string('real_name')->nullable()->after('name');
$table->string('phone')->nullable()->after('real_name');
$table->string('company')->nullable()->after('phone');
$table->string('industry')->nullable()->after('company');
});
}
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['real_name', 'phone', 'company', 'industry']);
});
}
};
@@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('solutions', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('slug')->unique();
$table->string('power_segment')->nullable(); // 功率段:lt30|30-65|65-100|gt100
$table->string('application')->nullable(); // 应用场景:charger|powerbank|car|dock
$table->string('chip_platform')->nullable(); // 芯片平台:protocol|soc|rectifier
$table->string('power')->nullable(); // 功率参数,如 65W
$table->string('summary')->nullable();
$table->text('advantages')->nullable(); // 方案优势,换行分隔
$table->text('description')->nullable();
$table->string('cover')->nullable();
$table->string('status')->default('published'); // published | draft
$table->integer('sort')->default(0);
$table->string('seo_title')->nullable();
$table->string('seo_description')->nullable();
$table->timestamps();
$table->softDeletes();
});
}
public function down(): void
{
Schema::dropIfExists('solutions');
}
};
@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('news', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->string('slug')->unique();
$table->string('category')->default('industry'); // industry|company|event
$table->string('summary')->nullable();
$table->text('body')->nullable();
$table->string('cover')->nullable();
$table->string('status')->default('published'); // published | draft
$table->timestamp('published_at')->nullable();
$table->string('seo_title')->nullable();
$table->string('seo_description')->nullable();
$table->timestamps();
$table->softDeletes();
});
}
public function down(): void
{
Schema::dropIfExists('news');
}
};
@@ -0,0 +1,25 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* 与 pd-tech-hub 对齐:联系表单增加「公司」字段,便于 B 端客户对接。
*/
public function up(): void
{
Schema::table('contact_messages', function (Blueprint $table) {
$table->string('company', 120)->nullable()->after('phone');
});
}
public function down(): void
{
Schema::table('contact_messages', function (Blueprint $table) {
$table->dropColumn('company');
});
}
};
@@ -0,0 +1,27 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('navigation_menus', function (Blueprint $table) {
$table->id();
$table->string('label', 60)->comment('菜单显示文字');
$table->string('url', 255)->comment('链接地址(站内路径如 /about 或完整外链)');
$table->boolean('is_visible')->default(true)->comment('是否在前台显示');
$table->integer('sort_order')->default(0)->comment('排序,数字越小越靠前');
$table->timestamps();
$table->index(['is_visible', 'sort_order']);
});
}
public function down(): void
{
Schema::dropIfExists('navigation_menus');
}
};
@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('hero_slides', function (Blueprint $table) {
$table->id();
$table->string('location', 40)->default('home')->comment('展示位置(预留多页扩展,当前仅 home)');
$table->string('title', 120)->comment('后台标识 / 无障碍标题');
$table->text('content')->nullable()->comment('富文本正文(Quill 产出的 HTML');
$table->string('cta_text', 80)->nullable()->comment('主按钮文字');
$table->string('cta_url', 255)->nullable()->comment('主按钮链接');
$table->string('cta2_text', 80)->nullable()->comment('次按钮文字');
$table->string('cta2_url', 255)->nullable()->comment('次按钮链接');
$table->boolean('is_active')->default(true)->comment('是否启用');
$table->integer('sort_order')->default(0)->comment('排序,数字越小越靠前');
$table->timestamps();
$table->index(['location', 'is_active', 'sort_order']);
});
}
public function down(): void
{
Schema::dropIfExists('hero_slides');
}
};