Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
7f69537
feat: 添加弹幕样式支持,优化弹幕属性处理逻辑;更新相关组件以支持模式和颜色设置
wintbiit Mar 28, 2026
e06598b
feat: 更新 ScheduleList 组件样式,添加日期分隔符图标和样式;调整 overflow-x 属性以改善布局
wintbiit Mar 28, 2026
36a36e8
ci: fix deployment
wintbiit Mar 28, 2026
4344f23
refactor: 统一 rmData 导入路径,移除不必要的 index 文件;优化相关组件的代码结构以提升可读性
wintbiit Mar 29, 2026
c4110f6
feat: 更新 iframe 源地址并增强权限设置;添加 LivingTag 组件以替代 Live 标签;优化 LivePlayer 组…
wintbiit Mar 29, 2026
66f7c38
refactor: 移除不必要的聊天记录加载逻辑,优化 DanmuService 代码结构
wintbiit Mar 29, 2026
ed96d2f
feat: 添加比赛互动功能,集成实时反应和支持系统;更新相关组件以支持新的互动逻辑和 UI 元素
wintbiit Mar 29, 2026
98d3191
feat: 添加 mock 开发环境支持,集成实时数据模拟;更新 Vite 配置以支持动态代理和新脚本
wintbiit Mar 29, 2026
9847325
feat: 更新 PWA 资源配置,添加新的图标和截图;引入 LivingTag 和 ScheduleItem 组件以增强比赛信息展示
wintbiit Mar 29, 2026
9ddabf3
feat: 添加新的互动反应功能,更新反应配置和 UI 组件;优化弹幕服务以支持动态加载和状态管理WIP
wintbiit Mar 29, 2026
4806f07
feat: 更新开发环境配置,添加环境变量支持;新增原则文档以规范组件开发和样式使用;移除不必要的资源文件并优化项目结构
wintbiit Mar 30, 2026
f3d19e1
feat: enhance live player with dynamic danmu styles and support button
wintbiit Apr 2, 2026
e324195
feat: 优化比赛状态管理,重构相关计算属性;添加自动选择区域功能以提升用户体验
wintbiit Apr 3, 2026
04f7c5d
feat: refactor rmData store to utilize web worker for data handling
wintbiit Apr 3, 2026
d2413d0
fix: pwa auto update
wintbiit Apr 3, 2026
1146c72
feat: enhance viewer engagement features and improve danmu handling
wintbiit Apr 3, 2026
7e3dd0a
fix: pages ci
wintbiit Apr 3, 2026
cc3da5a
feat: 添加实时互动消息订阅功能,优化用户参与体验
wintbiit Apr 3, 2026
f9b277a
feat: implement IM worker client and worker for engagement and danmu …
wintbiit Apr 3, 2026
66ac79d
feat: 添加反应选择器和增强用户交互体验
wintbiit Apr 3, 2026
0eea544
feat: 重构应用布局,优化用户界面和主题样式
wintbiit Apr 3, 2026
3345f02
Revert "feat: 重构应用布局,优化用户界面和主题样式"
wintbiit Apr 4, 2026
6aac57b
Revert "feat: 添加反应选择器和增强用户交互体验"
wintbiit Apr 4, 2026
7fbd2c6
feat: add local echo for danmu messages and improve error handling in…
wintbiit Apr 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
VITE_LIVEJSON_PROXY=
VITE_IMG_PROXY=
VITE_CHATROOM_APP_ID=
VITE_CHATROOM_APP_KEY=
VITE_CHATROOM_APP_KEY=
# Only include engagement messages from the last N minutes (default 30)
VITE_ENGAGEMENT_QUERY_WINDOW_MINUTES=30
7 changes: 7 additions & 0 deletions .env.mock
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Copy to `.env.development.local` (gitignored) or run: pnpm dev:mock
#
# When VITE_RM_MOCK=1, Vite serves /live_json/*.json from mock/rm-live.mock.ts
# instead of proxying to rm-static. LeanCloud / 弹幕仍走现有配置,不在此 mock。
#
# CurrentMatchPanel / runningMatchForSelectedZone 只认赛程里 status=STARTED(不是 PLAYING)。
VITE_RM_MOCK=1
4 changes: 2 additions & 2 deletions .github/workflows/deploy-cos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@ name: Deploy to Tencent COS
on:
push:
branches:
- master
- main
- release
workflow_dispatch:

