대시보드 방문자 수 표현 기능 추가.

master
강석 최 2022-02-24 17:29:02 +09:00
parent a78e10480c
commit 5d7b47fc13
12 changed files with 255 additions and 46 deletions

View File

@ -0,0 +1,12 @@
package com.mca.cmmn.mapper;
import com.mca.cmmn.vo.BaseSearchVO;
import com.mca.cmmn.vo.LogVO;
import egovframework.rte.psl.dataaccess.mapper.Mapper;
@Mapper("logMapper")
public interface LogMapper {
void insertLog(LogVO logVO);
int selectLoginCnt(BaseSearchVO searchVO);
}

View File

@ -0,0 +1,28 @@
package com.mca.cmmn.service;
import com.mca.cmmn.mapper.LogMapper;
import com.mca.cmmn.vo.BaseSearchVO;
import com.mca.cmmn.vo.LogVO;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service("logService")
public class LogService {
@Resource(name="logMapper")
LogMapper logMapper;
public void insertLog(LogVO logVO){
logMapper.insertLog(logVO);
}
public int selectLoginCnt(BaseSearchVO searchVO){
return logMapper.selectLoginCnt(searchVO);
}
// public LayersVO selectFacility(String layer) {
// return layersMapper.selectFacility(layer);
// }
}

View File

