浏览代码

Merge branch 'dev-cmn' into dev-ly

cmy 3 天之前
父节点
当前提交
f34f5ca5d2

+ 152 - 142
src/views/marketing/apps/components/ipEdit.vue

@@ -1,53 +1,63 @@
 <template>
-	<el-dialog :title="t('marketingApps.addIp')" width="600" v-model="props.open" :close-on-click-modal="false"
-		:destroy-on-close="true" @close="onCancel" draggable>
-		<el-form style="height: 128px;" ref="formRef" :rules="dataRules" :model="state.ruleForm" v-loading="loading">
-			<el-form-item label="" prop="ipType">
-				<el-radio-group v-model="state.ruleForm.ipType">
-					<el-radio :value="IpType.WHITE">{{ t('marketingApps.whiteList') }}</el-radio>
-					<el-radio :value="IpType.BLACK">{{ t('marketingApps.blackList') }}</el-radio>
-				</el-radio-group>
-			</el-form-item>
-			<div class="custom-style">
-				<el-segmented v-model="state.ruleForm.sourceTypeText" :options="[t('marketingConfig.grouping'), t('marketingConfig.ipSegment')]"
-					size="default">
-					<template #default="scope">
-						<div style="min-width: 50px; line-height: 32px;">
-							{{ scope.item }}
-							<el-icon v-if="scope.item === t('marketingConfig.ipSegment')" size="12" style="vertical-align: middle;">
-								<el-tooltip effect="light" content="输入127.0.0.1/24格式代表网段" placement="top">
-									<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14" fill="none">
-										<path d="M7 14C8.93298 14 10.683 13.2165 11.9497 11.9497C13.2165 10.683 14 8.93298 14 7C14 5.06702 13.2165 3.31702 11.9497 2.05025C10.683 0.783503 8.93298 0 7 0C5.06702 0 3.31702 0.783503 2.05025 2.05025C0.783503 3.31702 0 5.06702 0 7C0 8.93298 0.783503 10.683 2.05025 11.9497C3.31702 13.2165 5.06702 14 7 14Z" fill="#1B4D88" fill-opacity="0.4"/>
-										<path fill-rule="evenodd" clip-rule="evenodd" d="M6.99957 1.94434C7.5365 1.94434 7.97179 2.37962 7.97179 2.91656C7.97179 3.4535 7.5365 3.88878 6.99957 3.88878C6.46263 3.88878 6.02734 3.4535 6.02734 2.91656C6.02734 2.37962 6.46263 1.94434 6.99957 1.94434Z" fill="white"/>
-										<path d="M6.99957 1.94434C7.5365 1.94434 7.97179 2.37962 7.97179 2.91656C7.97179 3.4535 7.5365 3.88878 6.99957 3.88878C6.46263 3.88878 6.02734 3.4535 6.02734 2.91656C6.02734 2.37962 6.46263 1.94434 6.99957 1.94434ZM6.99957 2.33322C6.6774 2.33322 6.41623 2.5944 6.41623 2.91656C6.41623 3.23872 6.6774 3.49989 6.99957 3.49989C7.32173 3.49989 7.5829 3.23872 7.5829 2.91656C7.5829 2.5944 7.32173 2.33322 6.99957 2.33322Z" fill="white"/>
-										<path d="M7.19477 10.8888V5.44434H6.80588H6.41699" fill="white"/>
-										<path d="M6.41645 10.8887V6.22206C5.98689 6.22206 5.63867 5.87384 5.63867 5.44428C5.63867 5.01473 5.98689 4.6665 6.41645 4.6665H7.19423L7.27398 4.6703C7.66608 4.71023 7.97201 5.04164 7.97201 5.44428V10.8887C7.97201 11.3183 7.70354 11.3447 7.27398 11.3447C6.84443 11.3447 6.41645 11.3183 6.41645 10.8887Z" fill="white"/>
-										<path d="M8.55566 10C8.98522 10 9.33344 10.3482 9.33344 10.7778C9.33344 11.2073 8.98522 11.5556 8.55566 11.5556H5.83344C5.40389 11.5556 5.05566 11.2073 5.05566 10.7778C5.05566 10.3482 5.40389 10 5.83344 10H8.55566Z" fill="white"/>
-									</svg>
-								</el-tooltip>
-							</el-icon>
-						</div>
-					</template>
-				</el-segmented>
-			</div>
-			<el-form-item label="" prop="groupId" v-if="state.ruleForm.sourceTypeText === t('marketingConfig.grouping')">
-				<el-select v-model="state.ruleForm.groupId" :placeholder="t('marketingConfig.groupingTip')"
-					multiple clearable collapse-tags collapse-tags-tooltip :max-collapse-tags="5">
-					<el-option v-for="item in selectData" :key="item.id" :label="item.groupName" :value="item.id" />
-				</el-select>
-			</el-form-item>
-			<el-form-item label="" prop="ip" v-else>
-				<el-input v-model="state.ruleForm.ip" type="text" :placeholder="t('marketingConfig.ipTip')"></el-input>
-			</el-form-item>
-		</el-form>
-		<template #footer>
-			<span class="dialog-footer">
-				<el-button @click="onCancel">{{ t('common.cancelButtonText') }}</el-button>
-				<el-button type="primary" @click="onSubmit" :disabled="loading">{{ t('common.confirmButtonText')
-					}}</el-button>
-			</span>
-		</template>
-	</el-dialog>
+  <el-dialog :title="t('marketingApps.addIp')" width="600" v-model="props.open" :close-on-click-modal="false"
+    :destroy-on-close="true" @close="onCancel" draggable>
+    <el-form style="height: 128px;" ref="formRef" :rules="dataRules" :model="state.ruleForm" v-loading="loading">
+      <el-form-item label="" prop="ipType">
+        <el-radio-group v-model="state.ruleForm.ipType">
+          <el-radio :value="IpType.WHITE">{{ t('marketingApps.whiteList') }}</el-radio>
+          <el-radio :value="IpType.BLACK">{{ t('marketingApps.blackList') }}</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <div class="custom-style">
+        <el-segmented v-model="state.ruleForm.sourceTypeText"
+          :options="[t('marketingConfig.grouping'), t('marketingConfig.ipSegment')]" size="default">
+          <template #default="scope">
+            <div style="min-width: 50px; line-height: 32px;">
+              {{ scope.item }}
+              <el-icon v-if="scope.item === t('marketingConfig.ipSegment')" size="12" style="vertical-align: middle;">
+                <el-tooltip effect="light" content="输入127.0.0.1/24格式代表网段" placement="top">
+                  <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14" fill="none">
+                    <path
+                      d="M7 14C8.93298 14 10.683 13.2165 11.9497 11.9497C13.2165 10.683 14 8.93298 14 7C14 5.06702 13.2165 3.31702 11.9497 2.05025C10.683 0.783503 8.93298 0 7 0C5.06702 0 3.31702 0.783503 2.05025 2.05025C0.783503 3.31702 0 5.06702 0 7C0 8.93298 0.783503 10.683 2.05025 11.9497C3.31702 13.2165 5.06702 14 7 14Z"
+                      fill="#1B4D88" fill-opacity="0.4" />
+                    <path fill-rule="evenodd" clip-rule="evenodd"
+                      d="M6.99957 1.94434C7.5365 1.94434 7.97179 2.37962 7.97179 2.91656C7.97179 3.4535 7.5365 3.88878 6.99957 3.88878C6.46263 3.88878 6.02734 3.4535 6.02734 2.91656C6.02734 2.37962 6.46263 1.94434 6.99957 1.94434Z"
+                      fill="white" />
+                    <path
+                      d="M6.99957 1.94434C7.5365 1.94434 7.97179 2.37962 7.97179 2.91656C7.97179 3.4535 7.5365 3.88878 6.99957 3.88878C6.46263 3.88878 6.02734 3.4535 6.02734 2.91656C6.02734 2.37962 6.46263 1.94434 6.99957 1.94434ZM6.99957 2.33322C6.6774 2.33322 6.41623 2.5944 6.41623 2.91656C6.41623 3.23872 6.6774 3.49989 6.99957 3.49989C7.32173 3.49989 7.5829 3.23872 7.5829 2.91656C7.5829 2.5944 7.32173 2.33322 6.99957 2.33322Z"
+                      fill="white" />
+                    <path d="M7.19477 10.8888V5.44434H6.80588H6.41699" fill="white" />
+                    <path
+                      d="M6.41645 10.8887V6.22206C5.98689 6.22206 5.63867 5.87384 5.63867 5.44428C5.63867 5.01473 5.98689 4.6665 6.41645 4.6665H7.19423L7.27398 4.6703C7.66608 4.71023 7.97201 5.04164 7.97201 5.44428V10.8887C7.97201 11.3183 7.70354 11.3447 7.27398 11.3447C6.84443 11.3447 6.41645 11.3183 6.41645 10.8887Z"
+                      fill="white" />
+                    <path
+                      d="M8.55566 10C8.98522 10 9.33344 10.3482 9.33344 10.7778C9.33344 11.2073 8.98522 11.5556 8.55566 11.5556H5.83344C5.40389 11.5556 5.05566 11.2073 5.05566 10.7778C5.05566 10.3482 5.40389 10 5.83344 10H8.55566Z"
+                      fill="white" />
+                  </svg>
+                </el-tooltip>
+              </el-icon>
+            </div>
+          </template>
+        </el-segmented>
+      </div>
+      <el-form-item label="" prop="groupId" v-if="state.ruleForm.sourceTypeText === t('marketingConfig.grouping')">
+        <el-select v-model="state.ruleForm.groupId" :placeholder="t('marketingConfig.groupingTip')" multiple clearable
+          collapse-tags collapse-tags-tooltip :max-collapse-tags="5">
+          <el-option v-for="item in selectData" :key="item.id" :label="item.groupName" :value="item.id" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="" prop="ip" v-else>
+        <el-input v-model="state.ruleForm.ip" type="text" :placeholder="t('marketingConfig.ipTip')"></el-input>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button @click="onCancel">{{ t('common.cancelButtonText') }}</el-button>
+        <el-button type="primary" @click="onSubmit" :disabled="loading">{{ t('common.confirmButtonText')
+          }}</el-button>
+      </span>
+    </template>
+  </el-dialog>
 </template>
 
 <script setup lang="ts">
