扩展集成
EasyAdminBlazor 把核心功能和扩展功能解耦,用哪个扩展就装哪个 NuGet 包,避免项目臃肿。本文汇总各扩展包的安装、注册和基本用法。
扩展总览
| 扩展包 | 注册方法 | 功能 |
|---|---|---|
EasyAdminBlazor.Mail |
AddEasyAdminBlazorMail() |
SMTP / SendCloud / 腾讯云 邮件发送 |
EasyAdminBlazor.AliyunSms |
AddEasyAdminBlazorAliyunSms() |
阿里云短信 |
EasyAdminBlazor.Redis |
AddEasyAdminBlazorRedis(连接串) |
Redis 缓存、在线状态、发布订阅、分布式锁 |
EasyAdminBlazor.FusionCache |
AddEasyAdminBlazorFusionCache() |
混合缓存加速 |
EasyAdminBlazor.Captcha |
AddEasyAdminBlazorCaptcha(options) |
表单/登录验证码 |
EasyAdminBlazor.HtmlEditor |
AddEasyAdminBlazorTinyMCEEditor() |
TinyMCE 富文本编辑器 |
EasyAdminBlazor.Chat |
AddEasyAdminBlazorChat() + app.UseChat() |
实时聊天(依赖 Redis) |
EasyAdminBlazor.MultiTenant |
AddEasyAdminBlazorMultiTenant() |
多租户,详见多租户 |
EasyAdminBlazor.Scheduler |
AddEasyAdminBlazorScheduler() |
计划任务,详见计划任务 |
EasyAdminBlazor.WeChat |
AddEasyAdminBlazorWeChat() |
微信小程序、微信支付 V3 |
EasyAdminBlazor.Approval |
AddEasyAdminBlazorApproval() |
轻量多级审批(状态机 + 审批记录表),详见审批 |
在 Program.cs 里统一注册:
builder.AddEasyAdminBlazor(new EasyAdminBlazorOptions { ... })
.AddEasyAdminBlazorMail()
.AddEasyAdminBlazorRedis(configuration["Redis:ConnectionString"]!)
.AddEasyAdminBlazorChat()
.AddEasyAdminBlazorScheduler()
.AddEasyAdminBlazorCaptcha(options => { options.Chars = "0123456789"; });
Redis(EasyAdminBlazor.Redis)
.AddEasyAdminBlazorRedis(configuration["Redis:ConnectionString"]!)
配置:
{
"Redis": {
"ConnectionString": "127.0.0.1:6379,poolsize=10"
}
}
注册后可以注入 IRedisService,支持:
- 常用缓存:
Get<T>/Set<T>/IncrBy/Expire等 String、Hash、List、Set、Sorted Set 操作 - 在线状态:
JoinOnline/RemoveOnline/GetClientListByOnline/HasOnline - 发布订阅:
Publish/Subscribe(频道见SubscribeChannel枚举) - 分布式锁:
Lock(key, expireSeconds)/ReleaseLock(lockHandle)
@inject IRedisService Redis
// 缓存
Redis.Set("user:1", new UserDto { ... }, TimeSpan.FromMinutes(10));
var user = Redis.Get<UserDto>("user:1");
// 发布订阅
Redis.Subscribe<MyMessage>(SubscribeChannel.MessageNotification, msg =>
{
// 处理消息
});
Redis.Publish(SubscribeChannel.MessageNotification, new MyMessage { ... });
// 分布式锁
var lockHandle = Redis.Lock("order:100", 30);
try
{
// 临界区
}
finally
{
Redis.ReleaseLock(lockHandle);
}
该扩展同时提供了 IDistributedCache 实现,兼容标准分布式缓存接口。
邮件(EasyAdminBlazor.Mail)
.AddEasyAdminBlazorMail()
配置三选一(默认 Auto 自动选择:SendCloud 已配置时优先 SendCloud,其次腾讯云,最后 SMTP):
{
"SmtpSettings": {
"Server": "smtp.example.com",
"Port": 587,
"Username": "your_email@example.com",
"Password": "your_email_password",
"FromEmail": "your_email@example.com",
"EnableSsl": true
}
}
或配置 SendCloud(配置后优先走 SendCloud):
{
"SendCloud": {
"ApiUser": "your_sendcloud_api_user",
"ApiKey": "your_sendcloud_api_key",
"SenderEmail": "noreply@example.com",
"SenderName": "Your App"
}
}
或配置腾讯云邮件推送(SES):
{
"TencentCloud": {
"SecretId": "your_secret_id",
"SecretKey": "your_secret_key",
"Region": "ap-guangzhou",
"FromEmail": "noreply@example.com",
"FromName": "Your App",
"ReplyToAddresses": ""
}
}
也可以显式指定服务商(不依赖自动选择顺序):
{
"Mail": {
"Provider": "TencentCloud"
}
}
Provider 可选值:Smtp / SendCloud / TencentCloud,不配置时默认 Auto 自动选择。
显式指定 Provider 后,后台系统配置页只展示对应服务商的配置项;不指定(Auto)时三种配置项都会展示。
每种服务商分组都支持发送测试邮件;调用时也可临时指定本次发送使用的服务商:
var ok = await EmailService.SendEmailAsync("a@example.com", "标题", "内容", provider: "TencentCloud");
服务商名称由 EasyAdminBlazor.Mail 扩展解析(Smtp / SendCloud / TencentCloud,大小写不敏感),Core 不依赖具体服务商,后续新增服务商只需更新 Mail 扩展。
后台配置页的"邮件测试"按配置贡献者声明自动展示:新增服务商时在 Mail 扩展里新增一个继承 ConfigSettingsContributorBase 的贡献者类(ConfigType 与服务商名一致,并声明 IsEmailProvider = true 和测试必填项 EmailRequiredKeys),配置页和测试邮件即自动生效,无需改动 /Admin/Config。
注入 IEmailService 发送:
@inject IEmailService EmailService
// 普通邮件,多个收件人用英文分号分隔;isHtml 控制正文是否为 HTML
var ok = await EmailService.SendEmailAsync("a@example.com;b@example.com", "标题", "<h1>内容</h1>", isHtml: true);
// 模板邮件(SendCloud 模板传模板调用名称;腾讯云模板传模板ID)
var (success, message) = await EmailService.SendTemplateEmailAsync(
"a@example.com",
"通知",
"your_template_name_or_id",
new Dictionary<string, object> { ["code"] = "1234" });
短信(EasyAdminBlazor.AliyunSms)
.AddEasyAdminBlazorAliyunSms()
配置:
{
"AliyunSms": {
"AccessKeyId": "your_access_key_id",
"AccessKeySecret": "your_access_key_secret",
"SignName": "your_sign_name"
}
}
注入 ISmsService:
@inject ISmsService SmsService
var ok = await SmsService.SendSmsAsync("13800000000", "SMS_123456", "{\"code\":\"1234\"}");
验证码(EasyAdminBlazor.Captcha)
.AddEasyAdminBlazorCaptcha(options =>
{
options.Chars = "0123456789";
})
登录页验证码由 EasyAdminBlazorOptions.EnableLoginCaptcha 控制。字符集、长度等通过 CaptchaOptions 配置。
富文本编辑器(EasyAdminBlazor.HtmlEditor)
.AddEasyAdminBlazorTinyMCEEditor()
配置脚本地址(可自建 CDN 或本地部署):
{
"TinyMCE": {
"ScriptSrc": "https://cdn.wang-zhan.cn/tinymce_8.3.2/tinymce.min.js"
}
}
页面里使用 AdminEditor 组件(见组件文档)。
实时聊天(EasyAdminBlazor.Chat)
.AddEasyAdminBlazorChat()
// ...
app.UseChat();
依赖 Redis:AddEasyAdminBlazorChat() 调用前需先注册 Redis 扩展,未配置 Redis 时聊天不会启用。界面用法见在线聊天。
多租户(EasyAdminBlazor.MultiTenant)
.AddEasyAdminBlazorMultiTenant()
独立数据库、按域名识别租户、菜单与文件隔离。完整说明见多租户。
计划任务(EasyAdminBlazor.Scheduler)
.AddEasyAdminBlazorScheduler()
支持 [Scheduler] 特性标注和 ISchedulerService 动态管理,可视化页面 /Admin/TaskScheduler。完整说明见计划任务。
轻量多级审批(EasyAdminBlazor.Approval)
.AddEasyAdminBlazorApproval(o =>
{
o.Flows.Add(new ApprovalFlowConfig
{
BillType = typeof(Article).FullName!,
Levels =
[
new ApprovalLevelConfig { Level = 1, Name = "部门主管审批", Kind = ApproverKind.OrgLeader, Offset = 1 },
new ApprovalLevelConfig { Level = 2, Name = "财务复核", Kind = ApproverKind.Role, Value = "财务" }
]
});
})
业务实体把基类换成 ApprovalEntity / ApprovalEntityFull(或直接实现 IApprovalBill)即接入审批:AdminTable 自动在保存后提交审批、审批中禁止修改删除,审批记录表同时充当待办索引。
完整说明见审批。
混合缓存(EasyAdminBlazor.FusionCache)
.AddEasyAdminBlazorFusionCache()
用 FusionCache 实现 ICacheService,在内存与 Redis 之间提供混合缓存加速。
微信(EasyAdminBlazor.WeChat)
.AddEasyAdminBlazorWeChat()
配置:
{
"Wechat": {
"App": {
"AppKey": "your_app_key",
"AppSecret": "your_app_secret"
},
"PayV3": {
"AppId": "",
"MchId": "",
"ApiV3Key": "",
"CertificatePath": "certs/apiclient_cert.pem",
"KeyPath": "certs/apiclient_key.pem",
"PubPath": "certs/pub_key.pem",
"NotifyUrl": "",
"BaseUrl": "https://api.mch.weixin.qq.com"
}
}
}
主要服务:
WeChatAppService:小程序登录(code → openid/session_key)、用户数据验签解密、小程序码生成WeChatPayV3Service:Native / JSAPI 下单、回调验签与解密、查询/关闭订单
@inject WeChatPayV3Service WeChatPay
// 创建 PC 扫码支付订单
var result = await WeChatPay.CreateNativePaymentAsync("商品描述", 0.01m, outTradeNo);
if (result.Success)
{
// result.CodeUrl 用来生成二维码
}
注意事项
- 扩展包与核心包建议保持同一版本
- 用不到的扩展不要安装,避免功能臃肿和潜在冲突
- 微信支付证书文件(
certs/)不要提交到代码仓库