관리자 콘솔

원본 admin/ 을 wvctesol-admin(:3896)으로 옮기는 중입니다. API 서버는 사용자 앱과 공유합니다.

메뉴
13
원본 left_menu.php 기준
옮긴 화면
13 / 13
관리자 API
21
가드레일
31
critical 9

이관 진행도

100%

원본 admin/ 아래 PHP 는 143개지만, 좌측 메뉴가 가리키는 실제 화면은 13개입니다. 나머지는 백업과 폐기된 것입니다.

개발 스펙 (8)

메뉴 13개를 성격이 같은 것끼리 묶어 8개로 적었습니다. 요건 · 규칙 · API · 가드레일 · 구현 계획 · 자바 설계 · 테스트 방법이 들어 있습니다.

회원 관리

ADMIN-MEMBERSwvctesol-admin/members완료

이 화면에서 할 수 있어야 하는 것 (4)

  • 아이디 · 이름 · 연락처 · 이메일로 회원을 찾는다.
  • 수강권을 직접 켜고 끈다 — 원본에서 운영자가 가장 많이 쓰던 기능이다.
  • 합격 여부 · 자격증 발급 · 수강기간을 고친다.
  • 목록에서는 결제된 과정만 배지로 모아 보여 준다. 33개를 다 펼치면 읽을 수 없다.

비즈니스 규칙 (5)

  • 결제가 회원 플래그를 건드리지 않아 모든 활성화가 여기서 일어났다.
    근거: admin/member/mb_proc.php
  • 고칠 수 있는 항목은 열거형(MemberField)이 정한다. 화면이 보낸 문자열이 컬럼이 되지 않는다.
  • 비밀번호와 아이디는 고칠 수 없다 — 관리자가 남의 계정으로 로그인할 수 있게 된다.
  • 플래그는 Y/N, 날짜는 YYYY-MM-DD 만 받는다.
  • 결제·사이버·준비 필터는 TESOL·TEC·파닉스 중 하나라도 맞으면 잡는다.
    근거: mb_list.php:25~31

API (4)

메서드경로권한모듈 · 설명
GET/api/identity/admin/members관리자
회원 검색. keyword · approval · payYn · cyberYn · prepareYn.
domains:identity:identity-web
GET/api/identity/admin/members/fields관리자
고칠 수 있는 항목 33개. 화면이 목록을 하드코딩하지 않게 한다.
domains:identity:identity-web
GET/api/identity/admin/members/{id}관리자
회원 상세. 플래그 전체를 Map 으로 준다.
domains:identity:identity-web
404 MEMBER_NOT_FOUND
POST/api/identity/admin/members/{id}관리자
항목 수정. 열거형에 없는 키는 거부된다.
domains:identity:identity-web
400 INVALID_FIELD
400 INVALID_VALUE
403 FORBIDDEN

가드레일 (6) — id 가 곧 테스트 이름이다

id반드시 만족해야 하는 것등급
member-progress-shown
회원 상세에서 그 학생의 시청 기록과 학습일을 볼 수 있어야 한다.
원본 admin/member/timeline_detail*.php 가 유닛 × 레슨 격자로 보여 주던 것이다.
normal
member-progress-empty
기록이 없으면 빈칸이 아니라 없다고 말해야 한다.
없는 레슨을 빈칸으로 채우면 무엇을 봤는지 오히려 안 보인다.
normal
member-no-credential-fields
비밀번호와 아이디를 고치는 길이 없어야 한다.
있으면 관리자가 남의 계정으로 로그인할 수 있다.
critical
member-field-whitelist
열거형에 없는 컬럼은 수정 요청 자체가 거부돼야 한다.
화면이 보낸 문자열이 SQL 에 닿으면 어떤 컬럼이든 고칠 수 있다.
critical
member-value-format
플래그는 Y/N, 날짜는 YYYY-MM-DD 가 아니면 저장하지 않아야 한다.
high
member-change-logged
누가 무엇을 바꿨는지 로그와 modid · moddate 에 남아야 한다.
수강권은 돈과 직결된다.
high

구현 계획 (10/10)

  1. PlaySession · LessonPlayLog 값 객체learning-domain
  2. playLog · studyDays 포트learning-domain
  3. playdata 배열을 펼치는 어댑터 + 학습일 집계learning-infrastructure
  4. GET /learning/admin/members/{id}/progress (관리자 전용, ip 는 안 내보낸다)learning-web
  5. 회원 상세의 TESOL · TEC 시청 기록 카드wvctesol-admin
  6. MemberField 열거형 — 컬럼 이름을 여기서만 정한다identity-domain
  7. AdminMemberUseCase — 권한 확인 · 값 검증 · 변경 로그identity-app
  8. AdminMemberRepositoryAdapter — 33개 플래그를 Map 으로identity-infrastructure
  9. GET/POST /api/identity/admin/membersidentity-web
  10. 목록 · 상세 · 수정 폼wvctesol-admin