@@ -72,130 +82,130 @@ const selectedObjects = ref<IpItem[]>([]);
 
 // 定义需要的数据
 const state = reactive({
-	ruleForm: {
-		ipType: IpType.WHITE,
-		sourceType: SourceType.GROUP,
-		sourceTypeText: t('marketingConfig.grouping'),
-		groupId: [] as IpItem[],
-		ipMode: IpMode.IP,
-		groupName:'',
-		startIp: '',
-		endIp: '',
-		ip: '',
-	},
+  ruleForm: {
+    ipType: IpType.WHITE,
+    sourceType: SourceType.GROUP,
+    sourceTypeText: t('marketingConfig.grouping'),
+    groupId: [] as IpItem[],
+    ipMode: IpMode.IP,
+    groupName: '',
+    startIp: '',
+    endIp: '',
+    ip: '',
+  },
 });
 
 const props = defineProps({
-	open: {
-		type: Boolean,
-		default: false,
-	},
+  open: {
+    type: Boolean,
+    default: false,
+  },
 });
 
 // 表单校验规则
 const dataRules = reactive({
-	groupId: [{ required: true, message: '分组不能为空', trigger: 'blur' }],
-	ip: [
-		{ required: true, message: 'IP不能为空', trigger: 'blur' },
-		{ validator: rule.ip, trigger: 'blur' },
-	],
+  groupId: [{ required: true, message: '分组不能为空', trigger: 'blur' }],
+  ip: [
+    { required: true, message: 'IP不能为空', trigger: 'blur' },
+    { validator: rule.ip, trigger: 'blur' },
+  ],
 });
 
 // 获取ip列表
 const getIpData = async () => {
-	await pageListIp().then((val) => {
-		selectData.value = val.data.map((item) => {
-			return {
-				...item,
-				title: item.groupName,
-				id: item.id,
-				list: item.ips.map((items) => {
-					return {
-						...items,
-						id: items.id,
-						value: ipSplicing(items.startIp, items.endIp),
-					};
-				}),
-			};
-		});
-	});
+  await pageListIp().then((val) => {
+    selectData.value = val.data.map((item) => {
+      return {
+        ...item,
+        title: item.groupName,
+        id: item.id,
+        list: item.ips.map((items) => {
+          return {
+            ...items,
+            id: items.id,
+            value: ipSplicing(items.startIp, items.endIp),
+          };
+        }),
+      };
+    });
+  });
 };
 
 watchEffect(() => {
   if (props.open) {
-	state.ruleForm.groupId = [];
-	state.ruleForm.ip = '';
-	state.ruleForm.ipType = IpType.WHITE;
-	getIpData();
+    state.ruleForm.groupId = [];
+    state.ruleForm.ip = '';
+    state.ruleForm.ipType = IpType.WHITE;
+    getIpData();
   }
 })
 
 const onCancel = () => {
-	emit('update:open', false);
+  emit('update:open', false);
 };
 
 // 保存数据
 const onSubmit = async () => {
 
-	const valid = await formRef.value.validate();
-	console.log('valid', valid);
-
-	const lis = parseIpRange(state.ruleForm.ip);
-	state.ruleForm.startIp = lis.start;
-	state.ruleForm.endIp = lis.end;
-	if (lis.end !== '') {
-		state.ruleForm.ipMode = IpMode.IPRange;
-	}
-	
-	state.ruleForm.sourceType = state.ruleForm.sourceTypeText === t('marketingConfig.grouping') ? SourceType.GROUP : SourceType.DOMAIN;
-	if (state.ruleForm.sourceType == SourceType.GROUP && state.ruleForm.groupId.length == 0) {
-		return useMessage().error('请选择分组');
-	} else if (state.ruleForm.sourceType == SourceType.DOMAIN && state.ruleForm.ip == '') {
-		return useMessage().error('ip不能为空');
-	}
-	
-	try {
-		loading.value = true;
-		if (state.ruleForm.sourceTypeText == t('marketingConfig.grouping')) {
-			selectedObjects.value = [];
-			selectedObjects.value = selectData.value.filter(item => state.ruleForm.groupId.includes(item.id));
-			emit('onsuccess', selectedObjects.value, state.ruleForm.sourceType, state.ruleForm.ipType + '');
-		}else if(state.ruleForm.startIp.length > 0) {
-			emit('onsuccess', [state.ruleForm], state.ruleForm.sourceType, state.ruleForm.ipType + '');
-		}
-		onCancel();
-	} catch (err) {
-		useMessage().error(err);
-	} finally {
-		loading.value = false;
-	}
+  const valid = await formRef.value.validate();
+  console.log('valid', valid);
+
+  const lis = parseIpRange(state.ruleForm.ip);
+  state.ruleForm.startIp = lis.start;
+  state.ruleForm.endIp = lis.end;
+  if (lis.end !== '') {
+    state.ruleForm.ipMode = IpMode.IPRange;
+  }
+
+  state.ruleForm.sourceType = state.ruleForm.sourceTypeText === t('marketingConfig.grouping') ? SourceType.GROUP : SourceType.DOMAIN;
+  if (state.ruleForm.sourceType == SourceType.GROUP && state.ruleForm.groupId.length == 0) {
+    return useMessage().error('请选择分组');
+  } else if (state.ruleForm.sourceType == SourceType.DOMAIN && state.ruleForm.ip == '') {
+    return useMessage().error('ip不能为空');
+  }
+
+  try {
+    loading.value = true;
+    if (state.ruleForm.sourceTypeText == t('marketingConfig.grouping')) {
+      selectedObjects.value = [];
+      selectedObjects.value = selectData.value.filter(item => state.ruleForm.groupId.includes(item.id));
+      emit('onsuccess', selectedObjects.value, state.ruleForm.sourceType, state.ruleForm.ipType + '');
+    } else if (state.ruleForm.startIp.length > 0) {
+      emit('onsuccess', [state.ruleForm], state.ruleForm.sourceType, state.ruleForm.ipType + '');
+    }
+    onCancel();
+  } catch (err) {
+    useMessage().error(err);
+  } finally {
+    loading.value = false;
+  }
 };
 
 </script>
 <style>
 .apps-loadmore.el-select-dropdown .el-scrollbar__wrap {
-	height: 330px !important;
+  height: 330px !important;
 }
 
 .custom-style {
-	margin-top: 14px;
-
-	.el-segmented__item {
-		border-right: 1px solid rgba(230, 230, 230, 1);
-		min-width: 72px;
-		flex: unset;
-	}
-
-	.el-segmented {
-		border: 1px solid rgba(230, 230, 230, 1);
-		border-bottom: unset;
-		--el-segmented-bg-color: #ffffff;
-		--el-segmented-item-hover-bg-color: rgba(22, 122, 240, 0.1);
-		--el-segmented-item-selected-color: rgba(22, 122, 240, 1);
-		--el-segmented-item-hover-color: rgba(22, 122, 240, 1);
-		--el-segmented-item-selected-bg-color: rgba(22, 122, 240, 0.1);
-		--el-border-radius-base: 4px 4px 0 0;
-		--el-segmented-padding: 0;
-	}
+  margin-top: 14px;
+
+  .el-segmented__item {
+    border-right: 1px solid rgba(230, 230, 230, 1);
+    min-width: 72px;
+    flex: unset;
+  }
+
+  .el-segmented {
+    border: 1px solid rgba(230, 230, 230, 1);
+    border-bottom: unset;
+    --el-segmented-bg-color: #ffffff;
+    --el-segmented-item-hover-bg-color: rgba(22, 122, 240, 0.1);
+    --el-segmented-item-selected-color: rgba(22, 122, 240, 1);
+    --el-segmented-item-hover-color: rgba(22, 122, 240, 1);
+    --el-segmented-item-selected-bg-color: rgba(22, 122, 240, 0.1);
+    --el-border-radius-base: 4px 4px 0 0;
+    --el-segmented-padding: 0;
+  }
 }
 </style>

