프로젝트

개인정보(userInfo)퇴학 , 성적확인 , 임시비밀번호알고리즘변경

동곤일상 2025. 5. 19. 21:54
반응형

1)개인정보퇴학

1-1) 자퇴신청 폼(deleteUser) , delete(자퇴신청 처리)

1-2) 퇴학처리부분 Controller의 delete

 

2) 성적확인

 

3) 임시비밀번호 알고리즘 변경

 

 


 

1) 개인정보(userInfo)퇴학 부분

 

2025.05.14 - [프로젝트] - 프로젝트중간 (개인정보(userInfo) 내용들 , index매핑과정 controller변경)

 

 

프로젝트중간 (개인정보(userInfo) 내용들 , index매핑과정 controller변경)

1) 회원가입(registerUser) 시 테이블의전공이 모두 나타나게!!!! 2) 개인정보관련 (userInfo)2-1) 수정버튼 클릭시2-2) 비밀번호변경버튼 클릭시2-3) 수정완료버튼 3) index부분 변경!!!(크게바뀜) 4)오늘의시

ddkk1120.tistory.com

여기서 개인정보에 대해서다루긴했지만

퇴학부분은완료되지않은 상황이었을것임

 

userInfo.jsp

 

퇴학버튼 부분만

<c:if test="${fn:contains(sessionScope.login, 'S')}"> <%--학생만선택가능 --%>
<button class="btn btn-danger" type="button" onclick="deleteUser()">자퇴신청</button>                    
</c:if>
function deleteUser() {
		if (confirm("정말 퇴학하시겠습니까? 이 작업은 되돌릴 수 없습니다.")) {
		let op = "width=500,height=500,top=50,left=150";
		window.open("deleteUser", "", op);
	}
}

 

 

sessionScope.login이 S를 포함한경우(학생인경우)

 

sessionScope.login이 S를 포함하지 않은 경우(교수)

자퇴신청 부분자체가 나오지않게 됨


1-1) 자퇴신청 폼(deleteUser) , delete(자퇴신청 처리)

//로그인없이접근막기 + 학생만 ( get방식사용하지않으므로 이쪽에선 파라미터값을 막을필욘없음)
		public String loginStuCheck(HttpServletRequest request, HttpServletResponse response) {
			HttpSession session = request.getSession();
			String login  = (String)session.getAttribute("login");
			if(login==null ) {
				request.setAttribute("msg", "로그인하세요");
				request.setAttribute("url", "doLogin");
				return "alert";
			}
			else if(login.contains("P")) {
				request.setAttribute("msg", "교수는접근불가능합니다");
				request.setAttribute("url", "index");
				return "alert";
			}
			return null; //정상인경우
		}
        
@MSLogin("loginStuCheck")
	@RequestMapping("deleteUser")
	public String deleteUser(HttpServletRequest request, HttpServletResponse response) { 
		List<Dept> list = new DeptDao().selectAll();
		request.setAttribute("dept", list);
		return "mypage/deleteUser";
	}

다음과같이 교수라면 애초에접근을 막아놓고 시작함

(버튼이사라졌어도 url로 접근하려는것을 방지)

dept(전공)를 모두 불러온 후 request속성으로 넘겨준다

<div class="card">
        <h4 class="text-center mb-4">자퇴 form</h4>
        <form action="delete" method="post" >
        
           <div class="mb-3">
                <label for="id" class="form-label">아이디</label>
                <input type="text" class="form-control" id="id" name="id" >
            </div> 
            
            <div class="mb-3">
                <label for="name" class="form-label">이름</label>
                <input type="text" class="form-control" id="name" name="name" >
            </div>
            
            <div class="mb-3">
                <label for="pw" class="form-label">비밀번호</label>
                <input type="password" class="form-control" id="pw" name="pw" >
            </div>  
            
            <div class="mb-3">
                <label for="email" class="form-label">이메일</label>
                <input type="email" class="form-control" id="email" name="email" >
            </div>       
            
           <div class="mb-3">
            <label for="major" class="form-label">전공선택</label>
            <select class="form-select" id="major" name="deptId">
                <option selected value="none">전공</option>
                <c:forEach items="${dept}" var="s">
                <option value="${s.deptId}">${s.deptName}</option>
                </c:forEach>   
            </select>
        </div>
            
            <button class="btn btn-custom w-100 mb-3">자퇴신청</button>
            <div class="text-center">
                <a href="close" class="btn btn-link-custom">취소하고 싶으면 클릭!</a>
            </div>
        </form>
    </div>

다음과같이 

아이디,이름,비밀번호,이메일, 전공을입력받아

form을 이용해 delete로 넘기게될거임

 

 

1-2) 퇴학처리부분 Controller의 delete

