256 lines
8.1 KiB
Plaintext
256 lines
8.1 KiB
Plaintext
<template>
|
||
<view class="pages">
|
||
<!-- #ifndef H5 -->
|
||
<statusBar></statusBar>
|
||
<!-- #endif -->
|
||
|
||
<!-- 搜索功能 -->
|
||
<view class="uni-search-box">
|
||
<uni-search-bar v-model="keyword" ref="searchBar" radius="100" cancelButton="none" disabled
|
||
:placeholder="inputPlaceholder" />
|
||
<view class="cover-search-bar" @click="searchClick"></view>
|
||
</view>
|
||
|
||
<unicloud-db ref='udb' v-slot:default="{data,pagination,hasMore, loading, error, options}" @error="onqueryerror"
|
||
:collection="colList" :page-size="10">
|
||
<!-- 基于 uni-list 的页面布局 field="user_id.nickname"-->
|
||
<uni-list class="uni-list" :border="false" :style="{height:listHight}">
|
||
|
||
<!-- 作用于app端nvue页面的下拉加载 -->
|
||
<!-- #ifdef APP-NVUE -->
|
||
<refreshBox @refresh="refresh" :loading="loading"></refreshBox>
|
||
<!-- #endif -->
|
||
|
||
<!-- 列表渲染 -->
|
||
<uni-list-item :to="'./detail?id='+item._id+'&title='+item.title" v-for="(item,index) in data"
|
||
:key="index">
|
||
<!-- 通过header插槽定义列表左侧图片 -->
|
||
<template v-slot:header>
|
||
<image class="avatar" :src="item.avatar" mode="aspectFill"></image>
|
||
</template>
|
||
<!-- 通过body插槽定义布局 -->
|
||
<template v-slot:body>
|
||
<view class="main">
|
||
<text class="title">{{item.title}}</text>
|
||
<view class="info">
|
||
<text class="author">{{item.user_id[0]?item.user_id[0].nickname:''}}</text>
|
||
<uni-dateformat class="last_modify_date" :date="item.last_modify_date"
|
||
format="yyyy-MM-dd" :threshold="[60000, 2592000000]" />
|
||
</view>
|
||
</view>
|
||
</template>
|
||
</uni-list-item>
|
||
<!-- 加载状态:上拉加载更多,加载中,没有更多数据了,加载错误 -->
|
||
<!-- #ifdef APP-PLUS -->
|
||
<uni-list-item>
|
||
<template v-slot:body>
|
||
<!-- #endif -->
|
||
<uni-load-state @networkResume="refresh" :state="{data,pagination,hasMore, loading, error}"
|
||
@loadMore="loadMore">
|
||
</uni-load-state>
|
||
<!-- #ifdef APP-PLUS -->
|
||
</template>
|
||
</uni-list-item>
|
||
<!-- #endif -->
|
||
</uni-list>
|
||
</unicloud-db>
|
||
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
let cdbRef;
|
||
import statusBar from "@/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar";
|
||
|
||
import Gps from '@/uni_modules/json-gps/js_sdk/gps.js';
|
||
const gps = new Gps();
|
||
|
||
const db = uniCloud.database();
|
||
const articleDBName = 'opendb-news-articles';
|
||
const userDBName = 'uni-id-users';
|
||
|
||
export default {
|
||
components: {
|
||
statusBar,
|
||
},
|
||
computed: {
|
||
// 根据当前语言返回不同的搜索框占位符
|
||
inputPlaceholder(e) {
|
||
if (uni.getStorageSync('CURRENT_LANG') == "en") {
|
||
return 'Please enter the search content'
|
||
} else {
|
||
return '请输入搜索内容'
|
||
}
|
||
},
|
||
// 连表查询,返回两个集合的查询结果
|
||
colList() {
|
||
return [
|
||
db.collection(articleDBName).where(this.where).field('thumbnail,title,publish_date,user_id')
|
||
.getTemp(), // 文章集合
|
||
db.collection(userDBName).field('_id,nickname').getTemp() // 用户集合
|
||
]
|
||
}
|
||
},
|
||
data() {
|
||
return {
|
||
where: '"article_status" == 1',
|
||
keyword: "",
|
||
showRefresh: false,
|
||
listHight: 0
|
||
}
|
||
},
|
||
watch: {
|
||
keyword(keyword, oldValue) {
|
||
let where = '"article_status" == 1 '
|
||
if (keyword) {
|
||
this.where = where + `&& /${keyword}/.test(title)`;
|
||
} else {
|
||
this.where = where;
|
||
}
|
||
}
|
||
},
|
||
async onReady() {
|
||
// #ifdef APP-NVUE
|
||
/* 可用窗口高度 - 搜索框高 - 状态栏高 */
|
||
this.listHight = uni.getSystemInfoSync().windowHeight - uni.getSystemInfoSync().statusBarHeight - 50 +
|
||
'px';
|
||
// #endif
|
||
// #ifndef APP-NVUE
|
||
this.listHight = 'auto'
|
||
// #endif
|
||
cdbRef = this.$refs.udb
|
||
},
|
||
async onShow() {
|
||
this.keyword = getApp().globalData.searchText
|
||
getApp().globalData.searchText = ''
|
||
//这里仅演示如何,在onShow生命周期获取设备位置,并在设备或者应用没有权限时自动引导。设置完毕自动重新获取。
|
||
//你可以基于他做自己的业务,比如:根据距离由近到远排序列表数据等
|
||
// uni.showLoading({
|
||
// title:"获取定位中"
|
||
// });
|
||
//默认h5端不获取定位
|
||
// #ifndef H5
|
||
let location = await gps.getLocation({
|
||
geocode: true
|
||
})
|
||
// console.log(location);
|
||
// #endif
|
||
// if(location){
|
||
// uni.showToast({
|
||
// title: JSON.stringify(location),
|
||
// icon: 'none'
|
||
// });
|
||
// }
|
||
// uni.hideLoading()
|
||
},
|
||
methods: {
|
||
searchClick(e) { //点击搜索框
|
||
uni.hideKeyboard();
|
||
uni.navigateTo({
|
||
url: './search/search',
|
||
animationType: 'fade-in'
|
||
});
|
||
},
|
||
retry() {
|
||
this.refresh()
|
||
},
|
||
refresh() {
|
||
cdbRef.loadData({
|
||
clear: true
|
||
}, () => {
|
||
uni.stopPullDownRefresh()
|
||
// #ifdef APP-NVUE
|
||
this.showRefresh = false
|
||
// #endif
|
||
console.log('end');
|
||
})
|
||
console.log('refresh');
|
||
},
|
||
loadMore() {
|
||
cdbRef.loadMore()
|
||
},
|
||
onqueryerror(e) {
|
||
console.error(e);
|
||
},
|
||
onpullingdown(e) {
|
||
console.log(e);
|
||
this.showRefresh = true
|
||
if (e.pullingDistance > 100) {
|
||
this.refresh()
|
||
}
|
||
}
|
||
},
|
||
// #ifndef APP-NVUE
|
||
onPullDownRefresh() {
|
||
this.refresh()
|
||
},
|
||
onReachBottom() {
|
||
this.loadMore()
|
||
}
|
||
// #endif
|
||
}
|
||
</script>
|
||
|
||
<style scoped>
|
||
/* #ifndef APP-NVUE */
|
||
view {
|
||
display: flex;
|
||
box-sizing: border-box;
|
||
flex-direction: column;
|
||
}
|
||
|
||
/* #endif */
|
||
.pages {
|
||
background-color: #FFFFFF;
|
||
}
|
||
|
||
.avatar {
|
||
width: 200rpx;
|
||
height: 200rpx;
|
||
margin-right: 10rpx;
|
||
}
|
||
|
||
.main {
|
||
justify-content: space-between;
|
||
flex: 1;
|
||
}
|
||
|
||
.title {
|
||
font-size: 16px;
|
||
}
|
||
|
||
.info {
|
||
flex-direction: row;
|
||
justify-content: space-between;
|
||
}
|
||
|
||
.author,
|
||
.last_modify_date {
|
||
font-size: 14px;
|
||
color: #999999;
|
||
}
|
||
|
||
.uni-search-box {
|
||
background-color: #FFFFFF;
|
||
position: sticky;
|
||
height: 50px;
|
||
top: 0;
|
||
left: 0;
|
||
/* #ifndef APP-PLUS */
|
||
z-index: 9;
|
||
/* #endif */
|
||
/* #ifdef MP-WEIXIN */
|
||
width: 580rpx;
|
||
/* #endif */
|
||
}
|
||
|
||
.cover-search-bar {
|
||
height: 50px;
|
||
position: relative;
|
||
top: -50px;
|
||
margin-bottom: -50px;
|
||
/* #ifndef APP-NVUE */
|
||
z-index: 999;
|
||
/* #endif */
|
||
}
|
||
</style> |