ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證연수·이벤트 통합 모니터링
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗교원 연수·이벤트 통합 모니터링 시스템.
티처빌(JSON API)·한국교원연수원(HTML+AJAX)·중앙교육연수원(HTML)·YBM의 공개 연수·이벤트 목록을 수집하고
브라우저에서 검색·필터·정렬하는 내부 테스트용 프로젝트.
⚠️ 비로그인 공개 데이터만 사용합니다. 운영 전 각 사이트의 이용약관 및 robots.txt를 반드시 확인하세요.
| 기관 | 연수 | 이벤트 |
|---|---|---|
| 티처빌 (teacherville) | ✅ | ✅ |
| 한국교원연수원 (hstudy) | ✅ | ✅ |
| 중앙교육연수원 (neti) | ✅ | — |
| YBM (ybm) | — | ✅ |
ice-planner-project/
├── course-api/ # Express.js REST API 서버 (보조)
└── course-next-api/ # Next.js 15 App Router (메인 앱)
외부 API(티처빌)를 래핑하는 보조 서버.
메인 애플리케이션.
디렉터리 구조:
course-next-api/
├── app/
│ ├── page.js # 컨트롤러 (상태·필터·정렬, UI 마크업 금지)
│ ├── globals.css
│ └── api/ # App Router API Routes (연수)
├── pages/api/ # 레거시 API Routes (이벤트)
├── components/ # UI 컴포넌트
└── lib/ # 수집·캐시·필터 로직
cd course-api
npm run dev # 개발 서버 (포트 3000)
npm start # 프로덕션
cd course-next-api
npm run dev # 개발 서버
npm run build # 빌드
npm start # 프로덕션
npm start -- -p 3010 # 포트 지정 실행
환경변수는 course-next-api/.env.local에 설정합니다.
| 변수명 | 설명 |
|---|---|
TEACHERVILLE_BASE_URL | 티처빌 베이스 URL |
LIST_CACHE_TTL_MS | 목록 캐시 유지 시간 (ms) |
DETAIL_CACHE_TTL_MS | 상세 캐시 유지 시간 (ms) |
REQUEST_DELAY_MS | 외부 요청 간격 (ms) |
PAGE_SIZE | 페이지당 수집 수 |
MAX_PAGES | 최대 수집 페이지 수 |
MAX_COURSE_COUNT | 최대 수집 강의 수 |
MAX_EXTERNAL_REQUESTS | 최대 외부 요청 횟수 |
app/api/)| 경로 | 설명 |
|---|---|
/api/all-courses | 티처빌 전체 목록 |
/api/ai-courses | 티처빌 AI 연수 목록 |
/api/hstudy-courses | 한국교원연수원 목록 |
/api/neti-courses | 중앙교육연수원 목록 |
/api/course/[goodsCode] | 티처빌 단건 상세 |
/api/recommend-ids | 추천 강의 ID 목록 |
pages/api/)| 경로 | 설명 |
|---|---|
/api/teacherville-events | 티처빌 이벤트 |
/api/hstudy-events | 한국교원연수원 이벤트 |
/api/ybm-events | YBM 이벤트 |
App Router 마이그레이션 전 구버전입니다.
app/api/내_*_backup/디렉터리는 비활성 백업본입니다.
components/)| 파일 | 역할 |
|---|---|
CourseCard.jsx | 연수 카드 · 검색어 하이라이트 · 즐겨찾기 별표 · 무료 배지 |
CourseList.jsx | 연수 목록 렌더링 |
CourseCardSkeleton.jsx | 연수 카드 로딩 스켈레톤 |
EventCard.jsx | 이벤트 카드 · 즐겨찾기 별표 · 마감 임박 배지 |
EventList.jsx | 이벤트 목록 렌더링 |
EventCardSkeleton.jsx | 이벤트 카드 로딩 스켈레톤 |
DetailPanel.jsx | 우측 연수 상세 패널 |
EmptyResult.jsx | 검색·필터 0건 빈 상태 UI |
CacheStatusPanel.jsx | 캐시 상태(meta) 표시 패널 |
UI 마크업은 반드시
components/에 둡니다.app/page.js는 컨트롤러 역할만 합니다.
localStorage(iceRecentSearches) 최신 8개, 입력창 포커스 시 드롭다운localStorage(iceFavorites, ID 배열). 연수·이벤트 공용, "★ 즐겨찾기만" 토글로 필터q · provider · sort · category · credit · price · type · tab · favURLSearchParams 복원, 상태 변경 시 window.history.replaceStatemarkNewCourses)price === 0| Provider | 방식 | 비고 |
|---|---|---|
| 티처빌 | JSON API (POST) | totalCount 기반 페이지 계산 |
| 한국교원연수원 | HTML + cheerio | sub2.asp → sub2_ajax.asp, loopCnt 반복 |
| 중앙교육연수원 | HTML + cheerio | pageIndex 기반 페이지네이션 |
| YBM | HTML + cheerio | 이벤트 전용 |
s / neti = n| 기능 | 티처빌 | 한국교원연수원 | 중앙교육연수원 | YBM |
|---|---|---|---|---|
| 연수 목록 | 가능 | 가능 | 가능 | 미지원 |
| 이벤트 목록 | 가능 | 가능 | 미지원 | 가능 |
| 상세 API | 가능 | 불가 | 불가 | — |
| 외부 상세 링크 | 가능 | 가능 | 가능 | 가능 |
| 패키지 연수 | 있음 | 없음 | 없음 | — |
| 리뷰/찜 수 | 있음 | 없음 | 없음 | — |
없는 데이터는 생성하지 않으며, provider별 기능 차이를 UI에 그대로 반영합니다.
상세는 티처빌만 내부 API를 사용하고, 나머지는 외부 페이지로 이동합니다 (detailUrl우선).
| 대상 | 유지 시간 |
|---|---|
| 목록 | 24시간 |
| 상세 | 1시간 |
| 추천 | 12시간 |
| 정렬 | 기준 |
|---|---|
| 최신순 | sortDate 내림차순 (없으면 뒤로) |
| 인기순 | reviewCount × 2 + wishCount |
| 추천순 | isRecommended × 100 + reviewCount × 3 + wishCount + (패키지 ? 10 : 0) |
icn1, 설정은 course-next-api/vercel.json)totalCount 하드코딩