o2o-negosium-original/lps-admin
민헌 479cb862b1 feat(lps-admin): 상품·가격 — '몰별 최저가'+'검증 링크' 를 몰별 가격 비교로 통합
두 카드가 사실 같은 데이터(by_mall)를 다르게 그린 것이라 하나로 합침.
상위 N개(3/5/10/전체 선택)를 순위·쇼핑몰·상품명·가격·최저가 대비 델타·
링크 한 줄로 보여주고 가격 비교 막대를 얹어 한눈에 비교 가능.

- MallEntry 타입 필드명 버그 수정(mall/url → mall_name/detail_url/name)
  — 기존 몰별 최저가 차트에 몰 이름이 안 보이던 원인. 이제 표시됨.
- 상위 N 은 프리셋 칩(by_mall 이 몰별 dedup 소집합이라 자유입력보다 적합).
- '검색어'는 항목별로 없어 각 몰의 상품명(title)으로 대체 — 같은 상품
  검증 역할.
- 모바일 가로 스크롤 해소: 상단 네비 overflow-x-auto 가 페이지를 늘리던
  것(루트 w-full 누락)과 master-detail 그리드 자식 min-w-0 누락 동반 수정.
- 실기동 검증: G마켓 56,880/플랜88 59,900 렌더·칩 토글·데스크톱/모바일
  hscroll 0·콘솔 에러 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 10:57:07 +09:00
..
src feat(lps-admin): 상품·가격 — '몰별 최저가'+'검증 링크' 를 몰별 가격 비교로 통합 2026-07-14 10:57:07 +09:00
.gitignore chore(lps-admin): 폴더명 lps-temp-fe → lps-admin 2026-07-13 22:07:30 +09:00
index.html chore(lps-admin): 폴더명 lps-temp-fe → lps-admin 2026-07-13 22:07:30 +09:00
package-lock.json chore(lps-admin): package-lock name 동기화 — 폴더명 변경 후속 2026-07-13 22:39:49 +09:00
package.json chore(lps-admin): 폴더명 lps-temp-fe → lps-admin 2026-07-13 22:07:30 +09:00
README.md docs(lps-admin): README 에 테스트 검색 페이지 추가 2026-07-14 09:14:14 +09:00
tsconfig.json chore(lps-admin): 폴더명 lps-temp-fe → lps-admin 2026-07-13 22:07:30 +09:00
tsconfig.tsbuildinfo chore(lps-admin): 폴더명 lps-temp-fe → lps-admin 2026-07-13 22:07:30 +09:00
vite.config.ts chore(lps-admin): 폴더명 lps-temp-fe → lps-admin 2026-07-13 22:07:30 +09:00

LPS 관리자 페이지

LPS(인터넷 최저가 검색)의 운영 지표를 보고 필수 액션(수동 재검색·DEAD 재큐)을 수행하는 React 관리자 페이지입니다. 서버 동작 설정은 여기서 바꾸지 않습니다 — 설정 소스는 서버의 config.<env>.toml 하나(2026-07-13 협의).

실행 (개발)

npm install
npm run dev        # http://localhost:5174 — /v1·/healthz 는 vite 프록시로 :9600 에 전달(CORS 불필요)

LPS API 를 먼저 띄워두세요: cd ../lps && ./run_local_server.sh. 다른 호스트의 API 를 보려면 VITE_LPS_URL=http://<host>:9600 npm run dev 또는 앱의 설정 페이지에서 API 주소를 지정합니다(guard 켜진 prod 는 API 키도 입력 — X-API-Key 자동 첨부).

페이지

페이지 내용 데이터
대시보드 큐/차단/비용/DB풀 스탯 타일 + 임계 배너 + 큐 추이(5초 폴링) GET /v1/lps/ops
작업 큐 목록(상태·검색 필터)·상세(결과/원가/오류)·DEAD 재큐 /v1/lps/jobs, /jobs/{id}/requeue
상품·가격 가격 추이 3선(네이버·쿠팡·최종)·몰별 최저가·검증 링크·지금 다시 검색 /v1/lps/products, /products/{code}/history, POST /search
크롤 상태 IP 세션 종료사유 도넛·요청 수 분포(+차단 시작 기준선 = 예산 튜닝 뷰)·차단 이력 /v1/lps/stats/ip-sessions, /stats/bot
비용 시간별 원가 스택(AI vs 프록시)·건당 평균·평균 소요 /v1/lps/stats/cost
테스트 검색 임의 상품을 실제 파이프라인에 흘려 셀렉터·프록시·AI 매칭 점검 — 진행 스텝퍼·파이프라인 퍼널·소스별·검색 원가·매칭 상품 POST /search + GET /jobs/{id} 폴링

테스트 검색은 실제 크롤이라 프록시 비용이 발생하고 결과가 비용 통계에 집계됩니다. 워커가 떠 있어야 동작합니다(없으면 대기에서 멈춤). 상품코드는 TEST-<시각> 자동 생성 — 작업 큐의 "테스트만" 필터로 걸러볼 수 있고, negodata 는 UUID 코드만 매핑하므로 연동에 영향이 없습니다.

스택·규칙

  • Vite + React + TS + Tailwind v4 + recharts + @tanstack/react-query + react-router (negodata 프론트와 동일 계열, 경량)
  • 색 토큰은 숫자 스케일(src/index.css @theme). 차트 시리즈 색은 엔터티 고정 — 네이버 #008a43(적록색약 분리 검증 통과 톤) · 쿠팡 #f0455b · 최종 #4f46e5. 순서·색 재배정 금지.
  • 빌드: npm run build (tsc 포함) → dist/