fix: 复制API去掉选中行要求,源和目标都改为下拉选择; dspy去json.dumps

This commit is contained in:
yumoqing 2026-07-01 15:26:27 +08:00
parent 2068b066e3
commit f5c808c976
3 changed files with 38 additions and 47 deletions

View File

@ -14,7 +14,6 @@
"selected_data":true "selected_data":true
}, },
{ {
"selected_row":true,
"name":"copy_api", "name":"copy_api",
"label":"复制API" "label":"复制API"
} }
@ -41,12 +40,6 @@
"height":"auto", "height":"auto",
"width":"500px" "width":"500px"
}, },
"params_mapping":{
"mapping":{
"id":"upappid"
},
"need_other":false
},
"options":{ "options":{
"method":"GET", "method":"GET",
"params":{}, "params":{},

View File

@ -1,44 +1,37 @@
ns = params_kw.copy() result = {'widgettype': 'Error', 'options': {'title': 'Error', 'message': '', 'timeout': 3}}
source_upappid = ns.get('source_upappid', '') try:
target_upappid = ns.get('target_upappid', '') source_upappid = params_kw.get('source_upappid', '')
target_upappid = params_kw.get('target_upappid', '')
if not source_upappid: if not source_upappid:
return json.dumps({'widgettype':'Error','options':{'text':'缺少源上位系统ID'}}, ensure_ascii=False) raise Exception('请选择源上位系统')
if not target_upappid:
raise Exception('请选择目标上位系统')
if source_upappid == target_upappid:
raise Exception('源和目标上位系统不能相同')
if not target_upappid: db = DBPools()
return json.dumps({'widgettype':'Error','options':{'text':'请选择目标上位系统'}}, ensure_ascii=False) dbname = get_module_dbname('uapi')
async with db.sqlorContext(dbname) as sor:
sql = 'select * from uapi where upappid = ${upappid}$'
source_uapis = await sor.sqlExe(sql, {'upappid': source_upappid})
if source_upappid == target_upappid: if not source_uapis:
return json.dumps({'widgettype':'Error','options':{'text':'源和目标上位系统不能相同'}}, ensure_ascii=False) raise Exception('源上位系统中没有API记录')
db = DBPools() existing_recs = await sor.sqlExe(sql, {'upappid': target_upappid})
dbname = get_module_dbname('uapi') existing_names = {r['name'] for r in existing_recs}
async with db.sqlorContext(dbname) as sor:
# 查询源上位系统的所有API
sql = 'select * from uapi where upappid = ${upappid}$'
source_uapis = await sor.sqlExe(sql, {'upappid': source_upappid})
if not source_uapis: copied = 0
return json.dumps({'widgettype':'Error','options':{'text':'源上位系统中没有API记录'}}, ensure_ascii=False) skipped = 0
for api in source_uapis:
if api['name'] in existing_names:
skipped += 1
continue
# 查询目标上位系统已有的API名称 new_id = getID()
existing_sql = 'select name from uapi where upappid = ${upappid}$' await sor.C('uapi', {
existing_recs = await sor.sqlExe(existing_sql, {'upappid': target_upappid})
existing_names = {r['name'] for r in existing_recs}
copied = 0
skipped = 0
for api in source_uapis:
if api['name'] in existing_names:
skipped += 1
continue
new_id = getID()
await sor.sqlExe(
'''insert into uapi (id,upappid,name,title,description,need_auth,stream,path,httpmethod,chunk_match,headers,params,data,response,ioid,callbackurl)
values (${id}$,${upappid}$,${name}$,${title}$,${description}$,${need_auth}$,${stream}$,${path}$,${httpmethod}$,${chunk_match}$,${headers}$,${params}$,${data}$,${response}$,${ioid}$,${callbackurl}$)''',
{
'id': new_id, 'id': new_id,
'upappid': target_upappid, 'upappid': target_upappid,
'name': api.get('name', ''), 'name': api.get('name', ''),
@ -55,12 +48,17 @@ async with db.sqlorContext(dbname) as sor:
'response': api.get('response', ''), 'response': api.get('response', ''),
'ioid': api.get('ioid', ''), 'ioid': api.get('ioid', ''),
'callbackurl': api.get('callbackurl', '') 'callbackurl': api.get('callbackurl', '')
} })
) copied += 1
copied += 1
msg = f'成功复制 {copied} 条API记录' msg = f'成功复制 {copied} 条API记录'
if skipped > 0: if skipped > 0:
msg += f',跳过 {skipped} 条API名称已存在' msg += f',跳过 {skipped} 条API名称已存在'
return json.dumps({'widgettype':'Message','options':{'text':msg}}, ensure_ascii=False) result = {'widgettype': 'Message', 'options': {'title': '复制完成', 'message': msg, 'timeout': 3, 'type': 'success'}}
except Exception as e:
debug(f'copy_uapi error: {format_exc()}')
result = {'widgettype': 'Error', 'options': {'title': '复制失败', 'message': str(e), 'timeout': 5}}
return result

View File

@ -5,14 +5,14 @@
"subwidgets": [ "subwidgets": [
{ {
"widgettype": "Text", "widgettype": "Text",
"options": {"text": "选择目标上位系统,将当前上位系统的所有API接口复制到目标系统"} "options": {"text": "选择源和目标上位系统,将源系统的所有API接口复制到目标系统"}
}, },
{ {
"widgettype": "Form", "widgettype": "Form",
"options": { "options": {
"submit_url": "{{entire_url('./api/copy_uapi.dspy')}}", "submit_url": "{{entire_url('./api/copy_uapi.dspy')}}",
"fields": [ "fields": [
{"name": "source_upappid", "uitype": "hide", "value": "{{params_kw.get('upappid', '')}}"}, {"name": "source_upappid", "uitype": "code", "label": "源上位系统", "required": true, "data": {{json.dumps(upapps, ensure_ascii=False)}}},
{"name": "target_upappid", "uitype": "code", "label": "目标上位系统", "required": true, "data": {{json.dumps(upapps, ensure_ascii=False)}}} {"name": "target_upappid", "uitype": "code", "label": "目标上位系统", "required": true, "data": {{json.dumps(upapps, ensure_ascii=False)}}}
] ]
}, },