| | |
| | | - Read: current `git diff`, untracked files under `tcm-training-admin-backend/` and `traditionalApp/pages/watchLiveFullscreen/` |
| | | |
| | | - [ ] **Step 1: 将最近已提交功能按主题归纳。** |
| | | - [ ] **Step 2: 将当前未提交修改按直播密码、全屏播放、客户端兼容性三组归纳。** |
| | | - [ ] **Step 2: 将当前未提交修改按全屏播放、客户端兼容性等主题归纳。** |
| | | - [ ] **Step 3: 区分真实内容差异与仅由换行符造成的工作区状态。** |
| | | |
| | | ### Task 3: 验证与交接文档 |
| | |
| | | - [ ] **Step 1: 执行后端测试、管理端类型检查、配置/差异静态检查。** |
| | | - [ ] **Step 2: 在文档中写明通过项、阻塞项和未覆盖的真机验证。** |
| | | - [ ] **Step 3: 自审路径、命令、接口和风险结论后交付。** |
| | | |
| | |
| | | `start_time` DATETIME DEFAULT NULL COMMENT '开始直播时间', |
| | | `video_url` VARCHAR(512) DEFAULT NULL COMMENT '视频地址', |
| | | `duration_seconds` INT DEFAULT NULL COMMENT '视频时长(秒)', |
| | | `password_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否开启观看密码:0否 1是', |
| | | `watch_password` VARCHAR(64) DEFAULT NULL COMMENT '观看密码', |
| | | `base_reserve_count` INT NOT NULL DEFAULT 0 COMMENT '基础预约量(初始刷基数)', |
| | | `base_watch_count` INT NOT NULL DEFAULT 0 COMMENT '基础观看量(初始刷基数)', |
| | | `real_reserve_count` INT NOT NULL DEFAULT 0 COMMENT '真实预约人数', |
| | |
| | | `start_time` datetime DEFAULT NULL COMMENT '开始直播时间', |
| | | `video_url` varchar(512) DEFAULT NULL COMMENT '视频地址', |
| | | `duration_seconds` int DEFAULT NULL COMMENT '视频时长(秒)', |
| | | `password_enabled` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开启观看密码:0否 1是', |
| | | `watch_password` varchar(64) DEFAULT NULL COMMENT '观看密码', |
| | | `base_reserve_count` int NOT NULL DEFAULT '0' COMMENT '基础预约量(初始刷基数)', |
| | | `base_watch_count` int NOT NULL DEFAULT '0' COMMENT '基础观看量(初始刷基数)', |
| | | `real_reserve_count` int NOT NULL DEFAULT '0' COMMENT '真实预约人数', |
| | |
| | | text-align: center; |
| | | } |
| | | |
| | | .watch-password-gate { |
| | | position: absolute; |
| | | left: 0; |
| | | top: 0; |
| | | z-index: 4; |
| | | width: 100%; |
| | | height: 100%; |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | justify-content: center; |
| | | background: rgba(0, 0, 0, 0.18); |
| | | } |
| | | |
| | | .watch-password-play { |
| | | width: 124rpx; |
| | | height: 124rpx; |
| | | line-height: 124rpx; |
| | | border-radius: 62rpx; |
| | | background: rgba(0, 0, 0, 0.68); |
| | | color: #ffffff; |
| | | font-size: 58rpx; |
| | | text-align: center; |
| | | text-indent: 8rpx; |
| | | box-shadow: 0 16rpx 40rpx rgba(0, 0, 0, 0.24); |
| | | } |
| | | |
| | | .watch-password-tip { |
| | | margin-top: 20rpx; |
| | | color: #ffffff; |
| | | font-size: 26rpx; |
| | | line-height: 36rpx; |
| | | text-shadow: 0 4rpx 14rpx rgba(0, 0, 0, 0.42); |
| | | } |
| | | |
| | | .viewer-count { |
| | | position: absolute; |
| | | top: 24rpx; |
| | |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | } |
| | | |
| | | .watch-password-modal-mask { |
| | | position: fixed; |
| | | left: 0; |
| | | top: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | z-index: 1000; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | padding: 40rpx; |
| | | box-sizing: border-box; |
| | | background: rgba(0, 0, 0, 0.46); |
| | | } |
| | | |
| | | .watch-password-modal { |
| | | width: 620rpx; |
| | | padding: 44rpx 36rpx 32rpx; |
| | | border-radius: 20rpx; |
| | | background: #ffffff; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .watch-password-title { |
| | | color: #222222; |
| | | font-size: 34rpx; |
| | | font-weight: 600; |
| | | line-height: 48rpx; |
| | | text-align: center; |
| | | } |
| | | |
| | | .watch-password-input { |
| | | width: 100%; |
| | | height: 88rpx; |
| | | margin-top: 34rpx; |
| | | padding: 0 24rpx; |
| | | box-sizing: border-box; |
| | | border-radius: 12rpx; |
| | | background: #f6f6f6; |
| | | color: #222222; |
| | | font-size: 30rpx; |
| | | } |
| | | |
| | | .watch-password-placeholder { |
| | | color: #999999; |
| | | font-size: 30rpx; |
| | | } |
| | | |
| | | .watch-password-error { |
| | | margin-top: 16rpx; |
| | | min-height: 34rpx; |
| | | color: #C63520; |
| | | font-size: 24rpx; |
| | | line-height: 34rpx; |
| | | } |
| | | |
| | | .watch-password-actions { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | margin-top: 34rpx; |
| | | } |
| | | |
| | | .watch-password-cancel, |
| | | .watch-password-confirm { |
| | | width: 260rpx; |
| | | height: 76rpx; |
| | | border-radius: 12rpx; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | font-size: 28rpx; |
| | | } |
| | | |
| | | .watch-password-cancel { |
| | | background: #f2f2f2; |
| | | color: #555555; |
| | | } |
| | | |
| | | .watch-password-confirm { |
| | | background: #C63520; |
| | | color: #ffffff; |
| | | |
| | | &.disabled { |
| | | opacity: 0.62; |
| | | } |
| | | } |
| | | |
| | | .answer-area { |