관리자 기능과 계정 즐겨찾기 개선
This commit is contained in:
36
docs/spec.md
36
docs/spec.md
@@ -3,7 +3,7 @@
|
||||
## 프로젝트 개요
|
||||
|
||||
- 서비스명: `UNIARE - Union Arena Deck Builder`
|
||||
- 현재 버전: `v4.0.1`
|
||||
- 현재 버전: `v4.0.3`
|
||||
- 프론트: 정적 HTML, CSS, JavaScript
|
||||
- 백엔드: Express, SQLite(`better-sqlite3`)
|
||||
- 운영: Docker Compose 기반 Nginx + API
|
||||
@@ -26,6 +26,14 @@
|
||||
| `/admin.html` | 회원과 덱 관리 |
|
||||
| `/d/<shareCode>` | Nginx에서 `cardList.html?d=<shareCode>`로 연결 |
|
||||
|
||||
## 검색 노출
|
||||
|
||||
- 메인 검색 제목은 `UNIARE | 유니온 아레나 덱 빌더`를 사용한다.
|
||||
- 메인 설명은 카드 검색, 덱 제작·저장·공유, 공개 덱과 즐겨찾기 기능을 안내한다.
|
||||
- JavaScript 실행 전에도 메인 제목과 설명이 HTML에 표시된다.
|
||||
- canonical, Open Graph, Twitter Card, WebSite·WebApplication 구조화 데이터를 제공한다.
|
||||
- 번역 파일 로딩 실패 시 내부 오류 대신 새로고침 안내를 표시한다.
|
||||
|
||||
## 카드 데이터
|
||||
|
||||
- 데이터 위치: `datas/*.js`
|
||||
@@ -60,6 +68,8 @@
|
||||
- `images/**`는 Git LFS로 관리한다.
|
||||
- 아바타와 덱 미리보기는 API 데이터 디렉터리에 저장하며 Git에 포함하지 않는다.
|
||||
- 덱 저장 미리보기는 1200px 기준 PNG로 정규화한다.
|
||||
- 덱 삭제 시 해당 공유 코드의 미리보기 PNG도 함께 삭제한다.
|
||||
- 관리자는 DB에서 참조하지 않는 미리보기 파일을 조회하고 일괄 삭제할 수 있다.
|
||||
|
||||
## 브라우저 상태
|
||||
|
||||
@@ -70,7 +80,7 @@
|
||||
| `selectedSeries` | 현재 시리즈 |
|
||||
| `uadeck_token` | JWT |
|
||||
| `uadeck_user` | 로그인 사용자 캐시 |
|
||||
| 덱 즐겨찾기 키 | 공유 코드 기반 로컬 즐겨찾기 |
|
||||
| `uadeck.deckFavorites` | 비로그인 즐겨찾기 및 로그인 시 최초 이전 대상 |
|
||||
|
||||
## 인증 및 권한
|
||||
|
||||
@@ -80,6 +90,8 @@
|
||||
- `admin`은 회원 상태·역할·비밀번호와 전체 덱을 관리할 수 있다.
|
||||
- 관리자는 자신의 관리자 역할을 해제하거나 자신의 계정을 비활성화할 수 없다.
|
||||
- 비공개 덱은 소유자와 관리자만 조회할 수 있다.
|
||||
- 로그인 사용자의 즐겨찾기는 계정 DB에 저장되어 브라우저와 기기가 달라도 유지된다.
|
||||
- 비로그인 즐겨찾기는 브라우저에 저장하고 로그인 시 유효한 덱만 계정으로 이전한다.
|
||||
|
||||
## 덱 저장 정책
|
||||
|
||||
@@ -125,6 +137,14 @@
|
||||
| `preview_image` | 저장된 미리보기 파일 정보 |
|
||||
| `created_at`, `updated_at` | 생성·수정 시각 |
|
||||
|
||||
### `deck_favorites`
|
||||
|
||||
| 컬럼 | 설명 |
|
||||
|---|---|
|
||||
| `user_id` | 즐겨찾기 사용자, 사용자 삭제 시 함께 삭제 |
|
||||
| `share_code` | 즐겨찾기 덱, 덱 삭제 시 함께 삭제 |
|
||||
| `created_at` | 즐겨찾기 등록 시각 |
|
||||
|
||||
## API
|
||||
|
||||
### 공통
|
||||
@@ -155,6 +175,10 @@
|
||||
| POST | `/api/v1/decks` | 공개 | 회원 또는 비회원 덱 저장 |
|
||||
| PUT | `/api/v1/decks/:shareCode` | 소유자·관리자 | 덱 수정 |
|
||||
| DELETE | `/api/v1/decks/:shareCode` | 소유자·관리자 | 덱 삭제 |
|
||||
| GET | `/api/v1/decks/favorites` | 회원 | 내 즐겨찾기 코드 목록 |
|
||||
| POST | `/api/v1/decks/favorites` | 회원 | 브라우저 즐겨찾기 일괄 이전 |
|
||||
| PUT | `/api/v1/decks/favorites/:shareCode` | 회원 | 즐겨찾기 추가 |
|
||||
| DELETE | `/api/v1/decks/favorites/:shareCode` | 회원 | 즐겨찾기 제거 |
|
||||
|
||||
### 관리자
|
||||
|
||||
@@ -166,12 +190,17 @@
|
||||
| POST | `/api/v1/admin/users/:id/reset-password` | 비밀번호 초기화 |
|
||||
| GET | `/api/v1/admin/decks` | 전체 덱 목록 |
|
||||
| DELETE | `/api/v1/admin/decks/:shareCode` | 덱 삭제 |
|
||||
| GET | `/api/v1/admin/previews/orphans` | 미참조 덱 미리보기 목록 |
|
||||
| DELETE | `/api/v1/admin/previews/orphans` | 미참조 덱 미리보기 일괄 삭제 |
|
||||
| POST | `/api/v1/admin/decks/preset` | 레거시 프리셋 생성 |
|
||||
|
||||
## 스타일
|
||||
|
||||
- 현재는 Tailwind 유틸리티, 공통 CSS, 페이지 전용 CSS, 일부 인라인 스타일을 혼용한다.
|
||||
- 이번 단계에서는 기존 CSS를 Tailwind로 일괄 전환하지 않는다.
|
||||
- 기존 CSS는 `todo.md`의 화면별 체크리스트 순서에 따라 점진적으로 Tailwind로 전환한다.
|
||||
- 관리자와 로그인·회원가입 화면은 Tailwind 전환을 완료하고 전용 CSS를 제거했다.
|
||||
- 관리자 탭·모달 상태는 JavaScript에서 `border-*`, `text-*`, `hidden`, `flex` 유틸리티를 전환한다.
|
||||
- 관리자 덱 목록이 재사용하는 `style/deck-history.css`는 내 덱·공개 덱 화면 전환 때 함께 정리한다.
|
||||
- `style/output.css`는 `style/input.css`에서 생성하는 빌드 산출물이다.
|
||||
- 헤더 로고 크기는 `style/brand.css`만 기준으로 사용한다.
|
||||
- 기본 글꼴은 Pretendard 계열을 우선 사용한다.
|
||||
@@ -180,6 +209,5 @@
|
||||
|
||||
- `cardList.html`, `result.html`의 인라인 스크립트가 커서 변경 영향 범위가 넓다.
|
||||
- `admin.html`은 3개 언어 번역 적용이 완료되지 않았다.
|
||||
- 즐겨찾기는 브라우저별 로컬 상태라 계정 간 동기화되지 않는다.
|
||||
- Homepage 전용 `GET /api/homepage` 엔드포인트는 아직 구현되지 않았다.
|
||||
- 현재 Compose의 컨테이너명(`uniare-api`, `uniare-web`)과 데이터 볼륨명(`uniare-data`)은 고정값이며 환경 변수화되지 않았다.
|
||||
|
||||
Reference in New Issue
Block a user