edit.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. <template>
  2. <ion-page>
  3. <ion-header class="header-theme2">
  4. <ion-toolbar>
  5. <ion-buttons slot="start">
  6. <ion-icon :icon="arrowBackOutline" @click="onBack"></ion-icon>
  7. </ion-buttons>
  8. <ion-title>
  9. 企业信息录入
  10. </ion-title>
  11. </ion-toolbar>
  12. </ion-header>
  13. <ion-content>
  14. <div class="stepFlex">
  15. <div v-for="(record,key) in stepList" :key="key" class="stepFlex-item">
  16. <div
  17. :class="[(record.val < curStepData?.statusVal || curStepData?.statusVal == stepList.val) ? 'greenCircle' :record.val == curStepData?.statusVal ? 'now' : 'grayCircle']"></div>
  18. <div v-if="key !== stepList.length - 1"
  19. :class="[record.val < curStepData?.statusVal ? 'greenLine' : 'grayLine']"></div>
  20. <div class="stepFlex-item-label">
  21. <p class="stepFlex-item-label-title">{{ record.title }}</p>
  22. <p class="stepFlex-item-label-desc">{{ record.desc }}</p>
  23. </div>
  24. </div>
  25. </div>
  26. <form autocomplete="off">
  27. <div class="bw-vue-form">
  28. <div class="form-title">基本信息</div>
  29. <div class="form-input">
  30. <ion-label>企业名称<span class="danger">*</span></ion-label>
  31. <ion-input placeholder="请输入企业名称" label-placement="stacked" :clear-input="true"
  32. v-model="dataModel.companyName" class="custom">
  33. </ion-input>
  34. <!-- <ion-note slot="error">企业名称不能为空</ion-note>-->
  35. </div>
  36. <div class="form-input">
  37. <ion-label>统一信用代码<span class="danger">*</span></ion-label>
  38. <ion-input placeholder="请输入统一信用代码" label-placement="stacked" :clear-input="true"
  39. v-model="dataModel.companyCode" class="custom">
  40. </ion-input>
  41. <!-- <ion-note slot="error">统一信用代码不能为空</ion-note>-->
  42. </div>
  43. <div class="form-select">
  44. <ion-label>所属街道<span class="danger">*</span></ion-label>
  45. <!-- <ion-multi-picker item-content v-model="dataModel.regionCode"-->
  46. <!-- :placeholder="defaultAddText" :multiPickerColumns="cityColumns"-->
  47. <!-- cancelText="取消" doneText="选择">-->
  48. <!-- </ion-multi-picker>-->
  49. <ion-select interface="action-sheet" placeholder="请选择所属街道" cancel-text="取消"
  50. id="streetCode" v-model="dataModel.streetCode" style="width: 100%;text-align: left;">
  51. <ion-select-option v-for="(record,key) in streetList" :key="key"
  52. v-model:value="record.code">
  53. {{ record.name }}
  54. </ion-select-option>
  55. </ion-select>
  56. </div>
  57. <div class="form-select">
  58. <ion-label>所属驿站<span class="danger">*</span></ion-label>
  59. <ion-select id="siteID" name="siteID" cancel-text="取消" v-model="dataModel.siteID"
  60. interface="action-sheet" placeholder="请选择服务驿站" style="width: 100%;text-align: left;">
  61. <ion-select-option v-for="(record,key) in siteList" :key="key" v-model:value="record.siteID">
  62. {{ record.siteName }}
  63. </ion-select-option>
  64. </ion-select>
  65. <!-- <ion-note slot="error">服务驿站不能为空</ion-note>-->
  66. </div>
  67. <div class="form-input">
  68. <ion-label>办公地址<span class="danger">*</span></ion-label>
  69. <ion-textarea placeholder="请输入办公地址" label-placement="stacked" :rows="3" :clear-input="true"
  70. v-model="dataModel.companyAddress" class="custom" style="border-bottom: 1px solid #fff2e8;">
  71. </ion-textarea>
  72. <!-- <ion-note slot="error">办公地址不能为空</ion-note>-->
  73. </div>
  74. <div class="form-input">
  75. <ion-label>企业联系人<span class="danger">*</span></ion-label>
  76. <ion-input placeholder="请输入企业联系人" label-placement="stacked" :clear-input="true"
  77. v-model="dataModel.userName" class="custom">
  78. </ion-input>
  79. <!-- <ion-note slot="error">企业联系人不能为空</ion-note>-->
  80. </div>
  81. <div class="form-input">
  82. <ion-label>联系电话<span class="danger">*</span></ion-label>
  83. <ion-input placeholder="请输入联系电话" label-placement="stacked" :clear-input="true"
  84. v-model="dataModel.userMobile" class="custom">
  85. </ion-input>
  86. <!-- <ion-note slot="error">企业联系电话不能为空</ion-note>-->
  87. </div>
  88. <div class="form-select">
  89. <ion-label>企业状态<span class="danger">*</span></ion-label>
  90. <ion-select id="recordStatus" name="recordStatus" cancel-text="取消" v-model="dataModel.recordStatus"
  91. interface="action-sheet" placeholder="请选择企业状态" style="width: 100%;text-align: left;">
  92. <ion-select-option v-for="(record,key) in companyStatusList" :key="key"
  93. v-model:value="record.value">
  94. {{ record.name }}
  95. </ion-select-option>
  96. </ion-select>
  97. <!-- <ion-note slot="error">企业状态不能为空</ion-note>-->
  98. </div>
  99. <div class="form-select">
  100. <ion-label>是否缺工<span class="danger">*</span></ion-label>
  101. <ion-select id="isShortAge" name="isShortAge" cancel-text="取消" v-model="dataModel.isShortage"
  102. interface="action-sheet" placeholder="请选择是否缺工" style="width: 100%;text-align: left;">
  103. <ion-select-option v-for="(record,key) in shortAgeTypeList" :key="key"
  104. v-model:value="record.value">
  105. {{ record.name }}
  106. </ion-select-option>
  107. </ion-select>
  108. <!-- <ion-note slot="error">是否缺工不能为空</ion-note>-->
  109. </div>
  110. <div class="form-title">
  111. 其他信息
  112. <div style="float:right;">
  113. <ion-icon :icon="chevronDownOutline" @click="isShow=!isShow" v-show="!isShow"
  114. style="font-size: 24px;"></ion-icon>
  115. <ion-icon :icon="chevronUpOutline" @click="isShow=!isShow" v-show="isShow"
  116. style="font-size: 24px;"></ion-icon>
  117. </div>
  118. </div>
  119. <div v-show="isShow" >
  120. <div class="form-input">
  121. <ion-label>法定代表人(负责人)</ion-label>
  122. <ion-input placeholder="请输入法定代表人" label-placement="stacked" :clear-input="true"
  123. v-model="dataModel.frName" class="custom">
  124. </ion-input>
  125. </div>
  126. <div class="form-input">
  127. <ion-label>营业执照有效期</ion-label>
  128. <div>
  129. <ion-radio v-model:checked="isLongDate" justify="start" labelPlacement="end"
  130. @click="changeLongDate" style="height:30px;">至长期</ion-radio>
  131. <ion-datetime-button datetime="validDate" style="position:relative;right:110px;"></ion-datetime-button>
  132. <ion-modal :keep-contents-mounted="true" >
  133. <ion-datetime id="validDate" name="validDate" placeholder="营业执照有效期"
  134. v-model="dataModel.validDate" :prefer-wheel="true" @ionChange="changeValidDate"
  135. dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
  136. :show-default-buttons="true" >
  137. </ion-datetime>
  138. </ion-modal>
  139. </div>
  140. </div>
  141. <div class="form-input" >
  142. <ion-label>企业邮箱</ion-label>
  143. <ion-input placeholder="请输入企业邮箱" label-placement="stacked" :clear-input="true"
  144. v-model="dataModel.companyEmail" class="custom">
  145. </ion-input>
  146. </div>
  147. <div class="form-select">
  148. <ion-label>企业分类</ion-label>
  149. <ion-select interface="action-sheet" placeholder="请选择企业分类" cancel-text="取消"
  150. id="companyType" v-model="dataModel.companyType" style="width: 100%;text-align: left;">
  151. <ion-select-option v-for="(record,key) in companyTypeList" :key="key"
  152. v-model:value="record.code">
  153. {{ record.name }}
  154. </ion-select-option>
  155. </ion-select>
  156. </div>
  157. <div class="form-select">
  158. <ion-label>企业规模</ion-label>
  159. <ion-select interface="action-sheet" placeholder="请选择企业规模" cancel-text="取消"
  160. id="companyModel" v-model="dataModel.companyModel" style="width: 100%;text-align: left;">
  161. <ion-select-option v-for="(record,key) in companyModelList" :key="key"
  162. v-model:value="record.value" style="width:100%;text-align: left;">
  163. {{ record.name }}
  164. </ion-select-option>
  165. </ion-select>
  166. </div>
  167. <div class="form-input">
  168. <ion-label>用工情况(人)</ion-label>
  169. <ion-input type="number" placeholder="请输入用工人数" label-placement="stacked" :clear-input="true"
  170. v-model="dataModel.workSituation" class="custom">
  171. </ion-input>
  172. </div>
  173. <div class="form-input">
  174. <ion-label>参保人数(人)</ion-label>
  175. <ion-input type="number" placeholder="请输入参保人数" label-placement="stacked" :clear-input="true"
  176. v-model="dataModel.insuredCount" class="custom">
  177. </ion-input>
  178. </div>
  179. <div class="form-input">
  180. <ion-label>经营范围</ion-label>
  181. <ion-textarea placeholder="请输入经营范围" :rows="3" label-placement="stacked" :clear-input="true"
  182. v-model="dataModel.businScope" class="custom" style="border-bottom: 1px solid #fff2e8;">
  183. </ion-textarea>
  184. </div>
  185. <div class="form-input">
  186. <ion-label>企业简介</ion-label>
  187. <ion-textarea placeholder="请输入企业简介" :rows="3" label-placement="stacked" :clear-input="true"
  188. v-model="dataModel.companyDesc" class="custom" style="border-bottom: 1px solid #fff2e8;">
  189. </ion-textarea>
  190. </div>
  191. </div>
  192. </div>
  193. </form>
  194. </ion-content>
  195. <ion-footer>
  196. <ion-toolbar>
  197. <ion-button style="width:100%;" @click="onNext">保存并下一步</ion-button>
  198. </ion-toolbar>
  199. </ion-footer>
  200. </ion-page>
  201. </template>
  202. <script lang="ts">
  203. import {defineComponent, ref, reactive, computed, toRefs} from "vue";
  204. import {chevronDownOutline, chevronUpOutline, arrowBackOutline} from 'ionicons/icons';
  205. import {getRegionList, getSiteList, getStreeList} from '@/api/company/index'
  206. import {useRoute,useRouter} from "vue-router";
  207. import {alertController, IonIcon, onIonViewDidEnter} from "@ionic/vue";
  208. import {useVuelidate} from "@vuelidate/core";
  209. import {getCompanyById,saveCompanyInfo} from "@/api/company";
  210. import {required} from "@vuelidate/validators";
  211. import {getSysDictionaryList} from "@/api/system/dictionary";
  212. import dayjs from "dayjs";
  213. // import {MultiPickerModule} from 'ion-multi-picker';
  214. interface StepParams{
  215. name: string,
  216. statusVal: number
  217. }
  218. export default defineComponent({
  219. name: 'CompanyEdit',
  220. // components: {MultiPickerModule},
  221. setup() {
  222. const route = useRoute();
  223. const router = useRouter();
  224. const isAllowCommit = ref(true);
  225. const curStepData = ref<StepParams>({
  226. name:"",
  227. statusVal: 1
  228. });
  229. const isAdd = ref<any>(true);
  230. const isShow = ref<any>(false);
  231. const isLongDate = ref<any>(false);
  232. const formState = reactive({
  233. dataModel: {
  234. companyID:null,
  235. companyCode: '',
  236. companyName: null,
  237. siteID: null,
  238. companyAddress: null,
  239. userName: null,
  240. userMobile: '',
  241. recordStatus: null,
  242. isShortage: null,
  243. frName: null,
  244. validDate: dayjs().format("YYYY-MM-DD"),
  245. companyEmail: '',
  246. companyType: null,
  247. companyModel: null,
  248. regionCode: null,
  249. streetCode: null,
  250. workSituation: null,
  251. insuredCount: null,
  252. businScope: null,
  253. companyDesc: null
  254. }});
  255. const stepList = ref([
  256. {title: '基础信息', desc: '企业基础信息', val: 1},
  257. {title: '岗位信息', desc: '企业岗位信息', val: 2}
  258. ]);
  259. const companyTypeList = ref<any>([]);
  260. const companyModelList = ref<any>([]);
  261. const regionList = ref<any>([]);
  262. const streetList = ref<any>([]);
  263. const siteList = ref<any>([]);
  264. const companyStatusList = [
  265. {value: 1, name: '在营'},
  266. {value: 0, name: '关闭'},
  267. ];
  268. const shortAgeTypeList = [
  269. {value: 1, name: '是'},
  270. {value: 0, name: '否'},
  271. ];
  272. // /** 选择的区域 */
  273. // const regionChecked= ref<string>('');
  274. // // /** 选择的街道 */
  275. // const streetChecked= ref<string>('');
  276. //
  277. // // /** 编辑传入的地址 */
  278. // const defaultAddText= ref<string>('');
  279. //
  280. // const allData = ref<any>({
  281. // province: [],
  282. // city: [],
  283. // region: [{name:"",code:""}],
  284. // street: [{name:"",code:""}]
  285. // });
  286. //
  287. // //获取选定的省市区
  288. // const getCityArea = () =>{
  289. // // 城市选中后默认为字符串,并且获取到的是编码不是直接内容,为了把省份 城市 区域分为三个字段,所以把字符串分割为数组,在每个单独赋值
  290. // let cities = cityDefault.value.split(' ');
  291. // allData.value.province = provinceColumns.value;
  292. // allData.value.city = cityColumns.value;
  293. // allData.value.region = regionColumns.value[0].options;
  294. // allData.value.street = streetColumns.value[0].options;
  295. //
  296. // /* 循环城市数组,通过获取到的省市区编码来查询对应的文字内容 **/
  297. // allData.value.region.map(v=>{
  298. // if(v.code == cities[0]){
  299. // regionChecked.value = v.name; /* 县区 */
  300. // }
  301. // })
  302. // allData.value.street.map(v => {
  303. // if (v.code == cities[1]) {
  304. // streetChecked.value = v.name; /* 街道 */
  305. // }
  306. // })
  307. // }
  308. const getCompanyModelList = async function(){
  309. const companyModelResult :any = await getSysDictionaryList("CompanyModel");
  310. companyModelList.value = companyModelResult;
  311. }
  312. const rules = computed(() => {
  313. return {
  314. dataModel: {
  315. companyCode: {required},
  316. companyName: {required},
  317. siteID: {required},
  318. companyAddress: {required},
  319. userName: {required},
  320. userMobile: {required},
  321. recordStatus: {required},
  322. isShortage: {required},
  323. }
  324. }
  325. });
  326. const v$ = useVuelidate(rules, formState);
  327. const changeLongDate = ()=>{
  328. isLongDate.value = true;
  329. formState.dataModel.validDate = "2099-12-31T00:00:00.000+08:00";
  330. };
  331. const changeValidDate = () => {
  332. isLongDate.value = false;
  333. };
  334. const companyCodeValidate = ()=>{
  335. isAllowCommit.value = true;
  336. const codeReg = /^[0-9A-Z]+$/;
  337. console.log(formState.dataModel.companyCode);
  338. if(formState.dataModel.companyCode.length != 18 || !codeReg.test(formState.dataModel.companyCode)){
  339. presentAlert("输入的信用代码有误!");
  340. isAllowCommit.value = false;
  341. }else{
  342. let aCode;
  343. let aCodeValue;
  344. let total = 0;
  345. const weightedFactors = [1,3,9,27,19,26,16,17,20,29,25,13,8,24,10,30,28];
  346. const str = '0123456789ABCDEFGHJKLMNPQRTUWXY';
  347. for(let i =0;i < formState.dataModel.companyCode.length-1;i++){
  348. aCode = formState.dataModel.companyCode.substring(i,i+1);
  349. aCodeValue = str.indexOf(aCode);
  350. total += aCodeValue * weightedFactors[i];
  351. }
  352. let logicCheckCode = 31 - total % 31;
  353. if(logicCheckCode == 31){
  354. logicCheckCode = 0;
  355. }
  356. const Str = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,T,U,W,X,Y";
  357. const Array_Str = Str.split(',');
  358. const correctCodeStr = Array_Str[logicCheckCode];
  359. console.log("正确的校验码是",correctCodeStr);
  360. const currentCodeStr = formState.dataModel.companyCode.substring(17, 18);
  361. if (correctCodeStr != currentCodeStr) {
  362. presentAlert('输入的统一信用代码无效!');
  363. isAllowCommit.value = false;
  364. }
  365. }
  366. }
  367. const inputDataValidate = () =>{
  368. const mobileReg = /^1[3|4|5|6|7|8|9]\d{9}$/;
  369. if(!mobileReg.test(formState.dataModel.userMobile)){
  370. presentAlert("输入的联系电话有误!");
  371. isAllowCommit.value = false;
  372. }
  373. const emailReg = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/;
  374. // 这里由于企业邮箱非必填所以先判断是否填写了企业邮箱
  375. if(formState.dataModel.companyEmail!=null&&formState.dataModel.companyEmail!=""){
  376. if(!emailReg.test(formState.dataModel.companyEmail)){
  377. presentAlert("输入的企业邮箱有误!");
  378. isAllowCommit.value = false;
  379. }
  380. }
  381. };
  382. const onNext = async () => {
  383. const isFormCorrect = await v$.value.$validate();
  384. if (!isFormCorrect) {
  385. await presentAlert('请输入完整信息!');
  386. return null;
  387. }
  388. companyCodeValidate();
  389. inputDataValidate();
  390. if(isAllowCommit.value){
  391. saveCompanyInfo(formState.dataModel).then(result => {
  392. if (result) {
  393. router.push({path: './postList', query: {reload:1,id:formState.dataModel.companyID,status:3}});
  394. }
  395. });
  396. }
  397. };
  398. const onBack=()=>{
  399. router.push({path: './list', query: {reload:1}});
  400. }
  401. const getRegionListData = () => {
  402. getRegionList({}).then(data => {
  403. regionList.value = data;
  404. });
  405. }
  406. const getStreetListData = (code: any) => {
  407. getStreeList({code: code}).then(data => {
  408. streetList.value = data;
  409. });
  410. }
  411. const getSiteListData = () => {
  412. getSiteList({}).then(data => {
  413. siteList.value = data;
  414. });
  415. }
  416. const changeCity = () => {
  417. console.log(formState.dataModel.regionCode);
  418. if (formState.dataModel.regionCode)
  419. getStreetListData(formState.dataModel.regionCode);
  420. }
  421. const loadData = async (companyID: any,status:any) => {
  422. curStepData.value.statusVal = status;
  423. isAdd.value = companyID == null;
  424. const reqData = await getCompanyById(companyID);
  425. formState.dataModel = reqData;
  426. isLongDate.value = formState.dataModel.validDate == "2099-12-31T00:00:00.000+08:00";
  427. console.log('dataModel',formState.dataModel);
  428. console.log('isAdd',isAdd.value);
  429. if(formState.dataModel.regionCode!=null) getStreetListData(formState.dataModel.regionCode);
  430. };
  431. /* watch(() => route.query, () => {
  432. if (route.query.reload) {
  433. loadData(route.query.id,route.query.status);
  434. }
  435. });*/
  436. const reload = (companyID:any,status:any) => {
  437. isAdd.value = true;
  438. isShow.value = false;
  439. loadData(companyID,status);
  440. }
  441. onIonViewDidEnter(() => {
  442. if (route.query.reload) {
  443. reload(route.query.id,route.query.status);
  444. }
  445. });
  446. const presentAlert = async (message: string) => {
  447. const alert = await alertController.create({
  448. header: '错误!',
  449. message: message,
  450. buttons: [
  451. '确定'
  452. ],
  453. });
  454. await alert.present();
  455. }
  456. return {
  457. ...toRefs(formState),
  458. arrowBackOutline,
  459. chevronDownOutline,
  460. chevronUpOutline,
  461. route,
  462. router,
  463. isShow,
  464. v$,
  465. isLongDate,
  466. curStepData,
  467. stepList,
  468. companyTypeList,
  469. siteList,
  470. regionList,
  471. streetList,
  472. shortAgeTypeList,
  473. companyStatusList,
  474. companyModelList,
  475. onNext,
  476. onBack,
  477. getCompanyModelList,
  478. getRegionListData,
  479. getSiteListData,
  480. changeCity,
  481. changeLongDate,
  482. changeValidDate,
  483. loadData,
  484. }
  485. },mounted(){
  486. this.getCompanyModelList();
  487. this.getRegionListData();
  488. this.getSiteListData();
  489. }
  490. });
  491. </script>
  492. <style lang="less">
  493. .custom{
  494. --placeholder-color: gray;
  495. --placeholder-opacity: 0.5;
  496. }
  497. .title-item{
  498. margin-left: 15px;
  499. color:#1c3d70 !important;
  500. font-size: 14px !important;
  501. font-weight: bold;
  502. }
  503. ion-item {
  504. --border-width: 0;
  505. --border-style: none;
  506. ion-label, ion-input, ion-select, ion-datetime-button {
  507. font-size: 14px !important;
  508. }
  509. }
  510. .stepFlex {
  511. margin: 0;
  512. display: flex;
  513. width: 100%;
  514. .stepFlex-item {
  515. position: relative;
  516. flex: 1;
  517. text-align: center;
  518. margin-top: -10px;
  519. .stepFlex-item-label {
  520. padding-top: 60px;
  521. font-size: 14px;
  522. .stepFlex-item-label-title {
  523. margin-top: 30px;
  524. }
  525. .stepFlex-item-label-desc {
  526. margin-top: 5px;
  527. color: #b9b9bd;
  528. }
  529. }
  530. }
  531. .greenCircle {
  532. top: calc(50% - 15px);
  533. left: calc(50% - 4px);
  534. position: absolute;
  535. z-index: 2;
  536. width: 10px;
  537. height: 10px;
  538. border-radius: 50%;
  539. background-color: #31A2FE;
  540. }
  541. .now {
  542. top: calc(50% - 18px);
  543. left: calc(50% - 8px);
  544. position: absolute;
  545. z-index: 3;
  546. width: 16px;
  547. height: 16px;
  548. border-radius: 50%;
  549. background-color: #31A2FE;
  550. border: 4px solid #c5e8f9;
  551. }
  552. .grayCircle {
  553. top: calc(50% - 15px);
  554. left: calc(50% - 4px);
  555. position: absolute;
  556. z-index: 2;
  557. width: 10px;
  558. height: 10px;
  559. border-radius: 50%;
  560. background-color: #ccc;
  561. }
  562. .greenLine {
  563. width: 100%;
  564. top: calc(50% - 11px);
  565. left: calc(50% - 2px);
  566. height: 2px;
  567. background-color: #31A2FE;
  568. position: absolute;
  569. }
  570. .grayLine {
  571. height: 0;
  572. border: 1px dashed #ccc;
  573. width: 100%;
  574. top: calc(50% - 11px);
  575. left: calc(50% - 2px);
  576. position: absolute;
  577. }
  578. }
  579. </style>