储能智慧云平台web端
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  1. <template>
  2. <div>
  3. <div class="title">
  4. 多站总览
  5. <div class="title_time">{{ currentDate }}</div>
  6. </div>
  7. <el-row :gutter="20">
  8. <el-col :span="6">
  9. <el-card>
  10. <div class="grid-content ep-bg-purple">
  11. <div class="overview_title1">
  12. <div class="overview_title_name">站点总数</div>
  13. </div>
  14. <div class="overview_title">
  15. <div class="overview_titlename">{{ multiStation.stationTotalCount }}<span class="overview_unit"> 个</span></div>
  16. <div class="overview_img">
  17. <img src="../../assets/images/server2.png" alt="站点" />
  18. </div>
  19. </div>
  20. <div class="overview_line">
  21. 在线{{ multiStation.stationTotalCount }}个 \ 离线{{ multiStation.stationOfflineCount }}个
  22. </div>
  23. <el-divider />
  24. <div class="overview_line">
  25. 装机功率: {{ (multiStation.installedPower * 1).toFixed(2) }}MW | 装机容量:
  26. {{ (multiStation.installedPower * 1).toFixed(2) }} MWh
  27. </div>
  28. </div>
  29. </el-card>
  30. </el-col>
  31. <el-col :span="6">
  32. <el-card>
  33. <div class="grid-content ep-bg-purple">
  34. <div class="overview_title1">
  35. <div class="overview_title_name">今日充电量</div>
  36. </div>
  37. <div class="overview_title">
  38. <div class="overview_titlename">{{ multiStation.dayImportKwh }} <span class="overview_unit"> MWh</span></div>
  39. <div class="overview_img1">
  40. <img src="../../assets/images/charging.png" alt="站点" />
  41. </div>
  42. </div>
  43. <div class="overview_line">较昨日下降: {{ multiStation.importKwhDiffYDay }} MWh</div>
  44. <el-divider />
  45. <div class="overview_line">
  46. 月充电: {{ multiStation.monthImportKwh }}MW | 累计充电: {{ multiStation.accumulativeImportKwh }} MWh
  47. </div>
  48. </div>
  49. </el-card>
  50. </el-col>
  51. <el-col :span="6">
  52. <el-card>
  53. <div class="grid-content ep-bg-purple">
  54. <div class="overview_title1">
  55. <div class="overview_title_name">今日放电量</div>
  56. </div>
  57. <div class="overview_title">
  58. <div class="overview_titlename">{{ multiStation.dayExportKwh }}<span class="overview_unit"> MWh</span></div>
  59. <div class="overview_img2">
  60. <img src="../../assets/images/discharge.png" alt="站点" />
  61. </div>
  62. </div>
  63. <div class="overview_line">较昨日下降: {{ multiStation.exportKwhDiffYDay }} MWh</div>
  64. <el-divider />
  65. <div class="overview_line">
  66. 月充电: {{ multiStation.monthExportKwh }} MWh | 累计充电: {{ multiStation.accumulativeExportKwh }} MWh
  67. </div>
  68. </div>
  69. </el-card>
  70. </el-col>
  71. <el-col :span="6">
  72. <el-card>
  73. <div class="grid-content ep-bg-purple">
  74. <div class="overview_title1">
  75. <div class="overview_title_name">今日收益</div>
  76. </div>
  77. <div class="overview_title">
  78. <div class="overview_titlename">{{ multiStation.todayProfit }} <span class="overview_unit">元</span></div>
  79. <div class="overview_img3">
  80. <img src="../../assets/images/qian.png" alt="站点" />
  81. </div>
  82. </div>
  83. <div class="overview_line">较昨日下降: {{ multiStation.profitDiffYDay }} mwh</div>
  84. <el-divider />
  85. <div class="overview_line">
  86. 本月收益: {{ multiStation.monthProfit }}万元 | 总收益: {{ multiStation.totalProfit }}万元
  87. </div>
  88. </div>
  89. </el-card>
  90. </el-col>
  91. </el-row>
  92. <el-row :gutter="20">
  93. <el-col :span="18">
  94. <el-card>
  95. <div class="grid_div grid-content ep-bg-purple">
  96. <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
  97. <el-tab-pane label="收益统计" name="first"> </el-tab-pane>
  98. <el-tab-pane label="充放电统计" name="second"> </el-tab-pane>
  99. <div class="grid_div1">
  100. <div v-if="tabpropslabel == '收益统计'" style="width: 68%" ref="baroption" id="baroption"></div>
  101. <div v-else style="width: 100%" ref="baroption" id="baroption"></div>
  102. <div id="income" v-show="tabpropslabel == '收益统计'"></div>
  103. </div>
  104. </el-tabs>
  105. <div class="grid_divright">
  106. <div :class="recentlytype == 7 ? 'grid_divright_1' : 'grid_divright_2'" @click="recently(7)">近7日</div>
  107. <div :class="recentlytype == 31 ? 'grid_divright_1' : 'grid_divright_2'" @click="recently(31)">近31日</div>
  108. <div :class="recentlytype == 360 ? 'grid_divright_1' : 'grid_divright_2'" @click="recently(360)">近12月</div>
  109. <el-date-picker
  110. v-model="value2"
  111. type="daterange"
  112. start-placeholder="开始时间"
  113. end-placeholder="结束时间"
  114. :default-value="value2"
  115. :disabled-date="pickerOptions"
  116. />
  117. </div>
  118. </div>
  119. </el-card>
  120. </el-col>
  121. <el-col :span="6">
  122. <el-card>
  123. <div class="grid-content ep-bg-purple">
  124. <div class="grid_right">
  125. <div>故障警告</div>
  126. <div class="grid_right1">查看详细</div>
  127. </div>
  128. <div id="gridpiechart"></div>
  129. </div>
  130. </el-card>
  131. </el-col>
  132. </el-row>
  133. <el-card>
  134. <template #header>
  135. <div class="card-header">
  136. <span>系统列表</span>
  137. </div>
  138. </template>
  139. <div class="cardtable">
  140. <div>通讯状态:</div>
  141. &emsp;
  142. <el-select v-model="onlineStatus" placeholder="Select" size="large" style="width: 240px">
  143. <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
  144. </el-select>
  145. &emsp;
  146. <el-input v-model="modelinput" style="width: 240px" placeholder="请输入内容" size="large" />
  147. &emsp;
  148. <el-button type="primary" size="large" color="#0052d9" @click="query(0)">查询</el-button>
  149. <el-button size="large" @click="query(1)">重置</el-button>
  150. </div>
  151. <el-table :data="tableData.records" style="width: 100%" border>
  152. <el-table-column type="index" width="50" />
  153. <el-table-column prop="stationName" label="电站名称" />
  154. <el-table-column prop="onlineStatus" label="在线状态">
  155. <template #default="scope">
  156. {{ scope.row.onlineStatus == 0 ? "离线" : "在线" }}
  157. </template>
  158. </el-table-column>
  159. <el-table-column prop="todayChargeCap" label="今日充电量(kWh)" />
  160. <el-table-column prop="todayDischargeCap" label="今日放电量(kWh)" />
  161. <el-table-column prop="totalChargeCap" label="总充电量(kWh)" />
  162. <el-table-column prop="totalDischargeCap" label="总放电量(kWh)" />
  163. <el-table-column prop="todayAlarmCount" label="今日告警" align="center">
  164. <template #default="scope">
  165. {{ scope.row.todayAlarmCount == null ? "-" : scope.row.todayAlarmCount }}
  166. </template>
  167. </el-table-column>
  168. <el-table-column prop="overallEfficiency" label="综合效率(%)" />
  169. <el-table-column prop="dischargeCompletionRate" label="放电达成率(%)" />
  170. <el-table-column prop="yesterdayProfit" label="昨日收益(元)" />
  171. <el-table-column prop="totalProfit" label="总收益(万元)" />
  172. </el-table>
  173. <div class="example_block">
  174. <!-- <el-pagination layout="prev, pager, next" :total="tableData.records.length" @change="changemultiStationpagebase" /> -->
  175. <Pagination :pageable="pageable" :handle-size-change="handleSizeChange" :handle-current-change="handleCurrentChange" />
  176. </div>
  177. </el-card>
  178. </div>
  179. </template>
  180. <script setup lang="ts">
  181. import { onMounted, ref } from "vue";
  182. import type { TabsPaneContext } from "element-plus";
  183. import * as echarts from "echarts";
  184. import Pagination from "@/components/ProTable/components/Pagination.vue";
  185. import {
  186. gethomesite,
  187. multiStationday,
  188. multiStationtopday,
  189. multiStatiopower,
  190. alarmMultiStation,
  191. multiStationpagebaseInfo,
  192. multiStationdayMonth,
  193. multiStationtopyearMonth,
  194. multiStatyearMonth
  195. } from "@/api/home/Multisite";
  196. const multiStation = ref();
  197. const activeName = ref("first");
  198. const value2 = ref();
  199. const tableData = ref();
  200. const currentDate = ref();
  201. const baroption = ref();
  202. const onlineStatus = ref("");
  203. const modelinput = ref();
  204. const tabpropslabel = ref("收益统计");
  205. const recentlytype = ref(7);
  206. const options = ref([
  207. {
  208. value: "",
  209. label: "全部"
  210. },
  211. {
  212. value: "1",
  213. label: "在线"
  214. },
  215. {
  216. value: "0",
  217. label: "离线"
  218. }
  219. ]);
  220. const handleClick = (tab: TabsPaneContext) => {
  221. // if (baroption.value) {
  222. // baroption.value.dispose(); //地图图表
  223. // }
  224. tabpropslabel.value = tab.props.label;
  225. if (tab.props.label == "收益统计") {
  226. getmultiStationtopday(); // 收益排名图
  227. getmultiStation();
  228. } else {
  229. getmultiStatiopower();
  230. }
  231. };
  232. // 查询最近数据
  233. const recently = (val: any) => {
  234. // 获取当前日期
  235. recentlytype.value = val;
  236. const today = new Date();
  237. const currentDate = today.toLocaleDateString();
  238. // 获取过去 7 天的日期
  239. const sevenDaysAgoDate = new Date(today);
  240. sevenDaysAgoDate.setDate(today.getDate() - 7);
  241. const sevenDaysAgo = sevenDaysAgoDate.toLocaleDateString();
  242. // 获取过去 31 天的日期
  243. const thirtyOneDaysAgoDate = new Date(today);
  244. thirtyOneDaysAgoDate.setDate(today.getDate() - 31);
  245. const thirtyOneDaysAgo = thirtyOneDaysAgoDate.toLocaleDateString();
  246. // 获取去年同月的日期
  247. const lastYearSameMonthDate = new Date(today.getFullYear() - 1, today.getMonth(), today.getDate());
  248. const lastYearSameMonth = lastYearSameMonthDate.toLocaleDateString();
  249. if (tabpropslabel.value == "收益统计") {
  250. if (val == 7) {
  251. value2.value = [sevenDaysAgo, currentDate];
  252. getmultiStation(); // 收益统计图
  253. getmultiStationtopday(); // 收益排名图
  254. } else if (val == 31) {
  255. value2.value = [thirtyOneDaysAgo, currentDate];
  256. getmultiStation(); // 收益统计图
  257. getmultiStationtopday(); // 收益排名图
  258. } else {
  259. value2.value = [lastYearSameMonth, currentDate];
  260. getmultiStationMonth(); // 收益统计图
  261. getmultiStationtopMonth(); // 收益排名图
  262. }
  263. } else {
  264. if (val == 7) {
  265. value2.value = [sevenDaysAgo, currentDate];
  266. getmultiStatiopower(); // 充放电统计图
  267. } else if (val == 31) {
  268. value2.value = [thirtyOneDaysAgo, currentDate];
  269. getmultiStatiopower(); // 充放电统计图
  270. } else {
  271. value2.value = [lastYearSameMonth, currentDate];
  272. getmultiStatiopowerMonth();
  273. }
  274. }
  275. };
  276. const pickerOptions = (time: { getTime: (arg0: Date) => number }) => {
  277. return time.getTime(new Date()) > Date.now();
  278. };
  279. const getsite = async () => {
  280. // 获取年份
  281. const year = new Date().getFullYear();
  282. // 获取月份,补零
  283. const month = String(new Date().getMonth() + 1).padStart(2, "0");
  284. // 获取日期,补零
  285. const day = String(new Date().getDate()).padStart(2, "0");
  286. // 拼接年月日
  287. currentDate.value = `${year}-${month}-${day}`;
  288. localStorage.setItem("currentDate", currentDate.value);
  289. const today = new Date();
  290. const sevenDaysAgoDate = new Date(today);
  291. sevenDaysAgoDate.setDate(today.getDate() - 6);
  292. const sevenDaysAgo = sevenDaysAgoDate.toLocaleDateString();
  293. value2.value = [sevenDaysAgo, currentDate.value];
  294. const { data } = await gethomesite();
  295. multiStation.value = data;
  296. };
  297. // 收益统计图
  298. const getmultiStation = async () => {
  299. const { data } = await multiStationday({ startDate: value2.value[0], endDate: value2.value[1] });
  300. // const profits = data.map(item => item.profit);
  301. // const dates = data.map(item => item.ymd);
  302. const dates = [["product", "收益"]];
  303. // console.log(data.length);
  304. if (data.length != 0) {
  305. for (let index = 0; index < data.length; index++) {
  306. dates.push([data[index].ymd, data[index].profit]);
  307. }
  308. } else {
  309. dates.push([value2.value[0], "50"], [value2.value[1], "120"]);
  310. }
  311. const profits = [{ type: "bar" }];
  312. baroptionchart(dates, profits);
  313. };
  314. // 收益统计图
  315. const getmultiStationMonth = async () => {
  316. const { data } = await multiStationdayMonth({ startDate: value2.value[0], endDate: value2.value[1] });
  317. // const profits = data.map(item => item.profit);
  318. // const dates = data.map(item => item.ymd);
  319. const dates = [["product", "收益"]];
  320. if (data.length != 0) {
  321. for (let index = 0; index < data.length; index++) {
  322. dates.push([data[index].ymd, data[index].profit]);
  323. }
  324. } else {
  325. dates.push([value2.value[1], "0"]);
  326. }
  327. const profits = [{ type: "bar" }];
  328. baroptionchart(dates, profits);
  329. };
  330. // 充放电统计图
  331. const getmultiStatiopower = async () => {
  332. const { data } = await multiStatiopower({ startDate: value2.value[0], endDate: value2.value[1] });
  333. const dates = [["product", "充电", "放电"]];
  334. if (data.length != 0) {
  335. for (let index = 0; index < data.length; index++) {
  336. dates.push([data[index].ymd, data[index].chargeTotal.toString(), data[index].dischargeTotal.toString()]);
  337. }
  338. } else {
  339. dates.push([value2.value[1], "0", "0"]);
  340. }
  341. const profits = [{ type: "bar" }, { type: "bar" }];
  342. baroptionchart(dates, profits);
  343. };
  344. // 充放电统计月份
  345. const getmultiStatiopowerMonth = async () => {
  346. const { data } = await multiStatyearMonth({ startYearMonth: value2.value[0], endYearMonth: value2.value[1] });
  347. const dates = [["product", "充电", "放电"]];
  348. // console.log(data);
  349. if (data.length != 0) {
  350. for (let index = 0; index < data.length; index++) {
  351. dates.push([data[index].ymd, data[index].chargeTotal.toString(), data[index].dischargeTotal.toString()]);
  352. }
  353. } else {
  354. dates.push([value2.value[1], "0", "0"]);
  355. }
  356. const profits = [{ type: "bar" }, { type: "bar" }];
  357. baroptionchart(dates, profits);
  358. };
  359. // 收益统计
  360. const baroptionchart = (dates: string[][], profits: { type: string }[]) => {
  361. // console.log(dates, profits);
  362. const baroptionvalue = echarts.init(baroption.value);
  363. window.addEventListener(
  364. "resize",
  365. () => {
  366. baroptionvalue.resize();
  367. },
  368. false
  369. );
  370. let option = {
  371. title: {
  372. subtext: "收益/元"
  373. },
  374. legend: {
  375. right: 30
  376. },
  377. grid: {
  378. left: "1%",
  379. right: "4%",
  380. bottom: "0%",
  381. containLabel: true
  382. },
  383. xAxis: {
  384. type: "category"
  385. },
  386. yAxis: {
  387. type: "value"
  388. },
  389. dataset: {
  390. source: dates
  391. },
  392. series: profits
  393. };
  394. baroptionvalue.setOption(option, true);
  395. };
  396. // 收益排名日
  397. const getmultiStationtopday = async () => {
  398. const { data } = await multiStationtopday({ startDate: value2.value[0], endDate: value2.value[1] });
  399. let profitlist = [];
  400. let stationNames = [];
  401. if (data.length != 0) {
  402. profitlist = data.map(item => item.profit).sort((a, b) => a - b);
  403. stationNames = data.map(item => item.stationName);
  404. } else {
  405. profitlist = [60, 40, 70, 20, 80, 100, 120];
  406. stationNames = ["演示电站一", "演示电站二", "演示电站三", "演示电站四", "演示电站五", "演示电站六", "演示电站七"];
  407. }
  408. // console.log(profitlist, stationNames);
  409. baroptionincome(profitlist, stationNames);
  410. };
  411. // 收益排名月份
  412. const getmultiStationtopMonth = async () => {
  413. const { data } = await multiStationtopyearMonth({ startDate: value2.value[0], endDate: value2.value[1] });
  414. const profitlist = data.map(item => item.profit).sort((a, b) => a - b);
  415. const stationNames = data.map(item => item.stationName);
  416. baroptionincome(profitlist, stationNames);
  417. };
  418. // 收益排名
  419. const baroptionincome = (profitlist: number[], stationNames: string[]) => {
  420. let baroption = echarts.init(document.getElementById("income"));
  421. window.addEventListener(
  422. "resize",
  423. () => {
  424. baroption.resize();
  425. },
  426. false
  427. );
  428. let option = {
  429. title: {
  430. subtext: "收益排名"
  431. },
  432. tooltip: {
  433. trigger: "axis",
  434. axisPointer: {
  435. type: "shadow"
  436. }
  437. },
  438. legend: {},
  439. grid: {
  440. left: "3%",
  441. right: "1%",
  442. bottom: "3%",
  443. containLabel: true
  444. },
  445. xAxis: {
  446. type: "value",
  447. inverse: true, // 将 Y 轴反转
  448. data: stationNames,
  449. axisLabel: {
  450. textStyle: {
  451. fontSize: 0 // 设置字体大小
  452. }
  453. },
  454. axisLine: {
  455. show: false // 隐藏 X 轴刻度线
  456. },
  457. axisTick: {
  458. show: false // 隐藏 X 轴刻度线
  459. },
  460. splitLine: {
  461. show: false // 隐藏 x 轴背景刻度线
  462. }
  463. },
  464. yAxis: {
  465. type: "category",
  466. position: "right",
  467. data: profitlist,
  468. axisLine: {
  469. show: false // 隐藏 y 轴刻度线
  470. },
  471. axisTick: {
  472. show: false // 隐藏 y 轴刻度线
  473. }
  474. },
  475. series: [
  476. {
  477. type: "bar",
  478. data: profitlist,
  479. label: {
  480. //图形上显示文本标签
  481. formatter: function (p: any) {
  482. return stationNames[p.dataIndex];
  483. },
  484. show: true,
  485. position: "right",
  486. distance: -105, // 设置标签与图形的距离
  487. textStyle: {
  488. fontWeight: "bolder",
  489. fontSize: "10" //文字大小
  490. }
  491. },
  492. stack: "total", //数据堆叠同个类目轴上系列配置相同的stack值可以堆叠放置
  493. //图形渐变色
  494. color: "#d6e9ca"
  495. }
  496. ]
  497. };
  498. baroption.setOption(option);
  499. };
  500. const postalarmMultiStation = async () => {
  501. let { data } = await alarmMultiStation({});
  502. let list = data.map(function (item) {
  503. return {
  504. value: item.cnt, // 将 cnt 键修改为 value
  505. name: item.name
  506. };
  507. });
  508. baropPiechart(list);
  509. };
  510. // 故障告警
  511. const baropPiechart = (list: string | any[]) => {
  512. let piechart = echarts.init(document.getElementById("gridpiechart"));
  513. window.addEventListener(
  514. "resize",
  515. () => {
  516. piechart.resize();
  517. },
  518. false
  519. );
  520. let option1 = {
  521. tooltip: {
  522. trigger: "item"
  523. },
  524. legend: {
  525. show: true,
  526. orient: "vertical",
  527. bottom: "0%",
  528. icon: "circle",
  529. textStyle: {
  530. fontSize: 14,
  531. rich: {
  532. a: {
  533. fontSize: 14
  534. }
  535. }
  536. },
  537. formatter: function (name: string) {
  538. for (let index = 0; index < list.length; index++) {
  539. if (name == list[index].name) {
  540. return `${name + " " + " " + "" + " "} {a|${list[index].value}} 条`;
  541. }
  542. }
  543. }
  544. },
  545. series: [
  546. {
  547. type: "pie",
  548. radius: ["40%", "70%"],
  549. avoidLabelOverlap: false,
  550. label: {
  551. show: false,
  552. position: "center",
  553. fontSize: 0
  554. },
  555. emphasis: {
  556. label: {
  557. show: true,
  558. fontSize: 0,
  559. fontWeight: "bold"
  560. }
  561. },
  562. labelLine: {
  563. show: false
  564. },
  565. data: list
  566. }
  567. ]
  568. };
  569. piechart.setOption(option1);
  570. };
  571. // 查询
  572. const query = async (val: number) => {
  573. if (val == 0) {
  574. postmultiStationpagebaseInfo();
  575. } else {
  576. onlineStatus.value = "";
  577. modelinput.value = "";
  578. pageable.value.pn = 1;
  579. pageable.value.ps = 10;
  580. postmultiStationpagebaseInfo();
  581. }
  582. };
  583. // const changemultiStationpagebase = async (value: any) => {
  584. // pageable.value.ps = value;
  585. // postmultiStationpagebaseInfo();
  586. // };
  587. const pageable = ref({
  588. ps: 10,
  589. pn: 1,
  590. total: 0
  591. });
  592. const handleSizeChange = async (e: any) => {
  593. pageable.value.ps = e;
  594. postmultiStationpagebaseInfo();
  595. };
  596. const handleCurrentChange = async (e: any) => {
  597. pageable.value.pn = e;
  598. postmultiStationpagebaseInfo();
  599. };
  600. // 电站列表
  601. const postmultiStationpagebaseInfo = async () => {
  602. const { data } = await multiStationpagebaseInfo({
  603. onlineStatus: onlineStatus.value,
  604. keyword: modelinput.value,
  605. pn: pageable.value.pn,
  606. ps: pageable.value.ps
  607. });
  608. tableData.value = data;
  609. console.log(tableData.value.total);
  610. pageable.value.total = tableData.value.total;
  611. };
  612. onMounted(() => {
  613. getsite();
  614. getmultiStationtopday();
  615. postalarmMultiStation();
  616. getmultiStation();
  617. postmultiStationpagebaseInfo();
  618. });
  619. </script>
  620. <style scoped lang="scss">
  621. @import "./index.scss";
  622. </style>
  623. <!--
  624. -->