374 lines
9.1 KiB
Vue
374 lines
9.1 KiB
Vue
|
<template>
|
|||
|
<!--
|
|||
|
本页面模板教程:https://ext.dcloud.net.cn/plugin?id=2717
|
|||
|
uni-list 文档:https://ext.dcloud.net.cn/plugin?id=24
|
|||
|
uniCloud 文档:https://uniapp.dcloud.io/uniCloud/README
|
|||
|
unicloud-db 组件文档:https://uniapp.dcloud.net.cn/uniCloud/unicloud-db-component
|
|||
|
DB Schema 规范:https://uniapp.dcloud.net.cn/uniCloud/schema
|
|||
|
-->
|
|||
|
<view class="article">
|
|||
|
<!-- #ifdef APP-PLUS -->
|
|||
|
<uni-nav-bar :statusBar="true" :border="false"></uni-nav-bar>
|
|||
|
<!-- #endif -->
|
|||
|
<view class="article-title">{{ title }}</view>
|
|||
|
<unicloud-db v-slot:default="{data, loading, error, options}" :options="formData" collection="opendb-news-articles,uni-id-users"
|
|||
|
:field="field" :getone="true" :where="where" :manual="true" ref="detail"
|
|||
|
foreignKey="opendb-news-articles.user_id" @load="loadData">
|
|||
|
<template v-if="!loading && data">
|
|||
|
<uni-list :border="false">
|
|||
|
<uni-list-item thumbSize="lg" :thumb="data.image">
|
|||
|
<!-- 通过body插槽定义作者信息内容 -->
|
|||
|
<template v-slot:body>
|
|||
|
<view class="header-content">
|
|||
|
<view class="uni-title">{{data.user_id && data.user_id[0] && data.user_id[0].nickname || '未知'}}</view>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
<template v-slot:footer>
|
|||
|
<view class="footer">
|
|||
|
<view class="uni-note">更新于
|
|||
|
<uni-dateformat :date="data.last_modify_date" format="yyyy-MM-dd hh:mm"
|
|||
|
:threshold="[60000, 2592000000]" />
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
</uni-list-item>
|
|||
|
</uni-list>
|
|||
|
<view class="banner">
|
|||
|
<!-- 文章开头,缩略图 -->
|
|||
|
<image class="banner-img" :src="data.avatar" mode="widthFix"></image>
|
|||
|
<!-- 文章摘要 -->
|
|||
|
<view class="banner-title">
|
|||
|
<text class="uni-ellipsis">{{data.excerpt}}</text>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="article-content">
|
|||
|
<rich-text :nodes="data.content"></rich-text>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
</unicloud-db>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
// #ifdef APP
|
|||
|
import UniShare from '@/uni_modules/uni-share/js_sdk/uni-share.js';
|
|||
|
import uniNavBar from '@/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue';
|
|||
|
const uniShare = new UniShare()
|
|||
|
// #endif
|
|||
|
const db = uniCloud.database();
|
|||
|
const readNewsLog = db.collection('read-news-log')
|
|||
|
export default {
|
|||
|
// #ifdef APP
|
|||
|
components:{
|
|||
|
"uni-nav-bar":uniNavBar
|
|||
|
},
|
|||
|
onBackPress({from}) {
|
|||
|
if(from == 'backbutton'){
|
|||
|
if(uniShare.isShow){
|
|||
|
this.$nextTick(function(){
|
|||
|
console.log(uniShare);
|
|||
|
uniShare.hide()
|
|||
|
})
|
|||
|
}
|
|||
|
return uniShare.isShow;
|
|||
|
}
|
|||
|
},
|
|||
|
// #endif
|
|||
|
data() {
|
|||
|
return {
|
|||
|
// 当前显示 _id
|
|||
|
id: "",
|
|||
|
title: 'title',
|
|||
|
// 数据表名
|
|||
|
// 查询字段,多个字段用 , 分割
|
|||
|
field: 'user_id.nickname,user_id._id,avatar,excerpt,last_modify_date,comment_count,like_count,title,content',
|
|||
|
formData: {
|
|||
|
noData: '<p style="text-align:center;color:#666">详情加载中...</p>'
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
computed: {
|
|||
|
uniStarterConfig() {
|
|||
|
return getApp().globalData.config
|
|||
|
},
|
|||
|
where(){
|
|||
|
//拼接where条件 查询条件 ,更多详见 :https://uniapp.dcloud.net.cn/uniCloud/unicloud-db?id=jsquery
|
|||
|
return `_id =="${this.id}"`
|
|||
|
}
|
|||
|
},
|
|||
|
onLoad(event) {
|
|||
|
//获取真实新闻id,通常 id 来自上一个页面
|
|||
|
if (event.id) {
|
|||
|
this.id = event.id
|
|||
|
}
|
|||
|
//若上一页传递了标题过来,则设置导航栏标题
|
|||
|
if (event.title) {
|
|||
|
this.title = event.title
|
|||
|
uni.setNavigationBarTitle({
|
|||
|
title: event.title
|
|||
|
})
|
|||
|
}
|
|||
|
},
|
|||
|
onReady() {
|
|||
|
// 开始加载数据,修改 where 条件后才开始去加载 clinetDB 的数据 ,需要等组件渲染完毕后才开始执行 loadData,所以不能再 onLoad 中执行
|
|||
|
if (this.id) { // ID 不为空,则发起查询
|
|||
|
this.$refs.detail.loadData()
|
|||
|
} else {
|
|||
|
uni.showToast({
|
|||
|
icon: 'none',
|
|||
|
title: this.$t('listDetail.newsErr')
|
|||
|
})
|
|||
|
}
|
|||
|
},
|
|||
|
onNavigationBarButtonTap(event) {
|
|||
|
if (event.type == 'share') {
|
|||
|
this.shareClick();
|
|||
|
}
|
|||
|
},
|
|||
|
methods: {
|
|||
|
$log(...args){
|
|||
|
console.log('args',...args,this.id)
|
|||
|
},
|
|||
|
setReadNewsLog(){
|
|||
|
let item = {
|
|||
|
"article_id":this.id,
|
|||
|
"last_time":Date.now()
|
|||
|
},
|
|||
|
readNewsLog = uni.getStorageSync('readNewsLog')||[],
|
|||
|
index = -1;
|
|||
|
readNewsLog.forEach(({article_id},i)=>{
|
|||
|
if(article_id == item.article_id){
|
|||
|
index = i
|
|||
|
}
|
|||
|
})
|
|||
|
if(index === -1){
|
|||
|
readNewsLog.push(item)
|
|||
|
}else{
|
|||
|
readNewsLog.splice(index,1,item)
|
|||
|
}
|
|||
|
uni.setStorageSync('readNewsLog',readNewsLog)
|
|||
|
console.log(readNewsLog);
|
|||
|
},
|
|||
|
setFavorite() {
|
|||
|
if ( uniCloud.getCurrentUserInfo().tokenExpired < Date.now() ){
|
|||
|
return console.log('未登录用户');
|
|||
|
}
|
|||
|
let article_id = this.id,
|
|||
|
last_time = Date.now();
|
|||
|
console.log({article_id,last_time});
|
|||
|
readNewsLog.where(`"article_id" == "${article_id}" && "user_id"==$env.uid`)
|
|||
|
.update({last_time})
|
|||
|
.then(({result:{updated}}) => {
|
|||
|
console.log('updated',updated);
|
|||
|
if (!updated) {
|
|||
|
readNewsLog.add({article_id}).then(e=>{
|
|||
|
console.log(e);
|
|||
|
}).catch(err => {
|
|||
|
console.log(err);
|
|||
|
})
|
|||
|
}
|
|||
|
}).catch(err => {
|
|||
|
console.log(err);
|
|||
|
})
|
|||
|
},
|
|||
|
loadData(data) {
|
|||
|
//如果上一页未传递标题过来(如搜索直达详情),则从新闻详情中读取标题
|
|||
|
if (this.title == '' && data[0].title) {
|
|||
|
this.title = data[0].title
|
|||
|
uni.setNavigationBarTitle({
|
|||
|
title: data[0].title
|
|||
|
});
|
|||
|
|
|||
|
}
|
|||
|
this.setReadNewsLog();
|
|||
|
},
|
|||
|
/**
|
|||
|
* followClick
|
|||
|
* 点击关注
|
|||
|
*/
|
|||
|
followClick() {
|
|||
|
uni.showToast({
|
|||
|
title:this.$t('listDetail.follow'),
|
|||
|
icon: 'none'
|
|||
|
});
|
|||
|
},
|
|||
|
/**
|
|||
|
* 分享该文章
|
|||
|
*/
|
|||
|
// #ifdef APP
|
|||
|
shareClick() {
|
|||
|
let {
|
|||
|
_id,
|
|||
|
title,
|
|||
|
excerpt,
|
|||
|
avatar
|
|||
|
} = this.$refs.detail.dataList
|
|||
|
console.log( JSON.stringify({
|
|||
|
_id,
|
|||
|
title,
|
|||
|
excerpt,
|
|||
|
avatar
|
|||
|
}) );
|
|||
|
uniShare.show({
|
|||
|
content: { //公共的分享类型(type)、链接(herf)、标题(title)、summary(描述)、imageUrl(缩略图)
|
|||
|
type: 0,
|
|||
|
href: this.uniStarterConfig.h5.url + `/#/pages/list/detail?id=${_id}&title=${title}`,
|
|||
|
title: this.title,
|
|||
|
summary: excerpt,
|
|||
|
imageUrl: avatar + '?x-oss-process=image/resize,m_fill,h_100,w_100' //压缩图片解决,在ios端分享图过大导致的图片失效问题
|
|||
|
},
|
|||
|
menus: [{
|
|||
|
"img": "/static/app-plus/sharemenu/wechatfriend.png",
|
|||
|
"text": this.$t('common.wechatFriends'),
|
|||
|
"share": {
|
|||
|
"provider": "weixin",
|
|||
|
"scene": "WXSceneSession"
|
|||
|
}
|
|||
|
},
|
|||
|
{
|
|||
|
"img": "/static/app-plus/sharemenu/wechatmoments.png",
|
|||
|
"text": this.$t('common.wechatBbs'),
|
|||
|
"share": {
|
|||
|
"provider": "weixin",
|
|||
|
"scene": "WXSceneTimeline"
|
|||
|
}
|
|||
|
},
|
|||
|
{
|
|||
|
"img": "/static/app-plus/sharemenu/mp_weixin.png",
|
|||
|
"text": this.$t('common.wechatApplet'),
|
|||
|
"share": {
|
|||
|
provider: "weixin",
|
|||
|
scene: "WXSceneSession",
|
|||
|
type: 5,
|
|||
|
miniProgram: {
|
|||
|
id: this.uniStarterConfig.mp.weixin.id,
|
|||
|
path: `/pages/list/detail?id=${_id}&title=${title}`,
|
|||
|
webUrl: this.uniStarterConfig.h5.url +
|
|||
|
`/#/pages/list/detail?id=${_id}&title=${title}`,
|
|||
|
type: 0
|
|||
|
},
|
|||
|
}
|
|||
|
},
|
|||
|
{
|
|||
|
"img": "/static/app-plus/sharemenu/weibo.png",
|
|||
|
"text": this.$t('common.weibo'),
|
|||
|
"share": {
|
|||
|
"provider": "sinaweibo"
|
|||
|
}
|
|||
|
},
|
|||
|
{
|
|||
|
"img": "/static/app-plus/sharemenu/qq.png",
|
|||
|
"text": "QQ",
|
|||
|
"share": {
|
|||
|
"provider": "qq"
|
|||
|
}
|
|||
|
},
|
|||
|
{
|
|||
|
"img": "/static/app-plus/sharemenu/copyurl.png",
|
|||
|
"text": this.$t('common.copy'),
|
|||
|
"share": "copyurl"
|
|||
|
},
|
|||
|
{
|
|||
|
"img": "/static/app-plus/sharemenu/more.png",
|
|||
|
"text": this.$t('common.more'),
|
|||
|
"share": "shareSystem"
|
|||
|
}
|
|||
|
],
|
|||
|
cancelText: this.$t('common.cancelShare'),
|
|||
|
}, e => { //callback
|
|||
|
console.log(e);
|
|||
|
})
|
|||
|
}
|
|||
|
// #endif
|
|||
|
}
|
|||
|
}
|
|||
|
</script>
|
|||
|
|
|||
|
<style scoped>
|
|||
|
.header-content {
|
|||
|
flex: 1;
|
|||
|
display: flex;
|
|||
|
flex-direction: column;
|
|||
|
font-size: 14px;
|
|||
|
}
|
|||
|
|
|||
|
/* 标题 */
|
|||
|
.uni-title {
|
|||
|
display: flex;
|
|||
|
margin-bottom: 5px;
|
|||
|
font-size: 14px;
|
|||
|
font-weight: bold;
|
|||
|
color: #3b4144;
|
|||
|
}
|
|||
|
|
|||
|
/* 描述 额外文本 */
|
|||
|
.uni-note {
|
|||
|
color: #999;
|
|||
|
font-size: 12px;
|
|||
|
|
|||
|
/* #ifndef APP-NVUE */
|
|||
|
display: flex;
|
|||
|
/* #endif */
|
|||
|
flex-direction: row;
|
|||
|
align-items: center;
|
|||
|
}
|
|||
|
|
|||
|
.footer {
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
}
|
|||
|
|
|||
|
.footer-button {
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
font-size: 12px;
|
|||
|
height: 30px;
|
|||
|
color: #fff;
|
|||
|
background-color: #ff5a5f;
|
|||
|
}
|
|||
|
|
|||
|
.banner {
|
|||
|
position: relative;
|
|||
|
margin: 0 15px;
|
|||
|
height: 180px;
|
|||
|
overflow: hidden;
|
|||
|
}
|
|||
|
|
|||
|
.banner-img {
|
|||
|
position: absolute;
|
|||
|
width: 100%;
|
|||
|
}
|
|||
|
|
|||
|
.banner-title {
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
position: absolute;
|
|||
|
padding: 0 15px;
|
|||
|
width: 100%;
|
|||
|
bottom: 0;
|
|||
|
height: 30px;
|
|||
|
font-size: 14px;
|
|||
|
color: #fff;
|
|||
|
background: rgba(0, 0, 0, 0.4);
|
|||
|
overflow: hidden;
|
|||
|
box-sizing: border-box;
|
|||
|
}
|
|||
|
|
|||
|
.uni-ellipsis {
|
|||
|
overflow: hidden;
|
|||
|
white-space: nowrap;
|
|||
|
text-overflow: ellipsis;
|
|||
|
}
|
|||
|
|
|||
|
.article-title {
|
|||
|
padding: 20px 15px;
|
|||
|
padding-bottom: 0;
|
|||
|
}
|
|||
|
|
|||
|
.article-content {
|
|||
|
padding: 15px;
|
|||
|
font-size: 15px;
|
|||
|
overflow: hidden;
|
|||
|
}
|
|||
|
</style>
|