From f970bb955d747cd58d5ddeeffe74a453095d2d20 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Mon, 25 May 2026 23:06:03 -0600 Subject: [PATCH] fix --- .../problem/components/AstRulesEditor.vue | 93 +++++++++++++++---- 1 file changed, 73 insertions(+), 20 deletions(-) diff --git a/src/admin/problem/components/AstRulesEditor.vue b/src/admin/problem/components/AstRulesEditor.vue index aaf9a3a..7aa4152 100644 --- a/src/admin/problem/components/AstRulesEditor.vue +++ b/src/admin/problem/components/AstRulesEditor.vue @@ -5,6 +5,7 @@ interface AstRule { engine: string target?: string label?: string + exact?: number min?: number max?: number message: string @@ -93,6 +94,38 @@ function isMethodEngine(engine: string) { return METHOD_ENGINES.includes(engine) function isOperatorEngine(engine: string) { return OPERATOR_ENGINES.includes(engine) } function isCountEngine(engine: string) { return COUNT_ENGINES.includes(engine) } +const COUNT_MODE_OPTIONS: SelectOption[] = [ + { label: "精确", value: "exact" }, + { label: "范围", value: "range" }, +] + +function getCountMode(rule: AstRule): "exact" | "range" { + return rule.exact !== undefined ? "exact" : "range" +} + +function updateCountMode(lang: string, index: number, mode: "exact" | "range") { + const rules = [...getRulesForLang(lang)] + const rule = { ...rules[index] } + if (mode === "exact") { + rule.exact = rule.min ?? 1 + delete rule.min + delete rule.max + } else { + delete rule.exact + } + rules[index] = rule + updateRules(lang, rules) +} + +function updateExactCount(lang: string, index: number, v: number | null) { + const rules = [...getRulesForLang(lang)] + const rule = { ...rules[index] } + if (v === null) delete rule.exact + else rule.exact = v + rules[index] = rule + updateRules(lang, rules) +} + function needsTargetDropdown(engine: string) { return isNodeEngine(engine) } function needsTargetInput(engine: string) { return isFunctionEngine(engine) || isMethodEngine(engine) } function needsOperatorDropdown(engine: string) { return isOperatorEngine(engine) } @@ -143,6 +176,7 @@ function updateRule(lang: string, index: number, field: string, value: any) { else { rule.target = ""; delete rule.label } delete rule.min delete rule.max + delete rule.exact } else if (field === "target") { rule.target = value const lbl = getTargetLabel(rule.engine, value) @@ -209,26 +243,45 @@ watch(() => props.languages, (langs) => { style="width: 150px" size="small" /> - - +