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>
This commit is contained in:
2025-12-14 00:29:39 +09:00
parent dd1322625e
commit f699a29a85
120 changed files with 35602 additions and 0 deletions

148
main.py Normal file
View File

@@ -0,0 +1,148 @@
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)