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',
+},
+}
+
+
+
+
+
+
+
+
+
+
+ {{ cItem.title }}
+ {{ item[cItem.dataIndex] }}
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
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',
+},
+}
+
+
+
+
+
+
+
+
+
+
+ {{ cItem.title }}
+ {{ item[cItem.dataIndex] }}
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
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