扩展集成

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/)不要提交到代码仓库