更新日志
📝 [v2.2.15] - 2026.08.15
✨ 新增功能:后台主题色切换
- 主题色切换器:顶栏新增调色板下拉,内置默认蓝、清新绿、典雅紫、活力橙、中国红 5 种主色,切换即时生效并持久化到本地
- 默认主色配置:
EasyAdminBlazorOptions.DefaultThemeColor 可配置系统默认主色,用户未手动选择时生效
- 全组件主题覆盖:主色按钮、标签页激活、菜单、日历、表单焦点、下拉选中、TinyMCE 编辑器、链接色等跟随主色,深浅色模式均生效
- 登录页主题同步:登录页应用用户保存的主题色或配置的默认主色,与后台保持一致
🐛 问题修复
- 用户批量操作逻辑修正:未选择角色/部门/密码时不再直接执行,给出提示;批量操作增加空选保护
- 删除引用保护:角色被用户引用、菜单被角色引用、组织存在子组织或用户时阻止删除,避免脏数据
- 角色保存空权限保护:未选择任何菜单权限时提示,不再保存空权限角色
- 菜单显示按钮状态修正:复选框状态与逻辑保持一致
- 字典导入父级串位修复:多分类导入时字典项不再全部挂到最后一个分类下
- 配置页测试邮件校验修正:只校验 SMTP 配置项,不再因其他配置为空误报;短信测试增加成功/失败/异常反馈
- 任务调度修复:下次运行时间由服务端填充避免索引越界;编辑已有任务时保留原轮次,不再强制覆盖为永久
- 个人资料保存后同步:修改昵称/邮箱/手机后顶栏立即更新,无需刷新
- 文件上传空列表提示:未选择文件时不再提示"成功上传 0 个"
- 选择组件缓存修复:缓存键由表达式引用哈希改为表达式字符串,解决缓存永不命中导致的重复查库
- 操作日志越界保护:无参删除方法不再访问不存在的参数
- 代码生成器容错:程序集扫描增加 ReflectionTypeLoadException 容错,避免页面打不开
- 登录页主题色应用:登录页现在应用用户保存的主题色或配置的默认主色,与后台一致
- 标签页标题本地化:/Admin 标签页标题支持中英文(控制台/Home)
📝 [v2.2.14] - 2026.08.14
⬆️ 依赖升级
- BootstrapBlazor 升级至 10.9.2:修复
ColumnVisibleItem 废弃 API 兼容问题
- FreeSql 相关包统一升级至 3.5.311(
FreeSql.Extensions.AggregateRoot、FreeSql.Extensions.JsonMap、FreeSql.Provider.Sqlite、FreeSql.Provider.MySqlConnector),FreeSql.Cloud 保持最新 2.0.1
🔒 安全修复
- 修复站内信存储型 XSS:消息/通知内容渲染前进行服务端 HTML 净化(移除 script、事件属性、
javascript: 链接等),聊天 Markdown 渲染增加 HTML 编码防护
- 修复 AdminSelectTable 数据权限绕过:按已选 Id 回填实体时同样应用数据权限过滤,防止低权限用户越权读取记录
- 修复 ChatHub 身份冒用:SignalR 连接时用登录 Cookie 校验身份,发送消息时校验发送者与登录用户一致,杜绝伪造 userid 冒充他人收发消息
- 修复数据权限 Custom 配置回退为"无可见数据"(fail-closed),避免配置异常时越权看到全部数据
- 登录页安全增强:UAParser 单例复用、IP 解析失败回退
unknown、登录失败计数进程内锁、验证码调试输出清理
🐛 问题修复
- 修复强制改密弹窗崩溃:
DialogService.Show 延迟到首帧渲染后调用,避免 BootstrapBlazorRoot 未注册时抛异常;改密成功后自动关闭弹窗并刷新登录态
- 修复打印模块 SQL 方言兼容:分页查询按数据库类型生成
TOP/LIMIT/FETCH FIRST,参数化查询,不再静默吞错
- 修复打印模板目标实体为空:程序集扫描增加
ReflectionTypeLoadException 容错
- 修复报表设计器脚本加载:
eval + 同步 XHR 改为标准 <script> 注入(避免 CSP 拦截、重复加载),生成 HTML 字段名转义
- 修复消息删除越权:删除仅解除当前用户关联,不误删他人消息
- 修复编辑用户密码留空覆盖原密码
- 修复批量删除受保护项被删除:剔除超管/管理员后删除
- 修复权限缓存版本号失效:权限变更后立即失效缓存
- 修复草稿保存不关闭时旧键残留
- 修复 Cron 表达式未校验:新增任务预校验,非法表达式回退 5 秒
- 修复聊天组件资源泄漏:补全定时器与 SignalR 连接释放、beforeunload 引用释放
- 修复邮件服务 HttpClient 泄漏:改用
IHttpClientFactory 管理连接
- 修复新租户管理员未强制改密
- 修复 AdminTable 删除空集合空引用
✨ 其他改进
GetConfig 不再抛异常并增加 1 分钟缓存
- 租户数据库类型下拉显式数据源,移除任务调度模板中无消费者的"HTTP请求/清理任务数据"模板
- 新增 XSS 净化等单元测试,测试用例 156 → 160
📝 [v2.2.12] - 2026.06.17
🖨️ 新增:打印模板设计器 (重磅功能)
- 可视化打印模板设计:新增
/Admin/PrintTemplate 页面,用户可通过可视化界面设计打印模板
- 与 AdminTable 联动:如果实体存在对应的打印模板,
AdminTable 自动显示「打印」按钮,选择记录即可一键打印
- 打印服务抽象:新增
PrintService,支持在任何地方调用打印功能
🎨 打印设计器增强
- 两列布局插入按钮:模板设计器支持一键插入两列布局,方便设计分栏打印样式
- 中英文多语言支持:完善打印模块的国际化翻译(
zh.json / en.json)
🐛 修复
[v2.2.11] - 2026.06.13
♻️ 架构重构
- 认证中间件拆分:将
EasyAdminAuthStartupFilter(内联 120 行)重构为三个独立中间件,各司其职
AdminRouteSecretMiddleware:管理后台路由混淆保护
AuthCookieMiddleware:Blazor Server Cookie 桥接端点
CookieOptionsHelper:共享 Cookie 安全策略工厂,消除重复代码
- 扩展类命名空间规范化:9 个无命名空间的扩展类(
UtilConvertExtension、StringExtension 等)统一加入 EasyAdminBlazor.Infrastructure.Extensions 命名空间,避免 NuGet 消费者命名空间污染
- 破坏性变更:SysLoginLog.LoginType类型。升级到本版本后,请手动执行:migrate_enum_v.2.2.11.sql
🧪 测试覆盖
- 新增单元测试项目
EasyAdminBlazor.Tests(xUnit + Moq + FluentAssertions)
- 150 个测试用例,覆盖安全校验、实体体系、扩展方法、UA 解析、加密工具、日志基础设施
- 测试安全关键路径:重定向防攻击、SSRF 防护、文件魔数校验、PBKDF2/AES 加解密
🔧 优化改进
- UAParser 单例化:
AuthService 改为构造注入 UAParser 单例,避免每次登录重新编译正则表达式
OperationLogAttribute 参数截断保护:序列化参数上限 2000 字符,超过自动截断防止撑爆内存
DatabaseLoggerBackgroundService 异常兜底:增加通用异常捕获,防止意外异常导致日志服务永久停止
🛡️ 安全增强
- SSRF 防护修复:
FileSecurityValidator.IsSafeRemoteUri 中 UriHostNameType 非 [Flags] 枚举,误用 HasFlag 导致私有 IP 地址绕过安全校验,已修复
- 管理后台路由 secret 独立为中间件,更可控的管道顺序
🌐 国际化
- 枚举值英文化:所有中文枚举成员改为英文(整数值不变,向后兼容)
SysLoginLog.LoginType:{ 登陆成功, 登陆失败 } → { Success, Failure }
SysOrg.OrgType:{ 集团, 公司, 部门, 供应商 } → { Group, Company, Department, Supplier }
OperationResult:{ 成功, 失败 } → { Success, Failure }
OperationType:{ 查询, 添加, 修改, 删除, 导入, 导出 } → { Query, Add, Update, Delete, Import, Export }
🐛 问题修复
- 修复草稿计时器不重启:
OnSaveWithoutClose 中 _restartDraftAfterClose 标志在对话框关闭后才设置,导致计时器永不再启动,手动点击也不响应
- 修复导航属性 Nullable 标注:
SysUser.Org、SysOrg.Parent、SysMenu.Parent 等导航属性正确标记为可空,消除 null! 滥用
[v2.2.10] - 2026.06.07
🎉 新增功能
- 全新代码生成器:可视化生成 CRUD 页面(仅本地开发环境有效)
- 旧版代码生成器已废弃,请自行添加以下Url为后台菜单:Admin/CodeGenerator
- AdminTable 草稿功能
EnableDraft:自动保存表单数据到 localStorage
EnableSaveWithoutClose:保存后不关闭窗口
DraftAutoSaveInterval:自定义保存间隔(默认 30 秒)
- 编辑框草稿智能恢复:有内容变更才询问,无改动自动清理
- 保存窗口新增「保存不关闭」按钮
🔧 优化改进
- 拆分
AdminContext 为多个 partial 类,代码更清晰
- 文件选择组件
AdminFileInput 支持直接复制路径
- 数据库日志改为异步队列写入,减少请求阻塞
- 日志支持批量入库 + 队列大小限制
- 服务停止时自动 flush 剩余日志
FileService 改用 IHttpClientFactory 管理 HttpClient
- 清理 Core 项目中的 nullable 警告
🛡️ 安全增强
- Cookie 认证:移除 JS 读写 fallback,统一通过服务端写入 HttpOnly Cookie
- 开放重定向修复:登录及认证接口安全加固
- SSRF 防护:远程图片保存增加安全检查
- 文件上传:增加真实内容检测,校验流大小限制
- 登录票据改用 ASP.NET Core Data Protection 保护
- 登录限流 IP 获取改为可信代理模式(不再直接信任
X-Forwarded-For)
🐛 问题修复
- 修复
AdminContext 中 HttpContext 可能为空的异常
- 优化登录/退出跳转逻辑,兼容 Blazor Server WebSocket 场景
📚 文档更新
- 新增《代码生成器》中英文文档
- 更新《AdminTable》《菜单管理》《数据权限》《项目介绍》文档
[v2.2.9] - 2026.05.30
新增 🎉
[v2.2.6] - 2026.05.29
新增 🎉
修复 🐛
- 避免 Chat 定时器在 DI 已释放时访问服务导致 ObjectDisposedException
- AdminContext 增加 IsAdmin 属性
- 修复 OnBeforeQuery 里
e.Select.OrderByDescending 不生效的问题
- 修复登录没获取到 IP 地址的问题
- 修复没有修改权限时还能切换行内 Switch 的问题
- 修复 BootstrapBlazor 编辑窗口提交按钮一点就 Loading 的问题
- 修正不安装 EasyAdminBlazor.Scheduler 扩展无法登录的问题
重构 📦
- 重构默认排序逻辑
- 优化 FreeSql 非多租户模式下的注册
- 同步 NuGet 版本号
文档 📝
- 新增大量文档:AdminTable、多租户、多语言、数据权限、文件管理等
- 更新快速上手文档
- 增加项目介绍文档
v2.2.0 — 2026.05.23
- 重构:FreeRedis 以扩展方式提供(
EasyAdminBlazor.Redis)
- 重构:计划任务以扩展方式提供(
EasyAdminBlazor.Scheduler)
- 重构:多租户以扩展方式提供(
EasyAdminBlazor.MultiTenant)
- 重构:缓存以扩展方式提供(
EasyAdminBlazor.FusionCache)
- 重构:FusionCache 作为扩展项目提供
v2.0.x — 2026.05.22 ~ 2026.05.23
v2.0.x — 2026.04.09 ~ 2026.04.15
- 重构:架构分层,数据跟 UI 分开,以适应多层架构
- 新增:登录增加登录城市记录
- 优化:完全适配移动端
- 修复:移除 BootstrapBlazor 的 WebClient,解决超时异常
- 增强:
AdminSelectEntity.razor 改为可绑定任意字段
- 修复:保存异常时不能再次点击保存
- 修复:修正
OrgId 硬编码问题,Flags 类型匹配时优先取 Column(Name=值)
- 增强:表格的筛选和高级查询增加 Flags 枚举支持
v2.0.x — 2026.03.01 ~ 2026.03.20
- 新增:给文件上传 Picker 增加权限
- 新增:通过安全码访问后台
- 新增:增加 SendCloud 邮件发送
- 修复:解决多项目任务计划添加失败问题
v2.0.x — 2025.12.31 ~ 2026.02.22
- 优化:TinyMCE 不能修改图片 alt 的问题
- 新增:菜单增加是否显示隐藏
v2.0.3 — 2026.01.03
- 集成:直接集成 FusionCache
- 增强:缓存增加
GetOrSet 方法
v2.0.1 — 2026.01.01
- 增强:管理员列表增加是否有效快速更改项
- 增强:加密密钥可自定义
- 增强:加密登录 Cookie
- 增强:验证码和登录错误次数在配置 Redis 的情况下用 Redis 存储,没有 Redis 则用内存存储
v2.0.0 — 2025.12.31
- 升级:升级为 .NET 10
- 升级:升级所有 NuGet 包到最新版
v1.4.7 — 2025.06.06 ~ 2025.11.25
- 新增:上传参数可配置
- 增强:更改树形组件的排序属性为 string 类型
- 修复:修复模糊查询不出记录的问题
- 新增:增加图片验证码扩展(
EasyAdminBlazor.Captcha)
- 修复:修复组织负责人不能指定的问题
- 新增:增加微信接入扩展(
EasyAdminBlazor.WeChat)
- 优化:整体优化与 bug 修复
[1.4.6] - 2025-06-02
新增功能
- 编辑器增加粘贴上传功能
- 编辑器增加远程图片下载和本地图片拖动上传功能
- AdminTable组件增加根据字典数据自定义导入方法
修复问题
[1.4.5] - 2025-06-01
新增功能
- 增加菜单收藏功能
- 登录验证码增加可配置是否显示
- 系统名称增加可配置是否显示
- 帮助链接增加可配置是否显示
- 消息中心增加可配置是否显示
- 增加AdminSelectTreeEntity组件
- 增加字典多选组件AdminDictMultiSelect
- 增加AdminTree组件(可根据实体生成树,不用查询数据再绑定,其它Admin开头的数据类组件都是这个效果)
- AdminTable组件增加根据字典数据自定义导入方法
[1.4.0] - 2025-05-29
新增功能
- 优化页面权限验证
- 增加默认租户ID
- 消息提醒查看增加上一条下一条
- 将聊天组件单独作为扩展项目
- 增加强制用户修改密码功能
- 增加可上传类型提示
- 优化文件上传逻辑,增强文件上传安全检查
- 将邮件发送,短信发送,富文本编辑器独立成扩展方便后期更换
- 文件选择样式调整
- 任务计划增加日志查看
[1.3.0] - 2025-05-26
新增功能
[1.2.0] - 2025-05-25
新增功能
- 增加站内信
- 增加系统通知
- 风格调整
- 文件选择、富文本及其它组件夜间模式完善
[1.1.0] - 2025-05-22
新增功能
- 用户增加批量设置角色、部门、重置密码功能
- 组织架构增加负责人绑定
- 增加组织结构图
- 增加字典批量导入导出
- AdminSelectTable组件增加Id绑定
@bind-ValueId="v.ArticleId"
修复问题
- 修正租户ORM对象偶尔丢失问题(改为每次URL改变后重新获取)
- 登录成功后未重置密码错误计数
- 修正功能菜单单个选择时未返回选中项问题
[1.0.0] - 2025-05-15
初始版本