Browse Source

all

yangrongze
hanyuqing 3 months ago
parent
commit
cee265cb47
  1. 36
      controller/BuilderController.py
  2. 46
      controller/GraphController.py
  3. 45
      controller/QAController.py
  4. 13
      controller/__init__.py
  5. 0
      service/BuilderService.py
  6. 15
      vue/src/api/qa.js
  7. 1
      vue/src/components/Menu.vue
  8. 13
      vue/src/system/GraphBuilder.vue
  9. 1
      vue/src/system/GraphDemo.vue
  10. 3
      web_main.py

36
controller/BuilderController.py

@ -0,0 +1,36 @@
# 全局 client(可复用)
import httpx
from robyn import jsonify, Response
from app import app
from controller import client
@app.post("/api/analyze")
async def analyze(request):
body = request.json()
input_text = body.get("text", "").strip()
if not input_text:
return jsonify({"error": "缺少 text 字段"}), 400
try:
# 直接转发到大模型服务(假设它返回 { "task_id": "xxx" })
resp = await client.post(
"/extract_entities_and_relations",
json={"text": input_text},
timeout=1800.0 # 30分钟
)
print(resp)
if resp.status_code == 202 or resp.status_code == 200:
return Response(
status_code=200,
description=jsonify(resp.json()),
headers={"Content-Type": "text/plain; charset=utf-8"}
)
else:
return jsonify({
"error": "提交失败",
"detail": resp.text
}), resp.status_code
except Exception as e:
return jsonify({"error": str(e)}), 500

46
controller/GraphController.py

@ -235,49 +235,3 @@ def health():
# }), response.status_code # }), response.status_code
# 全局 client(可复用)
client = httpx.AsyncClient(base_url="http://192.168.50.113:8088")
@app.post("/api/analyze")
async def analyze(request):
body = request.json()
input_text = body.get("text", "").strip()
if not input_text:
return jsonify({"error": "缺少 text 字段"}), 400
try:
# 直接转发到大模型服务(假设它返回 { "task_id": "xxx" })
resp = await client.post(
"/extract_entities_and_relations",
json={"text": input_text},
timeout=1800.0 # 30分钟
)
print(resp)
if resp.status_code == 202 or resp.status_code == 200:
return Response(
status_code=200,
description=jsonify(resp.json()),
headers={"Content-Type": "text/plain; charset=utf-8"}
)
else:
return jsonify({
"error": "提交失败",
"detail": resp.text
}), resp.status_code
except Exception as e:
return jsonify({"error": str(e)}), 500
@app.get("/api/analyze/status")
async def get_status():
try:
# 直接转发状态查询到大模型服务
resp = await client.get(
"/status",
timeout=5.0
)
return jsonify(resp.json()), resp.status_code
except httpx.ReadTimeout:
return jsonify({"error": "状态查询超时"}), 500
except Exception as e:
return jsonify({"error": str(e)}), 500

45
controller/QAController.py

@ -0,0 +1,45 @@
import json
import traceback
import httpx
from robyn import jsonify, Response
from app import app
from controller.client import client
@app.post("/api/qa/analyze")
async def analyze(request):
body = request.json()
input_text = body.get("text", "").strip()
if not input_text:
return jsonify({"error": "缺少 text 字段"}), 400
try:
# 直接转发到大模型服务(假设它返回 { "task_id": "xxx" })
resp = await client.post(
"/getEntity",
json={"text": input_text},
timeout=1800.0 # 30分钟
)
if resp.status_code == 202 or resp.status_code == 200:
resp_json = resp.json()
resp_json_data = resp_json.get("data",{})
resp_json_data = json.loads(resp_json_data)
entities = resp_json_data.get("entities", [])
return Response(
status_code=200,
description=jsonify(entities),
headers={"Content-Type": "text/plain; charset=utf-8"}
)
else:
return jsonify({
"error": "提交失败",
"detail": resp.text
}), resp.status_code
except Exception as e:
error_trace = traceback.format_exc()
print("❌ 发生异常:")
print(error_trace)
return jsonify({"error": str(e),"traceback": error_trace}), 500

13
controller/__init__.py

@ -0,0 +1,13 @@
# controller/__init__.py
# 导入所有控制器模块(触发其初始化)
from .BuilderController import *
from .GraphController import *
from .LoginController import *
from .QAController import *
# 可选:如果控制器里定义了 blueprint,也可以在这里统一导出
# from .BuilderController import builder_bp
# from .GraphController import graph_bp
# from .LoginController import login_bp

0
service/BuilderService.py

15
vue/src/api/qa.js

@ -0,0 +1,15 @@
// src/api/graph.js
import request from '@/utils/request';
/**
* 获取测试图谱数据固定返回 Disease 及其所有关系
* 后端接口GET /test 无参数
*/
export function qaAnalyze(data) {
return request({
url: '/api/qa/analyze',
method: 'post',
data
});
}

1
vue/src/components/Menu.vue

@ -126,6 +126,7 @@ const handleLogout = () => {
z-index: 100; z-index: 100;
box-shadow: 2px -1px 10px 8px rgb(97 99 100 / 22%); box-shadow: 2px -1px 10px 8px rgb(97 99 100 / 22%);
width: 12%; width: 12%;
flex-shrink: 0; flex-grow: 0;
} }
/* --- 侧边栏 --- */ /* --- 侧边栏 --- */

13
vue/src/system/GraphBuilder.vue

@ -100,6 +100,7 @@
import Menu from "@/components/Menu.vue"; import Menu from "@/components/Menu.vue";
import axios from "axios"; import axios from "axios";
import {analyze, getAIStatus} from "@/api/builder"; import {analyze, getAIStatus} from "@/api/builder";
import {qaAnalyze} from "@/api/qa";
export default { export default {
name: 'QwenChat', name: 'QwenChat',
@ -141,10 +142,13 @@ export default {
// //
this.messages.push({ role: 'user', content: text }); this.messages.push({ role: 'user', content: text });
this.inputText = ''; this.inputText = '';
analyze(data).then(res=>{ // analyze(data).then(res=>{
console.log(res) // console.log(res)
this.messages.push({ role: 'assistant', // this.messages.push({ role: 'assistant',
content: res,entities:res.entities,relations:res.relations,isKG:true }); // content: res,entities:res.entities,relations:res.relations,isKG:true });
// })
qaAnalyze(data).then(res=>{
}) })
}, },
insertPrefix(prefix) { insertPrefix(prefix) {
@ -177,6 +181,7 @@ export default {
<style scoped> <style scoped>
.qwen-chat { .qwen-chat {
flex: 1; overflow: auto;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100vh; height: 100vh;

1
vue/src/system/GraphDemo.vue

@ -884,6 +884,7 @@ button:hover {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
background: #fff; background: #fff;
overflow: auto;
} }
.top-nav { .top-nav {

3
web_main.py

@ -1,6 +1,5 @@
from app import app from app import app
import controller.GraphController import controller
import controller.LoginController
from service.UserService import init_mysql_connection from service.UserService import init_mysql_connection
import os import os

Loading…
Cancel
Save