feat: 完成宠物模块重构与社区功能开发
本次提交包含多项核心更新:
1. 重构宠物模块数据结构:拆分皮肤图片为独立表,优化Pet、PetEvolution实体,调整字段类型与冗余字段
2. 新增宠物皮肤图片管理表,支持多进化阶段多图片展示
3. 完善宠物DTO,新增当前形态名称、皮肤信息与图片序列返回
4. 新增社区功能模块:
- 微信端社区Feed流、点赞/取消点赞接口
- 后台社区消息管理接口与服务实现
5. 优化商城与背包模块,替换皮肤图片获取逻辑为从新表读取预览图
6. 重构勋章服务,新增规则校验逻辑
7. 调整命名规范,修复原有控制器命名问题
This commit is contained in:
219
QYZH.InteractiveMagazine.Service/CommunityMessageService.cs
Normal file
219
QYZH.InteractiveMagazine.Service/CommunityMessageService.cs
Normal file
@ -0,0 +1,219 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
using QYZH.InteractiveMagazine.IService;
|
||||
using QYZH.InteractiveMagazine.Models.Common;
|
||||
using QYZH.InteractiveMagazine.Models.Dto;
|
||||
using QYZH.InteractiveMagazine.Models.Entity;
|
||||
using QYZH.InteractiveMagazine.Repository;
|
||||
using SqlSugar;
|
||||
|
||||
namespace QYZH.InteractiveMagazine.Service;
|
||||
|
||||
/// <summary>
|
||||
/// 社区消息后台管理服务实现
|
||||
/// </summary>
|
||||
public class CommunityMessageService(BaseRepository<CommunityMessage> messageRepository, ILogger<CommunityMessageService> logger)
|
||||
: BaseRepository<CommunityMessage>, ICommunityMessageService
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 分页查询消息列表
|
||||
/// </summary>
|
||||
public async Task<PageListModel<AdminMessageDetailOutput>> GetListAsync(AdminMessageQueryInput input)
|
||||
{
|
||||
logger.LogInformation("正在查询社区消息列表,页码: {PageIndex}, 每页条数: {PageSize}", input.PageIndex, input.PageSize);
|
||||
|
||||
if (input.PageIndex <= 0) throw new BusinessException("页码必须大于0", 400);
|
||||
if (input.PageSize <= 0 || input.PageSize > 100) throw new BusinessException("每页条数必须在1-100之间", 400);
|
||||
|
||||
RefAsync<int> totalNumber = 0;
|
||||
var pageResult = await messageRepository.Queryable()
|
||||
.WhereIF(input.JournalId.HasValue, m => m.JournalId == input.JournalId.Value)
|
||||
.WhereIF(!string.IsNullOrWhiteSpace(input.Type), m => m.Type == input.Type)
|
||||
.WhereIF(input.Status.HasValue, m => m.Status == input.Status.Value)
|
||||
.WhereIF(input.IsFeatured.HasValue, m => m.IsFeatured == input.IsFeatured.Value)
|
||||
.WhereIF(input.IsActive.HasValue, m => m.IsActive == input.IsActive.Value)
|
||||
.WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), m => m.Content.Contains(input.Keyword))
|
||||
.WhereIF(input.UserId.HasValue, m => m.UserId == input.UserId.Value)
|
||||
.OrderByDescending(m => m.IsFeatured)
|
||||
.OrderByDescending(m => m.CreatedAt)
|
||||
.Select(m => new AdminMessageDetailOutput
|
||||
{
|
||||
Id = m.Id,
|
||||
JournalId = m.JournalId,
|
||||
UserId = m.UserId,
|
||||
UserJournalId = m.UserJournalId,
|
||||
JournalTaskId = m.JournalTaskId,
|
||||
JournalTaskAnswerId = m.JournalTaskAnswerId,
|
||||
Content = m.Content,
|
||||
ImageUrl = m.ImageUrl,
|
||||
SortOrder = m.SortOrder,
|
||||
IsActive = m.IsActive,
|
||||
Type = m.Type,
|
||||
LikeCount = m.LikeCount,
|
||||
IsFeatured = m.IsFeatured,
|
||||
Status = m.Status,
|
||||
CreatedBy = m.CreatedBy,
|
||||
CreatedAt = m.CreatedAt,
|
||||
UpdatedBy = m.UpdatedBy,
|
||||
UpdatedAt = m.UpdatedAt
|
||||
}, true)
|
||||
.ToPageListAsync(input.PageIndex, input.PageSize, totalNumber);
|
||||
|
||||
return new PageListModel<AdminMessageDetailOutput>(pageResult, input.PageIndex, input.PageSize, totalNumber);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查看消息详情
|
||||
/// </summary>
|
||||
public async Task<AdminMessageDetailOutput> GetDetailAsync(long id)
|
||||
{
|
||||
logger.LogInformation("正在获取社区消息详情,ID: {Id}", id);
|
||||
|
||||
var message = await messageRepository.GetByIdAsync(id);
|
||||
if (message == null)
|
||||
{
|
||||
logger.LogWarning("未找到社区消息,ID: {Id}", id);
|
||||
throw new BusinessException("消息不存在", 404);
|
||||
}
|
||||
|
||||
return new AdminMessageDetailOutput
|
||||
{
|
||||
Id = message.Id,
|
||||
JournalId = message.JournalId,
|
||||
UserId = message.UserId,
|
||||
UserJournalId = message.UserJournalId,
|
||||
JournalTaskId = message.JournalTaskId,
|
||||
JournalTaskAnswerId = message.JournalTaskAnswerId,
|
||||
Content = message.Content,
|
||||
ImageUrl = message.ImageUrl,
|
||||
SortOrder = message.SortOrder,
|
||||
IsActive = message.IsActive,
|
||||
Type = message.Type,
|
||||
LikeCount = message.LikeCount,
|
||||
IsFeatured = message.IsFeatured,
|
||||
Status = message.Status,
|
||||
CreatedBy = message.CreatedBy,
|
||||
CreatedAt = message.CreatedAt,
|
||||
UpdatedBy = message.UpdatedBy,
|
||||
UpdatedAt = message.UpdatedAt
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 软删除消息
|
||||
/// </summary>
|
||||
public async Task DeleteAsync(long id)
|
||||
{
|
||||
logger.LogInformation("正在删除社区消息,ID: {Id}", id);
|
||||
|
||||
var message = await messageRepository.GetByIdAsync(id);
|
||||
if (message == null)
|
||||
{
|
||||
logger.LogWarning("未找到要删除的社区消息,ID: {Id}", id);
|
||||
throw new BusinessException("消息不存在", 404);
|
||||
}
|
||||
|
||||
var result = await messageRepository.DeleteByIdAsync(id);
|
||||
if (!result)
|
||||
{
|
||||
logger.LogError("社区消息删除失败,ID: {Id}", id);
|
||||
throw new BusinessException("删除消息失败", 500);
|
||||
}
|
||||
|
||||
logger.LogInformation("社区消息删除成功,ID: {Id}", id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 冻结/解冻消息
|
||||
/// </summary>
|
||||
public async Task FreezeAsync(long id, int status)
|
||||
{
|
||||
logger.LogInformation("正在更新社区消息冻结状态,ID: {Id}, Status: {Status}", id, status);
|
||||
|
||||
if (status != 1 && status != 2)
|
||||
{
|
||||
throw new BusinessException("状态值无效,只能为1(解冻/通过)或2(冻结)", 400);
|
||||
}
|
||||
|
||||
var message = await messageRepository.GetByIdAsync(id);
|
||||
if (message == null)
|
||||
{
|
||||
logger.LogWarning("未找到社区消息,ID: {Id}", id);
|
||||
throw new BusinessException("消息不存在", 404);
|
||||
}
|
||||
|
||||
message.Status = status;
|
||||
message.UpdatedBy = "System";
|
||||
message.UpdatedAt = DateTime.Now;
|
||||
|
||||
var result = await messageRepository.UpdateAsync(message);
|
||||
if (!result)
|
||||
{
|
||||
logger.LogError("社区消息冻结状态更新失败,ID: {Id}", id);
|
||||
throw new BusinessException("更新冻结状态失败", 500);
|
||||
}
|
||||
|
||||
logger.LogInformation("社区消息冻结状态更新成功,ID: {Id}, Status: {Status}", id, status);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置/取消精选
|
||||
/// </summary>
|
||||
public async Task SetFeaturedAsync(long id, int isFeatured)
|
||||
{
|
||||
logger.LogInformation("正在设置社区消息精选状态,ID: {Id}, IsFeatured: {IsFeatured}", id, isFeatured);
|
||||
|
||||
if (isFeatured != 0 && isFeatured != 1)
|
||||
{
|
||||
throw new BusinessException("精选值无效,只能为0(取消)或1(精选)", 400);
|
||||
}
|
||||
|
||||
var message = await messageRepository.GetByIdAsync(id);
|
||||
if (message == null)
|
||||
{
|
||||
logger.LogWarning("未找到社区消息,ID: {Id}", id);
|
||||
throw new BusinessException("消息不存在", 404);
|
||||
}
|
||||
|
||||
message.IsFeatured = isFeatured;
|
||||
message.UpdatedBy = "System";
|
||||
message.UpdatedAt = DateTime.Now;
|
||||
|
||||
var result = await messageRepository.UpdateAsync(message);
|
||||
if (!result)
|
||||
{
|
||||
logger.LogError("社区消息精选设置失败,ID: {Id}", id);
|
||||
throw new BusinessException("设置精选失败", 500);
|
||||
}
|
||||
|
||||
logger.LogInformation("社区消息精选设置成功,ID: {Id}, IsFeatured: {IsFeatured}", id, isFeatured);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置排序权重
|
||||
/// </summary>
|
||||
public async Task SetSortOrderAsync(long id, int sortOrder)
|
||||
{
|
||||
logger.LogInformation("正在设置社区消息排序权重,ID: {Id}, SortOrder: {SortOrder}", id, sortOrder);
|
||||
|
||||
var message = await messageRepository.GetByIdAsync(id);
|
||||
if (message == null)
|
||||
{
|
||||
logger.LogWarning("未找到社区消息,ID: {Id}", id);
|
||||
throw new BusinessException("消息不存在", 404);
|
||||
}
|
||||
|
||||
message.SortOrder = sortOrder;
|
||||
message.UpdatedBy = "System";
|
||||
message.UpdatedAt = DateTime.Now;
|
||||
|
||||
var result = await messageRepository.UpdateAsync(message);
|
||||
if (!result)
|
||||
{
|
||||
logger.LogError("社区消息排序权重设置失败,ID: {Id}", id);
|
||||
throw new BusinessException("设置排序权重失败", 500);
|
||||
}
|
||||
|
||||
logger.LogInformation("社区消息排序权重设置成功,ID: {Id}, SortOrder: {SortOrder}", id, sortOrder);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user