서버 사이드 구현 계획 — 자바 객체별 요구사항 (3/3)

객체모듈책임 · 지켜야 할 것
MemberField
enum
identity-domain
관리자가 고칠 수 있는 항목과 그 컬럼 이름.
  • 컬럼 이름을 여기서만 정한다. 바깥 문자열이 SQL 에 닿지 않는다.
  • 비밀번호·아이디는 목록에 없다 — 수정 대상이 아니다.
  • normalize() 가 종류별 형식을 강제한다(FLAG · DATE · TEXT).
MemberSummary
record
identity-domain
관리자가 보는 회원.
  • 플래그 33개를 필드로 나열하지 않고 Map 으로 담는다.
  • 하나 늘 때마다 생성자·어댑터·응답을 모두 고쳐야 하는 구조는 오래 못 간다.
AdminMemberUseCase
service
identity-app
회원 검색·수정.
  • 모든 진입점에서 RequireAdmin.check.
  • 화면이 보낸 키를 MemberField.from 으로 해석한다 — 없으면 거부.
  • 누가 무엇을 바꿨는지 로그로 남긴다.

테스트 방법 (6)

가드레일종류확인 방법
member-progress-showne2e실데이터 회원(1242)의 학습일 > 0, 레슨 기록 존재, 펼치면 재생 목록
member-progress-emptye2e기록 없는 과정은 "시청 기록이 없습니다"
member-no-credential-fieldse2e상세 화면에 password · login_id 입력칸이 0개
member-field-whitelistintegration{"password":"x"} 전송 → 400 INVALID_FIELD
member-value-formate2epass_date 에 "어제" 입력 → YYYY-MM-DD 오류 노출, 저장 안 됨
member-change-loggedintegration수정 후 modid 가 관리자 이름, moddate 가 갱신된다

정하지 못한 것 · 확인이 필요한 것

  • 시험 이력 조회(원본 mb_quiz.php)와 자료 업로드(entrance_upload.php)는 아직 없다.

운영

메뉴원본원본 줄수옮긴 파일상태
관리자 관리
/admins
admin/admin/ad_list.php443
  • src/app/(console)/admins/page.tsx
완료
회원 관리
/members
admin/member/mb_list.php529
  • src/app/(console)/members/[id]/page.tsx
  • src/app/(console)/members/page.tsx
완료
배너 관리
/banners
admin/banner/banner_list.php187
  • src/app/(console)/banners/page.tsx
완료

게시판

메뉴원본원본 줄수옮긴 파일상태
공지사항
/notices
admin/board/nt_list.php159
  • src/app/(console)/notices/[id]/page.tsx
  • src/app/(console)/notices/new/page.tsx
  • src/app/(console)/notices/page.tsx
완료
수강후기
/reviews
admin/board/sty_list.php169
  • src/app/(console)/reviews/[id]/page.tsx
  • src/app/(console)/reviews/new/page.tsx
  • src/app/(console)/reviews/page.tsx
완료
합격노트
/pass-notes
admin/board/passnote_list.php248
  • src/app/(console)/pass-notes/[id]/page.tsx
  • src/app/(console)/pass-notes/new/page.tsx
  • src/app/(console)/pass-notes/page.tsx
완료
질문답변
/qna
admin/board/qa_list.php190
  • src/app/(console)/qna/[id]/page.tsx
  • src/app/(console)/qna/page.tsx
완료
상담신청
/applications
admin/board/ap_list.php621
  • src/app/(console)/applications/[id]/page.tsx
  • src/app/(console)/applications/page.tsx
완료
자주듣는 질문
/faqs
admin/board/faq_list.php203
  • src/app/(console)/faqs/[id]/page.tsx
  • src/app/(console)/faqs/new/page.tsx
  • src/app/(console)/faqs/page.tsx
완료

수강 · 결제

메뉴원본원본 줄수옮긴 파일상태
결제리스트
/payments
admin/payment/payment_list.php244
  • src/app/(console)/payments/page.tsx
완료
TESOL Unit
/units/tesol
admin/unit/unit_list.php75
  • src/app/(console)/units/tesol/page.tsx
완료
TEC Unit
/units/tec
admin/unit/unit_list_tec.php75
  • src/app/(console)/units/tec/page.tsx
완료
레벨테스트
/level-tests
admin/unit/level_test_list.php92
  • src/app/(console)/level-tests/page.tsx
완료