diff --git a/Doc/XXSJPic_V1.0/XNOSAL_Type.drawio b/Doc/XXSJPic_V1.0/XNOSAL_Type.drawio
new file mode 100644
index 0000000..e415dab
--- /dev/null
+++ b/Doc/XXSJPic_V1.0/XNOSAL_Type.drawio
@@ -0,0 +1,574 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Doc/XXSJPic_V1.0/XNSimPortal_IntCnf.drawio b/Doc/XXSJPic_V1.0/XNSimPortal_IntCnf.drawio
new file mode 100644
index 0000000..4d1376d
--- /dev/null
+++ b/Doc/XXSJPic_V1.0/XNSimPortal_IntCnf.drawio
@@ -0,0 +1,533 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Doc/一体化二进制数据包软件概要设计说明-V1.0.docx b/Doc/一体化二进制数据包软件概要设计说明-V1.0.docx
index bdad3b7..97d9834 100644
Binary files a/Doc/一体化二进制数据包软件概要设计说明-V1.0.docx and b/Doc/一体化二进制数据包软件概要设计说明-V1.0.docx differ
diff --git a/Doc/一体化二进制数据包软件概要设计说明-V1.0.pdf b/Doc/一体化二进制数据包软件概要设计说明-V1.0.pdf
index 1b3a4c1..a001fc5 100644
Binary files a/Doc/一体化二进制数据包软件概要设计说明-V1.0.pdf and b/Doc/一体化二进制数据包软件概要设计说明-V1.0.pdf differ
diff --git a/Doc/一体化二进制数据包软件详细设计说明-V1.0.docx b/Doc/一体化二进制数据包软件详细设计说明-V1.0.docx
index 808d52c..b72f8c3 100644
Binary files a/Doc/一体化二进制数据包软件详细设计说明-V1.0.docx and b/Doc/一体化二进制数据包软件详细设计说明-V1.0.docx differ
diff --git a/XNCore_Win/.vscode/settings.json b/XNCore_Win/.vscode/settings.json
new file mode 100644
index 0000000..8819d6b
--- /dev/null
+++ b/XNCore_Win/.vscode/settings.json
@@ -0,0 +1,74 @@
+{
+ "files.associations": {
+ "cctype": "cpp",
+ "clocale": "cpp",
+ "cmath": "cpp",
+ "cstdarg": "cpp",
+ "cstddef": "cpp",
+ "cstdio": "cpp",
+ "cstdlib": "cpp",
+ "cstring": "cpp",
+ "ctime": "cpp",
+ "cwchar": "cpp",
+ "cwctype": "cpp",
+ "any": "cpp",
+ "array": "cpp",
+ "atomic": "cpp",
+ "bit": "cpp",
+ "*.tcc": "cpp",
+ "bitset": "cpp",
+ "chrono": "cpp",
+ "codecvt": "cpp",
+ "compare": "cpp",
+ "complex": "cpp",
+ "concepts": "cpp",
+ "condition_variable": "cpp",
+ "cstdint": "cpp",
+ "deque": "cpp",
+ "forward_list": "cpp",
+ "list": "cpp",
+ "map": "cpp",
+ "set": "cpp",
+ "unordered_map": "cpp",
+ "vector": "cpp",
+ "exception": "cpp",
+ "algorithm": "cpp",
+ "functional": "cpp",
+ "iterator": "cpp",
+ "memory": "cpp",
+ "memory_resource": "cpp",
+ "numeric": "cpp",
+ "optional": "cpp",
+ "random": "cpp",
+ "ratio": "cpp",
+ "regex": "cpp",
+ "string": "cpp",
+ "string_view": "cpp",
+ "system_error": "cpp",
+ "tuple": "cpp",
+ "type_traits": "cpp",
+ "utility": "cpp",
+ "fstream": "cpp",
+ "initializer_list": "cpp",
+ "iomanip": "cpp",
+ "iosfwd": "cpp",
+ "iostream": "cpp",
+ "istream": "cpp",
+ "limits": "cpp",
+ "mutex": "cpp",
+ "new": "cpp",
+ "ostream": "cpp",
+ "ranges": "cpp",
+ "sstream": "cpp",
+ "stdexcept": "cpp",
+ "stop_token": "cpp",
+ "streambuf": "cpp",
+ "thread": "cpp",
+ "cinttypes": "cpp",
+ "typeindex": "cpp",
+ "typeinfo": "cpp",
+ "valarray": "cpp",
+ "variant": "cpp",
+ "filesystem": "cpp"
+ }
+}
diff --git a/XNCore_Win/XNGlobalDefine/XNDDS.h b/XNCore_Win/XNGlobalDefine/XNDDS.h
index 1c708de..e5f8faa 100644
--- a/XNCore_Win/XNGlobalDefine/XNDDS.h
+++ b/XNCore_Win/XNGlobalDefine/XNDDS.h
@@ -14,63 +14,67 @@
// FastDDS宏定义
#define XN_DDS eprosima::fastdds::dds
-namespace XNSim {
-template using XNDDSOptional = eprosima::fastcdr::optional;
+namespace XNSim
+{
+template
+using XNDDSOptional = eprosima::fastcdr::optional;
using XNDDSParticipantPtr = XN_DDS::DomainParticipant *;
-using XNDDSPublisherPtr = XN_DDS::Publisher *;
-using XNDDSSubscriberPtr = XN_DDS::Subscriber *;
-using XNDDSTopicPtr = XN_DDS::Topic *;
-using XNDDSDataWriterPtr = XN_DDS::DataWriter *;
-using XNDDSDataReaderPtr = XN_DDS::DataReader *;
-using XNDDSTypeSupport = XN_DDS::TypeSupport;
-using XNDDSDataWriterQos = XN_DDS::DataWriterQos;
-using XNDDSDataReaderQos = XN_DDS::DataReaderQos;
+using XNDDSPublisherPtr = XN_DDS::Publisher *;
+using XNDDSSubscriberPtr = XN_DDS::Subscriber *;
+using XNDDSTopicPtr = XN_DDS::Topic *;
+using XNDDSDataWriterPtr = XN_DDS::DataWriter *;
+using XNDDSDataReaderPtr = XN_DDS::DataReader *;
+using XNDDSTypeSupport = XN_DDS::TypeSupport;
+using XNDDSDataWriterQos = XN_DDS::DataWriterQos;
+using XNDDSDataReaderQos = XN_DDS::DataReaderQos;
using XNDDSParticipantQos = XN_DDS::DomainParticipantQos;
-using XNDDSTopicQos = XN_DDS::TopicQos;
-using XNDDSPublisherQos = XN_DDS::PublisherQos;
-using XNDDSSubscriberQos = XN_DDS::SubscriberQos;
+using XNDDSTopicQos = XN_DDS::TopicQos;
+using XNDDSPublisherQos = XN_DDS::PublisherQos;
+using XNDDSSubscriberQos = XN_DDS::SubscriberQos;
-using XNDDSPublisherMap = std::unordered_map;
+using XNDDSPublisherMap = std::unordered_map;
using XNDDSSubscriberMap = std::unordered_map;
using XNDDSDataWriterMap = std::unordered_map;
struct PublisherInfo {
- XNDDSPublisherPtr publisher;
- XNDDSDataWriterPtr dataWriter;
+ XNDDSPublisherPtr publisher;
+ XNDDSDataWriterPtr dataWriter;
};
struct SubscriberInfo {
- XNDDSSubscriberPtr subscriber;
- XNDDSDataReaderPtr dataReader;
+ XNDDSSubscriberPtr subscriber;
+ XNDDSDataReaderPtr dataReader;
};
struct TopicInfo {
- XNDDSTopicPtr topic;
- XNDDSPublisherMap publishers_;
- XNDDSSubscriberMap subscribers_;
+ XNDDSTopicPtr topic;
+ XNDDSPublisherMap publishers_;
+ XNDDSSubscriberMap subscribers_;
};
using XNDDSTopicMap = std::unordered_map;
-template using XNDDSCallBack = std::function;
+template
+using XNDDSCallBack = std::function;
template
-class DataReaderListenerImpl : public XN_DDS::DataReaderListener {
+class DataReaderListenerImpl : public XN_DDS::DataReaderListener
+{
public:
- DataReaderListenerImpl(XNDDSCallBack callback) : callback_(callback) {}
+ DataReaderListenerImpl(XNDDSCallBack callback) : callback_(callback) {}
- void on_data_available(XNDDSDataReaderPtr reader) override {
- XN_DDS::SampleInfo info;
- if (reader->take_next_sample(&data_, &info) == XN_DDS::RETCODE_OK &&
- info.valid_data) {
- callback_(data_);
- }
- }
+ void on_data_available(XNDDSDataReaderPtr reader) override
+ {
+ XN_DDS::SampleInfo info;
+ if (reader->take_next_sample(&data_, &info) == XN_DDS::RETCODE_OK && info.valid_data) {
+ callback_(data_);
+ }
+ }
private:
- T data_;
- XNDDSCallBack callback_;
+ T data_;
+ XNDDSCallBack callback_;
};
} // namespace XNSim
\ No newline at end of file
diff --git a/XNCore_Win/XNGlobalDefine/XNEnum.h b/XNCore_Win/XNGlobalDefine/XNEnum.h
index 1a792d6..7cd4c22 100644
--- a/XNCore_Win/XNGlobalDefine/XNEnum.h
+++ b/XNCore_Win/XNGlobalDefine/XNEnum.h
@@ -1,142 +1,143 @@
#pragma once
-namespace XNSim {
+namespace XNSim
+{
/**
* @brief 系统运行状态枚举类
*/
enum class RunStatus {
- /**
+ /**
* @brief 未开始
*/
- NotStart = 0,
- /**
+ NotStart = 0,
+ /**
* @brief 运行中
*/
- Runing,
- /**
+ Runing,
+ /**
* @brief 暂停
*/
- Suspend,
- /**
+ Suspend,
+ /**
* @brief 中止
*/
- Aborted,
- /**
+ Aborted,
+ /**
* @brief 结束
*/
- Finished
+ Finished
};
/**
* @brief 仿真控制命令枚举类
*/
enum class SimControlCmd {
- /**
+ /**
* @brief 开始
*/
- Start = 0,
- /**
+ Start = 0,
+ /**
* @brief 继续
*/
- Continue,
- /**
+ Continue,
+ /**
* @brief 暂停
*/
- Suspend,
- /**
+ Suspend,
+ /**
* @brief 中止
*/
- Abort
+ Abort
};
/**
* @brief 运行频率族枚举类
*/
enum class FreqLevel {
- /**
+ /**
* @brief 基础频率
*/
- BaseFreq = 0, // 120/100/60 Hz
- /**
+ BaseFreq = 0, // 120/100/60 Hz
+ /**
* @brief 半频
*/
- HalfFreq, // 60/50/30 Hz
- /**
+ HalfFreq, // 60/50/30 Hz
+ /**
* @brief 四分之一频
*/
- QuarterFreq, // 30/25/15 Hz
- /**
+ QuarterFreq, // 30/25/15 Hz
+ /**
* @brief 八分之一频
*/
- EighthFreq, // 15/12.5/7.5 Hz
- /**
+ EighthFreq, // 15/12.5/7.5 Hz
+ /**
* @brief 十六分之一频
*/
- SixteenthFreq, // 7.5/6.25/3.75 Hz
- /**
+ SixteenthFreq, // 7.5/6.25/3.75 Hz
+ /**
* @brief 三十二分之一频
*/
- ThirtyTwothFreq, // 3.75/3.125/1.875 Hz
+ ThirtyTwothFreq, // 3.75/3.125/1.875 Hz
};
/**
* @brief 框架对象状态枚举
*/
enum class XNFrameObjectStatus {
- /**
+ /**
* @brief 未初始化
*/
- NotReady = 0,
- /**
+ NotReady = 0,
+ /**
* @brief 已初始化
*/
- Initialized,
- /**
+ Initialized,
+ /**
* @brief 已准备好
*/
- Ready,
- /**
+ Ready,
+ /**
* @brief 未知
*/
- Unknown
+ Unknown
};
enum class XNCoreObjectID {
- /**
+ /**
* @brief 框架对象
*/
- Framework = 0,
- /**
+ Framework = 0,
+ /**
* @brief 模型管理器
*/
- ModelManager,
- /**
+ ModelManager = 1,
+ /**
* @brief 时间管理器
*/
- TimeManager = 2,
- /**
+ TimeManager = 2,
+ /**
* @brief 线程管理器
*/
- ThreadManager = 3,
- /**
+ ThreadManager = 3,
+ /**
* @brief 服务管理器
*/
- ServiceManager = 4,
- /**
+ ServiceManager = 4,
+ /**
* @brief 构型管理器
*/
- ConfigManager = 5,
- /**
+ ConfigManager = 5,
+ /**
* @brief 模型管理器
*/
- ModelManager = 6,
- /**
+ ModelManager = 6,
+ /**
* @brief 事件管理器
*/
- EventManager = 7,
- /**
+ EventManager = 7,
+ /**
* @brief DDS管理器
*/
- DDSManager = 8
+ DDSManager = 8
};
} // namespace XNSim
\ No newline at end of file
diff --git a/XNCore_Win/XNGlobalDefine/XNTypeTraits.h b/XNCore_Win/XNGlobalDefine/XNTypeTraits.h
index 55ec59d..5b65c22 100644
--- a/XNCore_Win/XNGlobalDefine/XNTypeTraits.h
+++ b/XNCore_Win/XNGlobalDefine/XNTypeTraits.h
@@ -4,7 +4,8 @@
#include
#include
-namespace XNSim {
+namespace XNSim
+{
// 类型检查
template
@@ -19,11 +20,15 @@ template
inline constexpr bool is_convertible_v = std::is_convertible_v;
// 数组类型检查
-namespace TypeTraits {
-template struct is_std_array : std::false_type {};
+namespace TypeTraits
+{
+ template
+ struct is_std_array : std::false_type {
+ };
-template
-struct is_std_array> : std::true_type {};
+ template
+ struct is_std_array> : std::true_type {
+ };
} // namespace TypeTraits
// 数组类型检查简化使用
@@ -31,12 +36,15 @@ template
inline constexpr bool is_array_v = TypeTraits::is_std_array::value;
// 获取数组大小
-namespace TypeTraits {
-template
-struct array_size : std::integral_constant {};
+namespace TypeTraits
+{
+ template
+ struct array_size : std::integral_constant {
+ };
-template
-struct array_size> : std::integral_constant {};
+ template
+ struct array_size> : std::integral_constant {
+ };
} // namespace TypeTraits
// 获取数组大小简化使用
@@ -44,28 +52,33 @@ template
inline constexpr std::size_t array_size_v = TypeTraits::array_size::value;
// 获取类型大小
-template constexpr size_t getTypeSize() {
- if constexpr (is_array_v) {
- // 对于std::array,计算所有元素的总大小
- return getTypeSize() * array_size_v;
- } else {
- return sizeof(T);
- }
+template
+constexpr size_t getTypeSize()
+{
+ if constexpr (is_array_v) {
+ // 对于std::array,计算所有元素的总大小
+ return getTypeSize() * array_size_v;
+ } else {
+ return sizeof(T);
+ }
}
// 获取数组总大小
-template constexpr std::size_t arrayTotalSize(const T &arr) {
- if constexpr (is_array_v) {
- // 对于std::array,计算所有元素的总大小
- return getTypeSize() * array_size_v;
- } else {
- return 1;
- }
+template
+constexpr std::size_t arrayTotalSize()
+{
+ if constexpr (is_array_v) {
+ // 对于std::array,计算所有元素的总大小
+ return getTypeSize() * array_size_v;
+ } else {
+ return 1;
+ }
}
// 枚举值获取函数
template
-constexpr typename std::underlying_type::type enumValue(T e) {
- return static_cast::type>(e);
+constexpr typename std::underlying_type::type enumValue(T e)
+{
+ return static_cast::type>(e);
}
} // namespace XNSim
\ No newline at end of file
diff --git a/XNSimPortal/doc/接口配置模块设计文档.md b/XNSimPortal/doc/接口配置模块设计文档.md
new file mode 100644
index 0000000..9d301a7
--- /dev/null
+++ b/XNSimPortal/doc/接口配置模块设计文档.md
@@ -0,0 +1,309 @@
+# 接口配置模块设计文档
+
+## 1. 概述
+
+接口配置模块是 XNSimPortal 系统的核心组件之一,负责管理仿真系统中的数据接口定义。该模块提供了完整的接口生命周期管理功能,包括接口的创建、编辑、删除、查询、导入导出等操作。模块采用前后端分离架构,前端使用 Web Components 技术构建用户界面,后端提供 RESTful API 接口。
+
+### 1.1 模块组成
+
+- **前端组件**:`interface-config.js` - 主组件
+- **子组件**:
+ - `toolbar.js` - 工具栏组件
+ - `data-table.js` - 数据表格组件
+ - `variable-form.js` - 变量表单组件
+ - `import-dialog.js` - 导入对话框组件
+- **后端路由**:
+ - `routes/interface-config.js` - 接口管理 API
+ - `routes/icd-import.js` - ICD 文件导入 API
+- **工具类**:
+ - `utils/data-interface-utils.js` - 数据接口操作工具
+ - `utils/icd-parser.js` - ICD 文件解析工具
+
+### 1.2 技术架构
+
+```
+┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
+│ 前端组件层 │ │ 后端API层 │ │ 数据存储层 │
+│ │ │ │ │ │
+│ interface-config│◄──►│ interface-config│◄──►│ SQLite数据库 │
+│ toolbar │ │ icd-import │ │ DataInterface_* │
+│ data-table │ │ │ │ 表 │
+│ variable-form │ │ │ │ │
+│ import-dialog │ │ │ │ │
+└─────────────────┘ └─────────────────┘ └─────────────────┘
+```
+
+## 2. 功能
+
+### 2.1 核心功能
+
+1. **接口管理**
+
+ - 接口的增删改查操作
+ - 批量删除接口
+ - 接口数据验证
+2. **数据导入**
+
+ - ICD Excel 文件导入
+ - 批量数据导入
+ - 导入数据预览和确认
+3. **数据展示**
+
+ - 分页表格显示
+ - 搜索和过滤
+ - 高级搜索(多条件组合)
+4. **配置管理**
+
+ - 构型关联管理
+ - ATA 章节管理
+ - 机型管理
+
+### 2.2 辅助功能
+
+1. **数据验证**
+
+ - 必填字段验证
+ - 数据类型验证
+ - 唯一性验证
+2. **用户体验**
+
+ - 加载状态提示
+ - 错误信息展示
+ - 操作确认对话框
+
+## 3. 性能
+
+### 3.1 性能指标
+
+- **响应时间**:接口查询 < 500ms,数据导入 < 5s
+- **并发处理**:支持多用户同时操作
+- **数据量支持**:单次导入支持 1000+条记录
+- **内存使用**:前端组件内存占用 < 50MB
+
+### 3.2 性能优化策略
+
+1. **数据库优化**
+
+ - 使用索引优化查询性能
+ - 批量操作减少数据库交互次数
+2. **前端优化**
+
+ - 虚拟滚动处理大量数据
+ - 分页加载减少初始渲染时间
+ - 防抖处理搜索输入
+3. **文件处理优化**
+
+ - 流式处理大文件
+ - 临时文件及时清理
+
+## 4. 输入
+
+### 4.1 用户输入
+
+1. **接口定义数据**
+
+ ```
+ {
+ SystemName: "XNSim",
+ PlaneName: "机型名称",
+ ATAName: "ATA章节",
+ ModelStructName: "模型结构名称",
+ InterfaceName: "接口名称",
+ InterfaceType: "接口类型",
+ InterfaceOption: 1,
+ InterfaceIsArray: true/false,
+ InterfaceArraySize_1: 10,
+ InterfaceArraySize_2: 0,
+ InterfaceNotes: "备注信息",
+ ConfID: "构型ID"
+ }
+ ```
+2. **搜索条件**
+
+ - 关键词搜索
+ - 高级搜索条件(机型、ATA 章节、结构体名称)
+3. **文件输入**
+
+ - ICD Excel 文件(.xlsx 格式)
+ - 文件大小限制:< 10MB
+
+### 4.2 系统输入
+
+1. **构型选择**
+
+ - 从 localStorage 获取当前选择的构型 ID
+ - 构型信息包含 configurationId
+2. **配置数据**
+
+ - ATA 章节列表
+ - 机型列表
+ - 结构体列表
+
+## 5. 输出
+
+### 5.1 数据输出
+
+1. **接口列表**
+
+ ```json
+ [
+ {
+ "SystemName": "XNSim",
+ "PlaneName": "机型名称",
+ "ATAName": "ATA章节",
+ "ModelStructName": "模型结构名称",
+ "InterfaceName": "接口名称",
+ "InterfaceType": "接口类型",
+ "InterfaceOption": 1,
+ "InterfaceIsArray": true,
+ "InterfaceArraySize_1": 10,
+ "InterfaceArraySize_2": 0,
+ "InterfaceNotes": "备注信息"
+ }
+ ]
+ ```
+2. **操作结果**
+
+ ```json
+ {
+ "success": true,
+ "message": "操作成功",
+ "data": {}
+ }
+ ```
+3. **导入结果**
+
+ ```json
+ {
+ "success": true,
+ "results": [
+ { "success": true, "data": {} },
+ { "success": false, "error": "错误信息", "data": {} }
+ ],
+ "message": "导入完成,成功: 10, 失败: 2"
+ }
+ ```
+
+### 5.2 界面输出
+
+1. **数据表格**:分页显示接口列表
+2. **表单界面**:接口编辑表单
+3. **导入对话框**:导入数据预览和确认
+4. **状态提示**:操作成功/失败提示
+
+## 6. 算法
+
+### 6.1 ICD 文件解析算法
+
+```
+1. 读取Excel文件
+2. 验证工作表结构(Inputs/Outputs)
+3. 解析每个工作表:
+ - 提取变量名称
+ - 解析数组维度
+ - 处理变量类型映射
+ - 生成标准格式数据
+4. 合并Inputs和Outputs数据
+5. 返回解析结果
+```
+
+### 6.2 数组维度解析算法
+
+```
+输入:维度字符串(如"[10]"、"[3][2]"、"10")
+输出:{isArray: boolean, arraySize1: number, arraySize2: number}
+
+1. 检查空值或1的情况 → 返回非数组
+2. 匹配方括号格式 [数字][数字] → 提取维度
+3. 匹配纯数字格式 → 提取一维数组大小
+4. 其他情况 → 返回非数组
+```
+
+### 6.3 搜索过滤算法
+
+```
+1. 关键词搜索:
+ - 在接口名称、备注等字段中模糊匹配
+ - 支持大小写不敏感搜索
+
+2. 高级搜索:
+ - 多条件AND组合
+ - 支持机型、ATA章节、结构体名称精确匹配
+ - 支持接口类型、数组类型条件过滤
+```
+
+## 7. 流程
+
+### 7.1 接口管理主流程
+
+```mermaid
+graph TD
+ A[用户进入接口配置页面] --> B[检查构型选择]
+ B --> C{是否已选择构型?}
+ C -->|否| D[提示选择构型]
+ C -->|是| E[加载接口数据]
+ E --> F[显示数据表格]
+ F --> G[用户操作]
+ G --> H{操作类型}
+ H -->|添加| I[打开添加表单]
+ H -->|编辑| J[打开编辑表单]
+ H -->|删除| K[确认删除]
+ H -->|导入| L[选择文件导入]
+ I --> M[保存接口]
+ J --> M
+ K --> N[删除接口]
+ L --> O[解析文件]
+ M --> P[刷新数据]
+ N --> P
+ O --> Q[预览导入数据]
+ Q --> R[确认导入]
+ R --> P
+ P --> F
+```
+
+### 7.2 数据导入流程
+
+```mermaid
+graph TD
+ A[用户选择ICD文件] --> B[上传文件到服务器]
+ B --> C[解析Excel文件]
+ C --> D[验证数据格式]
+ D --> E{数据是否有效?}
+ E -->|否| F[返回错误信息]
+ E -->|是| G[生成预览数据]
+ G --> H[显示导入对话框]
+ H --> I[用户确认导入]
+ I --> J[批量保存到数据库]
+ J --> K[返回导入结果]
+ K --> L[刷新界面数据]
+```
+
+### 7.3 搜索过滤流程
+
+```mermaid
+graph TD
+ A[用户输入搜索条件] --> B{搜索类型}
+ B -->|关键词搜索| C[模糊匹配过滤]
+ B -->|高级搜索| D[多条件组合过滤]
+ C --> E[更新表格显示]
+ D --> E
+ E --> F[显示过滤结果]
+ F --> G[更新分页信息]
+```
+
+## 8. 接口
+
+所有接口均以/api 为前缀,数据格式为 JSON,采用 HTTP/HTTPS 协议。具体接口有:
+
+1. GET /api/planes1)功能:获取机型列表;2)输入:无参数;3)输出:JSON 对象{ success: boolean, message: string, data:array};4)说明:返回所有可用机型信息,包含机型图标、名称和描述。
+2. GET /api/interface/list1)功能:获取接口列表;2)输入:confID(构型 ID,查询参数);3)输出:JSON 对象{ success: boolean, message: string, data: array };4)说明:返回指定构型下的所有接口数据。
+3. POST /api/interface/add1)功能:添加接口;2)输入:JSON 对象,包含接口定义的所有字段;3)输出:JSON 对象{ success: boolean, message: string, id: number };4)说明:添加新的接口记录,接口名称需唯一。
+4. PUT /api/interface/update1)功能:更新接口;2)输入:JSON 对象,包含 currentData 和 originalData;3)输出:JSON 对象{ success: boolean, message: string };4)说明:根据原始数据定位并更新接口信息。
+5. DELETE /api/interface/delete1)功能:删除接口;2)输入:interfaceName(接口名称,查询参数),confID(构型 ID,查询参数);3)输出:JSON 对象{ success: boolean, message: string };4)说明:删除指定接口。
+6. POST /api/interface/import1)功能:批量导入接口;2)输入:JSON 数组,每项为接口定义对象;3)输出:JSON 对象{ success: boolean, message: string, results: array };4)说明:批量导入接口,返回每条数据的处理结果。
+7. GET /api/interface/struct/list1)功能:获取接口结构体列表;2)输入:systemName、planeName、ataName、confID(查询参数);3)输出:JSON 对象{ success: boolean, message: string, data: array };4)说明:返回符合条件的结构体名称列表。
+8. POST /api/icd/import
+ 1)功能:导入 ICD 文件并解析;
+ 2)输入:form-data 格式,file 为 Excel 文件;
+ 3)输出:JSON 对象{ success: boolean, message: string, data: array };
+ 4)说明:解析 ICD Excel 文件,返回变量信息预览。