lina/src/utils/jms.js
2024-11-25 17:16:09 +08:00

193 lines
6.0 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { constantRoutes } from '@/router'
import store from '@/store'
let openedTaskWindow = null // 保存已打开的窗口对象
function openOrReuseWindow(url, windowName = 'task', windowFeatures = '', iWidth = 900, iHeight = 600) {
const iTop = (window.screen.height - 30 - iHeight) / 2
const iLeft = (window.screen.width - 10 - iWidth) / 2
// 检查窗口是否已经打开
if (openedTaskWindow && !openedTaskWindow.closed) {
openedTaskWindow.location.href = url // 如果窗口未关闭,更新其地址
openedTaskWindow.focus() // 将窗口置于前台
} else {
// 如果窗口未打开或已关闭,创建新窗口
openedTaskWindow = window.open(url, windowName, 'height=' + iHeight + ',width=' + iWidth + ',top=' + iTop + ',left=' + iLeft)
}
}
export function openTaskPage(taskId, taskType, taskUrl) {
taskType = taskType || 'celery'
if (!taskUrl) {
taskUrl = `/core/ops/${taskType}/task/${taskId}/log/?type=${taskType}`
}
openOrReuseWindow(taskUrl)
}
export function checkPermission(permsRequired, permsAll) {
if (!permsRequired || permsRequired.length === 0) {
return true
}
if (typeof permsRequired === 'string') {
permsRequired = [permsRequired]
}
return permsRequired.every(perm => {
// 包含 | 是或的关系, 单独处理
if (perm.indexOf('|') === -1) {
return permsAll.includes(perm)
}
const permOr = perm.split('|').map(item => item.trim())
return permOr.some(perm => {
return permsAll.includes(perm)
})
})
}
export function hasPermission(permsRequired) {
const permsAll = store.getters?.currentOrgPerms || []
return checkPermission(permsRequired, permsAll)
}
export function getResourceNameByPath(path) {
const pathSlice = path.split('/')
const pathValue = pathSlice[pathSlice.length - 1]
let resource = pathValue.replaceAll('-', '')
if (resource[resource.length - 1] === 's') {
resource = resource.slice(0, resource.length - 1)
}
return resource
}
export function getResourceFromApiUrl(apiUrl) {
const re = new RegExp('/api/v1/([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)/.*')
const matched = apiUrl.match(re)
if (!matched) {
return { path: '', app: '', resource: '' }
}
const [path, app, resource] = matched
const resourceCleaned = getResourceNameByPath(resource)
const data = { path: path, app: app, resource: resourceCleaned }
return data
}
export function getResourceFromRoute(route) {
const meta = route.meta || {}
if (meta.app && meta.resource) {
return { path: route.path, view: meta.view, app: meta.app, resource: meta.resource }
}
const p = route.path
const re = new RegExp('/([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)')
const matched = p.match(re)
if (!matched) {
return { path: '', view: '', app: '', resource: '' }
}
const [path, view, app, resource] = matched
const resourceCleaned = getResourceNameByPath(resource)
const data = { path: path, view: view, app: app, resource: resourceCleaned }
return data
}
export function getRouteRequiredPerms(route, action) {
const { app, resource } = getResourceFromRoute(route)
return [`${app}.${action}_${resource}`]
}
export function hasActionPerm(route, action) {
const permsRequired = getRouteRequiredPerms(route, action)
return hasPermission(permsRequired)
}
export function getPermedViews() {
// 看不懂,别特么瞎改
// 当用户访问某个 path 时,如果没有权限,应该 404但是我们有个组织切换的功能
// 当用户从 A 组织切换到 B 组织时,如果切换到 B 组织没有权限404 显然不够优雅。
// 当用户访问某个 path 时,会从 path 提取 view判断是否拥有权限
// 如果没有权限,则 自上而下,寻找第一个有权限的 view。
// 这里应该拥有所有 view, 否则刷新页面时,有可能也会跳转
const viewShowMapper = [
['console', store.getters.consoleOrgs.length > 0],
['audit', store.getters.auditOrgs.length > 0],
['workbench', true],
['tickets', hasPermission('tickets.view_ticket')],
['settings', hasPermission('settings.view_setting')],
['pam', store.getters.consoleOrgs.length > 0]
]
return viewShowMapper.filter(i => i[1]).map(i => i[0])
}
export function isSameView(to, from) {
const fromView = from?.path.split('/')[1]
const toView = to?.path.split('/')[1]
return fromView === toView
}
export function getPropView() {
const hasPermedViews = getPermedViews()
const preView = localStorage.getItem('preView')
const hasPerm = hasPermedViews.indexOf(preView) > -1
if (hasPerm) {
return preView
}
const preferView = getPermedViews()[0]
if (preferView) {
return preferView
}
return ''
}
export function getApiUrlRequirePerms(url, action) {
const { app, resource } = getResourceFromApiUrl(url)
return [`${app}.${action}_${resource}`]
}
export function isViewHasOrgs(viewName) {
return getPermedViews().indexOf(viewName) > -1
}
export function getConstRouteName() {
const names = []
const constRoutes = constantRoutes
const addRoutes = (all, routes) => {
for (const route of routes) {
names.push(route.name)
if (route.children) {
addRoutes(all, route.children)
}
}
}
addRoutes(names, constRoutes)
return names
}
export function toM2MJsonParams(attrFilter) {
const encoder = new TextEncoder()
const data = encoder.encode(JSON.stringify(attrFilter))
return ['attr_rules', encodeURIComponent(btoa(String.fromCharCode(...data)))]
}
export function IsSupportPauseSessionType(terminalType) {
const supportedType = ['koko', 'lion', 'chen', 'kael']
return supportedType.includes(terminalType)
}
export function loadPlatformIcon(name, type) {
const platformMap = {
'Huawei': 'huawei',
'Cisco': 'cisco',
'Gateway': 'gateway',
'macOS': 'macos',
'BSD': 'bsd',
'Vmware-vSphere': 'vmware'
}
const value = platformMap[name] || type
try {
return require(`@/assets/img/icons/${value}.png`)
} catch (error) {
return require(`@/assets/img/icons/other.png`)
}
}