File size: 4,666 Bytes
77b0e0f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<script setup lang="ts">
import { onMounted, ref, computed } from 'vue'
import { useRouter } from 'vue-router'
import { ElMessage, ElMessageBox } from 'element-plus/es'
import { Plus, Delete } from '@element-plus/icons-vue'

import {
  type StreamingRoomInfo,
  streamerRoomListRequest,
  deleteStreamingRoomByIdRequest
} from '@/api/streamingRoom'
import { AxiosError } from 'axios'

// 获取主播信息
const streamingList = ref([] as StreamingRoomInfo[])
const router = useRouter()

onMounted(async () => {
  try {
    // 获取直播间信息
    const { data } = await streamerRoomListRequest()
    if (data.code === 0) {
      streamingList.value = data.data
      ElMessage.success('获取直播间信息成功')
    } else {
      ElMessage.error('获取直播间信息失败' + data.message)
    }
  } catch (error: unknown) {
    if (error instanceof AxiosError) {
      ElMessage.error('获取直播间信息失败' + error.message)
    } else {
      ElMessage.error('未知错误:' + error)
    }
  }
})

const DeleteStreamingRoom = async (id: number, productName: string) => {
  ElMessageBox.confirm(`确定要删除 "${productName}" 吗?`, '警告', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning'
  })
    .then(async () => {
      const { data } = await deleteStreamingRoomByIdRequest(id)
      if (data.code === 0) {
        ElMessage.success('删除成功')
        // 获取直播间信息
        const { data } = await streamerRoomListRequest()
        if (data.code === 0) {
          streamingList.value = data.data
          ElMessage.success('获取直播间信息成功')
        }
      } else {
        ElMessage.error('删除失败')
      }
    })
    .catch(() => {
      ElMessage.error('删除失败')
    })
}

const chunkArray = (array: StreamingRoomInfo[], chunkSize: number) => {
  // 切割每 n 个为一行(即一个数组),方便后续进行 v-for 遍历
  const result = []
  for (let i = 0; i < array.length; i += chunkSize) {
    result.push(array.slice(i, i + chunkSize))
  }
  return result
}

const chunkedArray = computed(() => chunkArray(streamingList.value, 4))

const tagMap = { 0: '未开播', 1: '直播中', 2: '已下播' }
</script>

<template>
  <div>
    <div style="margin-bottom: 20px">
      <el-button @click="router.push({ name: 'StreamingCreate' })" type="primary">
        <el-icon style="margin-right: 5px">
          <Plus />
        </el-icon>

        新建直播间
      </el-button>
    </div>
    <div v-for="(row, rowIndex) in chunkedArray" :key="rowIndex" class="row">
      <el-row :gutter="20">
        <el-col v-for="(item, index) in row" :key="index" :span="8">
          <el-card style="max-width: 480px">
            <img :src="item.room_poster" style="width: 100%" />
            <div class="title">
              <h3>{{ item.name }}</h3>
              <el-tag type="success" effect="light">
                {{ tagMap[item.status.live_status as keyof typeof tagMap] }}
              </el-tag>
            </div>
            <div>
              <p>主播:{{ item.streamer_info.name }}</p>
              <p>商品数:{{ item.product_list.length }}</p>
              <p>
                开播时间: {{ item.status.live_status === 1 ? item.status.start_time : '未开播' }}
              </p>
            </div>
            <div class="bottom-button">
              <el-button
                type="primary"
                @click="router.push({ name: 'StreamingEdit', params: { roomId: item.room_id } })"
              >
                编辑直播间
              </el-button>
              <el-button
                type="primary"
                :disabled="item.status.live_status !== 1"
                @click="router.push({ name: 'StreamingOnAir', params: { roomId: item.room_id } })"
              >
                进入直播间
              </el-button>
              <el-button
                type="danger"
                :disabled="item.status.live_status === 1"
                :icon="Delete"
                @click="DeleteStreamingRoom(item.room_id, item.name)"
              />
            </div>
          </el-card>
        </el-col>
      </el-row>
    </div>
  </div>
</template>

<style lang="scss" scoped>
.row {
  margin-bottom: 20px;
}

.el-card {
  padding: 20px;
  border-radius: 20px;
}

.title {
  display: flex;
  justify-content: space-between;

  .h3 {
    font-size: 50px;
    font-weight: 600;
    margin: 24px 0px 8px 0px;
  }
}

.bottom-button {
  margin-top: 20px; // 距离上面的控件有一定的距离
  display: flex;
  justify-content: center;
  align-items: center;
}
</style>