-- 微信扫码授权服务 — 数据库结构(阶段 1) -- 目标环境:MySQL 8.0 -- 执行方式:mysql -u root -p < sql/schema.sql CREATE DATABASE IF NOT EXISTS `wechat_api` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci; USE `wechat_api`; -- --------------------------------------------------------------------------- -- 5.1 users — 用户表 -- --------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `users` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `openid` VARCHAR(64) NOT NULL COMMENT '微信 OpenID', `nickname` VARCHAR(100) DEFAULT NULL COMMENT '昵称(可选)', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '首次关注时间', `last_seen_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最近活跃时间', `has_claimed_free` TINYINT NOT NULL DEFAULT 0 COMMENT '是否已领过免费授权', PRIMARY KEY (`id`), UNIQUE KEY `uk_openid` (`openid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表'; -- --------------------------------------------------------------------------- -- 5.2 authorizations — 授权表 -- --------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `authorizations` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` BIGINT UNSIGNED NOT NULL COMMENT '外键 users.id', `type` ENUM('time','points') NOT NULL COMMENT '授权类型', `start_at` DATETIME DEFAULT NULL COMMENT '时间授权开始', `end_at` DATETIME DEFAULT NULL COMMENT '时间授权结束', `remaining_points` INT NOT NULL DEFAULT 0 COMMENT '积分余额', `total_points` INT NOT NULL DEFAULT 0 COMMENT '积分总量', `source` ENUM('free','purchase','admin') NOT NULL COMMENT '来源', `status` ENUM('pending','active','expired','exhausted','cancelled') NOT NULL DEFAULT 'pending' COMMENT '状态', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_user_status` (`user_id`, `status`), CONSTRAINT `fk_auth_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='授权表'; -- --------------------------------------------------------------------------- -- 5.3 auth_scenes — 扫码场景表 -- --------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `auth_scenes` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `scene_str` VARCHAR(128) NOT NULL COMMENT '二维码场景值', `device_id` VARCHAR(128) DEFAULT NULL COMMENT 'MFC 设备标识', `status` ENUM('pending','scanned','authorized','expired') NOT NULL DEFAULT 'pending' COMMENT '场景状态', `user_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '扫码用户', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `expires_at` DATETIME NOT NULL COMMENT '过期时间,默认 300 秒', `authorized_at` DATETIME DEFAULT NULL COMMENT '授权完成时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_scene_str` (`scene_str`), KEY `idx_scene_status` (`scene_str`, `status`), CONSTRAINT `fk_scene_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='扫码场景表'; -- --------------------------------------------------------------------------- -- 5.4 usage_logs — 使用日志 -- --------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `usage_logs` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` BIGINT UNSIGNED NOT NULL, `device_id` VARCHAR(128) DEFAULT NULL, `authorization_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '本次扣减的授权', `cost_type` ENUM('time','points') NOT NULL, `cost_points` INT NOT NULL DEFAULT 0 COMMENT '时间授权为 0', `used_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_user_time` (`user_id`, `used_at`), CONSTRAINT `fk_log_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, CONSTRAINT `fk_log_auth` FOREIGN KEY (`authorization_id`) REFERENCES `authorizations` (`id`) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='使用日志'; -- --------------------------------------------------------------------------- -- sessions — 会话令牌表(需求 9:session_token 服务端存储,有效期 24 小时) -- --------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `sessions` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `token` VARCHAR(64) NOT NULL COMMENT '随机生成的会话令牌', `user_id` BIGINT UNSIGNED NOT NULL, `device_id` VARCHAR(128) DEFAULT NULL COMMENT '签发时绑定的设备', `scene_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '签发来源场景', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `expires_at` DATETIME NOT NULL COMMENT '过期时间,默认 24 小时', PRIMARY KEY (`id`), UNIQUE KEY `uk_token` (`token`), KEY `idx_session_user` (`user_id`), KEY `idx_session_scene` (`scene_id`), CONSTRAINT `fk_session_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, CONSTRAINT `fk_session_scene` FOREIGN KEY (`scene_id`) REFERENCES `auth_scenes` (`id`) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会话令牌表';