+ 17 - 61
src/views/marketing/apps/components/statistical.vue

@@ -6,17 +6,21 @@
       v-model="visible"
       :destroy-on-close="true"
       :close-on-click-modal="false" 
-      :before-close="done=>handleClose(done)"
       draggable>
       <div class="dialog-body">
         <div class="statistics-table-wrapper">
           <el-row v-show="showSearch">
             <el-form :inline="true" :model="state.queryForm" @keyup.enter="withCollapsedChildren(getDataList)" ref="queryRef">
-              <el-form-item :label="t('marketingApps.startTime')" prop="startTime">
-                <el-date-picker v-model="state.queryForm.startTime" type="datetime" placeholder="请选择开始时间" />
-              </el-form-item>
-              <el-form-item :label="t('marketingApps.endTime')" prop="endTime">
-                <el-date-picker v-model="state.queryForm.endTime" type="datetime" placeholder="请选择结束时间" />
+              <el-form-item :label="t('marketingApps.time')" prop="timeRange">
+                <el-date-picker
+                  :end-placeholder="$t('syslog.inputEndPlaceholderTip')"
+                  :start-placeholder="$t('syslog.inputStartPlaceholderTip')"
+                  range-separator="To"
+                  type="datetimerange"
+                  v-model="state.queryForm.timeRange"
+                  value-format="YYYY-MM-DD HH:mm:ss"
+                  :disabled-date="disabledDate"
+                />
               </el-form-item>
             </el-form>
             <el-form-item>
