메뉴별 권한 설정
parent
d3b0cdd749
commit
49a474103a
|
|
@ -177,12 +177,12 @@ function EgovHeader({ loginUser, onChangeLogin }) {
|
|||
<div className="col">
|
||||
<h3>사이트관리</h3>
|
||||
<ul>
|
||||
<li><NavLink to={URL.ADMIN_SCHEDULE} className={({ isActive }) => (isActive ? "cur" : "")}>일정관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN_BOARD} className={({ isActive }) => (isActive ? "cur" : "")}>게시판생성관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN_SCHEDULE} className={({ isActive }) => (isActive ? "cur" : "")}>대시보드</NavLink></li>
|
||||
{/*<li><NavLink to={URL.ADMIN_BOARD} className={({ isActive }) => (isActive ? "cur" : "")}>게시판생성관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN_USAGE} className={({ isActive }) => (isActive ? "cur" : "")}>게시판사용관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN_NOTICE} className={({ isActive }) => (isActive ? "cur" : "")}>공지사항관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN_GALLERY} className={({ isActive }) => (isActive ? "cur" : "")}>사이트갤러리관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN_MANAGER} className={({ isActive }) => (isActive ? "cur" : "")}>사이트관리자 암호변경</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN_MANAGER} className={({ isActive }) => (isActive ? "cur" : "")}>사이트관리자 암호변경</NavLink></li>*/}
|
||||
</ul>
|
||||
</div>
|
||||
}
|
||||
|
|
@ -241,8 +241,8 @@ function EgovHeader({ loginUser, onChangeLogin }) {
|
|||
</div>
|
||||
{sessionUserSe ==='ACC_TP01' &&
|
||||
<>
|
||||
<h3><Link to={URL.ADMIN}>사이트관리</Link></h3>
|
||||
<div className="submenu closed">
|
||||
<h3><Link to={URL.ADMIN_SCHEDULE}>사이트관리</Link></h3>
|
||||
{/*<div className="submenu closed">
|
||||
<ul>
|
||||
<li><NavLink to={URL.ADMIN_SCHEDULE} className={({ isActive }) => (isActive ? "cur" : "")}>일정관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN_BOARD} className={({ isActive }) => (isActive ? "cur" : "")}>게시판생성관리</NavLink></li>
|
||||
|
|
@ -251,7 +251,7 @@ function EgovHeader({ loginUser, onChangeLogin }) {
|
|||
<li><NavLink to={URL.ADMIN_GALLERY} className={({ isActive }) => (isActive ? "cur" : "")}>사이트갤러리관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN_MANAGER} className={({ isActive }) => (isActive ? "cur" : "")}>사이트관리자 암호변경</NavLink></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>*/}
|
||||
</>
|
||||
}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,11 +1,13 @@
|
|||
import React from 'react';
|
||||
import React, {useCallback, useEffect, useState} from 'react';
|
||||
import { useLocation } from 'react-router-dom';
|
||||
import { NavLink } from 'react-router-dom';
|
||||
import URL from 'constants/url';
|
||||
import {Accordion} from "react-bootstrap";
|
||||
import * as EgovNet from "../../api/egovFetch";
|
||||
|
||||
function EgovLeftNavAdmin(props) {
|
||||
const location = useLocation();
|
||||
const [accordion, setAccordion] = useState([]);
|
||||
|
||||
const getMiddleFolder = (url) => { // 중간 폴더를 가져오는 로직 추가
|
||||
const parts = url.split('/').filter(Boolean); // '/'로 분할하고 빈 문자열을 필터링
|
||||
|
|
@ -36,106 +38,66 @@ function EgovLeftNavAdmin(props) {
|
|||
// activeKey = "7";
|
||||
// }
|
||||
|
||||
const getMenuAuth = useCallback(()=>{
|
||||
EgovNet.requestFetch(
|
||||
'/leftNav/menu?menuType=MNU_0000',
|
||||
{
|
||||
method: "GET"
|
||||
},
|
||||
(resp) => {
|
||||
const temp = [];
|
||||
resp.result.menuList.forEach(function (group, i) {
|
||||
temp.push(
|
||||
<Accordion.Item eventKey={i}>
|
||||
<Accordion.Header>{group.menuTitle}</Accordion.Header>
|
||||
<Accordion.Body>
|
||||
<ul className="menu4">
|
||||
{group.childList.map((menu) => {
|
||||
return (
|
||||
<li><NavLink to={menu.menuUrl} className={({ isActive }) => (isActive ? "cur" : "")}>{menu.menuTitle}</NavLink></li>
|
||||
)
|
||||
})}
|
||||
</ul>
|
||||
</Accordion.Body>
|
||||
</Accordion.Item>
|
||||
)
|
||||
})
|
||||
setAccordion(temp)
|
||||
},
|
||||
function (resp){
|
||||
|
||||
}
|
||||
);
|
||||
}, []);
|
||||
|
||||
useEffect(()=>{
|
||||
getMenuAuth();
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<div className="nav">
|
||||
<div className="inner">
|
||||
<h2 className={"nav_title"}>사이트관리
|
||||
<NavLink to={URL.ADMIN_SCHEDULE} className={({ isActive }) => (isActive ? "cur" : "")}><h6 className={"nav_subtitle"}>Dashboard</h6></NavLink></h2>
|
||||
<Accordion defaultActiveKey={activeKey}>
|
||||
{/*<Accordion.Item eventKey={"7"}>*/}
|
||||
{/* <Accordion.Header>사이트 관리</Accordion.Header>*/}
|
||||
{/* <Accordion.Body>*/}
|
||||
{/* <ul className="menu4">*/}
|
||||
{/* <li><NavLink to={URL.ADMIN_SCHEDULE} className={({ isActive }) => (isActive ? "cur" : "")}>Dashboard</NavLink></li>*/}
|
||||
{/* /!*<li><NavLink to={URL.ADMIN_BOARD} className={({ isActive }) => (isActive ? "cur" : "")}>게시판생성관리</NavLink></li>*/}
|
||||
{/* <li><NavLink to={URL.ADMIN_USAGE} className={({ isActive }) => (isActive ? "cur" : "")}>게시판사용관리</NavLink></li>*/}
|
||||
{/* <li><NavLink to={URL.ADMIN_NOTICE} className={({ isActive }) => (isActive ? "cur" : "")}>공지사항관리</NavLink></li>*/}
|
||||
{/* <li><NavLink to={URL.ADMIN_GALLERY} className={({ isActive }) => (isActive ? "cur" : "")}>사이트갤러리관리</NavLink></li>*/}
|
||||
{/* <li><NavLink to={URL.ADMIN_MANAGER} className={({ isActive }) => (isActive ? "cur" : "")}>사이트관리자 암호변경</NavLink></li>*!/*/}
|
||||
{/* </ul>*/}
|
||||
{/* </Accordion.Body>*/}
|
||||
{/*</Accordion.Item>*/}
|
||||
<Accordion.Item eventKey={"0"}>
|
||||
<Accordion.Header>환경설정</Accordion.Header>
|
||||
<Accordion.Body>
|
||||
<ul className="menu4">
|
||||
<li><NavLink to={URL.ADMIN_BASE_CODE} className={({ isActive }) => (isActive ? "cur" : "")}>기본코드 관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN_STANDARD_CODE} className={({ isActive }) => (isActive ? "cur" : "")}>건설기준코드 관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN_COMMITTEE_CODE} className={({ isActive }) => (isActive ? "cur" : "")}>위원회코드 관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN_MENU} className={({ isActive }) => (isActive ? "cur" : "")}>메뉴 관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN_MENU_AUTH} className={({ isActive }) => (isActive ? "cur" : "")}>메뉴권한 관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN_ABOUT_SITE} className={({ isActive }) => (isActive ? "cur" : "")}>관련사이트 관리</NavLink></li>
|
||||
</ul>
|
||||
</Accordion.Body>
|
||||
</Accordion.Item>
|
||||
|
||||
<Accordion.Item eventKey={"1"}>
|
||||
<Accordion.Header>사용자 관리</Accordion.Header>
|
||||
<Accordion.Body>
|
||||
<ul className="menu4">
|
||||
<li><NavLink to={URL.ADMIN__USERS__LIST} className={({ isActive }) => (isActive ? "cur" : "")}>사용자 목록</NavLink></li>
|
||||
</ul>
|
||||
</Accordion.Body>
|
||||
</Accordion.Item>
|
||||
|
||||
<Accordion.Item eventKey={"2"}>
|
||||
<Accordion.Header>게시판현황</Accordion.Header>
|
||||
<Accordion.Body>
|
||||
<ul className="menu4">
|
||||
<li><NavLink to={URL.ADMIN__BOARDS__LIST} className={({ isActive }) => (isActive ? "cur" : "")}>게시판 관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN__BOARDS__POSTS} className={({ isActive }) => (isActive ? "cur" : "")}>게시물 관리</NavLink></li>
|
||||
{/*<li><NavLink to={URL.ADMIN__BOARDS__KEYWORDS} className={({ isActive }) => (isActive ? "cur" : "")}>키워드 관리</NavLink></li>*/}
|
||||
</ul>
|
||||
</Accordion.Body>
|
||||
</Accordion.Item>
|
||||
|
||||
<Accordion.Item eventKey={"3"}>
|
||||
<Accordion.Header>건설기준관리</Accordion.Header>
|
||||
<Accordion.Body>
|
||||
<ul className="menu4">
|
||||
{/*<li><NavLink to={URL.ADMIN__STANDARDS__REFERENCE_CODES} className={({ isActive }) => (isActive ? "cur" : "")}>참조코드 관리</NavLink></li>*/}
|
||||
<li><NavLink to={URL.ADMIN__STANDARDS__API_KYES} className={({ isActive }) => (isActive ? "cur" : "")}>API KEY 관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN__STANDARDS__SIMILARITY_CHECK} className={({ isActive }) => (isActive ? "cur" : "")}>유사성 검사</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN__STANDARDS__INFO_DISCLOSURE} className={({ isActive }) => (isActive ? "cur" : "")}>건설기준 내용 관리</NavLink></li>
|
||||
</ul>
|
||||
</Accordion.Body>
|
||||
</Accordion.Item>
|
||||
|
||||
<Accordion.Item eventKey={"4"}>
|
||||
<Accordion.Header>컨텐츠관리</Accordion.Header>
|
||||
<Accordion.Body>
|
||||
<ul className="menu4">
|
||||
<li><NavLink to={URL.ADMIN__CONTENTS__SURVEY} className={({ isActive }) => (isActive ? "cur" : "")}>설문 관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN__CONTENTS__POP_UP} className={({ isActive }) => (isActive ? "cur" : "")}>팝업 관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN__CONTENTS__STANDARDS_RESEARCH} className={({ isActive }) => (isActive ? "cur" : "")}>건설기준연구 관리</NavLink></li>
|
||||
{/*<li><NavLink to={URL.ADMIN__CONTENTS__TEXT_MESSAGES} className={({ isActive }) => (isActive ? "cur" : "")}>문자 발송</NavLink></li>*/}
|
||||
</ul>
|
||||
</Accordion.Body>
|
||||
</Accordion.Item>
|
||||
|
||||
<Accordion.Item eventKey={"5"}>
|
||||
<Accordion.Header>위원회관리</Accordion.Header>
|
||||
<Accordion.Body>
|
||||
<ul className="menu4">
|
||||
<li><NavLink to={URL.ADMIN__COMMITTEE__PROGRESS_STATUS} className={({ isActive }) => (isActive ? "cur" : "")}>진행현황 관리</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN__COMMITTEE__SCHEDULES} className={({ isActive }) => (isActive ? "cur" : "")}>위원회 일정 관리</NavLink></li>
|
||||
</ul>
|
||||
</Accordion.Body>
|
||||
</Accordion.Item>
|
||||
|
||||
<Accordion.Item eventKey={"6"}>
|
||||
<Accordion.Header>로그현황</Accordion.Header>
|
||||
<Accordion.Body>
|
||||
<ul className="menu4">
|
||||
<li><NavLink to={URL.ADMIN__LOGS__MENU_ACCESS_INFO} className={({ isActive }) => (isActive ? "cur" : "")}>메뉴별 접속 현황</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN__LOGS__USER_CONNECTIONS} className={({ isActive }) => (isActive ? "cur" : "")}>사용자 접속 현황</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN__LOGS__PRIVACY_LOGS} className={({ isActive }) => (isActive ? "cur" : "")}>개인정보 로그 현황</NavLink></li>
|
||||
<li><NavLink to={URL.ADMIN__LOGS__FILE_DOWNLOAD_STATUS} className={({ isActive }) => (isActive ? "cur" : "")}>파일 다운 현황</NavLink></li>
|
||||
</ul>
|
||||
</Accordion.Body>
|
||||
</Accordion.Item>
|
||||
{accordion}
|
||||
{/*{menuList.map((group, i) => {
|
||||
return (
|
||||
<Accordion.Item eventKey={i}>
|
||||
<Accordion.Header>{group.menuTitle}</Accordion.Header>
|
||||
<Accordion.Body>
|
||||
<ul className="menu4">
|
||||
{group.childList.map((menu) => {
|
||||
return (
|
||||
<li><NavLink to={menu.menuUrl} className={({ isActive }) => (isActive ? "cur" : "")}>{menu.menuTitle}</NavLink></li>
|
||||
)
|
||||
})}
|
||||
</ul>
|
||||
</Accordion.Body>
|
||||
</Accordion.Item>
|
||||
)
|
||||
})}*/}
|
||||
</Accordion>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -39,7 +39,10 @@ function MenuAuthMgt(props) {
|
|||
if(checked) {
|
||||
item.menuAuth += ","+role.itemCd
|
||||
}else{
|
||||
item.menuAuth = item.menuAuth.replace(","+role.itemCd, '');
|
||||
item.menuAuth = item.menuAuth.replace(role.itemCd, '');
|
||||
if(item.menuAuth.startsWith(",")) {
|
||||
item.menuAuth.replace(",", "")
|
||||
}
|
||||
}
|
||||
}}
|
||||
defaultChecked={item.menuAuth.includes(role.itemCd)}/>
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import org.springframework.format.annotation.DateTimeFormat;
|
|||
import javax.persistence.*;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
|
|
@ -53,9 +54,18 @@ public class TcMenu {
|
|||
@Column(name = "use_yn")
|
||||
private String useYn;
|
||||
|
||||
@Transient
|
||||
private String groupTitle;
|
||||
|
||||
@Transient
|
||||
private String menuTypeValue;
|
||||
|
||||
@Transient
|
||||
private String menuAuth;
|
||||
|
||||
@Transient
|
||||
private List<String> roleList;
|
||||
|
||||
@Transient
|
||||
private List<TcMenu> childList;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,4 +11,6 @@ public interface TcMenuMapper {
|
|||
List<TcMenu> selectMenuList();
|
||||
|
||||
List<TcMenu> selectMenuAuthList();
|
||||
|
||||
List<TcMenu> selectMenuListToRole(TcMenu params);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -162,6 +162,14 @@ public class AdminConfigService extends EgovAbstractServiceImpl {
|
|||
return menuMapper.selectMenuAuthList();
|
||||
}
|
||||
|
||||
|
||||
public List<TcMenu> selectMenuListToRole(String menuTypeCd, List<String> roleList){
|
||||
TcMenu params = new TcMenu();
|
||||
params.setMenuTypeCd(menuTypeCd);
|
||||
params.setRoleList(roleList);
|
||||
return menuMapper.selectMenuListToRole(params);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void editMenuAuth(TcMenu menu) {
|
||||
String[] roleAry = menu.getMenuAuth().split(",");
|
||||
|
|
|
|||
|
|
@ -0,0 +1,59 @@
|
|||
package com.dbnt.kcscbackend.admin.leftNav;
|
||||
|
||||
|
||||
import com.dbnt.kcscbackend.admin.config.entity.TcMenu;
|
||||
import com.dbnt.kcscbackend.admin.config.service.AdminConfigService;
|
||||
import com.dbnt.kcscbackend.auth.entity.LoginVO;
|
||||
import com.dbnt.kcscbackend.config.common.ResultVO;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||
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.bind.annotation.RestController;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RequestMapping("/leftNav")
|
||||
@Tag(name="LeftNavController", description = "leftNav 컨트롤러")
|
||||
public class LeftNavController {
|
||||
|
||||
private final AdminConfigService adminConfigService;
|
||||
|
||||
@RequestMapping(method = RequestMethod.GET, value = "/menu")
|
||||
public ResultVO getMenu(
|
||||
@AuthenticationPrincipal LoginVO user,
|
||||
@RequestParam(value="menuType", required = true) String menuTypeCd
|
||||
){
|
||||
ResultVO resultVO = new ResultVO();
|
||||
List<TcMenu> menuList = adminConfigService.selectMenuListToRole(menuTypeCd, Arrays.asList(user.getUserRole().split(",")));
|
||||
Map<String, String> groupMap = new LinkedHashMap<>();
|
||||
for(TcMenu menu: menuList){
|
||||
groupMap.put(menu.getMenuGroup(), menu.getGroupTitle());
|
||||
}
|
||||
List<TcMenu> groupList = new ArrayList<>();
|
||||
for(Map.Entry<String, String> group: groupMap.entrySet()){
|
||||
TcMenu temp = new TcMenu();
|
||||
temp.setMenuId(group.getKey());
|
||||
temp.setMenuTitle(group.getValue());
|
||||
groupList.add(temp);
|
||||
}
|
||||
for(TcMenu group: groupList){
|
||||
for(TcMenu menu: menuList){
|
||||
if(group.getMenuId().equals(menu.getMenuGroup())){
|
||||
if(group.getChildList()==null){
|
||||
group.setChildList(new ArrayList<>());
|
||||
}
|
||||
group.getChildList().add(menu);
|
||||
}
|
||||
}
|
||||
}
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
resultMap.put("menuList", groupList);
|
||||
resultVO.setResult(resultMap);
|
||||
return resultVO;
|
||||
}
|
||||
}
|
||||
|
|
@ -61,6 +61,9 @@ public class LoginVO implements Serializable{
|
|||
@Schema(description = "사용자 구분", allowableValues = {"ACC_TP01", "ACC_TP02"}, defaultValue = "ACC_TP02")
|
||||
private String userSe;
|
||||
|
||||
@Schema(description = "사용자 ROLE")
|
||||
private String userRole;
|
||||
|
||||
@Schema(description = "이름")
|
||||
@NotBlank(message = "이름을 입력해주세요.")
|
||||
private String userNm;
|
||||
|
|
|
|||
|
|
@ -70,6 +70,10 @@ public class EgovJwtTokenUtil implements Serializable{
|
|||
Claims claims = getClaimFromToken(token);
|
||||
return claims.get("userSe").toString();
|
||||
}
|
||||
public String getUserRoleFromToken(String token) {
|
||||
Claims claims = getClaimFromToken(token);
|
||||
return claims.get("userRole").toString();
|
||||
}
|
||||
public String getInfoFromToken(String type, String token) {
|
||||
Claims claims = getClaimFromToken(token);
|
||||
return claims.get(type).toString();
|
||||
|
|
@ -96,7 +100,8 @@ public class EgovJwtTokenUtil implements Serializable{
|
|||
claims.put("userSeq", loginVO.getUserSeq());
|
||||
claims.put("id", loginVO.getUserId());
|
||||
claims.put("remoteAddr", remoteAddr);
|
||||
claims.put("userSe", loginVO.getUserSe() );
|
||||
claims.put("userSe", loginVO.getUserSe());
|
||||
claims.put("userRole", loginVO.getUserRole());
|
||||
claims.put("type", "Authorization");
|
||||
|
||||
log.debug("===>>> secret = "+SECRET_KEY);
|
||||
|
|
|
|||
|
|
@ -69,7 +69,8 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
|
|||
logger.debug("jwtToken validated");
|
||||
loginVO.setUserSeq(Integer.parseInt(jwtTokenUtil.getUserSeqFromToken(jwtToken)));
|
||||
loginVO.setId(id);
|
||||
loginVO.setUserSe( jwtTokenUtil.getUserSeFromToken(jwtToken) );
|
||||
loginVO.setUserSe(jwtTokenUtil.getUserSeFromToken(jwtToken));
|
||||
loginVO.setUserRole(jwtTokenUtil.getUserRoleFromToken(jwtToken));
|
||||
// loginVO.setUniqId( jwtTokenUtil.getInfoFromToken("uniqId",jwtToken) );
|
||||
// loginVO.setOrgnztId( jwtTokenUtil.getInfoFromToken("orgnztId",jwtToken) );
|
||||
// loginVO.setName( jwtTokenUtil.getInfoFromToken("name",jwtToken) );
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
select a.menu_id ,
|
||||
a.menu_title ,
|
||||
a.menu_group ,
|
||||
a.menu_url,
|
||||
coalesce(b.role_cd, '') as menu_auth
|
||||
from tc_menu a
|
||||
left outer join (
|
||||
|
|
@ -38,4 +39,27 @@
|
|||
where a.use_yn = 'Y'
|
||||
order by a.menu_id asc
|
||||
</select>
|
||||
|
||||
<select id="selectMenuListToRole" resultType="TcMenu" parameterType="TcMenu">
|
||||
select a.menu_id ,
|
||||
a.menu_title ,
|
||||
a.menu_group ,
|
||||
a.menu_url,
|
||||
c.menu_title as group_title,
|
||||
coalesce(b.role_cd, '') as menu_auth
|
||||
from tc_menu a
|
||||
inner join (
|
||||
select menu_id , string_agg(role_id, ',') as role_cd
|
||||
from tb_menu_role
|
||||
where role_id in
|
||||
<foreach collection="roleList" item="role" separator="," open="(" close=")">
|
||||
#{role}
|
||||
</foreach>
|
||||
group by menu_id
|
||||
) b on a.menu_id = b.menu_id
|
||||
inner join tc_menu c on a.menu_group = c.menu_id
|
||||
where a.use_yn = 'Y'
|
||||
and a.menu_type_cd = #{menuTypeCd}
|
||||
order by a.menu_id asc
|
||||
</select>
|
||||
</mapper>
|
||||
Loading…
Reference in New Issue