diff --git a/src/api/monitor/session.ts b/src/api/monitor/session.ts new file mode 100644 index 00000000..514e6a70 --- /dev/null +++ b/src/api/monitor/session.ts @@ -0,0 +1,93 @@ +import { + RESULT_CODE_ERROR, + RESULT_CODE_SUCCESS, + RESULT_MSG_ERROR, +} from '@/constants/result-constants'; +import { request } from '@/plugins/http-fetch'; +import { parseObjLineToHump } from '@/utils/parse-utils'; + +/** + * 查询用户会话列表 + * @param query 查询参数 + * @returns object + */ +export async function listSession(query: Record) { + let totalSQL = 'select count(*) as total from session where 1=1 '; + let rowsSQL = 'select * from session where 1=1 '; + + // 查询 + let querySQL = ''; + if (query.accountId) { + querySQL += ` and account_id like '%${query.accountId}%' `; + } + if (query.ip) { + querySQL += ` and host like '%${query.ip}%' `; + } + + // 分页 + const pageNum = (query.pageNum - 1) * query.pageSize; + const limtSql = ` limit ${pageNum},${query.pageSize} `; + + // 排序 + let sortSql = ' order by login_time '; + if (query.sortOrder === 'desc') { + sortSql += ' desc '; + } else { + sortSql += ' asc '; + } + + // 发起请求 + const result = await request({ + url: `/databaseManagement/v1/omc_db/session`, + method: 'get', + params: { + totalSQL: totalSQL + querySQL, + rowsSQL: rowsSQL + querySQL + sortSql + limtSql, + }, + }); + + // 解析数据 + if (result.code === RESULT_CODE_SUCCESS) { + const data: DataList = { + total: 0, + rows: [], + code: result.code, + msg: result.msg, + }; + result.data.data.forEach((item: any) => { + const itemData = item['session']; + if (Array.isArray(itemData)) { + if (itemData.length === 1 && itemData[0]['total']) { + data.total = itemData[0]['total']; + } else { + data.rows = itemData.map(v => parseObjLineToHump(v)); + } + } + }); + return data; + } + return result; +} + +/** + * 强退用户会话 + * @param tokenId 授权标识 + * @returns object + */ +export async function logoutSession(id: string) { + const result = await request({ + url: `/databaseManagement/v1/omc_db/session?WHERE=id='${id}'`, + method: 'delete', + }); + // 解析数据 + if (result.code === RESULT_CODE_SUCCESS && result.data.data) { + let rows = result.data.data.affectedRows; + if (rows) { + delete result.data; + return result; + } else { + return { code: RESULT_CODE_ERROR, msg: RESULT_MSG_ERROR }; + } + } + return result; +} diff --git a/src/i18n/locales/en-US.ts b/src/i18n/locales/en-US.ts index 59c1a0e6..739a9b73 100644 --- a/src/i18n/locales/en-US.ts +++ b/src/i18n/locales/en-US.ts @@ -252,5 +252,20 @@ export default { autoConfirm: 'Automatic confirmation of configuration', }, }, + monitor: { + session: { + userName: "Login account", + userNamePlease: 'Query login account', + ipaddr: "IP address", + ipaddrPlease: 'Query IP address', + loginTime: "Login Time", + shakeTime: "Idle time (minutes)", + status: "Status", + online: "Online", + offline: "Offline", + logoutTip: "Confirm to forcibly log out the user with the login account {num}?", + logoutSuccess: "User {num} has been forcibly retired", + }, + }, }, }; diff --git a/src/i18n/locales/zh-CN.ts b/src/i18n/locales/zh-CN.ts index cdc68c76..91abb6fc 100644 --- a/src/i18n/locales/zh-CN.ts +++ b/src/i18n/locales/zh-CN.ts @@ -252,5 +252,20 @@ export default { autoConfirm: '自动确认配置', }, }, + monitor: { + session: { + userName: "登录账号", + userNamePlease: '查询登录账号', + ipaddr: "IP地址", + ipaddrPlease: '查询IP地址', + loginTime: "登入时间", + shakeTime: "闲置时间(分钟)", + status: "状态", + online: "在线", + offline: "离线", + logoutTip: "确认强退登录账号为 {num} 的用户?", + logoutSuccess: "已强退用户 {num}", + }, + }, }, }; diff --git a/src/utils/date-utils.ts b/src/utils/date-utils.ts index 166669e2..e8ddb298 100644 --- a/src/utils/date-utils.ts +++ b/src/utils/date-utils.ts @@ -60,13 +60,15 @@ export function parseDatePath(date: number | Date = Date.now()): string { * 判断两次时间差 * @param endDate 结束时间 * @param startDate 开始时间 - * @returns 单位秒 + * @param unit 单位 + * @returns 单位数值 */ -export function diffSeconds( - endDate: number | Date, - startDate: number | Date +export function diffValue( + endDate: string | number | Date, + startDate: string | number | Date, + unit: 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'month' | 'year' ): number { - const value = Math.ceil(dayjs(endDate).diff(startDate, 'seconds')); + const value = Math.ceil(dayjs(endDate).diff(startDate, unit)); if (Number.isNaN(value)) return 0; return value; } diff --git a/src/views/monitor/session/index.vue b/src/views/monitor/session/index.vue new file mode 100644 index 00000000..38365d9d --- /dev/null +++ b/src/views/monitor/session/index.vue @@ -0,0 +1,334 @@ + + + + +