perf: merge with remove

This commit is contained in:
ibuler
2022-11-30 15:27:48 +08:00
19 changed files with 172 additions and 117 deletions

View File

@@ -17,6 +17,7 @@
"date_created": "Date created", "date_created": "Date created",
"created_by": "Created by", "created_by": "Created by",
"host": "Asset", "host": "Asset",
"account": "Account",
"system_user": "System user", "system_user": "System user",
"username_group": "Username group", "username_group": "Username group",
"hostname_group": "Hostname group", "hostname_group": "Hostname group",
@@ -595,6 +596,23 @@
"CurrentConnections": "Current connections", "CurrentConnections": "Current connections",
"TodayFailedConnections": "Connections failed today", "TodayFailedConnections": "Connections failed today",
"OnlineSessions": "Online sessions", "OnlineSessions": "Online sessions",
"RealTimeData": "Real-time data",
"UserAssetActivity": "User/Asset activity",
"UserData": "User data",
"LoginUserToday": "Login user today",
"AssetData": "Asset data",
"LoginAssetToday": "Active assets today",
"WeekAdd": "New this week",
"ProportionOfAssetTypes": "Proportion of asset types",
"Proportion": "Proportion",
"LoginUserRanking": "Login user ranking",
"ActiveAssetRanking": "Active asset ranking",
"AssetName": "Asset name",
"NumberOfVisits": "Number of visits",
"ranking": "Ranking",
"Today": "Today",
"Last7Days": "Last 7 days",
"Last30Days": "Last30 days",
"OnlineUsers": "Online users", "OnlineUsers": "Online users",
"ConnectUsers": "Connect users", "ConnectUsers": "Connect users",
"TimesWeekUnit": "times/week", "TimesWeekUnit": "times/week",

View File

@@ -20,6 +20,7 @@
"date_created": "時間の作成", "date_created": "時間の作成",
"created_by": "作成者", "created_by": "作成者",
"host": "資産情報", "host": "資産情報",
"account": "アカウント情報",
"users": "ユーザー", "users": "ユーザー",
"system_user": "システムユーザー", "system_user": "システムユーザー",
"username_group": "ユーザー名", "username_group": "ユーザー名",
@@ -606,6 +607,23 @@
"CurrentConnections": "現在の接続数", "CurrentConnections": "現在の接続数",
"TodayFailedConnections": "今日の接続に失敗しました", "TodayFailedConnections": "今日の接続に失敗しました",
"OnlineSessions": "オンラインセッション", "OnlineSessions": "オンラインセッション",
"RealTimeData": "リアルタイムデータ",
"UserAssetActivity": "ユーザー/資産のアクティブ化",
"UserData": "ユーザデータ",
"LoginUserToday": "今日のログインユーザー数",
"AssetData": "資産データ",
"LoginAssetToday": "今日のアクティブ資産数",
"WeekAdd": "今週の追加",
"ProportionOfAssetTypes": "資産タイプの割合",
"Proportion": "占有率",
"LoginUserRanking": "ログインユーザーランキング",
"ActiveAssetRanking": "アクティブ資産ランキング",
"AssetName": "資産名",
"NumberOfVisits": "アクセス回数",
"ranking": "ランキング",
"Today": "今日",
"Last7Days": "7日",
"Last30Days": "30日",
"OnlineUsers": "オンラインユーザー", "OnlineUsers": "オンラインユーザー",
"ConnectUsers": "ユーザーの接続", "ConnectUsers": "ユーザーの接続",
"TimesWeekUnit": "回/週", "TimesWeekUnit": "回/週",

View File

