11 KiB
11 KiB
메뉴 추가·수정 개발 계획
1. 목적 및 범위
- 목적
- 관리자 화면과 일반 사이트 화면의 상단 메뉴를 지자체별·역할별로 DB에서 동적으로 관리할 수 있도록 확장한다.
- 1차 메뉴뿐 아니라 2차/3차 하위 메뉴까지 등록·수정·삭제·순서 변경 가능하게 하고, 상단
<nav>에 드롭다운 구조로 반영한다.
- 범위
- 테이블:
menu_type,menu - 모델:
MenuModel,MenuTypeModel - 컨트롤러:
App\Controllers\Admin\Menu - 뷰:
app/Views/admin/layout.php,app/Views/admin/menu/index.php - 헬퍼:
app/Helpers/admin_helper.php
- 테이블:
2. 데이터 구조 및 기본 정책
2.1 메뉴 종류 (menu_type)
- 컬럼
mt_idx: PKmt_code: 코드 (admin,site등)mt_name: 표시명mt_sort: 정렬 우선순위
- 기본 데이터
admin: 관리자 상단 메뉴site: 일반 사이트 상단 메뉴
2.2 메뉴 항목 (menu)
- 컬럼
mm_idx: PKmt_idx: 메뉴 종류 FK (menu_type.mt_idx)lg_idx: 지자체 FK (지자체별 메뉴 분리)mm_name: 메뉴명 (1차/2차/3차 공통)mm_link: 링크 경로 (예:admin,admin/users,site/inventory/list)mm_pidx: 부모 메뉴 PK (0= 최상위 1차 메뉴)mm_dep: 깊이 (0=1차,1=2차,2=3차 …)mm_num: 형제 내 정렬 순서mm_cnode: 자식 개수mm_level: 노출 허용mb_level쉼표 구분 (빈값=전체, super admin은 무시하고 항상 전체)mm_is_view:Y=노출,N=숨김
- 인덱스
idx_mt_lg (mt_idx, lg_idx): 메뉴 종류·지자체별 조회용idx_mm_pidx (mm_pidx): 하위 메뉴 존재 여부 확인용idx_mm_dep_num (mm_dep, mm_num): 트리 정렬용
2.3 기본 메뉴 정책
-
관리자 상단 메뉴 (
mt_code='admin')- 각 지자체별로 다음과 같은 1차 메뉴가 기본 등록되어야 한다.
- 대시보드 (
admin) - 회원 관리 (
admin/users) - 로그인 이력 (
admin/access/login-history) - 승인 대기 (
admin/access/approvals) - 역할 (
admin/roles) - 메뉴 (
admin/menus) - 지자체 전환 (
admin/select-local-government, super admin 전용) - 지자체 (
admin/local-governments, super admin 전용) - 지정판매소 (
admin/designated-shops)
- 대시보드 (
- 각 1차 메뉴 아래에 2차/3차 하위 메뉴를 둘 수 있으며, 상단
<nav>에서 드롭다운으로 노출한다.
- 각 지자체별로 다음과 같은 1차 메뉴가 기본 등록되어야 한다.
-
일반 사이트 상단 메뉴 (
mt_code='site')- 각 지자체별로 다음과 같은 1차 메뉴 세트를 기본 등록한다.
- 기본정보관리
- 발주 입고 관리
- 불출 관리
- 재고 관리
- 판매 관리
- 판매 현황
- 봉투 수불 관리
- 통계 분석 관리
- 창
- 도움말
- 각 1차 메뉴 아래의 2차/3차 메뉴 구성은 CSV의 “1차 메뉴정리” 파일을 기준으로 초기 등록한다.
- 각 지자체별로 다음과 같은 1차 메뉴 세트를 기본 등록한다.
-
역할·권한 정책
mm_level빈값: 모든 역할 노출 (일반 사용자, 지정판매소, 지자체관리자, super admin).mm_level에 숫자(1,2,3) 지정: 해당mb_level사용자에게만 노출.- super admin(4): DB
mm_level값과 관계없이 해당 지자체의 모든 메뉴를 볼 수 있도록 모델에서 처리.
3. 기능 요구사항 (관리자 메뉴 관리)
3.1 공통 동작
-
지자체 선택 필수
admin_effective_lg_idx()를 사용해 현재 작업 지자체를 결정한다.- 값이
null이면 지자체 선택 화면(/admin/select-local-government)으로 리다이렉트하고,
“메뉴를 관리하려면 먼저 지자체를 선택하세요.” 메시지를 표출한다.
-
메뉴 종류 선택
menu_type목록에서mt_code(admin/site 등)를 선택하여 관리 대상 메뉴 종류를 바꾼다.- 선택된
mt_idx+ 현재lg_idx기준으로 메뉴 목록과 등록/수정 폼을 동작시킨다.
3.2 목록 영역 (트리 + 들여쓰기)
-
선택한
mt_idx, 현재lg_idx기준으로 트리 구조를 평면 리스트로 렌더링한다.mm_dep값에 따라 좌측 padding을 주어 1차/2차/3차 메뉴를 시각적으로 구분한다.- 각 행에 다음 정보를 표시한다.
- 메뉴명 (
mm_name) - 링크 (
mm_link) - 노출 대상 (
mm_level→ 역할 이름으로 변환, 빈값이면 “전체”) - 노출 여부 (
mm_is_viewY/N)
- 메뉴명 (
- 삭제 버튼
- 현재 지자체(
lg_idx) 소속인지 검증 후 삭제 허용. - 하위 메뉴가 있으면 삭제 불가.
- 현재 지자체(
-
하위 메뉴 등록 버튼
- 각 행 우측에 “하위 메뉴 추가” 버튼을 배치한다.
- 클릭 시:
- 우측 폼의 hidden 값에
mm_pidx=해당 행 mm_idx,mm_dep=해당 행 mm_dep+1을 세팅한다. - 폼 타이틀을 “하위 메뉴 등록”으로 변경(표시용).
- 우측 폼의 hidden 값에
- 이렇게 등록된 메뉴는 동일한 컨트롤러(
/admin/menus/store)를 통해 2차/3차 메뉴로 저장된다.
-
순서 변경
- 현재 구현과 동일하게 리스트 순서를 조정한 뒤, “순서 적용” 버튼으로
mm_idx[]순서를 서버로 보낸다. - 서버에서는 현재 지자체(
lg_idx) 기준으로만mm_num을 재부여하여 순서를 저장한다.
- 현재 구현과 동일하게 리스트 순서를 조정한 뒤, “순서 적용” 버튼으로
3.3 등록/수정 폼
-
hidden 필드
mt_idx: 현재 선택된 메뉴 종류mm_pidx: 부모 메뉴 PK (기본값0, “하위 메뉴 추가” 시 부모 ID로 변경)mm_dep: 깊이 (기본값0, “하위 메뉴 추가” 시부모+1)mm_idx_edit: 수정 대상 PK (수정 모드일 때만 값 설정)
-
입력 필드
mm_name: 필수, 메뉴명mm_link: 링크 경로 (1차/하위 메뉴 모두 동일 규칙)mm_level: 체크박스(전체 + 각 역할), super admin은 별도로 저장하지 않는다.mm_is_view: 체크박스, 기본값Y(노출)
-
동작 모드
- 등록 모드
mm_idx_edit비어 있음.mm_pidx=0,mm_dep=0이면 1차 메뉴 등록.하위 메뉴 추가로 진입한 경우,mm_pidx/mm_dep에 부모 정보가 채워진 상태로 등록.
- 수정 모드
- “수정” 버튼 클릭 시 해당 행의 정보를 폼에 로딩한다.
mm_pidx,mm_dep는 변경하지 않고,mm_name/mm_link/mm_level/mm_is_view만 수정.
- 등록 모드
4. 네비게이션 드롭다운 설계
4.1 공통 트리 헬퍼/서비스
- 함수 예시:
get_menu_tree(string $typeCode, int $lgIdx, int $mbLevel): arraymenu_type.mt_code로mt_idx조회.MenuModel::getVisibleByLevel(mt_idx, mbLevel, lgIdx)로 현재 지자체/역할 기준 메뉴 목록 조회.- 조회 결과(평면 배열)를
mm_idx/mm_pidx기준으로 트리 구조로 변환:- 1차 메뉴:
mm_pidx=0 - children:
mm_pidx=부모 mm_idx - 각 노드에
children배열을 추가.
- 1차 메뉴:
4.2 관리자 레이아웃(nav)
- 파일:
app/Views/admin/layout.php - 변경 내용
- 기존
get_admin_nav_items()는 1차 메뉴 리스트만 반환하는 형태에서,
트리 형태를 반환하는 헬퍼를 사용하도록 변경한다. - 상단
<nav>에서:- 1차 메뉴(트리 루트)를 루프 돌며
<a>를 렌더링. - 자식 메뉴가 있는 경우:
- 1차 메뉴를
<div class="relative group">로 감싼 후, group-hover:block형태의<div>안에 children 메뉴들을<a>리스트로 렌더링.
- 1차 메뉴를
- 1차 메뉴(트리 루트)를 루프 돌며
- 각
<a>의href는base_url(mm_link)로 풀 페이지 전환을 사용한다.
- 기존
4.3 일반 사이트 레이아웃(nav)
- (향후) 사이트용 레이아웃 파일에서:
get_menu_tree('site', 현재 lg_idx, 현재 사용자 레벨)을 호출.- 관리자와 동일한 드롭다운 패턴으로 1차/하위 메뉴를 렌더링.
- 링크 클릭 시 역시 풀 페이지 전환을 사용한다.
5. 지자체·권한 정책 정리
-
지자체별 메뉴 분리
- 모든 메뉴 조회·등록·수정·삭제·순서 변경은
mt_idx + lg_idx를 조건으로 수행한다. - 북구청에서 만든 메뉴(
lg_idx=북구청)는 다른 구청(lg_idx가 다른 값)에서는 보이지 않고, 관리도 불가하다.
- 모든 메뉴 조회·등록·수정·삭제·순서 변경은
-
역할별 노출
mm_level이 빈값인 메뉴는 모든 역할에 노출된다.mm_level에 1,2,3이 포함된 경우, 해당mb_level만 노출한다.- super admin(4)은
mm_level과 관계없이, 현재 지자체의 모든mm_is_view='Y'메뉴를 노출한다.
6. CSV 기반 초기 데이터 등록 계획
- CSV 구조 확인
- “1차 메뉴정리” 파일의 컬럼 구조를 확정한다.
- 최소 필요 컬럼 예시:
- 메뉴 종류(admin/site)
- 1차 메뉴명 / 1차 메뉴 링크
- 2차 메뉴명 / 2차 메뉴 링크 (선택)
- 3차 메뉴명 / 3차 메뉴 링크 (선택)
- 노출 대상 역할, 사용 여부 등
- 초기 시드/Import 스크립트 작성
- CSV 한 행당
menu테이블 1개 또는 다수 행으로 변환. - 1차 메뉴는
mm_pidx=0, mm_dep=0으로 insert. - 2차/3차 메뉴는 상위 메뉴의
mm_idx를mm_pidx로 참조하여 insert. - 초기에는 특정 지자체(예: 대구 전체 or 테스트용 하나의 지자체) 기준으로만 시드하고,
필요 시 “메뉴 복사” 기능으로 다른 지자체로 복제하는 방식을 고려.
- CSV 한 행당
- 개발/테스트 DB에 적용 및 검증
- 관리자
/admin/menus에서 트리 구조와 드롭다운 노출 상태를 확인한다. - 역할별 노출, 지자체별 분리가 기대대로 동작하는지 검증한다.
- 관리자
- 운영 반영 절차 문서화
- 운영 DB 초기 세팅 시, CSV → SQL/스크립트 실행 순서를 별도 문서에 정리한다.
7. 구현 순서 제안
menu테이블에lg_idx컬럼 및 인덱스 추가, 시드 SQL 정리 (완료 기준 재확인).MenuModel에lg_idx를 반영한 조회/정렬 메서드 정리 (getAllByType,getVisibleByLevel,getNextNum,setOrder등).Admin\Menu컨트롤러에서 지자체 필수 체크 및 지자체 소속 검증 로직 보완.admin/menu/index뷰에서:- 하위 메뉴 등록 버튼 추가
mm_pidx/mm_dep값을 활용한 2차/3차 메뉴 등록/표시 기능 구현.
- 트리 헬퍼(
get_menu_tree류) 구현 및admin_helper에 연동. admin/layout상단 네비게이션을 DB 트리 기반 드롭다운으로 교체.- CSV 기반 초기 데이터 스크립트 작성 및 개발 환경에서 시범 적용.
- 통합 테스트 후 운영 반영 계획 수립.