修改了特征图表的显示和巡飞弹数据载入文件

This commit is contained in:
tianjianyong 2024-12-01 20:42:33 +08:00
parent 092398c6df
commit 04e43760ae
7 changed files with 1350 additions and 1267 deletions

View File

@ -1,4 +1,3 @@
# 代码修改最佳实践
1. 修改前的准备
@ -56,3 +55,33 @@
- 处理异常情况
- 保护敏感信息
- 添加访问控制
9. 中文处理规则
- 不修改任何包含中文的注释行
- 使用 `// ... existing code ...` 跳过包含中文的代码块
- 如需修改中文附近的代码,应完整保留原有中文内容
示例:
```
// ... existing code ...
// 这是中文注释,保持不变
newCode = value;
// ... existing code ...
```
10. 编码规则
- 所有文件统一使用 UTF-8 编码
- 不使用 BOM 头
- 换行符统一使用 LF (\n)
- 文件末尾保留一个换行符
- 代码注释中的中文必须使用 UTF-8 编码
配置示例:
```json
{
"charset": "utf-8",
"end_of_line": "lf",
"insert_final_newline": true
}

View File

@ -26,10 +26,10 @@
- Windows 操作系统 (推荐 Windows 10+)
- Python 3.12 及相关组件
参考https://www.python.org/downloads/
参考:<https://www.python.org/downloads/>
- Node.js 14+ 及 npm
参考https://learn.microsoft.com/en-us/windows/dev-environment/javascript/nodejs-on-windows
参考:<https://learn.microsoft.com/en-us/windows/dev-environment/javascript/nodejs-on-windows>
```bash
# 设置执行策略
@ -45,7 +45,7 @@ set-executionpolicy remotesigned
sudo apt install libmysqlclient-dev
```
Windows 参考https://dev.mysql.com/downloads/installer/
Windows 参考:<https://dev.mysql.com/downloads/installer/>
### 3. Python包依赖
@ -88,18 +88,19 @@ pip install -r requirements.txt --trusted-host pypi.tuna.tsinghua.edu.cn
```
### 4. 科学计算相关
sudo apt install libatlas-base-dev # numpy依赖
sudo apt install libopenblas-dev # 线性代数库
sudo apt install liblapack-dev # 线性代数包
sudo apt install gfortran # Fortran编译器(scipy依赖)
# XML处理相关(用于Excel文件处理)
## XML处理相关(用于Excel文件处理)
```bash
sudo apt install libxml2-dev
sudo apt install libxslt1-dev
```
## 二、部署运行
### 1. 安装服务

View File

@ -22,7 +22,8 @@ cd cost-prediction
cd frontend
# 安装依赖
npm install
npm install 22
nvm use 22
# 构建生产版本
npm run build
@ -48,13 +49,9 @@ pip install -e .
```powershell
# 确保 MySQL 服务已启动
net start MySQL80
# 初始化数据库和导入数据
.\scripts\init_db.ps1
# 运行数据库配置脚本
.\scripts\setup_env.ps1
```
6. 运行测试

File diff suppressed because it is too large Load Diff

View File

