recruitment.vue 11 KB

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