From cdfcdea133f630cc18ef326be057a651c3293cfe Mon Sep 17 00:00:00 2001 From: huliyong <2783385703@qq.com> Date: Fri, 12 Sep 2025 17:57:56 +0800 Subject: [PATCH] 1 --- .../jeecgboot-boot-applet/TTS接口使用说明.md | 83 ++++++ .../jeecgboot-boot-applet/pom.xml | 6 + .../applet/controller/AppletApiTTSController.java | 69 ++++- .../modules/applet/service/AppletApiTTService.java | 32 +++ .../applet/service/impl/AppletApiLoginService.java | 1 - .../service/impl/AppletApiTTServiceImpl.java | 161 +++++++++++ .../controller/AppletTtsPlayLogController.java | 182 +++++++++++++ .../appletTtsPlayLog/entity/AppletTtsPlayLog.java | 87 ++++++ .../mapper/AppletTtsPlayLogMapper.java | 17 ++ .../mapper/xml/AppletTtsPlayLogMapper.xml | 5 + .../service/IAppletTtsPlayLogService.java | 14 + .../service/impl/AppletTtsPlayLogServiceImpl.java | 19 ++ .../uniapp/AppletTtsPlayLogForm.vue | 120 +++++++++ .../uniapp/AppletTtsPlayLogList.vue | 44 +++ .../uniapp3/AppletTtsPlayLogData.ts | 47 ++++ .../uniapp3/AppletTtsPlayLogForm.vue | 298 +++++++++++++++++++++ .../uniapp3/AppletTtsPlayLogList.vue | 148 ++++++++++ .../appletTtsPlayLog/vue3/AppletTtsPlayLog.api.ts | 64 +++++ .../appletTtsPlayLog/vue3/AppletTtsPlayLog.data.ts | 122 +++++++++ .../appletTtsPlayLog/vue3/AppletTtsPlayLogList.vue | 206 ++++++++++++++ .../V20250912_1__menu_insert_AppletTtsPlayLog.sql | 26 ++ .../vue3/components/AppletTtsPlayLogForm.vue | 70 +++++ .../vue3/components/AppletTtsPlayLogModal.vue | 99 +++++++ .../controller/AppletTtsTimbreController.java | 182 +++++++++++++ .../appletTtsTimbre/entity/AppletTtsTimbre.java | 71 +++++ .../mapper/AppletTtsTimbreMapper.java | 17 ++ .../mapper/xml/AppletTtsTimbreMapper.xml | 5 + .../service/IAppletTtsTimbreService.java | 14 + .../service/impl/AppletTtsTimbreServiceImpl.java | 19 ++ .../appletTtsTimbre/uniapp/AppletTtsTimbreForm.vue | 95 +++++++ .../appletTtsTimbre/uniapp/AppletTtsTimbreList.vue | 44 +++ .../appletTtsTimbre/uniapp3/AppletTtsTimbreData.ts | 19 ++ .../uniapp3/AppletTtsTimbreForm.vue | 236 ++++++++++++++++ .../uniapp3/AppletTtsTimbreList.vue | 148 ++++++++++ .../appletTtsTimbre/vue3/AppletTtsTimbre.api.ts | 64 +++++ .../appletTtsTimbre/vue3/AppletTtsTimbre.data.ts | 67 +++++ .../appletTtsTimbre/vue3/AppletTtsTimbreList.vue | 206 ++++++++++++++ .../V20250912_1__menu_insert_AppletTtsTimbre.sql | 26 ++ .../vue3/components/AppletTtsTimbreForm.vue | 70 +++++ .../vue3/components/AppletTtsTimbreModal.vue | 99 +++++++ .../src/main/resources/application.yml | 6 + .../jeecg-module-system/jeecg-system-start/pom.xml | 1 + .../src/main/resources/application-dev.yml | 9 +- 43 files changed, 3306 insertions(+), 12 deletions(-) create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/TTS接口使用说明.md create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiTTService.java create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiTTServiceImpl.java create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/controller/AppletTtsPlayLogController.java create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/entity/AppletTtsPlayLog.java create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/mapper/AppletTtsPlayLogMapper.java create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/mapper/xml/AppletTtsPlayLogMapper.xml create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/service/IAppletTtsPlayLogService.java create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/service/impl/AppletTtsPlayLogServiceImpl.java create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp/AppletTtsPlayLogForm.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp/AppletTtsPlayLogList.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp3/AppletTtsPlayLogData.ts create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp3/AppletTtsPlayLogForm.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp3/AppletTtsPlayLogList.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/AppletTtsPlayLog.api.ts create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/AppletTtsPlayLog.data.ts create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/AppletTtsPlayLogList.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/V20250912_1__menu_insert_AppletTtsPlayLog.sql create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/components/AppletTtsPlayLogForm.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/components/AppletTtsPlayLogModal.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/controller/AppletTtsTimbreController.java create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/entity/AppletTtsTimbre.java create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/mapper/AppletTtsTimbreMapper.java create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/mapper/xml/AppletTtsTimbreMapper.xml create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/service/IAppletTtsTimbreService.java create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/service/impl/AppletTtsTimbreServiceImpl.java create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp/AppletTtsTimbreForm.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp/AppletTtsTimbreList.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp3/AppletTtsTimbreData.ts create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp3/AppletTtsTimbreForm.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp3/AppletTtsTimbreList.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/AppletTtsTimbre.api.ts create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/AppletTtsTimbre.data.ts create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/AppletTtsTimbreList.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/V20250912_1__menu_insert_AppletTtsTimbre.sql create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/components/AppletTtsTimbreForm.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/components/AppletTtsTimbreModal.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/resources/application.yml diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/TTS接口使用说明.md b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/TTS接口使用说明.md new file mode 100644 index 0000000..d09bfbc --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/TTS接口使用说明.md @@ -0,0 +1,83 @@ +# 腾讯云TTS文字转语音接口使用说明 + +## 接口地址 +``` +POST /appletApi/tts/textToVoice +``` + +## 请求参数 + +| 参数名称 | 类型 | 必填 | 描述 | +|---------|------|------|------| +| text | String | 是 | 要转换的文本内容,中文最大支持150个汉字,英文最大支持500个字母 | +| speed | Float | 否 | 语速,范围:[-2,6],默认为0。-2代表0.6倍,-1代表0.8倍,0代表1.0倍,1代表1.2倍,2代表1.5倍,6代表2.5倍 | +| voiceType | Integer | 否 | 音色ID,默认为0。不同音色价格有差异,完整音色列表请参见腾讯云官方文档 | +| volume | Float | 否 | 音量大小,范围[-10,10],默认为0,代表正常音量 | +| codec | String | 否 | 返回音频格式,可取值:wav(默认),mp3,pcm | + +## 返回结果 + +成功时返回二进制音频数据,Content-Type根据codec参数设置: +- wav格式:audio/wav +- mp3格式:audio/mpeg +- pcm格式:audio/pcm + +## 使用示例 + +### 基本调用 +```javascript +// 前端调用示例 +fetch('/appletApi/tts/textToVoice', { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: 'text=你好,欢迎使用语音合成服务' +}) +.then(response => response.blob()) +.then(blob => { + const audio = new Audio(URL.createObjectURL(blob)); + audio.play(); +}); +``` + +### 带参数调用 +```javascript +// 设置语速和音色 +fetch('/appletApi/tts/textToVoice', { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: 'text=Hello World&speed=1.2&voiceType=1&volume=2&codec=mp3' +}) +.then(response => response.blob()) +.then(blob => { + const audio = new Audio(URL.createObjectURL(blob)); + audio.play(); +}); +``` + +## 配置说明 + +在 `application.yml` 中配置腾讯云密钥: + +```yaml +tencent: + secretId: 你的腾讯云SecretId + secretKey: 你的腾讯云SecretKey +``` + +## 注意事项 + +1. 需要在腾讯云控制台开通语音合成服务 +2. 确保配置的密钥有语音合成的权限 +3. 文本长度限制:中文最大150个汉字,英文最大500个字母 +4. 返回的音频数据可以直接在前端播放 +5. 不同音色和采样率可能影响合成效果和费用 + +## 错误处理 + +- 如果返回204 No Content,表示合成失败或返回数据为空 +- 如果返回500 Internal Server Error,表示服务器内部错误,请检查日志 +- 请确保网络连接正常,能够访问腾讯云API服务 \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/pom.xml b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/pom.xml index e037fca..f8316d5 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/pom.xml +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/pom.xml @@ -39,6 +39,12 @@ module-pay 3.8.1 + + + com.tencentcloudapi + tencentcloud-sdk-java-tts + 3.1.1305 + diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiTTSController.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiTTSController.java index 4789419..9ef4195 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiTTSController.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiTTSController.java @@ -2,13 +2,19 @@ package org.jeecg.modules.applet.controller; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.jeecg.modules.applet.service.AppletApiTTService; +import org.jeecg.modules.demo.appletTtsTimbre.entity.AppletTtsTimbre; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.http.ResponseEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; + +import java.util.List; @Slf4j @Tag(name = "文字转语音", description = "文字转语音") @@ -16,16 +22,59 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/appletApi/tts") public class AppletApiTTSController { + @Autowired + private AppletApiTTService appletApiTTService; + @Operation(summary = "查询音色列表【待开发】", description = "查询音色列表") @GetMapping(value = "/list") - public Result list() { - return Result.OK(); + public Result> list() { + return Result.OK(appletApiTTService.list()); } - @Operation(summary = "文字转语音【待开发】", description = "文字转语音") - @PostMapping(value = "/play") - public Result play() { - return Result.OK(); + @Operation(summary = "文字转语音", description = "文字转语音") + @PostMapping(value = "/textToVoice") + public ResponseEntity textToVoice( + @Parameter(description = "要转换的文本内容", required = true) String text, + @Parameter(description = "语速,范围:[-2,6],默认为0-2代表0.6倍\n" + + "-1代表0.8倍\n" + + "0代表1.0倍(默认)\n" + + "1代表1.2倍\n" + + "2代表1.5倍\n" + + "6代表2.5倍") Float speed, + @Parameter(description = "音色ID,默认为0") Integer voiceType, + @Parameter(description = "音量大小,范围[-10,10],默认为0") Float volume, + @Parameter(description = "返回音频格式,可取值:wav(默认),mp3,pcm") String codec, + @Parameter(description = "用户ID,用于记录日志") String userId) { + + try { + byte[] audioData = appletApiTTService.textToVoice(text, speed, voiceType, volume, codec, userId); + + if (audioData == null || audioData.length == 0) { + return ResponseEntity.noContent().build(); + } + + // 根据codec设置对应的Content-Type + MediaType mediaType = MediaType.APPLICATION_OCTET_STREAM; + if ("wav".equalsIgnoreCase(codec)) { + mediaType = MediaType.parseMediaType("audio/wav"); + } else if ("mp3".equalsIgnoreCase(codec)) { + mediaType = MediaType.parseMediaType("audio/mpeg"); + } else if ("pcm".equalsIgnoreCase(codec)) { + mediaType = MediaType.parseMediaType("audio/pcm"); + } + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(mediaType); + headers.setContentLength(audioData.length); + + return ResponseEntity.ok() + .headers(headers) + .body(audioData); + + } catch (Exception e) { + log.error("文字转语音失败: {}", e.getMessage(), e); + return ResponseEntity.internalServerError().build(); + } } } diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiTTService.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiTTService.java new file mode 100644 index 0000000..1df930c --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiTTService.java @@ -0,0 +1,32 @@ +package org.jeecg.modules.applet.service; + +import org.jeecg.modules.demo.appletTtsTimbre.entity.AppletTtsTimbre; + +import java.util.List; + +public interface AppletApiTTService { + /** + * 文字转语音 + * @param text 要转换的文本内容 + * @param speed 语速,范围:[-2,6],默认为0 + * @param voiceType 音色ID,默认为0 + * @param volume 音量大小,范围[-10,10],默认为0 + * @param codec 返回音频格式,可取值:wav(默认),mp3,pcm + * @return 音频二进制数据 + */ + byte[] textToVoice(String text, Float speed, Integer voiceType, Float volume, String codec); + + /** + * 文字转语音(带用户ID记录日志) + * @param text 要转换的文本内容 + * @param speed 语速,范围:[-2,6],默认为0 + * @param voiceType 音色ID,默认为0 + * @param volume 音量大小,范围[-10,10],默认为0 + * @param codec 返回音频格式,可取值:wav(默认),mp3,pcm + * @param userId 用户ID,用于记录日志 + * @return 音频二进制数据 + */ + byte[] textToVoice(String text, Float speed, Integer voiceType, Float volume, String codec, String userId); + + List list(); +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiLoginService.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiLoginService.java index 5083ed2..e92f5ea 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiLoginService.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiLoginService.java @@ -251,7 +251,6 @@ public class AppletApiLoginService { public Result getUserInfo() { try { - // 获取当前登录用户 AppletUser user = AppletUserUtil.getCurrentAppletUser(); if (user == null) { diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiTTServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiTTServiceImpl.java new file mode 100644 index 0000000..727a91c --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiTTServiceImpl.java @@ -0,0 +1,161 @@ +package org.jeecg.modules.applet.service.impl; + + +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; +import com.tencentcloudapi.tts.v20190823.TtsClient; +import com.tencentcloudapi.tts.v20190823.models.TextToVoiceRequest; +import com.tencentcloudapi.tts.v20190823.models.TextToVoiceResponse; +import lombok.extern.log4j.Log4j2; +import org.jeecg.modules.applet.service.AppletApiTTService; +import org.jeecg.modules.demo.appletTtsPlayLog.service.IAppletTtsPlayLogService; +import org.jeecg.modules.demo.appletTtsTimbre.entity.AppletTtsTimbre; +import org.jeecg.modules.demo.appletTtsTimbre.service.IAppletTtsTimbreService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.UUID; + +@Log4j2 +@Service +public class AppletApiTTServiceImpl implements AppletApiTTService { + + @Value("${tencent.secretId}") + private String secretId; + @Value("${tencent.secretKey}") + private String secretKey; + + @Autowired + private IAppletTtsTimbreService appletTtsTimbreService; + @Autowired + private IAppletTtsPlayLogService appletTtsPlayLogService; + + @Override + public byte[] textToVoice(String text, Float speed, Integer voiceType, Float volume, String codec) { + return textToVoice(text, speed, voiceType, volume, codec, null); + } + + public byte[] textToVoice(String text, Float speed, Integer voiceType, Float volume, String codec, String userId) { + long startTime = System.currentTimeMillis(); + + try { + // 创建认证对象 + Credential cred = new Credential(secretId, secretKey); + + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("tts.tencentcloudapi.com"); + + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + + // 实例化要请求产品的client对象 + TtsClient client = new TtsClient(cred, "", clientProfile); + + // 实例化一个请求对象 + TextToVoiceRequest req = new TextToVoiceRequest(); + + // 设置必填参数 + req.setText(text); + req.setSessionId(UUID.randomUUID().toString()); + + // 设置可选参数 + if (speed != null) { + req.setSpeed(speed); + } + if (voiceType != null) { + req.setVoiceType(voiceType.longValue()); + } + if (volume != null) { + req.setVolume(volume); + } + if (codec != null && !codec.isEmpty()) { + req.setCodec(codec); + } else { + req.setCodec("wav"); // 默认wav格式 + } + + // 设置其他默认参数 + req.setModelType(1L); // 默认模型 + req.setPrimaryLanguage(2L); // 中文 + req.setSampleRate(16000L); // 16k采样率 + + // 返回的resp是一个TextToVoiceResponse的实例,与请求对象对应 + TextToVoiceResponse resp = client.TextToVoice(req); + + // 计算耗时 + long endTime = System.currentTimeMillis(); + double elapsedTime = (endTime - startTime) / 1000.0; + + // 获取base64编码的音频数据并解码为二进制 + String audioBase64 = resp.getAudio(); + byte[] audioData = null; + + if (audioBase64 != null && !audioBase64.isEmpty()) { + audioData = java.util.Base64.getDecoder().decode(audioBase64); + + // 记录成功的TTS调用日志 + savePlayLog(userId, text, voiceType, volume != null ? volume.doubleValue() : null, + speed != null ? speed.doubleValue() : null, elapsedTime, true); + + log.info("TTS调用成功,文本长度: {}, 耗时: {}秒", text != null ? text.length() : 0, elapsedTime); + return audioData; + } else { + // 记录失败的TTS调用日志 + savePlayLog(userId, text, voiceType, volume != null ? volume.doubleValue() : null, + speed != null ? speed.doubleValue() : null, elapsedTime, false); + + log.warn("TTS返回的音频数据为空"); + return null; + } + + } catch (Exception e) { + // 计算耗时 + long endTime = System.currentTimeMillis(); + double elapsedTime = (endTime - startTime) / 1000.0; + + // 记录失败的TTS调用日志 + savePlayLog(userId, text, voiceType, volume != null ? volume.doubleValue() : null, + speed != null ? speed.doubleValue() : null, elapsedTime, false); + + log.error("调用腾讯云TTS接口失败: {}", e.getMessage(), e); + return null; + } + } + + /** + * 保存TTS播放日志 + */ + private void savePlayLog(String userId, String text, Integer voiceType, Double volume, + Double speed, Double elapsedTime, boolean success) { + try { + org.jeecg.modules.demo.appletTtsPlayLog.entity.AppletTtsPlayLog playLog = + new org.jeecg.modules.demo.appletTtsPlayLog.entity.AppletTtsPlayLog(); + + playLog.setUserId(userId); + playLog.setText(text); + playLog.setVoicetype(voiceType); + playLog.setVolume(volume); + playLog.setSpeed(speed); + playLog.setElapsedTime(elapsedTime); + playLog.setSuccess(success ? "Y" : "N"); + playLog.setCreateTime(new java.util.Date()); + + appletTtsPlayLogService.save(playLog); + + log.debug("TTS播放日志保存成功,用户: {}, 结果: {}", userId, success ? "成功" : "失败"); + } catch (Exception e) { + log.error("保存TTS播放日志失败: {}", e.getMessage(), e); + } + } + + @Override + public List list() { + return appletTtsTimbreService.list(); + } + +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/controller/AppletTtsPlayLogController.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/controller/AppletTtsPlayLogController.java new file mode 100644 index 0000000..c0a5e0e --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/controller/AppletTtsPlayLogController.java @@ -0,0 +1,182 @@ +package org.jeecg.modules.demo.appletTtsPlayLog.controller; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.query.QueryRuleEnum; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.demo.appletTtsPlayLog.entity.AppletTtsPlayLog; +import org.jeecg.modules.demo.appletTtsPlayLog.service.IAppletTtsPlayLogService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + /** + * @Description: 小程序语音朗读记录 + * @Author: jeecg-boot + * @Date: 2025-09-12 + * @Version: V1.0 + */ +@Tag(name="小程序语音朗读记录") +@RestController +@RequestMapping("/appletTtsPlayLog/appletTtsPlayLog") +@Slf4j +public class AppletTtsPlayLogController extends JeecgController { + @Autowired + private IAppletTtsPlayLogService appletTtsPlayLogService; + + /** + * 分页列表查询 + * + * @param appletTtsPlayLog + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "小程序语音朗读记录-分页列表查询") + @Operation(summary="小程序语音朗读记录-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(AppletTtsPlayLog appletTtsPlayLog, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + + + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(appletTtsPlayLog, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = appletTtsPlayLogService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param appletTtsPlayLog + * @return + */ + @AutoLog(value = "小程序语音朗读记录-添加") + @Operation(summary="小程序语音朗读记录-添加") + @RequiresPermissions("appletTtsPlayLog:applet_tts_play_log:add") + @PostMapping(value = "/add") + public Result add(@RequestBody AppletTtsPlayLog appletTtsPlayLog) { + appletTtsPlayLogService.save(appletTtsPlayLog); + + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param appletTtsPlayLog + * @return + */ + @AutoLog(value = "小程序语音朗读记录-编辑") + @Operation(summary="小程序语音朗读记录-编辑") + @RequiresPermissions("appletTtsPlayLog:applet_tts_play_log:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody AppletTtsPlayLog appletTtsPlayLog) { + appletTtsPlayLogService.updateById(appletTtsPlayLog); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "小程序语音朗读记录-通过id删除") + @Operation(summary="小程序语音朗读记录-通过id删除") + @RequiresPermissions("appletTtsPlayLog:applet_tts_play_log:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + appletTtsPlayLogService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "小程序语音朗读记录-批量删除") + @Operation(summary="小程序语音朗读记录-批量删除") + @RequiresPermissions("appletTtsPlayLog:applet_tts_play_log:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.appletTtsPlayLogService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "小程序语音朗读记录-通过id查询") + @Operation(summary="小程序语音朗读记录-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + AppletTtsPlayLog appletTtsPlayLog = appletTtsPlayLogService.getById(id); + if(appletTtsPlayLog==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(appletTtsPlayLog); + } + + /** + * 导出excel + * + * @param request + * @param appletTtsPlayLog + */ + @RequiresPermissions("appletTtsPlayLog:applet_tts_play_log:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, AppletTtsPlayLog appletTtsPlayLog) { + return super.exportXls(request, appletTtsPlayLog, AppletTtsPlayLog.class, "小程序语音朗读记录"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("appletTtsPlayLog:applet_tts_play_log:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, AppletTtsPlayLog.class); + } + +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/entity/AppletTtsPlayLog.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/entity/AppletTtsPlayLog.java new file mode 100644 index 0000000..75acf66 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/entity/AppletTtsPlayLog.java @@ -0,0 +1,87 @@ +package org.jeecg.modules.demo.appletTtsPlayLog.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: 小程序语音朗读记录 + * @Author: jeecg-boot + * @Date: 2025-09-12 + * @Version: V1.0 + */ +@Data +@TableName("applet_tts_play_log") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@Schema(description="小程序语音朗读记录") +public class AppletTtsPlayLog implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private java.lang.String sysOrgCode; + /**用户*/ + @Excel(name = "用户", width = 15) + @Schema(description = "用户") + private java.lang.String userId; + /**文本*/ + @Excel(name = "文本", width = 15) + @Schema(description = "文本") + private java.lang.String text; + /**音色*/ + @Excel(name = "音色", width = 15) + @Schema(description = "音色") + private java.lang.Integer voicetype; + /**音量*/ + @Excel(name = "音量", width = 15) + @Schema(description = "音量") + private java.lang.Double volume; + /**语速*/ + @Excel(name = "语速", width = 15) + @Schema(description = "语速") + private java.lang.Double speed; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**耗时*/ + @Excel(name = "耗时", width = 15) + @Schema(description = "耗时") + private java.lang.Double elapsedTime; + /**是否成功*/ + @Excel(name = "是否成功", width = 15,replace = {"是_Y","否_N"} ) + @Schema(description = "是否成功") + private java.lang.String success; +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/mapper/AppletTtsPlayLogMapper.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/mapper/AppletTtsPlayLogMapper.java new file mode 100644 index 0000000..b6a6c05 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/mapper/AppletTtsPlayLogMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.demo.appletTtsPlayLog.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.demo.appletTtsPlayLog.entity.AppletTtsPlayLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 小程序语音朗读记录 + * @Author: jeecg-boot + * @Date: 2025-09-12 + * @Version: V1.0 + */ +public interface AppletTtsPlayLogMapper extends BaseMapper { + +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/mapper/xml/AppletTtsPlayLogMapper.xml b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/mapper/xml/AppletTtsPlayLogMapper.xml new file mode 100644 index 0000000..355deda --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/mapper/xml/AppletTtsPlayLogMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/service/IAppletTtsPlayLogService.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/service/IAppletTtsPlayLogService.java new file mode 100644 index 0000000..7e38158 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/service/IAppletTtsPlayLogService.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.demo.appletTtsPlayLog.service; + +import org.jeecg.modules.demo.appletTtsPlayLog.entity.AppletTtsPlayLog; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 小程序语音朗读记录 + * @Author: jeecg-boot + * @Date: 2025-09-12 + * @Version: V1.0 + */ +public interface IAppletTtsPlayLogService extends IService { + +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/service/impl/AppletTtsPlayLogServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/service/impl/AppletTtsPlayLogServiceImpl.java new file mode 100644 index 0000000..2b67eb8 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/service/impl/AppletTtsPlayLogServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.demo.appletTtsPlayLog.service.impl; + +import org.jeecg.modules.demo.appletTtsPlayLog.entity.AppletTtsPlayLog; +import org.jeecg.modules.demo.appletTtsPlayLog.mapper.AppletTtsPlayLogMapper; +import org.jeecg.modules.demo.appletTtsPlayLog.service.IAppletTtsPlayLogService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 小程序语音朗读记录 + * @Author: jeecg-boot + * @Date: 2025-09-12 + * @Version: V1.0 + */ +@Service +public class AppletTtsPlayLogServiceImpl extends ServiceImpl implements IAppletTtsPlayLogService { + +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp/AppletTtsPlayLogForm.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp/AppletTtsPlayLogForm.vue new file mode 100644 index 0000000..f358429 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp/AppletTtsPlayLogForm.vue @@ -0,0 +1,120 @@ + + + diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp/AppletTtsPlayLogList.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp/AppletTtsPlayLogList.vue new file mode 100644 index 0000000..86ac778 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp/AppletTtsPlayLogList.vue @@ -0,0 +1,44 @@ + + + + diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp3/AppletTtsPlayLogData.ts b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp3/AppletTtsPlayLogData.ts new file mode 100644 index 0000000..e1972e6 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp3/AppletTtsPlayLogData.ts @@ -0,0 +1,47 @@ +import { render } from '@/common/renderUtils'; +//列表数据 +export const columns = [ + { + title: '用户', + align:"center", + dataIndex: 'userId' + }, + { + title: '文本', + align:"center", + dataIndex: 'text' + }, + { + title: '音色', + align:"center", + dataIndex: 'voicetype' + }, + { + title: '音量', + align:"center", + dataIndex: 'volume' + }, + { + title: '语速', + align:"center", + dataIndex: 'speed' + }, + { + title: '创建日期', + align:"center", + dataIndex: 'createTime' + }, + { + title: '耗时', + align:"center", + dataIndex: 'elapsedTime' + }, + { + title: '是否成功', + align:"center", + dataIndex: 'success', + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'Y'},{text:'否',value:'N'}]) + }, + }, +]; \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp3/AppletTtsPlayLogForm.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp3/AppletTtsPlayLogForm.vue new file mode 100644 index 0000000..1333f26 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp3/AppletTtsPlayLogForm.vue @@ -0,0 +1,298 @@ + +{ +layout: 'default', +style: { +navigationStyle: 'custom', +navigationBarTitleText: '小程序语音朗读记录', +}, +} + + + + + + diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp3/AppletTtsPlayLogList.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp3/AppletTtsPlayLogList.vue new file mode 100644 index 0000000..e8a5a5c --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/uniapp3/AppletTtsPlayLogList.vue @@ -0,0 +1,148 @@ + +{ +layout: 'default', +style: { +navigationBarTitleText: '小程序语音朗读记录', +navigationStyle: 'custom', +}, +} + + + + + + diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/AppletTtsPlayLog.api.ts b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/AppletTtsPlayLog.api.ts new file mode 100644 index 0000000..28e7292 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/AppletTtsPlayLog.api.ts @@ -0,0 +1,64 @@ +import {defHttp} from '/@/utils/http/axios'; +import { useMessage } from "/@/hooks/web/useMessage"; + +const { createConfirm } = useMessage(); + +enum Api { + list = '/appletTtsPlayLog/appletTtsPlayLog/list', + save='/appletTtsPlayLog/appletTtsPlayLog/add', + edit='/appletTtsPlayLog/appletTtsPlayLog/edit', + deleteOne = '/appletTtsPlayLog/appletTtsPlayLog/delete', + deleteBatch = '/appletTtsPlayLog/appletTtsPlayLog/deleteBatch', + importExcel = '/appletTtsPlayLog/appletTtsPlayLog/importExcel', + exportXls = '/appletTtsPlayLog/appletTtsPlayLog/exportXls', +} +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; +/** + * 导入api + */ +export const getImportUrl = Api.importExcel; +/** + * 列表接口 + * @param params + */ +export const list = (params) => + defHttp.get({url: Api.list, params}); + +/** + * 删除单个 + */ +export const deleteOne = (params,handleSuccess) => { + return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); +} +/** + * 批量删除 + * @param params + */ +export const batchDelete = (params, handleSuccess) => { + createConfirm({ + iconType: 'warning', + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); + } + }); +} +/** + * 保存或者更新 + * @param params + */ +export const saveOrUpdate = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({url: url, params}); +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/AppletTtsPlayLog.data.ts b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/AppletTtsPlayLog.data.ts new file mode 100644 index 0000000..b0e2a69 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/AppletTtsPlayLog.data.ts @@ -0,0 +1,122 @@ +import {BasicColumn} from '/@/components/Table'; +import {FormSchema} from '/@/components/Table'; +import { rules} from '/@/utils/helper/validator'; +import { render } from '/@/utils/common/renderUtils'; +import { getWeekMonthQuarterYear } from '/@/utils'; +//列表数据 +export const columns: BasicColumn[] = [ + { + title: '用户', + align:"center", + dataIndex: 'userId' + }, + { + title: '文本', + align:"center", + dataIndex: 'text' + }, + { + title: '音色', + align:"center", + dataIndex: 'voicetype' + }, + { + title: '音量', + align:"center", + dataIndex: 'volume' + }, + { + title: '语速', + align:"center", + dataIndex: 'speed' + }, + { + title: '创建日期', + align:"center", + dataIndex: 'createTime' + }, + { + title: '耗时', + align:"center", + dataIndex: 'elapsedTime' + }, + { + title: '是否成功', + align:"center", + dataIndex: 'success', + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'Y'},{text:'否',value:'N'}]) + }, + }, +]; +//查询数据 +export const searchFormSchema: FormSchema[] = [ +]; +//表单数据 +export const formSchema: FormSchema[] = [ + { + label: '用户', + field: 'userId', + component: 'Input', + }, + { + label: '文本', + field: 'text', + component: 'Input', + }, + { + label: '音色', + field: 'voicetype', + component: 'InputNumber', + }, + { + label: '音量', + field: 'volume', + component: 'InputNumber', + }, + { + label: '语速', + field: 'speed', + component: 'InputNumber', + }, + { + label: '耗时', + field: 'elapsedTime', + component: 'InputNumber', + }, + { + label: '是否成功', + field: 'success', + component: 'JSwitch', + componentProps:{ + }, + }, + // TODO 主键隐藏字段,目前写死为ID + { + label: '', + field: 'id', + component: 'Input', + show: false + }, +]; + +// 高级查询数据 +export const superQuerySchema = { + userId: {title: '用户',order: 0,view: 'text', type: 'string',}, + text: {title: '文本',order: 1,view: 'text', type: 'string',}, + voicetype: {title: '音色',order: 2,view: 'number', type: 'number',}, + volume: {title: '音量',order: 3,view: 'number', type: 'number',}, + speed: {title: '语速',order: 4,view: 'number', type: 'number',}, + createTime: {title: '创建日期',order: 5,view: 'datetime', type: 'string',}, + elapsedTime: {title: '耗时',order: 6,view: 'number', type: 'number',}, + success: {title: '是否成功',order: 7,view: 'switch', type: 'string',}, +}; + +/** +* 流程表单调用这个方法获取formSchema +* @param param +*/ +export function getBpmFormSchema(_formData): FormSchema[]{ + // 默认和原始表单保持一致 如果流程中配置了权限数据,这里需要单独处理formSchema + return formSchema; +} \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/AppletTtsPlayLogList.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/AppletTtsPlayLogList.vue new file mode 100644 index 0000000..2629e08 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/AppletTtsPlayLogList.vue @@ -0,0 +1,206 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/V20250912_1__menu_insert_AppletTtsPlayLog.sql b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/V20250912_1__menu_insert_AppletTtsPlayLog.sql new file mode 100644 index 0000000..b478158 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/V20250912_1__menu_insert_AppletTtsPlayLog.sql @@ -0,0 +1,26 @@ +-- 注意:该页面对应的前台目录为views/appletTtsPlayLog文件夹下 +-- 如果你想更改到其他目录,请修改sql中component字段对应的值 + + +INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description, status, del_flag, rule_flag, create_by, create_time, update_by, update_time, internal_or_external) +VALUES ('2025091205466740370', NULL, '小程序语音朗读记录', '/appletTtsPlayLog/appletTtsPlayLogList', 'appletTtsPlayLog/AppletTtsPlayLogList', NULL, NULL, 0, NULL, '1', 0.00, 0, NULL, 1, 0, 0, 0, 0, NULL, '1', 0, 0, 'admin', '2025-09-12 17:46:37', NULL, NULL, 0); + +-- 权限控制sql +-- 新增 +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) +VALUES ('2025091205466740371', '2025091205466740370', '添加小程序语音朗读记录', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsPlayLog:applet_tts_play_log:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-12 17:46:37', NULL, NULL, 0, 0, '1', 0); +-- 编辑 +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) +VALUES ('2025091205466740372', '2025091205466740370', '编辑小程序语音朗读记录', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsPlayLog:applet_tts_play_log:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-12 17:46:37', NULL, NULL, 0, 0, '1', 0); +-- 删除 +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) +VALUES ('2025091205466740373', '2025091205466740370', '删除小程序语音朗读记录', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsPlayLog:applet_tts_play_log:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-12 17:46:37', NULL, NULL, 0, 0, '1', 0); +-- 批量删除 +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) +VALUES ('2025091205466740374', '2025091205466740370', '批量删除小程序语音朗读记录', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsPlayLog:applet_tts_play_log:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-12 17:46:37', NULL, NULL, 0, 0, '1', 0); +-- 导出excel +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) +VALUES ('2025091205466740375', '2025091205466740370', '导出excel_小程序语音朗读记录', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsPlayLog:applet_tts_play_log:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-12 17:46:37', NULL, NULL, 0, 0, '1', 0); +-- 导入excel +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) +VALUES ('2025091205466740376', '2025091205466740370', '导入excel_小程序语音朗读记录', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsPlayLog:applet_tts_play_log:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-12 17:46:37', NULL, NULL, 0, 0, '1', 0); \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/components/AppletTtsPlayLogForm.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/components/AppletTtsPlayLogForm.vue new file mode 100644 index 0000000..f020e01 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/components/AppletTtsPlayLogForm.vue @@ -0,0 +1,70 @@ + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/components/AppletTtsPlayLogModal.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/components/AppletTtsPlayLogModal.vue new file mode 100644 index 0000000..550c140 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/components/AppletTtsPlayLogModal.vue @@ -0,0 +1,99 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/controller/AppletTtsTimbreController.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/controller/AppletTtsTimbreController.java new file mode 100644 index 0000000..f3ebead --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/controller/AppletTtsTimbreController.java @@ -0,0 +1,182 @@ +package org.jeecg.modules.demo.appletTtsTimbre.controller; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.query.QueryRuleEnum; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.demo.appletTtsTimbre.entity.AppletTtsTimbre; +import org.jeecg.modules.demo.appletTtsTimbre.service.IAppletTtsTimbreService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + /** + * @Description: 小程序语音音色 + * @Author: jeecg-boot + * @Date: 2025-09-12 + * @Version: V1.0 + */ +@Tag(name="小程序语音音色") +@RestController +@RequestMapping("/appletTtsTimbre/appletTtsTimbre") +@Slf4j +public class AppletTtsTimbreController extends JeecgController { + @Autowired + private IAppletTtsTimbreService appletTtsTimbreService; + + /** + * 分页列表查询 + * + * @param appletTtsTimbre + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "小程序语音音色-分页列表查询") + @Operation(summary="小程序语音音色-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(AppletTtsTimbre appletTtsTimbre, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + + + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(appletTtsTimbre, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = appletTtsTimbreService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param appletTtsTimbre + * @return + */ + @AutoLog(value = "小程序语音音色-添加") + @Operation(summary="小程序语音音色-添加") + @RequiresPermissions("appletTtsTimbre:applet_tts_timbre:add") + @PostMapping(value = "/add") + public Result add(@RequestBody AppletTtsTimbre appletTtsTimbre) { + appletTtsTimbreService.save(appletTtsTimbre); + + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param appletTtsTimbre + * @return + */ + @AutoLog(value = "小程序语音音色-编辑") + @Operation(summary="小程序语音音色-编辑") + @RequiresPermissions("appletTtsTimbre:applet_tts_timbre:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody AppletTtsTimbre appletTtsTimbre) { + appletTtsTimbreService.updateById(appletTtsTimbre); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "小程序语音音色-通过id删除") + @Operation(summary="小程序语音音色-通过id删除") + @RequiresPermissions("appletTtsTimbre:applet_tts_timbre:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + appletTtsTimbreService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "小程序语音音色-批量删除") + @Operation(summary="小程序语音音色-批量删除") + @RequiresPermissions("appletTtsTimbre:applet_tts_timbre:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.appletTtsTimbreService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "小程序语音音色-通过id查询") + @Operation(summary="小程序语音音色-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + AppletTtsTimbre appletTtsTimbre = appletTtsTimbreService.getById(id); + if(appletTtsTimbre==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(appletTtsTimbre); + } + + /** + * 导出excel + * + * @param request + * @param appletTtsTimbre + */ + @RequiresPermissions("appletTtsTimbre:applet_tts_timbre:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, AppletTtsTimbre appletTtsTimbre) { + return super.exportXls(request, appletTtsTimbre, AppletTtsTimbre.class, "小程序语音音色"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("appletTtsTimbre:applet_tts_timbre:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, AppletTtsTimbre.class); + } + +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/entity/AppletTtsTimbre.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/entity/AppletTtsTimbre.java new file mode 100644 index 0000000..3459e3a --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/entity/AppletTtsTimbre.java @@ -0,0 +1,71 @@ +package org.jeecg.modules.demo.appletTtsTimbre.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: 小程序语音音色 + * @Author: jeecg-boot + * @Date: 2025-09-12 + * @Version: V1.0 + */ +@Data +@TableName("applet_tts_timbre") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@Schema(description="小程序语音音色") +public class AppletTtsTimbre implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private java.lang.String sysOrgCode; + /**名称*/ + @Excel(name = "名称", width = 15) + @Schema(description = "名称") + private java.lang.String name; + /**音色ID*/ + @Excel(name = "音色ID", width = 15) + @Schema(description = "音色ID") + private java.lang.Integer voiceType; + /**头像*/ + @Excel(name = "头像", width = 15) + @Schema(description = "头像") + private java.lang.String image; +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/mapper/AppletTtsTimbreMapper.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/mapper/AppletTtsTimbreMapper.java new file mode 100644 index 0000000..93867e6 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/mapper/AppletTtsTimbreMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.demo.appletTtsTimbre.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.demo.appletTtsTimbre.entity.AppletTtsTimbre; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 小程序语音音色 + * @Author: jeecg-boot + * @Date: 2025-09-12 + * @Version: V1.0 + */ +public interface AppletTtsTimbreMapper extends BaseMapper { + +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/mapper/xml/AppletTtsTimbreMapper.xml b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/mapper/xml/AppletTtsTimbreMapper.xml new file mode 100644 index 0000000..c410ef8 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/mapper/xml/AppletTtsTimbreMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/service/IAppletTtsTimbreService.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/service/IAppletTtsTimbreService.java new file mode 100644 index 0000000..fba8f23 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/service/IAppletTtsTimbreService.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.demo.appletTtsTimbre.service; + +import org.jeecg.modules.demo.appletTtsTimbre.entity.AppletTtsTimbre; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 小程序语音音色 + * @Author: jeecg-boot + * @Date: 2025-09-12 + * @Version: V1.0 + */ +public interface IAppletTtsTimbreService extends IService { + +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/service/impl/AppletTtsTimbreServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/service/impl/AppletTtsTimbreServiceImpl.java new file mode 100644 index 0000000..ab47892 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/service/impl/AppletTtsTimbreServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.demo.appletTtsTimbre.service.impl; + +import org.jeecg.modules.demo.appletTtsTimbre.entity.AppletTtsTimbre; +import org.jeecg.modules.demo.appletTtsTimbre.mapper.AppletTtsTimbreMapper; +import org.jeecg.modules.demo.appletTtsTimbre.service.IAppletTtsTimbreService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 小程序语音音色 + * @Author: jeecg-boot + * @Date: 2025-09-12 + * @Version: V1.0 + */ +@Service +public class AppletTtsTimbreServiceImpl extends ServiceImpl implements IAppletTtsTimbreService { + +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp/AppletTtsTimbreForm.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp/AppletTtsTimbreForm.vue new file mode 100644 index 0000000..afb6a72 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp/AppletTtsTimbreForm.vue @@ -0,0 +1,95 @@ + + + diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp/AppletTtsTimbreList.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp/AppletTtsTimbreList.vue new file mode 100644 index 0000000..f07431c --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp/AppletTtsTimbreList.vue @@ -0,0 +1,44 @@ + + + + diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp3/AppletTtsTimbreData.ts b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp3/AppletTtsTimbreData.ts new file mode 100644 index 0000000..5b5ab13 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp3/AppletTtsTimbreData.ts @@ -0,0 +1,19 @@ +import { render } from '@/common/renderUtils'; +//列表数据 +export const columns = [ + { + title: '名称', + align:"center", + dataIndex: 'name' + }, + { + title: '音色ID', + align:"center", + dataIndex: 'voiceType' + }, + { + title: '头像', + align:"center", + dataIndex: 'image' + }, +]; \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp3/AppletTtsTimbreForm.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp3/AppletTtsTimbreForm.vue new file mode 100644 index 0000000..34d10e3 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp3/AppletTtsTimbreForm.vue @@ -0,0 +1,236 @@ + +{ +layout: 'default', +style: { +navigationStyle: 'custom', +navigationBarTitleText: '小程序语音音色', +}, +} + + + + + + diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp3/AppletTtsTimbreList.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp3/AppletTtsTimbreList.vue new file mode 100644 index 0000000..655bd2e --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/uniapp3/AppletTtsTimbreList.vue @@ -0,0 +1,148 @@ + +{ +layout: 'default', +style: { +navigationBarTitleText: '小程序语音音色', +navigationStyle: 'custom', +}, +} + + + + + + diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/AppletTtsTimbre.api.ts b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/AppletTtsTimbre.api.ts new file mode 100644 index 0000000..f0d6719 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/AppletTtsTimbre.api.ts @@ -0,0 +1,64 @@ +import {defHttp} from '/@/utils/http/axios'; +import { useMessage } from "/@/hooks/web/useMessage"; + +const { createConfirm } = useMessage(); + +enum Api { + list = '/appletTtsTimbre/appletTtsTimbre/list', + save='/appletTtsTimbre/appletTtsTimbre/add', + edit='/appletTtsTimbre/appletTtsTimbre/edit', + deleteOne = '/appletTtsTimbre/appletTtsTimbre/delete', + deleteBatch = '/appletTtsTimbre/appletTtsTimbre/deleteBatch', + importExcel = '/appletTtsTimbre/appletTtsTimbre/importExcel', + exportXls = '/appletTtsTimbre/appletTtsTimbre/exportXls', +} +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; +/** + * 导入api + */ +export const getImportUrl = Api.importExcel; +/** + * 列表接口 + * @param params + */ +export const list = (params) => + defHttp.get({url: Api.list, params}); + +/** + * 删除单个 + */ +export const deleteOne = (params,handleSuccess) => { + return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); +} +/** + * 批量删除 + * @param params + */ +export const batchDelete = (params, handleSuccess) => { + createConfirm({ + iconType: 'warning', + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); + } + }); +} +/** + * 保存或者更新 + * @param params + */ +export const saveOrUpdate = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({url: url, params}); +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/AppletTtsTimbre.data.ts b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/AppletTtsTimbre.data.ts new file mode 100644 index 0000000..dabca73 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/AppletTtsTimbre.data.ts @@ -0,0 +1,67 @@ +import {BasicColumn} from '/@/components/Table'; +import {FormSchema} from '/@/components/Table'; +import { rules} from '/@/utils/helper/validator'; +import { render } from '/@/utils/common/renderUtils'; +import { getWeekMonthQuarterYear } from '/@/utils'; +//列表数据 +export const columns: BasicColumn[] = [ + { + title: '名称', + align:"center", + dataIndex: 'name' + }, + { + title: '音色ID', + align:"center", + dataIndex: 'voiceType' + }, + { + title: '头像', + align:"center", + dataIndex: 'image' + }, +]; +//查询数据 +export const searchFormSchema: FormSchema[] = [ +]; +//表单数据 +export const formSchema: FormSchema[] = [ + { + label: '名称', + field: 'name', + component: 'Input', + }, + { + label: '音色ID', + field: 'voiceType', + component: 'InputNumber', + }, + { + label: '头像', + field: 'image', + component: 'Input', + }, + // TODO 主键隐藏字段,目前写死为ID + { + label: '', + field: 'id', + component: 'Input', + show: false + }, +]; + +// 高级查询数据 +export const superQuerySchema = { + name: {title: '名称',order: 0,view: 'text', type: 'string',}, + voiceType: {title: '音色ID',order: 1,view: 'number', type: 'number',}, + image: {title: '头像',order: 2,view: 'text', type: 'string',}, +}; + +/** +* 流程表单调用这个方法获取formSchema +* @param param +*/ +export function getBpmFormSchema(_formData): FormSchema[]{ + // 默认和原始表单保持一致 如果流程中配置了权限数据,这里需要单独处理formSchema + return formSchema; +} \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/AppletTtsTimbreList.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/AppletTtsTimbreList.vue new file mode 100644 index 0000000..2d72404 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/AppletTtsTimbreList.vue @@ -0,0 +1,206 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/V20250912_1__menu_insert_AppletTtsTimbre.sql b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/V20250912_1__menu_insert_AppletTtsTimbre.sql new file mode 100644 index 0000000..f6f2b79 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/V20250912_1__menu_insert_AppletTtsTimbre.sql @@ -0,0 +1,26 @@ +-- 注意:该页面对应的前台目录为views/appletTtsTimbre文件夹下 +-- 如果你想更改到其他目录,请修改sql中component字段对应的值 + + +INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description, status, del_flag, rule_flag, create_by, create_time, update_by, update_time, internal_or_external) +VALUES ('2025091205389400570', NULL, '小程序语音音色', '/appletTtsTimbre/appletTtsTimbreList', 'appletTtsTimbre/AppletTtsTimbreList', NULL, NULL, 0, NULL, '1', 0.00, 0, NULL, 1, 0, 0, 0, 0, NULL, '1', 0, 0, 'admin', '2025-09-12 17:38:57', NULL, NULL, 0); + +-- 权限控制sql +-- 新增 +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) +VALUES ('2025091205389400571', '2025091205389400570', '添加小程序语音音色', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsTimbre:applet_tts_timbre:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-12 17:38:57', NULL, NULL, 0, 0, '1', 0); +-- 编辑 +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) +VALUES ('2025091205389400572', '2025091205389400570', '编辑小程序语音音色', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsTimbre:applet_tts_timbre:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-12 17:38:57', NULL, NULL, 0, 0, '1', 0); +-- 删除 +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) +VALUES ('2025091205389400573', '2025091205389400570', '删除小程序语音音色', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsTimbre:applet_tts_timbre:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-12 17:38:57', NULL, NULL, 0, 0, '1', 0); +-- 批量删除 +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) +VALUES ('2025091205389400574', '2025091205389400570', '批量删除小程序语音音色', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsTimbre:applet_tts_timbre:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-12 17:38:57', NULL, NULL, 0, 0, '1', 0); +-- 导出excel +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) +VALUES ('2025091205389400575', '2025091205389400570', '导出excel_小程序语音音色', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsTimbre:applet_tts_timbre:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-12 17:38:57', NULL, NULL, 0, 0, '1', 0); +-- 导入excel +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) +VALUES ('2025091205389400576', '2025091205389400570', '导入excel_小程序语音音色', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsTimbre:applet_tts_timbre:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-12 17:38:57', NULL, NULL, 0, 0, '1', 0); \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/components/AppletTtsTimbreForm.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/components/AppletTtsTimbreForm.vue new file mode 100644 index 0000000..d7c3d28 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/components/AppletTtsTimbreForm.vue @@ -0,0 +1,70 @@ + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/components/AppletTtsTimbreModal.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/components/AppletTtsTimbreModal.vue new file mode 100644 index 0000000..18adb46 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsTimbre/vue3/components/AppletTtsTimbreModal.vue @@ -0,0 +1,99 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/resources/application.yml b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/resources/application.yml new file mode 100644 index 0000000..7640f66 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/resources/application.yml @@ -0,0 +1,6 @@ +# 腾讯云配置 +tencent: + # 腾讯云API密钥ID + secretId: your_secret_id_here + # 腾讯云API密钥Key + secretKey: your_secret_key_here \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/pom.xml b/jeecg-boot/jeecg-module-system/jeecg-system-start/pom.xml index 0d3d1c3..b420ba1 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/pom.xml +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/pom.xml @@ -43,6 +43,7 @@ org.flywaydb flyway-core + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml index f5db134..a60cba3 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml @@ -338,4 +338,11 @@ wechat: publicKeyId: PUB_KEY_ID_0117018416542025022100395100001649 #公钥 merchantSerialNumber: 4B672D1BCB20B22081FD6C5ECAA7C1277AF1B772 # 商户API证书序列号 apiV3Key: 0fdb77429ffdf206c151af76a663041c # 商户APIV3密钥 - refundNotifyUrl: # 退款通知地址(正式环境) \ No newline at end of file + refundNotifyUrl: # 退款通知地址(正式环境) + + + + +tencent: + secretId: AKIDDH7j7IFzgCUbUBfaJuJVTDk4jCVbT7Xm + secretKey: 4NURCj281g7RWP4Vj8KJ5dy5zf9PSIuN \ No newline at end of file