mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-22 23:23:55 +08:00
feature:实现角色配置
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
package xiaozhi.modules.admin.contrloler;
|
||||
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.Parameters;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import xiaozhi.common.constant.Constant;
|
||||
import xiaozhi.common.page.PageData;
|
||||
import xiaozhi.common.utils.Result;
|
||||
import xiaozhi.common.validator.ValidatorUtils;
|
||||
import xiaozhi.modules.sys.dto.AdminPageUserDTO;
|
||||
import xiaozhi.modules.sys.service.SysUserService;
|
||||
import xiaozhi.modules.sys.vo.AdminPageUserVO;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 管理员控制层
|
||||
*
|
||||
* @author zjy
|
||||
* @since 2025-3-25
|
||||
*/
|
||||
@AllArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/admin")
|
||||
@Tag(name = "管理员管理")
|
||||
public class AdminController {
|
||||
private final SysUserService sysUserService;
|
||||
|
||||
@GetMapping("/users")
|
||||
@Operation(summary = "分页查找用户")
|
||||
@RequiresPermissions("sys:role:superAdmin")
|
||||
@Parameters({
|
||||
@Parameter(name = "mobile", description = "用户手机号码", required = true),
|
||||
@Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true),
|
||||
@Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true),
|
||||
})
|
||||
public Result<PageData<AdminPageUserVO>> pageUser(
|
||||
@Parameter(hidden = true) @RequestParam Map<String, Object> params) {
|
||||
AdminPageUserDTO dto = new AdminPageUserDTO();
|
||||
dto.setMobile((String) params.get("mobile"));
|
||||
dto.setLimit((String) params.get(Constant.LIMIT));
|
||||
dto.setPage((String) params.get("pages"));
|
||||
|
||||
ValidatorUtils.validateEntity(dto);
|
||||
PageData<AdminPageUserVO> page = sysUserService.page(dto);
|
||||
return new Result<PageData<AdminPageUserVO>>().ok(page);
|
||||
}
|
||||
|
||||
@PutMapping("/users/{id}")
|
||||
@Operation(summary = "重置密码")
|
||||
@RequiresPermissions("sys:role:superAdmin")
|
||||
public Result<String> update(
|
||||
@PathVariable Long id) {
|
||||
String password = sysUserService.resetPassword(id);
|
||||
return new Result<String>().ok(password);
|
||||
}
|
||||
|
||||
@DeleteMapping("/users/{id}")
|
||||
@Operation(summary = "用户删除")
|
||||
@RequiresPermissions("sys:role:superAdmin")
|
||||
public Result<Void> delete(@PathVariable Long id) {
|
||||
sysUserService.delete(new Long[]{id});
|
||||
return new Result<>();
|
||||
}
|
||||
|
||||
@GetMapping("/device/all")
|
||||
@Operation(summary = "分页查找设备")
|
||||
@RequiresPermissions("sys:role:superAdmin")
|
||||
@Parameters({
|
||||
@Parameter(name = "keywords", description = "用户手机号码", required = true),
|
||||
@Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true),
|
||||
@Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true),
|
||||
})
|
||||
public Result<Void> pageDevice(
|
||||
@Parameter(hidden = true) @RequestParam Map<String, Object> params) {
|
||||
//TODO 等设备功能模块写好
|
||||
return new Result<Void>().error(600,"等设备功能模块写好");
|
||||
}
|
||||
}
|
||||
+38
-2
@@ -2,6 +2,7 @@ package xiaozhi.modules.agent.controller;
|
||||
|
||||
import cn.hutool.json.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@@ -80,6 +81,40 @@ public class UserAgentController extends BaseController {
|
||||
return new Result<Agent>().ok(agent);
|
||||
}
|
||||
|
||||
@PutMapping("{agentId}")
|
||||
@Operation(summary = "更新智能体")
|
||||
@RequiresPermissions("sys:role:normal")
|
||||
public Result<Agent> updateAgent(@PathVariable String agentId, @RequestBody Agent agent) {
|
||||
UserDetail user = SecurityUser.getUser();
|
||||
if (StringUtils.isBlank(agentId)) {
|
||||
log.error("智能体ID不能为空");
|
||||
return new Result<Agent>().error("更新失败,智能体ID不能为空");
|
||||
}
|
||||
Agent oldAgent = agentService.getById(agentId);
|
||||
if (ObjectUtils.isNull(oldAgent)) {
|
||||
log.error("智能体不存在");
|
||||
return new Result<Agent>().error("更新失败,智能体不存在");
|
||||
} else {
|
||||
UpdateWrapper<Agent> updateWrapper = new UpdateWrapper<>();
|
||||
updateWrapper.eq("id", agentId);
|
||||
updateWrapper.set("agent_code", agent.getAgentCode());
|
||||
updateWrapper.set("asr_model_id", agent.getAsrModelId());
|
||||
updateWrapper.set("intent_model_id", agent.getIntentModelId());
|
||||
updateWrapper.set("llm_model_id", agent.getLlmModelId());
|
||||
updateWrapper.set("memory_model_id", agent.getMemoryModelId());
|
||||
updateWrapper.set("system_prompt", agent.getSystemPrompt());
|
||||
updateWrapper.set("tts_voice_id", agent.getTtsVoiceId());
|
||||
updateWrapper.set("tts_model_id", agent.getTtsModelId());
|
||||
updateWrapper.set("vad_model_id", agent.getVadModelId());
|
||||
updateWrapper.set("updater", user.getId());
|
||||
updateWrapper.set("updated_at", new Date());
|
||||
boolean bool = agentService.update(updateWrapper);
|
||||
if (!bool)
|
||||
return new Result<Agent>().error("更新失败");
|
||||
}
|
||||
return new Result<Agent>().ok(agent);
|
||||
}
|
||||
|
||||
@DeleteMapping("/{agentId}")
|
||||
@Operation(summary = "删除智能体")
|
||||
@RequiresPermissions("sys:role:normal")
|
||||
@@ -113,7 +148,7 @@ public class UserAgentController extends BaseController {
|
||||
UserDetail user = SecurityUser.getUser();
|
||||
List<Agent> agents = agentService.list(new QueryWrapper<Agent>().eq("user_id", user.getId()));
|
||||
List<AgentVO> list = new ArrayList<>();
|
||||
this.convertAgetVOList(list, agents);
|
||||
this.convertAgentVOList(list, agents);
|
||||
return new Result<List<AgentVO>>().ok(list);
|
||||
}
|
||||
|
||||
@@ -129,6 +164,7 @@ public class UserAgentController extends BaseController {
|
||||
return new Result<JSONObject>().error("智能体不存在");
|
||||
}
|
||||
AgentConfigVO agentConfigVO = new AgentConfigVO();
|
||||
agentConfigVO.setPrompt(agent.getSystemPrompt());
|
||||
// return new Result<AgentConfigVO>().ok(agentConfigVO);
|
||||
String json = "{\n" +
|
||||
" \"ASR\": {\n" +
|
||||
@@ -188,7 +224,7 @@ public class UserAgentController extends BaseController {
|
||||
* @param agentVOList 转换后的AgentVO对象列表
|
||||
* @param agentList 原始的Agent对象列表
|
||||
*/
|
||||
private void convertAgetVOList(List<AgentVO> agentVOList, List<Agent> agentList) {
|
||||
private void convertAgentVOList(List<AgentVO> agentVOList, List<Agent> agentList) {
|
||||
// 遍历Agent对象列表
|
||||
for (Agent agent : agentList) {
|
||||
// 创建一个新的AgentVO对象
|
||||
|
||||
@@ -64,7 +64,7 @@ public class Agent implements Serializable {
|
||||
/**
|
||||
* 记忆模型标识
|
||||
*/
|
||||
private String memModelId;
|
||||
private String memoryModelId;
|
||||
|
||||
/**
|
||||
* 意图模型标识
|
||||
|
||||
@@ -59,7 +59,7 @@ public class AgentTemplate implements Serializable {
|
||||
/**
|
||||
* 记忆模型标识
|
||||
*/
|
||||
private String memModelId;
|
||||
private String memoryModelId;
|
||||
|
||||
/**
|
||||
* 意图模型标识
|
||||
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
package xiaozhi.modules.model.controller;public class ModelConfigController {
|
||||
}
|
||||
+99
-121
@@ -1,33 +1,24 @@
|
||||
package xiaozhi.modules.model.controller;
|
||||
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import xiaozhi.common.controller.BaseController;
|
||||
import xiaozhi.common.redis.RedisUtils;
|
||||
import xiaozhi.common.user.UserDetail;
|
||||
import xiaozhi.common.utils.Result;
|
||||
import xiaozhi.modules.device.constant.DeviceConstant;
|
||||
import xiaozhi.modules.device.domain.Device;
|
||||
import xiaozhi.modules.device.service.DeviceService;
|
||||
import xiaozhi.modules.device.utils.CodeGeneratorUtil;
|
||||
import xiaozhi.modules.device.vo.DeviceOtaVO;
|
||||
import xiaozhi.modules.ota.domain.Ota;
|
||||
import xiaozhi.modules.ota.service.OtaService;
|
||||
import xiaozhi.modules.security.user.SecurityUser;
|
||||
import xiaozhi.modules.model.domain.ModelConfig;
|
||||
import xiaozhi.modules.model.domain.TtsVoice;
|
||||
import xiaozhi.modules.model.service.ModelConfigService;
|
||||
import xiaozhi.modules.model.service.TtsVoiceService;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@Slf4j
|
||||
@Tag(name = "模型数据管理")
|
||||
@@ -35,112 +26,99 @@ import java.util.Date;
|
||||
@RestController
|
||||
@RequestMapping("/model/")
|
||||
public class ModelController extends BaseController {
|
||||
private final DeviceService deviceService;
|
||||
private final OtaService otaService;
|
||||
@Resource
|
||||
private RedisUtils redisUtils;
|
||||
|
||||
@CrossOrigin(originPatterns = "*", methods = {RequestMethod.GET, RequestMethod.POST})
|
||||
@RequestMapping(path = "/", method = {RequestMethod.POST, RequestMethod.GET}, produces = "application/json")
|
||||
@Operation(summary = "设备OTA升级")
|
||||
public String ota(@RequestHeader(required = false) HttpHeaders headers, @RequestBody(required = false) JSONObject jsonObject) {
|
||||
log.info("OTA升级请求:header:{},body:{}", headers, jsonObject);
|
||||
if (ObjectUtils.isNull(headers) || StringUtils.isBlank(headers.getFirst("device-id"))) {
|
||||
log.error("设备ID不能为空");
|
||||
return "{\"error\": \"Device ID is required\"}";
|
||||
}
|
||||
|
||||
DeviceOtaVO otaVO = new DeviceOtaVO();
|
||||
Device device = deviceService.getOne(new UpdateWrapper<Device>().eq("mac_address", headers.getFirst("device-id").toUpperCase()).eq("id", headers.getFirst("client-Id").replace("-", "")));
|
||||
if (ObjectUtils.isNull(device)) {
|
||||
// 从 Redis 中获取设备信息
|
||||
Object redisValue = redisUtils.hGet(DeviceConstant.REDIS_KEY_PREFIX_DEVICE_ACTIVATION_MAC, headers.getFirst("device-id").toUpperCase());
|
||||
if (ObjectUtils.isNull(redisValue)) {
|
||||
String code = CodeGeneratorUtil.generateCode(6);
|
||||
log.info("[gen]授权码已广播:{}", code);
|
||||
otaVO.setActivation(new DeviceOtaVO.Activation(code, "youxlife.com\n" + code));
|
||||
redisUtils.hSet(DeviceConstant.REDIS_KEY_PREFIX_DEVICE_ACTIVATION_MAC, headers.getFirst("device-id").toUpperCase(), code, RedisUtils.HOUR_ONE_EXPIRE);
|
||||
redisUtils.hSet(DeviceConstant.REDIS_KEY_PREFIX_DEVICE_ACTIVATION_CODE, code, jsonObject, RedisUtils.HOUR_ONE_EXPIRE);
|
||||
} else {
|
||||
log.warn("[get]授权码已广播:{}", redisValue);
|
||||
otaVO.setActivation(new DeviceOtaVO.Activation(redisValue.toString(), "youxlife.com\n" + redisValue));
|
||||
}
|
||||
}
|
||||
private final TtsVoiceService ttsVoiceService;
|
||||
private final ModelConfigService modelConfigService;
|
||||
|
||||
|
||||
if (ObjectUtils.isNull(device) || device.getAutoUpdate() == 1) {
|
||||
//{"version":"1.0.0","url":"http://https://youxlife.oss-cn-zhangjiakou.aliyuncs.com/v1.4.5.bin"}
|
||||
String board = ObjectUtils.isNull(device)?headers.getFirst("user-agent").split("/")[0]:device.getBoard();
|
||||
Ota ota = otaService.getOne(new UpdateWrapper<Ota>().eq("board", board).eq("is_enabled", 1));
|
||||
if (ObjectUtils.isNull(ota)) {
|
||||
log.warn("OTA升级信息未配置");
|
||||
} else {
|
||||
otaVO.setFirmware(new DeviceOtaVO.Firmware(ota.getAppVersion(), ota.getUrl()));
|
||||
}
|
||||
}
|
||||
|
||||
otaVO.setServer_time(new DeviceOtaVO.ServerTime(new Date().getTime(), 8 * 60));
|
||||
return JSONUtil.toJsonStr(otaVO);
|
||||
@GetMapping("/list")
|
||||
@Operation(summary = "模型配置列表")
|
||||
@RequiresPermissions("sys:role:normal")
|
||||
public Result<List<ModelConfig>> getModelList() {
|
||||
List<ModelConfig> list = modelConfigService.list(new QueryWrapper<ModelConfig>().eq("is_enabled", 1));
|
||||
return new Result<List<ModelConfig>>().ok(list);
|
||||
}
|
||||
|
||||
@GetMapping("/sys/getOtalist")
|
||||
@Operation(summary = "设备OTA列表")
|
||||
@RequiresPermissions("sys:role:superAdmin")
|
||||
public Result<Page<Ota>> getOtalist(@RequestParam Integer pageNo, @RequestParam Integer pageSize) {
|
||||
UserDetail user = SecurityUser.getUser();
|
||||
Page page = new Page<Ota>(pageNo, pageSize);
|
||||
page = otaService.page(page);
|
||||
return new Result<Page<Ota>>().ok(page);
|
||||
}
|
||||
|
||||
@PostMapping("/sys/save")
|
||||
@Operation(summary = "添加设备OTA")
|
||||
@RequiresPermissions("sys:role:superAdmin")
|
||||
public Result<Ota> save(@RequestBody Ota ota) {
|
||||
UserDetail user = SecurityUser.getUser();
|
||||
ota.setCreator(user.getId());
|
||||
ota.setCreateDate(new Date());
|
||||
boolean bool = otaService.save(ota);
|
||||
if (!bool) {
|
||||
return new Result().error("设备OTA添加失败");
|
||||
}
|
||||
return new Result<Ota>().ok(null);
|
||||
}
|
||||
|
||||
@PostMapping("/sys/update")
|
||||
@Operation(summary = "更新设备OTA")
|
||||
@RequiresPermissions("sys:role:superAdmin")
|
||||
public Result<Ota> update(@RequestBody Ota ota) {
|
||||
UserDetail user = SecurityUser.getUser();
|
||||
boolean bool = otaService.update(
|
||||
new UpdateWrapper<Ota>().eq("id", ota.getId())
|
||||
.set("board", ota.getBoard().trim().toLowerCase())
|
||||
.set("app_version", ota.getAppVersion())
|
||||
.set("url", ota.getUrl())
|
||||
.set("is_enabled", ota.getIsEnabled())
|
||||
.set("updater", user.getId())
|
||||
.set("update_date", new Date())
|
||||
);
|
||||
if (!bool) {
|
||||
return new Result().error("设备OTA更新失败");
|
||||
}
|
||||
return new Result<Ota>().ok(null);
|
||||
}
|
||||
|
||||
@PostMapping("/sys/toggleEnabled")
|
||||
@Operation(summary = "切换设备OTA可用状态")
|
||||
@RequiresPermissions("sys:role:superAdmin")
|
||||
public Result<Ota> toggleEnabled(@RequestBody Ota ota) {
|
||||
UserDetail user = SecurityUser.getUser();
|
||||
boolean bool = otaService.update(
|
||||
new UpdateWrapper<Ota>().eq("id", ota.getId())
|
||||
.set("is_enabled", ota.getIsEnabled())
|
||||
.set("updater", user.getId())
|
||||
.set("update_date", new Date())
|
||||
);
|
||||
if (!bool) {
|
||||
return new Result().error("切换设备OTA可用状态失败");
|
||||
}
|
||||
return new Result<Ota>().ok(null);
|
||||
}
|
||||
// private final ModelProviderService modelProviderService;
|
||||
//
|
||||
// private final ModelConfigService modelConfigService;
|
||||
//
|
||||
// @GetMapping("/models/names")
|
||||
// @Operation(summary = "获取所有模型名称")
|
||||
// @RequiresPermissions("sys:role:superAdmin")
|
||||
// public Result<List<String>> getModelNames(@RequestParam String modelType,
|
||||
// @RequestParam(required = false) String modelName) {
|
||||
// List<String> modelNameList = modelConfigService.getModelCodeList(modelType, modelName);
|
||||
// return new Result<List<String>>().ok(modelNameList);
|
||||
// }
|
||||
//
|
||||
// @GetMapping("/{modelType}/provideTypes")
|
||||
// @Operation(summary = "获取模型供应器列表")
|
||||
// @RequiresPermissions("sys:role:superAdmin")
|
||||
// public Result<List<ModelProviderDTO>> getModelProviderList(@PathVariable String modelType) {
|
||||
// List<ModelProviderDTO> modelProviderDTOS = modelProviderService.getListByModelType(modelType);
|
||||
// return new Result<List<ModelProviderDTO>>().ok(modelProviderDTOS);
|
||||
// }
|
||||
//
|
||||
// @GetMapping("/{modelType}/{provideCode}/fields")
|
||||
// @Operation(summary = "获取模型供应器字段")
|
||||
// @RequiresPermissions("sys:role:superAdmin")
|
||||
// public Result<List<String>> getModelProviderFields(@PathVariable String modelType, @PathVariable String provideCode) {
|
||||
// List<String> fieldList = modelProviderService.getFieldList(modelType, provideCode);
|
||||
// return new Result<List<String>>().ok(fieldList);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// @GetMapping("/models/list")
|
||||
// @Operation(summary = "获取模型配置列表")
|
||||
// @RequiresPermissions("sys:role:superAdmin")
|
||||
// public Result<PageData<ModelConfigDTO>> getModelConfigList(@RequestParam String modelType,
|
||||
// @RequestParam(required = false) String modelName,
|
||||
// @RequestParam(required = false, defaultValue = "0") Integer page,
|
||||
// @RequestParam(required = false,defaultValue = "10") Integer limit) {
|
||||
// PageData<ModelConfigDTO> pageList = modelConfigService.getPageList(modelType, modelName, page, limit);
|
||||
// return new Result<PageData<ModelConfigDTO>>().ok(pageList);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// @PostMapping("/models/{modelType}/{provideCode}")
|
||||
// @Operation(summary = "新增模型配置")
|
||||
// @RequiresPermissions("sys:role:superAdmin")
|
||||
// public Result<ModelConfigDTO> addModelConfig(@PathVariable String modelType,
|
||||
// @PathVariable String provideCode,
|
||||
// @RequestBody ModelConfigBodyDTO modelConfigBodyDTO) {
|
||||
// ModelConfigDTO modelConfigDTO = modelConfigService.add(modelType, provideCode, modelConfigBodyDTO);
|
||||
// return new Result<ModelConfigDTO>().ok(modelConfigDTO);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// @PutMapping("/models/{modelType}/{provideCode}/{id}")
|
||||
// @Operation(summary = "编辑模型配置")
|
||||
// @RequiresPermissions("sys:role:superAdmin")
|
||||
// public Result<ModelConfigDTO> editModelConfig(@PathVariable String modelType,
|
||||
// @PathVariable String provideCode,
|
||||
// @PathVariable String id,
|
||||
// @RequestBody ModelConfigBodyDTO modelConfigBodyDTO) {
|
||||
// ModelConfigDTO modelConfigDTO = modelConfigService.edit(modelType, provideCode, id, modelConfigBodyDTO);
|
||||
// return new Result<ModelConfigDTO>().ok(modelConfigDTO);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// @DeleteMapping("/models/{modelType}/{provideCode}/{id}")
|
||||
// @Operation(summary = "删除模型配置")
|
||||
// @RequiresPermissions("sys:role:superAdmin")
|
||||
// public Result<Void> deleteModelConfig(@PathVariable String modelType, @PathVariable String provideCode, @PathVariable String id) {
|
||||
// modelConfigService.delete(modelType, provideCode, id);
|
||||
// return new Result<>();
|
||||
// }
|
||||
//
|
||||
// @GetMapping("/models/{modelName}/voices")
|
||||
// @Operation(summary = "获取模型音色")
|
||||
// @RequiresPermissions("sys:role:normal")
|
||||
// public Result<List<String>> getVoiceList(@PathVariable String modelName,
|
||||
// @RequestParam(required = false) String voiceName) {
|
||||
//
|
||||
// List<String> voiceList = modelConfigService.getVoiceList(modelName, voiceName);
|
||||
// return new Result<List<String>>().ok(voiceList);
|
||||
// }
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
package xiaozhi.modules.model.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import xiaozhi.common.controller.BaseController;
|
||||
import xiaozhi.common.utils.Result;
|
||||
import xiaozhi.modules.model.domain.TtsVoice;
|
||||
import xiaozhi.modules.model.service.ModelConfigService;
|
||||
import xiaozhi.modules.model.service.TtsVoiceService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Slf4j
|
||||
@Tag(name = "模型数据管理")
|
||||
@AllArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/tts")
|
||||
public class TtsController extends BaseController {
|
||||
private final TtsVoiceService ttsVoiceService;
|
||||
private final ModelConfigService modelConfigService;
|
||||
|
||||
@GetMapping("/voice")
|
||||
@Operation(summary = "音色列表")
|
||||
@RequiresPermissions("sys:role:normal")
|
||||
public Result<List<TtsVoice>> getTtsList(@RequestParam(required = false) String ttsModelId) {
|
||||
QueryWrapper<TtsVoice> queryWrapper = new QueryWrapper<>();
|
||||
if (StringUtils.isNotBlank(ttsModelId)) {
|
||||
queryWrapper.eq("ttsModelId", ttsModelId);
|
||||
}
|
||||
List<TtsVoice> list = ttsVoiceService.list(queryWrapper);
|
||||
return new Result<List<TtsVoice>>().ok(list);
|
||||
}
|
||||
|
||||
|
||||
// private final ModelProviderService modelProviderService;
|
||||
//
|
||||
// private final ModelConfigService modelConfigService;
|
||||
//
|
||||
// @GetMapping("/models/names")
|
||||
// @Operation(summary = "获取所有模型名称")
|
||||
// @RequiresPermissions("sys:role:superAdmin")
|
||||
// public Result<List<String>> getModelNames(@RequestParam String modelType,
|
||||
// @RequestParam(required = false) String modelName) {
|
||||
// List<String> modelNameList = modelConfigService.getModelCodeList(modelType, modelName);
|
||||
// return new Result<List<String>>().ok(modelNameList);
|
||||
// }
|
||||
//
|
||||
// @GetMapping("/{modelType}/provideTypes")
|
||||
// @Operation(summary = "获取模型供应器列表")
|
||||
// @RequiresPermissions("sys:role:superAdmin")
|
||||
// public Result<List<ModelProviderDTO>> getModelProviderList(@PathVariable String modelType) {
|
||||
// List<ModelProviderDTO> modelProviderDTOS = modelProviderService.getListByModelType(modelType);
|
||||
// return new Result<List<ModelProviderDTO>>().ok(modelProviderDTOS);
|
||||
// }
|
||||
//
|
||||
// @GetMapping("/{modelType}/{provideCode}/fields")
|
||||
// @Operation(summary = "获取模型供应器字段")
|
||||
// @RequiresPermissions("sys:role:superAdmin")
|
||||
// public Result<List<String>> getModelProviderFields(@PathVariable String modelType, @PathVariable String provideCode) {
|
||||
// List<String> fieldList = modelProviderService.getFieldList(modelType, provideCode);
|
||||
// return new Result<List<String>>().ok(fieldList);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// @GetMapping("/models/list")
|
||||
// @Operation(summary = "获取模型配置列表")
|
||||
// @RequiresPermissions("sys:role:superAdmin")
|
||||
// public Result<PageData<ModelConfigDTO>> getModelConfigList(@RequestParam String modelType,
|
||||
// @RequestParam(required = false) String modelName,
|
||||
// @RequestParam(required = false, defaultValue = "0") Integer page,
|
||||
// @RequestParam(required = false,defaultValue = "10") Integer limit) {
|
||||
// PageData<ModelConfigDTO> pageList = modelConfigService.getPageList(modelType, modelName, page, limit);
|
||||
// return new Result<PageData<ModelConfigDTO>>().ok(pageList);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// @PostMapping("/models/{modelType}/{provideCode}")
|
||||
// @Operation(summary = "新增模型配置")
|
||||
// @RequiresPermissions("sys:role:superAdmin")
|
||||
// public Result<ModelConfigDTO> addModelConfig(@PathVariable String modelType,
|
||||
// @PathVariable String provideCode,
|
||||
// @RequestBody ModelConfigBodyDTO modelConfigBodyDTO) {
|
||||
// ModelConfigDTO modelConfigDTO = modelConfigService.add(modelType, provideCode, modelConfigBodyDTO);
|
||||
// return new Result<ModelConfigDTO>().ok(modelConfigDTO);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// @PutMapping("/models/{modelType}/{provideCode}/{id}")
|
||||
// @Operation(summary = "编辑模型配置")
|
||||
// @RequiresPermissions("sys:role:superAdmin")
|
||||
// public Result<ModelConfigDTO> editModelConfig(@PathVariable String modelType,
|
||||
// @PathVariable String provideCode,
|
||||
// @PathVariable String id,
|
||||
// @RequestBody ModelConfigBodyDTO modelConfigBodyDTO) {
|
||||
// ModelConfigDTO modelConfigDTO = modelConfigService.edit(modelType, provideCode, id, modelConfigBodyDTO);
|
||||
// return new Result<ModelConfigDTO>().ok(modelConfigDTO);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// @DeleteMapping("/models/{modelType}/{provideCode}/{id}")
|
||||
// @Operation(summary = "删除模型配置")
|
||||
// @RequiresPermissions("sys:role:superAdmin")
|
||||
// public Result<Void> deleteModelConfig(@PathVariable String modelType, @PathVariable String provideCode, @PathVariable String id) {
|
||||
// modelConfigService.delete(modelType, provideCode, id);
|
||||
// return new Result<>();
|
||||
// }
|
||||
//
|
||||
// @GetMapping("/models/{modelName}/voices")
|
||||
// @Operation(summary = "获取模型音色")
|
||||
// @RequiresPermissions("sys:role:normal")
|
||||
// public Result<List<String>> getVoiceList(@PathVariable String modelName,
|
||||
// @RequestParam(required = false) String voiceName) {
|
||||
//
|
||||
// List<String> voiceList = modelConfigService.getVoiceList(modelName, voiceName);
|
||||
// return new Result<List<String>>().ok(voiceList);
|
||||
// }
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package xiaozhi.modules.model.dao;
|
||||
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import xiaozhi.common.dao.BaseDao;
|
||||
import xiaozhi.modules.model.entity.ModelConfigEntity;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mapper
|
||||
public interface ModelConfigDao extends BaseDao<ModelConfigEntity> {
|
||||
|
||||
/**
|
||||
* get model_code list
|
||||
*/
|
||||
List<String> getModelCodeList(@Param("modelType") String modelType, @Param("modelName") String modelName);
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package xiaozhi.modules.model.dao;
|
||||
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import xiaozhi.common.dao.BaseDao;
|
||||
import xiaozhi.modules.model.entity.ModelProviderEntity;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mapper
|
||||
public interface ModelProviderDao extends BaseDao<ModelProviderEntity> {
|
||||
|
||||
List<String> getFieldList(@Param("modelType") String modelType, @Param("provideCode") String provideCode);
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package xiaozhi.modules.model.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
|
||||
@Data
|
||||
@Schema(description = "模型供应器/商")
|
||||
public class ModelConfigBodyDTO {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
// @Schema(description = "模型类型(Memory/ASR/VAD/LLM/TTS)")
|
||||
// private String modelType;
|
||||
//
|
||||
@Schema(description = "模型编码(如AliLLM、DoubaoTTS)")
|
||||
private String modelCode;
|
||||
|
||||
@Schema(description = "模型名称")
|
||||
private String modelName;
|
||||
|
||||
@Schema(description = "是否默认配置(0否 1是)")
|
||||
private Integer isDefault;
|
||||
|
||||
@Schema(description = "是否启用")
|
||||
private Integer isEnabled;
|
||||
|
||||
@Schema(description = "模型配置(JSON格式)")
|
||||
private String configJson;
|
||||
|
||||
@Schema(description = "官方文档链接")
|
||||
private String docLink;
|
||||
|
||||
@Schema(description = "备注")
|
||||
private String remark;
|
||||
|
||||
@Schema(description = "排序")
|
||||
private Integer sort;
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package xiaozhi.modules.model.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
@Schema(description = "模型供应器/商")
|
||||
public class ModelConfigDTO implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Schema(description = "主键")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "模型类型(Memory/ASR/VAD/LLM/TTS)")
|
||||
private String modelType;
|
||||
|
||||
@Schema(description = "模型编码(如AliLLM、DoubaoTTS)")
|
||||
private String modelCode;
|
||||
|
||||
@Schema(description = "模型名称")
|
||||
private String modelName;
|
||||
|
||||
@Schema(description = "是否默认配置(0否 1是)")
|
||||
private Integer isDefault;
|
||||
|
||||
@Schema(description = "是否启用")
|
||||
private Integer isEnabled;
|
||||
|
||||
@Schema(description = "模型配置(JSON格式)")
|
||||
private String configJson;
|
||||
|
||||
@Schema(description = "官方文档链接")
|
||||
private String docLink;
|
||||
|
||||
@Schema(description = "备注")
|
||||
private String remark;
|
||||
|
||||
@Schema(description = "排序")
|
||||
private Integer sort;
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package xiaozhi.modules.model.dto;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
@Schema(description = "模型供应器/商")
|
||||
public class ModelProviderDTO implements Serializable {
|
||||
//
|
||||
// @Schema(description = "主键")
|
||||
// private Long id;
|
||||
|
||||
@Schema(description = "模型类型(Memory/ASR/VAD/LLM/TTS)")
|
||||
private String modelType;
|
||||
|
||||
@Schema(description = "供应器类型")
|
||||
private String providerCode;
|
||||
|
||||
@Schema(description = "供应器名称")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "供应器字段列表(JSON格式)")
|
||||
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||
private String fields;
|
||||
|
||||
@Schema(description = "排序")
|
||||
private Integer sort;
|
||||
|
||||
@Schema(description = "创建者")
|
||||
private Long creator;
|
||||
|
||||
@Schema(description = "创建时间")
|
||||
private Date createDate;
|
||||
|
||||
@Schema(description = "更新者")
|
||||
private Long updater;
|
||||
|
||||
@Schema(description = "更新时间")
|
||||
private Date updateDate;
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
package xiaozhi.modules.model.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
@Data
|
||||
@TableName("ai_model_config")
|
||||
@Schema(description = "模型配置表")
|
||||
public class ModelConfigEntity {
|
||||
|
||||
@TableId(type = IdType.ASSIGN_UUID)
|
||||
@Schema(description = "主键")
|
||||
private String id;
|
||||
|
||||
@Schema(description = "模型类型(Memory/ASR/VAD/LLM/TTS)")
|
||||
private String modelType;
|
||||
|
||||
@Schema(description = "模型编码(如AliLLM、DoubaoTTS)")
|
||||
private String modelCode;
|
||||
|
||||
@Schema(description = "模型名称")
|
||||
private String modelName;
|
||||
|
||||
@Schema(description = "是否默认配置(0否 1是)")
|
||||
private Integer isDefault;
|
||||
|
||||
@Schema(description = "是否启用")
|
||||
private Integer isEnabled;
|
||||
|
||||
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||
@Schema(description = "模型配置(JSON格式)")
|
||||
private String configJson;
|
||||
|
||||
@Schema(description = "官方文档链接")
|
||||
private String docLink;
|
||||
|
||||
@Schema(description = "备注")
|
||||
private String remark;
|
||||
|
||||
@Schema(description = "排序")
|
||||
private Integer sort;
|
||||
|
||||
@Schema(description = "创建者")
|
||||
private Long creator;
|
||||
|
||||
@Schema(description = "创建时间")
|
||||
private Date createDate;
|
||||
|
||||
@Schema(description = "更新者")
|
||||
private Long updater;
|
||||
|
||||
@Schema(description = "更新时间")
|
||||
private Date updateDate;
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package xiaozhi.modules.model.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
@TableName("ai_model_provider")
|
||||
@Schema(description = "模型供应器表")
|
||||
public class ModelProviderEntity {
|
||||
|
||||
@TableId(type = IdType.ASSIGN_UUID)
|
||||
@Schema(description = "主键")
|
||||
private String id;
|
||||
|
||||
@Schema(description = "模型类型(Memory/ASR/VAD/LLM/TTS)")
|
||||
private String modelType;
|
||||
|
||||
@Schema(description = "供应器类型,如 openai、")
|
||||
private String providerCode;
|
||||
|
||||
@Schema(description = "供应器名称")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "供应器字段列表(JSON格式)")
|
||||
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||
private String fields;
|
||||
|
||||
@Schema(description = "排序")
|
||||
private Integer sort;
|
||||
|
||||
@Schema(description = "创建者")
|
||||
private Long creator;
|
||||
|
||||
@Schema(description = "创建时间")
|
||||
private Date createDate;
|
||||
|
||||
@Schema(description = "更新者")
|
||||
private Long updater;
|
||||
|
||||
@Schema(description = "更新时间")
|
||||
private Date updateDate;
|
||||
}
|
||||
+24
-13
@@ -1,13 +1,24 @@
|
||||
package xiaozhi.modules.model.service;
|
||||
|
||||
import xiaozhi.modules.model.domain.ModelConfig;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
/**
|
||||
* @author chenerlei
|
||||
* @description 针对表【ai_model_config(模型配置表)】的数据库操作Service
|
||||
* @createDate 2025-03-22 15:31:57
|
||||
*/
|
||||
public interface ModelConfigService extends IService<ModelConfig> {
|
||||
|
||||
}
|
||||
package xiaozhi.modules.model.service;
|
||||
|
||||
import xiaozhi.modules.model.domain.ModelConfig;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
/**
|
||||
* @author chenerlei
|
||||
* @description 针对表【ai_model_config(模型配置表)】的数据库操作Service
|
||||
* @createDate 2025-03-22 15:31:57
|
||||
*/
|
||||
public interface ModelConfigService extends IService<ModelConfig> {
|
||||
|
||||
// List<String> getModelCodeList(String modelType, String modelName);
|
||||
//
|
||||
// PageData<ModelConfigDTO> getPageList(String modelType, String modelName, Integer page, Integer limit);
|
||||
//
|
||||
// ModelConfigDTO add(String modelType, String provideCode, ModelConfigBodyDTO modelConfigBodyDTO);
|
||||
//
|
||||
// ModelConfigDTO edit(String modelType, String provideCode, String id, ModelConfigBodyDTO modelConfigBodyDTO);
|
||||
//
|
||||
// void delete(String modelType, String provideCode, String id);
|
||||
//
|
||||
// List<String> getVoiceList(String modelName, String voiceName);
|
||||
}
|
||||
|
||||
+26
-13
@@ -1,13 +1,26 @@
|
||||
package xiaozhi.modules.model.service;
|
||||
|
||||
import xiaozhi.modules.model.domain.ModelProvider;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
/**
|
||||
* @author chenerlei
|
||||
* @description 针对表【ai_model_provider(模型配置表)】的数据库操作Service
|
||||
* @createDate 2025-03-24 18:24:13
|
||||
*/
|
||||
public interface ModelProviderService extends IService<ModelProvider> {
|
||||
|
||||
}
|
||||
package xiaozhi.modules.model.service;
|
||||
|
||||
import xiaozhi.modules.model.domain.ModelProvider;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
/**
|
||||
* @author chenerlei
|
||||
* @description 针对表【ai_model_provider(模型配置表)】的数据库操作Service
|
||||
* @createDate 2025-03-24 18:24:13
|
||||
*/
|
||||
public interface ModelProviderService extends IService<ModelProvider> {
|
||||
|
||||
//// List<String> getModelNames(String modelType, String modelName);
|
||||
//
|
||||
// List<ModelProviderDTO> getListByModelType(String modelType);
|
||||
//
|
||||
// ModelProviderDTO add(ModelProviderEntity modelProviderEntity);
|
||||
//
|
||||
// ModelProviderDTO edit(ModelProviderEntity modelProviderEntity);
|
||||
//
|
||||
// void delete();
|
||||
//
|
||||
// List<ModelProviderDTO> getList(String modelType, String provideCode);
|
||||
//
|
||||
// List<String> getFieldList(String modelType, String provideCode);
|
||||
}
|
||||
|
||||
+113
-22
@@ -1,22 +1,113 @@
|
||||
package xiaozhi.modules.model.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import xiaozhi.modules.model.domain.ModelConfig;
|
||||
import xiaozhi.modules.model.service.ModelConfigService;
|
||||
import xiaozhi.modules.model.mapper.ModelConfigMapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* @author chenerlei
|
||||
* @description 针对表【ai_model_config(模型配置表)】的数据库操作Service实现
|
||||
* @createDate 2025-03-22 15:31:57
|
||||
*/
|
||||
@Service
|
||||
public class ModelConfigServiceImpl extends ServiceImpl<ModelConfigMapper, ModelConfig>
|
||||
implements ModelConfigService{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
package xiaozhi.modules.model.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import xiaozhi.modules.model.domain.ModelConfig;
|
||||
import xiaozhi.modules.model.service.ModelConfigService;
|
||||
import xiaozhi.modules.model.mapper.ModelConfigMapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* @author chenerlei
|
||||
* @description 针对表【ai_model_config(模型配置表)】的数据库操作Service实现
|
||||
* @createDate 2025-03-22 15:31:57
|
||||
*/
|
||||
@Service
|
||||
public class ModelConfigServiceImpl extends ServiceImpl<ModelConfigMapper, ModelConfig>
|
||||
implements ModelConfigService{
|
||||
|
||||
// private final ModelConfigDao modelConfigDao;
|
||||
// private final ModelProviderService modelProviderService;
|
||||
// private final TimbreService timbreService;
|
||||
//
|
||||
// private static final Logger logger = LoggerFactory.getLogger(ModelConfigServiceImpl.class);
|
||||
//
|
||||
// @Override
|
||||
// public List<String> getModelCodeList(String modelType, String modelName) {
|
||||
// return modelConfigDao.getModelCodeList(modelType, modelName);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public PageData<ModelConfigDTO> getPageList(String modelType, String modelName, Integer page, Integer limit) {
|
||||
// Map<String, Object> params = new HashMap<String, Object>();
|
||||
// params.put(Constant.PAGE, page);
|
||||
// params.put(Constant.LIMIT, limit);
|
||||
// IPage<ModelConfigEntity> modelConfigEntityIPage = modelConfigDao.selectPage(
|
||||
// getPage(params, "sort", true),
|
||||
// new QueryWrapper<ModelConfigEntity>()
|
||||
// .eq("model_type", modelType)
|
||||
// .like(StringUtils.isNotBlank(modelName), "model_name", modelName)
|
||||
// );
|
||||
// return getPageData(modelConfigEntityIPage, ModelConfigDTO.class);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public ModelConfigDTO add(String modelType, String provideCode, ModelConfigBodyDTO modelConfigBodyDTO) {
|
||||
// // 先验证有没有供应器
|
||||
// if (StringUtils.isBlank(modelType) || StringUtils.isBlank(provideCode)) {
|
||||
// throw new RenException("modelType和provideCode不能为空");
|
||||
// }
|
||||
// List<ModelProviderDTO> providerList = modelProviderService.getList(modelType, provideCode);
|
||||
// if (CollectionUtil.isEmpty(providerList)) {
|
||||
// throw new RenException("供应器不存在");
|
||||
// }
|
||||
//
|
||||
// // 再保存供应器提供的模型
|
||||
// ModelConfigEntity modelConfigEntity = ConvertUtils.sourceToTarget(modelConfigBodyDTO, ModelConfigEntity.class);
|
||||
// modelConfigEntity.setModelType(modelType);
|
||||
// modelConfigDao.insert(modelConfigEntity);
|
||||
// return ConvertUtils.sourceToTarget(modelConfigEntity, ModelConfigDTO.class);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public ModelConfigDTO edit(String modelType, String provideCode, String id, ModelConfigBodyDTO modelConfigBodyDTO) {
|
||||
// // 先验证有没有供应器
|
||||
// if (StringUtils.isBlank(modelType) || StringUtils.isBlank(provideCode)) {
|
||||
// throw new RenException("modelType和provideCode不能为空");
|
||||
// }
|
||||
// List<ModelProviderDTO> providerList = modelProviderService.getList(modelType, provideCode);
|
||||
// if (CollectionUtil.isEmpty(providerList)) {
|
||||
// throw new RenException("供应器不存在");
|
||||
// }
|
||||
//
|
||||
// // 再更新供应器提供的模型
|
||||
// ModelConfigEntity modelConfigEntity = ConvertUtils.sourceToTarget(modelConfigBodyDTO, ModelConfigEntity.class);
|
||||
// modelConfigEntity.setId(id);
|
||||
// modelConfigEntity.setModelType(modelType);
|
||||
// modelConfigDao.updateById(modelConfigEntity);
|
||||
// return ConvertUtils.sourceToTarget(modelConfigEntity, ModelConfigDTO.class);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void delete(String modelType, String provideCode, String id) {
|
||||
// // 先验证有没有供应器
|
||||
// if (StringUtils.isBlank(modelType) || StringUtils.isBlank(provideCode)) {
|
||||
// throw new RenException("modelType和provideCode不能为空");
|
||||
// }
|
||||
// List<ModelProviderDTO> providerList = modelProviderService.getList(modelType, provideCode);
|
||||
// if (CollectionUtil.isEmpty(providerList)) {
|
||||
// throw new RenException("供应器不存在");
|
||||
// }
|
||||
//
|
||||
// modelConfigDao.deleteById(Long.getLong(id));
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public List<String> getVoiceList(String modelName, String voiceName) {
|
||||
// QueryWrapper<ModelConfigEntity> queryWrapper = new QueryWrapper<>();
|
||||
// queryWrapper.eq("model_name", StringUtils.isBlank(modelName) ? "" : modelName);
|
||||
// queryWrapper.eq("model_type", "TTS");
|
||||
// List<ModelConfigEntity> modelConfigEntities = modelConfigDao.selectList(queryWrapper);
|
||||
// if (CollectionUtil.isEmpty(modelConfigEntities)) {
|
||||
// logger.warn("没有找到模型配置信息");
|
||||
// return null;
|
||||
// }
|
||||
// ModelConfigEntity modelConfigEntity = modelConfigEntities.get(0);
|
||||
// String id = modelConfigEntity.getId();
|
||||
//
|
||||
// return timbreService.getVoiceNames(id, voiceName);
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+61
-22
@@ -1,22 +1,61 @@
|
||||
package xiaozhi.modules.model.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import xiaozhi.modules.model.domain.ModelProvider;
|
||||
import xiaozhi.modules.model.service.ModelProviderService;
|
||||
import xiaozhi.modules.model.mapper.ModelProviderMapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* @author chenerlei
|
||||
* @description 针对表【ai_model_provider(模型配置表)】的数据库操作Service实现
|
||||
* @createDate 2025-03-24 18:24:13
|
||||
*/
|
||||
@Service
|
||||
public class ModelProviderServiceImpl extends ServiceImpl<ModelProviderMapper, ModelProvider>
|
||||
implements ModelProviderService{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
package xiaozhi.modules.model.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import xiaozhi.modules.model.domain.ModelProvider;
|
||||
import xiaozhi.modules.model.service.ModelProviderService;
|
||||
import xiaozhi.modules.model.mapper.ModelProviderMapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* @author chenerlei
|
||||
* @description 针对表【ai_model_provider(模型配置表)】的数据库操作Service实现
|
||||
* @createDate 2025-03-24 18:24:13
|
||||
*/
|
||||
@Service
|
||||
public class ModelProviderServiceImpl extends ServiceImpl<ModelProviderMapper, ModelProvider>
|
||||
implements ModelProviderService{
|
||||
|
||||
// private final ModelProviderDao modelProviderDao;
|
||||
//
|
||||
// @Override
|
||||
// public List<ModelProviderDTO> getListByModelType(String modelType) {
|
||||
//
|
||||
// QueryWrapper<ModelProviderEntity> queryWrapper = new QueryWrapper<>();
|
||||
// queryWrapper.eq("model_type", StringUtils.isBlank(modelType) ? "" : modelType);
|
||||
// List<ModelProviderEntity> providerEntities = modelProviderDao.selectList(queryWrapper);
|
||||
// return ConvertUtils.sourceToTarget(providerEntities, ModelProviderDTO.class);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public ModelProviderDTO add(ModelProviderEntity modelProviderEntity) {
|
||||
// return null;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public ModelProviderDTO edit(ModelProviderEntity modelProviderEntity) {
|
||||
// return null;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void delete() {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public List<ModelProviderDTO> getList(String modelType, String provideCode) {
|
||||
// QueryWrapper<ModelProviderEntity> queryWrapper = new QueryWrapper<>();
|
||||
// queryWrapper.eq("model_type", StringUtils.isBlank(modelType) ? "" : modelType);
|
||||
// queryWrapper.eq("provide_code", StringUtils.isBlank(provideCode) ? "" : provideCode);
|
||||
// List<ModelProviderEntity> providerEntities = modelProviderDao.selectList(queryWrapper);
|
||||
// return ConvertUtils.sourceToTarget(providerEntities, ModelProviderDTO.class);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public List<String> getFieldList(String modelType, String provideCode) {
|
||||
// return modelProviderDao.getFieldList(modelType, provideCode);
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -8,6 +8,8 @@ import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.shiro.authc.AuthenticationException;
|
||||
import org.apache.shiro.authc.AuthenticationToken;
|
||||
import org.apache.shiro.web.filter.authc.AuthenticatingFilter;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import xiaozhi.common.constant.Constant;
|
||||
import xiaozhi.common.exception.ErrorCode;
|
||||
@@ -24,12 +26,15 @@ import java.io.IOException;
|
||||
*/
|
||||
public class Oauth2Filter extends AuthenticatingFilter {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(Oauth2Filter.class);
|
||||
|
||||
@Override
|
||||
protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) throws Exception {
|
||||
//获取请求token
|
||||
String token = getRequestToken((HttpServletRequest) request);
|
||||
|
||||
if (StringUtils.isBlank(token)) {
|
||||
logger.warn("createToken:token is empty");
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -49,7 +54,15 @@ public class Oauth2Filter extends AuthenticatingFilter {
|
||||
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
|
||||
//获取请求token,如果token不存在,直接返回401
|
||||
String token = getRequestToken((HttpServletRequest) request);
|
||||
|
||||
// TODO 调试接口,临时取消登录限制,需要 token 参数的除外
|
||||
// if (true) {
|
||||
// return true;
|
||||
// }
|
||||
|
||||
if (StringUtils.isBlank(token)) {
|
||||
logger.warn("onAccessDenied:token is empty");
|
||||
|
||||
HttpServletResponse httpResponse = (HttpServletResponse) response;
|
||||
httpResponse.setContentType("application/json;charset=utf-8");
|
||||
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
|
||||
@@ -73,13 +86,14 @@ public class Oauth2Filter extends AuthenticatingFilter {
|
||||
httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtils.getOrigin());
|
||||
try {
|
||||
//处理登录失败的异常
|
||||
logger.error("onLoginFailure:登录失败!", e);
|
||||
Throwable throwable = e.getCause() == null ? e : e.getCause();
|
||||
Result r = new Result().error(ErrorCode.UNAUTHORIZED, throwable.getMessage());
|
||||
|
||||
String json = JsonUtils.toJsonString(r);
|
||||
httpResponse.getWriter().print(json);
|
||||
} catch (IOException e1) {
|
||||
|
||||
logger.error("onLoginFailure:登录失败! msg:{}", e1.getMessage(), e1);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
+4
@@ -4,8 +4,11 @@ import com.google.common.cache.Cache;
|
||||
import com.google.common.cache.CacheBuilder;
|
||||
import com.wf.captcha.SpecCaptcha;
|
||||
import com.wf.captcha.base.Captcha;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import xiaozhi.common.redis.RedisKeys;
|
||||
import xiaozhi.common.redis.RedisUtils;
|
||||
import xiaozhi.modules.security.oauth2.Oauth2Realm;
|
||||
import xiaozhi.modules.security.service.CaptchaService;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
@@ -29,6 +32,7 @@ public class CaptchaServiceImpl implements CaptchaService {
|
||||
* Local Cache 5分钟过期
|
||||
*/
|
||||
Cache<String, String> localCache = CacheBuilder.newBuilder().maximumSize(1000).expireAfterAccess(5, TimeUnit.MINUTES).build();
|
||||
private static final Logger logger = LoggerFactory.getLogger(Oauth2Realm.class);
|
||||
|
||||
@Override
|
||||
public void create(HttpServletResponse response, String uuid) throws IOException {
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
package xiaozhi.modules.sys.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 管理员分页用户的参数DTO
|
||||
* @author zjy
|
||||
* @since 2025-3-21
|
||||
*/
|
||||
@Data
|
||||
@Schema(description = "音色分页参数")
|
||||
public class AdminPageUserDTO {
|
||||
|
||||
|
||||
@Schema(description = "手机号码")
|
||||
private String mobile;
|
||||
|
||||
@Schema(description = "页数")
|
||||
private String page;
|
||||
|
||||
@Schema(description = "显示列数")
|
||||
private String limit;
|
||||
}
|
||||
@@ -1,9 +1,12 @@
|
||||
package xiaozhi.modules.sys.service;
|
||||
|
||||
import xiaozhi.common.page.PageData;
|
||||
import xiaozhi.common.service.BaseService;
|
||||
import xiaozhi.modules.sys.dto.AdminPageUserDTO;
|
||||
import xiaozhi.modules.sys.dto.PasswordDTO;
|
||||
import xiaozhi.modules.sys.dto.SysUserDTO;
|
||||
import xiaozhi.modules.sys.entity.SysUserEntity;
|
||||
import xiaozhi.modules.sys.vo.AdminPageUserVO;
|
||||
|
||||
|
||||
/**
|
||||
@@ -19,5 +22,30 @@ public interface SysUserService extends BaseService<SysUserEntity> {
|
||||
|
||||
void delete(Long[] ids);
|
||||
|
||||
/**
|
||||
* 验证是否允许修改密码更改
|
||||
* @param userId 用户id
|
||||
* @param passwordDTO 验证密码的参数
|
||||
*/
|
||||
void changePassword(Long userId, PasswordDTO passwordDTO);
|
||||
|
||||
/**
|
||||
* 直接修改密码,不需要验证
|
||||
* @param userId 用户id
|
||||
* @param password 密码
|
||||
*/
|
||||
void changePasswordDirectly(Long userId, String password);
|
||||
|
||||
/**
|
||||
* 重置密码
|
||||
* @param userId 用户id
|
||||
* @return 随机生成符合规范的密码
|
||||
*/
|
||||
String resetPassword(Long userId);
|
||||
/**
|
||||
* 管理员分页用户信息
|
||||
* @param dto 分页查找参数
|
||||
* @return 用户列表分页数据
|
||||
*/
|
||||
PageData<AdminPageUserVO> page(AdminPageUserDTO dto);
|
||||
}
|
||||
|
||||
+63
-2
@@ -1,23 +1,28 @@
|
||||
package xiaozhi.modules.sys.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import xiaozhi.common.constant.Constant;
|
||||
import xiaozhi.common.exception.ErrorCode;
|
||||
import xiaozhi.common.exception.RenException;
|
||||
import xiaozhi.common.page.PageData;
|
||||
import xiaozhi.common.service.impl.BaseServiceImpl;
|
||||
import xiaozhi.common.utils.ConvertUtils;
|
||||
import xiaozhi.modules.security.password.PasswordUtils;
|
||||
import xiaozhi.modules.sys.dao.SysUserDao;
|
||||
import xiaozhi.modules.sys.dto.AdminPageUserDTO;
|
||||
import xiaozhi.modules.sys.dto.PasswordDTO;
|
||||
import xiaozhi.modules.sys.dto.SysUserDTO;
|
||||
import xiaozhi.modules.sys.entity.SysUserEntity;
|
||||
import xiaozhi.modules.sys.enums.SuperAdminEnum;
|
||||
import xiaozhi.modules.sys.service.SysUserService;
|
||||
import xiaozhi.modules.sys.vo.AdminPageUserVO;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@@ -80,9 +85,11 @@ public class SysUserServiceImpl extends BaseServiceImpl<SysUserDao, SysUserEntit
|
||||
public void delete(Long[] ids) {
|
||||
//删除用户
|
||||
baseDao.deleteBatchIds(Arrays.asList(ids));
|
||||
//TODO 除了要删除用户还要删除用户关联的设备,对话,智能体。等此3个功能完善在添加
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void changePassword(Long userId, PasswordDTO passwordDTO) {
|
||||
SysUserEntity sysUserEntity = sysUserDao.selectById(userId);
|
||||
|
||||
@@ -107,11 +114,50 @@ public class SysUserServiceImpl extends BaseServiceImpl<SysUserDao, SysUserEntit
|
||||
updateById(sysUserEntity);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void changePasswordDirectly(Long userId, String password) {
|
||||
SysUserEntity sysUserEntity = new SysUserEntity();
|
||||
sysUserEntity.setId(userId);
|
||||
sysUserEntity.setPassword(PasswordUtils.encode(password));
|
||||
updateById(sysUserEntity);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public String resetPassword(Long userId) {
|
||||
String password = generatePassword();
|
||||
changePasswordDirectly(userId,password);
|
||||
return password;
|
||||
}
|
||||
|
||||
private Long getUserCount() {
|
||||
QueryWrapper<SysUserEntity> queryWrapper = new QueryWrapper<>();
|
||||
return baseDao.selectCount(queryWrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageData<AdminPageUserVO> page(AdminPageUserDTO dto) {
|
||||
Map<String, Object> params = new HashMap<String, Object>();
|
||||
params.put(Constant.PAGE, dto.getPage());
|
||||
params.put(Constant.LIMIT,dto.getLimit());
|
||||
IPage<SysUserEntity> page = baseDao.selectPage(
|
||||
getPage(params, "id", true),
|
||||
//定义查询条件
|
||||
new QueryWrapper<SysUserEntity>()
|
||||
//必须按照手机号码查找
|
||||
.eq(StringUtils.isNotBlank(dto.getMobile()),"username",dto.getMobile()));
|
||||
List<AdminPageUserVO> list = page.getRecords().stream().map(user -> {
|
||||
AdminPageUserVO adminPageUserVO = new AdminPageUserVO();
|
||||
adminPageUserVO.setUserid(user.getId().toString());
|
||||
adminPageUserVO.setMobile(user.getUsername());
|
||||
//TODO 2. 等设备功能写好,获取对应数据
|
||||
adminPageUserVO.setDeviceCount("0");
|
||||
return adminPageUserVO;
|
||||
}).toList();
|
||||
return new PageData<>(list, page.getTotal());
|
||||
}
|
||||
|
||||
private boolean isStrongPassword(String password) {
|
||||
// 弱密码的正则表达式
|
||||
@@ -120,4 +166,19 @@ public class SysUserServiceImpl extends BaseServiceImpl<SysUserDao, SysUserEntit
|
||||
Matcher matcher = pattern.matcher(password);
|
||||
return matcher.matches();
|
||||
}
|
||||
|
||||
private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()";
|
||||
private static final Random random = new Random();
|
||||
/**
|
||||
* 生成随机密码
|
||||
* @return 随机生成的密码
|
||||
*/
|
||||
private String generatePassword(){
|
||||
StringBuilder password = new StringBuilder();
|
||||
for (int i = 0; i < 10; i++) {
|
||||
int randomIndex = random.nextInt(CHARACTERS.length());
|
||||
password.append(CHARACTERS.charAt(randomIndex));
|
||||
}
|
||||
return password.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
package xiaozhi.modules.sys.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 管理员分页展示用户的VO
|
||||
* @ zjy
|
||||
* @since 2025-3-25
|
||||
*/
|
||||
@Data
|
||||
public class AdminPageUserVO {
|
||||
|
||||
@Schema(description = "设备数量")
|
||||
private String deviceCount;
|
||||
|
||||
@Schema(description = "手机号码")
|
||||
private String mobile;
|
||||
|
||||
@Schema(description = "用户id")
|
||||
private String userid;
|
||||
}
|
||||
@@ -7,6 +7,8 @@ import xiaozhi.modules.timbre.dto.TimbrePageDTO;
|
||||
import xiaozhi.modules.timbre.entity.TimbreEntity;
|
||||
import xiaozhi.modules.timbre.vo.TimbreDetailsVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* 音色的业务层的定义
|
||||
@@ -46,4 +48,6 @@ public interface TimbreService extends BaseService<TimbreEntity> {
|
||||
* @param ids 需要被删除的音色id列表
|
||||
*/
|
||||
void delete(Long[] ids);
|
||||
|
||||
List<String> getVoiceNames(String ttsModelId, String voiceName);
|
||||
}
|
||||
+21
-1
@@ -1,7 +1,9 @@
|
||||
package xiaozhi.modules.timbre.service.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@@ -12,12 +14,13 @@ import xiaozhi.common.utils.ConvertUtils;
|
||||
import xiaozhi.modules.timbre.dao.TimbreDao;
|
||||
import xiaozhi.modules.timbre.dto.TimbreDataDTO;
|
||||
import xiaozhi.modules.timbre.dto.TimbrePageDTO;
|
||||
import xiaozhi.modules.timbre.service.TimbreService;
|
||||
import xiaozhi.modules.timbre.entity.TimbreEntity;
|
||||
import xiaozhi.modules.timbre.service.TimbreService;
|
||||
import xiaozhi.modules.timbre.vo.TimbreDetailsVO;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@@ -25,9 +28,11 @@ import java.util.Map;
|
||||
* @author zjy
|
||||
* @since 2025-3-21
|
||||
*/
|
||||
@AllArgsConstructor
|
||||
@Service
|
||||
public class TimbreServiceImpl extends BaseServiceImpl<TimbreDao, TimbreEntity> implements TimbreService {
|
||||
|
||||
private final TimbreDao timbreDao;
|
||||
|
||||
@Override
|
||||
public PageData<TimbreDetailsVO> page(TimbrePageDTO dto) {
|
||||
@@ -76,6 +81,21 @@ public class TimbreServiceImpl extends BaseServiceImpl<TimbreDao, TimbreEntity>
|
||||
baseDao.deleteBatchIds(Arrays.asList(ids));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getVoiceNames(String ttsModelId, String voiceName) {
|
||||
QueryWrapper<TimbreEntity> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("ttsModelId", StringUtils.isBlank(ttsModelId) ? "" : ttsModelId);
|
||||
if (StringUtils.isNotBlank(voiceName)) {
|
||||
queryWrapper.like("name", voiceName);
|
||||
}
|
||||
List<TimbreEntity> timbreEntities = timbreDao.selectList(queryWrapper);
|
||||
if (CollectionUtil.isEmpty(timbreEntities)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return timbreEntities.stream().map(TimbreEntity::getName).toList();
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理是不是tts模型的id
|
||||
*/
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<result property="llmModelId" column="llm_model_id" />
|
||||
<result property="ttsModelId" column="tts_model_id" />
|
||||
<result property="ttsVoiceId" column="tts_voice_id" />
|
||||
<result property="memModelId" column="mem_model_id" />
|
||||
<result property="memoryModelId" column="memory_model_id" />
|
||||
<result property="intentModelId" column="intent_model_id" />
|
||||
<result property="systemPrompt" column="system_prompt" />
|
||||
<result property="langCode" column="lang_code" />
|
||||
@@ -27,9 +27,9 @@
|
||||
</resultMap>
|
||||
|
||||
<sql id="Base_Column_List">
|
||||
id,user_id,agent_code,agent_name,asr_model_id,vad_model_id,
|
||||
llm_model_id,tts_model_id,tts_voice_id,mem_model_id,intent_model_id,
|
||||
system_prompt,lang_code,language,sort,creator,
|
||||
id,user_id,agent_code,agent_name,asr_model_id,vad_model_id,
|
||||
llm_model_id,tts_model_id,tts_voice_id,memory_model_id,intent_model_id,
|
||||
system_prompt,lang_code,language,sort,creator,
|
||||
created_at,updater,updated_at
|
||||
</sql>
|
||||
</mapper>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<result property="llmModelId" column="llm_model_id" />
|
||||
<result property="ttsModelId" column="tts_model_id" />
|
||||
<result property="ttsVoiceId" column="tts_voice_id" />
|
||||
<result property="memModelId" column="mem_model_id" />
|
||||
<result property="memoryModelId" column="memory_model_id" />
|
||||
<result property="intentModelId" column="intent_model_id" />
|
||||
<result property="systemPrompt" column="system_prompt" />
|
||||
<result property="langCode" column="lang_code" />
|
||||
@@ -27,9 +27,9 @@
|
||||
</resultMap>
|
||||
|
||||
<sql id="Base_Column_List">
|
||||
id,agent_code,agent_name,asr_model_id,vad_model_id,llm_model_id,
|
||||
tts_model_id,tts_voice_id,mem_model_id,intent_model_id,system_prompt,
|
||||
lang_code,language,sort,is_default,creator,
|
||||
id,agent_code,agent_name,asr_model_id,vad_model_id,llm_model_id,
|
||||
tts_model_id,tts_voice_id,memory_model_id,intent_model_id,system_prompt,
|
||||
lang_code,language,sort,is_default,creator,
|
||||
created_at,updater,updated_at
|
||||
</sql>
|
||||
</mapper>
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
|
||||
<mapper namespace="xiaozhi.modules.model.dao.ModelConfigDao">
|
||||
<!-- 获取模型供应器字段 -->
|
||||
<select id="getModelCodeList" resultType="String">
|
||||
select model_name from ai_model_config where model_type = #{modelType}
|
||||
<if test="modelName != null">and model_name = #{modelName}</if>
|
||||
</select>
|
||||
</mapper>
|
||||
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
|
||||
<mapper namespace="xiaozhi.modules.model.dao.ModelProviderDao">
|
||||
<!-- 获取模型供应器字段 -->
|
||||
<select id="getFieldList" resultType="string">
|
||||
select fields from ai_model_provider where model_type = #{modelType} and provider_code = #{providerCode};
|
||||
</select>
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user