186 lines
3.8 KiB
Vue
186 lines
3.8 KiB
Vue
<template>
|
||
<view class="message-detail-page">
|
||
<!-- 详情内容 -->
|
||
<view class="detail-content" v-loading="loading">
|
||
<view class="detail-header">
|
||
<text class="detail-title">{{ message.title }}</text>
|
||
|
||
<view class="detail-meta">
|
||
<view class="meta-item">
|
||
<uni-icons type="user" size="14" color="#666"></uni-icons>
|
||
<text>创建人:{{ message.createBy || '未知' }}</text>
|
||
</view>
|
||
<view class="meta-item">
|
||
<uni-icons type="time" size="14" color="#666"></uni-icons>
|
||
<text>创建时间:{{ formatTime(message.createTime) }}</text>
|
||
</view>
|
||
</view>
|
||
|
||
<view class="project-info" v-if="message.projectId">
|
||
<text class="label">项目信息:</text>
|
||
<text>{{ message.projectName }}</text>
|
||
<text v-if="message.projectCode"> ({{ message.projectCode }})</text>
|
||
</view>
|
||
</view>
|
||
|
||
<view class="detail-divider"></view>
|
||
|
||
<mp-html :content="message.content"></mp-html>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
import { getFeedback, listFeedback, toRead } from "@/api/oa/feedback";
|
||
|
||
export default {
|
||
data() {
|
||
return {
|
||
message: {},
|
||
feedbackId: '',
|
||
loading: false
|
||
};
|
||
},
|
||
onLoad(options) {
|
||
this.feedbackId = options.feedbackId;
|
||
this.getMessageDetail();
|
||
},
|
||
methods: {
|
||
// 获取消息详情
|
||
getMessageDetail() {
|
||
this.loading = true;
|
||
// 调用列表接口获取单条数据,实际项目中应该有专门的详情接口
|
||
getFeedback(this.feedbackId)
|
||
.then(res => {
|
||
if (res.data) {
|
||
this.message = res.data;
|
||
|
||
// 标记为已读
|
||
toRead(this.message);
|
||
} else {
|
||
uni.showToast({
|
||
title: '未找到消息',
|
||
icon: 'none'
|
||
});
|
||
}
|
||
})
|
||
.catch(err => {
|
||
uni.showToast({
|
||
title: err.message || '获取消息失败',
|
||
icon: 'none'
|
||
});
|
||
})
|
||
.finally(() => {
|
||
this.loading = false;
|
||
});
|
||
},
|
||
|
||
// 格式化时间
|
||
formatTime(time) {
|
||
if (!time) return '';
|
||
const date = new Date(time);
|
||
return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;
|
||
},
|
||
|
||
// 返回上一页
|
||
navigateBack() {
|
||
uni.navigateBack();
|
||
}
|
||
}
|
||
};
|
||
</script>
|
||
|
||
<style scoped>
|
||
.message-detail-page {
|
||
background-color: #f5f5f5;
|
||
min-height: 100vh;
|
||
}
|
||
|
||
.navbar {
|
||
display: flex;
|
||
align-items: center;
|
||
height: 44px;
|
||
padding: 0 15px;
|
||
background-color: #3e7bfa;
|
||
color: #fff;
|
||
}
|
||
|
||
.back-btn {
|
||
background-color: transparent;
|
||
border: none;
|
||
color: #fff;
|
||
padding: 5px 10px;
|
||
}
|
||
|
||
.title {
|
||
font-size: 18px;
|
||
font-weight: bold;
|
||
flex: 1;
|
||
text-align: center;
|
||
}
|
||
|
||
.detail-content {
|
||
padding: 15px;
|
||
background-color: #fff;
|
||
margin: 10px;
|
||
border-radius: 8px;
|
||
}
|
||
|
||
.detail-header {
|
||
margin-bottom: 20px;
|
||
}
|
||
|
||
.detail-title {
|
||
font-size: 18px;
|
||
font-weight: bold;
|
||
margin-bottom: 15px;
|
||
display: block;
|
||
color: #333;
|
||
}
|
||
|
||
.detail-meta {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 8px;
|
||
margin-bottom: 15px;
|
||
color: #666;
|
||
font-size: 14px;
|
||
}
|
||
|
||
.meta-item {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 5px;
|
||
}
|
||
|
||
.project-info {
|
||
padding: 10px;
|
||
background-color: #f5f7fa;
|
||
border-radius: 4px;
|
||
font-size: 14px;
|
||
color: #333;
|
||
}
|
||
|
||
.label {
|
||
color: #666;
|
||
font-weight: 500;
|
||
}
|
||
|
||
.detail-divider {
|
||
height: 1px;
|
||
background-color: #eee;
|
||
margin: 15px 0;
|
||
}
|
||
|
||
.detail-body {
|
||
color: #333;
|
||
line-height: 1.8;
|
||
font-size: 15px;
|
||
padding: 10px 0;
|
||
}
|
||
|
||
image {
|
||
max-width: 100vw;
|
||
object-fit: contain;
|
||
}
|
||
</style> |