index.vue
10.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
<!-- 首页搜索页 -->
<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>