Commit graph

51 commits

Author SHA1 Message Date
5521c44fa9 feat: 어드민 사전 관리 기능 추가
- 형태소 분석기 사용자 사전 관리 페이지 추가
- 단어 추가/삭제/수정 시 즉시 저장 및 형태소 분석기 리로드
- 품사별 통계 및 필터링 기능
- 검색 기능 추가

백엔드:
- GET/PUT /api/schedules/suggestions/dict API 추가
- morpheme.js에 reloadMorpheme(), getUserDictPath() 함수 추가

프론트엔드:
- AdminScheduleDict.jsx 페이지 추가
- AdminSchedule.jsx에 사전 관리 버튼 추가
- 라우트 추가 (/admin/schedule/dict)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-18 13:53:51 +09:00
b89255780e refactor: 일정 API 응답 형식에 맞게 프론트엔드 수정
- API 응답(날짜별 그룹화)을 플랫 배열로 변환하는 로직 추가
- 별도 카테고리 API 호출 제거, 일정 데이터에서 카테고리 추출
- PC/모바일 Schedule.jsx, AdminSchedule.jsx 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 17:52:15 +09:00
6462949bc7 refactor: 어드민 페이지 인증 로직을 useAdminAuth 훅으로 통합
- 8개 어드민 페이지에서 중복된 인증 코드 제거
- localStorage 직접 접근 → useAdminAuth 훅 사용
- authApi.hasToken()/verifyToken() 호출 제거
- 일관된 인증 상태 관리 (5분 캐시, 자동 리다이렉트)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 23:10:30 +09:00
6275f0f92a feat: 생일 기능 추가 및 일정 페이지 개선
- 생일 카드 컴포넌트 추가 (PC/모바일)
- 생일 폭죽(confetti) 애니메이션 적용 (하루에 한 번)
- 생일 상세 페이지 추가 (/birthday/멤버이름/년도)
- 관리자 일정 페이지에 생일 표시 (수정/삭제 버튼 숨김)
- 일정 상세 페이지 404 에러 UI 개선
- 일정 상세 페이지 불필요한 재시도 방지 (retry: false)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 20:09:26 +09:00
9c2ff7458d feat(Search): Admin Schedule 추천 검색어 연동 + 빈 상태 드롭다운 숨김 2026-01-11 21:39:23 +09:00
727b05f0f5 feat(Search): Redis 기반 bi-gram 추천 검색어 시스템 구현
- MariaDB 테이블 추가 (search_queries, word_pairs)
- Redis 컨테이너 추가 (Sorted Set 캐싱)
- 백엔드 suggestions 서비스 및 API 구현
- 검색 실행 시 검색어 저장 (bi-gram 학습)
- PC Schedule 프론트엔드 연동 완료
2026-01-11 21:33:55 +09:00
3d2a6555f8 fix(Schedule): 무한 스크롤 중복 요청 방지
- inView가 false→true로 변경될 때만 fetchNextPage 실행
- prevInViewRef를 사용하여 이전 상태 추적
- PC 일정, Admin 일정 페이지 모두 적용
2026-01-11 19:06:52 +09:00
09706e42e3 feat(AdminSchedule): 검색어 추천 드롭다운 추가
- 검색 버튼을 초록색 돋보기 아이콘으로 변경
- 애니메이션 scale+opacity로 개선
- 검색 모드에서 빈 일정 메시지 숨김
- 추천 검색어 드롭다운 (유튜브 스타일)
- 방향키 선택, 외부 클릭 닫기 지원
- 검색 모드 진입 시 기존 카테고리 유지
2026-01-11 16:08:22 +09:00
90f5a9a90a feat(Schedule): 검색어 추천 UI 프로토타입 구현
- PC/Admin 스케줄 페이지에 검색어 추천 드롭다운 추가
- 3영역 검색창 레이아웃 (뒤로가기 / 입력 / 검색 버튼)
- 방향키로 추천 검색어 선택 시 입력창 반영 (유튜브 스타일)
- 외부 클릭 시 드롭다운 닫기
- 검색 모드 진입 시 기존 카테고리 유지
- 검색 모드 종료 시 스크롤 위치 초기화
- 전환 애니메이션 개선 (scale + opacity)
2026-01-11 15:58:20 +09:00
2e46d1cf71 AdminSchedule에도 AdminLayout 적용
- AdminHeader를 AdminLayout으로 교체
- 내부 레이아웃을 h-full flex flex-col overflow-hidden으로 조정
- 모든 Admin 페이지가 통일된 레이아웃 구조 사용
2026-01-11 12:13:59 +09:00
0efa0a8e5c feat: AdminSchedule.jsx에 동적 높이 가상 스크롤 적용
- measureElement와 data-index 추가
- 고정 높이 제거하여 내용에 맞게 자동 조절
2026-01-10 09:52:34 +09:00
4ecc16347c fix: 일정 페이지 최소 높이 및 관리 페이지 글씨 크기 수정
- Schedule.jsx: 검색 결과 아이템에 min-h-[100px] 추가
- AdminSchedule.jsx: 글씨 크기 및 아이콘 크기 원복
2026-01-10 09:50:56 +09:00
043f8b465d fix: 가상 스크롤 버그 수정
- searchSchedules 미정의 오류 수정 (setSearchTerm만 사용)
- Schedule.jsx 항목 간 여백 추가 (ITEM_HEIGHT 136px)
2026-01-10 09:40:40 +09:00
ad2d501c39 feat: 일정 검색에 가상 스크롤 최적화 적용
- @tanstack/react-virtual 라이브러리 추가
- Schedule.jsx, AdminSchedule.jsx에 useVirtualizer 적용
- 검색 결과가 많아도 DOM에는 화면에 보이는 요소만 렌더링
- 스크롤 성능 대폭 향상
2026-01-10 09:34:18 +09:00
7192379eb0 chore: 일정 검색 페이징 limit을 20개로 변경
- Schedule.jsx, AdminSchedule.jsx SEARCH_LIMIT 5 -> 20
2026-01-10 09:20:27 +09:00
9986b918d8 fix: 검색 모드에서 카테고리 필터링 적용
- 검색 결과에도 selectedCategories로 필터링 추가
- Schedule.jsx, AdminSchedule.jsx 수정
2026-01-10 09:16:15 +09:00
bedda590eb fix: 검색 모드에서 카테고리 카운트 수정
- 검색 모드일 때 selectedDate 조건 제거하여 모든 검색 결과의 카테고리 표시
- Schedule.jsx, AdminSchedule.jsx 수정
2026-01-10 09:13:49 +09:00
97767bc5ca fix: 일정 목록 높이 자동 계산으로 잘림 문제 해결
- main을 flex flex-col로 변경
- 브레드크럼, 타이틀에 flex-shrink-0 추가
- 그리드에 flex-1 min-h-0 추가
- 일정 목록 컬럼에 flex flex-col min-h-0 추가
- 스크롤 컨테이너에서 max-h 고정값 제거하고 flex-1로 변경
2026-01-10 00:31:34 +09:00
04ce4beba4 fix: 일정 관리 페이지 UI 수정
1. 외부 스크롤 제거 (h-screen overflow-hidden flex flex-col)
2. HTML 엔티티 디코딩 함수 추가 (&lt; &gt; 등 올바르게 표시)
3. decodeHtmlEntities 함수를 컴포넌트 외부로 이동하여 ScheduleItem에서 접근 가능
2026-01-10 00:27:32 +09:00
0f7d3d6f39 Revert "fix: 관리 페이지 날짜 상태 조건부 초기화"
This reverts commit 2dd5219265.
2026-01-10 00:20:04 +09:00
2dd5219265 fix: 관리 페이지 날짜 상태 조건부 초기화
문제: 일정 관리 페이지에서 날짜 선택 후 홈으로 갔다왔을 때
오늘 날짜로 초기화가 안됨

