AdvertisingSpacePage.vue 7.9 KB

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