@@ -20,6 +20,7 @@
"date_created": "创建时间", "date_created": "创建时间",
"created_by": "创建者", "created_by": "创建者",
"host": "资产信息", "host": "资产信息",
"account": "账号信息",
"users": "用户", "users": "用户",
"system_user": "系统用户", "system_user": "系统用户",
"username_group": "用户名", "username_group": "用户名",
@@ -627,6 +628,23 @@
"CurrentConnections": "当前连接数", "CurrentConnections": "当前连接数",
"TodayFailedConnections": "今日连接失败数", "TodayFailedConnections": "今日连接失败数",
"OnlineSessions": "在线会话数", "OnlineSessions": "在线会话数",
"RealTimeData": "实时数据",
"UserAssetActivity": "用户/资产活跃情况",
"UserData": "用户数据",
"LoginUserToday": "今日登录用户数",
"AssetData": "资产数据",
"LoginAssetToday": "今日活跃资产数",
"WeekAdd": "本周新增",
"ProportionOfAssetTypes": "资产类型占比",
"Proportion": "占比",
"LoginUserRanking": "登录用户排名",
"ActiveAssetRanking": "活跃资产排名",
"AssetName": "资产名称",
"NumberOfVisits": "访问次数",
"ranking": "排名",
"Today": "今天",
"Last7Days": "近7天",
"Last30Days": "近30天",
"OnlineUsers": "在线用户", "OnlineUsers": "在线用户",
"ConnectUsers": "连接用户", "ConnectUsers": "连接用户",
"TimesWeekUnit": "次/周", "TimesWeekUnit": "次/周",

View File

