<template>
|
<PageLayoutWithBg class="index-page-wrapper" :title="''" :need-auth="false">
|
<template #left>
|
<div class="menu-btn-wrapper menu-logo">
|
<img :src="IconLogo" class="logo" />
|
</div>
|
</template>
|
<div class="home-header">
|
<div class="home-searchbar-wrapper">
|
<div class="city-btn-wrapper">
|
<div class="city-btn">
|
<img :src="IconLocaltion" class="city-btn-icon" />
|
<div class="city-btn-text">{{ locationCity }}</div>
|
</div>
|
</div>
|
<div class="reset-localtion" @click="resetLocation">重新定位</div>
|
</div>
|
<div class="home-banner-wrapper">
|
<nut-swiper :auto-play="3000">
|
<nut-swiper-item v-for="(item, index) in list" :key="index">
|
<img :src="item" class="banner-img" draggable="false" />
|
</nut-swiper-item>
|
</nut-swiper>
|
</div>
|
</div>
|
<ProTabs
|
v-model="queryState.orderType"
|
name="home-tab"
|
:showPaneContent="false"
|
:showSmile="false"
|
class="home-tabs"
|
isTransparent
|
title-gutter="8"
|
title-scroll
|
>
|
<ProTabPane :title="`推荐`" :pane-key="HomeOrderType.Recommend"></ProTabPane>
|
<ProTabPane :title="`最新`" :pane-key="HomeOrderType.LastShelfTime"></ProTabPane>
|
<template #right>
|
<Menu>
|
<MenuItem title="岗位" ref="selectPositionItem">
|
<HomeQueryPositionMenuView
|
v-model:query="queryPositionState"
|
@close="handleMenuSelectPositionClose"
|
></HomeQueryPositionMenuView>
|
</MenuItem>
|
<MenuItem title="筛选" ref="selectItem">
|
<HomeQueryMenuView
|
v-model:query="queryMenuState"
|
@close="handleMenuSelectClose"
|
></HomeQueryMenuView>
|
</MenuItem>
|
</Menu>
|
</template>
|
</ProTabs>
|
<InfiniteLoading
|
scrollViewClassName="common-infinite-scroll-list home-list"
|
v-bind="infiniteLoadingProps"
|
:key="queryState.orderType"
|
>
|
<template #renderItem="{ item }">
|
<FlexJobCard @click="goFlexJobDetail(item)" :showFooterLeft="false" />
|
</template>
|
</InfiniteLoading>
|
</PageLayoutWithBg>
|
</template>
|
|
<script setup lang="ts">
|
import { useUser } from '@/hooks';
|
import { useUserStore } from '@/stores/modules/user';
|
import { RectDown } from '@nutui/icons-vue-taro';
|
import Taro from '@tarojs/taro';
|
import { LocationUtils, trim } from '@12333/utils';
|
import IconLogo from '@/assets/home/icon-logo.png';
|
import { ProTabs, ProTabPane, FlexJobCard } from '@12333/components';
|
import { HomeOrderType } from './constants';
|
import { useInfiniteLoading } from '@12333/hooks';
|
import { OrderInputType, Gender } from '@12333/constants';
|
import * as orderServices from '@12333/services/api/Order';
|
import _ from 'lodash';
|
import HomeQueryMenuView from './HomeQueryMenuView.vue';
|
import HomeQueryPositionMenuView from './HomeQueryPositionMenuView.vue';
|
import IconLocaltion from '@/assets/home/icon-localtion.png';
|
import { setLocationCity } from '@/utils';
|
|
const { locationCity } = useUser();
|
|
const userStore = useUserStore();
|
|
const queryMenuState = reactive({
|
gender: '' as any as Gender,
|
age: [15, 65],
|
});
|
|
const queryPositionState = reactive({
|
position: [],
|
});
|
|
const queryState = reactive({
|
orderType: HomeOrderType.Recommend,
|
});
|
|
const { infiniteLoadingProps } = useInfiniteLoading(
|
({ pageParam }) => {
|
let params: API.FrontOrderListInput = {
|
pageModel: {
|
rows: 20,
|
page: pageParam,
|
orderInput: [
|
queryState.orderType === HomeOrderType.Recommend
|
? { property: 'isRecommend', order: OrderInputType.Desc }
|
: { property: 'lastShelfTime', order: OrderInputType.Desc },
|
],
|
},
|
};
|
|
return orderServices.getFrontOrderList(params, {
|
showLoading: false,
|
});
|
},
|
{
|
queryKey: ['orderServices/getFrontOrderList', queryState, queryMenuState, queryPositionState],
|
}
|
);
|
|
function goCitySelect() {
|
Taro.navigateTo({
|
url: RouterPath.citySelect,
|
});
|
}
|
|
const list = ref([
|
'https://storage.360buyimg.com/jdc-article/NutUItaro34.jpg',
|
'https://storage.360buyimg.com/jdc-article/NutUItaro2.jpg',
|
'https://storage.360buyimg.com/jdc-article/welcomenutui.jpg',
|
'https://storage.360buyimg.com/jdc-article/fristfabu.jpg',
|
]);
|
|
const selectItem = ref();
|
const selectPositionItem = ref();
|
|
function handleMenuSelectClose() {
|
selectItem.value?.toggle?.();
|
}
|
|
function handleMenuSelectPositionClose() {
|
selectPositionItem.value?.toggle?.();
|
}
|
|
function goFlexJobDetail(item: API.FrontOrderList) {
|
Taro.navigateTo({
|
url: `${RouterPath.flexJobDetail}?id=${item.id}`,
|
});
|
}
|
|
async function resetLocation() {
|
try {
|
await setLocationCity();
|
} catch (error) {}
|
}
|
</script>
|
|
<style lang="scss">
|
@import '@/styles/common.scss';
|
|
.index-page-wrapper {
|
.menu-logo {
|
padding: 0;
|
|
.logo {
|
width: 96px;
|
height: 64px;
|
}
|
}
|
|
.nut-menu__item + .nut-menu__item {
|
margin-left: 24px;
|
}
|
|
.home-searchbar-wrapper {
|
padding: 32px 0 28px;
|
display: flex;
|
align-items: center;
|
|
.city-btn-wrapper {
|
flex: 1;
|
min-width: 0;
|
|
.city-btn {
|
display: flex;
|
align-items: center;
|
padding-right: 36px;
|
color: boleGetCssVar('text-color', 'primary');
|
|
.city-btn-icon {
|
width: 40px;
|
height: 40px;
|
}
|
|
.city-btn-text {
|
max-width: 200px;
|
@include ellipsis;
|
margin-left: 12px;
|
font-size: 30px;
|
}
|
}
|
}
|
|
.reset-localtion {
|
font-weight: 400;
|
font-size: 24px;
|
color: boleGetCssVar('color', 'primary');
|
line-height: 28px;
|
}
|
}
|
|
.home-banner-wrapper {
|
.banner-img {
|
width: 100%;
|
height: 260px;
|
object-fit: cover;
|
}
|
}
|
|
.home-header {
|
padding: 0 boleGetCssVar('size', 'body-padding-h');
|
}
|
|
.home-list {
|
@include infiniteLoadingInTabBarPage;
|
}
|
}
|
</style>
|