From d4c9295da6a45baeefd72463e7e1dd62fc510f7b Mon Sep 17 00:00:00 2001 From: huliyong <2783385703@qq.com> Date: Sun, 21 Sep 2025 18:36:10 +0800 Subject: [PATCH] 1 --- .../modules/applet/service/AppletApiTTService.java | 13 +- .../service/impl/AppletApiBooksServiceImpl.java | 1 + .../service/impl/AppletApiTTServiceImpl.java | 192 ++++++------- .../controller/AppletTtsCacheController.java | 182 ++++++++++++ .../demo/appletTtsCache/entity/AppletTtsCache.java | 87 ++++++ .../mapper/AppletTtsCacheMapper.java | 17 ++ .../mapper/xml/AppletTtsCacheMapper.xml | 5 + .../service/IAppletTtsCacheService.java | 14 + .../service/impl/AppletTtsCacheServiceImpl.java | 19 ++ .../appletTtsCache/uniapp/AppletTtsCacheForm.vue | 120 ++++++++ .../appletTtsCache/uniapp/AppletTtsCacheList.vue | 44 +++ .../appletTtsCache/uniapp3/AppletTtsCacheData.ts | 37 +++ .../appletTtsCache/uniapp3/AppletTtsCacheForm.vue | 305 +++++++++++++++++++++ .../appletTtsCache/uniapp3/AppletTtsCacheList.vue | 148 ++++++++++ .../demo/appletTtsCache/vue3/AppletTtsCache.api.ts | 64 +++++ .../appletTtsCache/vue3/AppletTtsCache.data.ts | 128 +++++++++ .../appletTtsCache/vue3/AppletTtsCacheList.vue | 206 ++++++++++++++ .../V20250921_1__menu_insert_AppletTtsCache.sql | 26 ++ .../vue3/components/AppletTtsCacheForm.vue | 70 +++++ .../vue3/components/AppletTtsCacheModal.vue | 99 +++++++ .../controller/AppletTtsPlayLogController.java | 2 +- .../appletTtsPlayLog/entity/AppletTtsPlayLog.java | 30 +- .../mapper/AppletTtsPlayLogMapper.java | 2 +- .../service/IAppletTtsPlayLogService.java | 2 +- .../service/impl/AppletTtsPlayLogServiceImpl.java | 2 +- .../uniapp/AppletTtsPlayLogForm.vue | 17 +- .../uniapp3/AppletTtsPlayLogData.ts | 27 +- .../uniapp3/AppletTtsPlayLogForm.vue | 96 ++++--- .../appletTtsPlayLog/vue3/AppletTtsPlayLog.data.ts | 86 ++++-- .../V20250921_1__menu_insert_AppletTtsPlayLog.sql | 26 ++ 30 files changed, 1841 insertions(+), 226 deletions(-) create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/controller/AppletTtsCacheController.java create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/entity/AppletTtsCache.java create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/mapper/AppletTtsCacheMapper.java create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/mapper/xml/AppletTtsCacheMapper.xml create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/service/IAppletTtsCacheService.java create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/service/impl/AppletTtsCacheServiceImpl.java create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp/AppletTtsCacheForm.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp/AppletTtsCacheList.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp3/AppletTtsCacheData.ts create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp3/AppletTtsCacheForm.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp3/AppletTtsCacheList.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/AppletTtsCache.api.ts create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/AppletTtsCache.data.ts create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/AppletTtsCacheList.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/V20250921_1__menu_insert_AppletTtsCache.sql create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/components/AppletTtsCacheForm.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/components/AppletTtsCacheModal.vue create mode 100644 jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/V20250921_1__menu_insert_AppletTtsPlayLog.sql 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 index 3311c5b..dba4132 100644 --- 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 @@ -16,18 +16,7 @@ public interface AppletApiTTService { * @return 音频二进制数据 */ TextToVoiceResponse 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 音频二进制数据 - */ - TextToVoiceResponse 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/AppletApiBooksServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiBooksServiceImpl.java index 335faaf..01af922 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiBooksServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiBooksServiceImpl.java @@ -256,6 +256,7 @@ public class AppletApiBooksServiceImpl implements AppletApiBooksService { .orderByAsc(AppletCoursePage::getSort) .select(AppletCoursePage::getId, AppletCoursePage::getTitle, + AppletCoursePage::getType, AppletCoursePage::getPay ) .list(); 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 index 31ca457..de6ed97 100644 --- 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 @@ -1,6 +1,7 @@ package org.jeecg.modules.applet.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.tencentcloudapi.common.Credential; import com.tencentcloudapi.common.profile.ClientProfile; import com.tencentcloudapi.common.profile.HttpProfile; @@ -8,10 +9,16 @@ 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.common.system.util.AppletUserUtil; +import org.jeecg.common.util.oss.OssBootUtil; import org.jeecg.modules.applet.service.AppletApiTTService; +import org.jeecg.modules.common.IdUtils; 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.jeecg.modules.demo.appletTtsCache.entity.AppletTtsCache; +import org.jeecg.modules.demo.appletTtsCache.service.IAppletTtsCacheService; +import java.io.ByteArrayInputStream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -28,109 +35,52 @@ public class AppletApiTTServiceImpl implements AppletApiTTService { @Value("${tencent.secretKey}") private String secretKey; + @Autowired private IAppletTtsTimbreService appletTtsTimbreService; @Autowired private IAppletTtsPlayLogService appletTtsPlayLogService; + @Autowired + private IAppletTtsCacheService appletTtsCacheService; + - @Override public TextToVoiceResponse 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; -// } -// } - - public TextToVoiceResponse textToVoice(String text, Float speed, Integer voiceType, Float volume, String codec, String userId) { long startTime = System.currentTimeMillis(); + String userId = AppletUserUtil.getCurrentAppletUserId(); + + String cacheId = null; + try { + // 1. 先查询缓存数据库,看是否已经有相同参数的音频 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(AppletTtsCache::getText, text) + .eq(AppletTtsCache::getVoiceType, voiceType) + .eq(volume != null, AppletTtsCache::getVolume, volume != null ? volume.doubleValue() : null) + .eq(speed != null, AppletTtsCache::getSpeed, speed != null ? speed.doubleValue() : null) + .eq(AppletTtsCache::getSuccess, "Y"); + + AppletTtsCache existingCache = appletTtsCacheService.getOne(queryWrapper); + + if (existingCache != null) { + // 缓存命中,直接返回缓存的音频ID + log.info("TTS缓存命中,直接返回缓存音频,audioId: {}", existingCache.getAudioId()); + + // 记录播放日志 + long endTime = System.currentTimeMillis(); + double elapsedTime = (endTime - startTime) / 1000.0; + savePlayLog(userId, text, voiceType, volume != null ? volume.doubleValue() : null, + speed != null ? speed.doubleValue() : null, elapsedTime, true, existingCache.getId()); + + // 创建返回对象,将audioId放在Audio字段中返回给前端 + TextToVoiceResponse response = new TextToVoiceResponse(); + response.setAudio(existingCache.getAudioId()); // 返回音频文件URL + return response; + } + + // 2. 缓存未命中,调用腾讯云TTS接口生成音频 + log.info("TTS缓存未命中,调用腾讯云接口生成音频"); + // 创建认证对象 Credential cred = new Credential(secretId, secretKey); @@ -172,7 +122,6 @@ public class AppletApiTTServiceImpl implements AppletApiTTService { req.setModelType(1L); // 默认模型 req.setPrimaryLanguage(2L); // 中文 req.setSampleRate(16000L); // 16k采样率 - req.setEnableSubtitle(true); // 返回的resp是一个TextToVoiceResponse的实例,与请求对象对应 TextToVoiceResponse resp = client.TextToVoice(req); @@ -181,20 +130,56 @@ public class AppletApiTTServiceImpl implements AppletApiTTService { long endTime = System.currentTimeMillis(); double elapsedTime = (endTime - startTime) / 1000.0; - // 获取base64编码的音频数据并解码为二进制 + // 获取base64编码的音频数据 String audioBase64 = resp.getAudio(); if (audioBase64 != null && !audioBase64.isEmpty()) { + // 3. 将音频数据上传到OSS + byte[] audioData = java.util.Base64.getDecoder().decode(audioBase64); + String fileName = IdUtils.generateNo("TTS_") + System.currentTimeMillis() + ".wav"; + + // 使用ByteArrayInputStream上传到OSS + ByteArrayInputStream inputStream = new ByteArrayInputStream(audioData); + String audioUrl = OssBootUtil.upload(inputStream, "tts/" + fileName); + + if (audioUrl != null) { + // 4. 保存到缓存数据库 + AppletTtsCache cache = new AppletTtsCache(); + cache.setAudioId(audioUrl); + cache.setText(text); + cache.setVoiceType(voiceType); + cache.setVolume(volume != null ? volume.doubleValue() : null); + cache.setSpeed(speed != null ? speed.doubleValue() : null); + cache.setSuccess("Y"); + cache.setCreateTime(new java.util.Date()); + + // 计算音频时长(简单估算,实际可以通过音频文件解析获得) + if (text != null) { + // 按照平均语速估算时长(字符数 / 5 秒) + double estimatedDuration = text.length() / 5.0; + cache.setDuration(estimatedDuration); + } + + appletTtsCacheService.save(cache); + cacheId = cache.getId(); + + log.info("TTS音频生成成功并已缓存,audioUrl: {}, cacheId: {}", audioUrl, cacheId); + } else { + log.error("音频上传到OSS失败"); + } + // 记录成功的TTS调用日志 savePlayLog(userId, text, voiceType, volume != null ? volume.doubleValue() : null, - speed != null ? speed.doubleValue() : null, elapsedTime, true); + speed != null ? speed.doubleValue() : null, elapsedTime, true, cacheId); + // 返回音频URL给前端 + resp.setAudio(audioUrl); log.info("TTS调用成功,文本长度: {}, 耗时: {}秒", text != null ? text.length() : 0, elapsedTime); return resp; } else { // 记录失败的TTS调用日志 savePlayLog(userId, text, voiceType, volume != null ? volume.doubleValue() : null, - speed != null ? speed.doubleValue() : null, elapsedTime, false); + speed != null ? speed.doubleValue() : null, elapsedTime, false, null); log.warn("TTS返回的音频数据为空"); return null; @@ -207,7 +192,7 @@ public class AppletApiTTServiceImpl implements AppletApiTTService { // 记录失败的TTS调用日志 savePlayLog(userId, text, voiceType, volume != null ? volume.doubleValue() : null, - speed != null ? speed.doubleValue() : null, elapsedTime, false); + speed != null ? speed.doubleValue() : null, elapsedTime, false, null); log.error("调用腾讯云TTS接口失败: {}", e.getMessage(), e); return null; @@ -218,28 +203,29 @@ public class AppletApiTTServiceImpl implements AppletApiTTService { * 保存TTS播放日志 */ private void savePlayLog(String userId, String text, Integer voiceType, Double volume, - Double speed, Double elapsedTime, boolean success) { + Double speed, Double elapsedTime, boolean success, String cacheId) { 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.setCacheId(cacheId); // 关联缓存记录ID playLog.setCreateTime(new java.util.Date()); - + appletTtsPlayLogService.save(playLog); - log.debug("TTS播放日志保存成功,用户: {}, 结果: {}", userId, success ? "成功" : "失败"); + log.debug("TTS播放日志保存成功,用户: {}, 结果: {}, 缓存ID: {}", userId, success ? "成功" : "失败", cacheId); } 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/appletTtsCache/controller/AppletTtsCacheController.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/controller/AppletTtsCacheController.java new file mode 100644 index 0000000..5e0f6fc --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/controller/AppletTtsCacheController.java @@ -0,0 +1,182 @@ +package org.jeecg.modules.demo.appletTtsCache.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.appletTtsCache.entity.AppletTtsCache; +import org.jeecg.modules.demo.appletTtsCache.service.IAppletTtsCacheService; + +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-21 + * @Version: V1.0 + */ +@Tag(name="朗读音频") +@RestController +@RequestMapping("/appletTtsCache/appletTtsCache") +@Slf4j +public class AppletTtsCacheController extends JeecgController { + @Autowired + private IAppletTtsCacheService appletTtsCacheService; + + /** + * 分页列表查询 + * + * @param appletTtsCache + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "朗读音频-分页列表查询") + @Operation(summary="朗读音频-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(AppletTtsCache appletTtsCache, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + + + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(appletTtsCache, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = appletTtsCacheService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param appletTtsCache + * @return + */ + @AutoLog(value = "朗读音频-添加") + @Operation(summary="朗读音频-添加") + @RequiresPermissions("appletTtsCache:applet_tts_cache:add") + @PostMapping(value = "/add") + public Result add(@RequestBody AppletTtsCache appletTtsCache) { + appletTtsCacheService.save(appletTtsCache); + + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param appletTtsCache + * @return + */ + @AutoLog(value = "朗读音频-编辑") + @Operation(summary="朗读音频-编辑") + @RequiresPermissions("appletTtsCache:applet_tts_cache:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody AppletTtsCache appletTtsCache) { + appletTtsCacheService.updateById(appletTtsCache); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "朗读音频-通过id删除") + @Operation(summary="朗读音频-通过id删除") + @RequiresPermissions("appletTtsCache:applet_tts_cache:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + appletTtsCacheService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "朗读音频-批量删除") + @Operation(summary="朗读音频-批量删除") + @RequiresPermissions("appletTtsCache:applet_tts_cache:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.appletTtsCacheService.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) { + AppletTtsCache appletTtsCache = appletTtsCacheService.getById(id); + if(appletTtsCache==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(appletTtsCache); + } + + /** + * 导出excel + * + * @param request + * @param appletTtsCache + */ + @RequiresPermissions("appletTtsCache:applet_tts_cache:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, AppletTtsCache appletTtsCache) { + return super.exportXls(request, appletTtsCache, AppletTtsCache.class, "朗读音频"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("appletTtsCache:applet_tts_cache:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, AppletTtsCache.class); + } + +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/entity/AppletTtsCache.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/entity/AppletTtsCache.java new file mode 100644 index 0000000..5b78328 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/entity/AppletTtsCache.java @@ -0,0 +1,87 @@ +package org.jeecg.modules.demo.appletTtsCache.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-21 + * @Version: V1.0 + */ +@Data +@TableName("applet_tts_cache") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@Schema(description="朗读音频") +public class AppletTtsCache implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "id") + 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; + /**ID*/ + @Excel(name = "ID", width = 15) + @Schema(description = "ID") + private java.lang.String audioId; + /**创建日期*/ + @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 duration; + /**文本*/ + @Excel(name = "文本", width = 15) + @Schema(description = "文本") + private java.lang.String text; + /**音色ID*/ + @Excel(name = "音色ID", width = 15) + @Schema(description = "音色ID") + 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; + /**是否成功*/ + @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/appletTtsCache/mapper/AppletTtsCacheMapper.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/mapper/AppletTtsCacheMapper.java new file mode 100644 index 0000000..2c7c30a --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/mapper/AppletTtsCacheMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.demo.appletTtsCache.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.demo.appletTtsCache.entity.AppletTtsCache; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 朗读音频 + * @Author: jeecg-boot + * @Date: 2025-09-21 + * @Version: V1.0 + */ +public interface AppletTtsCacheMapper extends BaseMapper { + +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/mapper/xml/AppletTtsCacheMapper.xml b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/mapper/xml/AppletTtsCacheMapper.xml new file mode 100644 index 0000000..17447b7 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/mapper/xml/AppletTtsCacheMapper.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/appletTtsCache/service/IAppletTtsCacheService.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/service/IAppletTtsCacheService.java new file mode 100644 index 0000000..90f75ae --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/service/IAppletTtsCacheService.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.demo.appletTtsCache.service; + +import org.jeecg.modules.demo.appletTtsCache.entity.AppletTtsCache; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 朗读音频 + * @Author: jeecg-boot + * @Date: 2025-09-21 + * @Version: V1.0 + */ +public interface IAppletTtsCacheService extends IService { + +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/service/impl/AppletTtsCacheServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/service/impl/AppletTtsCacheServiceImpl.java new file mode 100644 index 0000000..7064f2a --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/service/impl/AppletTtsCacheServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.demo.appletTtsCache.service.impl; + +import org.jeecg.modules.demo.appletTtsCache.entity.AppletTtsCache; +import org.jeecg.modules.demo.appletTtsCache.mapper.AppletTtsCacheMapper; +import org.jeecg.modules.demo.appletTtsCache.service.IAppletTtsCacheService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 朗读音频 + * @Author: jeecg-boot + * @Date: 2025-09-21 + * @Version: V1.0 + */ +@Service +public class AppletTtsCacheServiceImpl extends ServiceImpl implements IAppletTtsCacheService { + +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp/AppletTtsCacheForm.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp/AppletTtsCacheForm.vue new file mode 100644 index 0000000..ae42abb --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp/AppletTtsCacheForm.vue @@ -0,0 +1,120 @@ + + + diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp/AppletTtsCacheList.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp/AppletTtsCacheList.vue new file mode 100644 index 0000000..d1df176 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp/AppletTtsCacheList.vue @@ -0,0 +1,44 @@ + + + + diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp3/AppletTtsCacheData.ts b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp3/AppletTtsCacheData.ts new file mode 100644 index 0000000..8356a9d --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp3/AppletTtsCacheData.ts @@ -0,0 +1,37 @@ +import { render } from '@/common/renderUtils'; +//列表数据 +export const columns = [ + { + title: 'ID', + align:"center", + dataIndex: 'audioId' + }, + { + title: '创建日期', + align:"center", + dataIndex: 'createTime' + }, + { + title: '时长', + align:"center", + dataIndex: 'duration' + }, + { + title: '音色ID', + align:"center", + dataIndex: 'voicetype' + }, + { + title: '语速', + align:"center", + dataIndex: 'speed' + }, + { + 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/appletTtsCache/uniapp3/AppletTtsCacheForm.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp3/AppletTtsCacheForm.vue new file mode 100644 index 0000000..ebbd1ae --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp3/AppletTtsCacheForm.vue @@ -0,0 +1,305 @@ + +{ +layout: 'default', +style: { +navigationStyle: 'custom', +navigationBarTitleText: '朗读音频', +}, +} + + + + + + diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp3/AppletTtsCacheList.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp3/AppletTtsCacheList.vue new file mode 100644 index 0000000..9d24245 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/uniapp3/AppletTtsCacheList.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/appletTtsCache/vue3/AppletTtsCache.api.ts b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/AppletTtsCache.api.ts new file mode 100644 index 0000000..8ebe1d7 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/AppletTtsCache.api.ts @@ -0,0 +1,64 @@ +import {defHttp} from '/@/utils/http/axios'; +import { useMessage } from "/@/hooks/web/useMessage"; + +const { createConfirm } = useMessage(); + +enum Api { + list = '/appletTtsCache/appletTtsCache/list', + save='/appletTtsCache/appletTtsCache/add', + edit='/appletTtsCache/appletTtsCache/edit', + deleteOne = '/appletTtsCache/appletTtsCache/delete', + deleteBatch = '/appletTtsCache/appletTtsCache/deleteBatch', + importExcel = '/appletTtsCache/appletTtsCache/importExcel', + exportXls = '/appletTtsCache/appletTtsCache/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/appletTtsCache/vue3/AppletTtsCache.data.ts b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/AppletTtsCache.data.ts new file mode 100644 index 0000000..b47d7b4 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/AppletTtsCache.data.ts @@ -0,0 +1,128 @@ +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: 'ID', + align:"center", + dataIndex: 'audioId' + }, + { + title: '创建日期', + align:"center", + dataIndex: 'createTime' + }, + { + title: '时长', + align:"center", + dataIndex: 'duration' + }, + { + title: '音色ID', + align:"center", + dataIndex: 'voicetype' + }, + { + title: '语速', + align:"center", + dataIndex: 'speed' + }, + { + title: '是否成功', + align:"center", + dataIndex: 'success', + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'Y'},{text:'否',value:'N'}]) + }, + }, +]; +//查询数据 +export const searchFormSchema: FormSchema[] = [ + { + label: "是否成功", + field: 'success', + component: 'JSwitch', + componentProps:{ + query:true, + }, + //colProps: {span: 6}, + }, +]; +//表单数据 +export const formSchema: FormSchema[] = [ + { + label: 'ID', + field: 'audioId', + component: 'Input', + }, + { + label: '创建日期', + field: 'createTime', + component: 'DatePicker', + componentProps: { + showTime: true, + valueFormat: 'YYYY-MM-DD HH:mm:ss' + }, + }, + { + label: '时长', + field: 'duration', + component: 'InputNumber', + }, + { + label: '文本', + field: 'text', + component: 'InputTextArea', + }, + { + label: '音色ID', + field: 'voicetype', + component: 'InputNumber', + }, + { + label: '音量', + field: 'volume', + component: 'InputNumber', + }, + { + label: '语速', + field: 'speed', + component: 'InputNumber', + }, + { + label: '是否成功', + field: 'success', + component: 'JSwitch', + componentProps:{ + }, + }, + // TODO 主键隐藏字段,目前写死为ID + { + label: '', + field: 'id', + component: 'Input', + show: false + }, +]; + +// 高级查询数据 +export const superQuerySchema = { + audioId: {title: 'ID',order: 0,view: 'text', type: 'string',}, + createTime: {title: '创建日期',order: 1,view: 'datetime', type: 'string',}, + duration: {title: '时长',order: 2,view: 'number', type: 'number',}, + voicetype: {title: '音色ID',order: 4,view: 'number', type: 'number',}, + speed: {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/appletTtsCache/vue3/AppletTtsCacheList.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/AppletTtsCacheList.vue new file mode 100644 index 0000000..f69a43b --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/AppletTtsCacheList.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/appletTtsCache/vue3/V20250921_1__menu_insert_AppletTtsCache.sql b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/V20250921_1__menu_insert_AppletTtsCache.sql new file mode 100644 index 0000000..3e1bd91 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/V20250921_1__menu_insert_AppletTtsCache.sql @@ -0,0 +1,26 @@ +-- 注意:该页面对应的前台目录为views/appletTtsCache文件夹下 +-- 如果你想更改到其他目录,请修改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 ('2025092105037950500', NULL, '朗读音频', '/appletTtsCache/appletTtsCacheList', 'appletTtsCache/AppletTtsCacheList', NULL, NULL, 0, NULL, '1', 0.00, 0, NULL, 1, 0, 0, 0, 0, NULL, '1', 0, 0, 'admin', '2025-09-21 17:03:50', 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 ('2025092105037950501', '2025092105037950500', '添加朗读音频', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsCache:applet_tts_cache:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-21 17:03:50', 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 ('2025092105037950502', '2025092105037950500', '编辑朗读音频', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsCache:applet_tts_cache:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-21 17:03:50', 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 ('2025092105037950503', '2025092105037950500', '删除朗读音频', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsCache:applet_tts_cache:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-21 17:03:50', 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 ('2025092105037950504', '2025092105037950500', '批量删除朗读音频', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsCache:applet_tts_cache:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-21 17:03:50', 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 ('2025092105037950505', '2025092105037950500', '导出excel_朗读音频', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsCache:applet_tts_cache:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-21 17:03:50', 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 ('2025092105037950506', '2025092105037950500', '导入excel_朗读音频', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsCache:applet_tts_cache:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-21 17:03:50', 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/appletTtsCache/vue3/components/AppletTtsCacheForm.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/components/AppletTtsCacheForm.vue new file mode 100644 index 0000000..7384bae --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/components/AppletTtsCacheForm.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/appletTtsCache/vue3/components/AppletTtsCacheModal.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/components/AppletTtsCacheModal.vue new file mode 100644 index 0000000..2c9bb45 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsCache/vue3/components/AppletTtsCacheModal.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/appletTtsPlayLog/controller/AppletTtsPlayLogController.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/controller/AppletTtsPlayLogController.java index 55d8948..faf177d 100644 --- 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 @@ -41,7 +41,7 @@ import org.apache.shiro.authz.annotation.RequiresPermissions; /** * @Description: 朗读记录 * @Author: jeecg-boot - * @Date: 2025-09-19 + * @Date: 2025-09-21 * @Version: V1.0 */ @Tag(name="朗读记录") 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 index 966245b..efb8f8e 100644 --- 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 @@ -22,7 +22,7 @@ import lombok.experimental.Accessors; /** * @Description: 朗读记录 * @Author: jeecg-boot - * @Date: 2025-09-19 + * @Date: 2025-09-21 * @Version: V1.0 */ @Data @@ -51,14 +51,19 @@ public class AppletTtsPlayLog implements Serializable { /**所属部门*/ @Schema(description = "所属部门") private java.lang.String sysOrgCode; + /**创建日期*/ + @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) @Schema(description = "用户") private java.lang.String userId; - /**文本*/ - @Excel(name = "文本", width = 15) - @Schema(description = "文本") - private java.lang.String text; /**音色ID*/ @Excel(name = "音色ID", width = 15) @Schema(description = "音色ID") @@ -71,17 +76,12 @@ public class AppletTtsPlayLog implements Serializable { @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) + @Excel(name = "是否成功", width = 15,replace = {"是_Y","否_N"} ) @Schema(description = "是否成功") private java.lang.String success; + /**音频*/ + @Excel(name = "音频", width = 15) + @Schema(description = "音频") + private java.lang.String cacheId; } 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 index 77f0550..2f14722 100644 --- 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 @@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * @Description: 朗读记录 * @Author: jeecg-boot - * @Date: 2025-09-19 + * @Date: 2025-09-21 * @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/service/IAppletTtsPlayLogService.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/service/IAppletTtsPlayLogService.java index 21372cd..a74cb0e 100644 --- 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 @@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService; /** * @Description: 朗读记录 * @Author: jeecg-boot - * @Date: 2025-09-19 + * @Date: 2025-09-21 * @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 index 7f86901..53f2156 100644 --- 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 @@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; /** * @Description: 朗读记录 * @Author: jeecg-boot - * @Date: 2025-09-19 + * @Date: 2025-09-21 * @Version: V1.0 */ @Service 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 index 746e18a..2a9c0f9 100644 --- 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 @@ -8,16 +8,17 @@
+ - 用户: - + 耗时: + - 文本: - + 用户: + @@ -40,14 +41,14 @@ - 耗时: - + 是否成功: + - 是否成功: - + 音频: + 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 index ad4a06e..9ba37d5 100644 --- 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 @@ -2,24 +2,24 @@ import { render } from '@/common/renderUtils'; //列表数据 export const columns = [ { - title: '用户', + title: '创建日期', align:"center", - dataIndex: 'userId' + dataIndex: 'createTime' }, { - title: '文本', + title: '耗时', align:"center", - dataIndex: 'text' + dataIndex: 'elapsedTime' }, { - title: '音色ID', + title: '用户', align:"center", - dataIndex: 'voicetype' + dataIndex: 'userId_dictText' }, { - title: '音量', + title: '音色ID', align:"center", - dataIndex: 'volume' + dataIndex: 'voicetype' }, { title: '语速', @@ -27,13 +27,16 @@ export const columns = [ dataIndex: 'speed' }, { - title: '耗时', + title: '是否成功', align:"center", - dataIndex: 'elapsedTime' + dataIndex: 'success', + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'Y'},{text:'否',value:'N'}]) + }, }, { - title: '是否成功', + title: '音频', align:"center", - dataIndex: 'success' + dataIndex: 'cacheId' }, ]; \ 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 index 9a41bd1..1db012b 100644 --- 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 @@ -14,32 +14,40 @@ navigationBarTitleText: '朗读记录', - + - + + + - + - + - - - - + + + + + + { + return render.renderSwitch(text, [{text:'是',value:'Y'},{text:'否',value:'N'}]) + }, }, { - title: '是否成功', + title: '音频', align:"center", - dataIndex: 'success' + dataIndex: 'cacheId' }, ]; //查询数据 export const searchFormSchema: FormSchema[] = [ + { + label: "是否成功", + field: 'success', + component: 'JSwitch', + componentProps:{ + query:true, + }, + //colProps: {span: 6}, + }, ]; //表单数据 export const formSchema: FormSchema[] = [ { - label: '用户', - field: 'userId', - component: 'Input', + label: '创建日期', + field: 'createTime', + component: 'DatePicker', + componentProps: { + showTime: true, + valueFormat: 'YYYY-MM-DD HH:mm:ss' + }, }, { - label: '文本', - field: 'text', - component: 'Input', + label: '耗时', + field: 'elapsedTime', + component: 'InputNumber', + }, + { + label: '用户', + field: 'userId', + component: 'JSearchSelect', + componentProps:{ + dict:"" + }, }, { label: '音色ID', @@ -71,14 +95,16 @@ export const formSchema: FormSchema[] = [ field: 'speed', component: 'InputNumber', }, - { - label: '耗时', - field: 'elapsedTime', - component: 'InputNumber', - }, { label: '是否成功', field: 'success', + component: 'JSwitch', + componentProps:{ + }, + }, + { + label: '音频', + field: 'cacheId', component: 'Input', }, // TODO 主键隐藏字段,目前写死为ID @@ -92,13 +118,13 @@ export const formSchema: FormSchema[] = [ // 高级查询数据 export const superQuerySchema = { - userId: {title: '用户',order: 0,view: 'text', type: 'string',}, - text: {title: '文本',order: 1,view: 'text', type: 'string',}, - voicetype: {title: '音色ID',order: 2,view: 'number', type: 'number',}, - volume: {title: '音量',order: 3,view: 'number', type: 'number',}, - speed: {title: '语速',order: 4,view: 'number', type: 'number',}, - elapsedTime: {title: '耗时',order: 5,view: 'number', type: 'number',}, - success: {title: '是否成功',order: 6,view: 'text', type: 'string',}, + createTime: {title: '创建日期',order: 0,view: 'datetime', type: 'string',}, + elapsedTime: {title: '耗时',order: 1,view: 'number', type: 'number',}, + userId: {title: '用户',order: 2,view: 'sel_search', type: 'string',dictCode: '',}, + voicetype: {title: '音色ID',order: 3,view: 'number', type: 'number',}, + speed: {title: '语速',order: 5,view: 'number', type: 'number',}, + success: {title: '是否成功',order: 6,view: 'switch', type: 'string',}, + cacheId: {title: '音频',order: 7,view: 'text', type: 'string',}, }; /** diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/V20250921_1__menu_insert_AppletTtsPlayLog.sql b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/V20250921_1__menu_insert_AppletTtsPlayLog.sql new file mode 100644 index 0000000..d82a301 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletTtsPlayLog/vue3/V20250921_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 ('2025092105045060400', 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-21 17:04:40', 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 ('2025092105045060401', '2025092105045060400', '添加朗读记录', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsPlayLog:applet_tts_play_log:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-21 17:04:40', 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 ('2025092105045060402', '2025092105045060400', '编辑朗读记录', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsPlayLog:applet_tts_play_log:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-21 17:04:40', 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 ('2025092105045060403', '2025092105045060400', '删除朗读记录', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsPlayLog:applet_tts_play_log:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-21 17:04:40', 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 ('2025092105045060404', '2025092105045060400', '批量删除朗读记录', NULL, NULL, 0, NULL, NULL, 2, 'appletTtsPlayLog:applet_tts_play_log:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-21 17:04:40', 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 ('2025092105045060405', '2025092105045060400', '导出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-21 17:04:40', 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 ('2025092105045060406', '2025092105045060400', '导入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-21 17:04:40', NULL, NULL, 0, 0, '1', 0); \ No newline at end of file