lvfengfree 5382685f21 fix: 修复远程桌面分享链接重定向问题
- 修复已登录用户访问 /remote/:token 路由被重定向到首页的问题
- 路由守卫优先检查静态路由,静态路由直接放行不走权限验证
- 后端生成的 accessUrl 使用 Hash 路由格式 (/#/remote/{token})
- 前端 remote-desktop-modal 中修正链接格式为 Hash 路由
- 新增远程桌面访问页面 /views/remote/index.vue
2026-01-20 19:52:37 +08:00

173 lines
8.0 KiB
C#

using AmtScanner.Api.Models;
using Microsoft.EntityFrameworkCore;
namespace AmtScanner.Api.Data;
/// <summary>
/// 数据库种子数据
/// </summary>
public static class DbSeeder
{
/// <summary>
/// 初始化种子数据
/// </summary>
public static async Task SeedAsync(AppDbContext context)
{
await SeedRolesAsync(context);
await SeedUsersAsync(context);
await SeedMenusAsync(context);
await SeedRoleMenusAsync(context);
}
private static async Task SeedRolesAsync(AppDbContext context)
{
if (await context.Roles.AnyAsync()) return;
var roles = new List<Role>
{
new() { RoleName = "超级管理员", RoleCode = "R_SUPER", Description = "拥有所有权限", Enabled = true },
new() { RoleName = "管理员", RoleCode = "R_ADMIN", Description = "系统管理员", Enabled = true },
new() { RoleName = "普通用户", RoleCode = "R_USER", Description = "普通用户", Enabled = true }
};
context.Roles.AddRange(roles);
await context.SaveChangesAsync();
Console.WriteLine("✅ 默认角色已创建");
}
private static async Task SeedUsersAsync(AppDbContext context)
{
if (await context.Users.AnyAsync()) return;
// 创建默认用户
var users = new List<User>
{
new()
{
UserName = "Super",
PasswordHash = BCrypt.Net.BCrypt.HashPassword("123456"),
NickName = "超级管理员",
Email = "super@example.com",
Status = "1",
Gender = "1"
},
new()
{
UserName = "Admin",
PasswordHash = BCrypt.Net.BCrypt.HashPassword("123456"),
NickName = "管理员",
Email = "admin@example.com",
Status = "1",
Gender = "1"
},
new()
{
UserName = "User",
PasswordHash = BCrypt.Net.BCrypt.HashPassword("123456"),
NickName = "普通用户",
Email = "user@example.com",
Status = "1",
Gender = "2"
}
};
context.Users.AddRange(users);
await context.SaveChangesAsync();
// 分配角色
var superRole = await context.Roles.FirstAsync(r => r.RoleCode == "R_SUPER");
var adminRole = await context.Roles.FirstAsync(r => r.RoleCode == "R_ADMIN");
var userRole = await context.Roles.FirstAsync(r => r.RoleCode == "R_USER");
var superUser = await context.Users.FirstAsync(u => u.UserName == "Super");
var adminUser = await context.Users.FirstAsync(u => u.UserName == "Admin");
var normalUser = await context.Users.FirstAsync(u => u.UserName == "User");
var userRoles = new List<UserRole>
{
new() { UserId = superUser.Id, RoleId = superRole.Id },
new() { UserId = adminUser.Id, RoleId = adminRole.Id },
new() { UserId = normalUser.Id, RoleId = userRole.Id }
};
context.UserRoles.AddRange(userRoles);
await context.SaveChangesAsync();
Console.WriteLine("✅ 默认用户已创建: Super/Admin/User (密码: 123456)");
}
private static async Task SeedMenusAsync(AppDbContext context)
{
if (await context.Menus.AnyAsync()) return;
var menus = new List<Menu>
{
// 仪表盘菜单 - 与前端 dashboard.ts 匹配(系统内置)
new() { Id = 1, Name = "Dashboard", Path = "/dashboard", Component = "/index/index", Title = "menus.dashboard.title", Icon = "ri:pie-chart-line", Sort = 1, Roles = "R_SUPER,R_ADMIN,R_USER", IsSystem = true },
new() { Id = 2, ParentId = 1, Name = "Console", Path = "console", Component = "/dashboard/console", Title = "menus.dashboard.console", KeepAlive = false, Sort = 1, Roles = "R_SUPER,R_ADMIN,R_USER", IsSystem = true },
// AMT 设备管理菜单(系统内置)
new() { Id = 5, Name = "AmtManage", Path = "/amt", Component = "/index/index", Title = "设备管理", Icon = "ri:computer-line", Sort = 2, Roles = "R_SUPER,R_ADMIN", IsSystem = true },
new() { Id = 6, ParentId = 5, Name = "AmtScan", Path = "scan", Component = "/amt/scan", Title = "网络扫描", KeepAlive = true, Sort = 1, Roles = "R_SUPER,R_ADMIN", IsSystem = true },
new() { Id = 7, ParentId = 5, Name = "AmtDevices", Path = "devices", Component = "/amt/devices", Title = "设备列表", KeepAlive = true, Sort = 2, Roles = "R_SUPER,R_ADMIN", IsSystem = true },
new() { Id = 8, ParentId = 5, Name = "AmtCredentials", Path = "credentials", Component = "/amt/credentials", Title = "AMT凭据", KeepAlive = true, Sort = 3, Roles = "R_SUPER,R_ADMIN", IsSystem = true },
new() { Id = 9, ParentId = 5, Name = "WindowsCredentials", Path = "windows-credentials", Component = "/amt/windows-credentials", Title = "Windows凭据", KeepAlive = true, Sort = 4, Roles = "R_SUPER,R_ADMIN", IsSystem = true },
// 系统管理菜单 - 与前端 system.ts 匹配(系统内置)
new() { Id = 10, Name = "System", Path = "/system", Component = "/index/index", Title = "menus.system.title", Icon = "ri:user-3-line", Sort = 99, Roles = "R_SUPER,R_ADMIN", IsSystem = true },
new() { Id = 11, ParentId = 10, Name = "User", Path = "user", Component = "/system/user", Title = "menus.system.user", KeepAlive = true, Sort = 1, Roles = "R_SUPER,R_ADMIN", IsSystem = true },
new() { Id = 12, ParentId = 10, Name = "Role", Path = "role", Component = "/system/role", Title = "menus.system.role", KeepAlive = true, Sort = 2, Roles = "R_SUPER", IsSystem = true },
new() { Id = 13, ParentId = 10, Name = "UserCenter", Path = "user-center", Component = "/system/user-center", Title = "menus.system.userCenter", IsHide = true, KeepAlive = true, Sort = 3, Roles = "R_SUPER,R_ADMIN,R_USER", IsSystem = true },
new() { Id = 14, ParentId = 10, Name = "Menus", Path = "menu", Component = "/system/menu", Title = "menus.system.menu", KeepAlive = true, Sort = 4, Roles = "R_SUPER", IsSystem = true }
};
// 使用 IDENTITY_INSERT 插入带 ID 的数据
foreach (var menu in menus)
{
context.Menus.Add(menu);
}
await context.SaveChangesAsync();
Console.WriteLine("✅ 默认菜单已创建");
}
private static async Task SeedRoleMenusAsync(AppDbContext context)
{
if (await context.RoleMenus.AnyAsync()) return;
var superRole = await context.Roles.FirstAsync(r => r.RoleCode == "R_SUPER");
var adminRole = await context.Roles.FirstAsync(r => r.RoleCode == "R_ADMIN");
var userRole = await context.Roles.FirstAsync(r => r.RoleCode == "R_USER");
var allMenuIds = await context.Menus.Select(m => m.Id).ToListAsync();
var adminMenuIds = await context.Menus
.Where(m => m.Roles != null && (m.Roles.Contains("R_ADMIN") || m.Roles.Contains("R_USER")))
.Select(m => m.Id).ToListAsync();
var userMenuIds = await context.Menus
.Where(m => m.Roles != null && m.Roles.Contains("R_USER"))
.Select(m => m.Id).ToListAsync();
var roleMenus = new List<RoleMenu>();
// 超级管理员拥有所有菜单
foreach (var menuId in allMenuIds)
{
roleMenus.Add(new RoleMenu { RoleId = superRole.Id, MenuId = menuId });
}
// 管理员菜单
foreach (var menuId in adminMenuIds)
{
roleMenus.Add(new RoleMenu { RoleId = adminRole.Id, MenuId = menuId });
}
// 普通用户菜单
foreach (var menuId in userMenuIds)
{
roleMenus.Add(new RoleMenu { RoleId = userRole.Id, MenuId = menuId });
}
context.RoleMenus.AddRange(roleMenus);
await context.SaveChangesAsync();
Console.WriteLine("✅ 角色菜单权限已分配");
}
}