fix(xhs): repair publish/task list SQL and RBAC menu seeds

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zzh 2026-06-30 11:23:37 +08:00
parent af53c48f7f
commit ffaf325563
11 changed files with 238 additions and 40 deletions

View File

@ -29,9 +29,14 @@ FROM `user_role` ur
WHERE (ur.`UserId` IS NOT NULL AND ur.`UserId` NOT REGEXP @GUID_RE) WHERE (ur.`UserId` IS NOT NULL AND ur.`UserId` NOT REGEXP @GUID_RE)
OR (ur.`RoleId` IS NOT NULL AND ur.`RoleId` NOT REGEXP @GUID_RE); OR (ur.`RoleId` IS NOT NULL AND ur.`RoleId` NOT REGEXP @GUID_RE);
SELECT 'role_permission bad RoleId' AS section, rp.`Id`, rp.`RoleId`, rp.`PermissionCode` SELECT 'role_permission bad rows' AS section, rp.`Id`, rp.`RoleId`, rp.`PermissionCode`, rp.`CreateUserId`
FROM `role_permission` rp FROM `role_permission` rp
WHERE rp.`RoleId` IS NOT NULL AND rp.`RoleId` NOT REGEXP @GUID_RE; WHERE (rp.`RoleId` IS NOT NULL AND rp.`RoleId` NOT REGEXP @GUID_RE)
OR (rp.`CreateUserId` IS NOT NULL AND CAST(rp.`CreateUserId` AS CHAR) NOT REGEXP @GUID_RE);
SELECT 'user_role bad CreateUserId' AS section, ur.`Id`, ur.`UserId`, ur.`RoleId`, ur.`CreateUserId`
FROM `user_role` ur
WHERE ur.`CreateUserId` IS NOT NULL AND CAST(ur.`CreateUserId` AS CHAR) NOT REGEXP @GUID_RE;
SELECT 'organization bad rows' AS section, o.`Id`, o.`Name`, o.`ParentId`, o.`LeaderId` SELECT 'organization bad rows' AS section, o.`Id`, o.`Name`, o.`ParentId`, o.`LeaderId`
FROM `organization` o FROM `organization` o
@ -43,3 +48,9 @@ WHERE (o.`ParentId` IS NOT NULL AND o.`ParentId` <> '' AND o.`ParentId` NOT REGE
SELECT 'menu CreateUserId=0' AS hint, COUNT(*) AS cnt FROM `menu` WHERE CAST(`CreateUserId` AS CHAR) = '0'; SELECT 'menu CreateUserId=0' AS hint, COUNT(*) AS cnt FROM `menu` WHERE CAST(`CreateUserId` AS CHAR) = '0';
SELECT 'menu UpdateUserId=0' AS hint, COUNT(*) AS cnt FROM `menu` WHERE CAST(`UpdateUserId` AS CHAR) = '0'; SELECT 'menu UpdateUserId=0' AS hint, COUNT(*) AS cnt FROM `menu` WHERE CAST(`UpdateUserId` AS CHAR) = '0';
SELECT 'menu PId=0' AS hint, COUNT(*) AS cnt FROM `menu` WHERE CAST(`PId` AS CHAR) = '0'; SELECT 'menu PId=0' AS hint, COUNT(*) AS cnt FROM `menu` WHERE CAST(`PId` AS CHAR) = '0';
SELECT 'role_permission CreateUserId=0' AS hint, COUNT(*) AS cnt
FROM `role_permission` WHERE CAST(`CreateUserId` AS CHAR) = '0';
SELECT 'user_role CreateUserId=0' AS hint, COUNT(*) AS cnt
FROM `user_role` WHERE CAST(`CreateUserId` AS CHAR) = '0';

View File

@ -83,4 +83,13 @@ UPDATE `organization`
SET `LeaderId` = NULL SET `LeaderId` = NULL
WHERE `LeaderId` IS NOT NULL AND `LeaderId` <> '' AND `LeaderId` NOT REGEXP @GUID_RE; WHERE `LeaderId` IS NOT NULL AND `LeaderId` <> '' AND `LeaderId` NOT REGEXP @GUID_RE;
-- ========== role_permission / user_role(登录加载权限时会读 CreateUserId GUID)==========
UPDATE `role_permission`
SET `CreateUserId` = @ADMIN_USER_ID
WHERE `CreateUserId` IS NOT NULL AND CAST(`CreateUserId` AS CHAR) NOT REGEXP @GUID_RE;
UPDATE `user_role`
SET `CreateUserId` = @ADMIN_USER_ID
WHERE `CreateUserId` IS NOT NULL AND CAST(`CreateUserId` AS CHAR) NOT REGEXP @GUID_RE;
-- 修复后请再执行 diagnose_rbac_bad_guids.sql 确认无脏行 -- 修复后请再执行 diagnose_rbac_bad_guids.sql 确认无脏行

View File

@ -0,0 +1,53 @@
-- 修复小红书菜单层级与「启动服务」消失问题
-- RBAC 库执行
--
-- 原因:
-- 1. 一级「小红书」PId 必须为 00000000-0000-0000-0000-000000000000
-- 2. 一级目录 PermissionCode 必须为空字符串(列 NOT NULL,不可写 NULL;勿与「启动服务」同权限码)
SET @ROOT_PID = '00000000-0000-0000-0000-000000000000';
SET @XHS_PID = 'a1b2c3d4-e5f6-7890-abcd-ef1234567801';
-- 一级:小红书(目录,PermissionCode 空字符串)
UPDATE `menu`
SET `PId` = @ROOT_PID,
`PermissionCode` = '',
`Route` = '/xhs',
`Component` = NULL,
`Name` = '小红书',
`IsHidden` = 0,
`IsDeleted` = 0
WHERE `Id` = @XHS_PID;
-- 6 个子菜单挂到「小红书」下
UPDATE `menu`
SET `PId` = @XHS_PID,
`IsHidden` = 0,
`IsDeleted` = 0
WHERE `Id` IN (
'a1b2c3d4-e5f6-7890-abcd-ef1234567802', -- 启动服务
'a1b2c3d4-e5f6-7890-abcd-ef1234567803', -- 内容分析
'a1b2c3d4-e5f6-7890-abcd-ef1234567804', -- 爆款创作
'a1b2c3d4-e5f6-7890-abcd-ef1234567805', -- 发布记录
'a1b2c3d4-e5f6-7890-abcd-ef1234567806', -- 技能卡片
'a1b2c3d4-e5f6-7890-abcd-ef1234567807' -- 拟人设置
);
-- 诊断
SELECT `Name`, `Route`, `PId`, `PermissionCode`,
CASE
WHEN `Id` = @XHS_PID AND `PId` = @ROOT_PID AND (`PermissionCode` = '' OR `PermissionCode` IS NULL) THEN 'OK'
WHEN `PId` = @XHS_PID THEN 'OK-child'
ELSE 'CHECK'
END AS status
FROM `menu`
WHERE `Id` IN (
@XHS_PID,
'a1b2c3d4-e5f6-7890-abcd-ef1234567802',
'a1b2c3d4-e5f6-7890-abcd-ef1234567803',
'a1b2c3d4-e5f6-7890-abcd-ef1234567804',
'a1b2c3d4-e5f6-7890-abcd-ef1234567805',
'a1b2c3d4-e5f6-7890-abcd-ef1234567806',
'a1b2c3d4-e5f6-7890-abcd-ef1234567807'
)
ORDER BY `Order`;

View File

@ -15,7 +15,7 @@ SET @ADMIN_USER_ID = IFNULL(
); );
SET @ROOT_PID = '00000000-0000-0000-0000-000000000000'; SET @ROOT_PID = '00000000-0000-0000-0000-000000000000';
-- 一级:小红书 -- 一级:小红书(目录节点,PermissionCode 留空字符串;子菜单各自绑权限)
INSERT INTO `menu` ( INSERT INTO `menu` (
`Id`, `PId`, `Name`, `PermissionCode`, `Type`, `Icon`, `Route`, `Component`, `Order`, `Id`, `PId`, `Name`, `PermissionCode`, `Type`, `Icon`, `Route`, `Component`, `Order`,
`IsHidden`, `IsCached`, `Description`, `IsDeleted`, `IsHidden`, `IsCached`, `Description`, `IsDeleted`,
@ -24,7 +24,7 @@ INSERT INTO `menu` (
'a1b2c3d4-e5f6-7890-abcd-ef1234567801', 'a1b2c3d4-e5f6-7890-abcd-ef1234567801',
@ROOT_PID, @ROOT_PID,
'小红书', '小红书',
'Xhs.Agent.Query', '',
1, 1,
'icon-fire', 'icon-fire',
'/xhs', '/xhs',
@ -34,6 +34,10 @@ INSERT INTO `menu` (
UUID(), @ADMIN_USER_ID, NOW(), @ADMIN_USER_ID, NOW() UUID(), @ADMIN_USER_ID, NOW(), @ADMIN_USER_ID, NOW()
) ON DUPLICATE KEY UPDATE ) ON DUPLICATE KEY UPDATE
`Name` = VALUES(`Name`), `Name` = VALUES(`Name`),
`PId` = VALUES(`PId`),
`PermissionCode` = VALUES(`PermissionCode`),
`Route` = VALUES(`Route`),
`Component` = VALUES(`Component`),
`CreateUserId` = VALUES(`CreateUserId`), `CreateUserId` = VALUES(`CreateUserId`),
`UpdateUserId` = VALUES(`UpdateUserId`); `UpdateUserId` = VALUES(`UpdateUserId`);
@ -50,7 +54,10 @@ INSERT INTO `menu` (
('a1b2c3d4-e5f6-7890-abcd-ef1234567807', 'a1b2c3d4-e5f6-7890-abcd-ef1234567801', '拟人设置', 'Xhs.HumanSettings.Save', 1, NULL, '/xhs/humanSettings', 'views/xhs/humanSettings/index', 6, 0, 1, NULL, 0, UUID(), @ADMIN_USER_ID, NOW(), @ADMIN_USER_ID, NOW()) ('a1b2c3d4-e5f6-7890-abcd-ef1234567807', 'a1b2c3d4-e5f6-7890-abcd-ef1234567801', '拟人设置', 'Xhs.HumanSettings.Save', 1, NULL, '/xhs/humanSettings', 'views/xhs/humanSettings/index', 6, 0, 1, NULL, 0, UUID(), @ADMIN_USER_ID, NOW(), @ADMIN_USER_ID, NOW())
ON DUPLICATE KEY UPDATE ON DUPLICATE KEY UPDATE
`Name` = VALUES(`Name`), `Name` = VALUES(`Name`),
`PId` = VALUES(`PId`),
`Route` = VALUES(`Route`), `Route` = VALUES(`Route`),
`Component` = VALUES(`Component`),
`Order` = VALUES(`Order`),
`CreateUserId` = VALUES(`CreateUserId`), `CreateUserId` = VALUES(`CreateUserId`),
`UpdateUserId` = VALUES(`UpdateUserId`); `UpdateUserId` = VALUES(`UpdateUserId`);

View File

@ -1,8 +1,19 @@
-- 为客户角色(Code=Customer)批量追加小红书权限(幂等,可重复执行) -- 为客户 / Admin 角色批量追加小红书权限(幂等,可重复执行)
-- RBAC 库执行;role_permission.CreateUserId 为 INT,可写 0 -- RBAC 库执行
-- ⚠️ 本环境 role_permission.CreateUserId 为 CHAR(36) GUID,不可写整数 0(登录会报 Guid: 0)
SET @ADMIN_USER_ID = (
SELECT `Id` FROM `user`
WHERE `Account` = 'admin' AND (`IsDeleted` = 0 OR `IsDeleted` IS NULL)
LIMIT 1
);
SET @ADMIN_USER_ID = IFNULL(
@ADMIN_USER_ID,
'00000000-0000-0000-0000-000000000001'
);
INSERT INTO `role_permission` (`Id`, `RoleId`, `PermissionCode`, `CreateUserId`, `CreateTime`) INSERT INTO `role_permission` (`Id`, `RoleId`, `PermissionCode`, `CreateUserId`, `CreateTime`)
SELECT UUID(), r.`Id`, p.`Code`, 0, NOW() SELECT UUID(), r.`Id`, p.`Code`, @ADMIN_USER_ID, NOW()
FROM `role` r FROM `role` r
CROSS JOIN ( CROSS JOIN (
SELECT 'Xhs.Agent.Query' AS `Code` UNION ALL SELECT 'Xhs.Agent.Query' AS `Code` UNION ALL
@ -24,9 +35,8 @@ WHERE r.`Code` = 'Customer'
WHERE rp.`RoleId` = r.`Id` AND rp.`PermissionCode` = p.`Code` WHERE rp.`RoleId` = r.`Id` AND rp.`PermissionCode` = p.`Code`
); );
-- 超级管理员(可选,便于内测)
INSERT INTO `role_permission` (`Id`, `RoleId`, `PermissionCode`, `CreateUserId`, `CreateTime`) INSERT INTO `role_permission` (`Id`, `RoleId`, `PermissionCode`, `CreateUserId`, `CreateTime`)
SELECT UUID(), r.`Id`, p.`Code`, 0, NOW() SELECT UUID(), r.`Id`, p.`Code`, @ADMIN_USER_ID, NOW()
FROM `role` r FROM `role` r
CROSS JOIN ( CROSS JOIN (
SELECT 'Xhs.Agent.Query' AS `Code` UNION ALL SELECT 'Xhs.Agent.Query' AS `Code` UNION ALL
@ -47,3 +57,5 @@ WHERE r.`Code` = 'Admin'
SELECT 1 FROM `role_permission` rp SELECT 1 FROM `role_permission` rp
WHERE rp.`RoleId` = r.`Id` AND rp.`PermissionCode` = p.`Code` WHERE rp.`RoleId` = r.`Id` AND rp.`PermissionCode` = p.`Code`
); );
-- 若曾用 CreateUserId=0 插入过,执行 fix_rbac_bad_guids.sql 修复脏行

View File

@ -8,6 +8,7 @@ using Oms.Domain.XhsAggregate.Consts;
using Oms.Domain.XhsAggregate.Entities; using Oms.Domain.XhsAggregate.Entities;
using Oms.Domain.XhsAggregate.Repositories; using Oms.Domain.XhsAggregate.Repositories;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Text.Json;
namespace Oms.Application.Services.Xhs; namespace Oms.Application.Services.Xhs;
@ -237,16 +238,44 @@ public class XhsAnalysisService : ApplicationService
XhsTaskTypeCodes.Browse, XhsTaskTypeCodes.Browse,
"my_account_feeds", "my_account_feeds",
new { }), new { }),
XhsAnalysisTypeCodes.FeedDetail => (
XhsTaskTypeCodes.FeedDetail,
"get_feed_detail",
BuildFeedDetailArgs(input)),
_ => throw new BusinessException($"不支持的 analysisType: {analysisType}") _ => throw new BusinessException($"不支持的 analysisType: {analysisType}")
}; };
} }
private static object BuildFeedDetailArgs(XhsAnalysisStartInput input)
{
var feedId = input.Keyword ?? string.Empty;
string? xsecToken = null;
var loadAllComments = false;
var limit = 20;
if (input.Filters is JsonElement je && je.ValueKind == JsonValueKind.Object)
{
if (je.TryGetProperty("xsec_token", out var xt)) xsecToken = xt.GetString();
if (je.TryGetProperty("load_all_comments", out var lac)) loadAllComments = lac.GetBoolean();
if (je.TryGetProperty("limit", out var lim) && lim.TryGetInt32(out var n)) limit = n;
}
return new
{
feed_id = feedId,
xsec_token = xsecToken ?? string.Empty,
load_all_comments = loadAllComments,
limit
};
}
private static string BuildSessionName(string analysisType, string? keyword) => private static string BuildSessionName(string analysisType, string? keyword) =>
analysisType switch analysisType switch
{ {
XhsAnalysisTypeCodes.Search => $"搜索:{keyword}", XhsAnalysisTypeCodes.Search => $"搜索:{keyword}",
XhsAnalysisTypeCodes.HomeFeed => "首页推荐", XhsAnalysisTypeCodes.HomeFeed => "首页推荐",
XhsAnalysisTypeCodes.MyFeeds => "我的笔记", XhsAnalysisTypeCodes.MyFeeds => "我的笔记",
XhsAnalysisTypeCodes.FeedDetail => $"笔记详情:{keyword}",
_ => analysisType _ => analysisType
}; };

