396 lines
11 KiB
Vue
396 lines
11 KiB
Vue
<!-- 首页搜索页 -->
|
||
<template>
|
||
<!-- 搜索nav -->
|
||
<SearchPage
|
||
ref="search"
|
||
@handleSearch="handleSearch"
|
||
@handleBlur="handleBlur"
|
||
@clearSearchData="clearSearchData"
|
||
@goBack="goBack"
|
||
:isShowCancel="isShowCancel"
|
||
></SearchPage>
|
||
<!-- end -->
|
||
<view class="searchTop">
|
||
<view class="pageBox">
|
||
<!-- 最近查找 -->
|
||
<view class="recentBox" v-if="!isClear">
|
||
<view class="tit">
|
||
<text>最近查找</text>
|
||
<icon @click="handleClear"></icon>
|
||
</view>
|
||
|
||
<view class="recentList">
|
||
<view
|
||
class="item"
|
||
v-for="(item, index) in listDataes.value"
|
||
:key="index"
|
||
@click="handleTransportOrderId(item)"
|
||
>{{ item }}</view
|
||
>
|
||
<view class="iconUp" v-if="!showDisplay">
|
||
<view
|
||
@click="showDisplay = !showDisplay"
|
||
v-if="itemDataRecent.length > 10"
|
||
><image
|
||
class="icon_img"
|
||
src="../../static/open.png"
|
||
mode=""
|
||
></image
|
||
></view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<!-- end -->
|
||
<!-- 搜索列表 -->
|
||
<scroll-view scroll-y="true" class="swiperH" v-if="itemData.length > 0">
|
||
<view class="serachList">
|
||
<view class="">
|
||
<view class="tabList">
|
||
<view
|
||
class="boxBg"
|
||
v-for="(item, index) in itemData"
|
||
:key="index"
|
||
@click.stop="handleDetails($event, item)"
|
||
>
|
||
<!-- 待取件 -->
|
||
<StayPicup
|
||
:item="item"
|
||
@handleDetails="handleDetails"
|
||
></StayPicup>
|
||
<!-- end -->
|
||
<!-- 已取件 -->
|
||
<AlreadyPicUp
|
||
:item="item"
|
||
@handleDetails="handleDetails"
|
||
></AlreadyPicUp>
|
||
<!-- end -->
|
||
<!-- 取件取消 -->
|
||
<Canceled :item="item"></Canceled>
|
||
<!-- end -->
|
||
<!-- 已签收 -->
|
||
<SignFor :item="item" @handleDetails="handleDetails"></SignFor>
|
||
<!-- end -->
|
||
<!-- 已经完成到付未付款 -->
|
||
<Accomplish
|
||
:item="item"
|
||
@handleDetails="handleDetails"
|
||
></Accomplish>
|
||
<!-- end -->
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<ReachBottom ref="loadMore"></ReachBottom>
|
||
</scroll-view>
|
||
<!-- end -->
|
||
<!-- 无数据 -->
|
||
<view v-if="itemData.length === 0 && isClear"
|
||
><EmptyPage :emptyData="emptyData"></EmptyPage
|
||
></view>
|
||
<!-- end -->
|
||
</view>
|
||
|
||
<!-- 提示窗示例 -->
|
||
<UniPopup
|
||
ref="popups"
|
||
:tipInfo="tipInfo"
|
||
@handleClick="clearData"
|
||
></UniPopup>
|
||
<!-- end -->
|
||
</view>
|
||
</template>
|
||
|
||
<script setup>
|
||
import { ref, reactive, onMounted, computed, onUnmounted } from "vue";
|
||
import { onReachBottom } from "@dcloudio/uni-app";
|
||
import { useStore } from "vuex";
|
||
// 接口
|
||
import {
|
||
getSearch,
|
||
getRecentSearch,
|
||
setMarkRecent,
|
||
clearRecentSearch,
|
||
} from "@/pages/api/index.js";
|
||
// 导入组件
|
||
// 搜索组件
|
||
import SearchPage from "@/components/uni-search/index.vue";
|
||
// 暂无搜索内容
|
||
import EmptyPage from "@/components/uni-empty-page/index.vue";
|
||
// 弹层
|
||
import UniPopup from "@/components/uni-popup/index.vue";
|
||
// 下拉提示
|
||
import ReachBottom from "@/components/reach-bottom/index.vue";
|
||
//
|
||
// 待取件
|
||
import StayPicUp from "./components/StayPicUp.vue";
|
||
// 已取件
|
||
import AlreadyPicUp from "./components/AlreadyPicUp.vue";
|
||
//已取消
|
||
import Canceled from "./components/Canceled.vue";
|
||
// 已签收
|
||
import SignFor from "./components/SignFor.vue";
|
||
// 完成未付款
|
||
import Accomplish from "./components/Accomplish.vue";
|
||
// ------定义变量------
|
||
const store = useStore(); //vuex获取、储存数据
|
||
const users = store.state.user;
|
||
const search = ref(); //定义搜索框的ref
|
||
let showDisplay = ref(false); //最近查找更多触发,触发之后按钮隐藏
|
||
let isClear = ref(false); //触发清除按钮
|
||
const tipInfo = ref("确定要全部清空吗?");
|
||
let popups = ref();
|
||
let isShowCancel = ref(true);
|
||
const loadMore = ref(); //定义子组件的ref,可以调取子组件的值
|
||
let reload = ref(false);
|
||
let pages = ref(0); //总页数
|
||
let pageNum = ref(1); //存放当前页
|
||
const itemData = ref([]); //数据
|
||
const itemDataRecent = reactive([]); //近期数据
|
||
const emptyData = ref("没有找到相关内容");
|
||
let keyword = ref(""); //当前的搜索对象
|
||
let isInput = ref(false); //是否触发了输入框
|
||
let page = reactive({
|
||
latitude:
|
||
users.loacation.latitude !== undefined
|
||
? users.loacation.latitude
|
||
: 40.062595,
|
||
longitude:
|
||
users.loacation.longitude !== undefined
|
||
? users.loacation.longitude
|
||
: 116.372809,
|
||
page: 1,
|
||
pageSize: 10,
|
||
});
|
||
// 计算数据
|
||
const listDataes = computed(() => {
|
||
let testList = [];
|
||
if (showDisplay.value === false) {
|
||
if (itemDataRecent.length > 10) {
|
||
for (var i = 0; i < 10; i++) {
|
||
testList.push(itemDataRecent[i]);
|
||
}
|
||
} else {
|
||
testList = itemDataRecent;
|
||
}
|
||
return testList;
|
||
} else {
|
||
return itemDataRecent;
|
||
}
|
||
});
|
||
// 上下拉取
|
||
onReachBottom(() => {
|
||
isInput.value = true;
|
||
if (pageNum.value >= Number(pages.value)) {
|
||
loadMore.value.status = "noMore";
|
||
return false;
|
||
} else {
|
||
loadMore.value.status = "loading";
|
||
let times = setTimeout(() => {
|
||
pageNum.value++;
|
||
getList();
|
||
}, 1000); //这里延时一秒在加载方法有个loading效果
|
||
}
|
||
});
|
||
// 离开此页面
|
||
onUnmounted(() => {
|
||
itemData.value = [];
|
||
isInput.value = false;
|
||
});
|
||
// ------生命周期------
|
||
onMounted(() => {
|
||
init();
|
||
if (users.searchText !== "") {
|
||
keyword.value = users.searchText;
|
||
search.value.searchVal = users.searchText;
|
||
getList();
|
||
}
|
||
});
|
||
// 获取初始值
|
||
const init = () => {
|
||
getRecent(); //近期搜索数据
|
||
};
|
||
// ------定义方法------
|
||
// 获取数据
|
||
const getList = async () => {
|
||
reload.value = true;
|
||
page = {
|
||
...page,
|
||
page: pageNum.value,
|
||
keyword: keyword.value,
|
||
};
|
||
// 后端接口调用
|
||
await getSearch(page).then((res) => {
|
||
if (res.code === 200) {
|
||
if (res.data) {
|
||
reload.value = false;
|
||
if (!isInput.value) {
|
||
itemData.value = res.data.items;
|
||
} else {
|
||
itemData.value = itemData.value.concat(res.data.items);
|
||
}
|
||
|
||
pages.value = res.data.pages;
|
||
if (Number(res.data.pages) === pageNum.value) {
|
||
loadMore.value.status = "noMore";
|
||
}
|
||
} else {
|
||
itemData.value = [];
|
||
}
|
||
// 有搜索数据的时候隐藏最近查询标题和清除按钮
|
||
if (itemData.value.length > 0) {
|
||
isClear.value = true;
|
||
}
|
||
}
|
||
});
|
||
};
|
||
// 显示最近查找
|
||
const getRecent = async () => {
|
||
await getRecentSearch().then((res) => {
|
||
if (res.code === 200) {
|
||
itemDataRecent.value = res.data;
|
||
// 没数据的时候隐藏最近查询标题和清除按钮
|
||
if (itemDataRecent.value.length === 0) {
|
||
isClear.value = true;
|
||
}
|
||
}
|
||
});
|
||
};
|
||
// 搜索框搜索
|
||
const handleSearch = (val) => {
|
||
if (val.value.trim().length > 0) {
|
||
isInput.value = false;
|
||
keyword = val;
|
||
getList();
|
||
}
|
||
};
|
||
// input焦点
|
||
const handleBlur = () => {
|
||
isInput.value = true;
|
||
};
|
||
// 清除最近查找
|
||
const handleClear = () => {
|
||
popups.value.dialogOpen();
|
||
};
|
||
// 点击关闭按钮之后页面为显示最近查找页
|
||
const clearSearchData = () => {
|
||
itemData.value = []; //清空搜索列表
|
||
// 设置搜索的内容,从详情页返回搜索页的时候显示默认搜索的内容
|
||
isClear.value = false;
|
||
store.commit("user/setSearchText", "");
|
||
getRecent();
|
||
};
|
||
// 清空
|
||
const clearData = async (val) => {
|
||
isClear.value = val;
|
||
await clearRecentSearch().then(() => {
|
||
if (res.code === 200) {
|
||
uni.showToast({
|
||
title: "清除成功",
|
||
icon: "none",
|
||
});
|
||
}
|
||
});
|
||
};
|
||
// 标记为最近查找
|
||
const setRecent = async (id) => {
|
||
await setMarkRecent(id);
|
||
itemData.value = []; //清空搜索列表
|
||
};
|
||
// 取件详情页
|
||
const handleDetails = (e, item) => {
|
||
// 阻止事件冒泡
|
||
e.stopPropagation();
|
||
// 把任务id用vuex的方法存储,方便其他页面调用
|
||
store.commit("user/setTaskId", item.id);
|
||
// // 由于取件详情地址和派件详情地址样式一致,所以用类型 1取件,2派件区分开
|
||
// store.commit('user/setTaskType', 1);
|
||
// 设置是否由搜索页进的详情页,方便详情页返回
|
||
store.commit("user/setIsSearch", true);
|
||
// 设置搜索的内容,从详情页返回搜索页的时候显示默认搜索的内容
|
||
store.commit("user/setSearchText", search.value.searchVal);
|
||
|
||
// 如果有运单号标记为最近查询记录
|
||
if (item.transportOrderId) {
|
||
setRecent(item.transportOrderId);
|
||
}
|
||
// 取件
|
||
if (item.taskType === 1) {
|
||
// 待取件
|
||
if (item.status === 1) {
|
||
uni.redirectTo({
|
||
url: "/pages/details/index",
|
||
});
|
||
return false;
|
||
} else if (item.status === 2) {
|
||
// 如果是已取件
|
||
// 未付款的状态进入二维码付款页面
|
||
if (item.paymentStatus === 1 && item.paymentMethod === 1) {
|
||
store.commit("user/setDetailType", 2);
|
||
store.commit("user/setTaskStatus", 3);
|
||
store.commit("user/setPayData", {});
|
||
uni.redirectTo({
|
||
url: "/pages/pay/scanPay",
|
||
});
|
||
return false;
|
||
} else {
|
||
// 已取件
|
||
store.commit("user/setTaskStatus", 2);
|
||
}
|
||
} else {
|
||
// 取消的订单
|
||
store.commit("user/setTaskStatus", 3);
|
||
}
|
||
// 如果是已付款或者是到付,取消的订单,进入运单详情页
|
||
uni.redirectTo({
|
||
url: "/pages/details/waybill",
|
||
});
|
||
} else {
|
||
// 派件
|
||
// 待派件
|
||
if (item.status === 1) {
|
||
store.commit("user/setTaskStatus", 4);
|
||
} else if (item.status === 2) {
|
||
// 如果是已取件
|
||
// 未付款的状态进入二维码付款页面
|
||
if (item.paymentStatus === 1 && item.paymentMethod === 2) {
|
||
store.commit("user/setPayData", {});
|
||
uni.redirectTo({
|
||
url: "/pages/pay/scanPay",
|
||
});
|
||
return false;
|
||
} else {
|
||
store.commit("user/setTaskStatus", 5);
|
||
uni.redirectTo({
|
||
url: "/pages/details/waybill",
|
||
});
|
||
}
|
||
}
|
||
// 如果是去派件\已付款或者是寄付,进入运单详情页
|
||
uni.redirectTo({
|
||
url: "/pages/details/waybill",
|
||
});
|
||
}
|
||
};
|
||
// 根据最近查找的运单id搜索
|
||
const handleTransportOrderId = (val) => {
|
||
// 给搜索对象赋值
|
||
keyword.value = val;
|
||
// 把值赋给子组件的搜索框
|
||
search.value.searchVal = val;
|
||
getList();
|
||
};
|
||
// 回首页
|
||
const goBack = () => {
|
||
uni.redirectTo({
|
||
url: "/pages/index/index",
|
||
});
|
||
};
|
||
</script>
|
||
<style src="./../../styles/expressage.scss" lang="scss" scoped></style>
|
||
<style src="./index.scss" lang="scss" scoped></style>
|
||
<style lang="scss">
|
||
body {
|
||
background-color: #fff;
|
||
}
|
||
</style>
|