Intelligent-Medical-Guidance-Large-Model / frontend /src /views /digital-human /DigitalHumanView.vue
| <script setup lang="ts"> | |
| import { onMounted, ref, computed } from 'vue' | |
| import { ElMessage, ElMessageBox } from 'element-plus/es' | |
| import { Plus, Delete } from '@element-plus/icons-vue' | |
| import { | |
| streamerInfoListRequest, | |
| deleteStreamerByIdRequest, | |
| type StreamerInfo | |
| } from '@/api/streamerInfo' | |
| import showItemInfoDialog from '@/views/digital-human/DigitalHumanEditDialogView.vue' | |
| import { AxiosError } from 'axios' | |
| // 获取主播信息 | |
| const streamerNameOptions = ref([] as StreamerInfo[]) | |
| const DeleteDigitalHuman = async (id: number, name: string) => { | |
| ElMessageBox.confirm(`确定要删除 "${name}" 吗?`, '警告', { | |
| confirmButtonText: '确定', | |
| cancelButtonText: '取消', | |
| type: 'warning' | |
| }) | |
| .then(async () => { | |
| const { data } = await deleteStreamerByIdRequest(id) | |
| if (data.code === 0) { | |
| ElMessage.success('删除成功') | |
| // 获取主播信息 | |
| const { data } = await streamerInfoListRequest() | |
| if (data.code === 0) { | |
| streamerNameOptions.value = data.data | |
| ElMessage.success('获取主播信息成功') | |
| } | |
| } else { | |
| ElMessage.error('删除失败') | |
| } | |
| }) | |
| .catch((error) => { | |
| ElMessage.error('删除失败: ' + error.message) | |
| }) | |
| } | |
| onMounted(async () => { | |
| // 获取主播信息 | |
| try { | |
| const { data } = await streamerInfoListRequest() | |
| if (data.code === 0) { | |
| streamerNameOptions.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 chunkArray = (array: StreamerInfo[], 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(streamerNameOptions.value, 4)) | |
| // 信息弹窗显示标识 | |
| const ShowItemInfo = ref() | |
| </script> | |
| <template> | |
| <div> | |
| <div> | |
| <el-button | |
| type="primary" | |
| style="margin-bottom: 10px" | |
| size="large" | |
| @click="ShowItemInfo.showItemInfoDialog(0)" | |
| > | |
| <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="6"> | |
| <el-card style="max-width: 500px"> | |
| <img :src="item.poster_image" style="width: 100%" /> | |
| <div class="streamer-info"> | |
| <p class="title">{{ item.name }}</p> | |
| <p class="content"> | |
| {{ item.character }} | |
| </p> | |
| </div> | |
| <div class="bottom-button"> | |
| <el-button type="primary" @click="ShowItemInfo.showItemInfoDialog(item.streamer_id)"> | |
| 详情 | |
| </el-button> | |
| <el-button | |
| type="danger" | |
| @click="DeleteDigitalHuman(item.streamer_id, item.name)" | |
| :icon="Delete" | |
| /> | |
| </div> | |
| </el-card> | |
| </el-col> | |
| </el-row> | |
| </div> | |
| <showItemInfoDialog ref="ShowItemInfo" /> | |
| </div> | |
| </template> | |
| <style lang="scss" scoped> | |
| .row { | |
| margin-bottom: 20px; | |
| } | |
| .bottom-button { | |
| margin-top: 10px; // 距离上面的控件有一定的距离 | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| } | |
| .el-card { | |
| border-radius: 20px; | |
| } | |
| .streamer-info { | |
| display: flex; | |
| flex-direction: column; /* 将子元素垂直排列 */ | |
| justify-content: center; /* 垂直居中 */ | |
| align-items: center; /* 水平居中 */ | |
| .title { | |
| font-size: 20px; | |
| font-weight: 600; | |
| } | |
| .content { | |
| font-size: 15px; | |
| color: #b1b3b8; | |
| margin: 15px; | |
| } | |
| } | |
| </style> | |