From a005abee627776775769b7f2543f886d5624e495 Mon Sep 17 00:00:00 2001 From: wyc <1104749580@qq.com> Date: Sun, 9 Aug 2026 15:30:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Adminive/Adminive_Settings.tsx | 59 ++-- src/Adminive/amis_fetcher.ts | 5 + src/Map/Cesium_Model_Settings.tsx | 25 +- src/Map/Map_Models.tsx | 12 +- src/Setting.tsx | 490 +---------------------------- 5 files changed, 60 insertions(+), 531 deletions(-) diff --git a/src/Adminive/Adminive_Settings.tsx b/src/Adminive/Adminive_Settings.tsx index a1253d4..eb3b27d 100644 --- a/src/Adminive/Adminive_Settings.tsx +++ b/src/Adminive/Adminive_Settings.tsx @@ -1,6 +1,8 @@ import axios from "axios" -import {useEffect, useState, type CSSProperties} from "react" +import {useEffect, useMemo, useState} from "react" +import {Cesium_Model_Settings, type Cesium_Model_Settings_Schema} from "../Map/Cesium_Model_Settings.tsx" import {AmisPanel} from "./AmisPanel.tsx" +import {ArchiveOperations, type Archive_Operations_Schema} from "./ArchiveOperations.tsx" type Composition_Node = { kind: string slot?: string @@ -8,6 +10,10 @@ type Composition_Node = { } type Slot_Contract = { component_kind: string + descriptor_api?: string + view_api?: string + data_api?: string + amis_api?: string schema: Record } type Composition_Manifest = { @@ -21,22 +27,20 @@ type Adminive_Response = { msg: string data: T } -const frontend_layout: Record = { - mode_acs: {gridColumn: "1 / -1"}, - data_feed_settings: {gridColumn: "1 / -1"}, - data_sources: {gridColumn: "1 / -1"}, - data_feeds: {gridColumn: "1 / -1"}, - source_feed_relations: {gridColumn: "1 / -1"}, - mlat: {gridColumn: "1 / -1"}, - cesium_graphics: {gridColumn: "1 / -1"} -} function collect_slots(node: Composition_Node, result: string[]) { - if (node.kind === "slot" && node.slot) { - result.push(node.slot) - } - for (const child of node.children ?? []) { - collect_slots(child, result) - } + if (node.kind === "slot" && node.slot) result.push(node.slot) + for (const child of node.children ?? []) collect_slots(child, result) +} +function CesiumModelsSlot({slot}: {slot: Slot_Contract}) { + const manager = useMemo(() => new Cesium_Model_Settings(slot.schema as unknown as Cesium_Model_Settings_Schema), [slot]) + const Component = manager.x + return +} +function render_slot(name: string, slot: Slot_Contract) { + if (slot.component_kind === "amis_schema") return + if (slot.component_kind === "ecap_archive_operations") return + if (slot.component_kind === "ecap_cesium_models") return + return
未注册的 Adminive 前端组件:{name} ({slot.component_kind})
} export function Adminive_Settings() { const [manifest, set_manifest] = useState(null) @@ -48,23 +52,12 @@ export function Adminive_Settings() { set_error(reason instanceof Error ? reason.message : String(reason)) }) }, []) - if (error) { - return
Adminive 配置加载失败:{error}
- } - if (!manifest) { - return
Adminive 配置加载中...
- } + if (error) return
Adminive 配置加载失败:{error}
+ if (!manifest) return
Adminive 配置加载中...
const slot_names: string[] = [] collect_slots(manifest.view.body, slot_names) - return ( -
- {slot_names.map(name => { - const slot = manifest.slots[name] - if (!slot || slot.component_kind !== "amis_schema") { - return null - } - return
- })} -
- ) + return
{slot_names.map(name => { + const slot = manifest.slots[name] + return slot ?
{render_slot(name, slot)}
: null + })}
} diff --git a/src/Adminive/amis_fetcher.ts b/src/Adminive/amis_fetcher.ts index 19ef9a3..348165f 100644 --- a/src/Adminive/amis_fetcher.ts +++ b/src/Adminive/amis_fetcher.ts @@ -3,6 +3,7 @@ import {emit_cesium_graphics_config, load_cesium_graphics_config} from "../Map/C import type {Amis_Request} from "./amis_runtime.ts" const cesium_graphics_data_api = "/api/adminive/config/cesium_graphics/data" const data_sources_api = "/api/adminive/config/data_sources" +const raw_action_apis = new Set(["/api/refresh_external_databases", "/api/refresh_external_database", "/api/upload_external_database", "/api/clear_external_database_table", "/api/restart_device"]) export async function amis_fetcher(request: Amis_Request): Promise { const method = (request.method ?? "get").toLowerCase() const query_method = method === "get" || method === "head" @@ -17,6 +18,10 @@ export async function amis_fetcher(request: Amis_Request): Promise= 200 && response.status < 300 && raw_action_apis.has(pathname) && response.data?.status === undefined) { + response.data = {status: 0, msg: "", data: response.data} + } const success = response.status >= 200 && response.status < 300 && response.data?.status === 0 if (method === "post" && request.url === cesium_graphics_data_api && success) { emit_cesium_graphics_config(await load_cesium_graphics_config()) diff --git a/src/Map/Cesium_Model_Settings.tsx b/src/Map/Cesium_Model_Settings.tsx index a01fb39..e769b55 100644 --- a/src/Map/Cesium_Model_Settings.tsx +++ b/src/Map/Cesium_Model_Settings.tsx @@ -15,11 +15,22 @@ import { type Model_Number_Key = keyof Pick type Model_Upload_Type = "aircraft" | "base_station" | "device" | "aircraft_type" +export type Cesium_Model_Settings_Schema = { + title?: string + data_api: string + upload_accept: string + aircraft_types: string[] +} export class Cesium_Model_Settings extends enhance.Base { config: Map_Model_Config = {...empty_map_model_config}; number_input_drafts: Record = {}; + schema: Cesium_Model_Settings_Schema; + constructor(schema: Cesium_Model_Settings_Schema) { + super(); + this.schema = schema; + } async on_mount() { - this.config = await load_map_model_config(); + this.config = await load_map_model_config(this.schema.data_api); this.number_input_drafts = {}; this.flush(); } @@ -28,7 +39,7 @@ export class Cesium_Model_Settings extends enhance.Base { message.error("只支持上传 .glb 模型"); return false; } - this.config = await upload_map_model(model_type, file, aircraft_model_key); + this.config = await upload_map_model(model_type, file, aircraft_model_key, this.schema.data_api); message.success(this.model_upload_message(model_type)); this.flush(); return false; @@ -62,7 +73,7 @@ export class Cesium_Model_Settings extends enhance.Base { this.flush(); } async save() { - this.config = await save_map_model_config(this.config); + this.config = await save_map_model_config(this.config, this.schema.data_api); this.number_input_drafts = {}; message.success("模型配置已保存"); this.flush(); @@ -84,7 +95,7 @@ export class Cesium_Model_Settings extends enhance.Base { {option.label} - this.upload("aircraft_type", file, option.key)}> + this.upload("aircraft_type", file, option.key)}> @@ -97,7 +108,7 @@ export class Cesium_Model_Settings extends enhance.Base { - this.upload(model_type, file)}> + this.upload(model_type, file)}> @@ -108,7 +119,7 @@ export class Cesium_Model_Settings extends enhance.Base { render(props: any) { return (
-

