Files
zTools2/static/file_browser.css
zikai 41580a9025 feat: 文件浏览页支持多选、批量下载/删除与分页
- 后端:
  - UploadService.delete_file 下沉删除逻辑(DB 行 + 磁盘文件),单删/批删复用。
  - POST /api/admin/files/batch-delete:批量硬删除,返回 deleted 数与 not_found 列表。
  - list 接口加 Query 约束(limit 1-10000、offset>=0),非法返回 422。
- 前端(file_browser):
  - 复选框列 + 全选/反选,选中行高亮,批量操作栏(已选计数/下载/删除/取消)。
  - 分页控件:每页 20/50/100/全部 切换,页码导航(首页/末页/当前±1/省略号)。
  - 批量下载逐个触发(间隔 150ms 防浏览器拦截);批量删除走 batch-delete 接口。
  - 删除后重载当前页,当前页空则回退一页。
2026-07-21 14:37:13 +00:00

52 lines
2.7 KiB
CSS

/* 文件浏览页专属样式。表格、复选框列、行内操作、sha 截断、批量栏、分页器。 */
.files-table th.col-sel { width: 2.4em; text-align: center; }
.files-table td.col-sel { text-align: center; }
.files-table th.col-name { min-width: 28%; }
.files-table th.col-size { width: 9em; }
.files-table th.col-src { width: 6em; }
.files-table th.col-time { width: 11em; }
.files-table th.col-act { width: 9em; text-align: right; }
.files-table td.col-act { text-align: right; white-space: nowrap; }
.files-table td.col-name .fname { font-weight: 600; word-break: break-all; }
.files-table td.col-name .sha { display: block; margin-top: 0.15em; color: var(--text-dim); }
.files-table td.col-act .btn { padding: 0.3em 0.8em; font-size: 0.85em; margin-left: 0.3em; }
.files-table tbody tr.sel { background: var(--primary-soft); }
.files-table tbody tr.sel:hover td { background: var(--primary-soft); }
.files-table input[type="checkbox"] { width: 16px; height: 16px; cursor: pointer; accent-color: var(--primary); }
.sha-short { cursor: pointer; }
.sha-short:hover { color: var(--primary); }
.row-removed { opacity: 0; transition: opacity 0.25s; }
.toolbar-spacer { flex: 1; }
.page-size { display: inline-flex; align-items: center; gap: 0.4em; font-size: 0.88em; color: var(--text-dim); }
.page-size select {
padding: 0.25em 0.5em; border: 1px solid var(--border); border-radius: 6px;
background: var(--surface); color: var(--text); font-size: 0.88em; cursor: pointer;
}
.batchbar {
display: flex; align-items: center; gap: 0.6em; flex-wrap: wrap;
padding: 0.6em 0.9em; margin: 0 0 0.8em;
background: var(--primary-soft); border: 1px solid var(--primary);
border-radius: var(--radius);
}
.batchbar.hidden { display: none; }
.batchbar-info { font-size: 0.9em; color: var(--text); }
.batchbar-info b { color: var(--primary); }
.batchbar .btn { padding: 0.35em 0.9em; font-size: 0.85em; }
.pager { display: flex; align-items: center; gap: 0.4em; justify-content: center; margin: 1.5em 0 0; flex-wrap: wrap; }
.pager.hidden { display: none; }
.pager .btn { padding: 0.3em 0.8em; font-size: 0.85em; min-width: 2.4em; }
.pager .btn.is-current { background: var(--primary); border-color: var(--primary); color: #fff; }
.pager .btn[disabled] { opacity: 0.4; cursor: not-allowed; }
.pager .pager-ellipsis { padding: 0 0.3em; color: var(--text-dim); }
.pager .pager-info { font-size: 0.82em; color: var(--text-dim); margin-left: 0.6em; }
@media (max-width: 640px) {
.files-table th, .files-table td { padding: 0.5em 0.4em; }
.files-table th.col-src, .files-table td.col-src { display: none; }
.files-table th.col-time, .files-table td.col-time { font-size: 0.78em; }
.batchbar { font-size: 0.85em; }
}