View File

@ -7,7 +7,6 @@ using Oms.Domain.CustomersAggregate.Repositories;
using Oms.Domain.XhsAggregate.Consts; using Oms.Domain.XhsAggregate.Consts;
using Oms.Domain.XhsAggregate.Entities; using Oms.Domain.XhsAggregate.Entities;
using Oms.Domain.XhsAggregate.Repositories; using Oms.Domain.XhsAggregate.Repositories;
using System.Linq.Expressions;
namespace Oms.Application.Services.Xhs; namespace Oms.Application.Services.Xhs;
@ -24,20 +23,12 @@ public class XhsPublishService : ApplicationService
var customerId = await OmsSessionHelper.ResolveListCustomerIdAsync(CustomerRepository, CurrentUser, null); var customerId = await OmsSessionHelper.ResolveListCustomerIdAsync(CustomerRepository, CurrentUser, null);
var pageIndex = OmsDocHelper.NormalizePage(input.Page); var pageIndex = OmsDocHelper.NormalizePage(input.Page);
var pageSize = OmsDocHelper.NormalizePageSize(input.PageSize); var pageSize = OmsDocHelper.NormalizePageSize(input.PageSize);
var status = input.Status?.Trim(); var (items, total) = await PublishRecordRepository.GetFilteredPagedListAsync(
var keyword = input.Keyword?.Trim();
Expression<Func<XhsPublishRecord, bool>> predicate = x =>
(!customerId.HasValue || x.CustomerId == customerId.Value) &&
(string.IsNullOrWhiteSpace(status) || x.Status == status) &&
(string.IsNullOrWhiteSpace(keyword) || x.Title.Contains(keyword));
var items = await PublishRecordRepository.GetPagedListAsync(
predicate,
pageIndex, pageIndex,
pageSize, pageSize,
new Dictionary<string, bool> { [nameof(XhsPublishRecord.CreateTime)] = false }); customerId,
var total = await PublishRecordRepository.CountAsync(predicate); input.Status,
input.Keyword);
return new OmsPageResult<XhsPublishRecordOutput> return new OmsPageResult<XhsPublishRecordOutput>
{ {

View File

@ -7,7 +7,6 @@ using Oms.Domain.CustomersAggregate.Repositories;
using Oms.Domain.XhsAggregate.Consts; using Oms.Domain.XhsAggregate.Consts;
using Oms.Domain.XhsAggregate.Entities; using Oms.Domain.XhsAggregate.Entities;
using Oms.Domain.XhsAggregate.Repositories; using Oms.Domain.XhsAggregate.Repositories;
using System.Linq.Expressions;
namespace Oms.Application.Services.Xhs; namespace Oms.Application.Services.Xhs;
@ -89,22 +88,13 @@ public class XhsTaskService : ApplicationService
var customerId = await OmsSessionHelper.ResolveListCustomerIdAsync(CustomerRepository, CurrentUser, null); var customerId = await OmsSessionHelper.ResolveListCustomerIdAsync(CustomerRepository, CurrentUser, null);
var pageIndex = OmsDocHelper.NormalizePage(input.Page); var pageIndex = OmsDocHelper.NormalizePage(input.Page);
var pageSize = OmsDocHelper.NormalizePageSize(input.PageSize); var pageSize = OmsDocHelper.NormalizePageSize(input.PageSize);
var status = input.Status?.Trim(); var (items, total) = await TaskRepository.GetFilteredPagedListAsync(
var taskType = input.TaskType?.Trim();
var sourceRefId = input.SourceRefId?.Trim();
Expression<Func<XhsTask, bool>> predicate = x =>
(!customerId.HasValue || x.CustomerId == customerId.Value) &&
(string.IsNullOrWhiteSpace(status) || x.Status == status) &&
(string.IsNullOrWhiteSpace(taskType) || x.TaskType == taskType) &&
(string.IsNullOrWhiteSpace(sourceRefId) || x.SourceRefId == sourceRefId);
var items = await TaskRepository.GetPagedListAsync(
predicate,
pageIndex, pageIndex,
pageSize, pageSize,
new Dictionary<string, bool> { [nameof(XhsTask.Id)] = false }); customerId,
var total = await TaskRepository.CountAsync(predicate); input.Status,
input.TaskType,
input.SourceRefId);
return new OmsPageResult<XhsTaskOutput> return new OmsPageResult<XhsTaskOutput>
{ {

View File

@ -15,11 +15,28 @@ public interface IXhsTaskRepository : IRepository<XhsTask>
int agentId, int agentId,
int limit, int limit,
CancellationToken cancellationToken = default); CancellationToken cancellationToken = default);
Task<(List<XhsTask> Items, int Total)> GetFilteredPagedListAsync(
int pageIndex,
int pageSize,
int? customerId,
string? status,
string? taskType,
string? sourceRefId,
CancellationToken cancellationToken = default);
} }
public interface IXhsPublishRecordRepository : IRepository<XhsPublishRecord> public interface IXhsPublishRecordRepository : IRepository<XhsPublishRecord>
{ {
Task<List<XhsPublishRecord>> GetDueScheduledAsync(int limit, CancellationToken cancellationToken = default); Task<List<XhsPublishRecord>> GetDueScheduledAsync(int limit, CancellationToken cancellationToken = default);
Task<(List<XhsPublishRecord> Items, int Total)> GetFilteredPagedListAsync(
int pageIndex,
int pageSize,
int? customerId,
string? status,
string? keyword,
CancellationToken cancellationToken = default);
} }
public interface IXhsAnalysisSessionRepository : IRepository<XhsAnalysisSession>; public interface IXhsAnalysisSessionRepository : IRepository<XhsAnalysisSession>;

