index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <template>
  2. <div class="layout-padding">
  3. <div class="layout-padding-auto layout-padding-view">
  4. <el-row shadow="hover" v-show="showSearch" class="ml10">
  5. <el-form :inline="true" :model="state.queryForm" @keyup.enter="getDataList" ref="queryRef">
  6. <el-form-item :label="$t('marketingApps.name')" prop="domain">
  7. <el-input :placeholder="$t('marketingApps.inputNameTip')" clearable
  8. v-model="state.queryForm.domain" />
  9. </el-form-item>
  10. <el-form-item :label="'应用ID'" prop="appId">
  11. <el-input :placeholder="'请输入应用ID'" clearable v-model="state.queryForm.appId" />
  12. </el-form-item>
  13. <el-form-item :label="'应用类型'" prop="appType">
  14. <el-select placeholder="请选择应用类型" v-model="state.queryForm.appType">
  15. <el-option :key="''" :label="'全部'" :value="''" />
  16. <el-option v-for="item in appTypes" :key="item.value" :label="item.description" :value="item.value" />
  17. </el-select>
  18. </el-form-item>
  19. <el-form-item :label="'备注'" prop="remark">
  20. <el-input :placeholder="'请输入备注'" clearable v-model="state.queryForm.domain" />
  21. </el-form-item>
  22. <el-form-item>
  23. <el-button @click="query" class="ml10" icon="search" type="primary">
  24. {{ $t('common.queryBtn') }}
  25. </el-button>
  26. <el-button @click="resetQuery" icon="Refresh">{{ $t('common.resetBtn') }}</el-button>
  27. <el-button @click="handleEdit" icon="EditPen">{{ $t('common.editBtn') }}</el-button>
  28. </el-form-item>
  29. </el-form>
  30. </el-row>
  31. <el-row>
  32. <div class="mb8" style="width: 100%">
  33. <right-toolbar v-model:showSearch="showSearch" class="ml10" style="float: right; margin-right: 20px"
  34. @queryTable="getDataList"></right-toolbar>
  35. </div>
  36. </el-row>
  37. <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
  38. <el-tab-pane label="使用中" name="tab1"></el-tab-pane>
  39. <el-tab-pane label="回收站" name="tab2"></el-tab-pane>
  40. </el-tabs>
  41. <el-table @selection-change="handleSelectionChange" ref="tableRef" :data="state.dataList" row-key="path"
  42. style="width: 100%" v-loading="state.loading" border :cell-style="tableStyle.cellStyle"
  43. :header-cell-style="tableStyle?.headerCellStyle">
  44. <el-table-column type="selection" fixed="left" width="55" />
  45. <el-table-column fixed="left" :label="$t('marketingApps.id')" prop="id" width="80" show-overflow-tooltip>
  46. <template #default="{ row }">{{ row.id }}</template>
  47. </el-table-column>
  48. <el-table-column :label="$t('marketingApps.appId')" prop="appId" width="120" show-overflow-tooltip>
  49. <template #default="{ row }">{{ row.appId }}</template>
  50. </el-table-column>
  51. <el-table-column :label="$t('marketingApps.appImg')" prop="appImg" width="150" show-overflow-tooltip>
  52. <template #default="{ row }" style="display: flex; align-self: center;">
  53. <el-image style="width: 100px; height: 100px" :src="row.appImg" :fit="fit" />
  54. </template>
  55. </el-table-column>
  56. <el-table-column :label="$t('marketingApps.name')" prop="appName" width="150" show-overflow-tooltip>
  57. <template #default="{ row }">
  58. <el-link :href="row.url">{{ row.appName }}</el-link>
  59. </template>
  60. </el-table-column>
  61. <el-table-column :label="$t('marketingApps.appType')" prop="appType" width="110" show-overflow-tooltip>
  62. <template #default="{ row }">
  63. <el-select v-model="row.appType" placeholder="" style="width: 80px">
  64. <el-option v-for="item in appTypes" :key="item.value" :label="item.description" :value="item.value" />
  65. </el-select>
  66. </template>
  67. </el-table-column>
  68. <el-table-column label="营销投放" prop="isMarketing" width="120">
  69. <template #default="{ row }">
  70. <el-switch v-model="row.isMarketing" inline-prompt active-text="开启" inactive-text="关闭" :active-value="1"
  71. :inactive-value="0" @change="handleChange(row)" />
  72. </template>
  73. </el-table-column>
  74. <el-table-column label="域名限制" prop="isHttp" width="120">
  75. <template #default="{ row }">
  76. <el-switch v-model="row.isHttp" inline-prompt active-text="开启" inactive-text="关闭" :active-value="1"
  77. :inactive-value="0" @change="handleChange(row)" />
  78. </template>
  79. </el-table-column>
  80. <el-table-column label="域名集合" prop="https" width="240" show-overflow-tooltip>
  81. <template #default="{ row }">
  82. <div style="
  83. padding: 0 20px;
  84. text-wrap: auto;
  85. text-align: left;
  86. ">
  87. <el-tooltip effect="light">
  88. <template #content>
  89. <div v-for="(item, index) in row.https" :key="index">{{ item }};</div>
  90. </template>
  91. <el-text line-clamp="6">
  92. <template v-for="(item, index) in row.https" :key="index">
  93. <div>{{ item }};</div>
  94. </template>
  95. </el-text>
  96. </el-tooltip>
  97. </div>
  98. </template>
  99. </el-table-column>
  100. <el-table-column label="ip集合" prop="ips" width="300">
  101. <template #default="{ row }">
  102. <div style="
  103. padding: 0 20px;
  104. text-wrap: auto;
  105. text-align: left;
  106. ">
  107. <div style="text-align: left;">白名单:</div>
  108. <el-tooltip effect="light">
  109. <template #content>
  110. <div v-for="(item, index) in row.ips" :key="index">
  111. {{ item.ipType == 1 ? item.startIp + ';' : '' }}
  112. </div>
  113. </template>
  114. <el-text line-clamp="4">
  115. <template v-for="(item, index) in row.ips" :key="index">
  116. <div>{{ item.ipType == 1 ? item.startIp + ';' : '' }}</div>
  117. </template>
  118. </el-text>
  119. </el-tooltip>
  120. <div style="text-align: left;">黑名单:</div>
  121. <el-tooltip effect="light">
  122. <template #content>
  123. <div v-for="(item, index) in row.ips" :key="index">
  124. {{ item.ipType == 2 ? item.startIp + ';' : '' }}
  125. </div>
  126. </template>
  127. <el-text line-clamp="4">
  128. <template v-for="(item, index) in row.ips" :key="index">
  129. <div>{{ item.ipType == 2 ? item.startIp + ';' : '' }}</div>
  130. </template>
  131. </el-text>
  132. </el-tooltip>
  133. </div>
  134. </template>
  135. </el-table-column>
  136. <el-table-column :label="'触发频率'" prop="triggerRule" width="120" show-overflow-tooltip>
  137. <template #default="{ row }">
  138. {{ Math.floor(Math.random() * 10) }}
  139. </template>
  140. </el-table-column>
  141. <el-table-column :label="$t('marketingApps.triggerRule')" prop="triggerRule" show-overflow-tooltip>
  142. <template #default="{ row }">
  143. <el-select v-model="row.triggerRule" placeholder="" style="width: 150px">
  144. <el-option v-for="item in triggerRules" :key="item.value" :label="item.label" :value="item.value" />
  145. </el-select>
  146. </template>
  147. </el-table-column>
  148. <el-table-column fixed="right" :label="$t('common.action')" width="80">
  149. <template #default="scope">
  150. <div class="action" style="text-align: left;">
  151. <!-- <el-button icon="edit-pen" @click="onOpenEditMenu('edit', scope.row, 'domain')" text type="primary"
  152. v-auth="'sys_menu_edit'">域名
  153. </el-button>
  154. <el-button icon="edit-pen" @click="onOpenEditMenu('edit', scope.row, 'ip')" text type="primary"
  155. v-auth="'sys_menu_edit'">IP
  156. </el-button>
  157. <br /> -->
  158. <el-button style="margin-left: 0;" icon="edit-pen" @click="onOpenEditMenu('edit', scope.row)" text type="primary"
  159. v-auth="'sys_menu_edit'">修改
  160. </el-button>
  161. <el-button style="margin-left: 0;" icon="edit-pen" @click="onOpenStatistical(scope.row)" text type="primary"
  162. v-auth="'sys_menu_edit'">统计
  163. </el-button>
  164. <el-button style="margin-left: 0;" icon="edit-pen" @click="query()" text type="primary"
  165. v-auth="'sys_menu_edit'">{{ activeName == 'tab1' ? '拉黑' : '还原' }}
  166. </el-button>
  167. </div>
  168. </template>
  169. </el-table-column>
  170. </el-table>
  171. <pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
  172. </div>
  173. <MenuDialog @refresh="getDataList()" ref="menuDialogRef" />
  174. <StatisticalDialog @refresh="getDataList()" ref="statisticalDialogRef" />
  175. </div>
  176. </template>
  177. <script lang="ts" name="marketingApps" setup>
  178. import { pageList } from '/@/api/marketing/apps';
  179. import { BasicTableProps, useTable } from '/@/hooks/table';
  180. import { useMessage, useMessageBox } from '/@/hooks/message';
  181. import { useI18n } from 'vue-i18n';
  182. import { fetchItemList } from '/@/api/admin/dict';
  183. import { ref } from 'vue'
  184. import type { TabsPaneContext } from 'element-plus'
  185. const activeName = ref('tab1')
  186. const handleClick = (tab: TabsPaneContext, event: Event) => {
  187. console.log(tab, event);
  188. query();
  189. }
  190. // 引入组件
  191. const MenuDialog = defineAsyncComponent(() => import('./form.vue'));
  192. const StatisticalDialog = defineAsyncComponent(() => import('./statistical.vue'));
  193. const { t } = useI18n();
  194. // 定义变量内容
  195. const tableRef = ref();
  196. const menuDialogRef = ref();
  197. const statisticalDialogRef = ref();
  198. const queryRef = ref();
  199. const showSearch = ref(true);
  200. // 多选rows
  201. const selectObjs = ref([]) as any;
  202. // 是否可以多选
  203. const multiple = ref(true);
  204. const state: BasicTableProps = reactive<BasicTableProps>({
  205. pageList: pageList, // H
  206. queryForm: {
  207. domain: '',
  208. appType: '',
  209. appId: '',
  210. remark: '',
  211. }
  212. });
  213. const appTypes = ref([]) as any;
  214. const getAppTypes = async () => {
  215. const { data } = await fetchItemList({
  216. dictType: 'DomianType'
  217. });
  218. appTypes.value = data?.records || [];
  219. }
  220. getAppTypes();
  221. const triggerRules = [
  222. {
  223. label: '不弹出',
  224. value: 'unset',
  225. },
  226. {
  227. label: '仅一次 - URL',
  228. value: 'url1',
  229. },
  230. {
  231. label: '每次弹出 - URL',
  232. value: 'url2',
  233. },
  234. {
  235. label: '仅一次 - 视频',
  236. value: 'video1',
  237. },
  238. {
  239. label: '每次弹出 - 视频',
  240. value: 'video2',
  241. },
  242. ]
  243. const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state);
  244. // 搜索事件
  245. const query = () => {
  246. state.dataList = [];
  247. getDataList();
  248. };
  249. // 修改单条配置信息
  250. const handleChange = (row: any) => {
  251. // update(row).then(() => {
  252. // useMessage().success(t('common.updateSuccessText'));
  253. // getDataList();
  254. // }).catch((err: any) => {
  255. // useMessage().error(err.msg);
  256. // });
  257. };
  258. // 清空搜索条件
  259. const resetQuery = () => {
  260. queryRef.value.resetFields();
  261. state.dataList = [];
  262. getDataList();
  263. };
  264. // 批量修改配置
  265. const handleEdit = () => {
  266. if (selectObjs.value.length === 0) {
  267. useMessage().warning('请选择要修改的项');
  268. return;
  269. }
  270. // menuDialogRef.value.openDialog('edit', selectObjs.value);
  271. };
  272. // 多选
  273. const handleSelectionChange = (selection: any) => {
  274. selectObjs.value = selection;
  275. };
  276. // 打开编辑菜单弹窗
  277. const onOpenEditMenu = (type: string, row: any) => {
  278. menuDialogRef.value.openDialog(type, row);
  279. };
  280. // 打开统计弹窗
  281. const onOpenStatistical = (row: any) => {
  282. statisticalDialogRef.value.openDialog(row);
  283. };
  284. </script>
  285. <style scoped lang="scss">
  286. :deep(.el-link__inner) {
  287. display: inline-block;
  288. width: 100%;
  289. justify-content: start;
  290. }
  291. :deep(.el-link.is-underline:hover:after) {
  292. display: none;
  293. }
  294. </style>