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.

351 lines
7.9 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="container">
<!-- 生成记录列表 -->
<view class="record-list">
<view class="record-item" v-for="record in records" :key="record.id">
<!-- 记录信息 -->
<view class="record-info">
<view class="record-title">{{ record.title }}</view>
<view class="record-time">生成时间: {{ record.generateTime }}</view>
</view>
<!-- 状态标签 -->
<view class="status-tag" :class="record.status">
{{ record.statusText }}
</view>
<!-- 操作按钮 -->
<view class="record-actions">
<u-button
v-if="record.status === 'completed'"
type="primary"
size="small"
@click="downloadRecord(record)"
>
<u-icon
name="download"
size="14"
color="white"
style="margin-right: 4px"
></u-icon>
下载
</u-button>
<u-button v-else type="info" size="small" disabled>
<u-icon
name="download"
size="14"
color="white"
style="margin-right: 4px"
></u-icon>
下载
</u-button>
<u-button
v-if="record.status === 'failed'"
type="error"
size="small"
@click="deleteRecord(record)"
style="margin-left: 8px"
>
<u-icon
name="trash"
size="14"
color="white"
style="margin-right: 4px"
></u-icon>
删除
</u-button>
</view>
</view>
</view>
<!-- 空状态 -->
<view v-if="records.length === 0" class="empty-state">
<u-icon name="file-text" size="60" color="#ccc"></u-icon>
<text class="empty-text">暂无生成记录</text>
</view>
<!-- 加载更多 -->
<view v-if="hasMore && records.length > 0" class="load-more">
<u-button
type="default"
size="small"
:loading="loading"
@click="loadMore"
>
{{ loading ? "加载中..." : "加载更多" }}
</u-button>
</view>
</view>
</template>
<script setup>
import { ref, onMounted } from "vue";
import { onShow } from "@dcloudio/uni-app";
// 响应式数据
const loading = ref(false);
const hasMore = ref(true);
const records = ref([
{
id: 1,
title: "乘客电梯标准图纸",
generateTime: "2025-05-15 14:30",
status: "completed",
statusText: "已完成",
downloadUrl: "/static/files/passenger-elevator.pdf",
},
{
id: 2,
title: "货运电梯专用图纸",
generateTime: "2025-05-15 14:30",
status: "failed",
statusText: "未完成",
downloadUrl: null,
},
{
id: 3,
title: "医用电梯专业图纸",
generateTime: "2025-05-15 14:30",
status: "completed",
statusText: "已完成",
downloadUrl: "/static/files/medical-elevator.pdf",
},
{
id: 4,
title: "观光电梯定制图纸",
generateTime: "2025-05-15 14:30",
status: "completed",
statusText: "已完成",
downloadUrl: "/static/files/sightseeing-elevator.pdf",
},
{
id: 5,
title: "货运电梯专用图纸",
generateTime: "2025-05-15 14:30",
status: "failed",
statusText: "未完成",
downloadUrl: null,
},
]);
// 下载记录
const downloadRecord = (record) => {
if (record.status !== "completed" || !record.downloadUrl) {
uni.showToast({
title: "文件未准备好",
icon: "none",
});
return;
}
uni.showLoading({
title: "准备下载...",
});
// 模拟下载过程
setTimeout(() => {
uni.hideLoading();
// 在实际项目中这里应该调用下载API或打开文件
uni.showToast({
title: "下载成功",
icon: "success",
});
// 实际下载逻辑
// uni.downloadFile({
// url: record.downloadUrl,
// success: (res) => {
// if (res.statusCode === 200) {
// uni.saveFile({
// tempFilePath: res.tempFilePath,
// success: () => {
// uni.showToast({
// title: '下载成功',
// icon: 'success'
// })
// }
// })
// }
// },
// fail: () => {
// uni.showToast({
// title: '下载失败',
// icon: 'none'
// })
// }
// })
}, 1500);
};
// 删除记录
const deleteRecord = (record) => {
uni.showModal({
title: "确认删除",
content: "确定要删除这条生成记录吗?删除后无法恢复。",
success: (res) => {
if (res.confirm) {
// 从列表中移除记录
const index = records.value.findIndex((item) => item.id === record.id);
if (index !== -1) {
records.value.splice(index, 1);
}
uni.showToast({
title: "删除成功",
icon: "success",
});
// 实际项目中调用删除API
// try {
// await RPC.post('/api/generate-record/delete', { id: record.id })
// } catch (error) {
// console.error('删除失败:', error)
// }
}
},
});
};
// 加载更多数据
const loadMore = async () => {
if (loading.value) return;
loading.value = true;
try {
// 模拟API调用
await new Promise((resolve) => setTimeout(resolve, 1000));
// 模拟没有更多数据
hasMore.value = false;
uni.showToast({
title: "没有更多数据了",
icon: "none",
});
} catch (error) {
console.error("加载更多失败:", error);
uni.showToast({
title: "加载失败,请重试",
icon: "none",
});
} finally {
loading.value = false;
}
};
// 加载生成记录
const loadRecords = async () => {
try {
// 调用获取生成记录API
// const result = await RPC.get('/api/generate-records')
// records.value = result.data
} catch (error) {
console.error("加载生成记录失败:", error);
uni.showToast({
title: "加载失败,请重试",
icon: "none",
});
}
};
// 刷新数据
const onRefresh = async () => {
hasMore.value = true;
await loadRecords();
};
onMounted(() => {
loadRecords();
});
onShow(() => {
// 页面显示时刷新数据
loadRecords();
});
</script>
<style lang="scss" scoped>
.container {
font-size: 14px;
min-height: 100vh;
background-color: #f8f8f8;
padding: 16px;
}
.record-list {
.record-item {
background: white;
border-radius: 12px;
padding: 16px;
margin-bottom: 12px;
display: flex;
align-items: center;
gap: 12px;
.record-info {
flex: 1;
.record-title {
font-size: 16px;
color: #333;
font-weight: 500;
margin-bottom: 6px;
}
.record-time {
font-size: 13px;
color: #999;
}
}
.status-tag {
padding: 4px 8px;
border-radius: 4px;
font-size: 12px;
font-weight: 500;
&.completed {
background: #e8f5e8;
color: #52c41a;
}
&.failed {
background: #fff1f0;
color: #ff4d4f;
}
&.processing {
background: #fff7e6;
color: #fa8c16;
}
}
.record-actions {
display: flex;
align-items: center;
flex-shrink: 0;
}
}
}
.empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 80px 20px;
.empty-text {
color: #999;
font-size: 14px;
margin-top: 16px;
}
}
.load-more {
padding: 20px;
text-align: center;
}
</style>