Cesium模型设置

+

{this.schema.title ?? "Cesium模型设置"}

默认飞机模型

{this.render_model_upload("飞机模型", this.config.aircraftModel, "aircraft")} @@ -117,7 +128,7 @@ export class Cesium_Model_Settings extends enhance.Base {

设备模型

{this.render_model_upload("设备模型", this.config.deviceModel, "device")}

按涡流/目标类型选择飞机模型

- {aircraft_model_type_options.map(option => this.render_aircraft_type_model(option))} + {this.schema.aircraft_types.map(key => this.render_aircraft_type_model(aircraft_model_type_options.find(option => option.key === key) ?? {key, label: key}))}
diff --git a/src/Map/Map_Models.tsx b/src/Map/Map_Models.tsx index 3620538..129d642 100644 --- a/src/Map/Map_Models.tsx +++ b/src/Map/Map_Models.tsx @@ -114,22 +114,22 @@ function to_server_config(config: Map_Model_Config): Map_Model_Config_Json { device_model: to_server_model_item(config.deviceModel) }; } -export async function load_map_model_config(): Promise { - const response = await axios.get("/map/models"); +export async function load_map_model_config(api = "/map/models"): Promise { + const response = await axios.get(api); return from_server_config(response.data); } -export async function save_map_model_config(config: Map_Model_Config): Promise { - const response = await axios.post("/map/models", to_server_config(config)); +export async function save_map_model_config(config: Map_Model_Config, api = "/map/models"): Promise { + const response = await axios.post(api, to_server_config(config)); const saved_config = from_server_config(response.data); emit_map_model_config(saved_config); return saved_config; } -export async function upload_map_model(model_type: "aircraft" | "base_station" | "device" | "aircraft_type", file: File, aircraft_model_key?: string): Promise { +export async function upload_map_model(model_type: "aircraft" | "base_station" | "device" | "aircraft_type", file: File, aircraft_model_key?: string, api = "/map/models"): Promise { const form = new FormData(); form.append("model_type", model_type); if (aircraft_model_key) form.append("aircraft_model_key", aircraft_model_key); form.append("file", file); - const response = await axios.post("/map/models", form); + const response = await axios.post(api, form); const config = from_server_config(response.data); emit_map_model_config(config); return config; diff --git a/src/Setting.tsx b/src/Setting.tsx index 43423b9..1214905 100644 --- a/src/Setting.tsx +++ b/src/Setting.tsx @@ -1,488 +1,8 @@ -import enhance from "./core/enhance.tsx"; -import {Button, Flex, InputNumber, Select} from "antd"; -import { Input } from 'antd'; -import {baseURL, setting_style, row_style, col_style} from "./Global.js"; -import { Data_Source_Config } from "./Data_Source/Data_Source_Config.tsx"; -import { Device_Config } from "./Device_Config.tsx"; -import axios from "axios"; -import { ReloadOutlined } from "@ant-design/icons"; -import { PersistentScroll } from "./PersistentScroll.tsx"; -import { External_Resources_Manager } from "./External_Resources_Manager/External_Resources_Manager.tsx"; -import {Adminive_Settings} from "./Adminive/Adminive_Settings.tsx"; -import { Cesium_Model_Settings } from "./Map/Cesium_Model_Settings.tsx"; - -const { TextArea } = Input; - - -export class Console extends enhance.Base { - serial_number: number = 0; - log: string = ""; - - style = { - "width": "60vw", - } - - render(props: any) { - return ( - <> - -

控制台输出

- - { - this.serial_number = value; - this.flush(); - }}> - - - -