重构猜谜活动并统一聊天室答题通知

This commit is contained in:
pllx
2026-04-29 13:35:20 +08:00
parent 192259f0a4
commit fe3e74b5f8
34 changed files with 3369 additions and 1833 deletions
@@ -0,0 +1,73 @@
<?php
/**
* 文件功能:将猜成语数据结构升级为猜谜活动通用结构
*
* 为题库增加题型字段,为回合增加 quiz_type 与复合索引,
* 兼容既有“猜成语”数据并为脑筋急转弯题型预留能力。
*/
use App\Models\Riddle;
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
{
/**
* 方法功能:执行表结构升级并补齐历史数据默认值。
*/
public function up(): void
{
Schema::table('idioms', function (Blueprint $table): void {
if (! Schema::hasColumn('idioms', 'type')) {
$table->string('type', 30)->default(Riddle::TYPE_IDIOM)->after('id')->comment('题型:idiom/brain_teaser');
}
});
// 历史成语题默认归类到 idiom,保证旧数据无需人工修复。
DB::table('idioms')
->whereNull('type')
->orWhere('type', '')
->update(['type' => Riddle::TYPE_IDIOM]);
Schema::table('idiom_game_rounds', function (Blueprint $table): void {
if (! Schema::hasColumn('idiom_game_rounds', 'quiz_type')) {
$table->string('quiz_type', 30)->default(Riddle::TYPE_IDIOM)->after('idiom_id')->comment('回合题型:idiom/brain_teaser');
}
});
// 历史回合默认按成语题处理,确保旧记录仍可正常展示与过期结算。
DB::table('idiom_game_rounds')
->whereNull('quiz_type')
->orWhere('quiz_type', '')
->update(['quiz_type' => Riddle::TYPE_IDIOM]);
Schema::table('idioms', function (Blueprint $table): void {
$table->index(['type', 'is_active'], 'idioms_type_is_active_index');
});
Schema::table('idiom_game_rounds', function (Blueprint $table): void {
$table->index(['room_id', 'quiz_type', 'status'], 'idiom_rounds_room_type_status_index');
$table->index(['room_id', 'quiz_type', 'id'], 'idiom_rounds_room_type_id_index');
});
}
/**
* 方法功能:回滚猜谜活动通用结构升级。
*/
public function down(): void
{
Schema::table('idiom_game_rounds', function (Blueprint $table): void {
$table->dropIndex('idiom_rounds_room_type_status_index');
$table->dropIndex('idiom_rounds_room_type_id_index');
$table->dropColumn('quiz_type');
});
Schema::table('idioms', function (Blueprint $table): void {
$table->dropIndex('idioms_type_is_active_index');
$table->dropColumn('type');
});
}
};
@@ -1,9 +1,9 @@
<?php
/**
* 文件功能:猜成语题库填充器
* 文件功能:猜谜活动题库填充器
*
* 初始化游戏配置成语题库数据。
* 初始化猜谜活动配置成语题库与脑筋急转弯题库数据。
* 使用 updateOrCreate 确保重复执行不影响已有数据。
*
* @author ChatRoom Laravel
@@ -14,29 +14,52 @@
namespace Database\Seeders;
use App\Models\GameConfig;
use App\Models\Idiom;
use App\Models\Riddle;
use Illuminate\Database\Seeder;
class IdiomSeeder extends Seeder
/**
* 类功能:初始化猜谜活动配置、成语题库与脑筋急转弯题库。
*/
class RiddleSeeder extends Seeder
{
/**
* 填充猜成语游戏配置题库。
* 填充猜谜活动配置题库。
*/
public function run(): void
{
// ── 游戏配置(已存在则跳过 ──
// ── 游戏配置(已存在则更新为统一猜谜活动结构 ──
GameConfig::updateOrCreate(
['game_key' => 'idiom'],
[
'name' => '猜成语',
'name' => '猜谜活动',
'icon' => '🧩',
'description' => '管理员手动出题或系统定时自动出题,用户抢答成语,第一个答对的获得金币和经验奖励。',
'description' => '管理员手动出题或系统定时自动出题,支持成语题与脑筋急转弯题,第一个答对的用户获得金币和经验奖励。',
'enabled' => false,
'params' => [
'reward_gold' => 50,
'reward_exp' => 30,
'auto_start_interval' => 0,
'expire_minutes' => 5,
'room_scope_mode' => 'single',
'room_ids' => [1],
'type_configs' => [
Riddle::TYPE_IDIOM => [
'reward_gold' => 50,
'reward_exp' => 30,
'auto_start_interval' => 0,
'expire_minutes' => 5,
'room_mode' => 'single',
'room_ids' => [1],
],
Riddle::TYPE_BRAIN_TEASER => [
'reward_gold' => 50,
'reward_exp' => 30,
'auto_start_interval' => 0,
'expire_minutes' => 5,
'room_mode' => 'single',
'room_ids' => [1],
],
],
],
],
);
@@ -147,13 +170,134 @@ class IdiomSeeder extends Seeder
['answer' => '愚公移山', 'hint' => '🧩 九十岁老头发誓要搬走门口的两座大山,子子孙孙无穷匮也。猜一成语'],
];
foreach ($idioms as $idiom) {
Idiom::updateOrCreate(
['answer' => $idiom['answer']],
foreach ($idioms as $index => $idiom) {
Riddle::updateOrCreate(
[
'type' => Riddle::TYPE_IDIOM,
'answer' => $idiom['answer'],
],
[
'hint' => $idiom['hint'],
'is_active' => true,
'sort' => 0,
'sort' => $index + 1,
],
);
}
// 新增脑筋急转弯题库,供猜谜活动切换题型时直接使用。
$brainTeasers = [
['answer' => '影子', 'hint' => '🧠 天天跟着你走,白天有晚上无,看得见摸不着,是什么?'],
['answer' => '回声', 'hint' => '🧠 你喊它也喊,你停它就停,山谷里最常见,是什么?'],
['answer' => '镜子', 'hint' => '🧠 你哭它也哭,你笑它也笑,但它永远不会先动,是什么?'],
['answer' => '口罩', 'hint' => '🧠 戴在脸上不是面具,遮住口鼻保健康,是什么?'],
['answer' => '手套', 'hint' => '🧠 五个小兄弟住两套房,冬天最爱穿,是什么?'],
['answer' => '袜子', 'hint' => '🧠 一对好朋友,天天躲鞋里,是什么?'],
['answer' => '鞋带', 'hint' => '🧠 两条细长蛇,天天趴鞋上,不打结鞋就跑,是什么?'],
['answer' => '雨伞', 'hint' => '🧠 下雨天开花,晴天就收起,是什么?'],
['answer' => '帽子', 'hint' => '🧠 不长头发却总爱站在头顶,是什么?'],
['answer' => '围巾', 'hint' => '🧠 冬天挂脖子,既不是项链也不是绳子,是什么?'],
['answer' => '口红', 'hint' => '🧠 不是彩笔,却常在嘴上画颜色,是什么?'],
['answer' => '牙刷', 'hint' => '🧠 头上长毛,天天进嘴里干活,是什么?'],
['answer' => '牙膏', 'hint' => '🧠 白白一条小胖虫,挤出来给牙刷帮忙,是什么?'],
['answer' => '肥皂', 'hint' => '🧠 越洗越瘦,越搓泡泡越多,是什么?'],
['answer' => '毛巾', 'hint' => '🧠 洗完脸后最爱找它抱一抱,是什么?'],
['answer' => '梳子', 'hint' => '🧠 一排小牙齿,不吃饭,只理头发,是什么?'],
['answer' => '吹风机', 'hint' => '🧠 会吹热风的小机器,洗完头总请它帮忙,是什么?'],
['answer' => '指甲刀', 'hint' => '🧠 身子很小嘴巴很硬,专门啃手指头,是什么?'],
['answer' => '钥匙', 'hint' => '🧠 个子不大本事大,能把锁头嘴巴打开,是什么?'],
['answer' => '锁', 'hint' => '🧠 一张铁嘴不吃饭,钥匙一来才张口,是什么?'],
['answer' => '门铃', 'hint' => '🧠 客人到门口,不敲门先叫唤,是什么?'],
['answer' => '电梯', 'hint' => '🧠 关上门就上下跑,不是汽车不上路,是什么?'],
['answer' => '楼梯', 'hint' => '🧠 一节一节往上走,不会动却能送人上楼,是什么?'],
['answer' => '窗户', 'hint' => '🧠 墙上开个洞,白天爱看风景,晚上爱看月亮,是什么?'],
['answer' => '窗帘', 'hint' => '🧠 白天拉开,晚上关上,帮房间遮眼睛,是什么?'],
['answer' => '镜框', 'hint' => '🧠 不会照人,却总抱着照片或镜子,是什么?'],
['answer' => '桌子', 'hint' => '🧠 四条腿不会走,肚皮平平能放东西,是什么?'],
['answer' => '椅子', 'hint' => '🧠 有脚不走路,专门让人坐,是什么?'],
['answer' => '沙发', 'hint' => '🧠 胖胖软软客厅王,大家累了都爱躺,是什么?'],
['answer' => '床', 'hint' => '🧠 白天安安静静,晚上最忙,是什么?'],
['answer' => '枕头', 'hint' => '🧠 软绵绵的小山包,睡觉时总垫在头下,是什么?'],
['answer' => '被子', 'hint' => '🧠 白天叠成豆腐块,晚上张开抱住你,是什么?'],
['answer' => '闹钟', 'hint' => '🧠 不会说早安,却总把你从梦里拽出来,是什么?'],
['answer' => '日历', 'hint' => '🧠 每过一天就瘦一张,是什么?'],
['answer' => '时钟', 'hint' => '🧠 三根兄弟赛跑,一圈一圈不停歇,是什么?'],
['answer' => '手机', 'hint' => '🧠 不长嘴巴却能说话,不长耳朵却能听见,是什么?'],
['answer' => '电话', 'hint' => '🧠 两地相隔很远,也能贴耳说悄悄话,是什么?'],
['answer' => '电视', 'hint' => '🧠 小小方盒子,里面天天演大戏,是什么?'],
['answer' => '遥控器', 'hint' => '🧠 不用走过去,按按它就能让电视听话,是什么?'],
['answer' => '电脑', 'hint' => '🧠 肚子里装知识,手指一敲就干活,是什么?'],
['answer' => '键盘', 'hint' => '🧠 一排排小方块,不是钢琴也能打字,是什么?'],
['answer' => '鼠标', 'hint' => '🧠 名字像老鼠,却最怕猫,天天趴桌上,是什么?'],
['answer' => '耳机', 'hint' => '🧠 一左一右挂耳边,音乐只给你一个人听,是什么?'],
['answer' => '音箱', 'hint' => '🧠 肚里藏着喇叭,最会放大声音,是什么?'],
['answer' => '充电器', 'hint' => '🧠 手机饿了它喂饭,是什么?'],
['answer' => '电池', 'hint' => '🧠 个子小,电量大,很多机器靠它活,是什么?'],
['answer' => '电灯', 'hint' => '🧠 太阳下班它上岗,是什么?'],
['answer' => '灯泡', 'hint' => '🧠 玻璃肚里藏火苗,黑夜一亮像白天,是什么?'],
['answer' => '蜡烛', 'hint' => '🧠 有泪不会哭,有火不会叫,越烧越短,是什么?'],
['answer' => '火柴', 'hint' => '🧠 头戴红帽子,脾气特别火,一擦就冒火星,是什么?'],
['answer' => '打火机', 'hint' => '🧠 小盒子脾气爆,拇指一按就出火,是什么?'],
['answer' => '冰箱', 'hint' => '🧠 肚子大又冷,专门帮食物避暑,是什么?'],
['answer' => '空调', 'hint' => '🧠 夏天送凉风,冬天送暖风,挂在墙上最勤快,是什么?'],
['answer' => '风扇', 'hint' => '🧠 没有翅膀也会转,专给人送风,是什么?'],
['answer' => '洗衣机', 'hint' => '🧠 不长手,却特别会洗衣服,是什么?'],
['answer' => '熨斗', 'hint' => '🧠 衣服皱巴巴,它一来就服服帖帖,是什么?'],
['answer' => '微波炉', 'hint' => '🧠 剩饭剩菜进去转几圈,就又热乎了,是什么?'],
['answer' => '电饭煲', 'hint' => '🧠 白米进去,香饭出来,是什么?'],
['answer' => '锅', 'hint' => '🧠 黑脸大肚子,天天在灶台上唱歌,是什么?'],
['answer' => '筷子', 'hint' => '🧠 两个瘦兄弟,合作夹饭菜,是什么?'],
['answer' => '勺子', 'hint' => '🧠 有个圆脑袋,喝汤最拿手,是什么?'],
['answer' => '碗', 'hint' => '🧠 圆圆小肚皮,最爱装米饭和汤,是什么?'],
['answer' => '盘子', 'hint' => '🧠 扁扁一张脸,端菜最稳,是什么?'],
['answer' => '杯子', 'hint' => '🧠 不会说话却总装水,是什么?'],
['answer' => '水壶', 'hint' => '🧠 肚子能装水,嘴巴细细长长,是什么?'],
['answer' => '吸管', 'hint' => '🧠 不用嘴碰杯,也能把饮料送进肚,是什么?'],
['answer' => '铅笔', 'hint' => '🧠 身子细细穿木衣,肚里黑黑会写字,是什么?'],
['answer' => '橡皮', 'hint' => '🧠 不会写字专会擦,哪里写错它就上,是什么?'],
['answer' => '尺子', 'hint' => '🧠 身子直直会量长短,还能帮人画直线,是什么?'],
['answer' => '书包', 'hint' => '🧠 不会走路却天天背着书上学,是什么?'],
['answer' => '课本', 'hint' => '🧠 不会说话却肚子里全是知识,是什么?'],
['answer' => '黑板', 'hint' => '🧠 一张大黑脸,粉笔天天在上面写字,是什么?'],
['answer' => '粉笔', 'hint' => '🧠 白白瘦瘦,最爱在黑板上留下痕迹,是什么?'],
['answer' => '粉笔擦', 'hint' => '🧠 不会写字却专门抹掉黑板上的字,是什么?'],
['answer' => '书签', 'hint' => '🧠 个子小小住书里,帮你记住看到哪一页,是什么?'],
['answer' => '放大镜', 'hint' => '🧠 小东西一到它眼前,立刻显得很大,是什么?'],
['answer' => '望远镜', 'hint' => '🧠 明明站在原地,却能看见很远的东西,是什么?'],
['answer' => '相机', 'hint' => '🧠 不会画画却能把风景留住,是什么?'],
['answer' => '照片', 'hint' => '🧠 不会动不会说,却能把昨天留下来,是什么?'],
['answer' => '地图', 'hint' => '🧠 不出门也能带你认识世界,是什么?'],
['answer' => '地球仪', 'hint' => '🧠 一个蓝色大圆球,抱着全世界,是什么?'],
['answer' => '篮球', 'hint' => '🧠 穿着橙色外衣,最爱往框里钻,是什么?'],
['answer' => '足球', 'hint' => '🧠 用脚最喜欢的圆朋友,是什么?'],
['answer' => '羽毛球', 'hint' => '🧠 头圆圆,尾巴白白,飞起来像小鸟,是什么?'],
['answer' => '乒乓球', 'hint' => '🧠 白白小圆豆,桌上跳来跳去,是什么?'],
['answer' => '跳绳', 'hint' => '🧠 一根长线会转圈,小朋友最爱跳过去,是什么?'],
['answer' => '秋千', 'hint' => '🧠 坐上去前后飞,却飞不离原地,是什么?'],
['answer' => '风筝', 'hint' => '🧠 长着尾巴在天上飞,线一松就跑,是什么?'],
['answer' => '气球', 'hint' => '🧠 胖胖肚子装着气,手一松就想上天,是什么?'],
['answer' => '雪人', 'hint' => '🧠 冬天站院里,太阳一晒就瘦,是什么?'],
['answer' => '彩虹', 'hint' => '🧠 雨过天晴天上挂着七色桥,是什么?'],
['answer' => '云', 'hint' => '🧠 白天像棉花,风一吹就变样,是什么?'],
['answer' => '雾', 'hint' => '🧠 没下雨却湿漉漉,早晨最爱挡路,是什么?'],
['answer' => '霜', 'hint' => '🧠 不是雪却白在草上,太阳一出就化,是什么?'],
['answer' => '露珠', 'hint' => '🧠 清晨叶子上挂着一颗颗小珍珠,是什么?'],
['answer' => '月亮', 'hint' => '🧠 白天看不清,晚上天上挂银盘,是什么?'],
['answer' => '星星', 'hint' => '🧠 白天藏起来,晚上眨眼睛,是什么?'],
['answer' => '太阳', 'hint' => '🧠 白天值班最勤快,大家都靠它发光发热,是什么?'],
['answer' => '雷', 'hint' => '🧠 看不见摸不着,却能在天上大声打鼓,是什么?'],
['answer' => '闪电', 'hint' => '🧠 先看到一道亮鞭子,再听见轰隆隆,是什么?'],
];
foreach ($brainTeasers as $index => $brainTeaser) {
Riddle::updateOrCreate(
[
'type' => Riddle::TYPE_BRAIN_TEASER,
'answer' => $brainTeaser['answer'],
],
[
'hint' => $brainTeaser['hint'],
'is_active' => true,
'sort' => 1000 + $index + 1,
],
);
}