Compare commits

..

99 Commits

Author SHA1 Message Date
Bryan
16a92d10bc Merge pull request #5212 from jumpserver/dev
v4.10.8-lts
2025-09-18 16:49:05 +08:00
w940853815
9611eb9c73 fix: Improve chart management by using a global _echarts object for tracking active charts 2025-09-17 19:02:24 +08:00
w940853815
a2bbb6555b fix: Optimize data fetching in AccountSummary and UserAssetActivity components 2025-09-17 18:01:03 +08:00
zhaojisen
ddd25208d8 Fixed: Fix the issue where error message prompts are being obscured. 2025-09-17 17:48:08 +08:00
w940853815
fe8db5831b fix: Edit template onPerformError error 2025-09-17 16:26:54 +08:00
feng
0c29ade399 perf: Compatible v3 ssh_key_change_strategy 2025-09-17 14:32:40 +08:00
zhaojisen
f8b2840d89 Fixed: Restore component update component settings logic 2025-09-17 14:11:40 +08:00
zhaojisen
52a18c3c35 Fixed: Fix the error reporting issue in risk detection review 2025-09-17 10:35:49 +08:00
w940853815
ace9cdcd68 perf: Translate msg template 2025-09-16 19:14:22 +08:00
w940853815
7098c2266e fix: Copy name field failed 2025-09-16 17:56:11 +08:00
w940853815
58d3489c33 fix: There is something wrong with the format of the site message 2025-09-16 17:56:11 +08:00
w940853815
396d20f31e fix: Remove priority fields in ACL components 2025-09-16 17:46:21 +08:00
zhaojisen
c8b866412a Fixed: Restore the logic for adding gateway lists 2025-09-16 17:33:13 +08:00
feng
63b163e382 perf: Translate 2025-09-16 16:14:46 +08:00
zhaojisen
e1acc642ca perf: Optimize the way connection methods are displayed in the table. 2025-09-16 11:35:45 +08:00
w940853815
e3f4cc68d2 fix: Export report pdf failed 2025-09-15 18:48:24 +08:00
w940853815
983aff62f2 fix: Update account existence check 2025-09-15 17:52:26 +08:00
zhaojisen
26e1ffdbdd Fixed: Fix Dashboard export issue on the Audit Workbench 2025-09-15 17:25:51 +08:00
Bryan
7b568ec84f 1 2025-08-21 18:59:54 +08:00
Bryan
73d6bda8c3 Merge pull request #5092 from jumpserver/dev
merge: v4.10.4-lts
2025-07-17 15:04:47 +08:00
Bryan
3934b45367 Merge pull request #5064 from jumpserver/dev
v4.10.2
2025-06-19 20:13:12 +08:00
Bryan
0c5e84d1e3 Merge pull request #5010 from jumpserver/dev
v4.10.0
2025-05-15 17:12:07 +08:00
Bryan
18a3f42717 Merge pull request #4972 from jumpserver/dev
v4.9.0
2025-04-17 20:18:08 +08:00
Bryan
68030d98b2 Merge pull request #4890 from jumpserver/dev
v4.8.0
2025-03-20 18:44:31 +08:00
Bryan
a861f77609 Merge pull request #4659 from jumpserver/dev
v4.7.0
2025-02-20 10:20:32 +08:00
Bryan
e58ec6057c Merge pull request #4600 from jumpserver/dev
v4.6.0
2025-01-15 14:39:21 +08:00
Bryan
7ab20c5885 Merge pull request #4537 from jumpserver/dev
v4.5.0
2024-12-19 15:57:44 +08:00
Bryan
e47ddb5355 Merge pull request #4451 from jumpserver/dev
v4.4.0
2024-11-21 19:01:11 +08:00
Bryan
56aa3caa83 Merge pull request #4410 from jumpserver/dev
v4.3.0
2024-10-17 14:56:18 +08:00
Bryan
19b1dc0dbc Merge pull request #4367 from jumpserver/dev
merge: from dev to master
2024-09-19 19:36:42 +08:00
Bryan
77ef172a23 Merge pull request #4320 from jumpserver/dev
v4.1.0
2024-08-15 21:42:42 +08:00
Bryan
4596887bf1 Merge pull request #4178 from jumpserver/dev
v4.0.0
2024-07-03 19:06:07 +08:00
Bryan
0a3dc30c85 Merge pull request #4072 from jumpserver/dev
v3.10.11-lts
2024-06-19 16:04:12 +08:00
Bryan
51d24bc8e5 Merge pull request #3941 from jumpserver/dev
v3.10.10-lts
2024-05-16 16:05:04 +08:00
Bryan
1b15a4d043 Merge pull request #3871 from jumpserver/dev
v3.10.9 (dev to master)
2024-04-22 19:44:33 +08:00
Bryan
7d3f818242 Merge pull request #3864 from jumpserver/v3.10
v3.10.8
2024-04-18 17:58:05 +08:00
Bryan
4e26f18d77 Merge pull request #3862 from jumpserver/dev
v3.10.8
2024-04-18 17:17:36 +08:00
Bryan
b22613617a Revert "build(deps): bump follow-redirects from 1.15.3 to 1.15.4"
This reverts commit e971cbf4a8.
2024-03-27 16:16:07 +08:00
dependabot[bot]
e971cbf4a8 build(deps): bump follow-redirects from 1.15.3 to 1.15.4
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.3 to 1.15.4.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.3...v1.15.4)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-27 16:11:26 +08:00
wangruidong
4672abae35 fix: 刷新页面根据搜索条件过滤出对应的资源 2024-03-04 19:17:05 +08:00
Bryan
ba36d72602 Merge pull request #3761 from jumpserver/master
v3.10.4 (branch-v3.10)
2024-02-29 16:26:13 +08:00
Bryan
4bfbbba4c5 Merge pull request #3760 from jumpserver/dev
v3.10.4
2024-02-29 16:15:33 +08:00
Bryan
ea038ce43a Merge pull request #3697 from jumpserver/master
v3.10.2
2024-01-17 13:34:12 +00:00
Bryan
e16b19666c Merge pull request #3696 from jumpserver/dev
v3.10.2
2024-01-17 13:33:22 +00:00
Bryan
c7f5409eb6 Merge pull request #3694 from jumpserver/master
v3.10.2
2024-01-17 07:35:33 -04:00
Bryan
fdbd7d2222 Merge pull request #3693 from jumpserver/dev
v3.10.2
2024-01-17 07:24:50 -04:00
Bryan
ddbaeeafea Merge pull request #3668 from jumpserver/master
v3.10.1
2023-12-29 11:34:04 +05:00
Bryan
efb0e9dacb Merge pull request #3665 from jumpserver/dev
v3.10.1
2023-12-29 11:14:54 +05:00
huailei
f6f8301ad5 Revert "perf: 账号收集翻译"
This reverts commit 9a63ae63d4.
2023-12-22 15:25:31 +08:00
“huailei000”
9a63ae63d4 perf: 账号收集翻译 2023-12-22 11:31:45 +08:00
Bryan
1e007ccda3 Merge pull request #3642 from jumpserver/dev
v3.10
2023-12-21 15:15:52 +05:00
老广
d1d0b06b53 Merge pull request #3546 from jumpserver/dev
v3.9.0
2023-11-16 18:25:10 +08:00
Bryan
5fb70d2f24 Merge pull request #3450 from jumpserver/dev
v3.8.0
2023-10-19 03:33:53 -05:00
Bryan
b54a95430f Merge pull request #3404 from jumpserver/dev
v3.7.0
2023-09-21 17:04:42 +08:00
Bryan
4d8b4c45af Merge pull request #3355 from jumpserver/dev
v3.6.0
2023-08-17 14:00:33 +05:00
Bryan
a6d642df60 Merge pull request #3283 from jumpserver/dev
v3.5.0
2023-07-20 19:04:29 +08:00
Jiangjie.Bai
2e74f1522f Merge pull request #3222 from jumpserver/dev
v3.4.0
2023-06-15 14:51:36 +08:00
Jiangjie.Bai
fe615e0314 Merge pull request #3219 from jumpserver/dev
v3.4.0
2023-06-15 14:17:46 +08:00
Jiangjie.Bai
09f734e6fc Merge pull request #3135 from jumpserver/dev
v3.3.0
2023-05-18 19:18:11 +08:00
Jiangjie.Bai
3117046342 Merge pull request #3061 from jumpserver/dev
v3.2.0
2023-04-20 18:40:08 +08:00
Bai
b68aecb5cc fix: 批量更新资产平台help-text 2023-04-20 18:39:22 +08:00
Jiangjie.Bai
1c9b155d97 Merge pull request #3057 from jumpserver/dev
v3.2.0
2023-04-20 18:22:46 +08:00
Jiangjie.Bai
75b1be9864 Merge pull request #3019 from jumpserver/dev
v3.2.0 rc2
2023-04-14 19:01:37 +08:00
Jiangjie.Bai
615c3c1cf4 Merge pull request #3014 from jumpserver/dev
v3.2.0 rc1
2023-04-13 20:02:38 +08:00
Jiangjie.Bai
4d82231af4 Merge pull request #3012 from jumpserver/dev
v3.2.0 rc1
2023-04-13 19:22:38 +08:00
“huailei000”
c6cf6571b6 perf: ldap导入用户列表-组织下拉框设置最大宽度 2023-03-16 16:44:36 +08:00
Bai
8ea990d070 fix: 修复创建资产添加账号模版报错问题 2023-03-16 16:44:36 +08:00
“huailei000”
f4a32170d5 perf: message 2023-03-16 16:44:36 +08:00
ibuler
073508675e perf: 添加默认的信息 2023-03-16 16:44:36 +08:00
Jiangjie.Bai
1d6ca0a93a Merge pull request #2924 from jumpserver/dev
v3.1.0 rc4
2023-03-15 19:46:31 +08:00
Jiangjie.Bai
36aea652d6 Merge pull request #2788 from jumpserver/dev
v3.0.0
2023-02-23 20:16:41 +08:00
Jiangjie.Bai
1a42ce90ab Merge pull request #2760 from jumpserver/dev
v3.0.0-rc-latest
2023-02-22 22:21:54 +08:00
Jiangjie.Bai
31a401b55d Merge pull request #2463 from jumpserver/dev
v3.0.0-rc4
2023-01-31 18:55:34 +08:00
Jiangjie.Bai
582a84178d Merge pull request #2187 from jumpserver/dev
v2.28.0
2022-11-17 17:44:19 +08:00
Jiangjie.Bai
9b9f7c936c Merge pull request #2184 from jumpserver/dev
v2.28.0-rc5
2022-11-17 14:18:15 +08:00
Jiangjie.Bai
2a6100957f Merge pull request #2182 from jumpserver/dev
v2.28.0-rc4
2022-11-16 21:08:55 +08:00
Jiangjie.Bai
16606d6a27 Merge pull request #2176 from jumpserver/dev
v2.28.0-rc2
2022-11-14 10:01:05 +08:00
Jiangjie.Bai
0a612f50e6 Merge pull request #2164 from jumpserver/dev
v2.28.0-rc1
2022-11-10 17:45:47 +08:00
Jiangjie.Bai
fe36fa9390 Merge pull request #2117 from jumpserver/dev
v2.27.0-rc4
2022-10-18 21:02:10 +08:00
Jiangjie.Bai
ba109900ec Merge pull request #2113 from jumpserver/dev
v2.27.0-rc3
2022-10-18 11:20:57 +08:00
Jiangjie.Bai
ec7768267f Merge pull request #2105 from jumpserver/dev
v2.27.0-rc2
2022-10-14 11:01:32 +08:00
Jiangjie.Bai
cc58b374ab Merge pull request #2101 from jumpserver/dev
v2.27.0-rc1
2022-10-13 17:44:53 +08:00
Jiangjie.Bai
04ffbb8fd6 Merge pull request #2097 from jumpserver/dev
v2.27.0-rc1
2022-10-13 15:14:40 +08:00
Jiangjie.Bai
49880f6739 Merge pull request #2059 from jumpserver/dev
v2.26.0
2022-09-15 17:49:44 +08:00
Jiangjie.Bai
e6f98d58c4 Merge pull request #2057 from jumpserver/dev
v2.26.0-rc4
2022-09-15 16:18:03 +08:00
Jiangjie.Bai
fd1f16d43c Merge pull request #2050 from jumpserver/dev
v2.26.0-rc2
2022-09-13 17:41:39 +08:00
Jiangjie.Bai
968b2415b1 Merge pull request #2043 from jumpserver/dev
v2.26.0-rc1
2022-09-08 15:46:44 +08:00
Jiangjie.Bai
776090d6ba Merge pull request #2001 from jumpserver/dev
v2.25.0
2022-08-18 16:12:45 +08:00
Jiangjie.Bai
3a37952288 Merge pull request #1996 from jumpserver/dev
v2.25.0-rc4
2022-08-17 16:53:23 +08:00
Jiangjie.Bai
62b8fc0e3b Merge pull request #1994 from jumpserver/dev
v2.25.0-rc3
2022-08-16 19:08:23 +08:00
Jiangjie.Bai
b2028869cb Merge pull request #1986 from jumpserver/dev
v2.25.0-rc2
2022-08-12 18:06:56 +08:00
Jiangjie.Bai
5277a725f8 Merge pull request #1973 from jumpserver/dev
v2.25.0-rc1
2022-08-11 14:11:59 +08:00
Jiangjie.Bai
f137788c1a Merge pull request #1957 from jumpserver/dev
v2.24.0-rc5
2022-07-20 19:06:03 +08:00
Jiangjie.Bai
f7d17c8de7 Merge pull request #1954 from jumpserver/dev
v2.24.0-rc4
2022-07-19 16:18:13 +08:00
Jiangjie.Bai
feea70b0be Merge pull request #1944 from jumpserver/dev
v2.24.0-rc3
2022-07-18 12:05:42 +08:00
Jiangjie.Bai
04696ef3d6 Merge pull request #1940 from jumpserver/dev
v2.24.0-rc2
2022-07-15 18:07:37 +08:00
Jiangjie.Bai
1731f4f788 Merge pull request #1934 from jumpserver/dev
v2.24.0-rc1
2022-07-14 18:27:51 +08:00
Jiangjie.Bai
6f25d93909 Merge pull request #1931 from jumpserver/dev
v2.24.0-rc1
2022-07-14 17:51:58 +08:00
Jiangjie.Bai
46461ec324 Merge pull request #1925 from jumpserver/dev
v2.24.0-rc1
2022-07-14 15:12:15 +08:00
32 changed files with 201 additions and 109 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.key)">
<td :title="$tc('ClickCopy')" class="item-td text-link" @click="onCopy(item.name)">
<label class="item-label">{{ item.name }}</label>
</td>
<td><span>{{ item.label }}</span></td>

