index.tsx 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. import {CurdColumn, CurdPage} from "../../../components/curd";
  2. import {useCallback, useMemo, useState} from "react";
  3. import {LDAP, LDAPApis} from "../../../api/ldap.ts";
  4. import {ICurdConfig} from "../../../components/curd/types.ts";
  5. import {Button, Form, Input, Modal, Switch, Table} from "antd";
  6. import './index.less'
  7. import {Message} from "auto-antd";
  8. import {Link} from "react-router-dom";
  9. const columns: CurdColumn[] = [
  10. {
  11. key: 'id',
  12. title: 'ID',
  13. type: 'string',
  14. disabled: true,
  15. required: false,
  16. width: 50
  17. },
  18. {
  19. key: 'key',
  20. title: '服务编码',
  21. type: 'string',
  22. disabled: true,
  23. placeholder: '服务唯一编码,自动生成',
  24. required: false,
  25. width: 120
  26. },
  27. {
  28. key: 'url',
  29. title: '服务Url',
  30. type: 'string',
  31. placeholder: 'eg. ldap://192.168.1.1:389',
  32. width: 150
  33. },
  34. {
  35. key: 'userName',
  36. title: '管理员账号',
  37. type: 'string',
  38. width: 150
  39. },
  40. {
  41. key: 'password',
  42. title: '管理员密码',
  43. type: 'password',
  44. hidden: true,
  45. },
  46. {
  47. key: 'baseDN',
  48. type: 'string',
  49. title: 'baseDN',
  50. placeholder: 'eg. ou=users,dc=xxxx,dc=cn'
  51. },
  52. {
  53. key: 'filter',
  54. title: '过滤配置',
  55. type: 'string',
  56. placeholder: '默认:(objectClass=*)',
  57. required: false,
  58. width: 180
  59. },
  60. {
  61. title: '组织ObjectClass',
  62. key: 'organizeClass',
  63. type: 'string',
  64. },
  65. {
  66. key: 'remark',
  67. title: '备注',
  68. type: 'textarea',
  69. required: false,
  70. }
  71. ]
  72. const serverConfig: ICurdConfig<LDAP.Server> = {
  73. editDialogWidth: 500,
  74. labelSpan: 6,
  75. }
  76. type VerifyData = Partial<LDAP.Server> & {
  77. search?: string
  78. }
  79. export const Server = () => {
  80. const [verifyData, setVerifyData] = useState<VerifyData>()
  81. const [loading, setLoading] = useState(false)
  82. const [searchUsers, setSearchUsers] = useState<LDAP.User[]>([])
  83. const getList = useCallback((query: any) => {
  84. return LDAPApis.getServerList(query).then(res => {
  85. console.log('server', res)
  86. return res.data.data
  87. })
  88. }, [])
  89. const getDetail = (data: Partial<LDAP.Server>) => {
  90. if (!data.id) {
  91. return Promise.resolve({} as LDAP.Server)
  92. }
  93. return LDAPApis.getServer(data.id).then(res => {
  94. if (res) {
  95. return res;
  96. }
  97. throw new Error('该服务不存在!')
  98. })
  99. }
  100. const onSaveServer = (data: Partial<LDAP.Server>) => {
  101. return LDAPApis.saveServer(data)
  102. .then(res => {
  103. return res.data.data as LDAP.Server;
  104. })
  105. }
  106. const operationRender = (record: LDAP.Server, _: number) => {
  107. return (<>
  108. <Button onClick={() => setVerifyData(record)} size="small">验证</Button>
  109. <Button size="small">
  110. <Link to={`server/${record.id}/user`}>用户</Link>
  111. </Button>
  112. </>)
  113. }
  114. const config = useMemo(() => {
  115. return {
  116. ...serverConfig,
  117. operationRender
  118. } as ICurdConfig<LDAP.Server>
  119. }, [])
  120. const onChange = (data: Partial<VerifyData>) => {
  121. setVerifyData(verify => ({...verify, ...data}))
  122. }
  123. const onVerify = () => {
  124. if (!verifyData?.id) {
  125. return
  126. }
  127. setLoading(true)
  128. LDAPApis.verifyServer({id: verifyData.id, active: verifyData.active, username: verifyData.search})
  129. .then(res => {
  130. setLoading(false)
  131. setSearchUsers(res.data || [])
  132. Message.success('操作成功!')
  133. })
  134. .finally(() => {
  135. setLoading(false)
  136. })
  137. }
  138. return (<>
  139. <CurdPage columns={columns} getList={getList} getDetail={getDetail}
  140. onSave={onSaveServer}
  141. onSuccess={data => setVerifyData(data)}
  142. config={config}/>
  143. <Modal open={!!verifyData} title="LDAP服务验证" onCancel={() => setVerifyData(undefined)}
  144. confirmLoading={loading} width={600}
  145. onOk={onVerify}>
  146. <Form className="verify-form">
  147. <Form.Item name="id" label="URL">
  148. <span>{verifyData?.url}</span>
  149. </Form.Item>
  150. <Form.Item name="id" label="UserName">
  151. <span>{verifyData?.userName}</span>
  152. </Form.Item>
  153. <Form.Item name="baseDN" label="baseDN">
  154. <span>{verifyData?.baseDN}</span>
  155. </Form.Item>
  156. <Form.Item name="active" label="设置为活动服务">
  157. <Switch checked={verifyData?.active} onChange={ev => onChange({active: ev})}></Switch>
  158. </Form.Item>
  159. <Form.Item name="username" label="搜索用户名">
  160. <Input value={verifyData?.search} onChange={ev => onChange({search: ev.target.value})}/>
  161. </Form.Item>
  162. <Form.Item label="搜索结果">
  163. <div className="search-results">
  164. <Table dataSource={searchUsers} pagination={false} rowKey="uid">
  165. <Table.Column dataIndex="account" title="uid"/>
  166. <Table.Column dataIndex="userName" title="姓名"/>
  167. <Table.Column dataIndex="dn" title="DN"/>
  168. </Table>
  169. </div>
  170. </Form.Item>
  171. </Form>
  172. </Modal>
  173. </>)
  174. }