Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

form-builder-vue3.vue 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718
  1. <template>
  2. <!-- 表单 -->
  3. <form style="padding: 10px 0" @submit="formSubmit">
  4. <view class="header-info" v-if="config.isHeader">
  5. <view class="title">上传后请核对识别信息</view>
  6. <view class="info">如有错误请及时手动修改</view>
  7. </view>
  8. <view v-for="(item, index) in formData" :key="index">
  9. <view v-show="!item.show">
  10. <!-- 头部标题 -->
  11. <view class="upload-car-bottom" v-if="item.type == 100">
  12. {{ item.title }}
  13. </view>
  14. <!-- 是否显示-->
  15. <view
  16. style="min-height: 90rpx"
  17. :style="item.vertical == 2 ? 'margin-top: 20rpx' : ''"
  18. :class="
  19. item.vertical == 2 ? 'as-layout-vertical' : 'as-layout-horizontal'
  20. "
  21. v-else
  22. >
  23. <!-- 标题 -->
  24. <view
  25. v-if="
  26. item.titleShow ||
  27. (item.titleShow === undefined && item.type != 14)
  28. "
  29. class="as-gravity-center-start"
  30. :style="'min-width:' + config.titleWidth + 'rpx'"
  31. style="
  32. margin: 0 20rpx;
  33. flex-direction: row;
  34. display: flex;
  35. flex-direction: row;
  36. "
  37. >
  38. <image
  39. class="img-size"
  40. :src="item.required ? '/static/image/must.png' : ''"
  41. ></image>
  42. <view
  43. :class="item.vertical == 2 ? 'text-left' : 'text-justify'"
  44. class="text-title"
  45. style="width: 100%"
  46. >
  47. {{ item.title }}
  48. </view>
  49. </view>
  50. <!-- 内容 -->
  51. <view class="as-weight as-gravity-center-start">
  52. <!-- 文本内容 -->
  53. <view v-if="item.type == 1" class="text" :style="item.style">
  54. {{ item[item.value] }}
  55. </view>
  56. <!-- 输入框 -->
  57. <view v-if="item.type == 2" style="width: 100%">
  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 as-gravity-center-start"
  65. :maxlength="item.maxlength"
  66. :style="item.style"
  67. style="min-height: 90rpx; word-break: break-all"
  68. />
  69. </view>
  70. <!-- 多项选择器 -->
  71. <view v-if="item.type == 3">
  72. <checkbox-group
  73. @change="checkboxChange($event, item)"
  74. :disabled="item.disabled"
  75. >
  76. <view
  77. class="as-layout-horizontal"
  78. style="flex-wrap: wrap; margin: 10px 0"
  79. >
  80. <label
  81. style="
  82. display: flex;
  83. flex-direction: row;
  84. margin-right: 30rpx;
  85. "
  86. v-for="(itemData, index) in item.itemData"
  87. :key="index"
  88. >
  89. <checkbox
  90. style="transform: scale(0.7)"
  91. :value="itemData.value"
  92. :checked="itemData.checked"
  93. />
  94. <view>{{ itemData.value }}</view>
  95. </label>
  96. </view>
  97. </checkbox-group>
  98. </view>
  99. <!-- 普通选择器 当 range 是一个 Array<Object> 时,通过 range-key 来指定 Object 中 key 的值作为选择器显示内容
  100. :range-key="item[item.value]"-->
  101. <view v-if="item.type == 4" style="width: 100%">
  102. <!-- range[范围] value[初始选择]-->
  103. <picker
  104. color="uni-picker-container"
  105. :disabled="item.disabled"
  106. :range-key="item.itemKey"
  107. :mode="item.mode ? item.mode : 'selector'"
  108. @change="bindPickerChange($event, item)"
  109. :range="item.itemData"
  110. >
  111. <view class="text">
  112. {{
  113. item[item.value]
  114. ? item.itemKey
  115. ? item[item.value][item.itemKey]
  116. : item[item.value]
  117. : item.hint
  118. ? item.hint
  119. : '请选择' + item.title
  120. }}
  121. </view>
  122. </picker>
  123. </view>
  124. <!-- 富文本框 -->
  125. <view v-if="item.type == 5" style="width: 100%">
  126. <view
  127. style="
  128. margin: 20rpx 30rpx 0 30rpx;
  129. border: 1px solid #999999;
  130. height: 200rpx;
  131. border-radius: 10px;
  132. "
  133. >
  134. <textarea
  135. :disabled="item.disabled"
  136. class="text"
  137. v-model="item[item.value]"
  138. @input="textareaInput($event, item)"
  139. placeholder-class="text-hint"
  140. style="width: 100%; margin: 20rpx"
  141. :maxlength="item.maxlength"
  142. auto-height
  143. :placeholder="item.hint ? item.hint : '请输入' + item.title"
  144. ></textarea>
  145. <view
  146. v-if="item.maxlength"
  147. class="as-gravity-center-end"
  148. style="display: flex; flex-direction: row; height: 20%"
  149. >
  150. <view class="text">{{ !item.num ? '0' : item.num }}</view>
  151. <view class="text">
  152. /{{ item.maxlength ? item.maxlength : 100 }}
  153. </view>
  154. </view>
  155. </view>
  156. </view>
  157. <!-- 图片选择器 :imgWidth="imgWidth ? imgWidth : 0"-->
  158. <view v-if="item.type == 6" style="width: 100%">
  159. <form-image
  160. @backImg="backImg($event, item)"
  161. style="width: 100%"
  162. :retract="40"
  163. ></form-image>
  164. </view>
  165. <!-- 单向选择器 -->
  166. <view v-if="item.type == 7" style="width: 100%">
  167. <radio-group @change="radioChange($event, item)">
  168. <view class="as-layout-horizontal">
  169. <label
  170. style="
  171. display: flex;
  172. flex-direction: row;
  173. margin-right: 30rpx;
  174. "
  175. v-for="(itemData, index) in item.itemData"
  176. :key="index"
  177. >
  178. <radio
  179. color="#1AAC1B"
  180. style="transform: scale(0.7)"
  181. :value="itemData.value"
  182. :checked="itemData.checked"
  183. />
  184. <view>{{ itemData.name }}</view>
  185. </label>
  186. </view>
  187. </radio-group>
  188. </view>
  189. <!-- 证件照上传 -->
  190. <view v-if="item.type == 8" style="width: 100%">
  191. <view style="margin: 0 40rpx">
  192. <view class="text-error">
  193. {{
  194. item.hint && item.hint.split(',')[0]
  195. ? item.hint.split(',')[0]
  196. : ''
  197. }}
  198. </view>
  199. <view
  200. class="as-layout-horizontal as-gravity-center"
  201. style="height: 260rpx; margin-top: 20rpx"
  202. :class="{ dan: item.inputType === '999' }"
  203. >
  204. <view
  205. class="as-layout-vertical as-gravity-center"
  206. style="width: 90%; height: 100%"
  207. >
  208. <image
  209. :src="
  210. item.placeholderImg
  211. ? item.placeholderImg.split(',')[0]
  212. : '../../static/image/license2.png'
  213. "
  214. style="width: 100%; height: 80%"
  215. :style="item.style"
  216. @tap="ImageSelection(item, 1)"
  217. ></image>
  218. <view
  219. class="as-gravity-center text-hint"
  220. style="margin-top: 5rpx"
  221. >
  222. {{
  223. item.hint && item.hint.split(',')[1]
  224. ? item.hint.split(',')[1]
  225. : ''
  226. }}
  227. </view>
  228. </view>
  229. <view style="width: 40rpx"></view>
  230. <view
  231. class="as-layout-vertical"
  232. style="width: 90%; height: 100%"
  233. v-if="item.inputType != '999'"
  234. >
  235. <image
  236. :src="
  237. item.placeholderImg && item.placeholderImg.split(',')[1]
  238. ? item.placeholderImg.split(',')[1]
  239. : '../../static/image/license2.png'
  240. "
  241. style="width: 100%; height: 80%"
  242. @tap="ImageSelection(item, 2)"
  243. ></image>
  244. <view
  245. class="as-gravity-center text-hint"
  246. style="margin-top: 5rpx"
  247. >
  248. {{
  249. item.hint && item.hint.split(',')[2]
  250. ? item.hint.split(',')[2]
  251. : ''
  252. }}
  253. </view>
  254. </view>
  255. </view>
  256. </view>
  257. </view>
  258. <!-- 车牌号输入 -->
  259. <view v-if="item.type == 9" style="width: 100%">
  260. <view style="margin: 20rpx 30rpx 0 30rpx">
  261. <car-num-ber-input
  262. @numberInputResult="numberInputResult($event, item)"
  263. :defaultStr="item[item.value]"
  264. ></car-num-ber-input>
  265. </view>
  266. </view>
  267. <!-- 省市区选择器 -->
  268. <view v-if="item.type == 10" style="width: 100%">
  269. <pick-regions
  270. :defaultRegion="defaultRegionCode"
  271. @getRegion="handleGetRegion($event, item)"
  272. >
  273. <view class="text">
  274. {{ handleTxt(item) }}
  275. </view>
  276. </pick-regions>
  277. </view>
  278. <!-- 短信验证码 -->
  279. <view v-if="item.type == 11" style="width: 100%">
  280. <view class="as-layout-horizontal as-gravity-center">
  281. <input
  282. v-model="item[item.value]"
  283. type="number"
  284. :placeholder="item.hint ? item.hint : '请输入' + item.title"
  285. placeholder-class="text-hint"
  286. class="text as-gravity-center-start"
  287. :maxlength="item.maxlength"
  288. :style="item.style"
  289. style="min-height: 90rpx; word-break: break-all"
  290. />
  291. <button
  292. style="width: 160rpx; font-size: 24rpx; height: 60rpx"
  293. :disabled="item.disabled"
  294. @click="SMSsending($event, item)"
  295. >
  296. {{ item.hint ? item.hint : '获取验证码' }}
  297. </button>
  298. </view>
  299. </view>
  300. <!-- 隐私协议 -->
  301. <view v-if="item.type == 12" style="width: 100%">
  302. <view class="as-layout-horizontal as-gravity-center">
  303. <checkbox value="cb" />
  304. 请先阅读并同意
  305. <a style="color: #007aff; text-decoration: underline">
  306. 《开户服务协议》
  307. </a>
  308. </view>
  309. </view>
  310. <!-- 车牌颜色 -->
  311. <view v-if="item.type == 13" style="width: 100%">
  312. <licensePlateColor
  313. @numberplateResult="numberplateResult($event, item)"
  314. :defaultStr="item[item.value]"
  315. :vanType="vanType"
  316. ></licensePlateColor>
  317. </view>
  318. <!-- 上传图片,证件照等 -->
  319. <view v-if="item.type == 14" style="width: 100%">
  320. <upload-car-img
  321. :dataList="item"
  322. @uploadImgHandle="uploadImgHandle($event, item)"
  323. />
  324. </view>
  325. <!-- <view v-if="item.type == 15" style="width: 100%;">
  326. <view class="input-box">
  327. <text class="sub-label">长</text>
  328. <input v-model="state.outlineL" @input="outlineInput" :disabled="state.isEnableChangeOCRCarInfo" />
  329. <text class="sub-text">X</text>
  330. <text class="sub-label">宽</text>
  331. <input v-model="state.outlineW" @input="outlineInput" :disabled="state.isEnableChangeOCRCarInfo" />
  332. <text class="sub-text">X</text>
  333. <text class="sub-label">高</text>
  334. <input v-model="state.outlineH" @input="outlineInput" :disabled="state.isEnableChangeOCRCarInfo" />
  335. <text class="sub-text">mm</text>
  336. </view>
  337. </view> -->
  338. <!-- 车辆用户类型选择 -->
  339. <view v-if="item.type == 101" style="width: 100%">
  340. <CarUserType
  341. :dataList="item"
  342. @useCarUserType="useCarUserType($event, item)"
  343. />
  344. </view>
  345. <!-- 汽车尺寸处理 -->
  346. <view v-if="item.type == 102" style="width: 100%"></view>
  347. <!-- 用户类型选择 -->
  348. <view v-if="item.type == 103" style="width: 100%">
  349. <UserType
  350. :dataList="item"
  351. @useUserType="useUserType($event, item)"
  352. />
  353. </view>
  354. </view>
  355. </view>
  356. <!-- 最后一位不展示 且 设置为展示 -->
  357. <view
  358. v-show="item.underline"
  359. class="as-line-h"
  360. style="margin: 0rpx 20rpx 0rpx 20rpx"
  361. ></view>
  362. </view>
  363. </view>
  364. <view style="display: flex; flex-direction: row">
  365. <button
  366. v-if="config.btnBack"
  367. class="back-bg as-gravity-center btn as-weight"
  368. @click="back"
  369. >
  370. {{ config.submitOneName ? config.submitOneName : '上一步' }}
  371. </button>
  372. <button
  373. class="btn btn-text as-gravity-center nav-bg as-weight"
  374. form-type="submit"
  375. >
  376. {{ config.submitName ? config.submitName : '提交' }}
  377. </button>
  378. </view>
  379. </form>
  380. </template>
  381. <script setup lang="ts">
  382. import { TypeData } from './tools';
  383. import licensePlateColor from '@/components/LicensePlateColor.vue';
  384. import carNumBerInput from '@/components/car-number-input/car-number-input';
  385. import uploadCarImg from '@/components/upload-car-img/upload-car-img';
  386. import CarUserType from '@/components/CarUserType.vue';
  387. import UserType from '@/components/UserType.vue';
  388. import { pathToBase64 } from '../../static/js/util/imageTool.js';
  389. import pickRegions from '@/components/pick-regions/pick-regions.vue';
  390. import { computed } from 'vue';
  391. const defaultRegionCode = '520115';
  392. const props = defineProps({
  393. vanType: {
  394. default: 'all'
  395. },
  396. formData: {
  397. type: Array as () => Array<TypeData>,
  398. // type: Array as() => Array < any > ,
  399. default: () => []
  400. },
  401. config: {
  402. type: Object,
  403. default: function () {
  404. return {
  405. submitName: '提交', //提交按钮名称
  406. titleWidth: 240, //标题宽度
  407. isHeader: false //头部信息展示
  408. };
  409. }
  410. }
  411. });
  412. const emit = defineEmits<{
  413. (e: 'submit', content: any): void;
  414. (e: 'bindPickerChange', event: any, item: TypeData): void;
  415. (e: 'handleGetRegion', event: any, item: TypeData): void;
  416. (e: 'uploadImg', content: any, item: TypeData, index: Number): void;
  417. (e: 'radioChange', event: any, item: TypeData): void;
  418. (e: 'sendText', event: any, item: TypeData): void;
  419. (e: 'uploadImgOcr', fileLise: any, item: any): void;
  420. }>();
  421. //defineExpose 可宏来显式指定在 <script setup> 组件中要暴露出去的属性。
  422. //普通选择器
  423. function bindPickerChange(e: any, item: TypeData) {
  424. let select = e.target.value;
  425. // #ifdef H5
  426. select = e.detail.value;
  427. // #endif
  428. if (item.mode == 'date' || item.mode == 'time') {
  429. /* 日期选择器*/
  430. item[item.value] = select;
  431. } else {
  432. /* 普通选择器*/
  433. item[item.value] = select || item.itemData[select];
  434. }
  435. emit('bindPickerChange', e, item);
  436. }
  437. // 车辆选择器处理
  438. function useCarUserType(e, item) {
  439. item[item.value] = e;
  440. }
  441. function useUserType(e, item) {
  442. item[item.value] = e;
  443. console.log(e);
  444. }
  445. function handleTxt(item) {
  446. if (!item.value) {
  447. return '请选择省市区';
  448. }
  449. const str = item[item.value] || '请选择省市区';
  450. return str;
  451. }
  452. // 获取选择的地区
  453. function handleGetRegion(e: any, item: TypeData) {
  454. item[item.value] = e[0].name + e[1].name + e[2].name;
  455. emit('handleGetRegion', e, item);
  456. }
  457. //多项选择器
  458. function checkboxChange(e: any, item: TypeData) {
  459. item[item.value] = e.detail.value; /* 赋值*/
  460. }
  461. //单项选择器
  462. function radioChange(e: any, item: TypeData) {
  463. item[item.value] = e.detail.value; /* 赋值*/
  464. console.log(e, item);
  465. emit('radioChange', e, item);
  466. }
  467. //富文本框输入内容
  468. function textareaInput(e: Event, item: TypeData) {
  469. item.num = item[item.value].length;
  470. }
  471. //点击图片按钮
  472. function backImg(e: Event, item: TypeData) {
  473. item[item.value] = e;
  474. }
  475. function back(e: Event) {}
  476. //车牌输入
  477. function numberInputResult(e: any, item: TypeData) {
  478. var str = e.replace(/\s*/g, '');
  479. item[item.value] = str;
  480. }
  481. function numberplateResult(e: any, item) {
  482. item[item.value] = e.id;
  483. console.log(e);
  484. }
  485. //短信验证码发送
  486. function SMSsending(e: any, item: TypeData) {
  487. let time = 60;
  488. emit('sendText', e, item);
  489. const fn = setInterval(function () {
  490. time--;
  491. item.hint = time + 's';
  492. item.disabled = true;
  493. if (time == 0) {
  494. clearInterval(fn);
  495. item.disabled = false;
  496. item.hint = '获取验证码';
  497. }
  498. }, 1000);
  499. }
  500. //选择图片按钮
  501. function ImageSelection(item: TypeData, index: number) {
  502. uni.chooseImage({
  503. count: 1, //最多可以选择的文件个数
  504. sourceType: ['camera'], //album 从相册选视频,camera 使用相机拍摄,默认为:['album', 'camera']
  505. success(res: any) {
  506. if (res.tempFiles[0].size > 2000000) {
  507. uni.showToast({
  508. title: '图片大于2M,请重新上传',
  509. icon: 'none',
  510. duration: 1500
  511. });
  512. return;
  513. }
  514. // #ifdef H5
  515. pathToBase64(res.tempFilePaths[0]).then((data) => {
  516. emit('uploadImg', data, item, index);
  517. });
  518. // #endif
  519. },
  520. fail(res: any) {
  521. if (!res.authSetting['scope.album']) {
  522. uni.showModal({
  523. title: '授权失败',
  524. content: '需要从您的相机或相册获取图片,请在设置界面打开相关权限',
  525. success: (res) => {
  526. if (res.confirm) {
  527. uni.openSetting();
  528. }
  529. }
  530. });
  531. }
  532. }
  533. });
  534. }
  535. function showToast(hint: string) {
  536. uni.showToast({
  537. icon: 'none',
  538. title: hint
  539. });
  540. }
  541. // type为14,上传图片
  542. function uploadImgHandle(fileList, item) {
  543. emit('uploadImgOcr', fileList, item);
  544. }
  545. //内容提交
  546. function formSubmit() {
  547. let content = {};
  548. // console.log('data值', props.formData)
  549. /* 整理数据对象返回内容 */
  550. for (var i = 0; i < props.formData.length; i++) {
  551. let data = props.formData[i];
  552. if (data.show) continue;
  553. // console.log('data', data)
  554. /* 时间另外判断 */
  555. if (+data.type == 7) {
  556. // @ts-ignore
  557. let values = data[data.value];
  558. if (!values && values !== 0) {
  559. values = data.itemData.find((item) => item.checked).value;
  560. }
  561. values = parseInt(values);
  562. data[data.value] = isNaN(values)
  563. ? data.itemData.find((item) => item.checked).value
  564. : values;
  565. }
  566. // 如果等于100说明是标题,跳过
  567. if (+data.type == 100) {
  568. continue;
  569. }
  570. if (data.required && !data.show) {
  571. let reg = new RegExp(':', 'g'); //g代表全部
  572. let newMsg = data.title.replace(reg, '');
  573. if (data.value.indexOf(',') != -1 && +data.type == 8) {
  574. if (!data[data.value.split(',')[0]]) {
  575. showToast(data.hint + '不能为空');
  576. return;
  577. } else if (!data[data.value.split(',')[1]]) {
  578. showToast(data.hint + '不能为空');
  579. return;
  580. }
  581. } else if (data[data.value] === undefined || data[data.value] === '') {
  582. showToast(newMsg + '不能为空');
  583. return;
  584. }
  585. }
  586. if (+data.type == 2 && !data.show) {
  587. if (data.checkReg) {
  588. let regs = new RegExp(data.checkReg); //g代表全部
  589. if (!regs.test(data[data.value])) {
  590. showToast(data.checkPrompt || data.title + '校验失败');
  591. return;
  592. }
  593. }
  594. if (
  595. data.minlength &&
  596. data[data.value].length &&
  597. +data.minlength > data[data.value].length
  598. ) {
  599. showToast(data.title + '最小长度为' + data.minlength);
  600. return;
  601. }
  602. }
  603. if (data.value.indexOf(',') != -1 && +data.type == 8) {
  604. if (data[data.value.split(',')[0]]) {
  605. content[data.value.split(',')[0]] = data[data.value.split(',')[0]];
  606. }
  607. if (data[data.value.split(',')[1]]) {
  608. content[data.value.split(',')[1]] = data[data.value.split(',')[1]];
  609. }
  610. } else if (+data.type == 10) {
  611. for (var s = 0; s < data.value.split(',').length; s++) {
  612. if (data[data.value]) {
  613. content[data.value.split(',')[s]] = data[data.value].split('-')[s];
  614. }
  615. }
  616. } else {
  617. if (+data.type == 4 && data.name && data[data.value]) {
  618. content[data.value] = data[data.value][data.name];
  619. } else {
  620. content[data.value] = data[data.value];
  621. }
  622. }
  623. }
  624. emit('submit', content);
  625. }
  626. </script>
  627. <style lang="scss" scoped>
  628. .img-size {
  629. width: 30rpx;
  630. height: 30rpx;
  631. }
  632. .upload-car-bottom {
  633. font-size: 32rpx;
  634. text-align: left;
  635. margin: 15rpx 30rpx;
  636. }
  637. .header-info {
  638. padding: 40rpx 40rpx 10rpx;
  639. .title {
  640. font-size: 28rpx;
  641. color: #000;
  642. font-weight: bold;
  643. }
  644. .info {
  645. margin-top: 8rpx;
  646. font-size: 24rpx;
  647. color: #999;
  648. }
  649. }
  650. .btn {
  651. height: 80rpx;
  652. opacity: 1;
  653. border-radius: 100rpx;
  654. margin: 20rpx 20rpx 20rpx 20rpx;
  655. }
  656. .btn-text {
  657. color: #ffffff;
  658. font-size: 28rpx;
  659. }
  660. .nav-bg {
  661. /* background: linear-gradient(to right, #13E7C1, #43A1E0); */
  662. border: 1px solid #ffffff;
  663. background: #1aac1b;
  664. }
  665. .back-bg {
  666. border: 1px solid #1aac1b;
  667. color: #1aac1b;
  668. background: #ffffff;
  669. }
  670. ::v-deep .uni-picker-container .uni-picker-action.uni-picker-action-confirm {
  671. background-color: blue;
  672. color: #1aac1b;
  673. /* 添加其他样式属性 */
  674. }
  675. .dan {
  676. width: 50%;
  677. }
  678. </style>