@ -1,5 +1,7 @@
package com.mca.cmmn.vo; package com.mca.cmmn.vo;
import java.time.LocalDate;
public class BaseSearchVO { public class BaseSearchVO {
/** /**
@ -34,6 +36,9 @@ public class BaseSearchVO {
/** recordCountPerPage */ /** recordCountPerPage */
private int recordCountPerPage = 10; private int recordCountPerPage = 10;
private String searchStartDate;
private String searchEndDate;
public String getSearchCondition() { public String getSearchCondition() {
return searchCondition; return searchCondition;
} }
@ -105,4 +110,21 @@ public class BaseSearchVO {
public void setRecordCountPerPage(int recordCountPerPage) { public void setRecordCountPerPage(int recordCountPerPage) {
this.recordCountPerPage = recordCountPerPage; this.recordCountPerPage = recordCountPerPage;
} }
public String getSearchStartDate() {
return searchStartDate;
}
public void setSearchStartDate(String searchStartDate) {
this.searchStartDate = searchStartDate;
}
public String getSearchEndDate() {
return searchEndDate;
}
public void setSearchEndDate(String searchEndDate) {
this.searchEndDate = searchEndDate;
}
} }

View File

@ -0,0 +1,16 @@
package com.mca.cmmn.vo;
public enum LogActions {
LOGIN("login"),
LOGOUT("logout");
private String value;
LogActions(String value) {
this.value = value;
}
public String getValue(){
return value;
}
}

View File

@ -0,0 +1,61 @@
package com.mca.cmmn.vo;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class LogVO {
private String log_cd;
private String userid;
private String action;
private String etc;
private LocalDateTime created_date;
public String getLog_cd() {
return log_cd;
}
public void setLog_cd(String log_cd) {
this.log_cd = log_cd;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public String getEtc() {
return etc;
}
public void setEtc(String etc) {
this.etc = etc;
}
public LocalDateTime getCreated_date() {
return created_date;
}
public void setCreated_date(LocalDateTime created_date) {
this.created_date = created_date;
}
public void setLog(String userid, String logAction, String etc, LocalDateTime now){
setLog_cd(now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")).substring(2));
setUserid(userid);
setAction(logAction);
setEtc(etc);
setCreated_date(now);
}
}

View File

@ -1,11 +1,15 @@
package com.mca.cmmn.web; package com.mca.cmmn.web;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import com.mca.cmmn.service.LogService;
import com.mca.cmmn.vo.BaseSearchVO;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.ModelAttribute;
@ -60,6 +64,9 @@ public class AdminController {
@Resource(name="fieldDataService") @Resource(name="fieldDataService")
private FieldDataService fieldDataService; private FieldDataService fieldDataService;
@Resource(name = "logService")
private LogService logService;
/** /**
* *
* *
@ -79,6 +86,15 @@ public class AdminController {
int standByCount = userService.selectUserStandByCount(); int standByCount = userService.selectUserStandByCount();
model.addAttribute("standByCount", standByCount); model.addAttribute("standByCount", standByCount);
BaseSearchVO searchVO = new BaseSearchVO();
LocalDate searchStartDate = LocalDate.now();
searchVO.setSearchStartDate(searchStartDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
searchVO.setSearchEndDate(searchStartDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
model.addAttribute("dayLoginCount", logService.selectLoginCnt(searchVO));
searchVO.setSearchStartDate(searchStartDate.minusMonths(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
model.addAttribute("monthLoginCount", logService.selectLoginCnt(searchVO));
return "admin/dashBoard"; return "admin/dashBoard";
} catch (Exception e) { } catch (Exception e) {

View File

@ -1,12 +1,17 @@
package com.mca.sec; package com.mca.sec;
import java.io.IOException; import java.io.IOException;
import java.time.LocalDateTime;
import javax.annotation.Resource;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import com.mca.cmmn.service.LogService;
import com.mca.cmmn.vo.LogActions;
import com.mca.cmmn.vo.LogVO;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
@ -16,32 +21,45 @@ import com.mca.sec.UserUtil;
public class LoginSuccessHandler implements AuthenticationSuccessHandler{ public class LoginSuccessHandler implements AuthenticationSuccessHandler{
private String roleName; private String roleName;
@Resource(name="logService")
private LogService logService;
@Override @Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException { Authentication authentication) throws IOException, ServletException {
// TODO Auto-generated method stub // TODO Auto-generated method stub
LoginUserVO user = UserUtil.getMemberInfo(); LoginUserVO user = UserUtil.getMemberInfo();
if(user == null){
HttpSession session = request.getSession(); response.sendRedirect("/");
session.setAttribute("userVO", user); }else{
LoginSuccessHandler loginSuccessHandler = new LoginSuccessHandler(); HttpSession session = request.getSession();
authentication.getAuthorities().forEach(authority ->{ session.setAttribute("userVO", user);
loginSuccessHandler.roleName = authority.getAuthority();
}); LoginSuccessHandler loginSuccessHandler = new LoginSuccessHandler();
authentication.getAuthorities().forEach(authority ->{
if(loginSuccessHandler.roleName.equals("ROLE_USER")) { loginSuccessHandler.roleName = authority.getAuthority();
response.sendRedirect("/map/request"); });
return;
}else if(loginSuccessHandler.roleName.equals("ROLE_ADMIN")) { LogVO logVO = new LogVO();
response.sendRedirect("/admin/dashBoard"); logVO.setLog(user.getUserid(), LogActions.LOGIN.getValue(), null, LocalDateTime.now());
return; logService.insertLog(logVO);
}else if(loginSuccessHandler.roleName.equals("ROLE_DISABLE")) {
response.sendRedirect("/login?fail"); switch (loginSuccessHandler.roleName) {
return; case "ROLE_USER":
} response.sendRedirect("/map/request");
response.sendRedirect("/"); return;
case "ROLE_ADMIN":
response.sendRedirect("/admin/dashBoard");
return;
case "ROLE_DISABLE":
response.sendRedirect("/login?fail");
return;
}
}
} }
} }

View File

@ -1,16 +1,24 @@
package com.mca.sec; package com.mca.sec;
import java.io.IOException; import java.io.IOException;
import java.time.LocalDateTime;
import javax.annotation.Resource;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.mca.cmmn.service.LogService;
import com.mca.cmmn.vo.LogActions;
import com.mca.cmmn.vo.LogVO;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler; import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler;
public class LogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler{ public class LogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler{
@Resource(name="logService")
private LogService logService;
private String successUrl = "/"; private String successUrl = "/";
public void setSuccessUrl(String successUrl){ public void setSuccessUrl(String successUrl){
@ -18,8 +26,14 @@ public class LogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler{
} }
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
setDefaultTargetUrl(successUrl);
super.onLogoutSuccess(request, response, authentication); LogVO logVO = new LogVO();
} logVO.setLog(authentication.getName(), LogActions.LOGOUT.getValue(), null, LocalDateTime.now());
logService.insertLog(logVO);
setDefaultTargetUrl(successUrl);
super.onLogoutSuccess(request, response, authentication);
}
} }

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mca.cmmn.mapper.LogMapper">
<insert id="insertLog" parameterType="logVO">
insert into t_logs values(
#{log_cd}, #{userid}, #{action}, #{etc}, #{created_date}
);
</insert>
<select id="selectLoginCnt" parameterType="baseSearchVO" resultType="int">
select
count(*)
from t_logs
where created_date >= concat(#{searchStartDate},' 00:00:00')
and created_date &lt;= concat(#{searchEndDate}' 23:59:59')
and action = 'login'
</select>
</mapper>

View File

@ -2,24 +2,25 @@
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration> <configuration>
<typeAliases> <typeAliases>
<!-- <typeAlias alias="searchVO" type="egovframework.example.sample.service.SampleDefaultVO"/> --> <!-- <typeAlias alias="searchVO" type="egovframework.example.sample.service.SampleDefaultVO"/> -->
<typeAlias alias="baseSearchVO" type="com.mca.cmmn.vo.BaseSearchVO" /> <typeAlias alias="baseSearchVO" type="com.mca.cmmn.vo.BaseSearchVO" />
<typeAlias alias="layersVO" type="com.mca.cmmn.vo.LayersVO" /> <typeAlias alias="layersVO" type="com.mca.cmmn.vo.LayersVO" />
<typeAlias alias="areaCodeVO" type="com.mca.cmmn.vo.AreaCodeVO" /> <typeAlias alias="logVO" type="com.mca.cmmn.vo.LogVO" />
<typeAlias alias="areaCodeVO" type="com.mca.cmmn.vo.AreaCodeVO" />
<typeAlias alias="useRequestVO" type="com.mca.map.vo.UseRequestVO"/>
<typeAlias alias="useRequestSearchVO" type="com.mca.map.vo.UseRequestSearchVO" /> <typeAlias alias="useRequestVO" type="com.mca.map.vo.UseRequestVO"/>
<typeAlias alias="useHistoryVO" type="com.mca.map.vo.UseHistoryVO"/> <typeAlias alias="useRequestSearchVO" type="com.mca.map.vo.UseRequestSearchVO" />
<typeAlias alias="useHistorySearchVO" type="com.mca.map.vo.UseHistorySearchVO" /> <typeAlias alias="useHistoryVO" type="com.mca.map.vo.UseHistoryVO"/>
<typeAlias alias="fieldDataVO" type="com.mca.map.vo.FieldDataVO"/> <typeAlias alias="useHistorySearchVO" type="com.mca.map.vo.UseHistorySearchVO" />
<typeAlias alias="fieldDataSearchVO" type="com.mca.map.vo.FieldDataSearchVO" /> <typeAlias alias="fieldDataVO" type="com.mca.map.vo.FieldDataVO"/>
<typeAlias alias="fieldDataSearchVO" type="com.mca.map.vo.FieldDataSearchVO" />
<typeAlias alias="securityRolesVO" type="com.mca.sec.vo.SecurityRolesVO" />
<typeAlias alias="loginUserVO" type="com.mca.sec.vo.LoginUserVO" /> <typeAlias alias="securityRolesVO" type="com.mca.sec.vo.SecurityRolesVO" />
<typeAlias alias="loginUserVO" type="com.mca.sec.vo.LoginUserVO" />
<typeAlias alias="userVO" type="com.mca.user.vo.UserVO"/>
<typeAlias alias="userSearchVO" type="com.mca.user.vo.UserSearchVO"/> <typeAlias alias="userVO" type="com.mca.user.vo.UserVO"/>
</typeAliases> <typeAlias alias="userSearchVO" type="com.mca.user.vo.UserSearchVO"/>
</typeAliases>
</configuration> </configuration>

View File

@ -38,7 +38,7 @@
</div> </div>
<div class="col-auto"> <div class="col-auto">
<p class="mb-0 text-black-50">오늘 방문자 수</p> <p class="mb-0 text-black-50">오늘 방문자 수</p>
<h3><c:out value="${statusCnt}" /></h3> <h3><c:out value="${dayLoginCount}" /></h3>
</div> </div>
</div> </div>
</div> </div>
@ -63,7 +63,7 @@
</div> </div>
<div class="col-auto"> <div class="col-auto">
<p class="mb-0 text-black-50">최근 한달 방문자 수</p> <p class="mb-0 text-black-50">최근 한달 방문자 수</p>
<h3><c:out value="${statusCnt}" /></h3> <h3><c:out value="${monthLoginCount}" /></h3>
</div> </div>
</div> </div>
</div> </div>

View File

@ -93,6 +93,8 @@ a {
transform: translate(-50%); transform: translate(-50%);
background-color: rgba(55, 55, 55, 1); background-color: rgba(55, 55, 55, 1);
border: 1px solid #ccc; border: 1px solid #ccc;
border-top: none;
border-bottom: none;
box-shadow: 5px 5px 20px grey; box-shadow: 5px 5px 20px grey;
} }
.login_title{ .login_title{