From ff5b4a4202405b26393c5f71999e43f3e2746499 Mon Sep 17 00:00:00 2001
From: 张诺 <zhang_12370@163.com>
Date: 星期三, 08 四月 2026 15:13:12 +0800
Subject: [PATCH] feat(知识库): 添加批量操作和文件删除功能
---
src/pages/cooperativeOffice/collaborativeApproval/knowledgeBase/index.vue | 206 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 200 insertions(+), 6 deletions(-)
diff --git a/src/pages/cooperativeOffice/collaborativeApproval/knowledgeBase/index.vue b/src/pages/cooperativeOffice/collaborativeApproval/knowledgeBase/index.vue
index 5370e3c..a68e1cb 100644
--- a/src/pages/cooperativeOffice/collaborativeApproval/knowledgeBase/index.vue
+++ b/src/pages/cooperativeOffice/collaborativeApproval/knowledgeBase/index.vue
@@ -2,7 +2,32 @@
<view class="sales-accoun">
<!-- 浣跨敤閫氱敤椤甸潰澶撮儴缁勪欢 -->
<PageHeader title="鐭ヨ瘑搴�"
- @back="goBack" />
+ @back="goBack">
+ <template #right>
+ <view class="header-actions">
+ <uni-icons v-if="!batchMode"
+ type="download"
+ size="20"
+ color="#333"
+ @click="handleExport" />
+ <uni-icons v-if="!batchMode"
+ type="trash"
+ size="20"
+ color="#333"
+ @click="enterBatchMode" />
+ <uni-icons v-if="batchMode"
+ type="trash"
+ size="20"
+ color="#333"
+ @click="handleBatchDelete" />
+ <uni-icons v-if="batchMode"
+ type="closeempty"
+ size="20"
+ color="#333"
+ @click="exitBatchMode" />
+ </view>
+ </template>
+ </PageHeader>
<!-- 鎼滅储鍜岀瓫閫夊尯鍩� -->
<view class="search-section">
<view class="search-bar">
@@ -20,6 +45,18 @@
color="#999"></u-icon>
</view>
</view>
+ <view class="filter-row">
+ <view class="filter-input">
+ <up-input v-model="typeName"
+ readonly
+ placeholder="璇烽�夋嫨鐭ヨ瘑绫诲瀷"
+ @click="showTypeSheet = true" />
+ </view>
+ <view class="filter-reset"
+ @click="resetFilters">
+ 閲嶇疆
+ </view>
+ </view>
</view>
<!-- 鎷滆璁板綍鍒楄〃 -->
<view class="ledger-list"
@@ -35,6 +72,13 @@
color="#ffffff"></up-icon>
</view>
<text class="item-id">鐭ヨ瘑鏍囬锛歿{ item.title || '-' }}</text>
+ </view>
+ <view v-if="batchMode"
+ class="select-icon"
+ @click.stop="toggleSelection(item)">
+ <uni-icons :type="isSelected(item) ? 'checkbox-filled' : 'checkbox'"
+ size="20"
+ :color="isSelected(item) ? '#667eea' : '#999'" />
</view>
</view>
<up-divider></up-divider>
@@ -66,25 +110,26 @@
</view>
</view>
<!-- 鎸夐挳鍖哄煙 -->
- <view class="action-buttons">
+ <view class="action-buttons"
+ v-if="!batchMode">
<u-button type="info"
size="small"
class="action-btn"
plain
- @click="viewDetail(item, 3)">
+ @click.stop="viewDetail(item, 3)">
鏌ョ湅璇︽儏
</u-button>
<u-button type="primary"
size="small"
class="action-btn"
- @click="viewDetail(item, 2)">
+ @click.stop="viewDetail(item, 2)">
缂栬緫
</u-button>
<u-button type="error"
size="small"
class="action-btn"
plain
- @click="confirmDelete(item)">
+ @click.stop="confirmDelete(item)">
鍒犻櫎
</u-button>
</view>
@@ -102,6 +147,12 @@
size="24"
color="#ffffff"></up-icon>
</view>
+
+ <up-action-sheet :show="showTypeSheet"
+ :actions="typeOptions"
+ title="璇烽�夋嫨鐭ヨ瘑绫诲瀷"
+ @select="onTypeSelect"
+ @close="showTypeSheet = false" />
</view>
</template>
@@ -115,6 +166,8 @@
delKnowledgeBase,
} from "@/api/managementMeetings/knowledgeBase";
import useUserStore from "@/store/modules/user";
+ import config from "@/config";
+ import { getToken } from "@/utils/auth";
defineOptions({ name: "knowledge-base-index" });
@@ -129,9 +182,13 @@
// 鎼滅储鍏抽敭璇�
const name = ref("");
+ const type = ref("");
+ const showTypeSheet = ref(false);
// 鎷滆璁板綍鏁版嵁
const visitList = ref([]);
+ const batchMode = ref(false);
+ const selectedIds = ref([]);
// 杩斿洖涓婁竴椤�
const goBack = () => {
@@ -139,6 +196,30 @@
};
const { knowledge_type } = useDict("knowledge_type");
+ const typeOptions = computed(() => {
+ const opts = (knowledge_type?.value || []).map(item => ({
+ name: item.label,
+ value: item.value
+ }));
+ return [{ name: "鍏ㄩ儴", value: "" }, ...opts];
+ });
+
+ const typeName = computed(() => {
+ const item = typeOptions.value.find(i => String(i.value) === String(type.value));
+ return item ? item.name : (type.value || "");
+ });
+
+ const onTypeSelect = (action) => {
+ type.value = action.value;
+ showTypeSheet.value = false;
+ handleQuery();
+ };
+
+ const resetFilters = () => {
+ name.value = "";
+ type.value = "";
+ handleQuery();
+ };
// 鏍煎紡鍖栧洖娆炬柟寮�
const formatReceiptType = params => {
@@ -190,6 +271,7 @@
current: -1,
size: -1,
title: name.value,
+ type: type.value || undefined,
};
listKnowledgeBase(params)
.then(res => {
@@ -234,6 +316,49 @@
});
};
+ const enterBatchMode = () => {
+ batchMode.value = true;
+ selectedIds.value = [];
+ };
+
+ const exitBatchMode = () => {
+ batchMode.value = false;
+ selectedIds.value = [];
+ };
+
+ const toggleSelection = item => {
+ const id = item?.id;
+ if (!id) return;
+ const idx = selectedIds.value.findIndex(v => String(v) === String(id));
+ if (idx > -1) {
+ selectedIds.value.splice(idx, 1);
+ } else {
+ selectedIds.value.push(id);
+ }
+ };
+
+ const isSelected = item => {
+ const id = item?.id;
+ if (!id) return false;
+ return selectedIds.value.some(v => String(v) === String(id));
+ };
+
+ const handleBatchDelete = () => {
+ if (selectedIds.value.length === 0) {
+ showToast("璇烽�夋嫨瑕佸垹闄ょ殑鐭ヨ瘑");
+ return;
+ }
+ uni.showModal({
+ title: "鍒犻櫎纭",
+ content: `纭畾瑕佸垹闄ら�変腑鐨� ${selectedIds.value.length} 鏉$煡璇嗗悧锛焋,
+ success: res => {
+ if (res.confirm) {
+ deleteKnowledge(selectedIds.value);
+ }
+ },
+ });
+ };
+
// 鍒犻櫎纭
const confirmDelete = item => {
uni.showModal({
@@ -250,11 +375,15 @@
// 鎵ц鍒犻櫎
const deleteKnowledge = id => {
showLoadingToast("鍒犻櫎涓�...");
- delKnowledgeBase([id])
+ const ids = Array.isArray(id) ? id : [id];
+ delKnowledgeBase(ids)
.then(res => {
closeToast();
if (res.code === 200) {
showToast("鍒犻櫎鎴愬姛");
+ if (batchMode.value) {
+ exitBatchMode();
+ }
getList(); // 閲嶆柊鑾峰彇鍒楄〃
} else {
showToast("鍒犻櫎澶辫触");
@@ -264,6 +393,41 @@
closeToast();
showToast("鍒犻櫎澶辫触");
});
+ };
+
+ const handleExport = async () => {
+ try {
+ uni.showLoading({ title: "瀵煎嚭涓�...", mask: true });
+ const params = {
+ title: name.value || undefined,
+ type: type.value || undefined,
+ };
+ const query = Object.entries(params)
+ .filter(([, v]) => v !== undefined && v !== null && v !== "")
+ .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)
+ .join("&");
+ const url = config.baseUrl + "/knowledgeBase/export" + (query ? `?${query}` : "");
+ const res = await uni.downloadFile({
+ url,
+ header: {
+ Authorization: "Bearer " + getToken(),
+ },
+ });
+ uni.hideLoading();
+
+ if (res.statusCode !== 200) {
+ showToast("瀵煎嚭澶辫触");
+ return;
+ }
+ uni.openDocument({
+ filePath: res.tempFilePath,
+ showMenu: true,
+ fail: () => showToast("鎵撳紑鏂囦欢澶辫触"),
+ });
+ } catch (e) {
+ uni.hideLoading();
+ showToast("瀵煎嚭澶辫触");
+ }
};
onMounted(() => {
@@ -318,6 +482,36 @@
z-index: 100;
}
+ .header-actions {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding-right: 8px;
+ }
+
+ .filter-row {
+ margin-top: 10px;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ }
+
+ .filter-input {
+ flex: 1;
+ }
+
+ .filter-reset {
+ padding: 6px 12px;
+ background: #f5f7fa;
+ border-radius: 6px;
+ color: #666;
+ font-size: 12px;
+ }
+
+ .select-icon {
+ padding-left: 10px;
+ }
+
.action-buttons {
display: flex;
justify-content: flex-end;
--
Gitblit v1.9.3