feat(channels): 流控可配 —— 陌生人私聊额度走账号配置 directMsgPerMin(裁决 13)
CI / Backend (build / vet / test / cross-compile) (push) Has been cancelled
CI / Frontend (tsc + vite build) (push) Has been cancelled

- 后端:账号顶层 directMsgPerMin(缺失/0 = 保护性默认 6 条/分;正值 = 该值;负值 = 关闭并留带 source 的 WARN)
- 日志如实报出**实际生效**额度(adapter.(*FlowGate).DirectPerMin()),告警文案不再写死 6
- 面板:渠道配置表单加字段(含帮助文案)+ 回显/写回链路(LIMIT_KEYS 四键)+ 账号卡片摘要
- 文案纠错:AdapterConfigSummary 的 msgPerMin 由「私聊每分钟上限」改为「非主人消息每分钟总上限」(原描述是误导),并列补 directMsgPerMin 行
- 变异实测:缺键丢默认 / 负值当 1 条每分 / 前端吞负值 —— 三个都精确打红并还原
- ⚠️ 已知缺口(下一片补,gateway 面):GET/PUT /admin/channels 尚未下发/解码该键 ⇒ 面板暂时回显空、保存会把 -1 重置为 0
This commit is contained in:
AskaEth committed 2026-10-05 13:50:29 +08:00
1 parent ba17820040
commit a057a0f61f
18 files changed
+339 -70

No files matched your search

@@ -17,13 +17,21 @@ function commonConnectionKeys(platform: string): string[] {
}
/** 限流 / 会话额度**不在 config 里**:后端把它们作为账号顶层字段下发
* (`AdminChannelAccount.GroupMsgPerMin/MsgPerMin/MaxMessages`,见
* (`AdminChannelAccount.GroupMsgPerMin/MsgPerMin/MaxMessages/DirectMsgPerMin`,见
* `internal/services/gateway/admin_write_channel_config.go`),且 `omitempty`
* ⇒ 缺省 / 0 就是「不限」。读错来源会让面板把已设的限额显示成未设置。 */
function fmtLimit(value?: number): string {
return value === undefined || value === null || value === 0 ? "未设置(不限)" : String(value);
}
/** `directMsgPerMin` 的展示:它的 0 **不是**「不限」而是「保护性默认 6 条/分」
* (缺省绝不等于关掉陌生人私聊流控),负值才是主人显式关闭 —— 与其它三项的文案不同,
* 所以单独一个格式化器,免得把「未设置」误读成「敞口」。 */
function fmtDirectLimit(value?: number): string {
if (value === undefined || value === null || value === 0) return "未设置(保护性默认 6 条/分)";
return value < 0 ? `${value}(已关闭流控)` : String(value);
}
/** 只读展示用的值格式化:空值明确写成「未设置」,对象/数组走 JSON 串,其余原样。
* 绝不在这里造值——后端给什么显示什么(后端已对 token 类键做掩码)。 */
function fmtValue(value: unknown): string {
@@ -68,8 +76,11 @@ function connectionFields(platform: string, account: AdminChannelAccount): Field
function businessFields(account: AdminChannelAccount): Field[] {
return [
{ label: "personaId(绑定角色)", value: account.personaId?.trim() ? account.personaId : "跟随默认角色" },
{ label: "msgPerMin(私聊每分钟上限)", value: fmtLimit(account.msgPerMin) },
// msgPerMin 是**账号级非主人消息总量上限**,不是私聊上限 —— 旧文案写成「私聊每分钟
// 上限」会让主人以为它管的是陌生人私聊(真正管私聊的是下面那行 directMsgPerMin)。
{ label: "msgPerMin(非主人消息每分钟总上限)", value: fmtLimit(account.msgPerMin) },
{ label: "groupMsgPerMin(群每分钟上限)", value: fmtLimit(account.groupMsgPerMin) },
{ label: "directMsgPerMin(陌生人对私聊每分钟上限)", value: fmtDirectLimit(account.directMsgPerMin) },
{ label: "maxMessages(会话消息窗口)", value: fmtLimit(account.maxMessages) },
{ label: "allowGroups(群白名单)", value: fmtList(account.allowGroups) },
{ label: "denyGroups(群黑名单)", value: fmtList(account.denyGroups) },