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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<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>