index.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743
  1. <script setup>
  2. import { ref, reactive, computed, watch, onMounted } from 'vue'
  3. import { showToast, showConfirmDialog } from 'vant'
  4. import TopNavBar from '@/business/top-nav-bar.vue'
  5. import { getStudentDetail, getStudentLeaveApplication, applyForResumption, withdrawApplication } from '@/services/student-prosthetics'
  6. import utils from '@/utils/utils'
  7. // 学生数据
  8. const students = ref([
  9. {
  10. id: 'ec03f17b3474469f99cf7039bb11e688',
  11. name: '李小明',
  12. gradeClass: '',
  13. schoolName: '',
  14. studentNo: '',
  15. studentStatusStr: '', // 状态:'在校' 或 '休学中'
  16. applying: false, // 是否正在申请
  17. applyStatusStr: '', // 申请状态
  18. leaveType: null, // 申请类型:'1 休学' 或 '2 复学'
  19. certNo: null // 存证id
  20. },
  21. {
  22. id: 'e909040887a644a4b1b7bf2f0d6e9460',
  23. name: '李飞',
  24. studentId: '',
  25. gradeClass: '',
  26. schoolName: '',
  27. studentNo: '',
  28. studentStatusStr: '休学中',
  29. applying: false,
  30. applyStatusStr: '',
  31. leaveType: 1,
  32. certNo: 'LV202401150001'
  33. },
  34. // {
  35. // id: 3,
  36. // name: '张小刚',
  37. // studentId: '2023030303',
  38. // gradeClass: '初三·2班',
  39. // schoolName: '太原市第五中学',
  40. // studentNo: '123',
  41. // studentStatusStr: '在校',
  42. // applying: true,
  43. // applyStatusStr: '审批中', // 申请状态
  44. // leaveType: 1,
  45. // certNo: null
  46. // }
  47. ])
  48. // 当前选中的学生
  49. const selectedStudent = ref(null)
  50. // 申请表单数据
  51. const formData = reactive({
  52. leaveType: 1, // 1'休学' 或 2'复学'
  53. diseaseDiagnosis: '',
  54. expectedStartDate: '',
  55. expectedEndDate: '',
  56. auditOpinion: '',
  57. stdLeaveAttachments: []
  58. })
  59. // 期限描述
  60. const periodDescription = computed(() => {
  61. if (!formData.expectedStartDate || !formData.expectedEndDate) return ''
  62. const start = new Date(formData.expectedStartDate)
  63. const end = new Date(formData.expectedEndDate)
  64. const days = Math.ceil((end - start) / (1000 * 60 * 60 * 24))
  65. return `共${days}天`
  66. })
  67. // 方法:选择学生
  68. const selectStudent = (student) => {
  69. if (student.applying) {
  70. showToast('该学生有正在审批中的申请,请等待审批完成')
  71. }
  72. selectedStudent.value = student
  73. // 重置表单
  74. resetForm()
  75. }
  76. // 重置表单
  77. const resetForm = () => {
  78. if (selectedStudent.value) {
  79. if (selectedStudent.value.studentStatusStr === '休学中') {
  80. formData.leaveType = 2
  81. } else {
  82. formData.leaveType = 1
  83. }
  84. formData.diseaseDiagnosis = ''
  85. formData.expectedStartDate = ''
  86. formData.expectedEndDate = ''
  87. formData.auditOpinion = ''
  88. formData.stdLeaveAttachments = []
  89. }
  90. }
  91. // 查看存证
  92. const viewEvidence = (student) => {
  93. localStorage.setItem('studentInfo', JSON.stringify(student))
  94. uni.navigateTo({
  95. url: `/modules/common/student-prosthetics/certificate`
  96. })
  97. }
  98. // 查看审批进度
  99. const viewProgress = (student) => {
  100. localStorage.setItem('studentInfo', JSON.stringify(student))
  101. uni.navigateTo({
  102. url: `/modules/common/student-prosthetics/approval-progress`
  103. })
  104. }
  105. const showDialog = ref(false)
  106. const auditOpinion = ref('')
  107. // 撤回申请
  108. const withdrawApply = () => {
  109. if (!selectedStudent.value?.applying) return
  110. auditOpinion.value = ''
  111. showDialog.value = true
  112. }
  113. const handleConfirm = async () => {
  114. if (!auditOpinion.value.trim()) {
  115. showToast('请输入撤回原因')
  116. return
  117. }
  118. try {
  119. await showConfirmDialog({
  120. title: '确认撤回',
  121. message: '确定要撤回申请吗?撤回后需要重新提交'
  122. })
  123. withdrawApplication({
  124. auditOpinion: auditOpinion.value,
  125. auditorId: selectedStudent.value.applicantId,
  126. auditorName: selectedStudent.value.applicantName,
  127. }).then(res => {
  128. if (res.success) {
  129. showToast('撤回成功')
  130. init(0)
  131. init(1)
  132. selectedStudent.value = null
  133. }
  134. })
  135. } catch (error) {
  136. // 用户取消
  137. }
  138. }
  139. // 提交申请
  140. const submitApply = async () => {
  141. // 表单验证
  142. if (!formData.diseaseDiagnosis.trim()) {
  143. showToast('请输入诊断记录')
  144. return
  145. }
  146. if (!formData.expectedStartDate) {
  147. showToast('请选择开始日期')
  148. return
  149. }
  150. if (!formData.expectedEndDate) {
  151. showToast('请选择结束日期')
  152. return
  153. }
  154. if (!formData.auditOpinion.trim()) {
  155. showToast('请输入申请原因')
  156. return
  157. }
  158. if (!formData.stdLeaveAttachments || !formData.stdLeaveAttachments.length) {
  159. showToast('请上传证明材料')
  160. return
  161. }
  162. let params = {
  163. studentId: selectedStudent.value.id,
  164. studentName: selectedStudent.value.name,
  165. applicantId: "02e168c19b7c456eafeb647853a079ae",
  166. applicantName: "15296619861",
  167. ...formData
  168. }
  169. params.expectedStartDate = params.expectedStartDate + ' 00:00:00'
  170. params.expectedEndDate = params.expectedEndDate + ' 00:00:00'
  171. if (params.stdLeaveAttachments && params.stdLeaveAttachments.length) {
  172. params.stdLeaveAttachments = params.stdLeaveAttachments.map(item => {
  173. return {
  174. fileName: item.fileName,
  175. fileUrl: item.fileUrl,
  176. fileType: item.fileType
  177. }
  178. })
  179. }
  180. applyForResumption(params).then(res => {
  181. if (res.success) {
  182. showToast('提交成功,等待审批')
  183. init(0)
  184. init(1)
  185. selectedStudent.value = null
  186. }
  187. })
  188. }
  189. // 上传文件
  190. const afterRead = async (file) => {
  191. let files = []
  192. if (Array.isArray(file)) {
  193. files = file
  194. } else {
  195. files = [file]
  196. }
  197. console.log('afterRead', files)
  198. const res = await utils.transferOssUrl(files) || []
  199. formData.stdLeaveAttachments = formData.stdLeaveAttachments.map(item => {
  200. if (item.file) {
  201. const index = res.findIndex(file => file.objectUrl === item.objectUrl)
  202. if (index !== -1) {
  203. return res[index]
  204. }
  205. }
  206. return item
  207. })
  208. }
  209. // 删除文件
  210. const removeFile = () => { }
  211. // 日期选择器相关
  212. const showStartDatePicker = ref(false)
  213. const showEndDatePicker = ref(false)
  214. const onStartDateConfirm = ({ selectedValues }) => {
  215. formData.expectedStartDate = selectedValues.join('-')
  216. showStartDatePicker.value = false
  217. }
  218. const onEndDateConfirm = ({ selectedValues }) => {
  219. formData.expectedEndDate = selectedValues.join('-')
  220. showEndDatePicker.value = false
  221. }
  222. const getStudentDetailFun = (id) => {
  223. return new Promise(async (resolve, reject) => {
  224. const res1 = await getStudentDetail({ id })
  225. const res2 = await getStudentLeaveApplication({ studentId: id })
  226. if (res1.success && res2.success) {
  227. const res1Info = res1.info || {}
  228. const res2Info = res2.info || {}
  229. resolve({
  230. success: res1.success && res2.success,
  231. info: {
  232. res1: {
  233. id: res1Info.id,
  234. name: res1Info.name,
  235. gradeClass: res1Info.gradeClass,
  236. schoolName: res1Info.schoolName,
  237. studentNo: res1Info.studentNo,
  238. },
  239. res2: {
  240. studentStatusStr: res2Info.studentStatusStr || '在校', // 状态:'在校' 或 '休学中'
  241. applying: res2Info.applyStatusStr ? true : false, // 是否正在申请
  242. applyStatusStr: res2Info.applyStatusStr, // 申请状态
  243. leaveType: res2Info.leaveType, // 申请类型:'1 休学' 或 '2 复学'
  244. certNo: res2Info.certNo, // 存证id
  245. createdTime: res2Info.createdTime || '', // 申请时间 存证时间
  246. details: {
  247. diseaseDiagnosis: res2Info.diseaseDiagnosis,
  248. expectedStartDate: res2Info.expectedStartDate,
  249. expectedEndDate: res2Info.expectedEndDate,
  250. auditOpinion: res2Info.auditOpinion
  251. },
  252. applicationId: res2Info.id,
  253. applicantId: res2Info.applicantId,
  254. applicantName: res2Info.applicantName,
  255. tenantId: res2Info.tenantId
  256. }
  257. }
  258. })
  259. } else {
  260. reject()
  261. }
  262. })
  263. }
  264. const init = (num = 0) => {
  265. const id = students.value[num]?.id
  266. getStudentDetailFun(id).then((res) => {
  267. if (res.success) {
  268. students.value[num] = Object.assign({}, students.value[num], res.info.res1, res.info.res2)
  269. // students.value[num].applying = false // 硬编码 需删除
  270. // students.value[num].certNo = '100000' // 硬编码 需删除
  271. // students.value[num].studentStatusStr = '休学中' // 硬编码 需删除
  272. }
  273. })
  274. }
  275. onMounted(() => {
  276. init(0)
  277. init(1)
  278. })
  279. </script>
  280. <template>
  281. <div class="apply-page">
  282. <TopNavBar></TopNavBar>
  283. <!-- 选择学生部分 -->
  284. <div class="section">
  285. <div class="section-title">选择学生</div>
  286. <div class="student-list">
  287. <div v-for="student in students" :key="student.id" class="student-item"
  288. :class="{ active: selectedStudent?.id === student.id }" @click="selectStudent(student)">
  289. <div class="student-info">
  290. <div class="name-status">
  291. <span class="name">{{ student.name }}</span>
  292. <span class="status-badge" :class="student.studentStatusStr">
  293. {{ student.studentStatusStr }}
  294. </span>
  295. </div>
  296. <div class="class-info">{{ student.gradeClass }}</div>
  297. <div v-if="student.certNo" class="extra-info">
  298. <div class="evidence-id">存证编号:{{ student.certNo }}</div>
  299. <van-button v-if="student.studentStatusStr === '休学中'" size="mini" type="primary"
  300. @click.stop="viewEvidence(student)">
  301. 查看存证
  302. </van-button>
  303. </div>
  304. <div v-if="student.applying" class="extra-info">
  305. <div class="applying-status">{{ student.applyStatusStr }}</div>
  306. <van-button size="mini" type="primary" @click.stop="viewProgress(student)">
  307. 查看进度
  308. </van-button>
  309. </div>
  310. </div>
  311. </div>
  312. </div>
  313. </div>
  314. <!-- 学生信息和申请表单(只在选中学生时显示) -->
  315. <div v-if="selectedStudent" class="form-container">
  316. <!-- 学生信息 -->
  317. <div class="section">
  318. <div class="section-title">学生信息</div>
  319. <div class="info-grid">
  320. <div class="info-row">
  321. <div class="info-label">姓名</div>
  322. <div class="info-value">{{ selectedStudent.name }}</div>
  323. </div>
  324. <div class="info-row">
  325. <div class="info-label">学号</div>
  326. <div class="info-value">{{ selectedStudent.studentNo }}</div>
  327. </div>
  328. <div class="info-row">
  329. <div class="info-label">所属学校</div>
  330. <div class="info-value">{{ selectedStudent.schoolName }}</div>
  331. </div>
  332. <div class="info-row">
  333. <div class="info-label">当前年级</div>
  334. <div class="info-value">{{ selectedStudent.gradeClass }}</div>
  335. </div>
  336. </div>
  337. </div>
  338. <!-- 审批中的提示 -->
  339. <div v-if="selectedStudent.applying" class="section warning">
  340. <div class="warning-text">
  341. 该学生有正在审批中的休学申请,请等待审批完成后再发起新的申请。
  342. </div>
  343. <div class="apply-info">
  344. <div class="apply-row">
  345. <div class="apply-label">申请类型</div>
  346. <div class="apply-value">{{ selectedStudent.leaveType == 1 ? '休学' : '复学' }}</div>
  347. </div>
  348. <div class="apply-row">
  349. <div class="apply-label">提交时间</div>
  350. <div class="apply-value">{{ selectedStudent?.createdTime || '' }}</div>
  351. </div>
  352. <div class="apply-row">
  353. <div class="apply-label">当前状态</div>
  354. <div class="apply-value status-text">{{ selectedStudent.applyStatusStr }}</div>
  355. </div>
  356. </div>
  357. <div class="action-buttons">
  358. <van-button type="primary" @click="viewProgress(selectedStudent)">查看审批进度</van-button>
  359. <van-button v-if="selectedStudent.leaveType === 1" type="default" @click="withdrawApply">
  360. 撤回申请
  361. </van-button>
  362. </div>
  363. </div>
  364. <!-- 申请表单(只在非审批中状态显示) -->
  365. <div v-else class="section">
  366. <div class="section-title">申请信息</div>
  367. <!-- 业务类型 -->
  368. <div class="form-group">
  369. <div class="form-label">业务类型</div>
  370. <div class="radio-group">
  371. <van-radio-group v-model="formData.leaveType" direction="horizontal">
  372. <van-radio :name="1" :disabled="selectedStudent.studentStatusStr === '休学中'">休学</van-radio>
  373. <van-radio :name="2" :disabled="selectedStudent.studentStatusStr !== '休学中'">复学</van-radio>
  374. </van-radio-group>
  375. </div>
  376. </div>
  377. <!-- 诊断记录 -->
  378. <div class="form-group">
  379. <div class="form-label">诊断记录</div>
  380. <van-field v-model="formData.diseaseDiagnosis" type="textarea" placeholder="请输入医院诊断结果" rows="2"
  381. maxlength="200" show-word-limit />
  382. </div>
  383. <van-notice-bar left-icon="info-o" class="tw-mt-[10rpx]">
  384. 请务必按照医院诊断证明书上的结论据实填写
  385. </van-notice-bar>
  386. <!-- 开始日期 -->
  387. <div class="form-group">
  388. <div class="form-label">开始日期</div>
  389. <van-field v-model="formData.expectedStartDate" readonly placeholder="请选择开始日期"
  390. @click="showStartDatePicker = true" />
  391. </div>
  392. <!-- 结束日期 -->
  393. <div class="form-group">
  394. <div class="form-label">结束日期</div>
  395. <van-field v-model="formData.expectedEndDate" readonly placeholder="请选择结束日期"
  396. @click="showEndDatePicker = true" />
  397. </div>
  398. <!-- 期限描述 -->
  399. <div class="form-group">
  400. <div class="form-label">期限描述</div>
  401. <van-field v-model="periodDescription" placeholder="系统将根据起止日期自动计算期限" readonly />
  402. </div>
  403. <van-notice-bar color="#1989fa" background="#ecf9ff" left-icon="info-o" class="tw-mt-[10rpx]">
  404. 系统将根据起止日期自动计算期限
  405. </van-notice-bar>
  406. <!-- 申请原因 -->
  407. <div class="form-group">
  408. <div class="form-label">申请原因</div>
  409. <van-field v-model="formData.auditOpinion" type="textarea" placeholder="请详细说明申请原因" rows="3"
  410. maxlength="200" show-word-limit />
  411. </div>
  412. <!-- 日期选择器 -->
  413. <van-popup v-model:show="showStartDatePicker" position="bottom">
  414. <van-date-picker title="选择开始日期" @confirm="onStartDateConfirm" @cancel="showStartDatePicker = false" />
  415. </van-popup>
  416. <van-popup v-model:show="showEndDatePicker" position="bottom">
  417. <van-date-picker title="选择结束日期" @confirm="onEndDateConfirm" @cancel="showEndDatePicker = false" />
  418. </van-popup>
  419. </div>
  420. <!-- 证明材料 -->
  421. <div v-if="!selectedStudent.applying" class="section">
  422. <div class="section-title">证明材料</div>
  423. <div class="upload-list">
  424. <!-- 病历资料 -->
  425. <div class="upload-item">
  426. <div class="upload-title">医院诊断证明(必传)</div>
  427. <div class="upload-title">病历资料(支持多页)</div>
  428. <div class="upload-title">家长身份证复印件</div>
  429. <van-uploader v-model="formData.stdLeaveAttachments" multiple :max-count="9" :after-read="afterRead"
  430. @delete="removeFile" />
  431. </div>
  432. </div>
  433. </div>
  434. <!-- 提交按钮 -->
  435. <div v-if="!selectedStudent.applying" class="submit-section">
  436. <van-button type="primary" size="large" @click="submitApply">提交申请</van-button>
  437. </div>
  438. </div>
  439. </div>
  440. <van-dialog v-model:show="showDialog" title="撤回申请原因" showConfirmButton showCancelButton @confirm="handleConfirm">
  441. <van-field v-model="auditOpinion" type="textarea" placeholder="请输入撤回申请原因" rows="3" maxlength="200"
  442. show-word-limit />
  443. </van-dialog>
  444. </template>
  445. <style lang="scss" scoped>
  446. .apply-page {
  447. padding: 24rpx;
  448. background-color: #f7f8fa;
  449. min-height: 100vh;
  450. padding-top: 120rpx;
  451. }
  452. .section {
  453. background: #fff;
  454. border-radius: 16rpx;
  455. padding: 24rpx;
  456. margin-bottom: 24rpx;
  457. &.warning {
  458. border-left: 8rpx solid #ff4444;
  459. background-color: #fff7f7;
  460. }
  461. }
  462. .section-title {
  463. font-size: 32rpx;
  464. font-weight: 600;
  465. color: #333;
  466. margin-bottom: 24rpx;
  467. padding-bottom: 16rpx;
  468. border-bottom: 1rpx solid #eee;
  469. }
  470. .student-list {
  471. .student-item {
  472. padding: 24rpx;
  473. margin-bottom: 16rpx;
  474. border-radius: 12rpx;
  475. border: 2rpx solid #eee;
  476. background: #fff;
  477. &.active {
  478. border-color: #1989fa;
  479. background-color: #f0f9ff;
  480. }
  481. &:last-child {
  482. margin-bottom: 0;
  483. }
  484. .student-info {
  485. .name-status {
  486. display: flex;
  487. align-items: center;
  488. justify-content: space-between;
  489. margin-bottom: 8rpx;
  490. .name {
  491. font-size: 32rpx;
  492. font-weight: 500;
  493. color: #333;
  494. }
  495. .status-badge {
  496. font-size: 24rpx;
  497. padding: 4rpx 12rpx;
  498. border-radius: 12rpx;
  499. &.在校 {
  500. background-color: #e8f5e9;
  501. color: #4caf50;
  502. }
  503. &.休学中 {
  504. background-color: #fff3e0;
  505. color: #ff9800;
  506. }
  507. }
  508. }
  509. .class-info {
  510. font-size: 28rpx;
  511. color: #666;
  512. margin-bottom: 12rpx;
  513. }
  514. .extra-info {
  515. display: flex;
  516. justify-content: space-between;
  517. align-items: center;
  518. margin-top: 12rpx;
  519. padding-top: 12rpx;
  520. border-top: 1rpx solid #eee;
  521. .evidence-id {
  522. font-size: 26rpx;
  523. color: #888;
  524. }
  525. .applying-status {
  526. font-size: 24rpx;
  527. padding: 4rpx 12rpx;
  528. border-radius: 12rpx;
  529. background-color: #fff3e0;
  530. color: #ff9800;
  531. }
  532. }
  533. }
  534. }
  535. }
  536. .info-grid {
  537. .info-row {
  538. display: flex;
  539. padding: 16rpx 0;
  540. border-bottom: 1rpx solid #f0f0f0;
  541. &:last-child {
  542. border-bottom: none;
  543. }
  544. .info-label {
  545. width: 200rpx;
  546. font-size: 28rpx;
  547. color: #666;
  548. }
  549. .info-value {
  550. flex: 1;
  551. font-size: 28rpx;
  552. color: #333;
  553. }
  554. }
  555. }
  556. .warning-text {
  557. font-size: 28rpx;
  558. color: #ff4444;
  559. margin-bottom: 24rpx;
  560. line-height: 1.4;
  561. }
  562. .apply-info {
  563. background: #fff;
  564. border-radius: 12rpx;
  565. padding: 16rpx;
  566. margin-bottom: 24rpx;
  567. .apply-row {
  568. display: flex;
  569. padding: 12rpx 0;
  570. .apply-label {
  571. width: 200rpx;
  572. font-size: 28rpx;
  573. color: #666;
  574. }
  575. .apply-value {
  576. flex: 1;
  577. font-size: 28rpx;
  578. color: #333;
  579. &.status-text {
  580. color: #ff9800;
  581. font-weight: 500;
  582. }
  583. }
  584. }
  585. }
  586. .action-buttons {
  587. display: flex;
  588. gap: 24rpx;
  589. .van-button {
  590. flex: 1;
  591. }
  592. }
  593. .form-container {
  594. .form-group {
  595. margin-top: 32rpx;
  596. .form-label {
  597. font-size: 28rpx;
  598. color: #333;
  599. margin-bottom: 12rpx;
  600. font-weight: 500;
  601. }
  602. .radio-group {
  603. .van-radio {
  604. margin-right: 48rpx;
  605. }
  606. }
  607. :deep(.van-field) {
  608. background-color: #fafafa;
  609. border-radius: 8rpx;
  610. .van-field__control {
  611. font-size: 28rpx;
  612. }
  613. }
  614. }
  615. }
  616. .upload-list {
  617. .upload-item {
  618. margin-bottom: 32rpx;
  619. &:last-child {
  620. margin-bottom: 0;
  621. }
  622. .upload-title {
  623. font-size: 28rpx;
  624. color: #333;
  625. margin-bottom: 16rpx;
  626. font-weight: 500;
  627. }
  628. :deep(.van-uploader) {
  629. .van-uploader__upload {
  630. width: 160rpx;
  631. height: 160rpx;
  632. margin: 0;
  633. }
  634. .van-uploader__preview {
  635. margin: 0 16rpx 16rpx 0;
  636. }
  637. .van-uploader__preview-image {
  638. width: 160rpx;
  639. height: 160rpx;
  640. border-radius: 8rpx;
  641. }
  642. }
  643. }
  644. }
  645. .submit-section {
  646. margin-top: 48rpx;
  647. padding: 24rpx;
  648. :deep(.van-button) {
  649. height: 88rpx;
  650. font-size: 32rpx;
  651. border-radius: 44rpx;
  652. }
  653. }
  654. </style>