ExaminePage.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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
  9. filterable
  10. v-model="pages.creativeId"
  11. placeholder="选择创意"
  12. clearable
  13. style="width: 240px"
  14. >
  15. <el-option
  16. v-for="item in originalityList"
  17. :key="item.creativeId"
  18. :label="item.creativeName"
  19. :value="item.creativeId"
  20. />
  21. </el-select>
  22. </el-form-item>
  23. <el-form-item>
  24. <el-button type="primary" @click="onSubmit">搜索</el-button>
  25. </el-form-item>
  26. </el-form>
  27. <el-table :data="tableData" stripe style="width: 100%">
  28. <el-table-column prop="stuffName" label="名称" />
  29. <el-table-column prop="stuffName" label="状态">
  30. <template #default="scope">
  31. {{ getStatus(scope.row.status) }}
  32. </template>
  33. </el-table-column>
  34. <el-table-column prop="stuffName" label="创意">
  35. <template #default="scope">
  36. {{ OriginalityName(scope.row.creativeId) }}
  37. </template>
  38. </el-table-column>
  39. <el-table-column prop="width" label="宽(px)" width="80" />
  40. <el-table-column prop="height" label="高(px)" width="80" />
  41. <el-table-column prop="landingPage" label="跳转地址" />
  42. <el-table-column prop="updatedTime" label="最近更新">
  43. <template #default="scope">
  44. {{ formatDateSite(scope.row.updatedTime, 'Y-M-D') }}
  45. </template>
  46. </el-table-column>
  47. <el-table-column label="操作">
  48. <template #default="scope">
  49. <el-popconfirm
  50. title="确定通过该素材吗?"
  51. v-if="scope.row.status == 0"
  52. @confirm="changeStatus(scope.row.stuffId, 10, '审核成功')"
  53. >
  54. <template #reference>
  55. <el-button link type="primary" size="small">通过</el-button>
  56. </template>
  57. </el-popconfirm>
  58. <el-popconfirm
  59. title="确定通过该素材吗?"
  60. v-if="scope.row.status == 0"
  61. @confirm="changeStatus(scope.row.stuffId, 3, '拒审成功')"
  62. >
  63. <template #reference>
  64. <el-button link type="primary" size="small">不通过</el-button>
  65. </template>
  66. </el-popconfirm>
  67. </template>
  68. </el-table-column>
  69. </el-table>
  70. <br />
  71. <el-pagination
  72. background
  73. layout="prev, pager, next"
  74. :total="pages.total"
  75. @current-change="page"
  76. />
  77. <el-dialog v-model="dialogVisible" title="素材">
  78. <el-form ref="ruleFormRef" :rules="rules" :model="form" label-width="auto">
  79. <el-form-item label="素材名称" prop="stuffName">
  80. <el-input v-model="form.stuffName" />
  81. </el-form-item>
  82. <el-form-item label="选择创意" prop="creativeId">
  83. <el-select filterable v-model="form.creativeId" placeholder="选择创意">
  84. <el-option
  85. v-for="item in originalityList"
  86. :key="item.creativeId"
  87. :label="item.creativeName"
  88. :value="item.creativeId"
  89. />
  90. </el-select>
  91. </el-form-item>
  92. <el-form-item label="跳转地址" prop="landingPage">
  93. <el-input v-model="form.landingPage" />
  94. </el-form-item>
  95. <el-form-item label="上传素材" prop="addr">
  96. <MediaComponents
  97. v-if="dialogVisible"
  98. :src="form.addr || ''"
  99. @change="(val: string) => (form.addr = val)"
  100. @getCalc="getCalc"
  101. />
  102. </el-form-item>
  103. <el-form-item label="宽(px)" prop="width">
  104. <el-input-number v-model="form.width" :min="0" />
  105. </el-form-item>
  106. <el-form-item label="高(px)" prop="height">
  107. <el-input-number v-model="form.height" :min="0" />
  108. </el-form-item>
  109. <el-form-item>
  110. <el-button type="primary" @click="creatMaterial(ruleFormRef)">确定</el-button>
  111. <el-button v-if="form.stuffId" type="primary" @click="addNewMaterial(ruleFormRef)">
  112. 添加到新创意
  113. </el-button>
  114. </el-form-item>
  115. </el-form>
  116. </el-dialog>
  117. </template>
  118. <script setup lang="ts">
  119. import type { FormInstance, FormRules } from 'element-plus'
  120. import type { Pages } from '@/types/Tool'
  121. import type { OriginalityList } from '@/types/AdListPage'
  122. import type { SourceMaterialList, ISourceMaterialProps } from '@/types/SourceMaterial'
  123. import { formatDateSite, getStatus } from '@/tool/index'
  124. import { ElMessage } from 'element-plus'
  125. import {
  126. getMaterialList,
  127. getOriginalityList,
  128. createMaterial,
  129. updateMaterial,
  130. updateMaterialStatus,
  131. } from '@/api/index'
  132. import { ref, reactive } from 'vue'
  133. import MediaComponents from '@/components/mediaComponents.vue'
  134. // vue3 获取url参数
  135. const ruleFormRef = ref<FormInstance>()
  136. const rules = reactive<FormRules<ISourceMaterialProps>>({
  137. stuffName: [{ required: true, message: '请输入名称', trigger: 'blur' }],
  138. landingPage: [{ required: true, message: '请输入名称', trigger: 'blur' }],
  139. creativeId: [{ required: true, message: '请选择创意', trigger: 'change' }],
  140. addr: [{ required: true, message: '请选择素材', trigger: 'change' }],
  141. width: [{ required: true, message: '请输入宽', trigger: 'change' }],
  142. height: [{ required: true, message: '请输入高', trigger: 'change' }],
  143. })
  144. const originalityList = ref<OriginalityList>([])
  145. getOriginalityList({
  146. pageNum: 1,
  147. pageSize: 999999,
  148. }).then(({ data }) => {
  149. originalityList.value = data.records || {}
  150. })
  151. const dialogVisible = ref(false)
  152. const form = ref<ISourceMaterialProps>({
  153. width: 0,
  154. height: 0,
  155. })
  156. const pages = reactive<Pages>({
  157. pageNum: 1,
  158. pageSize: 10,
  159. creativeId: undefined,
  160. status: 0,
  161. })
  162. const tableData = ref<SourceMaterialList>([])
  163. const OriginalityName = (id: number) => {
  164. const item = originalityList.value.find((item) => item.creativeId === id)
  165. return item?.creativeName
  166. }
  167. const onSubmit = () => {
  168. getMaterialList({
  169. creativeId: pages.creativeId,
  170. keyword: pages.keyword,
  171. status: pages.status,
  172. pageNum: pages.pageNum,
  173. pageSize: pages.pageSize,
  174. }).then(({ data }) => {
  175. tableData.value = data.records
  176. pages.total = data.total
  177. })
  178. }
  179. const creatMaterial = (formEl: FormInstance | undefined) => {
  180. if (!formEl) return
  181. formEl.validate((valid) => {
  182. if (!valid) return
  183. if (typeof form.value.stuffId === 'number') {
  184. updateMaterial(form.value).then(() => {
  185. ElMessage({
  186. message: '更新成功',
  187. type: 'success',
  188. })
  189. onSubmit()
  190. dialogVisible.value = false
  191. })
  192. return
  193. }
  194. createMaterial(form.value).then(() => {
  195. ElMessage({
  196. message: '创建成功',
  197. type: 'success',
  198. })
  199. onSubmit()
  200. dialogVisible.value = false
  201. })
  202. })
  203. }
  204. const addNewMaterial = (formEl: FormInstance | undefined) => {
  205. if (!formEl) return
  206. formEl.validate((valid) => {
  207. if (!valid) return
  208. const p = {
  209. ...form.value,
  210. }
  211. delete p.stuffId
  212. createMaterial(p).then(() => {
  213. ElMessage({
  214. message: '复制成功',
  215. type: 'success',
  216. })
  217. onSubmit()
  218. dialogVisible.value = false
  219. })
  220. })
  221. }
  222. const page = (val: number) => {
  223. pages.pageNum = val
  224. onSubmit()
  225. }
  226. const getCalc = (width: number, height: number) => {
  227. form.value.width = width
  228. form.value.height = height
  229. }
  230. const changeStatus = (id: number, status: number, text: string) => {
  231. updateMaterialStatus({ id, status }).then(() => {
  232. ElMessage.success(text)
  233. onSubmit()
  234. })
  235. }
  236. onSubmit()
  237. </script>
  238. <style></style>