From d84cc1d859a9d92b722cb91081374c1bb5be9bd6 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Sat, 30 May 2026 01:43:09 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20API=E8=BF=94=E5=9B=9E=E7=BA=AF=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E6=A0=BC=E5=BC=8F=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E4=B8=8A=E4=B8=8B=E6=9E=B6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - get_organizations/get_upapps/uapi_options: 返回纯数组[{value,text}] - 新增 get_catelogs/get_apis/get_ppids: 独立下拉数据API - llm_api_map_manage.ui: 使用独立API替代data_field嵌套格式 - json/llm.json: 移除data_field,添加上架/下架toolbar - llm_status_update.dspy: 模型上下架状态更新API - 重新生成 llm/index.ui CRUD界面 --- json/llm.json | 56 +++++++++++++++++++++++++----- wwwroot/api/get_apis.dspy | 14 ++++++++ wwwroot/api/get_catelogs.dspy | 14 ++++++++ wwwroot/api/get_organizations.dspy | 7 ++-- wwwroot/api/get_ppids.dspy | 14 ++++++++ wwwroot/api/get_upapps.dspy | 7 ++-- wwwroot/api/llm_status_update.dspy | 23 ++++++++++++ wwwroot/api/uapi_options.dspy | 7 ++-- wwwroot/llm_api_map_manage.ui | 9 ++--- 9 files changed, 125 insertions(+), 26 deletions(-) create mode 100644 wwwroot/api/get_apis.dspy create mode 100644 wwwroot/api/get_catelogs.dspy create mode 100644 wwwroot/api/get_ppids.dspy create mode 100644 wwwroot/api/llm_status_update.dspy diff --git a/json/llm.json b/json/llm.json index c2cd2a7..4162ac8 100644 --- a/json/llm.json +++ b/json/llm.json @@ -39,17 +39,11 @@ }, "providerid": { "uitype": "code", - "dataurl": "{{entire_url('../api/get_organizations.dspy')}}", - "data_field": "organizations", - "textField": "text", - "valueField": "id" + "dataurl": "{{entire_url('../api/get_organizations.dspy')}}" }, "upappid": { "uitype": "code", - "dataurl": "{{entire_url('../api/get_upapps.dspy')}}", - "data_field": "upapps", - "textField": "text", - "valueField": "id" + "dataurl": "{{entire_url('../api/get_upapps.dspy')}}" } } }, @@ -59,6 +53,16 @@ "name":"test", "label":"体验", "selected_row":true + }, + { + "name":"publish", + "label":"上架", + "selected_row":true + }, + { + "name":"unpublish", + "label":"下架", + "selected_row":true } ] }, @@ -79,6 +83,42 @@ "id":"${id}" } } + }, + { + "wid":"self", + "event":"publish", + "actiontype":"urlwidget", + "target":"PopupWindow", + "popup_options":{ + "title":"上架确认", + "cwidth":20, + "cheight":8 + }, + "options":{ + "url":"{{entire_url('../api/llm_status_update.dspy')}}", + "params":{ + "id":"${id}", + "status":"published" + } + } + }, + { + "wid":"self", + "event":"unpublish", + "actiontype":"urlwidget", + "target":"PopupWindow", + "popup_options":{ + "title":"下架确认", + "cwidth":20, + "cheight":8 + }, + "options":{ + "url":"{{entire_url('../api/llm_status_update.dspy')}}", + "params":{ + "id":"${id}", + "status":"unpublished" + } + } } ], "editexclouded": [ diff --git a/wwwroot/api/get_apis.dspy b/wwwroot/api/get_apis.dspy new file mode 100644 index 0000000..1594761 --- /dev/null +++ b/wwwroot/api/get_apis.dspy @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +import json + +result = [] + +try: + dbname = get_module_dbname('llmage') + async with DBPools().sqlorContext(dbname) as sor: + rows = await sor.sqlExe("select name, path from uapi order by name", {}) + result = [{'value': r['name'], 'text': f"{r['name']} ({r['path']})"} for r in (rows or [])] +except Exception as e: + pass + +return json.dumps(result, ensure_ascii=False, default=str) diff --git a/wwwroot/api/get_catelogs.dspy b/wwwroot/api/get_catelogs.dspy new file mode 100644 index 0000000..8a5bd44 --- /dev/null +++ b/wwwroot/api/get_catelogs.dspy @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +import json + +result = [] + +try: + dbname = get_module_dbname('llmage') + async with DBPools().sqlorContext(dbname) as sor: + rows = await sor.sqlExe("select id, name from llmcatelog order by name", {}) + result = [{'value': r['id'], 'text': r['name']} for r in (rows or [])] +except Exception as e: + pass + +return json.dumps(result, ensure_ascii=False, default=str) diff --git a/wwwroot/api/get_organizations.dspy b/wwwroot/api/get_organizations.dspy index d4a51b7..71e88ee 100644 --- a/wwwroot/api/get_organizations.dspy +++ b/wwwroot/api/get_organizations.dspy @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import json -result = {'success': False, 'data': {'organizations': []}} +result = [] try: async with get_sor_context(request._run_ns, 'rbac') as sor: @@ -12,9 +12,8 @@ try: "select id, orgname from organization where id = ${id}$ or parentid = ${id}$ order by orgname", {'id': user_orgid} ) - result['data']['organizations'] = [{'id': r['id'], 'text': r['orgname']} for r in (all_orgs or [])] - result['success'] = True + result = [{'value': r['id'], 'text': r['orgname']} for r in (all_orgs or [])] except Exception as e: - result['error'] = str(e) + pass return json.dumps(result, ensure_ascii=False, default=str) diff --git a/wwwroot/api/get_ppids.dspy b/wwwroot/api/get_ppids.dspy new file mode 100644 index 0000000..d7c22f0 --- /dev/null +++ b/wwwroot/api/get_ppids.dspy @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +import json + +result = [] + +try: + dbname = get_module_dbname('pricing') + async with DBPools().sqlorContext(dbname) as sor: + rows = await sor.sqlExe("select id, name from pricing_program order by name", {}) + result = [{'value': r['id'], 'text': r['name']} for r in (rows or [])] +except Exception as e: + pass + +return json.dumps(result, ensure_ascii=False, default=str) diff --git a/wwwroot/api/get_upapps.dspy b/wwwroot/api/get_upapps.dspy index b7a9a02..b75a098 100644 --- a/wwwroot/api/get_upapps.dspy +++ b/wwwroot/api/get_upapps.dspy @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import json -result = {'success': False, 'data': {'upapps': []}} +result = [] try: async with get_sor_context(request._run_ns, 'uapi') as sor: @@ -10,9 +10,8 @@ try: "select id, name from upapp where ownerid = ${ownerid}$ or ownerid is null order by name", {'ownerid': user_orgid} ) - result['data']['upapps'] = [{'id': r['id'], 'text': r['name']} for r in (apps or [])] - result['success'] = True + result = [{'value': r['id'], 'text': r['name']} for r in (apps or [])] except Exception as e: - result['error'] = str(e) + pass return json.dumps(result, ensure_ascii=False, default=str) diff --git a/wwwroot/api/llm_status_update.dspy b/wwwroot/api/llm_status_update.dspy new file mode 100644 index 0000000..12e2e50 --- /dev/null +++ b/wwwroot/api/llm_status_update.dspy @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +import json + +result = {'success': False, 'message': ''} + +try: + dbname = get_module_dbname('llmage') + record_id = params_kw.get('id') + status = params_kw.get('status') + + if not record_id: + result['message'] = '缺少id' + elif status not in ('published', 'unpublished'): + result['message'] = '无效的状态值' + else: + async with DBPools().sqlorContext(dbname) as sor: + await sor.U('llm', {'id': record_id, 'status': status}) + result['success'] = True + result['message'] = '上架成功' if status == 'published' else '下架成功' +except Exception as e: + result['message'] = str(e) + +return json.dumps(result, ensure_ascii=False, default=str) diff --git a/wwwroot/api/uapi_options.dspy b/wwwroot/api/uapi_options.dspy index 04cbb66..09d2f7a 100644 --- a/wwwroot/api/uapi_options.dspy +++ b/wwwroot/api/uapi_options.dspy @@ -1,17 +1,16 @@ #!/usr/bin/env python3 import json -result = {'success': False, 'data': []} +result = [] try: dbname = get_module_dbname('llmage') async with DBPools().sqlorContext(dbname) as sor: rows = await sor.sqlExe("select name, path from uapi order by name", {}) - result['data'] = [{'id': r['name'], 'text': f"{r['name']} ({r['path']})"} for r in (rows or [])] - result['success'] = True + result = [{'value': r['name'], 'text': f"{r['name']} ({r['path']})"} for r in (rows or [])] except Exception as e: - result['error'] = str(e) + pass return json.dumps(result, ensure_ascii=False, default=str) diff --git a/wwwroot/llm_api_map_manage.ui b/wwwroot/llm_api_map_manage.ui index cf8f2e1..1ade2eb 100644 --- a/wwwroot/llm_api_map_manage.ui +++ b/wwwroot/llm_api_map_manage.ui @@ -53,16 +53,14 @@ "name": "llmcatelogid", "label": "选择分类", "uitype": "code", - "dataurl": "{{entire_url('./api/llm_api_map_options.dspy')}}", - "data_field": "catelogs", + "dataurl": "{{entire_url('./api/get_catelogs.dspy')}}", "placeholder": "请选择分类" }, { "name": "apiname", "label": "API接口", "uitype": "code", - "dataurl": "{{entire_url('./api/llm_api_map_options.dspy')}}", - "data_field": "apis", + "dataurl": "{{entire_url('./api/get_apis.dspy')}}", "placeholder": "请选择API接口" }, { @@ -81,8 +79,7 @@ "name": "ppid", "label": "计费项目", "uitype": "code", - "dataurl": "{{entire_url('./api/llm_api_map_options.dspy')}}", - "data_field": "ppids", + "dataurl": "{{entire_url('./api/get_ppids.dspy')}}", "placeholder": "请选择计费项目" } ],