Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

엘라스틱 서치 검색 기능 구현 #216

Closed
wants to merge 64 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
1b471bd
feat: 관리자모드 신고내역관리, 문의내역관리 완성
kanggiho Mar 12, 2025
9d408a6
feat. 로그인 및 회원가입 UI 및 기능 구현 (#173)
Jenius-95 Mar 12, 2025
30021f6
### 신고기능구현/신고후 신고내역조회->유저신고 게시판으로
son-goten Mar 12, 2025
d4ade78
feat: Modify review entity (#179)
gunny97h Mar 12, 2025
5eaf125
feat. 로그인 및 회원가입 UI 및 기능 구현
kanggiho Mar 12, 2025
ed173c3
신고기능구현/신고후 신고내역조회->유저신고 게시판으로
kanggiho Mar 12, 2025
6f295ef
Merge branch 'develop' into feature/giho-admin
kanggiho Mar 12, 2025
acc2e29
관리자모드 신고내역관리, 문의내역관리 완성
kanggiho Mar 12, 2025
8630b69
feat: Add review insert (#179)
gunny97h Mar 13, 2025
716c635
리뷰 작성 및 확인 기능 구현 및 리뷰 Entity 수정
kanggiho Mar 13, 2025
c9db362
feat: 관리자모드 상품관리 완성
kanggiho Mar 13, 2025
8799aba
feat. 로그인 및 회원가입 UI 및 기능 구현 (#173)
Jenius-95 Mar 13, 2025
a880663
Merge branch 'develop' of https://github.com/kanggiho/ssauc into feat…
Jenius-95 Mar 13, 2025
5aa361a
feat. 로그인 UI 이미지 추가
Jenius-95 Mar 13, 2025
6dc8fad
Feature/yeongjae login
kanggiho Mar 13, 2025
dd52832
feat: Modify session-based authentication with JWT token (#187)
gunny97h Mar 13, 2025
816b003
Merge branch 'develop' of https://github.com/kanggiho/ssauc into feat…
gunny97h Mar 13, 2025
5b66fc5
feat: 관리자모드 회원관리 완성
kanggiho Mar 13, 2025
912130d
feat: Modify session-based authentication with JWT token (#187)
gunny97h Mar 13, 2025
2f74a4a
feat: 관리자모드 상품관리, 회원관리, 문의내역관리, 신고내역관리 완성
kanggiho Mar 13, 2025
6e0ac79
관리자모드 상품관리, 회원관리, 문의내역관리, 신고내역관리 완성
kanggiho Mar 13, 2025
86a363b
HttpSession을 JWT 토큰으로 수정
kanggiho Mar 13, 2025
026577d
### 채팅기능 jwt에맞게개선
son-goten Mar 13, 2025
b420caf
### 채팅기능 jwt에맞게개선
kanggiho Mar 13, 2025
12d90bb
feat. 로그인 UI 수정 (#194)
Jenius-95 Mar 13, 2025
7fe8fad
Merge branch 'develop' of https://github.com/kanggiho/ssauc into feat…
Jenius-95 Mar 13, 2025
e285304
feat: Modify session-based authentication with JWT token (#187)
gunny97h Mar 13, 2025
1fe4d3f
로그인 UI 수정
kanggiho Mar 13, 2025
1d7d44a
HttpSession을 JWT 토큰으로 수정2
kanggiho Mar 13, 2025
ed83070
feat: chatting 구현전 셋팅
kanggiho Mar 13, 2025
652938c
feat: Modify session-based authentication with JWT token (#197)
gunny97h Mar 13, 2025
03ba2f6
Merge pull request #198 from kanggiho/feature/kunhee-mypage
kanggiho Mar 14, 2025
b30ea10
feat: Add review detail (#200)
gunny97h Mar 14, 2025
0323245
feat: Add navigation to bid page on product name (#200)
gunny97h Mar 14, 2025
a2fbe49
리뷰 상세 정보 기능 구현
kanggiho Mar 14, 2025
e4d0d70
feat: 채팅방 기본 기능 구현
kanggiho Mar 14, 2025
19f7641
feat: 채팅방 기본 기능 구현 말풍선
kanggiho Mar 14, 2025
a2b17ed
feat. 로그인 및 회원가입 UI 수정 주소 API 추가 (#202)
Jenius-95 Mar 14, 2025
da22bb8
Merge branch 'develop' of https://github.com/kanggiho/ssauc into feat…
Jenius-95 Mar 14, 2025
aadb974
로그인 및 회원가입 UI 수정 주소 API 추가
kanggiho Mar 14, 2025
d23a8ff
feat: 상품 상세정보까지 추가
kanggiho Mar 14, 2025
7f0643f
feat. 아이디 찾기 및 비밀번호 변경 UI 및 기능 구현 (#204)
Jenius-95 Mar 14, 2025
14cea29
feat: PLP session에서 jwt로 수정
HeeJava Mar 14, 2025
7ef2052
feat: 채팅기능 구현완료
kanggiho Mar 14, 2025
66a2a6b
Merge branch 'develop' into feature/giho-chatting
kanggiho Mar 14, 2025
4c8531a
채팅기능 구현 - 상호간의 채팅 websocket을 사용하여 구현
kanggiho Mar 14, 2025
3b97bd8
아이디 찾기 및 비밀번호 변경 UI 및 기능 구현
kanggiho Mar 14, 2025
576008b
Merge branch 'develop' into feature/heejae-recommend
kanggiho Mar 14, 2025
b69987e
PLP Session을 JWT로 수정
kanggiho Mar 14, 2025
9fda38d
feat: chatting 구매가 포인트화 및 전송창 디자인 수정
kanggiho Mar 15, 2025
e580855
feat: chatting 신고하기 기능 구현 완료
kanggiho Mar 15, 2025
174e785
feat: chatting 차단하기 DB저장 가능
kanggiho Mar 15, 2025
f139f1f
feat: chatting 차단하기 기능구현 완료
kanggiho Mar 15, 2025
3c3782a
채팅 추가기능 구현, 차단하기 및 유저신고
kanggiho Mar 15, 2025
3a9a17c
feat: Add reputation scheduler files (#212)
gunny97h Mar 16, 2025
9b38f33
feat: Add reputation event files (#212)
gunny97h Mar 16, 2025
42eaf25
feat: Add reputation event listener and service files (#212)
gunny97h Mar 16, 2025
33d5f04
feat: Modify reputation files (#212)
gunny97h Mar 16, 2025
368c55a
feat: Add last login files (#212)
gunny97h Mar 16, 2025
e620c5c
Merge pull request #213 from kanggiho/feature/kunhee-mypage
kanggiho Mar 16, 2025
57967df
feat: chatting 간단한 오류수정
kanggiho Mar 16, 2025
c224c1d
feat: bid 간단한 오류수정
kanggiho Mar 16, 2025
49c4d67
채팅 및 입찰기능 간단한 오류수정
kanggiho Mar 16, 2025
c8400fc
feat. 엘라스틱 서치 검색 기능 구현 (#215)
Jenius-95 Mar 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,6 @@ out/

/logs/

application.yml
application.yml

firebase-service-account.json
23 changes: 23 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,29 @@ dependencies {
implementation 'org.apache.poi:poi:5.2.3'
implementation 'org.apache.poi:poi-ooxml:5.2.3'

// Spring Data Elasticsearch & Redis (선택 사용)
implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

// Spring Security & OAuth2
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation "org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.1.1.RELEASE"

// Firebase Admin SDK
implementation 'com.google.firebase:firebase-admin:9.2.0'
implementation 'com.google.protobuf:protobuf-java:3.25.1' // 최신 버전 사용

// JWT 라이브러리
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
implementation 'io.jsonwebtoken:jjwt-impl:0.11.5'
implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5'

// Jakarta JSON API (선택)
implementation 'jakarta.json:jakarta.json-api:2.1.2'
implementation 'org.glassfish:jakarta.json:2.0.1'

compileOnly 'javax.servlet:javax.servlet-api:4.0.1'

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public String home(@RequestParam("adminId") String adminId,
return "/admin/admin";
}
// 검증 성공 시 session에 admin 정보를 저장하고, home 페이지로 리다이렉트
session.setMaxInactiveInterval(30*60);
session.setAttribute("admin", admin);
return "redirect:/admin/home";
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
package com.example.ssauc.admin.controller;

import com.example.ssauc.admin.dto.ProductStatusRequestDto;
import com.example.ssauc.admin.service.AdminProductService;
import com.example.ssauc.user.product.entity.Product;
import jakarta.persistence.EntityNotFoundException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.List;

@RequestMapping("/admin/product")
@Controller
public class AdminProductController {

@Autowired
private AdminProductService adminProductService;


@GetMapping
public String getProductsList(Model model,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "productId,asc") String sort,
@RequestParam(required = false) String keyword) {

String[] sortParams = sort.split(",");
String sortField = sortParams[0];
String sortDir = sortParams[1];

Page<Product> productList;

if (keyword != null && !keyword.trim().isEmpty()) {
productList = adminProductService.searchProductsByName(keyword, page, sortField, sortDir);
} else {
productList = adminProductService.getProducts(page, sortField, sortDir);
}

model.addAttribute("productList", productList);
model.addAttribute("currentSort", sort);
model.addAttribute("keyword", keyword); // 검색어 유지
return "/admin/adminproduct";
}


@GetMapping("/detail")
public String productDetail(@RequestParam("productId") Long productId, Model model){
// productId를 이용해 신고 내역 정보를 조회
Product product = adminProductService.findProductById(productId);
model.addAttribute("product", product);
return "/admin/adminproductdetail";
}

@PostMapping("/result")
public ResponseEntity<?> changeProductStatus(@RequestBody ProductStatusRequestDto request) {
try {
adminProductService.changeProductStatus(request.getProductId(), request.getStatus());
return ResponseEntity.ok("상품 상태가 변경되었습니다.");
} catch (EntityNotFoundException e) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("상품을 찾을 수 없습니다.");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("상태 변경에 실패했습니다.");
}
}


@GetMapping("/export")
public void exportProduct(HttpServletResponse response) {
try {
// 엑셀 파일 다운로드 응답 설정
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
String headerKey = "Content-Disposition";
String headerValue = "attachment; filename=product.xlsx";
response.setHeader(headerKey, headerValue);

// Product 데이터 조회
List<Product> productList = adminProductService.findAllProducts();

// Apache POI를 사용하여 워크북 생성
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Product");

// 헤더 스타일 생성
XSSFFont headerFont = workbook.createFont();
headerFont.setBold(true);
headerFont.setColor(IndexedColors.BLUE.getIndex()); // 파란색

XSSFCellStyle headerCellStyle = workbook.createCellStyle();
headerCellStyle.setFont(headerFont);

// 헤더 행 생성 및 스타일 적용
XSSFRow headerRow = sheet.createRow(0);
String[] headers = {"상품아이디", "판매자이름", "카테고리", "상품이름", "상품설명", "즉시구매가",
"현재입찰가", "경매시작가", "이미지주소", "판매상태", "등록시간", "마감시간", "조회수",
"거래방식", "최소입찰단위", "좋아요수", "입찰수"
};
for (int i = 0; i < headers.length; i++) {
headerRow.createCell(i).setCellValue(headers[i]);
headerRow.getCell(i).setCellStyle(headerCellStyle);
}

// 데이터 행 추가
int rowCount = 1;
for (Product product : productList) {
XSSFRow row = sheet.createRow(rowCount++);
row.createCell(0).setCellValue(product.getProductId());
row.createCell(1).setCellValue(product.getSeller().getUserName());
row.createCell(2).setCellValue(product.getCategory().getName());
row.createCell(3).setCellValue(product.getName());
row.createCell(4).setCellValue(product.getDescription());
row.createCell(5).setCellValue(product.getPrice());
row.createCell(6).setCellValue(product.getTempPrice());
row.createCell(7).setCellValue(product.getStartPrice());
row.createCell(8).setCellValue(product.getImageUrl());
row.createCell(9).setCellValue(product.getStatus());
row.createCell(10).setCellValue(product.getCreatedAt());
row.createCell(11).setCellValue(product.getEndAt());
row.createCell(12).setCellValue(product.getViewCount());
row.createCell(13).setCellValue(product.getDealType());
row.createCell(14).setCellValue(product.getMinIncrement());
row.createCell(15).setCellValue(product.getLikeCount());
row.createCell(16).setCellValue(product.getBidCount());
}

// 엑셀 파일을 응답 스트림에 작성
ServletOutputStream outputStream = response.getOutputStream();
workbook.write(outputStream);
workbook.close();
outputStream.close();

} catch (IOException e) {
try {
response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value(), "엑셀 출력 실패");
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package com.example.ssauc.admin.controller;

import com.example.ssauc.admin.dto.ReplyDto;
import com.example.ssauc.admin.entity.Admin;
import com.example.ssauc.admin.entity.Reply;
import com.example.ssauc.admin.service.AdminQnaService;
import com.example.ssauc.user.contact.entity.Board;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
Expand Down Expand Up @@ -46,23 +50,46 @@ public String boardDetail(@RequestParam("boardId") Long boardId, Model model){
// boardId를 이용해 신고 내역 정보를 조회
Board board = adminQnaService.findBoardById(boardId);
model.addAttribute("board", board);

// reply 테이블에 해당 boardId가 존재하는지 확인
Reply reply = adminQnaService.findReplyByBoardId(boardId);
if(reply != null){
System.out.println("널 아님");
model.addAttribute("reply", reply);
model.addAttribute("isReply", true);
} else {
System.out.println("널 임");
model.addAttribute("isReply", false);
}

return "/admin/adminqnadetail";
}

@PostMapping("/result")
public ResponseEntity<String> processBoardResult(@RequestParam("action") String action, @RequestParam("boardId") long boardId) {
// 전달받은 action 값 확인
System.out.println("선택된 처리 조치: " + action);


if(adminQnaService.updateBoardInfo(action, boardId)){
return ResponseEntity.ok("등록완료");
public ResponseEntity<String> processBoardResult(HttpSession session,
@RequestParam("answerTitle") String answerTitle,
@RequestParam("answerContent") String answerContent,
@RequestParam("boardId") long boardId) {
// 전달받은 값 확인
System.out.printf("선택된 처리 조치: %s %s %d%n", answerTitle, answerContent, boardId);

if(session.getAttribute("admin")!=null){
Admin tempAdmin = (Admin) session.getAttribute("admin");
ReplyDto replyDto = new ReplyDto(boardId, answerTitle, answerContent, tempAdmin);

if(adminQnaService.updateBoardInfo(replyDto)){
return ResponseEntity.ok("등록완료");
}else{
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("등록실패");
}
}else{
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("등록실패");

.body("로그인오류");
}

}

@GetMapping("/export")
Expand Down
Loading