diff --git a/CHANGELOG.md b/CHANGELOG.md index b752d37..2e5717b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 2026-09-21 + +- Logged-in admin/editor see a header **管理** link that opens `/admin` in a new tab. +- Schema snapshot: `docs/database/mysql-schema-20260921-233554.sql`. + ## 2026-09-18 - Pager chip is now `6 / 316` in the old SaBlog bar style, not a loose “第 x / y 页” label. diff --git a/Fetures.md b/Fetures.md index dd93cb7..52618f4 100644 --- a/Fetures.md +++ b/Fetures.md @@ -32,6 +32,11 @@ See `README.md` and `docs/` for install, import, plugins, and themes. - Filament v5 actions are `Filament\Actions\Action`. The comments relation manager on the edit page must boot in tests, because a stale `Tables\Actions\Action` import only fails when that Livewire table renders. - Guests still get 404 for drafts. Admin and editor can open unpublished posts and see a preview banner. +## Frontend admin shortcut + +- After login, admin and editor see **管理** in the site header. It opens `/admin` in a new tab. +- Regular members do not see it. The profile page has the same link for staff. + ## Admin chrome - Top-right badge shows the current app environment (`local` / `prod` / others). diff --git a/README.md b/README.md index 015f67f..42ccbf3 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ - **多主题**:`themes/` 目录即皮肤,后台一键切换/上传 ZIP;内置 sablog 经典风 + modern 简约风两套 - **插件系统**:`plugins/` 目录 + 钩子系统(action/filter),ZIP 安装 + 可选远程市场;启用时自动跑插件迁移 - **后台顶栏**:右上角显示当前环境(local/prod)+ 打开网站 + 一键写文章 +- **前台管理入口**:管理员/编辑登录后,顶栏出现 **管理**,新窗口打开 `/admin` - **文章编辑**:左正文 2 : 右功能 1(Slug 整行,分类/格式/状态同一行,封面在正文上方) - **内置插件**:SEO & GEO(JSON-LD/OG)、AI 评论审核 + 内容润色(Workerman 异步)、支付(支付宝/微信/沙箱)、会员(套餐订阅 + 付费文章) - **首页浏览模式**:和老 sablog 一样可切 **标准(全文) / 列表(摘要)** diff --git a/app/Models/User.php b/app/Models/User.php index e431bb4..5f4eeaf 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -22,6 +22,11 @@ class User extends Authenticatable implements FilamentUser use HasFactory, Notifiable, HasRoles, HasApiTokens; public function canAccessPanel(Panel $panel): bool + { + return $this->canAccessAdmin(); + } + + public function canAccessAdmin(): bool { return $this->hasRole(['admin', 'editor']); } diff --git a/docs/database/mysql-schema-20260921-233554.sql b/docs/database/mysql-schema-20260921-233554.sql new file mode 100644 index 0000000..3af0b28 --- /dev/null +++ b/docs/database/mysql-schema-20260921-233554.sql @@ -0,0 +1,584 @@ +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +DROP TABLE IF EXISTS `cache`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `cache` ( + `key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `value` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL, + `expiration` int NOT NULL, + PRIMARY KEY (`key`), + KEY `cache_expiration_index` (`expiration`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `cache_locks`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `cache_locks` ( + `key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `owner` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `expiration` int NOT NULL, + PRIMARY KEY (`key`), + KEY `cache_locks_expiration_index` (`expiration`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `categories`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `categories` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(120) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `display_order` tinyint NOT NULL DEFAULT '0', + `description` text COLLATE utf8mb4_unicode_ci, + `cover_media_id` bigint unsigned DEFAULT NULL, + `post_count` int unsigned NOT NULL DEFAULT '0', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `categories_slug_unique` (`slug`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `comments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `comments` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `post_id` bigint unsigned NOT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `author_name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `author_email` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `author_url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `content` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL, + `ip` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', + `ai_review` json DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `comments_user_id_foreign` (`user_id`), + KEY `comments_post_id_status_index` (`post_id`,`status`), + KEY `comments_status_index` (`status`), + CONSTRAINT `comments_post_id_foreign` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`) ON DELETE CASCADE, + CONSTRAINT `comments_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `failed_jobs`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `failed_jobs` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `uuid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `connection` text COLLATE utf8mb4_unicode_ci NOT NULL, + `queue` text COLLATE utf8mb4_unicode_ci NOT NULL, + `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `exception` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `failed_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `failed_jobs_uuid_unique` (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `hello_world_logs`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `hello_world_logs` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `comment_id` bigint unsigned DEFAULT NULL, + `note` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `hello_world_logs_comment_id_foreign` (`comment_id`), + CONSTRAINT `hello_world_logs_comment_id_foreign` FOREIGN KEY (`comment_id`) REFERENCES `comments` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `job_batches`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `job_batches` ( + `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `total_jobs` int NOT NULL, + `pending_jobs` int NOT NULL, + `failed_jobs` int NOT NULL, + `failed_job_ids` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `options` mediumtext COLLATE utf8mb4_unicode_ci, + `cancelled_at` int DEFAULT NULL, + `created_at` int NOT NULL, + `finished_at` int DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `jobs`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `jobs` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `queue` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `attempts` tinyint unsigned NOT NULL, + `reserved_at` int unsigned DEFAULT NULL, + `available_at` int unsigned NOT NULL, + `created_at` int unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `jobs_queue_index` (`queue`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `links`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `links` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, + `url` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `note` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `display_order` tinyint NOT NULL DEFAULT '0', + `visible` tinyint(1) NOT NULL DEFAULT '1', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `market_packages`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `market_packages` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `item_key` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, + `item_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `price` bigint unsigned NOT NULL, + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', + `payment_id` bigint unsigned DEFAULT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `market_packages_item_key_item_type_unique` (`item_key`,`item_type`), + KEY `market_packages_payment_id_foreign` (`payment_id`), + KEY `market_packages_user_id_foreign` (`user_id`), + CONSTRAINT `market_packages_payment_id_foreign` FOREIGN KEY (`payment_id`) REFERENCES `payments` (`id`) ON DELETE SET NULL, + CONSTRAINT `market_packages_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `media`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `media` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `model_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `model_id` bigint unsigned NOT NULL, + `uuid` char(36) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `collection_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `file_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `mime_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `disk` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `conversions_disk` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `size` bigint unsigned NOT NULL, + `manipulations` json NOT NULL, + `custom_properties` json NOT NULL, + `generated_conversions` json NOT NULL, + `responsive_images` json NOT NULL, + `order_column` int unsigned DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `media_uuid_unique` (`uuid`), + KEY `media_model_type_model_id_index` (`model_type`,`model_id`), + KEY `media_order_column_index` (`order_column`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `media_folders`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `media_folders` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `parent_id` bigint unsigned DEFAULT NULL, + `code` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `sort` int NOT NULL DEFAULT '0', + `is_active` tinyint(1) NOT NULL DEFAULT '1', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `media_folders_code_unique` (`code`), + KEY `media_folders_parent_id_foreign` (`parent_id`), + CONSTRAINT `media_folders_parent_id_foreign` FOREIGN KEY (`parent_id`) REFERENCES `media_folders` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `media_library`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `media_library` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `user_id` bigint unsigned DEFAULT NULL, + `disk` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'public', + `path` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `original_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `extension` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `mime_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `size` bigint unsigned NOT NULL DEFAULT '0', + `type` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'image', + `source` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'admin', + `folder` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `alt_text` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `custom_properties` json DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `deleted_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `media_library_path_unique` (`path`), + KEY `media_library_user_id_foreign` (`user_id`), + KEY `media_library_type_index` (`type`), + KEY `media_library_folder_index` (`folder`), + KEY `media_library_source_index` (`source`), + CONSTRAINT `media_library_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `membership_plans`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `membership_plans` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` text COLLATE utf8mb4_unicode_ci, + `price` bigint unsigned NOT NULL, + `duration_days` int unsigned NOT NULL DEFAULT '30', + `permissions` json DEFAULT NULL, + `active` tinyint(1) NOT NULL DEFAULT '1', + `sort` int unsigned NOT NULL DEFAULT '0', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `membership_plans_slug_unique` (`slug`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `migrations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `migrations` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `migration` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `batch` int NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `model_has_permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `model_has_permissions` ( + `permission_id` bigint unsigned NOT NULL, + `model_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `model_id` bigint unsigned NOT NULL, + PRIMARY KEY (`permission_id`,`model_id`,`model_type`), + KEY `model_has_permissions_model_id_model_type_index` (`model_id`,`model_type`), + CONSTRAINT `model_has_permissions_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `model_has_roles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `model_has_roles` ( + `role_id` bigint unsigned NOT NULL, + `model_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `model_id` bigint unsigned NOT NULL, + PRIMARY KEY (`role_id`,`model_id`,`model_type`), + KEY `model_has_roles_model_id_model_type_index` (`model_id`,`model_type`), + CONSTRAINT `model_has_roles_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `password_reset_tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `password_reset_tokens` ( + `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `token` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `payments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payments` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `order_no` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `subject` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `amount` bigint unsigned NOT NULL, + `channel` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'alipay', + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', + `gateway_trade_no` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `payload` json DEFAULT NULL, + `paid_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `payable_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `payable_id` bigint unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `payments_order_no_unique` (`order_no`), + KEY `payments_user_id_status_index` (`user_id`,`status`), + KEY `payments_payable_type_payable_id_index` (`payable_type`,`payable_id`), + CONSTRAINT `payments_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `permissions` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `guard_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `permissions_name_guard_name_unique` (`name`,`guard_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `personal_access_tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `personal_access_tokens` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `tokenable_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `tokenable_id` bigint unsigned NOT NULL, + `name` text COLLATE utf8mb4_unicode_ci NOT NULL, + `token` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, + `abilities` text COLLATE utf8mb4_unicode_ci, + `last_used_at` timestamp NULL DEFAULT NULL, + `expires_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `personal_access_tokens_token_unique` (`token`), + KEY `personal_access_tokens_tokenable_type_tokenable_id_index` (`tokenable_type`,`tokenable_id`), + KEY `personal_access_tokens_expires_at_index` (`expires_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `plugin_records`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `plugin_records` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `vendor` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL, + `version` varchar(40) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `enabled` tinyint(1) NOT NULL DEFAULT '1', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `plugin_records_vendor_name_unique` (`vendor`,`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `posts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `posts` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `category_id` bigint unsigned DEFAULT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `excerpt` text COLLATE utf8mb4_unicode_ci, + `content` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `content_format` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'markdown', + `keywords` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `cover_media_id` bigint unsigned DEFAULT NULL, + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'published', + `is_sticky` tinyint(1) NOT NULL DEFAULT '0', + `sticky_level` tinyint unsigned NOT NULL DEFAULT '0', + `close_comment` tinyint(1) NOT NULL DEFAULT '0', + `read_password` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `views` bigint unsigned NOT NULL DEFAULT '0', + `comment_count` int unsigned NOT NULL DEFAULT '0', + `meta` json DEFAULT NULL, + `published_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `posts_slug_unique` (`slug`), + KEY `posts_category_id_foreign` (`category_id`), + KEY `posts_user_id_foreign` (`user_id`), + KEY `posts_status_published_at_index` (`status`,`published_at`), + KEY `posts_status_index` (`status`), + KEY `posts_published_at_index` (`published_at`), + CONSTRAINT `posts_category_id_foreign` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE SET NULL, + CONSTRAINT `posts_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `redirects`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `redirects` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `hash` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL, + `target_url` text COLLATE utf8mb4_unicode_ci NOT NULL, + `clicks` bigint unsigned NOT NULL DEFAULT '0', + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'active', + `last_clicked_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `redirects_hash_unique` (`hash`), + KEY `redirects_target_url_index` (`target_url`(191)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `role_has_permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `role_has_permissions` ( + `permission_id` bigint unsigned NOT NULL, + `role_id` bigint unsigned NOT NULL, + PRIMARY KEY (`permission_id`,`role_id`), + KEY `role_has_permissions_role_id_foreign` (`role_id`), + CONSTRAINT `role_has_permissions_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE, + CONSTRAINT `role_has_permissions_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `roles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `roles` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `guard_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `roles_name_guard_name_unique` (`name`,`guard_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `sessions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sessions` ( + `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `ip_address` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `user_agent` text COLLATE utf8mb4_unicode_ci, + `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `last_activity` int NOT NULL, + PRIMARY KEY (`id`), + KEY `sessions_user_id_index` (`user_id`), + KEY `sessions_last_activity_index` (`last_activity`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `settings`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `settings` ( + `key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `value` text COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `subscriptions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `subscriptions` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `user_id` bigint unsigned NOT NULL, + `membership_plan_id` bigint unsigned DEFAULT NULL, + `status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'active', + `starts_at` timestamp NULL DEFAULT NULL, + `ends_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `subscriptions_membership_plan_id_foreign` (`membership_plan_id`), + KEY `subscriptions_user_id_status_index` (`user_id`,`status`), + CONSTRAINT `subscriptions_membership_plan_id_foreign` FOREIGN KEY (`membership_plan_id`) REFERENCES `membership_plans` (`id`) ON DELETE SET NULL, + CONSTRAINT `subscriptions_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `taggables`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `taggables` ( + `tag_id` bigint unsigned NOT NULL, + `taggable_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `taggable_id` bigint unsigned NOT NULL, + UNIQUE KEY `taggables_tag_id_taggable_id_taggable_type_unique` (`tag_id`,`taggable_id`,`taggable_type`), + KEY `taggables_taggable_type_taggable_id_index` (`taggable_type`,`taggable_id`), + CONSTRAINT `taggables_tag_id_foreign` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `tags`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tags` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` json NOT NULL, + `slug` json NOT NULL, + `type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `order_column` int DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `users` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `email_verified_at` timestamp NULL DEFAULT NULL, + `password` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `legacy_md5` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `logincount` int unsigned NOT NULL DEFAULT '0', + `loginip` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `regip` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `logintime` timestamp NULL DEFAULT NULL, + `lastpost_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `users_email_unique` (`email`), + KEY `users_legacy_md5_index` (`legacy_md5`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (1,'0001_01_01_000000_create_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (2,'0001_01_01_000001_create_cache_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (3,'0001_01_01_000002_create_jobs_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (4,'2026_08_11_092446_create_permission_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (5,'2026_08_11_092448_create_media_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (6,'2026_08_11_092449_create_tag_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (7,'2026_08_11_100000_create_membership_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (8,'2026_08_11_100000_create_payments_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (9,'2026_08_11_100001_create_categories_and_posts_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (10,'2026_08_11_100002_create_comments_and_trackbacks_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (11,'2026_08_11_100003_create_links_and_settings_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (12,'2026_08_11_100004_add_blog_columns_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (13,'2026_08_11_100005_add_content_format_to_posts_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (14,'2026_08_11_113537_create_personal_access_tokens_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (15,'2026_08_12_000000_create_hello_world_logs_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (16,'2026_08_12_100000_add_payable_to_payments_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (17,'2026_08_12_200000_create_market_packages_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (18,'2026_08_12_300000_add_description_to_categories_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (19,'2026_08_12_400000_create_redirects_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (20,'2026_08_15_000001_create_media_library_table',2); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (21,'2026_08_15_000002_create_media_folders_table',2); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (22,'2026_08_15_000003_add_soft_deletes_to_media_library_table',2); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (23,'2026_08_15_000004_add_custom_properties_to_media_library_table',2); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (24,'2026_09_16_000001_add_cover_media_id_to_posts_and_categories',2); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (25,'2026_09_16_000002_seed_default_media_folders',2); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (26,'2026_09_18_210000_add_sticky_level_to_posts_table',3); diff --git a/docs/development.md b/docs/development.md index 3a18d73..ec1614c 100644 --- a/docs/development.md +++ b/docs/development.md @@ -77,6 +77,7 @@ routes/web.php # 前台规范路由;routes/legacy.php 老 URL 301(新增 ## 8. 后台导航约定 - 顶栏 **网站** 打开前台新窗口,**写文章** 进新建文章 +- 前台登录后,管理员/编辑导航里有 **管理**,新窗口打开 `/admin`。会员不要显示这条链接 - **管理 → 页面缓存**:查看/清理前台整页缓存,不要只藏在用户菜单里 - **管理 → 语言**:只展示当前 `APP_LOCALE` 和已有语言包。文章还没有多语言版本,不要假装已经做了 - 文章置顶用 `sticky_level`(0/1/2/3),列表排序 `orderedForList()`。3 = 置顶头条,永远最前 diff --git a/resources/views/partials/admin-link.blade.php b/resources/views/partials/admin-link.blade.php new file mode 100644 index 0000000..a26bea9 --- /dev/null +++ b/resources/views/partials/admin-link.blade.php @@ -0,0 +1,9 @@ +@auth + @if(auth()->user()->canAccessAdmin()) + @if(! empty($asList)) +
  • 管理
  • + @else + 管理 + @endif + @endif +@endauth diff --git a/resources/views/partials/header.blade.php b/resources/views/partials/header.blade.php index d9a6ca0..25d24f6 100644 --- a/resources/views/partials/header.blade.php +++ b/resources/views/partials/header.blade.php @@ -18,6 +18,7 @@ @auth {{ auth()->user()->name }} + @include('partials.admin-link')
    @csrf diff --git a/resources/views/profile.blade.php b/resources/views/profile.blade.php index a05d7d6..556f13f 100644 --- a/resources/views/profile.blade.php +++ b/resources/views/profile.blade.php @@ -14,6 +14,9 @@

    角色:{{ $user->getRoleNames()->implode(', ') ?: '会员' }}

    我的文章:{{ $user->posts()->count() }} 篇

    我的评论:{{ $user->comments()->count() }} 条

    + @if($user->canAccessAdmin()) +

    进入后台管理

    + @endif

    « 返回首页

    diff --git a/tests/Feature/AuthFlowTest.php b/tests/Feature/AuthFlowTest.php index 39d493f..d37adba 100644 --- a/tests/Feature/AuthFlowTest.php +++ b/tests/Feature/AuthFlowTest.php @@ -48,6 +48,33 @@ class AuthFlowTest extends TestCase $this->assertGuest(); } + public function test_admin_sees_backend_link_in_new_tab(): void + { + $admin = User::where('email', 'admin@laralog.test')->first(); + + $this->actingAs($admin)->get('/') + ->assertOk() + ->assertSee('管理', false) + ->assertSee('target="_blank"', false) + ->assertSee('/admin', false); + + $this->actingAs($admin)->get('/profile.shtml') + ->assertOk() + ->assertSee('进入后台管理', false); + } + + public function test_member_and_guest_do_not_see_backend_link(): void + { + $this->get('/')->assertOk()->assertDontSee('>管理', false); + + $member = User::create(['name' => '会员', 'email' => 'member@test.com', 'password' => bcrypt('x')]); + $member->assignRole('member'); + + $this->actingAs($member)->get('/') + ->assertOk() + ->assertDontSee('>管理', false); + } + public function test_front_pages_use_shtml_links(): void { $user = User::create(['name' => '作者', 'email' => 'w@t.com', 'password' => bcrypt('x')]); diff --git a/themes/demo/views/partials/header.blade.php b/themes/demo/views/partials/header.blade.php index 9611cfb..f7aeb8d 100644 --- a/themes/demo/views/partials/header.blade.php +++ b/themes/demo/views/partials/header.blade.php @@ -12,6 +12,7 @@
    @auth {{ auth()->user()->name }} + @include('partials.admin-link')
    @csrf diff --git a/themes/modern/views/partials/header.blade.php b/themes/modern/views/partials/header.blade.php index 4850690..45c403f 100644 --- a/themes/modern/views/partials/header.blade.php +++ b/themes/modern/views/partials/header.blade.php @@ -12,6 +12,7 @@
    @auth {{ auth()->user()->name }} + @include('partials.admin-link')
    @csrf diff --git a/themes/sablog/views/partials/header.blade.php b/themes/sablog/views/partials/header.blade.php index e492cc8..0db232f 100644 --- a/themes/sablog/views/partials/header.blade.php +++ b/themes/sablog/views/partials/header.blade.php @@ -15,6 +15,7 @@ @include('partials.feed-links', ['asList' => true]) @auth
  • {{ auth()->user()->name }}
  • + @include('partials.admin-link', ['asList' => true])
  • @csrf