View File

@ -15,6 +15,49 @@ public class XhsAgentRepository : OmsSqlSugarRepository<XhsAgent>, IXhsAgentRepo
public class XhsTaskRepository : OmsSqlSugarRepository<XhsTask>, IXhsTaskRepository, IScopedDependency public class XhsTaskRepository : OmsSqlSugarRepository<XhsTask>, IXhsTaskRepository, IScopedDependency
{ {
public async Task<(List<XhsTask> Items, int Total)> GetFilteredPagedListAsync(
int pageIndex,
int pageSize,
int? customerId,
string? status,
string? taskType,
string? sourceRefId,
CancellationToken cancellationToken = default)
{
var db = await GetDbContextAsync(cancellationToken);
var query = db.Queryable<XhsTask>();
if (customerId.HasValue)
{
var cid = customerId.Value;
query = query.Where(x => x.CustomerId == cid);
}
status = status?.Trim();
if (!string.IsNullOrWhiteSpace(status))
{
query = query.Where(x => x.Status == status);
}
taskType = taskType?.Trim();
if (!string.IsNullOrWhiteSpace(taskType))
{
query = query.Where(x => x.TaskType == taskType);
}
sourceRefId = sourceRefId?.Trim();
if (!string.IsNullOrWhiteSpace(sourceRefId))
{
query = query.Where(x => x.SourceRefId == sourceRefId);
}
var total = await query.CountAsync(cancellationToken);
var items = await query
.OrderBy(x => x.Id, OrderByType.Desc)
.ToPageListAsync(pageIndex, pageSize, cancellationToken);
return (items, total);
}
public async Task<List<XhsTask>> ClaimPendingAsync( public async Task<List<XhsTask>> ClaimPendingAsync(
int customerId, int customerId,
int agentId, int agentId,
@ -54,6 +97,42 @@ public class XhsTaskRepository : OmsSqlSugarRepository<XhsTask>, IXhsTaskReposit
public class XhsPublishRecordRepository public class XhsPublishRecordRepository
: OmsSqlSugarRepository<XhsPublishRecord>, IXhsPublishRecordRepository, IScopedDependency : OmsSqlSugarRepository<XhsPublishRecord>, IXhsPublishRecordRepository, IScopedDependency
{ {
public async Task<(List<XhsPublishRecord> Items, int Total)> GetFilteredPagedListAsync(
int pageIndex,
int pageSize,
int? customerId,
string? status,
string? keyword,
CancellationToken cancellationToken = default)
{
var db = await GetDbContextAsync(cancellationToken);
var query = db.Queryable<XhsPublishRecord>();
if (customerId.HasValue)
{
var cid = customerId.Value;
query = query.Where(x => x.CustomerId == cid);
}
status = status?.Trim();
if (!string.IsNullOrWhiteSpace(status))
{
query = query.Where(x => x.Status == status);
}
keyword = keyword?.Trim();
if (!string.IsNullOrWhiteSpace(keyword))
{
query = query.Where(x => x.Title.Contains(keyword));
}
var total = await query.CountAsync(cancellationToken);
var items = await query
.OrderBy(x => x.CreateTime, OrderByType.Desc)
.ToPageListAsync(pageIndex, pageSize, cancellationToken);
return (items, total);
}
public async Task<List<XhsPublishRecord>> GetDueScheduledAsync(int limit, CancellationToken cancellationToken = default) public async Task<List<XhsPublishRecord>> GetDueScheduledAsync(int limit, CancellationToken cancellationToken = default)
{ {
var now = DateTime.Now; var now = DateTime.Now;

View File

@ -32,7 +32,6 @@ namespace SimpleAdmin.Api.Auth;
public partial class AuthService( public partial class AuthService(
AccountManager accountManager, AccountManager accountManager,
UserService userService, UserService userService,
MenuService menuService,
IJwtService jwtService, IJwtService jwtService,
IUserRepository userRepository, IUserRepository userRepository,
IWebHostEnvironment webHostEnvironment, IWebHostEnvironment webHostEnvironment,
@ -353,6 +352,7 @@ public partial class AuthService(
private async Task<UserInfoDto> BuildAdminUserInfoAsync(Guid userId, CancellationToken cancellationToken) private async Task<UserInfoDto> BuildAdminUserInfoAsync(Guid userId, CancellationToken cancellationToken)
{ {
var userInfo = await userService.GetAsync(userId, cancellationToken); var userInfo = await userService.GetAsync(userId, cancellationToken);
var permissions = await userService.GetUserPermissionsAsync(userId, cancellationToken);
return new UserInfoDto return new UserInfoDto
{ {
Id = userInfo.Id, Id = userInfo.Id,
@ -363,8 +363,8 @@ public partial class AuthService(
OrganizationId = userInfo.OrganizationId, OrganizationId = userInfo.OrganizationId,
OrganizationName = userInfo.OrganizationName, OrganizationName = userInfo.OrganizationName,
Roles = userInfo.Roles, Roles = userInfo.Roles,
Permissions = await userService.GetUserPermissionsAsync(userId, cancellationToken), Permissions = permissions,
Menus = await menuService.GetUserMenusAsync(userId, cancellationToken), Menus = await BuildMenusByPermissionsAsync(permissions, cancellationToken),
CreatedAt = userInfo.CreatedAt, CreatedAt = userInfo.CreatedAt,
CreatedBy = userInfo.CreatedBy, CreatedBy = userInfo.CreatedBy,
UpdatedAt = userInfo.UpdatedAt, UpdatedAt = userInfo.UpdatedAt,