Ant <Delete> 如何只删掉文件夹下所有文件和文件夹

本文介绍如何使用Ant中的fileset来精确地删除指定目录及其内容,包括空文件夹,并避免不必要的删除,提高清理效率。

用fileset 来过滤要删掉的目录和文件

<delete verbose="true" includeemptydirs="true">

            <fileset dir="${buildDir}">

                <include name="**/*"/>

            </fileset>

        </delete>

注:includeemptydirs 的意思是就算文件夹是空的,也同样删除。

这样就会避免使用像

<delete dir="build">

        </delete>

这样就会把build文件夹以及下面的所有子目录一起删掉。很多时候父目录是没有必要每次都删了重建的,只要清空这个文件夹就好了。
接口定义是这样的{ "code": 0, "info": { "total": 3, "size": 10, "pages": 1, "records": [ { "id": 4, "name": "user_growth_fanta", "host": "10.123.4.12", "port": 3314, "username": "lt_user_growth_fanta_test_rw", "password": "cqlw****", "database_name": "user_growth_fanta", "charset": "utf8mb4", "timeout": 100, "is_enabled": true, "remark": "测试更新备注", "created_user_id": 0, "created_user_name": "", "updated_user_id": 10278634, "updated_user_name": "Fred Wang", "created_at": "2025-08-15T17:24:16+08:00", "updated_at": "2025-09-02T20:34:00+08:00" }, { "id": 6, "name": "user_growth_cola_1", "host": "10.123.4.94", "port": 3306, "username": "lt_ug_cola_test_rw", "password": "cakjrhbqieury", "database_name": "user_growth_cola_1", "charset": "utf8mb4", "timeout": 100, "is_enabled": true, "remark": "这个是一个测试链接", "created_user_id": 0, "created_user_name": "", "updated_user_id": 0, "updated_user_name": "", "created_at": "2025-08-15T17:33:30+08:00", "updated_at": "2025-08-15T17:33:30+08:00" }, { "id": 7, "name": "奖池", "host": "10.123.4.94", "port": 3306, "username": "lt_ug_pepsi_test_rw", "password": "caeirugqeirJBHUG", "database_name": "", "charset": "utf8mb4", "timeout": 100, "is_enabled": true, "remark": "奖池", "created_user_id": 10278634, "created_user_name": "Fred Wang", "updated_user_id": 0, "updated_user_name": "", "created_at": "2025-09-03T11:19:14+08:00", "updated_at": "2025-09-04T19:48:24+08:00" } ] }, "msg": "success" } 改下代码,import { DeleteOutlined, EditOutlined, EyeOutlined } from '@ant-design/icons'; import type { ActionType, ProColumns } from '@ant-design/pro-components'; import { ProTable } from '@ant-design/pro-components'; import { Button, Form, Input, Modal, Spin, Tooltip, Typography, message, } from 'antd'; import { PlusOutlined } from '@ant-design/icons'; import { request } from '@umijs/max'; import { useRef, useState } from 'react'; const { Title } = Typography; // 模拟接口数据类型 type DbRecord = { id: number; name: string; creator: string; createTime: string; host?: string; port?: string; username?: string; password?: string; }; const DbconnectionPage = () => { const actionRef = useRef&lt;ActionType>(); const [isModalOpen, setIsModalOpen] = useState(false); const [editRecord, setEditRecord] = useState&lt;DbRecord | undefined>(); const [loading, setLoading] = useState(false); const [paramModalOpen, setParamModalOpen] = useState(false); const [currentRecord, setCurrentRecord] = useState&lt;DbRecord | undefined>(); const [form] = Form.useForm(); // 模拟查询接口,并使用 zhuligongjuqingqiucanshu 作为参数 const queryDbList = async (params: { id?: number; database_name?: string; created_user_name?: string; currentPage?: number; pageSize?: number; }) => { console.log('请求参数:', params); // 打印请求参数 return request&lt;{ data: { list: DbRecord[]; total: number; }; success: boolean; }>('https://growth-qa-test.sheincorp.cn/api/v1/connections/list', { method: 'POST', headers: { 'Content-Type': 'application/json', }, data: { id: params.id || 0, database_name: params.database_name || '', created_user_name: params.created_user_name || '', currentPage: params.currentPage || 1, pageSize: params.pageSize || 10, }, }); }; // 模拟测试连接接口 const testDbConnection = async (values: any) => { return new Promise&lt;{ success: boolean; msg: string }>((resolve) => { setTimeout(() => { if (values.host && values.port && values.username && values.password) { resolve({ success: true, msg: '连接成功' }); } else { resolve({ success: false, msg: '连接失败,请检查参数' }); } }, 800); }); }; // 模拟保存数据库配置 const saveDbRecord = async (values: any) => { return new Promise&lt;{ code: number; msg: string }>((resolve) => { setTimeout(() => { resolve({ code: 0, msg: '保存成功' }); }, 800); }); }; // 模拟删除数据库 const deleteDbRecord = async (id: number) => { return new Promise&lt;{ code: number; msg: string }>((resolve) => { setTimeout(() => { resolve({ code: 0, msg: '删除成功' }); }, 600); }); }; // 点击测试连接 const handleTestConnection = async () => { try { const values = await form.validateFields(); const res = await testDbConnection(values); if (res.success) { message.success(res.msg); } else { message.error(res.msg); } } catch (err) { message.error('请填写完整信息'); } }; // 点击保存 const handleSave = async () => { try { const values = await form.validateFields(); const res = await saveDbRecord(values); if (+res.code === 0) { message.success('保存成功'); setIsModalOpen(false); setEditRecord(undefined); actionRef.current?.reload(); } } catch (err) { message.error('保存失败,请检查表单'); } }; // 点击数据库名称打开参数弹窗 const showParamModal = (record: DbRecord) => { setCurrentRecord(record); form.setFieldsValue(record); setParamModalOpen(true); }; // 点击编辑 const handleEdit = (record: DbRecord) => { setEditRecord(record); form.setFieldsValue(record); setIsModalOpen(true); }; // 点击删除 const handleDelete = async (record: DbRecord) => { const res = await deleteDbRecord(record.id); if (+res.code === 0) { message.success('删除成功'); actionRef.current?.reload(); } }; // 表格列配置 const columns: ProColumns&lt;DbRecord>[] = [ { title: '数据库序号', dataIndex: 'id', search: false, }, { title: '数据库名称', dataIndex: 'name', render: (_, record) => ( &lt;a onClick={() => showParamModal(record)}>{record.name}&lt;/a> ), }, { title: '创建人', dataIndex: 'creator', }, { title: '创建时间', dataIndex: 'createTime', valueType: 'dateTime', }, { title: '操作', valueType: 'option', render: (_, record) => [ &lt;Tooltip title="查看" key="view"> &lt;Button icon={&lt;EyeOutlined />} onClick={() => showParamModal(record)} /> &lt;/Tooltip>, &lt;Tooltip title="编辑" key="edit"> &lt;Button icon={&lt;EditOutlined />} onClick={() => handleEdit(record)} /> &lt;/Tooltip>, &lt;Tooltip title="删除" key="delete"> &lt;Button icon={&lt;DeleteOutlined />} danger onClick={() => handleDelete(record)} /> &lt;/Tooltip>, ], }, ]; return ( &lt;> &lt;ProTable&lt;DbRecord> columns={columns} actionRef={actionRef} cardBordered headerTitle="数据库管理" request={async (params) => { const result = await queryDbList(params); return { data: result.data, total: result.total, success: result.success, }; }} rowKey="id" pagination={{ defaultPageSize: 10, showSizeChanger: true, }} toolBarRender={() => [ &lt;Button key="add" icon={&lt;PlusOutlined />} onClick={() => { setIsModalOpen(true); form.resetFields(); setEditRecord(undefined); }} type="primary" > 新增数据库 &lt;/Button>, ]} /> {/* 新增/编辑数据库弹窗 */} &lt;Modal title={editRecord ? '编辑数据库连接' : '新增数据库连接'} open={isModalOpen} onCancel={() => { setIsModalOpen(false); setEditRecord(undefined); }} footer={[ &lt;Button key="test" onClick={handleTestConnection}> 测试连接 &lt;/Button>, &lt;Button key="cancel" onClick={() => setIsModalOpen(false)}> 取消 &lt;/Button>, &lt;Button key="submit" type="primary" onClick={handleSave}> 保存 &lt;/Button>, ]} > &lt;Spin spinning={loading}> &lt;Form form={form} layout="vertical"> &lt;Form.Item label="数据库名称" name="name" rules={[ { required: true, message: '请输入数据库名称' }, { max: 32, message: '名称不能超过32个字符' }, ]} > &lt;Input placeholder="请输入数据库名称" /> &lt;/Form.Item> &lt;Form.Item label="Host" name="host" rules={[{ required: true, message: '请输入 Host' }]} > &lt;Input placeholder="例如:127.0.0.1" /> &lt;/Form.Item> &lt;Form.Item label="Port" name="port" rules={[{ required: true, message: '请输入 Port' }]} > &lt;Input placeholder="例如:3306" /> &lt;/Form.Item> &lt;Form.Item label="用户名" name="username" rules={[{ required: true, message: '请输入用户名' }]} > &lt;Input placeholder="请输入用户名" /> &lt;/Form.Item> &lt;Form.Item label="密码" name="password" rules={[{ required: true, message: '请输入密码' }]} > &lt;Input.Password placeholder="请输入密码" /> &lt;/Form.Item> &lt;/Form> &lt;/Spin> &lt;/Modal> {/* 数据库参数弹窗(用于查看详情) */} &lt;Modal title="数据库参数配置" open={paramModalOpen} onOk={() => setParamModalOpen(false)} onCancel={() => setParamModalOpen(false)} okText="关闭" > &lt;Form form={form} layout="vertical" disabled> &lt;Form.Item label="Host" name="host"> &lt;Input /> &lt;/Form.Item> &lt;Form.Item label="Port" name="port"> &lt;Input /> &lt;/Form.Item> &lt;Form.Item label="用户名" name="username"> &lt;Input /> &lt;/Form.Item> &lt;Form.Item label="密码" name="password"> &lt;Input.Password /> &lt;/Form.Item> &lt;/Form> &lt;/Modal> &lt;/> ); }; export default DbconnectionPage; 列表只需要取id,created_user_name,database_name,updated_at
最新发布
09-05
根据你提供的接口响应结构: ```json { "code": 0, "info": { "total": 3, "size": 10, "pages": 1, "records": [ { "id": 4, "name": "user_growth_fanta", "host": "10.123.4.12", "port": 3314, "username": "lt_user_growth_fanta_test_rw", "password": "cqlw****", "database_name": "user_growth_fanta", "created_user_name": "", "updated_at": "2025-09-02T20:34:00+08:00" } ] }, "msg": "success" } ``` 你希望只展示字段:`id`, `created_user_name`, `database_name`, `updated_at`。 --- ### ✅ 修改后的代码如下: #### ✅ 修改 1:更新 `DbRecord` 类型定义 ```ts type DbRecord = { id: number; database_name: string; created_user_name: string; updated_at: string; }; ``` --- #### ✅ 修改 2:更新 `columns` 配置 ```ts const columns: ProColumns&lt;DbRecord>[] = [ { title: 'ID', dataIndex: 'id', search: false, }, { title: '数据库名称', dataIndex: 'database_name', }, { title: '创建人', dataIndex: 'created_user_name', }, { title: '更新时间', dataIndex: 'updated_at', valueType: 'dateTime', }, { title: '操作', valueType: 'option', render: (_, record) => [ &lt;Tooltip title="查看" key="view"> &lt;Button icon={&lt;EyeOutlined />} onClick={() => showParamModal(record)} /> &lt;/Tooltip>, &lt;Tooltip title="编辑" key="edit"> &lt;Button icon={&lt;EditOutlined />} onClick={() => handleEdit(record)} /> &lt;/Tooltip>, &lt;Tooltip title="删除" key="delete"> &lt;Button icon={&lt;DeleteOutlined />} danger onClick={() => handleDelete(record)} /> &lt;/Tooltip>, ], }, ]; ``` --- #### ✅ 修改 3:修改 `queryDbList`,适配接口返回结构并提取所需字段 ```ts const queryDbList = async (params: { id?: number; database_name?: string; created_user_name?: string; currentPage?: number; pageSize?: number; }) => { const result = await request&lt;{ code: number; info: { total: number; records: any[]; }; msg: string; }>( 'https://growth-qa-test.sheincorp.cn/api/v1/connections/list', { method: 'POST', headers: { 'Content-Type': 'application/json', }, data: { id: params.id || 0, database_name: params.database_name || '', created_user_name: params.created_user_name || '', currentPage: params.currentPage || 1, pageSize: params.pageSize || 10, }, }, ); if (result.code === 0) { const list = result.info.records.map((item: any) => ({ id: item.id, database_name: item.database_name, created_user_name: item.created_user_name, updated_at: item.updated_at, })); return { data: list, total: result.info.total, success: true, }; } else { message.error(result.msg || '请求失败'); return { data: [], total: 0, success: false, }; } }; ``` --- ### ✅ 最终效果 - 表格只展示你指定的四个字段。 - 接口返回结构适配。 - 数据正确映射。 - 操作列仍保留查看/编辑/删除功能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值