测试台改仪表台:启动输入换成一封信;卡片化触发器与大模型;清掉 ⓘ 说教条
**测试台**
· 启动输入不再是「调用参数」表 —— 这条流真实的起法就是客户来信,
界面上就该是一封信(发件人 / 收件人 / 主题 / 正文 / BOM 附件)。
服务端拿**真通道的抽键正则** + **真触发器的装配映射**推出调用入参:
测试台自己不解析邮件,否则试通的是测试台而不是这条流。
抽不出必填就如实报「哪个字段没命中、通道的正则要什么」,不静默起空单。
· 一屏两大块:左选流,右两节 —— 01 输入配置、02 节点指派。
· 起单钮只剩一枚(原来页头一枚、RUN 卡里一枚)。
· 改暗色仪表台:调色板集中在 .g-tb/.g-rig 的一组变量上,
TRACE 那张树 + 甘特的结构一行没动,只是纸变成了面板。
**触发器 / 大模型** 列表改卡片:一条规则、一个实例都要一眼看全
(何时起 · 起哪条流 · 开没开 / 谁家的 · 什么型号 · 密钥绑没绑)。
触发器卡是 div 不是 button —— 卡里还坐着「改规则」那枚真按钮。
**同类卡等高**:底栏钉在卡底、说明恒占两行、卡头一行截断。
实测同一货架内 13 张工具卡、6 张活动卡、3 张模型卡各自完全等高。
**删掉 19 条 ⓘ 说教横幅**(「只列有生效版的包…」那一类)。
留下的是三种:确认带里的影响说明(点了动作才出现,是决策依据)、
warn/ok 的真反馈、以及「X 不存在」这类空态。
删掉入站邮件演练整屏 —— 它验的那两步已经并进测试台的起单路径了。
新增一条接缝测试:通道抽出来的键叫 keys.customerCode,触发器映射也得照这名字取;
哪头改了名字单还是能起,只是入参悄悄变空、流走到 G1 才莫名其妙地停。
四闸绿;契约快照随本提交入库。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
@@ -247,16 +247,17 @@
|
||||
|
||||
/* ============ 货架:卡片墙 ============ */
|
||||
.g-shelf { display: grid; grid-template-columns: repeat(auto-fill, minmax(264px, 1fr)); gap: 12px; }
|
||||
.g-tile { display: flex; flex-direction: column; gap: 10px; padding: 14px 15px; background: var(--card); border: 1px solid var(--cline); border-radius: 13px; box-shadow: var(--cshadow); cursor: pointer; text-align: left; font: inherit; transition: box-shadow var(--t-fast), border-color var(--t-fast), transform var(--t-fast); }
|
||||
.g-tile { display: flex; flex-direction: column; gap: 10px; min-height: 158px; padding: 14px 15px; background: var(--card); border: 1px solid var(--cline); border-radius: 13px; box-shadow: var(--cshadow); cursor: pointer; text-align: left; font: inherit; transition: box-shadow var(--t-fast), border-color var(--t-fast), transform var(--t-fast); }
|
||||
.g-tile:hover { border-color: #c9d6e6; box-shadow: 0 5px 14px -5px rgba(19, 28, 38, .22); transform: translateY(-1px); }
|
||||
.g-tile-h { display: flex; align-items: center; gap: 9px; }
|
||||
.g-tile-i { flex: none; width: 32px; height: 32px; border-radius: 10px; display: grid; place-items: center; color: var(--tone-ink, var(--brand-deep)); background: var(--tone-soft, var(--brand-wash)); }
|
||||
.g-tile-t { flex: 1; min-width: 0; line-height: 1.35; }
|
||||
.g-tile-t b { display: block; font-size: 13.5px; font-weight: 700; color: var(--ink); }
|
||||
.g-tile-t em { display: block; font-style: normal; font-size: 10.5px; font-family: var(--mono); color: var(--ink-4); }
|
||||
.g-tile-t b { display: block; font-size: 13.5px; font-weight: 700; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.g-tile-t em { display: block; font-style: normal; font-size: 10.5px; font-family: var(--mono); color: var(--ink-4); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.g-tile-m { display: flex; flex-wrap: wrap; gap: 6px; }
|
||||
.g-tile-d { font-size: 11.5px; line-height: 1.6; color: var(--ink-3); }
|
||||
.g-tile-f { display: flex; align-items: center; gap: 8px; padding-top: 9px; border-top: 1px dashed var(--line-soft); font-size: 11px; color: var(--ink-3); }
|
||||
.g-tile-d { min-height: 3.2em; font-size: 11.5px; line-height: 1.6; color: var(--ink-3); display: -webkit-box; -webkit-line-clamp: 2; line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
|
||||
.g-tile-f { margin-top: auto; min-height: 37px; box-sizing: border-box; display: flex; align-items: center; gap: 8px; padding-top: 9px; border-top: 1px dashed var(--line-soft); font-size: 11px; color: var(--ink-3); }
|
||||
.g-tile-f > .g-btn { margin-left: auto; height: 24px; padding: 0 9px; font-size: 11px; }
|
||||
.g-tile-f .r { margin-left: auto; font-family: var(--mono); color: var(--ink-4); }
|
||||
|
||||
/* ============ 规则清单(触发器):整行可下钻 ============ */
|
||||
@@ -672,10 +673,13 @@
|
||||
全屏只有一处戏眼 —— TRACE 那张**「树 + 甘特」同排的走查记录纸**:
|
||||
左边是结构(枝线画出 span 树),右边是时间(同一条刻度轴上的条),一行读两件事。 */
|
||||
|
||||
.g-tb {
|
||||
--sh-ink: #161b22; --sh-steel: #46586a; --sh-muted: #6a7686;
|
||||
--sh-line: #d8dee6; --sh-brass: #8a5f1c; --sh-brass-wash: #f7f0e0;
|
||||
--sh-grid: #edf1f5;
|
||||
/* 暗色仪表台:纸变面板,钢青转冷蓝,黄铜留着当「人 / 生效 / 裁定」的色。
|
||||
结构一行没动 —— 换的只是这组变量与几处底色,TRACE 那张树 + 甘特照旧。 */
|
||||
.g-tb, .g-rig {
|
||||
--sh-ink: #e6edf6; --sh-steel: #8aa4c2; --sh-muted: #64788f;
|
||||
--sh-line: #21303f; --sh-brass: #f0a83c; --sh-brass-wash: #241a0c;
|
||||
--sh-grid: #16222f;
|
||||
--sh-panel: #0e1823; --sh-panel-2: #121f2c; --sh-live: #35d0c0;
|
||||
--sh-mono: "SF Mono", "JetBrains Mono", "Menlo", "Roboto Mono", ui-monospace, monospace;
|
||||
display: flex; flex-direction: column; gap: 12px; min-width: 0;
|
||||
}
|
||||
@@ -683,7 +687,7 @@
|
||||
/* 模式选择:不是第二条页签栏 —— 前置 mono 墨签点明这是个**控件**,方角、黄铜底线定当前 */
|
||||
|
||||
/* ── 图纸卡:方角白纸 + mono 三字码题头(与流程区的 VER — / FIG — 同一idiom)── */
|
||||
.g-sheet { display: flex; flex-direction: column; min-width: 0; background: #fff; border: 1px solid var(--sh-line); box-shadow: var(--cshadow); }
|
||||
.g-sheet { display: flex; flex-direction: column; min-width: 0; background: var(--sh-panel); border: 1px solid var(--sh-line); box-shadow: var(--cshadow); }
|
||||
.g-sheet-h { flex: none; display: flex; align-items: center; gap: 8px; padding: 11px 14px 10px; border-bottom: 1px solid var(--sh-line); font-family: var(--sh-mono); font-size: 9.5px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: var(--sh-steel); }
|
||||
.g-sheet-h svg { color: var(--sh-steel); opacity: .65; }
|
||||
/* 题头右角写的是**数据**(包 id / 计数 / 来源),不是标签 —— 不跟着题头转大写 */
|
||||
@@ -698,8 +702,11 @@
|
||||
.g-tb .g-field { gap: 3px; }
|
||||
.g-tb .g-field > em { font: 600 9px/1.6 var(--sh-mono); letter-spacing: .12em; text-transform: uppercase; color: var(--sh-steel); }
|
||||
.g-tb .g-field > em i { font-family: var(--sans); font-size: 10px; font-weight: 400; letter-spacing: 0; text-transform: none; color: var(--sh-muted); }
|
||||
.g-tb .g-input, .g-tb .g-select, .g-tb .g-ta { border: 0; border-bottom: 1px solid var(--sh-line); border-radius: 0; background-color: transparent; padding: 5px 2px; }
|
||||
.g-tb .g-input:focus, .g-tb .g-select:focus, .g-tb .g-ta:focus { outline: 0; border-color: #4e7daf; box-shadow: 0 1px 0 0 #4e7daf; }
|
||||
.g-tb .g-input, .g-tb .g-select, .g-tb .g-ta,
|
||||
.g-rig .g-input, .g-rig .g-select, .g-rig .g-ta { border: 0; border-bottom: 1px solid var(--sh-line); border-radius: 0; background-color: transparent; color: var(--sh-ink); padding: 5px 2px; }
|
||||
.g-rig .g-select option { background: var(--sh-panel); color: var(--sh-ink); }
|
||||
.g-tb .g-input:focus, .g-tb .g-select:focus, .g-tb .g-ta:focus,
|
||||
.g-rig .g-input:focus, .g-rig .g-select:focus, .g-rig .g-ta:focus { outline: 0; border-color: var(--sh-live); box-shadow: 0 1px 0 0 var(--sh-live); }
|
||||
.g-tb .g-select { padding-right: 22px; background-position: right 8px center, right 3px center; }
|
||||
.g-tb .g-btn, .g-tb .g-chip, .g-tb .g-note, .g-tb .g-seg, .g-tb .g-seg-b { border-radius: 0; }
|
||||
.g-tb .g-btn { border-color: var(--sh-line); color: var(--sh-steel); }
|
||||
@@ -727,9 +734,60 @@
|
||||
.g-tbrun > .g-tb-f { flex: 0 1 440px; }
|
||||
.g-tbrun > .g-acts { flex: none; margin-left: auto; }
|
||||
|
||||
|
||||
/* ══ 装配台:左选流 · 右配置 ═══════════════════════════════════════════
|
||||
一屏两大块 —— 左边一条流一张条,右边两节:①这封信 ②派给谁。
|
||||
面板是暗的:这一屏看的是机器,不是纸。 */
|
||||
.g-rig { display: grid; grid-template-columns: minmax(212px, .72fr) minmax(0, 2.15fr); gap: 12px; align-items: start; }
|
||||
.g-rig-l, .g-rig-r { display: flex; flex-direction: column; min-width: 0; background: var(--sh-panel); border: 1px solid var(--sh-line); }
|
||||
.g-rig-r { gap: 0; }
|
||||
|
||||
/* 节题:mono 小号 + 序号章 —— 右栏两节靠它分,不用第二条页签栏 */
|
||||
.g-rig-h { display: flex; align-items: center; gap: 8px; padding: 10px 13px 9px; border-bottom: 1px solid var(--sh-line); background: var(--sh-panel-2); font-family: var(--sh-mono); font-size: 9.5px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: var(--sh-steel); }
|
||||
.g-rig-r > .g-rig-h + .g-rig-h, .g-rig-r > * + .g-rig-h { border-top: 1px solid var(--sh-line); }
|
||||
.g-rig-h svg { color: var(--sh-steel); opacity: .7; }
|
||||
.g-rig-h .n { display: inline-flex; align-items: center; justify-content: center; min-width: 17px; height: 15px; border: 1px solid var(--sh-brass); color: var(--sh-brass); font-size: 9px; letter-spacing: .06em; }
|
||||
.g-rig-h .x { margin-left: auto; letter-spacing: .04em; text-transform: none; color: var(--sh-muted); }
|
||||
|
||||
/* 左栏:一包一条 —— 选中的那条亮一道黄铜边线 */
|
||||
.g-rig-pk { display: flex; flex-direction: column; gap: 1px; padding: 8px; }
|
||||
.g-pk { display: flex; flex-direction: column; gap: 4px; padding: 9px 10px; border: 1px solid transparent; border-left: 2px solid var(--sh-line); background: transparent; text-align: left; font: inherit; color: var(--sh-ink); cursor: pointer; transition: background var(--t-fast), border-color var(--t-fast); }
|
||||
.g-pk:hover { background: var(--sh-panel-2); border-left-color: var(--sh-steel); }
|
||||
.g-pk.on { background: var(--sh-brass-wash); border-color: #3a2c14; border-left-color: var(--sh-brass); }
|
||||
.g-pk:focus-visible { outline: 2px solid var(--sh-live); outline-offset: -2px; }
|
||||
.g-pk b { font-size: 12.5px; font-weight: 700; }
|
||||
.g-pk .id { font-family: var(--sh-mono); font-size: 10px; color: var(--sh-muted); }
|
||||
.g-pk .cnt { display: flex; gap: 10px; font-size: 10px; color: var(--sh-steel); }
|
||||
.g-pk .cnt i { font-style: normal; }
|
||||
|
||||
/* ── 01 输入配置:一封信 ────────────────────────────────────────────
|
||||
写信就该长得像写信 —— 标签在左、线在下,附件是一排小签。 */
|
||||
.g-ml { display: flex; flex-direction: column; padding: 4px 13px 12px; }
|
||||
.g-ml-r { display: grid; grid-template-columns: 58px minmax(0, 1fr); align-items: center; gap: 10px; padding: 7px 0; border-bottom: 1px solid var(--sh-line); }
|
||||
.g-ml-r.tall { align-items: start; }
|
||||
.g-ml-r:last-child { border-bottom: 0; }
|
||||
.g-ml-r > em { font: 600 9px/1.6 var(--sh-mono); letter-spacing: .12em; text-transform: uppercase; font-style: normal; color: var(--sh-steel); padding-top: 2px; }
|
||||
.g-ml-i { width: 100%; box-sizing: border-box; border: 0; background: transparent; padding: 3px 0; color: var(--sh-ink); font: inherit; font-size: 12.5px; resize: vertical; }
|
||||
.g-ml-i::placeholder { color: var(--sh-muted); }
|
||||
.g-ml-i:focus { outline: 0; }
|
||||
.g-ml-r:focus-within { border-bottom-color: var(--sh-live); }
|
||||
.g-ml-t { grid-column: 2; font-size: 10px; color: var(--sh-muted); }
|
||||
.g-ml-at { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; padding: 2px 0; }
|
||||
.g-att { display: inline-flex; align-items: center; gap: 5px; padding: 3px 5px 3px 7px; border: 1px solid var(--sh-line); background: var(--sh-panel-2); font-size: 11px; color: var(--sh-ink); }
|
||||
.g-att svg { color: var(--sh-steel); }
|
||||
.g-att i { font-style: normal; font-family: var(--sh-mono); font-size: 9.5px; color: var(--sh-muted); }
|
||||
.g-att button { display: inline-flex; padding: 2px; border: 0; background: transparent; color: var(--sh-muted); cursor: pointer; }
|
||||
.g-att button:hover { color: #ff8b84; }
|
||||
.g-att-add { display: inline-flex; align-items: center; gap: 5px; padding: 4px 8px; border: 1px dashed var(--sh-line); background: transparent; color: var(--sh-steel); font: inherit; font-size: 11px; cursor: pointer; }
|
||||
.g-att-add:hover { border-color: var(--sh-steel); color: var(--sh-ink); }
|
||||
|
||||
/* ── 02 节点指派:一节点一行,定了的那行亮左线 ── */
|
||||
.g-rig-r > .g-asn { padding: 6px 13px 12px; }
|
||||
.g-rig-r > .g-note { margin: 0 13px 12px; }
|
||||
|
||||
/* ── PKG — 流程包:一包一行,生效版行按黄铜左线(与流程区的「生效版」同一记号)── */
|
||||
.g-tbpkgs { display: flex; flex-direction: column; gap: 7px; }
|
||||
.g-tbpkg { display: flex; flex-direction: column; gap: 5px; padding: 9px 11px; border: 1px solid var(--sh-line); border-left: 3px solid var(--sh-line); background: #fff; text-align: left; font: inherit; cursor: pointer; transition: border-color var(--t-fast), background var(--t-fast); }
|
||||
.g-tbpkg { display: flex; flex-direction: column; gap: 5px; padding: 9px 11px; border: 1px solid var(--sh-line); border-left: 3px solid var(--sh-line); background: var(--sh-panel); text-align: left; font: inherit; cursor: pointer; transition: border-color var(--t-fast), background var(--t-fast); }
|
||||
.g-tbpkg:hover { border-color: #aeb9c6; }
|
||||
.g-tbpkg.on { border-color: #cbb98d; border-left-color: var(--sh-brass); background: var(--sh-brass-wash); }
|
||||
.g-tbpkg:focus-visible { outline: 2px solid var(--brand); outline-offset: 1px; }
|
||||
@@ -743,16 +801,16 @@
|
||||
.g-asn { display: flex; flex-direction: column; min-width: 0; }
|
||||
.g-asn-h, .g-asn-r { display: grid; grid-template-columns: 38px 38px minmax(0, 1fr) minmax(130px, 175px); align-items: center; gap: 10px; }
|
||||
.g-asn-h { font: 600 8.5px/1 var(--sh-mono); letter-spacing: .12em; text-transform: uppercase; color: var(--sh-muted); padding-bottom: 6px; border-bottom: 1px solid var(--sh-line); }
|
||||
.g-asn-r { padding: 5px 0; border-bottom: 1px dashed #eef1f5; }
|
||||
.g-asn-r { padding: 5px 0; border-bottom: 1px dashed var(--sh-line); }
|
||||
.g-asn-r:last-child { border-bottom: 0; }
|
||||
.g-asn-r > .nid { font-family: var(--sh-mono); font-size: 11px; font-weight: 700; color: var(--sh-ink); }
|
||||
.g-asn-r > .kd { font: 600 8.5px/1 var(--sh-mono); letter-spacing: .1em; text-transform: uppercase; color: var(--sh-muted); }
|
||||
.g-asn-r > .lb { font-size: 11.5px; color: #3a4452; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.g-asn-r > .lb { font-size: 11.5px; color: var(--sh-ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.g-asn-r.pinned > .nid, .g-asn-r.pinned > .lb { color: var(--sh-brass); }
|
||||
|
||||
/* ── 图签栏:工程图右下角那张表 —— 一条流的身份卡,纯细线不着色,把颜色让给 TRACE ── */
|
||||
.g-tblock { display: grid; grid-template-columns: repeat(auto-fit, minmax(148px, 1fr)); gap: 1px; background: var(--sh-line); }
|
||||
.g-tblock > div { display: flex; flex-direction: column; gap: 4px; min-width: 0; padding: 10px 12px 11px; background: #fff; }
|
||||
.g-tblock > div { display: flex; flex-direction: column; gap: 4px; min-width: 0; padding: 10px 12px 11px; background: var(--sh-panel); }
|
||||
.g-tblock em { font: 600 8.5px/1 var(--sh-mono); font-style: normal; letter-spacing: .14em; text-transform: uppercase; color: var(--sh-muted); }
|
||||
.g-tblock b { font-family: var(--sh-mono); font-size: 12px; font-weight: 700; color: var(--sh-ink); overflow-wrap: anywhere; }
|
||||
.g-tblock b.brass { color: var(--sh-brass); }
|
||||
@@ -761,8 +819,8 @@
|
||||
/* 派工带:测试台不代答 —— 任务真的落在别人工位上,这一条必须说满 */
|
||||
.g-tbdesk { display: flex; flex-direction: column; gap: 6px; padding: 10px 13px 11px; border: 1px solid #cbb98d; border-left: 3px solid var(--sh-brass); background: var(--sh-brass-wash); }
|
||||
.g-tbdesk-h { display: flex; align-items: center; gap: 7px; font: 600 9.5px/1 var(--sh-mono); letter-spacing: .14em; text-transform: uppercase; color: var(--sh-brass); }
|
||||
.g-tbdesk-h .g-btn { margin-left: auto; border-color: #cbb98d; background: #fff; color: var(--sh-brass); }
|
||||
.g-tbdesk-h .g-btn:hover { border-color: var(--sh-brass); background: #fff; }
|
||||
.g-tbdesk-h .g-btn { margin-left: auto; border-color: #cbb98d; background: var(--sh-panel); color: var(--sh-brass); }
|
||||
.g-tbdesk-h .g-btn:hover { border-color: var(--sh-brass); background: var(--sh-panel); }
|
||||
.g-tbdesk-r { display: flex; flex-wrap: wrap; align-items: baseline; gap: 7px; font-size: 12px; color: #6f4b14; }
|
||||
.g-tbdesk-r b { font-weight: 700; color: var(--sh-brass); }
|
||||
.g-tbdesk-r .nid { font-family: var(--sh-mono); font-size: 10px; color: #8a7743; }
|
||||
@@ -807,7 +865,7 @@ button.g-trc-row:focus-visible { outline: 2px solid var(--brand); outline-offset
|
||||
.g-trc-tree i.on::before { content: ""; position: absolute; left: 6px; top: 0; bottom: 0; border-left: 1px solid #dfe5ec; }
|
||||
.g-trc-tree i.elb::before { content: ""; position: absolute; left: 6px; top: 0; width: 7px; height: 50%; border-left: 1px solid #dfe5ec; border-bottom: 1px solid #dfe5ec; }
|
||||
.g-trc-tree i.elb.mid::after { content: ""; position: absolute; left: 6px; top: 50%; bottom: 0; border-left: 1px solid #dfe5ec; }
|
||||
.g-trc-k { flex: none; display: grid; place-items: center; width: 17px; height: 17px; border: 1px solid var(--tk); background: #fff; color: var(--tk); }
|
||||
.g-trc-k { flex: none; display: grid; place-items: center; width: 17px; height: 17px; border: 1px solid var(--tk); background: var(--sh-panel); color: var(--tk); }
|
||||
.g-trc-kn { flex: none; width: 46px; font: 600 8.5px/1 var(--sh-mono); letter-spacing: .1em; color: var(--tk); }
|
||||
.g-trc-nm { min-width: 0; font-size: 11.5px; color: var(--sh-ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.g-trc-me { flex: none; display: inline-flex; align-items: center; gap: 5px; font-family: var(--sh-mono); font-size: 9.5px; color: var(--sh-muted); }
|
||||
@@ -834,7 +892,7 @@ button.g-trc-row:focus-visible { outline: 2px solid var(--brand); outline-offset
|
||||
.g-trc-x { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); align-items: start; gap: 10px; padding: 11px 14px 13px; border-bottom: 1px solid var(--sh-line); background: #f7f9fc; }
|
||||
.g-trc-x figure { display: flex; flex-direction: column; gap: 5px; min-width: 0; margin: 0; }
|
||||
.g-trc-x figcaption { font: 600 8.5px/1 var(--sh-mono); letter-spacing: .14em; text-transform: uppercase; color: var(--sh-steel); }
|
||||
.g-trc-x pre { margin: 0; max-height: 148px; overflow: auto; padding: 8px 10px; border: 1px solid var(--sh-line); background: #fff; font-family: var(--sh-mono); font-size: 10.5px; line-height: 1.65; color: #3a4452; white-space: pre-wrap; overflow-wrap: anywhere; }
|
||||
.g-trc-x pre { margin: 0; max-height: 148px; overflow: auto; padding: 8px 10px; border: 1px solid var(--sh-line); background: var(--sh-panel); font-family: var(--sh-mono); font-size: 10.5px; line-height: 1.65; color: #3a4452; white-space: pre-wrap; overflow-wrap: anywhere; }
|
||||
.g-trc-x figure.bad figcaption { color: #b0413e; }
|
||||
.g-trc-x figure.bad pre { border-color: #e3b9b7; background: #fdf7f6; color: #b0413e; }
|
||||
/* kind 字典:结构三色走灰阶(骨架),动作三色各有其人(工具 / 模型 / 人)—— 有色的才是「谁动的手」 */
|
||||
|
||||
Reference in New Issue
Block a user