해결:
- useScheduleStore에 preserveState 플래그 추가
- AdminSchedule에서 preserveState가 false면 오늘 날짜로 초기화
- AdminScheduleForm, AdminScheduleBots에서 일정 관리로 돌아갈 때
  preserveState를 true로 설정하여 상태 유지
2026-01-10 00:19:06 +09:00
8e01692d6e refactor: ConfirmDialog 추가 적용 및 일정 제목 truncate 제거
수정된 파일:
- AdminScheduleCategory.jsx (50줄 → 15줄, 35줄 제거)
- AdminAlbumPhotos.jsx (60줄 → 15줄, 45줄 제거)
- AdminScheduleForm.jsx (55줄 → 12줄, 43줄 제거)
- AdminSchedule.jsx 일정 제목 truncate 2곳 제거

총 약 220줄의 중복 코드 제거
2026-01-09 23:44:37 +09:00
d52b43397c refactor: ConfirmDialog 공통 컴포넌트 생성 및 적용
새로 생성된 파일:
- components/admin/ConfirmDialog.jsx (109줄)
  - 삭제 확인 등 위험한 작업을 위한 공통 다이얼로그
  - Props: isOpen, onClose, onConfirm, title, message, loading, variant 등

수정된 파일:
- pages/pc/admin/AdminAlbums.jsx (60줄 → 15줄)
- pages/pc/admin/AdminSchedule.jsx (70줄 → 17줄)

