Commit bb50f737 authored by combineli's avatar combineli
Browse files

配种中心

parent 4636fea5
Showing with 2277 additions and 396 deletions
+2277 -396
......@@ -74,8 +74,12 @@ if (dcacheConf.enableDcache) {
app.use(async (ctx, next) => {
await next(); ctx.cookies.set('dcache', 'true')
});
// tars-dcache 的包,依赖了很多tars的模块,引用路径是从根目录开始的,防止引用出错,先改后更
let cwd = process.cwd();
process.chdir('./');
// let tarsDcache = require('./../../../nodejs_modules/tars-dcache');
let tarsDcache = require('@tencent/tars-dcache');
process.chdir(cwd);
}
//激活router
......
......@@ -80,7 +80,7 @@ ServerDao.getServerConfByTemplate = async(templateName) => {
})
};
ServerDao.getServerConf4Tree = async(applicationList, serverNameList) => {
ServerDao.getServerConf4Tree = async(applicationList, serverNameList, allAttr) => {
let where = {$or: []};
if (!!applicationList) {
where.$or.push({application: applicationList});
......@@ -91,12 +91,20 @@ ServerDao.getServerConf4Tree = async(applicationList, serverNameList) => {
if (!applicationList && !serverNameList) {
where = {};
}
return await tServerConf.findAll({
attributes: [[Sequelize.literal('distinct `application`'), 'application'],
let option = {};
option.where = where;
if (allAttr) {
} else {
option.attributes = [[Sequelize.literal('distinct `application`'), 'application'],
'server_name', 'enable_set', 'set_name', 'set_area', 'set_group'
],
where: where
});
]
}
return await tServerConf.findAll(option);
};
......
......@@ -109,6 +109,11 @@ ServerService.getNodeNameList = async(params)=> {
return await ServerDao.getNodeNameList(params);
};
// 用服务名数组去获取服务列表
ServerService.getServerNameList = async({applicationList, serverNameList, allAttr=false})=> {
return await ServerDao.getServerConf4Tree(applicationList, serverNameList, allAttr);
};
ServerService.addServerConf = async(params)=> {
let transaction = await ServerDao.sequelize.transaction();
try{
......
......@@ -14,7 +14,7 @@
* specific language governing permissions and limitations under the License.
*/
// **********************************************************************
// **********************************************************************
// This file was generated by a TARS parser!
// TARS version 1.1.0.
// **********************************************************************
......
......@@ -265,6 +265,35 @@ struct TransferRsp
};
struct CacheConfigReq
{
0 optional string id; // config item 表索引id
1 optional string remark; // 备注
2 optional string item; // 配置项名,如:ObjName
3 optional string path; // 配置项路径,如:Main, Main/Cache
4 optional string reload; // 重载配置值
5 optional string period; // 公共配置-U, 一期配置-T, 二期配置-MK
};
struct ServerConfigReq
{
0 optional string appName; // 应用名,如:TestApp
1 optional string moduleName; // 模块名,如:TestAppModule1
2 optional string serverName; // 服务名,如:DCache.TestAppModule1TCache1-1
3 optional string nodeName; // 服务节点ip
4 optional string itemId; // config item 表索引id
5 optional string configValue; // 配置值
6 optional string configFlag; // 默认填 0
7 optional string lastUser; // 最后修改配置的用户名,默认 system
8 optional string indexId; // config table 表索引id
};
struct ConfigRsp
{
0 require string errMsg;
1 optional vector<map<string, string> > configItemList;
};
interface DCacheOpt
{
/*
......@@ -318,6 +347,33 @@ interface DCacheOpt
*/
int expandDCache(ExpandReq expandReq, out ExpandRsp expandRsq);
/*
* 配置中心操作接口
*/
int addCacheConfigItem(CacheConfigReq configReq, out ConfigRsp configRsq);
int updateCacheConfigItem(CacheConfigReq configReq, out ConfigRsp configRsq);
int deleteCacheConfigItem(CacheConfigReq configReq, out ConfigRsp configRsq);
int getCacheConfigItemList(CacheConfigReq configReq, out ConfigRsp configRsq);
int addServerConfigItem(ServerConfigReq configReq, out ConfigRsp configRsq);
int updateServerConfigItem(ServerConfigReq configReq, out ConfigRsp configRsq);
int updateServerConfigItemBatch(vector<ServerConfigReq> configReq, out ConfigRsp configRsq);
int deleteServerConfigItem(ServerConfigReq configReq, out ConfigRsp configRsq);
int deleteServerConfigItemBatch(vector<ServerConfigReq> configReq, out ConfigRsp configRsq);
int getServerNodeConfigItemList(ServerConfigReq configReq, out ConfigRsp configRsq);
int getServerConfigItemList(ServerConfigReq configReq, out ConfigRsp configRsq);
};
};
This diff is collapsed.
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>DCACHE</title><link href=/static/css/dcache.a2771.css rel=stylesheet></head><body><div id=app></div><script>function isIE(){
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>DCACHE</title><link href=/static/css/dcache.fbbc3.css rel=stylesheet></head><body><div id=app></div><script>function isIE(){
if(!!window.ActiveXObject || "ActiveXObject" in window)
return true;
else
......@@ -7,4 +7,4 @@
if(isIE()) {
var body = document.querySelector('body');
body.innerHTML='<div style="width:500px;margin:0 auto">系统不支持IE浏览器,建议您更换为chrome以获得更好的体验</div>';
}</script><script type=text/javascript src=/static/js/manifest.61e49.js></script><script type=text/javascript src=/static/js/vendor.200e1.js></script><script type=text/javascript src=/static/js/dcache.1fcba.js></script></body></html>
\ No newline at end of file
}</script><script type=text/javascript src=/static/js/manifest.61e49.js></script><script type=text/javascript src=/static/js/vendor.200e1.js></script><script type=text/javascript src=/static/js/dcache.7b8f4.js></script></body></html>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
......@@ -14,6 +14,7 @@
<let-tab-pane :tab="$t('header.tab.tab1')" tabkey="/server" :icon="serverIcon"></let-tab-pane>
<let-tab-pane :tab="$t('header.tab.tab2')" tabkey="/operation" :icon="opaIcon"></let-tab-pane>
<let-tab-pane :tab="$t('header.tab.tab3')" tabkey="/releasePackage" :icon="opaIcon"></let-tab-pane>
<let-tab-pane :tab="$t('header.tab.tab4')" tabkey="/config" :icon="opaIcon"></let-tab-pane>
</let-tabs>
<div class="language-wrap">
<let-select v-model="locale" @change="changeLocale" :clearable="false">
......
......@@ -85,4 +85,17 @@ export default {
margin-left: 16px;
}
}
.page_operation {
padding-top: 30px;
padding-bottom: 40px;
&_children {
padding: 20px 0;
}
}
.danger {
color: var(--off-color);
}
</style>
......@@ -5,6 +5,17 @@
<let-table-column :title="$t('cache.config.path')" prop="path"></let-table-column>
<let-table-column :title="$t('cache.config.item')" prop="item"></let-table-column>
<let-table-column :title="$t('cache.config.value')" prop="config_value"></let-table-column>
<let-table-column :title="$t('cache.config.modify_value')" prop="config_value">
<template slot-scope="{row}">
<let-input size="small" v-model="row.modify_value"></let-input>
</template>
</let-table-column>
<let-table-column :title="$t('operate.operates')" >
<template slot-scope="{row}">
<let-table-operation @click="saveConfig(row)">{{$t('operate.save')}}</let-table-operation>
<let-table-operation @click="deleteConfig(row)" class="danger">{{$t('operate.delete')}}</let-table-operation>
</template>
</let-table-column>
</let-table>
</section>
</template>
......@@ -12,7 +23,6 @@
<script>
export default {
props: {
moduleName: {type: String, required: true},
serverName: {type: String, required: true},
nodeName: {type: String, required: true},
},
......@@ -25,16 +35,37 @@
async getServerConfig () {
try {
let option = {
moduleName: this.moduleName,
serverName: this.serverName,
nodeName: this.nodeName,
};
let configItemList = await this.$ajax.getJSON('/server/api/cache/getServerConfig', option);
let configItemList = await this.$ajax.getJSON('/server/api/cache/getServerNodeConfig', option);
// 添加被修改的空值
configItemList.forEach(item => item.modify_value="");
this.configList = configItemList;
} catch (err) {
console.error(err)
this.$tip.error(`${this.$t('common.error')}: ${err.message || err.err_msg}`);
}
},
deleteConfig ({id}) {
this.$confirm(this.$t('cache.config.deleteConfig'), this.$t('common.alert')).then(async () => {
try {
let configItemList = await this.$ajax.getJSON('/server/api/cache/deleteServerConfigItem', {id});
await this.getServerConfig();
} catch (err) {
console.error(err)
this.$tip.error(`${this.$t('common.error')}: ${err.message || err.err_msg}`);
}
});
},
async saveConfig ({id, modify_value}) {
try {
let configItemList = await this.$ajax.getJSON('/server/api/cache/updateServerConfigItem', {id, configValue: modify_value});
await this.getServerConfig();
} catch (err) {
console.error(err)
this.$tip.error(`${this.$t('common.error')}: ${err.message || err.err_msg}`);
}
}
},
created () {
......
<template>
<section>
<let-table :data="configList" :title="$t('cache.config.tableTitle')" :empty-msg="$t('common.nodata')">
<let-table :data="configList" :empty-msg="$t('common.nodata')">
<let-table-column :title="$t('cache.config.remark')" prop="remark"></let-table-column>
<let-table-column :title="$t('cache.config.path')" prop="path"></let-table-column>
<let-table-column :title="$t('cache.config.item')" prop="item"></let-table-column>
<let-table-column :title="$t('cache.config.config_value')" prop="config_value"></let-table-column>
<let-table-column :title="$t('cache.config.value')" prop="config_value"></let-table-column>
</let-table>
</section>
</template>
<script>
export default {
props: {
moduleName: {type: String, required: true},
serverName: {type: String, required: true},
nodeName: {type: String, required: true},
},
data () {
return {
configList: []
}
},
methods: {
async getServerConfig () {
try {
let option = {
moduleName: this.moduleName,
serverName: this.serverName,
nodeName: this.nodeName,
};
let configItemList = await this.$ajax.getJSON('/server/api/cache/getServerConfig', option);
this.configList = configItemList;
} catch (err) {
console.error(err)
this.$tip.error(`${this.$t('common.error')}: ${err.message || err.err_msg}`);
}
}
},
created () {
this.getServerConfig();
}
}
</script>
......
<template>
<section class="container">
abc
<section>
<let-form
ref="addConfigForm"
type="medium"
:title="$t('cache.config.addConfig')"
:columns="2"
>
<let-form-item :label="$t('cache.config.item')" required>
<let-input size="small" v-model="config.item" required></let-input>
</let-form-item>
<let-form-item :label="$t('cache.config.path')" required>
<let-input size="small" v-model="config.path" required></let-input>
</let-form-item>
<let-form-item :label="$t('cache.config.reload')" required>
<let-input size="small" v-model="config.reload" required></let-input>
</let-form-item>
<let-form-item :label="$t('cache.config.period')" required>
<let-input size="small" v-model="config.period" required></let-input>
</let-form-item>
<let-form-item :label="$t('cache.config.remark')" required>
<let-input size="small" v-model="config.remark" required></let-input>
</let-form-item>
<br>
<let-form-item label=" ">
<let-button theme="primary" @click="submit">{{$t('cache.add')}}</let-button>
</let-form-item>
</let-form>
</section>
</template>
<script>
export default {
}
export default {
data () {
return {
config: {
"item": "",
"path": "",
"period": "",
"reload": "",
"remark": ""
}
}
},
methods: {
async submit () {
if (this.$refs.addConfigForm.validate()) {
try {
await this.$ajax.postJSON('/server/api/cache/addConfig', this.config);
this.$tip.success(`${this.$t('cache.config.addSuccess')}`);
Object.assign(this.config, {"item": ""});
this.$emit('call-back');
} catch (err) {
console.error(err)
this.$tip.error(`${this.$t('common.error')}: ${err.message || err.err_msg}`);
}
}
}
}
}
</script>
<style>
......
<template>
<section>
<let-form
ref="addConfigForm"
type="medium"
:title="$t('cache.config.addConfig')"
>
<let-form-item :label="$t('cache.config.item')" required>
<let-select v-model="itemId" size="small" required>
<let-option v-for="item in list" :value="item.id">{{item.path}}__{{item.item}}({{item.remark}})</let-option>
</let-select>
</let-form-item>
<let-form-item :label="$t('cache.config.itemValue')" required>
<let-input size="small" v-model="configValue" required></let-input>
</let-form-item>
<br>
<let-form-item label=" ">
<let-button theme="primary" @click="submit">{{$t('cache.add')}}</let-button>
</let-form-item>
</let-form>
</section>
</template>
<script>
export default {
props: {
serverName: {type: String, required: false},
nodeName: {type: String, required: false},
appName: {type: String, required: false},
moduleName: {type: String, required: false},
},
data () {
return {
itemId: '',
list: [],
configValue: '',
}
},
methods: {
async submit () {
if (this.$refs.addConfigForm.validate()) {
try {
let option = {
itemId: this.itemId,
configValue: this.configValue,
serverName: this.serverName,
nodeName: this.nodeName,
appName: this.appName,
moduleName: this.moduleName,
};
await this.$ajax.postJSON('/server/api/cache/addServerConfigItem', option);
this.$tip.success(`${this.$t('cache.config.addSuccess')}`);
this.configValue = null;
this.$emit('call-back');
} catch (err) {
console.error(err)
this.$tip.error(`${this.$t('common.error')}: ${err.message || err.err_msg}`);
}
}
},
async getConfig () {
try {
let configItemList = await this.$ajax.getJSON('/server/api/cache/getConfig');
this.list = configItemList;
} catch (err) {
console.error(err)
this.$tip.error(`${this.$t('common.error')}: ${err.message || err.err_msg}`);
}
}
},
created() {
this.getConfig()
}
}
</script>
<style>
</style>
<template>
<section class="page_operation">
<let-button theme="primary" size="small">{{$t('cache.config.add')}}</let-button>
<let-button theme="primary" size="small" @click="addConfig">{{$t('cache.config.addConfig')}}</let-button>
<let-table :data="list" :title="$t('cache.config.tableTitle')" :empty-msg="$t('common.nodata')">
<let-table-column title="ID" prop="id"></let-table-column>
<let-table-column title="备注" prop="remark"></let-table-column>
<let-table-column title="路径" prop="path"></let-table-column>
<let-table-column title="配置项" prop="AnalyseLog"></let-table-column>
<let-table-column title="加载生效" prop="reload"></let-table-column>
<let-table-column title="版本" prop="period"></let-table-column>
<let-table-column title="操作" prop="id">
<template slot-scope="scope">
<let-table-operation >{{$t('operate.update')}}</let-table-operation>
<let-table-operation class="danger" >{{$t('operate.delete')}}</let-table-operation>
<let-table-column :title="$t('cache.config.remark')" prop="remark"></let-table-column>
<let-table-column :title="$t('cache.config.path')" prop="path"></let-table-column>
<let-table-column :title="$t('cache.config.item')" prop="item"></let-table-column>
<let-table-column :title="$t('cache.config.reload')" prop="reload"></let-table-column>
<let-table-column :title="$t('cache.config.period')" prop="period"></let-table-column>
<let-table-column :title="$t('operate.operates')" >
<template slot-scope="{row}">
<let-table-operation @click="editConfig(row)">{{$t('operate.update')}}</let-table-operation>
<let-table-operation @click="deleteConfig(row)" class="danger">{{$t('operate.delete')}}</let-table-operation>
</template>
</let-table-column>
</let-table>
<let-modal
v-model="addConfigVisible"
:footShow="false"
:closeOnClickBackdrop="true"
>
<add-config v-if="addConfigVisible" @call-back="getConfig"></add-config>
</let-modal>
<let-modal
v-model="editConfigVisible"
:footShow="false"
:closeOnClickBackdrop="true"
>
<edit-config v-if="editConfigVisible" v-bind="editConfigObj" @call-back="getConfig"></edit-config>
</let-modal>
</section>
</template>
<script>
import AddConfig from './add.vue'
import EditConfig from './edit.vue'
export default {
components: {
AddConfig,
EditConfig
},
data () {
return {
list: []
list: [],
addConfigVisible: false,
editConfigVisible: false,
editConfigObj: null,
}
},
async created () {
methods: {
addConfig () {
this.addConfigVisible = true
},
editConfig (config) {
this.editConfigVisible = true;
this.editConfigObj = config
},
deleteConfig ({id}) {
this.$confirm(this.$t('cache.config.deleteConfig'), this.$t('common.alert')).then(async () => {
try {
let configItemList = await this.$ajax.getJSON('/server/api/cache/deleteConfig', {id});
await this.getConfig();
} catch (err) {
console.error(err)
this.$tip.error(`${this.$t('common.error')}: ${err.message || err.err_msg}`);
}
});
},
async getConfig () {
try {
let {configItemList} = await this.$ajax.getJSON('/server/api/cache/getConfig');
let configItemList = await this.$ajax.getJSON('/server/api/cache/getConfig');
this.list = configItemList;
} catch (err) {
console.error(err)
console.error(err)
this.$tip.error(`${this.$t('common.error')}: ${err.message || err.err_msg}`);
}
}
},
async created () {
this.getConfig();
}
}
</script>
......
<template>
<section class="">
<let-form
ref="editConfigForm"
type="medium"
:title="$t('cache.config.editConfig')"
:columns="2"
>
<let-form-item :label="$t('cache.config.reload')" required>
<let-input size="small" v-model="config.reload" required></let-input>
</let-form-item>
<let-form-item :label="$t('cache.config.period')" required>
<let-input size="small" v-model="config.period" required></let-input>
</let-form-item>
<let-form-item :label="$t('cache.config.remark')" required>
<let-input size="small" v-model="config.remark" required></let-input>
</let-form-item>
<br>
<let-form-item label=" ">
<let-button theme="primary" @click="submit">{{$t('cache.modification')}}</let-button>
</let-form-item>
</let-form>
</section>
</template>
<script>
export default {
props: {
id: {type: String, required: true},
item: {type: String, required: true},
path: {type: String, required: true},
period: {type: String, required: true},
reload: {type: String, required: true},
remark: {type: String, required: true},
},
data () {
return {
config: {
id: this.id,
item: this.item,
path: this.path,
period: this.period,
reload: this.reload,
remark: this.remark,
}
}
},
methods: {
async submit () {
if (this.$refs.editConfigForm.validate()) {
try {
await this.$ajax.postJSON('/server/api/cache/editConfig', this.config);
this.$tip.success(`${this.$t('cache.config.addSuccess')}`);
this.$emit('call-back');
} catch (err) {
console.error(err)
this.$tip.error(`${this.$t('common.error')}: ${err.message || err.err_msg}`);
}
}
}
}
}
</script>
<style>
</style>
<template>
<section class="">
<!-- 服务列表 -->
<let-table v-if="serverList" :data="serverList" :title="$t('serverList.title.serverList')" :empty-msg="$t('common.nodata')" ref="serverListLoading">
<let-table v-if="serverList" :data="serverList" :title="$t('serverList.title.serverList')"
:empty-msg="$t('common.nodata')" ref="serverListLoading">
<let-table-column :title="$t('serverList.table.th.service')" prop="server_name"></let-table-column>
<let-table-column :title="$t('serverList.table.th.ip')" prop="node_name" width="140px"></let-table-column>
<let-table-column :title="$t('serverList.table.th.ip')" width="140px">
......@@ -18,7 +19,8 @@
</let-table-column>
<let-table-column :title="$t('serverList.table.th.currStatus')" width="65px">
<template slot-scope="scope">
<span :class="scope.row.present_state === 'active' ? 'status-active' : scope.row.present_state === 'activating' ? 'status-activating' : 'status-off'"></span>
<span
:class="scope.row.present_state === 'active' ? 'status-active' : scope.row.present_state === 'activating' ? 'status-activating' : 'status-off'"></span>
</template>
</let-table-column>
<let-table-column :title="$t('serverList.table.th.time')">
......@@ -27,9 +29,10 @@
</template>
</let-table-column>
<let-table-column :title="$t('operate.operates')" width="260px">
<template slot-scope="scope">
<let-table-operation >{{$t('operate.update')}}</let-table-operation>
<let-table-operation >{{$t('operate.view')}}</let-table-operation>
<template slot-scope="{row}">
<let-table-operation @click="editServerConfig(row)">{{$t('operate.update')}}</let-table-operation>
<let-table-operation @click="checkServerConfigList(row)">{{$t('operate.view')}}</let-table-operation>
<let-table-operation @click="addServerConfig(row)">{{$t('operate.add')}}</let-table-operation>
</template>
</let-table-column>
</let-table>
......@@ -40,33 +43,81 @@
<let-table-column :title="$t('cache.config.config_value')" prop="config_value"></let-table-column>
<let-table-column :title="$t('cache.config.modify_value')" prop="period">
<template slot-scope="{row}">
<let-input size="small"></let-input>
<let-input size="small" v-model="row.modify_value"></let-input>
</template>
</let-table-column>
<let-table-column :title="$t('operate.operates')" >
<template slot-scope="{row}">
<let-table-operation @click="saveConfig(row)">{{$t('operate.save')}}</let-table-operation>
<let-table-operation @click="deleteConfig(row)" class="danger">{{$t('operate.delete')}}</let-table-operation>
</template>
</let-table-column>
</let-table>
<!-- 查看服务列表配置-->
<let-modal
v-model="serverCacheVisible"
v-model="serverConfigListVisible"
:footShow="false"
:closeOnClickBackdrop="true"
></let-modal>
width="80%"
height="80%"
:title="$t('cache.config.tableTitle')"
class="server_config_list_modal"
>
<server-config-list v-if="serverConfigListVisible" :moduleName="moduleName" v-bind="checkServer"></server-config-list>
</let-modal>
<!-- 修改服务配置-->
<let-modal
v-model="serverConfigVisible"
:footShow="false"
:closeOnClickBackdrop="true"
width="80%"
height="80%"
:title="$t('cache.config.tableTitle')"
class="server_config_list_modal"
>
<server-config v-if="serverConfigVisible" v-bind="checkServer"></server-config>
</let-modal>
<!-- 添加服务配置-->
<let-modal
v-model="addServerConfigVisible"
:footShow="false"
:closeOnClickBackdrop="true"
>
<add-server-config v-if="addServerConfigVisible" v-bind="checkServer"></add-server-config>
</let-modal>
</section>
</template>
<script>
import ServerConfigList from './ServerConfigList.vue'
import ServerConfig from './ServerConfig.vue'
import addServerConfig from './addServerConfig.vue'
export default {
components: {
ServerConfigList,
ServerConfig,
addServerConfig
},
data () {
return {
moduleName: this.$route.params.treeid,
configList: [],
serverList: [],
serverCacheVisible: false
serverConfigListVisible: false,
serverConfigVisible: false,
addServerConfigVisible: false,
checkServer: {}
}
},
methods: {
async getModuleConfig () {
try {
let configItemList = await this.$ajax.getJSON('/server/api/cache/getModuleConfig', {moduleName: this.moduleName});
// 添加被修改的空值
configItemList.forEach(item => item.modify_value="");
this.configList = configItemList;
} catch (err) {
console.error(err)
......@@ -83,6 +134,17 @@
this.$tip.error(`${this.$t('common.error')}: ${err.message || err.err_msg}`);
}
},
async saveConfig (row) {
console.log(row);
let {id, modify_value} = row;
try {
let configItemList = await this.$ajax.getJSON('/server/api/cache/updateServerConfigItem', {id, configValue: modify_value});
await this.getModuleConfig();
} catch (err) {
console.error(err)
this.$tip.error(`${this.$t('common.error')}: ${err.message || err.err_msg}`);
}
},
// 处理未发布时间显示
handleNoPublishedTime(timeStr, noPubTip = this.$t('pub.dlg.unpublished')) {
if (timeStr === '0000:00:00 00:00:00') {
......@@ -90,6 +152,28 @@
}
return timeStr;
},
checkServerConfigList (row) {
this.serverConfigListVisible = true;
this.checkServer = {
serverName: row.server_name,
nodeName: row.node_name
}
},
editServerConfig(row) {
this.serverConfigVisible = true;
this.checkServer = {
serverName: row.server_name,
nodeName: row.node_name
}
},
addServerConfig(row) {
this.addServerConfigVisible = true;
this.checkServer = {
serverName: row.server_name,
nodeName: row.node_name
}
},
},
created () {
this.getModuleConfig();
......@@ -99,5 +183,9 @@
</script>
<style>
.server_config_list_modal .let_modal__body{
max-height: 500px;
overflow-y: auto;
margin-top: 20px;
}
</style>
......@@ -23,12 +23,5 @@ export default {
</script>
<style>
.page_operation {
padding-top: 30px;
padding-bottom: 40px;
&_children {
padding: 20px 0;
}
}
</style>
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment