From e4af8eb75a59df4f2592ee8c7519f1b70eeea143 Mon Sep 17 00:00:00 2001 From: rkdgusdnr99 <112935900+rkdgusdnr99@users.noreply.github.com> Date: Fri, 31 May 2024 23:41:19 +0900 Subject: [PATCH 1/8] =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20Save=20?= =?UTF-8?q?=EB=B0=8F=20Read=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=20*=20=ED=8C=8C=EC=9D=BC=20=EC=9D=B4=EB=A6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20:=20ImageService=20->=20RoboflowService=20=20*=20?= =?UTF-8?q?=EA=B8=B0=EC=A1=B4=20saveChat=20=EA=B8=B0=EB=8A=A5=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=98=95=20=EB=B3=80=EA=B2=BD=20=20*=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=EB=8A=94=20@Lob=EC=99=80=20byte[]=20?= =?UTF-8?q?=EC=9D=B4=EC=9A=A9=ED=95=B4=20=EC=A0=80=EC=9E=A5=20=20*=20Read?= =?UTF-8?q?=EB=8A=94=20ResponseEntity=20=ED=98=95=ED=83=9C?= =?UTF-8?q?=EB=A1=9C=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hello/aimju/chat/service/ChatService.java | 3 +- .../aimju/controller/ChatController.java | 15 ++--- .../aimju/controller/ImageController.java | 25 --------- .../IngredientsImageController.java | 55 +++++++++++++++++++ .../Service/IngredientsImageService.java | 44 +++++++++++++++ ...ImageService.java => RoboflowService.java} | 2 +- .../aimju/image/entity/IngredientsImage.java | 27 +++++++++ .../IngredientsImageRepository.java | 9 +++ 8 files changed, 146 insertions(+), 34 deletions(-) delete mode 100644 backend/src/main/java/hello/aimju/controller/ImageController.java create mode 100644 backend/src/main/java/hello/aimju/controller/IngredientsImageController.java create mode 100644 backend/src/main/java/hello/aimju/image/Service/IngredientsImageService.java rename backend/src/main/java/hello/aimju/image/Service/{ImageService.java => RoboflowService.java} (99%) create mode 100644 backend/src/main/java/hello/aimju/image/entity/IngredientsImage.java create mode 100644 backend/src/main/java/hello/aimju/image/repository/IngredientsImageRepository.java diff --git a/backend/src/main/java/hello/aimju/chat/service/ChatService.java b/backend/src/main/java/hello/aimju/chat/service/ChatService.java index 4cf69fd0..9d0bb2b2 100644 --- a/backend/src/main/java/hello/aimju/chat/service/ChatService.java +++ b/backend/src/main/java/hello/aimju/chat/service/ChatService.java @@ -29,7 +29,7 @@ public class ChatService { private final ChatRoomRepository chatRoomRepository; private final ChatMessageRepository chatMessageRepository; - public void saveChatData(ChatRoomRequestDto chatRoomRequestDto, HttpSession session) { + public Long saveChatData(ChatRoomRequestDto chatRoomRequestDto, HttpSession session) { // ChatRoom 데이터 저장 ChatRoom chatRoom = new ChatRoom(getUserFromSession(session), chatRoomRequestDto.getMenu()); chatRoomRepository.save(chatRoom); @@ -45,6 +45,7 @@ public void saveChatData(ChatRoomRequestDto chatRoomRequestDto, HttpSession sess chatMessages.add(chatMessage); } chatMessageRepository.saveAll(chatMessages); + return chatRoom.getId(); } public List getAllChatRooms(HttpSession session) { diff --git a/backend/src/main/java/hello/aimju/controller/ChatController.java b/backend/src/main/java/hello/aimju/controller/ChatController.java index 773b254c..1a42f5ab 100644 --- a/backend/src/main/java/hello/aimju/controller/ChatController.java +++ b/backend/src/main/java/hello/aimju/controller/ChatController.java @@ -1,33 +1,34 @@ package hello.aimju.controller; +import com.fasterxml.jackson.databind.ObjectMapper; import hello.aimju.chat.chat_message.dto.GetAllChatMessageResponseDto; import hello.aimju.chat.chat_room.dto.ChatRoomRequestDto; import hello.aimju.chat.chat_room.dto.GetAllChatRoomResponseDto; import hello.aimju.chat.service.ChatService; +import hello.aimju.image.Service.IngredientsImageService; import jakarta.servlet.http.HttpSession; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.List; @RestController @RequestMapping(value = "/api") +@RequiredArgsConstructor @CrossOrigin(origins = "http://localhost:3000") public class ChatController { private final ChatService chatService; - @Autowired - public ChatController(ChatService chatService) { - this.chatService = chatService; - } - @PostMapping("/recommendation-save") public ResponseEntity saveChatData(@RequestBody ChatRoomRequestDto chatRoomRequestDto, HttpSession session) { - chatService.saveChatData(chatRoomRequestDto, session); - return ResponseEntity.status(HttpStatus.CREATED).body("Chat data saved successfully."); + Long chatId = chatService.saveChatData(chatRoomRequestDto, session); + return ResponseEntity.status(HttpStatus.CREATED).body(chatId.toString()); } @GetMapping("/chatrooms") diff --git a/backend/src/main/java/hello/aimju/controller/ImageController.java b/backend/src/main/java/hello/aimju/controller/ImageController.java deleted file mode 100644 index 1a65cbbc..00000000 --- a/backend/src/main/java/hello/aimju/controller/ImageController.java +++ /dev/null @@ -1,25 +0,0 @@ -package hello.aimju.controller; - -import hello.aimju.image.Service.ImageService; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -@RestController -@RequestMapping("/api") -public class ImageController { - - private final ImageService imageService; - - public ImageController(ImageService imageService) { - this.imageService = imageService; - } - - /* - * 사진 업로드 후 재료 인식 - * */ - @PostMapping("/photo-recognition") - public String uploadImage(@RequestParam("file") MultipartFile file) { - return imageService.uploadAndProcessImage(file); - } - -} diff --git a/backend/src/main/java/hello/aimju/controller/IngredientsImageController.java b/backend/src/main/java/hello/aimju/controller/IngredientsImageController.java new file mode 100644 index 00000000..d67268a1 --- /dev/null +++ b/backend/src/main/java/hello/aimju/controller/IngredientsImageController.java @@ -0,0 +1,55 @@ +package hello.aimju.controller; + +import hello.aimju.image.Service.IngredientsImageService; +import hello.aimju.image.Service.RoboflowService; +import hello.aimju.image.entity.IngredientsImage; +import hello.aimju.user.dto.StatusResponseDto; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api") +public class IngredientsImageController { + + private final RoboflowService roboflowService; + private final IngredientsImageService ingredientsImageService; + + /* + * 사진 업로드 후 재료 인식 + * */ + @PostMapping("/photo-recognition") + public String uploadImage(@RequestParam("file") MultipartFile file) { + return roboflowService.uploadAndProcessImage(file); + } + + /* + * 사진 저장...사용 x + * */ + @PostMapping("/photo-save") + public ResponseEntity saveImage(@RequestParam("file") MultipartFile file, + @RequestParam("recipeId") String recipeId) throws IOException{ + if (recipeId.isEmpty() || file.isEmpty()) { + return null; + } + Long numberId = Long.parseLong(recipeId); + System.out.println("저장 요청 도착: " + numberId); + return ingredientsImageService.saveImage(file, numberId); + } + + @GetMapping("/photo/{chatId}") + public ResponseEntity getImageByChatId(@PathVariable("chatId") Long chatId) { + IngredientsImage image = ingredientsImageService.findByChatId(chatId); + if (image == null) { + return ResponseEntity.notFound().build(); + } + return ResponseEntity.ok() + .contentType(MediaType.IMAGE_JPEG) // 적절한 미디어 타입으로 설정 + .body(image.getImage()); + } +} diff --git a/backend/src/main/java/hello/aimju/image/Service/IngredientsImageService.java b/backend/src/main/java/hello/aimju/image/Service/IngredientsImageService.java new file mode 100644 index 00000000..4dbe35f5 --- /dev/null +++ b/backend/src/main/java/hello/aimju/image/Service/IngredientsImageService.java @@ -0,0 +1,44 @@ +package hello.aimju.image.Service; + +import hello.aimju.chat.chat_room.domain.ChatRoom; +import hello.aimju.chat.chat_room.repository.ChatRoomRepository; +import hello.aimju.image.entity.IngredientsImage; +import hello.aimju.image.repository.IngredientsImageRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +@Service +@RequiredArgsConstructor +public class IngredientsImageService { + private final IngredientsImageRepository ingredientsImageRepository; + private final ChatRoomRepository chatRoomRepository; + + public ResponseEntity saveImage(MultipartFile imageFile, Long chatId) throws IOException { + String fileName = imageFile.getOriginalFilename(); + byte[] imageData = imageFile.getBytes(); + + IngredientsImage image = new IngredientsImage(); + image.setName(fileName); + image.setImage(imageData); + + ChatRoom chatRoom = chatRoomRepository.findById(chatId) + .orElseThrow(() -> new IllegalArgumentException("채팅방을 찾을 수 없습니다. ID: " + chatId)); + + image.setChatRoom(chatRoom); + ingredientsImageRepository.save(image); + + // 성공적인 응답 반환 + return ResponseEntity.status(HttpStatus.CREATED).body("채팅이 저장되었습니다."); + } + + public IngredientsImage findByChatId(Long chatId) { + ChatRoom chatRoom = chatRoomRepository.findById(chatId) + .orElseThrow(() -> new IllegalArgumentException("채팅방을 찾을 수 없습니다. ID: " + chatId)); + return ingredientsImageRepository.findByChatRoom(chatRoom); + } +} diff --git a/backend/src/main/java/hello/aimju/image/Service/ImageService.java b/backend/src/main/java/hello/aimju/image/Service/RoboflowService.java similarity index 99% rename from backend/src/main/java/hello/aimju/image/Service/ImageService.java rename to backend/src/main/java/hello/aimju/image/Service/RoboflowService.java index 66aacfe4..0f5219b2 100644 --- a/backend/src/main/java/hello/aimju/image/Service/ImageService.java +++ b/backend/src/main/java/hello/aimju/image/Service/RoboflowService.java @@ -14,7 +14,7 @@ import java.util.*; @Service -public class ImageService { +public class RoboflowService { // Roboflow API 키 @Value("${roboflow.api-key}") private String ROBOFLOW_API_KEY; diff --git a/backend/src/main/java/hello/aimju/image/entity/IngredientsImage.java b/backend/src/main/java/hello/aimju/image/entity/IngredientsImage.java new file mode 100644 index 00000000..130131d7 --- /dev/null +++ b/backend/src/main/java/hello/aimju/image/entity/IngredientsImage.java @@ -0,0 +1,27 @@ +package hello.aimju.image.entity; + +import hello.aimju.chat.chat_room.domain.ChatRoom; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + + +@Entity +@Getter +@Setter +public class IngredientsImage { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "name", nullable = false) + private String name; + + @Lob + @Column(name = "image", nullable = false, columnDefinition = "LONGBLOB") + private byte[] image; + + @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "chat_id") + private ChatRoom chatRoom; +} diff --git a/backend/src/main/java/hello/aimju/image/repository/IngredientsImageRepository.java b/backend/src/main/java/hello/aimju/image/repository/IngredientsImageRepository.java new file mode 100644 index 00000000..199e1629 --- /dev/null +++ b/backend/src/main/java/hello/aimju/image/repository/IngredientsImageRepository.java @@ -0,0 +1,9 @@ +package hello.aimju.image.repository; + +import hello.aimju.chat.chat_room.domain.ChatRoom; +import hello.aimju.image.entity.IngredientsImage; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface IngredientsImageRepository extends JpaRepository { + IngredientsImage findByChatRoom(ChatRoom chatRoom); +} From 321e9eaf8c33b769167705ef5c16334179f22cce Mon Sep 17 00:00:00 2001 From: rkdgusdnr99 <112935900+rkdgusdnr99@users.noreply.github.com> Date: Fri, 31 May 2024 23:42:29 +0900 Subject: [PATCH 2/8] =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=20=20*=20step=20=3D=3D=3D=205=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=B4=EC=84=9C=20useEffect=20=EC=9D=B4=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/app/recommend/page.tsx | 32 +++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/recommend/page.tsx b/frontend/src/app/recommend/page.tsx index d46f43fa..f1d2fe99 100755 --- a/frontend/src/app/recommend/page.tsx +++ b/frontend/src/app/recommend/page.tsx @@ -38,6 +38,7 @@ export default function Recommend() { const [yesOrNoButtonEnabled, setYesOrNoButtonEnabled] = useState(true); const [recipeButtonEnabled, setRecipeButtonEnabled] = useState(true); const [imageUrl, setImageUrl] = useState(''); + const [recipeId, setRecipeId] = useState(''); const router = useRouter(); @@ -143,7 +144,7 @@ export default function Recommend() { recipeString: string ) => { addChatMessage("환영합니다! 재료를 인식할 사진을 업로드 해주세요!", 0, 'message'); - addChatMessage("이미지", 1, 'message'); + addChatMessage("이미지", 1, 'image'); addChatMessage(`인식된 재료는 다음과 같습니다.\n${ingredients}`, 0, 'message'); addChatMessage("재료를 추가하거나 수정하시겠습니까?", 0, 'message'); addChatMessage(`${yesOrNo}`, 1, 'message'); @@ -188,13 +189,40 @@ export default function Recommend() { axios.post('/api/recommendation-save', chatRoomRequestDto) .then(response => { console.log('Chat data saved successfully:', response.data); + setRecipeId(response.data); }) .catch(error => { console.error('Error saving chat data:', error); }); + handleNextStep(); } }, [chatHistory, step, menu]); + useEffect(() => { + if (chatHistory.length > 0 && step === 5) { + if (!file) { + alert('파일을 선택해주세요.'); + return; + } + + const formData = new FormData(); + formData.append('file', file); + formData.append('recipeId', recipeId); + + axios.post('/api/photo-save', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + .then(response => { + console.log('Image saved successfully:', response.data); + }) + .catch(error => { + console.error('Error saving image:', error); + }); + } + }, [chatHistory, step, file, recipeId]); + const fileChange = (event: any) => { setFile(event.target.files[0]); } @@ -479,4 +507,4 @@ export default function Recommend() { ); -}; +}; \ No newline at end of file From de56837c7c8ddb93ea2f87928db693370dc37eca Mon Sep 17 00:00:00 2001 From: rkdgusdnr99 <112935900+rkdgusdnr99@users.noreply.github.com> Date: Fri, 31 May 2024 23:42:55 +0900 Subject: [PATCH 3/8] =?UTF-8?q?=EC=A0=80=EC=9E=A5=ED=95=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EB=B3=B4=EC=97=AC=EC=A3=BC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/app/chatroom/[chatroomId]/page.tsx | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/chatroom/[chatroomId]/page.tsx b/frontend/src/app/chatroom/[chatroomId]/page.tsx index 85c95528..009b662c 100644 --- a/frontend/src/app/chatroom/[chatroomId]/page.tsx +++ b/frontend/src/app/chatroom/[chatroomId]/page.tsx @@ -1,5 +1,5 @@ 'use client' -import React, {useState, useEffect, useCallback} from 'react'; +import React, { useState, useEffect, useCallback } from 'react'; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; @@ -8,6 +8,7 @@ import axios from "axios"; import { useRouter } from "next/navigation"; interface Message { + id: number; chatType: string; isUser: number; content: string; @@ -41,6 +42,24 @@ export default function ChatRoom({ params }: { params: { chatroomId: number } }) } }; + // 이미지를 가져오는 함수 + const fetchImage = async (chatId: number) => { + try { + // 이미지를 가져오는 API 엔드포인트 호출 + const response = await axios.get(`/api/photo/${chatId}`, { + responseType: 'arraybuffer' // 이미지 데이터를 바이너리로 받음 + }); + + // 응답에서 이미지 데이터 추출 + const imageData = Buffer.from(response.data, 'binary').toString('base64'); + + // 이미지를 data URI 형식으로 변환하여 반환 + return `data:image/jpeg;base64,${imageData}`; + } catch (error) { + console.error('Error fetching image:', error); + return null; + } + }; useEffect(() => { axios.get(`/api/chatroom/${params.chatroomId}`) @@ -58,7 +77,7 @@ export default function ChatRoom({ params }: { params: { chatroomId: number } }) const recipeString = recipeMessages.map(message => message.content.replace(/
/g, "\n")).join("\n"); setRecipeString(recipeString); - const messagesWithLinks = messagesWithBr.map(message => { + const messagesWithComponents = messagesWithBr.map(async (message) => { if (message.chatType === "link") { return { ...message, @@ -69,12 +88,18 @@ export default function ChatRoom({ params }: { params: { chatroomId: number } }) ...message, content: `Chat Image` }; + } else if (message.chatType === "image") { + // 이미지 가져오기 + const imageData = await fetchImage(params.chatroomId); + return { + ...message, + content: `Chat Image` + }; } else { return message; } }); - setChatMessages(messagesWithLinks); - + Promise.all(messagesWithComponents).then(setChatMessages); }) .catch(error => { alert('비정상적인 접근입니다.'); @@ -82,7 +107,6 @@ export default function ChatRoom({ params }: { params: { chatroomId: number } }) }); }, [params.chatroomId, handleRoutingMain]); - return ( <>
@@ -120,4 +144,4 @@ export default function ChatRoom({ params }: { params: { chatroomId: number } }) ); -} +} \ No newline at end of file From 3a7931385ef1964f88b8bc79930419a0b6943ad1 Mon Sep 17 00:00:00 2001 From: rkdgusdnr99 <112935900+rkdgusdnr99@users.noreply.github.com> Date: Sat, 1 Jun 2024 00:24:33 +0900 Subject: [PATCH 4/8] =?UTF-8?q?=EC=98=A4=EB=A5=98=EC=88=98=EC=A0=95=20=20*?= =?UTF-8?q?=20=ED=81=AC=EB=A1=A4=EB=A7=81=20=EC=8B=9C=20=EB=8F=99=EC=98=81?= =?UTF-8?q?=EC=83=81=20=EC=9E=AC=EC=83=9D=EB=B2=84=ED=8A=BC=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=98=A4=EB=8A=94=20=EC=98=A4=EB=A5=98=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hello/aimju/image/Crawling/Service/CrawlingService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/hello/aimju/image/Crawling/Service/CrawlingService.java b/backend/src/main/java/hello/aimju/image/Crawling/Service/CrawlingService.java index 5cc609c0..d5ec62f7 100644 --- a/backend/src/main/java/hello/aimju/image/Crawling/Service/CrawlingService.java +++ b/backend/src/main/java/hello/aimju/image/Crawling/Service/CrawlingService.java @@ -29,7 +29,8 @@ public String fetchImageUrl(String query) throws IOException { System.out.println("Document fetched"); // 이미지 URL 추출 - Element imgElement = doc.select("div.common_sp_thumb img").first(); + Element imgElement = doc.select("div.common_sp_thumb img:not(.common_vod_label img)").first(); + if (imgElement != null) { String imageUrl = imgElement.attr("src"); System.out.println("Image URL: " + imageUrl); From c397b2e59fc48070bae5f23da7f46d4a8c691a23 Mon Sep 17 00:00:00 2001 From: rkdgusdnr99 <112935900+rkdgusdnr99@users.noreply.github.com> Date: Sat, 1 Jun 2024 00:25:19 +0900 Subject: [PATCH 5/8] =?UTF-8?q?=EC=98=A4=EB=A5=98=EC=88=98=EC=A0=95=20=20*?= =?UTF-8?q?=20=EC=B1=84=ED=8C=85=EB=B0=A9=20=EC=82=AD=EC=A0=9C=20=EC=95=88?= =?UTF-8?q?=EB=90=98=EB=8D=98=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/hello/aimju/chat/chat_room/domain/ChatRoom.java | 3 +++ .../main/java/hello/aimju/image/entity/IngredientsImage.java | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/hello/aimju/chat/chat_room/domain/ChatRoom.java b/backend/src/main/java/hello/aimju/chat/chat_room/domain/ChatRoom.java index 27372b87..f159001a 100644 --- a/backend/src/main/java/hello/aimju/chat/chat_room/domain/ChatRoom.java +++ b/backend/src/main/java/hello/aimju/chat/chat_room/domain/ChatRoom.java @@ -1,6 +1,7 @@ package hello.aimju.chat.chat_room.domain; import hello.aimju.chat.chat_message.domain.ChatMessage; +import hello.aimju.image.entity.IngredientsImage; import hello.aimju.user.domain.User; import hello.aimju.timestamp.Timestamped; import jakarta.persistence.*; @@ -24,6 +25,8 @@ public class ChatRoom extends Timestamped{ // created_at 알아서 생성해줌 private User user; @OneToMany(mappedBy = "chatRoom", cascade = CascadeType.ALL, orphanRemoval = true) private List chatMessages = new ArrayList<>(); + @OneToMany(mappedBy = "chatRoom", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) + private List ingredientsImages = new ArrayList<>(); public ChatRoom(User user, String menu) { this.user = user; diff --git a/backend/src/main/java/hello/aimju/image/entity/IngredientsImage.java b/backend/src/main/java/hello/aimju/image/entity/IngredientsImage.java index 130131d7..baa5055d 100644 --- a/backend/src/main/java/hello/aimju/image/entity/IngredientsImage.java +++ b/backend/src/main/java/hello/aimju/image/entity/IngredientsImage.java @@ -21,7 +21,7 @@ public class IngredientsImage { @Column(name = "image", nullable = false, columnDefinition = "LONGBLOB") private byte[] image; - @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) - @JoinColumn(name = "chat_id") + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "chat_Id") private ChatRoom chatRoom; } From 1e28eb9ac3f8844edb55f26b885ae4956fdcba00 Mon Sep 17 00:00:00 2001 From: rkdgusdnr99 <112935900+rkdgusdnr99@users.noreply.github.com> Date: Sat, 1 Jun 2024 00:26:22 +0900 Subject: [PATCH 6/8] =?UTF-8?q?=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0=20?= =?UTF-8?q?=20*=20=EA=B2=8C=EC=8B=9C=ED=8C=90=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EA=B8=80=EC=93=B0=EA=B8=B0=20=EC=8B=9C=20=EB=A0=88=EC=8B=9C?= =?UTF-8?q?=ED=94=BC=20=EA=B0=80=EC=A0=B8=EC=98=A4=EA=B8=B0=20=EB=AA=BB?= =?UTF-8?q?=ED=95=98=EB=8D=98=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/app/boards/writing/[recipeId]/page.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/boards/writing/[recipeId]/page.tsx b/frontend/src/app/boards/writing/[recipeId]/page.tsx index d361aaf8..ceba868d 100644 --- a/frontend/src/app/boards/writing/[recipeId]/page.tsx +++ b/frontend/src/app/boards/writing/[recipeId]/page.tsx @@ -31,6 +31,7 @@ export default function PostWriting({ params }: { params: { recipeId: number } } fetchRecipeContent(); } else { setTitle('제목을 입력해주세요'); + fetchRecipes(); setContent('내용을 입력해주세요'); } }, [params.recipeId]); From 048b410b1778efe2e2f12eb68875753762b9a5f3 Mon Sep 17 00:00:00 2001 From: rkdgusdnr99 <112935900+rkdgusdnr99@users.noreply.github.com> Date: Sat, 1 Jun 2024 14:00:42 +0900 Subject: [PATCH 7/8] =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=20*=20chatId=EB=A5=BC=20recipeId=EB=A1=9C=20=EC=9E=98=EB=AA=BB?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1=ED=95=B4=20=EB=86=93=EC=9D=80=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aimju/controller/IngredientsImageController.java | 7 +++---- frontend/src/app/recommend/page.tsx | 8 ++++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/backend/src/main/java/hello/aimju/controller/IngredientsImageController.java b/backend/src/main/java/hello/aimju/controller/IngredientsImageController.java index d67268a1..51c2dd7d 100644 --- a/backend/src/main/java/hello/aimju/controller/IngredientsImageController.java +++ b/backend/src/main/java/hello/aimju/controller/IngredientsImageController.java @@ -3,7 +3,6 @@ import hello.aimju.image.Service.IngredientsImageService; import hello.aimju.image.Service.RoboflowService; import hello.aimju.image.entity.IngredientsImage; -import hello.aimju.user.dto.StatusResponseDto; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -33,11 +32,11 @@ public String uploadImage(@RequestParam("file") MultipartFile file) { * */ @PostMapping("/photo-save") public ResponseEntity saveImage(@RequestParam("file") MultipartFile file, - @RequestParam("recipeId") String recipeId) throws IOException{ - if (recipeId.isEmpty() || file.isEmpty()) { + @RequestParam("chatId") String chatId) throws IOException{ + if (chatId.isEmpty() || file.isEmpty()) { return null; } - Long numberId = Long.parseLong(recipeId); + Long numberId = Long.parseLong(chatId); System.out.println("저장 요청 도착: " + numberId); return ingredientsImageService.saveImage(file, numberId); } diff --git a/frontend/src/app/recommend/page.tsx b/frontend/src/app/recommend/page.tsx index f1d2fe99..369aca5c 100755 --- a/frontend/src/app/recommend/page.tsx +++ b/frontend/src/app/recommend/page.tsx @@ -38,7 +38,7 @@ export default function Recommend() { const [yesOrNoButtonEnabled, setYesOrNoButtonEnabled] = useState(true); const [recipeButtonEnabled, setRecipeButtonEnabled] = useState(true); const [imageUrl, setImageUrl] = useState(''); - const [recipeId, setRecipeId] = useState(''); + const [chatId, setChatId] = useState(''); const router = useRouter(); @@ -189,7 +189,7 @@ export default function Recommend() { axios.post('/api/recommendation-save', chatRoomRequestDto) .then(response => { console.log('Chat data saved successfully:', response.data); - setRecipeId(response.data); + setChatId(response.data); }) .catch(error => { console.error('Error saving chat data:', error); @@ -207,7 +207,7 @@ export default function Recommend() { const formData = new FormData(); formData.append('file', file); - formData.append('recipeId', recipeId); + formData.append('chatId', chatId); axios.post('/api/photo-save', formData, { headers: { @@ -221,7 +221,7 @@ export default function Recommend() { console.error('Error saving image:', error); }); } - }, [chatHistory, step, file, recipeId]); + }, [chatHistory, step, file, chatId]); const fileChange = (event: any) => { setFile(event.target.files[0]); From 4bd0433741c6b33e257ee63fe0018f907549ad39 Mon Sep 17 00:00:00 2001 From: rkdgusdnr99 <112935900+rkdgusdnr99@users.noreply.github.com> Date: Sat, 1 Jun 2024 14:23:33 +0900 Subject: [PATCH 8/8] =?UTF-8?q?=ED=94=84=EB=A1=AC=ED=94=84=ED=8C=85=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0=20=20*=20=EB=A0=88=EC=8B=9C=ED=94=BC?= =?UTF-8?q?=EB=A5=BC=203=EA=B3=BC=EC=A0=95=EC=9C=BC=EB=A1=9C=20=EC=95=95?= =?UTF-8?q?=EC=B6=95=20->=20n=EA=B0=9C=EC=9D=98=20=EA=B3=BC=EC=A0=95?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=B6=94=EC=B2=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/hello/aimju/gpt/service/ChatGptServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/hello/aimju/gpt/service/ChatGptServiceImpl.java b/backend/src/main/java/hello/aimju/gpt/service/ChatGptServiceImpl.java index 746accc2..b6523dd3 100644 --- a/backend/src/main/java/hello/aimju/gpt/service/ChatGptServiceImpl.java +++ b/backend/src/main/java/hello/aimju/gpt/service/ChatGptServiceImpl.java @@ -128,7 +128,7 @@ private String recipeQuestionBuilder(String menu, String ingredients) { + "구체적인 재료와 레시피를 추천해주는데 형식은 반드시 아래와 같아야해 다른말은 하지 말아줘" + "\\n메뉴: 음식이름" + "재료:\\n1.재료1\\n2.재료2\\n3.재료3\\n" - + "레시피:\\n1.요리순서1\\n2.요리순서2\\n3.요리순서3"; + + "레시피:\\n1.요리순서1\\n2.요리순서2\\n3.요리순서3\\nn......"; } /**