Quellcode durchsuchen

그룹 권한 관리 추가

huiwon.seo vor 4 Jahren
Ursprung
Commit
78a477edbe

+ 217 - 0
src/main/java/com/lemon/lifecenter/controller/RoleController.java

@@ -0,0 +1,217 @@
+package com.lemon.lifecenter.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.lemon.lifecenter.common.LifeCenterController;
+import com.lemon.lifecenter.dto.RoleDTO;
+import com.lemon.lifecenter.service.RoleService;
+
+@Controller
+@RequestMapping("/role")
+public class RoleController extends LifeCenterController {
+    
+    @Autowired
+    private RoleService roleService;
+    
+    @RequestMapping( "/list" )
+    public ModelAndView list() {
+        
+        RoleDTO dto = new RoleDTO();
+        
+        int total = roleService.selectGroupListCount(dto);
+        
+        List<RoleDTO> roleList = new ArrayList<RoleDTO>();
+        
+        if( total > 0 ) {
+            roleList = roleService.selectGroupList(dto);
+        }
+        
+        ModelAndView mv = setMV( "role/list" );
+        
+        mv.addObject( "total", total );
+        mv.addObject( "roleList", roleList );
+        
+        return mv;
+    }
+    
+    @RequestMapping( "/new" )
+    public ModelAndView insert() {
+        
+        RoleDTO dto = new RoleDTO();
+        
+        List<RoleDTO> menuList = roleService.selectMenuListOneDepth( dto );
+        
+        ModelAndView mv = setMV( "role/new" );
+        mv.addObject( "menuList", menuList );
+        
+        return mv;
+    }
+    
+    @RequestMapping(value="/new/insert", method = RequestMethod.POST)
+    @Transactional(propagation=Propagation.REQUIRED)
+    public String newInsert( 
+            @RequestParam(value="groupName", required = true) String groupName,
+            @RequestParam(value="useYn", required = true) String useYn,
+            @RequestParam(value="menuCode", required=false, defaultValue="") String[] menuCode,
+            @RequestParam(value="createYn", required=false, defaultValue="") String[] createYn,
+            @RequestParam(value="readYn", required=false, defaultValue="") String[] readYn,
+            @RequestParam(value="updateYn", required=false, defaultValue="") String[] updateYn,
+            @RequestParam(value="deleteYn", required=false, defaultValue="") String[] deleteYn ) {
+        
+        RoleDTO dto = new RoleDTO();
+        
+        dto.setGroupName( groupName );
+        dto.setUseYn( useYn );
+        
+        roleService.insertGroupList( dto );
+        
+        for( int i = 0; i < menuCode.length; i ++ ) {
+            dto.setMenuCode( menuCode[i] );
+            dto.setCreateYn( "N" );
+            dto.setReadYn( "N" );
+            dto.setUpdateYn( "N" );
+            dto.setDeleteYn( "N" );
+            
+            for( int j = 0; j < createYn.length; j ++ ) {
+                if( createYn[j].equals( menuCode[i] ) ) {
+                    dto.setCreateYn( "Y" );
+                }
+            }
+            
+            for( int k = 0; k < readYn.length; k ++ ) {
+                if( readYn[k].equals( menuCode[i] ) ) {
+                    dto.setReadYn( "Y" );
+                }
+            }
+            
+            for( int l = 0; l < updateYn.length; l ++ ) {
+                if( updateYn[l].equals( menuCode[i] ) ) {
+                    dto.setUpdateYn( "Y" );
+                }
+            }
+            
+            for( int q = 0; q < deleteYn.length; q ++ ) {
+                if( deleteYn[q].equals( menuCode[i] ) ) {
+                    dto.setDeleteYn( "Y" );
+                }
+            }
+            
+            roleService.insertMenuRole(dto);
+        }
+        
+        return "redirect:/role/list";
+    }
+    
+    @RequestMapping( "/info" )
+    public ModelAndView info( @RequestParam( value = "groupIdx", required = true ) int groupIdx ) {
+        
+        RoleDTO dto = new RoleDTO();
+        dto.setGroupIdx( groupIdx );
+        
+        ModelAndView mv = setMV( "role/info" );
+        
+        RoleDTO groupData = roleService.selectGroupInfo(dto);
+        List<RoleDTO> roleData = roleService.selectMenuRole(dto);
+        
+        int total = roleService.selectGroupListCount(dto);
+        
+        List<RoleDTO> roleList = new ArrayList<RoleDTO>();
+        
+        if( total > 0 ) {
+            roleList = roleService.selectGroupList(dto);
+        }
+        
+        mv.addObject( "roleList", roleList );
+        mv.addObject( "roleData", roleData );
+        mv.addObject( "groupData", groupData );
+        mv.addObject( "groupIdx", groupIdx );
+        
+        return mv;
+    }
+    
+    @RequestMapping(value="/edit", method = RequestMethod.POST)
+    public ModelAndView edit(
+            @RequestParam( value = "groupIdx", required = true ) int groupIdx ) {
+        RoleDTO dto = new RoleDTO();
+        dto.setGroupIdx( groupIdx );
+        
+        RoleDTO groupData = roleService.selectGroupInfo(dto);
+        List<RoleDTO> roleData = roleService.selectMenuRole(dto);
+        
+        ModelAndView mv = setMV( "role/edit" );
+        
+        mv.addObject( "groupIdx", groupIdx );
+        mv.addObject( "roleData", roleData );
+        mv.addObject( "groupData", groupData );
+        return mv;
+    }
+    
+   
+    @RequestMapping(value="/edit/update", method = RequestMethod.POST)
+    @Transactional(propagation=Propagation.REQUIRED)
+    public String update( 
+            @RequestParam(value="groupIdx", required = true) int groupIdx,
+            @RequestParam(value="groupName", required = true) String groupName,
+            @RequestParam(value="useYn", required = true) String useYn,
+            @RequestParam(value="menuCode", required=false, defaultValue="") String[] menuCode,
+            @RequestParam(value="createYn", required=false, defaultValue="") String[] createYn,
+            @RequestParam(value="readYn", required=false, defaultValue="") String[] readYn,
+            @RequestParam(value="updateYn", required=false, defaultValue="") String[] updateYn,
+            @RequestParam(value="deleteYn", required=false, defaultValue="") String[] deleteYn ) {
+        
+        RoleDTO dto = new RoleDTO();
+        
+        dto.setGroupIdx( groupIdx );
+        dto.setGroupName( groupName );
+        dto.setUseYn( useYn );
+        
+        roleService.updateGroupList( dto );
+        roleService.deleteMenuRole( dto );
+        
+        for( int i = 0; i < menuCode.length; i ++ ) {
+            dto.setMenuCode( menuCode[i] );
+            dto.setCreateYn( "N" );
+            dto.setReadYn( "N" );
+            dto.setUpdateYn( "N" );
+            dto.setDeleteYn( "N" );
+            
+            for( int j = 0; j < createYn.length; j ++ ) {
+                if( createYn[j].equals( menuCode[i] ) ) {
+                    dto.setCreateYn( "Y" );
+                }
+            }
+            
+            for( int k = 0; k < readYn.length; k ++ ) {
+                if( readYn[k].equals( menuCode[i] ) ) {
+                    dto.setReadYn( "Y" );
+                }
+            }
+            
+            for( int l = 0; l < updateYn.length; l ++ ) {
+                if( updateYn[l].equals( menuCode[i] ) ) {
+                    dto.setUpdateYn( "Y" );
+                }
+            }
+            
+            for( int q = 0; q < deleteYn.length; q ++ ) {
+                if( deleteYn[q].equals( menuCode[i] ) ) {
+                    dto.setDeleteYn( "Y" );
+                }
+            }
+            
+            roleService.insertMenuRole(dto);
+        }
+        
+        return "redirect:/role/info?groupIdx=" + groupIdx;
+    }
+}

