index.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <template>
  2. <div class="new-app-container layout-vertical game-category-page">
  3. <div class="content-panel">
  4. <div class="table-section">
  5. <el-table v-loading="loading" :data="tableData"
  6. height="calc(100vh - 200px)" style="width: 100%; border-radius: 12px; overflow: hidden;"
  7. empty-text="暂无数据">
  8. <el-table-column prop="game_type" label="游戏大类ID" width="120" align="center" />
  9. <el-table-column prop="name" label="游戏大类名称" width="140" align="center" />
  10. <el-table-column label="PC Logo" width="120" align="center">
  11. <template slot-scope="{ row }">
  12. <el-image v-if="row.logo" :src="row.logo" style="width: 50px; height: 50px;" fit="cover"
  13. :preview-src-list="[row.logo]" />
  14. <span v-else>--</span>
  15. </template>
  16. </el-table-column>
  17. <el-table-column label="H5/APP Logo" width="130" align="center">
  18. <template slot-scope="{ row }">
  19. <el-image v-if="row.logo_h5" :src="row.logo_h5" style="width: 50px; height: 50px;" fit="cover"
  20. :preview-src-list="[row.logo_h5]" />
  21. <span v-else>--</span>
  22. </template>
  23. </el-table-column>
  24. <el-table-column prop="description" label="游戏说明" min-width="180" align="center" show-overflow-tooltip />
  25. <el-table-column prop="sort" label="排序" width="180" align="center">
  26. <template slot-scope="{ row }">
  27. <el-input-number v-model="row.sort" size="small" controls-position="right" style="width: 120px"
  28. @change="handleSortChange(row)" />
  29. </template>
  30. </el-table-column>
  31. <el-table-column label="启用状态" width="110" align="center">
  32. <template slot-scope="{ row }">
  33. <el-switch v-model="row.status" :active-value="1" :inactive-value="0" active-color="#13ce66" inactive-color="#f56c6c"
  34. @change="handleEnabledChange(row)" />
  35. </template>
  36. </el-table-column>
  37. <el-table-column label="操作" width="100" align="center" fixed="right">
  38. <template slot-scope="{ row }">
  39. <el-button type="text" size="small" class="ym-view-btn" @click="handleEdit(row)">修改</el-button>
  40. </template>
  41. </el-table-column>
  42. </el-table>
  43. </div>
  44. </div>
  45. <!-- 修改弹窗 -->
  46. <Dialog ref="editDialog" :dialog-actions="{
  47. width: '700px',
  48. title: '修改游戏大类',
  49. }" :loading="saving" @confirm="handleConfirm">
  50. <template slot="content">
  51. <el-form ref="editFormRef" :model="editForm" label-width="120px">
  52. <el-form-item label="游戏大类名称">
  53. <span>{{ editForm.name }}</span>
  54. </el-form-item>
  55. <el-form-item label="PC Logo">
  56. <UploadOneImage v-model="editForm.logo" />
  57. </el-form-item>
  58. <el-form-item label="H5/APP Logo">
  59. <UploadOneImage v-model="editForm.logo_h5" />
  60. </el-form-item>
  61. <el-form-item label="游戏说明">
  62. <el-input v-model="editForm.description" type="textarea" :rows="4" placeholder="请输入游戏说明" style="width: 400px" />
  63. </el-form-item>
  64. </el-form>
  65. </template>
  66. </Dialog>
  67. </div>
  68. </template>
  69. <script>
  70. import Dialog from '@/components/Dialog/index.vue'
  71. import UploadOneImage from '@/components/UploadOneImage/index.vue'
  72. import { getEgameItems, updateEgame, setEgameStatus } from '@/api/data'
  73. export default {
  74. name: 'ThirdGameCategory',
  75. components: {
  76. Dialog,
  77. UploadOneImage
  78. },
  79. data() {
  80. return {
  81. loading: false,
  82. saving: false,
  83. tableData: [],
  84. editForm: {}
  85. }
  86. },
  87. created() {
  88. this.fetchList()
  89. },
  90. methods: {
  91. fetchList() {
  92. this.loading = true
  93. getEgameItems({ item_type: 'category', page: 1, limit: 200 }).then(res => {
  94. if (res.code === 0 || res.code === 99) {
  95. const data = res.data || {}
  96. this.tableData = (data.data || []).map(row => this.mapRow(row))
  97. } else {
  98. this.$message.error(res.msg || '获取列表失败')
  99. }
  100. }).catch(() => {
  101. this.$message.error('请求异常')
  102. }).finally(() => {
  103. this.loading = false
  104. })
  105. },
  106. // 接口字段映射
  107. mapRow(row) {
  108. return {
  109. id: row.id,
  110. game_type: row.game_type,
  111. name: row.name,
  112. description: row.description || '',
  113. logo: row.logo || row.logo_pc || '',
  114. logo_h5: row.logo_h5 || '',
  115. sort: row.sort != null ? row.sort : 0,
  116. status: Number(row.status) === 1 ? 1 : 0
  117. }
  118. },
  119. handleSortChange(row) {
  120. // 排序修改(可直接输入或上下调整),数字越大越靠前
  121. updateEgame({ id: row.id, sort: row.sort }).then(res => {
  122. if (res.code === 0) {
  123. this.$message.success(`游戏大类 ${row.name} 排序已修改为 ${row.sort}`)
  124. } else {
  125. this.$message.error(res.msg || '排序修改失败')
  126. }
  127. }).catch(() => {
  128. this.$message.error('请求异常')
  129. })
  130. },
  131. handleEnabledChange(row) {
  132. setEgameStatus({ id: row.id, status: row.status }).then(res => {
  133. if (res.code === 0) {
  134. this.$message.success(`游戏大类 ${row.name} 已${row.status === 1 ? '启用' : '停用'}`)
  135. } else {
  136. this.$message.error(res.msg || '状态修改失败')
  137. row.status = row.status === 1 ? 0 : 1 // 回滚
  138. }
  139. }).catch(() => {
  140. this.$message.error('请求异常')
  141. row.status = row.status === 1 ? 0 : 1
  142. })
  143. },
  144. handleEdit(row) {
  145. this.editForm = { ...row }
  146. this.$refs.editDialog.open()
  147. },
  148. handleConfirm() {
  149. this.saving = true
  150. const params = {
  151. id: this.editForm.id,
  152. name: this.editForm.name,
  153. description: this.editForm.description,
  154. logo_pc: this.editForm.logo,
  155. logo_h5: this.editForm.logo_h5
  156. }
  157. updateEgame(params).then(res => {
  158. if (res.code === 0) {
  159. this.$message.success('修改成功')
  160. this.$refs.editDialog.close()
  161. this.fetchList()
  162. } else {
  163. this.$message.error(res.msg || '修改失败')
  164. }
  165. }).catch(() => {
  166. this.$message.error('请求异常')
  167. }).finally(() => {
  168. this.saving = false
  169. })
  170. }
  171. }
  172. }
  173. </script>
  174. <style lang="scss" scoped>
  175. .game-category-page {
  176. padding: 16px;
  177. background: #f5f7fa;
  178. }
  179. .content-panel {
  180. min-height: calc(100vh - 82px);
  181. overflow: hidden;
  182. border-radius: 8px;
  183. background: #fff;
  184. }
  185. .table-section {
  186. padding: 18px 20px 20px;
  187. }
  188. .ym-view-btn {
  189. padding: 8px 0;
  190. font-size: 14px;
  191. }
  192. </style>