图书馆小程序
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.
 
 
 
 
 

245 lines
5.9 KiB

<template>
<view class="item-container">
<!-- 图书数量 + 右侧设置按钮 -->
<view class="count-text">
<text>图书数量 ({{ bookList.length }})</text>
<text class="edit-btn" @click="toggleEdit">{{ editMode ? "完成" : "管理" }}</text>
</view>
<checkbox-group @change="checkboxChange">
<view class="car-list" v-for="item in bookList" :key="item.isbn">
<checkbox :value="item.isbn" :checked="item.checked" />
<view class="book-item-box">
<view class="item-box-left">
<image class="img-item" :src="item.imgCover" mode="aspectFill" />
</view>
<view class="item-box-right">
<view class="item-title line-clamp-2">{{ item.title || '暂无标题' }}</view>
<view class="tag-box">
<text class="item-author">{{ item.nickname || '佚名' }}</text>
<text class="item-publish">{{ item.publish || '暂无出版社' }}</text>
</view>
<view class="item-desc line-clamp-2">{{ item.desc || '暂无简介' }}</view>
</view>
</view>
</view>
</checkbox-group>
<view class="bottom-placeholder"></view>
<view class="car-bottom">
<!-- 全选 -->
<view class="all-check" @click="handleAllCheck">
<checkbox :checked="isAllChecked" />
<text style="margin-left:6px">全选</text>
</view>
<!-- 根据编辑状态切换按钮续借 / 删除 -->
<button
class="join-btn"
@click="editMode ? handleDelete() : handleRenew()"
:disabled="!hasChecked"
>
{{ editMode ? "删除选中" : "一键续借" }}
</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
editMode: false, // 控制编辑/删除状态
bookList: [
{
imgCover: "https://qiniu.aiyxlib.com/1606124577077",
title: "名侦探柯南",
nickname: "青山刚昌",
publish: "长春出版社",
isbn: "1001",
desc: "测试图书简介",
checked: true,
},
{
imgCover: "https://qiniu.aiyxlib.com/1606124577077",
title: "测试图书",
nickname: "测试作者",
publish: "测试出版社",
isbn: "1002",
desc: "测试简介",
checked: true,
},
{
imgCover: "https://qiniu.aiyxlib.com/1606124577077",
title: "测试图书",
nickname: "测试作者",
publish: "测试出版社",
isbn: "1003",
desc: "测试简介",
checked: false,
}
],
};
},
computed: {
// 是否全选
isAllChecked() {
return this.bookList.every((item) => item.checked);
},
// 是否有选中
hasChecked() {
return this.bookList.some((item) => item.checked);
},
},
methods: {
// 切换编辑模式
toggleEdit() {
this.editMode = !this.editMode;
// 退出编辑时可以取消所有选中(可选)
if (!this.editMode) {
this.bookList.forEach(item => item.checked = false);
}
},
checkboxChange(e) {
console.log("checkbox选中value:", e.detail.value);
const values = e.detail.value;
const items = this.bookList;
for (let i = 0, lenI = items.length; i < lenI; ++i) {
items[i].checked = false;
for (let j = 0, lenJ = values.length; j < lenJ; ++j) {
if (items[i].isbn === values[j]) {
items[i].checked = true;
break;
}
}
}
this.bookList = items;
},
handleAllCheck() {
const isAll = this.isAllChecked;
this.bookList.forEach((item) => {
item.checked = !isAll;
});
},
// 一键续借
handleRenew() {
const checkedBooks = this.bookList.filter((item) => item.checked);
uni.showToast({
title: `已续借 ${checkedBooks.length}`,
icon: "success",
});
},
// 删除选中图书
handleDelete() {
const beforeLen = this.bookList.length;
// 过滤掉选中的项
this.bookList = this.bookList.filter(item => !item.checked);
const deleteCount = beforeLen - this.bookList.length;
uni.showToast({
title: `已删除 ${deleteCount}`,
icon: "success"
});
},
},
};
</script>
<style lang="scss" scoped>
.item-container {
padding: 10px;
background: #f5f6f7;
min-height: 100vh;
}
.count-text {
margin-bottom: 10px;
display: flex;
justify-content: space-between; /* 数量左,设置右 */
align-items: center;
}
.edit-btn {
color: #01a4fe;
font-size: 14px;
}
.car-list {
display: flex;
align-items: flex-start;
margin-bottom: 10px;
checkbox {
margin-top: 15px;
padding: 0 10px;
}
}
.book-item-box {
flex: 1;
background: #fff;
border-radius: 8px;
padding: 12px;
display: flex;
.item-box-left {
margin-right: 12px;
.img-item {
width: 64px;
height: 90px;
border-radius: 6px;
}
}
.item-box-right {
flex: 1;
}
.item-title {
font-weight: bold;
margin-bottom: 4px;
}
.item-author,
.item-publish {
font-size: 12px;
background: #f4f6fc;
padding: 2px 6px;
border-radius: 4px;
margin-right: 6px;
}
.item-desc {
font-size: 12px;
color: #999;
margin-top: 6px;
}
}
.bottom-placeholder {
height: 60px;
}
.car-bottom {
position: fixed;
left: 0;
bottom: 0;
right: 0;
background: #fff;
padding: 12px 15px;
display: flex;
justify-content: space-between;
align-items: center;
box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.05);
}
.all-check {
display: flex;
align-items: center;
}
.join-btn {
font-size: 14px;
color: #fff;
margin: 0 !important;
background-color: #01a4fe !important;
border-radius: 23px;
padding: 0 30px;
&::after{
border: none !important;
}
&[disabled] {
background: #ccc !important;
}
}
</style>