zhongxiaoyu пре 3 година
родитељ
комит
a0c4764b83

+ 6 - 1
src/styles/index.scss

@@ -403,7 +403,12 @@ li {
 /*修改radio选中样式*/
 .el-radio__input.is-checked .el-radio__inner {
   border-color: #2d67e3;
-  background: #2d67e3;
+  background: #fff;
+  &::after {
+    width: 8px;
+    height: 8px;
+    background-color: #2d67e3;
+  }
 }
 
 .el-radio__input.is-checked + .el-radio__label {

+ 1 - 9
src/views/accountManagement/components/accountEdit.vue

@@ -1,7 +1,7 @@
 <!--
  * @Author: Badguy
  * @Date: 2022-02-15 11:37:42
- * @LastEditTime: 2022-04-25 16:32:27
+ * @LastEditTime: 2022-04-26 14:09:40
  * @LastEditors: your name
  * @Description: 编辑账号
  * have a nice day!
@@ -607,14 +607,6 @@ export default {
             font-family: Microsoft YaHei;
             color: #303133;
           }
-          .el-radio__inner {
-            background: #fff;
-            &::after {
-              width: 8px;
-              height: 8px;
-              background-color: #2d67e3;
-            }
-          }
         }
       }
       .title-left {

+ 1 - 1
src/views/systemSettings/index.vue

@@ -15,6 +15,6 @@ export default {
 
 <style lang="scss" scoped>
 .dashboard {
-  padding: 30px 30px 0 25px;
+  padding: 24px 24px 0;
 }
 </style>

+ 616 - 339
src/views/systemSettings/views/serviceManagement/serviceEdit.vue

@@ -1,352 +1,565 @@
 <!--
  * @Date: 2022-03-24 09:55:13
- * @LastEditTime: 2022-03-24 18:13:32
+ * @LastEditTime: 2022-04-26 18:09:34
  * @LastEditors: your name
- * @Description: 服务管理-编辑接口
+ * @Description: 服务管理-编辑服务
  * have a nice day!
 -->
 
 <template>
-  <div class="interface-edit">
-    <el-container class="scrollbar">
-      <el-container>
-        <el-main class="part part1">
-          <el-form
-            ref="form"
-            :model="formData"
-            class="form"
-            label-position="right"
-            label-width="132px"
-          >
-            <div class="header">
-              <span class="title">服务</span>
-              <el-form-item label="是否启用">
-                <el-radio-group v-model="formData.active">
-                  <el-radio label="1">是</el-radio>
-                  <el-radio label="0">否</el-radio>
-                </el-radio-group>
-              </el-form-item>
-              <el-form-item>
-                <el-button
-                  type="primary"
-                  size="small"
-                >保存</el-button>
-              </el-form-item>
-            </div>
-            <div class="main">
-              <el-form-item
-                label="名称"
-                prop="name"
+  <div class="service-edit">
+    <div class="scrollbar">
+      <el-row :gutter="24">
+        <el-col :span="16">
+          <div class="part part-top">
+            <header class="title">
+              <p class="manageTitle">服务</p>
+              <el-button
+                size="small"
+                type="primary"
+                class="btn-save"
+              >保存</el-button>
+            </header>
+            <main class="content">
+              <el-form
+                ref="serviceForm"
+                class="service-form"
+                :model="serviceForm"
+                label-position="right"
+                label-width="72px"
+                size="mini"
               >
-                <el-input
-                  v-model="formData.name"
-                  width="224px"
-                  placeholder="请输入名称"
-                  size="small"
-                  clearable
-                />
-              </el-form-item>
-              <el-form-item
-                label="描述"
-                prop="desc"
-              >
-                <el-input
-                  v-model="formData.desc"
-                  placeholder="请输入描述"
-                  type="textarea"
-                  :auto-size="{ minRows: 2 }"
-                  clearable
-                />
-              </el-form-item>
-              <el-row>
+                <el-form-item
+                  label="服务名称"
+                  prop="name"
+                >
+                  <el-input
+                    v-model="serviceForm.name"
+                    width="240px"
+                    placeholder="请输入服务名称"
+                    clearable
+                  />
+                </el-form-item>
+                <el-form-item label="是否启用">
+                  <el-radio-group v-model="serviceForm.sync">
+                    <el-radio :label="1">是</el-radio>
+                    <el-radio :label="0">否</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+                <el-form-item
+                  label="服务描述"
+                  prop="desc"
+                >
+                  <el-input
+                    v-model="serviceForm.desc"
+                    placeholder="请输入描述"
+                    type="textarea"
+                    :autosize="{ minRows: 5, maxRows: 5 }"
+                    resize="none"
+                    clearable
+                  />
+                </el-form-item>
+              </el-form>
+            </main>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div class="part part-top">
+            <header class="title">
+              <p class="manageTitle">部署机器</p>
+            </header>
+            <main class="content">
+              <el-row :gutter="16">
                 <el-col :span="8">
-                  <el-form-item label="接口类型">
-                    <el-select
-                      v-model="formData.type"
-                      size="small"
-                      placeholder="请选择"
+                  <div class="service-edit-card">
+                    <div
+                      class="card-button-plus"
+                      @click="btnPlusClickHandler('machine')"
                     >
-                      <el-option
-                        v-for="{ value, label } in formOptions.type"
-                        :key="value"
-                        :value="value"
-                        :label="label"
-                      />
-                    </el-select>
-                  </el-form-item>
+                      <i class="el-icon-plus" />
+                    </div>
+                  </div>
                 </el-col>
-                <el-col :span="8">
-                  <el-form-item label="接口协议">
-                    <el-select
-                      v-model="formData.protocol"
-                      size="small"
-                      placeholder="请选择"
+                <el-col
+                  v-for="(machine, index) in checkedMachineList"
+                  :key="machine.id"
+                  :span="8"
+                >
+                  <div class="service-edit-card">
+                    <div
+                      class="card-btn-close"
+                      @click="removeItem(index, 'machine')"
                     >
-                      <el-option
-                        v-for="{ value, label } in formOptions.protocol"
-                        :key="value"
-                        :value="value"
-                        :label="label"
-                      />
-                    </el-select>
-                  </el-form-item>
+                      <i class="el-icon-close" />
+                    </div>
+                    <div class="card-header">
+                      <span>{{ machine.machineName }}</span>
+                    </div>
+                  </div>
                 </el-col>
               </el-row>
-              <el-form-item
-                label="详细配置"
-                prop="options"
+            </main>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div class="part">
+            <header class="title">
+              <p class="manageTitle">输入</p>
+            </header>
+            <main class="content">
+              <el-form
+                ref="inputForm"
+                class="input-form"
+                :model="inputForm"
+                label-position="right"
+                label-width="72px"
+                size="mini"
               >
-                <el-input
-                  v-model="formData.options"
-                  placeholder="请输入详细配置"
-                  type="textarea"
-                  :auto-size="{ minRows: 2 }"
-                  clearable
-                />
-              </el-form-item>
-              <el-form-item label="是否开启本地缓存">
-                <el-radio-group v-model="formData.cache">
-                  <el-radio label="1">是</el-radio>
-                  <el-radio label="0">否</el-radio>
-                </el-radio-group>
-              </el-form-item>
-              <el-form-item label="目标数据类型">
-                <el-select
-                  v-model="formData.dataType"
-                  size="small"
-                  placeholder="请选择"
+                <el-form-item
+                  label="来源"
+                  prop="source"
+                >
+                  <el-select v-model="inputForm.source">
+                    <el-option
+                      v-for="item in sourceOptions"
+                      :key="item.id"
+                      :value="item.value"
+                      :label="item.label"
+                    />
+                  </el-select>
+                </el-form-item>
+                <el-form-item
+                  label="并发线程数"
+                  prop="concurrent"
+                  label-width="86px"
                 >
-                  <el-option
-                    v-for="{ value, label } in formOptions.dataType"
-                    :key="value"
-                    :value="value"
-                    :label="label"
+                  <el-input
+                    v-model="inputForm.concurrent"
+                    width="166px"
+                    placeholder="请输入并发线程数"
+                    clearable
                   />
-                </el-select>
-              </el-form-item>
-              <el-form-item
-                label="目标数据配置"
-                prop="dataOptions"
-              >
-                <el-input
-                  v-model="formData.dataOptions"
-                  placeholder="请输入目标数据配置"
-                  type="textarea"
-                  :auto-size="{ minRows: 2 }"
-                  clearable
-                />
-              </el-form-item>
-            </div>
-          </el-form>
-        </el-main>
-        <el-aside
-          class="part part2"
-          width="502px"
-        >
-          <div class="header">
-            <span class="title">节点管理</span>
-            <el-button
-              class="button-white"
-              size="small"
-            >新增</el-button>
+                </el-form-item>
+                <el-form-item
+                  label="来源配置"
+                  prop="config"
+                >
+                  <el-input
+                    v-model="inputForm.config"
+                    placeholder="请输入来源配置"
+                    type="textarea"
+                    :autosize="{ minRows: 4, maxRows: 4 }"
+                    resize="none"
+                    clearable
+                  />
+                </el-form-item>
+              </el-form>
+            </main>
+            <header class="title">
+              <p class="manageTitle">源数据</p>
+            </header>
+            <main class="content">
+              <el-row :gutter="16">
+                <el-col :span="8">
+                  <div class="service-edit-card">
+                    <div
+                      class="card-button-plus"
+                      @click="btnPlusClickHandler('source')"
+                    >
+                      <i class="el-icon-plus" />
+                    </div>
+                  </div>
+                </el-col>
+                <el-col
+                  v-for="item in checkedSourceList"
+                  :key="item.id"
+                  :span="8"
+                >
+                  <div class="service-edit-card">
+                    <div class="card-btn-close" @click="removeItem(index, 'source')">
+                      <i class="el-icon-close" />
+                    </div>
+                    <div class="card-header">
+                      <span>{{ item.sourceName }}</span>
+                    </div>
+                  </div>
+                </el-col>
+              </el-row>
+            </main>
           </div>
-          <div class="main">
-            <el-row :gutter="22">
-              <el-col
-                v-for="node in nodeList"
-                :key="node.id"
-                :span="12"
-              >
-                <div class="interface-edit-card">
-                  <div class="card-button-close">
-                    <i class="el-icon-close" />
+        </el-col>
+        <el-col :span="8">
+          <div class="part">
+            <header class="title">
+              <p class="manageTitle">数据处理</p>
+            </header>
+            <main class="content">
+              <el-row :gutter="16">
+                <el-col :span="8">
+                  <div class="service-edit-card">
+                    <div
+                      class="card-button-plus"
+                      @click="btnPlusClickHandler('process')"
+                    >
+                      <i class="el-icon-plus" />
+                    </div>
                   </div>
-                  <div class="card-header">
-                    <span>{{ node.nodeName }}</span>
-                    <el-checkbox v-model="node.isChecked" />
+                </el-col>
+                <el-col
+                  v-for="item in checkedProcessList"
+                  :key="item.id"
+                  :span="8"
+                >
+                  <div class="service-edit-card">
+                    <div class="card-btn-close" @click="removeItem(index, 'process')">
+                      <i class="el-icon-close" />
+                    </div>
+                    <div class="card-header">
+                      <span>{{ item.processName }}</span>
+                    </div>
                   </div>
-                  <div class="card-main">
-                    <span>{{ node.IPAddr }}</span>
+                </el-col>
+              </el-row>
+            </main>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div class="part">
+            <header class="title">
+              <p class="manageTitle">数据输出</p>
+              <el-button
+                size="small"
+                type="primary"
+                class="btn-white"
+              >新增</el-button>
+            </header>
+            <main class="content">
+              <el-row :gutter="16">
+                <el-col
+                  v-for="item in targetList"
+                  :key="item.id"
+                  :span="24"
+                >
+                  <div
+                    class="service-edit-card"
+                    style="height: 160px"
+                  >
+                    <div class="card-btn-close">
+                      <i class="el-icon-close" />
+                    </div>
+                    <div class="card-header">
+                      <span>{{ item.targetName }}</span>
+                      <i class="icon-edit" />
+                    </div>
+                    <div class="card-main">
+                      <div class="flex">
+                        <div class="left">目标配置:</div>
+                        <div
+                          class="multiple-ellipsis"
+                          :title="item.config"
+                        >{{ item.config }}</div>
+                      </div>
+                      <span>{{ item.dataSource }}</span>
+                    </div>
                   </div>
-                </div>
-              </el-col>
-            </el-row>
+                </el-col>
+              </el-row>
+            </main>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+    <Dialog
+      :flag="dialogVisible"
+      width="500px"
+    >
+      <template v-if="dialogContentType === 'machine'">
+        <div class="dialog-checkbox">
+          <div class="title">部署机器选择</div>
+          <div class="content">
+            <el-checkbox-group v-model="tempCheckedKeys">
+              <el-checkbox
+                v-for="item in machineList"
+                :key="item.id"
+                :label="item.machineName"
+              />
+            </el-checkbox-group>
+          </div>
+          <div class="foot">
+            <el-button
+              size="medium"
+              type="primary"
+              class="r25 r26"
+              @click="checkedSubmitHandler('machine')"
+            >提交</el-button>
+            <el-button
+              size="medium"
+              class="r26"
+              @click="closeDialog()"
+            >取消</el-button>
+          </div>
+        </div>
+      </template>
+      <template v-if="dialogContentType === 'source'">
+        <div class="dialog-checkbox">
+          <div class="title">源数据选择</div>
+          <div class="content">
+            <el-checkbox-group v-model="tempCheckedKeys">
+              <el-checkbox
+                v-for="item in sourceList"
+                :key="item.id"
+                :label="item.sourceName"
+              />
+            </el-checkbox-group>
+          </div>
+          <div class="foot">
+            <el-button
+              size="medium"
+              type="primary"
+              class="r25 r26"
+              @click="checkedSubmitHandler('source')"
+            >提交</el-button>
+            <el-button
+              size="medium"
+              class="r26"
+              @click="closeDialog()"
+            >取消</el-button>
           </div>
-        </el-aside>
-      </el-container>
-      <el-footer
-        class="part part3"
-        height="360px"
-      >
-        <div class="header">
-          <span class="title">源数据管理</span>
-          <el-button
-            class="button-white"
-            size="small"
-          >新增</el-button>
         </div>
-        <div class="main">
-          <el-row :gutter="20">
-            <el-col
-              v-for="source in sourceList"
-              :key="source.id"
-              :span="4"
-            >
-              <div class="interface-edit-card">
-                <div class="card-button-close">
-                  <i class="el-icon-close" />
-                </div>
-                <div class="card-header">
-                  <span>{{ source.sourceName }}</span>
-                  <el-checkbox v-model="source.isChecked" />
-                </div>
-                <div class="card-main">
-                  <span>{{ source.desc }}</span>
-                </div>
-              </div>
-            </el-col>
-          </el-row>
+      </template>
+      <template v-if="dialogContentType === 'process'">
+        <div class="dialog-checkbox">
+          <div class="title">部署机器选择</div>
+          <div class="content">
+            <el-checkbox-group v-model="tempCheckedKeys">
+              <el-checkbox
+                v-for="item in processList"
+                :key="item.id"
+                :label="item.processName"
+              />
+            </el-checkbox-group>
+          </div>
+          <div class="foot">
+            <el-button
+              size="medium"
+              type="primary"
+              class="r25 r26"
+              @click="checkedSubmitHandler('process')"
+            >提交</el-button>
+            <el-button
+              size="medium"
+              class="r26"
+              @click="closeDialog()"
+            >取消</el-button>
+          </div>
+        </div>
+      </template>
+      <template v-if="dialogContentType === 'output'">
+        <div class="dialog-form">
+          <div class="title">数据输出编辑</div>
+          <div class="content">
+          </div>
+          <div class="foot">
+            <el-button
+              size="medium"
+              type="primary"
+              class="r25 r26"
+              @click="closeDialog()"
+            >提交</el-button>
+            <el-button
+              size="medium"
+              class="r26"
+              @click="closeDialog()"
+            >取消</el-button>
+          </div>
         </div>
-      </el-footer>
-    </el-container>
+      </template>
+    </Dialog>
   </div>
 </template>
 
 <script>
+import Dialog from '@/layout/components/Dialog'
+
+const keyMap = {
+  machine: 'checkdeMachineKeys',
+  source: 'checkedSourceKeys',
+  process: 'checkedProcessKeys'
+}
+
 export default {
+  components: { Dialog },
   data() {
     return {
-      formData: {
-        active: '1',
+      dialogContentType: null,
+      tempCheckedKeys: [],
+      serviceForm: {
         name: '',
-        desc: '',
-        type: '',
-        protocol: '',
-        options: '',
-        cache: '1',
-        dataType: '',
-        dataOptions: ''
+        sync: 1,
+        desc: ''
       },
-      formOptions: {
-        type: [
-          {
-            value: '1',
-            label: '主动拉取'
-          },
-          {
-            value: '2',
-            label: '自动拉取'
-          }
-        ],
-        protocol: [
-          {
-            value: 'IBMMQ',
-            label: 'IBMMQ'
-          },
-          {
-            value: 'http',
-            label: 'http'
-          }
-        ],
-        dataType: [
-          {
-            value: 'kafka',
-            label: 'kafka'
-          },
-          {
-            value: 'MQ',
-            label: 'MQ'
-          }
-        ]
+      inputForm: {
+        source: '',
+        concurrent: null,
+        config: ''
       },
-      nodeList: [
+      sourceOptions: [
         {
           id: 0,
-          nodeName: '首都机场BHS',
-          IPAddr: '192.168.1.1',
-          isChecked: false
+          value: 0,
+          label: '来源1'
         },
         {
           id: 1,
-          nodeName: '主采集节点',
-          IPAddr: '10.12.13.112',
-          isChecked: true
+          value: 1,
+          label: '来源2'
+        }
+      ],
+      machineList: [
+        {
+          id: 0,
+          machineName: '主动采集服务器'
+        },
+        {
+          id: 1,
+          machineName: '备用采集服务器'
         },
         {
           id: 2,
-          nodeName: '备用采集节点',
-          IPAddr: '10.12.13.112',
-          isChecked: true
+          machineName: '解析服务器'
+        },
+        {
+          id: 3,
+          machineName: '存储服务器'
         }
       ],
-      checkedNodeList: [],
+      checkdeMachineKeys: [],
       sourceList: [
         {
           id: 0,
           sourceName: 'BSM',
-          desc: '行李源报文',
-          isChecked: true
+          desc: '行李源报文'
         },
         {
           id: 1,
           sourceName: 'BPM',
-          desc: '行李处理报文',
-          isChecked: true
+          desc: '行李处理报文'
+        }
+      ],
+      checkedSourceKeys: [],
+      processList: [
+        {
+          id: 0,
+          processName: '数据包合法性检测'
         },
         {
-          id: 2,
-          sourceName: '航班动态',
-          desc: '国航全球航班计划及航班动态信息',
-          isChecked: false
+          id: 1,
+          processName: '数据解析'
         }
       ],
-      sourceCheckedList: []
+      checkedProcessKeys: [],
+      targetList: [
+        {
+          id: 0,
+          targetName: 'Kafka',
+          config:
+            '"bootstrap.servers": "192.168.3.74:9092","key.serializer": "org.apache.kafka.common.serialization.StringSerializer","value.serializerXXXXXXXXXXXXXXXXXXXXXXX',
+          dataSource: 'BSM报文'
+        },
+        {
+          id: 1,
+          targetName: 'Kafka',
+          config:
+            '"bootstrap.servers": "192.168.3.74:9092","key.serializer": "org.apache.kafka.common.serialization.StringSerializer","value.serializerXXXXXXXXXXXXXXXXXXXXXXX',
+          dataSource: 'BSM解析结果'
+        },
+        {
+          id: 2,
+          targetName: 'Mysql',
+          config:
+            '"bootstrap.servers": "192.168.3.74:9092","key.serializer": "org.apache.kafka.common.serialization.StringSerializer","value.serializerXXXXXXXXXXXXXXXXXXXXXXX',
+          dataSource: '行李基础数据'
+        }
+      ]
+    }
+  },
+  computed: {
+    dialogVisible() {
+      return Boolean(this.dialogContentType)
+    },
+    checkedMachineList() {
+      return this.machineList.filter(item => this.checkdeMachineKeys.includes(item.machineName))
+    },
+    checkedSourceList() {
+      return this.sourceList.filter(item => this.checkedSourceKeys.includes(item.sourceName))
+    },
+    checkedProcessList() {
+      return this.processList.filter(item => this.checkedProcessKeys.includes(item.processName))
+    }
+  },
+  methods: {
+    btnPlusClickHandler(type) {
+      this.tempCheckedKeys = [...this[keyMap[type]]]
+      this.dialogContentType = type
+    },
+    checkedSubmitHandler(type) {
+      this[keyMap[type]] = [...this.tempCheckedKeys]
+      this.dialogContentType = null
+    },
+    closeDialog() {
+      this.dialogContentType = null
+    },
+    removeItem(index, type) {
+      this[keyMap[type]].splice(index, 1)
     }
   }
 }
 </script>
 
 <style lang="scss" scoped>
-.interface-edit {
-  padding: 16px 0 8px;
+.service-edit {
+  margin: 0 -24px;
+  padding-bottom: 16px;
   overflow: hidden;
-  > .scrollbar {
+  .scrollbar {
+    height: calc(100vh - 120px);
     padding: 0 24px;
-    height: calc(100vh - 104px);
     overflow-x: hidden;
     overflow-y: auto;
     ::v-deep .part {
+      height: 640px;
+      padding: 32px 24px 0 24px;
       background: #ffffff;
-      padding: 24px 33px 20px 24px;
-      .header {
+      box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.1);
+      border-radius: 4px;
+      &.part-top {
+        height: 296px;
+        margin-bottom: 24px;
+        overflow: hidden;
+      }
+      .title {
         display: flex;
         justify-content: space-between;
-        .title {
-          flex: 1;
-          position: relative;
-          padding-left: 16px;
-          height: 20px;
-          line-height: 32px;
-          font-size: 20px;
-          font-weight: bold;
-          &::before {
-            content: '';
-            position: absolute;
-            width: 4px;
-            height: 20px;
-            background: #2d67e3;
-            top: 6px;
-            left: 0;
-          }
+        margin-bottom: 32px;
+        &:nth-of-type(2) {
+          margin-top: 10px;
+        }
+        .manageTitle {
+          line-height: 30px;
         }
-        button {
+        .el-button {
           width: 64px;
           height: 32px;
-          &.button-white {
-            background: #ffffff;
+          border: none;
+          &.btn-white {
+            background-color: #ffffff;
             border: 1px solid #92ace2;
             color: #2d67e3;
           }
+          &:hover {
+            background-color: #487be8;
+            color: #ffffff;
+          }
         }
       }
       label,
@@ -356,8 +569,9 @@ export default {
       optgroup,
       select,
       textarea {
-        font-family: Helvetica, 'Microsoft YaHei';
+        font-family: Helvetica, Microsoft YaHei;
         font-size: 14px;
+        font-weight: 400;
       }
       label {
         color: #303133;
@@ -365,83 +579,146 @@ export default {
       input {
         color: #101116;
       }
+      .el-input__inner,
+      .el-textarea__inner {
+        padding-left: 8px;
+        padding-right: 8px;
+      }
       .el-radio {
         font-weight: 400;
       }
-      .interface-edit-card {
-        display: flex;
-        flex-direction: column;
-        justify-content: space-between;
-        padding: 16px 14px 16px 16px;
-        background: #f5f7fa;
-        box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.1);
-        border-radius: 4px;
-        position: relative;
-        font-family: Helvetica, 'Microsoft YaHei';
-        .card-button-close {
-          position: absolute;
-          top: -12px;
-          right: -12px;
-          z-index: 10;
-          width: 24px;
-          height: 24px;
-          line-height: 24px;
-          text-align: center;
-          background: #000000;
-          opacity: 0.8;
-          border-radius: 50%;
-          color: #ffffff;
-          cursor: pointer;
-        }
-        .card-header {
-          display: flex;
-          justify-content: space-between;
-          color: #101116;
-          font-weight: bold;
-          font-size: 14px;
-        }
-        .card-main {
-          color: #afb4bf;
-          font-size: 12px;
-        }
-      }
-      &.part1 {
-        .header {
-          .el-form-item {
-            .el-form-item__label {
-              line-height: 34px;
+      .content {
+        margin: 0;
+        > .el-row > .el-col {
+          margin-bottom: 16px;
+          .service-edit-card {
+            height: 80px;
+            padding: 16px 14px 0 16px;
+            background: #f5f7fa;
+            box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.1);
+            border-radius: 4px;
+            position: relative;
+            font-family: Helvetica, 'Microsoft YaHei';
+            .card-button-plus {
+              margin: -16px -14px 0 -16px;
+              height: calc(100% + 16px);
+              border: 1px dashed #9ebbf7;
+              cursor: pointer;
+              position: relative;
+              .el-icon-plus {
+                font-size: 32px;
+                color: #9ebbf7;
+                position: absolute;
+                top: 50%;
+                left: 50%;
+                margin: -16px -16px;
+              }
             }
-            .el-form-item__content {
-              height: 32px;
-              line-height: 32px;
+            .card-btn-close {
+              position: absolute;
+              top: -12px;
+              right: -12px;
+              z-index: 10;
+              width: 24px;
+              height: 24px;
+              line-height: 24px;
+              text-align: center;
+              background: #000000;
+              opacity: 0.8;
+              border-radius: 50%;
+              color: #ffffff;
+              cursor: pointer;
+            }
+            .card-header {
+              display: flex;
+              justify-content: flex-start;
+              color: #101116;
+              font-size: 14px;
+              margin-bottom: 32px;
+              .icon-edit {
+                width: 14px;
+                height: 14px;
+                display: inline-block;
+                background-repeat: no-repeat;
+                background-size: cover;
+                transition: all 0.3s;
+                margin-left: 16px;
+                cursor: pointer;
+                background-image: url('../../../../assets/status/ic_edit_default.png');
+                &:hover {
+                  background-image: url('../../../../assets/status/ic_edit_hovar.png');
+                }
+              }
+            }
+            .card-main {
+              font-size: 14px;
+              font-family: Helvetica, Microsoft YaHei;
+              color: #101116;
+              .flex {
+                margin-bottom: 23px;
+                .left {
+                  padding-right: 9px;
+                }
+                .multiple-ellipsis {
+                  flex: 1;
+                  display: -webkit-box;
+                  overflow: hidden;
+                  text-overflow: ellipsis;
+                  word-break: break-all;
+                  -webkit-box-orient: vertical;
+                  -webkit-line-clamp: 2;
+                }
+              }
             }
-          }
-        }
-        .main {
-          span {
-            line-height: 32px;
           }
         }
       }
     }
-    .part2 {
-      margin-left: 16px;
-      .main {
-        margin-top: 4px;
-        .interface-edit-card {
-          margin-top: 20px;
-          height: 104px;
+  }
+  ::v-deep .service-form {
+    display: flex;
+    flex-wrap: wrap;
+    .el-form-item {
+      margin-bottom: 25px;
+      .el-form-item__label {
+        padding-right: 16px;
+      }
+      &:nth-child(2) {
+        margin-left: 80px;
+        flex: 1;
+        .el-form-item__label {
+          margin-right: 9px;
         }
       }
+      &:nth-child(3) {
+        width: 100%;
+      }
     }
-    .part3 {
-      margin-top: 16px;
-      .main {
-        margin-top: 4px;
-        .interface-edit-card {
-          margin-top: 20px;
-          height: 120px;
-        }
+  }
+  ::v-deep .input-form {
+    display: flex;
+    flex-wrap: wrap;
+    .el-form-item {
+      margin-bottom: 25px;
+      .el-form-item__label {
+        padding-right: 16px;
+      }
+      &:nth-child(2) {
+        margin-left: 54px;
+        flex: 1;
+      }
+      &:nth-child(3) {
+        width: 100%;
+      }
+    }
+  }
+  .dialog-checkbox {
+    .content {
+      margin-left: 16px;
+      .el-checkbox {
+        margin-bottom: 24px;
+        font-family: Helvetica, Microsoft YaHei;
+        color: #303133;
       }
     }
   }