안녕하세요. 클스 입니다.
typescript 가 이젠 많이 중요해 졌습니다. vuejs, react 등에서 빠질 수 가 없네요~
개요
- DB의 메뉴 테이블에서 데이터를 가져와서 웹에 tree 구조로 출력해보려고 하니 웹을 올리고 소스 수정하면 빌드하고 확인하는 시간들이 많이 들어요~
- 그래서 typescript만 개발하면 좋을 듯하여 셋팅 해봤습니다.
메뉴 테이블 쿼리
tree_view 조회 결과
menu_id | menu_nm | up_menu_id | depth | path | parent_child_tree |
M00192 | 메뉴/권한 관리 | M00001 | 3 | ROOT_M00001_M00192 | ---------메뉴/권한 관리 |
M00190 | 권한 관리 | M00192 | 4 | ROOT_M00001_M00192_M00190 | ----------권한 관리 |
M00191 | 메뉴 관리 | M00192 | 4 | ROOT_M00001_M00192_M00191 | ----------메뉴 관리 |
M00193 | 회사/조직 관리 | M00001 | 3 | ROOT_M00001_M00193 | ---------회사/조직 관리 |
M00187 | 회사 관리 | M00193 | 4 | ROOT_M00001_M00193_M00187 | ----------회사 관리 |
M00188 | 조직 관리 | M00193 | 4 | ROOT_M00001_M00193_M00188 | ----------조직 관리 |
M00189 | 사용자 관리 | M00193 | 4 | ROOT_M00001_M00193_M00189 | ----------사용자 관리 |
M00194 | 시스템관리 | M00001 | 3 | ROOT_M00001_M00194 | ---------시스템관리 |
데이터를 tree 형태로 만드는 tree_test.ts
- 조금 범용적으로 만들기 위해 menu_id -> id로 menu_nm -> name으로 , up_menu_id -> up_id 로 설계 했습니다.
필수 패키지 설치 및 vscode extension 설치
해당 디렉토리에 package.json 이 생긴다. $ npm install 을하면 package.json에 정의된 모듈들이 설치됩니다. 지금은 아무것도 없어서 package-lock.json 만 생기네요~
* Code Runner 확장 프그램 설치
vscode에서 tree_test.ts 파일을 만든다
소스에는 원본 데이터 -> Tree 자료 구조 -> 출력 하는 함수가 포함되어 있습니다.
실행하기
마우스 우 클릭을 하면 Run Code 가 나온다. 핫키는 Ctrol+Option +N 입니다.
실행 결과
Done] exited with code=127 in 0.01 seconds
[Running] ts-node "/Users/keunsookim/quasar/typescript/tree_test.ts"
{ id: 'M1', up_id: 'ROOT', label: '메뉴 1' }
{ id: 'M2', up_id: 'M1', label: '서브메뉴 1-1' }
{ id: 'M3', up_id: 'M1', label: '서브메뉴 1-2' }
{ id: 'M4', up_id: 'ROOT', label: '메뉴 2' }
{ id: 'M5', up_id: 'M4', label: '서브메뉴 2-1' }
{ id: 'M6', up_id: 'M5', label: '서브메뉴 2-1-1' }
{ id: 'M7', up_id: 'M5', label: '서브메뉴 2-1-2' }
{ id: 'M8', up_id: 'M4', label: '서브메뉴 2-2' }
{
id: 'ROOT',
up_id: null,
label: 'ROOT',
children: [
{ id: 'M1', up_id: 'ROOT', label: '메뉴 1', children: [Array] },
{ id: 'M4', up_id: 'ROOT', label: '메뉴 2', children: [Array] }
]
}
[
{
id: 'ROOT',
up_id: null,
label: 'ROOT',
children: [ [Object], [Object] ]
}
]
---BEGIN----------------------------------------------
ROOT (ROOT)
메뉴 1 (M1)
서브메뉴 1-1 (M2)
서브메뉴 1-2 (M3)
메뉴 2 (M4)
서브메뉴 2-1 (M5)
서브메뉴 2-1-1 (M6)
서브메뉴 2-1-2 (M7)
서브메뉴 2-2 (M8)
----END---------------------------------------------
{ id: 'M00001', up_id: 'ROOT', label: '관리자' }
{ id: 'M00192', up_id: 'M00001', label: '메뉴/권한 관리' }
{ id: 'M00190', up_id: 'M00192', label: '권한 관리' }
{ id: 'M00191', up_id: 'M00192', label: '메뉴 관리' }
{ id: 'M00193', up_id: 'M00001', label: '회사/조직 관리' }
{ id: 'M00187', up_id: 'M00193', label: '회사 관리' }
{ id: 'M00188', up_id: 'M00193', label: '조직 관리' }
{ id: 'M00189', up_id: 'M00193', label: '사용자 관리' }
{ id: 'M00194', up_id: 'M00001', label: '시스템관리' }
{ id: 'M00182', up_id: 'M00194', label: '공통코드 관리' }
{ id: 'M00183', up_id: 'M00194', label: '용어사전 관리' }
{ id: 'M00184', up_id: 'M00194', label: '로그 이력' }
{ id: 'M00235', up_id: 'M00194', label: '휴일 관리' }
{ id: 'M00236', up_id: 'M00194', label: '게시판 관리' }
{ id: 'M00237', up_id: 'M00194', label: '알림 관리' }
{ id: 'M00243', up_id: 'M00194', label: '사용자별 사용 현황' }
{ id: 'M00195', up_id: 'M00001', label: '화면 마법사' }
{ id: 'M00178', up_id: 'M00195', label: '조회 조건 관리' }
{ id: 'M00179', up_id: 'M00195', label: '메타정보 정의' }
{ id: 'M00180', up_id: 'M00195', label: '포틀릿 관리' }
{ id: 'M00181', up_id: 'M00195', label: '화면 마법사' }
{
id: 'ROOT',
up_id: null,
label: 'ROOT',
children: [ { id: 'M00001', up_id: 'ROOT', label: '관리자', children: [Array] } ]
}
---BEGIN----------------------------------------------
ROOT (ROOT)
관리자 (M00001)
메뉴/권한 관리 (M00192)
권한 관리 (M00190)
메뉴 관리 (M00191)
회사/조직 관리 (M00193)
회사 관리 (M00187)
조직 관리 (M00188)
사용자 관리 (M00189)
시스템관리 (M00194)
공통코드 관리 (M00182)
용어사전 관리 (M00183)
로그 이력 (M00184)
휴일 관리 (M00235)
게시판 관리 (M00236)
알림 관리 (M00237)
사용자별 사용 현황 (M00243)
화면 마법사 (M00195)
조회 조건 관리 (M00178)
메타정보 정의 (M00179)
포틀릿 관리 (M00180)
화면 마법사 (M00181)
----END---------------------------------------------
[Done] exited with code=0 in 0.932 seconds
마무리
이 ts 소스를 vuejs 에 넣어서 웹에 tree 형태로 출력하시면 됩니다.
typescript는 처음이라 함수를 재귀호출로 못만들었습니다. 람다등 좀더 공부를 많이해서
해봐야 겠습니다.
이만 클스 였습니다.
추가로 하는김에 vue에 붙혀서 웹으로 표시 해봤습니다. 추가적으로 클릭시 이벤트 받기, 아이콘 출력하기 tree customize 하기, drag & drop 하기...
댓글
댓글 쓰기