feat(前端):终端绑定用户

master
shaot 2025-08-11 18:33:13 +08:00
parent 36f8dca46f
commit f95d382c30
5 changed files with 63 additions and 18 deletions

View File

@ -159,7 +159,7 @@ const UserListPage: React.FC = () => {
try { try {
const { id } = device || {}; const { id } = device || {};
const payload = { const payload = {
ids: id ? id : selectedRowKeys, id: id ? id : selectedRowKeys,
}; };
const res: any = await deleteDevice(payload); const res: any = await deleteDevice(payload);
const { code } = res || {}; const { code } = res || {};
@ -390,6 +390,14 @@ const UserListPage: React.FC = () => {
getDataSource(); getDataSource();
}; };
const onBindImageSave = () => {
setBindImageDta({
recordData: {},
visible: false,
});
getDataSource();
};
return ( return (
<div className={styles.user_content}> <div className={styles.user_content}>
<div className={styles.left_content}> <div className={styles.left_content}>
@ -552,7 +560,9 @@ const UserListPage: React.FC = () => {
visible: false, visible: false,
}); });
}} }}
onOk={() => {onBindUserSave()}} onOk={() => {
onBindUserSave();
}}
/> />
)} )}
{bindImageDta.visible && ( {bindImageDta.visible && (
@ -564,7 +574,9 @@ const UserListPage: React.FC = () => {
visible: false, visible: false,
}); });
}} }}
onOk={() => {}} onOk={() => {
onBindImageSave();
}}
/> />
)} )}
</div> </div>

View File

