diff --git a/DB2025Team07.sql b/DB2025Team07.sql index 6dd11cf..f4e77f2 100644 --- a/DB2025Team07.sql +++ b/DB2025Team07.sql @@ -54,27 +54,49 @@ INSERT INTO DB2025_Recruitment (user_id, work_place, start_day, work_period, sal SELECT * FROM DB2025_Recruitment; +# 지원 상태 테이블 (지원 상태의 id, 지원 상태) 생성 +# 상태 id는 자동 설정 +CREATE TABLE DB2025_SupportStatus ( + id INT AUTO_INCREMENT PRIMARY KEY , + status_name VARCHAR(20) UNIQUE NOT NULL +); + +INSERT INTO DB2025_SupportStatus (status_name) VALUES + ('대기'), + ('채택됨'), + ('탈락'); + +SELECT * FROM DB2025_SupportStatus; + +# 지원 테이블 생성 CREATE TABLE DB2025_SUPPORT ( RECRUIT_ID INT NOT NULL, USER_ID VARCHAR(20) NOT NULL, - RECRUITMENT_STATE ENUM('채택됨', '채택 안됨') DEFAULT '채택 안됨', + RECRUITMENT_STATE INT NOT NULL DEFAULT 1, SUPPORT_TEXT TEXT, SUPPORT_CREATED_AT DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (RECRUIT_ID, USER_ID), FOREIGN KEY (RECRUIT_ID) REFERENCES DB2025_RECRUITMENT(id) ON DELETE CASCADE, - FOREIGN KEY (USER_ID) REFERENCES DB2025_USERS(id) ON DELETE CASCADE + FOREIGN KEY (USER_ID) REFERENCES DB2025_USERS(id) ON DELETE CASCADE, + FOREIGN KEY (RECRUITMENT_STATE) REFERENCES DB2025_SupportStatus(id) ON DELETE CASCADE ); DESCRIBE DB2025_SUPPORT; +INSERT INTO DB2025_SUPPORT ( + RECRUIT_ID, USER_ID, SUPPORT_TEXT, SUPPORT_CREATED_AT +) VALUES +(1, '1955034', '바로 도와드릴 수 있어요!', NOW()), +(2, '2276123', '오늘 오후에 가능해요!', NOW()), +(3, '1955034', '제가 해본 적 있어요. 잘할 수 있습니다.', NOW()), +(4, '2003076', '시간 맞춰 드릴 수 있어요!', NOW()), +(5, '2276123', '경험 많아요. 믿고 맡겨주세요!', NOW()); + INSERT INTO DB2025_SUPPORT ( RECRUIT_ID, USER_ID, RECRUITMENT_STATE, SUPPORT_TEXT, SUPPORT_CREATED_AT ) VALUES -(1, '1955034', '채택됨', '바로 도와드릴 수 있어요!', NOW()), -(2, '2276123', '채택 안됨', '오늘 오후에 가능해요!', NOW()), -(3, '1955034', '채택 안됨', '제가 해본 적 있어요. 잘할 수 있습니다.', NOW()), -(4, '2003076', '채택 안됨', '시간 맞춰 드릴 수 있어요!', NOW()), -(5, '2276123', '채택됨', '경험 많아요. 믿고 맡겨주세요!', NOW()); +(6, '1955034', 1, '바로 도와드릴 수 있어요!', NOW()), +(6, '2276123', 1, '오늘 오후에 가능해요!', NOW()); SELECT * FROM DB2025_SUPPORT; @@ -96,12 +118,64 @@ SELECT R.work_place, R.start_day, R.salary, - S.RECRUITMENT_STATE, + ASL.status_name, # 정수값인 RECRUITMENT_STATE를 지원상태 테이블과 조인하여 문자형태로 나타냄 S.SUPPORT_TEXT, S.SUPPORT_CREATED_AT FROM DB2025_SUPPORT S LEFT JOIN DB2025_RECRUITMENT R ON S.RECRUIT_ID = R.id -LEFT JOIN DB2025_USERS U ON S.USER_ID = U.id; +LEFT JOIN DB2025_USERS U ON S.USER_ID = U.id +LEFT JOIN DB2025_SupportStatus ASL ON S.RECRUITMENT_STATE = ASL.id; # 정수값인 RECRUITMENT_STATE를 지원상태 테이블과 조인하여 문자형태로 나타냄 # LEFT JOIN 사용하여 지원글 기준으로 전체 기록 보존 SELECT * FROM DB2025_MySupportApplications WHERE USER_ID = '2276123'; + +# 특정 모집글의 지원글 모아보기 뷰 생성 +CREATE VIEW DB2025_SupportDetailView AS +SELECT + S.RECRUIT_ID, + U.id AS USER_ID, + U.nickname, + U.email, + U.phone, + U.rating, + SS.status_name AS RECRUITMENT_STATE, + S.SUPPORT_TEXT, + S.SUPPORT_CREATED_AT +FROM DB2025_SUPPORT S +JOIN DB2025_Users U + ON S.USER_ID = U.id +JOIN DB2025_SupportStatus SS + ON S.RECRUITMENT_STATE = SS.id; + +SELECT * FROM DB2025_SupportDetailView WHERE RECRUIT_ID = 6; + + +# DROP VIEW DB2025_SupportDetailView; + +# 평가 테이블 (평가글 아이디, 평가자 학번, 평가대상 학번, 점수, 평가 내용, 생성시각) 생성 +CREATE TABLE DB2025_Evaluation ( + recruitment_id INT NOT NULL, + evaluator_id VARCHAR(7) NOT NULL, + target_id VARCHAR(7) NOT NULL, + score INT CHECK (score BETWEEN 1 AND 5) NOT NULL, + description TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, #추가하는 게 맞을 것 같아서 넣었습니다 + PRIMARY KEY (recruitment_id, evaluator_id), + FOREIGN KEY (recruitment_id) REFERENCES DB2025_Recruitment(id) ON DELETE CASCADE, + FOREIGN KEY (evaluator_id) REFERENCES DB2025_Recruitment(user_id) ON DELETE CASCADE, + FOREIGN KEY (target_id) REFERENCES DB2025_Recruitment(user_id) ON DELETE CASCADE +); + +Describe DB2025_Evaluation; + +INSERT INTO DB2025_Evaluation (recruitment_id, evaluator_id, target_id, score, description) VALUES + (1, 2276123, 2103123, 5, '정확한 시간 개념과 탁월한 업무 태도를 보여줬습니다.'), + (2, 2103123, 1955034, 4, '전반적으로 만족스러웠지만 약간의 세부 개선이 필요합니다.'), + (3, 1955034, 2003076, 3, '일은 어느 정도 했지만 결과물의 퀄리티가 부족했습니다.'), + (4, 2003076, 2271055, 5, '적극적이고 책임감 있는 태도가 매우 인상 깊었습니다.'), + (5, 2276123, 1955034, 3, '업무 처리 속도가 약간 느리고 소극적이었습니다.'); + +INSERT INTO DB2025_Recruitment (user_id, work_place, start_day, work_period, salary, recruitment_status, created_at) VALUES +('2344009', '이화여대 학관', '2025-06-01 09:00:00', '1시간', 5000, '모집중', NOW()); + +SELECT * FROM DB2025_Evaluation; \ No newline at end of file diff --git a/DB2025Team07/.project b/DB2025Team07/.project index 9bebd7f..9958bcf 100644 --- a/DB2025Team07/.project +++ b/DB2025Team07/.project @@ -28,4 +28,15 @@ org.eclipse.jdt.core.javanature org.eclipse.wst.jsdt.core.jsNature + + + 1748260249488 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + diff --git a/DB2025Team07/src/main/java/DB2025Team07/DB2025Team07_AcceptSupportServlet.java b/DB2025Team07/src/main/java/DB2025Team07/DB2025Team07_AcceptSupportServlet.java new file mode 100644 index 0000000..d28dab7 --- /dev/null +++ b/DB2025Team07/src/main/java/DB2025Team07/DB2025Team07_AcceptSupportServlet.java @@ -0,0 +1,112 @@ +package DB2025Team07; + +import java.io.*; +import java.sql.*; +import javax.servlet.*; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.*; + +@WebServlet("/AcceptSupportServlet") // URL 매핑 +public class DB2025Team07_AcceptSupportServlet extends HttpServlet { + static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; + static final String DB_URL = "jdbc:mysql://localhost:3306/DB2025Team07?serverTimezone=UTC"; + static final String USER = "DB2025Team07"; + static final String PASS = "DB2025Team07"; + + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + request.setCharacterEncoding("UTF-8"); + response.setContentType("text/html;charset=UTF-8"); + PrintWriter out = response.getWriter(); // 알림창 및 오류 메시지용 + + String recruitIdParam = request.getParameter("recruit_id"); // 모집글의 ID + String targetId = request.getParameter("user_id"); // 채택할 사용자의 ID + + // 파라미터 null값 체크 + if (recruitIdParam == null || targetId == null || + recruitIdParam.trim().isEmpty() || targetId.trim().isEmpty()) { + out.println(""); + out.flush(); + return; + } + + int recruitId; + try { + recruitId = Integer.parseInt(recruitIdParam); + } catch (NumberFormatException e) { + out.println(""); + out.flush(); + return; + } + + Connection conn = null; + PreparedStatement pstmtUpdateAccepted = null; + PreparedStatement pstmtUpdateRejected = null; + PreparedStatement pstmtUpdateRecruitStatus = null; + + try { + Class.forName(JDBC_DRIVER); + conn = DriverManager.getConnection(DB_URL, USER, PASS); + conn.setAutoCommit(false); // 트랜잭션 시작 + + // 1. 선택된 지원자 → 채택 상태(2) + // RECRUITMENT_STATE 컬럼의 의미: 1=대기, 2=채택, 3=탈락 + String sqlAccept = "UPDATE DB2025_SUPPORT SET RECRUITMENT_STATE = 2 WHERE RECRUIT_ID = ? AND USER_ID = ?"; + pstmtUpdateAccepted = conn.prepareStatement(sqlAccept); + pstmtUpdateAccepted.setInt(1, recruitId); + pstmtUpdateAccepted.setString(2, targetId); + pstmtUpdateAccepted.executeUpdate(); + + // 2. 나머지 지원자들 → 탈락 상태(3) + String sqlReject = "UPDATE DB2025_SUPPORT SET RECRUITMENT_STATE = 3 WHERE RECRUIT_ID = ? AND USER_ID != ?"; + pstmtUpdateRejected = conn.prepareStatement(sqlReject); + pstmtUpdateRejected.setInt(1, recruitId); + pstmtUpdateRejected.setString(2, targetId); + pstmtUpdateRejected.executeUpdate(); + + // 3. 모집글의 모집 상태를 '모집중' -> '모집마감'으로 변경 + String sqlRecruitStatus = "UPDATE DB2025_RECRUITMENT SET recruitment_status = '모집마감' WHERE id = ?"; + pstmtUpdateRecruitStatus = conn.prepareStatement(sqlRecruitStatus); + pstmtUpdateRecruitStatus.setInt(1, recruitId); + pstmtUpdateRecruitStatus.executeUpdate(); + + conn.commit(); // 모든 작업 성공 시 트랜잭션 커밋 + + // 리디렉션하여 SupportListServlet이 새로고침된 데이터를 가져오도록 함 + response.sendRedirect("SupportsServlet?recruit_id=" + recruitId); + + + } catch (ClassNotFoundException e) { + out.println("[AcceptSupportServlet] JDBC 드라이버 로딩 실패: " + e.getMessage()); + e.printStackTrace(); + out.flush(); + } catch (SQLException e) { + out.println("[AcceptSupportServlet] 데이터베이스 오류: " + e.getMessage()); + e.printStackTrace(); + if (conn != null) { + try { + conn.rollback(); // 오류 발생 시 트랜잭션 롤백 + out.println("[AcceptSupportServlet] Transaction rolled back."); + } catch (SQLException ex) { + out.println("[AcceptSupportServlet] Rollback failed: " + ex.getMessage()); + ex.printStackTrace(); + } + } + out.println("오류 발생: " + e.getMessage()); + out.flush(); + } finally { + try { if (pstmtUpdateAccepted != null) pstmtUpdateAccepted.close(); } catch (SQLException e) { e.printStackTrace(); } + try { if (pstmtUpdateRejected != null) pstmtUpdateRejected.close(); } catch (SQLException e) { e.printStackTrace(); } + try { if (pstmtUpdateRecruitStatus != null) pstmtUpdateRecruitStatus.close(); } catch (SQLException e) { e.printStackTrace(); } + if (conn != null) { + try { + conn.setAutoCommit(true); // 원래 상태로 복구 + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + } +} diff --git a/DB2025Team07/src/main/java/DB2025Team07/DB2025Team07_EvaluationSubmitServlet.java b/DB2025Team07/src/main/java/DB2025Team07/DB2025Team07_EvaluationSubmitServlet.java new file mode 100644 index 0000000..a908f54 --- /dev/null +++ b/DB2025Team07/src/main/java/DB2025Team07/DB2025Team07_EvaluationSubmitServlet.java @@ -0,0 +1,158 @@ +package DB2025Team07; + +import java.io.*; +import java.sql.*; +import javax.servlet.*; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.*; + +@WebServlet("/EvaluationSubmitServlet") +public class DB2025Team07_EvaluationSubmitServlet extends HttpServlet { + static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; + static final String DB_URL = "jdbc:mysql://localhost:3306/DB2025Team07?serverTimezone=UTC"; + static final String USER = "DB2025Team07"; + static final String PASS = "DB2025Team07"; + + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + request.setCharacterEncoding("UTF-8"); + response.setContentType("text/html;charset=UTF-8"); + PrintWriter out = response.getWriter(); + + // 세션에서 평가자 id 가져오기 + HttpSession session = request.getSession(); + String evaluatorId = (String) session.getAttribute("user_id"); + + // 로그인 여부 확인 + if (evaluatorId == null) { + out.println(""); + out.flush(); + return; + } + + // 폼에서 전달된 파라미터 가져오기 + String recruitIdParam = request.getParameter("recruit_id"); + String scoreParam = request.getParameter("score"); + String description = request.getParameter("description"); + + // 파라미터 값 확인 + if (recruitIdParam == null || scoreParam == null || description == null || + recruitIdParam.trim().isEmpty() || scoreParam.trim().isEmpty() || description.trim().isEmpty()) { + out.println(""); + out.flush(); + return; + } + + int recruitId; + int score; + try { + recruitId = Integer.parseInt(recruitIdParam); + score = Integer.parseInt(scoreParam); + } catch (NumberFormatException e) { + out.println(""); + out.flush(); + return; + } + + Connection conn = null; + PreparedStatement pstmtGetTargetId = null; + PreparedStatement pstmtInsertEvaluation = null; + PreparedStatement pstmtUpdateRecruitStatus = null; + ResultSet rs = null; + String targetId = null; + + try { + Class.forName(JDBC_DRIVER); + conn = DriverManager.getConnection(DB_URL, USER, PASS); + conn.setAutoCommit(false); // 트랜잭션 시작 + + //1. DB2025_SUPPORT 테이블에서 RECRUITMENT_STATE가 2(채택됨)인 사용자의 USER_ID (targetId) 조회 + String sqlGetTarget = "SELECT USER_ID FROM DB2025_SUPPORT WHERE RECRUIT_ID = ? AND RECRUITMENT_STATE = 2"; + pstmtGetTargetId = conn.prepareStatement(sqlGetTarget); + pstmtGetTargetId.setInt(1, recruitId); + rs = pstmtGetTargetId.executeQuery(); + + if (rs.next()) { + targetId = rs.getString("USER_ID"); + if (rs.next()) { // 채택된 사람이 여러 명인 경우 (정상적이지 않은 상황) + conn.rollback(); + System.err.println("[EvaluationSubmitServlet] Error: Multiple users found with RECRUITMENT_STATE=2 for recruit_id=" + recruitId); + out.println(""); + out.flush(); + return; + } + } else { // 채택된 사용자가 없는 경우 + conn.rollback(); + System.err.println("[EvaluationSubmitServlet] Error: No user found with RECRUITMENT_STATE=2 for recruit_id=" + recruitId); + out.println(""); + out.flush(); + return; + } + + // 자기 자신을 평가하는 것을 방지 + if (evaluatorId.equals(targetId)) { + conn.rollback(); + out.println(""); + out.flush(); + return; + } + + // 2. DB2025_Evaluation 테이블에 평가 정보 삽입 + String sqlInsert = "INSERT INTO DB2025_Evaluation (recruitment_id, evaluator_id, target_id, score, description) VALUES (?, ?, ?, ?, ?)"; + pstmtInsertEvaluation = conn.prepareStatement(sqlInsert); + pstmtInsertEvaluation.setInt(1, recruitId); + pstmtInsertEvaluation.setString(2, evaluatorId); + pstmtInsertEvaluation.setString(3, targetId); + pstmtInsertEvaluation.setInt(4, score); + pstmtInsertEvaluation.setString(5, description); + + int result = pstmtInsertEvaluation.executeUpdate(); + + if (result > 0) { + // 3. 평가 성공 시, 모집글(DB2025_RECRUITMENT) 상태를 '모집완료' -> '근무완료'로 변경 + String sqlUpdateStatus = "UPDATE DB2025_RECRUITMENT SET recruitment_status = '근무완료' WHERE id = ?"; + pstmtUpdateRecruitStatus = conn.prepareStatement(sqlUpdateStatus); + pstmtUpdateRecruitStatus.setInt(1, recruitId); + int statusUpdateResult = pstmtUpdateRecruitStatus.executeUpdate(); + + if (statusUpdateResult > 0) { + conn.commit(); // 성공 시 커밋 + out.println(""); // 성공 후 페이지 + } else { + conn.rollback(); // 실패 시 롤백 + out.println(""); + } + } else { + conn.rollback(); + out.println(""); + } + out.flush(); + + } catch (ClassNotFoundException e) { + e.printStackTrace(); + out.println(""); + out.flush(); + } catch (SQLException e) { + e.printStackTrace(); + if (conn != null) { + try { conn.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } + } + out.println(""); + out.flush(); + } finally { + try { if (rs != null) rs.close(); } catch (SQLException e) { e.printStackTrace(); } + try { if (pstmtGetTargetId != null) pstmtGetTargetId.close(); } catch (SQLException e) { e.printStackTrace(); } + try { if (pstmtInsertEvaluation != null) pstmtInsertEvaluation.close(); } catch (SQLException e) { e.printStackTrace(); } + try { if (pstmtUpdateRecruitStatus != null) pstmtUpdateRecruitStatus.close(); } catch (SQLException e) { e.printStackTrace(); } + if (conn != null) { + try { + conn.setAutoCommit(true); // 자동 커밋 모드로 복원 + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + } +} diff --git a/DB2025Team07/src/main/java/DB2025Team07/DB2025Team07_SupportsServlet.java b/DB2025Team07/src/main/java/DB2025Team07/DB2025Team07_SupportsServlet.java new file mode 100644 index 0000000..04533cf --- /dev/null +++ b/DB2025Team07/src/main/java/DB2025Team07/DB2025Team07_SupportsServlet.java @@ -0,0 +1,101 @@ +package DB2025Team07; + +import java.io.*; +import java.sql.*; +import java.util.*; + +import javax.servlet.*; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.*; + +@WebServlet("/SupportsServlet") // URL 매핑 +public class DB2025Team07_SupportsServlet extends HttpServlet { + static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; + static final String DB_URL = "jdbc:mysql://localhost:3306/DB2025Team07?serverTimezone=UTC"; + static final String USER = "DB2025Team07"; + static final String PASS = "DB2025Team07"; + + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + request.setCharacterEncoding("UTF-8"); + response.setContentType("text/html;charset=UTF-8"); + + HttpSession session = request.getSession(); + String userId = (String) session.getAttribute("user_id"); + String recruitIdParam = request.getParameter("recruit_id"); + + // 파라미터 null값 체크 + if (userId == null) { + response.sendRedirect("signup.html"); + return; + } + + if (recruitIdParam == null || recruitIdParam.trim().isEmpty()) { + PrintWriter out = response.getWriter(); + out.println(""); + out.flush(); + return; + } + + int recruitId; + try { + recruitId = Integer.parseInt(recruitIdParam); + } catch (NumberFormatException e) { + PrintWriter out = response.getWriter(); + out.println(""); + out.flush(); + return; + } + + // 해당 모집글의 지원글을 담을 리스트 생성 + List> supportList = new ArrayList<>(); + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + + try { + Class.forName(JDBC_DRIVER); + conn = DriverManager.getConnection(DB_URL, USER, PASS); + + String sql = "SELECT * FROM DB2025_SupportDetailView WHERE RECRUIT_ID = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setInt(1, recruitId); + + rs = pstmt.executeQuery(); + + while (rs.next()) { + Map row = new HashMap<>(); // hashmap 형태로 이름과 값을 리스트에 담음 + row.put("USER_ID", rs.getString("USER_ID")); + row.put("nickname", rs.getString("nickname")); + row.put("email", rs.getString("email")); + row.put("phone", rs.getString("phone")); + row.put("rating", rs.getBigDecimal("rating")); + row.put("RECRUITMENT_STATE", rs.getString("RECRUITMENT_STATE")); + row.put("SUPPORT_TEXT", rs.getString("SUPPORT_TEXT")); + row.put("SUPPORT_CREATED_AT", rs.getTimestamp("SUPPORT_CREATED_AT")); + row.put("RECRUIT_ID", rs.getInt("RECRUIT_ID")); + supportList.add(row); + } + + } catch (ClassNotFoundException e) { + System.err.println("[SupportListServlet] JDBC 드라이버 로딩 실패: " + e.getMessage()); + throw new ServletException("JDBC 드라이버 로딩 실패", e); + } catch (SQLException e) { + System.err.println("[SupportListServlet] 데이터베이스 오류: " + e.getMessage()); + e.printStackTrace(); // 콘솔에 전체 스택 트레이스 출력 + throw new ServletException("데이터베이스 오류: " + e.getMessage(), e); + } finally { // 자원 해제 + try { if (rs != null) rs.close(); } catch (SQLException e) { e.printStackTrace(); } + try { if (pstmt != null) pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } + try { if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } + } + + // 자원 jsp 파일에 전달 + request.setAttribute("userId", userId); + request.setAttribute("recruitId", recruitId); + request.setAttribute("supportList", supportList); + + request.getRequestDispatcher("/supports.jsp").forward(request, response); + } +} diff --git a/DB2025Team07/src/main/webapp/evaluation.jsp b/DB2025Team07/src/main/webapp/evaluation.jsp new file mode 100644 index 0000000..9b12aaf --- /dev/null +++ b/DB2025Team07/src/main/webapp/evaluation.jsp @@ -0,0 +1,52 @@ +<%@ page contentType="text/html; charset=UTF-8" %> + +<% + + // 현재 로그인한 사용자 ID (세션에서 가져옴) + String evaluatorId = (String) session.getAttribute("user_id"); + if (evaluatorId == null) { + response.sendRedirect("signup.jsp"); + return; + } + + // 파라미터로 전달된 recruit_id 가져오기 + String recruitId = request.getParameter("recruit_id"); + + if (recruitId == null) { + out.println("파라미터가 제대로 전달되지 않았습니다."); + return; + } +%> + + + + + + 평가하기 + + + + <%@ include file="navbar.jsp" %> + +

평가하기

+
+ + + + +

+ +
+

+ + +
+ + + diff --git a/DB2025Team07/src/main/webapp/my_recruits.jsp b/DB2025Team07/src/main/webapp/my_recruits.jsp index 862027b..050f502 100644 --- a/DB2025Team07/src/main/webapp/my_recruits.jsp +++ b/DB2025Team07/src/main/webapp/my_recruits.jsp @@ -5,7 +5,7 @@ <% String userId = (String) session.getAttribute("user_id"); if (userId == null) { - response.sendRedirect("signup.html"); + response.sendRedirect("signup.jsp"); return; } @@ -43,6 +43,14 @@ <%= rs.getInt("salary") %> <%= rs.getString("recruitment_status") %> <%= rs.getTimestamp("created_at") %> + ">지원글 보기 + <% + if ("모집마감".equals(rs.getString("recruitment_status"))) { + %> + ">평가하기 + <% + } + %> <% } diff --git a/DB2025Team07/src/main/webapp/supports.jsp b/DB2025Team07/src/main/webapp/supports.jsp new file mode 100644 index 0000000..ad7d0ab --- /dev/null +++ b/DB2025Team07/src/main/webapp/supports.jsp @@ -0,0 +1,116 @@ +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ page import="java.util.List" %> +<%@ page import="java.util.Map" %> +<%@ page import="java.math.BigDecimal" %> +<%@ page import="java.sql.Timestamp" %> +<%@ page import="java.text.SimpleDateFormat" %> + +<% + // 서블릿에서 전달된 속성 가져오기 + String currentUserId = (String) request.getAttribute("userId"); + Integer recruitId = (Integer) request.getAttribute("recruitId"); + List> supportList = (List>) request.getAttribute("supportList"); + + // JSP에 supportList가 제대로 넘어왔는지 확인 + if (supportList == null) { + System.out.println("[supports.jsp] supportList is NULL"); + } + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + + // 전체 지원 목록 중 '채택' 상태가 있는지 확인 + boolean isAccepted = false; + if (supportList != null) { + for (Map s : supportList) { + Object stateObj = s.get("RECRUITMENT_STATE"); + if ("채택됨".equals(String.valueOf(stateObj))) { + isAccepted = true; + break; + } + } + } +%> + + + + 모집글 ID <%= (recruitId) %>의 지원자 목록 + + + <%@ include file="navbar.jsp" %> + +

