Commit 0db7ec01 by wanglizhen

资产库改版

parent ba58e958
src/assets/images/assetLibrary/DB2.png

6.4 KB | W: | H:

src/assets/images/assetLibrary/DB2.png

1.61 KB | W: | H:

src/assets/images/assetLibrary/DB2.png
src/assets/images/assetLibrary/DB2.png
src/assets/images/assetLibrary/DB2.png
src/assets/images/assetLibrary/DB2.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/DM.png

10.2 KB | W: | H:

src/assets/images/assetLibrary/DM.png

1.23 KB | W: | H:

src/assets/images/assetLibrary/DM.png
src/assets/images/assetLibrary/DM.png
src/assets/images/assetLibrary/DM.png
src/assets/images/assetLibrary/DM.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/ES.png

5.52 KB | W: | H:

src/assets/images/assetLibrary/ES.png

1.65 KB | W: | H:

src/assets/images/assetLibrary/ES.png
src/assets/images/assetLibrary/ES.png
src/assets/images/assetLibrary/ES.png
src/assets/images/assetLibrary/ES.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/GAUSS.png

8.18 KB | W: | H:

src/assets/images/assetLibrary/GAUSS.png

1.76 KB | W: | H:

src/assets/images/assetLibrary/GAUSS.png
src/assets/images/assetLibrary/GAUSS.png
src/assets/images/assetLibrary/GAUSS.png
src/assets/images/assetLibrary/GAUSS.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/GAUSSDB.png

4.95 KB | W: | H:

src/assets/images/assetLibrary/GAUSSDB.png

1.66 KB | W: | H:

src/assets/images/assetLibrary/GAUSSDB.png
src/assets/images/assetLibrary/GAUSSDB.png
src/assets/images/assetLibrary/GAUSSDB.png
src/assets/images/assetLibrary/GAUSSDB.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/GBASE8S.png

6.18 KB | W: | H:

src/assets/images/assetLibrary/GBASE8S.png

1.13 KB | W: | H:

src/assets/images/assetLibrary/GBASE8S.png
src/assets/images/assetLibrary/GBASE8S.png
src/assets/images/assetLibrary/GBASE8S.png
src/assets/images/assetLibrary/GBASE8S.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/GREENPLUM.png

17 KB | W: | H:

src/assets/images/assetLibrary/GREENPLUM.png

1.66 KB | W: | H:

src/assets/images/assetLibrary/GREENPLUM.png
src/assets/images/assetLibrary/GREENPLUM.png
src/assets/images/assetLibrary/GREENPLUM.png
src/assets/images/assetLibrary/GREENPLUM.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/HIVE.png

9.73 KB | W: | H:

src/assets/images/assetLibrary/HIVE.png

2.41 KB | W: | H:

src/assets/images/assetLibrary/HIVE.png
src/assets/images/assetLibrary/HIVE.png
src/assets/images/assetLibrary/HIVE.png
src/assets/images/assetLibrary/HIVE.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/KAFKA.png

6.68 KB | W: | H:

src/assets/images/assetLibrary/KAFKA.png

1.75 KB | W: | H:

src/assets/images/assetLibrary/KAFKA.png
src/assets/images/assetLibrary/KAFKA.png
src/assets/images/assetLibrary/KAFKA.png
src/assets/images/assetLibrary/KAFKA.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/KINGBASE.png

22.9 KB | W: | H:

src/assets/images/assetLibrary/KINGBASE.png

2.24 KB | W: | H:

src/assets/images/assetLibrary/KINGBASE.png
src/assets/images/assetLibrary/KINGBASE.png
src/assets/images/assetLibrary/KINGBASE.png
src/assets/images/assetLibrary/KINGBASE.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/MARIADB.png

13.3 KB | W: | H:

src/assets/images/assetLibrary/MARIADB.png

1.57 KB | W: | H:

src/assets/images/assetLibrary/MARIADB.png
src/assets/images/assetLibrary/MARIADB.png
src/assets/images/assetLibrary/MARIADB.png
src/assets/images/assetLibrary/MARIADB.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/MONGODB.png

6.57 KB | W: | H:

src/assets/images/assetLibrary/MONGODB.png

1.46 KB | W: | H:

src/assets/images/assetLibrary/MONGODB.png
src/assets/images/assetLibrary/MONGODB.png
src/assets/images/assetLibrary/MONGODB.png
src/assets/images/assetLibrary/MONGODB.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/MSSQLSERVER.png

8.03 KB | W: | H:

src/assets/images/assetLibrary/MSSQLSERVER.png

1.15 KB | W: | H:

src/assets/images/assetLibrary/MSSQLSERVER.png
src/assets/images/assetLibrary/MSSQLSERVER.png
src/assets/images/assetLibrary/MSSQLSERVER.png
src/assets/images/assetLibrary/MSSQLSERVER.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/MYSQL.png

11.9 KB | W: | H:

src/assets/images/assetLibrary/MYSQL.png

1.67 KB | W: | H:

src/assets/images/assetLibrary/MYSQL.png
src/assets/images/assetLibrary/MYSQL.png
src/assets/images/assetLibrary/MYSQL.png
src/assets/images/assetLibrary/MYSQL.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/OCEANBASE.png

6.02 KB | W: | H:

src/assets/images/assetLibrary/OCEANBASE.png

1.41 KB | W: | H:

src/assets/images/assetLibrary/OCEANBASE.png
src/assets/images/assetLibrary/OCEANBASE.png
src/assets/images/assetLibrary/OCEANBASE.png
src/assets/images/assetLibrary/OCEANBASE.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/ORACLE.png

7.57 KB | W: | H:

src/assets/images/assetLibrary/ORACLE.png

1.01 KB | W: | H:

src/assets/images/assetLibrary/ORACLE.png
src/assets/images/assetLibrary/ORACLE.png
src/assets/images/assetLibrary/ORACLE.png
src/assets/images/assetLibrary/ORACLE.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/POSTGRESQL.png

13.9 KB | W: | H:

src/assets/images/assetLibrary/POSTGRESQL.png

1.88 KB | W: | H:

src/assets/images/assetLibrary/POSTGRESQL.png
src/assets/images/assetLibrary/POSTGRESQL.png
src/assets/images/assetLibrary/POSTGRESQL.png
src/assets/images/assetLibrary/POSTGRESQL.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/apache1.png

7.33 KB | W: | H:

src/assets/images/assetLibrary/apache1.png

3.86 KB | W: | H:

src/assets/images/assetLibrary/apache1.png
src/assets/images/assetLibrary/apache1.png
src/assets/images/assetLibrary/apache1.png
src/assets/images/assetLibrary/apache1.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/assetLibrary/cloudera1.png

3.61 KB | W: | H:

src/assets/images/assetLibrary/cloudera1.png

1.12 KB | W: | H:

src/assets/images/assetLibrary/cloudera1.png
src/assets/images/assetLibrary/cloudera1.png
src/assets/images/assetLibrary/cloudera1.png
src/assets/images/assetLibrary/cloudera1.png
  • 2-up
  • Swipe
  • Onion skin
