search.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062
  1. <template>
  2. <view>
  3. <!-- 自定义导航栏 -->
  4. <view class="custom-navbar">
  5. <view class="navbar-content">
  6. <view class="nav-left" @click="goBack">
  7. <u-icon name="arrow-leftward" color="#333" size="38"></u-icon>
  8. </view>
  9. <view class="nav-title">职位搜索</view>
  10. <view class="nav-right"></view>
  11. </view>
  12. </view>
  13. <!-- 搜索 -->
  14. <view class="search flex align-center justify-center">
  15. <view class="search-box">
  16. <u-search placeholder="搜索职位或公司" shape="round" searchIconSize = 40 searchIconColor="rgba(153, 153, 153, 1)" bgColor="rgba(241, 241, 241, 1)" borderColor="rgba(227, 231, 236, 1)" @clear="clear" v-model="keyword" @custom="custom" @search="custom"></u-search>
  17. </view>
  18. </view>
  19. <block v-if="show">
  20. <!-- 历史搜索 -->
  21. <view class="searchJl flex justify-center">
  22. <view class="searchJl-box">
  23. <view class="searchJl-box-header">
  24. <text class="searchJl-box-title">历史搜索</text>
  25. <image src="../../static/images/shanchu22.svg" style="width: 32rpx; height: 32rpx;" mode="aspectFit" @click="clearHistory"></image>
  26. </view>
  27. <view class="searchJl-box-label flex align-center flex-wrap">
  28. <view class="searchJl-box-item" @click="goSearch(item.keyWord)"
  29. v-for="(item,index) in searchList" :key="index">
  30. {{item.keyWord}}
  31. </view>
  32. </view>
  33. </view>
  34. </view>
  35. <!-- 近期热招 -->
  36. <view class="hot-jobs-container flex justify-center">
  37. <view class="hot-jobs-section">
  38. <view class="section-header">
  39. <text class="section-title">近期热招</text>
  40. <image src="../../static/images/shanchu22.svg" style="width: 32rpx; height: 32rpx;" mode="aspectFit" @click="clearHotJobs"></image>
  41. </view>
  42. <view class="hot-jobs-grid">
  43. <view
  44. class="hot-job-item"
  45. v-for="(job, index) in hotJobsList"
  46. :key="index"
  47. @click="selectHotJob(job)"
  48. >
  49. <text class="job-name">{{ job.name }}</text>
  50. <view class="hot-tag" v-if="job.isHot">
  51. <text class="hot-tag-text">Hot</text>
  52. </view>
  53. </view>
  54. </view>
  55. </view>
  56. </view>
  57. </block>
  58. <block v-else>
  59. <!-- 筛选 -->
  60. <view class="screen flex justify-center align-center">
  61. <view class="screen-box">
  62. <view class="topbg-sx-box">
  63. <view class="topbg-sx-box-l flex align-center">
  64. <view class="topbg-sx-box-l-i" :class="currentSx==index?'active3':''"
  65. @click="currentSx = index" v-for="(item,index) in sxTypeList" :key="index">
  66. {{item.name}}
  67. </view>
  68. </view>
  69. <view class="topbg-sx-box-r flex align-center">
  70. <view class="city-container" @click="goNav('/package/screen/city?city='+city+'&county='+county)">
  71. <text class="city-text" style="margin-right: 10rpx;">{{county?county:city}}</text>
  72. <u-icon name="arrow-down" color="#999999" size="20"></u-icon>
  73. </view>
  74. <view class="sort-container" @click="showSortModal">
  75. <text class="sort-text" style="margin-right: 10rpx;">综合排序</text>
  76. <u-icon name="arrow-down" color="rgba(1, 107, 246, 1)" size="20"></u-icon>
  77. </view>
  78. <view class="filter-container" @click="goNav('/package/screen/screen')">
  79. <text class="filter-text" style="margin-right: 10rpx;">筛选</text>
  80. <u-icon name="arrow-down" color="#999999" size="20"></u-icon>
  81. </view>
  82. </view>
  83. </view>
  84. </view>
  85. </view>
  86. <!-- 岗位推荐 -->
  87. <view class="gwList flex justify-center" v-if="dataList.length>0">
  88. <view class="gwList-box">
  89. <scroll-view scroll-y="true" style="width: 100%;height: 100%;">
  90. <view class="gwList-box-item flex justify-center" @click="gotoInfo(item.postPushId)"
  91. v-for="(item,index) in dataList" :key="index">
  92. <view class="gwList-box-item-box">
  93. <!-- 标题-薪资 -->
  94. <view class="gwList-box-item-box-title flex justify-between align-center">
  95. <view class="title-left flex align-center">
  96. <view class="job-title-text"
  97. style="max-width: 450rpx;overflow:hidden;white-space: nowrap;text-overflow: ellipsis;-o-text-overflow:ellipsis;">
  98. <block v-if="isSameName(item.ruleClassifyName,item.stationName)">
  99. {{item.ruleClassifyName}}-
  100. </block>
  101. <block>
  102. {{item.stationName}}
  103. </block>
  104. </view>
  105. <view class="salary-text-box">
  106. <image src="../../static/images/index/jipinIcom.svg" class="jipin-icon" />
  107. <text class="jipin-text">急聘</text>
  108. </view>
  109. </view>
  110. <text class="salary-text">{{item.salaryRange}}</text>
  111. </view>
  112. <!-- 公司名称-公司人数 -->
  113. <view class="gwList-box-item-box-name flex align-center">
  114. <text class="company-name" style="margin-right: 8rpx;">{{item.company?item.company.companyName:''}}</text>
  115. <text class="company-people"
  116. v-if="item.company">{{item.company?item.company.companyPeople:'0人'}}</text>
  117. </view>
  118. <!-- 职位标签 -->
  119. <view class="gwList-box-item-box-label flex align-center flex-wrap">
  120. <text class="job-tag">{{item.education}}</text>
  121. <text class="job-tag">{{item.experience}}</text>
  122. <text class="job-tag" v-for="(ite,ind) in item.positionWelfare" :key="ind">{{ite}}</text>
  123. </view>
  124. <!-- <view class="gwList-box-item-box-line"></view> -->
  125. <!-- 公司简介-位置 -->
  126. <view class="gwList-box-item-box-info flex justify-between align-center">
  127. <view class="gwList-box-item-box-info-l flex align-center">
  128. <image
  129. :src="item.company?item.company.companyLogo:'../../static/logo.png'"
  130. style="width: 58rpx;height: 58rpx;border-radius: 50%;margin-right: 20rpx;"
  131. mode=""></image>
  132. <view class="company-info-text" v-if="item.company">
  133. {{item.company.companyLegalPerson?item.company.companyLegalPerson:'未知'}}·人事总监
  134. </view>
  135. <view class="reply-time">10分钟前回复</view>
  136. </view>
  137. <view class="location-text">
  138. {{item.county}} {{item.address}}
  139. </view>
  140. </view>
  141. </view>
  142. </view>
  143. </scroll-view>
  144. </view>
  145. </view>
  146. <!-- 暂无数据 -->
  147. <view class="gwList" v-else>
  148. <empty />
  149. </view>
  150. </block>
  151. <!-- 排序弹窗 -->
  152. <view class="sort-modal" v-if="showSortModalFlag" @click="hideSortModal">
  153. <view class="sort-modal-content" @click.stop>
  154. <!-- 拖拽条 -->
  155. <view class="sort-modal-handle"></view>
  156. <!-- 标题 -->
  157. <view class="sort-modal-title">排序</view>
  158. <!-- 排序选项 -->
  159. <view class="sort-options">
  160. <view
  161. class="sort-option"
  162. :class="selectedSort === index ? 'active' : ''"
  163. @click="selectSort(index)"
  164. v-for="(option, index) in sortOptions"
  165. :key="index"
  166. >
  167. <view class="sort-option-icon">
  168. <view class="check-icon" v-if="selectedSort === index">✓</view>
  169. </view>
  170. <text class="sort-option-text">{{ option }}</text>
  171. </view>
  172. </view>
  173. </view>
  174. </view>
  175. </view>
  176. </template>
  177. <script>
  178. import empty from '../../components/empty.vue'
  179. export default {
  180. components: {
  181. empty
  182. },
  183. data() {
  184. return {
  185. show: false,
  186. keyword: '',
  187. currentSx: 0,
  188. sxTypeList: [{
  189. id: 1,
  190. name: '推荐',
  191. },
  192. {
  193. id: 2,
  194. name: '最新',
  195. }
  196. ],
  197. token: '',
  198. page: 1,
  199. limit: 10,
  200. totlo: 1,
  201. city: '',
  202. county: '', //区
  203. education: '', //学历
  204. salaryRange: '', //薪资
  205. experience: '', //经验
  206. companyPeople: '', //公司规模
  207. industry: '', //行业
  208. longitude: '',
  209. latitude: '',
  210. dataList: [],
  211. searchList: [],
  212. hotJobsList: [
  213. { name: '美国亚马逊运营', isHot: false },
  214. { name: '采购经理', isHot: false },
  215. { name: 'Tik Tok运营助理', isHot: true },
  216. { name: 'Temu运营专员', isHot: false },
  217. { name: '跨境电商运营助理', isHot: false },
  218. { name: '产品开发经理', isHot: false },
  219. { name: '海外仓管理经理', isHot: false },
  220. { name: '人事经理', isHot: false }
  221. ],
  222. showSortModalFlag: false,
  223. selectedSort: 0,
  224. sortOptions: ['综合排序', '最新优先', '距离优先']
  225. };
  226. },
  227. watch: {
  228. currentSx(newData, oldData) {
  229. this.getUserList();
  230. },
  231. },
  232. onLoad() {
  233. let that = this
  234. //获取经纬度后请求岗位接口,经纬度用于筛选距离
  235. uni.getLocation({
  236. type: 'wgs84', //wgs84 gcj02
  237. success: function(res) {
  238. console.log(res, '地理位置');
  239. that.latitude = res.latitude;
  240. that.longitude = res.longitude;
  241. that.getUserList();
  242. },
  243. fail: function() {
  244. console.log('获取地址失败');
  245. }
  246. })
  247. this.getMyRecordList()
  248. },
  249. onShow() {
  250. let that = this;
  251. if (!this.city) {
  252. if (uni.getStorageSync('city')) {
  253. this.city = uni.getStorageSync('city')
  254. } else {
  255. this.city = ''
  256. }
  257. }
  258. uni.$once('filterCity', data => {
  259. console.log(data, '选择的市')
  260. that.city = data.city
  261. that.county = data.county
  262. that.getUserList();
  263. })
  264. this.token = uni.getStorageSync('token');
  265. console.log(uni.getStorageSync('filter'), '1111111111');
  266. if (uni.getStorageSync('filter') && (uni.getStorageSync('filter')).length > 0) {
  267. let filter = uni.getStorageSync('filter')
  268. filter.map(item => {
  269. let arr = []
  270. item.list.map(ite => {
  271. if (ite.value != '不限') {
  272. arr.push(ite.value)
  273. }
  274. })
  275. switch (item.name) {
  276. case '学历':
  277. this.education = arr.join(',')
  278. break;
  279. case '薪资':
  280. this.salaryRange = arr.join(',')
  281. break;
  282. case '经验':
  283. this.experience = arr.join(',')
  284. break;
  285. case '公司规模':
  286. this.companyPeople = arr.join(',')
  287. break;
  288. case '行业':
  289. this.industry = arr.join(',')
  290. break;
  291. }
  292. })
  293. } else {
  294. this.education = '' //学历
  295. this.experience = '' //经验
  296. this.industry = '' //行业
  297. this.salaryRange = '' //薪资
  298. this.companyPeople = '' //公司规模
  299. }
  300. that.getUserList();
  301. },
  302. onPullDownRefresh() {
  303. this.page = 1
  304. this.getUserList();
  305. },
  306. onReachBottom() {
  307. if (this.page < this.totlo) {
  308. this.page += 1
  309. this.getUserList();
  310. }
  311. },
  312. methods: {
  313. /**
  314. * 返回上一页
  315. */
  316. goBack() {
  317. uni.navigateBack()
  318. },
  319. //判断岗位名称与职位名称是否相同(不区分大小写)
  320. isSameName(className, name) {
  321. let str1 = className.trim();
  322. let str2 = name.trim();
  323. if (str1.length !== str2.length) {
  324. return true;
  325. }
  326. return str1.toLowerCase() !== str2.toLowerCase();
  327. },
  328. /**
  329. * @param {Object} postPushId
  330. * 岗位详情
  331. */
  332. gotoInfo(postPushId) {
  333. if (uni.getStorageSync('token')) {
  334. uni.navigateTo({
  335. url: '/pages/index/game/order?postPushId=' + postPushId
  336. })
  337. } else {
  338. this.noLogin()
  339. }
  340. },
  341. //我的搜索关键词
  342. getMyRecordList() {
  343. this.$Request.get('/app/record/getMyRecordList', {
  344. userId: uni.getStorageSync('userId') ? uni.getStorageSync('userId') : ''
  345. }).then(res => {
  346. if (res.code == 0) {
  347. this.searchList = res.data.records
  348. if (this.searchList.length > 0) {
  349. this.show = true
  350. } else {
  351. this.show = false
  352. this.custom()
  353. }
  354. }
  355. })
  356. },
  357. /**
  358. * 清空搜索内容
  359. */
  360. clear() {
  361. this.page = 1
  362. this.getUserList();
  363. },
  364. /**
  365. * @param {Object} keyword
  366. * 热词搜索
  367. */
  368. goSearch(keyword) {
  369. this.show = false
  370. this.keyword = keyword
  371. this.getUserList();
  372. },
  373. /**
  374. * @param {Object} e
  375. * 用户点击搜索时触发
  376. */
  377. custom(e) {
  378. this.show = false
  379. this.page = 1
  380. this.getUserList()
  381. },
  382. /**
  383. * 获取岗位列表
  384. */
  385. getUserList() {
  386. let data = {
  387. page: this.page,
  388. limit: this.limit,
  389. postType: '',
  390. ruleClassifyName: this.keyword, //岗位名称
  391. screen: +this.currentSx + 1, //1推荐 2最新
  392. county: this.county, //区
  393. city: this.city, //城市
  394. salaryRange: this.salaryRange, //薪资范围
  395. education: this.education, //学历
  396. experience: this.experience, //经验
  397. industry: this.industry, //行业
  398. companyPeople: this.companyPeople, //公司规模
  399. lng: this.longitude,
  400. lat: this.latitude,
  401. userId: uni.getStorageSync('userId') ? uni.getStorageSync('userId') : ''
  402. }
  403. this.$Request.get('/app/postPush/userGetPostPushList', data).then(res => {
  404. uni.stopPullDownRefresh()
  405. if (res.code == 0) {
  406. res.data.records.map(item => {
  407. if (item.positionWelfare) {
  408. item.positionWelfare = item.positionWelfare.split(',')
  409. } else {
  410. item.positionWelfare = []
  411. }
  412. })
  413. if (this.page == 1) {
  414. this.dataList = res.data.records
  415. } else {
  416. this.dataList = [...this.dataList, ...res.data.records]
  417. }
  418. this.totlo = res.data.pages
  419. }
  420. })
  421. },
  422. //跳转
  423. goNav(url) {
  424. if (uni.getStorageSync('token')) {
  425. uni.navigateTo({
  426. url: url
  427. })
  428. } else {
  429. this.noLogin()
  430. }
  431. },
  432. //未登录
  433. noLogin() {
  434. uni.showModal({
  435. title: '提示',
  436. content: '您还未登录,请先登录',
  437. confirmColor: '#016BF6',
  438. success: function(res) {
  439. if (res.confirm) {
  440. console.log('用户点击确定');
  441. // uni.reLaunch({
  442. // url:'/pages/public/login'
  443. // })
  444. uni.navigateTo({
  445. url: '/pages/public/login'
  446. })
  447. } else if (res.cancel) {
  448. console.log('用户点击取消');
  449. }
  450. }
  451. })
  452. },
  453. // 选择热门职位
  454. selectHotJob(job) {
  455. this.keyword = job.name
  456. this.custom()
  457. },
  458. // 显示排序弹窗
  459. showSortModal() {
  460. this.showSortModalFlag = true
  461. },
  462. // 隐藏排序弹窗
  463. hideSortModal() {
  464. this.showSortModalFlag = false
  465. },
  466. // 选择排序选项
  467. selectSort(index) {
  468. this.selectedSort = index
  469. uni.showToast({
  470. title: `已选择: ${this.sortOptions[index]}`,
  471. icon: 'none'
  472. })
  473. this.hideSortModal()
  474. // 这里可以添加排序逻辑
  475. },
  476. // 判断分类名称和职位名称是否相同
  477. isSameName(className, name) {
  478. let str1 = className.trim();
  479. let str2 = name.trim();
  480. if (str1.length !== str2.length) {
  481. return true;
  482. }
  483. return str1.toLowerCase() !== str2.toLowerCase();
  484. },
  485. },
  486. }
  487. </script>
  488. <style lang="scss">
  489. // page {
  490. // background: #F2F2F7;
  491. // }
  492. .active3 {
  493. flex-direction: row;
  494. justify-content: center;
  495. align-items: center;
  496. padding: 12rpx;
  497. border-radius: 12rpx;
  498. background: #FFFFFF !important;
  499. margin-right: 12rpx;
  500. border: 0.5px solid rgba(1, 107, 246, 1);
  501. color: rgba(1, 107, 246, 1) !important;
  502. font-family: DM Sans;
  503. font-size: 22rpx;
  504. font-weight: 400;
  505. line-height: 20rpx;
  506. letter-spacing: 0px;
  507. text-align: left;
  508. }
  509. .custom-navbar {
  510. position: fixed;
  511. top: 0;
  512. left: 0;
  513. right: 0;
  514. width: 100%;
  515. padding-top: 80rpx;
  516. height: 160rpx;
  517. background-color: #ffffff;
  518. z-index: 10000;
  519. .navbar-content {
  520. display: flex;
  521. align-items: center;
  522. justify-content: space-between;
  523. height: 100%;
  524. padding: 0 32rpx;
  525. .nav-left, .nav-right {
  526. width: 60rpx;
  527. height: 60rpx;
  528. display: flex;
  529. align-items: center;
  530. justify-content: center;
  531. }
  532. .nav-title {
  533. color: rgba(51, 51, 51, 1);
  534. font-family: DM Sans;
  535. font-size: 30rpx;
  536. font-weight: 700;
  537. line-height: 26px;
  538. letter-spacing: 0px;
  539. text-align: center;
  540. }
  541. }
  542. }
  543. .search {
  544. width: 100%;
  545. padding-top: 20rpx;
  546. height: 88rpx;
  547. background-color: #ffffff;
  548. position: fixed;
  549. top: 160rpx;
  550. z-index: 9999;
  551. .search-box {
  552. width: 686rpx;
  553. height: 60rpx;
  554. }
  555. /deep/ .u-action {
  556. color: rgba(1, 107, 246, 1);
  557. font-family: DM Sans;
  558. font-size: 24rpx;
  559. font-weight: 500;
  560. line-height: 48rpx;
  561. letter-spacing: 0px;
  562. text-align: center;
  563. }
  564. }
  565. .screen {
  566. width: 100%;
  567. height: 160rpx;
  568. background-color: #ffffff;
  569. position: fixed;
  570. top: 246rpx;
  571. z-index: 9999;
  572. .screen-box {
  573. padding-top: 20rpx;
  574. width: 686rpx;
  575. height: 160rpx;
  576. .topbg-sx-box {
  577. width: 686rpx;
  578. height: 25rpx;
  579. margin-top: 30rpx;
  580. .topbg-sx-box-l-i {
  581. flex-direction: row;
  582. justify-content: center;
  583. align-items: center;
  584. padding: 12rpx;
  585. border-radius: 12rpx;
  586. background: rgba(153, 153, 153, 0.1);
  587. margin-right: 12rpx;
  588. color: rgba(102, 102, 102, 1);
  589. font-family: DM Sans;
  590. font-size: 22rpx;
  591. font-weight: 400;
  592. line-height: 20rpx;
  593. letter-spacing: 0px;
  594. text-align: left;
  595. margin-bottom: 20rpx;
  596. }
  597. }
  598. }
  599. }
  600. // 筛选栏右侧容器样式
  601. .city-container {
  602. color: rgba(153, 153, 153, 1);
  603. font-family: DM Sans;
  604. font-size: 22rpx;
  605. font-weight: 400;
  606. line-height: 20rpx;
  607. letter-spacing: 0px;
  608. text-align: left;
  609. margin-right: 10rpx;
  610. padding: 8rpx 12rpx;
  611. border-radius: 12rpx;
  612. background: rgba(198, 198, 198, 0.1);
  613. }
  614. .sort-container {
  615. color: rgba(1, 107, 246, 1);
  616. font-family: DM Sans;
  617. font-size: 22rpx;
  618. font-weight: 400;
  619. line-height: 20rpx;
  620. letter-spacing: 0px;
  621. text-align: left;
  622. margin-right: 10rpx;
  623. padding: 8rpx 12rpx;
  624. border-radius: 12rpx;
  625. border: 0.5px solid rgba(1, 107, 246, 1);
  626. }
  627. .filter-container {
  628. color: rgba(153, 153, 153, 1);
  629. font-family: DM Sans;
  630. font-size: 22rpx;
  631. font-weight: 400;
  632. line-height: 20rpx;
  633. letter-spacing: 0px;
  634. text-align: left;
  635. margin-right: 10rpx;
  636. padding: 8rpx 12rpx;
  637. border-radius: 12rpx;
  638. background: rgba(198, 198, 198, 0.1);
  639. }
  640. .searchJl {
  641. width: 100%;
  642. background-color: #ffffff;
  643. position: fixed;
  644. top: 240rpx;
  645. height: calc(100vh - 80rpx);
  646. .searchJl-box {
  647. width: 686rpx;
  648. height: 100%;
  649. padding-top: 48rpx;
  650. .searchJl-box-header {
  651. display: flex;
  652. align-items: center;
  653. justify-content: space-between;
  654. margin-bottom: 20rpx;
  655. }
  656. .searchJl-box-title {
  657. color: rgba(34, 37, 42, 1);
  658. font-family: DM Sans;
  659. font-size: 26rpx;
  660. font-weight: 400;
  661. line-height: 48rpx;
  662. letter-spacing: 0px;
  663. text-align: left;
  664. }
  665. .searchJl-box-label {
  666. width: 100%;
  667. gap: 8rpx;
  668. .searchJl-box-item {
  669. padding: 12rpx;
  670. border-radius: 8rpx;
  671. background: rgba(153, 153, 153, 0.1);
  672. color: rgba(102, 102, 102, 1);
  673. font-family: DM Sans;
  674. font-size: 20rpx;
  675. font-weight: 400;
  676. line-height: 20rpx;
  677. letter-spacing: 0px;
  678. text-align: left;
  679. margin-top: 20rpx;
  680. }
  681. }
  682. }
  683. }
  684. // 近期热招容器样式
  685. .hot-jobs-container {
  686. width: 100%;
  687. background-color: #ffffff;
  688. position: fixed;
  689. top: 420rpx; // 调整位置,在历史搜索下方
  690. height: calc(100vh - 400rpx);
  691. z-index: 9999;
  692. .hot-jobs-section {
  693. width: 686rpx;
  694. padding-top: 28rpx;
  695. }
  696. }
  697. // 近期热招样式
  698. .hot-jobs-section {
  699. margin-bottom: 32rpx;
  700. .section-header {
  701. display: flex;
  702. align-items: center;
  703. justify-content: space-between;
  704. margin-bottom: 20rpx;
  705. .section-title {
  706. color: rgba(34, 37, 42, 1);
  707. font-family: DM Sans;
  708. font-size: 26rpx;
  709. font-weight: 400;
  710. line-height: 48rpx;
  711. letter-spacing: 0px;
  712. text-align: left;
  713. }
  714. }
  715. }
  716. .hot-jobs-grid {
  717. display: flex;
  718. flex-wrap: wrap;
  719. gap: 8rpx;
  720. .hot-job-item {
  721. width: calc(50% - 4rpx);
  722. padding: 8rpx;
  723. background: #ffffff;
  724. border-radius: 12rpx;
  725. position: relative;
  726. .job-name {
  727. color: rgba(102, 102, 102, 1);
  728. font-family: DM Sans;
  729. font-size: 20rpx;
  730. font-weight: 400;
  731. line-height: 44rpx;
  732. letter-spacing: 0px;
  733. text-align: left;
  734. }
  735. .hot-tag {
  736. position: absolute;
  737. top: 8rpx;
  738. right: 10rpx;
  739. border-radius: 12rpx;
  740. background: rgba(237, 66, 69, 1);
  741. padding: 4rpx 12rpx;
  742. .hot-tag-text {
  743. color: rgba(255, 255, 255, 1);
  744. font-family: DM Sans;
  745. font-size: 16rpx;
  746. font-weight: 400;
  747. text-align: center;
  748. }
  749. }
  750. }
  751. }
  752. // 排序弹窗样式
  753. .sort-modal {
  754. position: fixed;
  755. top: 0;
  756. left: 0;
  757. right: 0;
  758. bottom: 0;
  759. background: rgba(0, 0, 0, 0.5);
  760. z-index: 10001;
  761. display: flex;
  762. align-items: flex-end;
  763. .sort-modal-content {
  764. width: 100%;
  765. background: #ffffff;
  766. border-radius: 24rpx 24rpx 0 0;
  767. padding: 20rpx 40rpx 40rpx 40rpx;
  768. max-height: 60vh;
  769. .sort-modal-handle {
  770. width: 80rpx;
  771. height: 8rpx;
  772. background: #E5E5E5;
  773. border-radius: 4rpx;
  774. margin: 0 auto 30rpx auto;
  775. }
  776. .sort-modal-title {
  777. font-size: 32rpx;
  778. font-weight: 600;
  779. color: #333333;
  780. text-align: center;
  781. padding-bottom: 30rpx;
  782. margin-bottom: 30rpx;
  783. border-bottom: 1px solid rgba(153, 153, 153, 0.25);
  784. }
  785. .sort-options {
  786. .sort-option {
  787. display: flex;
  788. align-items: center;
  789. padding: 24rpx 32rpx;
  790. margin-bottom: 16rpx;
  791. // background: #F8F8F8;
  792. border-radius: 42rpx;
  793. border: 2rpx solid rgba(227, 231, 236, 1);
  794. &.active {
  795. background: #F0F8FF;
  796. border-color: #007AFF;
  797. .sort-option-icon {
  798. background: #007AFF;
  799. border-color: #007AFF;
  800. .check-icon {
  801. color: #ffffff;
  802. }
  803. }
  804. .sort-option-text {
  805. color: #007AFF;
  806. font-weight: 500;
  807. }
  808. }
  809. .sort-option-icon {
  810. width: 40rpx;
  811. height: 40rpx;
  812. border-radius: 50%;
  813. border: 2rpx solid #E5E5E5;
  814. background: #ffffff;
  815. display: flex;
  816. align-items: center;
  817. justify-content: center;
  818. margin-right: 24rpx;
  819. .check-icon {
  820. font-size: 24rpx;
  821. color: #ffffff;
  822. font-weight: bold;
  823. }
  824. }
  825. .sort-option-text {
  826. font-size: 28rpx;
  827. color: #333333;
  828. flex: 1;
  829. }
  830. }
  831. }
  832. }
  833. }
  834. .title-left {
  835. display: flex;
  836. align-items: center;
  837. gap: 8rpx;
  838. }
  839. .job-title-text {
  840. color: rgba(23, 23, 37, 1);
  841. font-family: DM Sans;
  842. font-size: 38rpx;
  843. font-weight: 700;
  844. line-height: 48rpx;
  845. letter-spacing: 0.5%;
  846. text-align: left;
  847. }
  848. .salary-text-box {
  849. border-radius: 24rpx;
  850. background: #FEE2E3;
  851. display: flex;
  852. justify-content: flex-start;
  853. align-items: center;
  854. padding: 6rpx 24rpx;
  855. .jipin-icon {
  856. width: 20rpx;
  857. height: 20rpx;
  858. margin-right: 4rpx;
  859. }
  860. .jipin-text {
  861. color: rgba(237, 66, 69, 1);
  862. font-family: DM Sans;
  863. font-size: 18rpx;
  864. font-weight: 400;
  865. line-height: 20px;
  866. letter-spacing: 0.5%;
  867. text-align: left;
  868. }
  869. }
  870. .salary-text {
  871. color: rgba(1, 107, 246, 1);
  872. font-family: DM Sans;
  873. font-size: 28rpx;
  874. font-weight: 700;
  875. line-height: 40rpx;
  876. letter-spacing: 0.5%;
  877. text-align: right;
  878. }
  879. .company-name,
  880. .company-people {
  881. color: rgba(156, 164, 171, 1);
  882. font-family: DM Sans;
  883. font-size: 24rpx;
  884. font-weight: 400;
  885. line-height: 40rpx;
  886. letter-spacing: 0.5%;
  887. text-align: left;
  888. }
  889. .job-tag {
  890. height: 42rpx;
  891. display: flex;
  892. flex-direction: row;
  893. justify-content: center;
  894. align-items: center;
  895. padding: 8rpx;
  896. border-radius: 8rpx;
  897. background: rgba(198, 198, 198, 0.1);
  898. margin-right: 16rpx;
  899. margin-bottom: 16rpx;
  900. color: rgba(153, 153, 153, 1);
  901. font-size: 24rpx;
  902. }
  903. .company-info-text,
  904. .location-text {
  905. color: rgba(156, 164, 171, 1);
  906. font-family: DM Sans;
  907. font-size: 20rpx;
  908. font-weight: 400;
  909. line-height: 40rpx;
  910. letter-spacing: 0.5%;
  911. text-align: left;
  912. }
  913. .reply-time {
  914. display: flex;
  915. flex-direction: row;
  916. justify-content: center;
  917. align-items: center;
  918. padding: 8rpx;
  919. font-family: DM Sans;
  920. font-size: 20rpx;
  921. font-weight: 400;
  922. line-height: 40rpx;
  923. letter-spacing: 0.5%;
  924. text-align: left;
  925. border-radius: 12rpx;
  926. background: #ECE1FD;
  927. color: #8858C5;
  928. }
  929. .gwList {
  930. width: 100%;
  931. margin-top: 410rpx;
  932. .gwList-box {
  933. width: 710rpx;
  934. height: 100%;
  935. .gwList-box-item {
  936. width: 100%;
  937. // height: 329rpx;
  938. background-color: #ffffff;
  939. border-radius: 12rpx;
  940. margin-bottom: 20rpx;
  941. padding: 36rpx;
  942. background: rgba(253, 253, 253, 1);
  943. border: 0.5px solid rgba(227, 231, 236, 1);
  944. }
  945. .gwList-box-item-box {
  946. width: 686rpx;
  947. height: 100%;
  948. .gwList-box-item-box-title {
  949. }
  950. .gwList-box-item-box-label {
  951. margin-top: 14rpx;
  952. }
  953. .gwList-box-item-box-name {
  954. margin-top: 14rpx;
  955. color: #999999;
  956. font-size: 28rpx;
  957. font-weight: 500;
  958. }
  959. .gwList-box-item-box-line {
  960. width: 100%;
  961. border: 1rpx solid #E6E6E6;
  962. margin-top: 30rpx;
  963. margin-bottom: 20rpx;
  964. }
  965. .gwList-box-item-box-info {
  966. font-size: 26rpx;
  967. .gwList-box-item-box-info-l {
  968. color: #1A1A1A;
  969. }
  970. .gwList-box-item-box-info-r {
  971. color: #999999;
  972. max-width: 300rpx;
  973. }
  974. }
  975. }
  976. }
  977. }
  978. </style>