diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/BbsUser/BbsUserGetListOutputDto.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/BbsUser/BbsUserGetListOutputDto.cs index 7197366a..4abd784f 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/BbsUser/BbsUserGetListOutputDto.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/BbsUser/BbsUserGetListOutputDto.cs @@ -19,5 +19,16 @@ namespace Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser /// 用户限制 /// public UserLimitEnum UserLimit { get; set; } + + /// + /// 钱钱 + /// + public decimal Money { get; set; } + + + /// + /// 经验 + /// + public long Experience { get; set; } } } 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 c24de344..d8f8684a 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 @@ -71,7 +71,9 @@ namespace Yi.Framework.Bbs.Application.Services.Forum Icon = user.Icon, Id = user.Id, Level = info.Level, - UserLimit = info.UserLimit + UserLimit = info.UserLimit, + Money=info.Money, + Experience=info.Experience }, Plate = new Contracts.Dtos.Plate.PlateGetOutputDto() { @@ -128,7 +130,9 @@ namespace Yi.Framework.Bbs.Application.Services.Forum Nick = user.Nick, Icon = user.Icon, Level = info.Level, - UserLimit = info.UserLimit + UserLimit = info.UserLimit, + Money = info.Money, + Experience = info.Experience } }, true) @@ -169,7 +173,9 @@ namespace Yi.Framework.Bbs.Application.Services.Forum Nick = user.Nick, UserName = user.UserName, Remark = user.Remark, - UserLimit = info.UserLimit + UserLimit = info.UserLimit, + Money = info.Money, + Experience = info.Experience } }, true) diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Services/Integral/IntegralService.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Services/Integral/IntegralService.cs index 768506d2..b8c23ed2 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Services/Integral/IntegralService.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Services/Integral/IntegralService.cs @@ -3,18 +3,33 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Services; +using Volo.Abp.Users; using Yi.Framework.Bbs.Domain.Managers; namespace Yi.Framework.Bbs.Application.Services.Integral { - public class IntegralService:ApplicationService + public class IntegralService : ApplicationService { private IntegralManager _integralManager; - public IntegralService(IntegralManager integralManager) + private ICurrentUser _currentUser; + public IntegralService(IntegralManager integralManager, ICurrentUser currentUser) { - _integralManager= integralManager; + _integralManager = integralManager; + _currentUser = currentUser; } + + /// + /// 签到 + /// + /// + [Authorize] + public async Task PostSignInAsync() + { + var value = await _integralManager.SignInAsync(_currentUser.Id ?? Guid.Empty); + return new { value }; + } } } diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/BbsUserExtraInfoEntity.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/BbsUserExtraInfoEntity.cs index f5dc3b46..4e614403 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/BbsUserExtraInfoEntity.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/BbsUserExtraInfoEntity.cs @@ -13,6 +13,7 @@ namespace Yi.Framework.Bbs.Domain.Entities /// 评论表 /// [SugarTable("BbsUserExtraInfo")] + [SugarIndex($"index_{nameof(UserId)}", nameof(UserId), OrderByType.Asc)] public class BbsUserExtraInfoEntity : Entity { public BbsUserExtraInfoEntity() { } diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/AgreeEntity .cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/AgreeEntity .cs index e2fa7334..2ddaf620 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/AgreeEntity .cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/AgreeEntity .cs @@ -5,6 +5,8 @@ using Volo.Abp.Domain.Entities; namespace Yi.Framework.Bbs.Domain.Entities.Forum { [SugarTable("Agree")] + [SugarIndex($"index_{nameof(CreatorId)}_{nameof(DiscussId)}", nameof(CreatorId), OrderByType.Asc, + nameof(DiscussId), OrderByType.Asc)] public class AgreeEntity : Entity, ICreationAuditedObject { public AgreeEntity() diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/ArticleEntity.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/ArticleEntity.cs index 1b285d82..4edd2a96 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/ArticleEntity.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/ArticleEntity.cs @@ -6,6 +6,9 @@ using Volo.Abp.Domain.Entities; namespace Yi.Framework.Bbs.Domain.Entities.Forum { [SugarTable("Article")] + [SugarIndex($"index_{nameof(Name)}", nameof(Name), OrderByType.Asc)] + [SugarIndex($"index_{nameof(ParentId)}", nameof(ParentId), OrderByType.Asc)] + [SugarIndex($"index_{nameof(DiscussId)}", nameof(DiscussId), OrderByType.Asc)] public class ArticleEntity : Entity, ISoftDelete, IAuditedObject { [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)] diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/CommentEntity.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/CommentEntity.cs index 29a95943..827afd36 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/CommentEntity.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/CommentEntity.cs @@ -11,6 +11,8 @@ namespace Yi.Framework.Bbs.Domain.Entities.Forum /// 评论表 /// [SugarTable("Comment")] + [SugarIndex($"index_{nameof(DiscussId)}", nameof(DiscussId), OrderByType.Asc)] + [SugarIndex($"index_{nameof(ParentId)}", nameof(ParentId), OrderByType.Asc)] public class CommentEntity : Entity, ISoftDelete, IAuditedObject { /// diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/DiscussEntity.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/DiscussEntity.cs index 79956431..3ae3a92c 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/DiscussEntity.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Forum/DiscussEntity.cs @@ -7,6 +7,9 @@ using Yi.Framework.Bbs.Domain.Shared.Enums; namespace Yi.Framework.Bbs.Domain.Entities.Forum { [SugarTable("Discuss")] + [SugarIndex($"index_{nameof(Title)}", nameof(Title), OrderByType.Asc)] + [SugarIndex($"index_{nameof(PlateId)}", nameof(PlateId), OrderByType.Asc)] + [SugarIndex($"index_{nameof(CreationTime)}", nameof(CreationTime), OrderByType.Desc)] public class DiscussEntity : Entity, ISoftDelete, IAuditedObject { public DiscussEntity() diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Integral/SignInEntity.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Integral/SignInEntity.cs index d7f110bf..c4c2e5a5 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Integral/SignInEntity.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/Integral/SignInEntity.cs @@ -13,6 +13,8 @@ namespace Yi.Framework.Bbs.Domain.Entities.Integral /// 签到表 /// [SugarTable("SignIn")] + + [SugarIndex($"index_{nameof(CreatorId)}", nameof(CreatorId), OrderByType.Asc)] public class SignInEntity : Entity, ICreationAuditedObject { @@ -27,5 +29,10 @@ namespace Yi.Framework.Bbs.Domain.Entities.Integral //签到用户 public Guid? CreatorId { get; set; } + /// + /// 连续签到次数 + /// + public int ContinuousNumber { get; set; } = 1; + } } diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/BbsUserManager.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/BbsUserManager.cs index 6f8fbb68..fe1ebea1 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/BbsUserManager.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/BbsUserManager.cs @@ -25,7 +25,10 @@ namespace Yi.Framework.Bbs.Domain.Managers public async Task GetBbsUserInfoAsync(Guid userId) { return await _userRepository._DbQueryable.LeftJoin((user, info) => user.Id == info.UserId) - .Select((user, info) => new BbsUserInfoDto { Id = user.Id ,Icon=user.Icon,Level=info.Level,UserLimit=info.UserLimit}, true) + .Select((user, info) => new BbsUserInfoDto { Id = user.Id ,Icon=user.Icon,Level=info.Level,UserLimit=info.UserLimit, + Money = info.Money, + Experience = info.Experience + }, true) .FirstAsync(user => user.Id==userId); } @@ -34,7 +37,10 @@ namespace Yi.Framework.Bbs.Domain.Managers return await _userRepository._DbQueryable .Where(user => userIds.Contains(user.Id)) .LeftJoin((user, info) => user.Id == info.UserId) - .Select((user, info) => new BbsUserInfoDto { Id = user.Id , Icon = user.Icon , Level = info.Level, UserLimit = info.UserLimit },true) + .Select((user, info) => new BbsUserInfoDto { Id = user.Id , Icon = user.Icon , Level = info.Level, UserLimit = info.UserLimit, + Money = info.Money, + Experience = info.Experience + },true) .ToListAsync(); } @@ -68,5 +74,17 @@ namespace Yi.Framework.Bbs.Domain.Managers /// public UserLimitEnum UserLimit { get; set; } + + /// + /// 钱钱 + /// + public decimal Money { get; set; } + + + /// + /// 经验 + /// + public long Experience { get; set; } + } } diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/IntegralManager.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/IntegralManager.cs index cf428c3e..3cee684b 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/IntegralManager.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/IntegralManager.cs @@ -1,5 +1,7 @@ -using Volo.Abp.Domain.Services; +using Volo.Abp; +using Volo.Abp.Domain.Services; using Volo.Abp.EventBus.Local; +using Volo.Abp.Uow; using Yi.Framework.Bbs.Domain.Entities.Integral; using Yi.Framework.Bbs.Domain.Shared.Etos; using Yi.Framework.SqlSugarCore.Abstractions; @@ -23,7 +25,8 @@ namespace Yi.Framework.Bbs.Domain.Managers /// 签到 /// /// - public async Task PostSignInAsync(Guid userId) + [UnitOfWork] + public async Task SignInAsync(Guid userId) { //签到,添加用户钱钱 //发送一个充值的领域事件即可 @@ -33,17 +36,96 @@ namespace Yi.Framework.Bbs.Domain.Managers //每天随机(3-10),连续签到每次累加多1点,最多一天30 //额外 - //如果随机数数字都相同,额外再获取乘10倍 + //如果随机数数字以9结尾,额外再获取乘1倍 //这种逻辑,就是属于核心领域业务了 - decimal number = 3; + var sigInLast = await _signInRepository._DbQueryable.Where(x => x.CreatorId == userId).OrderByDescending(x => x.CreationTime).FirstAsync(); + + //verify 效验是否允许签到了 + if (sigInLast is not null) + { + VerifySignInTime(sigInLast.CreationTime); + } + + //连续签到次数 + var continuousNumber = GetContinuousNumber(sigInLast); + //签到奖励值 + var value = GetSignInValue(continuousNumber); + + + //插入记录 + var entity = new SignInEntity() { ContinuousNumber = continuousNumber }; + await _signInRepository.InsertAsync(entity); + //发布一个其他领域的事件 - await _localEventBus.PublishAsync(new MoneyChangeEventArgs() { UserId = userId, Number = number }); + await _localEventBus.PublishAsync(new MoneyChangeEventArgs() { UserId = userId, Number = value }); + return value; } + /// + /// 效验签到时间 + /// + /// + /// + private void VerifySignInTime(DateTime dataTime) + { + if (dataTime.Date == DateTime.Now.Date) + { + throw new UserFriendlyException("今日你已经签到过了~"); + } + + } + + /// + /// 获取签到值 + /// + /// + /// + private decimal GetSignInValue(int continuousNumber) + { + //基础数值 + var baseValue = new Random().Next(300, 1100) / 100m; + //累加额外的奖励 + var extraValue = 0m; + if (baseValue.ToString().EndsWith("9")) + { + extraValue = 1 * baseValue; + } + + //累加连续签到的奖励 + var signInValue = continuousNumber * 1m; + + + //获取添加的值 + var value = baseValue + extraValue + signInValue; + if (value >= 30) + { + value = 30; + } + return value; + } + + /// + /// 获取连续次数 + /// + private int GetContinuousNumber(SignInEntity sigInLast) + { + var continuousNumber = 1; + + //已签到过 + if (sigInLast is not null) + { + //签到过,且昨天已签到过,直接使用昨天的连续次数+1 + if (sigInLast.CreationTime == DateTime.Now.Date.AddDays(-1)) + { + continuousNumber = sigInLast.ContinuousNumber + 1; + } + } + return continuousNumber; + } } } diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Entities/LoginLogEntity.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Entities/LoginLogEntity.cs index 466b54ef..cd34eaf8 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Entities/LoginLogEntity.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Entities/LoginLogEntity.cs @@ -9,6 +9,7 @@ using Yi.Framework.Core.Extensions; namespace Yi.Framework.Rbac.Domain.Entities { [SugarTable("LoginLog")] + [SugarIndex($"index_{nameof(LoginUser)}", nameof(LoginUser), OrderByType.Asc)] public class LoginLogEntity : Entity, ICreationAuditedObject { [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)] diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Entities/UserEntity.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Entities/UserEntity.cs index 89ad1065..4925273f 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Entities/UserEntity.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Entities/UserEntity.cs @@ -12,6 +12,7 @@ namespace Yi.Framework.Rbac.Domain.Entities /// 用户表 /// [SugarTable("User")] + [SugarIndex($"index_{nameof(UserName)}", nameof(UserName), OrderByType.Asc)] public class UserEntity : Entity, ISoftDelete, IAuditedObject, IOrderNum, IState { public UserEntity() diff --git a/Yi.Bbs.Vue3/src/layout/signIn/components/signBody.vue b/Yi.Bbs.Vue3/src/layout/signIn/components/signBody.vue new file mode 100644 index 00000000..ec2c7ce8 --- /dev/null +++ b/Yi.Bbs.Vue3/src/layout/signIn/components/signBody.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/Yi.Bbs.Vue3/src/layout/signIn/index.vue b/Yi.Bbs.Vue3/src/layout/signIn/index.vue new file mode 100644 index 00000000..217e2782 --- /dev/null +++ b/Yi.Bbs.Vue3/src/layout/signIn/index.vue @@ -0,0 +1,83 @@ + + + + diff --git a/Yi.Bbs.Vue3/src/router/index.js b/Yi.Bbs.Vue3/src/router/index.js index 5c53afb4..43fdf032 100644 --- a/Yi.Bbs.Vue3/src/router/index.js +++ b/Yi.Bbs.Vue3/src/router/index.js @@ -2,6 +2,7 @@ import { createRouter, createWebHistory } from "vue-router"; import Layout from "../layout/Index.vue"; import NotFound from "../views/error/404.vue"; import LoginLayout from "../layout/LoginLayout.vue"; +import SignInLayout from "../layout/signIn/index.vue"; const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), scrollBehavior(to, from, savedPosition) { @@ -98,6 +99,22 @@ const router = createRouter({ }, ], }, + { + path: "/sign", + name: "signInLayout", + component: SignInLayout, + redirect: "/sign/everyday", + children: [ + { + name: "everyday", + path: "everyday", + component: () => import("../views/signIn/index.vue"), + meta: { + title: "每日签到", + }, + }, + ], + }, { path: "/:pathMatch(.*)*", name: "NotFound", component: NotFound }, ], }); diff --git a/Yi.Bbs.Vue3/src/views/home/Index.vue b/Yi.Bbs.Vue3/src/views/home/Index.vue index 3bea4a12..2c1c611f 100644 --- a/Yi.Bbs.Vue3/src/views/home/Index.vue +++ b/Yi.Bbs.Vue3/src/views/home/Index.vue @@ -85,6 +85,19 @@ + + + + + + @@ -176,6 +189,7 @@ + +