nili
6 months ago
9 changed files with 249 additions and 6 deletions
@ -1 +1 @@ |
|||
!function(){"use strict";var t="/".replace(/([^/])$/,"$1/"),e=location.pathname,n=e.startsWith(t)&&decodeURI("/".concat(e.slice(t.length)));if(n){var a=document,c=a.head,r=a.createElement.bind(a),i=function(t,e,n){var a,c=e.r[t]||(null===(a=Object.entries(e.r).find((function(e){var n=e[0];return new RegExp("^".concat(n.replace(/\/:[^/]+/g,"/[^/]+").replace("/*","/.+"),"$")).test(t)})))||void 0===a?void 0:a[1]);return null==c?void 0:c.map((function(t){var a=e.f[t][1],c=e.f[t][0];return{type:c.split(".").pop(),url:"".concat(n.publicPath).concat(c),attrs:[["data-".concat(e.b),"".concat(e.p,":").concat(a)]]}}))}(n,{"p":"ant-design-pro","b":"webpack","f":[["51.a2ea1b3b.async.js",51],["134.6fc81d91.async.js",134],["169.57647c7d.async.js",169],["p__Welcome.61596037.async.js",185],["p__MoneyManagement.60ec3db9.async.js",190],["247.3fe8fb10.async.js",247],["t__plugin-layout__Layout.6cae69f5.chunk.css",301],["t__plugin-layout__Layout.4594a64b.async.js",301],["p__User__Login__index.9d3ab92e.async.js",366],["p__DeviceOwnerApp.ec53e5c4.async.js",371],["390.41467286.async.js",390],["393.38316f72.async.js",393],["397.fb5f72c1.async.js",397],["p__SuperAdmin.fe6b99ac.async.js",455],["531.4c68f902.async.js",531],["539.49b7b156.async.js",539],["p__AdvRecordListV2.ced10464.async.js",542],["p__Bind.b6ee068f.async.js",557],["559.016bfdbb.async.js",559],["p__404.0c100574.async.js",571],["635.20e45f05.async.js",635],["p__App__AppManagement.133ceb4c.async.js",731],["p__AdminManagement.5e2368b3.async.js",816],["822.4ba8fa04.async.js",822],["841.614ef4c0.async.js",841],["p__AdvRecordList.8e5ef22c.async.js",857],["p__UserManagement.c0a8d03f.async.js",903],["905.6e225d1b.async.js",905],["930.fca7adbf.async.js",930]],"r":{"/*":[19,27],"/":[1,6,7,18,20,27],"/welcome":[1,2,3,11,18,28,6,7,20,27],"/super":[0,1,2,5,13,14,15,23,27,28,6,7,18,20],"/adminList":[0,2,22,23,1,6,7,18,20,27],"/bind":[1,2,11,12,17,18,28,6,7,20,27],"/appList":[0,1,2,5,12,14,15,21,23,27,28,6,7,18,20],"/advList/:code":[0,1,2,14,15,18,23,24,25,27,28,6,7,20],"/advListV2/:code":[0,1,2,14,15,16,18,23,24,27,28,6,7,20],"/user/:code":[0,1,2,14,15,23,26,27,28,6,7,18,20],"/money/:code":[0,1,2,4,14,15,23,27,28,6,7,18,20],"/app/:code":[0,1,2,9,14,15,18,23,24,27,28,6,7,20],"/user/login":[1,2,8,14,23]}},{publicPath:"/"});null==i||i.forEach((function(t){var e,n=t.type,a=t.url;if("js"===n)(e=r("script")).src=a,e.async=!0;else{if("css"!==n)return;(e=r("link")).href=a,e.rel="preload",e.as="style"}t.attrs.forEach((function(t){e.setAttribute(t[0],t[1]||"")})),c.appendChild(e)}))}}(); |
|||
!function(){"use strict";var t="/".replace(/([^/])$/,"$1/"),e=location.pathname,n=e.startsWith(t)&&decodeURI("/".concat(e.slice(t.length)));if(n){var a=document,c=a.head,r=a.createElement.bind(a),i=function(t,e,n){var a,c=e.r[t]||(null===(a=Object.entries(e.r).find((function(e){var n=e[0];return new RegExp("^".concat(n.replace(/\/:[^/]+/g,"/[^/]+").replace("/*","/.+"),"$")).test(t)})))||void 0===a?void 0:a[1]);return null==c?void 0:c.map((function(t){var a=e.f[t][1],c=e.f[t][0];return{type:c.split(".").pop(),url:"".concat(n.publicPath).concat(c),attrs:[["data-".concat(e.b),"".concat(e.p,":").concat(a)]]}}))}(n,{"p":"ant-design-pro","b":"webpack","f":[["51.a2ea1b3b.async.js",51],["134.6fc81d91.async.js",134],["169.57647c7d.async.js",169],["p__Welcome.61596037.async.js",185],["p__MoneyManagement.60ec3db9.async.js",190],["247.3fe8fb10.async.js",247],["t__plugin-layout__Layout.6cae69f5.chunk.css",301],["t__plugin-layout__Layout.4594a64b.async.js",301],["p__User__Login__index.9d3ab92e.async.js",366],["p__DeviceOwnerApp.ec53e5c4.async.js",371],["390.41467286.async.js",390],["393.38316f72.async.js",393],["397.fb5f72c1.async.js",397],["p__SuperAdmin.2c1167ac.async.js",455],["531.4c68f902.async.js",531],["539.49b7b156.async.js",539],["p__AdvRecordListV2.ced10464.async.js",542],["p__Bind.b6ee068f.async.js",557],["559.016bfdbb.async.js",559],["p__404.0c100574.async.js",571],["635.20e45f05.async.js",635],["p__App__AppManagement.133ceb4c.async.js",731],["p__AdminManagement.5e2368b3.async.js",816],["822.4ba8fa04.async.js",822],["841.614ef4c0.async.js",841],["p__AdvRecordList.8e5ef22c.async.js",857],["p__UserManagement.c0a8d03f.async.js",903],["905.6e225d1b.async.js",905],["930.fca7adbf.async.js",930]],"r":{"/*":[19,27],"/":[1,6,7,18,20,27],"/welcome":[1,2,3,11,18,28,6,7,20,27],"/super":[0,1,2,5,13,14,15,23,27,28,6,7,18,20],"/adminList":[0,2,22,23,1,6,7,18,20,27],"/bind":[1,2,11,12,17,18,28,6,7,20,27],"/appList":[0,1,2,5,12,14,15,21,23,27,28,6,7,18,20],"/advList/:code":[0,1,2,14,15,18,23,24,25,27,28,6,7,20],"/advListV2/:code":[0,1,2,14,15,16,18,23,24,27,28,6,7,20],"/user/:code":[0,1,2,14,15,23,26,27,28,6,7,18,20],"/money/:code":[0,1,2,4,14,15,23,27,28,6,7,18,20],"/app/:code":[0,1,2,9,14,15,18,23,24,27,28,6,7,20],"/user/login":[1,2,8,14,23]}},{publicPath:"/"});null==i||i.forEach((function(t){var e,n=t.type,a=t.url;if("js"===n)(e=r("script")).src=a,e.async=!0;else{if("css"!==n)return;(e=r("link")).href=a,e.rel="preload",e.as="style"}t.attrs.forEach((function(t){e.setAttribute(t[0],t[1]||"")})),c.appendChild(e)}))}}(); |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,195 @@ |
|||
import { saveWhiteUser, whiteUserList } from '@/services/matrix/superAdmin'; |
|||
import { SearchOutlined } from '@ant-design/icons'; |
|||
import { ProColumns, ProTable } from '@ant-design/pro-components'; |
|||
import { Button, Form, Input, InputNumber, Modal, Space, Tag } from 'antd'; |
|||
import { useEffect, useState } from 'react'; |
|||
|
|||
import UserInfo from '../User/UserInfo'; |
|||
|
|||
const WhiteUserManagement = () => { |
|||
const [visible, setVisible] = useState(false); |
|||
|
|||
const [whiteUserArr, setWhiteUserArr] = useState<API.WhiteUserBo[]>([]); |
|||
const [filteredArr, setFilteredArr] = useState<API.WhiteUserBo[]>([]); |
|||
const [form] = Form.useForm(); |
|||
|
|||
const fetchApp = async () => { |
|||
const res = await whiteUserList(); |
|||
if (res.data) { |
|||
setWhiteUserArr(res.data); |
|||
setFilteredArr(res.data); |
|||
} |
|||
}; |
|||
|
|||
const columns: ProColumns<API.WhiteUserBo>[] = [ |
|||
{ |
|||
title: '应用名', |
|||
dataIndex: 'appName', |
|||
copyable: true, |
|||
hideInSearch: true, |
|||
filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => ( |
|||
<div style={{ padding: 8 }}> |
|||
<Input |
|||
placeholder="搜索应用" |
|||
value={selectedKeys[0]} |
|||
onChange={(e) => setSelectedKeys(e.target.value ? [e.target.value] : [])} |
|||
onPressEnter={() => confirm()} |
|||
style={{ marginBottom: 8, display: 'block' }} |
|||
/> |
|||
<Space> |
|||
<Button onClick={() => confirm()} type="primary"> |
|||
搜索 |
|||
</Button> |
|||
<Button onClick={() => clearFilters && clearFilters()} type="link"> |
|||
清除 |
|||
</Button> |
|||
</Space> |
|||
</div> |
|||
), |
|||
onFilter: (value, record) => { |
|||
if (typeof value === 'string' && typeof record?.appName === 'string') { |
|||
return record.appName.includes(value); |
|||
} |
|||
return false; |
|||
}, |
|||
filterIcon: (filtered) => ( |
|||
<SearchOutlined |
|||
style={{ color: filtered ? '#1890ff' : undefined }} |
|||
onPointerOverCapture={undefined} |
|||
onPointerMoveCapture={undefined} |
|||
/> |
|||
), |
|||
}, |
|||
{ |
|||
title: '用户', |
|||
dataIndex: 'user', |
|||
hideInSearch: true, |
|||
render: (_, r) => <UserInfo data={r.user || {}} />, |
|||
filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => { |
|||
const selectedUserId = selectedKeys[0] ? String(selectedKeys[0]) : ''; |
|||
return ( |
|||
<div style={{ padding: 8 }}> |
|||
<InputNumber |
|||
placeholder="搜索 userId" |
|||
value={selectedUserId} |
|||
onChange={(value) => setSelectedKeys(value ? [value] : [])} |
|||
onPressEnter={() => confirm()} |
|||
style={{ marginBottom: 8, display: 'block', width: 200 }} |
|||
/> |
|||
<Space> |
|||
<Button onClick={() => confirm()} type="primary"> |
|||
搜索 |
|||
</Button> |
|||
<Button onClick={() => clearFilters && clearFilters()} type="link"> |
|||
清除 |
|||
</Button> |
|||
</Space> |
|||
</div> |
|||
); |
|||
}, |
|||
onFilter: (value, record) => { |
|||
return record.user?.id === value; |
|||
}, |
|||
filterIcon: (filtered) => ( |
|||
<SearchOutlined |
|||
style={{ color: filtered ? '#1890ff' : undefined }} |
|||
onPointerOverCapture={undefined} |
|||
onPointerMoveCapture={undefined} |
|||
/> |
|||
), |
|||
}, |
|||
{ |
|||
title: '状态', |
|||
hideInSearch: true, |
|||
renderText: (r: API.WhiteUserBo) => |
|||
r.status === 0 ? <Tag color="green">已启用</Tag> : <Tag color="red">未启用</Tag>, |
|||
}, |
|||
{ |
|||
title: '创建时间', |
|||
hideInSearch: true, |
|||
dataIndex: 'createdAt', |
|||
valueType: 'dateTime', |
|||
}, |
|||
{ |
|||
title: '修改时间', |
|||
hideInSearch: true, |
|||
dataIndex: 'updatedAt', |
|||
valueType: 'dateTime', |
|||
}, |
|||
{ |
|||
title: '操作', |
|||
width: 80, |
|||
hideInSearch: true, |
|||
renderText: (r: API.WhiteUserBo) => { |
|||
return ( |
|||
<a |
|||
key="edit" |
|||
onClick={async () => { |
|||
await saveWhiteUser({ userId: r.user?.id || 0, status: r.status === 0 ? -1 : 0 }); |
|||
fetchApp(); |
|||
}} |
|||
> |
|||
{r.status === 0 ? '禁用' : '启用'} |
|||
</a> |
|||
); |
|||
}, |
|||
}, |
|||
]; |
|||
|
|||
useEffect(() => { |
|||
fetchApp(); |
|||
}, []); |
|||
|
|||
return ( |
|||
<> |
|||
<Button |
|||
style={{ marginBottom: '20px' }} |
|||
onClick={() => { |
|||
setVisible(true); |
|||
form.resetFields(); |
|||
}} |
|||
> |
|||
添加白名单 |
|||
</Button> |
|||
|
|||
<ProTable |
|||
search={false} |
|||
onReset={() => { |
|||
setFilteredArr(whiteUserArr); |
|||
}} |
|||
columns={columns} |
|||
dataSource={filteredArr} |
|||
/> |
|||
|
|||
<Modal |
|||
title="编辑" |
|||
visible={visible} |
|||
onOk={() => { |
|||
form.submit(); |
|||
setVisible(false); |
|||
}} |
|||
onCancel={() => { |
|||
setVisible(false); |
|||
}} |
|||
> |
|||
<Form |
|||
labelCol={{ span: 4 }} |
|||
wrapperCol={{ span: 18 }} |
|||
form={form} |
|||
onFinish={async ({ userId }) => { |
|||
if (userId) { |
|||
await saveWhiteUser({ userId: userId }); |
|||
fetchApp(); |
|||
} |
|||
}} |
|||
> |
|||
<Form.Item label="userId" name="userId"> |
|||
<InputNumber style={{ width: 200 }} /> |
|||
</Form.Item> |
|||
</Form> |
|||
</Modal> |
|||
</> |
|||
); |
|||
}; |
|||
|
|||
export default WhiteUserManagement; |
Loading…
Reference in new issue