feat: 腾讯 AppID 自动补全 tencent 前缀
新增/编辑 App 时,腾讯 AppID 允许只填数字,后端统一归一化为 tencent 前缀;前端输入框失焦即时补全,保存前再校正一次。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -254,6 +254,14 @@ def _apply_special_app_prefix_override(app: dict) -> None:
|
||||
app["app_id_prefix_override"] = 1
|
||||
|
||||
|
||||
def _normalize_tencent_app_id(app: dict) -> None:
|
||||
"""腾讯 AppID 统一带 tencent 前缀(允许只填数字 ID)。"""
|
||||
value = str(app.get("tencent") or "").strip()
|
||||
if not value:
|
||||
return
|
||||
app["tencent"] = value if value.startswith("tencent") else f"tencent{value}"
|
||||
|
||||
|
||||
def _next_app_id(apps: dict, servers: dict, app: dict) -> str:
|
||||
"""根据环境前缀或 App 特殊覆盖生成下一个配置 ID。"""
|
||||
prefix = app.get("app_id_prefix_override")
|
||||
@@ -412,6 +420,7 @@ async def create_app(app: dict):
|
||||
|
||||
# 按服务环境自动生成三位 ID(例如测试环境 1xx、正式环境 2xx)。
|
||||
_apply_special_app_prefix_override(app)
|
||||
_normalize_tencent_app_id(app)
|
||||
new_id = _next_app_id(apps, config.get("servers", {}), app)
|
||||
|
||||
# 自动生成 upload_key
|
||||
@@ -434,6 +443,7 @@ async def update_app(app_id: str, app: dict):
|
||||
if app_id not in apps:
|
||||
raise HTTPException(status_code=404, detail="App 不存在")
|
||||
|
||||
_normalize_tencent_app_id(app)
|
||||
apps[app_id] = app
|
||||
config["apps"] = apps
|
||||
save_config(config)
|
||||
|
||||
@@ -491,7 +491,7 @@
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label>腾讯 AppID</label>
|
||||
<input v-model="appForm.tencent" type="text" placeholder="tencent...">
|
||||
<input v-model="appForm.tencent" type="text" placeholder="tencent...(可只填数字,自动补前缀)" @blur="normalizeTencentAppId">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>阿里云 License Key</label>
|
||||
@@ -1014,12 +1014,20 @@ const formatSize = (bytes) => {
|
||||
return (bytes / (1024 * 1024)).toFixed(1) + ' MB'
|
||||
}
|
||||
|
||||
// 腾讯 AppID 统一带 tencent 前缀(允许只填数字 ID)
|
||||
const normalizeTencentAppId = () => {
|
||||
const value = (appForm.value.tencent || '').trim()
|
||||
appForm.value.tencent = value && !value.startsWith('tencent') ? `tencent${value}` : value
|
||||
}
|
||||
|
||||
const saveApp = async () => {
|
||||
if (!appForm.value.name || !appForm.value.AppGuid) {
|
||||
alert('请填写必填字段:App 名称、AppGuid')
|
||||
return
|
||||
}
|
||||
|
||||
normalizeTencentAppId()
|
||||
|
||||
// 清理空证书
|
||||
if (appForm.value.certificates) {
|
||||
Object.keys(appForm.value.certificates).forEach(key => {
|
||||
|
||||
@@ -48,6 +48,31 @@ def test_create_app_rejects_unknown_environment_id_rule(client, tmp_config):
|
||||
assert "ID 规则" in resp.json()["detail"]
|
||||
|
||||
|
||||
def test_create_app_prefixes_tencent_app_id(client, tmp_config):
|
||||
resp = client.post("/api/config/apps", json={
|
||||
"name": "腾讯App", "server": "测试环境", "AppGuid": "guid", "tencent": "123456",
|
||||
})
|
||||
assert resp.status_code == 200
|
||||
app_id = resp.json()["id"]
|
||||
assert client.get("/api/config/apps").json()[app_id]["tencent"] == "tencent123456"
|
||||
|
||||
|
||||
def test_create_app_keeps_existing_tencent_prefix(client, tmp_config):
|
||||
resp = client.post("/api/config/apps", json={
|
||||
"name": "腾讯App2", "server": "测试环境", "AppGuid": "guid", "tencent": "tencent123456",
|
||||
})
|
||||
app_id = resp.json()["id"]
|
||||
assert client.get("/api/config/apps").json()[app_id]["tencent"] == "tencent123456"
|
||||
|
||||
|
||||
def test_update_app_prefixes_tencent_app_id(client, tmp_config):
|
||||
resp = client.put("/api/config/apps/1", json={
|
||||
"name": "改名App", "AppGuid": "test-guid", "tencent": " 987654 ",
|
||||
})
|
||||
assert resp.status_code == 200
|
||||
assert client.get("/api/config/apps").json()["1"]["tencent"] == "tencent987654"
|
||||
|
||||
|
||||
def test_update_app(client, tmp_config):
|
||||
resp = client.put("/api/config/apps/1", json={"name": "改名App", "AppGuid": "test-guid"})
|
||||
assert resp.status_code == 200
|
||||
|
||||
Reference in New Issue
Block a user