第一期:家庭自学打卡系统

- 家长手机号登录 + 孩子设备一次性激活(长期会话)
- 周模板自动生成每日任务快照,支持拍照凭证直传对象存储
- 连击计算(空白日自动达成)、家长补卡带标记
- 家长端三标签:今日概览 / 任务模板 / 设备管理
- Docker 独立输出,经 Traefik 接入 jump.hn12301.net

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
jacobxu666
2026-08-02 23:19:13 +08:00
co-authored by Claude Opus 4.8
commit af7a144d58
57 changed files with 8875 additions and 0 deletions
+619
View File
@@ -0,0 +1,619 @@
{
"version": "5",
"dialect": "mysql",
"id": "a044f535-beea-4fe6-8db5-3ae0019977de",
"prevId": "00000000-0000-0000-0000-000000000000",
"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
},
"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
},
"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": {}
}
}