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.

form-builder.vue 26KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843
  1. <template>
  2. <!-- 通用表单 modify by ht
  3. @submit="formSubmit"-->
  4. <form>
  5. <view v-for="(item, index) in formData" :key="index">
  6. <view v-show="!item.hide">
  7. <!-- 是否显示-->
  8. <view
  9. style="min-height: 80rpx"
  10. :class="
  11. item.vertical === 2 ? 'as-layout-vertical' : 'as-layout-horizontal'
  12. "
  13. >
  14. <!-- 标题 -->
  15. <view
  16. class="as-gravity-center-start"
  17. :style="{
  18. minWidth: config.titleWidth + 'rpx',
  19. marginTop: `${item.bg || item.vertical === 2 ? '30rpx' : ''}`,
  20. }"
  21. style="
  22. margin-left: 20rpx;
  23. flex-direction: row;
  24. display: flex;
  25. flex-direction: row;
  26. "
  27. >
  28. <!-- <image class="img-size" :src="item.required ? '../must.png' : ''"></image> -->
  29. <!-- :class="item.vertical === 2 ? 'text-left' : 'text-justify'" -->
  30. <span v-if="item.star" style="color: red">*</span>
  31. <view
  32. class="text-title"
  33. :style="{
  34. color: `#${item.labelColor ?item.labelColor:'333333'}`,
  35. width: '100%',
  36. }"
  37. >
  38. {{ item.title }}
  39. </view>
  40. </view>
  41. <!-- 内容 -->
  42. <view class="as-weight as-gravity-center-start">
  43. <!-- 文本内容 -->
  44. <view
  45. v-if="item.type === 1"
  46. :class="item.bg ? 'bg' : 'notbg'"
  47. class="text-hint"
  48. :style="item.style"
  49. >{{ item[item.value] }}</view
  50. >
  51. <!-- 输入框 -->
  52. <view
  53. v-if="item.type === 2"
  54. style="width: 100%"
  55. :class="item.bg ? 'bg' : 'notbg'"
  56. >
  57. <view class="as-layout-horizontal" style="align-items: center">
  58. <input
  59. :disabled="item.disabled"
  60. v-model="item[item.value]"
  61. :type="item.inputType"
  62. :placeholder="item.hint ? item.hint : '请输入' + item.title"
  63. placeholder-class="text-hint"
  64. class="text"
  65. :maxlength="item.maxlength"
  66. :style="item.style"
  67. style="min-height: 80rpx; word-break: break-all; flex: 1"
  68. @input="inputChange($event, item)"
  69. />
  70. <view v-if="item.btn" class="as-gravity-center">
  71. <!-- 验证码 -->
  72. <verification-code
  73. v-if="item.btnType === 'code'"
  74. :mobile="item.codeValue"
  75. ></verification-code>
  76. <button
  77. v-else
  78. size="mini"
  79. style="background-color: #2ce242; color: #fff"
  80. @click="inputBtnClickHandle(item)"
  81. >
  82. {{ item.btnTitle }}
  83. </button>
  84. </view>
  85. </view>
  86. </view>
  87. <!-- 多项选择器 -->
  88. <view v-if="item.type === 3" :class="item.bg ? 'bg' : 'notbg'">
  89. <checkbox-group
  90. @change="checkboxChange($event, item)"
  91. :disabled="item.disabled"
  92. >
  93. <view
  94. class="as-layout-horizontal"
  95. style="justify-content: right"
  96. >
  97. <label
  98. style="
  99. display: flex;
  100. flex-direction: row;
  101. margin-right: 30rpx;
  102. "
  103. v-for="(itemData, index) in item.itemData"
  104. :key="index"
  105. >
  106. <checkbox
  107. style="transform: scale(0.7)"
  108. :value="itemData.value"
  109. :checked="itemData.checked"
  110. />
  111. <view>{{ itemData.name }}</view>
  112. </label>
  113. </view>
  114. </checkbox-group>
  115. </view>
  116. <!-- 普通选择器 当 range 是一个 Array<Object> 时,通过 range-key 来指定 Object 中 key 的值作为选择器显示内容 :range-key="item[item.value]"-->
  117. <view
  118. v-if="item.type === 4"
  119. style="width: 100%"
  120. :class="item.bg ? 'bg' : 'notbg'"
  121. >
  122. <!-- range[范围] value[初始选择]-->
  123. <view class="as-layout-horizontal" style="align-items: center">
  124. <view
  125. v-if="item.mode === 'custom'"
  126. :class="item[item.value] ? 'text' : 'text-hint'"
  127. style="flex: 1"
  128. @click="emit('pickerCustom', item)"
  129. >
  130. {{
  131. item[item.value]
  132. ? item.itemKey
  133. ? item[item.value][item.itemKey]
  134. : item[item.value]
  135. : item.hint
  136. ? item.hint
  137. : "请选择" + item.title
  138. }}
  139. </view>
  140. <template v-else-if="item.mode === 'search'">
  141. <view
  142. :disabled="item.disabled"
  143. :class="item[item.value] ? 'text' : 'text-hint'"
  144. style="flex: 1"
  145. @click="item.searchPickerVisible = true"
  146. >
  147. {{
  148. item[item.value]
  149. ? item.itemKey
  150. ? item[item.value][item.itemKey]
  151. : item[item.value]
  152. : item.hint
  153. ? item.hint
  154. : "请选择" + item.title
  155. }}
  156. </view>
  157. <search-picker
  158. :visible="item.searchPickerVisible"
  159. :dataSource="item.itemData"
  160. v-model="item[item.value]"
  161. @hidePicker="item.searchPickerVisible = false"
  162. ></search-picker>
  163. </template>
  164. <picker
  165. v-else
  166. :disabled="item.disabled"
  167. :range-key="item.itemKey"
  168. :mode="item.mode ? item.mode : 'selector'"
  169. @change="bindPickerChange($event, item)"
  170. :range="item.itemData"
  171. style="flex: 1"
  172. >
  173. <view :class="item[item.value] ? 'text' : 'text-hint'">
  174. {{
  175. item[item.value]
  176. ? item.itemKey
  177. ? item[item.value][item.itemKey]
  178. : item[item.value]
  179. : item.hint
  180. ? item.hint
  181. : "请选择" + item.title
  182. }}
  183. </view>
  184. </picker>
  185. <image
  186. class="arror"
  187. :src="`${$imgUrl}common/arror-right.png`"
  188. ></image>
  189. </view>
  190. </view>
  191. <!-- 富文本框 -->
  192. <view
  193. v-if="item.type === 5"
  194. style="width: 100%; margin: 30rpx 25rpx 0rpx"
  195. >
  196. <view>
  197. <textarea
  198. :disabled="item.disabled"
  199. v-model="item[item.value]"
  200. @input="textareaInput($event, item)"
  201. :class="item.bg ? 'textarea-bg' : 'notbg'"
  202. placeholder-class="text-hint"
  203. style="width: 100%"
  204. :maxlength="item.maxlength"
  205. :placeholder="item.hint ? item.hint : '请输入' + item.title"
  206. >
  207. </textarea>
  208. <!-- <view v-if="item.maxlength" class="as-gravity-center-end"
  209. style="display: flex;flex-direction: row;margin-top:120rpx;">
  210. <view class="text-hint">{{!item.num ? '0' : item.num}}</view>
  211. <view class="text-hint">/{{item.maxlength ? item.maxlength : 100}}</view>
  212. </view> -->
  213. </view>
  214. </view>
  215. <!-- 图片选择器 :imgWidth="imgWidth ? imgWidth : 0"-->
  216. <view
  217. v-if="item.type === 6"
  218. style="width: 100%"
  219. :class="item.bg ? 'bg' : 'notbg'"
  220. >
  221. <form-image
  222. @backImg="backImg($event, item)"
  223. style="width: 100%"
  224. :retract="40"
  225. ></form-image>
  226. </view>
  227. <!-- 单向选择器 -->
  228. <view
  229. v-if="item.type === 7"
  230. style="width: 100%"
  231. :class="item.bg ? 'bg' : 'notbg'"
  232. >
  233. <radio-group @change="radioChange($event, item)">
  234. <view
  235. class="as-layout-horizontal"
  236. style="justify-content: right"
  237. >
  238. <view style="flex: 1"></view>
  239. <label
  240. style="
  241. display: flex;
  242. flex-direction: row;
  243. margin-left: 30rpx;
  244. "
  245. v-for="(itemData, index) in item.itemData"
  246. :key="index"
  247. >
  248. <radio
  249. style="transform: scale(0.7)"
  250. :value="itemData.value"
  251. :checked="itemData.checked"
  252. color="#2CE242"
  253. />
  254. <view>{{ itemData.name }}</view>
  255. </label>
  256. </view>
  257. </radio-group>
  258. </view>
  259. <!-- 证件照上传 -->
  260. <view
  261. v-if="item.type === 8"
  262. style="width: 100%"
  263. :class="item.bg ? 'bg' : 'notbg'"
  264. >
  265. <view style="margin: 0 40rpx">
  266. <view class="text-error">{{ item.hint }}</view>
  267. <view
  268. class="as-layout-horizontal as-gravity-center"
  269. style="height: 250rpx; margin-top: 20rpx"
  270. >
  271. <view
  272. class="as-layout-vertical"
  273. style="width: 90%; height: 100%"
  274. >
  275. <image
  276. :src="
  277. item.placeholderImg1
  278. ? item.placeholderImg1
  279. : `${$imgUrl}license2.png`
  280. "
  281. style="width: 100%; height: 80%"
  282. @tap="ImageSelection(item, 1)"
  283. ></image>
  284. <view
  285. class="as-gravity-center text-hint"
  286. style="margin-top: 5rpx"
  287. >
  288. {{ item.hint1 }}
  289. </view>
  290. </view>
  291. <view style="width: 40rpx"></view>
  292. <view
  293. class="as-layout-vertical"
  294. style="width: 90%; height: 100%"
  295. >
  296. <image
  297. :src="
  298. item.placeholderImg2
  299. ? item.placeholderImg2
  300. : `${$imgUrl}license2.png`
  301. "
  302. style="width: 100%; height: 80%"
  303. @tap="ImageSelection(item, 2)"
  304. ></image>
  305. <view
  306. class="as-gravity-center text-hint"
  307. style="margin-top: 5rpx"
  308. >
  309. {{ item.hint2 }}
  310. </view>
  311. </view>
  312. </view>
  313. </view>
  314. </view>
  315. <!-- 车牌号输入 -->
  316. <view
  317. v-if="item.type === 9"
  318. style="width: 100%"
  319. :class="item.bg ? 'bg' : 'notbg'"
  320. >
  321. <view style="margin: 20rpx -20rpx 10rpx">
  322. <car-num-ber-input
  323. @numberInputResult="numberInputResult($event, item)"
  324. >
  325. </car-num-ber-input>
  326. </view>
  327. </view>
  328. <!-- 省市区选择 -->
  329. <view
  330. v-if="item.type === 10"
  331. style="width: 100%"
  332. :class="item.bg ? 'bg' : 'notbg'"
  333. >
  334. <view class="as-layout-horizontal" style="align-items: center">
  335. <pick-regions
  336. :defaultRegion="defaultRegionCode"
  337. @getRegion="handleGetRegion($event, item)"
  338. style="flex: 1"
  339. >
  340. <view :class="item[item.value] ? 'text' : 'text-hint'">
  341. {{
  342. item[item.value]
  343. ? item.itemKey
  344. ? item[item.value][item.itemKey]
  345. : item[item.value]
  346. : item.hint
  347. ? item.hint
  348. : "请选择" + item.title
  349. }}
  350. </view>
  351. </pick-regions>
  352. <image
  353. class="arror"
  354. :src="`${$imgUrl}common/arror-right.png`"
  355. ></image>
  356. </view>
  357. </view>
  358. <!-- 车辆图片上传 -->
  359. <view
  360. v-if="item.type === 11"
  361. style="width: 100%"
  362. :class="item.bg ? 'bg' : 'notbg'"
  363. >
  364. <view class="imgs-box as-layout-horizontal">
  365. <view class="img-box" v-for="(img, index) in item.imgList">
  366. <form-image
  367. @backImg="backImg2($event, img, item)"
  368. style="width: 100%"
  369. :imgWidth="120"
  370. :retract="-10"
  371. :showTxt="false"
  372. :count="1"
  373. @removeImg="removeImg2($event, img, item)"
  374. ></form-image>
  375. <view class="img-hint">{{ img.hint }}</view>
  376. </view>
  377. </view>
  378. </view>
  379. </view>
  380. </view>
  381. <view
  382. v-show="index !== formData.length - 1 && !item.underline"
  383. class="as-line3"
  384. style="margin: 0rpx 20rpx 0rpx 20rpx"
  385. ></view>
  386. <view class="divider" v-if="item.divider"></view>
  387. </view>
  388. </view>
  389. <view class="subBtn">
  390. <submit-button
  391. :title="config ? config.submitName : '提交'"
  392. form-type="submit"
  393. @submit="formSubmit"
  394. ></submit-button>
  395. </view>
  396. </form>
  397. </template>
  398. <script setup lang="ts">
  399. import { TypeData, ImgData } from "./tools";
  400. import { request } from "@/utils/network/request.js";
  401. import carNumBerInput from "@/components/car-number-input/car-number-input";
  402. import { pathToBase64 } from "@/utils/util/imageTool.js";
  403. import pickRegions from "@/components/pick-regions/pick-regions.vue";
  404. import { onMounted, ref } from "vue";
  405. const defaultRegionCode = "520115";
  406. const props = defineProps({
  407. formData: {
  408. type: Array as () => Array<TypeData>,
  409. default: () => [],
  410. },
  411. config: {
  412. type: Object,
  413. default: function () {
  414. return {
  415. submitName: "提交", //提交按钮名称
  416. titleWidth: 120, //标题宽度
  417. };
  418. },
  419. },
  420. });
  421. //defineEmits
  422. const emit = defineEmits<{
  423. (e: "submit", content: any): void;
  424. (e: "uploadImg", content: any, item: TypeData, index: Number): void;
  425. (e: "radioChange", event: any, item: TypeData): void;
  426. (e: "addressInfo", content: any): void;
  427. (e: "inputChange", event: any, item: TypeData): void;
  428. (e: "pickerCustom", item: TypeData): void;
  429. }>();
  430. //defineExpose 可宏来显式指定在 <script setup> 组件中要暴露出去的属性。
  431. //普通选择器
  432. function bindPickerChange(e: any, item: TypeData) {
  433. let select = e.target.value;
  434. // #ifdef H5
  435. select = e.detail.value;
  436. // #endif
  437. if (item.mode === "date" || item.mode === "time") {
  438. /* 日期选择器*/
  439. item[item.value] = select;
  440. } else {
  441. /* 普通选择器*/
  442. item[item.value] = item.itemData[select];
  443. }
  444. }
  445. //输入框后按钮点击
  446. const inputBtnClickHandle = (item: TypeData) => {
  447. if (item.btnType === "address") {
  448. //#ifdef MP-WEIXIN
  449. uni.chooseAddress({
  450. success: (res) => {
  451. emit("addressInfo", res);
  452. },
  453. fail: (err) => {
  454. showToast("获取失败!");
  455. },
  456. });
  457. //#endif
  458. } else if (item.btnType === "code") {
  459. //获取验证码
  460. showToast("获取验证码");
  461. }
  462. };
  463. // 获取选择的地区
  464. function handleGetRegion(e: any, item: TypeData) {
  465. item[item.value] = e[0].name + "/" + e[1].name + "/" + e[2].name;
  466. }
  467. //多项选择器
  468. function checkboxChange(e: any, item: TypeData) {
  469. item[item.value] = e.detail.value; /* 赋值*/
  470. }
  471. //单项选择器
  472. function radioChange(e: any, item: TypeData) {
  473. item[item.value] = e.detail.value; /* 赋值*/
  474. emit("radioChange", e, item);
  475. }
  476. //文本输入框
  477. function inputChange(e: Event, item: TypeData) {
  478. emit("inputChange", e, item);
  479. }
  480. //富文本框输入内容
  481. function textareaInput(e: Event, item: TypeData) {
  482. item.num = item[item.value].length;
  483. }
  484. //点击图片按钮
  485. function backImg(e: Event, item: TypeData) {
  486. item[item.value] = e;
  487. }
  488. //点击图片按钮2
  489. function backImg2(e: Event, imgItem: ImgData, item: TypeData) {
  490. imgItem[imgItem.value] = e;
  491. let all = true;
  492. let srcUrl = "";
  493. item.imgList.map((temp) => {
  494. if (!temp[temp.value]) {
  495. all = false;
  496. return;
  497. } else {
  498. srcUrl = srcUrl + temp[temp.value] + ",";
  499. }
  500. });
  501. if (all) {
  502. item[item.value] = srcUrl;
  503. // console.log('--------总图片路径------------');
  504. // console.log(item[item.value])
  505. }
  506. }
  507. //删除图片
  508. const removeImg2 = (e: Event, imgItem: ImgData, item: TypeData) => {
  509. imgItem[imgItem.value] = "";
  510. item[item.value] = "";
  511. };
  512. //车牌输入
  513. function numberInputResult(e: Event, item: TypeData) {
  514. item[item.value] = e;
  515. }
  516. //选择图片按钮
  517. function ImageSelection(item: TypeData, index: number) {
  518. uni.chooseImage({
  519. count: 1, //最多可以选择的文件个数
  520. sourceType: ["camera"], //album 从相册选视频,camera 使用相机拍摄,默认为:['album', 'camera']
  521. success(res: any) {
  522. if (res.tempFiles[0].size > 2000000) {
  523. uni.showToast({
  524. title: "图片大于2M,请重新上传",
  525. icon: "none",
  526. duration: 1500,
  527. });
  528. return;
  529. }
  530. // #ifdef MP-WEIXIN
  531. uni.getFileSystemManager().readFile({
  532. filePath: res.tempFiles[0].tempFilePath, //要读取的文件的路径
  533. encoding: "base64", //编码格式
  534. success: (res) => {
  535. let imgBase64 = res.data;
  536. let reqData = {
  537. imageBase: imgBase64,
  538. accountNum: "qtzl_xcx",
  539. secretKey: "4DE47302-EDC7-41D4-888F-59A79DF4EA46",
  540. };
  541. //上传给服务器
  542. uni.showLoading({
  543. title: "正在加载中...",
  544. mask: true,
  545. });
  546. //文件上传
  547. request("", {
  548. baseUrl: "https://etcfile.etcjz.cn/v1/file/uploadImageBaseFile",
  549. data: reqData,
  550. }).then((content) => {
  551. uni.hideLoading();
  552. if (content.rc != "00") {
  553. uni.showModal({
  554. title: "请求错误",
  555. content: "图片上传失败",
  556. showCancel: false,
  557. confirmText: "取消",
  558. });
  559. }
  560. //处理后的 Data
  561. let data = {
  562. source: 2, //来源
  563. imageBase64: imgBase64,
  564. imageType: index,
  565. imageUrl: content.data.fileUrl,
  566. };
  567. emit("uploadImg", data, item, index);
  568. });
  569. },
  570. fail: (err) => {
  571. console.log("错误提示", err);
  572. },
  573. });
  574. // #endif
  575. // #ifdef H5
  576. pathToBase64(res.tempFilePaths[0]).then((data) => {
  577. let base64 = data.replaceAll("data:image/jpeg;base64,", "");
  578. base64 = base64.replaceAll("data:image/png;base64,", "");
  579. base64 = base64.replaceAll("data:image/jpg;base64,", "");
  580. let reqData = {
  581. imageBase: base64,
  582. accountNum: "qtzl_xcx",
  583. secretKey: "4DE47302-EDC7-41D4-888F-59A79DF4EA46",
  584. };
  585. //上传给服务器
  586. uni.showLoading({
  587. title: "文件上传中...",
  588. mask: true,
  589. });
  590. //文件上传
  591. request("", {
  592. baseUrl: "https://etcfile.etcjz.cn/v1/file/uploadImageBaseFile",
  593. data: reqData,
  594. })
  595. .then((content) => {
  596. console.log("上传结果", content);
  597. uni.hideLoading();
  598. if (content.rc != "00" && content.rc != 0) {
  599. uni.showModal({
  600. title: "请求错误",
  601. content: "图片上传失败",
  602. showCancel: false,
  603. confirmText: "取消",
  604. });
  605. }
  606. //展示缩略图
  607. if (index % 2 != 0) {
  608. //奇数第一张 偶数第二张
  609. item.placeholderImg1 = content.data.fileUrl;
  610. item[item.value.split(",")[0]] = content.data.fileUrl;
  611. } else {
  612. item.placeholderImg2 = content.data.fileUrl;
  613. item[item.value.split(",")[1]] = content.data.fileUrl;
  614. }
  615. //只展示缩略图
  616. if (!item.inputType) {
  617. emit("uploadImg", data, item, index);
  618. } else {
  619. //if(item.type === 1)
  620. //证件OCR识别
  621. uni.showLoading({
  622. title: "证件识别中...",
  623. mask: true,
  624. });
  625. let reqData2 = {
  626. imageDriveBase: "",
  627. imageBase64: base64,
  628. imageType: index % 2 != 0 ? 1 : 2, //1代表身份证正面,2代表反面
  629. imageUrl: content.data.fileUrl,
  630. };
  631. //默认身份证
  632. let code = "IF010012019070410001";
  633. if (item.inputType == "2") {
  634. //2为行驶证
  635. code = "IF010012019070410002";
  636. reqData2.imageBase64 = "";
  637. reqData2.imageDriveBase = base64;
  638. }
  639. request(code, {
  640. data: reqData2,
  641. }).then((ocr) => {
  642. uni.hideLoading();
  643. if (ocr.rc !== "00") {
  644. uni.showModal({
  645. title: "请求错误",
  646. content: "证件识别失败",
  647. showCancel: false,
  648. confirmText: "取消",
  649. });
  650. }
  651. let data = ocr.rd;
  652. //[身份证正面]姓名(name) 住址(address) 出生日期(birthday) 身份证号(idno) 民族(nation)
  653. //[身份证反面]证件机关(agency) 有效起始日期(begindate) 有效结束日期(enddate)
  654. emit("uploadImg", data, item, index);
  655. });
  656. }
  657. })
  658. .catch((e) => {
  659. console.log(">>>>", e);
  660. });
  661. });
  662. // #endif
  663. },
  664. fail(res: any) {
  665. if (!res.authSetting["scope.album"]) {
  666. uni.showModal({
  667. title: "授权失败",
  668. content: "需要从您的相机或相册获取图片,请在设置界面打开相关权限",
  669. success: (res) => {
  670. if (res.confirm) {
  671. uni.openSetting();
  672. }
  673. },
  674. });
  675. }
  676. },
  677. });
  678. }
  679. function showToast(hint: string) {
  680. uni.showToast({
  681. icon: "none",
  682. title: hint,
  683. });
  684. }
  685. //内容提交
  686. const formSubmit = () => {
  687. let content = {};
  688. /* 整理数据对象返回内容 */
  689. for (var i = 0; i < props.formData.length; i++) {
  690. let data = props.formData[i];
  691. /* 时间另外判断 */
  692. if (data.required && !data.hide) {
  693. //隐藏的不用进行判断
  694. let reg = new RegExp(":", "g"); //g代表全部
  695. let newMsg = data.title.replace(reg, "");
  696. if (data.value.indexOf(",") != -1 && data.type === 8) {
  697. if (!data[data.value.split(",")[0]]) {
  698. showToast(data.emptyHint ?data.emptyHint :`${data.hint1}不能为空`);
  699. return;
  700. } else if (!data[data.value.split(",")[1]]) {
  701. showToast(data.emptyHint ? data.emptyHint:`${data.hint2}不能为空`);
  702. return;
  703. }
  704. } else if (!data[data.value]) {
  705. showToast(data.emptyHint ?data.emptyHint: `${newMsg}不能为空`);
  706. return;
  707. }
  708. }
  709. if (data.value.indexOf(",") != -1 && data.type === 8) {
  710. if (data[data.value.split(",")[0]]) {
  711. content[data.value.split(",")[0]] = data[data.value.split(",")[0]];
  712. }
  713. if (data[data.value.split(",")[1]]) {
  714. content[data.value.split(",")[1]] = data[data.value.split(",")[1]];
  715. }
  716. } else if (data.type === 10) {
  717. // for (var i = 0; i < data.value.split(',').length; i++) {
  718. // content[data.value.split(',')[i]] = data[data.value].split('-')[i]
  719. // }
  720. content[data.value] = data[data.value];
  721. } else {
  722. if (data.type === 4 && data.name) {
  723. content[data.value] = data[data.value][data.name];
  724. } else {
  725. content[data.value] = data[data.value];
  726. }
  727. }
  728. }
  729. emit("submit", content);
  730. };
  731. </script>
  732. <style lang="scss" scoped>
  733. .img-size {
  734. width: 30rpx;
  735. height: 30rpx;
  736. }
  737. .notbg {
  738. background-color: #ffffff;
  739. border-radius: 20rpx;
  740. min-height: 80rpx;
  741. line-height: 80rpx;
  742. padding: 8rpx 28rpx;
  743. }
  744. .bg {
  745. background-color: #f1f1f1;
  746. border-radius: 20rpx;
  747. min-height: 80rpx;
  748. line-height: 80rpx;
  749. padding: 0 28rpx;
  750. margin-right: 29rpx;
  751. margin-left: 25rpx;
  752. margin-top: 30rpx;
  753. }
  754. .textarea-bg {
  755. background-color: #f1f1f1;
  756. border-radius: 20rpx;
  757. height: 245rpx;
  758. padding: 30rpx;
  759. box-sizing: border-box;
  760. -moz-box-sizing: border-box;
  761. /*Firefox*/
  762. -webkit-box-sizing: border-box;
  763. /*Safari*/
  764. }
  765. .text-hint {
  766. font-size: 28rpx;
  767. color: #999999;
  768. }
  769. .text-title {
  770. font-size: 28rpx;
  771. color: #333333;
  772. }
  773. .subBtn {
  774. margin: 112rpx 30rpx 30rpx;
  775. }
  776. .divider {
  777. border-bottom: 1px solid #dcdcdc;
  778. }
  779. .arror {
  780. width: 35rpx;
  781. height: 35rpx;
  782. }
  783. .imgs-box {
  784. flex-wrap: wrap;
  785. margin-top: 20rpx;
  786. margin-bottom: -35rpx;
  787. padding-right: 110rpx;
  788. justify-content: space-between;
  789. .img-box {
  790. margin-bottom: 35rpx;
  791. }
  792. .img-hint {
  793. font-size: 24rpx;
  794. color: #333333;
  795. text-align: center;
  796. }
  797. }
  798. </style>