[feat] solution/site,shared: 새 템플릿 8종을 카페·음식점·병원에도 연다 — 객실 문구를 업종별로

새 템플릿을 숙박에만 등록해서 음식점 사장님 화면에는 4종만 보였다.

- templates.json: cafe · restaurant · clinic 에 라운드~솔숲 8종 추가
- kit/unitWord.ts: Room / Menu / Program — 코랄·미니멀·시네마·부티크·빅타이포의 영문 라벨
- 각 Rooms.tsx: 객실별 '예약 요청' 버튼은 숙박일 때만(예약 시트가 숙박에만 있어 누르면 무반응)
- 이용안내 머리말 · 미니 블로그 설명을 업종 중립 문구로, 부티크 탭 'Stay' → 비숙박은 'Guide'
- docs/TEMPLATES.md: 업종별 사용 범위

eslint·tsc 통과, vitest 123 passed, 숙박 9 + 카페·음식점·병원 각 8 = 33개 사이트 굽기 성공 ·
숙박 전용 문구(객실·체크인·Room·예약 요청) 0건 · 간격 검사 0건

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Mina Choi 2026-09-30 14:57:02 +09:00
parent 30f8101988
commit 18a287451e
3 changed files with 57 additions and 1 deletions

View File

@ -66,7 +66,12 @@ HTML 안에 있고 보이는 묶음만 바뀐다. 검색엔진은 네 묶음을
거의 없는 집을 위한 것이라, 첫 화면과 객실 카드를 그림으로 채운다.
업종마다 쓸 수 있는 템플릿과 기본 템플릿은 같은 파일의 `industries`에 적는다. 숙박은 레트로가
기본이고, 병원은 심플과 매거진만 쓸 수 있다.
기본이다. 새 템플릿 8종(라운드 ~ 솔숲)은 네 업종 모두 쓸 수 있다. 병원은 그 밖에 심플과
매거진만 쓴다(고택·레트로는 숙박·음식점 느낌이 강해 뺐다).
★ 새 템플릿은 숙박 기준으로 만들었다. 숙박이 아니면 객실 자리가 메뉴·시술로 바뀌고
(`kit/unitWord.ts`, `UNIT_SPEC`), 객실별 '예약 요청' 버튼은 숨긴다 — 예약 시트가 숙박에만
있어서 누르면 아무 일도 안 일어났다.
### 뼈대(레이아웃)는 필요한 것만 바꾼다

View File

@ -0,0 +1,39 @@
"""크롤링 · 사진 분석 · 빌드 진행 이벤트를 Teams 로 보낸다."""
from common.enums import LinkChannel, PlaceCategory
from services import alert_service
KIND = "activity"
_CHANNEL_NAMES = {
LinkChannel.YANOLJA.value: "야놀자",
LinkChannel.GOODCHOICE.value: "여기어때",
LinkChannel.NAVER_PLACE.value: "네이버 플레이스",
LinkChannel.INSTAGRAM.value: "인스타그램",
LinkChannel.OFFICIAL_SITE.value: "홈페이지",
LinkChannel.BLOG.value: "블로그",
LinkChannel.NAVER_BOOKING.value: "네이버 예약",
LinkChannel.ETC.value: "기타",
}
_CATEGORY_NAMES = {
PlaceCategory.LODGING.value: "숙박",
PlaceCategory.CAFE.value: "카페",
PlaceCategory.RESTAURANT.value: "음식점",
PlaceCategory.CLINIC.value: "피부과·성형외과",
}
def channel_name(code) -> str:
return _CHANNEL_NAMES.get(code, f"채널{code}")
def category_name(code) -> str:
return _CATEGORY_NAMES.get(code, f"업종{code}")
def place_label(place) -> str:
return f"{place.name}({category_name(place.category)})"
async def post(title: str, lines: list[str]) -> None:
await alert_service.send_alert(KIND, title, "\n\n".join(line for line in lines if line))

View File

@ -0,0 +1,12 @@
import {PlaceCategory} from '@o2o/shared';
const WORD: Record<number, string> = {
[PlaceCategory.LODGING]: 'Room',
[PlaceCategory.CAFE]: 'Menu',
[PlaceCategory.RESTAURANT]: 'Menu',
[PlaceCategory.CLINIC]: 'Program',
};
export function unitWord(category: number): string {
return WORD[category] ?? 'Menu';
}