diff --git a/db/asset_dsl.go b/db/asset_dsl.go
index b708c33..24c7f25 100644
--- a/db/asset_dsl.go
+++ b/db/asset_dsl.go
@@ -37,6 +37,9 @@ var knownStringFields = map[string]string{
"icp": "icp",
"service_name": "service_name",
"app_name": "app_name",
+ "bundle_id": "bundle_id",
+ "category": "category",
+ "app_icp": "app_icp",
"method": "method",
"service_type": "service_type",
"record_type": "record_type",
@@ -67,13 +70,13 @@ func isKnownField(f string) bool {
// ── tokeniser ────────────────────────────────────────────────────────────────
const (
- tkField = "FIELD"
- tkBare = "BARE"
- tkAnd = "AND"
- tkOr = "OR"
- tkLP = "LPAREN"
- tkRP = "RPAREN"
- tkEOF = "EOF"
+ tkField = "FIELD"
+ tkBare = "BARE"
+ tkAnd = "AND"
+ tkOr = "OR"
+ tkLP = "LPAREN"
+ tkRP = "RPAREN"
+ tkEOF = "EOF"
)
type tok struct {
diff --git a/web/src/app/(main)/function/assets/page.tsx b/web/src/app/(main)/function/assets/page.tsx
index 9712f50..b1892d4 100644
--- a/web/src/app/(main)/function/assets/page.tsx
+++ b/web/src/app/(main)/function/assets/page.tsx
@@ -7,6 +7,7 @@ import {
NetworkIcon,
LayoutTemplateIcon,
LinkIcon,
+ SmartphoneIcon,
SearchIcon,
KeyRoundIcon,
ChevronLeftIcon,
@@ -76,6 +77,9 @@ const DSL_FIELDS: { name: string; desc: string; ops: { op: string; desc: string
{ name: "icp", desc: "ICP 备案号", ops: [{ op: "=", desc: "模糊匹配" }, { op: "==", desc: "精确匹配" }, { op: "!=", desc: "排除" }] },
{ name: "service_name", desc: "服务名称(非 HTTP 服务)", ops: [{ op: "=", desc: "模糊匹配" }, { op: "==", desc: "精确匹配" }, { op: "!=", desc: "排除" }] },
{ name: "app_name", desc: "应用名称", ops: [{ op: "=", desc: "模糊匹配" }, { op: "==", desc: "精确匹配" }, { op: "!=", desc: "排除" }] },
+ { name: "bundle_id", desc: "应用 Bundle ID", ops: [{ op: "=", desc: "模糊匹配" }, { op: "==", desc: "精确匹配" }, { op: "!=", desc: "排除" }] },
+ { name: "category", desc: "应用分类", ops: [{ op: "=", desc: "模糊匹配" }, { op: "==", desc: "精确匹配" }, { op: "!=", desc: "排除" }] },
+ { name: "app_icp", desc: "应用 ICP 备案", ops: [{ op: "=", desc: "模糊匹配" }, { op: "==", desc: "精确匹配" }, { op: "!=", desc: "排除" }] },
{ name: "method", desc: "HTTP 方法 GET/POST/PUT/…", ops: [{ op: "==", desc: "精确匹配" }, { op: "!=", desc: "排除" }] },
{ name: "service_type", desc: "服务类型:http | other", ops: [{ op: "==", desc: "精确匹配" }, { op: "!=", desc: "排除" }] },
{ name: "record_type", desc: "DNS 解析类型 A/CNAME/MX/…", ops: [{ op: "==", desc: "精确匹配" }, { op: "!=", desc: "排除" }] },
@@ -216,6 +220,7 @@ const TABS: { key: string; label: string; icon: LucideIcon }[] = [
{ key: "root_domain", label: "根域名", icon: GlobeIcon },
{ key: "ip", label: "IP", icon: NetworkIcon },
{ key: "subdomain", label: "子域名", icon: GlobeIcon },
+ { key: "app", label: "应用", icon: SmartphoneIcon },
{ key: "service", label: "服务", icon: LayoutTemplateIcon },
{ key: "endpoint", label: "接口", icon: LinkIcon },
];
@@ -609,6 +614,45 @@ export default function AssetsPage() {
+ {/* 应用 */}
+
+ {searchBox}
+ toggleSelectAll(ids)}
+ >
+ {slice(tabData("app")).map((a) => (
+
+
+ toggleSelect(a.id)} />
+
+ {a.app_name || "—"}
+ {a.bundle_id || "—"}
+ {a.category || "—"}
+ {a.app_icp || "—"}
+
+
+
+
+ ))}
+
+
+
{/* 服务 */}
{searchBox}