AdvertisingSpacePage.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. <!-- 推广广告位列表 -->
  2. <template>
  3. <el-form :inline="true">
  4. <el-form-item label="广告位名称">
  5. <el-input v-model="pages.keyword" placeholder="输入广告位关键词" clearable />
  6. </el-form-item>
  7. <!-- <el-form-item label="状态">
  8. <el-select filterable clearable v-model="pages.status" style="width: 200px">
  9. <el-option
  10. v-for="item in statusList"
  11. :key="item.value"
  12. :label="item.label"
  13. :value="item.value"
  14. />
  15. </el-select>
  16. </el-form-item> -->
  17. <el-form-item label="站点">
  18. <el-select
  19. filterable
  20. clearable
  21. v-model="pages.mediaId"
  22. placeholder="站点"
  23. style="width: 200px"
  24. >
  25. <el-option
  26. v-for="item in SiteList"
  27. :key="item.mediaId"
  28. :label="item.mediaName"
  29. :value="item.mediaId"
  30. />
  31. </el-select>
  32. </el-form-item>
  33. <el-form-item>
  34. <el-button type="primary" @click="onSubmit">搜索</el-button>
  35. <el-button type="primary" link @click="creatEditPlan">创建广告位</el-button>
  36. </el-form-item>
  37. </el-form>
  38. <el-table :data="tableData" stripe style="width: 100%">
  39. <el-table-column prop="slotName" label="名称" />
  40. <el-table-column prop="createdTime" label="站点">
  41. <template #default="scope">
  42. {{ SiteDec(scope.row.mediaId) }}
  43. </template>
  44. </el-table-column>
  45. <el-table-column prop="createdTime" label="栏目">
  46. <template #default="scope">
  47. {{ scope.row.catalog ? scope.row.catalog.catalogName : '' }}
  48. </template>
  49. </el-table-column>
  50. <el-table-column prop="createdTime" label="最近更新">
  51. <template #default="scope">
  52. {{ formatDateSite(scope.row.updatedTime, 'Y-M-D') }}
  53. </template>
  54. </el-table-column>
  55. <el-table-column label="操作">
  56. <template #default="scope">
  57. <el-popconfirm @confirm="deleteAsSpaceFun(scope.row.slotId)" title="确定删除该广告位吗?">
  58. <template #reference>
  59. <el-button link type="primary" size="small">删除</el-button>
  60. </template>
  61. </el-popconfirm>
  62. <el-button link type="primary" size="small" @click="() => creatEditPlan(scope.row, true)">
  63. 修改
  64. </el-button>
  65. </template>
  66. </el-table-column>
  67. </el-table>
  68. <br />
  69. <el-pagination
  70. background
  71. layout="prev, pager, next"
  72. :total="pages.total"
  73. @current-change="page"
  74. />
  75. <el-dialog v-model="dialogVisible" title="广告位">
  76. <el-form ref="ruleFormRef" :rules="rules" :model="form" label-width="auto">
  77. <el-form-item label="广告位名称" prop="slotName">
  78. <el-input v-model="form.slotName" />
  79. </el-form-item>
  80. <el-form-item label="站点" prop="mediaId">
  81. <el-select
  82. filterable
  83. v-model="form.mediaId"
  84. :disabled="isUpdate"
  85. placeholder="站点"
  86. size="large"
  87. @change="changeSite"
  88. >
  89. <el-option
  90. v-for="item in SiteList"
  91. :key="item.mediaId"
  92. :label="item.mediaName"
  93. :value="item.mediaId"
  94. />
  95. </el-select>
  96. </el-form-item>
  97. <el-form-item label="栏目" prop="catalogId">
  98. <el-tree-select
  99. :disabled="isUpdate"
  100. v-model="form.catalogId"
  101. :data="CatalogTreeData"
  102. :render-after-expand="false"
  103. />
  104. </el-form-item>
  105. <el-form-item label="宽" prop="width">
  106. <el-input-number v-model="form.width" :min="0" /> px
  107. </el-form-item>
  108. <el-form-item label="高" prop="height">
  109. <el-input-number v-model="form.height" :min="0" /> px
  110. </el-form-item>
  111. <el-form-item>
  112. <el-button type="primary" @click="subCreateSpace(ruleFormRef)">确定</el-button>
  113. </el-form-item>
  114. </el-form>
  115. </el-dialog>
  116. </template>
  117. <script setup lang="ts">
  118. import type { FormInstance, FormRules } from 'element-plus'
  119. import type { CatalogTree, CatalogTreeOri, IAsSpace, AsSpaceItem } from '@/types/AsSpace'
  120. import type { SiteList, SiteItem } from '@/types/Site'
  121. import type { Pages } from '@/types/Tool'
  122. import {
  123. createAsSpace,
  124. getSiteList,
  125. getAsTree,
  126. getAsSpaceList,
  127. deleteAsSpace,
  128. updateAsSpace,
  129. } from '@/api/index'
  130. import { formatDateSite } from '@/tool/index'
  131. import { ElMessage } from 'element-plus'
  132. import { ref, reactive } from 'vue'
  133. // import { statusList } from '@/tool'
  134. const dialogVisible = ref(false)
  135. const ruleFormRef = ref<FormInstance>()
  136. const form = ref<IAsSpace>({})
  137. const isUpdate = ref(false)
  138. const rules = reactive<
  139. FormRules<{ slotName: string; mediaId: number; catalogId: number; width: number; height: number }>
  140. >({
  141. slotName: [{ required: true, message: '请输入广告位名称', trigger: 'blur' }],
  142. mediaId: [{ required: true, message: '请选择站点', trigger: 'change' }],
  143. catalogId: [{ required: true, message: '请选择栏目', trigger: 'change' }],
  144. width: [{ required: true, message: '请输入广告位宽度', trigger: 'blur' }],
  145. height: [{ required: true, message: '请输入广告位高度', trigger: 'blur' }],
  146. })
  147. const pages = reactive<Pages>({
  148. pageNum: 1,
  149. pageSize: 10,
  150. keyword: '',
  151. status: 10,
  152. })
  153. const SiteList = ref<SiteList>([])
  154. const CatalogTreeData = ref<CatalogTree[]>([])
  155. const tableData = ref([])
  156. const changeSite = (val: number) => {
  157. getAsTree(val).then(({ data }) => {
  158. CatalogTreeData.value = toValueLabel(data)
  159. })
  160. }
  161. const SiteDec = (mediaId: number): string | void => {
  162. const item: SiteItem = SiteList.value.find((item) => item.mediaId === mediaId) || {}
  163. return item.mediaName
  164. }
  165. const deleteAsSpaceFun = (id: number) => {
  166. deleteAsSpace(id).then(() => {
  167. ElMessage.success('删除成功')
  168. onSubmit()
  169. })
  170. }
  171. const toValueLabel = (data: CatalogTreeOri[]): CatalogTree[] => {
  172. return data.map((item: CatalogTreeOri) => {
  173. const p: CatalogTree = {
  174. label: item.catalogName,
  175. value: item.catalogId,
  176. }
  177. if (item.children !== undefined) p.children = toValueLabel(item.children)
  178. return p
  179. })
  180. }
  181. const onSubmit = () => {
  182. getAsSpaceList({
  183. pageNum: pages.pageNum,
  184. pageSize: pages.pageSize,
  185. keyword: pages.keyword ? pages.keyword : null,
  186. status: pages.status,
  187. mediaId: typeof pages.mediaId === 'number' ? pages.mediaId : null,
  188. }).then(({ data }) => {
  189. tableData.value = data.records || []
  190. pages.total = data.total
  191. })
  192. }
  193. const page = (val: number) => {
  194. pages.pageNum = val
  195. onSubmit()
  196. }
  197. const creatEditPlan = (data: AsSpaceItem, isUpdateF = false) => {
  198. if (data != undefined) {
  199. form.value = {
  200. mediaId: data.mediaId,
  201. catalogId: data.catalogId,
  202. slotName: data.slotName,
  203. width: data.width,
  204. height: data.height,
  205. adType: data.adType,
  206. slotId: data.slotId,
  207. }
  208. }
  209. dialogVisible.value = !dialogVisible.value
  210. if (typeof data.mediaId === 'number') changeSite(data.mediaId)
  211. isUpdate.value = isUpdateF
  212. }
  213. const subCreateSpace = async (formEl: FormInstance | undefined) => {
  214. if (!formEl) return
  215. await formEl.validate((valid) => {
  216. if (!valid) return
  217. if (!isUpdate.value)
  218. createAsSpace(form.value).then(() => {
  219. ElMessage({
  220. message: '创建成功',
  221. type: 'success',
  222. })
  223. dialogVisible.value = !dialogVisible.value
  224. onSubmit()
  225. })
  226. else
  227. updateAsSpace({
  228. slotId: form.value.slotId,
  229. slotName: form.value.slotName,
  230. width: form.value.width,
  231. height: form.value.height,
  232. }).then(() => {
  233. ElMessage({
  234. message: '修改成功',
  235. type: 'success',
  236. })
  237. dialogVisible.value = !dialogVisible.value
  238. onSubmit()
  239. })
  240. })
  241. }
  242. getSiteList().then((res) => {
  243. SiteList.value = res.data || []
  244. pages.mediaId = res.data[0].mediaId
  245. onSubmit()
  246. })
  247. </script>
  248. <style></style>