mirror of
https://github.com/veops/cmdb.git
synced 2025-08-08 22:55:00 +08:00
feat:update cs && update style (#488)
This commit is contained in:
@@ -309,10 +309,10 @@ export default {
|
||||
.notice-center-left:hover,
|
||||
.notice-center-left-select {
|
||||
background-color: #f0f5ff;
|
||||
border-color: #custom_colors[color_1];
|
||||
border-color: @primary-color;
|
||||
> span:nth-child(2) {
|
||||
background-color: #fff;
|
||||
color: #custom_colors[color_1];
|
||||
color: @primary-color;
|
||||
}
|
||||
}
|
||||
.notice-center-header {
|
||||
@@ -329,7 +329,7 @@ export default {
|
||||
}
|
||||
> .notice-center-header-app:hover,
|
||||
.notice-center-header-app-selected {
|
||||
background-color: #custom_colors[color_1];
|
||||
background-color: @primary-color;
|
||||
color: #fff;
|
||||
}
|
||||
.notice-center-categories {
|
||||
@@ -342,7 +342,7 @@ export default {
|
||||
> span:hover,
|
||||
.notice-center-categories-selected {
|
||||
color: #fff;
|
||||
background-color: #custom_colors[color_1];
|
||||
background-color: @primary-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,37 +1,34 @@
|
||||
<template>
|
||||
<a-tabs type="card" class="ops-tab" v-model="activeKey" @change="changeActiveKey">
|
||||
<a-tab-pane v-for="item in authList" :key="item.value">
|
||||
<span slot="tab">
|
||||
{{ item.label }}
|
||||
<a-icon
|
||||
v-if="enable_list.find((en) => en.auth_type === item.value)"
|
||||
type="check-circle"
|
||||
theme="filled"
|
||||
style="color:#2f54eb"
|
||||
/>
|
||||
</span>
|
||||
<div class="setting-auth">
|
||||
<components :ref="item.value" :is="item.value === 'OIDC' ? 'OAUTH2' : item.value" :data_type="item.value" />
|
||||
<a-row>
|
||||
<a-col :offset="item.value === 'AuthCommonConfig' ? 5 : 3">
|
||||
<a-space>
|
||||
<a-button :loading="loading" type="primary" @click="handleSave">{{ $t('save') }}</a-button>
|
||||
<template v-if="item.value === 'LDAP'">
|
||||
<a-button :loading="loading" ghost type="primary" @click="handleTest('connect')">{{
|
||||
$t('cs.auth.testConnect')
|
||||
}}</a-button>
|
||||
<a-button :loading="loading" ghost type="primary" @click="handleTest('login')">{{
|
||||
$t('cs.auth.testLogin')
|
||||
}}</a-button>
|
||||
</template>
|
||||
<a-button :loading="loading" @click="handleReset">{{ $t('reset') }}</a-button>
|
||||
</a-space>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</div>
|
||||
<LoginModal v-if="item.value === 'LDAP'" ref="loginModal" @handleOK="(values) => handleTest('login', values)" />
|
||||
</a-tab-pane>
|
||||
</a-tabs>
|
||||
<div class="ops-setting-auth">
|
||||
<a-tabs class="ops-tab" v-model="activeKey" @change="changeActiveKey">
|
||||
<a-tab-pane v-for="item in authList" :key="item.value">
|
||||
<span slot="tab">
|
||||
{{ item.label }}
|
||||
<a-icon v-if="enable_list.find((en) => en.auth_type === item.value)" type="check-circle" theme="filled" />
|
||||
</span>
|
||||
<div class="setting-auth">
|
||||
<components :ref="item.value" :is="item.value === 'OIDC' ? 'OAUTH2' : item.value" :data_type="item.value" />
|
||||
<a-row>
|
||||
<a-col :offset="item.value === 'AuthCommonConfig' ? 5 : 3">
|
||||
<a-space>
|
||||
<a-button :loading="loading" type="primary" @click="handleSave">{{ $t('save') }}</a-button>
|
||||
<template v-if="item.value === 'LDAP'">
|
||||
<a-button :loading="loading" ghost type="primary" @click="handleTest('connect')">{{
|
||||
$t('cs.auth.testConnect')
|
||||
}}</a-button>
|
||||
<a-button :loading="loading" ghost type="primary" @click="handleTest('login')">{{
|
||||
$t('cs.auth.testLogin')
|
||||
}}</a-button>
|
||||
</template>
|
||||
<a-button :loading="loading" @click="handleReset">{{ $t('reset') }}</a-button>
|
||||
</a-space>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</div>
|
||||
<LoginModal v-if="item.value === 'LDAP'" ref="loginModal" @handleOK="(values) => handleTest('login', values)" />
|
||||
</a-tab-pane>
|
||||
</a-tabs>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
@@ -148,12 +145,20 @@ export default {
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.ops-setting-auth {
|
||||
padding: 20px;
|
||||
padding-top: 0;
|
||||
background-color: #fff;
|
||||
border-radius: @border-radius-box;
|
||||
overflow: auto;
|
||||
margin-bottom: -24px;
|
||||
height: calc(100vh - 64px);
|
||||
}
|
||||
.setting-auth {
|
||||
background-color: #fff;
|
||||
height: calc(100vh - 128px);
|
||||
height: calc(100vh - 150px);
|
||||
overflow: auto;
|
||||
border-radius: 0 5px 5px 5px;
|
||||
padding-top: 24px;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -161,10 +166,10 @@ export default {
|
||||
.setting-auth {
|
||||
.jsoneditor-outer {
|
||||
height: var(--custom-height) !important;
|
||||
border: 1px solid #2f54eb;
|
||||
border: 1px solid @primary-color;
|
||||
}
|
||||
div.jsoneditor-menu {
|
||||
background-color: #2f54eb;
|
||||
background-color: @primary-color;
|
||||
}
|
||||
.jsoneditor-modes {
|
||||
display: none;
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="ops-setting-companyinfo" :style="{ height: `${windowHeight - 64}px` }">
|
||||
<div class="ops-setting-companyinfo">
|
||||
<a-form-model ref="infoData" :model="infoData" :label-col="labelCol" :wrapper-col="wrapperCol" :rules="rule">
|
||||
<SpanTitle>{{ $t('cs.companyInfo.spanCompany') }}</SpanTitle>
|
||||
<a-form-model-item :label="$t('cs.companyInfo.name')" prop="name">
|
||||
@@ -35,9 +35,6 @@
|
||||
<a-input v-model="infoData.email" :disabled="!isEditable" />
|
||||
</a-form-model-item>
|
||||
<SpanTitle>{{ $t('cs.companyInfo.spanLogo') }}</SpanTitle>
|
||||
<a-form-model-item :label="$t('cs.companyInfo.messenger')" prop="messenger">
|
||||
<a-input v-model="infoData.messenger" :disabled="!isEditable" />
|
||||
</a-form-model-item>
|
||||
<a-form-model-item :label="$t('cs.companyInfo.domainName')" prop="domainName">
|
||||
<a-input v-model="infoData.domainName" :disabled="!isEditable" />
|
||||
</a-form-model-item>
|
||||
@@ -51,7 +48,6 @@
|
||||
|
||||
<script>
|
||||
import { getCompanyInfo, postCompanyInfo, putCompanyInfo } from '@/api/company'
|
||||
import { mapState } from 'vuex'
|
||||
import SpanTitle from '../components/spanTitle.vue'
|
||||
import { mixinPermissions } from '@/utils/mixin'
|
||||
|
||||
@@ -74,7 +70,6 @@ export default {
|
||||
phone: '',
|
||||
faxCode: '',
|
||||
email: '',
|
||||
messenger: '',
|
||||
domainName: '',
|
||||
},
|
||||
getId: -1,
|
||||
@@ -90,9 +85,6 @@ export default {
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
windowHeight: (state) => state.windowHeight,
|
||||
}),
|
||||
isEditable() {
|
||||
return this.hasDetailPermission('backend', '公司信息', ['update'])
|
||||
},
|
||||
@@ -157,7 +149,6 @@ export default {
|
||||
phone: '',
|
||||
faxCode: '',
|
||||
email: '',
|
||||
messenger: '',
|
||||
domainName: '',
|
||||
}
|
||||
},
|
||||
@@ -167,56 +158,15 @@ export default {
|
||||
|
||||
<style lang="less">
|
||||
.ops-setting-companyinfo {
|
||||
padding-top: 15px;
|
||||
padding: 20px;
|
||||
background-color: #fff;
|
||||
border-radius: @border-radius-box;
|
||||
overflow: auto;
|
||||
margin-bottom: -24px;
|
||||
.ops-setting-companyinfo-upload-show {
|
||||
position: relative;
|
||||
width: 290px;
|
||||
height: 100px;
|
||||
max-height: 100px;
|
||||
img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
height: calc(100vh - 64px);
|
||||
|
||||
.delete-icon {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.ant-upload:hover .delete-icon {
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
right: 5px;
|
||||
color: rgb(247, 85, 85);
|
||||
}
|
||||
.ant-form-item {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.ant-form-item label {
|
||||
padding-right: 10px;
|
||||
}
|
||||
.avatar-uploader > .ant-upload {
|
||||
// max-width: 100px;
|
||||
max-height: 100px;
|
||||
}
|
||||
// .ant-upload.ant-upload-select-picture-card {
|
||||
// width: 100%;
|
||||
// > .ant-upload {
|
||||
// padding: 0px;
|
||||
.ant-upload-picture-card-wrapper {
|
||||
height: 100px;
|
||||
.ant-upload.ant-upload-select-picture-card {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
> .ant-upload {
|
||||
padding: 0px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
@@ -173,9 +173,9 @@ li {
|
||||
color: rgba(0, 0, 0, 0.7);
|
||||
font-size: 14px;
|
||||
.ops-setting-companystructure-sidebar-group-tree-info:hover {
|
||||
color: #custom_colors[color_1];
|
||||
color: @primary-color;
|
||||
> .ops-setting-companystructure-sidebar-group-tree-info::before {
|
||||
background-color: #custom_colors[color_1];
|
||||
background-color: @primary-color;
|
||||
}
|
||||
}
|
||||
// .ops-setting-companystructure-sidebar-group-tree-info:first-child::before {
|
||||
@@ -313,7 +313,7 @@ li {
|
||||
}
|
||||
}
|
||||
> .ops-setting-companystructure-sidebar-group-tree-info::before {
|
||||
background-color: #custom_colors[color_1];
|
||||
background-color: @primary-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -6,7 +6,6 @@
|
||||
:max="500"
|
||||
:paneLengthPixel.sync="paneLengthPixel"
|
||||
appName="setting-structure"
|
||||
triggerColor="#b1c9ff"
|
||||
:triggerLength="18"
|
||||
>
|
||||
<template #one>
|
||||
@@ -396,11 +395,6 @@ export default {
|
||||
title: this.$t('cs.companyStructure.employee'),
|
||||
icon: 'user',
|
||||
},
|
||||
{
|
||||
id: 1,
|
||||
title: this.$t('cs.companyStructure.departmentName'),
|
||||
icon: 'apartment',
|
||||
},
|
||||
]
|
||||
}
|
||||
},
|
||||
@@ -884,7 +878,7 @@ export default {
|
||||
&:hover {
|
||||
background-color: #e1efff;
|
||||
.ops-setting-structure-sidebar-group-header-title {
|
||||
color: #custom_colors[color_1];
|
||||
color: @primary-color;
|
||||
}
|
||||
}
|
||||
.ops-setting-structure-sidebar-group-header-avatar {
|
||||
@@ -925,9 +919,9 @@ export default {
|
||||
font-size: 14px;
|
||||
width: 100%;
|
||||
&:hover {
|
||||
color: #custom_colors[color_1];
|
||||
color: @primary-color;
|
||||
&::before {
|
||||
background-color: #custom_colors[color_1];
|
||||
background-color: @primary-color;
|
||||
}
|
||||
}
|
||||
&::before {
|
||||
@@ -1004,19 +998,19 @@ export default {
|
||||
}
|
||||
}
|
||||
.item-selected {
|
||||
color: #custom_colors[color_1];
|
||||
color: @primary-color;
|
||||
&::before {
|
||||
background-color: #custom_colors[color_1];
|
||||
background-color: @primary-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
.group-selected {
|
||||
background-color: #e1efff;
|
||||
.ops-setting-structure-sidebar-group-header-avatar {
|
||||
background-color: #custom_colors[color_1];
|
||||
background-color: @primary-color;
|
||||
}
|
||||
.ops-setting-structure-sidebar-group-header-title {
|
||||
color: #custom_colors[color_1];
|
||||
color: @primary-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1042,7 +1036,7 @@ export default {
|
||||
display: inline-block;
|
||||
.ops_display_wrapper(#fff);
|
||||
.screening-box-scene-icon {
|
||||
color: #custom_colors[color_1];
|
||||
color: @primary-color;
|
||||
font-size: 12px;
|
||||
}
|
||||
.history-scene-item {
|
||||
@@ -1054,7 +1048,7 @@ export default {
|
||||
.search-form-bar-filter {
|
||||
.ops_display_wrapper();
|
||||
.search-form-bar-filter-icon {
|
||||
color: #custom_colors[color_1];
|
||||
color: @primary-color;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
|
@@ -68,7 +68,7 @@ name: 'SearchForm',
|
||||
background-color: rgb(240, 245, 255);
|
||||
.ops_display_wrapper();
|
||||
.search-form-bar-filter-icon {
|
||||
color: #custom_colors[color_1];
|
||||
color: @primary-color;
|
||||
font-size: 12px;
|
||||
}
|
||||
.search-form-bar-filter-icon_selected{
|
||||
|
@@ -23,10 +23,9 @@ export default {
|
||||
height: 28px;
|
||||
margin-bottom: 12px;
|
||||
line-height: 28px;
|
||||
padding-left: 24px;
|
||||
border-radius: 0px 20px 20px 0px;
|
||||
padding-left: 12px;
|
||||
font-weight: 700;
|
||||
color: #0637bf;
|
||||
background-color: #e0e9ff;
|
||||
color: #000;
|
||||
border-left: 3px solid @primary-color;
|
||||
}
|
||||
</style>
|
||||
|
@@ -1,20 +1,25 @@
|
||||
const cs_en = {
|
||||
menu: {
|
||||
person: 'My Profile',
|
||||
companyInfo: 'Company Info',
|
||||
companyStructure: 'Company Structure',
|
||||
notice: 'Notification Settings',
|
||||
email: 'Email Settings',
|
||||
wx: 'WeChat Work',
|
||||
dingding: 'DingTalk',
|
||||
feishu: 'Feishu',
|
||||
auth: 'Auth Settings',
|
||||
role: 'Role Management',
|
||||
sys: 'System Role',
|
||||
technician: 'Technician Role',
|
||||
user: 'User Role',
|
||||
group: 'User Group',
|
||||
duty: 'Duty Management',
|
||||
menu: {
|
||||
person: 'My Profile',
|
||||
companyInfo: 'Company Info',
|
||||
companyStructure: 'Company Structure',
|
||||
notice: 'Notification Settings',
|
||||
email: 'Email Settings',
|
||||
wx: 'WeChat Work',
|
||||
dingding: 'DingTalk',
|
||||
feishu: 'Feishu',
|
||||
auth: 'Auth Settings',
|
||||
authority: 'Authority Management',
|
||||
sys: 'System Role',
|
||||
technician: 'Technician Role',
|
||||
user: 'User Role',
|
||||
group: 'User Group',
|
||||
duty: 'Duty Management',
|
||||
role: 'Role Management',
|
||||
app: 'APP Authority',
|
||||
basic: 'Basic Settings',
|
||||
theme: 'Theme Settings',
|
||||
security: 'Security Settings'
|
||||
},
|
||||
companyInfo: {
|
||||
spanCompany: 'Description',
|
||||
@@ -37,11 +42,6 @@ const cs_en = {
|
||||
emailValidate: 'Please enter a valid email address',
|
||||
messenger: 'Messenger Address',
|
||||
domainName: 'Deployment Domain',
|
||||
logo: 'Company Logo',
|
||||
upload: 'Upload',
|
||||
editCompanyLogo: 'Edit Company Logo',
|
||||
editCompanyLogoSmall: 'Edit Company Logo Thumbnail',
|
||||
imageSizeLimit2MB: 'Image size does not exceed 2MB',
|
||||
checkInputCorrect: 'Please check if the input content is correct',
|
||||
},
|
||||
companyStructure: {
|
||||
|
@@ -9,12 +9,17 @@ const cs_zh = {
|
||||
dingding: '钉钉',
|
||||
feishu: '飞书',
|
||||
auth: '认证设置',
|
||||
role: '角色管理',
|
||||
authority: '权限管理',
|
||||
sys: '系统角色',
|
||||
technician: '技术员角色',
|
||||
user: '用户角色',
|
||||
group: '用户分组',
|
||||
duty: '值班管理',
|
||||
role: '角色管理',
|
||||
app: '应用权限',
|
||||
basic: '基础设置',
|
||||
theme: '主题配置',
|
||||
security: '安全配置'
|
||||
},
|
||||
companyInfo: {
|
||||
spanCompany: '公司描述',
|
||||
@@ -37,11 +42,6 @@ const cs_zh = {
|
||||
emailValidate: '请输入正确的邮箱地址',
|
||||
messenger: 'Messenger地址',
|
||||
domainName: '部署域名',
|
||||
logo: '公司logo',
|
||||
upload: '上传',
|
||||
editCompanyLogo: '编辑公司logo',
|
||||
editCompanyLogoSmall: '编辑公司logo缩略图',
|
||||
imageSizeLimit2MB: '图片大小不超过2MB',
|
||||
checkInputCorrect: '请检查输入内容是否正确',
|
||||
},
|
||||
companyStructure: {
|
||||
|
80
cmdb-ui/src/views/setting/notice/basic.vue
Normal file
80
cmdb-ui/src/views/setting/notice/basic.vue
Normal file
@@ -0,0 +1,80 @@
|
||||
<template>
|
||||
<div class="ops-setting-notice-basic">
|
||||
<a-form-model ref="infoData" :model="infoData" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||
<a-form-model-item :label="$t('cs.companyInfo.messenger')" prop="messenger">
|
||||
<a-input v-model="infoData.messenger" :disabled="!isEditable" />
|
||||
</a-form-model-item>
|
||||
<a-form-model-item :wrapper-col="{ span: 14, offset: 3 }" v-if="isEditable">
|
||||
<a-button type="primary" @click="onSubmit"> {{ $t('save') }}</a-button>
|
||||
<a-button ghost type="primary" style="margin-left: 28px" @click="resetForm"> {{ $t('reset') }}</a-button>
|
||||
</a-form-model-item>
|
||||
</a-form-model>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getCompanyInfo, postCompanyInfo, putCompanyInfo } from '@/api/company'
|
||||
import { mixinPermissions } from '@/utils/mixin'
|
||||
|
||||
export default {
|
||||
name: 'CompanyInfo',
|
||||
mixins: [mixinPermissions],
|
||||
data() {
|
||||
return {
|
||||
labelCol: { span: 3 },
|
||||
wrapperCol: { span: 10 },
|
||||
infoData: {
|
||||
messenger: '',
|
||||
},
|
||||
getId: -1,
|
||||
}
|
||||
},
|
||||
async mounted() {
|
||||
const res = await getCompanyInfo()
|
||||
if (!res.id) {
|
||||
this.getId = -1
|
||||
} else {
|
||||
this.infoData = res.info
|
||||
this.getId = res.id
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
isEditable() {
|
||||
return this.hasDetailPermission('backend', '公司信息', ['update'])
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
async onSubmit() {
|
||||
this.$refs.infoData.validate(async (valid) => {
|
||||
if (valid) {
|
||||
if (this.getId === -1) {
|
||||
await postCompanyInfo(this.infoData)
|
||||
} else {
|
||||
await putCompanyInfo(this.getId, this.infoData)
|
||||
}
|
||||
this.$message.success(this.$t('saveSuccess'))
|
||||
} else {
|
||||
this.$message.warning(this.$t('cs.companyInfo.checkInputCorrect'))
|
||||
return false
|
||||
}
|
||||
})
|
||||
},
|
||||
resetForm() {
|
||||
this.infoData = {
|
||||
messenger: '',
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="less">
|
||||
.ops-setting-notice-basic {
|
||||
padding-top: 20px;
|
||||
background-color: #fff;
|
||||
border-radius: @border-radius-box;
|
||||
overflow: auto;
|
||||
margin-bottom: -24px;
|
||||
height: calc(100vh - 64px);
|
||||
}
|
||||
</style>
|
@@ -1,106 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<vxe-table
|
||||
ref="xTable"
|
||||
:data="tableData"
|
||||
size="mini"
|
||||
stripe
|
||||
class="ops-stripe-table"
|
||||
show-overflow
|
||||
:edit-config="{ showIcon: false, trigger: 'manual', mode: 'row' }"
|
||||
>
|
||||
<vxe-column v-for="col in columns" :key="col.field" :field="col.field" :title="col.title" :edit-render="{}">
|
||||
<template #header> <span v-if="col.required" :style="{ color: 'red' }">* </span>{{ col.title }} </template>
|
||||
<template #edit="{ row }">
|
||||
<vxe-input v-model="row[col.field]" type="text"></vxe-input>
|
||||
</template>
|
||||
</vxe-column>
|
||||
<vxe-column :title="$t('operation')" width="80" v-if="!disabled">
|
||||
<template #default="{ row }">
|
||||
<template v-if="$refs.xTable.isActiveByRow(row)">
|
||||
<a @click="saveRowEvent(row)"><a-icon type="save"/></a>
|
||||
</template>
|
||||
<a-space v-else>
|
||||
<a @click="editRowEvent(row)"><ops-icon type="icon-xianxing-edit"/></a>
|
||||
<a style="color:red" @click="deleteRowEvent(row)"><ops-icon type="icon-xianxing-delete"/></a>
|
||||
</a-space>
|
||||
</template>
|
||||
</vxe-column>
|
||||
</vxe-table>
|
||||
<div :style="{ color: '#f5222d' }" v-if="errorFlag">{{ $t('cs.notice.robotConfigErrorTips') }}</div>
|
||||
<a-button v-if="!disabled" icon="plus-circle" class="ops-button-primary" type="primary" @click="insertEvent">{{
|
||||
$t('add')
|
||||
}}</a-button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'Bot',
|
||||
props: {
|
||||
columns: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tableData: [],
|
||||
errorFlag: false,
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async insertEvent() {
|
||||
const $table = this.$refs.xTable
|
||||
const record = {
|
||||
name: '',
|
||||
url: '',
|
||||
}
|
||||
const { row: newRow } = await $table.insertAt(record, -1)
|
||||
await $table.setActiveRow(newRow)
|
||||
},
|
||||
saveRowEvent(row) {
|
||||
const $table = this.$refs.xTable
|
||||
$table.clearActived()
|
||||
},
|
||||
editRowEvent(row) {
|
||||
const $table = this.$refs.xTable
|
||||
$table.setActiveRow(row)
|
||||
},
|
||||
deleteRowEvent(row) {
|
||||
const $table = this.$refs.xTable
|
||||
$table.remove(row)
|
||||
},
|
||||
getData(callback) {
|
||||
const $table = this.$refs.xTable
|
||||
const { fullData: _tableData } = $table.getTableData()
|
||||
const requiredObj = {}
|
||||
this.columns.forEach((col) => {
|
||||
if (col.required) {
|
||||
requiredObj[col.field] = true
|
||||
}
|
||||
})
|
||||
let flag = true
|
||||
_tableData.forEach((td) => {
|
||||
Object.keys(requiredObj).forEach((key) => {
|
||||
if (requiredObj[key]) {
|
||||
flag = !!(flag && td[`${key}`])
|
||||
}
|
||||
})
|
||||
})
|
||||
this.errorFlag = !flag
|
||||
callback(flag, _tableData)
|
||||
},
|
||||
setData(value) {
|
||||
this.tableData = value
|
||||
this.errorFlag = false
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style></style>
|
@@ -1,151 +0,0 @@
|
||||
<template>
|
||||
<div class="notice-dingding-wrapper" :style="{ height: `${windowHeight - 64}px` }">
|
||||
<a-form-model ref="dingdingForm" :model="dingdingData" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||
<SpanTitle>{{ $t('cs.duty.basicSetting') }}</SpanTitle>
|
||||
<a-form-model-item :label="$t('cs.notice.appKey')">
|
||||
<a-input v-model="dingdingData.appKey" :disabled="!isEditable" />
|
||||
</a-form-model-item>
|
||||
<a-form-model-item :label="$t('cs.notice.appSecret')">
|
||||
<a-input v-model="dingdingData.appSecret" :disabled="!isEditable" />
|
||||
</a-form-model-item>
|
||||
<a-form-model-item :label="$t('cs.notice.robotCode')">
|
||||
<a-input v-model="dingdingData.robotCode" :disabled="!isEditable" />
|
||||
</a-form-model-item>
|
||||
<a-form-model-item :label="$t('cs.notice.robot')">
|
||||
<Bot
|
||||
ref="bot"
|
||||
:disabled="!isEditable"
|
||||
:columns="[
|
||||
{
|
||||
field: 'name',
|
||||
title: $t('cs.notice.title'),
|
||||
required: true,
|
||||
},
|
||||
{
|
||||
field: 'url',
|
||||
title: $t('cs.notice.webhookAddress'),
|
||||
required: true,
|
||||
},
|
||||
{
|
||||
field: 'token',
|
||||
title: 'token',
|
||||
required: false,
|
||||
},
|
||||
]"
|
||||
/>
|
||||
</a-form-model-item>
|
||||
<!-- <a-form-model-item :label="测试邮件设置">
|
||||
<a-button type="primary" ghost>测试回收箱</a-button>
|
||||
<br />
|
||||
<span
|
||||
class="notice-dingding-wrapper-tips"
|
||||
><ops-icon type="icon-shidi-quxiao" :style="{ color: '#D81E06' }" /> 邮件接收失败</span
|
||||
>
|
||||
<br />
|
||||
<span>邮箱服务器未配置,请配置一个邮箱服务器 | <a>故障诊断</a></span>
|
||||
</a-form-model-item> -->
|
||||
<a-row v-if="isEditable">
|
||||
<a-col :span="16" :offset="3">
|
||||
<a-form-model-item :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||
<a-button type="primary" @click="onSubmit"> {{ $t('save') }} </a-button>
|
||||
<a-button ghost type="primary" style="margin-left: 28px;" @click="resetForm"> {{ $t('reset') }} </a-button>
|
||||
</a-form-model-item>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-form-model>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex'
|
||||
import SpanTitle from '../components/spanTitle.vue'
|
||||
import { getNoticeConfigByPlatform, postNoticeConfigByPlatform, putNoticeConfigByPlatform } from '@/api/noticeSetting'
|
||||
import { mixinPermissions } from '@/utils/mixin'
|
||||
import Bot from './bot.vue'
|
||||
|
||||
export default {
|
||||
name: 'NoticeDingding',
|
||||
components: { SpanTitle, Bot },
|
||||
mixins: [mixinPermissions],
|
||||
data() {
|
||||
return {
|
||||
labelCol: { lg: 3, md: 5, sm: 8 },
|
||||
wrapperCol: { lg: 15, md: 19, sm: 16 },
|
||||
id: null,
|
||||
dingdingData: {
|
||||
appKey: '',
|
||||
appSecret: '',
|
||||
robotCode: '',
|
||||
},
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
windowHeight: (state) => state.windowHeight,
|
||||
}),
|
||||
isEditable() {
|
||||
return this.hasDetailPermission('backend', '通知设置', ['update'])
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.getData()
|
||||
},
|
||||
methods: {
|
||||
getData() {
|
||||
getNoticeConfigByPlatform({ platform: 'dingdingApp' }).then((res) => {
|
||||
this.id = res?.id ?? null
|
||||
if (this.id) {
|
||||
this.dingdingData = res.info
|
||||
this.$refs.bot.setData(res?.info?.bot)
|
||||
}
|
||||
})
|
||||
},
|
||||
onSubmit() {
|
||||
this.$refs.dingdingForm.validate(async (valid) => {
|
||||
if (valid) {
|
||||
this.$refs.bot.getData(async (flag, bot) => {
|
||||
if (flag) {
|
||||
if (this.id) {
|
||||
await putNoticeConfigByPlatform(this.id, { info: { ...this.dingdingData, bot, label: this.$t('cs.person.dingdingApp') } })
|
||||
} else {
|
||||
await postNoticeConfigByPlatform({
|
||||
platform: 'dingdingApp',
|
||||
info: { ...this.dingdingData, bot, label: this.$t('cs.person.dingdingApp') },
|
||||
})
|
||||
}
|
||||
this.$message.success(this.$t('saveSuccess'))
|
||||
this.getData()
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
resetForm() {
|
||||
this.dingdingData = {
|
||||
appKey: '',
|
||||
appSecret: '',
|
||||
robotCode: '',
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.notice-dingding-wrapper {
|
||||
background-color: #fff;
|
||||
padding-top: 15px;
|
||||
overflow: auto;
|
||||
margin-bottom: -24px;
|
||||
border-radius: @border-radius-box;
|
||||
.notice-dingding-wrapper-tips {
|
||||
display: inline-block;
|
||||
background-color: #ffdfdf;
|
||||
border-radius: 4px;
|
||||
padding: 0 12px;
|
||||
width: 300px;
|
||||
color: #000000;
|
||||
margin-top: 8px;
|
||||
}
|
||||
}
|
||||
</style>
|
@@ -1,6 +1,5 @@
|
||||
.notice-email-wrapper {
|
||||
background-color: #fff;
|
||||
padding-top: 24px;
|
||||
overflow: auto;
|
||||
.notice-email-error-tips {
|
||||
display: inline-block;
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div :style="{ marginBottom: '-24px' }">
|
||||
<a-tabs :activeKey="activeKey" @change="changeTab" class="ops-tab" type="card">
|
||||
<div class="ops-setting-notice-mail">
|
||||
<a-tabs :activeKey="activeKey" @change="changeTab" class="ops-tab">
|
||||
<!-- <a-tab-pane key="1" tab="接收服务器">
|
||||
<Receive />
|
||||
</a-tab-pane> -->
|
||||
@@ -30,4 +30,14 @@ export default {
|
||||
}
|
||||
</script>
|
||||
|
||||
<style></style>
|
||||
<style lang="less" scoped>
|
||||
.ops-setting-notice-mail {
|
||||
padding: 20px;
|
||||
padding-top: 0;
|
||||
background-color: #fff;
|
||||
border-radius: @border-radius-box;
|
||||
overflow: auto;
|
||||
margin-bottom: -24px;
|
||||
height: calc(100vh - 64px);
|
||||
}
|
||||
</style>
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="notice-email-wrapper" :style="{ height: `${windowHeight - 104}px` }">
|
||||
<div class="notice-email-wrapper">
|
||||
<a-form-model ref="sendForm" :model="settingData" :label-col="labelCol" :rules="rules" :wrapper-col="wrapperCol">
|
||||
<SpanTitle>{{ $t('cs.duty.basicSetting') }}</SpanTitle>
|
||||
<a-form-model-item :label="$t('cs.notice.isEncrypted')">
|
||||
|
@@ -1,131 +0,0 @@
|
||||
<template>
|
||||
<div class="notice-feishu-wrapper" :style="{ height: `${windowHeight - 64}px` }">
|
||||
<a-form-model ref="feishuForm" :model="feishuData" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||
<SpanTitle>{{ $t('cs.duty.basicSetting') }}</SpanTitle>
|
||||
<a-form-model-item :label="$t('cs.notice.appKey')">
|
||||
<a-input v-model="feishuData.id" :disabled="!isEditable" />
|
||||
</a-form-model-item>
|
||||
<a-form-model-item :label="$t('cs.notice.appSecret')">
|
||||
<a-input v-model="feishuData.password" :disabled="!isEditable" />
|
||||
</a-form-model-item>
|
||||
<a-form-model-item :label="$t('cs.notice.robot')">
|
||||
<Bot
|
||||
ref="bot"
|
||||
:disabled="!isEditable"
|
||||
:columns="[
|
||||
{
|
||||
field: 'name',
|
||||
title: $t('cs.notice.title'),
|
||||
required: true,
|
||||
},
|
||||
{
|
||||
field: 'url',
|
||||
title: $t('cs.notice.webhookAddress'),
|
||||
required: true,
|
||||
},
|
||||
]"
|
||||
/>
|
||||
</a-form-model-item>
|
||||
<a-row v-if="isEditable">
|
||||
<a-col :span="16" :offset="3">
|
||||
<a-form-model-item :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||
<a-button type="primary" @click="onSubmit"> {{ $t('save') }} </a-button>
|
||||
<a-button ghost type="primary" style="margin-left: 28px;" @click="resetForm"> {{ $t('reset') }} </a-button>
|
||||
</a-form-model-item>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-form-model>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex'
|
||||
import SpanTitle from '../components/spanTitle.vue'
|
||||
import { getNoticeConfigByPlatform, postNoticeConfigByPlatform, putNoticeConfigByPlatform } from '@/api/noticeSetting'
|
||||
import { mixinPermissions } from '@/utils/mixin'
|
||||
import Bot from './bot.vue'
|
||||
|
||||
export default {
|
||||
name: 'NoticeFeishu',
|
||||
components: { SpanTitle, Bot },
|
||||
mixins: [mixinPermissions],
|
||||
data() {
|
||||
return {
|
||||
labelCol: { lg: 3, md: 5, sm: 8 },
|
||||
wrapperCol: { lg: 15, md: 19, sm: 16 },
|
||||
id: null,
|
||||
feishuData: {
|
||||
id: '',
|
||||
password: '',
|
||||
},
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
windowHeight: (state) => state.windowHeight,
|
||||
}),
|
||||
isEditable() {
|
||||
return this.hasDetailPermission('backend', '通知设置', ['update'])
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.getData()
|
||||
},
|
||||
methods: {
|
||||
getData() {
|
||||
getNoticeConfigByPlatform({ platform: 'feishuApp' }).then((res) => {
|
||||
this.id = res?.id ?? null
|
||||
if (this.id) {
|
||||
this.feishuData = res.info
|
||||
this.$refs.bot.setData(res?.info?.bot)
|
||||
}
|
||||
})
|
||||
},
|
||||
onSubmit() {
|
||||
this.$refs.feishuForm.validate(async (valid) => {
|
||||
if (valid) {
|
||||
this.$refs.bot.getData(async (flag, bot) => {
|
||||
if (flag) {
|
||||
if (this.id) {
|
||||
await putNoticeConfigByPlatform(this.id, { info: { ...this.feishuData, bot, label: this.$t('cs.person.feishuApp') } })
|
||||
} else {
|
||||
await postNoticeConfigByPlatform({
|
||||
platform: 'feishuApp',
|
||||
info: { ...this.feishuData, bot, label: this.$t('cs.person.feishuApp') },
|
||||
})
|
||||
}
|
||||
this.$message.success(this.$t('saveSuccess'))
|
||||
this.getData()
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
resetForm() {
|
||||
this.feishuData = {
|
||||
id: '',
|
||||
password: '',
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.notice-feishu-wrapper {
|
||||
background-color: #fff;
|
||||
padding-top: 15px;
|
||||
overflow: auto;
|
||||
margin-bottom: -24px;
|
||||
border-radius: @border-radius-box;
|
||||
.notice-feishu-wrapper-tips {
|
||||
display: inline-block;
|
||||
background-color: #ffdfdf;
|
||||
border-radius: 4px;
|
||||
padding: 0 12px;
|
||||
width: 300px;
|
||||
color: #000000;
|
||||
margin-top: 8px;
|
||||
}
|
||||
}
|
||||
</style>
|
@@ -1,152 +0,0 @@
|
||||
<template>
|
||||
<div class="notice-wx-wrapper" :style="{ height: `${windowHeight - 64}px` }">
|
||||
<a-form-model ref="wxForm" :model="wxData" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||
<SpanTitle>{{ $t('cs.duty.basicSetting') }}</SpanTitle>
|
||||
<a-form-model-item :label="$t('cs.notice.corpid')">
|
||||
<a-input v-model="wxData.corpid" :disabled="!isEditable" />
|
||||
</a-form-model-item>
|
||||
<a-form-model-item :label="$t('cs.notice.agentid')">
|
||||
<a-input v-model="wxData.agentid" :disabled="!isEditable" />
|
||||
</a-form-model-item>
|
||||
<a-form-model-item :label="$t('cs.notice.corpsecret')">
|
||||
<a-input-password v-model="wxData.corpsecret" :disabled="!isEditable" />
|
||||
</a-form-model-item>
|
||||
<a-form-model-item label="ITSM AppId">
|
||||
<a-input v-model="wxData.itsm_app_id" :disabled="!isEditable" />
|
||||
</a-form-model-item>
|
||||
<a-form-model-item :label="$t('cs.notice.robot')">
|
||||
<Bot
|
||||
ref="bot"
|
||||
:disabled="!isEditable"
|
||||
:columns="[
|
||||
{
|
||||
field: 'name',
|
||||
title: $t('cs.notice.title'),
|
||||
required: true,
|
||||
},
|
||||
{
|
||||
field: 'url',
|
||||
title: $t('cs.notice.webhookAddress'),
|
||||
required: true,
|
||||
},
|
||||
]"
|
||||
/>
|
||||
</a-form-model-item>
|
||||
<!-- <a-form-model-item :label="测试邮件设置">
|
||||
<a-button type="primary" ghost>测试回收箱</a-button>
|
||||
<br />
|
||||
<span
|
||||
class="notice-wx-wrapper-tips"
|
||||
><ops-icon type="icon-shidi-quxiao" :style="{ color: '#D81E06' }" /> 邮件接收失败</span
|
||||
>
|
||||
<br />
|
||||
<span>邮箱服务器未配置,请配置一个邮箱服务器 | <a>故障诊断</a></span>
|
||||
</a-form-model-item> -->
|
||||
<a-row v-if="isEditable">
|
||||
<a-col :span="16" :offset="3">
|
||||
<a-form-model-item :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||
<a-button type="primary" @click="onSubmit"> {{ $t('save') }} </a-button>
|
||||
<a-button ghost type="primary" style="margin-left: 28px;" @click="resetForm"> {{ $t('reset') }} </a-button>
|
||||
</a-form-model-item>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-form-model>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex'
|
||||
import SpanTitle from '../components/spanTitle.vue'
|
||||
import { getNoticeConfigByPlatform, postNoticeConfigByPlatform, putNoticeConfigByPlatform } from '@/api/noticeSetting'
|
||||
import { mixinPermissions } from '@/utils/mixin'
|
||||
import Bot from './bot.vue'
|
||||
export default {
|
||||
name: 'NoticeWx',
|
||||
mixins: [mixinPermissions],
|
||||
components: { SpanTitle, Bot },
|
||||
data() {
|
||||
return {
|
||||
labelCol: { lg: 3, md: 5, sm: 8 },
|
||||
wrapperCol: { lg: 15, md: 19, sm: 16 },
|
||||
id: null,
|
||||
wxData: {
|
||||
corpid: '',
|
||||
agentid: '',
|
||||
corpsecret: '',
|
||||
itsm_app_id: '',
|
||||
},
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
windowHeight: (state) => state.windowHeight,
|
||||
}),
|
||||
isEditable() {
|
||||
return this.hasDetailPermission('backend', '通知设置', ['update'])
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.getData()
|
||||
},
|
||||
methods: {
|
||||
getData() {
|
||||
getNoticeConfigByPlatform({ platform: 'wechatApp' }).then((res) => {
|
||||
this.id = res?.id ?? null
|
||||
if (this.id) {
|
||||
this.wxData = res.info
|
||||
this.$refs.bot.setData(res?.info?.bot)
|
||||
}
|
||||
})
|
||||
},
|
||||
onSubmit() {
|
||||
this.$refs.wxForm.validate(async (valid) => {
|
||||
if (valid) {
|
||||
this.$refs.bot.getData(async (flag, bot) => {
|
||||
if (flag) {
|
||||
if (this.id) {
|
||||
await putNoticeConfigByPlatform(this.id, {
|
||||
info: { ...this.wxData, bot, label: this.$t('cs.person.wechatApp') },
|
||||
})
|
||||
} else {
|
||||
await postNoticeConfigByPlatform({
|
||||
platform: 'wechatApp',
|
||||
info: { ...this.wxData, bot, label: this.$t('cs.person.wechatApp') },
|
||||
})
|
||||
}
|
||||
this.$message.success(this.$t('saveSuccess'))
|
||||
this.getData()
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
resetForm() {
|
||||
this.wxData = {
|
||||
corpid: '',
|
||||
agentid: '',
|
||||
corpsecret: '',
|
||||
itsm_app_id: '',
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.notice-wx-wrapper {
|
||||
background-color: #fff;
|
||||
padding-top: 15px;
|
||||
overflow: auto;
|
||||
margin-bottom: -24px;
|
||||
border-radius: @border-radius-box;
|
||||
.notice-wx-wrapper-tips {
|
||||
display: inline-block;
|
||||
background-color: #ffdfdf;
|
||||
border-radius: 4px;
|
||||
padding: 0 12px;
|
||||
width: 300px;
|
||||
color: #000000;
|
||||
margin-top: 8px;
|
||||
}
|
||||
}
|
||||
</style>
|
@@ -372,7 +372,7 @@ export default {
|
||||
margin-bottom: 5px;
|
||||
&:hover {
|
||||
.ops_popover_item_selected();
|
||||
border-color: #custom_colors[color_1];
|
||||
border-color: @primary-color;
|
||||
}
|
||||
> i {
|
||||
margin-right: 10px;
|
||||
@@ -380,7 +380,7 @@ export default {
|
||||
}
|
||||
.setting-person-left-item-selected {
|
||||
.ops_popover_item_selected();
|
||||
border-color: #custom_colors[color_1];
|
||||
border-color: @primary-color;
|
||||
}
|
||||
}
|
||||
.setting-person-right {
|
||||
@@ -390,7 +390,7 @@ export default {
|
||||
border-radius: @border-radius-box;
|
||||
padding: 24px 48px;
|
||||
.setting-person-right-disabled {
|
||||
background-color: #custom_colors[color_2];
|
||||
background-color: @primary-color_5;
|
||||
border-radius: 4px;
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
|
Reference in New Issue
Block a user