@page "/" @inject SongCatalogService Catalog @inject SiteSettingsService SiteSettings @inject IJSRuntime Js @inject ISnackbar Snackbar 洛星瓷歌单 洛星瓷歌单 快速查找会唱的歌,复制点歌文案,也可以给歌曲补充标签。 角色图占位 @if (_selectedTag is not null) { 标签:@_selectedTag } @if (_allTags.Count > 0) { @foreach (var tag in _allTags.Take(32)) { @tag } } @if (_isLoading) { } else if (_songs.Count == 0) { 歌单还是空的 之后导入歌曲后,这里会显示可搜索的曲目。 } else { @foreach (var song in _songs) { @song.Title @foreach (var tag in song.Tags) { @tag } 复制点歌 } } @code { private readonly List _songs = []; private readonly List _allTags = []; private string _search = string.Empty; private string? _selectedTag; private string _requestTemplate = "点歌《{title}》"; private bool _isLoading = true; protected override async Task OnInitializedAsync() { _requestTemplate = await SiteSettings.GetRequestTemplateAsync(); await LoadAsync(); } private async Task OnSearchChanged(string value) { _search = value; await LoadAsync(); } private async Task SelectTag(string tag) { _selectedTag = _selectedTag == tag ? null : tag; await LoadAsync(); } private async Task ClearTagFilter() { _selectedTag = null; await LoadAsync(); } private async Task LoadAsync() { _isLoading = true; var songs = await Catalog.SearchSongsAsync(_search, _selectedTag); var tags = await Catalog.GetVisibleTagsAsync(); _songs.Clear(); _songs.AddRange(songs.Select(SongCardState.From)); _allTags.Clear(); _allTags.AddRange(tags); _isLoading = false; } private async Task CopyRequest(string title) { var request = SiteSettingsService.FormatRequest(_requestTemplate, title); await Js.InvokeVoidAsync("navigator.clipboard.writeText", request); Snackbar.Add($"已复制:{request}", Severity.Success); } private async Task AddTag(SongCardState song) { try { await Catalog.AddViewerTagAsync(song.Id, song.NewTag); Snackbar.Add("标签已添加", Severity.Success); await LoadAsync(); } catch (InvalidOperationException ex) { Snackbar.Add(ex.Message, Severity.Warning); } } private sealed class SongCardState { public int Id { get; init; } public string Title { get; init; } = string.Empty; public IReadOnlyList Tags { get; init; } = []; public string NewTag { get; set; } = string.Empty; public static SongCardState From(SongListItem item) { return new SongCardState { Id = item.Id, Title = item.Title, Tags = item.Tags }; } } }