sl-express/project-wl-kuaidiyuan-uniap.../pages/search/index.vue

396 lines
11 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- 首页搜索页 -->
<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>