From bd95eed0248df2e12d4b3193695d9b0b0dc70e11 Mon Sep 17 00:00:00 2001 From: hajimi Date: Fri, 12 Jun 2026 17:34:00 +0800 Subject: [PATCH] no message --- .gitignore | 1 + README.md | 13 +- docker/.env.docker.example | 9 + docker/docker-compose.crawler.yml | 19 + docs/sql/add_ai_kb_recent_source_indexes.sql | 76 +++ docs/sql/create_ai_comment_task.sql | 16 + .../disable_article_ai_comment_crontab.sql | 6 + docs/sql/insert_ai_comment_config.sql | 41 ++ docs/sql/insert_ai_kb_consume_crontab.sql | 7 + .../insert_ai_kb_enqueue_recent_crontab.sql | 7 + scripts/deploy-server.ps1 | 66 ++- uniapp/src/components/feed-card/feed-card.vue | 32 +- .../src/components/match-card/match-card.vue | 4 +- uniapp/src/manifest.json | 7 +- .../components/WorldCupPanel.vue | 19 +- .../src/pages/ai_assistant/ai_assistant.vue | 459 +++++++++++++---- .../src/pages/match_detail/match_detail.vue | 13 +- uniapp/src/utils/assistant-markdown.ts | 208 ++++++++ uniapp/src/utils/match-time.ts | 29 ++ 业务进度管理.md | 463 ++++++++++++++++++ 20 files changed, 1383 insertions(+), 112 deletions(-) create mode 100644 docs/sql/add_ai_kb_recent_source_indexes.sql create mode 100644 docs/sql/create_ai_comment_task.sql create mode 100644 docs/sql/disable_article_ai_comment_crontab.sql create mode 100644 docs/sql/insert_ai_comment_config.sql create mode 100644 docs/sql/insert_ai_kb_consume_crontab.sql create mode 100644 docs/sql/insert_ai_kb_enqueue_recent_crontab.sql create mode 100644 uniapp/src/utils/assistant-markdown.ts create mode 100644 uniapp/src/utils/match-time.ts diff --git a/.gitignore b/.gitignore index 953cfe0..10557ef 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ bin-release/ /.code-graph/ **/.hbuilderx/ **/unpackage/ +qa/ diff --git a/README.md b/README.md index 5e0059c..18f9137 100644 --- a/README.md +++ b/README.md @@ -176,13 +176,20 @@ powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -From ### 自动增量发布 -如果只是发布最近一次提交的后端改动,可以使用 `--auto-incremental`,脚本会自动对比 `HEAD~1` 和 `HEAD`: +如果只是发布最近一次提交的后端改动,可以使用 `-AutoIncremental`,脚本会默认对比 `HEAD~1` 和 `HEAD`: ```powershell cd D:\www\sport-era powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -AutoIncremental -RemoteDir /www/wwwroot/test-server.sbnews.net ``` +如果需要一次发布最近 N 个提交的后端改动,可以追加 `-AutoIncrementalCommits `,例如发布最近 3 个提交会对比 `HEAD~3` 和 `HEAD`: + +```powershell +cd D:\www\sport-era +powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -AutoIncremental -AutoIncrementalCommits 3 -RemoteDir /www/wwwroot/test-server.sbnews.net +``` + 先演练不上传: ```powershell @@ -190,7 +197,9 @@ cd D:\www\sport-era powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -AutoIncremental -RemoteDir /www/wwwroot/test-server.sbnews.net -DryRun ``` -注意:自动增量只包含最近两个提交之间已经提交到 Git 的差异,不会包含工作区未提交文件。如有多次提交需要一起发布,请继续使用 `--from --to `。 +脚本会在打包和上传前先检查 `server` 工作区;如果 `server` 内存在未提交、删除或未跟踪文件,会先自动提交这些变更,再继续计算增量范围。可以通过 `-AutoCommitMessage "提交说明"` 自定义这次自动提交的说明。若存在合并冲突,需要先手动解决。 + +注意:自动增量只包含指定提交范围内已经提交到 Git 的差异,不会包含工作区未提交文件。需要指定任意起止提交时,继续使用 `-From -To `。 如果当前根目录 Git 只把 `server` 记录为 gitlink/submodule,且本机没有 `server/.git` 子仓库元数据,脚本无法拿到 `server` 内部的文件级差异;此时会自动降级为打包当前工作区默认的 5 个 server 目录,保证可以继续发布。 diff --git a/docker/.env.docker.example b/docker/.env.docker.example index 783e473..5b6d8ef 100644 --- a/docker/.env.docker.example +++ b/docker/.env.docker.example @@ -15,5 +15,14 @@ DQD_REDIS_PORT=6377 DQD_REDIS_PASSWORD=change-me DQD_REDIS_DB=4 +# PHP kb:enqueue-recent should point to the same Redis database as kb-worker. +AI_KB_REDIS_DB=4 + DQD_LOG_LEVEL=INFO DQD_LOG_FILE=/app/logs/crawler.log + +# AI KB worker embedding config. Keep real key in docker/.env.docker only. +EMBEDDING_API_KEY=change-me +EMBEDDING_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode +EMBEDDING_MODEL=text-embedding-v4 +EMBEDDING_DIM=1024 diff --git a/docker/docker-compose.crawler.yml b/docker/docker-compose.crawler.yml index f5e2e3d..9727763 100644 --- a/docker/docker-compose.crawler.yml +++ b/docker/docker-compose.crawler.yml @@ -18,3 +18,22 @@ services: - ${CRAWLER_DIR:-../server/public/dongqiudi-crawler}/data:/app/data extra_hosts: - "host.docker.internal:host-gateway" + + kb-worker: + container_name: sport-era-kb-worker + image: sport-era-crawler:latest + build: + context: ${CRAWLER_DIR:-../server/public/dongqiudi-crawler} + dockerfile: Dockerfile + restart: always + env_file: + - ./.env.docker + environment: + TZ: Asia/Shanghai + DQD_CONFIG_PATH: /app/config/settings.yaml + command: ["python", "scripts/kb_worker.py", "--batch=50", "--block-ms=5000", "--max-retries=3"] + volumes: + - ${CRAWLER_DIR:-../server/public/dongqiudi-crawler}/logs:/app/logs + - ${CRAWLER_DIR:-../server/public/dongqiudi-crawler}/data:/app/data + extra_hosts: + - "host.docker.internal:host-gateway" diff --git a/docs/sql/add_ai_kb_recent_source_indexes.sql b/docs/sql/add_ai_kb_recent_source_indexes.sql new file mode 100644 index 0000000..25a0535 --- /dev/null +++ b/docs/sql/add_ai_kb_recent_source_indexes.sql @@ -0,0 +1,76 @@ +SET @schema_name := DATABASE(); + +SET @sql := ( + SELECT IF( + COUNT(*) = 0, + 'ALTER TABLE `la_article` ADD INDEX `idx_kb_recent_article` (`update_time`, `id`, `is_show`, `delete_time`)', + 'SELECT 1' + ) + FROM `information_schema`.`statistics` + WHERE `table_schema` = @schema_name + AND `table_name` = 'la_article' + AND `index_name` = 'idx_kb_recent_article' +); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +SET @sql := ( + SELECT IF( + COUNT(*) = 0, + 'ALTER TABLE `la_match` ADD INDEX `idx_kb_recent_match` (`update_time`, `id`, `is_show`, `delete_time`)', + 'SELECT 1' + ) + FROM `information_schema`.`statistics` + WHERE `table_schema` = @schema_name + AND `table_name` = 'la_match' + AND `index_name` = 'idx_kb_recent_match' +); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +SET @sql := ( + SELECT IF( + COUNT(*) = 0, + 'ALTER TABLE `la_community_post` ADD INDEX `idx_kb_recent_post` (`update_time`, `id`, `status`, `delete_time`)', + 'SELECT 1' + ) + FROM `information_schema`.`statistics` + WHERE `table_schema` = @schema_name + AND `table_name` = 'la_community_post' + AND `index_name` = 'idx_kb_recent_post' +); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +SET @sql := ( + SELECT IF( + COUNT(*) = 0, + 'ALTER TABLE `la_lottery_draw_result` ADD INDEX `idx_kb_recent_draw` (`update_time`, `id`)', + 'SELECT 1' + ) + FROM `information_schema`.`statistics` + WHERE `table_schema` = @schema_name + AND `table_name` = 'la_lottery_draw_result' + AND `index_name` = 'idx_kb_recent_draw' +); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +SET @sql := ( + SELECT IF( + COUNT(*) = 0, + 'ALTER TABLE `la_lottery_ai_analysis` ADD INDEX `idx_kb_recent_ai_history` (`update_time`, `id`)', + 'SELECT 1' + ) + FROM `information_schema`.`statistics` + WHERE `table_schema` = @schema_name + AND `table_name` = 'la_lottery_ai_analysis' + AND `index_name` = 'idx_kb_recent_ai_history' +); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; diff --git a/docs/sql/create_ai_comment_task.sql b/docs/sql/create_ai_comment_task.sql new file mode 100644 index 0000000..f5f7eeb --- /dev/null +++ b/docs/sql/create_ai_comment_task.sql @@ -0,0 +1,16 @@ +CREATE TABLE IF NOT EXISTS `la_ai_comment_task` ( + `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', + `target_type` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '目标类型 article/post', + `target_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '目标内容ID', + `virtual_user_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '虚拟账号ID', + `persona_key` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '人设标识', + `selection_sources` TEXT NULL COMMENT '来源集合', + `comment_content` TEXT NULL COMMENT '评论正文', + `status` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '状态 0-待执行 1-成功 2-失败', + `error_msg` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '错误信息', + `create_time` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_target_status` (`target_type`, `target_id`, `status`) USING BTREE, + KEY `idx_virtual_user` (`virtual_user_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Docker AI评论任务表'; diff --git a/docs/sql/disable_article_ai_comment_crontab.sql b/docs/sql/disable_article_ai_comment_crontab.sql new file mode 100644 index 0000000..939fdec --- /dev/null +++ b/docs/sql/disable_article_ai_comment_crontab.sql @@ -0,0 +1,6 @@ +UPDATE `la_dev_crontab` +SET `status` = 0, + `update_time` = UNIX_TIMESTAMP(), + `remark` = CONCAT(IFNULL(`remark`, ''), ' [已迁移到 Docker ai_comment_dispatch]') +WHERE `command` = 'article_ai_comment' + AND `delete_time` IS NULL; diff --git a/docs/sql/insert_ai_comment_config.sql b/docs/sql/insert_ai_comment_config.sql new file mode 100644 index 0000000..149af4e --- /dev/null +++ b/docs/sql/insert_ai_comment_config.sql @@ -0,0 +1,41 @@ +INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`) +SELECT 'auto_comment_enabled', '1', 'Docker AI评论总开关', UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'auto_comment_enabled'); + +INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`) +SELECT 'auto_comment_user_pool_size', '100', 'Docker AI评论虚拟账号池数量', UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'auto_comment_user_pool_size'); + +INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`) +SELECT 'auto_comment_per_run', '50', 'Docker AI评论单轮投放上限', UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'auto_comment_per_run'); + +INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`) +SELECT 'auto_comment_daily_cap', '500', 'Docker AI评论每日成功上限', UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'auto_comment_daily_cap'); + +INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`) +SELECT 'auto_comment_concurrency', '4', 'Docker AI评论并发生成数', UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'auto_comment_concurrency'); + +INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`) +SELECT 'auto_comment_request_timeout', '180', 'Docker AI评论请求超时秒数', UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'auto_comment_request_timeout'); + +INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`) +SELECT + 'auto_comment_article_prompt', + '你是一名专业、克制、真实的体育资讯评论员。请根据给定资讯内容生成1条中文评论,要求自然、具体、像真实用户发言,评论长度控制在20到60字之间。不要输出标题、前缀、解释、表情、标签、项目符号,不要提及自己是AI,不要复述全文。', + 'Docker AI资讯评论提示词', + UNIX_TIMESTAMP(), + UNIX_TIMESTAMP() +WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'auto_comment_article_prompt'); + +INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`) +SELECT + 'auto_comment_post_prompt', + '你是一名活跃在体育与彩票社区的真实用户。请根据给定帖子内容、标签和人物设定,生成1条中文评论。评论要像真实社区回复,长度控制在18到66字之间,允许带轻微情绪和立场,但不要辱骂、不要承诺收益、不要暴露自己是AI。只输出评论正文,不要加前缀、编号、表情或话题标签。', + 'Docker AI帖子评论提示词', + UNIX_TIMESTAMP(), + UNIX_TIMESTAMP() +WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'auto_comment_post_prompt'); diff --git a/docs/sql/insert_ai_kb_consume_crontab.sql b/docs/sql/insert_ai_kb_consume_crontab.sql new file mode 100644 index 0000000..d637094 --- /dev/null +++ b/docs/sql/insert_ai_kb_consume_crontab.sql @@ -0,0 +1,7 @@ +INSERT INTO `la_dev_crontab` (`name`, `type`, `system`, `remark`, `command`, `params`, `status`, `expression`, `create_time`, `update_time`) +SELECT 'AI知识库同步消费', 1, 0, '消费AI知识库同步任务,自动补标资讯、赛事、彩票缺失或过期向量文档', 'kb:consume', '--batch=100', 1, '*/5 * * * *', UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS ( + SELECT 1 FROM `la_dev_crontab` + WHERE `command` = 'kb:consume' + AND `delete_time` IS NULL +); diff --git a/docs/sql/insert_ai_kb_enqueue_recent_crontab.sql b/docs/sql/insert_ai_kb_enqueue_recent_crontab.sql new file mode 100644 index 0000000..201304f --- /dev/null +++ b/docs/sql/insert_ai_kb_enqueue_recent_crontab.sql @@ -0,0 +1,7 @@ +INSERT INTO `la_dev_crontab` (`name`, `type`, `system`, `remark`, `command`, `params`, `status`, `expression`, `create_time`, `update_time`) +SELECT 'AI知识库Redis增量入队', 1, 0, '每分钟扫描最近30分钟资讯、彩票、加密资讯、赛事、社区帖子更新并写入Redis Stream', 'kb:enqueue-recent', '--limit=1000 --minutes=30', 1, '* * * * *', UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS ( + SELECT 1 FROM `la_dev_crontab` + WHERE `command` = 'kb:enqueue-recent' + AND `delete_time` IS NULL +); diff --git a/scripts/deploy-server.ps1 b/scripts/deploy-server.ps1 index 1a607a1..bb04040 100644 --- a/scripts/deploy-server.ps1 +++ b/scripts/deploy-server.ps1 @@ -6,6 +6,9 @@ param( [string]$HostName = "sbnews", [string]$SshBin = "ssh.exe", [switch]$AutoIncremental, + [ValidateRange(1, 1000)] + [int]$AutoIncrementalCommits = 1, + [string]$AutoCommitMessage = "", [string]$From = "", [string]$To = "", [string]$RemoteTmp = "/tmp", @@ -192,6 +195,55 @@ function Remove-IfExists { } } +function Get-DeployPathspec { + if ([string]::IsNullOrEmpty($GitPathPrefix)) { + return @(".") + } + return @($GitPathPrefix) +} + +function Commit-SourceChangesIfNeeded { + param( + [string]$Repository, + [string[]]$Pathspec + ) + + $statusArgs = @("-C", $Repository, "status", "--porcelain=v1", "--untracked-files=all", "--") + $Pathspec + $statusLines = @(& git @statusArgs) + if ($LASTEXITCODE -ne 0) { + Fail "git status failed" + } + + if ($statusLines.Count -eq 0) { + return + } + + $unmerged = @($statusLines | Where-Object { $_ -match "^(DD|AU|UD|UA|DU|AA|UU)" }) + if ($unmerged.Count -gt 0) { + Write-DeployLog "unmerged changes detected under ${SourceDir}:" + $unmerged | Select-Object -First 20 | ForEach-Object { Write-Host " $_" } + Fail "resolve merge conflicts under $SourceDir before deploy" + } + + Write-DeployLog "uncommitted changes detected under $SourceDir; auto committing before deploy:" + $maxDisplay = 80 + $statusLines | Select-Object -First $maxDisplay | ForEach-Object { Write-Host " $_" } + if ($statusLines.Count -gt $maxDisplay) { + Write-Host " ... and $($statusLines.Count - $maxDisplay) more" + } + + Invoke-Native "git" (@("-C", $Repository, "add", "-A", "--") + $Pathspec) + + $commitMessage = $AutoCommitMessage + if ([string]::IsNullOrWhiteSpace($commitMessage)) { + $commitMessage = "deploy: auto commit $SourceDir changes $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" + } + + Invoke-Native "git" (@("-C", $Repository, "commit", "-m", $commitMessage, "--") + $Pathspec) + $newCommit = (Invoke-NativeOutput "git" @("-C", $Repository, "rev-parse", "--short", "HEAD") | Select-Object -First 1) + Write-DeployLog "auto commit created: $newCommit" +} + function Copy-FullPayload { Write-DeployLog "building full payload from current working tree: $SourceDir" Write-DeployLog "full include paths: $($FullIncludePaths -join ' ')" @@ -306,6 +358,9 @@ function Write-UpdateLog { $fromShort = Get-ShortCommit $FromCommit $toShort = Get-ShortCommit $ToCommit Write-DeployLog "commit range: $fromShort -> $toShort" + if ($AutoIncremental) { + Write-DeployLog "auto incremental commits: $AutoIncrementalCommits" + } $logArgs = @("-C", $GitCwd, "-c", "i18n.logOutputEncoding=utf-8", "log", "--encoding=UTF-8", "--no-merges", "--date=format:%Y-%m-%d %H:%M:%S", "--pretty=format: * %h %ad %an %s", "$FromCommit..$ToCommit") if ($SourceIsGitLink) { @@ -432,9 +487,13 @@ if ($AutoIncremental -and ($From -or $To)) { Fail "-AutoIncremental cannot be used with -From/-To" } +if (-not $AutoIncremental -and $PSBoundParameters.ContainsKey("AutoIncrementalCommits")) { + Fail "-AutoIncrementalCommits can only be used with -AutoIncremental" +} + if ($AutoIncremental) { $Mode = "incremental" - $FromCommit = "HEAD~1" + $FromCommit = "HEAD~$AutoIncrementalCommits" $ToCommit = "HEAD" } elseif ($From -or $To) { if (-not $From -or -not $To) { @@ -483,6 +542,9 @@ if (-not $SourceIsGitRepo -and ($lsFiles | Where-Object { $_ -match "^160000\s" $SourceIsGitLink = $true } +$DeployPathspec = @(Get-DeployPathspec) +Commit-SourceChangesIfNeeded -Repository $GitCwd -Pathspec $DeployPathspec + if ($Mode -eq "incremental") { & git -C $GitCwd rev-parse --verify "$FromCommit^{commit}" *> $null if ($LASTEXITCODE -ne 0) { @@ -532,8 +594,10 @@ try { "built_at=$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" ) if ($Mode -eq "incremental") { + $autoIncrementalCommitCount = if ($AutoIncremental) { $AutoIncrementalCommits } else { 0 } $deployInfo += @( "auto_incremental=$([int]$AutoIncremental.IsPresent)", + "auto_incremental_commits=$autoIncrementalCommitCount", "source_is_gitlink=$([int]$SourceIsGitLink)", "from_commit=$FromCommit", "to_commit=$ToCommit", diff --git a/uniapp/src/components/feed-card/feed-card.vue b/uniapp/src/components/feed-card/feed-card.vue index 0034338..7a104f7 100644 --- a/uniapp/src/components/feed-card/feed-card.vue +++ b/uniapp/src/components/feed-card/feed-card.vue @@ -6,9 +6,10 @@ {{ descText }} {{ authorText }} - {{ item.comment_count || item.click || 0 - }}评论 - {{ formatTime(item.create_time) }} + + {{ item.comment_count || item.click || 0 }}阅读 + {{ formatTime(item.create_time) }} + { display: flex; flex-direction: row; align-items: center; + justify-content: space-between; margin-top: auto; padding-top: 12rpx; - gap: 12rpx; + gap: 16rpx; white-space: nowrap; overflow: hidden; + min-width: 0; } &__author { @@ -120,19 +123,22 @@ const formatTime = (t: string) => { text-align: left; } + &__footer-right { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-end; + gap: 12rpx; + margin-left: auto; + flex-shrink: 0; + min-width: 0; + } + &__meta { - flex: 1; font-size: 24rpx; color: #bbb; white-space: nowrap; - - &--center { - text-align: center; - } - - &--right { - text-align: right; - } + flex-shrink: 0; } &__img { diff --git a/uniapp/src/components/match-card/match-card.vue b/uniapp/src/components/match-card/match-card.vue index aa055e2..2ffd3ca 100644 --- a/uniapp/src/components/match-card/match-card.vue +++ b/uniapp/src/components/match-card/match-card.vue @@ -114,6 +114,7 @@