총 약 100줄의 중복 코드 제거
2026-01-09 23:36:34 +09:00
97fb4b7964 refactor: AdminHeader 공통 컴포넌트를 모든 Admin 페이지에 적용
새로 생성된 파일:
- components/admin/AdminHeader.jsx (47줄)

수정된 파일 (10개):
- pages/pc/admin/AdminMembers.jsx
- pages/pc/admin/AdminMemberEdit.jsx
- pages/pc/admin/AdminAlbums.jsx
- pages/pc/admin/AdminAlbumForm.jsx
- pages/pc/admin/AdminAlbumPhotos.jsx
- pages/pc/admin/AdminSchedule.jsx
- pages/pc/admin/AdminScheduleForm.jsx
- pages/pc/admin/AdminScheduleBots.jsx
- pages/pc/admin/AdminScheduleCategory.jsx
- pages/pc/admin/AdminDashboard.jsx

각 파일에서:
- 중복 헤더 JSX 제거 (24줄 → 1줄)
- handleLogout 함수 제거 (4~6줄)
- LogOut import 제거

총 약 300줄의 중복 코드 제거
2026-01-09 23:18:48 +09:00
0b00055773 refactor: useToast 커스텀 훅으로 Toast 로직 통합
- hooks/useToast.js 생성 (44줄)
- 적용 파일 (9개):
  - AdminMembers.jsx
  - AdminMemberEdit.jsx
  - AdminAlbums.jsx
  - AdminAlbumForm.jsx
  - AdminAlbumPhotos.jsx
  - AdminSchedule.jsx
  - AdminScheduleForm.jsx
  - AdminScheduleBots.jsx
  - AdminScheduleCategory.jsx
- 각 파일에서 중복된 toast useState/useEffect 제거
- showSuccess/showError 편의 메서드 활용

