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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846
  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" mode="aspectFill" :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" mode="aspectFill"
  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. mode="aspectFill"
  284. ></image>
  285. <view
  286. class="as-gravity-center text-hint"
  287. style="margin-top: 5rpx"
  288. >
  289. {{ item.hint1 }}
  290. </view>
  291. </view>
  292. <view style="width: 40rpx"></view>
  293. <view
  294. class="as-layout-vertical"
  295. style="width: 90%; height: 100%"
  296. >
  297. <image
  298. :src="
  299. item.placeholderImg2
  300. ? item.placeholderImg2
  301. : `${$imgUrl}license2.png`
  302. "
  303. style="width: 100%; height: 80%"
  304. @tap="ImageSelection(item, 2)"
  305. mode="aspectFill"
  306. ></image>
  307. <view
  308. class="as-gravity-center text-hint"
  309. style="margin-top: 5rpx"
  310. >
  311. {{ item.hint2 }}
  312. </view>
  313. </view>
  314. </view>
  315. </view>
  316. </view>
  317. <!-- 车牌号输入 -->
  318. <view
  319. v-if="item.type === 9"
  320. style="width: 100%"
  321. :class="item.bg ? 'bg' : 'notbg'"
  322. >
  323. <view style="margin: 20rpx -20rpx 10rpx">
  324. <car-num-ber-input
  325. @numberInputResult="numberInputResult($event, item)"
  326. >
  327. </car-num-ber-input>
  328. </view>
  329. </view>
  330. <!-- 省市区选择 -->
  331. <view
  332. v-if="item.type === 10"
  333. style="width: 100%"
  334. :class="item.bg ? 'bg' : 'notbg'"
  335. >
  336. <view class="as-layout-horizontal" style="align-items: center">
  337. <pick-regions
  338. :defaultRegion="defaultRegionCode"
  339. @getRegion="handleGetRegion($event, item)"
  340. style="flex: 1"
  341. >
  342. <view :class="item[item.value] ? 'text' : 'text-hint'">
  343. {{
  344. item[item.value]
  345. ? item.itemKey
  346. ? item[item.value][item.itemKey]
  347. : item[item.value]
  348. : item.hint
  349. ? item.hint
  350. : "请选择" + item.title
  351. }}
  352. </view>
  353. </pick-regions>
  354. <image
  355. class="arror"
  356. :src="`${$imgUrl}common/arror-right.png`"
  357. mode="aspectFill"
  358. ></image>
  359. </view>
  360. </view>
  361. <!-- 车辆图片上传 -->
  362. <view
  363. v-if="item.type === 11"
  364. style="width: 100%"
  365. :class="item.bg ? 'bg' : 'notbg'"
  366. >
  367. <view class="imgs-box as-layout-horizontal">
  368. <view class="img-box" v-for="(img, index) in item.imgList">
  369. <form-image
  370. @backImg="backImg2($event, img, item)"
  371. style="width: 100%"
  372. :imgWidth="120"
  373. :retract="-10"
  374. :showTxt="false"
  375. :count="1"
  376. @removeImg="removeImg2($event, img, item)"
  377. ></form-image>
  378. <view class="img-hint">{{ img.hint }}</view>
  379. </view>
  380. </view>
  381. </view>
  382. </view>
  383. </view>
  384. <view
  385. v-show="index !== formData.length - 1 && !item.underline"
  386. class="as-line3"
  387. style="margin: 0rpx 20rpx 0rpx 20rpx"
  388. ></view>
  389. <view class="divider" v-if="item.divider"></view>
  390. </view>
  391. </view>
  392. <view class="subBtn">
  393. <submit-button
  394. :title="config ? config.submitName : '提交'"
  395. form-type="submit"
  396. @submit="formSubmit"
  397. ></submit-button>
  398. </view>
  399. </form>
  400. </template>
  401. <script setup lang="ts">
  402. import { TypeData, ImgData } from "./tools";
  403. import { request } from "@/utils/network/request.js";
  404. import carNumBerInput from "@/components/car-number-input/car-number-input";
  405. import { pathToBase64 } from "@/utils/util/imageTool.js";
  406. import pickRegions from "@/components/pick-regions/pick-regions.vue";
  407. import { onMounted, ref } from "vue";
  408. const defaultRegionCode = "520115";
  409. const props = defineProps({
  410. formData: {
  411. type: Array as () => Array<TypeData>,
  412. default: () => [],
  413. },
  414. config: {
  415. type: Object,
  416. default: function () {
  417. return {
  418. submitName: "提交", //提交按钮名称
  419. titleWidth: 120, //标题宽度
  420. };
  421. },
  422. },
  423. });
  424. //defineEmits
  425. const emit = defineEmits<{
  426. (e: "submit", content: any): void;
  427. (e: "uploadImg", content: any, item: TypeData, index: Number): void;
  428. (e: "radioChange", event: any, item: TypeData): void;
  429. (e: "addressInfo", content: any): void;
  430. (e: "inputChange", event: any, item: TypeData): void;
  431. (e: "pickerCustom", item: TypeData): void;
  432. }>();
  433. //defineExpose 可宏来显式指定在 <script setup> 组件中要暴露出去的属性。
  434. //普通选择器
  435. function bindPickerChange(e: any, item: TypeData) {
  436. let select = e.target.value;
  437. // #ifdef H5
  438. select = e.detail.value;
  439. // #endif
  440. if (item.mode === "date" || item.mode === "time") {
  441. /* 日期选择器*/
  442. item[item.value] = select;
  443. } else {
  444. /* 普通选择器*/
  445. item[item.value] = item.itemData[select];
  446. }
  447. }
  448. //输入框后按钮点击
  449. const inputBtnClickHandle = (item: TypeData) => {
  450. if (item.btnType === "address") {
  451. //#ifdef MP-WEIXIN
  452. uni.chooseAddress({
  453. success: (res) => {
  454. emit("addressInfo", res);
  455. },
  456. fail: (err) => {
  457. showToast("获取失败!");
  458. },
  459. });
  460. //#endif
  461. } else if (item.btnType === "code") {
  462. //获取验证码
  463. showToast("获取验证码");
  464. }
  465. };
  466. // 获取选择的地区
  467. function handleGetRegion(e: any, item: TypeData) {
  468. item[item.value] = e[0].name + "/" + e[1].name + "/" + e[2].name;
  469. }
  470. //多项选择器
  471. function checkboxChange(e: any, item: TypeData) {
  472. item[item.value] = e.detail.value; /* 赋值*/
  473. }
  474. //单项选择器
  475. function radioChange(e: any, item: TypeData) {
  476. item[item.value] = e.detail.value; /* 赋值*/
  477. emit("radioChange", e, item);
  478. }
  479. //文本输入框
  480. function inputChange(e: Event, item: TypeData) {
  481. emit("inputChange", e, item);
  482. }
  483. //富文本框输入内容
  484. function textareaInput(e: Event, item: TypeData) {
  485. item.num = item[item.value].length;
  486. }
  487. //点击图片按钮
  488. function backImg(e: Event, item: TypeData) {
  489. item[item.value] = e;
  490. }
  491. //点击图片按钮2
  492. function backImg2(e: Event, imgItem: ImgData, item: TypeData) {
  493. imgItem[imgItem.value] = e;
  494. let all = true;
  495. let srcUrl = "";
  496. item.imgList.map((temp) => {
  497. if (!temp[temp.value]) {
  498. all = false;
  499. return;
  500. } else {
  501. srcUrl = srcUrl + temp[temp.value] + ",";
  502. }
  503. });
  504. if (all) {
  505. item[item.value] = srcUrl;
  506. // console.log('--------总图片路径------------');
  507. // console.log(item[item.value])
  508. }
  509. }
  510. //删除图片
  511. const removeImg2 = (e: Event, imgItem: ImgData, item: TypeData) => {
  512. imgItem[imgItem.value] = "";
  513. item[item.value] = "";
  514. };
  515. //车牌输入
  516. function numberInputResult(e: Event, item: TypeData) {
  517. item[item.value] = e;
  518. }
  519. //选择图片按钮
  520. function ImageSelection(item: TypeData, index: number) {
  521. uni.chooseImage({
  522. count: 1, //最多可以选择的文件个数
  523. sourceType: ["camera"], //album 从相册选视频,camera 使用相机拍摄,默认为:['album', 'camera']
  524. success(res: any) {
  525. if (res.tempFiles[0].size > 2000000) {
  526. uni.showToast({
  527. title: "图片大于2M,请重新上传",
  528. icon: "none",
  529. duration: 1500,
  530. });
  531. return;
  532. }
  533. // #ifdef MP-WEIXIN
  534. uni.getFileSystemManager().readFile({
  535. filePath: res.tempFiles[0].tempFilePath, //要读取的文件的路径
  536. encoding: "base64", //编码格式
  537. success: (res) => {
  538. let imgBase64 = res.data;
  539. let reqData = {
  540. imageBase: imgBase64,
  541. accountNum: "qtzl_xcx",
  542. secretKey: "4DE47302-EDC7-41D4-888F-59A79DF4EA46",
  543. };
  544. //上传给服务器
  545. uni.showLoading({
  546. title: "正在加载中...",
  547. mask: true,
  548. });
  549. //文件上传
  550. request("", {
  551. baseUrl: "https://etcfile.etcjz.cn/v1/file/uploadImageBaseFile",
  552. data: reqData,
  553. }).then((content) => {
  554. uni.hideLoading();
  555. if (content.rc != "00") {
  556. uni.showModal({
  557. title: "请求错误",
  558. content: "图片上传失败",
  559. showCancel: false,
  560. confirmText: "取消",
  561. });
  562. }
  563. //处理后的 Data
  564. let data = {
  565. source: 2, //来源
  566. imageBase64: imgBase64,
  567. imageType: index,
  568. imageUrl: content.data.fileUrl,
  569. };
  570. emit("uploadImg", data, item, index);
  571. });
  572. },
  573. fail: (err) => {
  574. console.log("错误提示", err);
  575. },
  576. });
  577. // #endif
  578. // #ifdef H5
  579. pathToBase64(res.tempFilePaths[0]).then((data) => {
  580. let base64 = data.replaceAll("data:image/jpeg;base64,", "");
  581. base64 = base64.replaceAll("data:image/png;base64,", "");
  582. base64 = base64.replaceAll("data:image/jpg;base64,", "");
  583. let reqData = {
  584. imageBase: base64,
  585. accountNum: "qtzl_xcx",
  586. secretKey: "4DE47302-EDC7-41D4-888F-59A79DF4EA46",
  587. };
  588. //上传给服务器
  589. uni.showLoading({
  590. title: "文件上传中...",
  591. mask: true,
  592. });
  593. //文件上传
  594. request("", {
  595. baseUrl: "https://etcfile.etcjz.cn/v1/file/uploadImageBaseFile",
  596. data: reqData,
  597. })
  598. .then((content) => {
  599. console.log("上传结果", content);
  600. uni.hideLoading();
  601. if (content.rc != "00" && content.rc != 0) {
  602. uni.showModal({
  603. title: "请求错误",
  604. content: "图片上传失败",
  605. showCancel: false,
  606. confirmText: "取消",
  607. });
  608. }
  609. //展示缩略图
  610. if (index % 2 != 0) {
  611. //奇数第一张 偶数第二张
  612. item.placeholderImg1 = content.data.fileUrl;
  613. item[item.value.split(",")[0]] = content.data.fileUrl;
  614. } else {
  615. item.placeholderImg2 = content.data.fileUrl;
  616. item[item.value.split(",")[1]] = content.data.fileUrl;
  617. }
  618. //只展示缩略图
  619. if (!item.inputType) {
  620. emit("uploadImg", data, item, index);
  621. } else {
  622. //if(item.type === 1)
  623. //证件OCR识别
  624. uni.showLoading({
  625. title: "证件识别中...",
  626. mask: true,
  627. });
  628. let reqData2 = {
  629. imageDriveBase: "",
  630. imageBase64: base64,
  631. imageType: index % 2 != 0 ? 1 : 2, //1代表身份证正面,2代表反面
  632. imageUrl: content.data.fileUrl,
  633. };
  634. //默认身份证
  635. let code = "IF010012019070410001";
  636. if (item.inputType == "2") {
  637. //2为行驶证
  638. code = "IF010012019070410002";
  639. reqData2.imageBase64 = "";
  640. reqData2.imageDriveBase = base64;
  641. }
  642. request(code, {
  643. data: reqData2,
  644. }).then((ocr) => {
  645. uni.hideLoading();
  646. if (ocr.rc !== "00") {
  647. uni.showModal({
  648. title: "请求错误",
  649. content: "证件识别失败",
  650. showCancel: false,
  651. confirmText: "取消",
  652. });
  653. }
  654. let data = ocr.rd;
  655. //[身份证正面]姓名(name) 住址(address) 出生日期(birthday) 身份证号(idno) 民族(nation)
  656. //[身份证反面]证件机关(agency) 有效起始日期(begindate) 有效结束日期(enddate)
  657. emit("uploadImg", data, item, index);
  658. });
  659. }
  660. })
  661. .catch((e) => {
  662. console.log(">>>>", e);
  663. });
  664. });
  665. // #endif
  666. },
  667. fail(res: any) {
  668. if (!res.authSetting["scope.album"]) {
  669. uni.showModal({
  670. title: "授权失败",
  671. content: "需要从您的相机或相册获取图片,请在设置界面打开相关权限",
  672. success: (res) => {
  673. if (res.confirm) {
  674. uni.openSetting();
  675. }
  676. },
  677. });
  678. }
  679. },
  680. });
  681. }
  682. function showToast(hint: string) {
  683. uni.showToast({
  684. icon: "none",
  685. title: hint,
  686. });
  687. }
  688. //内容提交
  689. const formSubmit = () => {
  690. let content = {};
  691. /* 整理数据对象返回内容 */
  692. for (var i = 0; i < props.formData.length; i++) {
  693. let data = props.formData[i];
  694. /* 时间另外判断 */
  695. if (data.required && !data.hide) {
  696. //隐藏的不用进行判断
  697. let reg = new RegExp(":", "g"); //g代表全部
  698. let newMsg = data.title.replace(reg, "");
  699. if (data.value.indexOf(",") != -1 && data.type === 8) {
  700. if (!data[data.value.split(",")[0]]) {
  701. showToast(data.emptyHint ?data.emptyHint :`${data.hint1}不能为空`);
  702. return;
  703. } else if (!data[data.value.split(",")[1]]) {
  704. showToast(data.emptyHint ? data.emptyHint:`${data.hint2}不能为空`);
  705. return;
  706. }
  707. } else if (!data[data.value]) {
  708. showToast(data.emptyHint ?data.emptyHint: `${newMsg}不能为空`);
  709. return;
  710. }
  711. }
  712. if (data.value.indexOf(",") != -1 && data.type === 8) {
  713. if (data[data.value.split(",")[0]]) {
  714. content[data.value.split(",")[0]] = data[data.value.split(",")[0]];
  715. }
  716. if (data[data.value.split(",")[1]]) {
  717. content[data.value.split(",")[1]] = data[data.value.split(",")[1]];
  718. }
  719. } else if (data.type === 10) {
  720. // for (var i = 0; i < data.value.split(',').length; i++) {
  721. // content[data.value.split(',')[i]] = data[data.value].split('-')[i]
  722. // }
  723. content[data.value] = data[data.value];
  724. } else {
  725. if (data.type === 4 && data.name) {
  726. content[data.value] = data[data.value][data.name];
  727. } else {
  728. content[data.value] = data[data.value];
  729. }
  730. }
  731. }
  732. emit("submit", content);
  733. };
  734. </script>
  735. <style lang="scss" scoped>
  736. .img-size {
  737. width: 30rpx;
  738. height: 30rpx;
  739. }
  740. .notbg {
  741. background-color: #ffffff;
  742. border-radius: 20rpx;
  743. min-height: 80rpx;
  744. line-height: 80rpx;
  745. padding: 8rpx 28rpx;
  746. }
  747. .bg {
  748. background-color: #f1f1f1;
  749. border-radius: 20rpx;
  750. min-height: 80rpx;
  751. line-height: 80rpx;
  752. padding: 0 28rpx;
  753. margin-right: 29rpx;
  754. margin-left: 25rpx;
  755. margin-top: 30rpx;
  756. }
  757. .textarea-bg {
  758. background-color: #f1f1f1;
  759. border-radius: 20rpx;
  760. height: 245rpx;
  761. padding: 30rpx;
  762. box-sizing: border-box;
  763. -moz-box-sizing: border-box;
  764. /*Firefox*/
  765. -webkit-box-sizing: border-box;
  766. /*Safari*/
  767. }
  768. .text-hint {
  769. font-size: 28rpx;
  770. color: #999999;
  771. }
  772. .text-title {
  773. font-size: 28rpx;
  774. color: #333333;
  775. }
  776. .subBtn {
  777. margin: 112rpx 30rpx 30rpx;
  778. }
  779. .divider {
  780. border-bottom: 1px solid #dcdcdc;
  781. }
  782. .arror {
  783. width: 35rpx;
  784. height: 35rpx;
  785. }
  786. .imgs-box {
  787. flex-wrap: wrap;
  788. margin-top: 20rpx;
  789. margin-bottom: -35rpx;
  790. padding-right: 110rpx;
  791. justify-content: space-between;
  792. .img-box {
  793. margin-bottom: 35rpx;
  794. }
  795. .img-hint {
  796. font-size: 24rpx;
  797. color: #333333;
  798. text-align: center;
  799. }
  800. }
  801. </style>