This commit is contained in:
zpc 2026-02-23 21:12:09 +08:00
parent eb339da935
commit e1dc8c37ee
4 changed files with 38 additions and 102 deletions

View File

@ -8,7 +8,7 @@ using Microsoft.Extensions.Logging;
namespace MiAssessment.Core.Services;
/// <summary>
/// 用户服务实现
/// <EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
/// </summary>
public class UserService : BaseService<User, long>, IUserService
{
@ -59,7 +59,7 @@ public class UserService : BaseService<User, long>, IUserService
if (dto == null)
throw new ArgumentNullException(nameof(dto));
// 生成唯一UID
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΨһUID
var uid = await GenerateUidAsync();
var user = new User
@ -135,27 +135,20 @@ public class UserService : BaseService<User, long>, IUserService
Headimg = user.Avatar,
Mobile = maskedMobile,
MobileIs = mobileIs,
Money = 0, // 业务字段已移除,返回默认值
Money2 = 0, // 业务字段已移除,返回默认值
Integral = 0, // 业务字段已移除,返回默认值
Score = 0, // 业务字段已移除,返回默认值
Vip = 0, // 业务字段已移除,返回默认值
VipImgurl = null, // 业务字段已移除
Coupon = 0, // 优惠券功能已移除返回0
Day = registrationDays,
QuanYiLevel = new QuanYiLevelDto { Level = 0, Cha = -1, Jindu = 0 } // 权益等级功能已移除
Vip = 0, // 用户等级,待接入业务逻辑
Day = registrationDays
};
}
/// <inheritdoc/>
public Task<int> CalculateVipLevelAsync(long userId, int currentVip)
{
// VIP等级计算功能已移除,返回0
// VIP<49>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD><E3B9A6><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
return Task.FromResult(0);
}
/// <summary>
/// 生成6位唯一用户UID
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>6λΨһ<EFBFBD>û<EFBFBD>UID
/// </summary>
private async Task<string> GenerateUidAsync()
{
@ -167,7 +160,7 @@ public class UserService : BaseService<User, long>, IUserService
if (!exists)
return uid;
}
// 兜底使用时间戳后6位
// <EFBFBD><EFBFBD><EFBFBD>ף<EFBFBD>ʹ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString()[^6..];
}

View File

@ -1,103 +1,47 @@
namespace MiAssessment.Model.Models.Auth;
/// <summary>
/// 用户信息DTO
/// 用户信息DTO
/// </summary>
public class UserInfoDto
{
/// <summary>
/// 用户ID
/// 用户ID
/// </summary>
public long Id { get; set; }
/// <summary>
/// 用户唯一标识
/// 用户唯一标识
/// </summary>
public string? Uid { get; set; }
/// <summary>
/// 昵称
/// 昵称
/// </summary>
public string? Nickname { get; set; }
/// <summary>
/// 头像URL
/// 头像URL
/// </summary>
public string? Headimg { get; set; }
/// <summary>
/// 脱敏后的手机号格式138****8000
/// 脱敏手机号格式138****8000
/// </summary>
public string? Mobile { get; set; }
/// <summary>
/// 是否绑定手机号0否 1是
/// 是否绑手机0否 1是
/// </summary>
public int MobileIs { get; set; }
/// <summary>
/// 账户余额
/// </summary>
public decimal Money { get; set; }
/// <summary>
/// 余额2/积分2
/// </summary>
public decimal Money2 { get; set; }
/// <summary>
/// 积分
/// </summary>
public decimal Integral { get; set; }
/// <summary>
/// 评分
/// </summary>
public decimal Score { get; set; }
/// <summary>
/// VIP等级
/// 用户等级1普通用户 2合伙人 3渠道合伙人
/// </summary>
public int Vip { get; set; }
/// <summary>
/// VIP等级图片URL
/// </summary>
public string? VipImgurl { get; set; }
/// <summary>
/// 优惠券数量
/// </summary>
public int Coupon { get; set; }
/// <summary>
/// 注册天数
/// 注册天数
/// </summary>
public int Day { get; set; }
/// <summary>
/// 权益等级信息
/// </summary>
public QuanYiLevelDto? QuanYiLevel { get; set; }
}
/// <summary>
/// 权益等级DTO
/// </summary>
public class QuanYiLevelDto
{
/// <summary>
/// 当前等级
/// </summary>
public int Level { get; set; }
/// <summary>
/// 距离下一级还差多少欧气值,-1表示已满级
/// </summary>
public int Cha { get; set; }
/// <summary>
/// 当前等级进度百分比 (0-100)
/// </summary>
public int Jindu { get; set; }
}

