用户反馈「班级变成数字框了」的直接原因:选项加载失败(模块会话未建立时
接口回 302)后 widgetOf 把下拉降级成了数字输入框 —— 用户不可能知道
「一年级(2)班」的内部编号是 7,等于把表单搞坏。
- widgetOf 恒返回后端下发的控件形态,取不到选项时保留下拉 + 显示「重新加载」
- 请假表单对齐 HomeLeave 模块页:
* 请假类型 = 单选按钮组 + 默认选中第一项(radio / autoPickFirst)
* 请假时间 = 起止 datetime + 快捷时段(全天/上午/下午)+ 连续请假勾选框
+ 连续天数 + 逐天可微调时段(switch / quickPeriods / dailyExpand)
* 事由 placeholder「请输入请假原因.....」、附件提示「可选,大小不超过 200MB」
* 单选组 / 勾选框 / 多行文本 / 附件 / 审批流独占整行,避免挤在半列走形
- 会话预热:上限 6s→12s,且失败后总是重试两次(原「到点即弃且不重试」是
「时不时出不来」的来源之一);callModuleApi 支持 forceWarm 供「重新加载」绕过 60s 限流
- alova 的 timeout 原先被写进 headers(fetch 不认),改为真正的客户端超时
- 处理中的转圈常驻并显示已等待秒数,不再因为气泡已有文案就静默
This commit is contained in:
@@ -8,7 +8,7 @@ import ToolTraceCard from "./ToolTraceCard.vue";
|
||||
import FormCard from "./FormCard.vue";
|
||||
import type { ChatItem } from "@/types/agent";
|
||||
|
||||
const props = defineProps<{ item: ChatItem; pending?: boolean }>();
|
||||
const props = defineProps<{ item: ChatItem; pending?: boolean; elapsed?: number }>();
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: "form-submit", payload: { item: ChatItem; form: { tool: string; args: Record<string, any> } }): void;
|
||||
@@ -41,17 +41,23 @@ function paragraphs(text: string): string[] {
|
||||
<span v-if="item.role === 'assistant'" class="msg__name">校园智能助手</span>
|
||||
|
||||
<div class="msg__stack">
|
||||
<!-- 助手等待中:阶段提示 -->
|
||||
<div v-if="pending" class="msg__stage">
|
||||
<!-- 正文 -->
|
||||
<div v-if="item.text" class="msg__bubble">
|
||||
<p v-for="(p, i) in paragraphs(item.text)" :key="i">{{ p }}</p>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
处理中:**始终**显示(哪怕气泡里已经有「正在通过你的浏览器执行…」这类文案)。
|
||||
历史缺陷:原来只在气泡无文案时才显示,于是服务端一下发 notice 文案,
|
||||
转圈提示就消失了 —— 后续若再等十几秒,界面看着就是「卡死没下文」。
|
||||
这里补上已等待秒数,让用户确知后台还在跑。
|
||||
-->
|
||||
<div v-if="pending" class="msg__stage" :class="{ 'msg__stage--compact': !!item.text }">
|
||||
<span class="dot" />
|
||||
<span class="dot" />
|
||||
<span class="dot" />
|
||||
<span class="msg__stage-text">{{ item.stage || "思考中…" }}</span>
|
||||
</div>
|
||||
|
||||
<!-- 正文 -->
|
||||
<div v-if="item.text" class="msg__bubble">
|
||||
<p v-for="(p, i) in paragraphs(item.text)" :key="i">{{ p }}</p>
|
||||
<span v-if="elapsed >= 3" class="msg__stage-elapsed">已等待 {{ Math.floor(elapsed) }}s</span>
|
||||
</div>
|
||||
|
||||
<!-- 工具轨迹 -->
|
||||
@@ -200,6 +206,23 @@ function paragraphs(text: string): string[] {
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
/* 气泡已有文案时的紧凑版:更淡、更小,一行挂在气泡下方,只做「还在跑」的提示 */
|
||||
.msg__stage--compact {
|
||||
margin-top: 8px;
|
||||
padding: 7px 12px;
|
||||
font-size: 12.5px;
|
||||
background: transparent;
|
||||
border-style: dashed;
|
||||
}
|
||||
|
||||
.msg__stage-elapsed {
|
||||
margin-left: 6px;
|
||||
padding-left: 8px;
|
||||
border-left: 1px solid var(--agent-border-strong);
|
||||
color: var(--agent-text-mute);
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
|
||||
.dot {
|
||||
width: 5px;
|
||||
height: 5px;
|
||||
|
||||
Reference in New Issue
Block a user