@ -1,6 +1,6 @@
/* eslint-disable @typescript-eslint/no-use-before-define */ /* eslint-disable @typescript-eslint/no-use-before-define */
import type { PopoverProps } from 'antd'; import type { PopoverProps } from 'antd';
import { Button, Popconfirm, Popover, Space } from 'antd'; import { Button, Popconfirm, Popover, Space, Tooltip } from 'antd';
import type { ColumnsType } from 'antd/es/table'; import type { ColumnsType } from 'antd/es/table';
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import CustomTable from '../selectedTable/table'; import CustomTable from '../selectedTable/table';
@ -50,14 +50,13 @@ const SelectedTable: React.FC<SelectedTableProps> = (props) => {
const onHandleOk = () => { const onHandleOk = () => {
const list: any[] = []; const list: any[] = [];
// 用户 // 镜像
(selectedRows || []).forEach((item) => { (selectedRows || []).forEach((item) => {
list.push({ list.push({
id: item.image_id, record_id: item.id,
name: item.image_name, image_name: item.image_name,
}); });
}); });
setTableData(list); setTableData(list);
onBindImageChange(list); onBindImageChange(list);
onHnadleCancel(); onHnadleCancel();
@ -75,13 +74,13 @@ const SelectedTable: React.FC<SelectedTableProps> = (props) => {
const handleDelete = (record?: any) => { const handleDelete = (record?: any) => {
if (record) { if (record) {
// 单个删除 // 单个删除
const { id } = record || {}; const { record_id } = record || {};
const newData = tableData.filter((item) => item.id !== id); const newData = tableData.filter((item) => item.record_id !== record_id);
setTableData(newData); setTableData(newData);
} else { } else {
// 批量删除 // 批量删除
const newData = tableData.filter( const newData = tableData.filter(
(item) => !bindTableKeys.includes(item.id), (item) => !bindTableKeys.includes(item.record_id),
); );
setTableData(newData); setTableData(newData);
setSelectedRowKeys([]); setSelectedRowKeys([]);
@ -129,12 +128,16 @@ const SelectedTable: React.FC<SelectedTableProps> = (props) => {
title: '镜像名称', title: '镜像名称',
dataIndex: 'image_name', dataIndex: 'image_name',
key: 'image_name', key: 'image_name',
render: (text) => {
return <Tooltip>{text || '--'}</Tooltip>;
},
}, },
{ {
title: '操作', title: '操作',
key: 'action', key: 'action',
width: 150,
render: (_, record) => ( render: (_, record) => (
<Button type="link" danger onClick={() => handleDelete(record)}> <Button type="link" onClick={() => handleDelete(record)}>
</Button> </Button>
), ),
@ -181,7 +184,7 @@ const SelectedTable: React.FC<SelectedTableProps> = (props) => {
onDelete={handleDelete} onDelete={handleDelete}
columns={getColumns()} columns={getColumns()}
scrollY={400} scrollY={400}
rowKey="id" rowKey="record_id"
pagination={false} pagination={false}
rowSelection={{ rowSelection={{
bindTableKeys, bindTableKeys,

View File

@ -1,6 +1,6 @@
// index.tsx // index.tsx
import { ERROR_CODE } from '@/constants/constants'; import { ERROR_CODE } from '@/constants/constants';
import { getBindImageList } from '@/services/terminal'; import { getBindImageAdd, getBindImageList } from '@/services/terminal';
import { Button, Form, message, Modal } from 'antd'; import { Button, Form, message, Modal } from 'antd';
import React, { useEffect } from 'react'; import React, { useEffect } from 'react';
import SelectedTable from '../ImageSelectedTable/index'; import SelectedTable from '../ImageSelectedTable/index';
@ -21,7 +21,7 @@ const BindUserModal: React.FC<UserEditModalProps> = ({
dataDetial, dataDetial,
}) => { }) => {
const { recordData, visible, selectedOrg } = dataDetial || {}; const { recordData, visible, selectedOrg } = dataDetial || {};
const { id: device_id } = recordData || {}; const { device_id } = recordData || {};
const [form] = Form.useForm(); const [form] = Form.useForm();
useEffect(() => { useEffect(() => {
@ -40,8 +40,34 @@ const BindUserModal: React.FC<UserEditModalProps> = ({
const handleOk = async () => { const handleOk = async () => {
try { try {
const values = await form.validateFields(); const values = await form.validateFields();
const { image_list } = values || {};
if (image_list && image_list.length > 0) {
const list: any[] = [];
image_list.forEach((item: any) => {
list.push({
id: item.id,
device_id: device_id,
image_id: item.record_id,
});
});
const payload: any = {
data: list,
};
getBindImageAdd(payload).then((res: any) => {
const { code } = res || {};
if (code === ERROR_CODE) {
message.success('绑定成功');
onOk();
} else {
message.error('绑定失败');
}
});
} else {
message.info('请先选择绑定的镜像');
}
console.log('values=====', values); console.log('values=====', values);
onOk(values); // onOk(values);
} catch (error) { } catch (error) {
message.error('请检查表单字段'); message.error('请检查表单字段');
} }

View File

@ -24,7 +24,7 @@ const BindUserModal: React.FC<UserEditModalProps> = ({
dataDetial, dataDetial,
}) => { }) => {
const { recordData, visible } = dataDetial || {}; const { recordData, visible } = dataDetial || {};
const { device_id } = recordData || {}; const { device_id,device_group_id } = recordData || {};
const [orgTreeData, setOrgTreeData] = useState<User.OrganizationNode[]>([]); const [orgTreeData, setOrgTreeData] = useState<User.OrganizationNode[]>([]);
const [form] = Form.useForm(); const [form] = Form.useForm();
@ -96,6 +96,7 @@ const BindUserModal: React.FC<UserEditModalProps> = ({
user_id: record_id, user_id: record_id,
id: id, id: id,
device_id, device_id,
device_group_id,
type: type, type: type,
}); });
} else { } else {
@ -104,6 +105,7 @@ const BindUserModal: React.FC<UserEditModalProps> = ({
user_group_id: record_id, user_group_id: record_id,
id: id, id: id,
device_id: device_id, device_id: device_id,
device_group_id,
type: type, type: type,
}); });
} }

View File

@ -97,7 +97,7 @@ const SelectedTable: React.FC<SelectedTableProps> = (props) => {
}); });
}); });
setTableData(list); setTableData(list);
onBindUserChange(list); if (onBindUserChange) onBindUserChange(list);
onHnadleCancel(); onHnadleCancel();
}; };
@ -120,12 +120,14 @@ const SelectedTable: React.FC<SelectedTableProps> = (props) => {
const { record_id } = record || {}; const { record_id } = record || {};
const newData = tableData.filter((item) => item.record_id !== record_id); const newData = tableData.filter((item) => item.record_id !== record_id);
setTableData(newData); setTableData(newData);
if (onBindUserChange) onBindUserChange(newData);
} else { } else {
// 批量删除 // 批量删除
const newData = tableData.filter( const newData = tableData.filter(
(item) => !bindTableKeys.includes(item.record_id), (item) => !bindTableKeys.includes(item.record_id),
); );
setTableData(newData); setTableData(newData);
if (onBindUserChange) onBindUserChange(newData);
setSelectedRowKeys([]); setSelectedRowKeys([]);
setSelectedRows([]); setSelectedRows([]);
} }