MypageController.java

delete

(입력한 모든정보가  일치해야 퇴학이 이루어짐)

@MSLogin("loginStuCheck")
	@RequestMapping("delete")
	public String delete(HttpServletRequest request, HttpServletResponse response) { 
		String id = (String)request.getSession().getAttribute("login");
		String inputId= request.getParameter("id");
		String pw = request.getParameter("pw");
		String name = request.getParameter("name");
		String email = request.getParameter("email");
		String deptId = request.getParameter("deptId");
		
		if(id.equals(inputId)) {
			String dbId = new ProStuDao().findPw(inputId, email);
			//db의비밀번호와 입력한비밀번호비교
			//암호화때문에 equals로 비교불가능
			boolean checkpw = BCrypt.checkpw(pw, dbId);
			System.out.println("비밀번호 검증 성공여부 : "+checkpw);
			
			boolean result = new StudentDao().deleteUser(inputId,deptId,name);
            
            //비밀번호검증 , delete여부 모두 true일 시
			if(checkpw&&result) {
				EmailUtil.sendDeleteMsg(email, name); // 자퇴성공시 메일발송
				request.setAttribute("logout", "logout");
				request.setAttribute("msg", "자퇴성공");
			}
			else {
				request.setAttribute("msg", "변경실패");
			}
		}
		//id가 로그인한정보와 일치하지않을 시
		else {
			request.setAttribute("msg", "입력한 아이디가 로그인한 아이디와 일치하지않아요");				
		}
		return "mypage/close";
	}

 

 

모든정보가 일치 시

이메일로도 자퇴여부가 전송됨

 

퇴학 -> 로그인시도 시


2)성적확인

