新型管道消毒机前端代码
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.

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