총 약 70줄의 중복 코드 제거
2026-01-09 22:57:34 +09:00
8424c3422d fix: Schedule 페이지 오류 수정 및 년월 선택 스타일 통일
- Schedule.jsx: yearRange, monthNames 변수 누락 수정
- Schedule.jsx, AdminSchedule.jsx: 현재 년도/월 테두리 제거, 글씨색만 유지
- CustomDatePicker.jsx: 동일 스타일 적용
2026-01-09 22:47:32 +09:00
0722ca10f3 refactor: API 중앙화 최종 (5/5)
- Schedule.jsx import 경로 오류 수정
- AdminSchedule.jsx API 모듈 적용 (schedulesApi, categoriesApi)
- 전체: PC public 6개, 모바일 Home 1개, Admin 2개 적용 완료
2026-01-09 22:09:42 +09:00
fc35a35987 perf: AdminSchedule 성능 최적화
- filteredSchedules useMemo로 불필요한 재계산 방지
- ScheduleItem React.memo 컴포넌트로 분리하여 리렌더링 방지
- categoryCounts useMemo 맵으로 O(1) 카테고리 카운트 조회
- 카테고리 카운트를 선택된 날짜 기준으로 계산
- useDeferredValue로 달력 점 표시 지연 처리하여 UI 응답성 향상
- selectedDate 변경 시 스크롤 맨 위로 초기화
2026-01-09 19:26:52 +09:00
494c2a9d6d perf: AdminSchedule 달력 렌더링 성능 최적화
- scheduleDateMap useMemo로 O(1) 조회 구현
- hasSchedule, getScheduleColor 함수 배열 순회 제거
2026-01-09 17:53:58 +09:00
4619d101f0 refactor: 전체보기 기능 제거 및 날짜 선택 기본값 개선
- 전체보기 버튼 제거
- 월 이동 시 이번달이면 오늘, 다른 달이면 1일 자동 선택
- 같은 날짜 클릭 시 토글 제거 (항상 선택 유지)
- 필터링 대상 줄여서 성능 개선
2026-01-09 17:35:15 +09:00
d0b78f0b5d refactor: AdminSchedule, AdminScheduleForm 날짜 파싱에 formatDate 유틸리티 적용
- AdminSchedule.jsx: hasSchedule, getScheduleColor, filteredSchedules에서 formatDate 사용
- AdminScheduleForm.jsx: 수정 모드 날짜 로드 시 formatDate 사용
- toISOString 대신 dayjs 기반 formatDate 사용
2026-01-09 09:57:51 +09:00
0d72dfe456 feat: dayjs 라이브러리로 날짜 계산 로직 통합
- dayjs 패키지 설치 (타임존 지원)
- utils/date.js 유틸리티 생성 (getTodayKST, formatDate, parseDateKST 등)
- PC/모바일 Home.jsx의 날짜 계산을 유틸리티로 교체
- PC Schedule.jsx, AdminSchedule.jsx의 getTodayKST 함수를 유틸리티로 교체
- KST 타임존 기준으로 정확한 날짜 계산 보장
2026-01-09 09:46:54 +09:00
20546599cc feat: YouTube API 할당량 경고 시스템 구현
- RSS 방식에서 YouTube API 방식으로 변경 (최근 10개 영상 조회)
- rss_url 컬럼 삭제
- Google Cloud Webhook으로 할당량 경고 수신
- 95% 도달 시 봇 자동 중지
- LA 시간 자정(할당량 리셋)에 봇 자동 재시작
- 봇 관리 페이지에 경고 배너 표시
2026-01-07 23:54:35 +09:00
c54de2ba82 feat: useInfiniteQuery 기반 무한 스크롤 구현 및 UI 개선
- react-infinite-scroll-component를 useInfiniteQuery + useInView로 대체
- Schedule.jsx, AdminSchedule.jsx에 안정적인 무한 스크롤 적용
- source_name에 Link2 아이콘 추가 (카테고리 오른쪽 인라인 표시)
- 멤버 5명 이상일 경우 '프로미스나인'으로 표시 (탈퇴 멤버 고려)
- AdminSchedule 일반 모드에서 members 배열도 확인하여 멤버 표시
- QueryClientProvider 설정 추가 (main.jsx)
2026-01-06 19:48:43 +09:00
bb027df914 feat: 일정 관련 UI/UX 개선
- 카테고리 정렬: 일정 개수 기준 내림차순, 0개 숨김, 기타는 맨 아래 고정
- useMemo로 카테고리 정렬 메모이제이션 (깜빡임 방지)
- 일정 수정 시 이미지 삭제 버그 수정 (existingImageIds 업데이트)
- 이미지 파일명에서 Date.now() 제거 (01.webp 형식 유지)
- 이미지 삭제 후 sort_order 재정렬 로직 추가
- 날짜 선택 시 요일 표시 추가 (2026년 1월 7일 (수) 형식)
2026-01-06 14:16:29 +09:00
dac2234a0b 일정 관리 상태 관리를 Zustand로 마이그레이션
- zustand 패키지 설치
- useScheduleStore 스토어 생성
- sessionStorage 관련 모든 복잡한 로직 제거
- 메모리 기반이라 SPA 내 이동 시 유지, 새로고침 시 자동 초기화
2026-01-06 12:26:40 +09:00
7df7469b78 일정 관리 상태 복원 - React StrictMode 이중 마운트 문제 해결
- useRef로 상태 복원 로직 한 번만 실행되도록 보장
- 두 번째 마운트에서 플래그/상태 삭제 방지
2026-01-06 12:22:10 +09:00
2c766e8da6 일정 관리 상태 복원 로직 - fromScheduleForm 플래그 방식으로 변경
- 일정 추가/수정 버튼 클릭 시 플래그 설정
- 돌아올 때 플래그가 있으면 상태 복원 후 플래그 제거
- 플래그가 없으면 상태 초기화 (새로고침/직접 진입)
2026-01-06 12:10:58 +09:00
31f15fe20b 일정 관리 상태 복원 로직 수정 - back_forward 타입일 때만 복원
- 뒤로가기/앞으로가기: 상태 복원
- 새로고침(reload), 직접 진입(navigate): 상태 초기화
2026-01-06 12:08:58 +09:00
a3573ec990 일정 관리 상태 복원 로직 개선 - scheduleToast 기반 판별
- scheduleToast가 있을 때만 상태 복원 (일정 폼에서 돌아올 때)
- 그 외에는 상태 초기화
2026-01-06 12:07:32 +09:00
026c68aa52 일정 관리 페이지 상태 저장 수정 - 새로고침/직접 진입 시 초기화
- navigation type 체크: reload나 navigate일 때 sessionStorage 상태 제거
- 뒤로가기(back_forward)에서만 상태 복원
2026-01-06 12:05:39 +09:00
217746af3e 봇 관리 UI 개선
- 카드 그리드 레이아웃으로 변경
- 통계 분리: 총 추가 / 마지막 추가 / 업데이트 간격
- DB에 last_added_count 컬럼 추가
- 업데이트 시간을 봇 이름 아래에 표시
- 마지막 추가된 개수 초록색 강조
2026-01-06 11:42:47 +09:00
89cd2d7965 관리자 일정 목록에 외부 링크 버튼 추가
- URL이 있는 일정에 파란색 외부 링크 버튼 표시
- 수정/삭제 버튼 앞에 배치
2026-01-06 11:14:18 +09:00
b6b212821e 일정 페이지 UI/UX 개선
- 검색 모드 전환 시 일정 목록 fade 애니메이션 통일
- 일정 개수 텍스트 애니메이션 추가
- 관리자 일정 개수 표시 'N개 일정'으로 변경
- 일정 항목 애니메이션 y 이동 제거 (스크롤바 깜빡임 방지)
- 관리자 일정 페이지 상태 유지 (sessionStorage)
2026-01-06 09:50:29 +09:00
2572ce2195 일정 목록 내부 스크롤 UI 개선
- 공개/관리자 일정 목록에 고정 높이 및 내부 스크롤 적용
- 상하단 패딩 추가로 가독성 개선
2026-01-06 08:59:31 +09:00
068c5ffbbb Meilisearch 검색 기능 개선
- 검색 결과 유사도순 정렬 (동일 유사도 시 최신 날짜 우선)
- 프론트엔드 검색 재정렬 제거 (Meilisearch 순서 유지)
- 관리자 일정 페이지 Meilisearch 검색 적용
- 일정 수정 시 Meilisearch 동기화 추가
- 서버 시작 시 자동 동기화
- 멤버 이름 쉼표 구분으로 통일
2026-01-06 08:46:10 +09:00
9ab79ef507 일정 페이지 기본 날짜 KST 기준으로 수정 2026-01-06 08:09:17 +09:00
52332babea 일정 관리 기능 개선: 봇 스케줄러 리팩토링, 멤버 표시, UI 개선
- 봇 스케줄러: 서버 시작 시 자동 초기화, 10초 간격 상태 동기화
- DB 리팩토링: bots 테이블에서 YouTube 컬럼 분리, bot_youtube_config 활용
- 봇별 커스텀 설정: BOT_CUSTOM_CONFIG 상수로 코드 내 관리
- 공개/관리자 일정 목록에 멤버 태그 표시 (5명 이상이면 '프로미스나인')
- 일정 목록 글씨 크기 증가 및 UI 개선
- source_name 관리자 일정에 뱃지로 표시
- 봇 시작/정지 토스트에 봇 이름 포함
2026-01-06 00:27:35 +09:00
387db937b0 feat(schedule): 공개 일정 페이지에 검색 기능 추가
- 헤더에 검색 토글 UI 추가 (밑줄 스타일 검색창)
- API 검색 기능 (/api/admin/schedules?search=) 연동
- 검색 모드에서 달력/카테고리 비활성화 (framer-motion animate)
- 검색 결과에 년.월 형식 날짜 표시 (2025.4)
- 카테고리 개수: 검색 시 결과 기준, 일반 시 해당 월 기준
- 달력/카테고리 구조 분리하여 독립 제어
- AdminSchedule.jsx도 동일한 비활성화 방식 적용
2026-01-05 22:08:41 +09:00
dff43126c4 feat(schedule): 일정 수정/삭제 기능 구현 및 DB 스키마 개선
- schedule_members 테이블 분리 (members 컬럼 → 별도 테이블)
- schedules 테이블 컬럼 comment 추가 및 순서 정리
- 상세주소(location_detail) 필드 추가
- 장소 검색 UI 개선 (탭 제거 → 입력 필드+검색 버튼 병합)
- 카카오 장소 검색 API 프록시 추가 (/api/admin/kakao/places)
- 백엔드 CRUD API 구현 (GET/PUT/DELETE /schedules/:id)
- 프론트엔드 삭제 기능 및 확인 다이얼로그 추가
- 프론트엔드 수정 모드 지원 (기존 데이터 로드)
2026-01-05 18:11:40 +09:00