เว็บ Landing Page แบบ Static สำหรับสาขา Software Engineering BUU
หน้าเว็บหลักอยู่ที่ index.html และโหลดข้อมูลคอนเทนต์จากไฟล์ JSON/Markdown ในโฟลเดอร์ data/
.
├── index.html # หน้าเว็บหลัก
├── input.css # Tailwind input (@tailwind base/components/utilities)
├── style.min.css # CSS ที่ build แล้ว (ไฟล์ที่หน้าเว็บใช้งานจริง)
├── tailwind.config.js # Tailwind config (scan index.html + data/*.json)
├── scripts/
│ └── generate-hero-images.mjs
├── images/ # รูปทั่วไป (เช่น hero, timeline photos)
└── data/
├── admission.json
├── contact.json
├── faq.json
├── future-work.json
├── hero-images.json
├── partners.json
├── partners/ # โลโก้พาร์ทเนอร์
├── portal.json
├── quick-links.json
├── tech-stack.json
├── timeline.json
├── timeline/ # เนื้อหา markdown รายปี (year-1.md ... year-4.md)
└── usp.json
ควรเปิดผ่าน HTTP server (ไม่ใช่
file://) เพราะมีการfetch()ข้อมูลจากdata/*.jsonและdata/timeline/*.md
ตัวอย่าง:
cd /path/to/se-landing-page
python3 -m http.server 5500แล้วเปิด http://localhost:5500
ใช้ HTTP server ที่รองรับ static files เช่น Nginx, Apache, หรือบริการ hosting ต่างๆ (Netlify, Vercel, GitHub Pages ฯลฯ)
ชี้ไปที่โฟลเดอร์โปรเจกต์นี้เป็น root directory ของเว็บ ขั้นตอนการ setup ของ nginx ตัวอย่าง:
server {
listen 80;
server_name your-domain.com;
root /path/to/se-landing-page;
location / {
try_files $uri $uri/ =404;
}
}ก่อน deploy แนะนำให้เช็กอย่างน้อย:
- รัน
node scripts/generate-hero-images.mjs(อัปเดต hero manifest) - รัน
node scripts/sync-seo-geo.mjsเพื่ออัปเดตวันที่ SEO/GEO ทุกไฟล์ที่เกี่ยวข้อง - ถ้าแก้ UI/Tailwind ให้ build
style.min.cssใหม่ - ทดสอบเปิดเว็บผ่าน HTTP server และเช็กว่า section ที่โหลดข้อมูล (
Timeline,Partners,FAQ,Portalฯลฯ) แสดงครบ
ตัวเลือกใน CI (กันลืมอัปเดต hero manifest):
node scripts/generate-hero-images.mjs
node scripts/sync-seo-geo.mjs
git diff --exit-code data/hero-images.jsonโปรเจกต์นี้เพิ่ม Technical SEO + GEO (AI discoverability) ไว้แล้ว โดยไม่เปลี่ยนพฤติกรรมโหลดข้อมูลเดิม
ไฟล์ที่เกี่ยวข้องโดยตรง:
index.html(meta tags, canonical/hreflang, Open Graph, Twitter card, JSON-LD)robots.txt(crawl policy + sitemap discovery)_headers(security headers ที่ไม่ขัด crawl/index/render)sitemap.xml(single-page sitemap)llms.txt,llms-full.txt(เอกสารสำหรับ AI ingestion)
หน้า index.html มี JSON-LD graph ที่ประกอบด้วย:
WebSiteCollegeOrUniversityCourseFAQPage
ข้อมูล FAQ และช่องทางติดต่อใน JSON-LD ถูกสร้างจากไฟล์:
data/faq.jsondata/contact.json
ข้อมูลคำอธิบายหลักสูตรใน JSON-LD ถูกใช้จาก:
data/program-overview.json
- เปลี่ยนข้อมูลรับสมัคร: แก้
data/admission.jsonและdata/admission-timeline.json - เปลี่ยนรายละเอียดหลักสูตร: แก้
data/program-overview.json - เปลี่ยน FAQ: แก้
data/faq.json(จะสะท้อนใน FAQPage schema อัตโนมัติ) - เปลี่ยนช่องทางติดต่อ/โซเชียล: แก้
data/contact.json(จะสะท้อนในsameAs/contactPoint) - รันสคริปต์ sync freshness:
node scripts/sync-seo-geo.mjsถ้าต้องการระบุวันที่เอง:
node scripts/sync-seo-geo.mjs 2026-04-02- เปิดหน้าเว็บจริง (production URL) ใน Rich Results Test
- https://search.google.com/test/rich-results
- ต้องเห็น entity หลัก (อย่างน้อย FAQPage และ schema อื่นที่รองรับ)
- ตรวจ Schema ทั้งหมดด้วย Schema Markup Validator
- https://validator.schema.org/
- ต้องไม่มี error ระดับโครงสร้าง
- รัน Lighthouse SEO
- Chrome DevTools > Lighthouse > SEO
- ตรวจ canonical, meta description, crawlability, status code
- ตรวจ robots + sitemap
https://se.informatics.buu.ac.th/robots.txthttps://se.informatics.buu.ac.th/sitemap.xml
- ห้ามให้ข้อความบนหน้าเว็บขัดกับข้อมูลใน
data/*.json - ห้ามให้ JSON-LD ขัดกับข้อมูลที่แสดงจริงบนหน้า (เช่น จำนวนหน่วยกิต, ชื่อหลักสูตร, รอบรับสมัคร)
- หลีกเลี่ยงการใส่ property schema ที่ไม่มีข้อมูลจริง
- ถ้าข้อมูลไม่พอ ให้ระบุ TODO ชัดเจนแทนการเดา
- เพิ่ม URL เอกสารหลักสูตรจริงใน
data/program-overview.json>curriculumDocuments[].url - เพิ่มช่องทางอีเมล/โทรศัพท์ทางการใน
data/contact.jsonเพื่อทำContactPointที่สมบูรณ์ขึ้น - หากมีโลโก้ทางการหลายขนาด ให้เพิ่มไฟล์ภาพสำหรับ social sharing โดยเฉพาะ (เช่น 1200x630)
ใน index.html มีการโหลดข้อมูลผ่าน fetch จากไฟล์เหล่านี้:
data/usp.jsondata/admission.jsondata/timeline.jsondata/tech-stack.jsondata/portal.jsondata/quick-links.jsondata/contact.jsondata/faq.jsondata/future-work.jsondata/partners.jsondata/hero-images.json
data/timeline.jsonเป็น metadata ของแต่ละปี (year,title,contentFile,images,imageAlt)- เนื้อหาหลักของแต่ละปีอยู่ใน
data/timeline/year-*.md - รูปใน Timeline ใช้จาก
imagesarray ของแต่ละ item ในtimeline.json
ไฟล์ที่หน้าเว็บใช้งานคือ style.min.css (ลิงก์จาก index.html)
ถ้ามีการแก้ class หรือโครงหน้าเว็บ แล้วต้องการ build CSS ใหม่:
npx tailwindcss@3.4.17 -i ./input.css -o ./style.min.css --minifyโหมด watch ระหว่างพัฒนา:
npx tailwindcss@3.4.17 -i ./input.css -o ./style.min.css --watchหมายเหตุ: โปรเจกต์นี้ใช้รูปแบบ config/input แบบ Tailwind v3 (
input.css+tailwind.config.js) จึงแนะนำให้ pin เป็นtailwindcss@3.4.17
Hero carousel อ่านรายการรูปจาก data/hero-images.json เพื่อรองรับ production ที่มักไม่เปิด directory listing
เมื่อมีการเพิ่ม/ลบรูปใน images/:
node scripts/generate-hero-images.mjsสคริปต์จะ:
- สแกน
images/แบบ recursive - รวมไฟล์นามสกุล
.png,.jpg,.jpeg,.gif,.webp,.svg,.avif - เขียนรายการลง
data/hero-images.json
แนะนำให้ commit ทั้งไฟล์รูปและ data/hero-images.json พร้อมกัน
พาร์ทเนอร์ใช้งานข้อมูลจาก data/partners.json และรูปโลโก้ใน data/partners/
ตัวอย่าง item:
{ "name": "ชื่อองค์กร", "logo": "./data/partners/your-logo.png" }ขั้นตอนเพิ่มพาร์ทเนอร์:
- วางไฟล์โลโก้ใน
data/partners/ - เพิ่ม/แก้รายการใน
data/partners.json - รีเฟรชหน้าเว็บตรวจสอบการแสดงผล
แก้เนื้อหา Timeline รายปีได้ที่ data/timeline/year-1.md ถึง year-4.md
แนวทาง:
- ใช้ Markdown มาตรฐาน (
##, รายการ-,**ตัวหนา**) - ถ้าจะเพิ่มปีใหม่ ให้เพิ่ม item ใน
data/timeline.json contentFileต้องชี้ไปไฟล์.mdที่ถูกต้อง
สามารถ fork โปรเจกต์นี้แล้วแก้ไขตามความต้องการ
made with ❤️ by BSO Space | SE#12