调整页面

This commit is contained in:
zpc 2026-03-24 01:40:36 +08:00
parent faca50a972
commit 988241c2c4
9 changed files with 153 additions and 115 deletions

View File

@ -10,7 +10,7 @@ using User = MiAssessment.Admin.Business.Entities.User;
namespace MiAssessment.Admin.Business.Services;
/// <summary>
/// <EFBFBD>û<EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
/// 用户业务服务实现
/// </summary>
public class UserBusinessService : IUserBusinessService
{
@ -18,29 +18,29 @@ public class UserBusinessService : IUserBusinessService
private readonly ILogger<UserBusinessService> _logger;
/// <summary>
/// <EFBFBD>û<EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><EFBFBD>
/// 用户等级名称映射
/// </summary>
private static readonly Dictionary<int, string> UserLevelNames = new()
{
{ 1, "<EFBFBD><EFBFBD>ͨ<EFBFBD>û<EFBFBD>" },
{ 2, "<EFBFBD>ϻ<EFBFBD><EFBFBD><EFBFBD>" },
{ 3, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϻ<EFBFBD><EFBFBD><EFBFBD>" }
{ 1, "普通用户" },
{ 2, "合伙人" },
{ 3, "渠道合伙人" }
};
/// <summary>
/// ״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><EFBFBD>
/// 状态名称映射
/// </summary>
private static readonly Dictionary<int, string> StatusNames = new()
{
{ 0, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" },
{ 1, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" }
{ 0, "禁用" },
{ 1, "正常" }
};
/// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// 构造函数
/// </summary>
/// <param name="dbContext"><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="logger"><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD></param>
/// <param name="dbContext">数据库上下文</param>
/// <param name="logger">日志记录器</param>
public UserBusinessService(
AdminBusinessDbContext dbContext,
ILogger<UserBusinessService> logger)
@ -49,45 +49,60 @@ public class UserBusinessService : IUserBusinessService
_logger = logger;
}
#region <EFBFBD>û<EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½ӿ<EFBFBD> - Requirements 9.1-9.7<EFBFBD><EFBFBD>
#region - Requirements 9.1-9.7
/// <inheritdoc />
public async Task<PagedResult<UserDto>> GetUserListAsync(UserQueryRequest request)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼
// 构建查询,过滤软删除记录
var query = _dbContext.Users
.AsNoTracking()
.Where(u => !u.IsDeleted);
// Ӧ<EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 应用过滤条件
query = ApplyUserQueryFilters(query, request);
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 获取总数
var total = await query.CountAsync();
// <EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
var items = await query
// 分页查询,先查数据库,再在内存中映射名称
var users = await query
.OrderByDescending(u => u.CreateTime)
.Skip(request.Skip)
.Take(request.PageSize)
.Select(u => new UserDto
.Select(u => new
{
Id = u.Id,
Uid = u.Uid,
Phone = u.Phone,
Nickname = u.Nickname,
Avatar = u.Avatar,
UserLevel = u.UserLevel,
UserLevelName = GetUserLevelName(u.UserLevel),
Balance = u.Balance,
TotalIncome = u.TotalIncome,
Status = u.Status,
StatusName = GetStatusName(u.Status),
CreateTime = u.CreateTime,
LastLoginTime = u.LastLoginTime
u.Id,
u.Uid,
u.Phone,
u.Nickname,
u.Avatar,
u.UserLevel,
u.Balance,
u.TotalIncome,
u.Status,
u.CreateTime,
u.LastLoginTime
})
.ToListAsync();
var items = users.Select(u => new UserDto
{
Id = u.Id,
Uid = u.Uid,
Phone = u.Phone,
Nickname = u.Nickname,
Avatar = u.Avatar,
UserLevel = u.UserLevel,
UserLevelName = GetUserLevelName(u.UserLevel),
Balance = u.Balance,
TotalIncome = u.TotalIncome,
Status = u.Status,
StatusName = GetStatusName(u.Status),
CreateTime = u.CreateTime,
LastLoginTime = u.LastLoginTime
}).ToList();
return PagedResult<UserDto>.Create(items, total, request.Page, request.PageSize);
}
@ -104,7 +119,7 @@ public class UserBusinessService : IUserBusinessService
return null;
}
// <EFBFBD><EFBFBD>ȡ<EFBFBD>ϼ<EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>Ϣ
// 获取上级用户信息
string? parentUserNickname = null;
string? parentUserUid = null;
if (user.ParentUserId.HasValue)
@ -122,17 +137,17 @@ public class UserBusinessService : IUserBusinessService
}
}
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 获取订单数量
var orderCount = await _dbContext.Orders
.AsNoTracking()
.CountAsync(o => o.UserId == id && !o.IsDeleted);
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 获取测评数量(已支付及以上状态的测评订单)
var assessmentCount = await _dbContext.Orders
.AsNoTracking()
.CountAsync(o => o.UserId == id && o.OrderType == 1 && o.Status >= 2 && !o.IsDeleted);
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 获取邀请人数
var inviteCount = await _dbContext.Users
.AsNoTracking()
.CountAsync(u => u.ParentUserId == id && !u.IsDeleted);
@ -171,7 +186,7 @@ public class UserBusinessService : IUserBusinessService
if (user == null)
{
throw new BusinessException(ErrorCodes.UserNotFound, "<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
throw new BusinessException(ErrorCodes.UserNotFound, "用户不存在");
}
user.Status = status;
@ -179,7 +194,7 @@ public class UserBusinessService : IUserBusinessService
await _dbContext.SaveChangesAsync();
_logger.LogInformation("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>״̬<EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>ID: {UserId}, ״̬: {Status}", id, status);
_logger.LogInformation("更新用户状态成功ID: {UserId}, 状态: {Status}", id, status);
return true;
}
@ -193,7 +208,7 @@ public class UserBusinessService : IUserBusinessService
if (user == null)
{
throw new BusinessException(ErrorCodes.UserNotFound, "<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
throw new BusinessException(ErrorCodes.UserNotFound, "用户不存在");
}
user.UserLevel = userLevel;
@ -201,7 +216,7 @@ public class UserBusinessService : IUserBusinessService
await _dbContext.SaveChangesAsync();
_logger.LogInformation("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>ID: {UserId}, <20>ȼ<EFBFBD>: {UserLevel}", id, userLevel);
_logger.LogInformation("更新用户等级成功ID: {UserId}, 等级: {UserLevel}", id, userLevel);
return true;
}
@ -209,35 +224,50 @@ public class UserBusinessService : IUserBusinessService
/// <inheritdoc />
public async Task<List<UserDto>> ExportUsersAsync(UserQueryRequest request)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼
// 构建查询,过滤软删除记录
var query = _dbContext.Users
.AsNoTracking()
.Where(u => !u.IsDeleted);
// Ӧ<EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 应用过滤条件
query = ApplyUserQueryFilters(query, request);
// <EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>
var items = await query
// 查询所有匹配用户,先查数据库,再在内存中映射名称
var users = await query
.OrderByDescending(u => u.CreateTime)
.Select(u => new UserDto
.Select(u => new
{
Id = u.Id,
Uid = u.Uid,
Phone = u.Phone,
Nickname = u.Nickname,
Avatar = u.Avatar,
UserLevel = u.UserLevel,
UserLevelName = GetUserLevelName(u.UserLevel),
Balance = u.Balance,
TotalIncome = u.TotalIncome,
Status = u.Status,
StatusName = GetStatusName(u.Status),
CreateTime = u.CreateTime,
LastLoginTime = u.LastLoginTime
u.Id,
u.Uid,
u.Phone,
u.Nickname,
u.Avatar,
u.UserLevel,
u.Balance,
u.TotalIncome,
u.Status,
u.CreateTime,
u.LastLoginTime
})
.ToListAsync();
var items = users.Select(u => new UserDto
{
Id = u.Id,
Uid = u.Uid,
Phone = u.Phone,
Nickname = u.Nickname,
Avatar = u.Avatar,
UserLevel = u.UserLevel,
UserLevelName = GetUserLevelName(u.UserLevel),
Balance = u.Balance,
TotalIncome = u.TotalIncome,
Status = u.Status,
StatusName = GetStatusName(u.Status),
CreateTime = u.CreateTime,
LastLoginTime = u.LastLoginTime
}).ToList();
_logger.LogInformation("导出用户列表成功,数量: {Count}", items.Count);
return items;
@ -287,7 +317,7 @@ public class UserBusinessService : IUserBusinessService
#endregion
#region <EFBFBD>ɽӿڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
#region
/// <inheritdoc />
public Task<PagedResult<UserListResponse>> GetUserListAsync(UserListRequest request)
@ -299,88 +329,88 @@ public class UserBusinessService : IUserBusinessService
/// <inheritdoc />
public Task<bool> SetUserStatusAsync(long userId, int status)
{
// <EFBFBD>ɽӿ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> false
// 旧接口暂时返回 false
return Task.FromResult(false);
}
/// <inheritdoc />
public Task<bool> SetTestAccountAsync(long userId, int isTest)
{
// <EFBFBD>ɽӿ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> false
// 旧接口暂时返回 false
return Task.FromResult(false);
}
/// <inheritdoc />
public Task<bool> ClearMobileAsync(long userId)
{
// <EFBFBD>ɽӿ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> false
// 旧接口暂时返回 false
return Task.FromResult(false);
}
/// <inheritdoc />
public Task<bool> ClearWeChatAsync(long userId)
{
// <EFBFBD>ɽӿ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> false
// 旧接口暂时返回 false
return Task.FromResult(false);
}
/// <inheritdoc />
public Task<PagedResult<IpLogItem>> GetUserIpLogsAsync(long userId, int page, int pageSize)
{
// <EFBFBD>ɽӿ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ؿս<EFBFBD><EFBFBD>
// 旧接口暂时返回空结果
return Task.FromResult(PagedResult<IpLogItem>.Empty(page, pageSize));
}
/// <inheritdoc />
public Task<bool> BindMobileAsync(long userId, string mobile)
{
// <EFBFBD>ɽӿ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> false
// 旧接口暂时返回 false
return Task.FromResult(false);
}
#endregion
#region ˽<EFBFBD>з<EFBFBD><EFBFBD><EFBFBD>
#region
/// <summary>
/// Ӧ<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// 应用用户查询过滤条件
/// </summary>
/// <param name="query"><EFBFBD><EFBFBD>ѯ</param>
/// <param name="request"><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD>IJ<EFBFBD>ѯ</returns>
/// <param name="query">查询</param>
/// <param name="request">请求</param>
/// <returns>过滤后的查询</returns>
private IQueryable<User> ApplyUserQueryFilters(IQueryable<User> query, UserQueryRequest request)
{
// <EFBFBD><EFBFBD>UID<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 按UID筛选
if (!string.IsNullOrWhiteSpace(request.Uid))
{
query = query.Where(u => u.Uid == request.Uid);
}
// <EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 按手机号筛选
if (!string.IsNullOrWhiteSpace(request.Phone))
{
query = query.Where(u => u.Phone != null && u.Phone.Contains(request.Phone));
}
// <EFBFBD><EFBFBD><EFBFBD>dz<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 按昵称筛选
if (!string.IsNullOrWhiteSpace(request.Nickname))
{
query = query.Where(u => u.Nickname != null && u.Nickname.Contains(request.Nickname));
}
// <EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ȼ<EFBFBD>ɸѡ
// 按用户等级筛选
if (request.UserLevel.HasValue)
{
query = query.Where(u => u.UserLevel == request.UserLevel.Value);
}
// <EFBFBD><EFBFBD>״̬ɸѡ
// 按状态筛选
if (request.Status.HasValue)
{
query = query.Where(u => u.Status == request.Status.Value);
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Χɸѡ
// 按创建时间范围筛选
if (request.CreateTimeStart.HasValue)
{
query = query.Where(u => u.CreateTime >= request.CreateTimeStart.Value);
@ -395,23 +425,23 @@ public class UserBusinessService : IUserBusinessService
}
/// <summary>
/// <EFBFBD><EFBFBD>ȡ<EFBFBD>û<EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// 获取用户等级名称
/// </summary>
/// <param name="userLevel"><EFBFBD>û<EFBFBD><EFBFBD>ȼ<EFBFBD></param>
/// <returns><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
/// <param name="userLevel">用户等级</param>
/// <returns>等级名称</returns>
private static string GetUserLevelName(int userLevel)
{
return UserLevelNames.TryGetValue(userLevel, out var name) ? name : "δ֪";
return UserLevelNames.TryGetValue(userLevel, out var name) ? name : "未知";
}
/// <summary>
/// <EFBFBD><EFBFBD>ȡ״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// 获取状态名称
/// </summary>
/// <param name="status">״ֵ̬</param>
/// <returns>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
/// <param name="status">状态值</param>
/// <returns>状态名称</returns>
private static string GetStatusName(int status)
{
return StatusNames.TryGetValue(status, out var name) ? name : "δ֪";
return StatusNames.TryGetValue(status, out var name) ? name : "未知";
}
#endregion

View File

@ -201,6 +201,9 @@ const RICH_TEXT_CONFIG_KEYS = ['user_agreement', 'privacy_policy', 'about_us_con
//
const IMAGE_CONFIG_KEYS = ['service_qrcode']
// 使
const HIDDEN_CONFIG_KEYS = ['service_phone', 'service_wechat', 'about_us_content', 'assessment_price']
// ============ State ============
const state = reactive<ConfigPageState>({
@ -326,8 +329,13 @@ async function loadConfigList() {
try {
const res = await getConfigList()
if (res.code === 0) {
state.configGroups = res.data || []
state.activeGroups = state.configGroups.map(group => group.configType)
//
const groups = (res.data || []).map((group: ConfigGroup) => ({
...group,
items: group.items.filter((item: ConfigItem) => !HIDDEN_CONFIG_KEYS.includes(item.configKey))
})).filter((group: ConfigGroup) => group.items.length > 0)
state.configGroups = groups
state.activeGroups = groups.map((group: ConfigGroup) => group.configType)
} else {
throw new Error(res.message || '获取配置列表失败')
}

View File

@ -96,7 +96,11 @@
<el-table-column prop="uid" label="UID" width="120" show-overflow-tooltip />
<!-- 手机号 -->
<el-table-column prop="phone" label="手机号" width="130" show-overflow-tooltip />
<el-table-column prop="phone" label="手机号" width="130" show-overflow-tooltip>
<template #default="{ row }">
{{ row.phone || '-' }}
</template>
</el-table-column>
<!-- 昵称 -->
<el-table-column prop="nickname" label="昵称" min-width="120" show-overflow-tooltip />

View File

@ -18,7 +18,7 @@
}
},
"SiteSettings": {
"ApiBaseUrl": "https://api.nxt.shhmkjgs.cn"
"ApiBaseUrl": "http://localhost:5238"
},
"AllowedHosts": "*",
"Serilog": {

View File

@ -98,19 +98,26 @@ else
var meta = chart.getDatasetMeta(0);
var dataset = chart.data.datasets[0];
var total = dataset.data.reduce(function(a, b) { return a + b; }, 0);
ctx.font = 'bold 12px "Microsoft YaHei", sans-serif';
ctx.font = 'bold 10px "Microsoft YaHei", sans-serif';
ctx.textBaseline = 'middle';
meta.data.forEach(function(arc, i) {
var pct = (dataset.data[i] / total * 100).toFixed(2) + '%';
var name = chart.data.labels[i];
var angle = (arc.startAngle + arc.endAngle) / 2;
var r = (arc.outerRadius + arc.innerRadius) / 2;
var x = arc.x + Math.cos(angle) * (arc.outerRadius + 30);
var y = arc.y + Math.sin(angle) * (arc.outerRadius + 30);
var labelR = arc.outerRadius + 18;
var x = arc.x + Math.cos(angle) * labelR;
var y = arc.y + Math.sin(angle) * labelR;
// 根据角度调整文字对齐,避免左右超出
if (Math.cos(angle) < -0.1) {
ctx.textAlign = 'right';
} else if (Math.cos(angle) > 0.1) {
ctx.textAlign = 'left';
} else {
ctx.textAlign = 'center';
}
ctx.fillStyle = dataset.backgroundColor[i];
ctx.textAlign = 'center';
ctx.fillText(name, x, y - 8);
ctx.fillText(pct, x, y + 8);
ctx.fillText(name, x, y - 7);
ctx.fillText(pct, x, y + 7);
});
}
};
@ -133,7 +140,7 @@ else
plugins: {
legend: { display: false }
},
layout: { padding: 40 }
layout: { padding: { top: 44, bottom: 44, left: 50, right: 50 } }
},
plugins: [donutLabelPlugin]
});

View File

@ -17,11 +17,7 @@
</div>
</div>
<!-- 底部:机构信息 -->
<div class="disc-footer">
<span class="disc-footer-left">天赋全能测评-本部</span>
<span class="disc-footer-right">公众号【天赋测评研究所】</span>
</div>
</div>
@section Styles {

View File

@ -17,7 +17,7 @@ else
<div class="si-page">
<!-- 顶部标签 -->
<div class="si-top-badge">
<span class="si-badge-text">@Model.LevelName@(MiAssessment.Api.Pages.Report.StrongerIntelligenceModel.GetStarChinese(Model.StarLevel))</span>
<span class="si-badge-text">@Model.LevelName@(MiAssessment.Api.Pages.Report.StrongerIntelligenceModel.GetStarChinese(Model.StarLevel))智能</span>
</div>
<!-- 名称标签(左)+ 星级(右)同一行 -->
@ -26,14 +26,7 @@ else
<span>@Model.LevelName—@Model.IntelligenceName</span>
</div>
<div class="si-stars">
@for (var i = 0; i < Model.StarLevel; i++)
{
<span class="si-star">★</span>
}
@for (var i = Model.StarLevel; i < 5; i++)
{
<span class="si-star si-star-empty">★</span>
}
</div>
</div>

View File

@ -85,11 +85,11 @@ public class StrongerIntelligenceModel : ReportPageModelBase
/// </summary>
public static string GetStarChinese(int starLevel) => starLevel switch
{
5 => "五",
4 => "四",
3 => "三",
2 => "二",
1 => "一",
// 5 => "五",
// 4 => "四",
// 3 => "三",
// 2 => "二",
// 1 => "一",
_ => ""
};
}

View File

@ -33,7 +33,7 @@
}
.bt-panel-donut {
flex: 0.9;
flex: 1;
}
.bt-chart-title {