+ 108 - 0
src/main/java/com/lemon/lifecenter/dto/RoleDTO.java

@@ -0,0 +1,108 @@
+package com.lemon.lifecenter.dto;
+
+
+public class RoleDTO {
+    private int groupIdx;
+    private String groupName;
+    private String useYn;
+    private String createDate;
+    private String updateDate;
+    
+    private String menuCode;
+    private String parentCode;
+    private String menuName;
+    private String menuPath;
+    private String menuType;
+    
+    private String createYn;
+    private String readYn;
+    private String updateYn;
+    private String deleteYn;
+    
+    public int getGroupIdx() {
+        return groupIdx;
+    }
+    public void setGroupIdx(int groupIdx) {
+        this.groupIdx = groupIdx;
+    }
+    public String getGroupName() {
+        return groupName;
+    }
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+    public String getUseYn() {
+        return useYn;
+    }
+    public void setUseYn(String useYn) {
+        this.useYn = useYn;
+    }
+    public String getCreateDate() {
+        return createDate;
+    }
+    public void setCreateDate(String createDate) {
+        this.createDate = createDate;
+    }
+    public String getUpdateDate() {
+        return updateDate;
+    }
+    public void setUpdateDate(String updateDate) {
+        this.updateDate = updateDate;
+    }
+    public String getMenuCode() {
+        return menuCode;
+    }
+    public void setMenuCode(String menuCode) {
+        this.menuCode = menuCode;
+    }
+    public String getParentCode() {
+        return parentCode;
+    }
+    public void setParentCode(String parentCode) {
+        this.parentCode = parentCode;
+    }
+    public String getMenuName() {
+        return menuName;
+    }
+    public void setMenuName(String menuName) {
+        this.menuName = menuName;
+    }
+    public String getMenuPath() {
+        return menuPath;
+    }
+    public void setMenuPath(String menuPath) {
+        this.menuPath = menuPath;
+    }
+    public String getMenuType() {
+        return menuType;
+    }
+    public void setMenuType(String menuType) {
+        this.menuType = menuType;
+    }
+    public String getCreateYn() {
+        return createYn;
+    }
+    public void setCreateYn(String createYn) {
+        this.createYn = createYn;
+    }
+    public String getReadYn() {
+        return readYn;
+    }
+    public void setReadYn(String readYn) {
+        this.readYn = readYn;
+    }
+    public String getUpdateYn() {
+        return updateYn;
+    }
+    public void setUpdateYn(String updateYn) {
+        this.updateYn = updateYn;
+    }
+    public String getDeleteYn() {
+        return deleteYn;
+    }
+    public void setDeleteYn(String deleteYn) {
+        this.deleteYn = deleteYn;
+    }
+    
+    
+}

+ 24 - 0
src/main/java/com/lemon/lifecenter/mapper/RoleMapper.java