모집글 ID <%= (recruitId) %> 에 대한 지원자 목록

+ + <% + if (supportList == null || supportList.isEmpty()) { + %> +

이 모집글에 대한 지원자가 없습니다.

+ <% if (supportList == null) { %> +

(supportList 객체가 null)

+ <% } %> + <% + } else { + %> + + + + + + + + + + + + + + + <% + for (Map support : supportList) { + String supporterUserId = (String) support.get("USER_ID"); + String nickname = (String) support.get("nickname"); + String email = (String) support.get("email"); + String phone = (String) support.get("phone"); + BigDecimal rating = (BigDecimal) support.get("rating"); + String recruitmentState = (String) support.get("RECRUITMENT_STATE"); + String supportText = (String) support.get("SUPPORT_TEXT"); + Timestamp supportCreatedAt = (Timestamp) support.get("SUPPORT_CREATED_AT"); + Integer supportRecruitId = (Integer) support.get("RECRUIT_ID"); + + String formattedSupportDate = ""; + if (supportCreatedAt != null) { + formattedSupportDate = sdf.format(supportCreatedAt); + } + %> + + + + + + + + + + + + <% + } // end for + %> + +
지원자 ID닉네임이메일전화번호평점지원상태지원서지원일
<%= supporterUserId %><%= nickname %><%= email %><%= phone %><%= (rating != null ? rating.toString() : "N/A") %><%= recruitmentState %><%= supportText %><%= formattedSupportDate %><% + // 이미 누군가 채택되었다면 + if (!isAccepted) { + %> + 채택하기 + <% + } + %> +
+ <% + } // end if-else + %> + +
+ ← 내가 작성한 모집글로 돌아가기 + + +