@@ -29,7 +33,6 @@
             :expand-row-keys="expandedRowKeys"
             @expand-change="handleExpandChange"
             >
-            <!-- <el-table-column align="center" type="selection" width="40" /> -->
             <el-table-column :formatter="statusFormatter" show-overflow-tooltip type="expand">
               <template #default="{ row }">
                 <div class="child-table-container">
@@ -45,7 +48,7 @@
                     </el-table-column>
                     <el-table-column :formatter="statusFormatter" :label="t('marketingApps.browser')" prop="browser" show-overflow-tooltip>
                       <template #default="{ row }">
-                        浏览器名称:{{ statusFormatter('','',row.browserName,'') }} <br>
+                        浏览器名称:{{ statusFormatter('','',row.browser,'') }} <br>
                         浏览器版本:{{ statusFormatter('','',row.browserVersion,'') }}
                       </template>
                     </el-table-column>
@@ -91,14 +94,8 @@
 import { ref, reactive, watchEffect } from 'vue';
 import { BasicTableProps, useTable } from '/@/hooks/table';
 import { getStatPage, getStatSecondPage } from '/@/api/marketing/apps';
-import { fetchItemList } from '/@/api/admin/dict';
 import { useI18n } from 'vue-i18n';
-
-enum TimeRange {
-  ALL = "0",
-  TWENTY_FOUR_HOURS = "1",
-  FIFTEEN_MINUTES = "2",
-}
+import dayjs from 'dayjs';
 
 // 定义变量内容
 const { t } = useI18n();
