index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790
  1. <template>
  2. <div class="app-container">
  3. <el-form
  4. v-show="showSearch"
  5. ref="queryForm"
  6. :model="queryParams"
  7. size="small"
  8. :inline="true"
  9. label-width="100px"
  10. >
  11. <el-form-item label="数据类型" prop="dataType">
  12. <el-radio-group v-model="queryParams.dataType" @change="changeDataType">
  13. <el-radio
  14. v-for="item in dict.type.biz_data_type"
  15. :key="item.value"
  16. :label="item.value"
  17. >
  18. {{ item.label }}
  19. </el-radio>
  20. </el-radio-group>
  21. </el-form-item>
  22. <el-form-item label="类型" prop="sampleType">
  23. <!-- <el-input
  24. v-model="queryParams.sampleType"
  25. placeholder="请输入类型"
  26. clearable
  27. @keyup.enter.native="handleQuery"
  28. /> -->
  29. <el-select
  30. v-model="queryParams.sampleType"
  31. placeholder="请选择"
  32. clearable
  33. @keyup.enter.native="handleQuery"
  34. @change="changeSampleType"
  35. >
  36. <el-option
  37. v-for="item in options.sampleTypeOption"
  38. :key="item.value"
  39. :label="item.name"
  40. :value="item.value"
  41. />
  42. </el-select>
  43. </el-form-item>
  44. <el-form-item label="型号" prop="sampleModel">
  45. <!-- <el-input
  46. v-model="queryParams.sampleModel"
  47. placeholder="请输入型号"
  48. clearable
  49. @keyup.enter.native="handleQuery"
  50. /> -->
  51. <el-select
  52. v-model="queryParams.sampleModel"
  53. placeholder="请选择"
  54. clearable
  55. @keyup.enter.native="handleQuery"
  56. @change="changeSampleModel"
  57. >
  58. <el-option
  59. v-for="item in options.sampleModelOption"
  60. :key="item.value"
  61. :label="item.name"
  62. :value="item.value"
  63. />
  64. </el-select>
  65. </el-form-item>
  66. <el-form-item label="表面温度" prop="temperatureK">
  67. <!-- <el-input
  68. v-model="queryParams.temperatureK"
  69. placeholder="请输入表面温度"
  70. clearable
  71. @keyup.enter.native="handleQuery"
  72. /> -->
  73. <el-select
  74. v-model="queryParams.temperatureK"
  75. placeholder="请选择"
  76. clearable
  77. @keyup.enter.native="handleQuery"
  78. >
  79. <el-option
  80. v-for="item in options.temperatureKOption"
  81. :key="item.value"
  82. :label="item.name"
  83. :value="item.value"
  84. />
  85. </el-select>
  86. </el-form-item>
  87. <el-form-item label="光谱波段" prop="wavelengthUm">
  88. <!-- <el-input
  89. v-model="queryParams.wavelengthUm"
  90. placeholder="请输入光谱波段"
  91. clearable
  92. @keyup.enter.native="handleQuery"
  93. /> -->
  94. <el-select
  95. v-model="queryParams.wavelengthUm"
  96. placeholder="请选择"
  97. clearable
  98. @keyup.enter.native="handleQuery"
  99. >
  100. <el-option
  101. v-for="item in dict.type.biz_wavelength_um"
  102. :key="item.value"
  103. :label="item.label"
  104. :value="item.value"
  105. />
  106. </el-select>
  107. </el-form-item>
  108. <el-form-item label="入射天顶角θi" prop="thetaIncident">
  109. <!-- <el-input
  110. v-model="queryParams.thetaIncident"
  111. placeholder="请输入射天顶角θi"
  112. clearable
  113. :disabled="queryParams.dataType == 1"
  114. @keyup.enter.native="handleQuery"
  115. /> -->
  116. <el-select
  117. v-model="queryParams.thetaIncident"
  118. placeholder="请选择"
  119. clearable
  120. :disabled="queryParams.dataType == 1"
  121. @keyup.enter.native="handleQuery"
  122. >
  123. <el-option
  124. v-for="item in options.allAngleOption.thetaIncidentOptions"
  125. :key="item.value"
  126. :label="item.name"
  127. :value="item.value"
  128. />
  129. </el-select>
  130. </el-form-item>
  131. <el-form-item label="入射方位角φi" prop="phiIncident">
  132. <!-- <el-input
  133. v-model="queryParams.phiIncident"
  134. placeholder="请输入入射方位角φi"
  135. clearable
  136. :disabled="queryParams.dataType == 1"
  137. @keyup.enter.native="handleQuery"
  138. /> -->
  139. <el-select
  140. v-model="queryParams.phiIncident"
  141. placeholder="请选择"
  142. clearable
  143. :disabled="queryParams.dataType == 1"
  144. @keyup.enter.native="handleQuery"
  145. >
  146. <el-option
  147. v-for="item in options.allAngleOption.phiIncidentOptions"
  148. :key="item.value"
  149. :label="item.name"
  150. :value="item.value"
  151. />
  152. </el-select>
  153. </el-form-item>
  154. <el-form-item label="反射天顶角θr" prop="thetaReflected">
  155. <!-- <el-input
  156. v-model="queryParams.thetaReflected"
  157. placeholder="请输入反射天顶角θr"
  158. clearable
  159. :disabled="queryParams.dataType == 1"
  160. @keyup.enter.native="handleQuery"
  161. /> -->
  162. <el-select
  163. v-model="queryParams.thetaReflected"
  164. placeholder="请选择"
  165. clearable
  166. :disabled="queryParams.dataType == 1"
  167. @keyup.enter.native="handleQuery"
  168. >
  169. <el-option
  170. v-for="item in options.allAngleOption.thetaReflectedOptions"
  171. :key="item.value"
  172. :label="item.name"
  173. :value="item.value"
  174. />
  175. </el-select>
  176. </el-form-item>
  177. <el-form-item label="反射方位角φr" prop="phiReflected">
  178. <!-- <el-input
  179. v-model="queryParams.phiReflected"
  180. placeholder="请输入反射方位角φr"
  181. clearable
  182. :disabled="queryParams.dataType == 1"
  183. @keyup.enter.native="handleQuery"
  184. /> -->
  185. <el-select
  186. v-model="queryParams.phiReflected"
  187. placeholder="请选择"
  188. clearable
  189. :disabled="queryParams.dataType == 1"
  190. @keyup.enter.native="handleQuery"
  191. >
  192. <el-option
  193. v-for="item in options.allAngleOption.phiReflectedOptions"
  194. :key="item.value"
  195. :label="item.name"
  196. :value="item.value"
  197. />
  198. </el-select>
  199. </el-form-item>
  200. <el-form-item>
  201. <el-button
  202. type="primary"
  203. icon="el-icon-search"
  204. size="mini"
  205. @click="handleQuery"
  206. >搜索</el-button
  207. >
  208. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
  209. >重置</el-button
  210. >
  211. </el-form-item>
  212. </el-form>
  213. <!-- 查询结果区域 -->
  214. <template v-loading="loading">
  215. <div
  216. v-if="showResult && queryParams.dataType == 1"
  217. class="result-section"
  218. >
  219. <!-- 上半部分 -->
  220. <div class="result-top">
  221. <!-- 左上区块 -->
  222. <el-card class="result-block block-1">
  223. <div slot="header" class="clearfix">
  224. <span>样片实物图</span>
  225. </div>
  226. <div class="image-container">
  227. <el-image
  228. :src="sampleImage"
  229. fit="contain"
  230. :preview-src-list="[sampleImage]"
  231. style="width: 100%; height: 100%"
  232. />
  233. </div>
  234. </el-card>
  235. <!-- 右上区块 -->
  236. <el-card class="result-block block-2">
  237. <div slot="header" class="clearfix">
  238. <span>EMI修正折线图</span>
  239. </div>
  240. <div ref="chart" />
  241. </el-card>
  242. </div>
  243. <!-- 下半部分 -->
  244. <div class="result-bottom">
  245. <!-- 左下区块 -->
  246. <el-card class="result-block block-3">
  247. <div slot="header" class="clearfix">
  248. <span>测量数据表</span>
  249. </div>
  250. <div class="table-container">
  251. <el-table
  252. :data="emiMeasurementList"
  253. style="width: 100%"
  254. height="100%"
  255. lazy
  256. >
  257. <el-table-column prop="sampleModel" label="样片型号" />
  258. <el-table-column prop="temperatureK" label="温度(K)" />
  259. <el-table-column prop="wavelengthUm" label="波段(μm)" />
  260. <el-table-column prop="emiCorrection1" label="EMI-修正1" />
  261. <el-table-column prop="emiCorrection2" label="EMI-修正2" />
  262. <el-table-column prop="emiCorrection3" label="EMI-修正3" />
  263. <el-table-column prop="emiCorrection4" label="EMI-修正4" />
  264. <el-table-column prop="emiCorrection5" label="EMI-修正5" />
  265. <el-table-column prop="meanValue" label="均值" />
  266. </el-table>
  267. </div>
  268. </el-card>
  269. <!-- 右下区块 -->
  270. <el-card class="result-block block-4">
  271. <div slot="header" class="clearfix">
  272. <span>积分数据表</span>
  273. </div>
  274. <div class="table-container">
  275. <el-table
  276. :data="integratedDataList"
  277. style="width: 100%"
  278. height="100%"
  279. lazy
  280. >
  281. <el-table-column prop="sampleModel" label="样片型号" />
  282. <el-table-column prop="temperatureK" label="温度(K)" />
  283. <el-table-column prop="wavelengthUm" label="波段(μm)" />
  284. <el-table-column prop="integralValue1" label="积分值1" />
  285. <el-table-column prop="integralValue2" label="积分值2" />
  286. <el-table-column prop="integralValue3" label="积分值3" />
  287. <el-table-column prop="integralValue4" label="积分值4" />
  288. <el-table-column prop="integralValue5" label="积分值5" />
  289. <el-table-column prop="standardDev" label="STDEV" />
  290. </el-table>
  291. </div>
  292. </el-card>
  293. </div>
  294. </div>
  295. <div
  296. v-if="showResult && queryParams.dataType == 2"
  297. class="result-section"
  298. >
  299. <!-- 上半部分 -->
  300. <div class="result-top">
  301. <!-- 左上区块 -->
  302. <el-card class="result-block block-1">
  303. <div slot="header" class="clearfix">
  304. <span>样片实物图</span>
  305. </div>
  306. <div class="image-container">
  307. <el-image
  308. :src="sampleImage"
  309. fit="contain"
  310. :preview-src-list="[sampleImage]"
  311. style="width: 100%; height: 100%"
  312. />
  313. </div>
  314. </el-card>
  315. <!-- 右上区块 -->
  316. <el-card class="result-block block-2">
  317. <div slot="header" class="clearfix">
  318. <span>BRDF角度分布</span>
  319. </div>
  320. <div class="image-container">
  321. <el-image
  322. :src="brdfImagePath"
  323. fit="contain"
  324. :preview-src-list="[brdfImagePath]"
  325. style="width: 100%; height: 100%"
  326. />
  327. </div>
  328. </el-card>
  329. </div>
  330. <!-- 下半部分 -->
  331. <div class="result-bottom">
  332. <el-card class="result-block block-22">
  333. <div slot="header" class="clearfix">
  334. <span>测量数据表</span>
  335. </div>
  336. <div class="table-container">
  337. <el-table
  338. :data="brdfDataList"
  339. style="width: 100%"
  340. height="100%"
  341. lazy
  342. >
  343. <el-table-column prop="sampleModel" label="样片型号" />
  344. <el-table-column prop="temperatureK" label="温度(K)" />
  345. <el-table-column prop="wavelengthUm" label="光谱(μm)" />
  346. <el-table-column prop="thetaIncident" label="入射天顶角θi" />
  347. <el-table-column prop="phiIncident" label="入射方位角φi" />
  348. <el-table-column prop="thetaReflected" label="反射天顶角θr" />
  349. <el-table-column prop="phiReflected" label="反射方位角φr" />
  350. <el-table-column prop="measurement1" label="重复测量1" />
  351. <el-table-column prop="measurement2" label="重复测量2" />
  352. <el-table-column prop="measurement3" label="重复测量3" />
  353. <el-table-column prop="measurement4" label="重复测量4" />
  354. <el-table-column prop="measurement5" label="重复测量5" />
  355. <el-table-column prop="meanValue" label="均值" />
  356. <el-table-column prop="repeatabilityPct" label="重复性%" />
  357. </el-table>
  358. </div>
  359. </el-card>
  360. </div>
  361. </div>
  362. </template>
  363. </div>
  364. </template>
  365. <script>
  366. import * as echarts from "echarts";
  367. import {
  368. getIndexInfo,
  369. getSampleType,
  370. getSampleModel,
  371. getOthersOptions,
  372. } from "@/api/manage/index";
  373. export default {
  374. name: "Index",
  375. dicts: ["biz_data_type", "biz_wavelength_um"],
  376. data() {
  377. return {
  378. // 遮罩层
  379. loading: false,
  380. // 显示搜索条件
  381. showSearch: true,
  382. // 版本号
  383. queryParams: {
  384. dataType: "1",
  385. sampleType: null,
  386. sampleModel: null,
  387. temperatureK: null,
  388. wavelengthUm: null,
  389. thetaIncident: null,
  390. phiIncident: null,
  391. thetaReflected: null,
  392. phiReflected: null,
  393. },
  394. options: {
  395. sampleTypeOption: [],
  396. sampleModelOption: [],
  397. temperatureKOption: [],
  398. allAngleOption: {
  399. thetaIncidentOptions: [],
  400. phiIncidentOptions: [],
  401. thetaReflectedOptions: [],
  402. phiReflectedList: [],
  403. },
  404. },
  405. showResult: false,
  406. sampleImage: null,
  407. brdfImagePath: null,
  408. chart: null,
  409. emiMeasurementList: [],
  410. integratedDataList: [],
  411. brdfDataList: [],
  412. };
  413. },
  414. created() {},
  415. mounted() {
  416. this.changeDataType("1");
  417. },
  418. methods: {
  419. // 查询按钮
  420. handleQuery() {
  421. if (!this.queryParams.sampleType || !this.queryParams.sampleModel) {
  422. this.$message({
  423. message: "请选择类型和型号",
  424. type: "warning",
  425. });
  426. } else {
  427. this.loading = true;
  428. this.getList();
  429. }
  430. },
  431. /** 重置按钮操作 */
  432. resetQuery() {
  433. const dataType = this.queryParams.dataType;
  434. // this.resetForm("queryForm");
  435. this.showResult = false;
  436. this.changeDataType(dataType);
  437. },
  438. getList() {
  439. const loading = this.$loading({
  440. lock: true,
  441. text: "Loading",
  442. spinner: "el-icon-loading",
  443. background: "rgba(0, 0, 0, 0.7)",
  444. });
  445. getIndexInfo(this.queryParams).then((response) => {
  446. const data = response.data;
  447. this.sample = data.sample;
  448. if (data.sample == null) {
  449. this.$message({
  450. message: "没有查到相关数据",
  451. type: "warning",
  452. });
  453. this.sampleImage = require("@/assets/404_images/404.png");
  454. } else {
  455. this.sampleImage =
  456. process.env.VUE_APP_BASE_API + data.sample.sampleImage;
  457. }
  458. this.brdfImagePath = process.env.VUE_APP_BASE_API + data.brdfImagePath;
  459. this.brdfDataList = data.brdfDataList;
  460. this.emiMeasurementList = data.emiMeasurementList;
  461. this.integratedDataList = data.integratedDataList;
  462. this.showResult = true;
  463. this.$nextTick(() => {
  464. this.initChart();
  465. });
  466. loading.close();
  467. this.loading = false;
  468. });
  469. },
  470. changeDataType(val) {
  471. this.showResult = false;
  472. this.queryParams = {
  473. dataType: val,
  474. sampleType: null,
  475. sampleModel: null,
  476. temperatureK: null,
  477. wavelengthUm: null,
  478. thetaIncident: null,
  479. phiIncident: null,
  480. thetaReflected: null,
  481. phiReflected: null,
  482. };
  483. getSampleType(this.queryParams).then((resp) => {
  484. this.options = {
  485. sampleTypeOption: resp.data,
  486. sampleModelOption: [],
  487. temperatureKOption: [],
  488. allAngleOption: {
  489. thetaIncidentOptions: [],
  490. phiIncidentOptions: [],
  491. thetaReflectedOptions: [],
  492. phiReflectedList: [],
  493. },
  494. };
  495. });
  496. },
  497. changeSampleType(val) {
  498. this.showResult = false;
  499. const dataType = this.queryParams.dataType;
  500. this.queryParams = {
  501. dataType,
  502. sampleType: val,
  503. sampleModel: null,
  504. temperatureK: null,
  505. wavelengthUm: null,
  506. thetaIncident: null,
  507. phiIncident: null,
  508. thetaReflected: null,
  509. phiReflected: null,
  510. };
  511. getSampleModel(this.queryParams).then((resp) => {
  512. this.options.sampleModelOption = resp.data;
  513. this.options.allAngleOption = {
  514. thetaIncidentOptions: [],
  515. phiIncidentOptions: [],
  516. thetaReflectedOptions: [],
  517. phiReflectedList: [],
  518. };
  519. });
  520. },
  521. changeSampleModel(val) {
  522. this.showResult = false;
  523. const dataType = this.queryParams.dataType;
  524. const sampleType = this.queryParams.sampleType;
  525. this.queryParams = {
  526. dataType,
  527. sampleType,
  528. sampleModel: val,
  529. temperatureK: null,
  530. wavelengthUm: null,
  531. thetaIncident: null,
  532. phiIncident: null,
  533. thetaReflected: null,
  534. phiReflected: null,
  535. };
  536. getOthersOptions(this.queryParams).then((resp) => {
  537. this.options.temperatureKOption = resp.data.temperatureKOptions;
  538. this.options.allAngleOption = resp.data.allAngleOptions;
  539. });
  540. },
  541. // 修改 initChart 方法
  542. initChart() {
  543. // 确保容器存在
  544. if (!this.$refs.chart) {
  545. console.error("图表容器未找到");
  546. return;
  547. }
  548. // 如果已有图表实例,先销毁
  549. if (this.chart) {
  550. this.chart.dispose();
  551. }
  552. this.chart = echarts.init(this.$refs.chart);
  553. // 准备x轴数据
  554. const xAxisData = this.emiMeasurementList.map(
  555. (item) => item.wavelengthUm
  556. );
  557. // 准备系列数据
  558. const series = [];
  559. const emiFields = [
  560. { field: "emiCorrection1", name: "EMI-修正1" },
  561. { field: "emiCorrection2", name: "EMI-修正2" },
  562. { field: "emiCorrection3", name: "EMI-修正3" },
  563. { field: "emiCorrection4", name: "EMI-修正4" },
  564. { field: "emiCorrection5", name: "EMI-修正5" },
  565. ];
  566. emiFields.forEach((item) => {
  567. series.push({
  568. name: item.name, // 使用中文名称
  569. type: "line",
  570. data: this.emiMeasurementList.map((row) => row[item.field]),
  571. smooth: true,
  572. symbol: "circle",
  573. symbolSize: 8,
  574. lineStyle: {
  575. width: 3,
  576. },
  577. });
  578. });
  579. // 准备图例数据(使用中文名称)
  580. const legendData = emiFields.map((item) => item.name);
  581. const option = {
  582. title: {
  583. text: "Emi Correction 折线图",
  584. left: "center",
  585. },
  586. tooltip: {
  587. trigger: "axis",
  588. axisPointer: {
  589. type: "cross",
  590. },
  591. },
  592. legend: {
  593. data: legendData, // 使用中文名称的图例
  594. bottom: 10,
  595. },
  596. grid: {
  597. left: "3%",
  598. right: "4%",
  599. bottom: "15%",
  600. top: "15%",
  601. containLabel: true,
  602. },
  603. toolbox: {
  604. feature: {
  605. saveAsImage: {},
  606. dataView: {},
  607. },
  608. },
  609. xAxis: {
  610. type: "category",
  611. boundaryGap: false,
  612. data: xAxisData,
  613. name: "Wavelength (μm)",
  614. nameLocation: "middle",
  615. nameGap: 30,
  616. },
  617. yAxis: {
  618. type: "value",
  619. name: "Emi Correction",
  620. nameLocation: "middle",
  621. nameGap: 30,
  622. },
  623. series: series,
  624. };
  625. this.chart.setOption(option);
  626. // 添加窗口大小变化监听
  627. window.addEventListener("resize", this.handleResize);
  628. },
  629. // 修改 handleResize 方法
  630. handleResize() {
  631. if (this.chart) {
  632. this.chart.resize();
  633. }
  634. },
  635. // 在 beforeDestroy 钩子中清理
  636. beforeDestroy() {
  637. if (this.chart) {
  638. this.chart.dispose();
  639. this.chart = null;
  640. }
  641. window.removeEventListener("resize", this.handleResize);
  642. },
  643. },
  644. };
  645. </script>
  646. <style lang="scss" scoped>
  647. .app-container {
  648. height: calc(100vh - 84px);
  649. display: flex;
  650. flex-direction: column;
  651. .query-section {
  652. padding: 20px;
  653. background-color: #f5f7fa;
  654. box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
  655. margin-bottom: 10px;
  656. }
  657. .image-container {
  658. height: 100%;
  659. width: 100%;
  660. cursor: pointer;
  661. display: flex;
  662. align-items: center;
  663. justify-content: center;
  664. background-color: #f5f7fa;
  665. &:hover {
  666. opacity: 0.9;
  667. }
  668. .image-slot {
  669. display: flex;
  670. justify-content: center;
  671. align-items: center;
  672. width: 100%;
  673. height: 100%;
  674. background: #f5f7fa;
  675. color: #909399;
  676. font-size: 30px;
  677. }
  678. }
  679. .result-section {
  680. flex: 1;
  681. display: flex;
  682. flex-direction: column;
  683. padding: 0 10px 10px 10px;
  684. overflow: hidden;
  685. .result-top,
  686. .result-bottom {
  687. flex: 1;
  688. display: flex;
  689. margin-bottom: 10px;
  690. min-height: 0;
  691. &:last-child {
  692. margin-bottom: 0;
  693. }
  694. }
  695. .result-block {
  696. flex: 1;
  697. margin: 0 5px;
  698. display: flex;
  699. flex-direction: column;
  700. overflow: hidden;
  701. ::v-deep .el-card__body {
  702. // height: calc(100% - 57px);
  703. // padding: 0;
  704. > div {
  705. height: 100%;
  706. }
  707. height: calc(100% - 57px);
  708. padding: 0;
  709. display: flex;
  710. flex-direction: column;
  711. > .table-container {
  712. flex: 1;
  713. min-height: 0;
  714. overflow: hidden;
  715. .el-table {
  716. height: 100%;
  717. ::v-deep .el-table__body-wrapper {
  718. overflow-y: auto;
  719. }
  720. }
  721. }
  722. }
  723. &.block-1 {
  724. margin-left: 0;
  725. }
  726. &.block-2 {
  727. margin-right: 0;
  728. .chart-container {
  729. width: 100%;
  730. height: 100%;
  731. > div {
  732. width: 100%;
  733. height: 100%;
  734. min-height: 300px; // 设置最小高度确保可见
  735. }
  736. }
  737. }
  738. &.block-3 {
  739. margin-left: 0;
  740. }
  741. &.block-4 {
  742. margin-right: 0;
  743. }
  744. }
  745. }
  746. .el-table {
  747. flex: 1;
  748. }
  749. }
  750. </style>