Skip to content

Commit

Permalink
Merge branch 'master' into feat-add-admin-panel
Browse files Browse the repository at this point in the history
# Conflicts:
#	components/layout/Footer.vue
#	components/layout/netdisk/Header.vue
  • Loading branch information
unilei-github committed Sep 20, 2024
2 parents 2fb3c0c + 97fc9cf commit 075e022
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 18 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

### 🔥更新日志

- 新增批量删除功能
- 新增博客功能 (分支:[feat-admin-panel](https://github.com/unilei/aipan-netdisk-search/tree/feat-add-admin-panel)
- 新增批量上传数据 [csv示例](/assets//readme//demo/demo-multi.csv) [xlsx 示例](/assets/readme/demo/demo-multi.xls)
- 增加后台管理, 访问路径:`/login` | `/admin/dashboard` | `/admin/clouddrive`
Expand Down
1 change: 0 additions & 1 deletion components/layout/Footer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
<p class="font-mono text-[12px] text-center text-gray-400">
爱盼-网盘资源搜索
</p>

</div>
</template>

Expand Down
116 changes: 99 additions & 17 deletions pages/admin/clouddrive.vue
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,83 @@ const handleSubmitMultiUpload = () => {
}
}
}
const multipleTableRef = ref()
const multipleSelection = ref([])
const selectable = (row) => ![].includes(row.id)
const toggleSelection = (rows, ignoreSelectable) => {
if (rows) {
rows.forEach((row) => {
multipleTableRef.value.toggleRowSelection(
row,
undefined,
ignoreSelectable
)
})
} else {
multipleTableRef.value.clearSelection()
}
}
const handleSelectionChange = (val) => {
multipleSelection.value = val
}
const handleMultiDelete = async () => {
if (multipleSelection.value.length === 0) {
ElMessage({
message: '请选择要删除的数据',
type: 'error'
});
return;
}
try {
await ElMessageBox.confirm(
'确定要删除这些数据吗?',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}
);
const idsToDelete = multipleSelection.value.map(item => item.id);
const res = await $fetch('/api/admin/resources/batch-delete', {
method: 'DELETE',
body: { ids: idsToDelete },
headers: {
"authorization": "Bearer " + useCookie('token').value
}
});
if (res.code === 200) {
ElMessage({
message: '删除成功',
type: 'success'
});
// 清空选择
toggleSelection([], true);
await getResources(); // 刷新资源列表
} else {
throw new Error('删除失败');
}
} catch (error) {
if (error.message === '已取消删除') {
ElMessage({
type: 'info',
message: '已取消删除',
});
} else {
ElMessage({
type: 'error',
message: '删除失败: ' + (error.response?.data?.message || '未知错误'),
});
}
}
};
onMounted(() => {
getResources()
})
Expand All @@ -299,25 +376,30 @@ onMounted(() => {
<div class="mt-6 grid grid-cols-4 gap-4">
<el-button type="primary" @click="handleAddClouddrive()">添加数据</el-button>
<el-button type="primary" @click="handleMultiUpload()">批量添加数据</el-button>
<el-button type="danger" @click="handleMultiDelete()">批量删除数据( {{ multipleSelection.length }} )</el-button>
</div>

<div class="mt-6">
<el-table :data="resourcesData">
<el-table-column prop="name" label="资源名字"></el-table-column>
<el-table-column prop="type.name" label="资源类型"></el-table-column>
<el-table-column label="操作" width="200">
<template #default="scope">
<el-button type="primary" @click="handleEditClouddrive(scope.row, scope.$index)">编辑</el-button>
<el-button type="danger" @click="handleDeleteClouddrive(scope.row, scope.$index)">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-6 flex items-center justify-center">
<el-pagination v-model:current-page="page" v-model:page-size="pageSize"
:page-sizes="[100, 200, 300, 400]" background layout="total, sizes, prev, pager, next, jumper"
:total="totalCount" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
<client-only>
<div class="mt-6">
<el-table ref="multipleTableRef" :data="resourcesData" @selection-change="handleSelectionChange">
<el-table-column type="selection" :selectable="selectable" width="55" />
<el-table-column prop="name" label="资源名字"></el-table-column>
<el-table-column prop="type.name" label="资源类型"></el-table-column>
<el-table-column label="操作" width="200">
<template #default="scope">
<el-button type="primary"
@click="handleEditClouddrive(scope.row, scope.$index)">编辑</el-button>
<el-button type="danger"
@click="handleDeleteClouddrive(scope.row, scope.$index)">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="mt-6 flex items-center justify-center">
<el-pagination v-model:current-page="page" v-model:page-size="pageSize"
:page-sizes="[100, 200, 300, 400]" background layout="total, sizes, prev, pager, next, jumper"
:total="totalCount" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div>
</div>
</div>
</client-only>
</div>
<el-dialog v-model="resourceDialogShow" :title="form.id ? '编辑资源' : '添加资源'">
<main>
Expand Down
31 changes: 31 additions & 0 deletions server/api/admin/resources/batch-delete.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import prisma from "~/lib/prisma";

export default defineEventHandler(async (event) => {
const body = await readBody(event); // 读取请求体
const { ids } = body; // 期望接收到一个包含 ID 的数组
const userId = event.context.user.userId; // 获取用户 ID(如果需要)

if (!Array.isArray(ids) || ids.length === 0) {
throw createError({ statusCode: 400, statusMessage: 'Invalid request: No IDs provided' });
}

try {
// 使用 Prisma 的 deleteMany 方法删除多个资源
await prisma.resource.deleteMany({
where: {
id: {
in: ids.map(id => Number(id)), // 将 ID 转换为数字
},
},
});

return {
code: 200,
msg: 'Resources deleted successfully',
data: [],
};
} catch (error) {
console.error('Error deleting resources:', error);
throw createError({ statusCode: 500, statusMessage: 'Failed to delete resources' });
}
});

0 comments on commit 075e022

Please sign in to comment.