From 69648dfe1f18611ed9c654760730899ba65ac479 Mon Sep 17 00:00:00 2001 From: baiJinjin <66710700+baiJinjin@users.noreply.github.com> Date: Tue, 19 Sep 2023 23:50:22 +0800 Subject: [PATCH] Feature htl (#1471) * Add user log item Manage * edit Item Management * merge from develop * add router --- threadpool/console-new/craco.config.js | 6 + threadpool/console-new/package.json | 3 + threadpool/console-new/src/App.tsx | 1 + .../components/layout-com/index.module.less | 2 +- .../console-new/src/config/theme/index.ts | 2 +- threadpool/console-new/src/hooks/useUrlSet.ts | 18 +++ .../src/page/item/index.module.less | 5 + .../console-new/src/page/item/index.tsx | 120 ++++++++++++++++++ .../console-new/src/page/item/router.tsx | 8 ++ .../console-new/src/page/item/service.ts | 75 +++++++++++ .../src/page/log/index.module.less | 5 + threadpool/console-new/src/page/log/index.tsx | 120 ++++++++++++++++++ .../console-new/src/page/log/router.tsx | 8 ++ .../console-new/src/page/log/service.ts | 79 ++++++++++++ .../src/page/tenant/index.module.less | 5 + .../console-new/src/page/tenant/index.tsx | 65 +++++++--- .../console-new/src/page/tenant/service.ts | 95 +++++++++----- .../src/page/user/index.module.less | 5 + .../console-new/src/page/user/index.tsx | 120 ++++++++++++++++++ .../console-new/src/page/user/router.tsx | 8 ++ .../console-new/src/page/user/service.ts | 78 ++++++++++++ threadpool/console-new/src/route/index.tsx | 3 + .../console-new/src/utils/common/index.ts | 31 ++++- .../console-new/src/utils/request/index.ts | 4 +- yarn.lock | 76 ----------- 25 files changed, 815 insertions(+), 127 deletions(-) create mode 100644 threadpool/console-new/src/hooks/useUrlSet.ts create mode 100644 threadpool/console-new/src/page/item/index.module.less create mode 100644 threadpool/console-new/src/page/item/index.tsx create mode 100644 threadpool/console-new/src/page/item/router.tsx create mode 100644 threadpool/console-new/src/page/item/service.ts create mode 100644 threadpool/console-new/src/page/log/index.module.less create mode 100644 threadpool/console-new/src/page/log/index.tsx create mode 100644 threadpool/console-new/src/page/log/router.tsx create mode 100644 threadpool/console-new/src/page/log/service.ts create mode 100644 threadpool/console-new/src/page/tenant/index.module.less create mode 100644 threadpool/console-new/src/page/user/index.module.less create mode 100644 threadpool/console-new/src/page/user/index.tsx create mode 100644 threadpool/console-new/src/page/user/router.tsx create mode 100644 threadpool/console-new/src/page/user/service.ts delete mode 100644 yarn.lock diff --git a/threadpool/console-new/craco.config.js b/threadpool/console-new/craco.config.js index 5ad94a67..f94068ae 100644 --- a/threadpool/console-new/craco.config.js +++ b/threadpool/console-new/craco.config.js @@ -48,5 +48,11 @@ module.exports = { headers: { 'Access-Control-Allow-Origin': '*', }, + proxy: { + '/hippo4j': { + target: 'http://console.hippo4j.cn', + changeOrigin: true, + }, + }, }, }; diff --git a/threadpool/console-new/package.json b/threadpool/console-new/package.json index 353e4cf1..43c1e5f8 100644 --- a/threadpool/console-new/package.json +++ b/threadpool/console-new/package.json @@ -5,6 +5,7 @@ "dependencies": { "@ahooksjs/use-url-state": "^3.5.1", "@ant-design/icons": "^5.2.6", + "@tanem/react-nprogress": "^5.0.51", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", @@ -13,6 +14,7 @@ "dayjs": "^1.11.9", "i18next": "^23.5.1", "i18next-browser-languagedetector": "^7.1.0", + "lodash": "^4.17.21", "qs": "^6.11.2", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -50,6 +52,7 @@ "@craco/craco": "^7.1.0", "@types/http-errors": "^2.0.1", "@types/jest": "^27.5.2", + "@types/lodash": "^4.14.198", "@types/node": "^16.18.26", "@types/react": "^18.2.6", "@types/react-dom": "^18.2.4", diff --git a/threadpool/console-new/src/App.tsx b/threadpool/console-new/src/App.tsx index d03544f5..c983e76a 100644 --- a/threadpool/console-new/src/App.tsx +++ b/threadpool/console-new/src/App.tsx @@ -1,3 +1,4 @@ +// import { Suspense } from 'react'; import LayoutCom from './components/layout-com'; import { Routes, Route, Link } from 'react-router-dom'; diff --git a/threadpool/console-new/src/components/layout-com/index.module.less b/threadpool/console-new/src/components/layout-com/index.module.less index 05eeadc3..073f6d40 100644 --- a/threadpool/console-new/src/components/layout-com/index.module.less +++ b/threadpool/console-new/src/components/layout-com/index.module.less @@ -12,7 +12,7 @@ padding-top: 24px; } .content { - margin: 10px 10px 0px; + margin: 0; border-radius: 12px 12px 0 0; flex: 1; padding: 16px; diff --git a/threadpool/console-new/src/config/theme/index.ts b/threadpool/console-new/src/config/theme/index.ts index c1c656b4..7e40b52d 100644 --- a/threadpool/console-new/src/config/theme/index.ts +++ b/threadpool/console-new/src/config/theme/index.ts @@ -1,7 +1,7 @@ import { DefaultTheme } from 'styled-components'; export const lightDefaultTheme: DefaultTheme = { - primary: '#0d68a8', + primary: '#1890ff', baseColor: { // 前两个是固定的,用于,有颜色按钮 字体颜色等固定不会变的颜色值 bc1: '#fff', diff --git a/threadpool/console-new/src/hooks/useUrlSet.ts b/threadpool/console-new/src/hooks/useUrlSet.ts new file mode 100644 index 00000000..7669d5f3 --- /dev/null +++ b/threadpool/console-new/src/hooks/useUrlSet.ts @@ -0,0 +1,18 @@ +import useUrlState from '@ahooksjs/use-url-state'; + +export const useUrlSet = (options: { form: any }) => { + const { form } = options; + const [state, setState] = useUrlState({}); + + const setUrl = () => { + const params = form.getFieldsValue(); + Object.keys(params).forEach(key => { + if (!params[key]) { + params[key] = undefined; + } + }); + setState({ ...params }); + }; + + return { setUrl }; +}; diff --git a/threadpool/console-new/src/page/item/index.module.less b/threadpool/console-new/src/page/item/index.module.less new file mode 100644 index 00000000..5f59dc72 --- /dev/null +++ b/threadpool/console-new/src/page/item/index.module.less @@ -0,0 +1,5 @@ +.tenant_wrapper { + .opreate_btn { + padding: 0px; + } +} \ No newline at end of file diff --git a/threadpool/console-new/src/page/item/index.tsx b/threadpool/console-new/src/page/item/index.tsx new file mode 100644 index 00000000..8684894a --- /dev/null +++ b/threadpool/console-new/src/page/item/index.tsx @@ -0,0 +1,120 @@ +import { useAntdTable } from 'ahooks'; +import { Button, Form, Input, Row, Space, Table, Col } from 'antd'; +import { SearchOutlined, EditOutlined } from '@ant-design/icons'; +import React, { useState } from 'react'; +import { fetchItemList } from './service'; +import { useUrlSet } from '@/hooks/useUrlSet'; +import style from './index.module.less'; + +const baseColumns = [ + { + title: '序号', + dataIndex: 'index', + }, + { + title: '租户', + dataIndex: 'tenantId', + }, + { + title: '项目名称', + dataIndex: 'itemName', + }, + { + title: '负责人', + dataIndex: 'owner', + }, + { + title: '修改时间', + dataIndex: 'gmtModified', + }, +]; + +const Tenant: React.FC = () => { + const [editVisible, setEditVisible] = useState(false); + const [type, setType] = useState('add'); + const [form] = Form.useForm(); + const { setUrl } = useUrlSet({ form }); + const { tableProps, search } = useAntdTable(fetchItemList, { form }); + // const {run: delete} = useRequest(fetchDeleteTenant, { manual: true }); + const actions = (type: string, item?: any) => { + switch (type) { + case 'add': + setEditVisible(true); + break; + case 'edit': + setEditVisible(true); + break; + case 'delete': + // handleDelete(); + break; + default: + break; + } + }; + const handleSearch = () => { + setUrl(); + search.submit(); + }; + // const handleDelete = (item: any) => { + // Modal.confirm({ + // title: `此操作将删除${item.tenantName}, 是否继续?`, + // onOk: () => { + // search.submit(); + // }, + // }); + // }; + + return ( +
+
+ + + + + + + + + + + + + + + + + +
+ { + return ( + + + + + ); + }, + }, + ]} + /> + + ); +}; + +export default Tenant; diff --git a/threadpool/console-new/src/page/item/router.tsx b/threadpool/console-new/src/page/item/router.tsx new file mode 100644 index 00000000..c11cce05 --- /dev/null +++ b/threadpool/console-new/src/page/item/router.tsx @@ -0,0 +1,8 @@ +import { lazy } from 'react'; +import { IRouterList } from '@/typings'; + +const ItemManage = lazy(() => import('./index')); + +const routerList: IRouterList[] = [{ path: '/item', component: () => }]; + +export default routerList; diff --git a/threadpool/console-new/src/page/item/service.ts b/threadpool/console-new/src/page/item/service.ts new file mode 100644 index 00000000..cd426860 --- /dev/null +++ b/threadpool/console-new/src/page/item/service.ts @@ -0,0 +1,75 @@ +import request from '@/utils'; + +const fetchItemList = async ( + pageProps: { current: number; pageSize: number }, + formData: { tencent: string | number } +): Promise<{ total: number; list: Array }> => { + const res: any = await request('/hippo4j/v1/cs/item/query/page', { + method: 'POST', + headers: { + Authorization: + 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI3LGJhb3hpbnlpX2FkbWluIiwiaXNzIjoiYWRtaW4iLCJleHAiOjE2OTUzOTg4NDksImlhdCI6MTY5NDc5NDA0OSwicm9sIjoiUk9MRV9BRE1JTiJ9.syRDshKpd-xETsSdeMPRtk956f4BJkPt4utVsUl4smgH71Woj8SUq4w2RX1YtGTC4aTZRJYdKOfkTqwK0g_dHQ', + cookie: + 'Admin-Token=Bearer%20eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI3LGJhb3hpbnlpX2FkbWluIiwiaXNzIjoiYWRtaW4iLCJleHAiOjE2OTUzOTg4NDksImlhdCI6MTY5NDc5NDA0OSwicm9sIjoiUk9MRV9BRE1JTiJ9.syRDshKpd-xETsSdeMPRtk956f4BJkPt4utVsUl4smgH71Woj8SUq4w2RX1YtGTC4aTZRJYdKOfkTqwK0g_dHQ; userName=baoxinyi_admin', + }, + body: { + ...formData, + current: pageProps.current, + size: pageProps.pageSize, + desc: true, + }, + }); + if (res && res.success) { + return { + total: res.data.total, + list: res.data.records.map((item: any, index: number) => ({ index: index + 1, ...item })), + }; + } + throw new Error(res.msg || '服务器开小差啦~'); +}; + +const fetchAddTenant = async (params: { + itemDesc: string; // 项目简介 + itemId: string; // 项目 + itemName: string; // 项目名称 + owner: string; // 负责人 + tenantId: string; // 租户 + tenantDesc?: string; + tenantName?: string; +}) => { + const res = await request('/hippo4j/v1/cs/tenant/save', { + method: 'POST', + body: { ...params }, + }); + + if (res && res.success) { + return res; + } + throw new Error(res.msg || '服务器开小差啦~'); +}; + +const fetchDeleteItem = async (id: string) => { + const url = 'hippo4j/v1/cs/item/delete/prescription/' + id; + const res = await request(url, { + method: 'DELETE', + }); + + if (res && res.success) { + return res; + } + throw new Error(res.msg || '服务器开小差啦~'); +}; + +const fetchUpdateItem = async (id: string) => { + const res = await request('/hippo4j/v1/cs/item/update', { + method: 'POST', + params: { id }, + }); + + if (res && res.success) { + return res; + } + throw new Error(res.msg || '服务器开小差啦~'); +}; + +export { fetchItemList, fetchAddTenant, fetchDeleteItem, fetchUpdateItem }; diff --git a/threadpool/console-new/src/page/log/index.module.less b/threadpool/console-new/src/page/log/index.module.less new file mode 100644 index 00000000..5f59dc72 --- /dev/null +++ b/threadpool/console-new/src/page/log/index.module.less @@ -0,0 +1,5 @@ +.tenant_wrapper { + .opreate_btn { + padding: 0px; + } +} \ No newline at end of file diff --git a/threadpool/console-new/src/page/log/index.tsx b/threadpool/console-new/src/page/log/index.tsx new file mode 100644 index 00000000..a7c0b23f --- /dev/null +++ b/threadpool/console-new/src/page/log/index.tsx @@ -0,0 +1,120 @@ +import { useAntdTable } from 'ahooks'; +import { Button, Form, Input, Row, Space, Table, Col, Modal } from 'antd'; +import { SearchOutlined, EditOutlined } from '@ant-design/icons'; +import React, { useState } from 'react'; +import { fetchTenantList } from './service'; +import { useUrlSet } from '@/hooks/useUrlSet'; +import style from './index.module.less'; + +const baseColumns = [ + { + title: '序号', + dataIndex: 'id', + }, + { + title: '租户', + dataIndex: 'tenantId', + }, + { + title: '租户名称', + dataIndex: 'tenantName', + }, + { + title: '负责人', + dataIndex: 'owner', + }, + { + title: '修改时间', + dataIndex: 'gmtModified', + }, +]; + +const Tenant: React.FC = () => { + const [editVisible, setEditVisible] = useState(false); + const [type, setType] = useState('add'); + const [form] = Form.useForm(); + const { setUrl } = useUrlSet({ form }); + const { tableProps, search } = useAntdTable(fetchTenantList, { form }); + // const {run: delete} = useRequest(fetchDeleteTenant, { manual: true }); + const actions = (type: string, item?: any) => { + switch (type) { + case 'add': + setEditVisible(true); + break; + case 'edit': + setEditVisible(true); + break; + case 'delete': + // handleDelete(); + break; + default: + break; + } + }; + const handleSearch = () => { + setUrl(); + search.submit(); + }; + // const handleDelete = (item: any) => { + // Modal.confirm({ + // title: `此操作将删除${item.tenantName}, 是否继续?`, + // onOk: () => { + // search.submit(); + // }, + // }); + // }; + + return ( +
+
+ +
+ + + + + + + + + + + + + + + + +
{ + return ( + + + + + ); + }, + }, + ]} + /> + + ); +}; + +export default Tenant; diff --git a/threadpool/console-new/src/page/log/router.tsx b/threadpool/console-new/src/page/log/router.tsx new file mode 100644 index 00000000..d778e8be --- /dev/null +++ b/threadpool/console-new/src/page/log/router.tsx @@ -0,0 +1,8 @@ +import { lazy } from 'react'; +import { IRouterList } from '@/typings'; + +const LogManage = lazy(() => import('./index')); + +const routerList: IRouterList[] = [{ path: '/log', component: () => }]; + +export default routerList; diff --git a/threadpool/console-new/src/page/log/service.ts b/threadpool/console-new/src/page/log/service.ts new file mode 100644 index 00000000..2fab1ef7 --- /dev/null +++ b/threadpool/console-new/src/page/log/service.ts @@ -0,0 +1,79 @@ +import request from '@/utils'; + +const fetchTenantList = async ( + pageProps: { current: number; pageSize: number }, + formData: { tencent: string | number } +): Promise<{ total: number; list: Array }> => { + const res: any = await request('/hippo4j/v1/cs/tenant/query/page', { + method: 'POST', + headers: { + Authorization: + 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI3LGJhb3hpbnlpX2FkbWluIiwiaXNzIjoiYWRtaW4iLCJleHAiOjE2OTUzOTg4NDksImlhdCI6MTY5NDc5NDA0OSwicm9sIjoiUk9MRV9BRE1JTiJ9.syRDshKpd-xETsSdeMPRtk956f4BJkPt4utVsUl4smgH71Woj8SUq4w2RX1YtGTC4aTZRJYdKOfkTqwK0g_dHQ', + cookie: + 'Admin-Token=Bearer%20eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI3LGJhb3hpbnlpX2FkbWluIiwiaXNzIjoiYWRtaW4iLCJleHAiOjE2OTUzOTg4NDksImlhdCI6MTY5NDc5NDA0OSwicm9sIjoiUk9MRV9BRE1JTiJ9.syRDshKpd-xETsSdeMPRtk956f4BJkPt4utVsUl4smgH71Woj8SUq4w2RX1YtGTC4aTZRJYdKOfkTqwK0g_dHQ; userName=baoxinyi_admin', + }, + body: { + ...formData, + current: pageProps.current, + size: pageProps.pageSize, + desc: true, + }, + }); + if (res && res.success) { + return { + total: res.data.total, + list: res.data.records, + }; + } + throw new Error(res.msg || '服务器开小差啦~'); +}; + +const fetchAddTenant = async (id: string) => { + const res = await request('/hippo4j/v1/cs/tenant/save', { + method: 'POST', + params: { id }, + }); + + if (res && res.success) { + return res; + } + throw new Error(res.msg || '服务器开小差啦~'); +}; + +const fetchDeleteTenant = async (id: string) => { + const res = await request('/tenants', { + method: 'POST', + params: { id }, + }); + + if (res && res.success) { + return res; + } + throw new Error(res.msg || '服务器开小差啦~'); +}; + +const fetchUpdateTenant = async (id: string) => { + const res = await request('hippo4j/v1/cs/tenant/update', { + method: 'POST', + params: { id }, + }); + + if (res && res.success) { + return res; + } + throw new Error(res.msg || '服务器开小差啦~'); +}; + +const fetchTenantDetail = async (id: string) => { + const res = await request('/tenants', { + method: 'POST', + params: { id }, + }); + + if (res && res.success) { + return res; + } + throw new Error(res.msg || '服务器开小差啦~'); +}; + +export { fetchTenantList, fetchAddTenant, fetchDeleteTenant, fetchUpdateTenant, fetchTenantDetail }; diff --git a/threadpool/console-new/src/page/tenant/index.module.less b/threadpool/console-new/src/page/tenant/index.module.less new file mode 100644 index 00000000..5f59dc72 --- /dev/null +++ b/threadpool/console-new/src/page/tenant/index.module.less @@ -0,0 +1,5 @@ +.tenant_wrapper { + .opreate_btn { + padding: 0px; + } +} \ No newline at end of file diff --git a/threadpool/console-new/src/page/tenant/index.tsx b/threadpool/console-new/src/page/tenant/index.tsx index cecb767e..0d80beff 100644 --- a/threadpool/console-new/src/page/tenant/index.tsx +++ b/threadpool/console-new/src/page/tenant/index.tsx @@ -1,16 +1,20 @@ -import { useAntdTable } from 'ahooks'; -import { Button, Form, Input, Row, Space, Table, Col } from 'antd'; import React, { useState } from 'react'; +import { useAntdTable } from 'ahooks'; +import { Button, Form, Input, Row, Space, Table, Col, Modal } from 'antd'; +import { SearchOutlined, EditOutlined } from '@ant-design/icons'; +import { useUrlSet } from '@/hooks/useUrlSet'; import { fetchTenantList } from './service'; +import style from './index.module.less'; + const baseColumns = [ { title: '序号', - dataIndex: 'num', + dataIndex: 'id', }, { title: '租户', - dataIndex: 'tenant', + dataIndex: 'tenantId', }, { title: '租户名称', @@ -18,53 +22,78 @@ const baseColumns = [ }, { title: '负责人', - dataIndex: 'creator', + dataIndex: 'owner', }, { title: '修改时间', - dataIndex: 'data', + dataIndex: 'gmtModified', }, ]; const Tenant: React.FC = () => { const [editVisible, setEditVisible] = useState(false); + const [type, setType] = useState('add'); const [form] = Form.useForm(); + const { setUrl } = useUrlSet({ form }); const { tableProps, search } = useAntdTable(fetchTenantList, { form }); - const actions = (type: string) => { + // const {run: delete} = useRequest(fetchDeleteTenant, { manual: true }); + const actions = (type: string, item?: any) => { switch (type) { - case 'create': + case 'add': setEditVisible(true); break; case 'edit': setEditVisible(true); break; case 'delete': + // handleDelete(); break; default: break; } }; + const handleSearch = () => { + setUrl(); + search.submit(); + }; + // const handleDelete = (item: any) => { + // Modal.confirm({ + // title: `此操作将删除${item.tenantName}, 是否继续?`, + // onOk: () => { + // search.submit(); + // }, + // }); + // }; return ( -
-
+
+
- + - - + + + + + +
{ render: (text: string, record: any) => { return ( - - + + ); }, diff --git a/threadpool/console-new/src/page/tenant/service.ts b/threadpool/console-new/src/page/tenant/service.ts index a8b16d3d..2fab1ef7 100644 --- a/threadpool/console-new/src/page/tenant/service.ts +++ b/threadpool/console-new/src/page/tenant/service.ts @@ -3,44 +3,77 @@ import request from '@/utils'; const fetchTenantList = async ( pageProps: { current: number; pageSize: number }, formData: { tencent: string | number } -) => { - // mock request - return { - total: 3, - list: [ - { - num: '1', - tenant: 'admin', - tenantName: 'admin', - creator: 'admin', - data: 'admin', - }, - ], - }; - const res = await request('/tenants', { +): Promise<{ total: number; list: Array }> => { + const res: any = await request('/hippo4j/v1/cs/tenant/query/page', { method: 'POST', - params: { + headers: { + Authorization: + 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI3LGJhb3hpbnlpX2FkbWluIiwiaXNzIjoiYWRtaW4iLCJleHAiOjE2OTUzOTg4NDksImlhdCI6MTY5NDc5NDA0OSwicm9sIjoiUk9MRV9BRE1JTiJ9.syRDshKpd-xETsSdeMPRtk956f4BJkPt4utVsUl4smgH71Woj8SUq4w2RX1YtGTC4aTZRJYdKOfkTqwK0g_dHQ', + cookie: + 'Admin-Token=Bearer%20eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI3LGJhb3hpbnlpX2FkbWluIiwiaXNzIjoiYWRtaW4iLCJleHAiOjE2OTUzOTg4NDksImlhdCI6MTY5NDc5NDA0OSwicm9sIjoiUk9MRV9BRE1JTiJ9.syRDshKpd-xETsSdeMPRtk956f4BJkPt4utVsUl4smgH71Woj8SUq4w2RX1YtGTC4aTZRJYdKOfkTqwK0g_dHQ; userName=baoxinyi_admin', + }, + body: { ...formData, - pageNum: pageProps.current, - pageSize: pageProps.pageSize, + current: pageProps.current, + size: pageProps.pageSize, + desc: true, }, }); - if (res && res.success) { return { - total: 3, - list: [ - { - num: '1', - tenant: 'admin', - tenantName: 'admin', - creator: 'admin', - data: 'admin', - }, - ], + total: res.data.total, + list: res.data.records, }; } - throw new Error(res.msg || '接口异常'); + throw new Error(res.msg || '服务器开小差啦~'); +}; + +const fetchAddTenant = async (id: string) => { + const res = await request('/hippo4j/v1/cs/tenant/save', { + method: 'POST', + params: { id }, + }); + + if (res && res.success) { + return res; + } + throw new Error(res.msg || '服务器开小差啦~'); +}; + +const fetchDeleteTenant = async (id: string) => { + const res = await request('/tenants', { + method: 'POST', + params: { id }, + }); + + if (res && res.success) { + return res; + } + throw new Error(res.msg || '服务器开小差啦~'); +}; + +const fetchUpdateTenant = async (id: string) => { + const res = await request('hippo4j/v1/cs/tenant/update', { + method: 'POST', + params: { id }, + }); + + if (res && res.success) { + return res; + } + throw new Error(res.msg || '服务器开小差啦~'); +}; + +const fetchTenantDetail = async (id: string) => { + const res = await request('/tenants', { + method: 'POST', + params: { id }, + }); + + if (res && res.success) { + return res; + } + throw new Error(res.msg || '服务器开小差啦~'); }; -export { fetchTenantList }; +export { fetchTenantList, fetchAddTenant, fetchDeleteTenant, fetchUpdateTenant, fetchTenantDetail }; diff --git a/threadpool/console-new/src/page/user/index.module.less b/threadpool/console-new/src/page/user/index.module.less new file mode 100644 index 00000000..5f59dc72 --- /dev/null +++ b/threadpool/console-new/src/page/user/index.module.less @@ -0,0 +1,5 @@ +.tenant_wrapper { + .opreate_btn { + padding: 0px; + } +} \ No newline at end of file diff --git a/threadpool/console-new/src/page/user/index.tsx b/threadpool/console-new/src/page/user/index.tsx new file mode 100644 index 00000000..fb2504fd --- /dev/null +++ b/threadpool/console-new/src/page/user/index.tsx @@ -0,0 +1,120 @@ +import { useAntdTable } from 'ahooks'; +import { Button, Form, Input, Row, Space, Table, Col } from 'antd'; +import { SearchOutlined, EditOutlined } from '@ant-design/icons'; +import React, { useState } from 'react'; +import { fetchUserList } from './service'; +import { useUrlSet } from '@/hooks/useUrlSet'; +import style from './index.module.less'; + +const baseColumns = [ + { + title: '序号', + dataIndex: 'index', + }, + { + title: '用户名', + dataIndex: 'userName', + }, + { + title: '角色', + dataIndex: 'role', + }, + { + title: '创建时间', + dataIndex: 'gmtCreate', + }, + { + title: '修改时间', + dataIndex: 'gmtModified', + }, +]; + +const Tenant: React.FC = () => { + const [editVisible, setEditVisible] = useState(false); + const [type, setType] = useState('add'); + const [form] = Form.useForm(); + const { setUrl } = useUrlSet({ form }); + const { tableProps, search } = useAntdTable(fetchUserList, { form }); + // const {run: delete} = useRequest(fetchDeleteTenant, { manual: true }); + const actions = (type: string, item?: any) => { + switch (type) { + case 'add': + setEditVisible(true); + break; + case 'edit': + setEditVisible(true); + break; + case 'delete': + // handleDelete(); + break; + default: + break; + } + }; + const handleSearch = () => { + setUrl(); + search.submit(); + }; + // const handleDelete = (item: any) => { + // Modal.confirm({ + // title: `此操作将删除${item.tenantName}, 是否继续?`, + // onOk: () => { + // search.submit(); + // }, + // }); + // }; + + return ( +
+
+ +
+ + + + + + + + + + + + + + + + +
{ + return ( + + + + + ); + }, + }, + ]} + /> + + ); +}; + +export default Tenant; diff --git a/threadpool/console-new/src/page/user/router.tsx b/threadpool/console-new/src/page/user/router.tsx new file mode 100644 index 00000000..a84862be --- /dev/null +++ b/threadpool/console-new/src/page/user/router.tsx @@ -0,0 +1,8 @@ +import { lazy } from 'react'; +import { IRouterList } from '@/typings'; + +const UserManage = lazy(() => import('./index')); + +const routerList: IRouterList[] = [{ path: '/user', component: () => }]; + +export default routerList; diff --git a/threadpool/console-new/src/page/user/service.ts b/threadpool/console-new/src/page/user/service.ts new file mode 100644 index 00000000..51e68bff --- /dev/null +++ b/threadpool/console-new/src/page/user/service.ts @@ -0,0 +1,78 @@ +import request from '@/utils'; + +const fetchUserList = async ( + pageProps: { current: number; pageSize: number }, + formData: { tencent: string | number } +): Promise<{ total: number; list: Array }> => { + const res: any = await request('/hippo4j/v1/cs/auth/users/page', { + method: 'POST', + headers: { + Authorization: + 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI3LGJhb3hpbnlpX2FkbWluIiwiaXNzIjoiYWRtaW4iLCJleHAiOjE2OTUzOTg4NDksImlhdCI6MTY5NDc5NDA0OSwicm9sIjoiUk9MRV9BRE1JTiJ9.syRDshKpd-xETsSdeMPRtk956f4BJkPt4utVsUl4smgH71Woj8SUq4w2RX1YtGTC4aTZRJYdKOfkTqwK0g_dHQ', + cookie: + 'Admin-Token=Bearer%20eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI3LGJhb3hpbnlpX2FkbWluIiwiaXNzIjoiYWRtaW4iLCJleHAiOjE2OTUzOTg4NDksImlhdCI6MTY5NDc5NDA0OSwicm9sIjoiUk9MRV9BRE1JTiJ9.syRDshKpd-xETsSdeMPRtk956f4BJkPt4utVsUl4smgH71Woj8SUq4w2RX1YtGTC4aTZRJYdKOfkTqwK0g_dHQ; userName=baoxinyi_admin', + }, + body: { + ...formData, + current: pageProps.current, + size: pageProps.pageSize, + }, + }); + if (res && res.success) { + return { + total: res.data.total, + list: res.data.records.map((item: any, index: number) => ({ index: index + 1, ...item })), + }; + } + throw new Error(res.msg || '服务器开小差啦~'); +}; + +const fetchAddTenant = async (id: string) => { + const res = await request('/hippo4j/v1/cs/tenant/save', { + method: 'POST', + params: { id }, + }); + + if (res && res.success) { + return res; + } + throw new Error(res.msg || '服务器开小差啦~'); +}; + +const fetchDeleteTenant = async (id: string) => { + const res = await request('/tenants', { + method: 'POST', + params: { id }, + }); + + if (res && res.success) { + return res; + } + throw new Error(res.msg || '服务器开小差啦~'); +}; + +const fetchUpdateTenant = async (id: string) => { + const res = await request('hippo4j/v1/cs/tenant/update', { + method: 'POST', + params: { id }, + }); + + if (res && res.success) { + return res; + } + throw new Error(res.msg || '服务器开小差啦~'); +}; + +const fetchTenantDetail = async (id: string) => { + const res = await request('/tenants', { + method: 'POST', + params: { id }, + }); + + if (res && res.success) { + return res; + } + throw new Error(res.msg || '服务器开小差啦~'); +}; + +export { fetchUserList, fetchAddTenant, fetchDeleteTenant, fetchUpdateTenant, fetchTenantDetail }; diff --git a/threadpool/console-new/src/route/index.tsx b/threadpool/console-new/src/route/index.tsx index 8f0f3c93..7a2d8897 100644 --- a/threadpool/console-new/src/route/index.tsx +++ b/threadpool/console-new/src/route/index.tsx @@ -3,6 +3,9 @@ import homeRouter from '@/page/home/router'; import aboutRouter from '@/page/about/router'; import ThreadPoolRouter from '@/page/thread-pool/router'; import tenantRouter from '@/page/tenant/router'; +// import itemRouter from '@/page/item/router'; +// import userRouter from '@/page/user/router'; +// import logRouter from '@/page/log/router'; const routerList: IRouterList[] = [...homeRouter, ...aboutRouter, ...tenantRouter, ...ThreadPoolRouter]; export default routerList; diff --git a/threadpool/console-new/src/utils/common/index.ts b/threadpool/console-new/src/utils/common/index.ts index 8085a28c..2fd348e0 100644 --- a/threadpool/console-new/src/utils/common/index.ts +++ b/threadpool/console-new/src/utils/common/index.ts @@ -1,3 +1,5 @@ +import _ from 'lodash'; + // is plain object const isPlainObject = (obj: { [key: string]: any }): boolean => { let proto, Ctor; @@ -8,4 +10,31 @@ const isPlainObject = (obj: { [key: string]: any }): boolean => { return typeof Ctor === 'function' && Ctor === Object; // insure is new by Object or {} }; -export { isPlainObject }; +/** + * @description 忽略 object 中 value 为空的元素 + * @param obj + * @returns + */ +const filterEmptyField = (obj: { [key: string]: any }) => { + return _.omitBy(obj, isEmpty); +}; + +/** + * @description 判断基本类型是否为空 + * @param value + * @returns + */ +const isNilValue = (value: any) => { + return value === undefined || value === '' || value === null || Number.isNaN(value); +}; + +/** + * @description 判断对值「基本类型/对象」是否为空 + * @param value + * @returns + */ +const isEmpty = (value: any) => { + return typeof value === 'object' ? _.isEmpty(value) : isNilValue(value); +}; + +export { isPlainObject, isEmpty, filterEmptyField }; diff --git a/threadpool/console-new/src/utils/request/index.ts b/threadpool/console-new/src/utils/request/index.ts index 22a2a2c6..9d9a0f13 100644 --- a/threadpool/console-new/src/utils/request/index.ts +++ b/threadpool/console-new/src/utils/request/index.ts @@ -32,7 +32,7 @@ type Response = { code?: string | number; }; -let baseURL = 'http://127.0.0.1:9999'; +let baseURL = 'http://console.hippo4j.cn'; const inital: RequestOptions = { method: 'GET', @@ -104,6 +104,7 @@ function request(url: string, config: RequestOptions): Promise> { method = method.toUpperCase(); responseType = responseType.toUpperCase(); config = { + ...config, method, credentials, responseType, @@ -113,6 +114,7 @@ function request(url: string, config: RequestOptions): Promise> { } else { config.body = null; } + return fetch(url, config as any).then(function onfulfilled(response) { let { status, statusText } = response; if (status >= 200 && status < 400) { diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 2b771a7a..00000000 --- a/yarn.lock +++ /dev/null @@ -1,76 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/runtime@^7.21.0": - version "7.22.15" - resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.22.15.tgz#38f46494ccf6cf020bd4eed7124b425e83e523b8" - integrity sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA== - dependencies: - regenerator-runtime "^0.14.0" - -"@types/js-cookie@^2.x.x": - version "2.2.7" - resolved "https://registry.npmmirror.com/@types/js-cookie/-/js-cookie-2.2.7.tgz#226a9e31680835a6188e887f3988e60c04d3f6a3" - integrity sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA== - -ahooks-v3-count@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/ahooks-v3-count/-/ahooks-v3-count-1.0.0.tgz#ddeb392e009ad6e748905b3cbf63a9fd8262ca80" - integrity sha512-V7uUvAwnimu6eh/PED4mCDjE7tokeZQLKlxg9lCTMPhN+NjsSbtdacByVlR1oluXQzD3MOw55wylDmQo4+S9ZQ== - -ahooks@^3.7.8: - version "3.7.8" - resolved "https://registry.npmmirror.com/ahooks/-/ahooks-3.7.8.tgz#3fa3c491cd153e884a32b0c4192fc72cf84c4332" - integrity sha512-e/NMlQWoCjaUtncNFIZk3FG1ImSkV/JhScQSkTqnftakRwdfZWSw6zzoWSG9OMYqPNs2MguDYBUFFC6THelWXA== - dependencies: - "@babel/runtime" "^7.21.0" - "@types/js-cookie" "^2.x.x" - ahooks-v3-count "^1.0.0" - dayjs "^1.9.1" - intersection-observer "^0.12.0" - js-cookie "^2.x.x" - lodash "^4.17.21" - resize-observer-polyfill "^1.5.1" - screenfull "^5.0.0" - tslib "^2.4.1" - -dayjs@^1.9.1: - version "1.11.9" - resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.9.tgz#9ca491933fadd0a60a2c19f6c237c03517d71d1a" - integrity sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA== - -intersection-observer@^0.12.0: - version "0.12.2" - resolved "https://registry.npmmirror.com/intersection-observer/-/intersection-observer-0.12.2.tgz#4a45349cc0cd91916682b1f44c28d7ec737dc375" - integrity sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg== - -js-cookie@^2.x.x: - version "2.2.1" - resolved "https://registry.npmmirror.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" - integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -regenerator-runtime@^0.14.0: - version "0.14.0" - resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" - integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== - -resize-observer-polyfill@^1.5.1: - version "1.5.1" - resolved "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" - integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== - -screenfull@^5.0.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/screenfull/-/screenfull-5.2.0.tgz#6533d524d30621fc1283b9692146f3f13a93d1ba" - integrity sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA== - -tslib@^2.4.1: - version "2.6.2" - resolved "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==