//성적확인
	@MSLogin("loginStuCheck")
	@RequestMapping("getCourseScores")
	public String getCourseScores (HttpServletRequest request, HttpServletResponse response) {
		String id = (String)request.getSession().getAttribute("login");
		//String id = "S001";
		try {
			List<GetScoresDto> score = new GetScoreDao().getScore(id);
			request.setAttribute("score", score);
			return "mypage/getCourseScores";
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		request.setAttribute("msg", "오류발생");
		request.setAttribute("url", "index");
		return "alert";
	}

 

학생만 들어갈 수 있게 위에함수로 처리를 해놓은 후 

login세션 (id) 을 이용해 필요한 값들을 list로 가져온 후 

(정상인경우 : getCourseScores  폼으로이동)

(비정상인경우 : 오류발생 출력 후 index로 되돌아감)

 

GetScoreDao.java

getScore메서드

(id를 이용해 성적확인에 필요한 모든정보를 가져온다)

public List<GetScoresDto> getScore(String id) {
		SqlSession conn = MyBatisConnection.getConnection();
		GetScoresDto dto = new GetScoresDto();
		dto.setStudentId(id);
		try {
			List<GetScoresDto> list = conn.selectList("getScore.getScore",id);
			return list;
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		finally {
			MyBatisConnection.close(conn);
		}
		
		return null;
	}

 

ScoreMapper.xml

교수명,강좌id,강좌이름,학점,중간고사점수,기말고사점수,총점,학기

등을 가져오게됨

<select id="getScore" parameterType="String" resultType="GetScoresDto">
		SELECT  p.professor_name , c.course_id  , c.course_name , c.course_score , s.score_mid , s.score_final , s.score_total , s.score_grade
		,c.course_period
			FROM score s JOIN professor p  ON(s.professor_id = p.professor_id) 
 			 JOIN course c ON (s.course_id = c.course_id)
			WHERE s.student_id=#{val};
	</select>

 

getCourseScores.jsp

body부분만

<body>
    <!-- 성적 확인 -->
    <div class="card">
        <h2 class="text-xl font-semibold mb-4">성적 확인</h2>
        <form method="get" action="">
            <div class="flex items-center mb-4">
                <select name="semester" class="border rounded p-2 mr-2" onchange="this.form.submit()">
                    <option value="all" ${param.semester == 'all' || empty param.semester ? 'selected' : ''}>전체</option>
                    <option value="1학기" ${param.semester == '1학기' ? 'selected' : ''}>1학기</option>
                    <option value="2학기" ${param.semester == '2학기' ? 'selected' : ''}>2학기</option>
                </select>
                <button type="submit" class="btn btn-primary">조회</button>
            </div>
        </form>
        <table class="table">
            <thead>
                <tr>
                    <th>#</th>
                    <th>학기(coursePeriod)</th>
                    <th>과목번호(courseId)</th>
                    <th>과목명(courseName)</th>
                    <th>담당교수(professorName)</th>
                    <th>학점(courseScore)</th>
                    <th>중간점수(scoreMid)</th>
                    <th>기말점수(scoreFinal)</th>
                    <th>취득 점수(scoreTotal)</th>
                    <th>평가(scoreGrade)</th>
                </tr>
            </thead>
            <tbody>
                <c:set var="totalCourseScore" value="0" />
                <c:set var="totalGradePoints" value="0" />
                <c:set var="courseCount" value="0" />
                <c:forEach items="${score}" var="sc" varStatus="a">
                    <!-- 학기 필터링 -->
                    <c:if test="${param.semester == 'all' || empty param.semester || sc.coursePeriod == param.semester}">
                        <tr>
                            <td>${a.count}</td>
                            <td>${sc.coursePeriod}</td>
                            <td>${sc.courseId}</td>
                            <td>${sc.courseName}</td>
                            <td>${sc.professorName}</td>
                            <td>${sc.courseScore}</td>
                            <td>${sc.scoreMid}</td>
                            <td>${sc.scoreFinal}</td>
                            <td>${sc.scoreTotal}</td>
                            <td class="score-grade ${fn:replace(sc.scoreGrade, '+', '-plus')}">${sc.scoreGrade}</td>
                        </tr>
                        <!-- 총 학점 합산 -->
                        <c:set var="totalCourseScore" value="${totalCourseScore + sc.courseScore}" />
                        <!-- 학점 등급을 숫자로 변환 -->
                        <c:choose>
                            <c:when test="${sc.scoreGrade == 'A+'}">
                                <c:set var="gradePoint" value="4.5" />
                            </c:when>
                            <c:when test="${sc.scoreGrade == 'A'}">
                                <c:set var="gradePoint" value="4.0" />
                            </c:when>
                            <c:when test="${sc.scoreGrade == 'B+'}">
                                <c:set var="gradePoint" value="3.5" />
                            </c:when>
                            <c:when test="${sc.scoreGrade == 'B'}">
                                <c:set var="gradePoint" value="3.0" />
                            </c:when>
                            <c:when test="${sc.scoreGrade == 'C+'}">
                                <c:set var="gradePoint" value="2.5" />
                            </c:when>
                            <c:when test="${sc.scoreGrade == 'C'}">
                                <c:set var="gradePoint" value="2.0" />
                            </c:when>                 
                            <c:when test="${sc.scoreGrade == 'F'}">
                                <c:set var="gradePoint" value="0.0" />
                            </c:when>
                            <c:otherwise>
                                <c:set var="gradePoint" value="0.0" />
                            </c:otherwise>
                        </c:choose>
                        <c:set var="totalGradePoints" value="${totalGradePoints + gradePoint}" />
                        <c:set var="courseCount" value="${courseCount + 1}" />
                    </c:if>
                </c:forEach>
            </tbody>
        </table>
        <!-- 요약 섹션 -->
        <div class="summary-card">
            <div class="summary-item">
                <div class="summary-label">총 이수 학점</div>
                <div class="summary-value total-credits">${totalCourseScore}</div>
            </div>
            <div class="summary-item">
                <div class="summary-label">평균 학점 (GPA)</div>
                <div class="summary-value gpa">
                    <fmt:formatNumber value="${courseCount > 0 ? totalGradePoints / courseCount : 0}" pattern="0.00" />
                </div>
            </div>
        </div>
    </div>
</body>

 

결과

 

 


3) 임시비밀번호 알고리즘변경

 

통상적인 사이트들의 임시비밀번호방식을 참고해 바꿨다

(영문자,특수문자,숫자)가 적절히섞인 6자리 숫자

//임시비밀번호를 만드는 알고리즘(비밀번호찾기 시에만 발급이 될것임)
		public  String getTempPw() {
			List<String> lowerList = Arrays.asList
	("a" ,"b" ,"c" ,"d" ,"e" ,"f" ,"g" ,"h" ,"i" ,"j" ,"k" ,"l" ,"m" ,"n" ,"o" ,"p","q","r","s","t");
					
					List<String> upperList = new ArrayList<>();
					for (String string : lowerList) {
						upperList.add(string.toUpperCase());
					}	
					List<String> specialList = Arrays.asList("%","@","#","^","&","*","!");
					

					List<Object> combineList = new ArrayList<>();
					
					combineList.addAll(specialList);
					combineList.addAll(lowerList);
					combineList.addAll(upperList);
					for (int i = 0; i < 15; i++) { //랜덤한0~9 숫자 10개집어넣기
						 combineList.add(new Random().nextInt(10)); 
					}
					Collections.shuffle(combineList);
					String tempNum = "";
					for (int i = 0; i < 6; i++) {
						int num = new Random().nextInt(combineList.size());
						tempNum += combineList.get(num);
					}
					
					return tempNum;
				}

테스트결과!!!!