recruitment.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. <!--
  2. * @title 招聘就业
  3. * @author Rockery(1113269755@qq.com)
  4. -->
  5. <template>
  6. <view class="recruitment">
  7. <u-navbar back-text="" title="" back-icon-color="#FFFFFF" :background="{ background: '#3D5D4C' }" :border-bottom="false"></u-navbar>
  8. <!-- ###################################-- 轮播图 -- ################################### -->
  9. <view class="recruitment-banner">
  10. <u-swiper
  11. :list="bannerList"
  12. name="bannerUrl"
  13. border-radius="0"
  14. height="300"
  15. img-mode="scaleToFill"
  16. @click="swiperClick"
  17. :mode="bannerList.length > 1 ? 'round' : 'none'"
  18. >
  19. </u-swiper>
  20. </view>
  21. <!-- ###################################-- 请输入您关键词 -- ################################### -->
  22. <view class="recruitment-usearch">
  23. <u-search
  24. placeholder="请输入您关键词"
  25. v-model="headerTopKeyword"
  26. :show-action="false"
  27. bg-color="#FFFFFF"
  28. @search="searchKeyword"
  29. @clear="searchKeyword"
  30. ></u-search>
  31. </view>
  32. <!-- ###################################-- 企业推荐 -- ################################### -->
  33. <view class="u-card-wrap recruitment-recommend">
  34. <u-card :show-foot="false" class="recruitment-recommend-card">
  35. <view slot="head">
  36. <view class="recommend-card-head">
  37. <view class="recommend-card-head-title">{{ recommendConfigData.title }}</view>
  38. <view class="recommend-card-head-subtitle" @tap="recommendCardMoreClick">
  39. {{ recommendConfigData.titlemore }}
  40. <u-icon name="arrow-right" color="#A3A3A3" size="28"></u-icon>
  41. </view>
  42. </view>
  43. </view>
  44. <view slot="body">
  45. <view class="recommend-card-body">
  46. <swiper v-if="recommendList && recommendList.length > 0" class="recommend-card-content" :display-multiple-items="4" :autoplay="true">
  47. <swiper-item v-for="(recommendItem, index) in recommendList" :key="'recommendList' + index">
  48. <view class="swiper-item" @tap="tapRecommendSwiperItem(recommendItem)" :data-id="recommendItem.id" :data-index="index">
  49. <view class="img">
  50. <u-image :src="recommendItem.logoUrl" width="140" height="140" border-radius="10" mode="aspectFill">
  51. <view slot="error">
  52. <u-image src="../../static/img/default-company.png" width="140" height="140" border-radius="10" mode="aspectFill" />
  53. </view>
  54. </u-image>
  55. </view>
  56. <view class="subject">{{ recommendItem.companyName }}</view>
  57. <view class="post u-text-center">
  58. 岗位
  59. <text class="postlink">{{ recommendItem.postCount }}</text
  60. >个
  61. </view>
  62. </view>
  63. </swiper-item>
  64. <swiper-item v-if="recommendConfigData.listmore">
  65. <view class="swiper-item lookmore" @tap="recommendCardMoreClick">
  66. <view class="moretext">查看更多</view>
  67. </view>
  68. </swiper-item>
  69. </swiper>
  70. <u-empty v-else text="列表为空" mode="list"></u-empty>
  71. </view>
  72. </view>
  73. </u-card>
  74. </view>
  75. <!-- ###################################-- tabs页签 -- ################################### -->
  76. <view class="recruitment-tabs">
  77. <u-tabs bg-color="#f2f2f2" :list="dataAreaTabsList" @change="dataAreaTabsChange" :current="dataAreaTabsCurrent" />
  78. </view>
  79. <!-- ###################################-- 招聘就业岗位 -- ################################### -->
  80. <view class="recruitment-dataarea" v-if="recruitmentJobList.length">
  81. <view
  82. class="recruitment-dataarea-card"
  83. v-for="(item, index) in recruitmentJobList"
  84. :key="'recruitmentJobList' + index"
  85. @tap="tapDataAreaCard(item)"
  86. >
  87. <view class="dataarea-card-left">
  88. <u-image :src="item.companyLogoUrl" width="120" height="120" border-radius="10" mode="aspectFill">
  89. <view slot="error">
  90. <u-image src="../../static/img/default-company.png" width="120" height="120" border-radius="10" mode="aspectFill" />
  91. </view>
  92. </u-image>
  93. </view>
  94. <view class="dataarea-card-content">
  95. <view class="dataarea-content-left">
  96. <view>{{ item.postName }}</view>
  97. <view class="content">
  98. {{ item.areaName }}| {{ getDictsLabel(workYearList, item.workYear) }}|{{ getEducationBg(item.educationBg) }}
  99. </view>
  100. <view>{{ item.companyName }}</view>
  101. </view>
  102. <view class="dataarea-content-right">
  103. <view>{{ item.lowestSalary }}K~{{ item.highestSalary }}K</view>
  104. <view>&nbsp;</view>
  105. <view>{{ $u.timeFormat(new Date(item.createTime).getTime(), 'yyyy-mm-dd') }}</view>
  106. </view>
  107. </view>
  108. </view>
  109. <u-loadmore :status="loadStatus" @loadmore="refreshList()" />
  110. </view>
  111. <u-empty v-else text="列表为空" mode="list"></u-empty>
  112. </view>
  113. </template>
  114. <script>
  115. export default {
  116. data() {
  117. return {
  118. headerTopKeyword: '',
  119. bannerList: [],
  120. // 企业推荐列表
  121. recommendList: [],
  122. recruitmentJobList: [],
  123. recommendListData: [],
  124. recommendConfigData: {
  125. title: '企业推荐',
  126. titlemore: '更多',
  127. listmore: false
  128. },
  129. dataAreaTabsCurrent: 0,
  130. dataAreaTabsList: [
  131. {
  132. name: '最新',
  133. text: '1'
  134. }
  135. ],
  136. degrEducList: [],
  137. workYearList: [],
  138. queryParams: {
  139. pageNum: 1,
  140. pageSize: 10,
  141. postName: undefined,
  142. newest: undefined
  143. },
  144. loadStatus: 'loadmore',
  145. totalPage: 0
  146. };
  147. },
  148. onLoad() {
  149. // 获取企业推荐列表
  150. this.getRecommendList();
  151. this.getRecruitmentJobList();
  152. },
  153. onShow() {
  154. this.getBannerList();
  155. this.getVeteDegrEduc();
  156. },
  157. // 下拉刷新触发
  158. onPullDownRefresh() {
  159. // 开始
  160. uni.startPullDownRefresh();
  161. this.recruitmentJobList = [];
  162. this.recommendList = [];
  163. this.recommendListData = [];
  164. this.bannerList = [];
  165. this.queryParams = {
  166. pageNum: 1,
  167. pageSize: 10,
  168. postName: undefined,
  169. newest: undefined
  170. };
  171. this.getRecommendList();
  172. this.getRecruitmentJobList();
  173. this.getBannerList();
  174. this.getVeteDegrEduc();
  175. setTimeout(() => {
  176. // 停止下拉
  177. uni.stopPullDownRefresh();
  178. }, 1500);
  179. },
  180. /**
  181. * @description: 往底部滑动触发
  182. * @return {*}
  183. */
  184. onReachBottom() {
  185. if (this.queryParams.pageNum >= this.totalPage) return;
  186. this.refreshList();
  187. },
  188. methods: {
  189. refreshList() {
  190. this.loadStatus = 'loading';
  191. setTimeout(() => {
  192. this.queryParams.pageNum = ++this.queryParams.pageNum;
  193. this.getRecruitmentJobList();
  194. }, 1000);
  195. },
  196. /**
  197. * 获取文化程度类别
  198. */
  199. getVeteDegrEduc() {
  200. this.$u.api
  201. .getDictdataUrl({
  202. key: 'degr_educ'
  203. })
  204. .then((res) => {
  205. if (res.code == 200) {
  206. this.degrEducList = res.data.map((item) => {
  207. return {
  208. ...item,
  209. value: item.text
  210. };
  211. });
  212. }
  213. });
  214. this.$u.api
  215. .getDictdataUrl({
  216. key: 'work_year'
  217. })
  218. .then((res) => {
  219. if (res.code == 200) {
  220. this.workYearList = res.data.map((item) => {
  221. return {
  222. ...item,
  223. value: item.text
  224. };
  225. });
  226. }
  227. });
  228. },
  229. /**
  230. * 获取教育等级名称
  231. * @param {Object} value
  232. */
  233. getEducationBg(value) {
  234. let name;
  235. this.degrEducList.forEach((item) => {
  236. if (item.value == value) {
  237. name = item.label;
  238. }
  239. });
  240. return name;
  241. },
  242. /**
  243. * 导航栏返回事件
  244. */
  245. navbarCustomBack() {
  246. this.$u.route({
  247. type: 'switchTab',
  248. url: 'pages/index/index'
  249. });
  250. },
  251. getBannerList() {
  252. this.$u.api.indexApi
  253. .indexBannerListApi({
  254. type: 1
  255. })
  256. .then((res) => {
  257. if (res?.code === 200) {
  258. this.bannerList = res.data;
  259. }
  260. });
  261. },
  262. // 轮播图点击
  263. swiperClick(index) {
  264. if (this.bannerList[index].jumpUrl) {
  265. let url = this.bannerList[index].jumpUrl.split('#')[1];
  266. this.$u.route({
  267. url: url
  268. });
  269. } else {
  270. this.$u.route({
  271. url: 'pages/bannerDetails/bannerDetails',
  272. params: {
  273. id: this.bannerList[index].id,
  274. type: 1
  275. }
  276. });
  277. }
  278. },
  279. /**
  280. * 获取企业推荐列表
  281. */
  282. getRecommendList() {
  283. this.$u.api.recruitment
  284. .getRecommendList()
  285. .then((res) => {
  286. if (res.code === 200) {
  287. this.recommendList = res?.data ?? [];
  288. } else {
  289. uni.showToast({
  290. icon: 'none',
  291. title: res.msg
  292. });
  293. }
  294. })
  295. .catch((err) => {
  296. uni.showToast({
  297. title: '系统异常!',
  298. type: 'error'
  299. });
  300. });
  301. },
  302. /**
  303. * 获取招聘就业岗位列表
  304. */
  305. getRecruitmentJobList() {
  306. const queryParams = { ...this.queryParams };
  307. queryParams.newest = this.dataAreaTabsList[this.dataAreaTabsCurrent]?.text;
  308. queryParams.postName = this.headerTopKeyword;
  309. this.$u.api.recruitment
  310. .getRecruitmentJobList(queryParams)
  311. .then((res) => {
  312. if (res.code === 200) {
  313. this.totalPage = parseInt(Number(res.total) / this.queryParams.pageSize) + 1;
  314. let list = res?.rows ?? [];
  315. list.length && (this.recruitmentJobList = this.recruitmentJobList.concat(list));
  316. if (this.queryParams.pageNum >= this.totalPage) {
  317. this.loadStatus = 'nomore';
  318. } else {
  319. this.loadStatus = 'loadmore';
  320. }
  321. } else {
  322. this.loadStatus = 'nomore';
  323. uni.showToast({
  324. icon: 'none',
  325. title: res.msg
  326. });
  327. }
  328. })
  329. .catch((err) => {
  330. this.loadStatus = 'nomore';
  331. uni.showToast({
  332. title: '系统异常!',
  333. type: 'error'
  334. });
  335. });
  336. },
  337. /**
  338. * @param { String } value
  339. */
  340. searchKeyword() {
  341. this.recruitmentJobList = [];
  342. this.queryParams.pageNum = 1;
  343. this.getRecruitmentJobList();
  344. },
  345. // tab栏切换
  346. dataAreaTabsChange(index) {
  347. this.dataAreaTabsCurrent = index;
  348. this.recruitmentJobList = [];
  349. this.queryParams.pageNum = 1;
  350. this.getRecruitmentJobList();
  351. },
  352. recommendCardMoreClick(index) {
  353. this.$u.route({
  354. url: 'pages/cooperativeEnterprise/cooperativeEnterprise',
  355. params: {
  356. flag: 'recruitment'
  357. }
  358. });
  359. },
  360. tapRecommendSwiperItem(param) {
  361. this.$u.route({
  362. url: 'pages/businessDetails/businessDetails',
  363. params: {
  364. id: param?.id,
  365. flag: 'recruitment'
  366. }
  367. });
  368. },
  369. tapDataAreaCard(param) {
  370. this.$u.route({
  371. url: 'pages/jobDetails/jobDetails',
  372. params: {
  373. id: param?.id
  374. }
  375. });
  376. },
  377. /**
  378. * 通过value获取label
  379. * @param {Object} list
  380. * @param {Object} value
  381. */
  382. getDictsLabel(list, value) {
  383. let label = '-';
  384. try {
  385. list.forEach((item) => {
  386. if (Number(item.text) === Number(value)) {
  387. throw item;
  388. }
  389. });
  390. } catch (e) {
  391. label = e?.label;
  392. }
  393. return label;
  394. }
  395. }
  396. };
  397. </script>
  398. <style lang="scss" scoped>
  399. @import './scss/recruitment.scss';
  400. </style>