index.vue
3.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<template>
<PageWrapper dense contentFullHeight contentClass="flex">
<div class="category-tree">
<div class="category-tree-search">
<a-input-search
placeholder="请输入关键字搜索"
enter-button
size="large"
v-model:value="searchKeyword"
@search="handleSearch"
/>
</div>
<a-tree v-if="treeData.length > 0" :tree-data="treeData" default-expand-all show-icon>
<template #custom="{ title, id, record }">
<div class="tree-node">
<span>{{ title }}</span>
<div class="but_operation">
<span class="but_type" @click="handleAdd(id)">新增</span>
<span class="but_type" @click="handleEdit(record)">编辑</span>
<a-popconfirm
title="你是否确认删除操作?"
ok-text="确认"
cancel-text="取消"
@confirm="handleDelete(record)"
>
<span class="but_type">删除</span>
</a-popconfirm>
</div>
</div>
</template>
</a-tree>
<div v-else class="empty-tree" style="margin: 200px auto">
<a-empty :image="simpleImage" />
</div>
<categoryModal @register="registerModal" @handleReload="handleReload" />
</div>
</PageWrapper>
</template>
<script setup lang="ts">
import { PageWrapper } from '/@/components/Page';
import './index.less';
import { categoryModal } from './components/index';
import { useModal } from '/@/components/Modal';
import { deleteCategory, getAllCategory } from '/@/api/equipment/category';
import { ref, onMounted } from 'vue';
import { Empty } from 'ant-design-vue';
import { useI18n } from '/@/hooks/web/useI18n';
import { useMessage } from '/@/hooks/web/useMessage';
const treeData = ref([]); // 声明为响应式变量
const { t } = useI18n();
const { createMessage } = useMessage();
const searchKeyword = ref('');
const simpleImage = Empty.PRESENTED_IMAGE_SIMPLE;
// 递归转换函数
const transformTreeData = (data: any) => {
return data?.map((item) => {
const transformedItem = {
title: item.name,
key: item.id,
id: item.id,
record: item, // 将原始数据赋值给 record
slots: { title: 'custom' },
};
// 递归处理 children
if (item.children && item.children.length > 0) {
//@ts-ignore
transformedItem.children = transformTreeData(item.children);
}
return transformedItem;
});
};
// 获取分类数据的函数
const fetchTreeData = async (name?: string) => {
try {
const res = await getAllCategory({ name }); // 将关键字传递给接口
// 使用递归函数转换数据
treeData.value = transformTreeData(res);
} catch (error) {
console.error('获取分类数据失败:', error);
}
};
// 组件挂载时获取数据
onMounted(() => {
fetchTreeData();
});
const [registerModal, { openModal }] = useModal();
// 处理搜索事件
const handleSearch = () => {
fetchTreeData(searchKeyword.value);
};
// 处理新建按钮点击事件
const handleAdd = (key: string) => {
openModal(true, {
isUpdate: false, // 表示是新建操作
parentId: key, // 传递当前节点的 key
});
};
// 编辑
const handleEdit = (record?: any) => {
openModal(true, {
isUpdate: true,
record,
});
};
const handleDelete = async (record?: any) => {
let id = record.id;
try {
await deleteCategory({ id });
createMessage.success(t('common.deleteSuccessText'));
handleReload();
} catch (error) {
throw error;
} finally {
}
};
const handleReload = () => {
fetchTreeData();
};
</script>