fix(player-desktop): 移除分类及标签的表情符号、修复首页快速下注缺少赔率数据及缺失翻译键的问题

This commit is contained in:
2026-06-30 17:50:38 +08:00
parent 178787e89a
commit 3df0dd8c2c
7 changed files with 39 additions and 11 deletions

View File

@@ -189,8 +189,8 @@ export class PlayerController {
const [banners, announcements, allMatches, upcomingMatches, inboxEnabled] = await Promise.all([ const [banners, announcements, allMatches, upcomingMatches, inboxEnabled] = await Promise.all([
this.content.listActive('BANNER', locale), this.content.listActive('BANNER', locale),
this.content.listActiveAnnouncements(locale), this.content.listActiveAnnouncements(locale),
this.matches.listPublished(locale, undefined, { includeMarkets: false }), this.matches.listPublished(locale, undefined, { includeMarkets: true }),
this.matches.listUpcomingPublished(locale), this.matches.listUpcomingPublished(locale, { includeMarkets: true }),
this.systemConfig.getInboxFeatureEnabled(), this.systemConfig.getInboxFeatureEnabled(),
]); ]);
const timeZone = safeTimeZone(headerTimeZone); const timeZone = safeTimeZone(headerTimeZone);

View File

@@ -1592,17 +1592,42 @@ export class MatchesService {
); );
} }
/** 首页卡片快速下注所需的核心玩法类型 */
private static readonly HOME_CARD_MARKET_TYPES = [
'FT_1X2',
'FT_HANDICAP',
'FT_OVER_UNDER',
] as const;
/** 未来 N 天内开赛的已发布赛事(按开赛时间升序,不限 isHot */ /** 未来 N 天内开赛的已发布赛事(按开赛时间升序,不限 isHot */
async listUpcomingPublished( async listUpcomingPublished(
locale = 'en-US', locale = 'en-US',
options?: { limit?: number; days?: number }, options?: { limit?: number; days?: number; includeMarkets?: boolean },
) { ) {
const limit = options?.limit ?? 50; const limit = options?.limit ?? 50;
const days = options?.days ?? 3; const days = options?.days ?? 3;
const includeMarkets = options?.includeMarkets ?? false;
const now = new Date(); const now = new Date();
const end = new Date(now); const end = new Date(now);
end.setDate(end.getDate() + days); end.setDate(end.getDate() + days);
const marketsRelation = includeMarkets
? {
where: {
status: { in: ['OPEN', 'SUSPENDED', 'CLOSED'] },
showOnPlayer: true,
marketType: { in: [...MatchesService.HOME_CARD_MARKET_TYPES] },
},
include: {
selections: {
where: { status: { in: ['OPEN', 'SUSPENDED', 'CLOSED'] } },
orderBy: { sortOrder: 'asc' as const },
},
},
orderBy: { sortOrder: 'asc' as const },
}
: this.playerMarketStatusInclude;
const matches = await this.prisma.match.findMany({ const matches = await this.prisma.match.findMany({
where: { where: {
status: { in: ['PUBLISHED', 'CLOSED', 'PENDING_SETTLEMENT'] }, status: { in: ['PUBLISHED', 'CLOSED', 'PENDING_SETTLEMENT'] },
@@ -1625,14 +1650,14 @@ export class MatchesService {
homeTeam: true, homeTeam: true,
awayTeam: true, awayTeam: true,
score: true, score: true,
markets: this.playerMarketStatusInclude, markets: marketsRelation,
}, },
orderBy: [{ startTime: 'asc' }, { displayOrder: 'asc' }], orderBy: [{ startTime: 'asc' }, { displayOrder: 'asc' }],
take: limit, take: limit,
}); });
return Promise.all( return Promise.all(
matches.map((m) => this.enrichMatch(m, locale, { omitMarkets: true })), matches.map((m) => this.enrichMatch(m, locale, { omitMarkets: !includeMarkets })),
); );
} }

View File

@@ -5,9 +5,9 @@ import { useI18n } from 'vue-i18n';
type SportCategory = 'football' | 'basketball' | 'tennis'; type SportCategory = 'football' | 'basketball' | 'tennis';
const SPORT_CATEGORIES = [ const SPORT_CATEGORIES = [
{ id: 'football' as const, icon: '', labelKey: 'bet.sport_football', enabled: true }, { id: 'football' as const, icon: '', labelKey: 'bet.sport_football', enabled: true },
{ id: 'basketball' as const, icon: '🏀', labelKey: 'bet.sport_basketball', enabled: false }, { id: 'basketball' as const, icon: '', labelKey: 'bet.sport_basketball', enabled: false },
{ id: 'tennis' as const, icon: '🎾', labelKey: 'bet.sport_tennis', enabled: false }, { id: 'tennis' as const, icon: '', labelKey: 'bet.sport_tennis', enabled: false },
] as const; ] as const;
const { t } = useI18n(); const { t } = useI18n();
@@ -34,7 +34,7 @@ function selectSport(id: SportCategory, enabled: boolean) {
:aria-current="sport.enabled && activeSport === sport.id ? 'page' : undefined" :aria-current="sport.enabled && activeSport === sport.id ? 'page' : undefined"
@click="selectSport(sport.id, sport.enabled)" @click="selectSport(sport.id, sport.enabled)"
> >
<span class="sport-category-icon" aria-hidden="true">{{ sport.icon }}</span> <span v-if="sport.icon" class="sport-category-icon" aria-hidden="true">{{ sport.icon }}</span>
<span class="sport-category-label">{{ t(sport.labelKey) }}</span> <span class="sport-category-label">{{ t(sport.labelKey) }}</span>
<span v-if="!sport.enabled" class="sport-category-soon">{{ t('bet.sport_coming_soon') }}</span> <span v-if="!sport.enabled" class="sport-category-soon">{{ t('bet.sport_coming_soon') }}</span>
</button> </button>

View File

@@ -405,6 +405,7 @@ export default {
correct_score: 'Correct score', correct_score: 'Correct score',
no_markets: 'No markets available', no_markets: 'No markets available',
no_markets_filtered: 'No markets match the current filter', no_markets_filtered: 'No markets match the current filter',
no_market_odds: 'No odds available',
popover_title: 'Confirm bet', popover_title: 'Confirm bet',
place_now: 'Bet now', place_now: 'Bet now',
add_to_single: 'Add to singles', add_to_single: 'Add to singles',

View File

@@ -417,6 +417,7 @@ export default {
correct_score: 'Skor tepat', correct_score: 'Skor tepat',
no_markets: 'Tiada pasaran tersedia', no_markets: 'Tiada pasaran tersedia',
no_markets_filtered: 'Tiada pasaran sepadan dengan penapis semasa', no_markets_filtered: 'Tiada pasaran sepadan dengan penapis semasa',
no_market_odds: 'Tiada odds pasaran',
popover_title: 'Sahkan pertaruhan', popover_title: 'Sahkan pertaruhan',
place_now: 'Pertaruhan sekarang', place_now: 'Pertaruhan sekarang',
add_to_single: 'Tambah tunggal', add_to_single: 'Tambah tunggal',

View File

@@ -405,6 +405,7 @@ export default {
correct_score: '波胆', correct_score: '波胆',
no_markets: '暂无可用盘口', no_markets: '暂无可用盘口',
no_markets_filtered: '当前筛选下暂无盘口', no_markets_filtered: '当前筛选下暂无盘口',
no_market_odds: '暂无盘口赔率',
popover_title: '确认投注', popover_title: '确认投注',
place_now: '立即下注', place_now: '立即下注',
add_to_single: '加入单关', add_to_single: '加入单关',

View File

@@ -131,7 +131,7 @@ void loadParlayMatches(true);
:class="{ active: mainTab === 'matches' }" :class="{ active: mainTab === 'matches' }"
@click="setMainTab('matches')" @click="setMainTab('matches')"
> >
{{ t('bet.tab_matches') }} {{ t('bet.tab_matches') }}
</button> </button>
<button <button
type="button" type="button"
@@ -139,7 +139,7 @@ void loadParlayMatches(true);
:class="{ active: mainTab === 'outright' }" :class="{ active: mainTab === 'outright' }"
@click="setMainTab('outright')" @click="setMainTab('outright')"
> >
🏆 {{ t('bet.tab_outright') }} {{ t('bet.tab_outright') }}
</button> </button>
</div> </div>
<button <button