初始化

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
+158
View File
@@ -0,0 +1,158 @@
<?php
use App\Http\Middleware\Admin;
use App\Http\Controllers\Auth\LoginController;
use App\Http\Controllers\Auth\RegisterController;
use App\Http\Controllers\Auth\SettingsController as AuthSettingsController;
use App\Http\Controllers\Auth\AdminLoginController;
use App\Http\Controllers\Auth\CaptchaController;
use App\Http\Controllers\ContactController;
use App\Http\Controllers\SearchController;
use App\Http\Controllers\HomeController;
use App\Http\Controllers\SitemapController;
use App\Http\Controllers\ProductController;
use App\Http\Controllers\ArticleController;
use App\Http\Controllers\SolutionsController;
use App\Http\Controllers\NewsController;
use App\Http\Controllers\Admin\SolutionController as AdminSolutionController;
use App\Http\Controllers\Admin\NewsController as AdminNewsController;
use App\Http\Controllers\UploadController;
use App\Http\Controllers\GlossaryController;
use App\Http\Controllers\ForumController;
use App\Http\Controllers\Admin\DashboardController;
use App\Http\Controllers\Admin\CategoryController as AdminCategoryController;
use App\Http\Controllers\Admin\ProductController as AdminProductController;
use App\Http\Controllers\Admin\ArticleController as AdminArticleController;
use App\Http\Controllers\Admin\GlossaryController as AdminGlossaryController;
use App\Http\Controllers\Admin\ContactController as AdminContactController;
use App\Http\Controllers\Admin\UserController;
use App\Http\Controllers\Admin\SettingsController as AdminSettingsController;
use App\Http\Controllers\Admin\MenuController as AdminMenuController;
use App\Http\Controllers\Admin\HeroSlideController as AdminHeroSlideController;
use App\Http\Controllers\Admin\ForumBoardController;
use App\Http\Controllers\Admin\ForumThreadController;
use App\Http\Controllers\Admin\ModerationController;
use App\Http\Controllers\Admin\DatabaseController;
use Illuminate\Support\Facades\Route;
Route::get('/', [HomeController::class, 'index'])->name('home');
Route::get('/about', [HomeController::class, 'about'])->name('about');
// ── 网站地图 ─────────────────────────────────────────────
Route::get('/sitemap.xml', [SitemapController::class, 'xml'])->name('sitemap.xml');
Route::get('/sitemap', [SitemapController::class, 'index'])->name('sitemap');
Route::get('/robots.txt', [SitemapController::class, 'robots'])->name('robots');
// 图形验证码(登录防暴力破解,访客可用,写入 session)
Route::get('/captcha', [CaptchaController::class, 'show'])->name('captcha');
Route::get('/contact', [ContactController::class, 'show'])->name('contact');
Route::post('/contact', [ContactController::class, 'store']);
Route::middleware('guest')->group(function () {
Route::get('/login', [LoginController::class, 'show'])->name('login');
Route::post('/login', [LoginController::class, 'store']);
Route::get('/register', [RegisterController::class, 'show'])->name('register');
Route::post('/register', [RegisterController::class, 'store']);
// 管理员独立登录页(与普通用户登录分离)
Route::get('/admin/login', [AdminLoginController::class, 'show'])->name('admin.login');
Route::post('/admin/login', [AdminLoginController::class, 'store']);
});
// ── 全站搜索 ───────────────────────────────────────────────
Route::get('/search', [SearchController::class, 'index'])->name('search');
Route::post('/logout', [LoginController::class, 'destroy'])
->middleware('auth')
->name('logout');
Route::middleware('auth')->group(function () {
Route::get('/settings', [AuthSettingsController::class, 'index'])->name('auth.settings');
Route::post('/settings/password', [AuthSettingsController::class, 'updatePassword'])->name('auth.settings.password');
// 用户投稿文章
Route::get('/articles/submit', [ArticleController::class, 'create'])->name('articles.submit');
Route::post('/articles/submit', [ArticleController::class, 'storeSubmission'])->name('articles.submit.store');
Route::get('/articles/mine', [ArticleController::class, 'mine'])->name('articles.mine');
// 通用图片上传(文章插图 / 封面),登录用户可用
Route::post('/upload', [UploadController::class, 'store'])->name('upload');
});
// ── 前台展示 ───────────────────────────────────────────────
Route::get('/products', [ProductController::class, 'index'])->name('products.index');
Route::get('/products/{product:slug}', [ProductController::class, 'show'])->name('products.show');
Route::get('/articles', [ArticleController::class, 'index'])->name('articles.index');
Route::get('/articles/{article:slug}', [ArticleController::class, 'show'])->name('articles.show');
Route::get('/solutions', [SolutionsController::class, 'index'])->name('solutions.index');
Route::get('/solutions/{solution:slug}', [SolutionsController::class, 'show'])->name('solutions.show');
Route::get('/news', [NewsController::class, 'index'])->name('news.index');
Route::get('/news/{news:slug}', [NewsController::class, 'show'])->name('news.show');
Route::get('/glossary', [GlossaryController::class, 'index'])->name('glossary.index');
Route::get('/glossary/{glossary_term:slug}', [GlossaryController::class, 'show'])->name('glossary.show');
Route::get('/forum', [ForumController::class, 'index'])->name('forum.index');
Route::get('/forum/board/{board:slug}', [ForumController::class, 'board'])->name('forum.board');
Route::get('/forum/thread/{thread}', [ForumController::class, 'thread'])->name('forum.thread');
Route::post('/forum/threads', [ForumController::class, 'store'])->name('forum.threads.store')->middleware('auth');
Route::post('/forum/threads/{thread}/replies', [ForumController::class, 'reply'])->name('forum.replies.store')->middleware('auth');
// ── 后台管理 ───────────────────────────────────────────────
// 进入后台:admin 中间件负责「游客→/admin/login 重定向」与「非后台角色→403」,
// 各模块再按权限点(can:)细粒度门禁。
Route::middleware(['admin'])->prefix('admin')->name('admin.')->group(function () {
Route::get('/', [DashboardController::class, 'index'])->name('dashboard')->middleware('can:dashboard.view');
Route::resource('categories', AdminCategoryController::class)->middleware('can:categories.view');
Route::resource('products', AdminProductController::class)->middleware('can:products.view');
Route::resource('articles', AdminArticleController::class)->middleware('can:articles.view');
Route::resource('solutions', AdminSolutionController::class)->middleware('can:solutions.view');
Route::resource('news', AdminNewsController::class)->middleware('can:news.view');
Route::resource('glossary', AdminGlossaryController::class)->parameter('glossary', 'glossary_term')->middleware('can:glossary.view');
Route::resource('contacts', AdminContactController::class)->only(['index', 'show', 'destroy'])->middleware('can:contacts.view');
Route::get('users', [UserController::class, 'index'])->name('users.index')->middleware('can:users.view');
Route::get('users/create', [UserController::class, 'create'])->name('users.create')->middleware('can:users.create');
Route::post('users', [UserController::class, 'store'])->name('users.store')->middleware('can:users.create');
Route::get('users/{user}/edit', [UserController::class, 'edit'])->name('users.edit')->middleware('can:users.view');
Route::put('users/{user}', [UserController::class, 'update'])->name('users.update')->middleware('can:users.assign_role');
Route::post('users/{user}/reset-password', [UserController::class, 'resetPassword'])->name('users.reset-password')->middleware('can:users.reset_password');
Route::delete('users/{user}', [UserController::class, 'destroy'])->name('users.destroy')->middleware('can:users.delete');
Route::get('settings', [AdminSettingsController::class, 'index'])->name('settings')->middleware('can:settings.view');
Route::put('settings', [AdminSettingsController::class, 'update'])->name('settings.update')->middleware('can:settings.update');
// 外观管理:导航菜单 + 首页 Hero 轮播
Route::resource('menus', AdminMenuController::class)->middleware('can:appearance.view');
Route::post('menus/{menu}/move', [AdminMenuController::class, 'move'])->name('menus.move')->middleware('can:appearance.update');
Route::post('menus/{menu}/toggle', [AdminMenuController::class, 'toggle'])->name('menus.toggle')->middleware('can:appearance.update');
Route::resource('hero-slides', AdminHeroSlideController::class)->middleware('can:appearance.view');
Route::post('hero-slides/{hero_slide}/move', [AdminHeroSlideController::class, 'move'])->name('hero-slides.move')->middleware('can:appearance.update');
Route::post('hero-slides/{hero_slide}/toggle', [AdminHeroSlideController::class, 'toggle'])->name('hero-slides.toggle')->middleware('can:appearance.update');
Route::post('hero/mode', [AdminHeroSlideController::class, 'setMode'])->name('hero.mode')->middleware('can:appearance.update');
// 统一审核队列(文章投稿 / 论坛帖子 / 回复)
Route::get('moderation', [ModerationController::class, 'index'])->name('moderation.index')->middleware('can:articles.moderate,forum.moderate');
Route::post('moderation/articles/{article}/approve', [ModerationController::class, 'approveArticle'])->name('moderation.articles.approve')->middleware('can:articles.moderate');
Route::post('moderation/articles/{article}/reject', [ModerationController::class, 'rejectArticle'])->name('moderation.articles.reject')->middleware('can:articles.moderate');
Route::post('moderation/threads/{thread}/approve', [ModerationController::class, 'approveThread'])->name('moderation.threads.approve')->middleware('can:forum.moderate');
Route::post('moderation/threads/{thread}/reject', [ModerationController::class, 'rejectThread'])->name('moderation.threads.reject')->middleware('can:forum.moderate');
Route::post('moderation/replies/{reply}/approve', [ModerationController::class, 'approveReply'])->name('moderation.replies.approve')->middleware('can:forum.moderate');
Route::post('moderation/replies/{reply}/reject', [ModerationController::class, 'rejectReply'])->name('moderation.replies.reject')->middleware('can:forum.moderate');
Route::name('forum.')->prefix('forum')->group(function () {
Route::resource('boards', ForumBoardController::class)->middleware('can:forum.view');
Route::resource('threads', ForumThreadController::class)->only(['index', 'destroy'])->middleware('can:forum.view');
});
// 数据库管理:迁移状态查看 + 一键升级(后台随时升级数据库)
Route::get('database', [DatabaseController::class, 'index'])->name('database')->middleware('can:settings.update');
Route::post('database/upgrade', [DatabaseController::class, 'upgrade'])->name('database.upgrade')->middleware('can:settings.update');
});