|
@@ -1,34 +1,35 @@
|
|
<template>
|
|
<template>
|
|
<div class="layout-padding">
|
|
<div class="layout-padding">
|
|
<el-tabs v-model="activeName" type="card" class="demo-tabs" @tab-click="handleClick">
|
|
<el-tabs v-model="activeName" type="card" class="demo-tabs" @tab-click="handleClick">
|
|
- <el-tab-pane :label="t('marketingConfig.ipList')" name="first" class="layout-padding-auto layout-padding-view">
|
|
|
|
|
|
+ <el-tab-pane :label="t('marketingConfig.ipList')" name="IP分组" class="layout-padding-auto layout-padding-view">
|
|
<Title class="ml-4" :title="t('marketingConfig.ipList')" />
|
|
<Title class="ml-4" :title="t('marketingConfig.ipList')" />
|
|
<div class="p-4 rounded">
|
|
<div class="p-4 rounded">
|
|
<el-button type="primary" @click="onClickAdd('ip')">{{ t('marketingConfig.addIpList') }}</el-button>
|
|
<el-button type="primary" @click="onClickAdd('ip')">{{ t('marketingConfig.addIpList') }}</el-button>
|
|
<JCollapse
|
|
<JCollapse
|
|
@update="(item) => onClickEdit(item, 'ip')"
|
|
@update="(item) => onClickEdit(item, 'ip')"
|
|
- @delete="(item) => console.log(item)"
|
|
|
|
- :data="data"
|
|
|
|
- :activeNames="['1', '2', '3']"
|
|
|
|
|
|
+ @delete="(item) => onOpenDelete(item, 'ip')"
|
|
|
|
+ :data="ipData"
|
|
|
|
+ :activeNames="ipActiveId"
|
|
:deleteText="t('marketingConfig.deleteListText')"
|
|
:deleteText="t('marketingConfig.deleteListText')"
|
|
:updateText="t('marketingConfig.updateText')"
|
|
:updateText="t('marketingConfig.updateText')"
|
|
/>
|
|
/>
|
|
</div>
|
|
</div>
|
|
</el-tab-pane>
|
|
</el-tab-pane>
|
|
- <el-tab-pane :label="t('marketingConfig.domainList')" name="second" class="layout-padding-auto layout-padding-view">
|
|
|
|
|
|
+ <el-tab-pane :label="t('marketingConfig.domainList')" name="域名分组" class="layout-padding-auto layout-padding-view">
|
|
<Title class="ml-4" :title="t('marketingConfig.domainList')" />
|
|
<Title class="ml-4" :title="t('marketingConfig.domainList')" />
|
|
<div class="p-4 rounded">
|
|
<div class="p-4 rounded">
|
|
<el-button type="primary" @click="onClickAdd('domain')">{{ t('marketingConfig.addDomainList') }}</el-button>
|
|
<el-button type="primary" @click="onClickAdd('domain')">{{ t('marketingConfig.addDomainList') }}</el-button>
|
|
<JCollapse
|
|
<JCollapse
|
|
@update="(item) => onClickEdit(item, 'domain')"
|
|
@update="(item) => onClickEdit(item, 'domain')"
|
|
:data="domainData"
|
|
:data="domainData"
|
|
- @delete="(item) => console.log(item)"
|
|
|
|
|
|
+ @delete="(item) => onOpenDelete(item, 'domain')"
|
|
|
|
+ :activeNames="domainActiveId"
|
|
:deleteText="t('marketingConfig.deleteListText')"
|
|
:deleteText="t('marketingConfig.deleteListText')"
|
|
:updateText="t('marketingConfig.updateText')"
|
|
:updateText="t('marketingConfig.updateText')"
|
|
/>
|
|
/>
|
|
</div>
|
|
</div>
|
|
</el-tab-pane>
|
|
</el-tab-pane>
|
|
- <el-tab-pane :label="t('marketingConfig.disposition')" name="third" class="layout-padding-auto layout-padding-view">
|
|
|
|
|
|
+ <el-tab-pane :label="t('marketingConfig.disposition')" name="全局配置" class="layout-padding-auto layout-padding-view">
|
|
<Title class="ml-4" :title="t('marketingConfig.disposition')" />
|
|
<Title class="ml-4" :title="t('marketingConfig.disposition')" />
|
|
<div class="p-4 rounded">
|
|
<div class="p-4 rounded">
|
|
<JCollapse
|
|
<JCollapse
|
|
@@ -150,17 +151,25 @@
|
|
<DomainEdit v-model:open="domainEditOpen" />
|
|
<DomainEdit v-model:open="domainEditOpen" />
|
|
<ListEdit v-model:open="listEditOpen" />
|
|
<ListEdit v-model:open="listEditOpen" />
|
|
<GroupingEdit v-model:open="groupingEditOpen" :type="openType" />
|
|
<GroupingEdit v-model:open="groupingEditOpen" :type="openType" />
|
|
- <IpListEdit :type="openType" ref="menuDialogRef" />
|
|
|
|
|
|
+ <IpListEdit :type="openType" ref="menuDialogRef" @onsuccess="getDomainData" />
|
|
|
|
+ <el-dialog v-model="delOpen" title="提示" width="500" @close="delOpen = false">
|
|
|
|
+ <span>确认删除{{ delObj?.title }} 分组吗?</span>
|
|
|
|
+ <template #footer>
|
|
|
|
+ <div class="dialog-footer">
|
|
|
|
+ <el-button @click="delOpen = false">取消</el-button>
|
|
|
|
+ <el-button type="primary" :disabled="loading" @click="onDel(delObj)"> 确定 </el-button>
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ </el-dialog>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script lang="ts" name="marketingConfig" setup>
|
|
<script lang="ts" name="marketingConfig" setup>
|
|
-import { delObj, pageListDomain, update } from '/@/api/marketing/config';
|
|
|
|
-import { BasicTableProps, useTable } from '/@/hooks/table';
|
|
|
|
|
|
+import { delGroup, pageListDomain, pageListIp } from '/@/api/marketing/config';
|
|
import { useI18n } from 'vue-i18n';
|
|
import { useI18n } from 'vue-i18n';
|
|
import { useMessage } from '/@/hooks/message';
|
|
import { useMessage } from '/@/hooks/message';
|
|
import { rule } from '/@/utils/validate';
|
|
import { rule } from '/@/utils/validate';
|
|
-import { identity } from '@vueuse/core';
|
|
|
|
|
|
+import { ipSplicing } from '/@/utils/ipUpdate';
|
|
|
|
|
|
// 引入组件
|
|
// 引入组件
|
|
const JCollapse = defineAsyncComponent(() => import('/@/components/JCollapse/index.vue'));
|
|
const JCollapse = defineAsyncComponent(() => import('/@/components/JCollapse/index.vue'));
|
|
@@ -171,7 +180,7 @@ const GroupingEdit = defineAsyncComponent(() => import('./components/ipGroupingE
|
|
const IpListEdit = defineAsyncComponent(() => import('./components/ipListEdit.vue'));
|
|
const IpListEdit = defineAsyncComponent(() => import('./components/ipListEdit.vue'));
|
|
const { t } = useI18n();
|
|
const { t } = useI18n();
|
|
// 定义变量内容
|
|
// 定义变量内容
|
|
-const activeName = ref('first');
|
|
|
|
|
|
+const activeName = ref('IP分组');
|
|
//关闭或打开tabs的关闭按钮
|
|
//关闭或打开tabs的关闭按钮
|
|
const closeDomainTags = ref(false);
|
|
const closeDomainTags = ref(false);
|
|
const closeIpTags = ref(false);
|
|
const closeIpTags = ref(false);
|
|
@@ -180,8 +189,20 @@ const closeIpTags = ref(false);
|
|
const domainEditOpen = ref(false);
|
|
const domainEditOpen = ref(false);
|
|
const listEditOpen = ref(false);
|
|
const listEditOpen = ref(false);
|
|
const groupingEditOpen = ref(false);
|
|
const groupingEditOpen = ref(false);
|
|
|
|
+const delOpen = ref(false);
|
|
|
|
+const loading = ref(false);
|
|
|
|
+const menuDialogRef = ref();
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+const domainActiveId = ref([]);
|
|
|
|
+const ipActiveId = ref([]);
|
|
|
|
+
|
|
|
|
+
|
|
// const ipListEditOpen = ref(false);
|
|
// const ipListEditOpen = ref(false);
|
|
const domainData = ref([]);
|
|
const domainData = ref([]);
|
|
|
|
+const ipData = ref([]);
|
|
|
|
+const delObj = ref({});
|
|
|
|
+const openType = ref('ip'); // 'ip' or 'domain'
|
|
|
|
|
|
const listSelect = ref([
|
|
const listSelect = ref([
|
|
{
|
|
{
|
|
@@ -199,11 +220,11 @@ const listSelect = ref([
|
|
]);
|
|
]);
|
|
const triggerSelect = ref([
|
|
const triggerSelect = ref([
|
|
{
|
|
{
|
|
- value: 'group1',
|
|
|
|
|
|
+ value: '1',
|
|
label: '仅一次跳转',
|
|
label: '仅一次跳转',
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- value: 'group2',
|
|
|
|
|
|
+ value: '2',
|
|
label: '多次跳转',
|
|
label: '多次跳转',
|
|
},
|
|
},
|
|
]);
|
|
]);
|
|
@@ -216,13 +237,20 @@ const formData = ref({
|
|
triggerFrequency: '',
|
|
triggerFrequency: '',
|
|
prompt: '',
|
|
prompt: '',
|
|
});
|
|
});
|
|
|
|
+const onOpenDelete = (item: any, type: any) => {
|
|
|
|
+ console.log(item);
|
|
|
|
+
|
|
|
|
+ delObj.value = { ...item, type };
|
|
|
|
+ console.log(delObj.value);
|
|
|
|
+
|
|
|
|
+ delOpen.value = true;
|
|
|
|
+};
|
|
|
|
|
|
// // 表单校验规则
|
|
// // 表单校验规则
|
|
const dataRules = reactive({
|
|
const dataRules = reactive({
|
|
jumpLink: [{ validator: rule.url, trigger: 'blur' }],
|
|
jumpLink: [{ validator: rule.url, trigger: 'blur' }],
|
|
});
|
|
});
|
|
|
|
|
|
-const openType = ref('ip'); // 'ip' or 'domain'
|
|
|
|
const data = ref([
|
|
const data = ref([
|
|
{
|
|
{
|
|
title: '分组1',
|
|
title: '分组1',
|
|
@@ -242,18 +270,40 @@ const data = ref([
|
|
]);
|
|
]);
|
|
const whiteList = ref([{ label: '站大' }, { label: '站而' }, { label: '站撒' }, { label: '站爱' }]);
|
|
const whiteList = ref([{ label: '站大' }, { label: '站而' }, { label: '站撒' }, { label: '站爱' }]);
|
|
|
|
|
|
-const menuDialogRef = ref();
|
|
|
|
-const state = reactive({
|
|
|
|
- pageListDomain: pageListDomain(),
|
|
|
|
-});
|
|
|
|
-state.pageListDomain;
|
|
|
|
-
|
|
|
|
const onSubmit = () => {
|
|
const onSubmit = () => {
|
|
useMessage().success(t(formData.value ? 'common.editSuccessText' : 'common.addSuccessText'));
|
|
useMessage().success(t(formData.value ? 'common.editSuccessText' : 'common.addSuccessText'));
|
|
};
|
|
};
|
|
|
|
+const handleClick = (data:any) => {
|
|
|
|
+ if(data.props.label === 'IP分组'){
|
|
|
|
+ getIpData();
|
|
|
|
+ }else if(data.props.label === '域名分组'){
|
|
|
|
+ getDomainData();
|
|
|
|
+ }else{
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+};
|
|
|
|
+const onDel = async (data:any) => {
|
|
|
|
+ try {
|
|
|
|
+ loading.value = true;
|
|
|
|
+ await delGroup({
|
|
|
|
+ ids: [data.id],
|
|
|
|
+ groupType: data.type === 'ip' ? 1 : 2,
|
|
|
|
+ });
|
|
|
|
+ useMessage().success(t('common.delSuccessText'));
|
|
|
|
+ } catch (err: any) {
|
|
|
|
+ useMessage().error(err.msg);
|
|
|
|
+ } finally {
|
|
|
|
+ loading.value = false;
|
|
|
|
+ delOpen.value = false;
|
|
|
|
+ data.type === 'ip' ? getIpData() : getDomainData();
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
|
|
const onClickAdd = (type: string) => {
|
|
const onClickAdd = (type: string) => {
|
|
openType.value = type;
|
|
openType.value = type;
|
|
|
|
+ console.log(type);
|
|
|
|
+
|
|
groupingEditOpen.value = true;
|
|
groupingEditOpen.value = true;
|
|
};
|
|
};
|
|
const onClickEdit = (item: any, type: string) => {
|
|
const onClickEdit = (item: any, type: string) => {
|
|
@@ -266,27 +316,51 @@ const onClickEdit = (item: any, type: string) => {
|
|
const onOpenEditMenu = (type: string, row: any) => {
|
|
const onOpenEditMenu = (type: string, row: any) => {
|
|
menuDialogRef.value.openDialog(type, row);
|
|
menuDialogRef.value.openDialog(type, row);
|
|
};
|
|
};
|
|
-
|
|
|
|
-onMounted(() => {
|
|
|
|
- // 获取域名列表
|
|
|
|
- state.pageListDomain.then((val) => {
|
|
|
|
- domainData.value = val.data.map((item :any) => {
|
|
|
|
- console.log(item);
|
|
|
|
|
|
+const getDomainData = async () => {
|
|
|
|
+ await pageListDomain().then((val) => {
|
|
|
|
+ domainActiveId.value = [];
|
|
|
|
+ domainData.value = val.data.map((item: any) => {
|
|
|
|
+ domainActiveId.value.push(item.id);
|
|
return {
|
|
return {
|
|
|
|
+ ...item,
|
|
title: item.groupName,
|
|
title: item.groupName,
|
|
- list: item.domains.map((items :any) => {
|
|
|
|
- return{
|
|
|
|
- id:items.id,
|
|
|
|
- value:items.domain
|
|
|
|
- }
|
|
|
|
|
|
+ id: item.id,
|
|
|
|
+ list: item.domains.map((items: any) => {
|
|
|
|
+ return {
|
|
|
|
+ ...items,
|
|
|
|
+ id: items.id,
|
|
|
|
+ value: items.domain,
|
|
|
|
+ };
|
|
}),
|
|
}),
|
|
};
|
|
};
|
|
});
|
|
});
|
|
- console.log(domainData.value);
|
|
|
|
-
|
|
|
|
});
|
|
});
|
|
-
|
|
|
|
|
|
+};
|
|
|
|
+const getIpData = async () => {
|
|
|
|
+ await pageListIp().then((val) => {
|
|
|
|
+ ipActiveId.value = [];
|
|
|
|
+ ipData.value = val.data.map((item: any) => {
|
|
|
|
+ ipActiveId.value.push(item.id);
|
|
|
|
+ return {
|
|
|
|
+ ...item,
|
|
|
|
+ title: item.groupName,
|
|
|
|
+ id: item.id,
|
|
|
|
+ list: item.ips.map((items: any) => {
|
|
|
|
+ return {
|
|
|
|
+ ...items,
|
|
|
|
+ id: items.id,
|
|
|
|
+ value: ipSplicing(items.startIp,items.endIp),
|
|
|
|
+ };
|
|
|
|
+ }),
|
|
|
|
+ };
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+onMounted(() => {
|
|
//获取IP列表
|
|
//获取IP列表
|
|
|
|
+ getIpData();
|
|
|
|
+
|
|
});
|
|
});
|
|
</script>
|
|
</script>
|
|
<style lang="scss">
|
|
<style lang="scss">
|