@ -406,13 +406,12 @@ const renderCharts = () => {
const importanceOption = {
title: { text: '特征重要性排序' },
tooltip: {
trigger: 'axis',
trigger: 'item',
axisPointer: {
type: 'shadow'
},
formatter: function(params) {
const data = params[0]
return `${data.name}: ${data.value.toFixed(4)}`
return `${params.name}: ${params.value.toFixed(1)}`
}
},
xAxis: {

View File

@ -795,38 +795,6 @@ onMounted(() => {
loadData()
})
//
const isNumberInput = (key) => {
const numberFields = [
'length_m',
'width_m',
'height_m',
'weight_kg',
'max_range_km',
'firing_angle_horizontal',
'firing_angle_vertical',
'rocket_length_m',
'rocket_diameter_mm',
'rocket_weight_kg',
'rate_of_fire',
'combat_weight_kg',
'speed_kmh',
'min_range_km',
'power_hp',
'travel_range_km',
'max_speed_ms',
'cruise_speed_kmh',
'flight_time_min',
'folded_length_mm',
'folded_width_mm',
'folded_height_mm',
'actual_cost',
'predicted_cost'
]
return numberFields.includes(key)
}
//
const getSelectOptions = (field) => {
switch (field) {

View File

@ -285,7 +285,7 @@ INSERT INTO loitering_munition_params (
(24, 2.8, 8.0, 70, 180, 240, 50, 10.0, 4000, 25, '破片杀伤/破甲双用战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助'),
(25, 3.0, 9.0, 75, 190, 270, 60, 11.0, 4500, 30, '破片杀伤/破甲双用战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助'),
(26, 3.2, 10.0, 80, 200, 300, 70, 12.0, 5000, 35, '模块化战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/红外'),
(27, 3.5, 15.0, 85, 220, 360, 100, 18.0, 6000, 50, '模块化战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/红<EFBFBD><EFBFBD><EFBFBD>'),
(27, 3.5, 15.0, 85, 220, 360, 100, 18.0, 6000, 50, '模块化战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/红外/卫通'),
(28, 3.6, 16.0, 90, 230, 400, 120, 20.0, 6500, 60, '模块化战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/红外/卫通'),
(29, 1.2, 1.0, 40, 90, 30, 5, 1.5, 1500, 3, '破片杀伤战斗部', '垂直起降', '电动机', 'GPS/INS/光电/AI辅助'),
(30, 1.3, 1.2, 45, 100, 40, 8, 2.0, 2000, 4, '破片杀伤战斗部', '垂直起降', '电动机', 'GPS/INS/光电/AI辅助'),
@ -338,7 +338,7 @@ INSERT INTO loitering_munition_params (
(77, 2.8, 40.0, 250, 200, 120, 180, 50.0, 5500, 90, '破甲战斗部', '空中发射', '涡轮喷气', 'GPS/INS/光电/数据链/AI辅助'), -- SmartGlider Light
(78, 3.2, 80.0, 230, 180, 150, 200, 100.0, 6000, 100, '破甲战斗部', '空中发射', '涡轮喷气', 'GPS/INS/光电/数据链/AI辅助'), -- SmartGlider Heavy
(79, 1.5, 3.5, 160, 140, 60, 50, 5.0, 3500, 25, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助'), -- Taifun
(80, 1.8, 4.5, 180, 150, 80, 70, 6.0, 4000, 35, '破片杀伤战斗部', '箱式发射', '<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', 'GPS/INS/光电/AI辅助/红外'), -- Taifun-K
(80, 1.8, 4.5, 180, 150, 80, 70, 6.0, 4000, 35, '破片杀伤战斗部', '箱式发射', '动机', 'GPS/INS/光电/AI辅助/红外'), -- Taifun-K
(81, 1.5, 3.0, 120, 100, 60, 40, 4.0, 3000, 20, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'), -- HERO-ES
(82, 2.0, 5.0, 140, 120, 90, 60, 6.0, 4000, 30, '破片杀伤/破甲双用战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'), -- HERO-ER
(83, 2.5, 8.0, 160, 140, 120, 80, 10.0, 5000, 40, '破片杀伤/破甲双用战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/红外'), -- HERO-XL
@ -574,8 +574,8 @@ SET description = '包含20个巡飞弹型号覆盖所有主要制造国
WHERE id = 2;
-- 更新巡飞弹特征工程字段
UPDATE loitering_munition_params l
JOIN common_params c ON l.equipment_id = c.equipment_id
-- 第一步更新基于common_params的特征
UPDATE loitering_munition_params l, common_params c, equipments e
SET
-- 长宽比(反映气动布局特点)
l.length_width_ratio = c.length_m / NULLIF(c.width_m, 0),
@ -586,61 +586,6 @@ SET
-- 速度重量比反映动力性能m/s/kg
l.speed_weight_ratio = l.max_speed_ms / NULLIF(c.weight_kg, 0),
-- 制导系统评分(1-10)
l.guidance_system_score =
CASE
WHEN l.guidance_system LIKE '%卫通%' THEN 10
WHEN l.guidance_system LIKE '%AI辅助%' AND l.guidance_system LIKE '%红外%' THEN 9
WHEN l.guidance_system LIKE '%AI辅助%' THEN 8
WHEN l.guidance_system LIKE '%数据链%' AND l.guidance_system LIKE '%光电%' THEN 7
WHEN l.guidance_system LIKE '%数据链%' THEN 6
WHEN l.guidance_system LIKE '%光电%' THEN 5
WHEN l.guidance_system LIKE '%GPS/INS%' THEN 4
ELSE 3
END,
-- 战斗部威力评分(1-10)
l.warhead_power_score =
CASE
-- 大型战斗部(>30kg
WHEN l.warhead_weight_kg > 30 AND l.warhead_type LIKE '%模块化%' THEN 10
WHEN l.warhead_weight_kg > 30 AND l.warhead_type LIKE '%破甲%' THEN 9
WHEN l.warhead_weight_kg > 30 AND l.warhead_type LIKE '%破片%' THEN 8
-- 中型战斗部10-30kg
WHEN l.warhead_weight_kg > 10 AND l.warhead_type LIKE '%模块化%' THEN 8
WHEN l.warhead_weight_kg > 10 AND l.warhead_type LIKE '%破甲%' THEN 7
WHEN l.warhead_weight_kg > 10 AND l.warhead_type LIKE '%破片%' THEN 6
-- 小型战斗部3-10kg
WHEN l.warhead_weight_kg > 3 AND l.warhead_type LIKE '%模块化%' THEN 6
WHEN l.warhead_weight_kg > 3 AND l.warhead_type LIKE '%破甲%' THEN 5
WHEN l.warhead_weight_kg > 3 AND l.warhead_type LIKE '%破片%' THEN 4
-- 微型战斗部(<3kg
WHEN l.warhead_type LIKE '%破甲%' THEN 3
WHEN l.warhead_type LIKE '%破片%' THEN 2
ELSE 1
END,
-- 发动机功率kW根据重量估算
l.engine_power_kw =
CASE
WHEN l.power_system = '电动机' THEN c.weight_kg * 0.15
WHEN l.power_system = '活塞发动机' THEN c.weight_kg * 0.25
WHEN l.power_system = '涡轮喷气' THEN c.weight_kg * 0.35
ELSE c.weight_kg * 0.2
END,
-- 发动机推力N根据重量估算
l.engine_thrust_n =
CASE
WHEN l.power_system = '电动机' THEN c.weight_kg * 9.8 * 0.3
WHEN l.power_system = '活塞发动机' THEN c.weight_kg * 9.8 * 0.4
WHEN l.power_system = '涡轮喷气' THEN c.weight_kg * 9.8 * 0.5
ELSE c.weight_kg * 9.8 * 0.35
END,
-- 最小作战高度m根据体型和任务类型估算
l.min_altitude_m =
CASE
@ -660,18 +605,102 @@ SET
ELSE 30
END,
-- 最大作战高度m根据航程估算)
l.max_altitude_m =
-- 发动机功率kW根据重量估算)
l.engine_power_kw =
CASE
WHEN l.max_range_km > 500 THEN 5000
WHEN l.max_range_km > 100 THEN 3000
WHEN power_system = '电动机' THEN c.weight_kg * 0.15
WHEN power_system = '活塞发动机' THEN c.weight_kg * 0.25
WHEN power_system = '涡轮喷气' THEN c.weight_kg * 0.35
ELSE c.weight_kg * 0.2
END,
-- 发动机推力N根据重量估算
l.engine_thrust_n =
CASE
WHEN power_system = '电动机' THEN c.weight_kg * 9.8 * 0.3
WHEN power_system = '活塞发动机' THEN c.weight_kg * 9.8 * 0.4
WHEN power_system = '涡轮喷气' THEN c.weight_kg * 9.8 * 0.5
ELSE c.weight_kg * 9.8 * 0.35
END
WHERE
l.equipment_id = c.equipment_id
AND l.equipment_id = e.id
AND e.type = '巡飞弹';
-- 第二步:更新基于自身参数的特征
UPDATE loitering_munition_params
SET
-- 制导系统评分(1-10)
guidance_system_score =
CASE
WHEN guidance_system LIKE '%卫通%' THEN 10
WHEN guidance_system LIKE '%AI辅助%' AND guidance_system LIKE '%红外%' THEN 9
WHEN guidance_system LIKE '%AI辅助%' THEN 8
WHEN guidance_system LIKE '%数据链%' AND guidance_system LIKE '%光电%' THEN 7
WHEN guidance_system LIKE '%数据链%' THEN 6
WHEN guidance_system LIKE '%光电%' THEN 5
WHEN guidance_system LIKE '%GPS/INS%' THEN 4
ELSE 3
END,
-- 战斗部威力评分(1-10)
warhead_power_score =
CASE
-- 大型战斗部(>30kg
WHEN warhead_weight_kg > 30 AND warhead_type LIKE '%模块化%' THEN 10
WHEN warhead_weight_kg > 30 AND warhead_type LIKE '%破甲%' THEN 9
WHEN warhead_weight_kg > 30 AND warhead_type LIKE '%破片%' THEN 8
-- 中型战斗部10-30kg
WHEN warhead_weight_kg > 10 AND warhead_type LIKE '%模块化%' THEN 8
WHEN warhead_weight_kg > 10 AND warhead_type LIKE '%破甲%' THEN 7
WHEN warhead_weight_kg > 10 AND warhead_type LIKE '%破片%' THEN 6
-- 小型战斗部3-10kg
WHEN warhead_weight_kg > 3 AND warhead_type LIKE '%模块化%' THEN 6
WHEN warhead_weight_kg > 3 AND warhead_type LIKE '%破甲%' THEN 5
WHEN warhead_weight_kg > 3 AND warhead_type LIKE '%破片%' THEN 4
-- 微型战斗部(<3kg
WHEN warhead_type LIKE '%破甲%' THEN 3
WHEN warhead_type LIKE '%破片%' THEN 2
ELSE 1
END,
-- 数据链范围km
datalink_range_km =
CASE
-- 大型巡飞弹(通常具有卫星通信能力)
WHEN guidance_system LIKE '%卫通%' THEN max_range_km
-- 中大型巡飞弹(具有较强数据链能力)
WHEN guidance_system LIKE '%数据链%' AND max_range_km > 100 THEN LEAST(max_range_km, 200)
-- 中型巡飞弹
WHEN guidance_system LIKE '%数据链%' AND max_range_km > 50 THEN LEAST(max_range_km, 100)
-- 小型巡飞弹
WHEN guidance_system LIKE '%数据链%' THEN LEAST(max_range_km, 50)
-- 无数据链的情况(使用光电或其他制导方式)
ELSE LEAST(max_range_km * 0.5, 30)
END,
-- 最大作战高度m根据航程估算
max_altitude_m =
CASE
WHEN max_range_km > 500 THEN 5000
WHEN max_range_km > 100 THEN 3000
ELSE 1500
END;
END
WHERE equipment_id IN (
SELECT id FROM equipments WHERE type = '巡飞弹'
);
-- 更新巡飞弹的制导精度
UPDATE loitering_munition_params l
UPDATE loitering_munition_params
SET guidance_accuracy_m =
CASE
-- 基础精度(根据制导系统类型)