Skip to content

sc303030/gym_web

Repository files navigation

체육관 대관 공지사항 시스템

Django와 Bootstrap을 이용한 학교 체육관 대관 공지사항 관리 시스템입니다.

데모 영상

PC 버전

PC 데모

모바일 버전

모바일 데모

주요 기능

  1. 공지사항 관리

    • 학교별 체육관 대관 공지사항 등록
    • 공지사항 제목, 내용, 접수 기간, 대관 기간 등 관리
    • PDF 파일 첨부 및 미리보기 기능
  2. 학교 관리

    • 서울시 공립학교 975개 자동 등록 (초/중/고)
    • 학교 이름, 지역, 학교 종류, 홈페이지 주소 관리
    • 학교별 공지사항 조회
  3. 자동 수집 시스템

    • 메인 화면의 공지 섹션에서 키워드 기반 자동 저장(onclick 링크 지원)
    • APScheduler 스케줄:
      • 09:05, 15:05 메인 공지 키워드 스캔 실행
    • 수동 명령어로 초기화/저장/홈페이지 갱신 지원
    • LLM(Ollama) 기반 날짜 추출 및 파싱
      • PDF/HWP 첨부 파일에서 접수 기간과 대관 기간 자동 추출
      • 자세한 내용은 README_LLM_SEARCH.md 참조
  4. 사용자 인터페이스

    • Bootstrap 5를 이용한 반응형 디자인
    • 다양한 뷰 모드 지원:
      • 카드형: 공지사항을 카드 레이아웃으로 보기 편하게 표시
      • 리스트형: 테이블 형태로 정보를 한눈에 비교
      • 캘린더: 접수 기간과 대관 기간을 달력으로 시각화
    • 강력한 필터링 및 검색 기능
    • 지역별, 학교 종류별, 기간별 필터링
    • 상세 페이지에서 PDF 미리보기 및 다운로드
    • 공지사항 수정 기능

설치 및 실행

1. 가상환경 활성화

source venv/bin/activate

2. 패키지 설치

pip install -r requirements.txt

3. 데이터베이스 마이그레이션

python manage.py makemigrations
python manage.py migrate

4. 서울시 공립학교 데이터 로딩

python load_schools_from_csv.py

5. 관리자 계정 생성

python manage.py createsuperuser

6. 수동 수집/테스트 (선택사항)

# (신규) 특정 학교 메인 공지에서 키워드 저장
python manage.py fetch_keyword_notices --school-name 가락고 --limit 1

# (신규) 모든 학교의 메인 공지 섹션 감지 후 crawl_config 초기화
python manage.py init_school_crawl_config --limit 50

# (신규) 네이버 검색으로 홈페이지 갱신(비어있는 학교만)
python manage.py update_school_homepages --only-empty --sleep 1.0

7. 서버 실행

python manage.py runserver

서버가 시작되면 http://127.0.0.1:8000/ 에서 웹사이트를 확인할 수 있습니다.

데이터베이스 구조

School (학교) 테이블

  • name: 학교 이름
  • region: 지역
  • school_type: 학교 종류 (초등학교/중학교/고등학교)
  • homepage: 홈페이지 주소
  • phone_number: 행정실 전화번호
  • crawl_config: 크롤링 설정(JSON, 메인 공지 selector, onclick 함수 등)
  • created_at: 생성일
  • updated_at: 수정일

Notice (공지사항) 테이블

  • school: 학교 (외래키)
  • title: 공지사항 제목
  • link_url: 링크 주소
  • content: 공지사항 내용
  • attached_file: 첨부파일 (레거시, 하위 호환용)
  • registration_start: 접수 시작일
  • registration_end: 접수 마감일
  • rental_start: 대관 시작일
  • rental_end: 대관 종료일
  • is_registration_completed: 접수 완료 여부
  • created_at: 생성일
  • updated_at: 수정일

NoticeAttachment (첨부파일) 테이블

  • notice: 공지사항 (외래키)
  • file: 첨부 파일 (PDF, HWP 등)
  • original_filename: 원본 파일명
  • file_size: 파일 크기 (bytes)
  • uploaded_at: 업로드 일시

페이지 구성

  1. 공지사항 목록 (/notices/)

    • 3가지 뷰 모드: 카드형, 리스트형, 캘린더
    • 학교 이름, 접수 기간, 대관 기간 표시
    • 지역별, 학교 종류별, 기간별 필터링
    • 키워드 검색 기능
  2. 학교 목록 (/schools/)

    • 서울시 모든 공립학교 목록
    • 학교별 공지사항 개수 표시
    • 지역별, 학교 종류별 필터링
    • 홈페이지 링크 제공
  3. 공지사항 상세 (/notices/<공지사항ID>/)

    • 공지사항 전체 정보 표시
    • PDF 미리보기 및 다운로드
    • 원본 링크 연결
  4. 공지사항 수정 (/notices/<공지사항ID>/edit/)

    • 모든 필드 수정 가능
    • PDF 파일 교체 가능
  5. 관리자 페이지 (/admin/)

    • Django admin을 통한 데이터 관리

수집 시스템

자동(스케줄)

  • 서버 시작 시 스케줄러 실행
  • 매일 09:05, 15:05: 메인 화면 공지 섹션 스캔 후 키워드 매칭 저장
  • 사이트별 JS onclick 링크도 실제 URL로 변환하여 저장

수동 실행

# 특정 학교(메인 공지)에서 키워드 저장
python manage.py fetch_keyword_notices --school-name 가락고 --limit 2

# 메인 공지 섹션 selector/onclick 자동 추출하여 crawl_config 저장
python manage.py init_school_crawl_config

# 네이버 검색으로 홈페이지 자동 갱신
python manage.py update_school_homepages --only-empty

키워드 세트(기본)

  • 시설, 대관, 체육관, 대여, 장기, 임대, 학교시설, 허가, 장기사용, 허가신청, 개방

필요 시 fetch_keyword_notices --keyword "대관"처럼 개별 키워드로도 실행할 수 있습니다.

기술 스택

  • Backend: Django 5.2.7
  • Frontend: Bootstrap 5.3.0
  • Database: SQLite (개발용)
  • Crawler: Requests + BeautifulSoup4
  • Scheduler: APScheduler 3.11.0
  • LLM: Ollama (qwen2.5:7b-instruct)
  • Python: 3.13

향후 개발 계획

  • 알림 기능 (새로운 공지사항 발견 시 이메일/SMS 알림)
  • 크롤링 성능 개선 (비동기 처리)
  • 더 정교한 키워드 필터링
  • LLM 기반 공지사항 요약 및 중요 정보 추출 개선
  • 사용자 맞춤형 공지사항 추천

화면 스크린샷

공지사항 - 카드형

PC Mobile
공지사항 카드형 PC 공지사항 카드형 Mobile

공지사항 - 리스트형

PC Mobile
공지사항 리스트형 PC 공지사항 리스트형 Mobile

공지사항 - 캘린더

PC Mobile
공지사항 캘린더 PC 공지사항 캘린더 Mobile

학교 목록

PC Mobile
학교 목록 PC 학교 목록 Mobile

About

기존 gym프로젝트를 웹으로 구현

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages