certification.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811
  1. <template>
  2. <view class="container">
  3. <scroll-view class="content" scroll-y>
  4. <!-- 驳回意见提示 -->
  5. <view class="rejection-banner" v-if="rejectionInfo">
  6. <view class="rejection-icon">✕</view>
  7. <view class="rejection-text">驳回意见: {{ rejectionInfo }}</view>
  8. </view>
  9. <!-- 基本信息 -->
  10. <view class="form-section">
  11. <view class="section-header">
  12. <view class="section-indicator"></view>
  13. <text class="section-title">基本信息</text>
  14. </view>
  15. <view class="form-item">
  16. <view class="form-label">
  17. <text class="required">*</text>
  18. <text>姓名</text>
  19. </view>
  20. <input
  21. class="form-input"
  22. v-model="formData.name"
  23. placeholder="请输入姓名"
  24. placeholder-class="placeholder"
  25. />
  26. </view>
  27. <view class="form-item">
  28. <view class="form-label">
  29. <text class="required">*</text>
  30. <text>身份证号</text>
  31. </view>
  32. <input
  33. class="form-input"
  34. v-model="formData.idNumber"
  35. placeholder="请输入身份证号"
  36. maxlength="18"
  37. placeholder-class="placeholder"
  38. />
  39. </view>
  40. <view class="form-item">
  41. <view class="form-label">
  42. <text class="required">*</text>
  43. <text>账号身份</text>
  44. </view>
  45. <input
  46. class="form-input"
  47. v-model="formData.accountIdentity"
  48. placeholder="请输入账号身份"
  49. placeholder-class="placeholder"
  50. />
  51. </view>
  52. <view class="form-item">
  53. <view class="form-label">
  54. <text class="required">*</text>
  55. <text>机构</text>
  56. </view>
  57. <picker style="flex:1" mode="selector" :range="institutionList" range-key="name" @change="onInstitutionChange">
  58. <view class="form-input picker-input" :class="{ placeholder: !formData.institution }">
  59. {{ formData.institution || '请选择机构' }}
  60. <image class="w36 h36" src="@/static/image/icon_my_more.png" mode=""></image>
  61. </view>
  62. </picker>
  63. </view>
  64. <view class="form-item">
  65. <view class="form-label">
  66. <text class="required">*</text>
  67. <text>科室</text>
  68. </view>
  69. <picker style="flex:1" mode="selector" :range="departmentList" range-key="name" @change="onDepartmentChange">
  70. <view class="form-input picker-input" :class="{ placeholder: !formData.department }">
  71. {{ formData.department || '请选择科室' }}
  72. <image class="w36 h36" src="@/static/image/icon_my_more.png" mode=""></image>
  73. </view>
  74. </picker>
  75. </view>
  76. <view class="form-item">
  77. <view class="form-label">
  78. <text class="required">*</text>
  79. <text>职称</text>
  80. </view>
  81. <picker style="flex:1" mode="selector" :range="titleList" range-key="name" @change="onTitleChange">
  82. <view class="form-input picker-input" :class="{ placeholder: !formData.title }">
  83. {{ formData.title || '请选择职称' }}
  84. <image class="w36 h36" src="@/static/image/icon_my_more.png" mode=""></image>
  85. </view>
  86. </picker>
  87. </view>
  88. </view>
  89. <!-- 身份证明 -->
  90. <view class="form-section">
  91. <view class="section-header">
  92. <view class="section-indicator"></view>
  93. <text class="section-title">身份证明</text>
  94. <view class="section-subtitle">以下资质任意选填其中一个</view>
  95. </view>
  96. <!-- 医师职业证 -->
  97. <view class="certificate-item">
  98. <view class="certificate-header">
  99. <view class="x-f">
  100. <view class="certificate-title">医师职业证</view>
  101. <view class="certificate-tip">-至少需上传编码页和执业点页</view>
  102. </view>
  103. <view class="example-btn" @click="goToPracticeExample">
  104. <image class="w28 h28" src="@/static/image/icon_example.png" mode=""></image>
  105. <text>示例</text>
  106. </view>
  107. </view>
  108. <view class="upload-grid">
  109. <view class="upload-item" v-for="(image, index) in formData.practiceCertificate" :key="index">
  110. <image class="uploaded-image" :src="image" mode="aspectFill" @click="previewImage(image, formData.practiceCertificate)"></image>
  111. <view class="delete-btn" @click="removePracticeImage(index)">×</view>
  112. </view>
  113. <view class="upload-item upload-placeholder" @click="choosePracticeImage" v-if="formData.practiceCertificate.length < 2">
  114. <image class="bg" src="@/static/image/img_idcard_Front.png" mode=""></image>
  115. <view class="img-btn">
  116. <image class="w56 h56" src="@/static/image/icon_uplodeidcard.png" mode=""></image>
  117. <text class="upload-text">点击上传</text>
  118. </view>
  119. </view>
  120. </view>
  121. </view>
  122. <!-- 医师职称证/工牌 -->
  123. <view class="certificate-item">
  124. <view class="certificate-header">
  125. <view class="certificate-title">医师职称证/工牌</view>
  126. <view class="example-btn" @click="goToTitleExample">
  127. <image class="w28 h28" src="@/static/image/icon_example.png" mode=""></image>
  128. <text>示例</text>
  129. </view>
  130. </view>
  131. <view class="upload-grid">
  132. <view class="upload-item" v-for="(image, index) in formData.titleCertificate" :key="index">
  133. <image class="uploaded-image" :src="image" mode="aspectFill" @click="previewImage(image, formData.titleCertificate)"></image>
  134. <view class="delete-btn" @click="removeTitleImage(index)">×</view>
  135. </view>
  136. <view class="upload-item upload-placeholder" @click="chooseTitleImage">
  137. <image class="bg" src="@/static/image/img_idcard_Front.png" mode=""></image>
  138. <view class="img-btn">
  139. <image class="w56 h56" src="@/static/image/icon_uplodeidcard.png" mode=""></image>
  140. <text class="upload-text">点击上传</text>
  141. </view>
  142. </view>
  143. </view>
  144. </view>
  145. </view>
  146. <!-- 银行卡信息 -->
  147. <view class="form-section">
  148. <view class="section-header">
  149. <view class="section-indicator"></view>
  150. <text class="section-title">银行卡信息</text>
  151. </view>
  152. <view class="form-item">
  153. <view class="form-label">
  154. <text class="required">*</text>
  155. <text>开户行</text>
  156. </view>
  157. <picker style="flex:1" mode="selector" :range="bankList" range-key="name" @change="onBankChange">
  158. <view class="form-input picker-input" :class="{ placeholder: !formData.bank }">
  159. {{ formData.bank || '请选择开户行' }}
  160. <image class="w36 h36" src="@/static/image/icon_my_more.png" mode=""></image>
  161. </view>
  162. </picker>
  163. </view>
  164. <view class="form-item">
  165. <view class="form-label">
  166. <text class="required">*</text>
  167. <text>支行名称</text>
  168. </view>
  169. <input
  170. class="form-input"
  171. v-model="formData.branchName"
  172. placeholder="请输入支行名称"
  173. />
  174. </view>
  175. <view class="form-item">
  176. <view class="form-label">
  177. <text class="required">*</text>
  178. <text>银行卡号</text>
  179. </view>
  180. <input
  181. class="form-input"
  182. v-model="formData.bankCardNumber"
  183. placeholder="请输入银行卡号"
  184. type="number"
  185. />
  186. </view>
  187. </view>
  188. </scroll-view>
  189. <!-- 底部操作栏 -->
  190. <view class="bottom-bar">
  191. <view class="action-buttons">
  192. <view class="btn btn-cancel" @click="handleCancel">暂不认证</view>
  193. <view class="btn btn-submit" @click="handleSubmit">提交认证</view>
  194. </view>
  195. <view class="agreement-checkbox x-c">
  196. <checkbox-group @change="onAgreementChange">
  197. <label class="checkbox-label">
  198. <checkbox value="agree" :checked="agreed" color="#388BFF" />
  199. <text class="agreement-text">
  200. 我已阅读并同意
  201. <text class="link-text" @click.stop="goToUserAgreement">《用户协议》</text>
  202. <text class="link-text" @click.stop="goToInformedConsent">《知情同意书》</text>
  203. </text>
  204. </label>
  205. </checkbox-group>
  206. </view>
  207. </view>
  208. </view>
  209. </template>
  210. <script>
  211. import { submitCertification, getCertificationInfo } from '@/api-js/certification'
  212. export default {
  213. data() {
  214. return {
  215. rejectionInfo: '', // 驳回意见
  216. agreed: false,
  217. formData: {
  218. name: '',
  219. idNumber: '',
  220. accountIdentity: '',
  221. institution: '',
  222. department: '',
  223. title: '',
  224. practiceCertificate: [], // 医师职业证图片数组
  225. titleCertificate: [], // 医师职称证/工牌图片数组
  226. bank: '',
  227. branchName: '',
  228. bankCardNumber: ''
  229. },
  230. institutionList: [],
  231. departmentList: [],
  232. titleList: [],
  233. bankList: []
  234. }
  235. },
  236. onLoad(options) {
  237. if (options.rejectionInfo) {
  238. this.rejectionInfo = decodeURIComponent(options.rejectionInfo)
  239. }
  240. this.institutionList = [
  241. { name: '机构1', id: 1 },
  242. { name: '机构2', id: 2 }
  243. ]
  244. this.departmentList = [
  245. { name: '内科', id: 1 },
  246. { name: '外科', id: 2 },
  247. { name: '儿科', id: 3 }
  248. ]
  249. this.titleList = [
  250. { name: '主任医师', id: 1 },
  251. { name: '副主任医师', id: 2 },
  252. { name: '主治医师', id: 3 }
  253. ]
  254. this.bankList = [
  255. { name: '中国工商银行', id: 1 },
  256. { name: '中国建设银行', id: 2 },
  257. { name: '中国银行', id: 3 }
  258. ]
  259. //this.loadData()
  260. },
  261. methods: {
  262. async loadData() {
  263. try {
  264. // 加载认证信息(如果已提交过)
  265. const res = await getCertificationInfo()
  266. if (res.code === 200 && res.data) {
  267. this.formData = { ...this.formData, ...res.data }
  268. if (res.data.rejectionInfo) {
  269. this.rejectionInfo = res.data.rejectionInfo
  270. }
  271. }
  272. // 加载选项数据
  273. this.loadOptions()
  274. } catch (e) {
  275. console.error('加载数据失败', e)
  276. this.loadOptions()
  277. }
  278. },
  279. loadOptions() {
  280. // 这里应该从API获取选项数据
  281. this.institutionList = [
  282. { name: '机构1', id: 1 },
  283. { name: '机构2', id: 2 }
  284. ]
  285. this.departmentList = [
  286. { name: '内科', id: 1 },
  287. { name: '外科', id: 2 },
  288. { name: '儿科', id: 3 }
  289. ]
  290. this.titleList = [
  291. { name: '主任医师', id: 1 },
  292. { name: '副主任医师', id: 2 },
  293. { name: '主治医师', id: 3 }
  294. ]
  295. this.bankList = [
  296. { name: '中国工商银行', id: 1 },
  297. { name: '中国建设银行', id: 2 },
  298. { name: '中国银行', id: 3 }
  299. ]
  300. },
  301. onInstitutionChange(e) {
  302. const index = e.detail.value
  303. this.formData.institution = this.institutionList[index].name
  304. },
  305. onDepartmentChange(e) {
  306. const index = e.detail.value
  307. this.formData.department = this.departmentList[index].name
  308. },
  309. onTitleChange(e) {
  310. const index = e.detail.value
  311. this.formData.title = this.titleList[index].name
  312. },
  313. onBankChange(e) {
  314. const index = e.detail.value
  315. this.formData.bank = this.bankList[index].name
  316. },
  317. onAgreementChange(e) {
  318. this.agreed = e.detail.value.includes('agree')
  319. },
  320. choosePracticeImage() {
  321. uni.chooseImage({
  322. count: 2 - this.formData.practiceCertificate.length,
  323. sizeType: ['compressed'],
  324. sourceType: ['album', 'camera'],
  325. success: (res) => {
  326. this.formData.practiceCertificate = [...this.formData.practiceCertificate, ...res.tempFilePaths]
  327. }
  328. })
  329. },
  330. removePracticeImage(index) {
  331. this.formData.practiceCertificate.splice(index, 1)
  332. },
  333. chooseTitleImage() {
  334. uni.chooseImage({
  335. count: 9 - this.formData.titleCertificate.length,
  336. sizeType: ['compressed'],
  337. sourceType: ['album', 'camera'],
  338. success: (res) => {
  339. this.formData.titleCertificate = [...this.formData.titleCertificate, ...res.tempFilePaths]
  340. }
  341. })
  342. },
  343. removeTitleImage(index) {
  344. this.formData.titleCertificate.splice(index, 1)
  345. },
  346. previewImage(current, urls) {
  347. uni.previewImage({
  348. current: current,
  349. urls: urls
  350. })
  351. },
  352. goToPracticeExample() {
  353. uni.navigateTo({
  354. url: '/pages_user/practiceCertificateExample'
  355. })
  356. },
  357. goToTitleExample() {
  358. uni.navigateTo({
  359. url: '/pages_user/certificationExample'
  360. })
  361. },
  362. goToUserAgreement() {
  363. uni.navigateTo({
  364. url: '/pages_user/userAgreement'
  365. })
  366. },
  367. goToInformedConsent() {
  368. uni.navigateTo({
  369. url: '/pages_user/informedConsent'
  370. })
  371. },
  372. handleCancel() {
  373. uni.navigateBack()
  374. },
  375. async handleSubmit() {
  376. // 表单验证
  377. if (!this.formData.name) {
  378. uni.showToast({
  379. icon: 'none',
  380. title: '请输入姓名'
  381. })
  382. return
  383. }
  384. if (!this.formData.idNumber) {
  385. uni.showToast({
  386. icon: 'none',
  387. title: '请输入身份证号'
  388. })
  389. return
  390. }
  391. if (!this.formData.accountIdentity) {
  392. uni.showToast({
  393. icon: 'none',
  394. title: '请输入账号身份'
  395. })
  396. return
  397. }
  398. if (!this.formData.institution) {
  399. uni.showToast({
  400. icon: 'none',
  401. title: '请选择机构'
  402. })
  403. return
  404. }
  405. if (!this.formData.department) {
  406. uni.showToast({
  407. icon: 'none',
  408. title: '请选择科室'
  409. })
  410. return
  411. }
  412. if (!this.formData.title) {
  413. uni.showToast({
  414. icon: 'none',
  415. title: '请选择职称'
  416. })
  417. return
  418. }
  419. // 至少上传一种证件
  420. if (this.formData.practiceCertificate.length === 0 && this.formData.titleCertificate.length === 0) {
  421. uni.showToast({
  422. icon: 'none',
  423. title: '请至少上传一种身份证明'
  424. })
  425. return
  426. }
  427. // 医师职业证至少上传2张
  428. if (this.formData.practiceCertificate.length > 0 && this.formData.practiceCertificate.length < 2) {
  429. uni.showToast({
  430. icon: 'none',
  431. title: '医师职业证至少需上传编码页和执业点页'
  432. })
  433. return
  434. }
  435. if (!this.formData.bank) {
  436. uni.showToast({
  437. icon: 'none',
  438. title: '请选择开户行'
  439. })
  440. return
  441. }
  442. if (!this.formData.branchName) {
  443. uni.showToast({
  444. icon: 'none',
  445. title: '请输入支行名称'
  446. })
  447. return
  448. }
  449. if (!this.formData.bankCardNumber) {
  450. uni.showToast({
  451. icon: 'none',
  452. title: '请输入银行卡号'
  453. })
  454. return
  455. }
  456. if (!this.agreed) {
  457. uni.showToast({
  458. icon: 'none',
  459. title: '请阅读并同意用户协议和知情同意书'
  460. })
  461. return
  462. }
  463. try {
  464. uni.showLoading({ title: '提交中...' })
  465. const res = await submitCertification(this.formData)
  466. uni.hideLoading()
  467. if (res.code === 200) {
  468. uni.showToast({
  469. icon: 'success',
  470. title: '提交成功'
  471. })
  472. setTimeout(() => {
  473. uni.navigateBack()
  474. }, 1500)
  475. } else {
  476. uni.showToast({
  477. icon: 'none',
  478. title: res.msg || '提交失败'
  479. })
  480. }
  481. } catch (e) {
  482. uni.hideLoading()
  483. uni.showToast({
  484. icon: 'none',
  485. title: '提交失败'
  486. })
  487. }
  488. }
  489. }
  490. }
  491. </script>
  492. <style lang="scss" scoped>
  493. .container {
  494. min-height: 100vh;
  495. background: #f5f5f5;
  496. display: flex;
  497. flex-direction: column;
  498. }
  499. .content {
  500. flex: 1;
  501. padding-bottom: 200rpx;
  502. box-sizing: border-box;
  503. }
  504. .rejection-banner {
  505. display: flex;
  506. align-items: center;
  507. padding: 24rpx;
  508. background: #FF5030;
  509. color: #fff;
  510. margin: 24rpx;
  511. border-radius: 8rpx;
  512. .rejection-icon {
  513. width: 40rpx;
  514. height: 40rpx;
  515. border-radius: 50%;
  516. background: rgba(255, 255, 255, 0.3);
  517. display: flex;
  518. align-items: center;
  519. justify-content: center;
  520. font-size: 24rpx;
  521. margin-right: 16rpx;
  522. }
  523. .rejection-text {
  524. flex: 1;
  525. font-size: 28rpx;
  526. line-height: 1.5;
  527. }
  528. }
  529. .form-section {
  530. background: #fff;
  531. margin: 20rpx;
  532. border-radius: 16rpx;
  533. padding: 32rpx;
  534. .section-header {
  535. display: flex;
  536. align-items: center;
  537. margin-bottom: 32rpx;
  538. .section-indicator {
  539. width: 6rpx;
  540. height: 32rpx;
  541. background: #388BFF;
  542. border-radius: 3rpx;
  543. margin-right: 16rpx;
  544. }
  545. .section-title {
  546. font-size: 32rpx;
  547. font-weight: bold;
  548. color: #333;
  549. }
  550. }
  551. .section-subtitle {
  552. font-size: 24rpx;
  553. color: #999;
  554. //margin-bottom: 24rpx;
  555. margin-left: 22rpx;
  556. }
  557. .form-item {
  558. margin-bottom: 32rpx;
  559. display: flex;
  560. align-items: center;
  561. border-bottom: 1px solid #EBEDF0;
  562. &:last-child {
  563. border-bottom: 0;
  564. margin-bottom: 0;
  565. }
  566. .form-label {
  567. display: flex;
  568. align-items: center;
  569. font-size: 28rpx;
  570. color: #333;
  571. margin-bottom: 16rpx;
  572. width: 150rpx;
  573. .required {
  574. color: #FF5030;
  575. margin-right: 4rpx;
  576. }
  577. }
  578. .form-input {
  579. // width: 100%;
  580. flex:1;
  581. height: 80rpx;
  582. padding: 0 24rpx;
  583. font-size: 28rpx;
  584. color: #333;
  585. &.placeholder {
  586. color: #C8C9CC;
  587. }
  588. &.picker-input {
  589. display: flex;
  590. align-items: center;
  591. justify-content: space-between;
  592. .arrow-right {
  593. font-size: 32rpx;
  594. color: #999;
  595. }
  596. }
  597. }
  598. }
  599. .certificate-item {
  600. padding-bottom: 32rpx;
  601. margin-bottom: 32rpx;
  602. border-bottom: 2rpx solid #F5F5F5;
  603. &:last-child {
  604. margin-bottom: 0;
  605. border-bottom: 0;
  606. }
  607. .certificate-header {
  608. display: flex;
  609. align-items: center;
  610. justify-content: space-between;
  611. margin-bottom: 24rpx;
  612. .certificate-title {
  613. font-size: 28rpx;
  614. color: #333;
  615. font-weight: 500;
  616. }
  617. .example-btn {
  618. display: flex;
  619. align-items: center;
  620. gap: 8rpx;
  621. font-size: 24rpx;
  622. color: #388BFF;
  623. .example-icon {
  624. width: 32rpx;
  625. height: 32rpx;
  626. border-radius: 50%;
  627. background: #E6F7FF;
  628. display: flex;
  629. align-items: center;
  630. justify-content: center;
  631. font-size: 20rpx;
  632. color: #388BFF;
  633. }
  634. }
  635. }
  636. .certificate-tip {
  637. font-size: 24rpx;
  638. color: #999;
  639. // margin-bottom: 16rpx;
  640. }
  641. .upload-grid {
  642. display: flex;
  643. gap: 16rpx;
  644. flex-wrap: wrap;
  645. .upload-item {
  646. width: 310rpx;
  647. height: 176rpx;
  648. border-radius: 8rpx;
  649. overflow: hidden;
  650. position: relative;
  651. .uploaded-image {
  652. width: 100%;
  653. height: 100%;
  654. }
  655. .bg{
  656. width: 100%;
  657. height: 100%;
  658. position: absolute;
  659. top: 0;
  660. left: 0;
  661. }
  662. .delete-btn {
  663. position: absolute;
  664. top: 0;
  665. right: 0;
  666. width: 40rpx;
  667. height: 40rpx;
  668. line-height: 40rpx;
  669. background: rgba(0, 0, 0, 0.5);
  670. border-radius: 50%;
  671. display: flex;
  672. align-items: center;
  673. justify-content: center;
  674. font-size: 32rpx;
  675. color: #fff;
  676. }
  677. &.upload-placeholder {
  678. background: #f5f5f5;
  679. display: flex;
  680. flex-direction: column;
  681. align-items: center;
  682. justify-content: center;
  683. // border: 2rpx dashed #ddd;
  684. .img-btn{
  685. z-index: 1;
  686. display: flex;
  687. flex-direction: column;
  688. align-items: center;
  689. justify-content: center;
  690. }
  691. .camera-icon {
  692. font-size: 60rpx;
  693. margin-bottom: 8rpx;
  694. }
  695. .upload-text {
  696. font-size: 24rpx;
  697. color: #388BFF;
  698. }
  699. }
  700. }
  701. }
  702. }
  703. }
  704. .bottom-bar {
  705. position: fixed;
  706. bottom: 0;
  707. left: 0;
  708. right: 0;
  709. background: #fff;
  710. padding: 24rpx;
  711. // border-top: 1rpx solid #f0f0f0;
  712. z-index: 100;
  713. .agreement-checkbox {
  714. margin-bottom: 24rpx;
  715. margin-top: 20rpx;
  716. .checkbox-label {
  717. display: flex;
  718. align-items: flex-start;
  719. font-size: 24rpx;
  720. color: #666;
  721. .agreement-text {
  722. margin-left: 8rpx;
  723. line-height: 1.5;
  724. .link-text {
  725. color: #388BFF;
  726. }
  727. }
  728. }
  729. }
  730. .action-buttons {
  731. display: flex;
  732. gap: 24rpx;
  733. .btn {
  734. flex: 1;
  735. height: 88rpx;
  736. display: flex;
  737. align-items: center;
  738. justify-content: center;
  739. border-radius: 8rpx;
  740. font-size: 32rpx;
  741. font-weight: 500;
  742. border-radius: 200rpx 200rpx 200rpx 200rpx;
  743. &.btn-cancel {
  744. background: #fff;
  745. border: 2rpx solid #388BFF;
  746. color: #388BFF;
  747. }
  748. &.btn-submit {
  749. background: #388BFF;
  750. color: #fff;
  751. }
  752. }
  753. }
  754. }
  755. </style>