jobs:
Expand All @@ -15,6 +14,7 @@ jobs:
VITE_LIVEJSON_PROXY: ${{ vars.VITE_LIVEJSON_PROXY }}
VITE_CHATROOM_APP_ID: ${{ secrets.VITE_CHATROOM_APP_ID }}
VITE_CHATROOM_APP_KEY: ${{ secrets.VITE_CHATROOM_APP_KEY }}
VITE_ENGAGEMENT_CHATROOM_ID: ${{ secrets.VITE_ENGAGEMENT_CHATROOM_ID }}
steps:
- name: Checkout
uses: actions/checkout@v4
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/deploy-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ on:
push:
branches:
- master
- main
workflow_dispatch:

permissions:
Expand All @@ -20,11 +19,12 @@ jobs:
build:
runs-on: ubuntu-latest
env:
VITE_BASE: ${{ github.event.repository.name == format('{0}.github.io', github.repository_owner) && '/' || format('/{0}/', github.event.repository.name) }}
# VITE_BASE: ${{ github.event.repository.name == format('{0}.github.io', github.repository_owner) && '/' || format('/{0}/', github.event.repository.name) }}
VITE_IMG_PROXY: ${{ vars.VITE_IMG_PROXY }}
VITE_LIVEJSON_PROXY: ${{ vars.VITE_LIVEJSON_PROXY }}
VITE_CHATROOM_APP_ID: ${{ secrets.VITE_CHATROOM_APP_ID }}
VITE_CHATROOM_APP_KEY: ${{ secrets.VITE_CHATROOM_APP_KEY }}
VITE_ENGAGEMENT_CHATROOM_ID: ${{ secrets.VITE_ENGAGEMENT_CHATROOM_ID }}
steps:
- name: Checkout
uses: actions/checkout@v4
Expand Down
5 changes: 3 additions & 2 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="%BASE_URL%rmlive-logo.svg" />
<link rel="apple-touch-icon" href="%BASE_URL%rmlive-logo.svg" />
<link rel="icon" href="%BASE_URL%favicon.ico" sizes="48x48" />
<link rel="icon" href="%BASE_URL%rmlive-logo.svg" sizes="any" type="image/svg+xml" />
<link rel="apple-touch-icon" href="%BASE_URL%apple-touch-icon-180x180.png" />
<link rel="preconnect" href="https://rm-static.djicdn.com" crossorigin />
<link rel="preconnect" href="https://schedule.scutbot.cn" crossorigin />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
Expand Down
121 changes: 121 additions & 0 deletions mock/rm-live.mock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
import { defineMock } from 'vite-plugin-mock-dev-server/helper';

/** Keep in sync across mock payloads; `normalizeZoneId('1')` is used in the app. */
const MOCK_ZONE_ID = '1';
const MOCK_ZONE_NAME = 'Mock 赛区';

const TEST_HLS = 'https://demo.unified-streaming.com/k8s/live/scte35.isml/.m3u8';
const TEST_CHATROOM_ID = '69bbb2c62fd897236f698ab9';

const liveGameInfo = {
eventData: [
{
zoneId: MOCK_ZONE_ID,
zoneName: MOCK_ZONE_NAME,
liveState: 1,
matchState: 1,
chatRoomId: TEST_CHATROOM_ID,
zoneLiveString: [
{
label: '720p',
res: 'high',
src: TEST_HLS,
},
],
},
],
};

const side = (team: string, college: string) => ({
player: {
team: {
name: team,
collegeName: college,
collegeLogo: '',
},
},
});

