瑶都万能墙
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

224 lines
4.1 KiB

<template>
<view class="page">
<navbar title="文章详情" />
<view class="content">
<!-- 加载状态 -->
<view class="loading-container" v-if="loading">
<text class="loading-text">加载中...</text>
</view>
<!-- 文章详情 -->
<view class="article-detail" v-if="!loading && articleDetail">
<!-- 创建时间 -->
<view class="article-meta">
<text class="create-time">{{ formatTime(articleDetail.createTime) }}</text>
</view>
<!-- 富文本内容 -->
<view class="article-content">
<rich-text :nodes="articleDetail.content"></rich-text>
</view>
</view>
<!-- 错误状态 -->
<view class="error-container" v-if="!loading && !articleDetail">
<text class="error-text">文章不存在或已被删除</text>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
articleId: '',
articleDetail: null,
loading: false
}
},
onLoad(options) {
if (options.id) {
this.articleId = options.id;
this.loadArticleDetail();
}
},
onShareAppMessage(res) {
return {
title: this.articleDetail ? this.articleDetail.title || '文章详情' : '文章详情',
imageUrl: this.articleDetail ? this.articleDetail.image : '',
path: '/pages_order/article/index?id=' + this.articleId
}
},
methods: {
// 加载文章详情
loadArticleDetail() {
if (!this.articleId) return;
this.loading = true;
const params = {
id: this.articleId
};
this.$api('articleDetail', params, (res) => {
this.loading = false;
if (res.code === 200 && res.result) {
this.articleDetail = res.result;
} else {
uni.showToast({
title: res.message || '加载失败',
icon: 'none'
});
}
});
},
// 格式化时间
formatTime(time) {
if (!time) return '';
const date = new Date(time);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}`;
}
}
}
</script>
<style scoped lang="scss">
.page {
background-color: #f5f5f5;
min-height: 100vh;
}
.content {
padding: 20rpx;
}
.loading-container {
display: flex;
justify-content: center;
align-items: center;
padding: 200rpx 0;
.loading-text {
font-size: 28rpx;
color: #999;
}
}
.error-container {
display: flex;
justify-content: center;
align-items: center;
padding: 200rpx 0;
.error-text {
font-size: 28rpx;
color: #999;
}
}
.article-detail {
background-color: #fff;
border-radius: 16rpx;
padding: 30rpx;
margin-bottom: 20rpx;
}
.article-meta {
padding-bottom: 20rpx;
border-bottom: 1px solid #f0f0f0;
margin-bottom: 30rpx;
.create-time {
font-size: 24rpx;
color: #999;
}
}
.article-content {
line-height: 1.6;
// 富文本内容样式
:deep(rich-text) {
font-size: 30rpx;
color: #333;
// 图片样式
img {
max-width: 100%;
height: auto;
border-radius: 8rpx;
margin: 20rpx 0;
}
// 段落样式
p {
margin: 20rpx 0;
line-height: 1.8;
}
// 标题样式
h1, h2, h3, h4, h5, h6 {
margin: 30rpx 0 20rpx 0;
font-weight: bold;
}
h1 { font-size: 36rpx; }
h2 { font-size: 34rpx; }
h3 { font-size: 32rpx; }
// 列表样式
ul, ol {
padding-left: 40rpx;
margin: 20rpx 0;
}
li {
margin: 10rpx 0;
line-height: 1.6;
}
// 引用样式
blockquote {
border-left: 4rpx solid #ddd;
padding-left: 20rpx;
margin: 20rpx 0;
color: #666;
font-style: italic;
}
// 代码样式
code {
background-color: #f5f5f5;
padding: 4rpx 8rpx;
border-radius: 4rpx;
font-family: monospace;
font-size: 26rpx;
}
pre {
background-color: #f5f5f5;
padding: 20rpx;
border-radius: 8rpx;
overflow-x: auto;
margin: 20rpx 0;
code {
background: none;
padding: 0;
}
}
}
}
</style>