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/community-8073/pom.xml b/community-8073/pom.xml
index 8d30724..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
@@ -157,7 +168,7 @@
spring-boot-maven-plugin
3.0.13
- com.ivmiku.tutorial.Main8072
+ com.ivmiku.tutorial.Main8073
JAR
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..97f02c0 100644
--- a/navigate-8432/pom.xml
+++ b/navigate-8432/pom.xml
@@ -98,5 +98,10 @@
tencentcloud-sdk-java-ocr
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());
+ }
+}