Files
waiting-system/main.py
Jun-dev f699a29a85 Add waiting system application files
- Add main application files (main.py, models.py, schemas.py, etc.)
- Add routers for all features (waiting, attendance, members, etc.)
- Add HTML templates for admin and user interfaces
- Add migration scripts and utility files
- Add Docker configuration
- Add documentation files
- Add .gitignore to exclude database and cache files

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-14 00:29:39 +09:00

149 lines
5.8 KiB
Python

from fastapi import FastAPI, Request
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from fastapi.responses import HTMLResponse
from database import engine, Base
import uvicorn
from routers import (
auth,
system_admin,
franchise,
stores,
users,
store_settings,
class_management,
waiting,
waiting_board,
members,
daily_closing,
daily_closing,
sse,
sse,
statistics,
sse,
statistics,
attendance,
logs # New Logger Router
)
from core.logger import logger
import time
from starlette.middleware.base import BaseHTTPMiddleware
app = FastAPI(title="Waiting System")
# 데이터베이스 테이블 생성
Base.metadata.create_all(bind=engine)
# 정적 파일 및 템플릿 설정
app.mount("/static", StaticFiles(directory="static"), name="static")
app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates")
# Logging Middleware
class RequestLoggingMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
start_time = time.time()
# Log Request
logger.info(f"Incoming Request: {request.method} {request.url.path}")
try:
response = await call_next(request)
# Log Response
process_time = time.time() - start_time
logger.info(f"Request Completed: {request.method} {request.url.path} - Status: {response.status_code} - Time: {process_time:.4f}s")
return response
except Exception as e:
logger.error(f"Request Failed: {request.method} {request.url.path} - Error: {str(e)}", exc_info=True)
raise e
app.add_middleware(RequestLoggingMiddleware)
# 라우터 등록
# 인증 및 관리 라우터
app.include_router(auth.router, prefix="/api/auth", tags=["Authentication"])
app.include_router(system_admin.router, prefix="/api/system", tags=["System Administration"])
app.include_router(franchise.router, prefix="/api/franchise", tags=["Franchise Management"])
app.include_router(statistics.router, prefix="/api/franchise/stats", tags=["Franchise Statistics"])
app.include_router(stores.router, prefix="/api/stores", tags=["Store Management"])
app.include_router(users.router, prefix="/api/users", tags=["User Management"])
# 매장 운영 라우터
app.include_router(store_settings.router, prefix="/api/store", tags=["Store Settings"])
app.include_router(class_management.router, prefix="/api/classes", tags=["Class Management"])
app.include_router(waiting.router, prefix="/api/waiting", tags=["Waiting"])
app.include_router(waiting_board.router, prefix="/api/board", tags=["Waiting Board"])
app.include_router(members.router, prefix="/api/members", tags=["Members"])
app.include_router(daily_closing.router, prefix="/api/daily", tags=["Daily Closing"])
app.include_router(daily_closing.router, prefix="/api/daily", tags=["Daily Closing"])
app.include_router(attendance.router, prefix="/api/attendance", tags=["Attendance"])
app.include_router(attendance.router, prefix="/api/attendance", tags=["Attendance"])
app.include_router(sse.router, prefix="/api/sse", tags=["SSE"])
app.include_router(logs.router) # Log Viewer Router
@app.get("/", response_class=HTMLResponse)
async def home(request: Request):
"""메인 페이지"""
return templates.TemplateResponse("index.html", {"request": request})
@app.get("/board", response_class=HTMLResponse)
async def waiting_board_page(request: Request):
"""대기현황판 페이지"""
return templates.TemplateResponse("waiting_board.html", {"request": request})
@app.get("/reception", response_class=HTMLResponse)
async def reception_page(request: Request):
"""데스크 대기접수 페이지"""
return templates.TemplateResponse("reception.html", {"request": request})
@app.get("/mobile", response_class=HTMLResponse)
async def mobile_page(request: Request):
"""모바일 대기접수 페이지"""
return templates.TemplateResponse("mobile.html", {"request": request})
@app.get("/manage", response_class=HTMLResponse)
async def manage_page(request: Request):
"""대기자 관리 페이지"""
return templates.TemplateResponse("manage.html", {"request": request})
@app.get("/members", response_class=HTMLResponse)
async def members_page(request: Request):
"""회원 관리 페이지"""
return templates.TemplateResponse("members.html", {"request": request})
@app.get("/settings", response_class=HTMLResponse)
async def settings_page(request: Request):
"""매장 설정 페이지"""
return templates.TemplateResponse("settings.html", {"request": request})
@app.get("/attendance", response_class=HTMLResponse)
async def attendance_page(request: Request):
"""출석 조회 페이지"""
return templates.TemplateResponse("attendance.html", {"request": request})
@app.get("/reception-login", response_class=HTMLResponse)
async def reception_login_page(request: Request):
"""태블릿 대기접수 로그인 페이지"""
return templates.TemplateResponse("reception_login.html", {"request": request})
@app.get("/login", response_class=HTMLResponse)
async def login_page(request: Request):
"""로그인 페이지"""
return templates.TemplateResponse("login.html", {"request": request})
@app.get("/admin", response_class=HTMLResponse)
async def admin_page(request: Request):
"""프랜차이즈 관리 페이지"""
return templates.TemplateResponse("admin.html", {"request": request})
@app.get("/superadmin", response_class=HTMLResponse)
async def superadmin_page(request: Request):
"""시스템 관리자 페이지"""
return templates.TemplateResponse("superadmin.html", {"request": request})
if __name__ == "__main__":
uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)