mirror of
https://github.com/jumpserver/lina.git
synced 2025-09-19 09:43:32 +00:00
Merge branch 'v4' of github.com:jumpserver/lina into v4
This commit is contained in:
@@ -245,6 +245,7 @@ $color-drop-menu-border: #e4e7ed;
|
|||||||
// 主要是 Table 中的操作列
|
// 主要是 Table 中的操作列
|
||||||
.layout.table-actions {
|
.layout.table-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
align-items: flex-end;
|
align-items: flex-end;
|
||||||
|
|
||||||
.el-button {
|
.el-button {
|
||||||
|
@@ -239,7 +239,6 @@ export class FormFieldGenerator {
|
|||||||
if (!label) {
|
if (!label) {
|
||||||
return field
|
return field
|
||||||
}
|
}
|
||||||
|
|
||||||
if (field.placeholder || field.el.placeholder) {
|
if (field.placeholder || field.el.placeholder) {
|
||||||
return field
|
return field
|
||||||
}
|
}
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<div style="height: 100%">
|
<div style="height: 100%">
|
||||||
<el-tabs
|
<el-tabs
|
||||||
v-if="tabIndices.length > 0"
|
v-if="tabIndices.length > 1"
|
||||||
slot="submenu"
|
slot="submenu"
|
||||||
v-model="iActiveMenu"
|
v-model="iActiveMenu"
|
||||||
class="page-submenu"
|
class="page-submenu"
|
||||||
|
@@ -24,7 +24,7 @@ export default {
|
|||||||
name: 'Basic',
|
name: 'Basic',
|
||||||
component: () => import('@/views/settings/Basic'),
|
component: () => import('@/views/settings/Basic'),
|
||||||
meta: {
|
meta: {
|
||||||
title: i18n.t('Basic'),
|
title: i18n.t('BasicSettings'),
|
||||||
icon: 'basic',
|
icon: 'basic',
|
||||||
permissions: ['settings.view_setting']
|
permissions: ['settings.view_setting']
|
||||||
}
|
}
|
||||||
@@ -414,7 +414,7 @@ export default {
|
|||||||
path: '/settings/tasks',
|
path: '/settings/tasks',
|
||||||
component: empty,
|
component: empty,
|
||||||
meta: {
|
meta: {
|
||||||
title: i18n.t('TaskList'),
|
title: i18n.t('SystemTasks'),
|
||||||
icon: 'tasks',
|
icon: 'tasks',
|
||||||
permissions: ['ops.view_celerytask']
|
permissions: ['ops.view_celerytask']
|
||||||
},
|
},
|
||||||
@@ -424,7 +424,7 @@ export default {
|
|||||||
name: 'TaskList',
|
name: 'TaskList',
|
||||||
component: () => import('@/views/settings/Task/index.vue'),
|
component: () => import('@/views/settings/Task/index.vue'),
|
||||||
meta: {
|
meta: {
|
||||||
title: i18n.t('TaskList'),
|
title: i18n.t('SystemTasks'),
|
||||||
permissions: ['ops.view_celerytask']
|
permissions: ['ops.view_celerytask']
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@@ -53,11 +53,11 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'batch-Transfer',
|
path: 'file-transfer',
|
||||||
name: 'BatchTransfer',
|
name: 'FileTransfer',
|
||||||
component: () => import('@/views/ops/File/index'),
|
component: () => import('@/views/ops/File/index'),
|
||||||
meta: {
|
meta: {
|
||||||
title: i18n.t('BatchTransfer'),
|
title: i18n.t('FileTransfer'),
|
||||||
permissions: ['rbac.view_filemanager']
|
permissions: ['rbac.view_filemanager']
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -86,8 +86,8 @@ export default {
|
|||||||
},
|
},
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: 'quick-job',
|
path: 'adhoc',
|
||||||
name: 'QuickJob',
|
name: 'Adhoc',
|
||||||
component: () => import('@/views/ops/Job/QuickJob'),
|
component: () => import('@/views/ops/Job/QuickJob'),
|
||||||
meta: {
|
meta: {
|
||||||
title: i18n.t('QuickJob'),
|
title: i18n.t('QuickJob'),
|
||||||
|
@@ -1,12 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<ExecutionDetailDialog v-if="showExecutionDetailDialog" :item="item" :visible.sync="showExecutionDetailDialog" />
|
<ExecutionDetailDialog v-if="showExecutionDetailDialog" :item="item" :visible.sync="showExecutionDetailDialog" />
|
||||||
<GenericListPage :header-actions="headerActions" :table-config="tableConfig" />
|
<GenericListPage ref="GenericListPage" :header-actions="headerActions" :table-config="tableConfig" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { ActionsFormatter } from '@/components/Table/TableFormatters'
|
|
||||||
import { GenericListPage } from '@/layout/components'
|
import { GenericListPage } from '@/layout/components'
|
||||||
import { openTaskPage } from '@/utils/jms'
|
import { openTaskPage } from '@/utils/jms'
|
||||||
import ExecutionDetailDialog from '@/views/ops/Execution/ExecutionDetail'
|
import ExecutionDetailDialog from '@/views/ops/Execution/ExecutionDetail'
|
||||||
@@ -23,62 +22,33 @@ export default {
|
|||||||
showExecutionDetailDialog: false,
|
showExecutionDetailDialog: false,
|
||||||
tableConfig: {
|
tableConfig: {
|
||||||
url: '/api/v1/ops/job-executions/',
|
url: '/api/v1/ops/job-executions/',
|
||||||
columns: [
|
|
||||||
'id', 'job', 'material', 'job_type', 'is_finished', 'is_success',
|
|
||||||
'time_cost', 'date_created', 'actions'
|
|
||||||
],
|
|
||||||
columnsShow: {
|
columnsShow: {
|
||||||
min: ['material', 'actions'],
|
min: ['material', 'actions'],
|
||||||
default: [
|
default: [
|
||||||
'id', 'job', 'material', 'job_type', 'is_success',
|
'id', 'job', 'material', 'job_type', 'is_finished', 'is_success',
|
||||||
'time_cost', 'date_created', 'actions'
|
'time_cost', 'date_created', 'actions'
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
columnsMeta: {
|
columnsMeta: {
|
||||||
job_type: {
|
|
||||||
width: '100px'
|
|
||||||
},
|
|
||||||
id: {
|
id: {
|
||||||
width: '100px',
|
|
||||||
formatter(row) {
|
formatter(row) {
|
||||||
return row.id.slice(0, 8)
|
return row.id.slice(0, 8)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
count: {
|
|
||||||
width: '96px',
|
|
||||||
formatter: (row) => {
|
|
||||||
if (row.count) {
|
|
||||||
return <div>
|
|
||||||
<el-tooltip open-delay='1000' content='success'><span Class='text-success'>{row.count.ok} </span></el-tooltip>
|
|
||||||
<el-tooltip open-delay='1000' content='failed'><span Class='text-danger'> {row.count.failed} </span>
|
|
||||||
</el-tooltip>
|
|
||||||
<el-tooltip open-delay='1000' content='exclude'><span Class='text-warning'> {row.count.excludes} </span>
|
|
||||||
</el-tooltip>
|
|
||||||
<el-tooltip open-delay='1000' content='total'><span Class='text-primary'> {row.count.total}</span></el-tooltip>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
return '-'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
job: {
|
job: {
|
||||||
formatter: (row) => {
|
formatter: (row) => {
|
||||||
return <span>{row.job?.name || '-'}</span>
|
return <span>{row.job?.name || '-'}</span>
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
is_finished: {
|
is_finished: {
|
||||||
width: '96px',
|
|
||||||
formatter: (row) => {
|
formatter: (row) => {
|
||||||
if (row.is_finished) {
|
if (row.is_finished) {
|
||||||
return <i Class='fa fa-check text-primary'/>
|
return <i Class='fa fa-check text-primary'/>
|
||||||
}
|
}
|
||||||
return <i Class='fa fa-times text-danger'/>
|
return <i Class='fa fa-times text-danger'/>
|
||||||
},
|
|
||||||
formatterArgs: {
|
|
||||||
width: '14px'
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
is_success: {
|
is_success: {
|
||||||
width: '96px',
|
|
||||||
formatter: (row) => {
|
formatter: (row) => {
|
||||||
if (!row.is_finished) {
|
if (!row.is_finished) {
|
||||||
return <i Class='fa fa fa-spinner fa-spin'/>
|
return <i Class='fa fa fa-spinner fa-spin'/>
|
||||||
@@ -87,13 +57,9 @@ export default {
|
|||||||
return <i Class='fa fa-check text-primary'/>
|
return <i Class='fa fa-check text-primary'/>
|
||||||
}
|
}
|
||||||
return <i Class='fa fa-times text-danger'/>
|
return <i Class='fa fa-times text-danger'/>
|
||||||
},
|
|
||||||
formatterArgs: {
|
|
||||||
width: '14px'
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
time_cost: {
|
time_cost: {
|
||||||
width: '100px',
|
|
||||||
formatter: function(row) {
|
formatter: function(row) {
|
||||||
if (row.time_cost) {
|
if (row.time_cost) {
|
||||||
return row.time_cost.toFixed(2) + 's'
|
return row.time_cost.toFixed(2) + 's'
|
||||||
@@ -102,7 +68,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
formatter: ActionsFormatter,
|
width: '120px',
|
||||||
formatterArgs: {
|
formatterArgs: {
|
||||||
hasUpdate: false,
|
hasUpdate: false,
|
||||||
hasDelete: false,
|
hasDelete: false,
|
||||||
|
@@ -137,7 +137,7 @@ import { formatFileSize } from '@/utils/common'
|
|||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'BatchTransfer',
|
name: 'FileTransfer',
|
||||||
components: {
|
components: {
|
||||||
AssetTreeTable,
|
AssetTreeTable,
|
||||||
Page,
|
Page,
|
||||||
|
@@ -283,4 +283,20 @@ export default {
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: #999999;
|
color: #999999;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
::v-deep .el-checkbox-group {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(3, 1fr);
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep .el-checkbox-group label:nth-child(1),
|
||||||
|
::v-deep .el-checkbox-group label:nth-child(2) {
|
||||||
|
grid-row: 1 / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep .el-checkbox-group label:nth-child(3),
|
||||||
|
::v-deep .el-checkbox-group label:nth-child(4),
|
||||||
|
::v-deep .el-checkbox-group label:nth-child(5) {
|
||||||
|
grid-row: 2 / 3;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@@ -17,14 +17,14 @@ export default {
|
|||||||
return {
|
return {
|
||||||
url: '/api/v1/settings/setting/?category=auth',
|
url: '/api/v1/settings/setting/?category=auth',
|
||||||
fields: [
|
fields: [
|
||||||
[
|
'EMAIL_SUFFIX', 'FORGOT_PASSWORD_URL', 'LOGIN_REDIRECT_MSG_ENABLED'
|
||||||
this.$t('Basic'),
|
|
||||||
[
|
|
||||||
'FORGOT_PASSWORD_URL', 'LOGIN_REDIRECT_MSG_ENABLED'
|
|
||||||
]
|
|
||||||
]
|
|
||||||
],
|
],
|
||||||
fieldsMeta: {
|
fieldsMeta: {
|
||||||
|
FORGOT_PASSWORD_URL: {
|
||||||
|
el: {
|
||||||
|
placeholder: this.$t('ForgotPasswordURL')
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
submitMethod() {
|
submitMethod() {
|
||||||
return 'patch'
|
return 'patch'
|
||||||
|
@@ -24,8 +24,11 @@ export default {
|
|||||||
[this.$t('Basic'), [
|
[this.$t('Basic'), [
|
||||||
'AUTH_CAS', 'CAS_SERVER_URL', 'CAS_ROOT_PROXIED_AS', 'CAS_VERSION'
|
'AUTH_CAS', 'CAS_SERVER_URL', 'CAS_ROOT_PROXIED_AS', 'CAS_VERSION'
|
||||||
]],
|
]],
|
||||||
|
[this.$t('Search'), [
|
||||||
|
'CAS_RENAME_ATTRIBUTES'
|
||||||
|
]],
|
||||||
[this.$t('Other'), [
|
[this.$t('Other'), [
|
||||||
'CAS_LOGOUT_COMPLETELY', 'CAS_RENAME_ATTRIBUTES', 'CAS_CREATE_USER'
|
'CAS_CREATE_USER', 'CAS_LOGOUT_COMPLETELY'
|
||||||
]]
|
]]
|
||||||
],
|
],
|
||||||
fieldsMeta: {
|
fieldsMeta: {
|
||||||
|
@@ -39,7 +39,7 @@ export default {
|
|||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
this.$t('LDAPUser'),
|
this.$t('Search'),
|
||||||
[
|
[
|
||||||
'AUTH_LDAP_SEARCH_OU', 'AUTH_LDAP_SEARCH_FILTER',
|
'AUTH_LDAP_SEARCH_OU', 'AUTH_LDAP_SEARCH_FILTER',
|
||||||
'AUTH_LDAP_USER_ATTR_MAP'
|
'AUTH_LDAP_USER_ATTR_MAP'
|
||||||
|
@@ -26,7 +26,7 @@ export default {
|
|||||||
'AUTH_OPENID', 'BASE_SITE_URL', 'AUTH_OPENID_CLIENT_ID',
|
'AUTH_OPENID', 'BASE_SITE_URL', 'AUTH_OPENID_CLIENT_ID',
|
||||||
'AUTH_OPENID_CLIENT_SECRET', 'AUTH_OPENID_CLIENT_AUTH_METHOD'
|
'AUTH_OPENID_CLIENT_SECRET', 'AUTH_OPENID_CLIENT_AUTH_METHOD'
|
||||||
]],
|
]],
|
||||||
[this.$t('Params'), [
|
[this.$t('Server'), [
|
||||||
'AUTH_OPENID_KEYCLOAK', 'AUTH_OPENID_SERVER_URL', 'AUTH_OPENID_REALM_NAME',
|
'AUTH_OPENID_KEYCLOAK', 'AUTH_OPENID_SERVER_URL', 'AUTH_OPENID_REALM_NAME',
|
||||||
'AUTH_OPENID_PROVIDER_ENDPOINT', 'AUTH_OPENID_PROVIDER_AUTHORIZATION_ENDPOINT',
|
'AUTH_OPENID_PROVIDER_ENDPOINT', 'AUTH_OPENID_PROVIDER_AUTHORIZATION_ENDPOINT',
|
||||||
'AUTH_OPENID_PROVIDER_TOKEN_ENDPOINT', 'AUTH_OPENID_PROVIDER_JWKS_ENDPOINT',
|
'AUTH_OPENID_PROVIDER_TOKEN_ENDPOINT', 'AUTH_OPENID_PROVIDER_JWKS_ENDPOINT',
|
||||||
@@ -35,7 +35,10 @@ export default {
|
|||||||
'AUTH_OPENID_PKCE', 'AUTH_OPENID_CODE_CHALLENGE_METHOD',
|
'AUTH_OPENID_PKCE', 'AUTH_OPENID_CODE_CHALLENGE_METHOD',
|
||||||
'AUTH_OPENID_SCOPES', 'AUTH_OPENID_ID_TOKEN_MAX_AGE', 'AUTH_OPENID_ID_TOKEN_INCLUDE_CLAIMS',
|
'AUTH_OPENID_SCOPES', 'AUTH_OPENID_ID_TOKEN_MAX_AGE', 'AUTH_OPENID_ID_TOKEN_INCLUDE_CLAIMS',
|
||||||
'AUTH_OPENID_USE_STATE', 'AUTH_OPENID_USE_NONCE', 'AUTH_OPENID_ALWAYS_UPDATE_USER',
|
'AUTH_OPENID_USE_STATE', 'AUTH_OPENID_USE_NONCE', 'AUTH_OPENID_ALWAYS_UPDATE_USER',
|
||||||
'AUTH_OPENID_IGNORE_SSL_VERIFICATION', 'AUTH_OPENID_SHARE_SESSION', 'AUTH_OPENID_USER_ATTR_MAP'
|
'AUTH_OPENID_IGNORE_SSL_VERIFICATION', 'AUTH_OPENID_SHARE_SESSION'
|
||||||
|
]],
|
||||||
|
[this.$t('Search'), [
|
||||||
|
'AUTH_OPENID_USER_ATTR_MAP'
|
||||||
]]
|
]]
|
||||||
],
|
],
|
||||||
fieldsMeta: {
|
fieldsMeta: {
|
||||||
|
@@ -20,12 +20,7 @@ export default {
|
|||||||
url: '/api/v1/settings/setting/?category=passkey',
|
url: '/api/v1/settings/setting/?category=passkey',
|
||||||
hasDetailInMsg: false,
|
hasDetailInMsg: false,
|
||||||
fields: [
|
fields: [
|
||||||
[
|
|
||||||
this.$t('BasicInfo'),
|
|
||||||
[
|
|
||||||
'AUTH_PASSKEY', 'FIDO_SERVER_ID', 'FIDO_SERVER_NAME'
|
'AUTH_PASSKEY', 'FIDO_SERVER_ID', 'FIDO_SERVER_NAME'
|
||||||
]
|
|
||||||
]
|
|
||||||
],
|
],
|
||||||
fieldsMeta: {
|
fieldsMeta: {
|
||||||
},
|
},
|
||||||
|
@@ -24,25 +24,13 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
fields: [
|
fields: [
|
||||||
[
|
[this.$t('Basic'), ['SITE_URL']], // 'USER_GUIDE_URL',]
|
||||||
this.$t('BasicInfo'), [
|
[this.$t('Navigation'), ['HELP_DOCUMENT_URL', 'HELP_SUPPORT_URL']]
|
||||||
'SITE_URL' // 'USER_GUIDE_URL',
|
|
||||||
]
|
|
||||||
],
|
|
||||||
[this.$t('NavHelp'), [
|
|
||||||
'HELP_DOCUMENT_URL', 'HELP_SUPPORT_URL'
|
|
||||||
]]
|
|
||||||
],
|
],
|
||||||
fieldsMeta: {
|
fieldsMeta: {
|
||||||
SITE_URL: {
|
SITE_URL: {
|
||||||
rules: [rules.Required]
|
rules: [rules.Required],
|
||||||
},
|
helpText: this.$t('SiteURLTip')
|
||||||
|
|
||||||
HELP_DOCUMENT_URL: {
|
|
||||||
helpText: this.$t('HelpDocumentTip')
|
|
||||||
},
|
|
||||||
HELP_SUPPORT_URL: {
|
|
||||||
helpText: this.$t('HelpSupportTip')
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
successUrl: { name: 'Basic' },
|
successUrl: { name: 'Basic' },
|
||||||
|
@@ -50,8 +50,7 @@ export default {
|
|||||||
GPT_BASE_URL: {
|
GPT_BASE_URL: {
|
||||||
el: {
|
el: {
|
||||||
autocomplete: 'new-password'
|
autocomplete: 'new-password'
|
||||||
},
|
}
|
||||||
helpText: this.$t('Example', { example: 'https://api.openai.com/v1' })
|
|
||||||
},
|
},
|
||||||
GPT_API_KEY: {
|
GPT_API_KEY: {
|
||||||
el: {
|
el: {
|
||||||
@@ -59,7 +58,6 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
GPT_PROXY: {
|
GPT_PROXY: {
|
||||||
helpText: this.$t('Example', { example: 'http://ip:port' })
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
submitMethod() {
|
submitMethod() {
|
||||||
|
@@ -60,7 +60,7 @@ export default {
|
|||||||
],
|
],
|
||||||
encryptedFields: ['VAULT_HCP_TOKEN'],
|
encryptedFields: ['VAULT_HCP_TOKEN'],
|
||||||
fields: [
|
fields: [
|
||||||
[this.$t('Storage'),
|
[this.$t('Backend'),
|
||||||
[
|
[
|
||||||
'VAULT_ENABLED',
|
'VAULT_ENABLED',
|
||||||
'VAULT_HCP_HOST',
|
'VAULT_HCP_HOST',
|
||||||
@@ -68,7 +68,7 @@ export default {
|
|||||||
'VAULT_HCP_MOUNT_POINT'
|
'VAULT_HCP_MOUNT_POINT'
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[this.$t('HistoryRecord'), ['HISTORY_ACCOUNT_CLEAN_LIMIT']]
|
[this.$t('History'), ['HISTORY_ACCOUNT_CLEAN_LIMIT']]
|
||||||
],
|
],
|
||||||
fieldsMeta: {
|
fieldsMeta: {
|
||||||
HISTORY_ACCOUNT_CLEAN_LIMIT: {
|
HISTORY_ACCOUNT_CLEAN_LIMIT: {
|
||||||
|
@@ -46,7 +46,7 @@ export default {
|
|||||||
hidden: !this.$hasPerm('settings.change_vault')
|
hidden: !this.$hasPerm('settings.change_vault')
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: this.$t('VirtualApp'),
|
title: this.$t('VirtualApps'),
|
||||||
name: 'VirtualApp',
|
name: 'VirtualApp',
|
||||||
hidden: !this.$hasPerm('settings.change_virtualapp') || !this.$store.getters.hasValidLicense
|
hidden: !this.$hasPerm('settings.change_virtualapp') || !this.$store.getters.hasValidLicense
|
||||||
}
|
}
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<el-button size="mini" type="primary" @click="visible = !visible"> {{ $t("Setting") }} </el-button>
|
<el-button size="mini" type="primary" icon="el-icon-setting" @click="visible = !visible"> {{ $t("Settings...") }} </el-button>
|
||||||
<Dialog
|
<Dialog
|
||||||
v-if="visible"
|
v-if="visible"
|
||||||
:show-cancel="false"
|
:show-cancel="false"
|
||||||
:show-confirm="false"
|
:show-confirm="false"
|
||||||
:title="$tc('CreateUserSetting')"
|
:title="$tc('Template')"
|
||||||
:visible.sync="visible"
|
:visible.sync="visible"
|
||||||
width="70%"
|
width="70%"
|
||||||
@confirm="onConfirm()"
|
@confirm="onConfirm()"
|
||||||
@@ -21,7 +21,7 @@ import GenericCreateUpdateForm from '@/layout/components/GenericCreateUpdateForm
|
|||||||
import { Dialog } from '@/components'
|
import { Dialog } from '@/components'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'EmailContent',
|
name: 'EmailTemplate',
|
||||||
components: {
|
components: {
|
||||||
GenericCreateUpdateForm,
|
GenericCreateUpdateForm,
|
||||||
Dialog
|
Dialog
|
||||||
@@ -30,8 +30,12 @@ export default {
|
|||||||
return {
|
return {
|
||||||
visible: false,
|
visible: false,
|
||||||
fields: [
|
fields: [
|
||||||
'EMAIL_CUSTOM_USER_CREATED_SUBJECT', 'EMAIL_CUSTOM_USER_CREATED_HONORIFIC',
|
[this.$t('General'), ['EMAIL_SUBJECT_PREFIX']],
|
||||||
'EMAIL_CUSTOM_USER_CREATED_BODY'
|
[this.$t('User creation'),
|
||||||
|
[
|
||||||
|
'EMAIL_CUSTOM_USER_CREATED_SUBJECT', 'EMAIL_CUSTOM_USER_CREATED_HONORIFIC', 'EMAIL_CUSTOM_USER_CREATED_BODY'
|
||||||
|
]
|
||||||
|
]
|
||||||
],
|
],
|
||||||
successUrl: { name: 'Settings', params: { activeMenu: 'EmailContent' }},
|
successUrl: { name: 'Settings', params: { activeMenu: 'EmailContent' }},
|
||||||
fieldsMeta: {
|
fieldsMeta: {
|
@@ -1,94 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div>
|
|
||||||
<el-button size="mini" type="primary" @click="visible = !visible"> {{ $t("Setting") }} </el-button>
|
|
||||||
<Dialog
|
|
||||||
v-if="visible"
|
|
||||||
:destroy-on-close="true"
|
|
||||||
:show-cancel="false"
|
|
||||||
:show-confirm="false"
|
|
||||||
:title="$tc('SMTP')"
|
|
||||||
:visible.sync="visible"
|
|
||||||
width="70%"
|
|
||||||
@confirm="onConfirm()"
|
|
||||||
>
|
|
||||||
<GenericCreateUpdateForm v-bind="$data" />
|
|
||||||
</Dialog>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import GenericCreateUpdateForm from '@/layout/components/GenericCreateUpdateForm/index.vue'
|
|
||||||
import { Dialog } from '@/components'
|
|
||||||
import { UpdateToken } from '@/components/Form/FormFields'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'SMTP',
|
|
||||||
components: {
|
|
||||||
GenericCreateUpdateForm,
|
|
||||||
Dialog
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
visible: false,
|
|
||||||
encryptedFields: ['EMAIL_HOST_PASSWORD'],
|
|
||||||
fields: [
|
|
||||||
[
|
|
||||||
this.$t('BasicInfo'),
|
|
||||||
[
|
|
||||||
'EMAIL_PROTOCOL', 'EMAIL_HOST', 'EMAIL_PORT', 'EMAIL_HOST_USER',
|
|
||||||
'EMAIL_HOST_PASSWORD', 'EMAIL_USE_SSL', 'EMAIL_USE_TLS'
|
|
||||||
]
|
|
||||||
]
|
|
||||||
],
|
|
||||||
successUrl: { name: 'Settings', params: { activeMenu: 'EmailContent' }},
|
|
||||||
fieldsMeta: {
|
|
||||||
EMAIL_PORT: {
|
|
||||||
hidden: (formValue) => formValue.EMAIL_PROTOCOL !== 'smtp'
|
|
||||||
},
|
|
||||||
EMAIL_HOST_PASSWORD: {
|
|
||||||
component: UpdateToken
|
|
||||||
},
|
|
||||||
'EMAIL_CUSTOM_USER_CREATED_BODY': {
|
|
||||||
el: {
|
|
||||||
type: 'textarea',
|
|
||||||
rows: 3
|
|
||||||
}
|
|
||||||
},
|
|
||||||
EMAIL_USE_SSL: {
|
|
||||||
hidden: (formValue) => formValue.EMAIL_PROTOCOL !== 'smtp'
|
|
||||||
},
|
|
||||||
EMAIL_USE_TLS: {
|
|
||||||
hidden: (formValue) => formValue.EMAIL_PROTOCOL !== 'smtp'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
url: '/api/v1/settings/setting/?category=email',
|
|
||||||
submitMethod() {
|
|
||||||
return 'patch'
|
|
||||||
},
|
|
||||||
onConfirm() {
|
|
||||||
},
|
|
||||||
cleanFormValue(data) {
|
|
||||||
if (!data['EMAIL_HOST_PASSWORD']) {
|
|
||||||
delete data['EMAIL_HOST_PASSWORD']
|
|
||||||
}
|
|
||||||
if (data['EMAIL_USE_SSL'] === null) {
|
|
||||||
delete data['EMAIL_USE_SSL']
|
|
||||||
}
|
|
||||||
if (data['EMAIL_USE_TLS'] === null) {
|
|
||||||
delete data['EMAIL_USE_TLS']
|
|
||||||
}
|
|
||||||
if (data['EMAIL_PORT'] === null) {
|
|
||||||
delete data['EMAIL_PORT']
|
|
||||||
}
|
|
||||||
return data
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
|
|
||||||
</style>
|
|
@@ -6,15 +6,14 @@
|
|||||||
v-bind="$data"
|
v-bind="$data"
|
||||||
/>
|
/>
|
||||||
</IBox>
|
</IBox>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { IBox } from '@/components'
|
import { IBox } from '@/components'
|
||||||
import { GenericCreateUpdateForm } from '@/layout/components'
|
import { GenericCreateUpdateForm } from '@/layout/components'
|
||||||
import { testEmailSetting } from '@/api/settings'
|
import { testEmailSetting } from '@/api/settings'
|
||||||
import EmailContent from './EmailContent.vue'
|
import EmailTemplate from './EmailTemplate.vue'
|
||||||
import SMTP from './SMTP.vue'
|
import { UpdateToken } from '@/components/Form/FormFields'
|
||||||
import rules from '@/components/Form/DataForm/rules'
|
import rules from '@/components/Form/DataForm/rules'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -26,39 +25,41 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
const vm = this
|
const vm = this
|
||||||
return {
|
return {
|
||||||
|
encryptedFields: ['EMAIL_HOST_PASSWORD'],
|
||||||
fields: [
|
fields: [
|
||||||
[
|
[this.$t('Server'), [
|
||||||
this.$t('Server'),
|
'EMAIL_PROTOCOL',
|
||||||
[
|
'EMAIL_HOST',
|
||||||
'SMTP'
|
'EMAIL_PORT',
|
||||||
|
'EMAIL_HOST_USER',
|
||||||
|
'EMAIL_HOST_PASSWORD',
|
||||||
|
'EMAIL_FROM',
|
||||||
|
'EMAIL_USE_SSL',
|
||||||
|
'EMAIL_USE_TLS'
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[this.$t('Other'), ['CREATE_USER_MSG']],
|
||||||
this.$t('MailSend'),
|
[this.$t('Test'), ['EMAIL_RECIPIENT']]
|
||||||
[
|
|
||||||
'EMAIL_FROM', 'EMAIL_SUBJECT_PREFIX'
|
|
||||||
]
|
|
||||||
],
|
|
||||||
[
|
|
||||||
this.$t('EmailContent'),
|
|
||||||
[
|
|
||||||
'CREATE_USER_MSG'
|
|
||||||
]
|
|
||||||
],
|
|
||||||
[
|
|
||||||
this.$t('Other'),
|
|
||||||
[
|
|
||||||
'EMAIL_RECIPIENT', 'EMAIL_SUFFIX'
|
|
||||||
]
|
|
||||||
]
|
|
||||||
],
|
],
|
||||||
fieldsMeta: {
|
fieldsMeta: {
|
||||||
|
EMAIL_PORT: {
|
||||||
|
hidden: (formValue) => formValue.EMAIL_PROTOCOL !== 'smtp'
|
||||||
|
},
|
||||||
|
EMAIL_HOST_PASSWORD: {
|
||||||
|
component: UpdateToken
|
||||||
|
},
|
||||||
EMAIL_HOST_USER: {
|
EMAIL_HOST_USER: {
|
||||||
rules: [
|
rules: [
|
||||||
rules.EmailCheck,
|
rules.EmailCheck,
|
||||||
rules.Required
|
rules.Required
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
EMAIL_CUSTOM_USER_CREATED_BODY: {
|
||||||
|
el: {
|
||||||
|
type: 'textarea',
|
||||||
|
rows: 3
|
||||||
|
}
|
||||||
|
},
|
||||||
EMAIL_FROM: {
|
EMAIL_FROM: {
|
||||||
rules: [
|
rules: [
|
||||||
rules.EmailCheck
|
rules.EmailCheck
|
||||||
@@ -69,13 +70,16 @@ export default {
|
|||||||
rules.EmailCheck
|
rules.EmailCheck
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
CREATE_USER_MSG: {
|
EMAIL_USE_SSL: {
|
||||||
label: this.$t('CreateUserSetting'),
|
hidden: (formValue) => formValue.EMAIL_PROTOCOL !== 'smtp'
|
||||||
component: EmailContent
|
|
||||||
},
|
},
|
||||||
SMTP: {
|
EMAIL_USE_TLS: {
|
||||||
label: this.$t('SMTP'),
|
hidden: (formValue) => formValue.EMAIL_PROTOCOL !== 'smtp'
|
||||||
component: SMTP
|
},
|
||||||
|
CREATE_USER_MSG: {
|
||||||
|
label: this.$t('EmailTemplate'),
|
||||||
|
component: EmailTemplate,
|
||||||
|
helpTip: this.$t('EmailTemplateHelpTip')
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
hasDetailInMsg: false,
|
hasDetailInMsg: false,
|
||||||
@@ -104,6 +108,9 @@ export default {
|
|||||||
if (data[key] === null) {
|
if (data[key] === null) {
|
||||||
delete data[key]
|
delete data[key]
|
||||||
}
|
}
|
||||||
|
if (!data['EMAIL_HOST_PASSWORD']) {
|
||||||
|
delete data['EMAIL_HOST_PASSWORD']
|
||||||
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
return data
|
return data
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<el-button size="mini" type="primary" @click="visible=true">{{ $t('Setting') }}</el-button>
|
<el-button size="mini" type="primary" icon="el-icon-setting" @click="visible=true">{{ $t('Settings...') }}</el-button>
|
||||||
<Dialog
|
<Dialog
|
||||||
v-if="visible"
|
v-if="visible"
|
||||||
:destroy-on-close="true"
|
:destroy-on-close="true"
|
||||||
|
@@ -39,14 +39,14 @@ export default {
|
|||||||
],
|
],
|
||||||
fields: [
|
fields: [
|
||||||
[
|
[
|
||||||
this.$t('BasicInfo'),
|
this.$t('Basic'),
|
||||||
[
|
[
|
||||||
'CMPP2_HOST', 'CMPP2_PORT', 'CMPP2_SP_ID', 'CMPP2_SP_SECRET', 'CMPP2_SRC_ID', 'CMPP2_SERVICE_ID',
|
'CMPP2_HOST', 'CMPP2_PORT', 'CMPP2_SP_ID', 'CMPP2_SP_SECRET', 'CMPP2_SRC_ID', 'CMPP2_SERVICE_ID',
|
||||||
'CMPP2_VERIFY_SIGN_NAME', 'CMPP2_VERIFY_TEMPLATE_CODE'
|
'CMPP2_VERIFY_SIGN_NAME', 'CMPP2_VERIFY_TEMPLATE_CODE'
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
this.$t('Other'),
|
this.$t('Test'),
|
||||||
[
|
[
|
||||||
'SMS_TEST_PHONE'
|
'SMS_TEST_PHONE'
|
||||||
]
|
]
|
||||||
|
@@ -37,19 +37,19 @@ export default {
|
|||||||
],
|
],
|
||||||
fields: [
|
fields: [
|
||||||
[
|
[
|
||||||
this.$t('BasicInfo'),
|
this.$t('Basic'),
|
||||||
[
|
[
|
||||||
'ALIBABA_ACCESS_KEY_ID', 'ALIBABA_ACCESS_KEY_SECRET'
|
'ALIBABA_ACCESS_KEY_ID', 'ALIBABA_ACCESS_KEY_SECRET'
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
this.$t('VerifySignTmpl'),
|
this.$t('Template'),
|
||||||
[
|
[
|
||||||
'ALIBABA_VERIFY_SIGN_NAME', 'ALIBABA_VERIFY_TEMPLATE_CODE'
|
'ALIBABA_VERIFY_SIGN_NAME', 'ALIBABA_VERIFY_TEMPLATE_CODE'
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
this.$t('Other'),
|
this.$t('Test'),
|
||||||
[
|
[
|
||||||
'SMS_TEST_PHONE'
|
'SMS_TEST_PHONE'
|
||||||
]
|
]
|
||||||
|
@@ -37,13 +37,13 @@ export default {
|
|||||||
],
|
],
|
||||||
fields: [
|
fields: [
|
||||||
[
|
[
|
||||||
this.$t('BasicInfo'),
|
this.$t('Basic'),
|
||||||
[
|
[
|
||||||
'CUSTOM_SMS_URL', 'CUSTOM_SMS_REQUEST_METHOD', 'CUSTOM_SMS_API_PARAMS'
|
'CUSTOM_SMS_URL', 'CUSTOM_SMS_REQUEST_METHOD', 'CUSTOM_SMS_API_PARAMS'
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
this.$t('Other'),
|
this.$t('Test'),
|
||||||
[
|
[
|
||||||
'SMS_TEST_PHONE'
|
'SMS_TEST_PHONE'
|
||||||
]
|
]
|
||||||
|
@@ -41,7 +41,7 @@ export default {
|
|||||||
],
|
],
|
||||||
fields: [
|
fields: [
|
||||||
[
|
[
|
||||||
this.$t('Other'),
|
this.$t('Test'),
|
||||||
[
|
[
|
||||||
'SMS_TEST_PHONE'
|
'SMS_TEST_PHONE'
|
||||||
]
|
]
|
||||||
|
@@ -39,19 +39,19 @@ export default {
|
|||||||
],
|
],
|
||||||
fields: [
|
fields: [
|
||||||
[
|
[
|
||||||
this.$t('BasicInfo'),
|
this.$t('Basic'),
|
||||||
[
|
[
|
||||||
'HUAWEI_APP_KEY', 'HUAWEI_APP_SECRET', 'HUAWEI_SMS_ENDPOINT'
|
'HUAWEI_APP_KEY', 'HUAWEI_APP_SECRET', 'HUAWEI_SMS_ENDPOINT'
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
this.$t('VerifySignTmpl'),
|
this.$t('Template'),
|
||||||
[
|
[
|
||||||
'HUAWEI_SIGN_CHANNEL_NUM', 'HUAWEI_VERIFY_SIGN_NAME', 'HUAWEI_VERIFY_TEMPLATE_CODE'
|
'HUAWEI_SIGN_CHANNEL_NUM', 'HUAWEI_VERIFY_SIGN_NAME', 'HUAWEI_VERIFY_TEMPLATE_CODE'
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
this.$t('Other'),
|
this.$t('Test'),
|
||||||
[
|
[
|
||||||
'SMS_TEST_PHONE'
|
'SMS_TEST_PHONE'
|
||||||
]
|
]
|
||||||
|
@@ -37,19 +37,19 @@ export default {
|
|||||||
],
|
],
|
||||||
fields: [
|
fields: [
|
||||||
[
|
[
|
||||||
this.$t('BasicInfo'),
|
this.$t('Basic'),
|
||||||
[
|
[
|
||||||
'TENCENT_SECRET_ID', 'TENCENT_SECRET_KEY', 'TENCENT_SDKAPPID'
|
'TENCENT_SECRET_ID', 'TENCENT_SECRET_KEY', 'TENCENT_SDKAPPID'
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
this.$t('VerifySignTmpl'),
|
this.$t('Template'),
|
||||||
[
|
[
|
||||||
'TENCENT_VERIFY_SIGN_NAME', 'TENCENT_VERIFY_TEMPLATE_CODE'
|
'TENCENT_VERIFY_SIGN_NAME', 'TENCENT_VERIFY_TEMPLATE_CODE'
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
this.$t('Other'),
|
this.$t('Test'),
|
||||||
[
|
[
|
||||||
'SMS_TEST_PHONE'
|
'SMS_TEST_PHONE'
|
||||||
]
|
]
|
||||||
|
@@ -30,7 +30,7 @@ export default {
|
|||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
this.$t('SMSProvider'), [
|
this.$t('Provider'), [
|
||||||
'ALIYUN', 'QCLOUD', 'HUAWEICLOUD', 'CMPP2', 'SMSCustom', 'SMSFileCustom'
|
'ALIYUN', 'QCLOUD', 'HUAWEICLOUD', 'CMPP2', 'SMSCustom', 'SMSFileCustom'
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
@@ -36,7 +36,7 @@
|
|||||||
<el-table-column :label="$tc('Actions')" width="200">
|
<el-table-column :label="$tc('Actions')" width="200">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
<el-button v-if="!scope.row.children" type="small" @click="onOpenDialog(scope.row)">
|
<el-button v-if="!scope.row.children" type="small" @click="onOpenDialog(scope.row)">
|
||||||
{{ $t('ChangeReceiver') }}
|
{{ $t('EditRecipient') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
<SelectDialog
|
<SelectDialog
|
||||||
v-if="dialogVisible"
|
v-if="dialogVisible"
|
||||||
:selected-users="dialogSelectedUsers"
|
:selected-users="dialogSelectedUsers"
|
||||||
:title="$tc('ChangeReceiver')"
|
:title="$tc('EditRecipient')"
|
||||||
:visible.sync="dialogVisible"
|
:visible.sync="dialogVisible"
|
||||||
@cancel="dialogVisible=false"
|
@cancel="dialogVisible=false"
|
||||||
@submit="onDialogSelectSubmit"
|
@submit="onDialogSelectSubmit"
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<GenericListPage :header-actions="headerActions" :table-config="tableConfig" />
|
<GenericListPage :header-actions="headerActions" :table-config="tableConfig" />
|
||||||
<Dialog
|
<Dialog
|
||||||
:show-buttons="false"
|
:show-buttons="false"
|
||||||
:title="$tc('Setting')"
|
:title="$tc('General')"
|
||||||
:visible.sync="visible"
|
:visible.sync="visible"
|
||||||
>
|
>
|
||||||
<GenericCreateUpdateForm v-bind="form" @submitSuccess="visible=false" />
|
<GenericCreateUpdateForm v-bind="form" @submitSuccess="visible=false" />
|
||||||
@@ -110,7 +110,7 @@ export default {
|
|||||||
canCreate: this.$hasPerm('orgs.add_organization'),
|
canCreate: this.$hasPerm('orgs.add_organization'),
|
||||||
extraActions: [
|
extraActions: [
|
||||||
{
|
{
|
||||||
title: this.$t('Setting'),
|
title: this.$t('Settings...'),
|
||||||
icon: 'el-icon-setting',
|
icon: 'el-icon-setting',
|
||||||
callback: () => {
|
callback: () => {
|
||||||
this.visible = true
|
this.visible = true
|
||||||
|
@@ -147,11 +147,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
el: {
|
|
||||||
fixed: 'right'
|
|
||||||
},
|
|
||||||
formatterArgs: {
|
formatterArgs: {
|
||||||
fixed: 'right',
|
|
||||||
hasDelete: hasDelete,
|
hasDelete: hasDelete,
|
||||||
canUpdate: ({ row }) => {
|
canUpdate: ({ row }) => {
|
||||||
return this.$hasPerm('users.change_user') &&
|
return this.$hasPerm('users.change_user') &&
|
||||||
|
Reference in New Issue
Block a user