@@ -0,0 +1,24 @@
+package com.lemon.lifecenter.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+import com.lemon.lifecenter.dto.RoleDTO;
+
+
+@Repository
+@Mapper
+public interface RoleMapper {
+    public int selectGroupListCount( RoleDTO dto );
+    public RoleDTO selectGroupInfo( RoleDTO dto );
+    public void insertGroupList( RoleDTO dto );
+    public void updateGroupList( RoleDTO dto );
+    public void deleteGroupList( RoleDTO dto );
+    public List<RoleDTO> selectGroupList( RoleDTO dto );
+    public List<RoleDTO> selectMenuListOneDepth( RoleDTO dto );
+    public List<RoleDTO> selectMenuRole( RoleDTO dto );
+    public void deleteMenuRole( RoleDTO dto );
+    public void insertMenuRole( RoleDTO dto );
+}

+ 46 - 0
src/main/java/com/lemon/lifecenter/service/RoleService.java

@@ -0,0 +1,46 @@
+package com.lemon.lifecenter.service;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.lemon.lifecenter.dto.RoleDTO;
+import com.lemon.lifecenter.mapper.RoleMapper;
+
+@Service
+public class RoleService {
+    @Autowired
+    private RoleMapper mapper;
+    public int selectGroupListCount( RoleDTO dto ) {
+        return mapper.selectGroupListCount(dto);
+    }
+    public RoleDTO selectGroupInfo( RoleDTO dto ) {
+        return mapper.selectGroupInfo(dto);
+    }
+    public void insertGroupList( RoleDTO dto ) {
+        mapper.insertGroupList(dto);
+    }
+    public void updateGroupList( RoleDTO dto ) {
+        mapper.updateGroupList(dto);
+    }
+    public void deleteGroupList( RoleDTO dto ) {
+        mapper.deleteGroupList(dto);
+    }
+    public List<RoleDTO> selectGroupList( RoleDTO dto ){
+        return mapper.selectGroupList(dto);
+    }
+    public List<RoleDTO> selectMenuListOneDepth( RoleDTO dto ){
+        return mapper.selectMenuListOneDepth(dto);
+    }
+    
+    public List<RoleDTO> selectMenuRole( RoleDTO dto ){
+        return mapper.selectMenuRole(dto);
+    }
+    public void deleteMenuRole( RoleDTO dto ) {
+        mapper.deleteMenuRole(dto);
+    }
+    public void insertMenuRole( RoleDTO dto ) {
+        mapper.insertMenuRole(dto);
+    }
+}

+ 115 - 0
src/main/resources/mybatis/mapper/role/role.xml

