gameList.vue 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167
  1. <template>
  2. <view class="page-container">
  3. <global-push-ad />
  4. <view class="page-bg">
  5. <view class="page-bottom"></view>
  6. </view>
  7. <!-- 搜索栏 -->
  8. <view class="search-section" :style="{ paddingTop: 12 + statusBarHeight + 'px' }">
  9. <!-- :class="{ fixed: isFixed }"
  10. :style="isFixed ? { paddingTop: 12 + statusBarHeight + 'px' } : {}" -->
  11. <view class="search-bar">
  12. <u-icon name="search" color="#999999" size="32" class="search-icon"></u-icon>
  13. <input type="text" placeholder="搜索职位" class="search-input" v-model="searchKeyword" @click="handleSearch" />
  14. </view>
  15. <text class="search-btn" @click="handleSearch">搜索</text>
  16. </view>
  17. <view class="page-content">
  18. <!-- tabs和筛选 -->
  19. <view class="topbg-type flex justify-center" :class="{ fixed: isFixed }">
  20. <view class="topbg-type-box">
  21. <!-- 第一行:tabs -->
  22. <view class="topbg-type-box-row flex justify-between align-center">
  23. <view class="topbg-type-box-l flex align-center">
  24. <view class="topbg-type-box-l-i" :class="current == index ? 'active' : ''" @tap="current = index"
  25. v-for="(item, index) in typeList" :key="index">
  26. {{ item.label }}
  27. </view>
  28. </view>
  29. <!-- 添加求职意向 -->
  30. <view class="topbg-yx-box-r flex align-center" @click="goNav('/package/jobIntention/tagManage')">
  31. <image src="../../../static/images/index/Attachment.svg" class="attachment-icon" />
  32. </view>
  33. </view>
  34. <!-- 第二行:筛选 -->
  35. <view class="topbg-sx-box flex justify-between align-center">
  36. <!-- 分类 -->
  37. <view class="topbg-sx-box-l flex align-center">
  38. <view class="topbg-sx-box-l-i" :class="currentSx == index ? 'active3' : ''" @click="currentSx = index"
  39. v-for="(item, index) in sxTypeList" :key="index">
  40. {{ item.name }}
  41. </view>
  42. </view>
  43. <view class="topbg-sx-box-r flex align-center">
  44. <!-- 城市 -->
  45. <view class="topbg-sx-box-r-i flex align-center" style="" @click="getLocation">
  46. <text style="margin-right: 10rpx">{{ county ? county : city ? city : '选择城市' }}</text>
  47. <u-icon name="arrow-down" color="#016bf6" size="16"></u-icon>
  48. </view>
  49. <!-- 筛选 -->
  50. <view class="topbg-sx-box-filter flex align-center" :class="{ activeColor: filledFieldsCount }">
  51. <text style="margin-right: 10rpx"
  52. @click="goNavs('/package/screen/screen?search=1')">筛选{{ filledFieldsCount }}</text>
  53. <u-icon name="arrow-down" :color="filledFieldsCount ? '#016bf6' : '#999999'" size="16"
  54. @click="goNavs('/package/screen/screen?search=1')"></u-icon>
  55. </view>
  56. </view>
  57. </view>
  58. </view>
  59. </view>
  60. <!-- 职位列表 -->
  61. <view class="job-list-section">
  62. <view class="job-list-header">
  63. <text class="job-list-title">亿职赞急聘推荐</text>
  64. <view class="refresh-btn" @click="refreshJobList">
  65. <text>换一批推荐</text>
  66. <image src="../../../static/images/index/shuaxin.svg" class="refresh-icon"></image>
  67. </view>
  68. </view>
  69. <view class="job-list" v-if="dataList.length > 0">
  70. <view class="job-item" @click="gotoInfo(item.postPushId)" v-for="(item, index) in dataList" :key="index">
  71. <view class="job-item-content">
  72. <!-- 公司logo -->
  73. <image :src="item.company ? item.company.companyLogo : '../../../static/logo.png'
  74. " class="company-logo" mode="aspectFill"></image>
  75. <view class="job-info">
  76. <!-- 公司名称 -->
  77. <view class="company-name">{{
  78. item.company ? item.company.companyName : ""
  79. }}</view>
  80. <!-- 公司规模-行业 -->
  81. <view class="company-details">
  82. <text>{{ item.company ? item.company.companyPeople : "0人" }}</text>
  83. <text>{{
  84. item.company ? item.industry && item.industry.split(",").join(" ") : "未知行业"
  85. }}</text>
  86. </view>
  87. <!-- 工作时间-福利 -->
  88. <view class="job-benefits">
  89. <view class="text" v-for="(benefit, idx) in item.positionWelfare" :key="idx">{{
  90. benefit
  91. }}</view>
  92. </view>
  93. </view>
  94. <!-- 右箭头 -->
  95. <u-icon name="arrow-right" color="rgba(29, 33, 41, 1)" size="24"></u-icon>
  96. </view>
  97. </view>
  98. </view>
  99. <!-- 暂无数据 -->
  100. <view class="empty-state" v-else>
  101. <text>暂无急聘职位</text>
  102. </view>
  103. </view>
  104. <!-- 求职列表 -->
  105. <view class="job-search-section">
  106. <view class="job-search-list" v-if="jobSearchList.length > 0">
  107. <view class="job-search-item" @click="gotoInfo(item.postPushId)" v-for="(item, index) in jobSearchList"
  108. :key="index">
  109. <!-- 急聘标签 -->
  110. <view v-if="item.isDue == 1" class="urgent-tag">
  111. <image src="../../../static/images/index/jijiji.svg" class="urgent-icon"></image>
  112. </view>
  113. <view class="job-search-content">
  114. <!-- 职位标题 -->
  115. <view class="job-title">{{
  116. item.stationName || item.positionName || "职位名称"
  117. }}</view>
  118. <!-- 公司信息 -->
  119. <view class="company-info">
  120. <text class="company-name">{{
  121. item.company ? item.company.companyName : ""
  122. }}</text>
  123. <text class="company-name">{{
  124. item.company ? item.company.companyPeople : "0人"
  125. }}</text>
  126. </view>
  127. <!-- 薪资 -->
  128. <view class="salary" v-if="item.salaryRange">
  129. <text>¥{{ item.salaryRange }}/月</text>
  130. <text>
  131. <text class="bonus-tag">奖</text>
  132. <text class="bonus-xin">{{ item.salaryTimes }}</text>
  133. </text>
  134. </view>
  135. <!-- 职位要求标签 -->
  136. <view class="job-requirements" v-if="item.experience || item.education || item.welfareTag">
  137. <text class="requirement-tag" v-if="item.experience">{{
  138. item.experience
  139. }}</text>
  140. <text class="requirement-tag" v-if="item.education">{{
  141. item.education
  142. }}</text>
  143. <text class="requirement-tag" v-for="(welfare, idx) in item.welfareTag" :key="idx">{{ welfare }}</text>
  144. </view>
  145. <!-- 联系人信息 -->
  146. <view class="contact-info">
  147. <image :src="item.hr && item.hr.hrImg ? item.hr.hrImg : '../../../static/logo.png'
  148. " style="
  149. width: 58rpx;
  150. height: 58rpx;
  151. border-radius: 50%;
  152. margin-right: 20rpx;
  153. " mode=""></image>
  154. <view class="company-info-text">
  155. {{ item.user.userName ? item.user.userName : '未知' }}·{{ item.hr.hrPosition ? item.hr.hrPosition : '未知' }}
  156. </view>
  157. <view v-if="item.respondTime" class="reply-time">{{ item.respondTime }}</view>
  158. </view>
  159. <!-- 地址和距离 -->
  160. <view class="location-info">
  161. <u-icon name="map" color="#999999" size="16"></u-icon>
  162. <text class="address">{{ item.province || "" }}{{ item.city || "" }}{{ item.county || ""
  163. }}{{ item.address || "" }}</text>
  164. <image src="../../../static/images/index/navigation.svg" class="distance-icon"></image>
  165. <text class="distance">{{ item.distance || "--km" }}</text>
  166. </view>
  167. </view>
  168. </view>
  169. </view>
  170. <!-- 暂无数据 -->
  171. <view class="empty-state" v-else>
  172. <text>暂无更多职位</text>
  173. </view>
  174. </view>
  175. </view>
  176. <u-popup mode="top" ref="permission">
  177. <view class="popup-content">
  178. <view class="popup-text-permission">获取位置需要定位权限,用于推荐同城的求职岗位或牛人</view>
  179. </view>
  180. </u-popup>
  181. </view>
  182. </template>
  183. <script>
  184. export default {
  185. name: "gameList",
  186. data() {
  187. return {
  188. statusBarHeight: 0, // 状态栏高度
  189. current: 0,
  190. typeList: [],
  191. currentSx: 0,
  192. sxTypeList: [
  193. {
  194. id: 1,
  195. name: "推荐",
  196. },
  197. {
  198. id: 2,
  199. name: "最新",
  200. },
  201. {
  202. id: 3,
  203. name: '附近',
  204. }
  205. ],
  206. county: '', //区
  207. city: "",
  208. searchKeyword: "", // 搜索关键词
  209. dataList: [], // 职位列表
  210. jobSearchList: [], // 求职列表
  211. page: 1,
  212. limit: 10,
  213. searchPage: 1,
  214. searchLimit: 10,
  215. latitude: "",
  216. longitude: "",
  217. industry: '',
  218. isFixed: false, // 是否固定
  219. fixedThreshold: 300, // 固定阈值
  220. education: '',//学历
  221. experience: '',//经验
  222. salaryRange: '',//薪资
  223. companyPeople: '' //公司规模
  224. };
  225. },
  226. computed: {
  227. filledFieldsCount() {
  228. const fields = [this.education, this.experience, this.industry, this.salaryRange, this.companyPeople];
  229. const count = fields.filter(item => item).length;
  230. return count > 0 ? '·' + count : '';
  231. }
  232. },
  233. onLoad() {
  234. // 获取状态栏高度
  235. let systemInfo = uni.getSystemInfoSync();
  236. this.statusBarHeight = systemInfo.statusBarHeight || 0;
  237. let that = this;
  238. // 更换城市调用getJobSearchList
  239. // uni.$on('city', data => {
  240. // that.city = data.city
  241. // uni.setStorageSync('city', that.city);
  242. // this.searchPage = 1
  243. // this.getJobSearchList();
  244. // })
  245. uni.$on('filterCity', data => {
  246. that.city = data.city
  247. that.county = data.county;
  248. uni.setStorageSync('city', that.city);
  249. this.searchPage = 1
  250. this.getJobSearchList();
  251. })
  252. // 监听筛选条件触发getJobSearchList
  253. uni.$on('updateScreenFilterRecord', () => {
  254. const condition = this.$queue.getFilterData('filterSearch')
  255. this.education = condition.education //学历
  256. this.experience = condition.experience //经验
  257. this.industry = condition.industry //行业
  258. this.salaryRange = condition.salaryRange //薪资
  259. this.companyPeople = condition.companyPeople //公司规模
  260. this.searchPage = 1
  261. this.getJobSearchList();
  262. })
  263. // 监听工作性质变化
  264. uni.$on('updatePosition', () => {
  265. this.searchPage = 1;
  266. this.page = 1;
  267. this.getTypeList();
  268. })
  269. if (uni.getStorageSync('city')) {
  270. this.city = uni.getStorageSync('city')
  271. } else {
  272. this.city = ''
  273. }
  274. const condition = this.$queue.getFilterData('filterSearch')
  275. this.education = condition.education //学历
  276. this.experience = condition.experience //经验
  277. this.industry = condition.industry //行业
  278. this.salaryRange = condition.salaryRange //薪资
  279. this.companyPeople = condition.companyPeople //公司规模
  280. // this.getTypeList();
  281. },
  282. onUnload() {
  283. uni.$off('filterCity');
  284. // uni.$off('city');
  285. uni.$off('updateScreenFilterRecord');
  286. uni.$off('updatePosition')
  287. },
  288. onShow() {
  289. this.getTypeList();
  290. },
  291. watch: {
  292. current(newData, oldData) {
  293. console.log(this.current)
  294. uni.showLoading({
  295. title: '加载中'
  296. })
  297. this.searchPage = 1
  298. this.getJobSearchList();
  299. },
  300. currentSx(newData, oldData) {
  301. uni.showLoading({
  302. title: '加载中'
  303. })
  304. this.searchPage = 1
  305. this.getJobSearchList();
  306. },
  307. // currentjob(newData, oldData) {
  308. // uni.showLoading({
  309. // title: '加载中'
  310. // })
  311. // this.page = 1
  312. // this.getJobSearchList();
  313. // },
  314. // currentJobSx(newData, oldData) {
  315. // uni.showLoading({
  316. // title: '加载中'
  317. // })
  318. // this.page = 1
  319. // this.getJobSearchList();
  320. // },
  321. // currentJobSxs(newData, oldData) {
  322. // uni.showLoading({
  323. // title: '加载中'
  324. // })
  325. // this.page = 1
  326. // this.getJobSearchList();
  327. // },
  328. },
  329. onPageScroll(e) {
  330. // 监听页面滚动
  331. const scrollTop = e.scrollTop;
  332. if (scrollTop > this.fixedThreshold) {
  333. this.isFixed = true;
  334. } else {
  335. this.isFixed = false;
  336. }
  337. },
  338. methods: {
  339. // 获取工作性质列表
  340. getTypeList() {
  341. var that = this
  342. //行业期望
  343. this.$Request.get('/app/intention/getIntentionList', {}).then(res => {
  344. if (res.code == 0) {
  345. let arr = res.data
  346. let classRule = []
  347. let industry = [{ id: '不限', name: '不限' }]
  348. var industryArr = this.industry == '' ? [] : this.industry.split(',')
  349. industryArr.forEach(function (item) {
  350. if (that.$queue.array_column(that.directionList, 'name').indexOf(item) < 0)
  351. industry.push({ id: item, name: item })
  352. })
  353. arr.forEach(function (item) {
  354. var tmp = {}
  355. tmp.id = item.ruleClassifyId
  356. tmp.name = item.ruleClassifyName
  357. tmp.label = item.ruleClassifyName
  358. classRule.push(tmp)
  359. var indus = !item.industry ? [] : item.industry.split('/')
  360. indus.forEach(function (ind) {
  361. var tm = {}
  362. tm.name = ind
  363. tm.id = ind
  364. if (that.$queue.array_column(industry, 'name').indexOf(tm.name) < 0)
  365. industry.push(tm)
  366. })
  367. })
  368. this.typeList = classRule
  369. this.directionList = industry
  370. that.getJobSearchList();
  371. that.getJobList();
  372. }
  373. })
  374. // this.$Request
  375. // .getT("/app/dict/list", {
  376. // type: "工作性质",
  377. // })
  378. // .then((res) => {
  379. // if (res.code == 0) {
  380. // this.typeList = res.data.map((item) => ({
  381. // label: item.value,
  382. // value: item.code,
  383. // }));
  384. // // 获取到tabs数据后调用职位列表
  385. // this.getJobList();
  386. // }
  387. // });
  388. },
  389. // 跳转到搜索页面
  390. goNavs(url) {
  391. uni.navigateTo({
  392. url: url,
  393. });
  394. },
  395. // 跳转到求职意向页面
  396. goNav(url) {
  397. uni.navigateTo({
  398. url: url,
  399. });
  400. },
  401. // 处理搜索
  402. handleSearch() {
  403. if (this.searchKeyword.trim() || true) {
  404. uni.navigateTo({
  405. url: "/package/search/search?keyword=" + encodeURIComponent(this.searchKeyword),
  406. });
  407. } else {
  408. uni.showToast({
  409. title: "请输入搜索关键词",
  410. icon: "none",
  411. });
  412. }
  413. },
  414. // 获取位置信息
  415. async getLocation() {
  416. let that = this;
  417. // #ifdef APP
  418. const hasPermission = await this.$queue.checkPermission(
  419. 'location', // 固定传 'location',双端通用
  420. '获取您的位置用于推荐附近的求职岗位或牛人', // 提示文案也无需区分系统(统一表述即可)
  421. this
  422. );
  423. if (!hasPermission) {
  424. return that.goNav('/package/screen/city?city=' + that.city + '&county=' + that.county);
  425. }
  426. // #endif
  427. uni.getLocation({
  428. type: "wgs84",
  429. success: function (res) {
  430. that.latitude = res.latitude;
  431. that.longitude = res.longitude;
  432. that.getSelectCity(res.longitude, res.latitude)
  433. that.goNav('/package/screen/city?city=' + that.city + '&county=' + that.county + '&type=' + 'search')
  434. },
  435. fail: function () {
  436. that.getTypeList();
  437. that.goNav('/package/screen/city?city=' + that.city + '&county=' + that.county + '&type=' + 'search')
  438. },
  439. });
  440. },
  441. getSelectCity(longitude, latitude) {
  442. let that = this;
  443. this.$Request.get('/app/Login/selectCity?lat=' + latitude + '&lng=' + longitude).then(res => {
  444. if (res.code == 0) {
  445. // console.log(res, '获取地址信息')
  446. that.city = res.data.city ? res.data.city : '区域'
  447. uni.setStorageSync('city', res.data.city)
  448. that.getTypeList();
  449. }
  450. });
  451. },
  452. // 获取职位列表
  453. getJobList() {
  454. let data = {
  455. page: this.page,
  456. limit: this.limit,
  457. // postType: this.typeList.length > 0 ? this.typeList[this.current].name : "",
  458. ruleClassifyName: this.typeList.length > 0 ? this.typeList[this.current].name : "", //岗位名称
  459. screen: +this.currentSx + 1, //1推荐 2最新
  460. city: this.city == "区域" || this.city == "全国" ? "" : this.city,
  461. lng: this.longitude,
  462. lat: this.latitude,
  463. isDue: 1,
  464. // userId: uni.getStorageSync("userId") ? uni.getStorageSync("userId") : "",
  465. };
  466. this.$Request.get("/app/postPush/userGetPostPushList", data).then((res) => {
  467. if (res.code == 0) {
  468. res.data.records.map((item) => {
  469. if (item.positionWelfare) {
  470. item.positionWelfare = item.positionWelfare?.split(",");
  471. } else {
  472. item.positionWelfare = [];
  473. }
  474. if (item.distance) {
  475. if (parseFloat(item.distance) > 1000) {
  476. item.distance = (parseFloat(item.distance) / 1000).toFixed(2) + "km";
  477. } else {
  478. item.distance = parseFloat(item.distance).toFixed(2) + "m";
  479. }
  480. } else {
  481. item.distance = "";
  482. }
  483. });
  484. if (this.page == 1) {
  485. this.dataList = res.data.records.slice(0, 2);
  486. } else {
  487. this.dataList = [...this.dataList, ...res.data.records.slice(0, 2)];
  488. }
  489. }
  490. });
  491. },
  492. // 跳转到职位详情
  493. gotoInfo(postPushId) {
  494. uni.navigateTo({
  495. url: "/pages/index/game/order?postPushId=" + postPushId,
  496. });
  497. },
  498. // 判断岗位名称与职位名称是否相同
  499. isSameName(className, name) {
  500. let str1 = className.trim();
  501. let str2 = name.trim();
  502. if (str1.length !== str2.length) {
  503. return true;
  504. }
  505. return str1.toLowerCase() !== str2.toLowerCase();
  506. },
  507. // 刷新职位列表
  508. refreshJobList() {
  509. this.page = 1;
  510. this.getJobList();
  511. },
  512. // 获取求职列表
  513. getJobSearchList() {
  514. let data = {
  515. page: this.searchPage,
  516. limit: this.searchLimit,
  517. // postType: this.typeList.length > 0 ? this.typeList[this.current].name : "",
  518. ruleClassifyName: this.typeList.length > 0 ? this.typeList[this.current].name : "", //岗位名称
  519. screen: +this.currentSx + 1, //1推荐 2最新
  520. city: this.city == "区域" || this.city == "全国" ? "" : this.city,
  521. lng: this.longitude,
  522. lat: this.latitude,
  523. isDue: 1,
  524. // userId: uni.getStorageSync("userId") ? uni.getStorageSync("userId") : "",
  525. education: this.education || '',//学历
  526. experience: this.experience || '',//经验
  527. industry: this.industry || '',//行业
  528. salaryRange: this.salaryRange || '',//薪资
  529. companyPeople: this.companyPeople || ''//公司规模
  530. };
  531. this.$Request.get("/app/postPush/userGetPostPushList", data).then((res) => {
  532. uni.hideLoading()
  533. if (res.code == 0) {
  534. res.data.records.map((item) => {
  535. if (item.welfareTag) {
  536. item.welfareTag = item.welfareTag?.split(";");
  537. } else {
  538. item.welfareTag = [];
  539. }
  540. if (item.distance) {
  541. if (parseFloat(item.distance) > 1000) {
  542. item.distance = (parseFloat(item.distance) / 1000).toFixed(2) + "km";
  543. } else {
  544. item.distance = parseFloat(item.distance).toFixed(2) + "m";
  545. }
  546. } else {
  547. item.distance = "";
  548. }
  549. });
  550. if (this.searchPage == 1) {
  551. this.jobSearchList = res.data.records;
  552. } else {
  553. this.jobSearchList = [...this.jobSearchList, ...res.data.records];
  554. }
  555. }
  556. });
  557. },
  558. },
  559. };
  560. </script>
  561. <style lang="scss" scoped>
  562. page {
  563. background-color: #f2f2f7;
  564. }
  565. .page-container {
  566. position: absolute;
  567. left: 0;
  568. right: 0;
  569. top: 0;
  570. bottom: 0;
  571. display: flex;
  572. flex-direction: column;
  573. overflow: hidden;
  574. .page-bg {
  575. position: absolute;
  576. top: 0;
  577. left: 0;
  578. right: 0;
  579. height: 40vh;
  580. background: linear-gradient(90deg, rgba(13, 39, 247, 1), rgba(19, 193, 234, 1) 100%);
  581. z-index: -1;
  582. .page-bottom {
  583. height: 20vh;
  584. position: absolute;
  585. bottom: 0;
  586. left: 0;
  587. right: 0;
  588. background: linear-gradient(to top,
  589. rgba(244, 243, 243, 1),
  590. rgba(255, 255, 255, 0.5) 46%,
  591. rgba(255, 255, 255, 0) 100%);
  592. }
  593. }
  594. .page-content {
  595. flex: 1;
  596. width: 100%;
  597. overflow: hidden;
  598. overflow-y: auto;
  599. }
  600. }
  601. .search-section {
  602. flex-shrink: 0;
  603. width: 100%;
  604. padding: 20rpx 20rpx;
  605. display: flex;
  606. justify-content: space-between;
  607. .search-bar {
  608. flex: 1;
  609. height: 52rpx;
  610. background-color: #ffffff;
  611. border-radius: 40rpx;
  612. display: flex;
  613. align-items: center;
  614. padding: 0 30rpx;
  615. margin-right: 20rpx;
  616. box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
  617. .search-icon {
  618. margin-right: 20rpx;
  619. }
  620. .search-input {
  621. flex: 1;
  622. height: 100%;
  623. font-size: 24rpx;
  624. color: #333333;
  625. border: none;
  626. outline: none;
  627. background: transparent;
  628. &::placeholder {
  629. color: #999999;
  630. }
  631. }
  632. }
  633. .search-btn {
  634. color: rgba(255, 255, 255, 1);
  635. font-family: DM Sans;
  636. font-size: 24rpx;
  637. font-weight: 500;
  638. line-height: 24px;
  639. letter-spacing: 0%;
  640. text-align: center;
  641. }
  642. }
  643. .active {
  644. font-size: 38rpx !important;
  645. font-weight: 800 !important;
  646. }
  647. .active2 {
  648. color: #1a1a1a !important;
  649. font-size: 38rpx !important;
  650. font-weight: 800 !important;
  651. }
  652. .active3 {
  653. color: #1a1a1a !important;
  654. font-size: 28rpx !important;
  655. font-weight: 800 !important;
  656. }
  657. .topbg-type {
  658. width: 710rpx;
  659. border-radius: 6px;
  660. box-shadow: 0px 8px 12px 0px rgba(0, 0, 0, 0.05);
  661. background: rgba(255, 255, 255, 1);
  662. padding: 18rpx 25rpx;
  663. margin: 0rpx auto 12rpx auto;
  664. .topbg-type-box {
  665. width: 686rpx;
  666. }
  667. .topbg-type-box-row {
  668. margin-bottom: 20rpx;
  669. }
  670. .topbg-type-box-l {
  671. flex: 1;
  672. white-space: nowrap;
  673. overflow-x: auto;
  674. }
  675. .topbg-type-box-l-i {
  676. color: rgba(153, 153, 153, 1);
  677. font-family: DM Sans;
  678. font-size: 28rpx;
  679. font-weight: 400;
  680. line-height: 18px;
  681. letter-spacing: 0%;
  682. text-align: left;
  683. margin-right: 14rpx;
  684. &.active {
  685. background: linear-gradient(90deg,
  686. rgba(13, 39, 247, 1),
  687. rgba(19, 193, 234, 1) 100%);
  688. -webkit-background-clip: text;
  689. -webkit-text-fill-color: transparent;
  690. background-clip: text;
  691. text-fill-color: transparent;
  692. font-family: DM Sans;
  693. font-size: 24rpx;
  694. font-weight: 700;
  695. line-height: 48rpx;
  696. letter-spacing: 0%;
  697. text-align: left;
  698. }
  699. }
  700. .topbg-type-box-r {
  701. color: #ffffff;
  702. }
  703. .attachment-icon {
  704. width: 38rpx;
  705. height: 38rpx;
  706. }
  707. }
  708. .topbg-sx-box {
  709. width: 100%;
  710. margin-top: 0rpx;
  711. .topbg-sx-box-l-i {
  712. color: rgba(153, 153, 153, 1);
  713. font-family: DM Sans;
  714. font-size: 24rpx;
  715. font-weight: 400;
  716. line-height: 18px;
  717. letter-spacing: 0%;
  718. text-align: center;
  719. margin-right: 20rpx;
  720. border-radius: 6px;
  721. background: rgba(198, 198, 198, 0.1);
  722. padding: 8rpx 12rpx;
  723. display: inline-block;
  724. min-width: 60rpx;
  725. white-space: nowrap;
  726. &.active3 {
  727. font-family: DM Sans;
  728. font-size: 24rpx !important;
  729. font-weight: 400 !important;
  730. line-height: 18px;
  731. letter-spacing: 0%;
  732. text-align: left;
  733. padding: 8rpx 12rpx !important;
  734. color: rgba(1, 107, 246, 1) !important;
  735. background: rgba(252, 233, 220, 1) !important;
  736. border: 1px solid rgba(1, 107, 246, 1);
  737. }
  738. }
  739. .topbg-sx-box-r-i {
  740. color: rgba(1, 107, 246, 1);
  741. font-family: DM Sans;
  742. font-size: 24rpx;
  743. font-weight: 400;
  744. line-height: 18px;
  745. letter-spacing: 0%;
  746. text-align: center;
  747. margin-right: 20rpx;
  748. border-radius: 6px;
  749. background: rgba(252, 233, 220, 1);
  750. padding: 8rpx 12rpx;
  751. display: inline-block;
  752. min-width: 60rpx;
  753. white-space: nowrap;
  754. cursor: pointer;
  755. transition: all 0.3s ease;
  756. border: 0.5px solid rgba(1, 107, 246, 1);
  757. }
  758. .topbg-sx-box-filter {
  759. color: rgba(153, 153, 153, 1);
  760. font-family: DM Sans;
  761. font-size: 24rpx;
  762. font-weight: 400;
  763. line-height: 18px;
  764. letter-spacing: 0%;
  765. text-align: center;
  766. border-radius: 6px;
  767. background: rgba(198, 198, 198, 0.1);
  768. padding: 8rpx 12rpx;
  769. display: inline-block;
  770. min-width: 60rpx;
  771. white-space: nowrap;
  772. cursor: pointer;
  773. transition: all 0.3s ease;
  774. }
  775. }
  776. .job-list-section {
  777. padding: 20rpx;
  778. margin: 20rpx;
  779. border-radius: 6px;
  780. box-shadow: 0px 5px 8px 0px rgba(255, 255, 255, 0.05);
  781. background: linear-gradient(180deg, #78e4ff9d 1%, rgb(255, 255, 255) 38%);
  782. .job-list-header {
  783. display: flex;
  784. justify-content: space-between;
  785. align-items: center;
  786. margin-bottom: 20rpx;
  787. .job-list-title {
  788. color: rgba(1, 107, 246, 1);
  789. font-family: DM Sans;
  790. font-size: 32rpx;
  791. font-weight: 700;
  792. line-height: 21px;
  793. text-align: left;
  794. }
  795. .refresh-btn {
  796. color: rgba(1, 107, 246, 1);
  797. font-family: DM Sans;
  798. font-size: 18rpx;
  799. font-weight: 400;
  800. line-height: 10px;
  801. text-align: right;
  802. display: flex;
  803. align-items: center;
  804. gap: 8rpx;
  805. .refresh-icon {
  806. width: 28rpx;
  807. height: 28rpx;
  808. }
  809. }
  810. }
  811. .job-list {
  812. .job-item {
  813. background-color: #ffffff;
  814. border-radius: 12rpx;
  815. margin-bottom: 16rpx;
  816. padding: 20rpx;
  817. box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
  818. .job-item-content {
  819. display: flex;
  820. align-items: center;
  821. gap: 20rpx;
  822. .company-logo {
  823. width: 80rpx;
  824. height: 80rpx;
  825. border-radius: 8rpx;
  826. flex-shrink: 0;
  827. }
  828. .job-info {
  829. flex: 1;
  830. .company-name {
  831. color: rgba(29, 33, 41, 1);
  832. font-family: DM Sans;
  833. font-size: 24rpx;
  834. font-weight: 500;
  835. line-height: 13px;
  836. letter-spacing: 0%;
  837. text-align: left;
  838. margin-bottom: 8rpx;
  839. }
  840. .company-details {
  841. display: flex;
  842. gap: 16rpx;
  843. margin-bottom: 8rpx;
  844. text {
  845. color: rgba(153, 153, 153, 1);
  846. font-family: DM Sans;
  847. font-size: 20rpx;
  848. font-weight: 400;
  849. line-height: 13px;
  850. letter-spacing: 0%;
  851. text-align: left;
  852. }
  853. }
  854. .job-benefits {
  855. display: flex;
  856. gap: 12rpx;
  857. flex-wrap: nowrap;
  858. overflow: hidden;
  859. text-overflow: ellipsis;
  860. width: 450rpx;
  861. .text {
  862. color: rgba(153, 153, 153, 1);
  863. font-family: DM Sans;
  864. font-size: 20rpx;
  865. font-weight: 400;
  866. line-height: 26rpx;
  867. letter-spacing: 0%;
  868. text-align: left;
  869. white-space: nowrap;
  870. overflow: hidden;
  871. text-overflow: ellipsis;
  872. // 可选:设置最大宽度
  873. max-width: 100rpx;
  874. flex-shrink: 0;
  875. }
  876. }
  877. }
  878. }
  879. }
  880. }
  881. .empty-state {
  882. text-align: center;
  883. padding: 60rpx 0;
  884. color: #999999;
  885. font-size: 28rpx;
  886. }
  887. }
  888. // 求职列表样式
  889. .job-search-section {
  890. width: 100%;
  891. padding: 0 20rpx 20rpx 20rpx;
  892. .job-search-header {
  893. margin-bottom: 20rpx;
  894. .job-search-title {
  895. font-size: 32rpx;
  896. font-weight: 600;
  897. color: #333333;
  898. }
  899. }
  900. .job-search-list {
  901. .job-search-item {
  902. background-color: #ffffff;
  903. border-radius: 12rpx;
  904. margin-bottom: 16rpx;
  905. padding: 30rpx;
  906. box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
  907. position: relative;
  908. .urgent-tag {
  909. position: absolute;
  910. top: 0rpx;
  911. right: 40rpx;
  912. .urgent-icon {
  913. width: 80rpx;
  914. height: 80rpx;
  915. }
  916. }
  917. .job-search-content {
  918. .job-title {
  919. color: rgba(29, 33, 41, 1);
  920. font-family: DM Sans;
  921. font-size: 36rpx;
  922. font-weight: 500;
  923. line-height: 21px;
  924. letter-spacing: 0%;
  925. text-align: left;
  926. }
  927. .company-info {
  928. display: flex;
  929. gap: 16rpx;
  930. margin: 12rpx 0;
  931. .company-name {
  932. color: rgba(156, 164, 171, 1);
  933. font-family: DM Sans;
  934. font-size: 24rpx;
  935. font-weight: 400;
  936. line-height: 20px;
  937. letter-spacing: 0%;
  938. text-align: left;
  939. }
  940. }
  941. .salary {
  942. display: flex;
  943. align-items: center;
  944. justify-content: space-between;
  945. color: rgba(1, 107, 246, 1);
  946. font-family: DM Sans;
  947. font-size: 32rpx;
  948. font-weight: 700;
  949. line-height: 23px;
  950. letter-spacing: 0%;
  951. text-align: left;
  952. .bonus-tag {
  953. color: rgba(255, 255, 255, 1);
  954. font-family: DM Sans;
  955. padding: 4rpx;
  956. font-size: 24rpx;
  957. font-weight: 400;
  958. letter-spacing: 0%;
  959. text-align: center;
  960. border-radius: 4rpx;
  961. background: rgba(1, 107, 246, 1);
  962. margin-right: 12rpx;
  963. }
  964. .bonus-xin {
  965. color: rgba(1, 107, 246, 1);
  966. font-family: DM Sans;
  967. font-size: 24rpx;
  968. font-weight: 700;
  969. line-height: 20px;
  970. letter-spacing: 0%;
  971. text-align: right;
  972. }
  973. }
  974. .job-requirements {
  975. display: flex;
  976. gap: 12rpx;
  977. flex-wrap: wrap;
  978. margin-bottom: 12rpx;
  979. .requirement-tag {
  980. font-size: 18rpx;
  981. color: rgba(1, 107, 246, 1);
  982. padding: 6rpx 10rpx;
  983. background: rgba(153, 196, 250, 0.4);
  984. border-radius: 12rpx;
  985. margin: 12rpx 0;
  986. }
  987. }
  988. .contact-info {
  989. display: flex;
  990. align-items: center;
  991. margin-bottom: 12rpx;
  992. .company-info-text {
  993. color: rgba(51, 51, 51, 1);
  994. font-family: DM Sans;
  995. font-size: 24rpx;
  996. font-weight: 400;
  997. line-height: 20px;
  998. letter-spacing: 0%;
  999. text-align: left;
  1000. }
  1001. .reply-time {
  1002. display: flex;
  1003. flex-direction: row;
  1004. justify-content: center;
  1005. align-items: center;
  1006. padding: 8rpx;
  1007. font-family: DM Sans;
  1008. font-size: 20rpx;
  1009. font-weight: 400;
  1010. line-height: 30rpx;
  1011. letter-spacing: 0.5%;
  1012. text-align: left;
  1013. border-radius: 12rpx;
  1014. background: #ece1fd;
  1015. color: #8858c5;
  1016. margin-left: 12rpx;
  1017. }
  1018. }
  1019. .location-info {
  1020. display: flex;
  1021. align-items: center;
  1022. gap: 8rpx;
  1023. .address {
  1024. font-size: 22rpx;
  1025. color: #999999;
  1026. flex: 1;
  1027. }
  1028. .distance-icon {
  1029. width: 24rpx;
  1030. height: 24rpx;
  1031. }
  1032. .distance {
  1033. font-size: 22rpx;
  1034. color: #999999;
  1035. }
  1036. }
  1037. }
  1038. }
  1039. }
  1040. .empty-state {
  1041. text-align: center;
  1042. padding: 60rpx 0;
  1043. color: #999999;
  1044. font-size: 28rpx;
  1045. }
  1046. }
  1047. // 固定样式
  1048. .search-section.fixed {
  1049. position: fixed;
  1050. top: 0;
  1051. left: 0;
  1052. right: 0;
  1053. z-index: 100;
  1054. background-image: url("../../../static/images/index/jipinBac.png");
  1055. background-size: cover;
  1056. background-position: top center;
  1057. background-repeat: no-repeat;
  1058. height: 19vh;
  1059. }
  1060. .topbg-type.fixed {
  1061. position: fixed;
  1062. top: 9vh;
  1063. left: 50%;
  1064. transform: translateX(-50%);
  1065. z-index: 101;
  1066. background: rgba(255, 255, 255, 0.95);
  1067. backdrop-filter: blur(10rpx);
  1068. }
  1069. .activeColor {
  1070. color: #016bf6 !important;
  1071. border: 1rpx solid #016bf6;
  1072. background: #fce9dc !important;
  1073. }
  1074. </style>