- 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>
149 lines
5.8 KiB
Python
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)
|