...@@ -21,6 +21,8 @@ import cloudera2 from './cloudera2.png' ...@@ -21,6 +21,8 @@ import cloudera2 from './cloudera2.png'
import star1 from './star1.png' import star1 from './star1.png'
import star2 from './star2.png' import star2 from './star2.png'
import HIVE from './HIVE.png' import HIVE from './HIVE.png'
import pageTitle from './pageTitle.png'
import arrow from './arrow.png'
export default { export default {
...@@ -46,5 +48,7 @@ export default { ...@@ -46,5 +48,7 @@ export default {
cloudera2, cloudera2,
star1, star1,
star2, star2,
HIVE HIVE,
pageTitle,
arrow
} }
\ No newline at end of file
src/assets/images/assetLibrary/star1.png

4.91 KB | W: | H:

src/assets/images/assetLibrary/star1.png

1.66 KB | W: | H:

src/assets/images/assetLibrary/star1.png
src/assets/images/assetLibrary/star1.png
src/assets/images/assetLibrary/star1.png
src/assets/images/assetLibrary/star1.png
  • 2-up
  • Swipe
  • Onion skin
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
:key="item.value" :key="item.value"
:index="index" :index="index"
:class="item.elTagClass" :class="item.elTagClass"
>{{ item.label + " " }}</span> >{{ item[labelName] + " " }}</span>
<el-tag <el-tag
v-else v-else
:disable-transitions="true" :disable-transitions="true"
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
:index="index" :index="index"
:type="item.elTagType" :type="item.elTagType"
:class="item.elTagClass" :class="item.elTagClass"
>{{ item.label + " " }}</el-tag> >{{ item[labelName] + " " }}</el-tag>
</template> </template>
</template> </template>
<template v-if="unmatch && showValue"> <template v-if="unmatch && showValue">
...@@ -44,9 +44,15 @@ const props = defineProps({ ...@@ -44,9 +44,15 @@ const props = defineProps({
separator: { separator: {
type: String, type: String,
default: ",", default: ",",
},
labelName: {
type: String,
default: "label",
} }
}) })
console.log(props.options)
const values = computed(() => { const values = computed(() => {
if (props.value === null || typeof props.value === 'undefined' || props.value === '') return [] if (props.value === null || typeof props.value === 'undefined' || props.value === '') return []
return Array.isArray(props.value) ? props.value.map(item => '' + item) : String(props.value).split(props.separator) return Array.isArray(props.value) ? props.value.map(item => '' + item) : String(props.value).split(props.separator)
......
<script setup lang="ts" name="QueryForm"> <script setup lang="ts" name="QueryForm">
import { ref, computed,onMounted } from 'vue' import { ref, computed,onMounted } from 'vue'
import type { FormInstance } from 'element-plus' const emit = defineEmits(['update:modelValue', 'query', 'reset', 'add'])
import PageWrapperSearch from '@/components/Search/PageWrapperSearch.vue'
import { useDict } from '@/utils/dict'
import useAppStore from '@/store/modules/app'
const appStore = useAppStore()
const emit = defineEmits(['update:modelValue', 'query', 'reset'])
const dataTypeList = ref([])
const props = defineProps<{ const props = defineProps<{
modelValue: any modelValue: any
}>() }>()
...@@ -22,13 +15,21 @@ const queryForm = computed({ ...@@ -22,13 +15,21 @@ const queryForm = computed({
} }
}) })
const ElFormRef = ref()
// 新增
function handleAdd() {
emit('add')
}
// 搜索 // 搜索
function onSearch() { function onSearch() {
emit('query') emit('query')
} }
// 重置 // 重置
function onReset(formRef: FormInstance) { function onReset() {
const formRef = ElFormRef.value
emit('reset', formRef) emit('reset', formRef)
} }
...@@ -39,27 +40,30 @@ onMounted(() => { ...@@ -39,27 +40,30 @@ onMounted(() => {
</script> </script>
<template> <template>
<page-wrapper-search <el-form ref="ElFormRef" :model="queryForm" label-width="90px">
<el-row :gutter="9">
<el-col :span="8">
<el-form-item label="数据源名称" prop="sysname">
<el-input v-model="queryForm.sysname" placeholder="请输入客户名称" clearable />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="IP" prop="ip">
<el-input v-model="queryForm.ip" placeholder="请输入客户名称" clearable />
</el-form-item>
</el-col>
<el-col :span="8">
<el-button icon="Refresh" @click="onReset">重置</el-button>
<el-button type="primary" icon="Search" @click="onSearch">搜索</el-button>
<el-button type="primary" icon="Plus" style="background: rgba(0, 189, 207, 1);border-color: rgba(0, 189, 207, 1);" @click="handleAdd">新增</el-button>
</el-col>
</el-row>
</el-form>
<!-- <page-wrapper-search
:model="queryForm" :model="queryForm"
@search="onSearch" @search="onSearch"
@reset="onReset" @reset="onReset"
label-width='100'> label-width='90'>
<el-form-item label="数据源名称" prop="sysname">
<el-input v-model="queryForm.sysname" placeholder="请输入客户名称" clearable /> </page-wrapper-search> -->
</el-form-item>
<el-form-item label="IP" prop="ip">
<el-input v-model="queryForm.ip" placeholder="请输入客户名称" clearable />
</el-form-item>
<el-form-item label="数据源类型" prop="dbtype">
<el-select v-model="queryForm.dbtype" placeholder="请选择">
<el-option
v-for="item in appStore.DATABASE_TYPE"
:key="item"
:label="item"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
</page-wrapper-search>
</template> </template>
<script setup name="AssetLibrary"> <script setup lang="ts" name="AddEdit">
import { ref, toRefs, reactive, getCurrentInstance } from 'vue' import { ref, toRefs, reactive, getCurrentInstance, computed } from "vue";
import FormGroup from './modules/formGroup.vue' import FormGroup from "./modules/formGroup.vue";
import img from '@/assets/images/assetLibrary/index.js' import img from "@/assets/images/assetLibrary/index.js";
const emit = defineEmits(['page']) const emit = defineEmits(["update:visibl", "confirm"]);
const step = ref('select') // select edit const props = defineProps<{
visible: any;
}>();
const dialogVisible = computed({
get: () => props.visible,
set: (value) => emit("update:visible", value),
});
const step = ref("edit"); // select edit
const selectData = reactive({ const selectData = reactive({
name: '', name: "",
type: '' type: "",
}) });
const listData = ref([ const listData = ref([
{ {
title: '关系型数据库', name: "MYSQL",
type: 1, },
list: [ {
{ name: "ORACLE",
name: 'MYSQL', },
icon: img.MYSQL, {
}, name: "POSTGRESQL",
{ },
name: 'ORACLE', // {
icon: img.ORACLE, // name: "DB2",
}, // },
{ {
name: 'POSTGRESQL', name: "MSSQLSERVER",
icon: img.POSTGRESQL, },
}, // {
// { // name: "MARIADB",
// name: 'DB2', // },
// icon: img.DB2, // {
// }, // name: "GBASE8S",
{ // },
name: 'MSSQLSERVER', {
icon: img.MSSQLSERVER, name: "KINGBASE",
}, },
// { {
// name: 'MARIADB', name: "DM",
// icon: img.MARIADB,
// },
// {
// name: 'GBASE8S',
// icon: img.GBASE8S,
// },
{
name: 'KINGBASE',
icon: img.KINGBASE,
},
{
name: 'DM',
icon: img.DM,
},
// {
// name: 'GREENPLUM',
// icon: img.GREENPLUM,
// },
// {
// name: 'GAUSS',
// icon: img.GAUSS,
// },
// {
// name: 'OCEANBASE',
// icon: img.OCEANBASE,
// },
// {
// name: 'GAUSSDB',
// icon: img.GAUSSDB,
// }
]
}, },
// { // {
// title: 'NoSQL', // name: "GREENPLUM",
// type: 2, // },
// {
// name: "GAUSS",
// },
// {
// name: "OCEANBASE",
// },
// {
// name: "GAUSSDB",
// },
// {
// name: "ES",
// },
// {
// name: "MONGODB",
// },
// {
// name: "KAFKA",
// },
// {
// name: "Apache",
// type: 4,
// list: [ // list: [
// { // {
// name: 'ES', // name: "HIVE",
// icon: img.ES,
// }, // },
// ],
// },
// {
// name: "CLOUDERA",
// type: 4,
// list: [
// { // {
// name: 'MONGODB', // name: "HIVE",
// icon: img.MONGODB, // },
// } // ],
// ]
// }, // },
// { // {
// title: '消息队列', // name: "星环",
// type: 3, // type: 4,
// list: [ // list: [
// { // {
// name: 'KAFKA', // name: "HIVE_TDH",
// icon: img.KAFKA, // },
// } // ],
// ] // },
// } ]);
])
const hadoopData = reactive({
index: null,
list: [
{
name: 'Apache',
icon1: img.apache1,
icon2: img.apache2,
list: [
{
name: 'HIVE',
icon: img.HIVE,
type: 4,
}
]
},
{
name: 'CLOUDERA',
icon1: img.cloudera1,
icon2: img.cloudera2,
list: [
{
name: 'HIVE',
icon: img.HIVE,
type: 4,
}
]
},
{
name: '星环',
icon1: img.star1,
icon2: img.star2,
list: [
{
name: 'HIVE_TDH',
icon: img.HIVE,
type: 4,
}
]
}
]
})
// hadoop事件
const hadoopClick = (index) => {
hadoopData.index = index
}
// 新增
const editTo = (item,type) => {
selectData.name = item.name
selectData.type = type
step.value = 'edit'
}
// 新增回调 // 新增回调
const modalConfirm = () => { const modalConfirm = () => {
console.log('modalConfirm') console.log("modalConfirm");
emit('page', 'list') dialogVisible.value = false;
} confirm;
emit("confirm");
};
// 关闭弹窗前处理
const handleClose = (done) => {
done();
};
</script> </script>
<template> <template>
<div class="app-container scroller"> <el-dialog title="新增数据源" v-model="dialogVisible" :before-close="handleClose" width="1100">
<PageTitle back @back="emit('page', 'list')"> <div class="addForm" v-if="step === 'edit'">
<template #title> <FormGroup page="add" :title="selectData.name" :type="selectData.type" @cancel="dialogVisible = false"
<span id="badDebt" class="title-icon"> @confirm="modalConfirm" :typeData="listData" />
新增数据源
<PageTour tourType="badDebt" />
</span>
</template>
</PageTitle>
<div class="app-container__body">
<div v-if="step === 'select'">
<div class="listBox" v-for="(item,index) in listData" :key="index">
<div class="title">{{ item.title }}</div>
<div class="img-warpper">
<img class="img" :src="liItem.icon" :alt="liItem.name" @click="editTo(liItem, item.type)" v-for="(liItem, i) in item.list" :key="i">
</div>
</div>
<!-- <div class="title">Hadoop品牌:<span class="data-base-name">{{ hadoopData.index !== null ? hadoopData.list[hadoopData.index].name : '' }}</span></div>
<div style="display: inline-block;">
<div class="hadoop-list-box">
<div class="hadoop-item-box" :class="hadoopData.index === index ? 'hadoop-item-box-active' : ''" v-for="(item,index) in hadoopData.list" :key="index" @click="hadoopClick(index)">
<img :src="item.icon1" alt="">
<img :src="item.icon2" alt="" class="hidden-img">
<div class="name">
<span>{{ item.name }}</span>
<div class="bar"></div>
</div>
</div>
</div>
</div>
<div style="padding-top: 10px;color: #7a8495;">*点击图标切换Hadoop品牌</div>
<div v-if="hadoopData.index !== null" style="color: rgb(102, 102, 102); font-size: 16px; font-weight: bold; padding: 10px 0px;">Hadoop</div>
<div class="img-warpper" v-if="hadoopData.index !== null">
<img class="img" :src="item.icon" :alt="item.name" @click="editTo(item, item.type)" v-for="(item, index) in hadoopData.list[hadoopData.index].list" :key="index">
</div> -->
</div>
<div v-if="step === 'edit'" style="padding: 30px 150px;">
<div style="padding-bottom: 20px;">
<span style="color: rgb(102, 102, 102);">数据源类型:</span>
<span class="source-title">{{ selectData.name }}</span>
</div>
<FormGroup page="add" :title="selectData.name" :type="selectData.type" @cancel="step = 'select'" @confirm="modalConfirm" />
</div>
</div> </div>
</div> </el-dialog>
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
.title { .addForm {
color: #21333f; padding: 0 20px;
font-size: 16px; :deep(.el-form-item) {
line-height: 20px; margin-bottom: 20px;
font-weight: 700;
padding: 10px 0 10px 12px;
.data-base-name{
color: #2c9ef7;
font-size: 20px;
font-weight: 400;
}
}
.img-warpper {
background-color: #f3f5fa;
padding: 7.5px;
margin-top: 24px;
margin-bottom: 50px;
margin-left: 12px;
line-height: 1;
.img {
width: 132px;
font-size: 0;
margin: 0 10px 10px 0;
cursor: pointer;
} }
} :deep(.el-form-item__label) {
.hadoop-list-box {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: nowrap;
flex-wrap: nowrap;
-ms-flex-pack: distribute;
justify-content: space-around;
background: #f1f3f5;
padding: 10px;
.hadoop-item-box {
padding: 8px;
background: #fff; background: #fff;
cursor: pointer; color: rgba(148, 148, 148, 1);
position: relative;
-webkit-transition: -webkit-box-shadow 0.3s;
transition: -webkit-box-shadow 0.3s;
transition: box-shadow 0.3s;
transition: box-shadow 0.3s, -webkit-box-shadow 0.3s;
margin-right: 16px;
img {
font-size: 0;
vertical-align: bottom;
width: 132px;
}
.hidden-img {
position: absolute;
left: 8px;
opacity: 0;
-webkit-transition: opacity 0.5s;
transition: opacity 0.5s;
}
.name {
height: 20px;
line-height: 20px;
text-align: center;
margin-top: 8px;
position: relative;
.bar {
position: absolute;
opacity: 0;
background-color: #1f85df;
height: 2px;
width: 0;
-webkit-transition: all 0.2s;
transition: all 0.2s;
left: 0;
bottom: -4px;
}
}
} }
.hadoop-item-box-active{ :deep(.el-input__inner),
-webkit-box-shadow: 0 0 10px #888; :deep(.el-select__wrapper) {
box-shadow: 0 0 10px #888; height: 34px;
.hidden-img{
opacity: 1;
}
.name{
.bar{
opacity: 1;
width: 132px;
left: 0;
}
}
} }
.hadoop-item-box:hover { :deep(.el-form-item__error) {
-webkit-box-shadow: 0 0 10px #888; left: 0;
box-shadow: 0 0 10px #888; top: 100%;
.hidden-img {
opacity: 1;
}
} }
} }
.source-title{
font-size: 18px;
font-weight: 700;
color: #1f85df;
}
</style> </style>
\ No newline at end of file
<script setup lang="ts" name="AddEdit">
import { ref, toRefs, reactive, getCurrentInstance } from 'vue'
import FormGroup from './modules/formGroup.vue'
import img from '@/assets/images/assetLibrary/index.js'
const emit = defineEmits(["update:modelValue", "confirm", "cancel"])
const props = defineProps<{
modelValue: boolean;
}>();
const step = ref('edit') // select edit
const selectData = reactive({
name: '',
type: ''
})
const listData = ref([
{
title: '关系型数据库',
type: 1,
list: [
{
name: 'MYSQL',
icon: img.MYSQL,
},
{
name: 'ORACLE',
icon: img.ORACLE,
},
{
name: 'POSTGRESQL',
icon: img.POSTGRESQL,
},
// {
// name: 'DB2',
// icon: img.DB2,
// },
{
name: 'MSSQLSERVER',
icon: img.MSSQLSERVER,
},
// {
// name: 'MARIADB',
// icon: img.MARIADB,
// },
// {
// name: 'GBASE8S',
// icon: img.GBASE8S,
// },
{
name: 'KINGBASE',
icon: img.KINGBASE,
},
{
name: 'DM',
icon: img.DM,
},
// {
// name: 'GREENPLUM',
// icon: img.GREENPLUM,
// },
// {
// name: 'GAUSS',
// icon: img.GAUSS,
// },
// {
// name: 'OCEANBASE',
// icon: img.OCEANBASE,
// },
// {
// name: 'GAUSSDB',
// icon: img.GAUSSDB,
// }
]
},
// {
// title: 'NoSQL',
// type: 2,
// list: [
// {
// name: 'ES',
// icon: img.ES,
// },
// {
// name: 'MONGODB',
// icon: img.MONGODB,
// }
// ]
// },
// {
// title: '消息队列',
// type: 3,
// list: [
// {
// name: 'KAFKA',
// icon: img.KAFKA,
// }
// ]
// }
])
const hadoopData = reactive({
index: null,
list: [
{
name: 'Apache',
icon1: img.apache1,
icon2: img.apache2,
list: [
{
name: 'HIVE',
icon: img.HIVE,
type: 4,
}
]
},
{
name: 'CLOUDERA',
icon1: img.cloudera1,
icon2: img.cloudera2,
list: [
{
name: 'HIVE',
icon: img.HIVE,
type: 4,
}
]
},
{
name: '星环',
icon1: img.star1,
icon2: img.star2,
list: [
{
name: 'HIVE_TDH',
icon: img.HIVE,
type: 4,
}
]
}
]
})
// hadoop事件
const hadoopClick = (index) => {
hadoopData.index = index
}
// 新增
const editTo = (item,type) => {
// selectData.name = item.name
// selectData.type = type
// step.value = 'edit'
}
// 新增回调
const modalConfirm = () => {
console.log('modalConfirm')
}
</script>
<template>
<el-dialog title="提示" v-model="modelValue" width="1100">
</el-dialog>
<div class="app-container scroller">
<PageTitle back @back="emit('page', 'list')">
<template #title>
<span id="badDebt" class="title-icon">
新增数据源
<PageTour tourType="badDebt" />
</span>
</template>
</PageTitle>
<div class="app-container__body">
<div v-if="step === 'select'">
<div class="listBox" v-for="(item,index) in listData" :key="index">
<div class="title">{{ item.title }}</div>
<div class="img-warpper">
<img class="img" :src="liItem.icon" :alt="liItem.name" @click="editTo(liItem, item.type)" v-for="(liItem, i) in item.list" :key="i">
</div>
</div>
<!-- <div class="title">Hadoop品牌:<span class="data-base-name">{{ hadoopData.index !== null ? hadoopData.list[hadoopData.index].name : '' }}</span></div>
<div style="display: inline-block;">
<div class="hadoop-list-box">
<div class="hadoop-item-box" :class="hadoopData.index === index ? 'hadoop-item-box-active' : ''" v-for="(item,index) in hadoopData.list" :key="index" @click="hadoopClick(index)">
<img :src="item.icon1" alt="">
<img :src="item.icon2" alt="" class="hidden-img">
<div class="name">
<span>{{ item.name }}</span>
<div class="bar"></div>
</div>
</div>
</div>
</div>
<div style="padding-top: 10px;color: #7a8495;">*点击图标切换Hadoop品牌</div>
<div v-if="hadoopData.index !== null" style="color: rgb(102, 102, 102); font-size: 16px; font-weight: bold; padding: 10px 0px;">Hadoop</div>
<div class="img-warpper" v-if="hadoopData.index !== null">
<img class="img" :src="item.icon" :alt="item.name" @click="editTo(item, item.type)" v-for="(item, index) in hadoopData.list[hadoopData.index].list" :key="index">
</div> -->
</div>
<div v-if="step === 'edit'" style="padding: 30px 150px;">
<div style="padding-bottom: 20px;">
<span style="color: rgb(102, 102, 102);">数据源类型:</span>
<span class="source-title">{{ selectData.name }}</span>
</div>
<FormGroup page="add" :title="selectData.name" :type="selectData.type" @cancel="step = 'select'" @confirm="modalConfirm" />
</div>
</div>
</div>
</template>
<style lang="scss" scoped>
.title {
color: #21333f;
font-size: 16px;
line-height: 20px;
font-weight: 700;
padding: 10px 0 10px 12px;
.data-base-name{
color: #2c9ef7;
font-size: 20px;
font-weight: 400;
}
}
.img-warpper {
background-color: #f3f5fa;
padding: 7.5px;
margin-top: 24px;
margin-bottom: 50px;
margin-left: 12px;
line-height: 1;
.img {
width: 132px;
font-size: 0;
margin: 0 10px 10px 0;
cursor: pointer;
}
}
.hadoop-list-box {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: nowrap;
flex-wrap: nowrap;
-ms-flex-pack: distribute;
justify-content: space-around;
background: #f1f3f5;
padding: 10px;
.hadoop-item-box {
padding: 8px;
background: #fff;
cursor: pointer;
position: relative;
-webkit-transition: -webkit-box-shadow 0.3s;
transition: -webkit-box-shadow 0.3s;
transition: box-shadow 0.3s;
transition: box-shadow 0.3s, -webkit-box-shadow 0.3s;
margin-right: 16px;
img {
font-size: 0;
vertical-align: bottom;
width: 132px;
}
.hidden-img {
position: absolute;
left: 8px;
opacity: 0;
-webkit-transition: opacity 0.5s;
transition: opacity 0.5s;
}
.name {
height: 20px;
line-height: 20px;
text-align: center;
margin-top: 8px;
position: relative;
.bar {
position: absolute;
opacity: 0;
background-color: #1f85df;
height: 2px;
width: 0;
-webkit-transition: all 0.2s;
transition: all 0.2s;
left: 0;
bottom: -4px;
}
}
}
.hadoop-item-box-active{
-webkit-box-shadow: 0 0 10px #888;
box-shadow: 0 0 10px #888;
.hidden-img{
opacity: 1;
}
.name{
.bar{
opacity: 1;
width: 132px;
left: 0;
}
}
}
.hadoop-item-box:hover {
-webkit-box-shadow: 0 0 10px #888;
box-shadow: 0 0 10px #888;
.hidden-img {
opacity: 1;
}
}
}
.source-title{
font-size: 18px;
font-weight: 700;
color: #1f85df;
}
</style>
\ No newline at end of file
<script setup lang="ts" name="AssetLibrary"> <script setup lang="ts" name="AssetLibrary">
import { ref, getCurrentInstance, nextTick, type ComponentInternalInstance } from 'vue' import { ref, getCurrentInstance, nextTick, type ComponentInternalInstance } from 'vue'
import list from './list.vue' import list from './list.vue'
import add from './addEdit.vue'
const widget = { const widget = {
list, list
add
} }
const page = ref('list') const page = ref('list')
......
...@@ -6,6 +6,8 @@ import FormGroup from './modules/formGroup.vue' ...@@ -6,6 +6,8 @@ import FormGroup from './modules/formGroup.vue'
import img from '@/assets/images/assetLibrary/index.js' import img from '@/assets/images/assetLibrary/index.js'
import { queryAll, checkDatasystemUsed, del } from '@/api/assetLibrary/index' import { queryAll, checkDatasystemUsed, del } from '@/api/assetLibrary/index'
import { getCueryCharset } from "@/api/assetLibrary/dict"; import { getCueryCharset } from "@/api/assetLibrary/dict";
import ModalPop from "@/components/EditPop/ModalPop.vue"
import AddEdit from "./addEdit.vue"
const emit = defineEmits(['page']) const emit = defineEmits(['page'])
...@@ -32,7 +34,7 @@ const modalData = reactive({ ...@@ -32,7 +34,7 @@ const modalData = reactive({
show: false, show: false,
text: '' text: ''
}) })
const activeName = ref('') // 内部切换
// 数据源信息 // 数据源信息
const dataSource = reactive({ const dataSource = reactive({
current: 0, // 当前索引 current: 0, // 当前索引
...@@ -45,9 +47,13 @@ const dataSource = reactive({ ...@@ -45,9 +47,13 @@ const dataSource = reactive({
} }
}) })
// 新增弹窗
const dialogVisible = ref(false)
// 新增 // 新增
const handleAdd = () => { const handleAdd = () => {
emit('page', 'add') // emit('page', 'add')
dialogVisible.value = true
} }
// 筛选查询 // 筛选查询
...@@ -65,15 +71,15 @@ const onReset = (formQuery) => { ...@@ -65,15 +71,15 @@ const onReset = (formQuery) => {
// 预览 // 预览
const onPreview = (index) => { const onPreview = (index) => {
dataSource.current = index dataSource.current = index
dataSource.currentId = dataSource.list[dataSource.current].id dataSource.currentId = dataSource.list[dataSource.current].items[0].id
dataSource.currentFlag = dataSource.list[dataSource.current].flag dataSource.currentFlag = dataSource.list[dataSource.current].items[0].flag
activeName.value = dataSource.currentId
} }
// 删除 // 删除
const onDelete = (val) => { const onDelete = (val) => {
const { id, sysname } = val const { id, sysname } = val
checkDatasystemUsed({ id: id }).then(res => { checkDatasystemUsed({ id: id }).then(res => {
console.log(res)
const flag = { res } const flag = { res }
if (flag) { if (flag) {
dataSource.current = 0 dataSource.current = 0
...@@ -110,12 +116,37 @@ const onConfirm = () => { ...@@ -110,12 +116,37 @@ const onConfirm = () => {
const getList = () => { const getList = () => {
queryAll(queryParams.value).then(res => { queryAll(queryParams.value).then(res => {
// console.log(res) // console.log(res)
dataSource.list = res.data dataSource.list = []
dataSource.currentId = dataSource.list[dataSource.current].id if (res.data.length <= 0) return
dataSource.currentFlag = dataSource.list[dataSource.current].flag const groupedItems = res.data.reduce((acc, item) => {
// 如果acc中还没有当前dbtype的键,则创建一个空数组
if (!acc[item.dbtype]) {
acc[item.dbtype] = [];
}
// 将当前项添加到对应dbtype的数组中
acc[item.dbtype].push(item);
return acc;
}, {});
// 将分组对象转换为数组(可选步骤,如果你需要数组形式的输出)
dataSource.list = Object.keys(groupedItems).map(key => ({
dbtype: key,
items: groupedItems[key]
}));
dataSource.currentId = dataSource.list[dataSource.current].items[0].id
dataSource.currentFlag = dataSource.list[dataSource.current].items[0].flag
activeName.value = dataSource.currentId
}) })
} }
const tabClick = (tab) => {
const { props, index } = tab
activeName.value = props.name
dataSource.currentId = activeName.value
dataSource.currentFlag = dataSource.list[dataSource.current].items[index].flag
}
onMounted(() => { onMounted(() => {
getCueryCharset() getCueryCharset()
getList() getList()
...@@ -123,162 +154,210 @@ onMounted(() => { ...@@ -123,162 +154,210 @@ onMounted(() => {
</script> </script>
<template> <template>
<div class="app-container"> <div class="app-container scroller">
<PageTitle> <div class="app-container__body" style="padding: 30px 0 10px 0;">
<template #title> <div class="pageTitle">
资产库 <img class="icon" :src="img.pageTitle" alt="">
</template> <span>资产库</span>
<template #buttons> </div>
<el-button type="primary" icon="Plus" @click="handleAdd">新增数据源</el-button> <query-form ref="QueryFormRef" v-model="queryParams" @query="onQuery" @reset="onReset" @add="handleAdd" />
</template> <div class="mainBox">
</PageTitle> <div class="mainBox-left">
<div class="app-container__body"> <el-scrollbar>
<query-form ref="QueryFormRef" v-model="queryParams" @query="onQuery" @reset="onReset" /> <div class="scroll">
<el-scrollbar> <div class="left-card" :class="dataSource.current === index ? 'active' : ''"
<div class="flex-content"> v-for="(item, index) in dataSource.list" :key="index" @click="onPreview(index)">
<el-card class="box-card" :class="dataSource.current === index ? 'active' : ''" <img class="img" :src="img[item.dbtype]" alt="">
:body-style="{ padding: '0px !important' }" v-for="(item, index) in dataSource.list" :key="index"> <img class="arrow" v-if="dataSource.current === index" :src="img.arrow" alt="">
<img class="img" :src="img[item.dbtype]" alt="">
<div class="title">
<div class="title-content">{{ item.sysname }}</div>
</div>
<div class="mask">
<div class="maskbutton">
<div class="maskbutton-item" @click="onDelete(item)">
<el-icon :size="18">
<delete />
</el-icon>
<br>
<span>删除</span>
</div>
<div class="maskbutton-item" @click="onPreview(index)" v-if="dataSource.current !== index">
<el-icon :size="18">
<View />
</el-icon>
<br>
<span>预览</span>
</div>
</div> </div>
</div> </div>
</el-card> <div class="line"></div>
<div class="lineBg"></div>
</el-scrollbar>
</div>
<div class="mainBox-right">
<div class="line"></div>
<el-empty description="暂无数据" v-if="dataSource.list.length <= 0"
style="position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);"></el-empty>
<div class="right-container" v-if="dataSource.list.length > 0">
<el-tabs v-model="activeName" @tab-click="tabClick">
<el-tab-pane :label="item.sysname" :name="item.id"
v-for="(item, index) in dataSource.list[dataSource.current].items" :key="index"></el-tab-pane>
</el-tabs>
<div class="form-box mt20" v-if="dataSource.list.length > 0">
<el-scrollbar>
<FormGroup :id="dataSource.currentId" :flag="dataSource.currentFlag" page="edit" @confirm="onConfirm"
@on-delete="onDelete" />
</el-scrollbar>
</div>
</div>
</div> </div>
</el-scrollbar>
<div class="mt20" v-if="dataSource.list.length > 0" style="padding-bottom: 20px;">
<div class="mb20">数据源明细:{{ form.name }}</div>
<FormGroup :id="dataSource.currentId" :flag="dataSource.currentFlag" page="edit" @confirm="onConfirm" />
</div> </div>
</div> </div>
<Modal v-model="modalData.show" icon="error" :cancel="true" :text="modalData.text" @confirm="modalConfirm"></Modal> <Modal v-model="modalData.show" icon="error" :cancel="true" :text="modalData.text" @confirm="modalConfirm"></Modal>
<!-- 新增 -->
<AddEdit v-model:visible="dialogVisible" @confirm="onConfirm" />
</div> </div>
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
.flex-content { .pageTitle {
margin-bottom: 30px;
display: flex; display: flex;
height: 205px; align-items: center;
.box-card { font-size: 16px;
font-weight: 500;
letter-spacing: 0px;
line-height: 22px;
color: rgba(53, 64, 79, 1);
.icon {
margin-right: 3px;
width: 21px;
height: 21px;
}
}
.mainBox {
flex: 1;
width: 100%;
display: flex;
overflow: hidden;
&-left {
position: relative; position: relative;
flex-shrink: 0; padding-left: 25px;
margin-right: 20px; width: 134px;
height: 138px; height: 100%;
width: 188px;
border-radius: 10px;
-webkit-transform: translateY(0);
transform: translateY(0);
-webkit-transition: all 0.1s;
transition: all 0.1s;
:deep(.el-card__body) {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
.img {
width: 100%;
border-radius: 10px 10px 0 0;
}
.title { .line {
width: 100%; position: absolute;
flex: 1; top: 0;
display: flex; right: 6px;
align-items: center; width: 3px;
justify-content: center; height: 100%;
color: #7a8495; background: rgba(204, 204, 204, 1);
&-content { border-radius: 3px 0 0 3px;
padding-left: 16px;
padding-right: 16px;
font-size: 14px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
} }
.mask { .lineBg {
position: absolute; position: absolute;
z-index: -1;
opacity: 0;
-webkit-transition: all 0.1s;
transition: all 0.1s;
width: 100%;
height: 104px;
left: 0;
top: 0; top: 0;
background: #191919; right: 0;
display: flex; width: 6px;
-webkit-box-align: center; height: 100%;
-ms-flex-align: center; background: #fff;
align-items: center; border-top: 2px solid rgba(33, 103, 217, 1);
justify-content: center; }
border-radius: 10px 10px 0 0;
.maskbutton { .scroll {
color: #fff; padding: 17px 0;
width: 100%; overflow: hidden;
position: absolute;
top: 50%; .left-card {
-webkit-transform: translateY(-50%); position: relative;
transform: translateY(-50%); margin-bottom: 8px;
display: -webkit-box; width: 80px;
display: -ms-flexbox; height: 50px;
display: flex; border-radius: 5px;
-ms-flex-pack: distribute; border: 1px solid rgba(134, 191, 252, 1);
justify-content: space-around; cursor: pointer;
&-item {
width: 70px; .img {
font-size: 14px; width: 100%;
cursor: pointer; height: 100%;
text-align: center; }
color: #fff; .arrow {
z-index: 1;
position: absolute;
top: -1px;
right: -29px;
width: 8px;
height: 50px;
} }
} }
.left-card:last-child {
margin-bottom: 0;
}
.active {
background: rgba(255, 255, 255, 1);
border: 1px solid rgba(33, 103, 217, 1);
}
} }
} }
.active { &-right {
.title { position: relative;
background: #2c9ef7; flex: 1;
color: #fff; height: 100%;
} background: rgba(255, 255, 255, 1);
} border-radius: 0 3px 3px 0;
.box-card:hover { .line {
width: 250px;
height: 190px;
margin: 0 16px;
.mask {
opacity: 1;
width: 100%; width: 100%;
height: 140px; height: 2px;
display: block; background: linear-gradient(
position: absolute; 90deg,
z-index: 50; rgba(33, 103, 217, 1) 0%,
rgba(17, 200, 250, 1) 34.03%,
rgba(33, 103, 217, 1) 64.58%,
rgba(48, 128, 255, 1) 100%
);
} }
.title { .right-container {
&-content { height: calc(100% - 2px);
font-size: 18px; padding: 20px 33px;
display: flex;
flex-direction: column;
.form-box {
flex: 1;
overflow: hidden;
:deep(inputBox) {
margin-left: 1px;
background: #f5fcff;
}
:deep(.foundationBox) {
border-radius: 5px;
background: #ebebeb;
border: 1px solid #1db2f5;
overflow: hidden;
}
:deep(.el-form-item__label) {
height: 40px;
line-height: 40px;
background: #f5fcff;
color: rgba(148, 148, 148, 1);
}
:deep(.el-form-item) {
margin-bottom: 1px;
}
:deep(.el-input),
:deep(.el-select),
:deep(.el-select__wrapper) {
height: 40px;
line-height: 40px;
}
:deep(.is-disabled) {
background: #f5fcff;
.el-input__wrapper {
background: #f5fcff;
box-shadow: none;
border-radius: 0;
}
.el-input__inner {
-webkit-text-fill-color: rgba(53, 64, 79, 1);
}
}
:deep(.is-disabled).el-select__wrapper {
background: #f5fcff;
box-shadow: none;
border-radius: 0;
.el-select__tags-text {
color: rgba(53, 64, 79, 1);
}
}
} }
} }
} }
.box-card:last-child {
margin-right: 0;
}
} }
</style> </style>
\ No newline at end of file
...@@ -12,16 +12,16 @@ import { ...@@ -12,16 +12,16 @@ import {
add, add,
} from "@/api/assetLibrary/index"; } from "@/api/assetLibrary/index";
import { oracleisinsData, getCode } from "@/api/assetLibrary/dict"; import { oracleisinsData, getCode } from "@/api/assetLibrary/dict";
import useAppStore from '@/store/modules/app' import useAppStore from "@/store/modules/app";
const emit = defineEmits(["cancel", "confirm"]); const emit = defineEmits(["cancel", "confirm", "onDelete"]);
const appStore = useAppStore() const appStore = useAppStore();
const props = withDefaults( const props = withDefaults(
defineProps<{ defineProps<{
id?: string; id?: string;
flag?: string; flag?: string;
page?: string; page?: string;
title?: string; typeData?: Array<any>;
}>(), }>(),
{ {
id: "", id: "",
...@@ -30,7 +30,11 @@ const props = withDefaults( ...@@ -30,7 +30,11 @@ const props = withDefaults(
); );
const formRef = ref<FormInstance>(); const formRef = ref<FormInstance>();
const titleName = ref(props.title); const titleName = ref('');
const dbtypeData = ref({
type: 0,
list: []
})
const pagecodeList = ref([]); const pagecodeList = ref([]);
const datadisList = ref([]); const datadisList = ref([]);
const userList = ref([]); const userList = ref([]);
...@@ -44,8 +48,16 @@ const modalData = reactive({ ...@@ -44,8 +48,16 @@ const modalData = reactive({
const data = reactive({ const data = reactive({
form: <any>{ form: <any>{
user: [],
}, },
rules: { rules: {
dbtype: [
{
required: true,
message: "请选择数据源类型",
trigger: ["change"],
},
],
sysname: [ sysname: [
{ {
required: true, required: true,
...@@ -60,21 +72,13 @@ const data = reactive({ ...@@ -60,21 +72,13 @@ const data = reactive({
trigger: ["blur"], trigger: ["blur"],
}, },
], ],
dbip: [ dbip: [{ required: true, message: "请输入IP地址", trigger: ["blur"] }],
{ required: true, message: "请输入IP地址", trigger: ["blur"] }, dbport: [{ required: true, message: "请输入端口号", trigger: ["blur"] }],
],
dbport: [
{ required: true, message: "请输入端口号", trigger: ["blur"] },
],
servername: [ servername: [
{ required: true, message: "请输入实例名", trigger: ["blur"] }, { required: true, message: "请输入实例名", trigger: ["blur"] },
], ],
username: [ username: [{ required: true, message: "请输入用户名", trigger: ["blur"] }],
{ required: true, message: "请输入用户名", trigger: ["blur"] }, password: [{ required: true, message: "请输入密码", trigger: ["blur"] }],
],
password: [
{ required: true, message: "请输入密码", trigger: ["blur"] },
],
version: [ version: [
{ {
required: true, required: true,
...@@ -98,18 +102,25 @@ const { form, rules } = toRefs(data); ...@@ -98,18 +102,25 @@ const { form, rules } = toRefs(data);
const onAdd = () => { const onAdd = () => {
const formData = { const formData = {
flag: 1, flag: 1,
user: form.value.user ? form.value.user.map(item => { return {id: item} }) : [] user: form.value.user
} ? form.value.user.map((item) => {
form.value = {...form.value,...formData} return { id: item };
})
: [],
};
form.value = { ...form.value, ...formData };
if (props.page === "edit") { if (props.page === "edit") {
form.value = {...form.value, ...{id: form.value.id}} form.value = { ...form.value, ...{ id: form.value.id } };
} else if (props.page === "add") { } else if (props.page === "add") {
const username = appStore.userInfo.user.username const username = appStore.userInfo.user.username;
const loginUser = { tsysUser: { username: username }, username: username } const loginUser = { tsysUser: { username: username }, username: username };
form.value = {...form.value, ...{loginUser: loginUser,dbtype: titleName.value}} form.value = {
...form.value,
...{ loginUser: loginUser, dbtype: titleName.value },
};
} }
console.log('add', form.value) console.log("add", form.value);
add(form.value).then((res) => { add(form.value).then((res) => {
const flag = res.flag; const flag = res.flag;
if (flag) { if (flag) {
...@@ -224,12 +235,12 @@ const getTestConnect = () => { ...@@ -224,12 +235,12 @@ const getTestConnect = () => {
const detection = () => { const detection = () => {
// console.log('检测') // console.log('检测')
form.value.dbtype = titleName.value; form.value.dbtype = titleName.value;
checkVersion(form.value).then((res) => { checkVersion(form.value).then((res) => {
const { flag, data, msg } = res const { flag, data, msg } = res;
if (flag) { if (flag) {
form.value.version = data; form.value.version = data;
} else { } else {
modalData.type = "test"; modalData.type = "test";
modalData.icon = "error"; modalData.icon = "error";
modalData.text = msg; modalData.text = msg;
...@@ -248,8 +259,12 @@ const getInitEdit = () => { ...@@ -248,8 +259,12 @@ const getInitEdit = () => {
initEdit(data).then((res) => { initEdit(data).then((res) => {
// console.log(res) // console.log(res)
form.value = res.data; form.value = res.data;
form.value.user = form.value.user ? form.value.user.map(item => { return item.id }) : [] form.value.user = form.value.user
titleName.value = form.value.dbtype ? form.value.user.map((item) => {
return item.id;
})
: [];
titleName.value = form.value.dbtype;
getQueryDatadis(); getQueryDatadis();
pagecodeList.value = getCode(titleName.value.toLowerCase()); pagecodeList.value = getCode(titleName.value.toLowerCase());
}); });
...@@ -284,7 +299,7 @@ const oracleisinsChange = () => { ...@@ -284,7 +299,7 @@ const oracleisinsChange = () => {
} }
} else if (form.value.oracleisins === "1") { } else if (form.value.oracleisins === "1") {
form.value.oracleIns = form.value.oracleIns =
(form.value.oracleIns && form.value.oracleIns.length > 0) form.value.oracleIns && form.value.oracleIns.length > 0
? form.value.oracleIns ? form.value.oracleIns
: [{ insip: "", insname: "", insport: "" }]; : [{ insip: "", insname: "", insport: "" }];
form.value.dbservername = ""; form.value.dbservername = "";
...@@ -299,10 +314,36 @@ const oracleisinsAdd = () => { ...@@ -299,10 +314,36 @@ const oracleisinsAdd = () => {
}; };
// 删除实例 // 删除实例
const oracleisinsDelete = () => { const oracleisinsDelete = (index) => {
form.value.oracleIns = form.value.oracleIns.slice(0, -1); form.value.oracleIns.splice(index, 1);
}; };
// 删除
const onDelete = () => {
emit("onDelete", form.value);
};
const titleNameChange = () => {
// dbtypeData
dbtypeData.value.type = 0
const currentData = props.typeData.find((item) => item.name === titleName.value);
dbtypeData.value = Object.assign({...dbtypeData.value, ...currentData})
if (dbtypeData.value.type !== 4) {
form.value.dbtype = titleName.value
getQueryDatadis();
pagecodeList.value = getCode(titleName.value.toLowerCase());
}else{
form.value.dbtype = ''
}
console.log(dbtypeData.value.type)
}
const dbtypeChange = () => {
getQueryDatadis();
pagecodeList.value = getCode(titleName.value.toLowerCase());
}
watch( watch(
() => props.id, () => props.id,
(newVal) => { (newVal) => {
...@@ -313,148 +354,216 @@ watch( ...@@ -313,148 +354,216 @@ watch(
); );
onMounted(() => { onMounted(() => {
if (props.page === "add") {
titleName.value = props.title;
getQueryDatadis();
pagecodeList.value = getCode(titleName.value.toLowerCase());
}
getQueryUser(); getQueryUser();
}); });
</script> </script>
<template> <template>
<div class="dataList"> <div class="dataList">
<el-form ref="formRef" class="form" :model="form" :rules="rules" label-width="150px" :disabled="readOnly"> <el-form ref="formRef" class="form" :model="form" :rules="rules" label-width="150px" :disabled="readOnly" :label-position="page === 'add' ? 'left' : 'right'">
<el-form-item label="数据源名称" prop="sysname" required> <DividerTitle title-name="数据源明细" />
<div style="width: 100%;background: #F3F5FA;margin-left: 4px;"> <div class="foundationBox">
<el-input v-model="form.sysname"></el-input> <el-row :gutter="page === 'add' ? 50 : 0">
</div> <el-col :span="(page === 'add' && dbtypeData.type === 0) ? 12 : 24" v-if="page === 'add'">
</el-form-item> <el-row :gutter="50">
<el-form-item label="连接类型" prop="oracleisins" v-if="titleName === 'ORACLE'"> <el-col :span="dbtypeData.type === 0 ? 24 : 12">
<div style="width: 100%;background: #F3F5FA;margin-left: 4px;"> <el-form-item label="数据源类型" prop="dbtype" required>
<el-select v-model="form.oracleisins" @change="oracleisinsChange"> <div class="inputBox">
<el-option v-for="item in oracleisinsData" :key="item.value" :label="item.label" :value="item.value"> <el-select v-model="titleName" @change="titleNameChange" placeholder="请选择数据源类型">
</el-option> <el-option v-for="item in typeData" :key="item.name" :label="item.name"
</el-select> :value="item.name">
</div> </el-option>
</el-form-item> </el-select>
<el-form-item label="服务名" prop="dbservername" required </div>
v-if="titleName === 'ORACLE' && form.oracleisins !== '1'"> </el-form-item>
<div style="width: 100%;background: #F3F5FA;margin-left: 4px;"> </el-col>
<el-input v-model="form.dbservername"></el-input> <el-col :span="1" v-if="dbtypeData.type === 4" style="padding: 0;">
</div> <div style="width: 100%;height: 1px;background-color: #D2DCE7;margin-top: 36%;display: flex;justify-content: center;"></div>
</el-form-item> </el-col>
<el-form-item label="IP地址" prop="dbip" required v-if="form.oracleisins !== '1'"> <el-col :span="4" v-if="dbtypeData.type === 4">
<div style="width: 100%;background: #F3F5FA;margin-left: 4px;"> <el-form-item label="" label-width="0" prop="dbtype" required>
<el-input v-model="form.dbip"></el-input> <div class="inputBox">
</div> <el-select v-model="form.dbtype" @change="dbtypeChange" placeholder="请选择数据源类型">
</el-form-item> <el-option v-for="item in dbtypeData.list" :key="item.name" :label="item.name"
<el-form-item label="端口号" prop="dbport" required v-if="form.oracleisins !== '1'"> :value="item.name">
<div style="width: 100%;background: #F3F5FA;margin-left: 4px;"> </el-option>
<el-input v-model="form.dbport"></el-input> </el-select>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="实例名" prop="servername" required v-if="titleName === 'GBASE8S'"> </el-col>
<div style="width: 100%;background: #F3F5FA;margin-left: 4px;"> </el-row>
<el-input v-model="form.servername"></el-input> </el-col>
</div> <el-col :span="page === 'add' ? 12 : 24">
</el-form-item> <el-form-item label="数据源名称" prop="sysname" required>
<el-form-item label="数据库名" prop="dbservername" required <div class="inputBox">
v-if="titleName !== 'ES' && titleName !== 'KAFKA' && titleName !== 'ORACLE' && titleName !== 'HIVE_TDH'"> <el-input v-model="form.sysname" placeholder="请输入数据源名称"></el-input>
<div style="width: 100%;background: #F3F5FA;margin-left: 4px;"> </div>
<el-input v-model="form.dbservername"></el-input> </el-form-item>
</div> </el-col>
</el-form-item> <el-col :span="page === 'add' ? 12 : 24" v-if="form.dbtype === 'ORACLE'">
<el-form-item label="HIVE 数据库名" prop="dbservername" required v-if="titleName === 'HIVE_TDH'"> <el-form-item label="连接类型" prop="oracleisins">
<div style="width: 100%;background: #F3F5FA;margin-left: 4px;"> <div class="inputBox">
<el-input v-model="form.dbservername"></el-input> <el-select v-model="form.oracleisins" @change="oracleisinsChange" placeholder="请选择连接类型">
</div> <el-option v-for="item in oracleisinsData" :key="item.value" :label="item.label" :value="item.value">
</el-form-item> </el-option>
<el-form-item label="Driver Classpath" prop="Classpath" v-if="titleName === 'HIVE'"> </el-select>
<div style="width: 100%;background: #F3F5FA;margin-left: 4px;"> </div>
<el-input v-model="form.Classpath"></el-input> </el-form-item>
</div> </el-col>
</el-form-item> <el-col :span="page === 'add' ? 12 : 24" v-if="form.dbtype === 'ORACLE' && form.oracleisins !== '1'">
<el-form-item label="用户名" prop="username" required v-if="titleName !== 'KAFKA'"> <el-form-item label="服务名" prop="dbservername" required>
<div style="width: 100%;background: #F3F5FA;margin-left: 4px;"> <div class="inputBox">
<el-input v-model="form.username"></el-input> <el-input v-model="form.dbservername" placeholder="请输入服务名"></el-input>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="密码" prop="password" required v-if="titleName !== 'KAFKA'"> </el-col>
<div style="width: 100%;background: #F3F5FA;margin-left: 4px;"> <el-col :span="page === 'add' ? 12 : 24" v-if="form.oracleisins !== '1'">
<el-input v-model="form.password" show-password></el-input> <el-form-item label="IP地址" prop="dbip" required>
</div> <div class="inputBox">
</el-form-item> <el-input v-model="form.dbip" placeholder="请输入IP地址"></el-input>
<el-form-item label="数据库版本" prop="version" :required="titleName !== 'KAFKA'" > </div>
<div style="width: 100%;background: #F3F5FA;margin-left: 4px;display: flex;"> </el-form-item>
<el-input v-model="form.version" v-if="readOnly"></el-input> </el-col>
<el-select v-model="form.version" v-if="!readOnly"> <el-col :span="page === 'add' ? 12 : 24" v-if="form.oracleisins !== '1'">
<el-option v-for="item in datadisList" :key="item.dictvalue" :label="item.dictvalue" <el-form-item label="端口号" prop="dbport" required>
:value="item.dictvalue"> <div class="inputBox">
</el-option> <el-input v-model="form.dbport" placeholder="请输入端口号"></el-input>
</el-select> </div>
<el-button type="primary" @click="detection" v-if="!readOnly">检测</el-button> </el-form-item>
</div> </el-col>
</el-form-item> <el-col :span="page === 'add' ? 12 : 24" v-if="form.dbtype === 'GBASE8S'">
<el-form-item label="字符编码" prop="pagecode" required> <el-form-item label="实例名" prop="servername" required >
<div style="width: 100%;background: #F3F5FA;margin-left: 4px;"> <div class="inputBox">
<el-input v-model="form.pagecode" v-if="readOnly"></el-input> <el-input v-model="form.servername" placeholder="请输入实例名"></el-input>
<el-select v-model="form.pagecode" v-if="!readOnly"> </div>
<el-option v-for="item in pagecodeList" :key="item" :label="item" :value="item"> </el-form-item>
</el-option> </el-col>
</el-select> <el-col :span="page === 'add' ? 12 : 24" v-if="form.dbtype !== 'ES' && form.dbtype !== 'KAFKA' && form.dbtype !== 'ORACLE' && form.dbtype !== 'HIVE_TDH'">
</div> <el-form-item label="数据库名" prop="dbservername" required>
</el-form-item> <div class="inputBox">
<el-form-item label="授权用户" prop="user"> <el-input v-model="form.dbservername" placeholder="请输入数据库名"></el-input>
<div style="width: 100%;background: #F3F5FA;margin-left: 4px;"> </div>
<el-select v-model="form.user" multiple> </el-form-item>
<el-option v-for="item in userList" :key="item.id" :label="item.realname" :value="item.id"> </el-col>
</el-option> <el-col :span="page === 'add' ? 12 : 24" v-if="form.dbtype === 'HIVE_TDH'">
</el-select> <el-form-item label="HIVE 数据库名" prop="dbservername" required>
</div> <div class="inputBox">
</el-form-item> <el-input v-model="form.dbservername" placeholder="请输入数据库名"></el-input>
</div>
</el-form-item>
</el-col>
<el-col :span="page === 'add' ? 12 : 24" v-if="form.dbtype === 'HIVE'">
<el-form-item label="Driver Classpath" prop="Classpath">
<div class="inputBox">
<el-input v-model="form.Classpath" placeholder="请输入Driver Classpath"></el-input>
</div>
</el-form-item>
</el-col>
<el-col :span="page === 'add' ? 12 : 24" v-if="form.dbtype !== 'KAFKA'">
<el-form-item label="用户名" prop="username" required>
<div class="inputBox">
<el-input v-model="form.username" placeholder="请输入用户名"></el-input>
</div>
</el-form-item>
</el-col>
<el-col :span="page === 'add' ? 12 : 24" v-if="form.dbtype !== 'KAFKA'">
<el-form-item label="密码" prop="password" required>
<div class="inputBox">
<el-input v-model="form.password" show-password placeholder="请输入密码"></el-input>
</div>
</el-form-item>
</el-col>
<el-col :span="page === 'add' ? 12 : 24">
<el-form-item label="数据库版本" prop="version" :required="form.dbtype !== 'KAFKA'">
<div class="inputBox" style="display: flex;align-items: center;">
<el-input v-model="form.version" v-if="readOnly"></el-input>
<el-select v-model="form.version" v-if="!readOnly" placeholder="请选择数据库版本">
<el-option v-for="item in datadisList" :key="item.dictvalue" :label="item.dictvalue"
:value="item.dictvalue">
</el-option>
</el-select>
<el-button type="primary" style="width: 60px;height: 90%;margin-left: 5px;border-radius: 0;"
@click="detection" v-if="!readOnly">检测</el-button>
</div>
</el-form-item>
</el-col>
<el-col :span="page === 'add' ? 12 : 24">
<el-form-item label="字符编码" prop="pagecode" required>
<div class="inputBox">
<el-input v-model="form.pagecode" v-if="readOnly"></el-input>
<el-select v-model="form.pagecode" v-if="!readOnly" placeholder="请选择字符编码">
<el-option v-for="item in pagecodeList" :key="item" :label="item" :value="item">
</el-option>
</el-select>
</div>
</el-form-item>
</el-col>
<el-col :span="page === 'add' ? 12 : 24">
<el-form-item label="授权用户" prop="user">
<div class="inputBox">
<div class="userEmpty" v-if="readOnly && form.user.length <= 0"></div>
<el-select v-model="form.user" multiple v-if="!readOnly || form.user.length > 0" placeholder="请选择授权用户">
<el-option v-for="item in userList" :key="item.id" :label="item.realname" :value="item.id">
</el-option>
</el-select>
</div>
</el-form-item>
</el-col>
</el-row>
</div>
<div class="oracleisinsBox" v-if="form.oracleisins === '1'"> <div class="oracleisinsBox" v-if="form.oracleisins === '1'">
<div class="title">请新增oracle实例</div> <DividerTitle title-name="oracle实例">
<div class="top"> <el-button type="primary" link icon="Plus" v-if="!readOnly" @click="oracleisinsAdd">新增oracle实例</el-button>
</DividerTitle>
<!-- <div class="top">
<span>oracle实例</span> <span>oracle实例</span>
<div class="oracleInsBut"> <div class="oracleInsBut">
<el-button type="info" link icon="Plus" @click="oracleisinsAdd">新增</el-button>
<el-button type="info" link icon="Minus" @click="oracleisinsDelete">删除</el-button> <el-button type="info" link icon="Minus" @click="oracleisinsDelete">删除</el-button>
</div> </div>
</div> </div> -->
<el-table :data="form.oracleIns" border style="width: 100%"> <el-table :data="form.oracleIns" stripe style="width: 100%">
<el-table-column type="index" label="序号" width="100" align="center" />
<el-table-column prop="insname" label="实例名" align="center"> <el-table-column prop="insname" label="实例名" align="center">
<template #default="scope"> <template #default="scope">
<el-form-item label="" label-width="0" :prop="`oracleIns.${scope.$index}.insname`" <el-form-item label="" label-width="0" :prop="`oracleIns.${scope.$index}.insname`"
:rules="[{ required: true, message: '请输入实例名', trigger:'blur' }]"> :rules="[{ required: true, message: '请输入实例名', trigger: 'blur' }]">
<el-input v-model="scope.row.insname"></el-input> <el-input v-model="scope.row.insname" placeholder="请输入实例名"></el-input>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="insip" label="IP地址" align="center"> <el-table-column prop="insip" label="IP地址" align="center">
<template #default="scope"> <template #default="scope">
<el-form-item label="" label-width="0" :prop="`oracleIns.${scope.$index}.insip`" <el-form-item label="" label-width="0" :prop="`oracleIns.${scope.$index}.insip`"
:rules="[{ required: true, message: '请输入IP地址', trigger:'blur' }]"> :rules="[{ required: true, message: '请输入IP地址', trigger: 'blur' }]">
<el-input v-model="scope.row.insip"></el-input> <el-input v-model="scope.row.insip" placeholder="请输入IP地址"></el-input>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="insport" label="端口号" align="center"> <el-table-column prop="insport" label="端口号" align="center">
<template #default="scope"> <template #default="scope">
<el-form-item label="" label-width="0" :prop="`oracleIns.${scope.$index}.insport`" <el-form-item label="" label-width="0" :prop="`oracleIns.${scope.$index}.insport`"
:rules="[{ required: true, message: '请输入端口号', trigger:'blur' }]"> :rules="[{ required: true, message: '请输入端口号', trigger: 'blur' }]">
<el-input v-model="scope.row.insport"></el-input> <el-input v-model="scope.row.insport" placeholder="请输入端口号"></el-input>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="insport" label="操作" align="center" width="150">
<template #default="scope">
<el-button type="primary" link icon="delete" @click="oracleisinsDelete(scope.$index)">删除</el-button>
</template>
</el-table-column>
</el-table> </el-table>
</div> </div>
</el-form> </el-form>
<div class="buttonBox mt20"> <div class="buttonBox mt20">
<el-button v-if="!readOnly" type="primary" style="width: 150px;" @click="onConfirm">确认</el-button> <el-button v-if="!readOnly" style="width: 80px;" @click="onCancel">取消</el-button>
<el-button v-if="!readOnly" type="primary" style="width: 150px;" @click="test">测试</el-button> <el-button v-if="!readOnly" type="primary" style="width: 80px;" @click="onConfirm">确认</el-button>
<el-button v-if="!readOnly" type="info" style="width: 150px;" @click="onCancel">取消</el-button> <el-button v-if="!readOnly" type="primary" style="width: 80px;background: #FF8D1A;border: 1px solid #FF8D1A;"
<el-button v-if="readOnly" type="primary" style="width: 150px;" @click="readOnly = false">编辑</el-button> @click="test">测试</el-button>
<el-button v-if="readOnly" type="primary" style="width: 80px;" @click="readOnly = false">编辑</el-button>
<el-button v-if="readOnly" type="primary" style="width: 80px;background: #FF8D1A;border: 1px solid #FF8D1A;"
@click="onDelete">删除</el-button>
</div> </div>
<Modal v-model="modalData.show" :icon="modalData.icon" :cancel="false" :text="modalData.text" <Modal v-model="modalData.show" :icon="modalData.icon" :cancel="false" :text="modalData.text"
@confirm="modalConfirm" @cancel="modalCancel"> @confirm="modalConfirm" @cancel="modalCancel">
...@@ -467,34 +576,48 @@ onMounted(() => { ...@@ -467,34 +576,48 @@ onMounted(() => {
display: flex; display: flex;
justify-content: center; justify-content: center;
} }
.form { .form {
:deep(.el-form-item__label) { :deep(.el-form-item__label) {
background: #f0f0f0; background: #f0f0f0;
} }
:deep(.el-input__wrapper) { :deep(.el-input__wrapper) {
// background: rgba(255, 255, 255, 0); // background: rgba(255, 255, 255, 0);
// box-shadow: none; // box-shadow: none;
} }
:deep(.el-form-item) { :deep(.el-form-item) {
margin-bottom: 5px; margin-bottom: 5px;
} }
:deep(.el-select__wrapper) { :deep(.el-select__wrapper) {
// background: rgba(255, 255, 255, 0); // background: rgba(255, 255, 255, 0);
// box-shadow: none; // box-shadow: none;
} }
:deep(.el-form-item__error) { :deep(.el-form-item__error) {
left: auto; left: auto;
right: 83px; right: 83px;
top: 24%; top: 24%;
}
.inputBox {
margin-left: 1px;
width: 100%;
height: 100%;
}
.userEmpty {
width: 100%;
height: 100%;
background: #f5fcff;
display: flex;
align-items: center;
padding-left: 13px;
}
} }
}
.oracleisinsBox { .oracleisinsBox {
.title { margin-top: 24px;
height: 30px;
line-height: 30px;
font-weight: 700;
color: rgb(81, 90, 110);
}
.top { .top {
position: relative; position: relative;
text-align: center; text-align: center;
...@@ -504,20 +627,36 @@ onMounted(() => { ...@@ -504,20 +627,36 @@ onMounted(() => {
position: relative; position: relative;
margin-bottom: 5px; margin-bottom: 5px;
background: rgb(210, 210, 210); background: rgb(210, 210, 210);
.oracleInsBut { .oracleInsBut {
position: absolute; position: absolute;
top: 0; top: 0;
right: 20px; right: 20px;
height: 100%; height: 100%;
:deep(.is-link) { :deep(.is-link) {
color: rgb(81, 90, 110); color: rgb(81, 90, 110);
font-weight: bold; font-weight: bold;
} }
} }
} }
:deep(.el-form-item__error){ :deep(.el-form-item) {
right: 10px; margin-bottom: 0 !important;
}
:deep(.el-form-item__error) {
right: 6px !important;
top: 30% !important;
}
:deep(.el-table__header .el-table__cell) {
background-color: #ebf2ff !important;
}
:deep(.el-table__row--striped .el-table__cell) {
background-color: #ebf2ff !important;
}
:deep(.el-form-item__error) {
left: auto !important;
right: 10px !important;
} }
} }
</style> </style>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论