From 3badd0c692209da631a572d7f9b7fb2ffca3c341 Mon Sep 17 00:00:00 2001 From: zpc Date: Thu, 19 Sep 2024 03:18:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=9F=B3=E4=B9=90=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 + .../AppExtend/AppConfigurationExtend.cs | 3 + .../HuanMeng.MiaoYu.Code/Music/MusicBLL.cs | 196 +++++++++++++++++- .../Music/MusicService.cs | 31 ++- .../HuanMeng.MiaoYu.Code/Users/UserBLL.cs | 4 +- .../HuanMeng.MiaoYu.Code/Users/UserInfoBLL.cs | 11 + .../DbSqlServer/Db_MiaoYu/M_SongInfo.cs | 2 + .../DbSqlServer/Db_MiaoYu/M_Songs.cs | 10 + .../DbSqlServer/Db_MiaoYu/MiaoYuContext.cs | 5 + .../DbSqlServer/Db_MiaoYu/T_User.cs | 2 + .../DbSqlServer/Db_MiaoYu/T_User_Data.cs | 2 +- .../Dto/Music/MusicCreateRequest.cs | 22 +- .../Dto/Music/MusicSongInfoDto.cs | 23 ++ .../Dto/Music/MusicSongsInfo.cs | 31 +++ .../Dto/Music/MusicSongsListDto.cs | 88 ++++++++ .../Dto/Music/MusicUserDto.cs | 40 ++++ .../Controllers/MusicController.cs | 77 ++++++- 17 files changed, 528 insertions(+), 23 deletions(-) create mode 100644 src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicSongsInfo.cs create mode 100644 src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicSongsListDto.cs create mode 100644 src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicUserDto.cs diff --git a/README.md b/README.md index 6f059e8..64a9875 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,11 @@ docker push 123.207.203.228:92/miaoyuapi:latest docker tag miaoyuapi:dev-1.2.7 123.207.203.228:92/miaoyuapi:dev-1.2.7 docker push 123.207.203.228:92/miaoyuapi:dev-1.2.7 //docker build -t myregistry.com/myusername/myapp:v1.0 . + docker build -t miaoyuapi:dev-1.3.31 -t miaoyuapi:latest -t 123.207.203.228:92/miaoyuapi:dev-1.3.31 -t 123.207.203.228:92/miaoyuapi:latest --build-arg VERSION=1.3.31 --build-arg TARGET=dev -f src/2-api/HuanMeng.MiaoYu.WebApi/Dockerfile . + docker push 123.207.203.228:92/miaoyuapi:dev-1.3.31 + docker push 123.207.203.228:92/miaoyuapi:latest + docker build -t miaoyu:dev-1.3.31 -f src/2-api/HuanMeng.MiaoYu.WebApi/Dockerfile . docker build --no-cache --progress=plain -t hm-admin:dev-1.0.3 -t hm-admin:latest -t 123.207.203.228:92/hm-admin:dev-1.0.3 -t 123.207.203.228:92/hm-admin:latest -f MiaoYu.Api.Admin/Dockerfile . docker tag hm-admin:dev-1.0.0 docker build -t hm-admin:v1.0 -t hm-admin:latest . diff --git a/src/0-core/HuanMeng.MiaoYu.Code/AppExtend/AppConfigurationExtend.cs b/src/0-core/HuanMeng.MiaoYu.Code/AppExtend/AppConfigurationExtend.cs index 03f054e..d81915d 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/AppExtend/AppConfigurationExtend.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/AppExtend/AppConfigurationExtend.cs @@ -18,6 +18,7 @@ using Microsoft.IdentityModel.Protocols; using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models; using HuanMeng.MiaoYu.Code.Payment; using System.Collections.Frozen; +using HuanMeng.MiaoYu.Code.Music; namespace HuanMeng.MiaoYu.Code.AppExtend { @@ -124,6 +125,8 @@ namespace HuanMeng.MiaoYu.Code.AppExtend AppConfigInit(builder.Configuration); builder.Services.AddScoped(); builder.Services.AddHostedService(); + builder.Services.AddHostedService(); + return builder; } diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Music/MusicBLL.cs b/src/0-core/HuanMeng.MiaoYu.Code/Music/MusicBLL.cs index d8a21e4..83dd521 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Music/MusicBLL.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Music/MusicBLL.cs @@ -15,6 +15,10 @@ using Newtonsoft.Json.Serialization; using Newtonsoft.Json; using HuanMeng.MiaoYu.Code.Chat.Contract; using Org.BouncyCastle.Utilities; +using HuanMeng.MiaoYu.Code.Users; +using Org.BouncyCastle.Crypto; +using HuanMeng.MiaoYu.Model.Dto; +using HuanMeng.MiaoYu.Code.DataAccess; namespace HuanMeng.MiaoYu.Code.Music { @@ -44,6 +48,37 @@ namespace HuanMeng.MiaoYu.Code.Music return Task.FromResult(new BaseResponse>(ResonseCode.Success, "", list)); } + /// + /// 获取用户信息 + /// + /// + public async Task> GetUserInfo() + { + var user = await Dao.daoDbMiaoYu.context.T_User.FirstOrDefaultAsync(it => it.Id == _UserId); + if (user == null) + { + throw new Exception("用户不存在"); + } + //获取用户余额 + UserInfoBLL userInfoBLL = new UserInfoBLL(Dao, _UserId); + var Currency = userInfoBLL[UserCurrencyType.生成音乐点数]?.CurrencyMoney; + string sqlString = $@"select isnull(sum(PlayCount),0) PlayCount,isnull(sum(LikeCount),0) LikeCount,isnull(sum(DownloadCount),0) DownloadCount from M_Songs where AuthorId={_UserId}"; + var info = Dao.daoDbMiaoYu.context.Database.SqlQueryRaw(sqlString).FirstOrDefault(); + + List characters = new List(); + return new BaseResponse(ResonseCode.Success, "请求成功", new MusicUserDto + { + NickName = user.NickName, + UserId = user.Id, + UserIconUrl = string.IsNullOrEmpty(user?.UserIconUrl) ? "https://cos.shhuanmeng.com/default.png" : user?.UserIconUrl, + Vip = 0, + DownloadCount = info.DownloadCount, + LikeCount = info.LikeCount, + PlayCount = info.PlayCount, + MusicPoints = (int)Currency + }); + } + /// /// 分类下详情列表,每次只显示50个 /// @@ -86,12 +121,51 @@ namespace HuanMeng.MiaoYu.Code.Music } /// - /// + /// 创建我的音乐风格 + /// + /// + public async Task> CreateUserMusicGenres(string genresName) + { + var genresCount = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(this, it => it.IsEnabled)?.Where(it => it.GenreName == genresName).Count(); + if (genresCount > 0) + { + throw new Exception("音乐风格名称重复"); + } + var c = Dao.daoDbMiaoYu.context.M_UserGenres.Where(it => it.UserId == _UserId && it.GenreName == genresName).Count(); + if (c > 0) + { + throw new Exception("音乐风格名称重复"); + } + M_UserGenres m_UserGenres = new M_UserGenres() + { + CreateAt = DateTime.Now, + GenreName = genresName, + UserId = _UserId, + }; + Dao.daoDbMiaoYu.context.Add(m_UserGenres); + await Dao.daoDbMiaoYu.context.SaveChangesAsync(); + return new BaseResponse(ResonseCode.Success, "创建成功", true); + } + + /// + /// 我的音乐列表 + /// + /// + public async Task>> GetMyMusicList() + { + var list = await Dao.daoDbMiaoYu.context.M_Songs.Where(it => it.AuthorId == _UserId && it.State >= 0).ToListAsync(); + var data = Mapper.Map>(list); + return new BaseResponse>(ResonseCode.Success, "", data); + } + + + /// + /// 创建音乐 /// /// /// /// - public async Task> CreateMusic(MusicCreateRequest musicCreateRequest) + public async Task> CreateMusic(MusicCreateRequest musicCreateRequest) { if (_UserId == 0) { @@ -102,6 +176,14 @@ namespace HuanMeng.MiaoYu.Code.Music { throw new Exception("音乐点数不足"); } + bool isGenresId = false; + var genresId = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(this, it => it.IsEnabled)?.FirstOrDefault(it => it.GenreName == musicCreateRequest.GenreName)?.Id; + if (genresId == null || genresId <= 0) + { + isGenresId = true; + genresId = Dao.daoDbMiaoYu.context.M_UserGenres.Where(it => it.UserId == _UserId && it.GenreName == musicCreateRequest.GenreName).FirstOrDefault()?.Id; + + } Dictionary keyValuePairs = new Dictionary(); keyValuePairs.Add("gpt_description_prompt", $"歌曲风格:{musicCreateRequest.GenreName}"); keyValuePairs.Add("make_instrumental", false); @@ -135,8 +217,9 @@ namespace HuanMeng.MiaoYu.Code.Music GetUrl = url, RequestInfo = requestBody, ResonseInfo = responseContent, - Status = "已完成", + Status = "正在生成", UpdateAt = DateTime.Now, + UserId = _UserId }; Dao.daoDbMiaoYu.context.Add(m_SongInfo); Dao.daoDbMiaoYu.context.SaveChanges(); @@ -146,20 +229,115 @@ namespace HuanMeng.MiaoYu.Code.Music } if (!string.IsNullOrEmpty(musicId1)) { - var song1 = GetSong(musicCreateRequest.GenreName, musicCreateRequest.Name, musicId1, m_SongInfo.Id); + var song1 = GetSong(musicCreateRequest.GenreName, musicCreateRequest.Name, musicId1, m_SongInfo.Id, genresId); + song1.AuthorName = userInfoBLL.UserName; + song1.IsUserGenre = isGenresId; Dao.daoDbMiaoYu.context.Add(song1); } if (!string.IsNullOrEmpty(musicId2)) { - var song2 = GetSong(musicCreateRequest.GenreName, musicCreateRequest.Name, musicId2, m_SongInfo.Id); + var song2 = GetSong(musicCreateRequest.GenreName, musicCreateRequest.Name, musicId2, m_SongInfo.Id, genresId); + song2.AuthorName = userInfoBLL.UserName; + song2.IsUserGenre = isGenresId; Dao.daoDbMiaoYu.context.Add(song2); } //扣除货币 userInfoBLL[UserCurrencyType.生成音乐点数].ConsumeMoneyNoWork(-10, Dao); - return new BaseResponse(ResonseCode.Success, "音乐正在生成", true) { }; + Dao.daoDbMiaoYu.context.SaveChanges(); + return new BaseResponse(ResonseCode.Success, "音乐正在生成", m_SongInfo.Id) { }; } - private M_Songs GetSong(string genreName, string name, string? musicId1, int songInfoId) + /// + /// 获取音乐生成进度 + /// + /// + /// + public async Task> GetMusicSchedule(int id) + { + var s = await Dao.daoDbMiaoYu.context.M_SongInfo.Where(it => it.Id == id).FirstOrDefaultAsync(); + + if (s?.Status == "已完成") + { + return new BaseResponse(ResonseCode.Success, "", true); + } + return new BaseResponse(ResonseCode.Success, "", false); + } + + /// + /// 歌曲审核 + /// + /// + /// + public async Task> MusicSongsReview(int id) + { + var songs = await Dao.daoDbMiaoYu.context.M_Songs.Where(it => it.Id == id).FirstOrDefaultAsync(); + if (songs == null) + { + throw new Exception("歌曲不存在"); + } + if (songs.State == 0) + { + throw new Exception("请等待歌曲生成成功"); + } + if (songs.State == -3) + { + throw new Exception("歌曲审核失败"); + } + if (songs.State == 3 && songs.IsPublic) + { + throw new Exception("歌曲已经在公开状态中"); + } + if (songs.State == 3 && !songs.IsPublic) + { + songs.IsPublic = true; + await Dao.daoDbMiaoYu.context.SaveChangesAsync(); + return new BaseResponse(ResonseCode.Success, "歌曲已公开", true); + } + songs.State = 2; + await Dao.daoDbMiaoYu.context.SaveChangesAsync(); + return new BaseResponse(ResonseCode.Success, "歌曲已提交审核", true); + } + /// + /// 取消审核 + /// + /// + /// + /// + + public async Task> MusicCancelSongsReview(int id) + { + var songs = await Dao.daoDbMiaoYu.context.M_Songs.Where(it => it.Id == id).FirstOrDefaultAsync(); + if (songs == null) + { + throw new Exception("歌曲不存在"); + } + if (songs.State == 0) + { + throw new Exception("请等待歌曲生成成功"); + } + if (songs.State == 2) + { + songs.State = 1; + } + if (songs.State == 3) + { + songs.IsPublic = false; + } + + await Dao.daoDbMiaoYu.context.SaveChangesAsync(); + return new BaseResponse(ResonseCode.Success, "歌曲已取消公开", true); + } + + /// + /// + /// + /// + /// + /// + /// + /// + /// + private M_Songs GetSong(string genreName, string name, string musicId1, int songInfoId, int? genresId) { M_Songs m_Songs = new M_Songs() { @@ -171,14 +349,14 @@ namespace HuanMeng.MiaoYu.Code.Music PlayCount = 0, Duration = TimeOnly.MinValue, Genre = genreName, - GenreId = 0, + GenreId = genresId, ImageLargeUrl = "https://cos.shhuanmeng.com/yinyue/fengmian.png", IsPublic = false, Lyrics = "", MusicAddress = "", SongInfoId = songInfoId, SpecialId = musicId1, - State = 1, + State = 0, Title = name }; diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Music/MusicService.cs b/src/0-core/HuanMeng.MiaoYu.Code/Music/MusicService.cs index dde8c8a..7b09fb1 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Music/MusicService.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Music/MusicService.cs @@ -15,6 +15,7 @@ using System.Net.Http; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; +using HuanMeng.MiaoYu.Model.DbSqlServer.Db_MiaoYu; namespace HuanMeng.MiaoYu.Code.Music { @@ -26,6 +27,7 @@ namespace HuanMeng.MiaoYu.Code.Music MusicProcessor? musicProcessor = null; public Task StartAsync(CancellationToken cancellationToken) { + musicProcessor = new MusicProcessor(serviceProvider); musicProcessor.Run(); return Task.CompletedTask; @@ -51,16 +53,18 @@ namespace HuanMeng.MiaoYu.Code.Music { protected override async void Proc_Do() { + while (true) { foreach (var item in AppConfigurationExtend.AppConfigs.Values) { - var service = serviceProvider.CreateScope(); - var temantInfo = serviceProvider.GetRequiredService(); - item.ToITenantInfo(temantInfo); - DAO dao = new DAO(serviceProvider); + using var service = serviceProvider.CreateScope(); + var _serviceProvider = service.ServiceProvider; + var temantInfo = _serviceProvider.GetService(); + var t = item.ToITenantInfo(); + DAO dao = new DAO(_serviceProvider, t); var list = dao.daoDbMiaoYu.context.M_Songs.Where(it => it.State == 1).ToList(); if (list.Count > 0) { @@ -75,11 +79,15 @@ namespace HuanMeng.MiaoYu.Code.Music if (response == null || !response.IsSuccessStatusCode) { //throw new Exception("创建音乐失败"); + songs.State = -1; + dao.daoDbMiaoYu.context.SaveChanges(); continue; } var responseContent = await response.Content.ReadAsStringAsync(); if (string.IsNullOrEmpty(responseContent)) { + songs.State = -1; + dao.daoDbMiaoYu.context.SaveChanges(); continue; } var obj = JsonConvert.DeserializeObject(responseContent); @@ -87,8 +95,6 @@ namespace HuanMeng.MiaoYu.Code.Music var status = obj?.SelectToken("[0].status")?.ToString(); if (status == "complete") { - //obj.SelectToken("[0].video_url")?.ToString(); - songs.MusicAddress = obj?.SelectToken("[0].audio_url")?.ToString() ?? ""; songs.CoverImage = obj?.SelectToken("[0].image_url")?.ToString() ?? ""; songs.ImageLargeUrl = obj?.SelectToken("[0].image_large_url")?.ToString() ?? ""; @@ -96,9 +102,18 @@ namespace HuanMeng.MiaoYu.Code.Music var duration = obj?.SelectToken("[0].metadata.duration")?.ToString() ?? ""; if (!string.IsNullOrEmpty(duration)) { - if (int.TryParse(duration, out var d)) + if (decimal.TryParse(duration, out var d)) { - songs.Duration = new TimeOnly(0, 0, d); + songs.Duration = TimeOnly.FromTimeSpan(new TimeSpan(0, 0, (int)d)); + } + } + songs.State = 1; + var songInfo = await dao.daoDbMiaoYu.context.M_SongInfo.Where(it => it.Id == songs.SongInfoId).FirstOrDefaultAsync(); + if (songInfo != null) + { + if (songInfo.Status == "正在生成") + { + songInfo.Status = "已完成"; } } dao.daoDbMiaoYu.context.SaveChanges(); diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Users/UserBLL.cs b/src/0-core/HuanMeng.MiaoYu.Code/Users/UserBLL.cs index fbe0e70..f176682 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Users/UserBLL.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Users/UserBLL.cs @@ -116,7 +116,7 @@ namespace HuanMeng.MiaoYu.Code.Users public async Task> GetUserInfo() { var user = await Dao.daoDbMiaoYu.context.T_User.FirstOrDefaultAsync(it => it.Id == _UserId); - var userData = await Dao.daoDbMiaoYu.context.T_User_Data.FirstOrDefaultAsync(it => it.UserId == _UserId); + //var userData = await Dao.daoDbMiaoYu.context.T_User_Data.FirstOrDefaultAsync(it => it.UserId == _UserId); //获取用户余额 UserInfoBLL userInfoBLL = new UserInfoBLL(Dao, _UserId); var Currency = userInfoBLL[UserCurrencyType.语珠]?.CurrencyMoney; @@ -134,7 +134,7 @@ namespace HuanMeng.MiaoYu.Code.Users NickName = user.NickName, UserId = user.Id, Currency = (int)Currency, - UserIconUrl = string.IsNullOrEmpty(userData?.UserIconUrl) ? "https://cos.shhuanmeng.com/default.png" : userData?.UserIconUrl, + UserIconUrl = string.IsNullOrEmpty(user?.UserIconUrl) ? "https://cos.shhuanmeng.com/default.png" : user?.UserIconUrl, RemainingChatCount = (int)RemainingChatCount,//这里先写1,我不会decimal转int HasTalked = hasTalked, Photographs = 0, diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Users/UserInfoBLL.cs b/src/0-core/HuanMeng.MiaoYu.Code/Users/UserInfoBLL.cs index 82c59b9..c01022d 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Users/UserInfoBLL.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Users/UserInfoBLL.cs @@ -49,6 +49,17 @@ namespace HuanMeng.MiaoYu.Code.Users } } + /// + /// 用户名称 + /// + public string UserName + { + get + { + return User.NickName; + } + } + /// /// 货币 /// diff --git a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/M_SongInfo.cs b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/M_SongInfo.cs index 61f3618..ce88d90 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/M_SongInfo.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/M_SongInfo.cs @@ -45,4 +45,6 @@ public partial class M_SongInfo: MultiTenantEntity /// 修改时间 /// public virtual DateTime UpdateAt { get; set; } + + public virtual int? UserId { get; set; } } diff --git a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/M_Songs.cs b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/M_Songs.cs index 2a1d5eb..7e6101a 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/M_Songs.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/M_Songs.cs @@ -98,4 +98,14 @@ public partial class M_Songs: MultiTenantEntity /// 特殊Id /// public virtual string SpecialId { get; set; } = null!; + + /// + /// 作者 + /// + public virtual string? AuthorName { get; set; } + + /// + /// 是否用户自定义风格 + /// + public virtual bool? IsUserGenre { get; set; } } diff --git a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/MiaoYuContext.cs b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/MiaoYuContext.cs index 1584bfd..6376f2c 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/MiaoYuContext.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/MiaoYuContext.cs @@ -420,6 +420,9 @@ public partial class MiaoYuContext : MultiTenantDbContext//DbContext entity.Property(e => e.Id).HasComment("歌曲唯一标识"); entity.Property(e => e.AuthorId).HasComment("歌曲作者ID"); + entity.Property(e => e.AuthorName) + .HasMaxLength(50) + .HasComment("作者"); entity.Property(e => e.CoverImage).HasComment("封面图"); entity.Property(e => e.CreationTimestamp) .HasDefaultValueSql("(getdate())") @@ -433,6 +436,7 @@ public partial class MiaoYuContext : MultiTenantDbContext//DbContext entity.Property(e => e.GenreId).HasComment("音乐风格Id"); entity.Property(e => e.ImageLargeUrl).HasComment("封面缩略图"); entity.Property(e => e.IsPublic).HasComment("歌曲是否公开展示"); + entity.Property(e => e.IsUserGenre).HasComment("是否用户自定义风格"); entity.Property(e => e.LikeCount).HasComment("点赞次数"); entity.Property(e => e.Lyrics).HasComment("歌词内容"); entity.Property(e => e.MusicAddress).HasComment("音乐下载地址"); @@ -1073,6 +1077,7 @@ public partial class MiaoYuContext : MultiTenantDbContext//DbContext entity.Property(e => e.UpdatedAt) .HasComment("修改时间") .HasColumnType("datetime"); + entity.Property(e => e.UserIconUrl).HasMaxLength(300); entity.Property(e => e.UserName) .HasMaxLength(100) .HasComment("用户姓名"); diff --git a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User.cs b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User.cs index c6405f7..fcdfb0d 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User.cs @@ -78,4 +78,6 @@ public partial class T_User: MultiTenantEntity /// 是否是测试账号 /// public virtual bool? IsTest { get; set; } + + public virtual string? UserIconUrl { get; set; } } diff --git a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User_Data.cs b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User_Data.cs index 370ac8b..7202cb5 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User_Data.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User_Data.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace HuanMeng.MiaoYu.Model.DbSqlServer.Db_MiaoYu; diff --git a/src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicCreateRequest.cs b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicCreateRequest.cs index 61a64d9..97d43be 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicCreateRequest.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicCreateRequest.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace HuanMeng.MiaoYu.Model.Dto.Music { /// - /// 创建音乐 + /// 创建音乐 /// public class MusicCreateRequest { @@ -27,4 +27,24 @@ namespace HuanMeng.MiaoYu.Model.Dto.Music /// public string Name { get; set; } } + + /// + /// + /// + public class MusicUserGenresRequest() + { + /// + /// 音乐风格 + /// + public string GenreName { get; set; } + } + + + /// + /// 歌曲审核 + /// + public class MusicReviewRequest() + { + public int Id { get; set; } + } } diff --git a/src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicSongInfoDto.cs b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicSongInfoDto.cs index 14843c6..88b527b 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicSongInfoDto.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicSongInfoDto.cs @@ -53,6 +53,14 @@ namespace HuanMeng.MiaoYu.Model.Dto.Music /// public TimeOnly? Duration { get; set; } + public string? DurationS + { + get + { + return Duration?.ToString("mm:ss"); + } + } + /// /// 播放次数 /// @@ -77,5 +85,20 @@ namespace HuanMeng.MiaoYu.Model.Dto.Music /// 封面图 /// public string CoverImage { get; set; } + + /// + /// 音乐状态,0生成功,1生成中 + /// + public virtual int State { get; set; } + + /// + /// 作者名称 + /// + public virtual string? AuthorName { get; set; } + + /// + /// 是否用户自定义风格 + /// + public virtual bool? IsUserGenre { get; set; } } } diff --git a/src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicSongsInfo.cs b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicSongsInfo.cs new file mode 100644 index 0000000..6b97c3f --- /dev/null +++ b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicSongsInfo.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HuanMeng.MiaoYu.Model.Dto.Music +{ + /// + /// + /// + public class MusicSongsInfo + { + /// + /// + /// + public int PlayCount { get; set; } + + /// + /// + /// + public int LikeCount { get; set; } + + /// + /// + /// + public int DownloadCount { get; set; } + + + } +} diff --git a/src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicSongsListDto.cs b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicSongsListDto.cs new file mode 100644 index 0000000..42afcb2 --- /dev/null +++ b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicSongsListDto.cs @@ -0,0 +1,88 @@ +using AutoMapper; + +using HuanMeng.MiaoYu.Model.DbSqlServer.Db_MiaoYu; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HuanMeng.MiaoYu.Model.Dto.Music +{ + /// + /// 音乐列表 + /// + [AutoMap(typeof(M_Songs))] + public class MusicSongsListDto + { + /// + /// 歌曲是否公开展示 + /// + public virtual bool IsPublic { get; set; } + /// + /// 歌曲唯一标识 + /// + public int Id { get; set; } + + /// + /// 歌曲名称 + /// + public string? Title { get; set; } + + /// + /// 歌曲作者ID + /// + public int AuthorId { get; set; } + + /// + /// 音乐风格 + /// + public string? Genre { get; set; } + + /// + /// 歌曲时长 + /// + public TimeOnly? Duration { get; set; } + + /// + /// 播放次数 + /// + public int PlayCount { get; set; } + + /// + /// 点赞次数 + /// + public int LikeCount { get; set; } + + /// + /// 下载次数 + /// + public int DownloadCount { get; set; } + + /// + /// 封面图 + /// + public string? CoverImage { get; set; } + + /// + /// 封面缩略图 + /// + public string? ImageLargeUrl { get; set; } + + /// + /// 音乐状态,0生成功,1生成中 + /// + public int State { get; set; } + + /// + /// 作者名称 + /// + public string? AuthorName { get; set; } + + /// + /// 音乐下载地址 + /// + public string? MusicAddress { get; set; } + } +} diff --git a/src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicUserDto.cs b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicUserDto.cs new file mode 100644 index 0000000..34b3d93 --- /dev/null +++ b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Music/MusicUserDto.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HuanMeng.MiaoYu.Model.Dto.Music +{ + /// + /// + /// + public class MusicUserDto : MusicSongsInfo + { + /// + /// 用户头像 + /// + public string? UserIconUrl { get; set; } + + /// + /// 用户Id + /// + public int UserId { get; set; } + + + /// + /// 用户昵称 + /// + public string? NickName { get; set; } + + /// + /// 剩余音乐点数 + /// + public int MusicPoints { get; set; } + + /// + /// 是否有Vip + /// + public int Vip { get; set; } + } +} diff --git a/src/2-api/HuanMeng.MiaoYu.WebApi/Controllers/MusicController.cs b/src/2-api/HuanMeng.MiaoYu.WebApi/Controllers/MusicController.cs index 228408d..7668fe9 100644 --- a/src/2-api/HuanMeng.MiaoYu.WebApi/Controllers/MusicController.cs +++ b/src/2-api/HuanMeng.MiaoYu.WebApi/Controllers/MusicController.cs @@ -1,8 +1,11 @@ using HuanMeng.DotNetCore.Base; using HuanMeng.MiaoYu.Code.Cache; using HuanMeng.MiaoYu.Code.Music; +using HuanMeng.MiaoYu.Code.Users; using HuanMeng.MiaoYu.Model.DbSqlServer.Db_MiaoYu; +using HuanMeng.MiaoYu.Model.Dto.Character; using HuanMeng.MiaoYu.Model.Dto.Music; +using HuanMeng.MiaoYu.Model.EnumModel.User; using HuanMeng.MiaoYu.WebApi.Base; using Microsoft.AspNetCore.Http; @@ -51,16 +54,86 @@ namespace HuanMeng.MiaoYu.WebApi.Controllers MusicBLL musicBLL = new MusicBLL(ServiceProvider); return await musicBLL.GetUserMusicGenresList(); } + /// + /// 创建我的音乐风格 + /// + /// + [HttpPost] + public async Task> CreateUserMusicGenres([FromBody] MusicUserGenresRequest musicUserGenresRequest) + { + MusicBLL musicBLL = new MusicBLL(ServiceProvider); + return await musicBLL.CreateUserMusicGenres(musicUserGenresRequest.GenreName); + } /// /// 创作音乐 /// /// [HttpPost] - public async Task> CreateMusic([FromBody] MusicCreateRequest musicCreateRequest) + public async Task> CreateMusic([FromBody] MusicCreateRequest musicCreateRequest) { MusicBLL musicBLL = new MusicBLL(ServiceProvider); - return await musicBLL.CreateMusic(musicCreateRequest); ; + return await musicBLL.CreateMusic(musicCreateRequest); + } + + /// + /// 获取音乐生成进度 + /// + /// 创作音乐选出的Id + /// + [HttpGet] + public async Task> GetMusicSchedule(int id) + { + MusicBLL musicBLL = new MusicBLL(ServiceProvider); + return await musicBLL.GetMusicSchedule(id); + } + + + /// + /// 我的音乐列表 + /// + /// + [HttpGet] + public async Task>> GetMyMusicList() + { + MusicBLL musicBLL = new MusicBLL(ServiceProvider); + return await musicBLL.GetMyMusicList(); + } + + /// + /// 获取用户信息 + /// + /// + [HttpGet] + public async Task> GetUserInfo() + { + MusicBLL musicBLL = new MusicBLL(ServiceProvider); + return await musicBLL.GetUserInfo(); + } + + /// + /// 歌曲审核 + /// + /// + /// + [HttpPost] + public async Task> MusicSongsReview([FromBody] MusicReviewRequest musicReviewRequest) + { + MusicBLL musicBLL = new MusicBLL(ServiceProvider); + return await musicBLL.MusicSongsReview(musicReviewRequest.Id); + } + /// + /// 取消审核 + /// + /// + /// + /// + [HttpPost] + + public async Task> MusicCancelSongsReview([FromBody] MusicReviewRequest musicReviewRequest) + { + MusicBLL musicBLL = new MusicBLL(ServiceProvider); + return await musicBLL.MusicCancelSongsReview(musicReviewRequest.Id); } } }