feat(ai): AI助手聊天记录服务端持久化

- 图片缓存不再二次压缩,用户预览与AI收到的图片质量一致
- 新增 ai_assistant_sessions 表及 AiAssistantSession 模型
- 新增会话 API:session/list、session/save、session/delete
- 前端会话存储从 IndexedDB 切换为服务端 API,图片落盘到 uploads/assistant/{YYYYMM}/{user_id}/
- saveSessionStore 添加防抖,删除会话时同步清理内存缓存

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
kuaifan
2026-04-17 04:22:35 +00:00
co-authored by Claude Opus 4.6
parent 717e520556
commit 82d2ca6360
4 changed files with 286 additions and 68 deletions
@@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAiAssistantSessionsTable extends Migration
{
public function up()
{
if (Schema::hasTable('ai_assistant_sessions')) {
return;
}
Schema::create('ai_assistant_sessions', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('userid')->default(0)->comment('用户ID');
$table->string('session_key', 100)->default('')->comment('场景分类key');
$table->string('session_id', 100)->default('')->comment('前端生成的会话ID');
$table->string('scene_key', 200)->default('')->comment('具体场景标识');
$table->string('title', 255)->default('')->comment('会话标题');
$table->longText('data')->nullable()->comment('responses JSON');
$table->longText('images')->nullable()->comment('图片映射 {imageId: relativePath}');
$table->timestamps();
$table->index('userid', 'idx_userid');
$table->unique(['userid', 'session_key', 'session_id'], 'uk_user_session');
});
}
public function down()
{
Schema::dropIfExists('ai_assistant_sessions');
}
}