feat(admin): 首页卡片配置 + 页头开关验证 + 编辑按钮仅登录可见
- settings.sections:显隐 / 顺序 / 标题覆盖 / 预览条数,HomeView 应用 - /admin 新增「首页卡片」Tab,卡片标题使用展示块标题(常用站点等) - 详情页 [编辑] 仅在登录后渲染(canEdit) - 测试:46 passed;页头禁用、卡片隐藏/改标题/限条数、编辑可见性均实测 - 文档:ADMIN-PLAN、README
This commit is contained in:
@@ -88,11 +88,25 @@ pub struct SidebarSettings {
|
||||
pub order: Vec<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
|
||||
#[serde(default)]
|
||||
pub struct SectionsSettings {
|
||||
/// 隐藏的首页卡片(分类 id)
|
||||
pub hidden: Vec<String>,
|
||||
/// 卡片顺序(分类 id)
|
||||
pub order: Vec<String>,
|
||||
/// 标题覆盖:id → 标题
|
||||
pub titles: std::collections::HashMap<String, String>,
|
||||
/// 预览条数覆盖:id → 条数
|
||||
pub limits: std::collections::HashMap<String, u32>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
|
||||
#[serde(default)]
|
||||
pub struct Settings {
|
||||
pub header: HeaderSettings,
|
||||
pub sidebar: SidebarSettings,
|
||||
pub sections: SectionsSettings,
|
||||
}
|
||||
|
||||
/// 读到/保存后的完整状态:设置本体 + 版本号(前端提交时要带回来)。
|
||||
@@ -134,6 +148,22 @@ pub fn validate(settings: &Settings) -> Result<(), StashError> {
|
||||
if settings.sidebar.hidden.len() > 100 || settings.sidebar.order.len() > 100 {
|
||||
return Err(StashError::InvalidDirectory("侧栏配置过长".into()));
|
||||
}
|
||||
if settings.sections.hidden.len() > 100 || settings.sections.order.len() > 100 {
|
||||
return Err(StashError::InvalidDirectory("首页卡片配置过长".into()));
|
||||
}
|
||||
if settings.sections.titles.len() > 100 || settings.sections.limits.len() > 100 {
|
||||
return Err(StashError::InvalidDirectory("首页卡片配置过长".into()));
|
||||
}
|
||||
for title in settings.sections.titles.values() {
|
||||
if title.chars().count() > 40 {
|
||||
return Err(StashError::InvalidDirectory("卡片标题最多 40 个字".into()));
|
||||
}
|
||||
}
|
||||
for limit in settings.sections.limits.values() {
|
||||
if *limit > 60 {
|
||||
return Err(StashError::InvalidDirectory("卡片条数最多 60".into()));
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -239,6 +269,7 @@ mod tests {
|
||||
let settings = Settings::default();
|
||||
assert!(settings.header.enabled);
|
||||
assert_eq!(settings.header.items.len(), 3);
|
||||
assert!(settings.sections.hidden.is_empty());
|
||||
assert!(validate(&settings).is_ok());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user