fix(web): code review pass — scroll watch, SSE same-origin, store concurrency, modal reset, admin validation

This commit is contained in:
2026-05-04 20:58:48 +08:00
parent ff283013da
commit b8d29d8ea7
11 changed files with 145 additions and 85 deletions
+16 -1
View File
@@ -150,8 +150,23 @@ onMounted(async () => {
}
})
// 路由 conversationId 切换:在 /chat ↔ /chat/:id 同组件复用时同步状态。
watch(
() => chat.messages.length,
() => route.params.conversationId,
async (cid) => {
if (typeof cid === 'string' && cid !== '') {
if (chat.currentConversation?.id !== cid) {
await chat.openConversation(cid)
}
} else {
chat.closeCurrent()
}
},
)
// 流式输出时 messages.length 不变,只 content 增长 —— 同时观察末消息内容长度。
watch(
() => [chat.messages.length, chat.messages.at(-1)?.content?.length ?? 0],
() => {
nextTick(() => {
const el = scrollEl.value
@@ -116,6 +116,25 @@ watch(
{ immediate: true },
)
// 每次从外部重新打开时把表单还原到初始状态。
watch(
() => props.show,
(open) => {
if (open) reset()
},
)
function reset() {
form.value = { model_id: '', template_id: null, system_prompt: '' }
if (props.projectId) {
mountKind.value = 'project'
mountID.value = props.projectId
} else {
mountKind.value = null
mountID.value = ''
}
}
function update(v: boolean) {
emit('update:show', v)
}
@@ -57,6 +57,11 @@ async function upload(opts: UploadCustomRequestOptions) {
opts.onError()
return
}
if (f.type.startsWith('audio/') && !props.modelCapabilities?.audio) {
msg.error('当前模型不支持音频')
opts.onError()
return
}
if (f.size > 20 * 1024 * 1024) {
msg.error('单文件不能超过 20 MB')
opts.onError()