jobPosting.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794
  1. <template>
  2. <view class="switch-roles">
  3. <nav-bar title="发布职位" color="#000" :isBack="isBack"></nav-bar>
  4. <view class="roles-content">
  5. <view class="content">
  6. <view class="title">{{ isDisabled ? '编辑【' + jobInfo.ruleClassifyName + '】' : '发布社招' }}岗位</view>
  7. <view class="desc">{{ companyName }}</view>
  8. <!-- <view class="step">
  9. <u-steps :list="numList" mode="number" :current="0"></u-steps>
  10. </view> -->
  11. <view class="step-progress flex align-center">
  12. <view class="circle-wrapper">
  13. <view class="check-icon check-active">
  14. <u-icon name="checkbox-mark" color="#fff" size="20"></u-icon>
  15. </view>
  16. <view class="step-progress-text">填写基本信息</view>
  17. </view>
  18. <view class="line blue"></view>
  19. <view class="line"></view>
  20. <view class="circle-wrapper">
  21. <view class="check-icon">
  22. <u-icon name="checkbox-mark" color="#fff" size="20"></u-icon>
  23. </view>
  24. <view class="step-progress-text">填写岗位要求</view>
  25. </view>
  26. </view>
  27. <view class="check-title-big">招聘模式</view>
  28. <view class="check-select radioseletvi">
  29. <radio-group @change="onRadioChange">
  30. <view class="select-txt radioseletview">
  31. <label class="radio radioselet flex align-center">
  32. <radio value="0" :checked="true" class="radio-size" :disabled="isDisabled" />普通岗位招聘
  33. <text style="font-size: 13px;color: rgba(120, 130, 138, 1);position: absolute;right: 0">
  34. 普通岗位剩余{{lastPostTimes }}个
  35. </text>
  36. </label>
  37. <label class="radio radioselet flex align-center">
  38. <radio value="1" class="radio-size" :disabled="isDisabled" />急聘
  39. <text style="font-size: 13px;color: rgba(120, 130, 138, 1);position: absolute;right: 0">
  40. 急聘职位剩余{{lastDueTimes }}个
  41. </text>
  42. </label>
  43. </view>
  44. </radio-group>
  45. </view>
  46. <!-- <view class="check-title">招聘类型</view>
  47. <view class="check-box" :class="{ disabled: isDisabled }">
  48. <view class="check-item" :class="{ 'is-check': check == index }" v-for="(item, index) in peopleList"
  49. :key="index" @click="!isDisabled && checkPeople(index)">{{ item }}</view>
  50. </view> -->
  51. <view class="check-title-big">招聘职位</view>
  52. <view class="check-select" @click="!isDisabledid && goJob()" :class="{ disabled: isDisabledid }">
  53. <view class="select-txt">{{ jobInfo.ruleClassifyName }}</view>
  54. <u-icon name="arrow-down" color="#D3D3D6" size="22"></u-icon>
  55. </view>
  56. <view class="check-title-big">岗位描述</view>
  57. <view class="check-sub-title">招聘岗位、招聘类型等发布后不可修改</view>
  58. <view class="job-desc-wrapper">
  59. <view class="placeholder" v-if="!text">
  60. <view class="placeholder-text">请勿填写QQ、微信、电话等联系方式及特殊符号,性别歧视词、违反劳动法相关内容,否则有可能导致账号封禁。</view>
  61. <view class="placeholder-text">1. 工作内容</view>
  62. <view class="placeholder-text">2. 任务要求</view>
  63. <view class="placeholder-text">3. 特别说明</view>
  64. </view>
  65. <textarea type="text" v-model="text" maxlength="2000" class="job-desc-input" />
  66. </view>
  67. <!-- <view class="check-select" @click="goJobContent">
  68. <view class="select-txt" v-if="textList.length > 0">
  69. <view v-for="(item, index) in textList" :key="index">
  70. {{ item }}
  71. </view>
  72. </view>
  73. <view class="select-txt" v-else>介绍工作内容、职位要求</view>
  74. <u-icon name="arrow-down" color="#D3D3D6" size="22"></u-icon>
  75. </view> -->
  76. <!-- <view class="check-select" @click="goJobContent">
  77. <view class="select-txt">{{ this.text ? this.text : "介绍工作内容、职位要求" }}</view>
  78. <u-icon name="arrow-down" color="#D3D3D6" size="22"></u-icon>
  79. </view> -->
  80. <!-- <view class="txt-desc">注:职位名称、职位类型等发布后不可修改</view> -->
  81. </view>
  82. </view>
  83. <view class="button-section">
  84. <view class="link-btn" @click="handleToIndex">稍后发布</view>
  85. <view class="submit-btn" @click="goJobPostingSecond">下一步</view>
  86. </view>
  87. </view>
  88. </template>
  89. <script>
  90. import navBar from "@/components/nav-bar/index.vue";
  91. export default {
  92. data() {
  93. return {
  94. selectedValue: 0, // 默认选中值
  95. peopleList: ["社招全职", "应届生校园招聘", "实习生招聘", "兼职招聘"],
  96. check: 0,
  97. isDisabled: false,
  98. isDisabledid: false,
  99. isCompanyVip: 0,
  100. postPushId: "",
  101. update: "",
  102. vipPostTimes: 0,
  103. text: "",
  104. textList: [],
  105. status: "",
  106. companyName: "",
  107. companyId: "",
  108. isBack: true,
  109. numList: [{
  110. name: "填写基本信息",
  111. },
  112. {
  113. name: "选择职位要求",
  114. },
  115. ],
  116. jobInfo: {
  117. ruleClassifyId: '',
  118. ruleClassifyName: '请选择要招聘的职位',
  119. price: ''
  120. },
  121. lastDueTimes:0,
  122. lastPostTimes:0,
  123. companyAddressInfo:{
  124. address:'',
  125. fullText:'',
  126. latitude:'',
  127. longitude:'',
  128. province:'',
  129. city:'',
  130. district:'',
  131. }
  132. };
  133. },
  134. components: {
  135. navBar,
  136. },
  137. onLoad(options) {
  138. if (options.isBack == 'false') {
  139. this.isBack = false;
  140. }
  141. // 接收上个页面传递的公司名称参数
  142. if (options.postPushId) {
  143. this.postPushId = options.postPushId
  144. this.getInfo()
  145. }
  146. if (options.type) {
  147. this.update = decodeURIComponent(options.type);
  148. this.isDisabled = true;
  149. }
  150. if (options.companyName) {
  151. this.companyName = decodeURIComponent(options.companyName);
  152. }
  153. else {
  154. this.companyName = uni.getStorageSync('companyName')
  155. }
  156. this.descListener = uni.$on("jobDescUpdated", (data) => {
  157. this.text = data.desc; // 赋值给当前页变量
  158. this.textList = this.text.split('\n').filter(i => i.trim());
  159. });
  160. this.onJobEvent = (data) => {
  161. console.log('接收从B页传来的数据:', data)
  162. this.jobInfo = data
  163. }
  164. uni.$on('jobs', this.onJobEvent)
  165. if (options.companyId) {
  166. this.companyId = options.companyId;
  167. }
  168. else {
  169. this.companyId = uni.getStorageSync('companyId')
  170. }
  171. if (options.status) {
  172. this.status = options.status;
  173. }
  174. this.isCompanyVip = uni.getStorageSync('isCompanyVip') || 0
  175. this.vipPostTimes = uni.getStorageSync('vipPostTimes') || 0
  176. this.getVipData();
  177. console.log('接收的公司名称:', this.companyName);
  178. console.log("收到岗位描述数据:", this.text);
  179. console.log('接收的公司ID:', this.companyId);
  180. console.log('接收的公司状态:', this.status);
  181. this.getAddress();
  182. },
  183. onUnload() {
  184. // 页面卸载时移除监听,避免内存泄漏
  185. uni.$off('jobs', this.onJobEvent);
  186. },
  187. methods: {
  188. // 获取公司地址
  189. getAddress(){
  190. let data = {
  191. status: '',
  192. page: 1,
  193. limit: 10,
  194. companyId: this.companyId
  195. }
  196. this.$Request.getT('/app/postPush/getMyPostPush', data).then(res => {
  197. if (res.code == 0) {
  198. if(res.data && res.data.records.length > 0){
  199. this.companyAddressInfo = {
  200. address:res.data.records[0].address,
  201. fullText:res.data.records[0].address,
  202. latitude:res.data.records[0].lat,
  203. longitude:res.data.records[0].lng,
  204. province:res.data.records[0].province,
  205. city:res.data.records[0].city,
  206. district:res.data.records[0].county
  207. }
  208. }
  209. }
  210. }).catch(err => {
  211. })
  212. },
  213. getVipData(){
  214. this.$Request.get("/app/user/vipData").then((res) => {
  215. this.lastDueTimes = res.data.lastDueTimes || 0;
  216. this.lastPostTimes = res.data.lastPostTimes || 0;
  217. })
  218. },
  219. goBusinessLicense() {
  220. uni.navigateTo({
  221. url: "/pages/my/businessLicense"
  222. });
  223. },
  224. checkPeople(index) {
  225. this.check = index;
  226. },
  227. goJob() {
  228. uni.navigateTo({
  229. url: "/package/jobIntention/jobList",
  230. });
  231. },
  232. goJobContent() {
  233. uni.navigateTo({
  234. url: `/package/jobIntention/editJob?text=${this.text}`,
  235. });
  236. },
  237. /**
  238. * 获取岗位详情
  239. */
  240. getInfo() {
  241. this.$Request.getT("/app/postPush/selectPostPushDetails", {
  242. // userId:uni.getStorageSync('userId'),
  243. postPushId: this.postPushId
  244. }).then(res => {
  245. if (res.code == 0) {
  246. this.jobInfo = res.data
  247. this.text = res.data.positionDetails
  248. if (!this.jobInfo?.ruleClassifyId) {
  249. this.isDisabledid = false
  250. } else {
  251. this.isDisabledid = true
  252. }
  253. }
  254. })
  255. },
  256. //radio 选中变化时触发
  257. onRadioChange(e) {
  258. // 获取选中的值
  259. // 根据值做不同处理
  260. if (this.selectedValue === 0) {
  261. console.log('选中了:普通岗位招聘');
  262. // 执行普通岗位招聘的逻辑
  263. } else if (this.selectedValue === 1) {
  264. console.log('选中了:急聘');
  265. if (!this.isCompanyVip) {
  266. uni.showToast({
  267. title: '对不起,您还不是会员,不能发布急聘。',
  268. icon: 'none',
  269. duration: 2000
  270. });
  271. return
  272. }
  273. if (this.lastDueTimes < 1) {
  274. uni.showToast({
  275. title: '对不起,您的次数已经用完,不能发布。',
  276. icon: 'none',
  277. duration: 2000
  278. });
  279. return
  280. }
  281. // 执行急聘的逻辑
  282. }
  283. this.selectedValue = e.detail.value;
  284. },
  285. //提交
  286. goJobPostingSecond() {
  287. // 显示加载中
  288. // uni.showLoading({
  289. // title: '提交中...'
  290. // });
  291. //校验数据
  292. // 校验数据
  293. const validate = () => {
  294. // 2. 校验岗位描述(positionDetails)
  295. if (!this.text || this.text.trim() === '') {
  296. uni.hideLoading();
  297. uni.showToast({
  298. title: '岗位描述不能为空',
  299. icon: 'none',
  300. duration: 2000
  301. });
  302. return false;
  303. }
  304. if (this.text.length > 2000) {
  305. uni.hideLoading();
  306. uni.showToast({
  307. title: '岗位描述不能超过2000字',
  308. icon: 'none',
  309. duration: 2000
  310. });
  311. return false;
  312. }
  313. // 校验是否包含违规内容(简单示例,可根据实际需求扩展)
  314. const illegalChars = /QQ|微信|电话|手机号|\?/g;
  315. if (illegalChars.test(this.text)) {
  316. uni.hideLoading();
  317. uni.showToast({
  318. title: '岗位描述不能包含联系方式或特殊符号',
  319. icon: 'none',
  320. duration: 2000
  321. });
  322. return false;
  323. }
  324. // 3. 校验岗位分类信息(假设ruleClassifyId是必选)
  325. if (!this.jobInfo?.ruleClassifyId) {
  326. uni.hideLoading();
  327. uni.showToast({
  328. title: '请选择岗位分类',
  329. icon: 'none',
  330. duration: 2000
  331. });
  332. return false;
  333. }
  334. if (!this.jobInfo?.ruleClassifyName || this.jobInfo?.ruleClassifyName == '请选择要招聘的职位') {
  335. uni.hideLoading();
  336. uni.showToast({
  337. title: '岗位分类名称异常,请重新选择',
  338. icon: 'none',
  339. duration: 2000
  340. });
  341. return false;
  342. }
  343. // 4. 校验orderId(如果有实际业务含义,可根据需求调整)
  344. // if (!this.orderId || this.orderId < 1) {
  345. // uni.hideLoading();
  346. // uni.showToast({
  347. // title: '订单信息异常',
  348. // icon: 'none',
  349. // duration: 2000
  350. // });
  351. // return false;
  352. // }
  353. // 所有校验通过
  354. return true;
  355. };
  356. // 执行校验,通过后再提交
  357. if (!validate()) {
  358. return; // 校验失败,终止提交
  359. }
  360. if (this.selectedValue == 1) {//急聘刚
  361. if (!this.isCompanyVip) {
  362. uni.showToast({
  363. title: '对不起,您还不是会员,不能发布急聘。',
  364. icon: 'none',
  365. duration: 2000
  366. });
  367. return
  368. }
  369. if (this.lastDueTimes < 1) {
  370. uni.showToast({
  371. title: '对不起,您的次数已经用完,不能发布。',
  372. icon: 'none',
  373. duration: 2000
  374. });
  375. return
  376. }
  377. }
  378. const data = {
  379. type: this.check,
  380. isDue: this.selectedValue,
  381. positionDetails: this.text,
  382. ruleClassifyId: this.jobInfo.ruleClassifyId,
  383. ruleClassifyName: this.jobInfo.ruleClassifyName,
  384. orderId: 1
  385. }
  386. console.log(this.postPushId)
  387. uni.navigateTo({
  388. url: "/pages/my/jobPostingSecond?pid=" + this.postPushId
  389. + '&companyId=' + this.companyId
  390. + "&status=" + this.status
  391. + "&companyName=" + this.companyName
  392. + '&type=' + this.update
  393. + '&workData=' + encodeURIComponent(JSON.stringify(this.jobInfo))
  394. + '&isBack=' + true
  395. + '&ruleClassifyId=' + this.jobInfo.ruleClassifyId
  396. + '&dataInfo=' + JSON.stringify(data)
  397. + '&companyAddressInfo=' + encodeURIComponent(JSON.stringify(this.companyAddressInfo))
  398. });
  399. // 发送请求
  400. // this.$Request.postJson("/app/postPush/savePostPush", data)
  401. // .then((res) => {
  402. // uni.hideLoading();
  403. // if (res.code === 0) {
  404. // uni.showToast({
  405. // title: '提交成功',
  406. // icon: 'success'
  407. // });
  408. // console.log("sssssss", this.companyId)
  409. // var pid = res.data || ""
  410. // if (!pid) {
  411. // uni.showToast({
  412. // title: '系统错误,请重新提交',
  413. // icon: 'none'
  414. // });
  415. // return
  416. // }
  417. // // 提交成功后跳转到职位发布页面
  418. // setTimeout(() => {
  419. // }, 1500);
  420. // } else {
  421. // uni.showToast({
  422. // title: res.msg || '提交失败,请重试',
  423. // icon: 'none'
  424. // });
  425. // }
  426. // })
  427. // .catch((err) => {
  428. // uni.hideLoading();
  429. // console.error('请求失败:', err);
  430. // uni.showToast({
  431. // title: '网络异常,请稍后重试',
  432. // icon: 'none'
  433. // });
  434. // });
  435. },
  436. // 跳转至公司认证页面
  437. handleToIndex() {
  438. uni.navigateTo({
  439. url: `/package/jobIntention/companyImg?companyName=${this.companyName}&companyId=${this.companyId}`
  440. })
  441. }
  442. },
  443. };
  444. </script>
  445. <style lang="scss" scoped>
  446. .switch-roles {
  447. background-color: #fff;
  448. position: absolute;
  449. left: 0;
  450. right: 0;
  451. top: 0;
  452. bottom: 0;
  453. display: flex;
  454. flex-direction: column;
  455. .roles-content {
  456. width: 100%;
  457. flex: 1;
  458. overflow: hidden;
  459. overflow-y: auto;
  460. .content {
  461. padding: 40rpx;
  462. box-sizing: border-box;
  463. display: flex;
  464. flex-direction: column;
  465. align-items: center;
  466. justify-content: center;
  467. // 步骤条
  468. .step-progress {
  469. padding: 20rpx 0 60rpx;
  470. .circle-wrapper {
  471. position: relative;
  472. .check-icon {
  473. display: flex;
  474. align-items: center;
  475. justify-content: center;
  476. width: 40rpx;
  477. height: 40rpx;
  478. border: 1px solid rgba(198, 198, 198, 1);
  479. border-radius: 40rpx;
  480. }
  481. .check-active {
  482. background: #016bf6;
  483. border-color: #016bf6;
  484. }
  485. .step-progress-text {
  486. position: absolute;
  487. left: 50%;
  488. bottom: -36rpx;
  489. width: 150rpx;
  490. font-size: 20rpx;
  491. font-weight: 500;
  492. line-height: 32rpx;
  493. color: rgba(111, 111, 111, 1);
  494. transform: translateX(-50%);
  495. text-align: center;
  496. }
  497. }
  498. .line {
  499. width: 220rpx;
  500. height: 1px;
  501. background: rgba(198, 198, 198, 1);
  502. }
  503. .blue {
  504. background: rgba(1, 107, 246, 1);
  505. }
  506. }
  507. .title {
  508. color: #333;
  509. width: 100%;
  510. font-family: DM Sans;
  511. font-size: 48rpx;
  512. font-weight: 700;
  513. }
  514. .desc {
  515. color: rgba(102, 102, 102, 1);
  516. width: 100%;
  517. font-family: DM Sans;
  518. font-size: 28rpx;
  519. font-weight: 400;
  520. line-height: 32rpx;
  521. letter-spacing: 0.5%;
  522. text-align: left;
  523. padding: 20rpx 0;
  524. box-sizing: border-box;
  525. }
  526. .check-title {
  527. width: 100%;
  528. color: rgba(31, 44, 55, 1);
  529. font-family: DM Sans;
  530. font-size: 36rpx;
  531. font-weight: 500;
  532. line-height: 44rpx;
  533. margin-top: 20rpx;
  534. margin-bottom: 16rpx;
  535. }
  536. .check-title-big {
  537. color: rgba(31, 44, 55, 1);
  538. font-family: DM Sans;
  539. font-size: 36rpx;
  540. font-weight: 500;
  541. line-height: 44rpx;
  542. width: 100%;
  543. padding: 20rpx 0;
  544. box-sizing: border-box;
  545. }
  546. .check-select {
  547. width: 100%;
  548. display: flex;
  549. justify-content: space-between;
  550. align-items: center;
  551. border-radius: 12rpx;
  552. box-shadow: 0px 16rpx 300rpx 0px rgba(0, 0, 0, 0.06);
  553. background: rgba(255, 255, 255, 1);
  554. padding: 32rpx 47rpx;
  555. box-sizing: border-box;
  556. .select-txt {}
  557. }
  558. // 岗位描述
  559. .check-sub-title {
  560. width: 100%;
  561. color: rgba(102, 102, 102, 1);
  562. font-size: 20rpx;
  563. font-weight: 400;
  564. line-height: 26rpx;
  565. margin-bottom: 20rpx;
  566. }
  567. .job-desc-wrapper {
  568. position: relative;
  569. width: 100%;
  570. height: 220rpx;
  571. padding: 20rpx 28rpx;
  572. border-radius: 6px;
  573. background: rgba(153, 153, 153, 0.05);
  574. .job-desc-input {
  575. position: relative;
  576. width: 100%;
  577. height: 180rpx;
  578. font-size: 20rpx;
  579. line-height: 26rpx;
  580. }
  581. .placeholder {
  582. position: absolute;
  583. left: 0;
  584. top: 0;
  585. width: 100%;
  586. height: 200rpx;
  587. padding: 24rpx 28rpx;
  588. box-sizing: border-box;
  589. .placeholder-text {
  590. color: rgba(153, 153, 153, 1);
  591. font-size: 20rpx;
  592. font-weight: 400;
  593. line-height: 26rpx;
  594. &:first-child {
  595. margin-bottom: 20rpx;
  596. }
  597. }
  598. }
  599. }
  600. /* 禁用状态样式 */
  601. .check-select.disabled {
  602. background-color: #f5f5f5;
  603. opacity: 0.6;
  604. pointer-events: none;
  605. /* 防止点击穿透 */
  606. }
  607. .check-select.disabled .select-txt {
  608. color: #999;
  609. /* 文字变灰 */
  610. }
  611. .check-select.disabled u-icon {
  612. color: #ccc;
  613. /* 图标变灰 */
  614. }
  615. /* 禁用状态样式 */
  616. .check-box.disabled {
  617. opacity: 0.6;
  618. }
  619. .check-box.disabled .check-item {
  620. pointer-events: none;
  621. background-color: #e9e9e9;
  622. color: #999;
  623. }
  624. .check-box.disabled .check-item.is-check {
  625. background-color: #b3d1ff;
  626. color: #666;
  627. }
  628. .radioseletvi {
  629. position: relative;
  630. padding: 0;
  631. ::v-deep uni-radio-group{
  632. flex: 1;
  633. .radio {
  634. &:first-child {
  635. margin-top: 0;
  636. }
  637. }
  638. }
  639. }
  640. .radioseletview {
  641. display: flex;
  642. flex-direction: column;
  643. justify-content: space-between;
  644. font-size: 28rpx;
  645. }
  646. .radioselet {
  647. position: relative;
  648. margin-top: 10px;
  649. }
  650. .radio-size {
  651. transform: scale(0.5);
  652. /* 放大到1.5倍,可根据需要调整数值 */
  653. /* 可选:调整位置避免偏移 */
  654. }
  655. .check-box {
  656. width: 100%;
  657. display: grid;
  658. grid-template-columns: repeat(2, 1fr);
  659. gap: 24rpx;
  660. .check-item {
  661. border-radius: 16rpx;
  662. background: rgba(245, 248, 254, 1);
  663. color: rgba(153, 153, 153, 1);
  664. font-family: DM Sans;
  665. font-size: 28rpx;
  666. font-weight: 400;
  667. line-height: 44rpx;
  668. text-align: center;
  669. padding: 12rpx 48rpx;
  670. box-sizing: border-box;
  671. }
  672. .is-check {
  673. box-sizing: border-box;
  674. border: 1rpx solid #016bf6;
  675. border-radius: 16rpx;
  676. background: rgba(252, 233, 220, 1);
  677. color: #016bf6;
  678. }
  679. }
  680. }
  681. }
  682. .step {
  683. width: 100%;
  684. padding: 32rpx 0;
  685. box-sizing: border-box;
  686. }
  687. .button-section {
  688. padding: 28rpx 40rpx;
  689. box-shadow: 0px -4px 16px 0px rgba(0, 0, 0, 0.04);
  690. }
  691. .submit-btn {
  692. flex-shrink: 0;
  693. border-radius: 999px;
  694. box-shadow: 0px -4px 16px 0px rgba(0, 0, 0, 0.04);
  695. background: linear-gradient(90deg, rgba(13, 39, 247, 1), rgba(19, 193, 234, 1) 100%);
  696. color: rgba(255, 255, 255, 1);
  697. font-family: DM Sans;
  698. font-size: 32rpx;
  699. font-weight: 400;
  700. line-height: 48rpx;
  701. display: flex;
  702. justify-content: center;
  703. align-items: center;
  704. padding: 16rpx 32rpx;
  705. box-sizing: border-box;
  706. }
  707. .link-btn {
  708. text-align: center;
  709. color: rgba(1, 107, 246, 1);
  710. font-size: 16px;
  711. font-weight: 400;
  712. line-height: 16px;
  713. margin-bottom: 32rpx;
  714. }
  715. .txt-desc {
  716. color: rgba(102, 102, 102, 1);
  717. font-family: DM Sans;
  718. font-size: 26rpx;
  719. font-weight: 400;
  720. line-height: 32rpx;
  721. text-align: left;
  722. width: 100%;
  723. margin-top: 20rpx;
  724. }
  725. }
  726. </style>