Spring farmework로 구현한 ,
커뮤니티 IceWater의 마지막 기능이다.
이제 AWS를 이용해 배포를 하면 끝이다.
처음부터 관리자페이지는 회원관리 외의 기능을 생각하지 않고 구현해서 간단하다.
회원목록,
회원정지 (기간설정) ,
포인트부여,
관리자 지정,
회원삭제,
공지사항 목록,
공지사항 등록 , 해제
기능이다.
따로 어려운 부분은 없고, 그냥 쿼리에 입력값을 받아서 처리하는 부분뿐이라 설명은 생략하겠다..
Mapper.xml
<!-- 회원정지 -->
<update id="memberSanction">
<![CDATA[
update MP_MEMBER set MEMBER_RANK = 2 , MEMBER_SANCTIONTIME = TO_CHAR(SYSDATE + #{sanctionTime}, 'yyyy/mm/dd') where MEMBER_ID = #{memberId}
]]>
</update>
<!-- 정지해제 -->
<update id="memberSanctionCancel">
update MP_MEMBER set MEMBER_RANK = 1 where MEMBER_ID = #{memberId}
</update>
<!-- 정지된 회원인지 확인 -->
<select id="memberRankCheck" resultType="int">
<![CDATA[
select count(*) from MP_MEMBER where MEMBER_ID = #{memberId} AND MEMBER_RANK = 2 AND MEMBER_SANCTIONTIME > SYSDATE
]]>
</select>
<!-- 정지기간 확인 -->
<select id="memberSanctionTime" resultType="date">
select MEMBER_SANCTIONTIME from MP_MEMBER where MEMBER_ID = #{memberId}
</select>
<!-- 회원목록 -->
<select id="memberList" resultMap="MemberVOResultMap" parameterType="kr.co.vo.SearchCriteria">
select * from
(select MEMBER_ID , MEMBER_NAME, MEMBER_EMAIL, MEMBER_POINT, MEMBER_DEVPOINT ,MEMBER_JOIN_DATE, MEMBER_RANK,MEMBER_SANCTIONTIME, ROW_NUMBER ()
OVER ( ORDER by MEMBER_ID DESC) AS RNUM FROM MP_MEMBER <include refid="search" />)
where RNUM BETWEEN #{rowStart} AND #{rowEnd}
</select>
<!-- 회원목록 페이징-->
<select id="memberListCount" parameterType="kr.co.vo.SearchCriteria"
resultType="int">
SELECT COUNT(*)
FROM MP_MEMBER
</select>
<!-- 회원포인트 부여 -->
<update id="insertPoint">
update MP_MEMBER SET MEMBER_POINT = MEMBER_POINT + #{memberPoint}
where MEMBER_ID = #{memberId}
</update>
<update id="insertDevPoint">
update MP_MEMBER SET MEMBER_DEVPOINT = MEMBER_DEVPOINT + #{memberPoint}
where MEMBER_ID = #{memberId}
</update>
<!-- 공지사항 지정-->
<update id="insertNotice">
update MP_BOARD SET NOTICE ='Y' where bno = #{bno}
</update>
<update id="deleteNotice">
update MP_BOARD SET NOTICE ='N' where bno = #{bno}
</update>
<!-- 공지사항 목록 -->
<select id="noticeView" resultType="kr.co.vo.BoardVO">
select BNO , TITLE , REGDATE from MP_BOARD where bgno = 2 AND NOTICE = 'Y'
</select>
<!-- 관리자 지정 -->
<update id="memberMaster">
update MP_MEMBER SET MEMBER_RANK = 3 where MEMBER_ID = #{memberId}
</update>
<update id="memberMasterCancel">
update MP_MEMBER SET MEMBER_RANK = 1 where MEMBER_ID = #{memberId}
</update>
<sql id="search">
<if test="keyword != ''">
WHERE MEMBER_NAME = #{keyword}
</if>
</sql>
회원정지는 입력받은 일 수 대로 현재 시간에 +해서 DB에 insert 하고,
해당 시간이 현재시간보다 크고, RANK가 2면 회원 로그인을 막는다.
회원정지 해제는 시간은 그대로 두고 , RANK를 1로 update해서 정지를 해제한다.
* 1 = 일반사용자 , 2= 정지회원 , 3=관리자
공지사항 지정엔 공지사항여부 칼럼을 만들어서 Y , N으로 구분한다.
공지사항 목록에 해당칼럼이 Y인 것만 출력되게 만들어서 공지사항을 구현했다.
Controller
//관리자페이지
@RequestMapping(value="/master", method=RequestMethod.GET)
public String memberSanctionView(HttpSession session, Model model,@ModelAttribute("scri") SearchCriteria scri) throws Exception{
MemberVO memberVO = (MemberVO)session.getAttribute("login");
if(memberVO.getMemberRank() != 3 || memberVO == null) {
session.invalidate();
return "/member/loginView";
}
PageMaker pageMaker = new PageMaker();
pageMaker.setCri(scri);
pageMaker.setTotalCount(memberService.memberListCount());
model.addAttribute("list", memberService.memberList(scri));
model.addAttribute("pageMaker", pageMaker);
model.addAttribute("notice", memberService.noticeView());
return "/member/master";
}
@RequestMapping(value="/memberSanction", method=RequestMethod.POST)
public String memberSanction(Model model,String memberName,int sanctionTime) throws Exception{
memberService.memberSanction(memberName,sanctionTime);
return "redirect:/member/master";
}
@RequestMapping(value="/memberSanctionCancel", method=RequestMethod.POST)
public String memberSanction(Model model,String memberId) throws Exception{
memberService.memberSanctionCancel(memberId);
return "redirect:/member/master";
}
@RequestMapping(value="/memberDelete", method=RequestMethod.POST)
public String memberDelete(String memberId) throws Exception{
memberService.delete(memberId);
return "redirect:/member/master";
}
@RequestMapping(value="/insertPoint", method=RequestMethod.POST)
public String insertPoint(String memberId, String memberPoint) throws Exception{
memberService.insertPoint(memberId, memberPoint);
return "redirect:/member/master";
}
@RequestMapping(value="/insertDevPoint", method=RequestMethod.POST)
public String insertDevPoint(String memberId, String memberPoint) throws Exception{
memberService.insertDevPoint(memberId, memberPoint);
return "redirect:/member/master";
}
@RequestMapping(value="/insertNotice", method=RequestMethod.POST)
public String insertNotice(int bno)throws Exception{
memberService.insertNotice(bno);
return "redirect:/member/master";
}
@RequestMapping(value="/deleteNotice", method=RequestMethod.POST)
public String deleteNotice(int bno)throws Exception{
memberService.deleteNotice(bno);
return "redirect:/member/master";
}
@RequestMapping(value="/memberMaster", method=RequestMethod.POST)
public String memberMaster(String memberId)throws Exception{
memberService.memberMaster(memberId);
return "redirect:/member/master";
}
@RequestMapping(value="/memberMasterCancel", method=RequestMethod.POST)
public String memberMasterCancel(String memberId)throws Exception{
memberService.memberMasterCancel(memberId);
return "redirect:/member/master";
}
뒤에 작성한 네이버 로그인보다 훨씬 간단하지만 코드가 훨씬 많다..
하지만 네이버 로그인보다 훨씬 빠르게 구현했다.
아는 것이 힘이다 역시..ㅜㅜ
뷰
<div class="col-lg-6">
<!-- Circle Buttons -->
<div class="card shadow mb-4">
<div class="card-header py-3">
<h6 class="m-0 font-weight-bold text-primary">회원정지</h6>
</div>
<div class="card-body">
<form id="memberSanction" action="/member/memberSanction" method="POST" class="form-signup form-user panel-body" autocomplete="off">
<div class="form-group">
<label class="control-label" for="fullName">ID입력</label>
<input type="text" name="memberName" class="form-control input-sm" >
<select name="sanctionTime">
<option value="1">1일</option>
<option value="7">7일</option>
<option value="30">30일</option>
<option value="90">90일</option>
<option value="300">300일</option>
</select>
</div>
<button class="btn btn-primary btn-block" type="submit" >정지</button>
</form>
</div>
</div>
</div>
뷰는 이런느낌으로 input값을 받을 수 있게 해줬다.
Controller (로그인 부분)
if(memberService.memberRankCheck(loginVO.getMemberId()) == 1) {
logger.info("들어옴?? ");
httpSession.invalidate();
model.addAttribute("sanctionTime", memberService.memberSanctionTime(memberVO.getMemberId()));
return "/member/sanction";
}
정지회원인지 여부를 로그인컨트롤러에 추가해준다.
결과
1. 회원목록
2.밑에서 두번째의 'ssss' 회원을 300일 정지
3.랭크2로 변경, 현재시간에서 +300일
4.로그인시 정지페이지로 이동, 로그인 불가
5.공지사항 1408번글 해제
6. 커뮤니티 게시판에서 공지사항이 없어짐
'SPRING > IceWater Community' 카테고리의 다른 글
IceWater 커뮤니티 프로젝트 마무리 (5) | 2021.10.24 |
---|---|
[스프링] 소셜로그인 구현 - 네이버 (0) | 2021.10.24 |
[스프링] 커뮤니티 알림목록 (0) | 2021.10.24 |
[스프링] 커뮤니티 실시간 푸시알림 - 웹소켓 (1) | 2021.10.24 |
[스프링] 메인페이지,인기글 구현 (블라인드 참고) (0) | 2021.10.17 |