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.

263 lines
5.3 KiB

<template>
<view class="book-detail-container">
<!-- 加载状态 -->
<view v-if="loading" class="loading-container">
<view class="loading-text">加载中...</view>
</view>
<!-- 图书详情 -->
<view v-else-if="bookInfo" class="book-detail">
<!-- 图书基本信息 -->
<view class="book-header">
<view class="book-cover">
<u-image :src="bookInfo.image" width="240rpx" height="320rpx" border-radius="12"></u-image>
</view>
<view class="book-info">
<text class="book-title">{{ bookInfo.title || '暂无标题' }}</text>
<text class="book-author">作者{{ bookInfo.author || '暂无' }}</text>
<text class="book-publisher">出版社{{ bookInfo.publisher || '暂无' }}</text>
<text class="book-year">出版年份{{ bookInfo.year || '暂无' }}</text>
<text class="book-isbn">ISBN{{ bookInfo.isbn || '暂无' }}</text>
<view class="book-category">
<u-tag :text="bookInfo.category || '未分类'" type="primary" size="mini" shape="circle" mode="light" />
</view>
</view>
</view>
<!-- 图书描述 -->
<view class="book-description">
<view class="section-title">图书简介</view>
<text class="description-text">{{ bookInfo.description || '暂无简介' }}</text>
</view>
<!-- 图书状态 -->
<view class="book-status">
<view class="section-title">图书状态</view>
<view class="status-item">
<text class="status-label">状态</text>
<u-tag :text="getStatusText(bookInfo.status)" :type="getStatusType(bookInfo.status)" size="mini" />
</view>
</view>
</view>
<!-- 空状态 -->
<view v-else class="empty-container">
<view class="empty-text">图书信息不存在</view>
</view>
</view>
</template>
<script>
import uImage from '@/uview-ui/components/u-image/u-image.vue';
import uTag from '@/uview-ui/components/u-tag/u-tag.vue';
export default {
components: {
uImage,
uTag
},
data() {
return {
loading: false,
bookId: null,
bookInfo: null
}
},
onLoad(options) {
if (options.id) {
this.bookId = options.id;
this.loadBookDetail();
} else {
uni.showToast({
title: '图书ID不存在',
icon: 'none'
});
}
},
methods: {
// 加载图书详情
loadBookDetail() {
this.loading = true;
this.$u.api.bookDetail({
id: this.bookId
}).then(res => {
if (res) {
// 处理图书信息 - 接口直接返回图书对象
const book = res;
this.bookInfo = {
id: book.id,
title: book.title,
author: book.author,
publisher: book.publisher,
year: book.publish_year,
isbn: book.isbn,
category: book.category,
description: book.description,
status: book.status,
image: book.cover ? book.cover.url : ''
};
} else {
uni.showToast({
title: '图书信息不存在',
icon: 'none'
});
}
}).catch(err => {
console.error('获取图书详情失败:', err);
uni.showToast({
title: '网络错误,请重试',
icon: 'none'
});
}).finally(() => {
this.loading = false;
});
},
// 获取状态文本
getStatusText(status) {
const statusMap = {
0: '可借阅',
1: '已借出',
2: '维护中',
3: '已下架'
};
return statusMap[status] || '未知状态';
},
// 获取状态类型
getStatusType(status) {
const typeMap = {
0: 'success',
1: 'warning',
2: 'info',
3: 'error'
};
return typeMap[status] || 'info';
}
}
}
</script>
<style lang="scss" scoped>
.book-detail-container {
background-color: #f5f5f5;
min-height: 100vh;
padding: 20rpx;
}
.loading-container {
display: flex;
justify-content: center;
align-items: center;
min-height: 400rpx;
}
.loading-text {
font-size: 28rpx;
color: #999;
}
.empty-container {
display: flex;
justify-content: center;
align-items: center;
min-height: 400rpx;
}
.empty-text {
font-size: 28rpx;
color: #999;
}
.book-detail {
background-color: #fff;
border-radius: 20rpx;
padding: 30rpx;
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
}
.book-header {
display: flex;
margin-bottom: 40rpx;
}
.book-cover {
margin-right: 30rpx;
flex-shrink: 0;
}
.book-info {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.book-title {
font-size: 36rpx;
font-weight: bold;
color: #333;
margin-bottom: 20rpx;
line-height: 1.4;
}
.book-author,
.book-publisher,
.book-year,
.book-isbn {
font-size: 28rpx;
color: #666;
margin-bottom: 15rpx;
line-height: 1.5;
}
.book-category {
margin-top: 20rpx;
}
.book-description {
margin-bottom: 40rpx;
padding-bottom: 30rpx;
border-bottom: 1rpx solid #eee;
}
.section-title {
font-size: 32rpx;
font-weight: bold;
color: #333;
margin-bottom: 20rpx;
}
.description-text {
font-size: 28rpx;
color: #666;
line-height: 1.6;
text-align: justify;
}
.book-status {
.section-title {
margin-bottom: 20rpx;
}
}
.status-item {
display: flex;
align-items: center;
margin-bottom: 15rpx;
}
.status-label {
font-size: 28rpx;
color: #666;
margin-right: 20rpx;
min-width: 120rpx;
}
.status-value {
font-size: 28rpx;
color: #333;
}
</style>