adSourceAdmin.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  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. pageSizes: 20,// 总页数
  116. total: null,// 总条数
  117. name: null,//名称
  118. placementId: null,//广告位id
  119. });
  120. const dynamicFormItems = ref([])
  121. onBeforeMount(() => {
  122. settingData()
  123. getList();
  124. getPlacementList()
  125. });
  126. // 获取缓存数据设置筛选数据
  127. const settingData = () => {
  128. loadDictData().then(() => {
  129. dynamicFormItems.value = [
  130. {
  131. label: '广告源ID',
  132. prop: 'nickName',
  133. type: 'input',
  134. },
  135. {
  136. label: '广告位名称',
  137. prop: 'channelType',
  138. type: 'select',
  139. options: [
  140. {
  141. label: "全部",
  142. value: null,
  143. },
  144. {
  145. label: "正常",
  146. value: 0,
  147. },
  148. {
  149. label: "锁定",
  150. value: 1,
  151. }
  152. ]
  153. },
  154. {
  155. label: '应用名称',
  156. prop: 'loginType',
  157. type: 'select',
  158. options: [
  159. {
  160. label: "全部",
  161. value: null,
  162. },
  163. {
  164. label: "账号密码",
  165. value: 0,
  166. },
  167. {
  168. label: "微信",
  169. value: 1,
  170. }
  171. ]
  172. },
  173. ]
  174. })
  175. }
  176. // 分页数据
  177. const getList = async () => {
  178. let res = await adSourceList({ ...formSearch.value });
  179. tableData.value = res.data;
  180. page.total = res.pageMeta.total;
  181. };
  182. const changeTableData = () => {
  183. formSearch.value.page = page.pageNum;
  184. formSearch.value.pageSizes = page.pageSize;
  185. formSearch.value.limit = page.pageSize;
  186. // 分页切换
  187. getList();
  188. };
  189. // 搜索
  190. const handleFormSubmitted = (formData) => {
  191. // console.log("接收到子组件传递的数据", formData);
  192. formSearch.value.page = 1;
  193. formSearch.value.pageSizes = 20;
  194. formSearch.value.total = page.total;
  195. formSearch.value.limit = 20;
  196. getList();
  197. };
  198. // 表单重置
  199. const handleFormReset = () => {
  200. formSearch.value = {
  201. limit: 20,// 当前页数量(查询量)
  202. page: 1,// 当前页码
  203. pageSizes: 20,// 总页数
  204. total: null,// 总条数
  205. name: null,//名称
  206. placementId: null,//广告位id
  207. };
  208. getList();
  209. };
  210. // 选择监听器
  211. const handleSelectionChange = (val) => {
  212. context.emit("selection-change", val)
  213. }
  214. // 获取广告位列表
  215. const placementListData = ref([])
  216. const getPlacementList = async () => {
  217. let res = await placementList({
  218. limit: 999,
  219. page: 1,
  220. pageSizes: 999,
  221. })
  222. placementListData.value = res.data
  223. }
  224. // 弹窗
  225. const layer = ref({
  226. show: false,
  227. title: "新增广告渠道",
  228. showButton: true,
  229. width: '50vw',
  230. edit: false,
  231. });
  232. const formEdit = ref({
  233. adSourceId: undefined,
  234. mix_format: '',//混合类型
  235. name: '', //广告源名称
  236. network_id: '1210971759',//Taku广告平台账号ID
  237. placementId: '',//广告位id
  238. type: '',//广告源类型
  239. })
  240. const edit = (row) => {
  241. ruleForm.value?.resetFields()
  242. if (row) {
  243. formEdit.value = row
  244. layer.value.edit = true;
  245. layer.value.title = '编辑广告源'
  246. } else {
  247. formEdit.value = {
  248. adSourceId: undefined,
  249. mix_format: '',//混合类型
  250. name: '', //广告源名称
  251. network_id: '1210971759',//Taku广告平台账号ID
  252. placementId: '',//广告位id
  253. type: '',//广告源类型
  254. }
  255. layer.value.edit = false;
  256. layer.value.title = '新增广告源'
  257. }
  258. layer.value.show = true
  259. }
  260. const ruleForm = ref(null);
  261. const rules = reactive({
  262. name: [
  263. { required: true, message: "请输入广告源名称", trigger: "blur" },
  264. ],
  265. placementId: [
  266. { required: true, message: "请选择广告位", trigger: "change" },
  267. ],
  268. type: [
  269. { required: true, message: "请选择广告源类型", trigger: "change" },
  270. ],
  271. mix_format: [
  272. { required: true, message: "请选择混合类型", trigger: "change" },
  273. ],
  274. });
  275. const submit = async (formEl) => {
  276. await formEl.validate(async (valid, fields) => {
  277. if (valid) {
  278. // 提交内容
  279. console.log('提交内容', formEdit.value)
  280. // 编辑
  281. if (layer.value.edit) {
  282. await adSourceUpdateOne({ ...formEdit.value }).then((res) => {
  283. ElMessage.success('保存成功')
  284. getList();
  285. })
  286. } else {
  287. await adSourceAddOne({ ...formEdit.value }).then((res) => {
  288. ElMessage.success('新增成功');
  289. getList()
  290. })
  291. }
  292. layer.value.show = false
  293. } else {
  294. console.log("error submit!", fields);
  295. }
  296. });
  297. };
  298. // 删除
  299. const removeItem = async (row) => {
  300. console.log('删除', row)
  301. await adSourceDeleteOne({ adSourceId: row.adSourceId }).then((res) => {
  302. ElMessage.success("删除成功");
  303. handleFormSubmitted();
  304. });
  305. }
  306. </script>
  307. <style scoped lang="scss">
  308. .layout-container {
  309. .button {
  310. display: flex;
  311. flex-direction: column;
  312. .button-item {
  313. margin: 4px;
  314. }
  315. }
  316. }
  317. </style>