diff --git a/src/main/java/com/zyx/mpdemo/controller/ChatgptController.java b/src/main/java/com/zyx/mpdemo/controller/ChatgptController.java index 5a41ef4..adf86de 100644 --- a/src/main/java/com/zyx/mpdemo/controller/ChatgptController.java +++ b/src/main/java/com/zyx/mpdemo/controller/ChatgptController.java @@ -1,6 +1,7 @@ package com.zyx.mpdemo.controller; import com.zyx.mpdemo.common.resp.CommonResponse; +import com.zyx.mpdemo.model.enums.ChatgptReqEnums; import com.zyx.mpdemo.service.ChatgptService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; @@ -25,8 +26,13 @@ public class ChatgptController { private ChatgptService chatgptService; @GetMapping("/answer") - public CommonResponse getCourseInfo(@RequestParam String question) { - return CommonResponse.success(chatgptService.getAnswer(question), "获取答案成功"); + public CommonResponse getAnswer(@RequestParam String question) { + return CommonResponse.success(chatgptService.getAnswer(question, ChatgptReqEnums.TEXT), "获取答案成功"); + } + + @GetMapping("/pic") + public CommonResponse getPic(@RequestParam String desc) { + return CommonResponse.success(chatgptService.getAnswer(desc, ChatgptReqEnums.PICTURE), "获取图片成功"); } } diff --git a/src/main/java/com/zyx/mpdemo/model/enums/ChatgptReqEnums.java b/src/main/java/com/zyx/mpdemo/model/enums/ChatgptReqEnums.java new file mode 100644 index 0000000..b45b921 --- /dev/null +++ b/src/main/java/com/zyx/mpdemo/model/enums/ChatgptReqEnums.java @@ -0,0 +1,19 @@ +package com.zyx.mpdemo.model.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * + * @author Yaxi.Zhang + * @since 2023/2/11 09:13 + */ +@Getter +@AllArgsConstructor +public enum ChatgptReqEnums { + TEXT(1), + PICTURE(2) + ; + + private final Integer code; +} diff --git a/src/main/java/com/zyx/mpdemo/model/req/BatchLearnedReq.java b/src/main/java/com/zyx/mpdemo/model/req/BatchLearnedReq.java index 8542525..0b910b2 100644 --- a/src/main/java/com/zyx/mpdemo/model/req/BatchLearnedReq.java +++ b/src/main/java/com/zyx/mpdemo/model/req/BatchLearnedReq.java @@ -17,10 +17,8 @@ public class BatchLearnedReq { @NotNull(message = "章节不能为空") private String chapter; - @NotNull(message = "开始序号不能为空") private String startSeq; - @NotNull(message = "结束序号不能为空") private String endSeq; } diff --git a/src/main/java/com/zyx/mpdemo/model/vo/CourseInfoVO.java b/src/main/java/com/zyx/mpdemo/model/vo/CourseInfoVO.java index 38f3b0a..c462229 100644 --- a/src/main/java/com/zyx/mpdemo/model/vo/CourseInfoVO.java +++ b/src/main/java/com/zyx/mpdemo/model/vo/CourseInfoVO.java @@ -3,6 +3,7 @@ package com.zyx.mpdemo.model.vo; import lombok.Data; import lombok.experimental.Accessors; +import java.util.List; import java.util.Set; /** @@ -28,6 +29,6 @@ public class CourseInfoVO { /** * 章节名称 */ - private Set chapters; + private List chapters; } diff --git a/src/main/java/com/zyx/mpdemo/service/ChatgptService.java b/src/main/java/com/zyx/mpdemo/service/ChatgptService.java index b763941..f3f4d7a 100644 --- a/src/main/java/com/zyx/mpdemo/service/ChatgptService.java +++ b/src/main/java/com/zyx/mpdemo/service/ChatgptService.java @@ -6,10 +6,13 @@ import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import com.zyx.mpdemo.model.enums.ChatgptReqEnums; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -22,16 +25,30 @@ public class ChatgptService { @Value("${chatgpt.api-key}") private String apiKey; - public String getAnswer(String question) { - String body = getAnswerBody(question); - return answerFromBody(body); + public String getAnswer(String desc, ChatgptReqEnums reqEnum) { + String body = getAnswerBody(desc, reqEnum); + return targetFromBody(body, reqEnum); } - private String getAnswerBody(String question) { + private String getAnswerBody(String desc, ChatgptReqEnums reqEnum) { + String body = ""; + String url = ""; + switch (reqEnum) { + case TEXT: + url = getAnswerUrl(); + body = getQuesStr(desc); + break; + case PICTURE: + url = getPicUrl(); + body = getPicStr(desc); + break; + default: + break; + } return HttpUtil - .createPost(getAnswerUrl()) + .createPost(url) .addHeaders(getHeaders()) - .body(getQuesStr(question), ContentType.JSON.getValue()) + .body(body, ContentType.JSON.getValue()) .setReadTimeout(60 * 30 * 1000) .setConnectionTimeout(60 * 30 * 1000) .setMaxRedirectCount(3) @@ -47,6 +64,14 @@ public class ChatgptService { .build(); } + private String getPicUrl() { + return UrlBuilder.of() + .setScheme("https") + .setHost("api.openai.com") + .addPath("v1/images/generations") + .build(); + } + private Map getHeaders() { Map headers = new HashMap<>(); headers.put("Authorization", "Bearer " + apiKey); @@ -54,20 +79,44 @@ public class ChatgptService { return headers; } - private String getQuesStr(String question) { + private String getQuesStr(String desc) { Map reqMap = new HashMap<>(); reqMap.put("model", "text-davinci-003"); - reqMap.put("prompt", question); + reqMap.put("prompt", desc); reqMap.put("temperature", 0); reqMap.put("max_tokens", 2048); return JSONUtil.toJsonStr(reqMap); } - private String answerFromBody(String body) { + private String getPicStr(String desc) { + Map reqMap = new HashMap<>(); + reqMap.put("prompt", desc); + reqMap.put("n", 2); + reqMap.put("size", "1024x1024"); + return JSONUtil.toJsonStr(reqMap); + } + + private String targetFromBody(String body, ChatgptReqEnums reqEnum) { JSONObject jsonObject = JSONUtil.parseObj(body); - JSONArray choices = jsonObject.getJSONArray("choices"); - JSONObject choice = choices.getJSONObject(0); - return choice.getStr("text"); + String target = ""; + switch (reqEnum) { + case TEXT: + JSONArray choices = jsonObject.getJSONArray("choices"); + JSONObject choice = choices.getJSONObject(0); + target = choice.getStr("text"); + break; + case PICTURE: + JSONArray urls = jsonObject.getJSONArray("data"); + List urlList = new ArrayList<>(); + for (JSONObject jsonObj : urls.jsonIter()) { + urlList.add(jsonObj.getStr("url")); + } + target = JSONUtil.toJsonStr(urlList); + break; + default: + break; + } + return target; } } diff --git a/src/main/java/com/zyx/mpdemo/service/impl/CourseServiceImpl.java b/src/main/java/com/zyx/mpdemo/service/impl/CourseServiceImpl.java index 4789f2a..67b093b 100644 --- a/src/main/java/com/zyx/mpdemo/service/impl/CourseServiceImpl.java +++ b/src/main/java/com/zyx/mpdemo/service/impl/CourseServiceImpl.java @@ -46,7 +46,12 @@ public class CourseServiceImpl extends ServiceImpl impleme List coursesById = courseMap.get(courseId); if (CollUtil.isNotEmpty(coursesById)) { String courseName = coursesById.get(0).getCourseName(); - Set chapters = coursesById.stream().map(Course::getChapter).collect(Collectors.toSet()); + List chapters = coursesById.stream() + .map(Course::getChapter) + .collect(Collectors.toSet()) + .stream() + .sorted() + .collect(Collectors.toList()); courseInfos.add(new CourseInfoVO().setCourseId(courseId).setCourseName(courseName).setChapters(chapters)); } } @@ -84,8 +89,8 @@ public class CourseServiceImpl extends ServiceImpl impleme queryWrapper .eq(Course::getCourseName, batchLearnedReq.getCourseName()) .eq(Course::getChapter, batchLearnedReq.getChapter()) - .ge(Course::getSequence, batchLearnedReq.getStartSeq()) - .le(Course::getSequence, batchLearnedReq.getEndSeq()) + .ge(StrUtil.isNotEmpty(batchLearnedReq.getStartSeq()), Course::getSequence, batchLearnedReq.getStartSeq()) + .le(StrUtil.isNotEmpty(batchLearnedReq.getEndSeq()),Course::getSequence, batchLearnedReq.getEndSeq()) .ne(Course::getCourseStatus, CourseStatusEnums.DELETE); List updateCourses = list(queryWrapper).stream() .filter(it -> it.getCourseStatus().equals(CourseStatusEnums.LEARNING))