jobPosting.vue 21 KB

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