const currentAndNextMatches = [
{
zoneId: MOCK_ZONE_ID,
currentMatch: {
id: 'mock-current',
slug: 'mock-slug',
orderNumber: '101',
status: 'STARTED',
matchType: '小组赛',
planStartedAt: '2026-03-28T12:00:00.000Z',
planGameCount: 3,
blueSideWinGameCount: 0,
redSideWinGameCount: 0,
blueSide: side('蓝方战队', '蓝方大学'),
redSide: side('红方战队', '红方大学'),
zone: { id: MOCK_ZONE_ID, zoneId: MOCK_ZONE_ID, name: MOCK_ZONE_NAME },
},
nextMatch: null,
},
];

/** `getRunningMatch` only treats `STARTED` as the live row (not `PLAYING`). */
const schedule = {
data: {
event: {
title: 'Mock 赛事',
zones: {
nodes: [
{
id: MOCK_ZONE_ID,
zoneId: MOCK_ZONE_ID,
zoneName: MOCK_ZONE_NAME,
groupMatches: {
nodes: [
{
id: 'mock-match-1',
slug: 'mock-slug',
orderNumber: '101',
planStartedAt: '2026-03-28T12:00:00.000Z',
matchType: '小组赛',
status: 'STARTED',
blueSideWinGameCount: 0,
redSideWinGameCount: 0,
planGameCount: 3,
blueSide: side('蓝方战队', '蓝方大学'),
redSide: side('红方战队', '红方大学'),
},
],
},
knockoutMatches: { nodes: [] },
},
],
},
},
},
};

export default [
defineMock({
url: '/live_json/live_game_info.json',
body: liveGameInfo,
}),
defineMock({
url: '/live_json/current_and_next_matches.json',
body: currentAndNextMatches,
}),
defineMock({
url: '/live_json/schedule.json',
body: schedule,
}),
defineMock({
url: '/live_json/groups_order.json',
body: {},
}),
defineMock({
url: '/live_json/group_rank_info.json',
body: {},
}),
defineMock({
url: '/live_json/robot_data.json',
body: [],
}),
];
8 changes: 8 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
"type": "module",
"scripts": {
"dev": "vite",
"dev:mock": "cross-env VITE_RM_MOCK=1 vite --mode mock",
"create:im-client": "node --experimental-strip-types src/scripts/createImClient.ts",
"build": "vue-tsc -b && vite build",
"build:iframe": "cross-env VITE_BUILD_IFRAME=true vite build --mode iframe",
"build:all": "pnpm build && pnpm build:iframe",
Expand Down Expand Up @@ -34,10 +36,13 @@
},
"devDependencies": {
"@antfu/eslint-config": "^7.7.2",
"@tailwindcss/vite": "^4.2.2",
"@types/node": "^24.12.0",
"@vite-pwa/assets-generator": "^1.0.2",
"@vitejs/plugin-vue": "^6.0.5",
"@vue/tsconfig": "^0.9.0",
"cross-env": "^7.0.3",
"dotenv": "^17.4.0",
"eslint": "^9.22.0",
"eslint-config-prettier": "^10.1.1",
"eslint-plugin-prettier": "^5.2.3",
Expand All @@ -46,13 +51,16 @@
"lint-staged": "^15.2.2",
"prettier": "^3.5.3",
"rollup-plugin-visualizer": "^7.0.1",
"sharp": "^0.34.5",
"stylelint": "~16.16.0",
"stylelint-config-standard": "^37.0.0",
"stylelint-order": "~6.0.4",
"tailwindcss": "^4.2.2",
"terser": "^5.46.1",
"typescript": "~5.9.3",
"typescript-eslint": "^8.26.1",
"vite": "^8.0.1",
"vite-plugin-mock-dev-server": "^2.1.1",
"vite-plugin-pwa": "^1.2.0",
"vitest": "^4.1.0",
"vue-tsc": "^3.2.5",
Expand Down
Loading
Loading