Skip to main content

yggdrasil/pages/admin/settings/
purge_section.rs

1//! 素材清理分区:无引用图片的自动清理开关与保留天数。
2//!
3//! 后台任务每天读取 DB 值执行:没有文章、笔记、评论或头像引用的素材,超过保留天数
4//! 后物理删除(文件、DB 行与派生缓存)。
5
6use leptos::prelude::*;
7
8use super::kit::{use_section, SettingRow, SettingsCard, SwitchRow};
9use super::SettingsSection;
10use crate::api::error::ApiError;
11use crate::api::settings::{get_asset_purge_settings, update_asset_purge_settings};
12use crate::components::forms::NumberInput;
13use crate::models::settings::AssetPurgeSettings;
14
15async fn save(d: AssetPurgeSettings) -> Result<AssetPurgeSettings, ApiError> {
16    update_asset_purge_settings(d.auto_purge_enabled, d.retention_days).await
17}
18
19/// 素材清理分区组件。
20#[component]
21pub fn AssetPurgeSection() -> impl IntoView {
22    let st = use_section(SettingsSection::AssetPurge, get_asset_purge_settings, save);
23    view! {
24        <SettingsCard
25            section=SettingsSection::AssetPurge
26            description="没有任何引用的图片超过保留天数后自动删除,每天执行一次。"
27            ready=st.ready()
28            load_failed=st.load_failed()
29            failed=st.failed()
30        >
31            <SwitchRow
32                label="启用自动清理"
33                hint="关闭后未引用图片一直保留,需要在素材页手动清理。评论区允许匿名传图,建议保持开启。"
34                checked=st.field(|d| d.auto_purge_enabled)
35                ontoggle=move |()| st.edit(|d| d.auto_purge_enabled = !d.auto_purge_enabled)
36            />
37            <SettingRow label="保留天数" html_for="asset-purge-days">
38                <NumberInput
39                    id="asset-purge-days"
40                    value=st.field(|d| i64::from(d.retention_days))
41                    min=1
42                    max=365
43                    unit="天"
44                    hint="上传满这么多天仍未被引用才会删除,以免误删还没保存的草稿里的图片。"
45                    onchange=move |v: i64| st.edit(|d| d.retention_days = v as i32)
46                />
47            </SettingRow>
48        </SettingsCard>
49    }
50}