View File

@ -66,7 +66,7 @@ public class UserServicePropertyTests
/// <summary>
/// Property 9: 用户信息完整性
/// For any user, GetUserInfoAsync should return complete information including:
/// - All required fields (id, uid, nickname, headimg, mobile, money, integral, vip)
/// - All required fields (id, uid, nickname, headimg, mobile, mobileIs, vip, day)
/// - Masked mobile number in format XXX****XXXX
/// - Correct MobileIs flag (0 if no mobile, 1 if mobile exists)
/// Validates: Requirements 4.1, 4.4

View File

@ -191,7 +191,7 @@ $orange-gradient-end: #FFFFFF;
}
.page-content {
padding: $spacing-lg;
padding: 24rpx 28rpx;
padding-bottom: env(safe-area-inset-bottom);
}
@ -200,23 +200,22 @@ $orange-gradient-end: #FFFFFF;
text-align: center;
font-size: $font-size-md;
color: $text-secondary;
margin-bottom: $spacing-lg;
margin-bottom: 28rpx;
}
//
.planner-list {
display: flex;
flex-direction: column;
gap: $spacing-lg;
gap: 24rpx;
}
// -
// -
.planner-card {
background: linear-gradient(135deg, $orange-gradient-start 0%, $orange-gradient-end 60%);
border-radius: $border-radius-xl;
padding: $spacing-lg;
box-shadow: $shadow-sm;
border-left: 6rpx solid $orange-color;
background: linear-gradient(180deg, $orange-gradient-start 0%, $orange-gradient-end 40%);
border-radius: 24rpx;
padding: 28rpx;
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06);
&:active {
opacity: 0.9;
@ -234,9 +233,9 @@ $orange-gradient-end: #FFFFFF;
flex-shrink: 0;
width: 160rpx;
height: 180rpx;
border-radius: $border-radius-md;
border-radius: 16rpx;
overflow: hidden;
margin-right: $spacing-md;
margin-right: 24rpx;
.avatar-image {
width: 100%;
@ -255,11 +254,11 @@ $orange-gradient-end: #FFFFFF;
display: flex;
align-items: baseline;
flex-wrap: wrap;
margin-bottom: $spacing-sm;
margin-bottom: 16rpx;
}
.planner-name {
font-size: $font-size-xl;
font-size: 34rpx;
font-weight: $font-weight-bold;
color: $text-color;
}
@ -267,25 +266,25 @@ $orange-gradient-end: #FFFFFF;
.planner-title {
font-size: $font-size-sm;
color: $text-secondary;
margin-left: 8rpx;
margin-left: 4rpx;
}
//
.planner-tags {
display: flex;
flex-wrap: wrap;
gap: $spacing-xs;
gap: 12rpx;
}
.tag-item {
display: inline-flex;
align-items: center;
padding: 6rpx 16rpx;
font-size: $font-size-xs;
padding: 8rpx 18rpx;
font-size: 22rpx;
color: $orange-color;
background-color: rgba(232, 116, 14, 0.08);
border: 1rpx solid rgba(232, 116, 14, 0.2);
border-radius: $border-radius-sm;
border-radius: 8rpx;
white-space: nowrap;
}
@ -305,7 +304,7 @@ $orange-gradient-end: #FFFFFF;
display: flex;
align-items: center;
justify-content: space-between;
margin-top: $spacing-md;
margin-top: 20rpx;
}
//
@ -314,13 +313,13 @@ $orange-gradient-end: #FFFFFF;
align-items: baseline;
.price-symbol {
font-size: $font-size-lg;
font-size: 28rpx;
color: $orange-color;
font-weight: $font-weight-bold;
}
.price-value {
font-size: 44rpx;
font-size: 48rpx;
color: $orange-color;
font-weight: $font-weight-bold;
margin-left: 2rpx;
@ -332,7 +331,7 @@ $orange-gradient-end: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
padding: 16rpx 48rpx;
padding: 18rpx 56rpx;
background-color: $orange-color;
color: $text-white;
font-size: $font-size-md;