mirror of
https://github.com/jumpserver/lina.git
synced 2025-08-14 21:14:15 +00:00
193 lines
6.0 KiB
JavaScript
193 lines
6.0 KiB
JavaScript
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`)
|
||
}
|
||
}
|