@@ -32,6 +32,7 @@
<el-menu <el-menu
class="left-menu" class="left-menu"
:default-active="activeMenu" :default-active="activeMenu"
:default-openeds="defaultOpensMenu"
:collapse="isCollapse" :collapse="isCollapse"
:background-color="variables['menuBg']" :background-color="variables['menuBg']"
:text-color="variables['menuText']" :text-color="variables['menuText']"
@@ -75,6 +76,7 @@ export default {
computed: { computed: {
...mapGetters([ ...mapGetters([
'currentViewRoute', 'currentViewRoute',
'defaultOpensMenu',
'sidebar' 'sidebar'
]), ]),
activeMenu() { activeMenu() {
@@ -150,15 +152,18 @@ export default {
.switch-view { .switch-view {
position: absolute; position: absolute;
top: 50%; top: 50%;
right: 0; right: 16px;
transform: translateY(-50%); transform: translateY(-50%);
z-index: 1; z-index: 1;
padding: 3px;
line-height: 10px;
border-radius: 3px;
&:hover { &:hover {
color: var(--color-primary); background: var(--menu-hover)!important;
} }
.icon { .icon {
margin-right: 0!important;
&:hover { &:hover {
color: var(--color-primary); color: var(--color-primary);
} }

View File

@@ -1,44 +0,0 @@
import i18n from '@/i18n/i18n'
import empty from '@/layout/empty'
export default [
{
path: 'host-acl',
component: empty,
redirect: '',
meta: {
title: i18n.t('route.AssetAclList'),
licenseRequired: true,
resource: 'loginassetacl'
},
children: [
{
path: '',
name: 'AssetAclList',
component: () => import('@/views/acl/AssetAcl/AssetAclList'),
meta: { title: i18n.t('route.AssetAclList') }
},
{
path: 'create',
name: 'AssetAclCreate',
component: () => import('@/views/acl/AssetAcl/AssetAclCreateUpdate'),
hidden: true,
meta: { title: i18n.t('route.AssetAclCreate') }
},
{
path: ':id',
name: 'AssetAclDetail',
component: () => import('@/views/acl/AssetAcl/AssetAclDetail'),
hidden: true,
meta: { title: i18n.t('route.AssetAclDetail') }
},
{
path: ':id/update',
name: 'AssetAclUpdate',
component: () => import('@/views/acl/AssetAcl/AssetAclCreateUpdate'),
hidden: true,
meta: { title: i18n.t('route.AssetAclUpdate') }
}
]
}
]

View File

@@ -7,7 +7,6 @@ import UsersRoute from './users'
import AssetsRoute from './assets' import AssetsRoute from './assets'
import PermsRoute from './perms' import PermsRoute from './perms'
import TaskRoutes from './tasks' import TaskRoutes from './tasks'
import AclRoutes from './acls'
import AccountRoutes from './accounts' import AccountRoutes from './accounts'
export default { export default {
@@ -76,17 +75,6 @@ export default {
}, },
children: PermsRoute children: PermsRoute
}, },
{
path: '/console/acls',
component: empty,
name: 'Acl',
meta: {
licenseRequired: true,
title: i18n.t('route.Acl'),
icon: 'lock'
},
children: AclRoutes
},
{ {
path: '/console/tasks', path: '/console/tasks',
component: empty, component: empty,

View File

@@ -38,5 +38,45 @@ export default [
meta: { title: i18n.t('route.AssetPermissionDetail') } meta: { title: i18n.t('route.AssetPermissionDetail') }
} }
] ]
},
{
path: 'host-acls',
component: empty,
redirect: '',
meta: {
title: i18n.t('route.AssetAclList'),
licenseRequired: true,
app: 'acls',
resource: 'loginassetacl'
},
children: [
{
path: '',
name: 'AssetAclList',
component: () => import('@/views/acl/AssetAcl/AssetAclList'),
meta: { title: i18n.t('route.AssetAclList') }
},
{
path: 'create',
name: 'AssetAclCreate',
component: () => import('@/views/acl/AssetAcl/AssetAclCreateUpdate'),
hidden: true,
meta: { title: i18n.t('route.AssetAclCreate') }
},
{
path: ':id',
name: 'AssetAclDetail',
component: () => import('@/views/acl/AssetAcl/AssetAclDetail'),
hidden: true,
meta: { title: i18n.t('route.AssetAclDetail') }
},
{
path: ':id/update',
name: 'AssetAclUpdate',
component: () => import('@/views/acl/AssetAcl/AssetAclCreateUpdate'),
hidden: true,
meta: { title: i18n.t('route.AssetAclUpdate') }
}
]
} }
] ]

View File

@@ -1,5 +1,6 @@
const getters = { const getters = {
sidebar: state => state.app.sidebar, sidebar: state => state.app.sidebar,
defaultOpensMenu: state => state.app.defaultOpensMenu,
device: state => state.app.device, device: state => state.app.device,
inited: state => state.app.inited, inited: state => state.app.inited,
isMobile: state => state.app.device === 'mobile', isMobile: state => state.app.device === 'mobile',

View File

@@ -5,6 +5,8 @@ const state = {
opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true, opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
withoutAnimation: false withoutAnimation: false
}, },
// 默认需要展开的菜单
defaultOpensMenu: ['/audit/sessions', '/audit/logs', '/workbench/ops'],
device: 'desktop', device: 'desktop',
inited: false inited: false
} }

View File

@@ -14,24 +14,23 @@ export default {
return { return {
initial: { initial: {
action: 'login_confirm', action: 'login_confirm',
system_users: {
name_group: '*',
protocol_group: '*',
username_group: '*'
},
users: { users: {
username_group: '*' username_group: '*'
}, },
assets: { assets: {
hostname_group: '*', hostname_group: '*',
ip_group: '*' ip_group: '*'
},
accounts: {
name_group: '*',
username_group: '*'
} }
}, },
fields: [ fields: [
[this.$t('common.Basic'), ['name', 'priority']], [this.$t('common.Basic'), ['name', 'priority']],
[this.$t('acl.users'), ['users']], [this.$t('acl.users'), ['users']],
[this.$t('acl.host'), ['assets']], [this.$t('acl.host'), ['assets']],
[this.$t('acl.system_user'), ['system_users']], [this.$t('acl.account'), ['accounts']],
[this.$t('acl.action'), ['action', 'reviewers']], [this.$t('acl.action'), ['action', 'reviewers']],
[this.$t('common.Other'), ['is_active', 'comment']] [this.$t('common.Other'), ['is_active', 'comment']]
], ],
@@ -48,8 +47,8 @@ export default {
} }
}, },
system_users: { accounts: {
fields: ['name_group', 'username_group', 'protocol_group'] fields: ['name_group', 'username_group']
}, },
reviewers: { reviewers: {
el: { el: {
@@ -67,9 +66,8 @@ export default {
afterGetFormValue(formValue) { afterGetFormValue(formValue) {
formValue.assets.ip_group = formValue.assets.ip_group.toString() formValue.assets.ip_group = formValue.assets.ip_group.toString()
formValue.assets.hostname_group = formValue.assets.hostname_group.toString() formValue.assets.hostname_group = formValue.assets.hostname_group.toString()
formValue.system_users.name_group = formValue.system_users.name_group.toString() formValue.accounts.name_group = formValue.accounts.name_group.toString()
formValue.system_users.protocol_group = formValue.system_users.protocol_group.toString() formValue.accounts.username_group = formValue.accounts.username_group.toString()
formValue.system_users.username_group = formValue.system_users.username_group.toString()
formValue.users.username_group = formValue.users.username_group.toString() formValue.users.username_group = formValue.users.username_group.toString()
return formValue return formValue
}, },
@@ -80,14 +78,11 @@ export default {
if (!Array.isArray(value.assets.hostname_group)) { if (!Array.isArray(value.assets.hostname_group)) {
value.assets.hostname_group = value.assets.hostname_group ? value.assets.hostname_group.split(',') : [] value.assets.hostname_group = value.assets.hostname_group ? value.assets.hostname_group.split(',') : []
} }
if (!Array.isArray(value.system_users.protocol_group)) { if (!Array.isArray(value.accounts.name_group)) {
value.system_users.protocol_group = value.system_users.protocol_group ? value.system_users.protocol_group.split(',') : [] value.accounts.name_group = value.accounts.name_group ? value.accounts.name_group.split(',') : []
} }
if (!Array.isArray(value.system_users.name_group)) { if (!Array.isArray(value.accounts.username_group)) {
value.system_users.name_group = value.system_users.name_group ? value.system_users.name_group.split(',') : [] value.accounts.username_group = value.accounts.username_group ? value.accounts.username_group.split(',') : []
}
if (!Array.isArray(value.system_users.username_group)) {
value.system_users.username_group = value.system_users.username_group ? value.system_users.username_group.split(',') : []
} }
if (!Array.isArray(value.users.username_group)) { if (!Array.isArray(value.users.username_group)) {
value.users.username_group = value.users.username_group ? value.users.username_group.split(',') : [] value.users.username_group = value.users.username_group ? value.users.username_group.split(',') : []

View File

@@ -18,8 +18,8 @@ export default {
data() { data() {
return { return {
titleConfig: { titleConfig: {
title: '资产类型占比', title: this.$t('dashboard.ProportionOfAssetTypes'),
tip: '资产类型占比' tip: this.$t('dashboard.ProportionOfAssetTypes')
}, },
config: { config: {
data: [] data: []

View File

@@ -26,19 +26,19 @@ export default {
return { return {
userConfig: { userConfig: {
title: '用户数据', title: this.$t('dashboard.UserData'),
tip: '用户数据', tip: this.$t('dashboard.UserData'),
subTitle: '用户总数', subTitle: this.$t('dashboard.UsersTotal'),
color: '#FFD260', color: '#FFD260',
chartTitle: '今日登录用户数', chartTitle: this.$t('dashboard.LoginUserToday'),
data: [] data: []
}, },
assetConfig: { assetConfig: {
title: '资产数据', title: this.$t('dashboard.AssetData'),
tip: '资产数据', tip: this.$t('dashboard.AssetData'),
subTitle: '资产总数', subTitle: this.$t('dashboard.AssetsTotal'),
color: themeColor, color: themeColor,
chartTitle: '今日活跃资产数', chartTitle: this.$t('dashboard.LoginAssetToday'),
data: [] data: []
} }
} }
@@ -57,15 +57,15 @@ export default {
`) `)
const users = [ const users = [
{ name: this.$t('dashboard.ActiveUser'), value: data.total_count_users }, { name: this.$t('dashboard.ActiveUser'), value: data.total_count_users },
{ name: this.$t('dashboard.DisabledUser'), value: data.total_count_today_login_users } { name: this.$t('dashboard.InActiveUser'), value: data.total_count_today_login_users }
] ]
this.$set(this.userConfig, 'data', users) this.$set(this.userConfig, 'data', users)
this.$set(this.userConfig, 'total', data.total_count_users) this.$set(this.userConfig, 'total', data.total_count_users)
this.$set(this.userConfig, 'active', data.total_count_today_login_users) this.$set(this.userConfig, 'active', data.total_count_today_login_users)
this.$set(this.userConfig, 'weekAdd', data.total_count_users_this_week) this.$set(this.userConfig, 'weekAdd', data.total_count_users_this_week)
const assets = [ const assets = [
{ name: this.$t('dashboard.ActiveUser'), value: data.total_count_assets }, { name: this.$t('dashboard.ActiveAsset'), value: data.total_count_assets },
{ name: this.$t('dashboard.DisabledUser'), value: data.total_count_today_active_assets } { name: this.$t('dashboard.InActiveAsset'), value: data.total_count_today_active_assets }
] ]
this.$set(this.assetConfig, 'data', assets) this.$set(this.assetConfig, 'data', assets)
this.$set(this.assetConfig, 'total', data.total_count_assets) this.$set(this.assetConfig, 'total', data.total_count_assets)

View File

@@ -20,34 +20,34 @@ export default {
data() { data() {
return { return {
userConfig: { userConfig: {
title: '登录用户排名', title: this.$t('dashboard.LoginUserRanking'),
url: '/api/v1/index/?dates_login_times_top10_users=1', url: '/api/v1/index/?dates_login_times_top10_users=1',
tip: '登录用户排名', tip: this.$t('dashboard.LoginUserRanking'),
data: 'dates_login_times_top10_users', data: 'dates_login_times_top10_users',
columns: [ columns: [
{ {
prop: 'user', prop: 'user',
label: '用户名' label: this.$t('users.Username')
}, },
{ {
prop: 'total', prop: 'total',
label: '登录次数' label: this.$t('dashboard.LoginCount')
} }
] ]
}, },
assetConfig: { assetConfig: {
title: '活跃资产排名', title: this.$t('dashboard.ActiveAssetRanking'),
url: '/api/v1/index/?dates_login_times_top10_assets=1', url: '/api/v1/index/?dates_login_times_top10_assets=1',
tip: '活跃资产排名', tip: this.$t('dashboard.ActiveAssetRanking'),
data: 'dates_login_times_top10_assets', data: 'dates_login_times_top10_assets',
columns: [ columns: [
{ {
prop: 'asset', prop: 'asset',
label: '资产名称' label: this.$t('dashboard.AssetName')
}, },
{ {
prop: 'total', prop: 'total',
label: '访问次数' label: this.$t('dashboard.NumberOfVisits')
} }
] ]
} }

View File

@@ -8,7 +8,7 @@
<div class="num">{{ config.total }}</div> <div class="num">{{ config.total }}</div>
<div class="add"> <div class="add">
<span class="add-num"> <span class="add-num">
本周新增{{ config.weekAdd }} {{ $tc('dashboard.WeekAdd') }}{{ config.weekAdd }}
<svg-icon icon-class="broken-line" style="font-size: 18px;" /> <svg-icon icon-class="broken-line" style="font-size: 18px;" />
</span> </span>
<span class="add-icon"> <span class="add-icon">

View File

@@ -19,6 +19,7 @@
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
import * as echarts from 'echarts' import * as echarts from 'echarts'
import Title from './Title.vue' import Title from './Title.vue'
import { mix } from '@/utils/theme/color'
export default { export default {
name: 'LoginMetric', name: 'LoginMetric',
@@ -32,8 +33,8 @@ export default {
data: function() { data: function() {
return { return {
config: { config: {
title: '用户/资产活跃情况 ', title: this.$t('dashboard.UserAssetActivity'),
tip: '用户/资产活跃情况 ' tip: this.$t('dashboard.UserAssetActivity')
}, },
dataUrl: '', dataUrl: '',
metricsData: { metricsData: {
@@ -44,14 +45,22 @@ export default {
} }
}, },
computed: { computed: {
themeColor() { mixColors() {
const documentStyle = document.documentElement.style const documentStyle = document.documentElement.style
const primary = documentStyle.getPropertyValue('--color-primary')
const colorValue = primary.replace(/#/g, '')
const TwoLevelColor = mix(colorValue, 'ffffff', 38)
const ThreeLevelColor = mix(colorValue, 'ffffff', 20)
const shadowColor = mix(colorValue, 'ffffff', 1)
return { return {
primary: documentStyle.getPropertyValue('--color-primary') primary,
TwoLevelColor,
ThreeLevelColor,
shadowColor
} }
}, },
options() { options() {
const { primary } = this.themeColor const { primary, TwoLevelColor, ThreeLevelColor, shadowColor } = this.mixColors
return { return {
title: { title: {
show: false show: false
@@ -149,20 +158,20 @@ export default {
1, 1,
[{ [{
offset: 0, offset: 0,
color: 'rgba(50, 220, 182, 0.6)' color: primary
}, { }, {
offset: 0.6, offset: 0.6,
color: 'rgba(50, 220, 182, 0.2)' color: TwoLevelColor
}, },
{ {
offset: 0.8, offset: 0.8,
color: 'rgba(50, 220, 182, 0.1)' color: ThreeLevelColor
} }
], ],
false false
), ),
shadowColor: 'rgba(50, 220, 182, 0.1)', shadowColor: shadowColor,
shadowBlur: 6 shadowBlur: 5
} }
}, },
data: this.metricsData.dates_metrics_total_count_active_users data: this.metricsData.dates_metrics_total_count_active_users

View File

@@ -12,6 +12,8 @@
<script> <script>
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
import * as echarts from 'echarts' import * as echarts from 'echarts'
import { mix } from '@/utils/theme/color'
export default { export default {
props: { props: {
colors: { colors: {
@@ -19,8 +21,10 @@ export default {
default: () => { default: () => {
const documentStyle = document.documentElement.style const documentStyle = document.documentElement.style
const themeColor = documentStyle.getPropertyValue('--color-primary') const themeColor = documentStyle.getPropertyValue('--color-primary')
const colorValue = themeColor.replace(/#/g, '')
const subCOlor = mix(colorValue, 'ffffff', 40)
return [ return [
themeColor, '#B3D6CE', '#F3B44B', 'rgba(243, 180, 75, 0.5)', themeColor, subCOlor, '#F3B44B', 'rgba(243, 180, 75, 0.5)',
'#535C65', 'rgba(83, 92, 101, 0.5)', '#29448A', 'rgba(41, 68, 138, 0.5)' '#535C65', 'rgba(83, 92, 101, 0.5)', '#29448A', 'rgba(41, 68, 138, 0.5)'
] ]
} }

View File

@@ -20,7 +20,7 @@
style="width: 100%" style="width: 100%"
class="table" class="table"
> >
<el-table-column :label="'排名'"> <el-table-column :label="$tc('dashboard.ranking')">
<template v-slot="scope"> <template v-slot="scope">
<span>{{ scope.$index + 1 }}</span> <span>{{ scope.$index + 1 }}</span>
</template> </template>
@@ -55,15 +55,15 @@ export default {
data() { data() {
const defaultOptions = [ const defaultOptions = [
{ {
label: '今天', label: this.$t('dashboard.Today'),
value: '1' value: '1'
}, },
{ {
label: '近7天', label: this.$t('dashboard.Last7Days'),
value: '7' value: '7'
}, },
{ {
label: '近30天', label: this.$t('dashboard.Last30Days'),
value: '30' value: '30'
} }
] ]
@@ -103,6 +103,7 @@ export default {
.switch { .switch {
background: #EFF0F1; background: #EFF0F1;
border-radius: 4px; border-radius: 4px;
padding: 0 4px;
&>>> .el-radio-button { &>>> .el-radio-button {
.el-radio-button__inner { .el-radio-button__inner {
border: none; border: none;

View File

@@ -22,8 +22,8 @@ export default {
data() { data() {
return { return {
config: { config: {
title: '实时数据', title: this.$t('dashboard.RealTimeData'),
tip: '实时数据' tip: this.$t('dashboard.RealTimeData')
}, },
counter: { counter: {
total_count_online_sessions: '.', total_count_online_sessions: '.',

View File

@@ -51,7 +51,7 @@ export default {
fontSize: 24, fontSize: 24,
color: '#646A73' color: '#646A73'
}, },
subtext: '占比' + percentage + '%', subtext: this.$t('dashboard.Proportion') + percentage + '%',
subtextStyle: { subtextStyle: {
fontSize: 12, fontSize: 12,
color: '#646A73' color: '#646A73'