ระบบบริหารสถานศึกษาแบบเว็บ สำหรับโรงเรียนมัธยม: ทะเบียนบุคลากร · ทะเบียนนักเรียน · รายวิชา · ลงทะเบียนเรียนและผลการเรียน · งานสารบรรณ (หนังสือเวียน) ในระบบเดียว สร้างบน Now.js (ฝั่งเบราว์เซอร์) และ Kotchasan (ฝั่ง PHP) ใช้ได้ทั้งบนคอมพิวเตอร์และมือถือ (PWA)
รุ่น 7.0.4 · PHP 7.4+ · MySQL/MariaDB · MIT License
English — A web-based school management system for secondary schools: personnel and student registers, courses, enrollment and grades (with a configurable score-to-grade table and the Thai grade marks ร. มส. มผ. ผ.), and an e-document (official circular) module. Built on Now.js and Kotchasan; includes member management, permissions, multi-language UI (Thai/English), LINE/Telegram login and notifications. The interface and documentation are in Thai.
- ทะเบียนบุคลากร: ตำแหน่ง กลุ่มสาระ/แผนก ลำดับการแสดง ครูประจำชั้น ที่อยู่ รูปถ่าย
- สถานะ บุคลากรปัจจุบัน / ในอดีต (เกษียณ ย้าย) — คนในอดีตไม่ปรากฏในรายชื่อทั่วไปแต่ข้อมูลไม่หาย
- นำเข้า/ส่งออกรายชื่อด้วย CSV (UTF-8 หรือ TIS-620) พร้อมไฟล์ตัวอย่างให้ดาวน์โหลด
- หมวดหมู่ (ตำแหน่ง แผนก) แก้ได้ทั้งไทยและอังกฤษ และเพิ่มชนิดหมวดหมู่เองได้โดยไม่ต้องแก้โค้ด
- ทะเบียนนักเรียน: เลขประจำตัว เลขที่ ชั้น ห้อง แผนการเรียน ผู้ปกครอง รูปถ่าย · ย้ายชั้น/ห้อง · จบการศึกษา
- รายวิชา แยกตามปีการศึกษา/ภาคเรียน ชนิด (พื้นฐาน เพิ่มเติม กิจกรรม) หน่วยกิต ชั่วโมง และครูผู้สอน
- ลงทะเบียนเรียน เลือกนักเรียนทั้งห้องเข้ารายวิชาในครั้งเดียว
- ผลการเรียน กรอกคะแนนกลางภาค/ปลายภาค แล้วระบบคิดเกรดตามตารางที่ตั้งไว้ (หรือกรอกเกรดเองก็ได้) รองรับผลพิเศษ ร. มส. มผ. ผ. · ดาวน์โหลดผลการเรียนรายวิชาเป็น CSV
- ใบรายงานผลการเรียน รายภาคเรียน พร้อมหน่วยกิตรวมและเกรดเฉลี่ย (นักเรียนดูของตัวเองได้)
- นำเข้านักเรียน รายวิชา และผลการเรียนจาก CSV
- ส่งหนังสือเวียนพร้อมไฟล์แนบ (ชนิดและขนาดไฟล์กำหนดได้) เลือกผู้รับตามสถานะสมาชิก ระบุความเร่งด่วน (ด่วนมาก/ด่วน/ปกติ)
- ออกเลขที่หนังสืออัตโนมัติตามรูปแบบที่กำหนด เช่น
ที่ ศธ%Y%M-%04d - ผู้รับเห็นเอกสารใหม่ที่หน้าแรกและในหน้า เอกสารรับ — การดาวน์โหลดถือเป็นการลงชื่อรับ
- ผู้ส่งดู ประวัติการดาวน์โหลด ได้ว่าใครรับแล้ว กี่ครั้ง เมื่อไร · แจ้งผู้รับทางอีเมลได้
| กลุ่ม | รายละเอียด |
|---|---|
| สมาชิก | เข้าสู่ระบบ · ลืม/ตั้งรหัสผ่านใหม่ · โปรไฟล์ · กันเดารหัสผ่าน (ล็อกเมื่อพยายามผิดซ้ำ) · เข้าสู่ระบบด้วย Google / Facebook / LINE / Telegram |
| สิทธิ์ | กำหนดสิทธิ์รายฟีเจอร์ · สถานะสมาชิก (นักเรียน ผู้ดูแลระบบ ครู-อาจารย์ บริหาร) |
| ตั้งค่า | ทั่วไป · ข้อมูลองค์กร · ธีม · อีเมล (SMTP) · API · LINE · Telegram · SMS · จัดการภาษา · ประวัติการใช้งาน |
| หลายภาษา | ไทย/อังกฤษ · แก้คำแปลผ่านหน้าเว็บได้ |
| PWA | ติดตั้งลงหน้าจอมือถือได้ · ทำงานออฟไลน์บางส่วน |
| ความปลอดภัย | CSRF ทุก POST · JWT/คุกกี้ · Content-Security-Policy · รหัสผ่านเก็บแบบ bcrypt · กันไฟล์ภายในผ่าน .htaccess |
เมนูและหน้าจอแสดงตามสิทธิ์ของผู้ใช้ ผู้ดูแลระบบกำหนดสิทธิ์ได้ที่ ตั้งค่า → สิทธิ์ หรือในฟอร์มบุคลากร
| สิทธิ์ | ทำอะไรได้ |
|---|---|
can_manage_personnel |
จัดการบุคลากรทั้งหมด (เพิ่ม แก้ ลบ นำเข้า) |
can_manage_student |
จัดการทะเบียนนักเรียน |
can_manage_course |
จัดการรายวิชาทุกวิชา และนำเข้ารายวิชา |
can_teacher |
จัดการรายวิชาที่ตัวเองสอน ลงทะเบียนนักเรียนในวิชานั้น |
can_rate_student |
ให้คะแนน/ผลการเรียนในรายวิชาที่รับผิดชอบ |
can_upload_edocument |
ส่งหนังสือเวียนและดูหนังสือที่ส่ง |
can_handle_all_edocument |
ผู้จัดการงานสารบรรณ — แก้/ลบ/ดูประวัติการรับของหนังสือทุกฉบับ |
can_config |
ตั้งค่าระบบและตั้งค่าโมดูล |
- นักเรียน ดูได้เฉพาะใบรายงานผลการเรียนและข้อมูลของตัวเอง กับหนังสือเวียนที่ส่งถึงนักเรียน
- ทุกคนที่เข้าระบบ ดูรายชื่อบุคลากรและเอกสารรับได้
- บัญชีที่เข้าระบบ: ชื่อผู้ใช้ = เลขประจำตัวประชาชน · รหัสผ่านเริ่มต้น = วันเกิด พ.ศ. รูปแบบ ปปปปดดวว
(เช่น เกิด 15 พ.ค. 2523 →
25230515) บุคลากรหรือนักเรียนที่ไม่มีเลขประชาชนหรือวันเกิดจะมีชื่อในระบบแต่เข้าระบบไม่ได้
| ขั้นต่ำ | |
|---|---|
| PHP | 7.4 ขึ้นไป · ส่วนขยาย mbstring zlib xml gd curl |
| ฐานข้อมูล | MySQL 5.5.3+ หรือ MariaDB 5.5+ (ต้องรองรับ utf8mb4) |
| เว็บเซิร์ฟเวอร์ | Apache + mod_rewrite (มี .htaccess มาให้) หรือ Nginx ที่เขียนกฎ rewrite เทียบเท่า |
รัน PHP ผ่าน php-fpm ต้องเปิด
CGIPassAuth On(Apache 2.4.13+) ไม่งั้นหัวAuthorizationจะถูกตัดทิ้งก่อนถึง PHP แล้วทุก API ตอบ 401 —.htaccessที่ให้มามีทั้งCGIPassAuthและกฎสำรองแล้ว
git clone https://github.com/goragodwiriya/sms.git-
วางไฟล์บนเซิร์ฟเวอร์ (หรือชี้ document root มาที่โฟลเดอร์นี้)
-
สร้างฐานข้อมูลเปล่า ชุดอักขระ
utf8mb4 -
เปิดเบราว์เซอร์ไปที่
/install/ตัวติดตั้งจะสร้างsettings/และdatas/ให้เอง (ถ้าสร้างไม่ได้ ให้สร้างเองแล้วตั้งสิทธิ์ให้เซิร์ฟเวอร์เขียนได้)ขั้น ทำอะไร 0 ตรวจความพร้อมของเซิร์ฟเวอร์ 1 ตรวจโฟลเดอร์ที่ต้องเขียนได้ 2 ตั้งบัญชีผู้ดูแลระบบสูงสุด 3 ใส่ค่าเชื่อมต่อฐานข้อมูล 4 สร้างตาราง นำเข้าคำแปลและหมวดหมู่ตั้งต้น ใส่ข้อมูลตัวอย่าง (ไฟล์ SQL สำเร็จรูป ราว 10 วินาที) เสร็จ -
ลบโฟลเดอร์
install/ออกจากเซิร์ฟเวอร์เมื่อติดตั้งเสร็จ -
เข้าระบบด้วยบัญชีผู้ดูแล แล้วตั้งค่าที่เมนู โรงเรียน → การตั้งค่า → ตั้งค่าโมดูล (ชื่อและที่อยู่โรงเรียน ปีการศึกษา ภาคเรียนปัจจุบัน สถานะของครู/นักเรียน ขนาดรูป ภาษาของไฟล์ CSV) และ โรงเรียน → การตั้งค่า → การคำนวณเกรด
การติดตั้งใหม่รวมข้อมูลตัวอย่างเสมอ เพื่อให้เปิดมาก็ทดลองใช้ได้ทันที (บุคลากร 30 คน นักเรียน 180 คน
รายวิชา ผลการเรียน หนังสือเวียน — ดูหัวข้อ ข้อมูลตัวอย่าง) หน้าจอสุดท้ายของตัวติดตั้งแสดงบัญชีสำหรับทดสอบแต่ละบทบาท
(บัญชีตัวอย่างอื่นเข้าระบบไม่ได้จนกว่าจะตั้งรหัสผ่านใหม่ เพราะรหัสผ่านต้องเข้ารหัสด้วยกุญแจของแต่ละไซต์ตอนติดตั้ง จึงทำให้เฉพาะ 26 บัญชีที่ครบทุกบทบาท)
ก่อนใช้งานจริงให้ลบข้อมูลตัวอย่างออก ด้วย php install/cli-sample.php --remove — ลบเฉพาะของตัวอย่าง
บัญชีผู้ดูแลระบบ หมวดหมู่ และข้อมูลที่คุณสร้างเองไม่ถูกลบ ถ้าสร้างข้อมูลตัวอย่างไม่สำเร็จ การติดตั้งยังสมบูรณ์
และรัน php install/cli-sample.php ภายหลังได้
การปรับรุ่นไม่เพิ่มข้อมูลตัวอย่าง และไม่แตะข้อมูลเดิมของไซต์ (ค่าตั้งต้นใหม่ที่ขาดอยู่จะถูกเติม แต่ค่าที่ตั้งไว้แล้วคงเดิมเสมอ)
อัปโหลดไฟล์รุ่นใหม่ทับ แล้วเปิด /install/ อีกครั้ง ตัวติดตั้งเห็นว่ามี settings/config.php อยู่แล้ว
จึงเข้าโหมดปรับรุ่นเอง ตัวปรับรุ่นเขียนให้รันซ้ำได้และกันการถอยรุ่น
- ต้องสำรองฐานข้อมูลก่อนทุกครั้ง ตัวปรับรุ่นจะไม่เริ่มถ้าไม่กดยืนยันว่าสำรองแล้ว
- ตารางและคอลัมน์ของ SMS 6.x ใช้ต่อได้โดยไม่ต้องย้ายข้อมูล ตัวปรับรุ่นแปลงเป็น InnoDB/
utf8mb4ตรวจดัชนี แปลงข้อมูลเพิ่มเติมของบุคลากรจาก PHP serialize เป็น JSON และเติมค่ากำหนดที่ขาด - ก่อนแตะข้อมูล จะตรวจก่อนว่าฐานผ่านเงื่อนไข (เช่น เบอร์โทร/เลขประชาชนไม่ซ้ำ) ถ้าไม่ผ่านจะหยุดโดยยังไม่แก้อะไร และรายงานแถวที่มีปัญหา ท้ายการปรับรุ่นแสดงจำนวนแถวก่อน/หลังของทุกตาราง
php install/cli-sample.php --settings # ใส่ข้อมูลตัวอย่างเพิ่มภายหลัง (--settings = เติมชื่อ/ที่อยู่โรงเรียนที่ยังว่าง)
php install/cli-sample.php --remove # ลบเฉพาะข้อมูลตัวอย่าง
php install/cli-sample.php --db=sms_demo # ใส่ลงฐานอื่นแทนฐานใน settings/database.phpสร้างบุคลากร 30 คน นักเรียน 180 คน (ม.1–ม.6 ห้องละ 15 คน) รายวิชากว่า 200 วิชาใน 3 ภาคเรียน ผลการเรียน หนังสือเวียน 35 ฉบับพร้อมไฟล์ PDF/JPG และประวัติการใช้งาน รันซ้ำได้ ใช้เวลาราว 45 วินาที เมื่อรันเสร็จจะพิมพ์บัญชีสำหรับทดสอบแต่ละบทบาทให้
ตัวติดตั้งใช้ข้อมูลสำเร็จรูป
install/sample.sql+install/sample/(ไม่สร้างสดตอนติดตั้ง) ส่วนcli-sample.phpเป็นตัวสร้างต้นทาง ใช้เพิ่มข้อมูลตัวอย่างให้ฐานที่ติดตั้งแล้ว และสร้างชุดสำเร็จรูปขึ้นใหม่ได้:php install/cli-sample.php --db=<ฐานว่าง>แล้วphp install/cli-sample-export.php --db=<ฐานว่าง>
⚠️ ห้ามใช้กับฐานที่โรงเรียนใช้งานจริง — เลขประชาชนตัวอย่างขึ้นต้นด้วย99และหนังสือเวียนตัวอย่างมี[ตัวอย่าง]ในรายละเอียด เป็นเครื่องหมายให้--removeลบเฉพาะของตัวอย่าง สคริปต์ไม่ส่งอีเมลหรือแจ้งเตือนใด ๆ
├── modules/
│ ├── personnel/ บุคลากร
│ ├── school/ นักเรียน รายวิชา ผลการเรียน
│ ├── edocument/ งานสารบรรณ
│ ├── index/ แกนระบบ: สมาชิก สิทธิ์ ตั้งค่า ภาษา
│ ├── export/ พิมพ์เอกสาร/PDF/CSV ที่ใช้ร่วมกัน
│ ├── download/ อัปโหลดและดาวน์โหลดไฟล์
│ └── timeline/ โปรโตคอลไทม์ไลน์ข้ามระบบ
├── templates/ หน้าเว็บ (HTML ล้วน + data-* ไม่มี PHP ปน)
├── language/ คำแปล th/en
├── install/ ตัวติดตั้ง ตัวปรับรุ่น และเครื่องมือบรรทัดคำสั่ง
├── Now/ เฟรมเวิร์กฝั่งเบราว์เซอร์ (ซอร์ส + บันเดิลที่ Now/dist/)
├── Kotchasan/ เฟรมเวิร์กฝั่ง PHP
├── Gcms/ แกนของแอป: API base, ตาราง, สิทธิ์, อีเมล, LINE, Telegram, SMS
├── line/ telegram/ Thaibluksms/ ตัวเชื่อมบริการแจ้งเตือน
├── settings/ ค่ากำหนดที่ตัวติดตั้งเขียนให้ (ไม่อยู่ใน git)
├── datas/ ไฟล์ที่ระบบสร้าง: รูป หนังสือเวียน แคช ล็อก (ไม่อยู่ใน git)
├── index.php หน้าเดียวของ SPA
└── api.php ประตูเดียวของ API ทั้งหมด
แต่ละโมดูลเป็นแบบถอด-ใส่ได้: modules/<ชื่อ>/ เก็บ controller, model, ตารางของตัวเอง (install/database.sql)
และตัวปรับรุ่น (install/upgrade.php) ส่วนหน้าเว็บอยู่ที่ templates/<ชื่อ>/
เมนู สิทธิ์ และการ์ดหน้าแรกประกาศใน controllers/init.php ของโมดูล ไม่ต้องแก้ไฟล์กลาง
ตั้งค่าของแต่ละโมดูลอยู่ใต้เมนูของโมดูลนั้น ไม่ปะปนกับเมนูตั้งค่าของระบบหลัก
php modules/school/tests/run.php # ทดสอบทั้ง personnel, school, edocument
php modules/school/tests/run.php test_edocument # เลือกทีละชุดตัวทดสอบสร้างฐาน sms_module_test ขึ้นใหม่จากสคีมา SMS 6.x แล้วรันตัวปรับรุ่นจริง
เรียก controller ด้วยโทเค็นของแต่ละบทบาท แล้วลบฐานทิ้งเมื่อเสร็จ — ไม่แตะฐานที่ใช้งานอยู่
(ตั้งชื่อฐานเองได้ด้วย SMS_TEST_DB) ใช้ผู้ใช้ MySQL ตาม settings/database.php
php install/cli-language.php # ตรวจว่าโค้ดเรียกคีย์คำแปลที่ยังไม่มีหรือไม่ (ต้องได้ [ok] ก่อนปล่อยรุ่น)
php install/cli-language.php --sync # เติมคีย์ที่ th.php มีแต่ th.json ยังไม่มี
php install/cli-fresh.php <dbname> [prefix] --admin=<user> --password=<pass> # ติดตั้งใหม่ลงฐานเปล่า
php install/cli-verify.php <dbname> [prefix] # ตรวจว่าสคีมาของฐานตรงกับรุ่นนี้
php install/cli-upgrade.php <user> <pass> --confirm-backup # รันตัวปรับรุ่นกับฐานใน settings/ตาราง
languageคือที่เก็บคำแปลจริง ส่วนlanguage/*.phpและ*.jsonสร้างใหม่จากตารางทุกครั้งที่แก้หรือลบ คำแปลจากหน้า จัดการภาษา คำแปลที่เพิ่มเฉพาะในไฟล์จึงหายได้ — เพิ่มทั้งในไฟล์และในตาราง และระวังคีย์ที่ต่างกันแค่ตัวพิมพ์ใหญ่-เล็ก (เช่นAll itemsกับall items) เพราะตารางเทียบโดยไม่สนตัวพิมพ์
ต้องทำเฉพาะเมื่อแก้ซอร์สใน Now/js/ — งานปกติไม่ต้องแตะ
npm install
npm run build # สร้างบันเดิลทั้งหมดลง Now/dist/
npm run dev # โหมดพัฒนาทุกฟีเจอร์เรียกผ่าน api.php ในรูป api/<โมดูล>/<คอนโทรลเลอร์>/<เมธอด> เช่น
api/school/students api/personnel/setup api/edocument/inbox ต้องแนบโทเค็นของผู้ใช้
(Authorization: Bearer … หรือคุกกี้) และ X-CSRF-Token สำหรับคำขอแบบ POST
ตั้งค่าโทเค็น/IP ที่อนุญาตสำหรับระบบภายนอกได้ที่ ตั้งค่า → API
- Now.js — nowjs.net · docs.nowjs.net
- Kotchasan — kotchasan.com · docs.kotchasan.com
MIT — Copyright (c) 2026 Goragod Wiriya
Goragod Wiriya · goragod.com · github.com/goragodwiriya