v1.12.29 접속자 요약과 회원 작성 이력 및 댓글 표시 정리
This commit is contained in:
15
docs/spec.md
15
docs/spec.md
@@ -682,7 +682,7 @@ components/content/
|
||||
- `GET /admin/api/analytics/summary?period=weekly&days=56` - 통계 요약(오늘 및 최근 7/30/180/365일 방문, 누적 방문자·누적 조회수·공개 게시물 수, 30일 조회, 현재 접속자, 평균 체류, 50% 스크롤 도달, `collectedSince`, 선택 집계 단위 `trends`). `period`는 `daily`, `weekly`, `monthly`, `yearly`를 사용하며 대시보드는 일일·주간·월간·년간으로 전환한다.
|
||||
- `GET /admin/api/analytics/posts?days=30&limit=5` - 기간 내 인기 게시물(조회·최근 30일 월간 조회·작성일·읽음·평균 체류·스크롤 구간)
|
||||
- `GET /admin/api/analytics/pages?days=30&limit=5` - 기간 내 인기 페이지(조회·방문자·평균 체류·스크롤 구간)
|
||||
- `GET /admin/api/analytics/realtime?limit=20` - 현재 접속자 요약·목록(로그인 사용자 닉네임·아바타, IP, 열린 페이지 수와 열린 페이지 목록 포함)
|
||||
- `GET /admin/api/analytics/realtime?limit=20` - 현재 접속자 요약·목록. `summary`는 `onlineNow`, `loggedInNow`, `anonymousNow`, `openPageCount` 제공. 최근 90초 내 활성 세션을 집계하며 `openPageCount`는 목록 제한과 관계없는 전체 탭 세션 수(같은 경로 중복 탭 포함). 목록은 로그인 사용자 닉네임·아바타, IP, 열린 페이지 수와 고유 페이지 목록 포함. 대시보드는 최대 20명 표시하며 페이지네이션 없음(API limit 최대 50).
|
||||
- `GET /admin/api/analytics/traffic?days=30` - 기간 내 유입원·디바이스·유입 키워드 통계
|
||||
- `GET /admin/api/analytics/range-detail?startDay=YYYY-MM-DD&endDay=YYYY-MM-DD&limit=5` - 통계 추이 막대 상세(요약·유입·디바이스·인기 게시물·인기 페이지). 인기 콘텐츠는 조회·읽음/방문자·최근 30일 조회·작성일·스크롤 도달 지표를 포함한다. 최대 31일 범위로 제한한다.
|
||||
- `GET /admin/api/security/csp-violations?days=30&limit=8` - CSP Report-Only 위반 집계 관찰 요약. `days`는 1~90일, `limit`은 1~20개로 제한하며 전체 누적 횟수, 최근 관찰 항목의 누적 횟수(`recentViolations`: 기간 내 `last_seen_at`을 가진 행의 `violation_count` 합계), 마지막 관찰 시각, 상위 위반 목록, 지시어별 외부 origin 허용 후보를 반환한다. 후보는 최근 관찰 상위 200행에서 계산한다. 일별 원장이 없어 기간 내 실제 발생 횟수는 반환하지 않는다.
|
||||
@@ -1089,13 +1089,13 @@ APP_PORT=43080
|
||||
- 첫 커밋 이후 변경사항을 커밋할 때마다 패치 버전 증가
|
||||
- 메이저/마이너 버전은 구조 변경 또는 기능 묶음 단위로 결정
|
||||
|
||||
## 관리자 댓글·회원 작성 이력 조회 (v1.12.24)
|
||||
## 관리자 댓글·회원 작성 이력 조회 (v1.12.29)
|
||||
|
||||
- `GET /admin/api/comments`: 관리자 세션 필수. `memberId`(선택 UUID), `q`(기본 빈 문자열, trim, 최대 200자, 댓글 내용·게시물 제목 부분 검색), `page`(기본 1, 1~1000000 정수), `pageSize`(기본 10, 1~100 정수). 잘못된 조건은 400, 미인증은 401.
|
||||
- 응답 `{ items, pagination: { page, pageSize, total, pageCount } }`. 항목은 `id`, `body`, `status`, `parentId`, `createdAt`, `userId`, `username`, `postId`, `postTitle`, `postSlug`, `postStatus` 제공. 모든 상태의 댓글·답글 포함, 작성 시각·ID 내림차순. 범위 초과 페이지는 마지막 페이지로 보정.
|
||||
- 멤버 상세는 `정보 / 작성한 글` 탭을 제공하며 정보로 진입한다. 정보 편집값은 탭 이동 시 유지한다. 작성한 글 탭에서 게시글·댓글 전체 이력을 `구분 / 게시글 / 작성자 / 작성일 / 내용` 한 줄 표로 통합 표시한다. 긴 제목·내용은 말줄임과 title로 표시하며 좁은 화면은 표 내부 가로 스크롤을 제공한다.
|
||||
- 멤버 상세는 `정보 / 작성한 글` 탭을 제공하며 정보로 진입한다. 정보 편집값은 탭 이동 시 유지한다. 작성한 글 탭에서 게시글·댓글 전체 이력을 `게시글 / 내용 / 작성일` 3열 한 줄 표로 통합 표시한다. 작성자는 현재 회원이므로 표시하지 않으며 종류는 상단 필터로 선택한다. 긴 제목·내용은 말줄임과 title로 표시하며 좁은 화면은 표 내부 가로 스크롤을 제공한다.
|
||||
- 상단 `전체 / 댓글 / 게시글` 종류 필터와 검색 버튼/Enter 검색을 제공한다. 검색·종류 변경 시 첫 페이지로 돌아가며 10개씩 번호형 페이지네이션으로 최신순 전체 이력을 조회한다.
|
||||
- 대시보드는 최신 댓글 5개를 30초마다 갱신한다. 게시물·작성자·짧은 시각·말줄임 한 줄 내용만 작은 행으로 표시한다. 조회 오류는 재시도하며 이력 조회 중은 로딩 표시.
|
||||
- 대시보드는 최신 댓글 5개를 30초마다 갱신한다. 게시물 제목·말줄임 한 줄 내용·작성자·짧은 날짜 순서로 작은 행을 표시한다. 조회 오류는 재시도하며 이력 조회 중은 로딩 표시.
|
||||
- 댓글 내용은 일반 텍스트로 표시한다. 대시보드 작성자는 멤버 상세로 이동한다. 통합 표의 게시글 제목은 `publicUrl`이 있으면 새 창의 공개 화면으로, 없으면 관리자 편집으로 이동한다(공개 화면의 기존 접근 권한 적용).
|
||||
- 게시글 목록 댓글 열은 기존 `commentCount` 사용. 공개 상태 댓글·답글만 집계.
|
||||
|
||||
@@ -1108,12 +1108,13 @@ APP_PORT=43080
|
||||
- 응답 `{ items: [{ kind, id, postId, postTitle, postSlug, postStatus, publishedAt, createdAt, username, body, publicUrl }], pagination: { page, pageSize, total, pageCount } }`. `kind`는 `post`/`comment`. 게시글 body는 최대 320자 일반 텍스트 요약, 댓글은 원문 텍스트. 공개 접근 가능한 게시글은 `publicUrl` 제공(댓글은 `#comments`), 초안·비공개·예약 글은 null이며 관리자 편집으로 이동.
|
||||
- 기존 `/admin/api/comments`, `/admin/api/members/:id/posts` 응답 계약은 유지하며 멤버 작성한 글 화면은 통합 `/activity`를 사용한다.
|
||||
|
||||
## 대시보드 표시 정리 (v1.12.25)
|
||||
## 대시보드 표시 정리 (v1.12.29)
|
||||
|
||||
- 화면 순서: 상단 요약 → 예상 수입 → 통계 추이 → 선택한 기간 상세 → 최근 댓글 → 현재 접속자.
|
||||
- 방문자·게시물 수·조회·스크롤·유입·디바이스·차트 수치·댓글/작성 이력 건수는 `ko-KR` 천 단위 구분(예: `10,413`)으로 표시. API 숫자 형식은 유지.
|
||||
- 접속자 대표 페이지는 포커스 여부가 아닌 마지막 확인 시각 기준. 현재 API의 회원별·익명 IP별 묶음은 유지. 인원 표시는 반환된 목록 수와 전체 접속자 수를 구분.
|
||||
- 열린 페이지 팝오버는 hover 시 일시 표시, 클릭/Enter로 고정 전환. 포인터를 목록으로 이동해도 링크 접근을 유지하며, 화면 범위에 맞춰 위/아래 배치하고 긴 목록은 내부 스크롤 제공.
|
||||
- 접속자 대표 페이지는 포커스 여부가 아닌 마지막 확인 시각 기준. 현재 API의 회원별·익명 IP별 묶음은 유지. 인원 표시는 `전체 N명 중 M명 표시 · 열린 화면 K개` 형식으로 전체·표시 인원과 전체 활성 탭 세션 수를 구분. 목록은 최대 20명이며 다음 페이지는 없음. 원본 세션을 최대 160행 조회 후 묶으므로 한 사람이 많은 탭을 열면 표시 인원은 20명보다 적을 수 있음.
|
||||
- 고유 페이지가 여러 개면 `외 N개`를 파란색으로, 숫자는 굵게 표시. 고유 페이지가 하나면 공개 화면 링크만 제공하고 팝오버를 표시하지 않음. 열린 페이지 팝오버는 hover 시 일시 표시, 클릭/Enter로 고정 전환. 포인터를 목록으로 이동해도 링크 접근을 유지하며, 화면 범위에 맞춰 위/아래 배치하고 긴 목록은 내부 스크롤 제공.
|
||||
- 접속자 시간은 열린 페이지 중 가장 긴 경과 시간이며, 페이지 진입 시 초기화하고 백그라운드 시간 포함·최대 1,800초(30분)로 기록. 실제 읽은 시간이나 만료까지 남은 시간이 아니며 마우스 안내로 의미 표시. 현재 접속 판정은 이 시간과 별도로 마지막 접속 신호 90초 기준.
|
||||
|
||||
## 운영 Compose 식별 (v1.12.27)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user