|
@@ -0,0 +1,287 @@
|
|
|
+<template>
|
|
|
+ <div class="layout-padding">
|
|
|
+ <div class="layout-padding-auto layout-padding-view">
|
|
|
+ <el-row shadow="hover" v-show="showSearch" class="ml10">
|
|
|
+ <el-form :inline="true" :model="state.queryForm" @keyup.enter="getDataList" ref="queryRef">
|
|
|
+ <el-form-item :label="$t('marketingApps.name')" prop="domain">
|
|
|
+ <el-input :placeholder="$t('marketingApps.inputNameTip')" clearable style="max-width: 180px"
|
|
|
+ v-model="state.queryForm.domain" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item>
|
|
|
+ <el-button @click="query" class="ml10" icon="search" type="primary">
|
|
|
+ {{ $t('common.queryBtn') }}
|
|
|
+ </el-button>
|
|
|
+ <el-button @click="resetQuery" icon="Refresh">{{ $t('common.resetBtn') }}</el-button>
|
|
|
+ <el-button @click="handleEdit" icon="EditPen">{{ $t('common.editBtn') }}</el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </el-row>
|
|
|
+ <el-row>
|
|
|
+ <div class="mb8" style="width: 100%">
|
|
|
+ <right-toolbar v-model:showSearch="showSearch" class="ml10" style="float: right; margin-right: 20px"
|
|
|
+ @queryTable="getDataList"></right-toolbar>
|
|
|
+ </div>
|
|
|
+ </el-row>
|
|
|
+ <el-table @selection-change="handleSelectionChange" ref="tableRef" :data="state.dataList" row-key="path"
|
|
|
+ style="width: 100%" v-loading="state.loading" border :cell-style="tableStyle.cellStyle"
|
|
|
+ :header-cell-style="tableStyle?.headerCellStyle">
|
|
|
+ <el-table-column type="selection" fixed="left" width="55" />
|
|
|
+ <el-table-column fixed="left" :label="$t('marketingApps.id')" prop="id" width="80" show-overflow-tooltip>
|
|
|
+ <template #default="{ row }">{{ row.id }}</template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column :label="$t('marketingApps.appId')" prop="appId" width="120" show-overflow-tooltip>
|
|
|
+ <template #default="{ row }">{{ row.appId }}</template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column :label="$t('marketingApps.appImg')" prop="appImg" width="150" show-overflow-tooltip>
|
|
|
+ <template #default="{ row }" style="display: flex; align-self: center;">
|
|
|
+ <el-image style="width: 100px; height: 100px" :src="row.appImg" :fit="fit" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column :label="$t('marketingApps.name')" prop="appName" width="150" show-overflow-tooltip>
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-link :href="row.url">{{ row.appName }}</el-link>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column :label="$t('marketingApps.appType')" prop="appType" width="110" show-overflow-tooltip>
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-select v-model="row.appType" placeholder="" style="width: 80px">
|
|
|
+ <el-option v-for="item in appTypes" :key="item.value" :label="item.description" :value="item.value" />
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="营销投放" prop="isMarketing" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-switch v-model="row.isMarketing" inline-prompt active-text="开启" inactive-text="关闭" :active-value="1"
|
|
|
+ :inactive-value="0" @change="handleChange(row)" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="域名限制" prop="isHttp" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-switch v-model="row.isHttp" inline-prompt active-text="开启" inactive-text="关闭" :active-value="1"
|
|
|
+ :inactive-value="0" @change="handleChange(row)" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="域名集合" prop="https" width="240" show-overflow-tooltip>
|
|
|
+ <template #default="{ row }">
|
|
|
+ <div style="
|
|
|
+ padding: 0 20px;
|
|
|
+ text-wrap: auto;
|
|
|
+ text-align: left;
|
|
|
+ ">
|
|
|
+ <el-tooltip effect="light">
|
|
|
+ <template #content>
|
|
|
+ <div v-for="(item, index) in row.https" :key="index">{{ item }};</div>
|
|
|
+ </template>
|
|
|
+ <el-text line-clamp="6">
|
|
|
+ <template v-for="(item, index) in row.https" :key="index">
|
|
|
+ <div>{{ item }};</div>
|
|
|
+ </template>
|
|
|
+ </el-text>
|
|
|
+ </el-tooltip>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="ip集合" prop="ips" width="300">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <div style="
|
|
|
+ padding: 0 20px;
|
|
|
+ text-wrap: auto;
|
|
|
+ text-align: left;
|
|
|
+ ">
|
|
|
+ <div style="text-align: left;">黑名单:</div>
|
|
|
+ <el-tooltip effect="light">
|
|
|
+ <template #content>
|
|
|
+ <div v-for="(item, index) in row.ips" :key="index">{{ item }};</div>
|
|
|
+ </template>
|
|
|
+ <el-text line-clamp="4">
|
|
|
+ <template v-for="(item, index) in row.ips" :key="index">
|
|
|
+ <div>{{ item }};</div>
|
|
|
+ </template>
|
|
|
+ </el-text>
|
|
|
+ </el-tooltip>
|
|
|
+
|
|
|
+ <div style="text-align: left;">白名单:</div>
|
|
|
+ <el-tooltip effect="light">
|
|
|
+ <template #content>
|
|
|
+ <div v-for="(item, index) in row.ips" :key="index">{{ item }};</div>
|
|
|
+ </template>
|
|
|
+ <el-text line-clamp="4">
|
|
|
+ <template v-for="(item, index) in row.ips" :key="index">
|
|
|
+ <div>{{ item }};</div>
|
|
|
+ </template>
|
|
|
+ </el-text>
|
|
|
+ </el-tooltip>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column :label="$t('marketingApps.triggerRule')" prop="triggerRule" width="180" show-overflow-tooltip>
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-select v-model="row.triggerRule" placeholder="" style="width: 150px">
|
|
|
+ <el-option v-for="item in triggerRules" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column fixed="right" :label="$t('common.action')" width="150">
|
|
|
+ <template #default="scope">
|
|
|
+ <div class="action" style="text-align: left;">
|
|
|
+ <!-- <el-button icon="edit-pen" @click="onOpenEditMenu('edit', scope.row, 'domain')" text type="primary"
|
|
|
+ v-auth="'sys_menu_edit'">域名
|
|
|
+ </el-button>
|
|
|
+ <el-button icon="edit-pen" @click="onOpenEditMenu('edit', scope.row, 'ip')" text type="primary"
|
|
|
+ v-auth="'sys_menu_edit'">IP
|
|
|
+ </el-button>
|
|
|
+ <br /> -->
|
|
|
+ <el-button icon="edit-pen" @click="onOpenEditMenu('edit', scope.row)" text type="primary"
|
|
|
+ v-auth="'sys_menu_edit'">修改
|
|
|
+ </el-button>
|
|
|
+ <el-button icon="edit-pen" @click="onOpenStatistical(scope.row)" text type="primary"
|
|
|
+ v-auth="'sys_menu_edit'">统计
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ <pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
|
|
|
+ </div>
|
|
|
+ <MenuDialog @refresh="getDataList()" ref="menuDialogRef" />
|
|
|
+ <StatisticalDialog @refresh="getDataList()" ref="statisticalDialogRef" />
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script lang="ts" name="marketingApps" setup>
|
|
|
+import { delObj, pageList, update } from '/@/api/marketing/config';
|
|
|
+import { BasicTableProps, useTable } from '/@/hooks/table';
|
|
|
+import { useMessage, useMessageBox } from '/@/hooks/message';
|
|
|
+import { useI18n } from 'vue-i18n';
|
|
|
+import { fetchItemList } from '/@/api/admin/dict';
|
|
|
+
|
|
|
+// 引入组件
|
|
|
+const MenuDialog = defineAsyncComponent(() => import('./form.vue'));
|
|
|
+const StatisticalDialog = defineAsyncComponent(() => import('./statistical.vue'));
|
|
|
+const { t } = useI18n();
|
|
|
+// 定义变量内容
|
|
|
+const tableRef = ref();
|
|
|
+const menuDialogRef = ref();
|
|
|
+const statisticalDialogRef = ref();
|
|
|
+const queryRef = ref();
|
|
|
+const showSearch = ref(true);
|
|
|
+// 多选rows
|
|
|
+const selectObjs = ref([]) as any;
|
|
|
+// 是否可以多选
|
|
|
+const multiple = ref(true);
|
|
|
+const state: BasicTableProps = reactive<BasicTableProps>({
|
|
|
+ pageList: pageList, // H
|
|
|
+ queryForm: {
|
|
|
+ domain: '',
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+const appTypes = ref([]) as any;
|
|
|
+const getAppTypes = async () => {
|
|
|
+ const { data } = await fetchItemList({
|
|
|
+ dictType: 'DomianType'
|
|
|
+ });
|
|
|
+ appTypes.value = data?.records || [];
|
|
|
+}
|
|
|
+getAppTypes();
|
|
|
+
|
|
|
+const triggerRules = [
|
|
|
+ {
|
|
|
+ label: '不弹出',
|
|
|
+ value: 'unset',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '仅一次 - URL',
|
|
|
+ value: 'url1',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '每次弹出 - URL',
|
|
|
+ value: 'url2',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '仅一次 - 视频',
|
|
|
+ value: 'video1',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '每次弹出 - 视频',
|
|
|
+ value: 'video2',
|
|
|
+ },
|
|
|
+]
|
|
|
+
|
|
|
+const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state);
|
|
|
+
|
|
|
+// 搜索事件
|
|
|
+const query = () => {
|
|
|
+ state.dataList = [];
|
|
|
+ getDataList();
|
|
|
+};
|
|
|
+
|
|
|
+// 修改单条配置信息
|
|
|
+const handleChange = (row: any) => {
|
|
|
+ // update(row).then(() => {
|
|
|
+ // useMessage().success(t('common.updateSuccessText'));
|
|
|
+ // getDataList();
|
|
|
+ // }).catch((err: any) => {
|
|
|
+ // useMessage().error(err.msg);
|
|
|
+ // });
|
|
|
+};
|
|
|
+
|
|
|
+// 清空搜索条件
|
|
|
+const resetQuery = () => {
|
|
|
+ queryRef.value.resetFields();
|
|
|
+ state.dataList = [];
|
|
|
+ getDataList();
|
|
|
+};
|
|
|
+
|
|
|
+// 批量修改配置
|
|
|
+const handleEdit = () => {
|
|
|
+ if (selectObjs.value.length === 0) {
|
|
|
+ useMessage().warning('请选择要修改的项');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // menuDialogRef.value.openDialog('edit', selectObjs.value);
|
|
|
+};
|
|
|
+
|
|
|
+// 多选
|
|
|
+const handleSelectionChange = (selection: any) => {
|
|
|
+ selectObjs.value = selection;
|
|
|
+};
|
|
|
+
|
|
|
+// 打开编辑菜单弹窗
|
|
|
+const onOpenEditMenu = (type: string, row: any) => {
|
|
|
+ menuDialogRef.value.openDialog(type, row);
|
|
|
+};
|
|
|
+
|
|
|
+// 打开统计弹窗
|
|
|
+const onOpenStatistical = (row: any) => {
|
|
|
+ statisticalDialogRef.value.openDialog(row);
|
|
|
+};
|
|
|
+
|
|
|
+// 删除操作
|
|
|
+const handleDelete = async (ids: string[]) => {
|
|
|
+ try {
|
|
|
+ await useMessageBox().confirm(t('common.delConfirmText'));
|
|
|
+ } catch {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ await delObj(ids);
|
|
|
+ getDataList();
|
|
|
+ useMessage().success(t('common.delSuccessText'));
|
|
|
+ } catch (err: any) {
|
|
|
+ useMessage().error(err.msg);
|
|
|
+ }
|
|
|
+};
|
|
|
+</script>
|
|
|
+<style scoped lang="scss">
|
|
|
+:deep(.el-link__inner) {
|
|
|
+ display: inline-block;
|
|
|
+ width: 100%;
|
|
|
+ justify-content: start;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.el-link.is-underline:hover:after) {
|
|
|
+ display: none;
|
|
|
+}
|
|
|
+</style>
|