第二期:企业信任风 UI + 打卡科目分类 + 英语语法学习模块

- 全站按 Corporate Trust 设计规范重做:靛蓝/紫罗兰渐变、Plus Jakarta Sans
  自托管字体、带色阴影、卡片悬浮、氛围光斑
- 打卡任务增加科目分类(语文/数学/英语/运动/其他),孩子端按科目分组
- 英语语法自学模块:线性解锁课程 + 课后/周/月测验引擎,测验达标
  自动联动当日英语打卡;家长概览显示语法进度
- 课程内容:A1→B1 完整大纲,9 周 54 课 + 9 周测 + 2 月测,讲解/例句/
  练习/测验均原创,仅参考两份语法书的主题编排

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
jacobxu666
2026-08-03 01:20:04 +08:00
co-authored by Claude Opus 4.8
parent b08f6649be
commit 6ed4d5a61e
45 changed files with 5824 additions and 92 deletions
+2
View File
@@ -0,0 +1,2 @@
ALTER TABLE `task_instance` ADD `subject` enum('chinese','math','english','exercise','other') DEFAULT 'other' NOT NULL;--> statement-breakpoint
ALTER TABLE `task_template` ADD `subject` enum('chinese','math','english','exercise','other') DEFAULT 'other' NOT NULL;
+12
View File
@@ -0,0 +1,12 @@
CREATE TABLE `grammar_progress` (
`id` bigint AUTO_INCREMENT NOT NULL,
`child_user_id` bigint NOT NULL,
`seq` int NOT NULL,
`score` int,
`passed` boolean NOT NULL DEFAULT false,
`completed_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT `grammar_progress_id` PRIMARY KEY(`id`),
CONSTRAINT `uq_grammar_child_seq` UNIQUE(`child_user_id`,`seq`)
);
--> statement-breakpoint
ALTER TABLE `grammar_progress` ADD CONSTRAINT `grammar_progress_child_user_id_user_id_fk` FOREIGN KEY (`child_user_id`) REFERENCES `user`(`id`) ON DELETE cascade ON UPDATE no action;
+635
View File
@@ -0,0 +1,635 @@
{
"version": "5",
"dialect": "mysql",
"id": "344969b3-8a75-4900-b08f-c3407340d1c4",
"prevId": "a044f535-beea-4fe6-8db5-3ae0019977de",
"tables": {
"activation_code": {
"name": "activation_code",
"columns": {
"id": {
"name": "id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": true
},
"child_user_id": {
"name": "child_user_id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"code_hash": {
"name": "code_hash",
"type": "varchar(64)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"created_by": {
"name": "created_by",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"created_at": {
"name": "created_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP"
},
"expires_at": {
"name": "expires_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"used_at": {
"name": "used_at",
"type": "datetime",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {
"activation_code_child_user_id_user_id_fk": {
"name": "activation_code_child_user_id_user_id_fk",
"tableFrom": "activation_code",
"tableTo": "user",
"columnsFrom": [
"child_user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"activation_code_created_by_user_id_fk": {
"name": "activation_code_created_by_user_id_fk",
"tableFrom": "activation_code",
"tableTo": "user",
"columnsFrom": [
"created_by"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {
"activation_code_id": {
"name": "activation_code_id",
"columns": [
"id"
]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"family": {
"name": "family",
"columns": {
"id": {
"name": "id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": true
},
"name": {
"name": "name",
"type": "varchar(50)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"created_at": {
"name": "created_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP"
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {
"family_id": {
"name": "family_id",
"columns": [
"id"
]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"photo": {
"name": "photo",
"columns": {
"id": {
"name": "id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": true
},
"task_instance_id": {
"name": "task_instance_id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"oss_key": {
"name": "oss_key",
"type": "varchar(300)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"created_at": {
"name": "created_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP"
}
},
"indexes": {
"idx_photo_instance": {
"name": "idx_photo_instance",
"columns": [
"task_instance_id"
],
"isUnique": false
}
},
"foreignKeys": {
"photo_task_instance_id_task_instance_id_fk": {
"name": "photo_task_instance_id_task_instance_id_fk",
"tableFrom": "photo",
"tableTo": "task_instance",
"columnsFrom": [
"task_instance_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {
"photo_id": {
"name": "photo_id",
"columns": [
"id"
]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"session": {
"name": "session",
"columns": {
"id": {
"name": "id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": true
},
"user_id": {
"name": "user_id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"token_hash": {
"name": "token_hash",
"type": "varchar(64)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"device_label": {
"name": "device_label",
"type": "varchar(100)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"created_at": {
"name": "created_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP"
},
"expires_at": {
"name": "expires_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {
"uq_session_token": {
"name": "uq_session_token",
"columns": [
"token_hash"
],
"isUnique": true
},
"idx_session_user": {
"name": "idx_session_user",
"columns": [
"user_id"
],
"isUnique": false
}
},
"foreignKeys": {
"session_user_id_user_id_fk": {
"name": "session_user_id_user_id_fk",
"tableFrom": "session",
"tableTo": "user",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {
"session_id": {
"name": "session_id",
"columns": [
"id"
]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"task_instance": {
"name": "task_instance",
"columns": {
"id": {
"name": "id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": true
},
"child_user_id": {
"name": "child_user_id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"date": {
"name": "date",
"type": "date",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"title": {
"name": "title",
"type": "varchar(100)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"subject": {
"name": "subject",
"type": "enum('chinese','math','english','exercise','other')",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "'other'"
},
"requires_photo": {
"name": "requires_photo",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": false
},
"status": {
"name": "status",
"type": "enum('pending','done')",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "'pending'"
},
"is_makeup": {
"name": "is_makeup",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": false
},
"done_at": {
"name": "done_at",
"type": "datetime",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"sort_order": {
"name": "sort_order",
"type": "int",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": 0
},
"source_template_id": {
"name": "source_template_id",
"type": "bigint",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"created_at": {
"name": "created_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP"
}
},
"indexes": {
"idx_instance_child_date": {
"name": "idx_instance_child_date",
"columns": [
"child_user_id",
"date"
],
"isUnique": false
}
},
"foreignKeys": {
"task_instance_child_user_id_user_id_fk": {
"name": "task_instance_child_user_id_user_id_fk",
"tableFrom": "task_instance",
"tableTo": "user",
"columnsFrom": [
"child_user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {
"task_instance_id": {
"name": "task_instance_id",
"columns": [
"id"
]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"task_template": {
"name": "task_template",
"columns": {
"id": {
"name": "id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": true
},
"child_user_id": {
"name": "child_user_id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"dow": {
"name": "dow",
"type": "int",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"title": {
"name": "title",
"type": "varchar(100)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"subject": {
"name": "subject",
"type": "enum('chinese','math','english','exercise','other')",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "'other'"
},
"requires_photo": {
"name": "requires_photo",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": false
},
"sort_order": {
"name": "sort_order",
"type": "int",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": 0
},
"created_at": {
"name": "created_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP"
}
},
"indexes": {
"idx_template_child_dow": {
"name": "idx_template_child_dow",
"columns": [
"child_user_id",
"dow"
],
"isUnique": false
}
},
"foreignKeys": {
"task_template_child_user_id_user_id_fk": {
"name": "task_template_child_user_id_user_id_fk",
"tableFrom": "task_template",
"tableTo": "user",
"columnsFrom": [
"child_user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {
"task_template_id": {
"name": "task_template_id",
"columns": [
"id"
]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"user": {
"name": "user",
"columns": {
"id": {
"name": "id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": true
},
"family_id": {
"name": "family_id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"role": {
"name": "role",
"type": "enum('parent','child')",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"display_name": {
"name": "display_name",
"type": "varchar(50)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"phone": {
"name": "phone",
"type": "varchar(20)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"password_hash": {
"name": "password_hash",
"type": "varchar(100)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"sort_order": {
"name": "sort_order",
"type": "int",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": 0
},
"created_at": {
"name": "created_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP"
}
},
"indexes": {
"uq_user_phone": {
"name": "uq_user_phone",
"columns": [
"phone"
],
"isUnique": true
}
},
"foreignKeys": {
"user_family_id_family_id_fk": {
"name": "user_family_id_family_id_fk",
"tableFrom": "user",
"tableTo": "family",
"columnsFrom": [
"family_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {
"user_id": {
"name": "user_id",
"columns": [
"id"
]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
}
},
"views": {},
"_meta": {
"schemas": {},
"tables": {},
"columns": {}
},
"internal": {
"tables": {},
"indexes": {}
}
}
+719
View File
@@ -0,0 +1,719 @@
{
"version": "5",
"dialect": "mysql",
"id": "384a621e-e735-46d7-80a5-8c925bb0ce44",
"prevId": "344969b3-8a75-4900-b08f-c3407340d1c4",
"tables": {
"activation_code": {
"name": "activation_code",
"columns": {
"id": {
"name": "id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": true
},
"child_user_id": {
"name": "child_user_id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"code_hash": {
"name": "code_hash",
"type": "varchar(64)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"created_by": {
"name": "created_by",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"created_at": {
"name": "created_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP"
},
"expires_at": {
"name": "expires_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"used_at": {
"name": "used_at",
"type": "datetime",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {
"activation_code_child_user_id_user_id_fk": {
"name": "activation_code_child_user_id_user_id_fk",
"tableFrom": "activation_code",
"tableTo": "user",
"columnsFrom": [
"child_user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"activation_code_created_by_user_id_fk": {
"name": "activation_code_created_by_user_id_fk",
"tableFrom": "activation_code",
"tableTo": "user",
"columnsFrom": [
"created_by"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {
"activation_code_id": {
"name": "activation_code_id",
"columns": [
"id"
]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"family": {
"name": "family",
"columns": {
"id": {
"name": "id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": true
},
"name": {
"name": "name",
"type": "varchar(50)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"created_at": {
"name": "created_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP"
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {
"family_id": {
"name": "family_id",
"columns": [
"id"
]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"grammar_progress": {
"name": "grammar_progress",
"columns": {
"id": {
"name": "id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": true
},
"child_user_id": {
"name": "child_user_id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"seq": {
"name": "seq",
"type": "int",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"score": {
"name": "score",
"type": "int",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"passed": {
"name": "passed",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": false
},
"completed_at": {
"name": "completed_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP"
}
},
"indexes": {
"uq_grammar_child_seq": {
"name": "uq_grammar_child_seq",
"columns": [
"child_user_id",
"seq"
],
"isUnique": true
}
},
"foreignKeys": {
"grammar_progress_child_user_id_user_id_fk": {
"name": "grammar_progress_child_user_id_user_id_fk",
"tableFrom": "grammar_progress",
"tableTo": "user",
"columnsFrom": [
"child_user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {
"grammar_progress_id": {
"name": "grammar_progress_id",
"columns": [
"id"
]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"photo": {
"name": "photo",
"columns": {
"id": {
"name": "id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": true
},
"task_instance_id": {
"name": "task_instance_id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"oss_key": {
"name": "oss_key",
"type": "varchar(300)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"created_at": {
"name": "created_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP"
}
},
"indexes": {
"idx_photo_instance": {
"name": "idx_photo_instance",
"columns": [
"task_instance_id"
],
"isUnique": false
}
},
"foreignKeys": {
"photo_task_instance_id_task_instance_id_fk": {
"name": "photo_task_instance_id_task_instance_id_fk",
"tableFrom": "photo",
"tableTo": "task_instance",
"columnsFrom": [
"task_instance_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {
"photo_id": {
"name": "photo_id",
"columns": [
"id"
]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"session": {
"name": "session",
"columns": {
"id": {
"name": "id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": true
},
"user_id": {
"name": "user_id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"token_hash": {
"name": "token_hash",
"type": "varchar(64)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"device_label": {
"name": "device_label",
"type": "varchar(100)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"created_at": {
"name": "created_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP"
},
"expires_at": {
"name": "expires_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {
"uq_session_token": {
"name": "uq_session_token",
"columns": [
"token_hash"
],
"isUnique": true
},
"idx_session_user": {
"name": "idx_session_user",
"columns": [
"user_id"
],
"isUnique": false
}
},
"foreignKeys": {
"session_user_id_user_id_fk": {
"name": "session_user_id_user_id_fk",
"tableFrom": "session",
"tableTo": "user",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {
"session_id": {
"name": "session_id",
"columns": [
"id"
]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"task_instance": {
"name": "task_instance",
"columns": {
"id": {
"name": "id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": true
},
"child_user_id": {
"name": "child_user_id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"date": {
"name": "date",
"type": "date",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"title": {
"name": "title",
"type": "varchar(100)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"subject": {
"name": "subject",
"type": "enum('chinese','math','english','exercise','other')",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "'other'"
},
"requires_photo": {
"name": "requires_photo",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": false
},
"status": {
"name": "status",
"type": "enum('pending','done')",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "'pending'"
},
"is_makeup": {
"name": "is_makeup",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": false
},
"done_at": {
"name": "done_at",
"type": "datetime",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"sort_order": {
"name": "sort_order",
"type": "int",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": 0
},
"source_template_id": {
"name": "source_template_id",
"type": "bigint",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"created_at": {
"name": "created_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP"
}
},
"indexes": {
"idx_instance_child_date": {
"name": "idx_instance_child_date",
"columns": [
"child_user_id",
"date"
],
"isUnique": false
}
},
"foreignKeys": {
"task_instance_child_user_id_user_id_fk": {
"name": "task_instance_child_user_id_user_id_fk",
"tableFrom": "task_instance",
"tableTo": "user",
"columnsFrom": [
"child_user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {
"task_instance_id": {
"name": "task_instance_id",
"columns": [
"id"
]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"task_template": {
"name": "task_template",
"columns": {
"id": {
"name": "id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": true
},
"child_user_id": {
"name": "child_user_id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"dow": {
"name": "dow",
"type": "int",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"title": {
"name": "title",
"type": "varchar(100)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"subject": {
"name": "subject",
"type": "enum('chinese','math','english','exercise','other')",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "'other'"
},
"requires_photo": {
"name": "requires_photo",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": false
},
"sort_order": {
"name": "sort_order",
"type": "int",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": 0
},
"created_at": {
"name": "created_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP"
}
},
"indexes": {
"idx_template_child_dow": {
"name": "idx_template_child_dow",
"columns": [
"child_user_id",
"dow"
],
"isUnique": false
}
},
"foreignKeys": {
"task_template_child_user_id_user_id_fk": {
"name": "task_template_child_user_id_user_id_fk",
"tableFrom": "task_template",
"tableTo": "user",
"columnsFrom": [
"child_user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {
"task_template_id": {
"name": "task_template_id",
"columns": [
"id"
]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
},
"user": {
"name": "user",
"columns": {
"id": {
"name": "id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": true
},
"family_id": {
"name": "family_id",
"type": "bigint",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"role": {
"name": "role",
"type": "enum('parent','child')",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"display_name": {
"name": "display_name",
"type": "varchar(50)",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"phone": {
"name": "phone",
"type": "varchar(20)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"password_hash": {
"name": "password_hash",
"type": "varchar(100)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"sort_order": {
"name": "sort_order",
"type": "int",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": 0
},
"created_at": {
"name": "created_at",
"type": "datetime",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "CURRENT_TIMESTAMP"
}
},
"indexes": {
"uq_user_phone": {
"name": "uq_user_phone",
"columns": [
"phone"
],
"isUnique": true
}
},
"foreignKeys": {
"user_family_id_family_id_fk": {
"name": "user_family_id_family_id_fk",
"tableFrom": "user",
"tableTo": "family",
"columnsFrom": [
"family_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {
"user_id": {
"name": "user_id",
"columns": [
"id"
]
}
},
"uniqueConstraints": {},
"checkConstraint": {}
}
},
"views": {},
"_meta": {
"schemas": {},
"tables": {},
"columns": {}
},
"internal": {
"tables": {},
"indexes": {}
}
}
+14
View File
@@ -8,6 +8,20 @@
"when": 1785682170922,
"tag": "0000_init",
"breakpoints": true
},
{
"idx": 1,
"version": "5",
"when": 1785687829667,
"tag": "0001_add-subject",
"breakpoints": true
},
{
"idx": 2,
"version": "5",
"when": 1785689264881,
"tag": "0002_grammar-progress",
"breakpoints": true
}
]
}