新型管道消毒机前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

851 lines
20 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. <template>
  2. <div class="device_container">
  3. <div class="row_wrap">
  4. <p class="title">注射蠕动泵速率(g/min)</p>
  5. <p class="num">
  6. <van-field
  7. class="field_font"
  8. type="number"
  9. v-model="sprayLiquidConfigVal"
  10. :clickable="true"
  11. :formatter="formatter7"
  12. readonly
  13. @click.stop="hideClickKey(2)"
  14. />
  15. </p>
  16. </div>
  17. <div class="row_wrap">
  18. <p class="title">消毒停止过氧化氢浓度(ppm)</p>
  19. <p class="num">
  20. <van-field
  21. type="number"
  22. class="field_font"
  23. v-model="stoped_gs"
  24. :clickable="true"
  25. :formatter="formatter1"
  26. readonly
  27. @click.stop="hideClickKey(3)"
  28. />
  29. </p>
  30. </div>
  31. <div class="row_wrap">
  32. <p class="title">消毒继续过氧化氢浓度(ppm)</p>
  33. <p class="num">
  34. <van-field
  35. class="field_font"
  36. type="number"
  37. v-model="continued_gs"
  38. :clickable="true"
  39. :formatter="formatter2"
  40. readonly
  41. @click.stop="hideClickKey(4)"
  42. />
  43. </p>
  44. </div>
  45. <div class="row_wrap">
  46. <p class="title">消毒停止相对湿度(%RH)</p>
  47. <p class="num">
  48. <van-field
  49. class="field_font"
  50. type="number"
  51. v-model="stoped_humi"
  52. :clickable="true"
  53. :formatter="formatter9"
  54. readonly
  55. @click.stop="hideClickKey(9)"
  56. />
  57. </p>
  58. </div>
  59. <div class="row_wrap">
  60. <p class="title">消毒继续相对湿度(%RH)</p>
  61. <p class="num">
  62. <van-field
  63. class="field_font"
  64. type="number"
  65. v-model="continued_humi"
  66. :clickable="true"
  67. :formatter="formatter10"
  68. readonly
  69. @click.stop="hideClickKey(10)"
  70. />
  71. </p>
  72. </div>
  73. <div class="row_wrap">
  74. <p class="title">消毒停止过氧化氢相对饱和度(%RS)</p>
  75. <p class="num">
  76. <van-field
  77. class="field_font"
  78. type="number"
  79. :formatter="formatter3"
  80. v-model="stoped_satur"
  81. :clickable="true"
  82. readonly
  83. @click.stop="hideClickKey(5)"
  84. />
  85. </p>
  86. </div>
  87. <div class="row_wrap">
  88. <p class="title">消毒继续过氧化氢相对饱和度(%RS)</p>
  89. <p class="num">
  90. <van-field
  91. type="number"
  92. class="field_font"
  93. :formatter="formatter4"
  94. v-model="continued_satur"
  95. :clickable="true"
  96. readonly
  97. @click.stop="hideClickKey(6)"
  98. />
  99. </p>
  100. </div>
  101. <div class="row_wrap" @click="showLogPicker">
  102. <p class="title">Log等级</p>
  103. <div class="num">
  104. <p class="log">{{ logVal }}</p>
  105. </div>
  106. </div>
  107. <div class="row_wrap">
  108. <p class="title">配方名称</p>
  109. <div>
  110. <input
  111. id="id_formula"
  112. v-model="formula_id"
  113. class="formula_input"
  114. placeholder="请输入配方名称"
  115. type="text"
  116. name=""
  117. />
  118. </div>
  119. </div>
  120. <van-number-keyboard
  121. v-model="addLiquidConfigVal"
  122. :title="addLiquidConfigVal"
  123. :show="addLiquidConfigValShow"
  124. @input="val => handleInput(val, 1)"
  125. theme="custom"
  126. close-button-text="配置"
  127. @close="setAddliquidVal"
  128. @blur="addLiquidConfigValShow = false"
  129. />
  130. <van-number-keyboard
  131. v-model="sprayLiquidConfigVal"
  132. @input="val => handleInput(val, 2)"
  133. :title="sprayLiquidConfigVal"
  134. :show="sprayLiquidConfigValShow"
  135. theme="custom"
  136. @close="setSprayLiquidVal"
  137. close-button-text="配置"
  138. @blur="sprayLiquidConfigValShow = false"
  139. />
  140. <van-number-keyboard
  141. v-model="stoped_gs"
  142. @input="val => handleInput(val, 3)"
  143. :title="stoped_gs"
  144. :show="stoped_gsShow"
  145. theme="custom"
  146. @close="setStopedGsVal"
  147. close-button-text="配置"
  148. @blur="stoped_gsShow = false"
  149. />
  150. <van-number-keyboard
  151. v-model="continued_gs"
  152. @input="val => handleInput(val, 4)"
  153. :title="continued_gs"
  154. @close="setcontinuedGsVal"
  155. :show="continued_gsShow"
  156. theme="custom"
  157. close-button-text="配置"
  158. @blur="continued_gsShow = false"
  159. />
  160. <van-number-keyboard
  161. v-model="stoped_satur"
  162. @input="val => handleInput(val, 5)"
  163. :title="stoped_satur"
  164. @close="setstopedSaturVal"
  165. :show="stoped_saturShow"
  166. theme="custom"
  167. close-button-text="配置"
  168. @blur="stoped_saturShow = false"
  169. />
  170. <van-number-keyboard
  171. v-model="continued_satur"
  172. @input="val => handleInput(val, 6)"
  173. :title="continued_satur"
  174. @close="setContinuedSaturVal"
  175. :show="continued_saturShow"
  176. theme="custom"
  177. close-button-text="配置"
  178. @blur="continued_saturShow = false"
  179. />
  180. <van-number-keyboard
  181. v-model="max_humidity"
  182. @input="val => handleInput(val, 7)"
  183. :title="max_humidity"
  184. @close="setMaxHumidityVal"
  185. :show="max_humidityShow"
  186. theme="custom"
  187. close-button-text="配置"
  188. @blur="max_humidityShow = false"
  189. />
  190. <van-number-keyboard
  191. theme="custom"
  192. close-button-text="配置"
  193. @input="val => handleInput(val, 8)"
  194. @close="setHeat_timeVal"
  195. v-model="pre_heat_time_s"
  196. :title="pre_heat_time_s"
  197. :show="pre_heat_time_sShow"
  198. @blur="pre_heat_time_sShow = false"
  199. />
  200. <van-number-keyboard
  201. @input="val => handleInput(val, 9)"
  202. theme="custom"
  203. close-button-text="配置"
  204. @close="setstoped_humiVal"
  205. v-model="stoped_humi"
  206. :title="stoped_humi"
  207. :show="stoped_humiShow"
  208. @blur="stoped_humiShow = false"
  209. />
  210. <van-number-keyboard
  211. theme="custom"
  212. @input="val => handleInput(val, 10)"
  213. close-button-text="配置"
  214. @close="setcontinued_humiVal"
  215. v-model="continued_humi"
  216. :title="continued_humi"
  217. :show="continued_humiShow"
  218. @blur="continued_humiShow = false"
  219. />
  220. <LogPicker
  221. v-if="logVisible"
  222. :hiddenLogVisible="hiddenLogVisible"
  223. :changeLogVal="changeLogVal"
  224. :logVal="logVal"
  225. />
  226. <div class="btns">
  227. <div class="btn" @click="save">保存</div>
  228. <div class="btn ml" @click="hiddleSettingModal">返回</div>
  229. </div>
  230. <div class="key_wrap" v-show="showkeyboard" id="keyboard_formula">
  231. <SimpleKeyboard @onChange="onChange" :input="formula_id" />
  232. </div>
  233. </div>
  234. </template>
  235. <script setup>
  236. import { ref, onMounted } from 'vue'
  237. import SimpleKeyboard from 'cpns/SimpleKeyboard'
  238. import { showSuccessToast, showFailToast } from 'vant'
  239. import { useSettingStore, useWebSocketStore, useOperatorStore } from '@/store'
  240. import { storeToRefs } from 'pinia'
  241. import {
  242. setSettingValJSON,
  243. addFormulaJSON,
  244. getAllFormulaJSON,
  245. } from '@/mock/command'
  246. import LogPicker from 'cpns/dialogs/LogPicker'
  247. const settingStore = useSettingStore()
  248. const webSocketStore = useWebSocketStore()
  249. const operatorStore = useOperatorStore()
  250. const max_humidity = ref('0')
  251. const continued_satur = ref('0')
  252. const stoped_satur = ref('0')
  253. const continued_gs = ref('0')
  254. const stoped_gs = ref('0')
  255. const addLiquidConfigVal = ref('0')
  256. const sprayLiquidConfigVal = ref('0')
  257. const stoped_humi = ref('0')
  258. const continued_humi = ref('0')
  259. const pre_heat_time_s = ref('0')
  260. const pre_heat_time_sShow = ref(false)
  261. const addLiquidConfigValShow = ref(false)
  262. const sprayLiquidConfigValShow = ref(false)
  263. const stoped_gsShow = ref(false)
  264. const continued_gsShow = ref(false)
  265. const stoped_saturShow = ref(false)
  266. const continued_saturShow = ref(false)
  267. const max_humidityShow = ref(false)
  268. const stoped_humiShow = ref(false)
  269. const continued_humiShow = ref(false)
  270. const logVisible = ref(false)
  271. const logVal = ref('6')
  272. const formula_id = ref('')
  273. const save = () => {
  274. if (formula_id.value == '') {
  275. showFailToast('配方名称不能为空')
  276. return
  277. }
  278. const data = {
  279. formula_id: formula_id.value,
  280. loglevel: logVal.value,
  281. injection_pump_speed: sprayLiquidConfigVal.value,
  282. stoped_gs: stoped_gs.value,
  283. continued_gs: continued_gs.value,
  284. stoped_satur: stoped_satur.value,
  285. continued_satur: continued_satur.value,
  286. stoped_humi: stoped_humi.value,
  287. continued_humi: continued_humi.value,
  288. }
  289. console.log(data)
  290. webSocketStore.sendCommandMsg(addFormulaJSON(data))
  291. webSocketStore.sendCommandMsg(getAllFormulaJSON)
  292. props.hideSettingModal()
  293. }
  294. const changeLogVal = val => {
  295. logVal.value = val
  296. logVisible.value = false
  297. }
  298. const hiddenLogVisible = () => {
  299. logVisible.value = false
  300. }
  301. const showLogPicker = () => {
  302. logVisible.value = true
  303. }
  304. const isFirstClick = ref(true)
  305. const props = defineProps({
  306. hideSettingModal: {
  307. type: Function,
  308. },
  309. })
  310. const hiddleSettingModal = () => {
  311. webSocketStore.sendCommandMsg(getAllFormulaJSON)
  312. props.hideSettingModal()
  313. }
  314. const hideClickKey = flag => {
  315. isFirstClick.value = true
  316. stoped_humiShow.value = false
  317. continued_humiShow.value = false
  318. pre_heat_time_sShow.value = false
  319. addLiquidConfigValShow.value = false
  320. sprayLiquidConfigValShow.value = false
  321. stoped_gsShow.value = false
  322. continued_gsShow.value = false
  323. stoped_saturShow.value = false
  324. continued_saturShow.value = false
  325. max_humidityShow.value = false
  326. if (flag == 1) {
  327. addLiquidConfigValShow.value = true
  328. }
  329. if (flag == 2) {
  330. sprayLiquidConfigValShow.value = true
  331. }
  332. if (flag == 3) {
  333. stoped_gsShow.value = true
  334. }
  335. if (flag == 4) {
  336. continued_gsShow.value = true
  337. }
  338. if (flag == 5) {
  339. stoped_saturShow.value = true
  340. }
  341. if (flag == 6) {
  342. continued_saturShow.value = true
  343. }
  344. if (flag == 7) {
  345. max_humidityShow.value = true
  346. }
  347. if (flag == 8) {
  348. pre_heat_time_sShow.value = true
  349. }
  350. if (flag == 9) {
  351. stoped_humiShow.value = true
  352. }
  353. if (flag == 10) {
  354. continued_humiShow.value = true
  355. }
  356. }
  357. const handleInput = (value, index) => {
  358. if (isFirstClick.value) {
  359. if (index == 1) {
  360. setTimeout(() => {
  361. addLiquidConfigVal.value = value + ''
  362. })
  363. }
  364. if (index == 2) {
  365. setTimeout(() => {
  366. sprayLiquidConfigVal.value = value + ''
  367. })
  368. }
  369. if (index == 3) {
  370. setTimeout(() => {
  371. stoped_gs.value = value + ''
  372. })
  373. }
  374. if (index == 4) {
  375. setTimeout(() => {
  376. continued_gs.value = value + ''
  377. })
  378. }
  379. if (index == 5) {
  380. setTimeout(() => {
  381. stoped_satur.value = value + ''
  382. })
  383. }
  384. if (index == 6) {
  385. setTimeout(() => {
  386. continued_satur.value = value + ''
  387. })
  388. }
  389. if (index == 7) {
  390. setTimeout(() => {
  391. max_humidity.value = value + ''
  392. })
  393. }
  394. if (index == 8) {
  395. setTimeout(() => {
  396. pre_heat_time_s.value = value + ''
  397. })
  398. }
  399. if (index == 9) {
  400. setTimeout(() => {
  401. stoped_humi.value = value + ''
  402. })
  403. }
  404. if (index == 10) {
  405. setTimeout(() => {
  406. continued_humi.value = value + ''
  407. })
  408. }
  409. isFirstClick.value = false
  410. }
  411. }
  412. const formatter1 = value => {
  413. if (parseInt(value) == 0) {
  414. return '0'
  415. }
  416. let arr = settingStore.allSettingList.filter(item => item.name == 'stoped_gs')
  417. if (arr && arr.length > 0) {
  418. if (parseInt(value) > arr[0].val_upper_limit) {
  419. return arr[0].val_upper_limit + ''
  420. }
  421. if (parseInt(value) < arr[0].val_lower_limit) {
  422. return arr[0].val_lower_limit + ''
  423. }
  424. }
  425. if (value == '') {
  426. return '0'
  427. }
  428. return value.replace(/^0+/gi, '')
  429. }
  430. const formatter2 = value => {
  431. if (parseInt(value) == 0) {
  432. return '0'
  433. }
  434. let arr = settingStore.allSettingList.filter(
  435. item => item.name == 'continued_gs',
  436. )
  437. if (arr && arr.length > 0) {
  438. if (parseInt(value) > arr[0].val_upper_limit) {
  439. return arr[0].val_upper_limit + ''
  440. }
  441. if (parseInt(value) < arr[0].val_lower_limit) {
  442. return arr[0].val_lower_limit + ''
  443. }
  444. }
  445. if (value == '') {
  446. return '0'
  447. }
  448. return value.replace(/^0+/gi, '')
  449. }
  450. const formatter3 = value => {
  451. if (parseInt(value) == 0) {
  452. return '0'
  453. }
  454. let arr = settingStore.allSettingList.filter(
  455. item => item.name == 'stoped_satur',
  456. )
  457. if (arr && arr.length > 0) {
  458. if (parseInt(value) > arr[0].val_upper_limit) {
  459. return arr[0].val_upper_limit + ''
  460. }
  461. if (parseInt(value) < arr[0].val_lower_limit) {
  462. return arr[0].val_lower_limit + ''
  463. }
  464. }
  465. if (value == '') {
  466. return '0'
  467. }
  468. return value.replace(/^0+/gi, '')
  469. }
  470. const formatter4 = value => {
  471. if (parseInt(value) == 0) {
  472. return '0'
  473. }
  474. let arr = settingStore.allSettingList.filter(
  475. item => item.name == 'continued_satur',
  476. )
  477. if (arr && arr.length > 0) {
  478. if (parseInt(value) > arr[0].val_upper_limit) {
  479. return arr[0].val_upper_limit + ''
  480. }
  481. if (parseInt(value) < arr[0].val_lower_limit) {
  482. return arr[0].val_lower_limit + ''
  483. }
  484. }
  485. if (value == '') {
  486. return '0'
  487. }
  488. return value.replace(/^0+/gi, '')
  489. }
  490. const formatter5 = value => {
  491. if (parseInt(value) == 0) {
  492. return '0'
  493. }
  494. let arr = settingStore.allSettingList.filter(
  495. item => item.name == 'max_humidity',
  496. )
  497. if (arr && arr.length > 0) {
  498. if (parseInt(value) > arr[0].val_upper_limit) {
  499. return arr[0].val_upper_limit + ''
  500. }
  501. if (parseInt(value) < arr[0].val_lower_limit) {
  502. return arr[0].val_lower_limit + ''
  503. }
  504. }
  505. if (value == '') {
  506. return '0'
  507. }
  508. return value.replace(/^0+/gi, '')
  509. }
  510. const formatter6 = value => {
  511. if (parseInt(value) == 0) {
  512. return '0'
  513. }
  514. let arr = settingStore.allSettingList.filter(
  515. item => item.name == 'drainage_pump_speed',
  516. )
  517. if (arr && arr.length > 0) {
  518. if (parseInt(value) > arr[0].val_upper_limit) {
  519. return arr[0].val_upper_limit + ''
  520. }
  521. if (parseInt(value) < arr[0].val_lower_limit) {
  522. return arr[0].val_lower_limit + ''
  523. }
  524. }
  525. if (value == '') {
  526. return '0'
  527. }
  528. return value.replace(/^0+/gi, '')
  529. }
  530. const formatter7 = value => {
  531. if (parseInt(value) == 0) {
  532. return '0'
  533. }
  534. let arr = settingStore.allSettingList.filter(
  535. item => item.name == 'injection_pump_speed',
  536. )
  537. if (arr && arr.length > 0) {
  538. if (parseInt(value) > arr[0].val_upper_limit) {
  539. return arr[0].val_upper_limit + ''
  540. }
  541. if (parseInt(value) < arr[0].val_lower_limit) {
  542. return arr[0].val_lower_limit + ''
  543. }
  544. }
  545. if (value == '') {
  546. return '0'
  547. }
  548. return value.replace(/^0+/gi, '')
  549. }
  550. const formatter8 = value => {
  551. if (parseInt(value) == 0) {
  552. return '0'
  553. }
  554. let arr = settingStore.allSettingList.filter(
  555. item => item.name == 'pre_heat_time_s',
  556. )
  557. if (arr && arr.length > 0) {
  558. if (parseInt(value) > arr[0].val_upper_limit) {
  559. return arr[0].val_upper_limit + ''
  560. }
  561. if (parseInt(value) < arr[0].val_lower_limit) {
  562. return arr[0].val_lower_limit + ''
  563. }
  564. }
  565. if (value == '') {
  566. return '0'
  567. }
  568. return value.replace(/^0+/gi, '')
  569. }
  570. const formatter9 = value => {
  571. if (parseInt(value) == 0) {
  572. return '0'
  573. }
  574. let arr = settingStore.allSettingList.filter(
  575. item => item.name == 'stoped_humi',
  576. )
  577. if (arr && arr.length > 0) {
  578. if (parseInt(value) > arr[0].val_upper_limit) {
  579. return arr[0].val_upper_limit + ''
  580. }
  581. if (parseInt(value) < arr[0].val_lower_limit) {
  582. return arr[0].val_lower_limit + ''
  583. }
  584. }
  585. if (value == '') {
  586. return '0'
  587. }
  588. return value.replace(/^0+/gi, '')
  589. }
  590. const formatter10 = value => {
  591. if (parseInt(value) == 0) {
  592. return '0'
  593. }
  594. let arr = settingStore.allSettingList.filter(
  595. item => item.name == 'continued_humi',
  596. )
  597. if (arr && arr.length > 0) {
  598. if (parseInt(value) > arr[0].val_upper_limit) {
  599. return arr[0].val_upper_limit + ''
  600. }
  601. if (parseInt(value) < arr[0].val_lower_limit) {
  602. return arr[0].val_lower_limit + ''
  603. }
  604. }
  605. if (value == '') {
  606. return '0'
  607. }
  608. return value.replace(/^0+/gi, '')
  609. }
  610. const setAddliquidVal = () => {
  611. const val = parseInt(addLiquidConfigVal.value)
  612. if (isNaN(val)) {
  613. showFailToast('设置失败,请填写正确参数')
  614. return
  615. }
  616. }
  617. const setStopedGsVal = () => {
  618. const val = parseInt(stoped_gs.value)
  619. if (isNaN(val)) {
  620. showFailToast('设置失败,请填写正确参数')
  621. return
  622. }
  623. }
  624. const setcontinuedGsVal = () => {
  625. const val = parseInt(continued_gs.value)
  626. if (isNaN(val)) {
  627. showFailToast('设置失败,请填写正确参数')
  628. return
  629. }
  630. }
  631. const setstopedSaturVal = () => {
  632. const val = parseInt(stoped_satur.value)
  633. if (isNaN(val)) {
  634. showFailToast('设置失败,请填写正确参数')
  635. return
  636. }
  637. }
  638. const setContinuedSaturVal = () => {
  639. const val = parseInt(continued_satur.value)
  640. if (isNaN(val)) {
  641. showFailToast('设置失败,请填写正确参数')
  642. return
  643. }
  644. }
  645. const setMaxHumidityVal = () => {
  646. const val = parseInt(max_humidity.value)
  647. if (isNaN(val)) {
  648. showFailToast('设置失败,请填写正确参数')
  649. return
  650. }
  651. }
  652. const setHeat_timeVal = () => {
  653. const val = parseInt(pre_heat_time_s.value)
  654. if (isNaN(val)) {
  655. showFailToast('设置失败,请填写正确参数')
  656. return
  657. }
  658. }
  659. const setstoped_humiVal = () => {
  660. const val = parseInt(stoped_humi.value)
  661. if (isNaN(val)) {
  662. showFailToast('设置失败,请填写正确参数')
  663. return
  664. }
  665. }
  666. const setcontinued_humiVal = () => {
  667. const val = parseInt(continued_humi.value)
  668. if (isNaN(val)) {
  669. showFailToast('设置失败,请填写正确参数')
  670. return
  671. }
  672. }
  673. const setSprayLiquidVal = () => {
  674. const val = parseInt(sprayLiquidConfigVal.value)
  675. if (isNaN(val)) {
  676. showFailToast('设置失败,请填写正确参数')
  677. return
  678. }
  679. }
  680. const showkeyboard = ref(false)
  681. const onChange = a => {
  682. formula_id.value = a
  683. }
  684. const handleShowKeyBoard = () => {
  685. showkeyboard.value = true
  686. }
  687. onMounted(() => {
  688. document.addEventListener('click', e => {
  689. let box = document.getElementById('keyboard_formula')
  690. let room = document.getElementById('id_formula')
  691. const arr = [
  692. 'hg-candidate-box-next',
  693. 'hg-candidate-box-btn-active',
  694. 'hg-candidate-box-prev',
  695. 'hg-candidate-box-list-item',
  696. ]
  697. if (
  698. !box?.contains(e.target) &&
  699. e.target != room &&
  700. !arr.includes(Array.from(e.target.classList)[0])
  701. ) {
  702. showkeyboard.value = false
  703. }
  704. })
  705. $('#id_formula').virtualkeyboard()
  706. })
  707. </script>
  708. <style lang="scss" scoped>
  709. .device_container {
  710. box-sizing: border-box;
  711. width: 100%;
  712. height: 580px;
  713. display: grid;
  714. overflow: hidden;
  715. grid-template-columns: repeat(2, 1fr);
  716. row-gap: 20px;
  717. column-gap: 20px;
  718. padding: 20px;
  719. padding-bottom: 180px;
  720. position: relative;
  721. .btns {
  722. position: absolute;
  723. right: 20px;
  724. bottom: 20px;
  725. width: 300px;
  726. height: 68px;
  727. display: flex;
  728. align-items: center;
  729. justify-content: flex-end;
  730. .btn {
  731. width: 111px;
  732. height: 38px;
  733. border-radius: 19px;
  734. background: #06518b;
  735. display: flex;
  736. align-items: center;
  737. justify-content: center;
  738. font-family: Source Han Sans CN;
  739. font-size: 14px;
  740. font-weight: normal;
  741. line-height: normal;
  742. letter-spacing: 0.1em;
  743. color: #ffffff;
  744. }
  745. .ml {
  746. margin-left: 20px;
  747. }
  748. }
  749. .row_wrap {
  750. // width: 726px;
  751. height: 80px;
  752. border-radius: 14px;
  753. background: #f6f6f6;
  754. box-sizing: border-box;
  755. padding: 0 18px 0 40px;
  756. display: flex;
  757. align-items: center;
  758. justify-content: space-between;
  759. .title {
  760. font-family: Zona Pro;
  761. white-space: nowrap;
  762. font-size: 20px;
  763. font-weight: normal;
  764. letter-spacing: 0.06em;
  765. color: #000000;
  766. }
  767. .num {
  768. font-family: Source Han Sans CN;
  769. font-size: 24px;
  770. font-weight: 500;
  771. letter-spacing: 0.1em;
  772. color: #000000;
  773. display: flex;
  774. align-items: center;
  775. .log {
  776. width: 182px;
  777. display: flex;
  778. align-items: center;
  779. justify-content: center;
  780. }
  781. .field_font {
  782. font-size: 26px;
  783. width: 180px;
  784. }
  785. }
  786. .formula_input {
  787. border: none;
  788. height: 38px;
  789. font-size: 22px;
  790. padding: 0 12px;
  791. width: 220px;
  792. }
  793. .btn {
  794. width: 87px;
  795. height: 45px;
  796. border-radius: 23px;
  797. background: #06518b;
  798. font-family: Source Han Sans CN;
  799. font-size: 14px;
  800. font-weight: normal;
  801. letter-spacing: 0.1em;
  802. color: #ffffff;
  803. display: flex;
  804. align-items: center;
  805. justify-content: center;
  806. }
  807. }
  808. .key_wrap {
  809. position: absolute;
  810. right: 97px;
  811. bottom: 0;
  812. height: 245px;
  813. width: 520px;
  814. }
  815. }
  816. </style>