以下文章来源于CodeSpirit-码灵,作者magiccodes
CodeSpirit 提供了一套基于属性标记的设置页自动生成机制,能够将后端的多个设置操作方法自动转换为前端的多 Tab 设置界面。开发者只需在控制器上添加特性标记,框架即可自动生成完整的设置页面 UI 配置。
HeaderOperation 方法自动生成 Tab 页
传统的设置页面开发需要:
设置页生成机制通过以下方式简化开发:
[SettingsPage] 特性[HeaderOperation] 方法对应一个 TabSaveXxx → GetXxx特性 | 传统方式 | 设置页生成 |
|---|---|---|
配置复杂度 | 需要手动编写大量配置 | 仅需添加特性标记 |
代码量 | 每个设置项都需要完整实现 | 自动生成 |
维护成本 | 需同步更新多处代码 | 修改特性即可 |
扩展性 | 需要重复开发 | 添加方法即可扩展 |
辅助组件控制器层中间件层前端层请求配置检测SettingsPage创建Builder扫描方法读取特性读取特性生成字段获取路由创建API配置返回配置返回JSON渲染界面AMIS 前端界面多 Tab 设置页AmisMiddlewareAmisGeneratorSettingsPageConfigBuilderUserSettingsControllerSettingsPageAttributeHeaderOperationAttributeFormFieldHelperApiRouteHelperAmisApiHelper控制器类SettingsPageConfigBuilderAmisGeneratorAmisMiddleware前端控制器类SettingsPageConfigBuilderAmisGeneratorAmisMiddleware前端loop[每个HeaderOperation方法]alt[是设置页][是 CRUD 页]请求 /amis/{controller}获取 AMIS 配置检查 SettingsPageAttribute创建 SettingsPageConfigBuilder扫描所有方法获取 HeaderOperationAttribute生成 Tab 配置匹配 InitAPI生成表单字段返回 Tabs 配置使用 CRUD 构建器返回 JSON 配置返回 AMIS Schema渲染设置页界面否是是否是否开始扫描控制器方法有 HeaderOperation?返回 null按定义顺序排序遍历方法获取 HeaderOperation 特性生成 Tab 配置获取方法路由查找 InitAPI生成表单字段构建 Tab JSON有 Icon?设置 icon 属性跳过NEXT还有方法?构建 Page 配置返回 JSON标记控制器为设置页面,触发设置页生成逻辑。
属性说明:
Title:页面标题Description:页面描述TabsMode:Tab 模式(line/card/radio)Animated:是否启用切换动画负责将控制器方法转换为 AMIS Tabs 配置。
核心职责:
HeaderOperationAttribute 的方法标记设置操作方法,定义 Tab 的显示属性。
使用的属性:
Label:用作 Tab 标题Icon:用作 Tab 图标(Font Awesome)DialogSize:影响表单对话框大小为每个设置项创建独立的 DTO 类:
namespace YourApi.Dtos.Settings;
/// <summary>
/// 微信登录设置
/// </summary>
publicclassWeChatLoginSettingsDto
{
[DisplayName("微信小程序AppId")]
[AmisInputTextField(Label = "微信小程序AppId",
Placeholder = "请输入AppId")]
publicstring AppId { get; set; }
[DisplayName("启用微信登录")]
[AmisSwitchField(Label = "启用微信登录")]
publicbool Enabled { get; set; }
}创建控制器并添加 SettingsPageAttribute:
[DisplayName("用户设置")]
[Navigation(Icon = "fa-solid fa-user-cog", Order = 150)]
[SettingsPage(Title = "用户设置", TabsMode = "line")]
publicclassUserSettingsController : ApiControllerBase
{
// 获取微信登录设置
[HttpGet("wechat-login")]
publicasync Task<ActionResult<ApiResponse<WeChatLoginSettingsDto>>>
GetWeChatLoginSettings()
{
// 实现获取逻辑
}
// 保存微信登录设置
[HttpPut("wechat-login")]
[HeaderOperation("微信登录", "form",
Icon = "fa-brands fa-weixin",
DialogSize = DialogSize.LG)]
publicasync Task<ActionResult<ApiResponse>>
SaveWeChatLoginSettings([FromBody] WeChatLoginSettingsDto dto)
{
// 实现保存逻辑
}
}访问 /amis/UserSettings,框架将自动生成包含所有设置 Tab 的页面。
系统会按以下规则自动匹配初始化接口:
保存方法名 | 自动匹配的获取方法名 |
|---|---|
SaveWeChatLogin | GetWeChatLogin |
UpdateNotification | GetNotification |
PutUserPreferences | GetUserPreferences |
匹配逻辑:
Save/Update/Put 替换为 Get[HttpGet] 特性的方法initApiTab 按照方法在控制器中的定义顺序显示。如需调整顺序,只需调整方法的定义位置。
public class UserSettingsController : ApiControllerBase
{
// 第一个 Tab
[HeaderOperation("微信登录", "form")]
public Task SaveWeChatLogin() { }
// 第二个 Tab
[HeaderOperation("支付宝登录", "form")]
public Task SaveAlipayLogin() { }
// 第三个 Tab
[HeaderOperation("通知设置", "form")]
public Task SaveNotification() { }
}[SettingsPage(Title = "设置", TabsMode = "line")]横向线条式 Tab,适合设置项较少的场景。
[SettingsPage(Title = "设置", TabsMode = "card")]卡片式 Tab,视觉效果更明显。
[SettingsPage(Title = "设置", TabsMode = "radio")]单选按钮式 Tab,适合 2-4 个设置项的场景。
[DisplayName("系统设置")]
[Navigation(Icon = "fa-solid fa-cog", Order = 200)]
[SettingsPage(Title = "系统设置", Description = "管理系统各项配置")]
publicclassSystemSettingsController : ApiControllerBase
{
privatereadonly ISettingsService _settingsService;
public SystemSettingsController(ISettingsService settingsService)
{
_settingsService = settingsService;
}
// ============ 微信登录设置 ============
[HttpGet("wechat-login")]
publicasync Task<ActionResult<ApiResponse<WeChatLoginSettingsDto>>>
GetWeChatLoginSettings()
{
var settings = await _settingsService.GetAsync<WeChatLoginSettingsDto>(
"ThirdPartyLogin", "WeChat");
return SuccessResponse(settings);
}
[HttpPut("wechat-login")]
[HeaderOperation("微信登录", "form",
Icon = "fa-brands fa-weixin")]
publicasync Task<ActionResult<ApiResponse>>
SaveWeChatLoginSettings([FromBody] WeChatLoginSettingsDto dto)
{
await _settingsService.SetAsync("ThirdPartyLogin", "WeChat", dto);
return SuccessResponse("保存成功");
}
// ============ 邮件设置 ============
[HttpGet("email")]
publicasync Task<ActionResult<ApiResponse<EmailSettingsDto>>>
GetEmailSettings()
{
var settings = await _settingsService.GetAsync<EmailSettingsDto>(
"Notification", "Email");
return SuccessResponse(settings);
}
[HttpPut("email")]
[HeaderOperation("邮件设置", "form",
Icon = "fa-solid fa-envelope")]
publicasync Task<ActionResult<ApiResponse>>
SaveEmailSettings([FromBody] EmailSettingsDto dto)
{
await _settingsService.SetAsync("Notification", "Email", dto);
return SuccessResponse("保存成功");
}
// ============ 安全设置 ============
[HttpGet("security")]
publicasync Task<ActionResult<ApiResponse<SecuritySettingsDto>>>
GetSecuritySettings()
{
var settings = await _settingsService.GetAsync<SecuritySettingsDto>(
"System", "Security");
return SuccessResponse(settings);
}
[HttpPut("security")]
[HeaderOperation("安全设置", "form",
Icon = "fa-solid fa-shield-alt",
DialogSize = DialogSize.LG)]
publicasync Task<ActionResult<ApiResponse>>
SaveSecuritySettings([FromBody] SecuritySettingsDto dto)
{
await _settingsService.SetAsync("System", "Security", dto);
return SuccessResponse("保存成功");
}
}✅ 推荐:每个设置项使用独立的 DTO
WeChatLoginSettingsDto
AlipayLoginSettingsDto
NotificationSettingsDto❌ 不推荐:将所有设置放在一个大 DTO 中
AllSettingsDto { WeChatAppId, AlipayAppId, EmailHost, ... }遵循命名约定可以自动匹配 InitAPI:
✅ 推荐:
GetWeChatLogin / SaveWeChatLoginGetNotification / UpdateNotificationGetUserPreferences / PutUserPreferences❌ 不推荐:
FetchWeChatData / SaveWeChatLogin (不匹配)使用语义化的 Font Awesome 图标:
// 第三方登录
Icon = "fa-brands fa-weixin" // 微信
Icon = "fa-brands fa-alipay" // 支付宝
// 功能类别
Icon = "fa-solid fa-bell" // 通知
Icon = "fa-solid fa-envelope" // 邮件
Icon = "fa-solid fa-shield-alt" // 安全
Icon = "fa-solid fa-sliders-h" // 偏好设置根据表单字段数量选择合适的对话框大小:
DialogSize.SM:2-3 个字段DialogSize.MD:4-6 个字段(默认)DialogSize.LG:7-10 个字段DialogSize.XL:10+ 个字段radio 模式line 模式(默认)特性 | CRUD 页面 | 设置页面 |
|---|---|---|
触发特性 | 默认(有增删改查方法) | [SettingsPage] |
页面结构 | 列表 + 增删改查操作 | 多 Tab 表单 |
数据操作 | 批量数据的 CRUD | 单个配置的读写 |
适用场景 | 用户管理、订单列表等 | 系统设置、用户偏好等 |
API 模式 | RESTful (GET/POST/PUT/DELETE) | GET/PUT 对 |
可能原因:
[SettingsPage] 特性[HeaderOperation] 特性可能原因:
[HttpGet] 特性解决方案: 调整方法在控制器中的定义顺序,Tab 会按方法定义顺序显示。
CodeSpirit 的设置页自动生成机制通过声明式的特性标记,将后端的多个设置操作方法自动转换为前端的多 Tab 设置界面。这种方式大幅简化了设置页面的开发流程,提高了代码的可维护性和可读性。
核心优势:
开发者只需关注业务逻辑的实现,界面生成完全交给框架自动处理。
本文分享自 CodeSpirit-码灵 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!