Skip to content

Latest commit

 

History

History
242 lines (195 loc) · 7.32 KB

File metadata and controls

242 lines (195 loc) · 7.32 KB

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

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