Theme color switcher: a palette dropdown in the header with 5 presets (Default Blue, Fresh Green, Elegant Purple, Vibrant Orange, China Red); switching takes effect immediately and persists locally
Default theme color option: EasyAdminBlazorOptions.DefaultThemeColor configures the system default color, applied when the user has not manually chosen
Full component theming: primary buttons, tab active states, menus, calendars, form focus, dropdown selection, TinyMCE editor, link colors etc. follow the theme color in both light and dark modes
Login page theme sync: the login page applies the saved theme color or configured default color, consistent with the admin console
🐛 Bug Fixes
User batch operation logic fixed: no longer executes when role/department/password is not selected; empty-selection guard added
Delete reference protection: roles referenced by users, menus referenced by roles, and orgs with children/users are blocked from deletion to avoid orphaned data
Role save guard: saving a role without any menu permission now shows a prompt instead of saving an empty permission set
Menu "show buttons" state fixed: checkbox state now matches the actual filter logic
Dictionary import parent linkage fixed: dictionary items no longer all attach to the last category when importing multiple categories
Config page fixes: test email validation now only checks SMTP settings; SMS test now reports success/failure/exceptions
Task scheduler fixes: next-run time is filled server-side to avoid index-out-of-range; editing an existing task preserves its round count
Profile sync after save: nickname/email/mobile update immediately in the header without refresh
File upload empty-list guard: no longer reports "0 files uploaded successfully" when nothing was selected
Select component cache fixed: cache key changed from expression reference hash to expression string, resolving cache-miss-every-time repeated DB queries
Code generator resilience: assembly scanning tolerates ReflectionTypeLoadException so the page always opens
Login page theme applied: the login page now applies the saved theme color or configured default color, matching the admin console
Tab title localization: /Admin tab title supports Chinese/English (控制台/Home)
📝 [v2.2.14] - 2026.08.14
⬆️ Dependency Upgrades
BootstrapBlazor upgraded to 10.9.2: fixed compatibility with the deprecated ColumnVisibleItem API
FreeSql packages unified to 3.5.311 (FreeSql.Extensions.AggregateRoot, FreeSql.Extensions.JsonMap, FreeSql.Provider.Sqlite, FreeSql.Provider.MySqlConnector); FreeSql.Cloud stays at the latest 2.0.1
🔒 Security Fixes
Fixed stored XSS in internal messages: message/notification content is HTML-sanitized server-side before rendering (scripts, event attributes, javascript: URLs removed); chat markdown rendering now HTML-encodes raw input
Fixed data-permission bypass in AdminSelectTable: record backfill by selected Id now applies the same data-permission filter, preventing low-privilege users from reading records out of scope
Fixed ChatHub identity spoofing: SignalR connections are validated against the login cookie, and message senders must match the authenticated user, so a forged userid can no longer impersonate other users
Custom data permissions now fail closed: invalid/unparsable custom org config yields "no visible data" instead of leaking all records
Login page hardening: UAParser singleton reuse, unknown fallback on IP parse failure, in-process lock for login failure counting, removed captcha debug output
🐛 Bug Fixes
Fixed forced password-change dialog crash: DialogService.Show is deferred until after the first render so BootstrapBlazorRoot is registered; the dialog now closes and auth state refreshes after a successful password change
Fixed print module SQL dialect compatibility: pagination uses TOP/LIMIT/FETCH FIRST per database type, queries are parameterized, and errors are no longer silently swallowed
Fixed report designer script loading: replaced eval + synchronous XHR with standard <script> injection (CSP-safe, loaded once); generated HTML field names are escaped
Fixed message deletion overreach: deleting a message only removes the current user's association
Fixed password blank-out on user edit: leaving the password field empty no longer overwrites the original password
Fixed protected rows being deleted in batch delete: administrator/super-admin rows are excluded before deletion
Fixed stale permission cache version: permission cache is invalidated immediately after changes
Fixed draft residue when saving without closing
Fixed unvalidated Cron expressions: new tasks are pre-validated, invalid expressions fall back to a 5-second interval
Fixed chat resource leaks: timer and SignalR connection disposal completed, beforeunload reference released
Fixed HttpClient leak in mail service: switched to IHttpClientFactory-managed connections
Fixed new tenant admin not forced to change password
Fixed null reference when deleting an empty selection in AdminTable
✨ Other Improvements
GetConfig no longer throws and caches results for 1 minute
Explicit data source for the tenant database-type dropdown; removed the unused "HTTP request / clean task data" template from the task scheduler
Added XSS sanitizer regression tests; test count 156 → 160
📝 [v2.2.12] - 2026.06.17
🖨️ NEW: Print Template Designer (Major Feature)
Visual Print Template Designer: New /Admin/PrintTemplate page for designing print templates through a visual interface
AdminTable Integration: If an entity has corresponding print templates, AdminTable automatically shows a "Print" button — select records and print with one click
Print Service Abstraction: New PrintService that can be called from anywhere
🎨 Designer Enhancements
2-Column Layout Button: One-click insertion of two-column layouts in the template designer
i18n Support: Complete Chinese/English translations for the print module (zh.json / en.json)
🐛 Bug Fixes
Fixed issue where the left sidebar menu could not be minimized
[v2.2.11] - 2026.06.13
♻️ Architecture Refactoring
Auth Middleware Split: Refactored EasyAdminAuthStartupFilter (120-line inline middleware) into three independent classes
UAParser Singleton: AuthService now injects UAParser as a singleton via constructor, avoiding regex recompilation on every login
OperationLogAttribute Parameter Truncation: Serialized parameters capped at 2000 characters, auto-truncated to prevent memory exhaustion
DatabaseLoggerBackgroundService Exception Safety: Added general exception handling to prevent the log service from crashing permanently on unexpected errors
🛡️ Security Enhancements
SSRF Bug Fix: FileSecurityValidator.IsSafeRemoteUri incorrectly used HasFlag on UriHostNameType (non-[Flags] enum), causing private IP addresses to bypass security checks
Admin route secret middleware now has more controllable pipeline ordering
🌐 Internationalization
Enum Values Anglicized: All Chinese enum members renamed to English (integer values unchanged, backward compatible)
Fixed draft timer not restarting: In OnSaveWithoutClose, the _restartDraftAfterClose flag was set after the dialog close callback, preventing the auto-save timer from ever restarting. Manual draft save was also unresponsive.
Fixed Navigation Property Nullable Annotations: SysUser.Org, SysOrg.Parent, SysMenu.Parent and other navigation properties properly marked as nullable, eliminating null! abuse
[v2.2.10] - 2026.06.07
🎉 New Features
New Code Generator: Visually generate CRUD pages (only in local development environment)
The old version of the code generator has been deprecated. Please manually add the following URL as a backend menu: Admin/CodeGenerator
AdminTable Draft Features
EnableDraft: Auto-save form data to localStorage
EnableSaveWithoutClose: Keep window open after save
DraftAutoSaveInterval: Custom save interval (default 30 seconds)
Smart Draft Recovery: Only prompt when content changed, auto-clean unchanged drafts
New "Save Without Closing" button
🔧 Improvements
Split AdminContext into multiple partial classes for cleaner code
AdminFileInput component now supports direct path copying
Database logging changed to async queue writes to reduce request blocking
Updated AdminTable, Menu Management, Data Permission, Project Introduction docs
[v2.2.9] - 2026-05-30
Added 🎉
Added remote login logout option
Improved English translations for all modules, localization enabled by default.
Breaking change: SysMenuType and DataPermissionType enum types changed. After upgrading to this version, please manually execute: migrate_enum_v.2.2.7.sql
[v2.2.6] - 2026-05-29
Added 🎉
Added changelog display on the admin dashboard
Updated sample module content
Fixed 🐛
Prevent Chat timer from accessing services after DI disposal causing ObjectDisposedException
Added IsAdmin property to AdminContext
Fixed issue where e.Select.OrderByDescending in OnBeforeQuery was not working
Fixed login not obtaining IP address
Fixed issue where inline Switch could still be toggled without edit permission
Fixed BootstrapBlazor edit dialog submit button stuck in loading state
Fixed login failure when EasyAdminBlazor.Scheduler extension is not installed
Refactored 📦
Refactored default sorting logic
Optimized FreeSql registration in non-multi-tenant mode
Synced NuGet package versions
Documentation 📝
Added extensive documentation: AdminTable, Multi-Tenant, Localization, Data Permission, File Management, etc.
Updated quick start documentation
Added project introduction documentation
v2.2.0 — 2026-05-23
Refactored: FreeRedis provided as an extension (EasyAdminBlazor.Redis)
Refactored: Scheduled tasks provided as an extension (EasyAdminBlazor.Scheduler)
Refactored: Multi-tenancy provided as an extension (EasyAdminBlazor.MultiTenant)
Refactored: Caching provided as an extension (EasyAdminBlazor.FusionCache)
Refactored: FusionCache provided as an extension project
v2.0.x — 2026-05-22 ~ 2026-05-23
Added: WeChat Pay
v2.0.x — 2026-04-09 ~ 2026-04-15
Refactored: Architecture layering, separated data from UI to accommodate multi-layer architecture
Added: Added login city record
Optimized: Fully adapted for mobile devices
Fixed: Removed BootstrapBlazor's WebClient to resolve timeout exceptions
Enhanced: AdminSelectEntity.razor now supports binding to any field
Fixed: Save button could not be clicked again after a save exception
Fixed: Corrected OrgId hardcoding issue, now prioritizes Column(Name=value) for Flags type matching
Enhanced: Table filtering and advanced search now support Flags enums
v2.0.x — 2026-03-01 ~ 2026-03-20
Added: Added permission control for file upload Picker
Added: Access admin backend via security code
Added: Added SendCloud email delivery
Fixed: Resolved task scheduling failure in multi-project scenarios
v2.0.x — 2025-12-31 ~ 2026-02-22
Optimized: Fixed TinyMCE not being able to modify image alt text
Added: Menu show/hide option
v2.0.3 — 2026-01-03
Integrated: Directly integrated FusionCache
Enhanced: Added GetOrSet method to cache
v2.0.1 — 2026-01-01
Enhanced: Admin list added quick toggle for enabled/disabled status
Enhanced: Encryption key is now customizable
Enhanced: Encrypted login Cookie
Enhanced: CAPTCHA and login error count stored in Redis when configured, otherwise in-memory
v2.0.0 — 2025-12-31
Upgraded: Upgraded to .NET 10
Upgraded: Upgraded all NuGet packages to latest versions
v1.4.7 — 2025-06-06 ~ 2025-11-25
Added: Upload parameters are configurable
Enhanced: Changed tree component's sort property to string type
Fixed: Fixed issue with fuzzy search returning no results