-- users
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
email TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
full_name TEXT,
role TEXT DEFAULT 'student', -- student | teacher | admin
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- subjects (môn học /categories)
CREATE TABLE subjects (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
color TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- tasks: công việc học tập / bài tập
CREATE TABLE tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
description TEXT,
subject_id INTEGER,
owner_id INTEGER NOT NULL, -- người tạo
assignee_id INTEGER, -- người được giao (có thể null)
due_date TIMESTAMP,
priority INTEGER DEFAULT 2, -- 1 low,2 medium,3 high
status TEXT DEFAULT 'todo', -- todo | in_progress | done | archived
reminder TIMESTAMP, -- thời gian nhắc nhở
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(subject_id) REFERENCES subjects(id),
FOREIGN KEY(owner_id) REFERENCES users(id),
FOREIGN KEY(assignee_id) REFERENCES users(id)
);
-- attachments (tài liệu đính kèm)
CREATE TABLE attachments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
task_id INTEGER NOT NULL,
filename TEXT NOT NULL,
file_path TEXT NOT NULL,
uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(task_id) REFERENCES tasks(id)
);
-- grades / đánh giá (tuỳ chọn)
CREATE TABLE grades (
id INTEGER PRIMARY KEY AUTOINCREMENT,
task_id INTEGER NOT NULL,
student_id INTEGER NOT NULL,
score REAL,
feedback TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(task_id) REFERENCES tasks(id),
FOREIGN KEY(student_id) REFERENCES users(id)
);
LS0gdXNlcnMKQ1JFQVRFIFRBQkxFIHVzZXJzICgKICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsCiAgZW1haWwgVEVYVCBVTklRVUUgTk9UIE5VTEwsCiAgcGFzc3dvcmRfaGFzaCBURVhUIE5PVCBOVUxMLAogIGZ1bGxfbmFtZSBURVhULAogIHJvbGUgVEVYVCBERUZBVUxUICdzdHVkZW50JywgLS0gc3R1ZGVudCB8IHRlYWNoZXIgfCBhZG1pbgogIGNyZWF0ZWRfYXQgVElNRVNUQU1QIERFRkFVTFQgQ1VSUkVOVF9USU1FU1RBTVAsCiAgdXBkYXRlZF9hdCBUSU1FU1RBTVAgREVGQVVMVCBDVVJSRU5UX1RJTUVTVEFNUAopOwoKLS0gc3ViamVjdHMgKG3DtG4gaOG7jWMgL2NhdGVnb3JpZXMpCkNSRUFURSBUQUJMRSBzdWJqZWN0cyAoCiAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULAogIG5hbWUgVEVYVCBOT1QgTlVMTCwKICBjb2xvciBURVhULAogIGNyZWF0ZWRfYXQgVElNRVNUQU1QIERFRkFVTFQgQ1VSUkVOVF9USU1FU1RBTVAKKTsKCi0tIHRhc2tzOiBjw7RuZyB2aeG7h2MgaOG7jWMgdOG6rXAgLyBiw6BpIHThuq1wCkNSRUFURSBUQUJMRSB0YXNrcyAoCiAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULAogIHRpdGxlIFRFWFQgTk9UIE5VTEwsCiAgZGVzY3JpcHRpb24gVEVYVCwKICBzdWJqZWN0X2lkIElOVEVHRVIsCiAgb3duZXJfaWQgSU5URUdFUiBOT1QgTlVMTCwgLS0gbmfGsOG7nWkgdOG6oW8KICBhc3NpZ25lZV9pZCBJTlRFR0VSLCAgICAgICAtLSBuZ8aw4budaSDEkcaw4bujYyBnaWFvIChjw7MgdGjhu4MgbnVsbCkKICBkdWVfZGF0ZSBUSU1FU1RBTVAsCiAgcHJpb3JpdHkgSU5URUdFUiBERUZBVUxUIDIsIC0tIDEgbG93LDIgbWVkaXVtLDMgaGlnaAogIHN0YXR1cyBURVhUIERFRkFVTFQgJ3RvZG8nLCAtLSB0b2RvIHwgaW5fcHJvZ3Jlc3MgfCBkb25lIHwgYXJjaGl2ZWQKICByZW1pbmRlciBUSU1FU1RBTVAsICAgICAgICAgLS0gdGjhu51pIGdpYW4gbmjhuq9jIG5o4bufCiAgY3JlYXRlZF9hdCBUSU1FU1RBTVAgREVGQVVMVCBDVVJSRU5UX1RJTUVTVEFNUCwKICB1cGRhdGVkX2F0IFRJTUVTVEFNUCBERUZBVUxUIENVUlJFTlRfVElNRVNUQU1QLAogIEZPUkVJR04gS0VZKHN1YmplY3RfaWQpIFJFRkVSRU5DRVMgc3ViamVjdHMoaWQpLAogIEZPUkVJR04gS0VZKG93bmVyX2lkKSBSRUZFUkVOQ0VTIHVzZXJzKGlkKSwKICBGT1JFSUdOIEtFWShhc3NpZ25lZV9pZCkgUkVGRVJFTkNFUyB1c2VycyhpZCkKKTsKCi0tIGF0dGFjaG1lbnRzICh0w6BpIGxp4buHdSDEkcOtbmgga8OobSkKQ1JFQVRFIFRBQkxFIGF0dGFjaG1lbnRzICgKICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsCiAgdGFza19pZCBJTlRFR0VSIE5PVCBOVUxMLAogIGZpbGVuYW1lIFRFWFQgTk9UIE5VTEwsCiAgZmlsZV9wYXRoIFRFWFQgTk9UIE5VTEwsCiAgdXBsb2FkZWRfYXQgVElNRVNUQU1QIERFRkFVTFQgQ1VSUkVOVF9USU1FU1RBTVAsCiAgRk9SRUlHTiBLRVkodGFza19pZCkgUkVGRVJFTkNFUyB0YXNrcyhpZCkKKTsKCi0tIGdyYWRlcyAvIMSRw6FuaCBnacOhICh0deG7syBjaOG7jW4pCkNSRUFURSBUQUJMRSBncmFkZXMgKAogIGlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwKICB0YXNrX2lkIElOVEVHRVIgTk9UIE5VTEwsCiAgc3R1ZGVudF9pZCBJTlRFR0VSIE5PVCBOVUxMLAogIHNjb3JlIFJFQUwsCiAgZmVlZGJhY2sgVEVYVCwKICBjcmVhdGVkX2F0IFRJTUVTVEFNUCBERUZBVUxUIENVUlJFTlRfVElNRVNUQU1QLAogIEZPUkVJR04gS0VZKHRhc2tfaWQpIFJFRkVSRU5DRVMgdGFza3MoaWQpLAogIEZPUkVJR04gS0VZKHN0dWRlbnRfaWQpIFJFRkVSRU5DRVMgdXNlcnMoaWQpCik7