更新日志

📝 [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.311FreeSql.Extensions.AggregateRootFreeSql.Extensions.JsonMapFreeSql.Provider.SqliteFreeSql.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 个无命名空间的扩展类(UtilConvertExtensionStringExtension 等)统一加入 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.IsSafeRemoteUriUriHostNameType[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.OrgSysOrg.ParentSysMenu.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

🐛 问题修复

  • 修复 AdminContextHttpContext 可能为空的异常
  • 优化登录/退出跳转逻辑,兼容 Blazor Server WebSocket 场景

📚 文档更新

  • 新增《代码生成器》中英文文档
  • 更新《AdminTable》《菜单管理》《数据权限》《项目介绍》文档

[v2.2.9] - 2026.05.30

新增 🎉

  • 增加异地登录退出选项
  • 完善各模块英文翻译,默认开启多语言。
  • 破坏性变更:SysMenuType和DataPermissionType类型。升级到本版本后,请手动执行:migrate_enum_v.2.2.7.sql

[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

初始版本

  • 发布项目基础功能。