From 007eb4d0a599b7e7fa04804b060e7c718f6dfa89 Mon Sep 17 00:00:00 2001 From: douboer Date: Wed, 15 Oct 2025 17:28:11 +0800 Subject: [PATCH] update at 2025-10-15 17:28:11 --- rel.sh | 6 +++++- release.md | 52 ++++++++++++++++++++++++++-------------------------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/rel.sh b/rel.sh index 4212838..3219de4 100755 --- a/rel.sh +++ b/rel.sh @@ -49,6 +49,10 @@ fi VERSION=$(grep "^## v" release.md | tail -n 1 | sed 's/^## //') TAG_MESSAGE=$(awk "/^## $VERSION/{flag=1;next}/^## v/{flag=0}flag" release.md) +# 过滤掉 emoji(4 字节 unicode,范围 U+10000 - U+10FFFF),避免 utf8mb4 字符导致服务器侧 collation 问题 +# 仅在发送到 Gitea 时使用过滤后的内容,保留原始 TAG_MESSAGE 用于本地 tag 注释 +RELEASE_BODY=$(printf '%s' "$TAG_MESSAGE" | perl -CSD -0777 -pe 's/[\x{10000}-\x{10FFFF}]//g') + if [ -z "$VERSION" ]; then echo "❌ release.md 中未找到版本号" exit 1 @@ -126,7 +130,7 @@ if [ "$check_http_code" -eq 200 ]; then fi # 使用 jq 生成正确的 JSON -JSON_PAYLOAD=$(echo "$TAG_MESSAGE" | jq -R -s -c --arg version "$VERSION" '{ +JSON_PAYLOAD=$(echo "$RELEASE_BODY" | jq -R -s -c --arg version "$VERSION" '{ tag_name: $version, name: $version, body: ., diff --git a/release.md b/release.md index b626e1b..c217fed 100644 --- a/release.md +++ b/release.md @@ -320,31 +320,31 @@ npm run dev 发布时间: 2025-10-15 -### 🎯 重大功能:停止生成 & UI 优化 +### 重大功能:停止生成 & UI 优化 本版本实现了完整的停止生成功能,参考 Cherry Studio 的 PAUSED 状态设计,提供更好的用户体验。 -#### ✨ 核心功能 +#### 核心功能 -**⏸️ 智能停止生成** +**智能停止生成** - 点击停止按钮立即中断 AI 回复(响应时间 < 100ms) - 保留已生成的内容,标记为"已停止"状态 - 区分用户主动停止和系统错误 - 停止后可立即继续对话 -**🎨 UI 体验优化** +**UI 体验优化** - 按钮文字从"确认"改为"发送" - 停止后显示黄色"已停止"标签(而非红色"发送失败") - 停止的消息可以复制、重新生成、删除 - 实时状态反馈(发送中 → 已停止 → 可操作) -**🔄 状态管理增强** +**状态管理增强** - 新增 `paused` 消息状态 - 新增 `paused` 流式事件类型 - 完整的 AbortController 信号传递链 - 流读取循环实时检查中止信号 -#### 🛠️ 技术实现 +#### 技术实现 **按钮事件修复** - 修复点击事件绑定问题(从三元表达式改为函数调用) @@ -378,9 +378,9 @@ UI (点击停止) **流读取中止检查** ```typescript while (true) { - // ⚠️ 关键:每次读取前检查中止信号 + // 关键:每次读取前检查中止信号 if (signal?.aborted) { - console.log('🛑 检测到中止信号,停止读取流') + console.log('检测到中止信号,停止读取流') reader.cancel() throw new DOMException('用户中止操作', 'AbortError') } @@ -403,7 +403,7 @@ catch (error) { assistantMessage.error = undefined onChunk({ type: 'paused', messageId: assistantMessage.id }) - // ✅ 关键:更新消息列表,触发 UI 刷新 + // 关键:更新消息列表,触发 UI 刷新 state.messages = [...chatService.getMessages(currentTopicId)] } else { // 真实错误 - 标记为 error @@ -413,15 +413,15 @@ catch (error) { } ``` -#### 🐛 Bug 修复 +#### Bug 修复 -- ✅ 修复按钮点击无响应问题(事件绑定错误) -- ✅ 修复停止后仍显示"发送中..."状态 -- ✅ 修复停止后消息列表不更新 -- ✅ 修复 AbortError 被错误标记为失败 -- ✅ 修复按钮文字显示"确认"而非"发送" +- 修复按钮点击无响应问题(事件绑定错误) +- 修复停止后仍显示"发送中..."状态 +- 修复停止后消息列表不更新 +- 修复 AbortError 被错误标记为失败 +- 修复按钮文字显示"确认"而非"发送" -#### 🔧 修改的文件 +#### 修改的文件 **类型定义** - `/web/src/types/chat.ts` @@ -450,7 +450,7 @@ catch (error) { - 在 catch 块中更新消息列表 - 确保 UI 显示最新状态 -#### 💡 使用示例 +#### 使用示例 ``` 1. 用户发送:"请详细介绍 Vue 3 的新特性" @@ -468,7 +468,7 @@ catch (error) { - 继续发送新消息 ``` -#### 🎯 设计亮点 +#### 设计亮点 1. **参考 Cherry Studio** - 借鉴成熟产品的设计理念 2. **立即响应** - 停止操作 < 100ms 响应 @@ -477,15 +477,15 @@ catch (error) { 5. **完整操作** - 停止的消息仍可进行各种操作 6. **信号传递** - 完整的中止信号链,确保可靠性 -#### 📊 用户体验对比 +#### 用户体验对比 -**修复前 ❌** +**修复前** - 点击停止无反应 - 继续显示"发送中..." - 显示 loading 动画 - 按钮文字为"确认" -**修复后 ✅** +**修复后** - 点击立即停止 - 显示"已停止"(黄色) - 隐藏 loading 动画 @@ -493,7 +493,7 @@ catch (error) { - 可以操作停止的消息 - 立即可继续对话 -#### 📚 相关文档 +#### 相关文档 - `STOP_GENERATION_SUMMARY.md` - 修复总结 - `STOP_GENERATION_FIX.md` - 详细技术文档 @@ -501,7 +501,7 @@ catch (error) { - `STOP_GENERATION_TEST.md` - 测试指南 - `STOP_GENERATION_VERIFY.md` - 快速验证清单 -#### 🚀 升级指南 +#### 升级指南 ```bash # 拉取最新代码 @@ -520,7 +520,7 @@ npm run dev # 4. 验证可以继续对话 ``` -#### ✅ 验收标准 +#### 验收标准 - [x] 按钮点击有明显反应 - [x] 流输出在 100ms 内停止 @@ -530,7 +530,7 @@ npm run dev - [x] 可对停止的消息进行操作 - [x] 无意外错误日志 -#### 🔜 下一步计划 +#### 下一步计划 - 停止后自动保存草稿 - 停止历史记录统计 @@ -538,5 +538,5 @@ npm run dev - 停止原因记录(用户主动/超时/错误) - 性能监控和优化 -**v1.0.3 - 完美的停止体验,让对话更可控!** 🎉⏸️ +**v1.0.3 - 完美的停止体验,让对话更可控!**