index.tsx 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. import { PageContainer } from '@ant-design/pro-layout';
  2. import type { StreamItem } from '@/pages/media/Stream/typings';
  3. import SearchComponent from '@/components/SearchComponent';
  4. import type { ProColumns } from '@jetlinks/pro-table';
  5. import { Button, Card, Col, Empty, message, Pagination, Row, Space } from 'antd';
  6. import { useEffect, useState } from 'react';
  7. import Service from '@/pages/media/Stream/service';
  8. import { getButtonPermission, getMenuPathByParams, MENUS_CODE } from '@/utils/menu';
  9. import { useHistory } from 'umi';
  10. import styles from './index.less';
  11. import { DeleteOutlined, EditOutlined, PlusOutlined } from '@ant-design/icons';
  12. import { model } from '@formily/reactive';
  13. import { PermissionButton } from '@/components';
  14. export const service = new Service('media/server');
  15. export const StreamModel = model<{
  16. current: Partial<StreamItem>;
  17. }>({
  18. current: {},
  19. });
  20. const Stream = () => {
  21. const history = useHistory<Record<string, string>>();
  22. const [param, setParam] = useState<any>({ pageSize: 10, terms: [] });
  23. const permissionCode = 'media/Stream';
  24. const { permission } = PermissionButton.usePermission(permissionCode);
  25. const columns: ProColumns<StreamItem>[] = [
  26. {
  27. dataIndex: 'name',
  28. title: '名称',
  29. ellipsis: true,
  30. },
  31. ];
  32. const [dataSource, setDataSource] = useState<any>({
  33. data: [],
  34. pageSize: 10,
  35. pageIndex: 0,
  36. total: 0,
  37. });
  38. const handleSearch = (params?: any) => {
  39. service
  40. .query({
  41. ...params,
  42. sorts: [
  43. {
  44. name: 'id',
  45. order: 'desc',
  46. },
  47. ],
  48. })
  49. .then((resp) => {
  50. if (resp.status === 200) {
  51. setDataSource(resp.result);
  52. }
  53. });
  54. };
  55. useEffect(() => {
  56. handleSearch(param);
  57. }, [param]);
  58. return (
  59. <PageContainer>
  60. <SearchComponent<StreamItem>
  61. field={columns}
  62. target="stream"
  63. onSearch={(data) => {
  64. setParam({
  65. ...param,
  66. terms: data?.terms ? [...data?.terms] : [],
  67. });
  68. }}
  69. />
  70. <Card>
  71. {dataSource.data.length > 0 ? (
  72. <>
  73. <PermissionButton
  74. isPermission={permission.add}
  75. onClick={() => {
  76. history.push(`${getMenuPathByParams(MENUS_CODE['media/Stream/Detail'])}`);
  77. StreamModel.current = {};
  78. }}
  79. key="button"
  80. icon={<PlusOutlined />}
  81. type="primary"
  82. >
  83. 新增
  84. </PermissionButton>
  85. <Row gutter={[16, 16]} style={{ marginTop: 10 }}>
  86. {(dataSource?.data || []).map((item: any) => (
  87. <Col key={item.id} span={12}>
  88. <Card hoverable className={styles.cardRender}>
  89. <div className={styles.card}>
  90. <div className={styles.header}>
  91. <div className={styles.title}>{item?.name}</div>
  92. <div className={styles.actions}>
  93. <Space>
  94. <PermissionButton
  95. isPermission={permission.update}
  96. className={styles.action}
  97. onClick={() => {
  98. history.push(
  99. `${getMenuPathByParams(
  100. MENUS_CODE['media/Stream/Detail'],
  101. item.id,
  102. )}`,
  103. );
  104. StreamModel.current = { ...item };
  105. }}
  106. key="button"
  107. type="link"
  108. >
  109. <EditOutlined style={{ color: '#000000' }} />
  110. <span>编辑</span>
  111. </PermissionButton>
  112. <PermissionButton
  113. isPermission={permission.delete}
  114. popConfirm={{
  115. title: '确认删除',
  116. onConfirm: () => {
  117. service.remove(item.id).then((resp: any) => {
  118. if (resp.status === 200) {
  119. message.success('操作成功!');
  120. handleSearch({ pageSize: 10, terms: [] });
  121. }
  122. });
  123. },
  124. }}
  125. key="delete"
  126. type="link"
  127. >
  128. <span className={styles.action}>
  129. <DeleteOutlined style={{ color: '#E50012' }} />
  130. <span>删除</span>
  131. </span>
  132. </PermissionButton>
  133. </Space>
  134. </div>
  135. </div>
  136. <div className={styles.content}>
  137. <div className={styles.item}>
  138. <div className={styles.itemTitle}>服务商</div>
  139. <p>{item?.provider}</p>
  140. </div>
  141. <div className={styles.item}>
  142. <div className={styles.itemTitle}>RTP IP</div>
  143. <p>{item?.configuration?.rtpIp}</p>
  144. </div>
  145. <div className={styles.item}>
  146. <div className={styles.itemTitle}>API HOST</div>
  147. <p>{item?.configuration?.apiHost}</p>
  148. </div>
  149. </div>
  150. </div>
  151. </Card>
  152. </Col>
  153. ))}
  154. </Row>
  155. <div style={{ display: 'flex', marginTop: 20, justifyContent: 'flex-end' }}>
  156. <Pagination
  157. showSizeChanger
  158. size="small"
  159. className={'pro-table-card-pagination'}
  160. total={dataSource?.total || 0}
  161. current={dataSource?.pageIndex + 1}
  162. onChange={(page, size) => {
  163. handleSearch({
  164. ...param,
  165. pageIndex: page - 1,
  166. pageSize: size,
  167. });
  168. }}
  169. pageSizeOptions={[10, 20, 50, 100]}
  170. pageSize={dataSource?.pageSize}
  171. showTotal={(num) => {
  172. const minSize = dataSource?.pageIndex * dataSource?.pageSize + 1;
  173. const MaxSize = (dataSource?.pageIndex + 1) * dataSource?.pageSize;
  174. return `第 ${minSize} - ${MaxSize > num ? num : MaxSize} 条/总共 ${num} 条`;
  175. }}
  176. />
  177. </div>
  178. </>
  179. ) : (
  180. <Empty
  181. description={
  182. <span>
  183. 暂无数据,请先
  184. <Button
  185. type="link"
  186. disabled={getButtonPermission('media/Stream', ['add'])}
  187. onClick={() => {
  188. history.push(`${getMenuPathByParams(MENUS_CODE['media/Stream/Detail'])}`);
  189. StreamModel.current = {};
  190. }}
  191. >
  192. 新增流媒体服务
  193. </Button>
  194. </span>
  195. }
  196. />
  197. )}
  198. </Card>
  199. </PageContainer>
  200. );
  201. };
  202. export default Stream;