diff --git a/orion-visor-ui/src/api/user/user.ts b/orion-visor-ui/src/api/user/user.ts index fbcd1647..2967f8b2 100644 --- a/orion-visor-ui/src/api/user/user.ts +++ b/orion-visor-ui/src/api/user/user.ts @@ -60,10 +60,31 @@ export interface UserQueryResponse extends TableData { roles: Array; } +/** + * 锁定用户查询响应 + */ +export interface LockedUserQueryResponse { + username: string; + address: string; + location: string; + userAgent: string; + expireTime: number; + loginTime: number; +} + +/** + * 解锁用户请求 + */ +export interface UserUnlockRequest { + username: string; +} + /** * 用户会话查询响应 */ export interface UserSessionQueryResponse { + id: number; + username: string; visible: boolean; current: boolean; address: string; @@ -183,10 +204,31 @@ export function batchDeleteUser(idList: Array) { } /** - * 获取用户会话列表 + * 获取锁定的用户列表 + */ +export function getLockedUserList() { + return axios.get>('/infra/system-user/locked/list'); +} + +/** + * 解锁锁定的用户 + */ +export function unlockLockedUser(request: UserUnlockRequest) { + return axios.put('/infra/system-user/locked/unlock', request); +} + +/** + * 获取全部用户会话列表 + */ +export function getUsersSessionList() { + return axios.get>('/infra/system-user/session/users/list'); +} + +/** + * 获取单个用户会话列表 */ export function getUserSessionList(id: number) { - return axios.get>('/infra/system-user/session/list', { params: { id } }); + return axios.get>('/infra/system-user/session/user/list', { params: { id } }); } /** diff --git a/orion-visor-ui/src/views/user/locked-user/index.vue b/orion-visor-ui/src/views/user/locked-user/index.vue new file mode 100644 index 00000000..83b03e00 --- /dev/null +++ b/orion-visor-ui/src/views/user/locked-user/index.vue @@ -0,0 +1,137 @@ + + + + + + + diff --git a/orion-visor-ui/src/views/user/locked-user/types/table.columns.ts b/orion-visor-ui/src/views/user/locked-user/types/table.columns.ts new file mode 100644 index 00000000..c56515b1 --- /dev/null +++ b/orion-visor-ui/src/views/user/locked-user/types/table.columns.ts @@ -0,0 +1,68 @@ +import type { TableColumnData } from '@arco-design/web-vue'; +import { dateFormat } from '@/utils'; + +const columns = [ + { + title: '序号', + dataIndex: 'seq', + slotName: 'seq', + width: 100, + align: 'left', + fixed: 'left', + default: true, + render: ({ rowIndex }) => { + return rowIndex + 1; + }, + }, { + title: '用户名', + dataIndex: 'username', + slotName: 'username', + width: 188, + ellipsis: true, + tooltip: true, + default: true, + }, { + title: '登录IP', + dataIndex: 'address', + slotName: 'address', + minWidth: 228, + default: true, + }, { + title: 'userAgent', + dataIndex: 'userAgent', + slotName: 'userAgent', + minWidth: 328, + ellipsis: true, + tooltip: true, + default: true, + }, { + title: '登录时间', + dataIndex: 'loginTime', + slotName: 'loginTime', + align: 'center', + width: 180, + render: ({ record }) => { + return dateFormat(new Date(record.loginTime)); + }, + default: true, + }, { + title: '解锁时间', + dataIndex: 'expireTime', + slotName: 'expireTime', + align: 'center', + width: 180, + render: ({ record }) => { + return dateFormat(new Date(record.expireTime)); + }, + default: true, + }, { + title: '操作', + slotName: 'handle', + width: 108, + align: 'center', + fixed: 'right', + default: true, + }, +] as TableColumnData[]; + +export default columns;