This commit is contained in:
zpc 2026-02-03 17:40:33 +08:00
parent c162a647bb
commit b8f041d3ff
5 changed files with 100 additions and 18 deletions

View File

@ -257,23 +257,24 @@
.sign-btn {
margin: 40rpx auto 0;
width: 400rpx;
height: 122rpx;
border-radius: 40rpx;
height: 96rpx;
border-radius: 48rpx;
display: flex;
justify-content: center;
align-items: center;
font-size: 32rpx;
font-family: Source Han Sans CN;
font-weight: 400;
background: url($imgurl+'common/jixuchou.png') no-repeat 0 0 / 100% 100%;
font-weight: 500;
background: #03D8F4;
color: #404040;
}
.signYes {
color: #FFFFFF;
color: #404040;
}
.signNo {
color: #FFFFFF;
color: #404040;
filter: grayscale(100%);
}

View File

@ -69,9 +69,8 @@
<view class="justify-center" style="width: 100%; height: 198rpx; background-color: #fff; margin-top: -10rpx;">
<view class="align-center column">
<view class="sign-btn center" @click="sign"
style="width: 340rpx; height: 84rpx; background-color: #D8FD24; margin-top: 32rpx;">
<text style="color: #333333; font-size: 32rpx; font-weight: 600;">{{ !is_sign ? "今日已签到" : "每日签到"
}}</text>
style="width: 340rpx; height: 84rpx; background-color: #03D8F4; border-radius: 42rpx; margin-top: 32rpx;">
<text style="color: #404040; font-size: 32rpx; font-weight: 600;">{{ signBtnText }}</text>
</view>
<text style="color: #8A8A8A; font-size: 20rpx; margin-top: 12rpx;">{{ checkinData.Requirement
}}</text>
@ -120,9 +119,18 @@ export default {
],
},
is_sign: false,
isLoggedIn: false, //
isSignCooldown: false, //
}
},
computed: {
signBtnText() {
if (!this.isLoggedIn) {
return '每日签到';
}
return this.is_sign ? '每日签到' : '今日已签到';
}
},
onLoad() {
this.load();
},
@ -147,6 +155,10 @@ export default {
}
},
async load() {
//
const token = uni.getStorageSync('token');
this.isLoggedIn = !!token;
let sign_in_spend_limit = this.$config.getAppSetting("sign_in_spend_limit");
if (sign_in_spend_limit && sign_in_spend_limit > 0) {
this.checkinData.Requirement = "签到条件:当日消费满" + sign_in_spend_limit + "钻石"
@ -190,6 +202,22 @@ export default {
},
async sign() {
//
const token = uni.getStorageSync('token');
if (!token) {
uni.showModal({
title: '提示',
content: '请先登录后再签到',
confirmText: '去登录',
success: (res) => {
if (res.confirm) {
this.$c.to({ url: '/pages/user/login' });
}
}
});
return false;
}
if (!this.is_sign) {
this.$c.msg("已签到")
return false;
@ -338,7 +366,7 @@ export default {
&:active {
transform: scale(0.95);
background-color: darken(#D8FD24, 5%);
background-color: darken(#03D8F4, 5%);
&::after {
content: '';

View File

@ -34,22 +34,29 @@ public class SignController : ControllerBase
/// GET /api/sign_info
///
/// 返回用户签到状态、连续签到天数、签到配置等信息
/// 未登录用户也可以查看签到配置,但不显示个人签到状态
/// Requirements: 3.1
/// </remarks>
[HttpGet("sign_info")]
[Authorize]
[AllowAnonymous]
[ProducesResponseType(typeof(ApiResponse<SignInfoResponse>), StatusCodes.Status200OK)]
public async Task<ApiResponse<SignInfoResponse>> GetSignInfo()
{
var userId = GetCurrentUserId();
if (userId == null)
{
return ApiResponse<SignInfoResponse>.Unauthorized();
}
try
{
var signInfo = await _signService.GetSignInfoAsync(userId.Value);
SignInfoResponse signInfo;
if (userId.HasValue)
{
// 已登录用户,返回完整签到信息
signInfo = await _signService.GetSignInfoAsync(userId.Value);
}
else
{
// 未登录用户,只返回签到配置
signInfo = await _signService.GetSignConfigAsync();
}
return ApiResponse<SignInfoResponse>.Success(signInfo, "获取成功");
}
catch (Exception ex)

View File

@ -8,12 +8,18 @@ namespace HoneyBox.Core.Interfaces;
public interface ISignService
{
/// <summary>
/// 获取签到信息
/// 获取签到信息(需要登录)
/// </summary>
/// <param name="userId">用户ID</param>
/// <returns>签到信息</returns>
Task<SignInfoResponse> GetSignInfoAsync(int userId);
/// <summary>
/// 获取签到配置(无需登录)
/// </summary>
/// <returns>签到配置信息</returns>
Task<SignInfoResponse> GetSignConfigAsync();
/// <summary>
/// 执行签到
/// </summary>

View File

@ -91,6 +91,46 @@ public class SignService : ISignService
};
}
/// <inheritdoc />
public async Task<SignInfoResponse> GetSignConfigAsync()
{
var now = DateTime.Now;
var currentMonth = now.Month;
var currentYear = now.Year;
var totalDays = DateTime.DaysInMonth(currentYear, currentMonth);
var nowDay = now.Day;
var restDays = totalDays - nowDay;
// 获取每日签到配置 (type=1)
var dailyConfigs = await _dbContext.SignConfigs
.Where(c => c.Type == 1 && c.Status == 1 && c.Day <= totalDays)
.OrderBy(c => c.Sort)
.ToListAsync();
// 获取累计签到配置 (type=2)
var continuousConfigs = await _dbContext.SignConfigs
.Where(c => c.Type == 2 && c.Status == 1)
.OrderBy(c => c.Sort)
.ToListAsync();
// 处理每日签到配置(未登录状态,所有都显示未签到)
var dailyConfigDtos = await ProcessDailyConfigsAsync(dailyConfigs, 0, 1);
// 处理累计签到配置(未登录状态,所有都显示未达到)
var continuousConfigDtos = await ProcessContinuousConfigsAsync(continuousConfigs, 0, new List<int>());
return new SignInfoResponse
{
Days = 0,
IsSign = 0,
SignDays = 0,
TotalDays = totalDays,
RestDays = restDays,
DailyConfigs = dailyConfigDtos,
ContinuousConfigs = continuousConfigDtos
};
}
/// <inheritdoc />
public async Task<SignResultResponse> DoSignAsync(int userId)