diff --git a/static/js/store.js b/static/js/store.js index ad7f3eb..05ad213 100644 --- a/static/js/store.js +++ b/static/js/store.js @@ -39,6 +39,8 @@ const store = reactive({ filterProvider: '', // 按平台筛选(slug),从平台页「关联 N 个资产」跳转而来 assetTab: '', // 资产页 TAB:'' 全部 / vps / domain / cloudflare / subscription(付费资产) / ai_agent monitorTab: '', // 监控中心 TAB:同上 + monitorExpiryFilter: '', // 监控中心到期区间子筛选:'' 全部 / soon30 / soon7 / expired + monitorSslStatusFilter: '', // 监控中心 SSL 状态子筛选:'' 全部 / valid / expiring / expired_error dark: localStorage.getItem('vps_dark') === '1', loading: false, error: '', @@ -101,10 +103,13 @@ function buildAssetPayload(f) { } /* ---------------- 数据加载 ---------------- */ +// 后端 status 参数只认单个 AssetStatus 枚举值;「异常」是「已停止 + 已过期」的组合概念, +// 后端不支持多值筛选,这里当作前端本地筛选的哨兵值,不发给 API,由视图层自己过滤。 +const CLIENT_SIDE_STATUS_FILTERS = new Set(['abnormal']); async function loadAssets() { const params = new URLSearchParams(); if (store.filterType) params.set('asset_type', store.filterType); - if (store.filterStatus) params.set('status', store.filterStatus); + if (store.filterStatus && !CLIENT_SIDE_STATUS_FILTERS.has(store.filterStatus)) params.set('status', store.filterStatus); if (store.filterProvider) params.set('provider', store.filterProvider); if (store.search) params.set('q', store.search); params.set('sort', 'expiry_date'); params.set('order', 'asc'); @@ -449,6 +454,27 @@ function clearProviderFilter() { loadAssets(); } +/* ---------------- 总览页卡片跳转:带预设筛选条件切到资产页 ---------------- */ +// 未显式传入的筛选项一律重置,避免带着上一页的旧筛选条件跳过去后数字对不上 +function openAssetsWithFilter({ assetTab = '', filterStatus = '', filterType = '', filterProvider = '', search = '' } = {}) { + store.assetTab = assetTab; + store.filterStatus = filterStatus; + store.filterType = filterType; + store.filterProvider = filterProvider; + store.search = search; + if (window.location.hash !== '#assets') window.location.hash = '#assets'; + else store.view = 'assets'; + loadAssets(); +} + +/* ---------------- 总览页卡片跳转:带预设到期区间筛选切到监控中心 ---------------- */ +function openMonitorWithExpiryFilter(filter) { + store.monitorTab = ''; + store.monitorExpiryFilter = filter || ''; + if (window.location.hash !== '#monitor') window.location.hash = '#monitor'; + else store.view = 'monitor'; +} + /* ---------------- 服务器监控 ---------------- */ async function viewServer(a) { try { diff --git a/static/js/views/assets.js b/static/js/views/assets.js index 5a016f2..e85540c 100644 --- a/static/js/views/assets.js +++ b/static/js/views/assets.js @@ -27,6 +27,7 @@ const AssetsView = {