아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Trang web hỗ trợ người chạy bộ ở Đà Nẵng: kiểm tra thời tiết, AQI, UV theo giờ → chấm điểm thuận lợi bằng công thức minh bạch → AI Coach giải thích bằng lời, trả lời câu hỏi và làm giúp (tạo cung, đổi kế hoạch, mở tab) → mô tả cung chạy bằng lời, AI tìm địa điểm và vẽ đường trên Google Maps → chạy với GPS → đánh giá khuyến nghị sau buổi chạy → dữ liệu lưu vào tài khoản người chạy (Google Sheet) để AI gợi ý cá nhân hoá và lập kế hoạch tuần.
Hướng dẫn cài đặt Google Maps, Google Sheet và biến môi trường: SETUP_V9.md.
| File | Vai trò |
|---|---|
index.html | Khung trang (HTML) + bộ biểu tượng Lucide |
css/vendor/open-props.subset.css | Biến thiết kế Open Props (MIT): chuyển động, bo góc, bóng, cỡ chữ |
css/app.css | Giao diện gốc V4–V9 |
css/clean.css | Lớp V9.2: chữ gọn, trang chủ "Bây giờ" + danh mục, trang Thời tiết, bảng chọn khu vực |
css/mobile.css | Lớp thiết kế V9.1 ưu tiên điện thoại: chữ, nút + hiệu ứng nhấn, thanh tab, lộ trình 5 bước |
js/app.js | Logic phía trình duyệt (chấm điểm, bản đồ, GPS, AI Coach, tài khoản) |
js/hub.js | Trang chủ (thẻ Bây giờ + danh mục), trang Thời tiết theo khung giờ cho từng khu vực, bảng chọn khu vực |
js/runlab.js | Độ cao & độ dốc cung chạy, thẻ chất lượng cung đường, bản đồ hành trình mỗi buổi chạy (chỉ lưu trên máy), chia km, tải GPX |
js/runmode.js | Bản đồ cung chạy toàn màn hình (chạm chọn điểm xuất phát, vẽ cung), chế độ chạy toàn màn hình, nút Theo dõi, giọng chỉ đường từng chỗ rẽ |
js/ui.js | Tương tác giao diện: gợn sóng/rung khi chạm, thanh lộ trình tự sáng, tiểu mục Nhật ký |
js/boot.js | Báo lỗi nếu script chính không khởi động (sửa cache) |
server.js | Máy chủ Node (không cần thư viện ngoài): phục vụ trang, proxy Open-Meteo, AI Coach (OpenAI), Google Places/Routes, GraphHopper, tài khoản, phản hồi |
api/index.js, vercel.json | Chạy cùng code trên Vercel (serverless) |
apps-script/Code.gs | Apps Script dán vào Google Sheet để lưu người chạy, buổi chạy, kế hoạch, đánh giá, góp ý |
tests/run-tests.js | Kiểm thử nhanh: npm test |
node server.js # mở http://localhost:10000
OPENAI_API_KEY=sk-... GOOGLE_MAPS_BROWSER_KEY=AIza... node server.js
| Biến | Bắt buộc | Ý nghĩa |
|---|---|---|
OPENAI_API_KEY | Có (để bật AI) | Khóa OpenAI, chỉ nằm trên máy chủ |
OPENAI_MODEL | Không | Mặc định gpt-4.1-mini; tự thử gpt-4o-mini nếu model không dùng được |
GOOGLE_MAPS_BROWSER_KEY | Không (khuyên dùng) | Khóa Maps JavaScript API, giới hạn theo website. Thiếu thì dùng OpenFreeMap |
GOOGLE_MAPS_SERVER_KEY | Không (khuyên dùng) | Khóa Places API (New) + Routes API, chỉ nằm trên máy chủ. Dùng để tìm địa điểm và vẽ đường đi bộ |
SHEETS_WEBAPP_URL | Không | URL /exec của Apps Script → bật tài khoản người chạy và lưu dữ liệu vào Google Sheet |
SHEETS_SECRET | Cùng với trên | Chuỗi bí mật, phải giống AIRUN_SECRET trong Apps Script |
SESSION_SECRET | Không | Khóa ký phiên đăng nhập (nếu thiếu sẽ tự suy ra từ SHEETS_SECRET) |
GRAPHHOPPER_API_KEY | Không | Tạo cung vòng bằng GraphHopper. Thiếu thì dùng Google Routes, rồi Valhalla (OpenStreetMap) |
GOOGLE_MAPS_BASEMAP | Không | Đặt 1 để dùng bản đồ nền Google. Mặc định tắt: Google không tính phí Maps cho tài khoản thanh toán ở Việt Nam nên bản đồ nền bị từ chối; AIRUN dùng OpenFreeMap. Tìm địa điểm/vẽ cung bằng Google (khóa máy chủ) vẫn chạy |
ELEVATION_BASE | Không | Mặc định https://api.open-meteo.com/v1/elevation |
MAPBOX_PUBLIC_TOKEN | Không | Token pk. (chỉ dùng khi không có Google Maps) |
FEEDBACK_WEBHOOK_URL, ADMIN_TOKEN | Không | Cách lưu phản hồi cũ (V8), vẫn hoạt động |
GET /api/config – tính năng nào đang bật (không trả khóa bí mật; khóa Google cho trình duyệt là khóa công khai đã giới hạn website)GET /api/weather/:lat/:lon, GET /api/air/:lat/:lon – Open-Meteo, có dự báo theo giờPOST /api/coach – mode: plan | chat | agent | route_intent | weekly | run | liveGET /api/places?q=&lat=&lon= – tìm địa điểm (Google Places, dự phòng OpenStreetMap)GET /api/route?lat=&lon=&km=&seed= – cung vòng theo số kmPOST /api/elevation – {points:[{lat,lon}]} (≤100 điểm) → độ cao từ Open-Meteo Elevation (miễn phí)POST /api/route/plan – {start, waypoints[], km, loop} → cung chạy qua các điểmPOST /api/account/register | login, GET /api/account/me, POST /api/account/log – tài khoản tên + mã PINPOST /api/feedback, POST /api/app-feedback, GET /api/feedback/summaryRepo đã kết nối Vercel: mỗi lần push lên main sẽ tự deploy. Thêm/đổi biến môi trường ở Vercel → Settings → Environment Variables rồi Redeploy. Kiểm tra https://airun-da-nang.vercel.app/api/config.