@@ -0,0 +1,115 @@
+<?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.lemon.lifecenter.mapper.RoleMapper">
+    <select id="selectGroupListCount" parameterType="RoleDTO" resultType="int">
+        <![CDATA[
+            SELECT COUNT(*)
+              FROM group_list
+        ]]>
+    </select>
+    
+    <select id="selectGroupList" parameterType="RoleDTO" resultType="RoleDTO">
+        <![CDATA[
+            SELECT idx         AS groupIdx,
+                   group_name  AS groupName,
+                   use_yn      AS useYn,
+                   DATE_FORMAT( create_date, '%Y-%m-%d %H:%i' ) AS createDate,
+                   DATE_FORMAT( update_date, '%Y-%m-%d %H:%i' ) AS updateDate
+              FROM group_list
+             ORDER BY create_date DESC
+        ]]>
+    </select>
+    
+    <insert id="insertGroupList" parameterType="RoleDTO" useGeneratedKeys="true">
+        <selectKey keyProperty="groupIdx" resultType="int" order="AFTER">
+            <![CDATA[
+                SELECT CURRENT_VAL AS groupIdx FROM db_serial WHERE NAME = 'group_list_ai_idx';
+            ]]>
+        </selectKey>
+        
+        <![CDATA[
+            INSERT
+              INTO group_list
+                   ( group_name, use_yn, create_date )
+            VALUES ( #{groupName}, #{useYn}, NOW() )
+            
+        ]]>
+    </insert>
+    
+    <update id="updateGroupList" parameterType="RoleDTO">
+        <![CDATA[
+            UPDATE group_list
+               SET group_name  = #{groupName},
+                   use_yn      = #{useYn},
+                   update_date = NOW()
+             WHERE idx = #{groupIdx}
+        ]]>
+    </update>
+    
+    <delete id="deleteGroupList" parameterType="RoleDTO">
+        <![CDATA[
+            DELETE
+              FROM group_list
+             WHERE idx = #{groupIdx}
+        ]]>
+    </delete>
+    
+    <select id="selectGroupInfo" parameterType="RoleDTO" resultType="RoleDTO">
+        <![CDATA[
+            SELECT idx         AS groupIdx,
+                   group_name  AS groupName,
+                   use_yn      AS useYn,
+                   create_date AS createDate,
+                   update_date AS updateDate
+              FROM group_list
+             WHERE idx = #{groupIdx}
+        ]]>
+    </select>
+    
+    <select id="selectMenuListOneDepth" parameterType="RoleDTO" resultType="RoleDTO">
+        <![CDATA[
+            SELECT menu_code AS menuCode,
+                   menu_name AS menuName,
+                   menu_path AS menuPath,
+                   menu_type AS menuType
+              FROM sys_menu_list
+             WHERE parent_code = '*****'
+             ORDER BY menu_order ASC
+        ]]>
+    </select>
+    
+    <select id="selectMenuRole" parameterType="RoleDTO" resultType="RoleDTO">
+        <![CDATA[
+            SELECT ML.menu_code AS menuCode,
+                   ML.menu_name AS menuName,
+                   ML.menu_path AS menuPath,
+                   ML.menu_type AS menuType,
+                   IFNULL( ( SELECT create_yn FROM sys_menu_role WHERE group_idx=#{groupIdx} AND ML.menu_code = menu_code ), 'N' ) AS createYn,
+                   IFNULL( ( SELECT read_yn   FROM sys_menu_role WHERE group_idx=#{groupIdx} AND ML.menu_code = menu_code ), 'N' ) AS readYn,
+                   IFNULL( ( SELECT update_yn FROM sys_menu_role WHERE group_idx=#{groupIdx} AND ML.menu_code = menu_code ), 'N' ) AS updateYn,
+                   IFNULL( ( SELECT delete_yn FROM sys_menu_role WHERE group_idx=#{groupIdx} AND ML.menu_code = menu_code ), 'N' ) AS deleteYn
+              FROM sys_menu_list ML
+             WHERE parent_code = '*****'
+             ORDER BY menu_order ASC
+        ]]>
+    </select>
+    
+    <delete id="deleteMenuRole" parameterType="RoleDTO">
+        <![CDATA[
+            DELETE
+              FROM sys_menu_role
+             WHERE group_idx = #{groupIdx}
+        ]]>
+    </delete>
+    
+    <insert id="insertMenuRole" parameterType="RoleDTO">
+        <![CDATA[
+            INSERT 
+              INTO sys_menu_role
+                   (group_idx, menu_code, create_yn, read_yn, update_yn, delete_yn) 
+            VALUES (#{groupIdx}, #{menuCode}, #{createYn}, #{readYn}, #{updateYn}, #{deleteYn})
+        ]]>
+    </insert>
+    
+</mapper>

+ 10 - 5
src/main/webapp/WEB-INF/jsp/include/sidebar.jsp

@@ -76,11 +76,6 @@
                         
                     </c:if>
                     
-                    <c:if test="${data._SES_ID eq 'user'}">
-                        <li class="sidebar-item <c:if test='${data._MENUPATH eq "push"}'>active</c:if>">
-                            <a class="sidebar-link" href="/push/list">푸시 서비스 관리(테스트)</a>
-                        </li>
-                    </c:if>
                     <li class="sidebar-item <c:if test='${data._MENUPATH eq "notice"}'>active</c:if>">
                         <a class="sidebar-link" href="/notice/list">공지사항</a>
                     </li>
@@ -89,6 +84,16 @@
                             <a class="sidebar-link" href="/qna/list">의견 게시판</a>
                         </li>
                     </c:if>
+                    
+                    <c:if test="${data._SES_ID eq 'user'}">
+                        <li class="sidebar-item <c:if test='${data._MENUPATH eq "push"}'>active</c:if>">
+                            <a class="sidebar-link" href="/push/list">푸시 서비스 관리</a>
+                        </li>
+                        
+                        <li class="sidebar-item <c:if test='${data._MENUPATH eq "role"}'>active</c:if>">
+                            <a class="sidebar-link" href="/role/list">그룹 권한 관리</a>
+                        </li>
+                    </c:if>
                 </ul>
             </li>
         </ul>

+ 155 - 0
src/main/webapp/WEB-INF/jsp/role/edit.jsp

@@ -0,0 +1,155 @@
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
+<%@ page language="java" contentType="text/html; charset=UTF-8"
+    pageEncoding="UTF-8"%>
+<jsp:include page="${data._INCLUDE}/header.jsp"></jsp:include>
+<script>
+$( function(){
+    $( "#editForm" ).validate({
+        onkeyup: function( element, event ) {
+            $( element ).valid();
+        },
+        onfocusout: function (element) {
+            $( element ).val( $.trim( $( element ).val() ) );
+            $( element ).valid();
+        },
+        submitHandler: function(form) {
+//         	console.log( form.serialize() );
+// console.log( $( "#editForm" ).serialize() );
+//         	return false;
+            form.submit();
+        }
+    });
+})
+</script>
+</head>
+<body>
+    <div class="wrapper">
+        <jsp:include page="${data._INCLUDE}/sidebar.jsp"></jsp:include>
+        
+        <div class="main">
+            <jsp:include page="${data._INCLUDE}/top.jsp"></jsp:include>
+
+            <main class="content">
+                <div class="container-fluid p-0">
+                    <div class="row">
+                        <div class="col-12 col-lg-6">
+                            <h1 class="h3 mb-3">그룹 권한 수정</h1>
+                        </div>
+                        <div class="col-12 col-lg-6  text-right">
+                            <nav aria-label="breadcrumb">
+                                <ol class="breadcrumb">
+                                    <li class="breadcrumb-item"><a href="javscript:;">Home</a></li>
+                                    <li class="breadcrumb-item">그룹 권한 관리</li>
+                                    <li class="breadcrumb-item active">그룹 권한 수정</li>
+                                </ol>
+                            </nav>
+                        </div>
+                    </div>
+                    <div class="row">
+                        <div class="col-12">
+                            <div class="card">
+                                <form id="editForm" action="./edit/update" method="post">
+                                    <input type="hidden" name="groupIdx" value="${groupIdx}"/>
+                                    
+                                    <div class="card-body">
+                                        <h5 class="text-info mb-3">그룹명</h5>
+                                        <table class="table mobile-table mb-4">
+                                            <colgroup>
+                                                <col style="width:20%">
+                                                <col style="">
+                                            </colgroup>
+                                            <tr>
+                                                <th><span class="fix">*</span>그룹명</th>
+                                                <td>
+                                                    <input type="text" name="groupName" class="form-control" value="${groupData.groupName}" required>
+                                                </td>
+                                            </tr>
+                                        </table>
+                                        
+                                        <h5 class="text-info mb-3">메뉴별 권한 설정</h5>
+                                        <table class="table mobile-table mb-4">
+                                            <colgroup>
+                                                <col style="width:20%">
+                                                <col style="">
+                                            </colgroup>
+                                            
+                                            <thead>
+                                                <tr>
+                                                    <th>메뉴</th>
+                                                    <th>권한</th>
+                                                </tr>
+                                            </thead>
+                                            
+                                            <tbody>
+                                                <c:forEach var="ml" items="${roleData}">
+                                                    <tr>
+                                                        <td>
+                                                            <c:out value="${ml.menuName}"/>
+                                                            <input type="hidden" name="menuCode" value="${ml.menuCode}"/>
+                                                        </td>
+                                                        <td>
+                                                            <label class="form-check form-check-inline">
+                                                                <input class="form-check-input" name="readYn" type="checkbox" value="<c:out value="${ml.menuCode}"/>" <c:if test="${ml.readYn eq 'Y'}">checked="checked"</c:if>>
+                                                                <span class="form-check-label">조회</span>
+                                                            </label>
+                                                            
+                                                            <label class="form-check form-check-inline">
+                                                                <input class="form-check-input" name="createYn" type="checkbox" value="<c:out value="${ml.menuCode}"/>" <c:if test="${ml.createYn eq 'Y'}">checked="checked"</c:if>>
+                                                                <span class="form-check-label">등록</span>
+                                                            </label>
+                                                            
+                                                            <label class="form-check form-check-inline">
+                                                                <input class="form-check-input" name="updateYn" type="checkbox" value="<c:out value="${ml.menuCode}"/>" <c:if test="${ml.updateYn eq 'Y'}">checked="checked"</c:if>>
+                                                                <span class="form-check-label">수정</span>
+                                                            </label>
+                                                            
+                                                            <label class="form-check form-check-inline">
+                                                                <input class="form-check-input" name="deleteYn" type="checkbox" value="<c:out value="${ml.menuCode}"/>" <c:if test="${ml.deleteYn eq 'Y'}">checked="checked"</c:if>>
+                                                                <span class="form-check-label">삭제</span>
+                                                            </label>
+                                                        </td>
+                                                    </tr>
+                                                </c:forEach>
+                                            </tbody>
+                                        </table>
+                                        
+                                        <h5 class="text-info mb-3">사용여부</h5>
+                                        <table class="table mobile-table">
+                                            <colgroup>
+                                                <col style="width:20%">
+                                                <col style="">
+                                            </colgroup>
+                                            <tr>
+                                                <th>사용여부</th>
+                                                <td>
+                                                    <select class="custom-select" name="useYn">
+                                                        <option value="Y" <c:if test="${groupData.useYn eq 'Y'}">selected</c:if>>활성</option>
+                                                        <option value="N" <c:if test="${groupData.useYn eq 'N'}">selected</c:if>>비활성</option>
+                                                    </select>
+                                                </td>
+                                            </tr>
+                                        </table>
+                                        
+                                        <div class="row mt-3">
+                                            <div class="col-12">
+                                                <div class="text-right">
+                                                    <button type="button" class="btn btn-outline-primary w100" onclick="history.back();">취소</button>
+                                                    <button type="submit" class="btn btn-primary w100">저장</button>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </form>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </main>
+
+            <jsp:include page="${data._INCLUDE}/footer.jsp"></jsp:include>
+        </div>
+    </div>
+</body>
+</html>

+ 186 - 0
src/main/webapp/WEB-INF/jsp/role/info.jsp

@@ -0,0 +1,186 @@
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
+<%@ page language="java" contentType="text/html; charset=UTF-8"
+    pageEncoding="UTF-8"%>
+<jsp:include page="${data._INCLUDE}/header.jsp"></jsp:include>
+<script>
+$( function(){
+//     $( "#newForm" ).validate({
+//         rules: {
+//             cooperativeCode: {
+//                 number:true,
+//                 digits:true,
+//                 remote : { 
+//                     type : "POST",
+//                     url  : "/cooperation/duplicateCheck",
+//                     data : { 
+//                         cooperativeCode : function(){
+//                             return $( "input[name='cooperativeCode']" ).val();
+//                         }
+//                     }
+//                 }
+//             }
+//         },
+//         messages : {
+//             cooperativeCode : {
+//                 remote : "이미 존재하는 요양기관기호입니다."
+//             }
+//         },
+//         onkeyup: function( element, event ) {
+//             $( element ).valid();
+//         },
+//         onfocusout: function (element) {
+//             $( element ).val( $.trim( $( element ).val() ) );
+//             $( element ).valid();
+//         },
+//         submitHandler: function(form) {
+//             form.submit();
+//         }
+//     });
+})
+function groupChange( t ){
+	location.href='./info?groupIdx=' + $( t ).val();
+}
+</script>
+</head>
+<body>
+    <div class="wrapper">
+        <jsp:include page="${data._INCLUDE}/sidebar.jsp"></jsp:include>
+        
+        <div class="main">
+            <jsp:include page="${data._INCLUDE}/top.jsp"></jsp:include>
+
+            <main class="content">
+                <div class="container-fluid p-0">
+                    <div class="row">
+                        <div class="col-12 col-lg-6">
+                            <h1 class="h3 mb-3">그룹 권한 정보 <span style="font-size:15px;">/ <c:out value="${groupData.groupName}"/></span></h1>
+                        </div>
+                        <div class="col-12 col-lg-6  text-right">
+                            <nav aria-label="breadcrumb">
+                                <ol class="breadcrumb">
+                                    <li class="breadcrumb-item"><a href="javscript:;">Home</a></li>
+                                    <li class="breadcrumb-item">그룹 권한 관리</li>
+                                    <li class="breadcrumb-item active">그룹 권한 정보</li>
+                                </ol>
+                            </nav>
+                        </div>
+                    </div>
+                    <div class="row">
+                        <div class="col-12">
+                            <div class="card">
+                                <form id="newForm" action="./edit" method="post">
+                                    <input type="hidden" name="groupIdx" value="${groupIdx}"/>
+                                    <div class="card-body">
+                                        <h5 class="text-info mb-3">그룹명</h5>
+                                        <table class="table mobile-table mb-4">
+                                            <colgroup>
+                                                <col style="width:20%">
+                                                <col style="">
+                                            </colgroup>
+                                            <tr>
+                                                <th>그룹명</th>
+                                                <td class="">
+                                                    <select class="custom-select" name="useYn" onchange="groupChange( this );">
+                                                        <c:forEach var="rl" items="${roleList}">
+                                                            <option value="${rl.groupIdx}" <c:if test="${groupData.groupIdx eq rl.groupIdx}">selected</c:if>><c:out value="${rl.groupName}"/></option>
+                                                        </c:forEach>
+                                                    </select>
+                                                </td>
+                                            </tr>
+                                        </table>
+                                        
+                                        <h5 class="text-info mb-3">메뉴별 권한 설정</h5>
+                                        <table class="table mobile-table mb-4">
+                                            <colgroup>
+                                                <col style="width:10%">
+                                                <col style="width:40%">
+                                                <col style="width:10%">
+                                                <col style="width:40%">
+                                            </colgroup>
+                                            
+                                            <thead>
+                                                <tr>
+                                                    <th>메뉴</th>
+                                                    <th>권한</th>
+                                                </tr>
+                                            </thead>
+                                            
+                                            <tbody>
+                                                <c:forEach var="ml" items="${roleData}">
+                                                    <tr>
+                                                        <td><c:out value="${ml.menuName}"/></td>
+                                                        <td>
+                                                            <label class="form-check form-check-inline">
+<%--                                                                 <input class="form-check-input" type="checkbox" value="<c:out value="${ml.menuCode}"/>" <c:if test="${ml.readYn eq 'Y'}">checked="checked"</c:if> <c:if test="${ml.readYn eq 'N'}">disabled</c:if> onclick="return false;"> --%>
+                                                                
+                                                                <c:if test="${ml.readYn eq 'Y'}">■</c:if>
+                                                                <c:if test="${ml.readYn eq 'N'}">□</c:if>
+                                                                <span class="form-check-label ml-1">조회</span>
+                                                            </label>
+                                                            
+                                                            <label class="form-check form-check-inline">
+<%--                                                                 <input class="form-check-input" type="checkbox" value="<c:out value="${ml.menuCode}"/>" <c:if test="${ml.createYn eq 'Y'}">checked="checked"</c:if> <c:if test="${ml.createYn eq 'N'}">disabled</c:if> onclick="return false;"> --%>
+                                                                <c:if test="${ml.createYn eq 'Y'}">■</c:if>
+                                                                <c:if test="${ml.createYn eq 'N'}">□</c:if>
+                                                                <span class="form-check-label ml-1">등록</span>
+                                                            </label>
+                                                            
+                                                            <label class="form-check form-check-inline">
+<%--                                                                 <input class="form-check-input" type="checkbox" value="<c:out value="${ml.menuCode}"/>" <c:if test="${ml.updateYn eq 'Y'}">checked="checked"</c:if> <c:if test="${ml.updateYn eq 'N'}">disabled</c:if> onclick="return false;"> --%>
+                                                                
+                                                                <c:if test="${ml.updateYn eq 'Y'}">■</c:if>
+                                                                <c:if test="${ml.updateYn eq 'N'}">□</c:if>
+                                                                <span class="form-check-label ml-1">수정</span>
+                                                            </label>
+                                                            
+                                                            <label class="form-check form-check-inline">
+<%--                                                                 <input class="form-check-input" type="checkbox" value="<c:out value="${ml.menuCode}"/>" <c:if test="${ml.deleteYn eq 'Y'}">checked="checked"</c:if> <c:if test="${ml.deleteYn eq 'N'}">disabled</c:if> onclick="return false;"> --%>
+                                                                
+                                                                <c:if test="${ml.deleteYn eq 'Y'}">■</c:if>
+                                                                <c:if test="${ml.deleteYn eq 'N'}">□</c:if>
+                                                                <span class="form-check-label ml-1">삭제</span>
+                                                            </label>
+                                                        </td>
+                                                    </tr>
+                                                </c:forEach>
+                                            </tbody>
+                                        </table>
+                                        
+                                        <h5 class="text-info mb-3">사용여부</h5>
+                                        <table class="table mobile-table mb-5 ">
+                                            <colgroup>
+                                                <col style="width:20%">
+                                                <col style="">
+                                            </colgroup>
+                                            <tr>
+                                                <th>사용여부</th>
+                                                <td>
+                                                    <c:if test="${groupData.useYn eq 'Y'}">활성</c:if>
+                                                    <c:if test="${groupData.useYn eq 'N'}">비활성</c:if>
+                                                </td>
+                                            </tr>
+                                        </table>
+                                        
+                                        <div class="row mt-3">
+                                            <div class="col-12">
+                                                <div class="text-right">
+                                                    <button type="button" class="btn btn-outline-primary w100" onclick="location.href='/role/list';">목록</button>
+                                                    <button type="submit" class="btn btn-primary w100">수정</button>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </form>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </main>
+
+            <jsp:include page="${data._INCLUDE}/footer.jsp"></jsp:include>
+        </div>
+    </div>
+</body>
+</html>

+ 126 - 0
src/main/webapp/WEB-INF/jsp/role/list.jsp

@@ -0,0 +1,126 @@
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
+<%@ page language="java" contentType="text/html; charset=UTF-8"
+    pageEncoding="UTF-8"%>
+<jsp:include page="${data._INCLUDE}/header.jsp"></jsp:include>
+<script>
+</script>
+</head>
+<body>
+    <div class="wrapper">
+        <jsp:include page="${data._INCLUDE}/sidebar.jsp"></jsp:include>
+        
+        <div class="main">
+            <jsp:include page="${data._INCLUDE}/top.jsp"></jsp:include>
+
+            <main class="content">
+                <div class="container-fluid p-0">
+                    <div class="row">
+                        <div class="col-12 col-lg-6">
+                            <h1 class="h3 mb-3">그룹 권한 관리</h1>
+                        </div>
+                        <div class="col-12 col-lg-6  text-right">
+                            <nav aria-label="breadcrumb">
+                                <ol class="breadcrumb">
+                                    <li class="breadcrumb-item"><a href="javscript:;">Home</a></li>
+                                    <li class="breadcrumb-item">그룹 권한 관리</li>
+                                    <li class="breadcrumb-item active">그룹 리스트</li>
+                                </ol>
+                            </nav>
+                        </div>
+                    </div>
+                    <div class="row">
+                        <div class="col-12">
+                            <div class="card">
+                                <div class="card-body">
+                                    <div class="row mb-3">
+                                        <div class="col-6">전체 :
+                                            <fmt:formatNumber value="${total}" pattern="#,###" />
+                                        </div>
+                                        <div class="col-6 text-right">
+                                            <button class="btn btn-primary" onclick="location.href='./new';">그룹 신규 등록</button>
+                                        </div>
+                                    </div>
+                                    <div class="table-responsive">
+                                        <table class="table table-striped text-center">
+                                            <colgroup>
+                                                <col style=" width: 10%; ">
+                                                <col style=" width: 40%; ">
+                                                <col style=" width: 20%; ">
+                                                <col style=" width: 20%; ">
+                                                <col style=" width: 10%; ">
+                                            </colgroup>
+                                            <thead>
+                                                <tr>
+                                                    <th>번호</th>
+                                                    <th>권한그룹명</th>
+                                                    <th>생성일자</th>
+                                                    <th>수정일자</th>
+                                                    <th>사용여부</th>
+                                                </tr>
+                                            </thead>
+                                            <tbody>
+                                                <c:choose>
+                                                    <c:when test="${total > 0}">
+                                                        <c:forEach var="l" items="${roleList}" varStatus="lStatus">
+                                                            <c:set var="viewLink" value="./info?groupIdx=${l.groupIdx}" />
+                                                            
+                                                            <tr>
+                                                                <td>
+                                                                    <c:set var="pageNum" value="${total - lStatus.index}" />
+                                                                    <fmt:formatNumber value="${pageNum}" pattern="#,###" />
+                                                                </td>
+                                                                <td>
+                                                                    <a href="${viewLink}"><c:out value="${l.groupName}" /></a>
+                                                                </td>
+                                                                <td><c:out value="${l.createDate}" /></td>
+                                                                <td><c:out value="${l.updateDate}" /></td>
+                                                                <td>
+                                                                    <c:if test="${l.useYn eq 'Y'}">활성</c:if>
+                                                                    <c:if test="${l.useYn eq 'N'}">비활성</c:if>
+                                                                </td>
+                                                            </tr>
+                                                        </c:forEach>
+                                                    </c:when>
+                                                    <c:otherwise>
+                                                        <tr>
+                                                            <td colspan="5">등록된 그룹권한이 없습니다.</td>
+                                                        </tr>
+                                                    </c:otherwise>
+                                                </c:choose>
+                                            </tbody>
+                                        </table>
+                                    </div>
+                                    <div class="row mt-5">
+                                        <div class="col-12 col-lg-6 mb-2">
+                                        </div>
+                                        <div class="col-12 col-lg-6 mb-2">
+                                            <jsp:include page="${data._INCLUDE}/paging.jsp" flush="true">
+                                                <jsp:param name="firstPageNo" value="${paging.firstPageNo}" />
+                                                <jsp:param name="prevPageNo"  value="${paging.prevPageNo}" />
+                                                <jsp:param name="startPageNo" value="${paging.startPageNo}" />
+                                                <jsp:param name="pageNo"      value="${paging.pageNo}" />
+                                                <jsp:param name="endPageNo"   value="${paging.endPageNo}" />
+                                                <jsp:param name="nextPageNo"  value="${paging.nextPageNo}" />
+                                                <jsp:param name="finalPageNo" value="${paging.finalPageNo}" />
+                                                <jsp:param name="preFix"      value="${paging.preFix}" />
+                                                <jsp:param name="url"         value="${paging.url}" />
+                                                <jsp:param name="total"       value="${paging.totalCount}" />
+                                            </jsp:include>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    
+                    
+                </div>
+            </main>
+
+            <jsp:include page="${data._INCLUDE}/footer.jsp"></jsp:include>
+        </div>
+    </div>
+</body>
+</html>

+ 149 - 0
src/main/webapp/WEB-INF/jsp/role/new.jsp

@@ -0,0 +1,149 @@
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
+<%@ page language="java" contentType="text/html; charset=UTF-8"
+    pageEncoding="UTF-8"%>
+<jsp:include page="${data._INCLUDE}/header.jsp"></jsp:include>
+<script>
+$( function(){
+    $( "#newForm" ).validate({
+        onkeyup: function( element, event ) {
+            $( element ).valid();
+        },
+        onfocusout: function (element) {
+            $( element ).val( $.trim( $( element ).val() ) );
+            $( element ).valid();
+        },
+        submitHandler: function(form) {
+            form.submit();
+        }
+    });
+})
+</script>
+</head>
+<body>
+    <div class="wrapper">
+        <jsp:include page="${data._INCLUDE}/sidebar.jsp"></jsp:include>
+        
+        <div class="main">
+            <jsp:include page="${data._INCLUDE}/top.jsp"></jsp:include>
+
+            <main class="content">
+                <div class="container-fluid p-0">
+                    <div class="row">
+                        <div class="col-12 col-lg-6">
+                            <h1 class="h3 mb-3">그룹 권한 관리</h1>
+                        </div>
+                        <div class="col-12 col-lg-6  text-right">
+                            <nav aria-label="breadcrumb">
+                                <ol class="breadcrumb">
+                                    <li class="breadcrumb-item"><a href="javscript:;">Home</a></li>
+                                    <li class="breadcrumb-item">그룹 권한 관리</li>
+                                    <li class="breadcrumb-item active">그룹 신규 등록</li>
+                                </ol>
+                            </nav>
+                        </div>
+                    </div>
+                    <div class="row">
+                        <div class="col-12">
+                            <div class="card">
+                                <form id="newForm" action="./new/insert" method="post">
+                                    <div class="card-body">
+                                        <h5 class="text-info mb-3">그룹명</h5>
+                                        <table class="table mobile-table mb-4">
+                                            <colgroup>
+                                                <col style="width:20%">
+                                                <col style="">
+                                            </colgroup>
+                                            <tr>
+                                                <th><span class="fix">*</span>그룹명</th>
+                                                <td>
+                                                    <input type="text" name="groupName" class="form-control" placeholder="그룹명을 입력해주세요" autocomplete="off" required>
+                                                </td>
+                                            </tr>
+                                        </table>
+                                        
+                                        <h5 class="text-info mb-3">메뉴별 권한 설정</h5>
+                                        <table class="table mobile-table mb-4">
+                                            <colgroup>
+                                                <col style="width:10%">
+                                                <col style="width:40%">
+                                                <col style="width:10%">
+                                                <col style="width:40%">
+                                            </colgroup>
+                                            
+                                            <thead>
+                                                <tr>
+                                                    <th>메뉴</th>
+                                                    <th>권한</th>
+                                                </tr>
+                                            </thead>
+                                            
+                                            <tbody>
+                                                <c:forEach var="ml" items="${menuList}">
+                                                    <tr>
+                                                        <td><c:out value="${ml.menuName}"/></td>
+                                                        <td>
+                                                            <label class="form-check form-check-inline">
+                                                                <input class="form-check-input" name="readYn" type="checkbox" value="<c:out value="${ml.menuCode}"/>">
+                                                                <span class="form-check-label">조회</span>
+                                                            </label>
+                                                            
+                                                            <label class="form-check form-check-inline">
+                                                                <input class="form-check-input" name="createYn" type="checkbox" value="<c:out value="${ml.menuCode}"/>">
+                                                                <span class="form-check-label">등록</span>
+                                                            </label>
+                                                            
+                                                            <label class="form-check form-check-inline">
+                                                                <input class="form-check-input" name="updateYn" type="checkbox" value="<c:out value="${ml.menuCode}"/>">
+                                                                <span class="form-check-label">수정</span>
+                                                            </label>
+                                                            
+                                                            <label class="form-check form-check-inline">
+                                                                <input class="form-check-input" name="deleteYn" type="checkbox" value="<c:out value="${ml.menuCode}"/>">
+                                                                <span class="form-check-label">삭제</span>
+                                                            </label>
+                                                        </td>
+                                                    </tr>
+                                                </c:forEach>
+                                            </tbody>
+                                        </table>
+                                        
+                                        <h5 class="text-info mb-3">그룹명</h5>
+                                        <table class="table mobile-table">
+                                            <colgroup>
+                                                <col style="width:20%">
+                                                <col style="">
+                                            </colgroup>
+                                            <tr>
+                                                <th>사용여부</th>
+                                                <td>
+                                                    <select class="custom-select" name="useYn">
+                                                        <option value="Y">활성</option>
+                                                        <option value="N">비활성</option>
+                                                    </select>
+                                                </td>
+                                            </tr>
+                                        </table>
+                                        
+                                        <div class="row mt-3">
+                                            <div class="col-12">
+                                                <div class="text-right">
+                                                    <button type="button" class="btn btn-outline-primary w100" onclick="history.back();">취소</button>
+                                                    <button type="submit" class="btn btn-primary w100">등록</button>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </form>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </main>
+
+            <jsp:include page="${data._INCLUDE}/footer.jsp"></jsp:include>
+        </div>
+    </div>
+</body>
+</html>