From 87a14ebac17bf3e5ca698e2ed1ec59905231d92b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A9=99=E5=AD=90?= <454313500@qq.com> Date: Sat, 12 Apr 2025 23:18:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=A4=BE=E5=8C=BA=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=9C=89=E5=81=BF=E6=82=AC=E8=B5=8F=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Entities/StockNewsAggregateRoot.cs | 1 + ...CreateInputVo.cs => DiscussCreateInput.cs} | 28 +- .../Dtos/Discuss/DiscussGetListOutputDto.cs | 2 + .../Dtos/Discuss/DiscussGetOutputDto.cs | 6 +- .../Dtos/Discuss/DiscussRewardGetOutputDto.cs | 23 ++ ...UpdateInputVo.cs => DiscussUpdateInput.cs} | 2 +- .../IServices/IDiscussService.cs | 2 +- .../Services/Forum/DiscussService.cs | 38 ++- .../Enums/DiscussTypeEnum.cs | 17 + .../Entities/Forum/DiscussAggregateRoot.cs | 5 + .../Forum/DiscussRewardAggregateRoot.cs | 38 +++ .../Managers/ForumManager.cs | 15 +- .../Managers/LevelManager.cs | 6 +- .../Managers/AiManager.cs | 4 + Yi.Bbs.Vue3/src/apis/discussApi.js | 7 + .../src/components/DiscussTypeLable.vue | 24 ++ Yi.Bbs.Vue3/src/components/DisscussCard.vue | 53 ++- Yi.Bbs.Vue3/src/layout/AppHeader.vue | 4 +- Yi.Bbs.Vue3/src/views/Article.vue | 95 ++++-- Yi.Bbs.Vue3/src/views/EditArticle.vue | 319 ++++++++++-------- Yi.Bbs.Vue3/src/views/home/Index.vue | 1 + 21 files changed, 511 insertions(+), 179 deletions(-) rename Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/{DiscussCreateInputVo.cs => DiscussCreateInput.cs} (65%) create mode 100644 Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussRewardGetOutputDto.cs rename Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/{DiscussUpdateInputVo.cs => DiscussUpdateInput.cs} (96%) create mode 100644 Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain.Shared/Enums/DiscussTypeEnum.cs create mode 100644 Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/DiscussRewardAggregateRoot.cs create mode 100644 Yi.Bbs.Vue3/src/components/DiscussTypeLable.vue diff --git a/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Entities/StockNewsAggregateRoot.cs b/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Entities/StockNewsAggregateRoot.cs index 1a047d77..db7c3803 100644 --- a/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Entities/StockNewsAggregateRoot.cs +++ b/Yi.Abp.Net8/module/ai-stock/Yi.Framework.Stock.Domain/Entities/StockNewsAggregateRoot.cs @@ -52,6 +52,7 @@ namespace Yi.Framework.Stock.Domain.Entities /// /// 新闻内容 /// + [SugarColumn(ColumnDataType = StaticConfig.CodeFirst_BigString)] public string Content { get; set; } = string.Empty; /// diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussCreateInputVo.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussCreateInput.cs similarity index 65% rename from Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussCreateInputVo.cs rename to Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussCreateInput.cs index c89b5bc4..2834c938 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussCreateInputVo.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussCreateInput.cs @@ -5,8 +5,10 @@ namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss /// /// Discuss输入创建对象 /// - public class DiscussCreateInputVo + public class DiscussCreateInput { + public DiscussTypeEnum DiscussType { get; set; } + public string Title { get; set; } public string? Types { get; set; } public string? Introduction { get; set; } @@ -41,5 +43,29 @@ namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss /// 角色 /// public List? PermissionRoleCodes { get; set; } = new List(); + + /// + /// 悬赏类型主题 + /// + public DiscussRewardCreateInput? RewardData { get; set; } + } + + + public class DiscussRewardCreateInput + { + /// + /// 悬赏最小价值 + /// + public decimal MinValue { get; set; } + + /// + /// 悬赏最大价值 + /// + public decimal? MaxValue { get; set; } + + /// + /// 作者联系方式 + /// + public string Contact { get; set; } } } diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussGetListOutputDto.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussGetListOutputDto.cs index 7e1914c4..8678f9a2 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussGetListOutputDto.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussGetListOutputDto.cs @@ -32,6 +32,8 @@ namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss //是否置顶,默认false public bool IsTop { get; set; } + public DiscussTypeEnum DiscussType { get; set; } + public DiscussPermissionTypeEnum PermissionType { get; set; } //是否禁止,默认false public bool IsBan { get; set; } diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussGetOutputDto.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussGetOutputDto.cs index 54d99167..ab36be8b 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussGetOutputDto.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussGetOutputDto.cs @@ -24,7 +24,10 @@ namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss public Guid PlateId { get; set; } //是否置顶,默认false public bool IsTop { get; set; } - + /// + /// 主题类型 + /// + public DiscussTypeEnum DiscussType { get; set; } /// /// 封面 /// @@ -50,6 +53,7 @@ namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss public bool HasPermission { get;internal set; } + public DiscussRewardGetOutputDto? RewardData { get; set; } /// /// 设置权限 /// diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussRewardGetOutputDto.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussRewardGetOutputDto.cs new file mode 100644 index 00000000..ed49f831 --- /dev/null +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussRewardGetOutputDto.cs @@ -0,0 +1,23 @@ +namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss; + +public class DiscussRewardGetOutputDto +{ + /// + /// 是否已解决 + /// + public bool IsResolved{ get; set; } + /// + /// 悬赏最小价值 + /// + public decimal MinValue { get; set; } + + /// + /// 悬赏最大价值 + /// + public decimal? MaxValue { get; set; } + + /// + /// 作者联系方式 + /// + public string Contact { get; set; } +} \ No newline at end of file diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussUpdateInputVo.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussUpdateInput.cs similarity index 96% rename from Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussUpdateInputVo.cs rename to Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussUpdateInput.cs index 36120276..628d331b 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussUpdateInputVo.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussUpdateInput.cs @@ -2,7 +2,7 @@ using Yi.Framework.Bbs.Domain.Shared.Enums; namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss { - public class DiscussUpdateInputVo + public class DiscussUpdateInput { public string Title { get; set; } public string? Types { get; set; } diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/IServices/IDiscussService.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/IServices/IDiscussService.cs index 872de9b1..6a2a34f8 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/IServices/IDiscussService.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/IServices/IDiscussService.cs @@ -6,7 +6,7 @@ namespace Yi.Framework.Bbs.Application.Contracts.IServices /// /// Discuss服务抽象 /// - public interface IDiscussService : IYiCrudAppService + public interface IDiscussService : IYiCrudAppService { } } diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Services/Forum/DiscussService.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Services/Forum/DiscussService.cs index b52540ff..7ea70d11 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Services/Forum/DiscussService.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Services/Forum/DiscussService.cs @@ -33,7 +33,7 @@ namespace Yi.Framework.Bbs.Application.Services.Forum /// Discuss应用服务实现,用于参数校验、领域服务业务组合、日志记录、事务处理、账户信息 /// public class DiscussService : YiCrudAppService, + Guid, DiscussGetListInputVo, DiscussCreateInput, DiscussUpdateInput>, IDiscussService { private ISqlSugarRepository _discussTopRepository; @@ -102,6 +102,17 @@ namespace Yi.Framework.Bbs.Application.Services.Forum { throw new UserFriendlyException("该主题不存在", "404"); } + + switch (output.DiscussType) + { + case DiscussTypeEnum.Article: break; + //查询的是悬赏主题 + case DiscussTypeEnum.Reward: + var reward= await _forumManager._discussRewardRepository.GetAsync(x=>x.DiscussId==output.Id); + output.RewardData = reward.Adapt(); + break; + } + //组装点赞 var agreeCreatorList = @@ -277,7 +288,7 @@ namespace Yi.Framework.Bbs.Application.Services.Forum /// [Permission("bbs:discuss:add")] [Authorize] - public override async Task CreateAsync(DiscussCreateInputVo input) + public override async Task CreateAsync(DiscussCreateInput input) { var plate = await _plateEntityRepository.FindAsync(x => x.Id == input.PlateId); if (plate is null) @@ -300,12 +311,31 @@ namespace Yi.Framework.Bbs.Application.Services.Forum } } - var entity = await _forumManager.CreateDiscussAsync(await MapToEntityAsync(input)); + var entity = await _forumManager.CreateDiscussAsync(await MapToEntityAsync(input),input.RewardData.Adapt()); return await MapToGetOutputDtoAsync(entity); } + /// + /// 设置悬赏主题已解决 + /// + /// + /// + [HttpPut("discuss/reward/resolve/{discussId}")] + [Authorize] + public async Task SetRewardResolvedAsync([FromRoute]Guid discussId) + { + var reward= await _forumManager._discussRewardRepository.GetFirstAsync(x=>x.DiscussId==discussId); + if (reward is null) + { + throw new UserFriendlyException("未找到该悬赏主题","404"); + } - public override Task UpdateAsync(Guid id, DiscussUpdateInputVo input) + //设置已解决 + reward.SetResolved(); + await _forumManager._discussRewardRepository.UpdateAsync(reward); + } + + public override Task UpdateAsync(Guid id, DiscussUpdateInput input) { return base.UpdateAsync(id, input); } diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain.Shared/Enums/DiscussTypeEnum.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain.Shared/Enums/DiscussTypeEnum.cs new file mode 100644 index 00000000..5d9bfbe3 --- /dev/null +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain.Shared/Enums/DiscussTypeEnum.cs @@ -0,0 +1,17 @@ +namespace Yi.Framework.Bbs.Domain.Shared.Enums; + +/// +/// 主题类型 +/// +public enum DiscussTypeEnum +{ + /// + /// 文章 + /// + Article = 0, + + /// + /// 悬赏 + /// + Reward=1 +} \ No newline at end of file diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/DiscussAggregateRoot.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/DiscussAggregateRoot.cs index 24ef78b8..b363161b 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/DiscussAggregateRoot.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/DiscussAggregateRoot.cs @@ -39,6 +39,11 @@ namespace Yi.Framework.Bbs.Domain.Entities.Forum public string? Introduction { get; set; } public int AgreeNum { get; set; } public int SeeNum { get; set; } + + /// + /// 主题类型 + /// + public DiscussTypeEnum DiscussType { get; set; } /// /// 封面 /// diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/DiscussRewardAggregateRoot.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/DiscussRewardAggregateRoot.cs new file mode 100644 index 00000000..c0a222f7 --- /dev/null +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/DiscussRewardAggregateRoot.cs @@ -0,0 +1,38 @@ +using SqlSugar; +using Volo.Abp.Auditing; +using Volo.Abp.Domain.Entities; +using Volo.Abp.Domain.Entities.Auditing; + +namespace Yi.Framework.Bbs.Domain.Entities.Forum; + +[SugarTable("DiscussReward")] +[SugarIndex($"index_{nameof(DiscussId)}", nameof(DiscussId), OrderByType.Asc)] +public class DiscussRewardAggregateRoot : FullAuditedAggregateRoot +{ + public Guid DiscussId { get; set; } + + /// + /// 是否已解决 + /// + public bool IsResolved{ get; set; } + + /// + /// 悬赏最小价值 + /// + public decimal? MinValue { get; set; } + + /// + /// 悬赏最大价值 + /// + public decimal? MaxValue { get; set; } + + /// + /// 作者联系方式 + /// + public string Contact { get; set; } + + public void SetResolved() + { + IsResolved = true; + } +} \ No newline at end of file diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/ForumManager.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/ForumManager.cs index 64e06052..13080cae 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/ForumManager.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/ForumManager.cs @@ -21,21 +21,30 @@ namespace Yi.Framework.Bbs.Domain.Managers public readonly ISqlSugarRepository _plateEntityRepository; public readonly ISqlSugarRepository _commentRepository; public readonly ISqlSugarRepository _articleRepository; - public ForumManager(ISqlSugarRepository discussRepository, ISqlSugarRepository plateEntityRepository, ISqlSugarRepository commentRepository, ISqlSugarRepository articleRepository) + public readonly ISqlSugarRepository _discussRewardRepository; + public ForumManager(ISqlSugarRepository discussRepository, ISqlSugarRepository plateEntityRepository, ISqlSugarRepository commentRepository, ISqlSugarRepository articleRepository, ISqlSugarRepository discussRewardRepository) { _discussRepository = discussRepository; _plateEntityRepository = plateEntityRepository; _commentRepository = commentRepository; _articleRepository = articleRepository; + _discussRewardRepository = discussRewardRepository; } //主题是不能直接创建的,需要由领域服务统一创建 - public async Task CreateDiscussAsync(DiscussAggregateRoot entity) + public async Task CreateDiscussAsync(DiscussAggregateRoot entity,DiscussRewardAggregateRoot rewardEntity=null) { entity.CreationTime = DateTime.Now; entity.AgreeNum = 0; entity.SeeNum = 0; - return await _discussRepository.InsertReturnEntityAsync(entity); + var discuss = await _discussRepository.InsertReturnEntityAsync(entity); + if (discuss.DiscussType==DiscussTypeEnum.Reward) + { + rewardEntity.DiscussId=discuss.Id; + Check.NotNull(rewardEntity,"悬赏类型,悬赏信息不能为空"); + await _discussRewardRepository.InsertAsync(rewardEntity); + } + return discuss; } public async Task CreateCommentAsync(Guid discussId, Guid parentId, Guid rootId, string content) diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/LevelManager.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/LevelManager.cs index a9a3ec5f..7cbafd32 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/LevelManager.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/LevelManager.cs @@ -37,10 +37,10 @@ namespace Yi.Framework.Bbs.Domain.Managers /// public async Task> GetCacheMapAsync() { - var items = _levelCache.GetOrAdd(LevelConst.LevelCacheKey, () => + var items =await _levelCache.GetOrAddAsync(LevelConst.LevelCacheKey,async () => { - var cacheItem = (_repository.GetListAsync().Result) - .OrderByDescending(x => x.CurrentLevel).ToList() + var cacheItem = ((await _repository.GetListAsync()) + .OrderByDescending(x => x.CurrentLevel)) .Adapt>(); return cacheItem; }); diff --git a/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/Managers/AiManager.cs b/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/Managers/AiManager.cs index 8fdab588..5a73d8ac 100644 --- a/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/Managers/AiManager.cs +++ b/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/Managers/AiManager.cs @@ -53,6 +53,10 @@ namespace Yi.Framework.ChatHub.Domain.Managers chatHistory: history, executionSettings: openSettings, kernel: _kernel); + if (results is null) + { + yield return null; + } await foreach (var result in results) { yield return result.Content; diff --git a/Yi.Bbs.Vue3/src/apis/discussApi.js b/Yi.Bbs.Vue3/src/apis/discussApi.js index ee0a07d7..ec0f9bf0 100644 --- a/Yi.Bbs.Vue3/src/apis/discussApi.js +++ b/Yi.Bbs.Vue3/src/apis/discussApi.js @@ -1,5 +1,12 @@ import request from "@/config/axios/service"; +export function setResolve(discussId) { + return request({ + url: `/discuss/reward/resolve/${discussId}`, + method: "put" + }); +} + export function getList(data) { return request({ url: "/discuss", diff --git a/Yi.Bbs.Vue3/src/components/DiscussTypeLable.vue b/Yi.Bbs.Vue3/src/components/DiscussTypeLable.vue new file mode 100644 index 00000000..1b9cbf1f --- /dev/null +++ b/Yi.Bbs.Vue3/src/components/DiscussTypeLable.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/Yi.Bbs.Vue3/src/components/DisscussCard.vue b/Yi.Bbs.Vue3/src/components/DisscussCard.vue index cfb6d5ff..411ad5ce 100644 --- a/Yi.Bbs.Vue3/src/components/DisscussCard.vue +++ b/Yi.Bbs.Vue3/src/components/DisscussCard.vue @@ -1,13 +1,15 @@