View File

@@ -1,6 +1,6 @@
<template>
<div>
<echarts
<Echart
ref="echarts"
:options="options"
:autoresize="true"
@@ -12,9 +12,10 @@
// 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: {},
components: { Echart },
props: {
datesMetrics: {
type: Array,

View File

@@ -34,18 +34,32 @@ export default {
}
},
created() {
if (!window.totalCharts) {
window.totalCharts = 0
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
}
}
window.totalCharts++
},
methods: {
onFinished() {
if (!window.finishedCharts) {
window.finishedCharts = 0
}
window.finishedCharts++
if (window.finishedCharts === window.totalCharts) {
if (!window._echarts) return
window._echarts.finished.add(this._chartId)
if (window._echarts.finished.size === window._echarts.total.size) {
window.echartsFinished = true
}
}

View File

@@ -1,6 +1,6 @@
<template>
<div>
<echarts
<Echart
ref="echarts"
:options="options"
:autoresize="true"
@@ -14,9 +14,11 @@
// 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>
<echarts
<Echart
ref="echarts"
:options="options"
:autoresize="true"
@@ -13,8 +13,10 @@
// 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,
@@ -35,14 +37,15 @@ 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
@@ -177,8 +180,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>
<echarts
<Echart
ref="echarts"
:autoresize="true"
:options="options"
@@ -13,12 +13,15 @@ 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,10 +244,12 @@ export default {
delete routeFilter.search
}
const asFilterTags = _.cloneDeep(this.filterTags)
this.filterTags = {
...asFilterTags,
...routeFilter
}
setTimeout(() => {
this.filterTags = {
...asFilterTags,
...routeFilter
}
}, 100)
},
getValueLabel(key, value) {
for (const field of this.options) {

View File

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

View File

@@ -6,6 +6,7 @@ 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'
@@ -39,6 +40,9 @@ 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_audits'],
permissions: ['rbac.view_audit'],
expanded: true,
icon: 'user-o',
title: i18n.t('AuditsReport')

View File

@@ -739,3 +739,7 @@ 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 'element-ui'
import { getCell, getColumnByCell } from 'element-ui/packages/table/src/util'
import { getStyle, hasClass } from 'element-ui/src/utils/dom'
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 { copy } from '../common/index'
Object.assign(Table.components.TableBody.methods, {

View File

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

View File

@@ -18,16 +18,13 @@ export default {
return {
initial: {},
fields: [
[this.$t('Basic'), ['name', 'priority']],
[this.$t('Basic'), ['name']],
[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(', ')
},
'priority', 'date_created', 'created_by', 'comment'
'date_created', 'created_by', 'comment'
]
}
},

View File

@@ -17,8 +17,31 @@ export default {
columnsShow: {
min: ['name', 'actions'],
default: [
'name', 'priority', 'is_active', 'comment', 'actions'
'name', '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 && res.results) {
if (res) {
this.transObject = {
...this.object,
gateways: res.results.map(item => {
gateways: res.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">
<echarts
<Echart
:options="ExecutionMetricsOptions"
:autoresize="true"
/>
@@ -52,6 +52,7 @@ 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'
@@ -61,7 +62,8 @@ export default {
AccountSummary,
SwitchDate,
SummaryCountCard,
BaseReport
BaseReport,
Echart
},
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">
<echarts
<Echart
: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">
<echarts
<Echart
: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">
<echarts
<Echart
:options="ChangeSecretOptions"
:autoresize="true"
/>
@@ -70,6 +70,7 @@
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'
@@ -77,7 +78,8 @@ export default {
components: {
RankTable,
SummaryCountCard,
BaseReport
BaseReport,
Echart
},
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">
<echarts
<Echart
: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">
<echarts
<Echart
: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">
<echarts
<Echart
: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">
<echarts
<Echart
ref="loginTrend"
:options="loginTrendOptions"
:autoresize="true"
@@ -83,6 +83,7 @@ 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 {
@@ -90,7 +91,8 @@ export default {
UserAssetActivity,
SummaryCountCard,
BaseReport,
SwitchDate
SwitchDate,
Echart
},
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">
<echarts
<Echart
: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">
<echarts
<Echart
:options="AddedAssetOptions"
:autoresize="true"
/>
@@ -47,12 +47,14 @@
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
BaseReport,
Echart
},
props: {
nav: {

View File

@@ -52,17 +52,20 @@ export default {
},
methods: {
async getMetricData() {
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
}
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)
}
}
}

View File

@@ -60,17 +60,20 @@ export default {
},
methods: {
async getMetricData() {
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
}
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)
}
}
}

View File

@@ -6,7 +6,7 @@
<div class="chart-content">
<!-- eslint-disable-next-line -->
<echarts ref="chartRef" :options="chartOption" :autoresize="true" />
<Echart ref="chartRef" :options="chartOption" :autoresize="true"/>
</div>
</div>
</template>
@@ -14,6 +14,7 @@
<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'
@@ -21,7 +22,7 @@ import 'echarts/lib/component/legend'
export default {
name: 'MissionSummery',
components: { Title },
components: { Title, Echart },
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">
<echarts
<Echart
:options="UserModificationOptions"
:autoresize="true"
/>
@@ -55,13 +55,15 @@ 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
SwitchDate,
Echart
},
props: {
nav: {

View File

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

View File

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

View File

@@ -34,18 +34,16 @@ export default {
const vm = this
return {
initial: {
EMAIL_TEMPLATE_NAME: localStorage.getItem('selectTemplateName') || 'terminal/_msg_session_sharing.html'
template_name: localStorage.getItem('selectTemplateName') || 'terminal/_msg_session_sharing.html'
},
helpText: this.$t('EmailHelpText'),
encryptedFields: ['EMAIL_HOST_PASSWORD'],
fields: [
[this.$t('Basic'), [
'EMAIL_TEMPLATE_NAME',
'EMAIL_TEMPLATE_CONTENT'
'template_name',
'template_content'
]]
],
fieldsMeta: {
EMAIL_TEMPLATE_NAME: {
template_name: {
label: this.$t('Name'),
helpTextFormatter: () => {
const handleClick = () => {
@@ -70,7 +68,7 @@ export default {
this.variables = item.contexts
this.source = item.source
updateForm({
EMAIL_TEMPLATE_CONTENT: item.content.trimStart()
template_content: item.content.trimStart()
})
}
})
@@ -80,19 +78,28 @@ export default {
}
}
},
EMAIL_TEMPLATE_CONTENT: {
component: MarkDownEditor
template_content: {
component: MarkDownEditor,
on: {
htmlChange: ([html]) => {
vm.html = html
}
}
}
},
templates: [],
successUrl: { name: 'Msg' },
showHelpDialog: false,
variables: [],
html: '',
source: 'original',
selectTemplateName: '',
variablesHelpText: '您可以选择一个模板在模板内容中使用 {{ key }} 读取内置变量,注意:只支持 {{ }} 语法,其他语法不支持。例如 {% if title %}',
variablesHelpText: this.$t('TemplateVariablesHelpText'),
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() } })
})
@@ -103,7 +110,6 @@ 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() } })
@@ -128,7 +134,7 @@ export default {
this.$axios.get('/api/v1/notifications/templates/').then(data => {
if (data.length > 0) {
this.templates = data
this.fieldsMeta.EMAIL_TEMPLATE_NAME.el.options = data.map(item => ({
this.fieldsMeta.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('Msg Template'),
title: this.$t('MsgTemplate'),
name: 'MsgTemplate',
hidden: !this.$hasPerm('settings.change_email') || !this.$store.getters.hasValidLicense
},

View File

@@ -50,20 +50,25 @@ export default {
},
methods: {
async initialSelect() {
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 })
})
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)
}
}
}
}
</script>
<style scoped>
</style>