✨ feat: 增加打印信息
This commit is contained in:
@@ -129,9 +129,17 @@ async def detect_file(
|
|||||||
model_name: str,
|
model_name: str,
|
||||||
file: UploadFile = File(...)
|
file: UploadFile = File(...)
|
||||||
):
|
):
|
||||||
|
# 1. 打印 model_name(直接打印字符串即可)
|
||||||
|
print(f"接收到的 model_name: {model_name}")
|
||||||
|
|
||||||
|
# 2. 打印 file 的基本信息(文件名、内容类型等)
|
||||||
|
print(f"文件名: {file.filename}")
|
||||||
|
print(f"文件内容类型: {file.content_type}") # 例如 image/jpeg、text/plain 等
|
||||||
"""Detect objects in an uploaded image file"""
|
"""Detect objects in an uploaded image file"""
|
||||||
global model_manager
|
global model_manager
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if not model_manager:
|
if not model_manager:
|
||||||
raise HTTPException(status_code=500, detail="Model manager not initialized")
|
raise HTTPException(status_code=500, detail="Model manager not initialized")
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
<div @click="router.push('/tool/gen')" title="代码生成" class="right-menu-item hover-effect">
|
<div @click="router.push('/tool/gen')" title="代码生成" class="right-menu-item hover-effect">
|
||||||
<svg-icon icon-class="code" />
|
<svg-icon icon-class="code" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<screenfull id="screenfull" class="right-menu-item hover-effect" />
|
<screenfull id="screenfull" class="right-menu-item hover-effect" />
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,11 @@
|
|||||||
<el-option v-for="dict in task_status" :key="dict.value" :label="dict.label" :value="dict.value" />
|
<el-option v-for="dict in task_status" :key="dict.value" :label="dict.label" :value="dict.value" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item label="模型" prop="modelName">
|
||||||
|
<el-select v-model="queryParams.modelName" placeholder="请选择模型" clearable>
|
||||||
|
<el-option v-for="dict in py_model_manager" :key="dict.value" :label="dict.label" :value="dict.value" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
||||||
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
||||||
@@ -40,7 +45,12 @@
|
|||||||
|
|
||||||
<el-table v-loading="loading" :data="inspectionList" @selection-change="handleSelectionChange">
|
<el-table v-loading="loading" :data="inspectionList" @selection-change="handleSelectionChange">
|
||||||
<el-table-column type="selection" width="55" align="center" />
|
<el-table-column type="selection" width="55" align="center" />
|
||||||
<el-table-column label="任务ID" align="center" prop="taskId" />
|
<!-- <el-table-column label="任务ID" align="center" prop="taskId" /> -->
|
||||||
|
<el-table-column label="模型" align="center" prop="modelName">
|
||||||
|
<template #default="scope">
|
||||||
|
<dict-tag :options="py_model_manager" :value="scope.row.modelName" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column label="任务名称" align="center" prop="taskName" />
|
<el-table-column label="任务名称" align="center" prop="taskName" />
|
||||||
<el-table-column label="设备名称" align="center" prop="deviceName" />
|
<el-table-column label="设备名称" align="center" prop="deviceName" />
|
||||||
<el-table-column label="Cron表达式" align="center" prop="cronExpression" />
|
<el-table-column label="Cron表达式" align="center" prop="cronExpression" />
|
||||||
@@ -90,6 +100,11 @@
|
|||||||
<el-form-item label="任务名称" prop="taskName">
|
<el-form-item label="任务名称" prop="taskName">
|
||||||
<el-input v-model="form.taskName" placeholder="请输入任务名称" />
|
<el-input v-model="form.taskName" placeholder="请输入任务名称" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item label="模型" prop="modelName">
|
||||||
|
<el-select v-model="form.modelName" placeholder="请选择模型" style="width: 100%">
|
||||||
|
<el-option v-for="dict in py_model_manager" :key="dict.value" :label="dict.label" :value="dict.value" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
<el-form-item label="设备" prop="deviceId">
|
<el-form-item label="设备" prop="deviceId">
|
||||||
<el-select v-model="form.deviceId" placeholder="请选择设备" style="width: 100%">
|
<el-select v-model="form.deviceId" placeholder="请选择设备" style="width: 100%">
|
||||||
<el-option v-for="device in deviceList" :key="device.deviceId" :label="device.ip"
|
<el-option v-for="device in deviceList" :key="device.deviceId" :label="device.ip"
|
||||||
@@ -146,7 +161,7 @@ import Crontab from '@/components/Crontab'
|
|||||||
import router from '@/router'
|
import router from '@/router'
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance();
|
||||||
const { sys_normal_disable, task_status } = proxy.useDict('sys_normal_disable', 'task_status');
|
const { sys_normal_disable, task_status, py_model_manager } = proxy.useDict('sys_normal_disable', 'task_status', 'py_model_manager');
|
||||||
|
|
||||||
const inspectionList = ref([]);
|
const inspectionList = ref([]);
|
||||||
const deviceList = ref([]);
|
const deviceList = ref([]);
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
|
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
|
||||||
<el-form-item label="字典标签" prop="dictLabel">
|
<el-form-item label="模型简称" prop="dictLabel">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.dictLabel"
|
v-model="queryParams.dictLabel"
|
||||||
placeholder="请输入字典标签"
|
placeholder="请输入模型简称"
|
||||||
clearable
|
clearable
|
||||||
style="width: 200px"
|
style="width: 200px"
|
||||||
@keyup.enter="handleQuery"
|
@keyup.enter="handleQuery"
|
||||||
@@ -70,15 +70,13 @@
|
|||||||
|
|
||||||
<el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange">
|
<el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange">
|
||||||
<el-table-column type="selection" width="55" align="center" />
|
<el-table-column type="selection" width="55" align="center" />
|
||||||
<el-table-column label="字典编码" align="center" prop="dictCode" />
|
<el-table-column label="模型简称" align="center" prop="dictLabel">
|
||||||
<el-table-column label="字典标签" align="center" prop="dictLabel">
|
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span v-if="(scope.row.listClass == '' || scope.row.listClass == 'default') && (scope.row.cssClass == '' || scope.row.cssClass == null)">{{ scope.row.dictLabel }}</span>
|
<span v-if="(scope.row.listClass == '' || scope.row.listClass == 'default') && (scope.row.cssClass == '' || scope.row.cssClass == null)">{{ scope.row.dictLabel }}</span>
|
||||||
<el-tag v-else :type="scope.row.listClass == 'primary' ? '' : scope.row.listClass" :class="scope.row.cssClass">{{ scope.row.dictLabel }}</el-tag>
|
<el-tag v-else :type="scope.row.listClass == 'primary' ? '' : scope.row.listClass" :class="scope.row.cssClass">{{ scope.row.dictLabel }}</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="字典键值" align="center" prop="dictValue" />
|
<el-table-column label="模型名称" align="center" prop="dictValue" />
|
||||||
<el-table-column label="字典排序" align="center" prop="dictSort" />
|
|
||||||
<el-table-column label="状态" align="center" prop="status">
|
<el-table-column label="状态" align="center" prop="status">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
|
<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
|
||||||
@@ -109,27 +107,11 @@
|
|||||||
<!-- 添加或修改参数配置对话框 -->
|
<!-- 添加或修改参数配置对话框 -->
|
||||||
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
|
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
|
||||||
<el-form ref="dataRef" :model="form" :rules="rules" label-width="80px">
|
<el-form ref="dataRef" :model="form" :rules="rules" label-width="80px">
|
||||||
<el-form-item label="数据标签" prop="dictLabel">
|
<el-form-item label="模型简称" prop="dictLabel">
|
||||||
<el-input v-model="form.dictLabel" placeholder="请输入数据标签" />
|
<el-input v-model="form.dictLabel" placeholder="请输入数据标签" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="数据键值" prop="dictValue">
|
<el-form-item label="模型名称" prop="dictValue">
|
||||||
<el-input v-model="form.dictValue" placeholder="请输入数据键值" />
|
<el-input v-model="form.dictValue" placeholder="请输入模型名称" />
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="样式属性" prop="cssClass">
|
|
||||||
<el-input v-model="form.cssClass" placeholder="请输入样式属性" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="显示排序" prop="dictSort">
|
|
||||||
<el-input-number v-model="form.dictSort" controls-position="right" :min="0" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="回显样式" prop="listClass">
|
|
||||||
<el-select v-model="form.listClass">
|
|
||||||
<el-option
|
|
||||||
v-for="item in listClassOptions"
|
|
||||||
:key="item.value"
|
|
||||||
:label="item.label + '(' + item.value + ')'"
|
|
||||||
:value="item.value"
|
|
||||||
></el-option>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-radio-group v-model="form.status">
|
<el-radio-group v-model="form.status">
|
||||||
|
|||||||
@@ -71,28 +71,23 @@ public class HttpYoloDetector implements YoloDetector {
|
|||||||
byte[] jpgBytes = new byte[(int)(buffer.capacity())];
|
byte[] jpgBytes = new byte[(int)(buffer.capacity())];
|
||||||
buffer.get(jpgBytes);
|
buffer.get(jpgBytes);
|
||||||
buffer.deallocate();
|
buffer.deallocate();
|
||||||
|
|
||||||
// 准备HTTP请求参数
|
// 准备HTTP请求参数
|
||||||
HttpHeaders headers = new HttpHeaders();
|
HttpHeaders headers = new HttpHeaders();
|
||||||
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
|
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
|
||||||
|
|
||||||
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
|
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
|
||||||
// 仅发送文件,model_name 放到查询参数
|
// 1. 添加文件参数(正确)
|
||||||
body.add("file", new CustomByteArrayResource(jpgBytes, "image.jpg"));
|
body.add("file", new CustomByteArrayResource(jpgBytes, "image.jpg"));
|
||||||
|
// 2. 添加 model_name 作为表单参数(关键修改)
|
||||||
|
body.add("model_name", modelName); // 直接添加到表单数据中
|
||||||
|
|
||||||
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
|
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
|
||||||
|
|
||||||
// 将 model_name 作为查询参数
|
// 不需要拼接查询参数,直接使用原始API URL
|
||||||
String urlWithQuery;
|
String url = apiUrl;
|
||||||
try {
|
|
||||||
String encoded = java.net.URLEncoder.encode(modelName, java.nio.charset.StandardCharsets.UTF_8.toString());
|
|
||||||
urlWithQuery = apiUrl + (apiUrl.contains("?") ? "&" : "?") + "model_name=" + encoded;
|
|
||||||
} catch (Exception ex) {
|
|
||||||
urlWithQuery = apiUrl + (apiUrl.contains("?") ? "&" : "?") + "model_name=" + modelName;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 发送请求到Python服务
|
// 发送请求
|
||||||
ResponseEntity<String> response = restTemplate.postForEntity(urlWithQuery, requestEntity, String.class);
|
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
|
||||||
String responseBody = response.getBody();
|
String responseBody = response.getBody();
|
||||||
if (!response.getStatusCode().is2xxSuccessful()) {
|
if (!response.getStatusCode().is2xxSuccessful()) {
|
||||||
log.error("HTTP检测失败: status={}, body={}", response.getStatusCodeValue(), responseBody);
|
log.error("HTTP检测失败: status={}, body={}", response.getStatusCodeValue(), responseBody);
|
||||||
|
|||||||
Reference in New Issue
Block a user