選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

etc-activation.vue 21KB

2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
1週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
1週間前
2週間前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889
  1. <template>
  2. <view class="container">
  3. <!-- 主要内容 -->
  4. <view class="content">
  5. <!-- 基本信息 -->
  6. <view class="info-section">
  7. <view class="section-title">基本信息</view>
  8. <!-- 激活类型选择 -->
  9. <view class="activation-type">
  10. <view
  11. :class="['type-item', { active: activationType === 'self' }]"
  12. @click="activationType = 'self'"
  13. >
  14. 本人激活
  15. </view>
  16. <view
  17. :class="['type-item', { active: activationType === 'other' }]"
  18. @click="activationType = 'other'"
  19. >
  20. 非本人激活
  21. </view>
  22. </view>
  23. <!-- 表单字段 -->
  24. <view v-if="activationType === 'other'" class="form-item car-number-row">
  25. <view class="form-label">车牌号</view>
  26. <car-number-input
  27. v-model="formData.carNumber"
  28. @numberInputResult="carNumberInputResult"
  29. inputColor="#ECF1F4"
  30. style="width: 100%;"
  31. />
  32. </view>
  33. <view v-else class="form-item">
  34. <view class="form-label">车牌号</view>
  35. <view class="form-input">
  36. <picker
  37. class="picker-disabled--test"
  38. @change="bindPickerChange"
  39. :value="formData.vehicleIndex"
  40. :range="vehicles"
  41. range-key="vehiclePlate">
  42. <view class="uni-input">
  43. <view class="text">{{vehicles[formData.vehicleIndex]? vehicles[formData.vehicleIndex].vehiclePlate : '请选择车牌号'}}</view>
  44. <view class="arrow-down">▼</view>
  45. </view>
  46. <!-- <view class="uni-input">{{vehicles[formData.vehicleIndex]?.vehiclePlate}}</view> -->
  47. </picker>
  48. </view>
  49. </view>
  50. <view class="form-item">
  51. <view class="form-label">车牌颜色</view>
  52. <view class="form-input">
  53. <picker
  54. class="picker-disabled--test"
  55. :disabled="activationType == 'self'"
  56. @change="bindColorPickerChange"
  57. :value="formData.colorIndex"
  58. :range="getDicWithType('VEHICLE_COLOR_TYPE')"
  59. range-key="name">
  60. <view class="uni-input">
  61. <view class="text">{{formData.colorName ? formData.colorName : '请选择车辆颜色'}}</view>
  62. <view class="arrow-down">▼</view>
  63. </view>
  64. <!-- <view class="uni-input">{{vehicles[formData.vehicleIndex]?.vehiclePlate}}</view> -->
  65. </picker>
  66. </view>
  67. </view>
  68. <!-- <view class="form-input" >
  69. <view class="uni-list-cell-db">
  70. <picker class="picker-selector--test" @change="bindPickerChange" :value="formData.vehicleIndex" :range="vehicles" range-key="name">
  71. <view class="uni-input picker-selector--value">{{vehicles[formData.vehicleIndex]}}</view>
  72. </picker>
  73. </view>
  74. </view> -->
  75. <!-- </view> -->
  76. <!-- <view class="form-item">
  77. <view class="form-label">车牌颜色</view>
  78. <view class="form-input" @click="selectCarColor">
  79. <text :class="['input-text', { placeholder: !formData.carColor }]">
  80. {{ formData.carColor || '请选择车牌颜色' }}
  81. </text>
  82. <view class="arrow-down">▼</view>
  83. </view>
  84. </view> -->
  85. <view class="form-item">
  86. <view class="form-label">申请手机号</view>
  87. <input
  88. class="form-input-text"
  89. placeholder="请输入手机号码"
  90. v-model="formData.phoneNumber"
  91. disabled="true"
  92. type="number"
  93. maxlength="11"
  94. />
  95. </view>
  96. <!-- 非本人激活时显示验证码 -->
  97. <view v-if="activationType === 'other'" class="form-item">
  98. <view class="form-label">短信验证码</view>
  99. <view class="form-input" style="display:flex;align-items:center;">
  100. <input
  101. class="form-input-text"
  102. placeholder="请输入验证码"
  103. v-model="formData.smsCode"
  104. maxlength="6"
  105. style="flex:1;"
  106. />
  107. <button class="send-code-btn" @click="sendCode" :disabled="waitTime>0">
  108. {{ waitTime > 0 ? waitTime + 's后重试' : '发送验证码' }}
  109. </button>
  110. </view>
  111. </view>
  112. </view>
  113. <!-- 上传照片 -->
  114. <view class="upload-section" v-if="formData.activeType == '2'">
  115. <view class="section-title">上传照片</view>
  116. <view class="picture-wrapper" @click="cardFileImageUpdate(100)">
  117. <view class="bg">
  118. <view class="">
  119. <view class="name"> 行驶证主页 </view>
  120. <view class="value"> 上传行驶证的主页 </view>
  121. <view class="tip">
  122. <view class="tip-value"> 拍摄规范 </view>
  123. </view>
  124. </view>
  125. <image v-if="!formData.vehPosImgUrl" class="icon" :src="`${$imgUrl}issuance/xz.png`"
  126. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}">
  127. </image>
  128. <image v-else class="icon" :src="imgPathMontage(formData.vehPosImgUrlName)"
  129. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}"></image>
  130. </view>
  131. </view>
  132. <view class="picture-wrapper" @click="cardFileImageUpdate(101)">
  133. <view class="bg">
  134. <view class="">
  135. <view class="name"> 行驶证副页 </view>
  136. <view class="value"> 上传行驶证的副页 </view>
  137. <view class="tip">
  138. <view class="tip-value"> 拍摄规范 </view>
  139. </view>
  140. </view>
  141. <image v-if="!formData.vehNegImgUrl" class="icon" :src="`${$imgUrl}issuance/xf.png`"
  142. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}">
  143. </image>
  144. <image v-else class="icon" :src="imgPathMontage(formData.vehNegImgUrlName)"
  145. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}"></image>
  146. </view>
  147. </view>
  148. <view class="picture-wrapper" @click="cardFileImageUpdate(102)">
  149. <view class="bg">
  150. <view class="">
  151. <view class="name"> 上传激活车辆45度照 </view>
  152. <view class="value"> 上传车辆45度角照片 </view>
  153. <view class="tip">
  154. <view class="tip-value"> 拍摄规范 </view>
  155. </view>
  156. </view>
  157. <image v-if="!formData.vehBodyUrl" class="icon" :src="`${$imgUrl}issuance/chetou.png`"
  158. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}">
  159. </image>
  160. <image v-else class="icon" :src="imgPathMontage(formData.vehBodyUrlName)"
  161. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}"></image>
  162. </view>
  163. </view>
  164. <view class="picture-wrapper" @click="cardFileImageUpdate(103)">
  165. <view class="bg">
  166. <view class="">
  167. <view class="name"> 上传ETC设备安装照 </view>
  168. <view class="value"> 上传ETC设备安装位置照片 </view>
  169. <view class="tip">
  170. <view class="tip-value"> 拍摄规范 </view>
  171. </view>
  172. </view>
  173. <image v-if="!formData.deviceImageUrl" class="icon" :src="``"
  174. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}">
  175. </image>
  176. <image v-else class="icon" :src="imgPathMontage(formData.deviceImageName)"
  177. :style="{'--bgimg':`url(${$imgUrl}issuance/bg-border.png)`}"></image>
  178. </view>
  179. </view>
  180. </view>
  181. </view>
  182. <!-- 底部按钮 -->
  183. <view class="bottom-button" @click="nextStep">
  184. 下一步
  185. </view>
  186. <uploadImg :isTakePhotoModeShow="isTakePhotoModeShow" :phoneType="choiceIndex" @close="close"
  187. @ocrResult="ocrResult">
  188. </uploadImg>
  189. </view>
  190. </template>
  191. <script setup lang="ts">
  192. import { ref, reactive, onMounted, onUnmounted } from 'vue'
  193. import { onLoad } from '@dcloudio/uni-app'
  194. import carNumberInput from './components/car-number-input.vue'
  195. import { requestNew } from "@/utils/network/request.js";
  196. import {
  197. queryVehicle, sendMessage
  198. } from "@/utils/network/api.js";
  199. import {
  200. getCodeName, getDicWithType
  201. } from "@/datas/queryKey.js";
  202. import { msg, strReplace, imgPathMontage, hasLogin, uploadFile, compressImage, chooseImageCompress, navTo } from "@/utils/utils";
  203. import uploadImg from '@/components/uploadOcr';
  204. import useOrderSkip from "@/composables/order/useOrderSkip";
  205. //办理订单按钮跳转业务逻辑
  206. const {
  207. gotoCancelOrder,
  208. gotoEditUserOrUnitInfo,
  209. gotoConfirmReceipt,
  210. gotoCheckLogistics,
  211. gotoEvaluateProduct,
  212. gotoActiveOrder,
  213. gotoPay,
  214. gotoReturnOrder,
  215. gotoExchangeOrder,
  216. gotoOrderDetailsPay,
  217. gotoOrderDetails,
  218. gotoAgainUseOrder,
  219. gotoOrderSign,
  220. closeOrder,
  221. gotoReplenishmentOrder,
  222. gotoAddressOrder,
  223. placeAnOrder,
  224. gotoEditAddressNew
  225. } = useOrderSkip();
  226. // 响应式数据
  227. const statusBarHeight = ref(0)
  228. const barHeight = ref(0)
  229. const activationType = ref('self') // 'self' 本人激活, 'other' 非本人激活
  230. const waitTime = ref(0)
  231. let timer: any = null
  232. const formData = reactive({
  233. carNumber: '',
  234. vehicleIndex: '',
  235. vehiclePlate: '',
  236. colorCode: '',
  237. colorIndex: '',
  238. colorName: '',
  239. carColor: '',
  240. phoneNumber: '',
  241. vehPosImgUrl: '',
  242. vehPosImgUrlName: '',
  243. vehNegImgUrl: '',
  244. vehNegImgUrlName: '',
  245. vehBodyUrl: '',
  246. vehBodyUrlName: '',
  247. deviceImageUrl: '',
  248. deviceImageName: '',
  249. smsCode: '',
  250. activeType: ''
  251. })
  252. // 页面加载
  253. onLoad(() => {
  254. getSystemInfo()
  255. queryVehicleData();
  256. })
  257. const close = (e) => {
  258. console.log("e", e)
  259. isTakePhotoModeShow.value = e
  260. }
  261. const ocrResult = (data) => {
  262. console.log('输出内容=====================', choiceIndex.value);
  263. console.log("上传数据:", data)
  264. // 委托书
  265. formData.proxyUrl = data.imageUrl;
  266. formData.proxyUrlName = data.imageName;
  267. }
  268. const isTakePhotoModeShow = ref(false);
  269. const choiceIndex = ref(0);
  270. const takePhotoMode = (index) => {
  271. console.log("index", index)
  272. isTakePhotoModeShow.value = true
  273. choiceIndex.value = index
  274. }
  275. const vehiclesShow = ref(true);
  276. const vehicles = ref([]);
  277. const queryVehicleData = (vehicleId) => {
  278. let data = {
  279. vehicleId: ''
  280. }
  281. if(vehicleId) {
  282. data.vehicleId = vehicleId;
  283. }
  284. const options = {
  285. type: 2,
  286. method: "POST",
  287. data,
  288. showLoading: true,
  289. }
  290. requestNew('/iaw/active/queryVehicle', options).then(res => {
  291. vehicles.value = res.modelList;
  292. if(vehicleId) {
  293. let vehicle = res.modelList[0];
  294. formData.phoneNumber = vehicle.mobile;
  295. formData.activeType = vehicle.activeType;
  296. }
  297. })
  298. }
  299. //车头照图片上传 val 100行驶证证明 101行驶证反面 102车头照 103
  300. const cardFileImageUpdate = (val) => {
  301. uni.chooseImage({
  302. count: 1, //只能选取一张照片
  303. sizeType: ["original", "compressed"], //可以指定是原图还是压缩图,默认二者都有
  304. sourceType: ["camera", "album"], //从相册选择
  305. success: function (res) {
  306. uploadFile(res.tempFilePaths[0], val).then((data : any) => {
  307. if (val == 100) {
  308. formData.vehPosImgUrl = data.imageUrl;
  309. formData.vehPosImgUrlName = res.tempFilePaths[0];
  310. } else if (val == 101) {
  311. formData.vehNegImgUrl = data.imageUrl;
  312. formData.vehNegImgUrlName = res.tempFilePaths[0];
  313. } else if (val == 102){
  314. formData.vehBodyUrl = data.imageUrl;
  315. formData.vehBodyUrlName = res.tempFilePaths[0];
  316. } else {
  317. formData.deviceImageUrl = data.imageUrl;
  318. formData.deviceImageName = res.tempFilePaths[0];
  319. }
  320. })
  321. },
  322. });
  323. };
  324. const bindPickerChange = (e) => {
  325. console.log('picker发送选择改变,携带值为:' + e.detail.value)
  326. let index = e.detail.value;
  327. formData.vehicleIndex = index;
  328. let vehicle = vehicles.value[index];
  329. formData.vehiclePlate = vehicle.vehiclePlate;
  330. formData.colorCode = vehicle.vehiclePlateColor;
  331. formData.activeType = vehicle.activeType;
  332. const colorItem = getDicWithType('VEHICLE_COLOR_TYPE').find(item => item.code == formData.colorCode);
  333. formData.colorName = colorItem.name;
  334. formData.phoneNumber = vehicle.mobile
  335. };
  336. const bindColorPickerChange = (e) => {
  337. console.log('picker发送选择改变,携带值为:' + e.detail.value)
  338. let index = e.detail.value
  339. formData.colorIndex = index;
  340. let colorItem = getDicWithType('VEHICLE_COLOR_TYPE')[index];
  341. formData.colorCode = colorItem.code;
  342. formData.colorName = colorItem.name;
  343. if(formData.carNumber) {
  344. queryVehicleData(`${formData.carNumber}_${formData.colorCode}`);
  345. }
  346. };
  347. // 获取系统信息
  348. const getSystemInfo = () => {
  349. const systemInfo = uni.getSystemInfoSync()
  350. statusBarHeight.value = systemInfo.statusBarHeight || 0
  351. const { top, height } = uni.getMenuButtonBoundingClientRect()
  352. barHeight.value = height ? height + (top - statusBarHeight.value) * 2 : 38
  353. }
  354. // 返回上一页
  355. const goBack = () => {
  356. uni.navigateBack()
  357. }
  358. // 选择车牌号
  359. const selectCarNumber = () => {
  360. // 这里可以调用车牌号选择组件
  361. // uni.showActionSheet({
  362. // itemList: vehicles.value,
  363. // success: (res) => {
  364. // const colors = ['蓝色', '绿色', '黄色', '白色', '黑色']
  365. // formData.carColor = colors[res.tapIndex]
  366. // }
  367. // })
  368. vehiclesShow.value = true;
  369. }
  370. // 上传图片
  371. const uploadImage = (type: 'vehicle' | 'device') => {
  372. uni.chooseImage({
  373. count: 1, //只能选取一张照片
  374. sizeType: ["original", "compressed"], //可以指定是原图还是压缩图,默认二者都有
  375. sourceType: ["camera", "album"], //从相册选择
  376. success: function (res) {
  377. // 这里可以添加文件上传逻辑
  378. const tempFilePath = res.tempFilePaths[0]
  379. if (type === 'vehicle') {
  380. formData.vehicleImage = tempFilePath
  381. } else {
  382. formData.deviceImage = tempFilePath
  383. }
  384. }
  385. })
  386. }
  387. // 显示拍摄规范
  388. const showSpec = (type: 'vehicle' | 'device') => {
  389. const title = type === 'vehicle' ? '车辆45度照拍摄规范' : 'ETC设备安装照拍摄规范'
  390. const content = type === 'vehicle'
  391. ? '请从车辆前45度角拍摄,确保车牌清晰可见,车辆完整入镜。'
  392. : '请拍摄ETC设备安装位置,确保设备清晰可见,安装牢固。'
  393. uni.showModal({
  394. title,
  395. content,
  396. showCancel: false
  397. })
  398. }
  399. // 发送验证码
  400. const sendCode = () => {
  401. if (!/^1[3-9]\d{9}$/.test(formData.phoneNumber)) {
  402. uni.showToast({ title: '请输入正确手机号', icon: 'none' })
  403. return
  404. }
  405. const options = {
  406. type: 2,
  407. data: {
  408. mobile: formData.phoneNumber,
  409. businessType:4
  410. },
  411. method: "POST",
  412. showLoading: true,
  413. };
  414. requestNew(sendMessage, options).then((res) => {
  415. // 这里调用后端发送验证码接口
  416. msg("验证码发送成功!");
  417. uni.showToast({ title: '验证码已发送', icon: 'success' })
  418. waitTime.value = 60
  419. timer = setInterval(() => {
  420. waitTime.value--
  421. if (waitTime.value <= 0) clearInterval(timer)
  422. }, 1000)
  423. });
  424. }
  425. onUnmounted(() => { if (timer) clearInterval(timer) })
  426. const carNumberInputResult = (val: string) => {
  427. formData.carNumber = val.replaceAll(' ', '');
  428. if(formData.colorCode && formData.carNumber.length >= 7) {
  429. queryVehicleData(`${formData.carNumber}_${formData.colorCode}`);
  430. }
  431. };
  432. // 下一步
  433. const nextStep = () => {
  434. // 表单验证
  435. if (!formData.carNumber && activationType.value === 'other') {
  436. uni.showToast({
  437. title: '请输入车牌号',
  438. icon: 'none'
  439. })
  440. return
  441. }
  442. if (!formData.vehiclePlate && activationType.value === 'self') {
  443. uni.showToast({
  444. title: '请选择车牌号',
  445. icon: 'none'
  446. })
  447. return
  448. }
  449. if (formData.colorCode == undefined || formData.colorCode == null) {
  450. uni.showToast({
  451. title: '请选择车牌颜色',
  452. icon: 'none'
  453. })
  454. return
  455. }
  456. if (!formData.phoneNumber) {
  457. uni.showToast({
  458. title: '请输入手机号码',
  459. icon: 'none'
  460. })
  461. return
  462. }
  463. if (!/^1[3-9]\d{9}$/.test(formData.phoneNumber)) {
  464. uni.showToast({
  465. title: '请输入正确的手机号码',
  466. icon: 'none'
  467. })
  468. return
  469. }
  470. if (!formData.smsCode && activationType.value === 'other') {
  471. uni.showToast({
  472. title: '请输入验证码',
  473. icon: 'none'
  474. })
  475. return
  476. }
  477. if(formData.activeType == '2') {
  478. if (!formData.vehPosImgUrl) {
  479. uni.showToast({
  480. title: '请上传行驶证正面照',
  481. icon: 'none'
  482. })
  483. return
  484. }
  485. if (!formData.vehNegImgUrl) {
  486. uni.showToast({
  487. title: '请上传行驶证反面照',
  488. icon: 'none'
  489. })
  490. return
  491. }
  492. if (!formData.vehBodyUrl) {
  493. uni.showToast({
  494. title: '请上传车辆45度照',
  495. icon: 'none'
  496. })
  497. return
  498. }
  499. if (!formData.deviceImageUrl) {
  500. uni.showToast({
  501. title: '请上传ETC设备安装照',
  502. icon: 'none'
  503. })
  504. return
  505. }
  506. }
  507. // 提交数据
  508. console.log('表单数据:', formData)
  509. if(activationType.value === 'other') {
  510. const options = {
  511. type: 2,
  512. method: "POST",
  513. data: {
  514. mobile: formData.phoneNumber,
  515. code: formData.smsCode
  516. },
  517. showLoading: true,
  518. }
  519. requestNew('/iaw/active/checkSendCode', options).then(res => {
  520. next();
  521. })
  522. return;
  523. }
  524. next();
  525. }
  526. const next = () => {
  527. if(formData.activeType == '1') {
  528. navTo(`/subpackage/after-sale/activation/operation-tips?id=${''}&orderId=${''}&cardStatus=${''}&obuStatus=${''}&transfer=${''}`);
  529. } else {
  530. }
  531. }
  532. </script>
  533. <style lang="scss" scoped>
  534. .picture-wrapper {
  535. margin-top: 30rpx;
  536. .bg {
  537. background: #F5F9FB;
  538. border-radius: 10rpx;
  539. padding: 40rpx 30rpx;
  540. display: flex;
  541. // align-items: center;
  542. justify-content: space-between;
  543. .name {
  544. padding-top: 30rpx;
  545. font-size: 32rpx;
  546. font-family: SourceHanSansSC, SourceHanSansSC;
  547. font-weight: 500;
  548. color: #111;
  549. line-height: 34rpx;
  550. }
  551. .value {
  552. margin-top: 20rpx;
  553. font-size: 22rpx;
  554. font-family: SourceHanSansSC, SourceHanSansSC;
  555. font-weight: 400;
  556. color: #999999;
  557. line-height: 24rpx;
  558. }
  559. .tip {
  560. margin-top: 20rpx;
  561. text-align: center;
  562. width: 100rpx;
  563. height: 30rpx;
  564. // background: rgba(204, 179, 117);
  565. border-radius: 6rpx;
  566. border: 1rpx solid #CCB375;
  567. .tip-value {
  568. font-size: 20rpx;
  569. font-family: Microsoft YaHei;
  570. font-weight: 400;
  571. color: #CCB375;
  572. line-height: 30rpx;
  573. opacity: 1;
  574. }
  575. }
  576. }
  577. .icon {
  578. width: 304rpx;
  579. height: 190rpx;
  580. background-image: var(--bgimg);
  581. background-size: 100% 100%;
  582. background-repeat: no-repeat;
  583. }
  584. }
  585. .container {
  586. min-height: 100vh;
  587. background-color: #f2f5f7;
  588. }
  589. .nav-bar {
  590. background-color: #fff;
  591. position: fixed;
  592. top: 0;
  593. left: 0;
  594. right: 0;
  595. z-index: 100;
  596. .nav-content {
  597. display: flex;
  598. align-items: center;
  599. justify-content: space-between;
  600. padding: 0 30rpx;
  601. .nav-left, .nav-right {
  602. width: 60rpx;
  603. height: 60rpx;
  604. display: flex;
  605. align-items: center;
  606. justify-content: center;
  607. .back-icon {
  608. width: 40rpx;
  609. height: 40rpx;
  610. }
  611. .more-dots {
  612. display: flex;
  613. flex-direction: column;
  614. gap: 4rpx;
  615. .dot {
  616. width: 6rpx;
  617. height: 6rpx;
  618. background-color: #333;
  619. border-radius: 50%;
  620. }
  621. }
  622. }
  623. .nav-title {
  624. font-size: 36rpx;
  625. font-weight: bold;
  626. color: #333;
  627. }
  628. }
  629. }
  630. .content {
  631. padding: 60rpx 30rpx 120rpx;
  632. }
  633. .info-section, .upload-section {
  634. background-color: #fff;
  635. border-radius: 20rpx;
  636. padding: 30rpx;
  637. margin-bottom: 30rpx;
  638. .section-title {
  639. font-size: 32rpx;
  640. font-weight: bold;
  641. color: #333;
  642. margin-bottom: 30rpx;
  643. }
  644. }
  645. .activation-type {
  646. display: flex;
  647. background-color: #f5f5f5;
  648. border-radius: 10rpx;
  649. padding: 4rpx;
  650. margin-bottom: 30rpx;
  651. .type-item {
  652. flex: 1;
  653. text-align: center;
  654. padding: 20rpx 0;
  655. border-radius: 8rpx;
  656. font-size: 28rpx;
  657. color: #666;
  658. transition: all 0.3s;
  659. &.active {
  660. background-color: #c2a75f;
  661. color: #fff;
  662. }
  663. }
  664. }
  665. .form-item {
  666. display: flex;
  667. align-items: center;
  668. margin-bottom: 30rpx;
  669. .form-label {
  670. width: 160rpx;
  671. font-size: 28rpx;
  672. color: #333;
  673. }
  674. .form-input {
  675. flex: 1;
  676. display: flex;
  677. align-items: center;
  678. justify-content: space-between;
  679. height: 80rpx;
  680. padding: 0 20rpx;
  681. background-color: #f8f8f8;
  682. border-radius: 10rpx;
  683. .picker-disabled--test {
  684. width: 100%;
  685. height: 100%;
  686. line-height: 80rpx;
  687. .uni-input {
  688. display: flex;
  689. flex-direction: row;
  690. align-items: center;
  691. .text {
  692. flex: 1;
  693. height: 100%;
  694. }
  695. }
  696. }
  697. .input-text {
  698. font-size: 28rpx;
  699. color: #333;
  700. &.placeholder {
  701. color: #999;
  702. }
  703. }
  704. .arrow-down {
  705. font-size: 20rpx;
  706. color: #999;
  707. }
  708. }
  709. .form-input-text {
  710. flex: 1;
  711. height: 80rpx;
  712. padding: 0 20rpx;
  713. background-color: #f8f8f8;
  714. border-radius: 10rpx;
  715. font-size: 28rpx;
  716. color: #333;
  717. }
  718. }
  719. .car-number-row {
  720. flex-direction: column;
  721. align-items: flex-start;
  722. .form-label {
  723. margin-bottom: 12rpx;
  724. }
  725. :deep(.car-number-input-root) {
  726. width: 100%;
  727. justify-content: flex-start;
  728. }
  729. }
  730. // .picture-wrapper {
  731. // margin-top: 30rpx;
  732. // .bg1 {
  733. // background: #F5F9FB;
  734. // border-radius: 10rpx;
  735. // padding: 40rpx 30rpx;
  736. // display: flex;
  737. // justify-content: space-between;
  738. // .name {
  739. // padding-top: 30rpx;
  740. // font-size: 32rpx;
  741. // font-family: SourceHanSansSC, SourceHanSansSC;
  742. // font-weight: 500;
  743. // color: #111;
  744. // line-height: 34rpx;
  745. // }
  746. // .value {
  747. // margin-top: 20rpx;
  748. // font-size: 22rpx;
  749. // font-family: SourceHanSansSC, SourceHanSansSC;
  750. // font-weight: 400;
  751. // color: #999999;
  752. // line-height: 24rpx;
  753. // }
  754. // .tip {
  755. // margin-top: 20rpx;
  756. // text-align: center;
  757. // width: 100rpx;
  758. // height: 30rpx;
  759. // border-radius: 6rpx;
  760. // border: 1rpx solid #CCB375;
  761. // .tip-value {
  762. // font-size: 20rpx;
  763. // font-family: Microsoft YaHei;
  764. // font-weight: 400;
  765. // color: #CCB375;
  766. // line-height: 30rpx;
  767. // opacity: 1;
  768. // }
  769. // }
  770. // }
  771. // .icon {
  772. // width: 304rpx;
  773. // height: 190rpx;
  774. // background-image: var(--bgimg);
  775. // background-size: 100% 100%;
  776. // background-repeat: no-repeat;
  777. // }
  778. // }
  779. .bottom-button {
  780. position: fixed;
  781. bottom: 0;
  782. left: 0;
  783. right: 0;
  784. height: 100rpx;
  785. background-color: #133850;
  786. color: #fff;
  787. font-size: 32rpx;
  788. font-weight: bold;
  789. display: flex;
  790. align-items: center;
  791. justify-content: center;
  792. }
  793. .send-code-btn {
  794. margin-left: 16rpx;
  795. background: #f8f4e7;
  796. color: #ccb375;
  797. border: 1px solid #ccb375;
  798. border-radius: 10rpx;
  799. font-size: 24rpx;
  800. height: 60rpx;
  801. line-height: 60rpx;
  802. padding: 0 20rpx;
  803. }
  804. </style>