@@ -106,14 +103,11 @@ const visible = ref(false);
 const queryRef = ref();
 const showSearch = ref(true);
 const expandedRowKeys = ref<number[]>([]); // 记录展开的行
-const setIntervalTime = ref(0);
 
 //  table hook
 const state: BasicTableProps = reactive<BasicTableProps>({
   queryForm: {
-    timeRange: TimeRange.ALL,
-    startTime: '',
-    endTime: '',
+    timeRange: [],
     appId: '',
   },
   pageList: getStatPage,
@@ -125,54 +119,20 @@ const state: BasicTableProps = reactive<BasicTableProps>({
     pageSizes: [5, 10, 20, 50, 100]
   },
 });
-const timeRangeOptions = ref([]) as any;
 
 const { getDataList, currentChangeHandle, sortChangeHandle, sizeChangeHandle, tableStyle } = useTable(state);
 
-// 获取时间范围列表
-const getTimeRangeList = async () => {
-  const { data } = await fetchItemList({
-    dictType: 'timeRange'
-  });
-  timeRangeOptions.value = data?.records || [];
-  timeRangeOptions.value.length && (state.queryForm.timeRange = timeRangeOptions.value[0].value);
-}
-
 // 打开弹窗
 const openDialog = async (_row: any) => {
-  await getTimeRangeList();
   visible.value = true;
   state.queryForm.appId = _row.appId;
-  state.queryForm.endTime = new Date().getTime();
-  state.queryForm.startTime = state.queryForm.endTime - (7 * 24 * 60 * 60 * 1000);
   expandedRowKeys.value = [];
   getDataList();
 };
 
-const handleClose = (done) => {
-  clearInterval(setIntervalTime.value);
-  done();
-}
-
-// // 清空搜索条件
-// const resetQuery = () => {
-//   queryRef.value?.resetFields();
-//   withCollapsedChildren(getDataList);
-// };
-
-// 时间范围下拉框选中事件
-const handleTimeChange = () => {
-  withCollapsedChildren(getDataList);
-  // 如果是15分钟,则每分钟刷新一次数据
-  if(state.queryForm.timeRange === TimeRange.FIFTEEN_MINUTES) {
-    setIntervalTime.value = setInterval(() => {
-      getDataList();
-    }, 60*1000);
-  }else{
-    // 清除定时器
-    clearInterval(setIntervalTime.value);
-  }
-}
+const disabledDate = (time: Date) => {
+  return time.getTime() > new Date().setHours(23, 59, 59, 999);
+};
 
 // 初始化二级表格数据和分页
 const initChildData = (parentRow) => {
@@ -203,7 +163,7 @@ const loadChildData = async (parentRow) => {
       current: parentRow.childPagination.page,
       size: parentRow.childPagination.size,
       appId: state.queryForm.appId,
-      timeRange: state.queryForm.timeRange
+      timeRange: state.queryForm.timeRange,
     });
     const data = res.data;
     parentRow.childTableData = data.records;
@@ -258,10 +218,6 @@ defineExpose({
   openDialog,
 });
 
-// 页面卸载时
-onUnmounted(() => {
-	clearInterval(setIntervalTime.value);
-});
 </script>
 <style scoped lang="scss">
 .dialog-body {

+ 2 - 1
src/views/marketing/apps/i18n/zh-cn.ts

@@ -15,6 +15,7 @@ export default {
     whiteList: '白名单',
     statistical: '统计',
     ipSegment: 'IP/网段',
+    time: '时间',
     startTime: '开始时间',
     endTime: '结束时间',
     browser: '浏览器',
@@ -33,7 +34,7 @@ export default {
 
     loading: '加载中...',
     inputAppSel: '请选择应用',
-    inputNameTip: '请输入应用名称名称',
+    inputNameTip: '请输入应用名称',
     addDomainTip: '该分组已添加到域名集合,无需重复添加',
     addDomainTip2: '该域名已存在于集合中,无需重复添加',
     addIpTip: '该分组已添加到IP集合,无需重复添加',