adSourceAdmin.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. <template>
  2. <div class="layout-container">
  3. <!-- 菜单栏 -->
  4. <From :form-items="dynamicFormItems" @formSubmitted="handleFormSubmitted" @formReset="handleFormReset"
  5. is_add_button="新增" @addForm="edit" />
  6. <!-- 表格 -->
  7. <div class="layout-container">
  8. <Table @getTableData="changeTableData" v-model:page="page" ref="table" :data="tableData"
  9. @selection-change="handleSelectionChange">
  10. <el-table-column prop="adSourceId" label="广告源ID" />
  11. <el-table-column prop="name" label="广告源名称" />
  12. <el-table-column prop="type" label="广告源类型" />
  13. <el-table-column prop="placementName" label="广告位名称" />
  14. <el-table-column prop="placementId" label="广告位ID" />
  15. <el-table-column prop="mix_format" label="混合类型">
  16. <template #default="scope">
  17. {{ scope.row.mix_format }}
  18. </template>
  19. </el-table-column>
  20. <el-table-column label="操作" width="200" fixed="right">
  21. <template #default="scope">
  22. <div class="button">
  23. <el-button class="button-item" type="primary" style="margin-bottom: 5px;"
  24. @click="edit(scope.row)">
  25. 编辑
  26. </el-button>
  27. <el-popconfirm placement="left" title="确认删除该数据?" @confirm="removeItem(scope.row)">
  28. <template #reference>
  29. <el-button class="button-item" style="margin-bottom: 5px;"
  30. type="danger">删除</el-button>
  31. </template>
  32. </el-popconfirm>
  33. </div>
  34. </template>
  35. </el-table-column>
  36. </Table>
  37. </div>
  38. <!-- 操作弹窗 -->
  39. <Layer :layer="layer" @confirm="submit(ruleForm)" @close="layer.show = false">
  40. <el-form :model="formEdit" :rules="rules" ref="ruleForm" label-width="120px" style="margin-right:30px;">
  41. <el-row :gutter="5">
  42. <el-col :span="10">
  43. <el-form-item required label="广告源名称" prop="name">
  44. <el-input v-model="formEdit.name" placeholder="请输入" clearable />
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="2"></el-col>
  48. <el-col :span="10">
  49. <el-form-item required label="广告位" prop="placementId">
  50. <el-select v-model="formEdit.placementId">
  51. <el-option v-for="item in placementListData" :value="item.placementId"
  52. :label="item.placementName" />
  53. </el-select>
  54. </el-form-item>
  55. </el-col>
  56. </el-row>
  57. <el-row :gutter="5">
  58. <el-col :span="10">
  59. <el-form-item required label="广告源类型" prop="type">
  60. <el-select v-model="formEdit.type">
  61. <el-option :value="2" label="常规广告源" />
  62. <el-option :value="10" label="兜底广告源" />
  63. <el-option :value="12" label="客户端竞价广告源" />
  64. <el-option :value="13" label="服务端竞价广告源" />
  65. </el-select>
  66. </el-form-item>
  67. </el-col>
  68. <el-col :span="2"></el-col>
  69. <el-col :span="10">
  70. <el-form-item required label="混合类型" prop="mix_format">
  71. <el-select v-model="formEdit.mix_format">
  72. <el-option :value="-1" label="非混合类型" />
  73. <el-option :value="0" label="混合native类型" />
  74. <el-option :value="1" label="混合rewarded_video类型" />
  75. <el-option :value="2" label="混合banner类型" />
  76. <el-option :value="3" label="混合interstitial类型" />
  77. <el-option :value="4" label="混合splash类型" />
  78. </el-select>
  79. </el-form-item>
  80. </el-col>
  81. </el-row>
  82. <!-- <el-row :gutter="5">
  83. <el-col :span="10" v-if="formEdit.appId">
  84. </el-col>
  85. <el-col :span="2" v-if="formEdit.appId"></el-col>
  86. <el-col :span="10">
  87. </el-col>
  88. </el-row> -->
  89. </el-form>
  90. </Layer>
  91. </div>
  92. </template>
  93. <script setup>
  94. import { onBeforeMount, ref, reactive } from "vue";
  95. import From from "@/components/from/index.vue";
  96. import Table from "@/components/table/index.vue";
  97. import { useGetDictList } from '@/hooks/useGetDictList.js'
  98. import { useStore } from 'vuex'
  99. import { placementList, adSourceList, adSourceAddOne, adSourceUpdateOne, adSourceDeleteOne } from "@/api/formworkErection";
  100. import Layer from "@/components/layer/index.vue";
  101. import { ElMessage } from "element-plus";
  102. const store = useStore()
  103. const { dictData, loadDictData, getOptions, getDictionaryName } = useGetDictList();
  104. const form = ref(null);
  105. const tableData = ref([]);
  106. // 分页参数, 供table使用
  107. const page = reactive({
  108. pageNum: 1,
  109. pageSize: 20,
  110. total: 0,
  111. });
  112. const formSearch = ref({
  113. limit: 20,// 当前页数量(查询量)
  114. page: 1,// 当前页码
  115. name: null,//名称
  116. placementId: null,//广告位id
  117. });
  118. const dynamicFormItems = ref([])
  119. onBeforeMount(() => {
  120. settingData()
  121. getList();
  122. getPlacementList()
  123. });
  124. // 获取缓存数据设置筛选数据
  125. const settingData = () => {
  126. loadDictData().then(() => {
  127. dynamicFormItems.value = [
  128. {
  129. label: '广告源ID',
  130. prop: 'nickName',
  131. type: 'input',
  132. needEnterEvent: true
  133. },
  134. {
  135. label: '广告位名称',
  136. prop: 'channelType',
  137. type: 'select',
  138. options: [
  139. {
  140. label: "全部",
  141. value: null,
  142. },
  143. {
  144. label: "正常",
  145. value: 0,
  146. },
  147. {
  148. label: "锁定",
  149. value: 1,
  150. }
  151. ]
  152. },
  153. {
  154. label: '应用名称',
  155. prop: 'loginType',
  156. type: 'select',
  157. options: [
  158. {
  159. label: "全部",
  160. value: null,
  161. },
  162. {
  163. label: "账号密码",
  164. value: 0,
  165. },
  166. {
  167. label: "微信",
  168. value: 1,
  169. }
  170. ]
  171. },
  172. ]
  173. })
  174. }
  175. // 分页数据
  176. const getList = async () => {
  177. let res = await adSourceList({ ...formSearch.value });
  178. tableData.value = res.data;
  179. page.total = res.pageMeta.total;
  180. };
  181. const changeTableData = (type) => {
  182. formSearch.value.page = type ? 1 : page.pageNum;
  183. formSearch.value.limit = page.pageSize;
  184. // 分页切换
  185. getList();
  186. };
  187. // 搜索
  188. const handleFormSubmitted = (formData) => {
  189. // console.log("接收到子组件传递的数据", formData);
  190. formSearch.value.page = 1;
  191. formSearch.value.limit = 20;
  192. getList();
  193. };
  194. // 表单重置
  195. const handleFormReset = () => {
  196. formSearch.value = {
  197. limit: 20,// 当前页数量(查询量)
  198. page: 1,// 当前页码
  199. name: null,//名称
  200. placementId: null,//广告位id
  201. };
  202. getList();
  203. };
  204. // 选择监听器
  205. const handleSelectionChange = (val) => {
  206. context.emit("selection-change", val)
  207. }
  208. // 获取广告位列表
  209. const placementListData = ref([])
  210. const getPlacementList = async () => {
  211. let res = await placementList({
  212. limit: 999,
  213. page: 1,
  214. })
  215. placementListData.value = res.data
  216. }
  217. // 弹窗
  218. const layer = ref({
  219. show: false,
  220. title: "新增广告渠道",
  221. showButton: true,
  222. width: '50vw',
  223. edit: false,
  224. });
  225. const formEdit = ref({
  226. adSourceId: undefined,
  227. mix_format: '',//混合类型
  228. name: '', //广告源名称
  229. network_id: '1210971759',//Taku广告平台账号ID
  230. placementId: '',//广告位id
  231. type: '',//广告源类型
  232. })
  233. const edit = (row) => {
  234. ruleForm.value?.resetFields()
  235. if (row) {
  236. formEdit.value = row
  237. layer.value.edit = true;
  238. layer.value.title = '编辑广告源'
  239. } else {
  240. formEdit.value = {
  241. adSourceId: undefined,
  242. mix_format: '',//混合类型
  243. name: '', //广告源名称
  244. network_id: '1210971759',//Taku广告平台账号ID
  245. placementId: '',//广告位id
  246. type: '',//广告源类型
  247. }
  248. layer.value.edit = false;
  249. layer.value.title = '新增广告源'
  250. }
  251. layer.value.show = true
  252. }
  253. const ruleForm = ref(null);
  254. const rules = reactive({
  255. name: [
  256. { required: true, message: "请输入广告源名称", trigger: "blur" },
  257. ],
  258. placementId: [
  259. { required: true, message: "请选择广告位", trigger: "change" },
  260. ],
  261. type: [
  262. { required: true, message: "请选择广告源类型", trigger: "change" },
  263. ],
  264. mix_format: [
  265. { required: true, message: "请选择混合类型", trigger: "change" },
  266. ],
  267. });
  268. const submit = async (formEl) => {
  269. await formEl.validate(async (valid, fields) => {
  270. if (valid) {
  271. // 提交内容
  272. console.log('提交内容', formEdit.value)
  273. // 编辑
  274. if (layer.value.edit) {
  275. await adSourceUpdateOne({ ...formEdit.value }).then((res) => {
  276. ElMessage.success('保存成功')
  277. getList();
  278. })
  279. } else {
  280. await adSourceAddOne({ ...formEdit.value }).then((res) => {
  281. ElMessage.success('新增成功');
  282. getList()
  283. })
  284. }
  285. layer.value.show = false
  286. } else {
  287. console.log("error submit!", fields);
  288. }
  289. });
  290. };
  291. // 删除
  292. const removeItem = async (row) => {
  293. console.log('删除', row)
  294. await adSourceDeleteOne({ adSourceId: row.adSourceId }).then((res) => {
  295. ElMessage.success("删除成功");
  296. handleFormSubmitted();
  297. });
  298. }
  299. </script>
  300. <style scoped lang="scss">
  301. .layout-container {
  302. .button {
  303. display: flex;
  304. flex-direction: column;
  305. .button-item {
  306. margin: 4px;
  307. }
  308. }
  309. }
  310. </style>