From 1bc38618280ec910dcdd3edb09b6be41959d90f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=85=83=E7=9A=93?= Date: Fri, 9 Aug 2024 10:08:36 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9pom?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- community-8073/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/community-8073/pom.xml b/community-8073/pom.xml index 8d30724..3314c0b 100644 --- a/community-8073/pom.xml +++ b/community-8073/pom.xml @@ -157,7 +157,7 @@ spring-boot-maven-plugin 3.0.13 - com.ivmiku.tutorial.Main8072 + com.ivmiku.tutorial.Main8073 JAR -- 2.25.1 From e2a408488fb12743c962afdc1b9d8beb18f98810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=85=83=E7=9A=93?= Date: Mon, 12 Aug 2024 17:37:38 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- community-8073/pom.xml | 21 +++++-- .../controller/CommentController.java | 2 + .../controller/CommunityController.java | 3 +- .../controller/InteractionController.java | 2 + .../tutorial/controller/PostController.java | 2 + .../controller/PostTagController.java | 60 +++++-------------- .../tutorial/controller/TagController.java | 3 +- .../tutorial/service/PostTagService.java | 2 + .../service/impl/PostTagServiceImpl.java | 52 ++++++++-------- .../tutorial/service/impl/TagServiceImpl.java | 57 ++++++------------ .../main/resources/application-dev.properties | 3 + navigate-8432/pom.xml | 2 +- 12 files changed, 90 insertions(+), 119 deletions(-) diff --git a/community-8073/pom.xml b/community-8073/pom.xml index 3314c0b..a710856 100644 --- a/community-8073/pom.xml +++ b/community-8073/pom.xml @@ -24,6 +24,17 @@ + + + org.springframework.boot + spring-boot-starter-data-redis + + + + cn.dev33 + sa-token-spring-boot-starter + 1.28.0 + io.minio minio @@ -76,11 +87,11 @@ lombok provided - - - cn.dev33 - sa-token-spring-boot3-starter - + + + + + com.alibaba.fastjson2 diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommentController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommentController.java index 9289589..23aa62a 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommentController.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommentController.java @@ -1,5 +1,6 @@ package com.ivmiku.tutorial.controller; +import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.stp.StpUtil; import com.ivmiku.tutorial.entity.Comment; import com.ivmiku.tutorial.response.Result; @@ -19,6 +20,7 @@ import java.util.List; */ @RestController @RequestMapping("/comments") +@SaCheckLogin public class CommentController { private static final Logger logger = LoggerFactory.getLogger(CommentController.class); diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommunityController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommunityController.java index c5b0329..8ec25a2 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommunityController.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommunityController.java @@ -1,5 +1,6 @@ package com.ivmiku.tutorial.controller; +import cn.dev33.satoken.annotation.SaCheckLogin; import com.ivmiku.tutorial.entity.Community; import com.ivmiku.tutorial.response.Result; import com.ivmiku.tutorial.service.CommunityService; @@ -18,7 +19,7 @@ import java.util.List; */ @RestController @RequestMapping("/communities") - +@SaCheckLogin public class CommunityController { // 使用SLF4J的LoggerFactory来创建一个日志记录器 diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/InteractionController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/InteractionController.java index 5a4b23c..d2a33f6 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/controller/InteractionController.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/InteractionController.java @@ -1,5 +1,6 @@ package com.ivmiku.tutorial.controller; +import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.stp.StpUtil; import com.ivmiku.tutorial.response.Result; import com.ivmiku.tutorial.service.InteractionService; @@ -14,6 +15,7 @@ import javax.annotation.Resource; @Slf4j @RestController @RequestMapping("/interaction") +@SaCheckLogin public class InteractionController { @Resource diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostController.java index 517f544..fbaf699 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostController.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostController.java @@ -1,5 +1,6 @@ package com.ivmiku.tutorial.controller; +import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.stp.StpUtil; import com.ivmiku.tutorial.entity.Post; import com.ivmiku.tutorial.response.Result; @@ -19,6 +20,7 @@ import java.util.List; */ @RestController @RequestMapping("/post") +@SaCheckLogin public class PostController { private static final Logger logger = LoggerFactory.getLogger(PostController.class); diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostTagController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostTagController.java index 96b606c..e1df2d1 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostTagController.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostTagController.java @@ -1,5 +1,6 @@ package com.ivmiku.tutorial.controller; +import cn.dev33.satoken.annotation.SaCheckLogin; import com.ivmiku.tutorial.entity.Post; import com.ivmiku.tutorial.entity.PostTag; import com.ivmiku.tutorial.entity.Tag; @@ -14,22 +15,14 @@ import java.util.List; @RestController @RequestMapping("/post-tag") +@SaCheckLogin public class PostTagController { - // 日志记录器,用于记录控制器中的日志信息 private static final Logger logger = LoggerFactory.getLogger(PostTagController.class); - // 通过@Autowired注解自动装配PostTagService服务 @Autowired private PostTagService postTagService; - /** - * 创建帖子标签接口。 - * 用户通过POST请求提交帖子标签数据,服务端接收并保存帖子标签。 - * - * @param postTag 提交的帖子标签数据 - * @return Result 返回操作结果 - */ @PostMapping("/create") public Result createPostTag(@RequestBody PostTag postTag) { logger.info("开始创建帖子标签"); @@ -38,13 +31,6 @@ public class PostTagController { return Result.ok(); } - /** - * 获取帖子标签详情接口。 - * 根据帖子标签ID获取帖子标签的详细信息。 - * - * @param id 帖子标签的唯一标识ID - * @return Result 返回操作结果和帖子标签详情 - */ @GetMapping("/get/{id}") public Result getPostTag(@PathVariable Long id) { logger.info("开始获取帖子标签ID:{}的详细信息", id); @@ -57,14 +43,6 @@ public class PostTagController { return Result.ok(postTag); } - /** - * 更新帖子标签接口。 - * 用户通过PUT请求提交更新后的帖子标签数据,服务端接收并更新帖子标签。 - * - * @param id 要更新的帖子标签的唯一标识ID - * @param postTag 更新后的帖子标签数据 - * @return Result 返回操作结果 - */ @PutMapping("/update/{id}") public Result updatePostTag(@PathVariable Long id, @RequestBody PostTag postTag) { logger.info("开始更新帖子标签ID:{}", id); @@ -73,13 +51,6 @@ public class PostTagController { return Result.ok(); } - /** - * 删除帖子标签接口。 - * 根据帖子标签ID删除指定的帖子标签。 - * - * @param id 要删除的帖子标签的唯一标识ID - * @return Result 返回操作结果 - */ @DeleteMapping("/delete/{id}") public Result deletePostTag(@PathVariable Long id) { logger.info("开始删除帖子标签ID:{}", id); @@ -88,25 +59,24 @@ public class PostTagController { return Result.ok(); } - /** - * 获取当前帖子所有标签列表接口。 - * @return - */ - @GetMapping("/getPostTagList{postId}") - public Result getPostTagList(@PathVariable("postId") Long postId) { + @GetMapping("/getPostTagList/{postId}") + public Result getPostTagList(@PathVariable Long postId) { logger.info("开始获取帖子标签列表"); List tags = postTagService.getPostTagList(postId); return Result.ok(tags); } - /** - * 获取当前标签所有帖子列表接口。 - * @return - */ - @GetMapping("/getTagPostList{tagId}") - public Result getTagPostList(@PathVariable("tagId") Long tagId) { - logger.info("开始获取帖子标签列表"); + @GetMapping("/getTagPostList/{tagId}") + public Result getTagPostList(@PathVariable Long tagId) { + logger.info("开始获取标签帖子列表"); List posts = postTagService.getTagPostList(tagId); return Result.ok(posts); } -} \ No newline at end of file + + @GetMapping("/topTags") + public Result getTopTags(@RequestParam(defaultValue = "10") int topN) { + logger.info("开始获取前{}个使用次数最多的标签", topN); + List tags = postTagService.getTopTags(topN); + return Result.ok(tags); + } +} diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/TagController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/TagController.java index c8ef367..9ecbeac 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/controller/TagController.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/TagController.java @@ -1,5 +1,6 @@ package com.ivmiku.tutorial.controller; +import cn.dev33.satoken.annotation.SaCheckLogin; import com.ivmiku.tutorial.entity.Tag; import com.ivmiku.tutorial.response.Result; import com.ivmiku.tutorial.service.PostTagService; @@ -13,12 +14,12 @@ import java.util.List; @RestController @RequestMapping("/tag") +@SaCheckLogin public class TagController { // 日志记录器,用于记录控制器中的日志信息 private static final Logger logger = LoggerFactory.getLogger(TagController.class); - // 通过@Autowired注解自动装配TagService服务 @Autowired private TagService tagService; diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/PostTagService.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/PostTagService.java index 049193e..5417225 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/service/PostTagService.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/PostTagService.java @@ -51,4 +51,6 @@ public interface PostTagService extends IService { List getTagPostList(Long tagId); List getSortedTagList(); + + List getTopTags(int topN); } diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/PostTagServiceImpl.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/PostTagServiceImpl.java index c15b75a..ed9329c 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/PostTagServiceImpl.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/PostTagServiceImpl.java @@ -11,9 +11,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * 帖子标签服务实现类。 @@ -21,7 +24,6 @@ import java.util.List; @Service public class PostTagServiceImpl extends ServiceImpl implements PostTagService { - // 日志记录器,用于记录服务层的日志信息 private static final Logger logger = LoggerFactory.getLogger(PostTagServiceImpl.class); @Autowired @@ -33,39 +35,26 @@ public class PostTagServiceImpl extends ServiceImpl impl @Autowired private PostTagMapper postTagMapper; - /** - * 创建帖子标签。 - * 将帖子标签数据保存到数据库。 - * - * @param postTag 要保存的帖子标签数据 - */ + @Autowired + private StringRedisTemplate redisTemplate; + + private static final String TAG_KEY = "tags"; + @Override public void createPostTag(PostTag postTag) { logger.info("开始创建帖子标签"); save(postTag); + // 更新标签的使用次数 + redisTemplate.opsForZSet().incrementScore(TAG_KEY, postTag.getTagId().toString(), 1); logger.info("帖子标签创建成功,标签ID:{}", postTag.getPostTagId()); } - /** - * 根据ID获取帖子标签详情。 - * 从数据库中根据帖子标签ID获取帖子标签的详细信息。 - * - * @param postTagId 帖子标签的唯一标识ID - * @return PostTag 返回查询到的帖子标签对象 - */ @Override public PostTag getPostTagById(Long postTagId) { logger.info("开始根据ID获取帖子标签详情,标签ID:{}", postTagId); return getById(postTagId); } - /** - * 更新帖子标签。 - * 根据帖子标签ID更新帖子标签的内容。 - * - * @param postTagId 要更新的帖子标签的唯一标识ID - * @param postTag 更新后的帖子标签数据 - */ @Override public void updatePostTag(Long postTagId, PostTag postTag) { logger.info("开始更新帖子标签,标签ID:{}", postTagId); @@ -74,15 +63,14 @@ public class PostTagServiceImpl extends ServiceImpl impl logger.info("帖子标签更新成功,标签ID:{}", postTagId); } - /** - * 删除帖子标签。 - * 根据帖子标签ID删除指定的帖子标签。 - * - * @param postTagId 要删除的帖子标签的唯一标识ID - */ @Override public void deletePostTag(Long postTagId) { logger.info("开始删除帖子标签,标签ID:{}", postTagId); + // 删除标签时减少使用次数 + PostTag postTag = getById(postTagId); + if (postTag != null) { + redisTemplate.opsForZSet().incrementScore(TAG_KEY, postTag.getTagId().toString(), -1); + } removeById(postTagId); logger.info("帖子标签删除成功,标签ID:{}", postTagId); } @@ -104,4 +92,14 @@ public class PostTagServiceImpl extends ServiceImpl impl logger.info("开始获取排序后的标签列表"); return tagMapper.getSortedTagList(); } + + @Override + public List getTopTags(int topN) { + logger.info("开始获取前{}个使用次数最多的标签", topN); + Set tagSet = redisTemplate.opsForZSet().reverseRange(TAG_KEY, 0, topN - 1); + if (tagSet == null) { + return List.of(); // 或者返回一个空的List + } + return tagSet.stream().collect(Collectors.toList()); + } } \ No newline at end of file diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/TagServiceImpl.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/TagServiceImpl.java index 371a831..3c6142f 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/TagServiceImpl.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/TagServiceImpl.java @@ -11,87 +11,66 @@ import org.springframework.stereotype.Service; import java.util.List; -/** - * 标签服务实现类 - */ @Service public class TagServiceImpl extends ServiceImpl implements TagService { - // 使用SLF4J的LoggerFactory创建一个Logger实例 private static final Logger logger = LoggerFactory.getLogger(TagServiceImpl.class); @Autowired private TagMapper tagMapper; - /** - * 创建标签 - * @param tag 标签实体对象 - */ @Override public void createTag(Tag tag) { try { - // 保存标签到数据库 save(tag); - logger.info("Tag created successfully: {}", tag); + logger.info("标签创建成功:{}", tag); } catch (Exception e) { - logger.error("Failed to create tag: {}", tag, e); + logger.error("标签创建失败:{}", tag, e); + throw e; // 重新抛出异常以便控制器能捕获并处理 } } - /** - * 根据ID获取标签 - * @param tagId 标签ID - * @return 标签实体对象 - */ @Override public Tag getTagById(Long tagId) { try { - // 根据ID查询标签 return getById(tagId); } catch (Exception e) { - logger.error("Failed to get tag by id: {}", tagId, e); - return null; + logger.error("获取标签ID:{}失败", tagId, e); + throw e; // 重新抛出异常 } } - /** - * 更新标签信息 - * @param tagId 标签ID - * @param tag 更新后的标签实体对象 - */ @Override public void updateTag(Long tagId, Tag tag) { try { - // 设置标签ID并更新标签信息 tag.setTagId(tagId); updateById(tag); - logger.info("Tag updated successfully: {}", tag); + logger.info("标签更新成功:{}", tag); } catch (Exception e) { - logger.error("Failed to update tag with id {}: {}", tagId, tag, e); + logger.error("更新标签ID:{}失败", tagId, e); + throw e; // 重新抛出异常 } } - /** - * 删除标签 - * @param tagId 标签ID - */ @Override public void deleteTag(Long tagId) { try { - // 根据ID删除标签 removeById(tagId); - logger.info("Tag deleted successfully with id: {}", tagId); + logger.info("标签删除成功,ID:{}", tagId); } catch (Exception e) { - logger.error("Failed to delete tag with id: {}", tagId, e); + logger.error("删除标签ID:{}失败", tagId, e); + throw e; // 重新抛出异常 } } @Override public List getTagList() { - List tags = tagMapper.selectList(null); - if (tags != null) { - return tags; + try { + return tagMapper.selectList(null); + } catch (Exception e) { + logger.error("获取标签列表失败", e); + throw e; // 重新抛出异常 } - return null; } -} \ No newline at end of file +} + diff --git a/community-8073/src/main/resources/application-dev.properties b/community-8073/src/main/resources/application-dev.properties index 5553089..b25407e 100644 --- a/community-8073/src/main/resources/application-dev.properties +++ b/community-8073/src/main/resources/application-dev.properties @@ -4,6 +4,9 @@ wx.miniapp.configs[0].secret=989f155fcc3aee616568473faf1b1d3b spring.data.redis.host=localhost spring.data.redis.port=6379 spring.data.redis.database=0 +spring.data.redis.lettuce.pool.max-active=32 +spring.data.redis.lettuce.pool.max-idle=16 +spring.data.redis.lettuce.pool.min-idle=8 spring.application.name=community diff --git a/navigate-8432/pom.xml b/navigate-8432/pom.xml index a381a9a..aab061b 100644 --- a/navigate-8432/pom.xml +++ b/navigate-8432/pom.xml @@ -96,7 +96,7 @@ com.tencentcloudapi tencentcloud-sdk-java-ocr - 3.1.1076 + 3.1.1 \ No newline at end of file -- 2.25.1 From 14e9974c77f9e11becdfd80bb20fb42aa35e9ea2 Mon Sep 17 00:00:00 2001 From: ivmiku <124345843+ivmiku@users.noreply.github.com> Date: Mon, 12 Aug 2024 20:18:10 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E8=AF=AD=E9=9F=B3=E5=8A=A9?= =?UTF-8?q?=E6=89=8B=E7=9B=B8=E5=85=B3api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/encodings.xml | 2 + .idea/misc.xml | 3 +- navigate-8432/pom.xml | 7 +- .../tutorial/config/SaTokenConfigure.java | 33 ++++++++ .../controller/AssistantController.java | 34 ++++++++ .../controller/NavigateController.java | 18 ++++- .../tutorial/service/AssistantService.java | 77 +++++++++++++++++++ .../tutorial/service/NavigateService.java | 27 ++++++- .../ivmiku/tutorial/utils/SnowflakeUtil.java | 14 ++++ 9 files changed, 210 insertions(+), 5 deletions(-) create mode 100644 navigate-8432/src/main/java/com/ivmiku/tutorial/config/SaTokenConfigure.java create mode 100644 navigate-8432/src/main/java/com/ivmiku/tutorial/controller/AssistantController.java create mode 100644 navigate-8432/src/main/java/com/ivmiku/tutorial/service/AssistantService.java create mode 100644 navigate-8432/src/main/java/com/ivmiku/tutorial/utils/SnowflakeUtil.java diff --git a/.idea/encodings.xml b/.idea/encodings.xml index c54f389..b1117c5 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -7,6 +7,8 @@ + + diff --git a/.idea/misc.xml b/.idea/misc.xml index bada8b5..c4e5a98 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -5,10 +5,11 @@ - + \ No newline at end of file diff --git a/navigate-8432/pom.xml b/navigate-8432/pom.xml index aab061b..97f02c0 100644 --- a/navigate-8432/pom.xml +++ b/navigate-8432/pom.xml @@ -96,7 +96,12 @@ com.tencentcloudapi tencentcloud-sdk-java-ocr - 3.1.1 + 3.1.1076 + + + com.tencentcloudapi + tencentcloud-sdk-java-tts + 3.1.1076 \ No newline at end of file diff --git a/navigate-8432/src/main/java/com/ivmiku/tutorial/config/SaTokenConfigure.java b/navigate-8432/src/main/java/com/ivmiku/tutorial/config/SaTokenConfigure.java new file mode 100644 index 0000000..3fa34d7 --- /dev/null +++ b/navigate-8432/src/main/java/com/ivmiku/tutorial/config/SaTokenConfigure.java @@ -0,0 +1,33 @@ +package com.ivmiku.tutorial.config; + +import cn.dev33.satoken.context.SaHolder; +import cn.dev33.satoken.filter.SaServletFilter; +import cn.dev33.satoken.same.SaSameUtil; +import cn.dev33.satoken.util.SaResult; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * Sa-Token 权限认证 配置类 + */ +@Configuration +public class SaTokenConfigure implements WebMvcConfigurer { + // 注册 Sa-Token 全局过滤器 + @Bean + public SaServletFilter getSaServletFilter() { + return new SaServletFilter() + .addInclude("/**") + .addExclude("/favicon.ico") + .setAuth(obj -> { + // 校验 Same-Token 身份凭证 —— 以下两句代码可简化为:SaSameUtil.checkCurrentRequestToken(); + String token = SaHolder.getRequest().getHeader(SaSameUtil.SAME_TOKEN); + SaSameUtil.checkToken(token); + }) + .setError(e -> { + return SaResult.error(e.getMessage()); + }) + ; + } +} + diff --git a/navigate-8432/src/main/java/com/ivmiku/tutorial/controller/AssistantController.java b/navigate-8432/src/main/java/com/ivmiku/tutorial/controller/AssistantController.java new file mode 100644 index 0000000..afef15d --- /dev/null +++ b/navigate-8432/src/main/java/com/ivmiku/tutorial/controller/AssistantController.java @@ -0,0 +1,34 @@ +package com.ivmiku.tutorial.controller; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import com.ivmiku.tutorial.response.Result; +import com.ivmiku.tutorial.service.AssistantService; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/assistant") +@SaCheckLogin +public class AssistantController { + @Resource + private AssistantService assistantService; + + @GetMapping("/response") + public Object getResponse(@RequestParam String input) { + Map map = assistantService.getResponse(input); + if (map == null) { + return Result.error("请求出错"); + } + return Result.ok(map); + } + + @GetMapping("/tts") + public Object textToSpeech(@RequestParam String input) { + Map map = new HashMap<>(); + map.put("content", assistantService.textToSpeech(input)); + return Result.ok(map); + } +} diff --git a/navigate-8432/src/main/java/com/ivmiku/tutorial/controller/NavigateController.java b/navigate-8432/src/main/java/com/ivmiku/tutorial/controller/NavigateController.java index 927d070..924e7e5 100644 --- a/navigate-8432/src/main/java/com/ivmiku/tutorial/controller/NavigateController.java +++ b/navigate-8432/src/main/java/com/ivmiku/tutorial/controller/NavigateController.java @@ -34,6 +34,9 @@ public class NavigateController { String userId = (String) StpUtil.getLoginId(); if (!origin.isEmpty() && !destination.isEmpty()) { Map route = navigateService.getRoute(origin, destination); + if (route == null) { + return JSON.toJSON(Result.error("路线规划失败!")); + } List stepsList = (List) route.get("steps"); STEPS_MAP.put(userId, stepsList); Map map = new HashMap<>(); @@ -50,13 +53,24 @@ public class NavigateController { map.put("step", STEPS_MAP.get(userId).get(step-1)); return JSON.toJSON(Result.ok(map)); } - return JSON.toJSON(Result.error("非法的请求参数")); + return Result.error("非法的请求参数"); } @PostMapping("/ticket") public Object scanTicket(@RequestPart MultipartFile file) throws IOException { BufferedImage image = ImageIO.read(file.getInputStream()); Map map = navigateService.scanTicket(image); - return JSON.toJSON(Result.ok(map)); + return Result.ok(map); + } + + @GetMapping("/geocode") + public Object getGeoCode(@RequestParam String address, @RequestParam(defaultValue = "") String city) { + String geoCode = navigateService.getGeoCode(address, city); + if (geoCode == null) { + return JSON.toJSON(Result.error("未获取到有效信息")); + } + Map map = new HashMap<>(); + map.put("geocode", geoCode); + return Result.ok(map); } } diff --git a/navigate-8432/src/main/java/com/ivmiku/tutorial/service/AssistantService.java b/navigate-8432/src/main/java/com/ivmiku/tutorial/service/AssistantService.java new file mode 100644 index 0000000..f060c58 --- /dev/null +++ b/navigate-8432/src/main/java/com/ivmiku/tutorial/service/AssistantService.java @@ -0,0 +1,77 @@ +package com.ivmiku.tutorial.service; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.ivmiku.tutorial.utils.SnowflakeUtil; +import com.tencentcloudapi.common.AbstractModel; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +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 org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +@Service +public class AssistantService { + private final String auth = "bad1f6cad39a4c26aa9fe9e4324e096f:ZDczMDIwOTg3NjlhODdmYWVjYTY0YjM1"; + private final String secretId = "AKID09INNYxYEFFJH3g9VhljVF3qbDiFdx50"; + private final String secretKey = "KajjcNyNaaUCqQroqpzNoMtTHNj4Lbil"; + + public Map getResponse(String userInput) { + Map message1 = new HashMap<>(); + message1.put("role", "system"); + message1.put("content", "模仿语音助手,对用户的问题给出简短的回答"); + Map message2 = new HashMap<>(); + message2.put("role", "user"); + message2.put("content", userInput); + JSONArray array = new JSONArray(); + array.add(message1); + array.add(message2); + JSONObject params = new JSONObject(); + params.put("model", "general"); + params.put("messages", array); + HttpResponse response = HttpRequest.post("https://spark-api-open.xf-yun.com/v1/chat/completions") + .header("Content-Type", "application/json") + .header("Authorization", "Bearer " + auth) + .body(params.toJSONString()) + .execute(); + JSONObject result = JSONObject.parseObject(response.body()); + response.close(); + if (result.getInteger("code") != 0) { + return null; + } + JSONArray choices = result.getJSONArray("choices"); + JSONObject message = choices.getJSONObject(0); + JSONObject content = message.getJSONObject("message"); + Map map = new HashMap<>(); + map.put("content", content.get("content")); + return map; + } + + public String textToSpeech(String content) { + try{ + Credential cred = new Credential(secretId, secretKey); + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("tts.tencentcloudapi.com"); + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + TtsClient client = new TtsClient(cred, "ap-shanghai", clientProfile); + TextToVoiceRequest req = new TextToVoiceRequest(); + req.setText(content); + req.setSessionId(SnowflakeUtil.getNext()); + req.setVoiceType(101006L); + TextToVoiceResponse resp = client.TextToVoice(req); + return resp.getAudio(); + } catch (TencentCloudSDKException e) { + throw new RuntimeException(e); + } + } +} diff --git a/navigate-8432/src/main/java/com/ivmiku/tutorial/service/NavigateService.java b/navigate-8432/src/main/java/com/ivmiku/tutorial/service/NavigateService.java index 32ba49d..c942e1f 100644 --- a/navigate-8432/src/main/java/com/ivmiku/tutorial/service/NavigateService.java +++ b/navigate-8432/src/main/java/com/ivmiku/tutorial/service/NavigateService.java @@ -36,7 +36,11 @@ public class NavigateService { .execute(); String result = response.body(); response.close(); - JSONObject route = JSONObject.parseObject(JSONObject.parseObject(result).getString("route")); + JSONObject resultObj = JSONObject.parseObject(result); + if (resultObj.getInteger("status")==0) { + return null; + } + JSONObject route = JSONObject.parseObject(resultObj.getString("route")); JSONArray paths = JSONArray.parseArray(route.getString("paths")); JSONObject path = paths.getJSONObject(0); String distance = path.getString("distance"); @@ -81,4 +85,25 @@ public class NavigateService { } return result; } + + public String getGeoCode(String address, String city) { + Map params = new HashMap<>(); + params.put("key", key); + params.put("address", address); + if (!city.isEmpty()) { + params.put("city", city); + } + HttpResponse response = HttpRequest.get("https://restapi.amap.com/v3/geocode/geo") + .form(params) + .execute(); + String result = response.body(); + response.close(); + JSONObject resultObj = JSONObject.parseObject(result); + if (resultObj.getInteger("status")==0) { + return null; + } + JSONArray array = resultObj.getJSONArray("geocodes"); + JSONObject location = array.getJSONObject(0); + return location.getString("location"); + } } diff --git a/navigate-8432/src/main/java/com/ivmiku/tutorial/utils/SnowflakeUtil.java b/navigate-8432/src/main/java/com/ivmiku/tutorial/utils/SnowflakeUtil.java new file mode 100644 index 0000000..7d30793 --- /dev/null +++ b/navigate-8432/src/main/java/com/ivmiku/tutorial/utils/SnowflakeUtil.java @@ -0,0 +1,14 @@ +package com.ivmiku.tutorial.utils; + +import cn.hutool.core.lang.generator.SnowflakeGenerator; + +public class SnowflakeUtil { + private static SnowflakeGenerator generator; + + static { + generator = new SnowflakeGenerator(); + } + public static String getNext() { + return String.valueOf(generator.next()); + } +} -- 2.25.1