Compare commits

..

1 Commits

Author SHA1 Message Date
ZhaoJiSen
1ed853e19a Revert "Fixed: Fix the issue of storage failure when updating components."
This reverts commit 2002519f30.
2025-09-15 14:41:01 +08:00
32 changed files with 109 additions and 201 deletions

View File

@@ -16,7 +16,7 @@
<th>{{ $tc('Example') }}</th>
</tr>
<tr v-for="(item, index) in variables" :key="index">
<td :title="$tc('ClickCopy')" class="item-td text-link" @click="onCopy(item.name)">
<td :title="$tc('ClickCopy')" class="item-td text-link" @click="onCopy(item.key)">
<label class="item-label">{{ item.name }}</label>
</td>
<td><span>{{ item.label }}</span></td>

View File

@@ -1,6 +1,6 @@
<template>
<div>
<Echart
<echarts
ref="echarts"
:options="options"
:autoresize="true"
@@ -12,10 +12,9 @@
// eslint-disable-next-line no-unused-vars
import * as echarts from 'echarts'
import { mix } from '@/utils/theme/color'
import Echart from '@/components/Dashboard/Echart.vue'
export default {
components: { Echart },
components: {},
props: {
datesMetrics: {
type: Array,

View File

@@ -34,32 +34,18 @@ export default {
}
},
created() {
if (!window._echarts) {
window._echarts = {
total: new Set(),
finished: new Set()
}
}
// 唯一 id避免重复计数
this._chartId = `chart_${Date.now()}_${Math.random().toString(36).slice(2)}`
window._echarts.total.add(this._chartId)
},
beforeDestroy() {
if (window._echarts) {
window._echarts.total.delete(this._chartId)
window._echarts.finished.delete(this._chartId)
// 可选:当没有图表时清理全局对象
if (window._echarts.total.size === 0) {
delete window._echarts
delete window.echartsFinished
}
if (!window.totalCharts) {
window.totalCharts = 0
}
window.totalCharts++
},
methods: {
onFinished() {
if (!window._echarts) return
window._echarts.finished.add(this._chartId)
if (window._echarts.finished.size === window._echarts.total.size) {
if (!window.finishedCharts) {
window.finishedCharts = 0
}
window.finishedCharts++
if (window.finishedCharts === window.totalCharts) {
window.echartsFinished = true
}
}

View File

@@ -1,6 +1,6 @@
<template>
<div>
<Echart
<echarts
ref="echarts"
:options="options"
:autoresize="true"
@@ -14,11 +14,9 @@
// eslint-disable-next-line no-unused-vars
import * as echarts from 'echarts'
import { mix } from '@/utils/theme/color'
import Echart from '@/components/Dashboard/Echart.vue'
export default {
name: 'LoginMetric',
components: { Echart },
props: {
range: {
type: String,

View File

@@ -1,6 +1,6 @@
<template>
<div>
<Echart
<echarts
ref="echarts"
:options="options"
:autoresize="true"
@@ -13,10 +13,8 @@
// eslint-disable-next-line no-unused-vars
import * as echarts from 'echarts'
import { mix } from '@/utils/theme/color'
import Echart from '@/components/Dashboard/Echart.vue'
export default {
components: { Echart },
props: {
colors: {
type: Array,
@@ -37,15 +35,14 @@ export default {
}
},
data() {
return {}
return {
}
},
computed: {
options() {
const seriesList = []
const labels = this.data.map(item => item.label)
const total = _.sumBy(this.data, function(i) {
return i.total
})
const total = _.sumBy(this.data, function(i) { return i.total })
for (let i = 0, len = this.data.length; i < len; i++) {
const current = this.data[i]
let num = (current.total / total) * 100
@@ -180,8 +177,8 @@ export default {
</script>
<style lang="scss" scoped>
.echarts {
width: 100%;
height: 72px;
}
.echarts {
width: 100%;
height: 72px;
}
</style>

View File

@@ -1,6 +1,6 @@
<template>
<div>
<Echart
<echarts
ref="echarts"
:autoresize="true"
:options="options"
@@ -13,15 +13,12 @@ import 'echarts/lib/chart/line'
import 'echarts/lib/component/legend'
import Decimal from 'decimal.js'
import Echart from '@/components/Dashboard/Echart.vue'
export default {
components: { Echart },
props: {
config: {
type: Object,
default: () => {
}
default: () => {}
}
},
computed: {

View File

@@ -244,12 +244,10 @@ export default {
delete routeFilter.search
}
const asFilterTags = _.cloneDeep(this.filterTags)
setTimeout(() => {
this.filterTags = {
...asFilterTags,
...routeFilter
}
}, 100)
this.filterTags = {
...asFilterTags,
...routeFilter
}
},
getValueLabel(key, value) {
for (const field of this.options) {

View File

@@ -221,7 +221,7 @@ export default {
.dialog-footer {
display: flex;
justify-content: flex-end;
justify-content: end;
align-items: center;
.el-button {

View File

@@ -6,7 +6,6 @@ import ptBrLocale from 'elementui-lts/lib/locale/lang/pt-br'
import esLocale from 'elementui-lts/lib/locale/lang/es'
import ruLocale from 'elementui-lts/lib/locale/lang/ru-RU'
import koLocale from 'elementui-lts/lib/locale/lang/ko'
import viLocale from 'elementui-lts/lib/locale/lang/vi'
import zh from './zh.json'
import zhHant from './zh_hant.json'
import en from './en.json'
@@ -40,9 +39,6 @@ const messages = {
},
ko: {
...koLocale
},
vi: {
...viLocale
}
}

View File

@@ -28,7 +28,7 @@ export default [
component: () => import('@/views/reports/audits/Dashboard.vue'), // Parent router-view
name: 'AuditsReport',
meta: {
permissions: ['rbac.view_audit'],
permissions: ['rbac.view_audits'],
expanded: true,
icon: 'user-o',
title: i18n.t('AuditsReport')

View File

@@ -739,7 +739,3 @@ div.el-loading-parent--relative {
.margin-top-20 {
margin-top: 20px;
}
.el-message {
z-index: 999999 !important;
}

View File

@@ -1,7 +1,7 @@
// 鼠标可移入tooltip功能
import { Table } from 'elementui-lts'
import { getCell, getColumnByCell } from 'elementui-lts/packages/table/src/util'
import { getStyle, hasClass } from 'elementui-lts/src/utils/dom'
import { Table } from 'element-ui'
import { getCell, getColumnByCell } from 'element-ui/packages/table/src/util'
import { getStyle, hasClass } from 'element-ui/src/utils/dom'
import { copy } from '../common/index'
Object.assign(Table.components.TableBody.methods, {

View File

@@ -107,10 +107,6 @@ export default {
data.secret = data[secretType]
delete data[secretType]
}
if (data.ssh_key_change_strategy === 'add') {
data.ssh_key_change_strategy = this.initial.ssh_key_change_strategy
}
return data
}
}

View File

@@ -117,10 +117,6 @@ export default {
data.secret = data[secretType]
delete data[secretType]
}
if (data.ssh_key_change_strategy === 'add') {
data.ssh_key_change_strategy = this.initial.ssh_key_change_strategy
}
return data
}
}

View File

@@ -1,5 +1,4 @@
import i18n from '@/i18n/i18n'
const accountExistCache = new Map()
async function checkAccountExist(username, asset) {
@@ -9,10 +8,9 @@ async function checkAccountExist(username, asset) {
}
const url = `/api/v1/accounts/accounts/?username=${encodeURIComponent(username)}&asset=${asset}`
const data = await this.$axios.get(url)
const results = data
const isExist = results.length > 0
accountExistCache.set(cacheKey, isExist)
return isExist
const result = data.length > 0
accountExistCache.set(cacheKey, result)
return result
}
async function checkAccountsExist() {

View File

@@ -18,13 +18,16 @@ export default {
return {
initial: {},
fields: [
[this.$t('Basic'), ['name']],
[this.$t('Basic'), ['name', 'priority']],
[this.$t('Users'), ['users']],
[this.$t('ConnectMethod'), ['connect_methods']],
[this.$t('Action'), ['action', 'reviewers']],
[this.$t('Other'), ['is_active', 'comment']]
],
fieldsMeta: {
priority: {
rules: [rules.Required]
},
assets: assetJSONSelectMeta(this),
users: userJSONSelectMeta(this, true),
connect_methods: {

View File

@@ -34,7 +34,7 @@ export default {
key: this.$t('Reviewer'),
value: this.object.reviewers.map(item => item.name).join(', ')
},
'date_created', 'created_by', 'comment'
'priority', 'date_created', 'created_by', 'comment'
]
}
},

View File

@@ -17,31 +17,8 @@ export default {
columnsShow: {
min: ['name', 'actions'],
default: [
'name', 'is_active', 'comment', 'actions'
'name', 'priority', 'is_active', 'comment', 'actions'
]
},
columnsMeta: {
'connect_methods': {
width: '240px',
formatter: (row) => {
const methods = Array.isArray(row.connect_methods) ? row.connect_methods : []
const colors = ['success', 'warning', 'info', 'danger']
return (
<div style='display: flex; flex-wrap: wrap; gap: 4px;'>
{methods.map((item, idx) => (
<el-tag
key={idx}
size='small'
type={colors[idx % colors.length]}
>
{item}
</el-tag>
))}
</div>
)
}
}
}
},
headerActions: {

View File

@@ -181,10 +181,10 @@ export default {
try {
const res = await this.$axios.get(this.tableConfig.url)
if (res) {
if (res && res.results) {
this.transObject = {
...this.object,
gateways: res.map(item => {
gateways: res.results.map(item => {
return {
name: item.name,
id: item.id

View File

@@ -28,7 +28,7 @@
<div class="chart-container-title">
<div class="chart-container-title-text">{{ $t('TaskExecutionTrends') }}</div>
<div class="chart">
<Echart
<echarts
:options="ExecutionMetricsOptions"
:autoresize="true"
/>
@@ -52,7 +52,6 @@ import BaseReport from '../base/BaseReport.vue'
import SummaryCountCard from '@/components/Dashboard/SummaryCountCard.vue'
import SwitchDate from '@/components/Dashboard/SwitchDate.vue'
import * as echarts from 'echarts'
import Echart from '@/components/Dashboard/Echart.vue'
import AccountSummary from '@/views/reports/pam/ChangeSecret/AccountSummary.vue'
import RiskSummary from '@/views/reports/pam/Dashboard/RiskSummary.vue'
@@ -62,8 +61,7 @@ export default {
AccountSummary,
SwitchDate,
SummaryCountCard,
BaseReport,
Echart
BaseReport
},
props: {
nav: {

View File

@@ -20,7 +20,7 @@
<div class="chart-container-title">
<div class="chart-container-title-text">{{ $t('AccountCreationSourceDistribution') }}</div>
<div class="chart">
<Echart
<echarts
:options="SourceOptions"
:autoresize="true"
/>
@@ -31,7 +31,7 @@
<div class="chart-container-title">
<div class="chart-container-title-text">{{ $t('AccountConnectivityStatusDistribution') }}</div>
<div class="chart">
<Echart
<echarts
:options="ConnectivityOptions"
:autoresize="true"
/>
@@ -42,7 +42,7 @@
<div class="chart-container-title">
<div class="chart-container-title-text">{{ $t('AccountPasswordChangeTrends') }}</div>
<div class="chart">
<Echart
<echarts
:options="ChangeSecretOptions"
:autoresize="true"
/>
@@ -70,7 +70,6 @@
import BaseReport from '../base/BaseReport.vue'
import SummaryCountCard from '@/components/Dashboard/SummaryCountCard.vue'
import * as echarts from 'echarts'
import Echart from '@/components/Dashboard/Echart.vue'
import { mixColors } from '@/views/reports/const'
import RankTable from '@/views/reports/users/components/RankTable.vue'
@@ -78,8 +77,7 @@ export default {
components: {
RankTable,
SummaryCountCard,
BaseReport,
Echart
BaseReport
},
props: {
nav: {

View File

@@ -28,7 +28,7 @@
<div class="chart-container-title">
<div class="chart-container-title-text">{{ $t('DistributionOfAssetLoginMethods') }}</div>
<div class="chart">
<Echart
<echarts
:options="LoginEntryOptions"
:autoresize="true"
/>
@@ -40,7 +40,7 @@
<div class="chart-container-title">
<div class="chart-container-title-text">{{ $t('RemoteLoginProtocolUsageDistribution') }}</div>
<div class="chart">
<Echart
<echarts
:options="LoginProtocolOptions"
:autoresize="true"
/>
@@ -52,7 +52,7 @@
<div class="chart-container-title">
<div class="chart-container-title-text">{{ $t('OperatingSystemDistributionOfLoginAssets') }}</div>
<div class="chart">
<Echart
<echarts
:options="LoginOSOptions"
:autoresize="true"
/>
@@ -64,7 +64,7 @@
<div class="chart-container-title">
<div class="chart-container-title-text">{{ $t('AssetLoginTrends') }}</div>
<div class="chart">
<Echart
<echarts
ref="loginTrend"
:options="loginTrendOptions"
:autoresize="true"
@@ -83,7 +83,6 @@ import BaseReport from '@/views/reports/base/BaseReport.vue'
import SummaryCountCard from '@/components/Dashboard/SummaryCountCard.vue'
import UserAssetActivity from '@/views/reports/console/UserAssetActivity.vue'
import * as echarts from 'echarts'
import Echart from '@/components/Dashboard/Echart.vue'
import { mixColors } from '@/views/reports/const'
export default {
@@ -91,8 +90,7 @@ export default {
UserAssetActivity,
SummaryCountCard,
BaseReport,
SwitchDate,
Echart
SwitchDate
},
props: {
nav: {

View File

@@ -20,7 +20,7 @@
<div class="chart-container-title">
<div class="chart-container-title-text">{{ $t('AssetTypeDistribution') }}</div>
<div class="chart">
<Echart
<echarts
:options="AssetTypeOptions"
:autoresize="true"
/>
@@ -31,7 +31,7 @@
<div class="chart-container-title">
<div class="chart-container-title-text">{{ $t('WeeklyGrowthTrend') }}</div>
<div class="chart">
<Echart
<echarts
:options="AddedAssetOptions"
:autoresize="true"
/>
@@ -47,14 +47,12 @@
import BaseReport from '../base/BaseReport.vue'
import SummaryCountCard from '@/components/Dashboard/SummaryCountCard.vue'
import * as echarts from 'echarts'
import Echart from '@/components/Dashboard/Echart.vue'
import { mixColors } from '@/views/reports/const'
export default {
components: {
SummaryCountCard,
BaseReport,
Echart
BaseReport
},
props: {
nav: {

View File

@@ -52,20 +52,17 @@ export default {
},
methods: {
async getMetricData() {
setTimeout(() => {
const url = `/api/v1/index/?dates_metrics=1&days=${this.days}`
this.$axios.get(url).then(data => {
const activeUsers = data?.dates_metrics_total_count_active_users
const activeAssets = data?.dates_metrics_total_count_active_assets
this.lineChartConfig.datesMetrics = data.dates_metrics_date
if (activeUsers.length > 0) {
this.lineChartConfig.primaryData = activeUsers
}
if (activeAssets.length > 0) {
this.lineChartConfig.secondaryData = activeAssets
}
})
}, 500)
const url = `/api/v1/index/?dates_metrics=1&days=${this.days}`
const data = await this.$axios.get(url)
const activeUsers = data?.dates_metrics_total_count_active_users
const activeAssets = data?.dates_metrics_total_count_active_assets
this.lineChartConfig.datesMetrics = data.dates_metrics_date
if (activeUsers.length > 0) {
this.lineChartConfig.primaryData = activeUsers
}
if (activeAssets.length > 0) {
this.lineChartConfig.secondaryData = activeAssets
}
}
}
}

View File

@@ -60,20 +60,17 @@ export default {
},
methods: {
async getMetricData() {
setTimeout(() => {
const url = `/api/v1/accounts/change-secret-dashboard/?daily_success_and_failure_metrics=1&days=${this.days}`
this.$axios.get(url).then(data => {
const success = data?.dates_metrics_total_count_success
const failed = data?.dates_metrics_total_count_failed
this.lineChartConfig.datesMetrics = data?.dates_metrics_date
if (success.length > 0) {
this.lineChartConfig.primaryData = success
}
if (failed.length > 0) {
this.lineChartConfig.secondaryData = failed
}
})
}, 500)
const url = `/api/v1/accounts/change-secret-dashboard/?daily_success_and_failure_metrics=1&days=${this.days}`
const data = await this.$axios.get(url)
const success = data?.dates_metrics_total_count_success
const failed = data?.dates_metrics_total_count_failed
this.lineChartConfig.datesMetrics = data?.dates_metrics_date
if (success.length > 0) {
this.lineChartConfig.primaryData = success
}
if (failed.length > 0) {
this.lineChartConfig.secondaryData = failed
}
}
}
}

View File

@@ -6,7 +6,7 @@
<div class="chart-content">
<!-- eslint-disable-next-line -->
<Echart ref="chartRef" :options="chartOption" :autoresize="true"/>
<echarts ref="chartRef" :options="chartOption" :autoresize="true" />
</div>
</div>
</template>
@@ -14,7 +14,6 @@
<script>
import Title from '@/components/Dashboard/Title.vue'
import * as echarts from 'echarts'
import Echart from '@/components/Dashboard/Echart.vue'
import 'echarts/lib/chart/pie'
import 'echarts/lib/component/tooltip'
import 'echarts/lib/component/title'
@@ -22,7 +21,7 @@ import 'echarts/lib/component/legend'
export default {
name: 'MissionSummery',
components: { Title, Echart },
components: { Title },
data() {
return {
config: {

View File

@@ -22,7 +22,7 @@
<div class="chart-container-title">
<div class="chart-container-title-text">{{ $t('UserModificationTrends') }}</div>
<div class="chart">
<Echart
<echarts
:options="UserModificationOptions"
:autoresize="true"
/>
@@ -55,15 +55,13 @@ import BaseReport from '../base/BaseReport.vue'
import SummaryCountCard from '@/components/Dashboard/SummaryCountCard.vue'
import { mixColors } from '@/views/reports/const'
import * as echarts from 'echarts'
import Echart from '@/components/Dashboard/Echart.vue'
export default {
components: {
SummaryCountCard,
RankTable,
BaseReport,
SwitchDate,
Echart
SwitchDate
},
props: {
nav: {

View File

@@ -8,7 +8,7 @@
v-if="visible"
:show-cancel="false"
:show-confirm="false"
:title="$tc('EmailTemplate')"
:title="$tc('Msg Template')"
:visible.sync="visible"
width="70%"
@confirm="onConfirm()"

View File

@@ -43,7 +43,6 @@ export default {
},
localValue(val) {
this.$emit('input', val)
this.$emit('htmlChange', this.html)
}
}
}

View File

@@ -34,16 +34,18 @@ export default {
const vm = this
return {
initial: {
template_name: localStorage.getItem('selectTemplateName') || 'terminal/_msg_session_sharing.html'
EMAIL_TEMPLATE_NAME: localStorage.getItem('selectTemplateName') || 'terminal/_msg_session_sharing.html'
},
helpText: this.$t('EmailHelpText'),
encryptedFields: ['EMAIL_HOST_PASSWORD'],
fields: [
[this.$t('Basic'), [
'template_name',
'template_content'
'EMAIL_TEMPLATE_NAME',
'EMAIL_TEMPLATE_CONTENT'
]]
],
fieldsMeta: {
template_name: {
EMAIL_TEMPLATE_NAME: {
label: this.$t('Name'),
helpTextFormatter: () => {
const handleClick = () => {
@@ -68,7 +70,7 @@ export default {
this.variables = item.contexts
this.source = item.source
updateForm({
template_content: item.content.trimStart()
EMAIL_TEMPLATE_CONTENT: item.content.trimStart()
})
}
})
@@ -78,28 +80,19 @@ export default {
}
}
},
template_content: {
component: MarkDownEditor,
on: {
htmlChange: ([html]) => {
vm.html = html
}
}
EMAIL_TEMPLATE_CONTENT: {
component: MarkDownEditor
}
},
templates: [],
successUrl: { name: 'Msg' },
showHelpDialog: false,
variables: [],
html: '',
source: 'original',
selectTemplateName: '',
variablesHelpText: this.$t('TemplateVariablesHelpText'),
variablesHelpText: '您可以选择一个模板在模板内容中使用 {{ key }} 读取内置变量,注意:只支持 {{ }} 语法,其他语法不支持。例如 {% if title %}',
hasSaveContinue: false,
onPerformError() {
},
performSubmit(validValues) {
validValues['render_html'] = vm.html
return this.$axios['patch']('/api/v1/notifications/templates/edit/', validValues).then(res => {
this.$router.push({ name: 'Msg', query: { t: new Date().getTime() } })
})
@@ -110,6 +103,7 @@ export default {
type: 'default',
// hidden: () => this.source === 'original',
callback: (value, form, btn) => {
console.log(value, form, btn)
return this.$axios['post']('/api/v1/notifications/templates/reset/', { template_name: this.selectTemplateName }).then(
() => {
this.$router.push({ name: 'Msg', query: { t: new Date().getTime() } })
@@ -134,7 +128,7 @@ export default {
this.$axios.get('/api/v1/notifications/templates/').then(data => {
if (data.length > 0) {
this.templates = data
this.fieldsMeta.template_name.el.options = data.map(item => ({
this.fieldsMeta.EMAIL_TEMPLATE_NAME.el.options = data.map(item => ({
label: item.subject,
value: item.template_name
}))

View File

@@ -26,7 +26,7 @@ export default {
hidden: !this.$hasPerm('settings.change_email')
},
{
title: this.$t('MsgTemplate'),
title: this.$t('Msg Template'),
name: 'MsgTemplate',
hidden: !this.$hasPerm('settings.change_email') || !this.$store.getters.hasValidLicense
},

View File

@@ -50,25 +50,20 @@ export default {
},
methods: {
async initialSelect() {
try {
const commandOptions = await getAllCommandStorage()
const replayOptions = await getAllReplayStorage()
if (commandOptions) {
commandOptions.forEach(item => {
this.fieldsMeta.command_storage.options.push({ label: item.name, value: item.name })
})
}
if (replayOptions) {
replayOptions.forEach(item => {
if (item.type.value === 'sftp') return
this.fieldsMeta.replay_storage.options.push({ label: item.name, value: item.name })
})
}
} catch (error) {
console.error(error)
}
const commandOptions = await getAllCommandStorage()
commandOptions.forEach(item => {
this.fieldsMeta.command_storage.options.push({ label: item.name, value: item.name })
})
const replayOptions = await getAllReplayStorage()
replayOptions.forEach(item => {
if (item.type.value === 'sftp') return
this.fieldsMeta.replay_storage.options.push({ label: item.name, value: item.name })
})
}
}
}
</script>
<style scoped>
</style>