Merge pull request #2451 from xinnan-tech/manager-model-id

Manager model
This commit is contained in:
欣南科技
2025-11-02 17:16:29 +08:00
committed by GitHub
12 changed files with 44 additions and 31 deletions
@@ -1,14 +1,15 @@
package xiaozhi.common.utils; package xiaozhi.common.utils;
import cn.hutool.json.JSONObject;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.HashMap;
import java.util.Set; import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import cn.hutool.json.JSONObject;
/** /**
* 敏感数据处理工具类 * 敏感数据处理工具类
*/ */
@@ -30,7 +31,7 @@ public class SensitiveDataUtils {
* 隐藏字符串中间部分 * 隐藏字符串中间部分
*/ */
public static String maskMiddle(String value) { public static String maskMiddle(String value) {
if (StringUtils.isBlank(value)) { if (StringUtils.isBlank(value) || value.length() == 1) {
return value; return value;
} }
@@ -13,9 +13,9 @@ public class ModelConfigBodyDTO {
@Serial @Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
// @Schema(description = "模型类型(Memory/ASR/VAD/LLM/TTS)") @Schema(description = "模型ID,未填写将自动生成")
// private String modelType; private String id;
//
@Schema(description = "模型编码(如AliLLM、DoubaoTTS)") @Schema(description = "模型编码(如AliLLM、DoubaoTTS)")
private String modelCode; private String modelCode;
@@ -3,9 +3,7 @@ package xiaozhi.modules.model.entity;
import java.util.Date; import java.util.Date;
import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
@@ -18,7 +16,6 @@ import lombok.Data;
@Schema(description = "模型配置表") @Schema(description = "模型配置表")
public class ModelConfigEntity { public class ModelConfigEntity {
@TableId(type = IdType.ASSIGN_UUID)
@Schema(description = "主键") @Schema(description = "主键")
private String id; private String id;
@@ -11,6 +11,7 @@ import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -252,6 +253,12 @@ public class ModelConfigServiceImpl extends BaseServiceImpl<ModelConfigDao, Mode
if (modelConfigBodyDTO == null) { if (modelConfigBodyDTO == null) {
throw new RenException(ErrorCode.PARAMS_GET_ERROR); throw new RenException(ErrorCode.PARAMS_GET_ERROR);
} }
if (StringUtils.isBlank(modelConfigBodyDTO.getId())) {
// 参照 MP @TableId AutoUUID 策略使用
// com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator(UUID.replace("-",""))
// 进行分配默认模型ID
modelConfigBodyDTO.setId(DefaultIdentifierGenerator.getInstance().nextUUID(ModelConfigEntity.class));
}
} }
/** /**
@@ -47,6 +47,7 @@ export default {
addModel(params, callback) { addModel(params, callback) {
const { modelType, provideCode, formData } = params; const { modelType, provideCode, formData } = params;
const postData = { const postData = {
id: formData.id,
modelCode: formData.modelCode, modelCode: formData.modelCode,
modelName: formData.modelName, modelName: formData.modelName,
isDefault: formData.isDefault ? 1 : 0, isDefault: formData.isDefault ? 1 : 0,
@@ -27,6 +27,12 @@
<div style="height: 2px; background: #e9e9e9; margin-bottom: 22px;"></div> <div style="height: 2px; background: #e9e9e9; margin-bottom: 22px;"></div>
<el-form :model="formData" label-width="100px" label-position="left" class="custom-form"> <el-form :model="formData" label-width="100px" label-position="left" class="custom-form">
<div style="display: flex; gap: 20px; margin-bottom: 0;">
<el-form-item :label="$t('modelConfigDialog.modelId')" prop="id" style="flex: 1;">
<el-input v-model="formData.id" :placeholder="$t('modelConfigDialog.enterModelId')" class="custom-input-bg"
maxlength="32"></el-input>
</el-form-item>
</div>
<div style="display: flex; gap: 20px; margin-bottom: 0;"> <div style="display: flex; gap: 20px; margin-bottom: 0;">
<el-form-item :label="$t('modelConfigDialog.modelName')" prop="modelName" style="flex: 1;"> <el-form-item :label="$t('modelConfigDialog.modelName')" prop="modelName" style="flex: 1;">
<el-input v-model="formData.modelName" :placeholder="$t('modelConfigDialog.enterModelName')" <el-input v-model="formData.modelName" :placeholder="$t('modelConfigDialog.enterModelName')"
@@ -69,16 +75,14 @@
<div style="height: 2px; background: #e9e9e9; margin-bottom: 22px;"></div> <div style="height: 2px; background: #e9e9e9; margin-bottom: 22px;"></div>
<el-form :model="formData.configJson" label-width="auto" label-position="left" class="custom-form"> <el-form :model="formData.configJson" label-width="auto" label-position="left" class="custom-form">
<template v-for="(row, rowIndex) in chunkedCallInfoFields"> <div v-for="(row, rowIndex) in chunkedCallInfoFields" :key="rowIndex"
<div :key="rowIndex" style="display: flex; gap: 20px; margin-bottom: 0;"> style="display: flex; gap: 20px; margin-bottom: 0;">
<el-form-item v-for="field in row" :key="field.prop" :label="field.label" :prop="field.prop" <el-form-item v-for="field in row" :key="field.prop" :label="field.label" :prop="field.prop" style="flex: 1;">
style="flex: 1;"> <el-input v-model="formData.configJson[field.prop]" :placeholder="field.placeholder"
<el-input v-model="formData.configJson[field.prop]" :placeholder="field.placeholder" :type="field.type || 'text'" class="custom-input-bg" :show-password="field.type === 'password'">
:type="field.type || 'text'" class="custom-input-bg" :show-password="field.type === 'password'"> </el-input>
</el-input> </el-form-item>
</el-form-item> </div>
</div>
</template>
</el-form> </el-form>
</div> </div>
@@ -107,6 +111,7 @@ export default {
providerFields: [], providerFields: [],
currentProvider: null, currentProvider: null,
formData: { formData: {
id: '',
modelName: '', modelName: '',
modelCode: '', modelCode: '',
supplier: '', supplier: '',
@@ -202,6 +207,7 @@ export default {
} }
const submitData = { const submitData = {
id: this.formData.id || '',
modelName: this.formData.modelName || '', modelName: this.formData.modelName || '',
modelCode: this.formData.modelCode || '', modelCode: this.formData.modelCode || '',
supplier: this.formData.supplier, supplier: this.formData.supplier,
@@ -230,6 +236,7 @@ export default {
resetForm() { resetForm() {
this.saving = false; this.saving = false;
this.formData = { this.formData = {
id: '',
modelName: '', modelName: '',
modelCode: '', modelCode: '',
supplier: '', supplier: '',
@@ -169,12 +169,12 @@
></i> ></i>
</span> </span>
<el-dropdown-menu slot="dropdown"> <el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="goOtaManagement">
{{ $t("header.otaManagement") }}
</el-dropdown-item>
<el-dropdown-item @click.native="goParamManagement"> <el-dropdown-item @click.native="goParamManagement">
{{ $t("header.paramManagement") }} {{ $t("header.paramManagement") }}
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item @click.native="goOtaManagement">
{{ $t("header.otaManagement") }}
</el-dropdown-item>
<el-dropdown-item @click.native="goDictManagement"> <el-dropdown-item @click.native="goDictManagement">
{{ $t("header.dictManagement") }} {{ $t("header.dictManagement") }}
</el-dropdown-item> </el-dropdown-item>
+2
View File
@@ -841,6 +841,8 @@ export default {
'modelConfigDialog.modelInfo': 'Model Information', 'modelConfigDialog.modelInfo': 'Model Information',
'modelConfigDialog.enable': 'Enable', 'modelConfigDialog.enable': 'Enable',
'modelConfigDialog.setDefault': 'Set as Default', 'modelConfigDialog.setDefault': 'Set as Default',
'modelConfigDialog.modelId': 'Model ID',
'modelConfigDialog.enterModelId': 'If not filled in, it will be generated automatically',
'modelConfigDialog.modelName': 'Model Name', 'modelConfigDialog.modelName': 'Model Name',
'modelConfigDialog.enterModelName': 'Please enter model name', 'modelConfigDialog.enterModelName': 'Please enter model name',
'modelConfigDialog.modelCode': 'Model Code', 'modelConfigDialog.modelCode': 'Model Code',
+2
View File
@@ -841,6 +841,8 @@ export default {
'modelConfigDialog.modelInfo': '模型信息', 'modelConfigDialog.modelInfo': '模型信息',
'modelConfigDialog.enable': '是否启用', 'modelConfigDialog.enable': '是否启用',
'modelConfigDialog.setDefault': '设为默认', 'modelConfigDialog.setDefault': '设为默认',
'modelConfigDialog.modelId': '模型ID',
'modelConfigDialog.enterModelId': '未填写将自动生成模型ID',
'modelConfigDialog.modelName': '模型名称', 'modelConfigDialog.modelName': '模型名称',
'modelConfigDialog.enterModelName': '请输入模型名称', 'modelConfigDialog.enterModelName': '请输入模型名称',
'modelConfigDialog.modelCode': '模型编码', 'modelConfigDialog.modelCode': '模型编码',
+2
View File
@@ -841,6 +841,8 @@ export default {
'modelConfigDialog.modelInfo': '模型信息', 'modelConfigDialog.modelInfo': '模型信息',
'modelConfigDialog.enable': '是否啟用', 'modelConfigDialog.enable': '是否啟用',
'modelConfigDialog.setDefault': '設為默認', 'modelConfigDialog.setDefault': '設為默認',
'modelConfigDialog.modelId': '模型ID',
'modelConfigDialog.enterModelId': '未填冩將自動生成模型ID',
'modelConfigDialog.modelName': '模型名稱', 'modelConfigDialog.modelName': '模型名稱',
'modelConfigDialog.enterModelName': '請輸入模型名稱', 'modelConfigDialog.enterModelName': '請輸入模型名稱',
'modelConfigDialog.modelCode': '模型編碼', 'modelConfigDialog.modelCode': '模型編碼',
-7
View File
@@ -162,13 +162,6 @@ const routes = [
return import('../views/TemplateQuickConfig.vue') return import('../views/TemplateQuickConfig.vue')
} }
}, },
{
path: '/provider-management',
name: 'ProviderManagement',
component: function () {
return import('../views/ProviderManagement.vue')
}
},
] ]
const router = new VueRouter({ const router = new VueRouter({
base: process.env.VUE_APP_PUBLIC_PATH || '/', base: process.env.VUE_APP_PUBLIC_PATH || '/',
@@ -471,6 +471,7 @@ export default {
const id = formData.id; const id = formData.id;
if (this.editModelData.duplicateMode) { if (this.editModelData.duplicateMode) {
formData.id = "";
Api.model.addModel({ modelType, provideCode, formData }, ({ data }) => { Api.model.addModel({ modelType, provideCode, formData }, ({ data }) => {
if (data.code === 0) { if (data.code === 0) {
this.$message.success(this.$t("modelConfig.duplicateSuccess")); this.$message.success(this.$t("modelConfig.duplicateSuccess"));