Skip to content

Repository files navigation

SMS — School Management System

ระบบบริหารสถานศึกษาแบบเว็บ สำหรับโรงเรียนมัธยม: ทะเบียนบุคลากร · ทะเบียนนักเรียน · รายวิชา · ลงทะเบียนเรียนและผลการเรียน · งานสารบรรณ (หนังสือเวียน) ในระบบเดียว สร้างบน 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.


ความสามารถ

บุคลากร (personnel)

  • ทะเบียนบุคลากร: ตำแหน่ง กลุ่มสาระ/แผนก ลำดับการแสดง ครูประจำชั้น ที่อยู่ รูปถ่าย
  • สถานะ บุคลากรปัจจุบัน / ในอดีต (เกษียณ ย้าย) — คนในอดีตไม่ปรากฏในรายชื่อทั่วไปแต่ข้อมูลไม่หาย
  • นำเข้า/ส่งออกรายชื่อด้วย CSV (UTF-8 หรือ TIS-620) พร้อมไฟล์ตัวอย่างให้ดาวน์โหลด
  • หมวดหมู่ (ตำแหน่ง แผนก) แก้ได้ทั้งไทยและอังกฤษ และเพิ่มชนิดหมวดหมู่เองได้โดยไม่ต้องแก้โค้ด

นักเรียนและรายวิชา (school)

  • ทะเบียนนักเรียน: เลขประจำตัว เลขที่ ชั้น ห้อง แผนการเรียน ผู้ปกครอง รูปถ่าย · ย้ายชั้น/ห้อง · จบการศึกษา
  • รายวิชา แยกตามปีการศึกษา/ภาคเรียน ชนิด (พื้นฐาน เพิ่มเติม กิจกรรม) หน่วยกิต ชั่วโมง และครูผู้สอน
  • ลงทะเบียนเรียน เลือกนักเรียนทั้งห้องเข้ารายวิชาในครั้งเดียว
  • ผลการเรียน กรอกคะแนนกลางภาค/ปลายภาค แล้วระบบคิดเกรดตามตารางที่ตั้งไว้ (หรือกรอกเกรดเองก็ได้) รองรับผลพิเศษ ร. มส. มผ. ผ. · ดาวน์โหลดผลการเรียนรายวิชาเป็น CSV
  • ใบรายงานผลการเรียน รายภาคเรียน พร้อมหน่วยกิตรวมและเกรดเฉลี่ย (นักเรียนดูของตัวเองได้)
  • นำเข้านักเรียน รายวิชา และผลการเรียนจาก CSV

งานสารบรรณ (edocument)

  • ส่งหนังสือเวียนพร้อมไฟล์แนบ (ชนิดและขนาดไฟล์กำหนดได้) เลือกผู้รับตามสถานะสมาชิก ระบุความเร่งด่วน (ด่วนมาก/ด่วน/ปกติ)
  • ออกเลขที่หนังสืออัตโนมัติตามรูปแบบที่กำหนด เช่น ที่ ศธ%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
  1. วางไฟล์บนเซิร์ฟเวอร์ (หรือชี้ document root มาที่โฟลเดอร์นี้)

  2. สร้างฐานข้อมูลเปล่า ชุดอักขระ utf8mb4

  3. เปิดเบราว์เซอร์ไปที่ /install/ ตัวติดตั้งจะสร้าง settings/ และ datas/ ให้เอง (ถ้าสร้างไม่ได้ ให้สร้างเองแล้วตั้งสิทธิ์ให้เซิร์ฟเวอร์เขียนได้)

    ขั้น ทำอะไร
    0 ตรวจความพร้อมของเซิร์ฟเวอร์
    1 ตรวจโฟลเดอร์ที่ต้องเขียนได้
    2 ตั้งบัญชีผู้ดูแลระบบสูงสุด
    3 ใส่ค่าเชื่อมต่อฐานข้อมูล
    4 สร้างตาราง นำเข้าคำแปลและหมวดหมู่ตั้งต้น ใส่ข้อมูลตัวอย่าง (ไฟล์ SQL สำเร็จรูป ราว 10 วินาที) เสร็จ
  4. ลบโฟลเดอร์ install/ ออกจากเซิร์ฟเวอร์เมื่อติดตั้งเสร็จ

  5. เข้าระบบด้วยบัญชีผู้ดูแล แล้วตั้งค่าที่เมนู โรงเรียน → การตั้งค่า → ตั้งค่าโมดูล (ชื่อและที่อยู่โรงเรียน ปีการศึกษา ภาคเรียนปัจจุบัน สถานะของครู/นักเรียน ขนาดรูป ภาษาของไฟล์ CSV) และ โรงเรียน → การตั้งค่า → การคำนวณเกรด

การติดตั้งใหม่รวมข้อมูลตัวอย่างเสมอ เพื่อให้เปิดมาก็ทดลองใช้ได้ทันที (บุคลากร 30 คน นักเรียน 180 คน รายวิชา ผลการเรียน หนังสือเวียน — ดูหัวข้อ ข้อมูลตัวอย่าง) หน้าจอสุดท้ายของตัวติดตั้งแสดงบัญชีสำหรับทดสอบแต่ละบทบาท (บัญชีตัวอย่างอื่นเข้าระบบไม่ได้จนกว่าจะตั้งรหัสผ่านใหม่ เพราะรหัสผ่านต้องเข้ารหัสด้วยกุญแจของแต่ละไซต์ตอนติดตั้ง จึงทำให้เฉพาะ 26 บัญชีที่ครบทุกบทบาท) ก่อนใช้งานจริงให้ลบข้อมูลตัวอย่างออก ด้วย php install/cli-sample.php --remove — ลบเฉพาะของตัวอย่าง บัญชีผู้ดูแลระบบ หมวดหมู่ และข้อมูลที่คุณสร้างเองไม่ถูกลบ ถ้าสร้างข้อมูลตัวอย่างไม่สำเร็จ การติดตั้งยังสมบูรณ์ และรัน php install/cli-sample.php ภายหลังได้

การปรับรุ่นไม่เพิ่มข้อมูลตัวอย่าง และไม่แตะข้อมูลเดิมของไซต์ (ค่าตั้งต้นใหม่ที่ขาดอยู่จะถูกเติม แต่ค่าที่ตั้งไว้แล้วคงเดิมเสมอ)

ปรับรุ่น และย้ายจาก SMS 6.x

อัปโหลดไฟล์รุ่นใหม่ทับ แล้วเปิด /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

ทุกฟีเจอร์เรียกผ่าน api.php ในรูป api/<โมดูล>/<คอนโทรลเลอร์>/<เมธอด> เช่น api/school/students api/personnel/setup api/edocument/inbox ต้องแนบโทเค็นของผู้ใช้ (Authorization: Bearer … หรือคุกกี้) และ X-CSRF-Token สำหรับคำขอแบบ POST ตั้งค่าโทเค็น/IP ที่อนุญาตสำหรับระบบภายนอกได้ที่ ตั้งค่า → API


เอกสารอ้างอิง

สัญญาอนุญาต

MIT — Copyright (c) 2026 Goragod Wiriya

ผู้พัฒนา

Goragod Wiriya · goragod.com · github.com/goragodwiriya

About

ระบบบริหารงานโรงเรียน School Management System (SMS)

Topics

Resources

Stars

26 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages