From 27a118c427cabf4502730cba2f7753bac5c79c0b Mon Sep 17 00:00:00 2001 From: yziiy <15979918+mayday-yziiy@user.noreply.gitee.com> Date: Fri, 14 Nov 2025 18:46:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/modules/level.ts | 15 +- src/api/modules/newuserList.ts | 20 +++ src/api/modules/room.ts | 8 ++ src/views/Level/singerLevel/form.vue | 58 ++++++++ src/views/Level/singerLevel/hook.tsx | 181 +++++++++++++++++++++++++ src/views/Level/singerLevel/index.vue | 66 +++++++++ src/views/newuser/singerUser/form.vue | 36 +++++ src/views/newuser/singerUser/hook.tsx | 162 ++++++++++++++++++++++ src/views/newuser/singerUser/index.vue | 53 ++++++++ src/views/room/roomList/detail.vue | 11 +- src/views/room/roomList/sing.tsx | 168 +++++++++++++++++++++++ src/views/room/roomList/sing.vue | 48 +++++++ 12 files changed, 824 insertions(+), 2 deletions(-) create mode 100644 src/views/Level/singerLevel/form.vue create mode 100644 src/views/Level/singerLevel/hook.tsx create mode 100644 src/views/Level/singerLevel/index.vue create mode 100644 src/views/newuser/singerUser/form.vue create mode 100644 src/views/newuser/singerUser/hook.tsx create mode 100644 src/views/newuser/singerUser/index.vue create mode 100644 src/views/room/roomList/sing.tsx create mode 100644 src/views/room/roomList/sing.vue diff --git a/src/api/modules/level.ts b/src/api/modules/level.ts index 01bb5ee..8e596d1 100644 --- a/src/api/modules/level.ts +++ b/src/api/modules/level.ts @@ -63,4 +63,17 @@ export const queryCharmPropList = () => { "get", "/adminapi/Level/wealth_level_rights_list" ); -}; \ No newline at end of file +}; +// 歌手 +export const querySingerList = (params) => { + return http.request( + "get", + "/adminapi/SingerSong/singerLevelList", + { params } + ); +}; +export const editSingerData = data => { + return http.request("post", "/adminapi/SingerSong/singerLevelEdit", { + data + }); +} \ No newline at end of file diff --git a/src/api/modules/newuserList.ts b/src/api/modules/newuserList.ts index 2b4e148..9cbbae0 100644 --- a/src/api/modules/newuserList.ts +++ b/src/api/modules/newuserList.ts @@ -90,4 +90,24 @@ export const unbanUserByIp = data => { return http.request("post", "/adminapi/User/del_forbidden", { data }); +} +// 歌手认证列表 +export const querySingerUser = params => { + return http.request( + "get", + "/adminapi/SingerSong/singerList", + { params } + ); +}; +// 编辑歌手 +export const editSingerUser = data => { + return http.request("post", "/adminapi/SingerSong/singerEdit", { + data + }); +} +// 查看歌手歌曲列表 +export const querySingerSongList = data => { + return http.request("post", "/adminapi/SingerSong/singerSongList", { + data + }); } \ No newline at end of file diff --git a/src/api/modules/room.ts b/src/api/modules/room.ts index ee9a7f0..32a2378 100644 --- a/src/api/modules/room.ts +++ b/src/api/modules/room.ts @@ -294,4 +294,12 @@ export const getRedEnvelopeDetail = params => { "/adminapi/Room/room_redpacket_detail", { params } ); +}; +// 查看房间点歌信息 +export const getSingeSongList = params => { + return http.request( + "get", + "/adminapi/SingerSong/songList", + { params } + ); }; \ No newline at end of file diff --git a/src/views/Level/singerLevel/form.vue b/src/views/Level/singerLevel/form.vue new file mode 100644 index 0000000..24518a1 --- /dev/null +++ b/src/views/Level/singerLevel/form.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/views/Level/singerLevel/hook.tsx b/src/views/Level/singerLevel/hook.tsx new file mode 100644 index 0000000..214a7b4 --- /dev/null +++ b/src/views/Level/singerLevel/hook.tsx @@ -0,0 +1,181 @@ +import { ref, h } from "vue"; +import editForm from "./form.vue"; +import { message } from "@/utils/message"; +import { + querySingerList, + editSingerData + // addCharmData, + // editCharmData, + // deleteCharmData +} from "@/api/modules/level"; +import { addDialog } from "@/components/ReDialog"; +export function useData() { + const formRef = ref(); + const loading = ref(true); + const tableList = ref([]); + const isShow = ref(false); + const searchForm = ref({ + name: "" + }); + const searchLabel = ref([ + { label: "分类名称", prop: "name", type: "input" } + ]); + const pagination = ref({ + total: 0, + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + background: true + }); + const tableLabel = ref([ + { + label: "ID", + prop: "id" + }, + { + label: "等级", + prop: "level" + }, + { + label: "等级名称", + prop: "name" + }, + { + label: "所需经验值", + prop: "change_value" + }, + { + label: "特权图标", + prop: "privilege", + cellRenderer: ({ row }) => ( + + ), + }, + // { + // label: "状态", + // prop: "status", + // cellRenderer: ({ row }) => ( + // {row.status === 1 ? '显示' : '隐藏'} + // ) + // }, + { + label: "发布时间", + prop: "createtime" + }, + { + label: "操作", + fixed: "right", + width: 210, + slot: "operation" + } + ]); + const onSearch = async (formData) => { + loading.value = true; + const { data, code } = await querySingerList({ + ...formData, + page: pagination.value.currentPage, + page_limit: pagination.value.pageSize + }); + if (code) { + tableList.value = data.lists; + pagination.value.total = data.count; + pagination.value.currentPage = data.page; + } + loading.value = false; + }; + const handleSizeChange = (val: number) => { + pagination.value.pageSize = val; + onSearch(searchForm.value); + }; + const handleCurrentChange = (val: number) => { + pagination.value.currentPage = val; + onSearch(searchForm.value); + }; + const handleDelete = async rowData => { + // const { code } = await deleteCharmData({ id: rowData.id }); + // if (code) { + // message(`您删除了等级名称为${rowData.name}的这条数据`, { + // type: "success" + // }); + // onSearch(searchForm.value); + // } + }; + // 新增 + const openDialog = (title = "新增", rowData: any) => { + addDialog({ + title: `${title}歌手等级`, + props: { + formInline: { + level: rowData?.level ?? "", + name: rowData?.name ?? "", + image: rowData?.image ?? "", + change_value: rowData?.change_value ?? "", + rights_icon: rowData?.rights_icon ?? "" + } + }, + width: "40%", + closeOnClickModal: false, + contentRenderer: () => h(editForm, { ref: formRef, formInline: null }), + beforeSure: (done, { options }) => { + const FormRef = formRef.value.getRef(); + const curData = options.props.formInline; + const saveData = async form => { + // 新增不传id + const { code, msg } = await editSingerData(form); + if (code) { + message("新增成功", { type: "success" }); + onSearch(searchForm.value); + done(); + } else { + message(msg, { type: "error" }); + } + }; + const updateData = async form => { + const { code, msg } = await editSingerData({ + ...form, + id: rowData.id + }); + if (code) { + message("修改成功", { type: "success" }); + onSearch(searchForm.value); + done(); + } else { + message(msg, { type: "error" }); + } + }; + FormRef.validate(valid => { + if (valid) { + // 表单规则校验通过 + if (title === "新增") { + // 实际开发先调用新增接口,再进行下面操作 + saveData(curData); + } else { + // 实际开发先调用修改接口,再进行下面操作 + updateData(curData); + } + } + }); + } + }); + }; + return { + searchForm, + searchLabel, + onSearch, + isShow, + tableList, + tableLabel, + pagination, + handleSizeChange, + handleCurrentChange, + loading, + handleDelete, + openDialog + }; +} diff --git a/src/views/Level/singerLevel/index.vue b/src/views/Level/singerLevel/index.vue new file mode 100644 index 0000000..113efde --- /dev/null +++ b/src/views/Level/singerLevel/index.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/src/views/newuser/singerUser/form.vue b/src/views/newuser/singerUser/form.vue new file mode 100644 index 0000000..6ebb80a --- /dev/null +++ b/src/views/newuser/singerUser/form.vue @@ -0,0 +1,36 @@ + + + diff --git a/src/views/newuser/singerUser/hook.tsx b/src/views/newuser/singerUser/hook.tsx new file mode 100644 index 0000000..03bfd01 --- /dev/null +++ b/src/views/newuser/singerUser/hook.tsx @@ -0,0 +1,162 @@ +import { ref, h } from "vue"; +import editForm from "./form.vue"; +import { + querySingerUser, + editSingerUser + // banUserByIpData, + // unbanUserByIp +} from "@/api/modules/newuserList"; +import { message } from "@/utils/message"; +import { addDialog } from "@/components/ReDialog"; +export function useData() { + const formRef = ref(); + const loading = ref(true); + const tableList = ref([]); + const isShow = ref(false); + const pagination = ref({ + total: 0, + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + background: true + }); + const searchForm = ref({ + start_time: "", + end_time: "", + search: "", + status: "" + }); + const searchLabel = ref([ + { label: "昵称/用户ID", prop: "search", type: "input" }, + { + label: "认证状态", prop: "status", type: "select", optionList: [ + { label: "全部", value: "" }, + { label: "已通过", value: 1 }, + { label: "待审核", value: 0 }, + { label: "已拒绝", value: 2 } + ] + }, + { label: "开始时间", prop: "start_time", type: "date" }, + { label: "结束时间", prop: "end_time", type: "date" } + ]); + const tableLabel = ref([ + { + label: "Id", + prop: "id" + }, + { + label: "用户ID", + prop: "user_code" + }, + { + label: "用户昵称", + prop: "nickname" + }, + { + label: "手机号", + prop: "mobile" + }, + { + label: "性别", + prop: "sex" + }, + { + label: "歌手试音地址", + prop: "song" + }, + { + label: "状态", + prop: "status", + cellRenderer: ({ row }) => ( + {row.status === 1 ? '已通过' : row.status === 0 ? '待审核' : '已拒绝'} + ) + }, + { + label: "备注", + prop: "remark" + }, + { + label: "提交时间", + prop: "createtime" + }, + { + label: "操作", + fixed: "right", + slot: "operation" + } + ]); + const detailData = ref(null) + const onSearch = async (formData) => { + loading.value = true; + searchForm.value = { ...formData } + const { data, code } = await querySingerUser({ + ...formData, + page: pagination.value.currentPage, + page_limit: pagination.value.pageSize, + + }); + if (code) { + detailData.value = data; + tableList.value = data.lists; + pagination.value.total = data.count; + pagination.value.currentPage = data.page; + } + loading.value = false; + }; + const handleSizeChange = (val: number) => { + pagination.value.pageSize = val; + onSearch(searchForm.value); + }; + const handleCurrentChange = (val: number) => { + pagination.value.currentPage = val; + onSearch(searchForm.value); + }; + const openDialog = (title = "新增", rowData: any) => { + addDialog({ + title: `${title}歌手认证信息`, + props: { + formInline: { + status: '', + remark: '' + } + }, + width: "40%", + closeOnClickModal: false, + contentRenderer: () => h(editForm, { ref: formRef, formInline: null }), + beforeSure: (done, { options }) => { + const FormRef = formRef.value.getRef(); + const curData = options.props.formInline; + delete curData.higherMenuOptions; + const saveData = async form => { + const { code, msg } = await editSingerUser({ ...form, id: rowData.id }); + if (code) { + message("新增成功", { type: "success" }); + onSearch(searchForm.value); + done(); + } else { + message(msg, { type: "error" }); + } + }; + FormRef.validate(valid => { + if (valid) { + saveData(curData); + } + }); + } + }); + }; + return { + searchForm, + searchLabel, + onSearch, + isShow, + tableList, + tableLabel, + pagination, + handleSizeChange, + handleCurrentChange, + loading, + openDialog, + detailData + }; +} diff --git a/src/views/newuser/singerUser/index.vue b/src/views/newuser/singerUser/index.vue new file mode 100644 index 0000000..45231aa --- /dev/null +++ b/src/views/newuser/singerUser/index.vue @@ -0,0 +1,53 @@ + + + + \ No newline at end of file diff --git a/src/views/room/roomList/detail.vue b/src/views/room/roomList/detail.vue index c9f5a23..9359865 100644 --- a/src/views/room/roomList/detail.vue +++ b/src/views/room/roomList/detail.vue @@ -2,6 +2,7 @@ import { ref, h, onMounted } from "vue"; import { utils, writeFile } from "xlsx"; import { message } from "@/utils/message"; +import singView from './sing.vue'; import { getRoomDetail, getRoomWaterFlow, @@ -157,7 +158,12 @@ const handleClick = (tab) => { pagination.value.currentPage = 1 flowTableList.value = [] activeIndex.value = name - getFlowData(activeIndex.value == '1' ? 1 : 2) + if (['1', '2'].includes(name)) { + getFlowData(activeIndex.value == '1' ? 1 : 2) + } else { + console.log('点歌记录') + } + } const handleSizeChange = (val: number) => { pagination.value.pageSize = val; @@ -264,6 +270,9 @@ const exportExcal = async () => { }" @page-current-change="handleCurrentChange" @page-size-change="handleSizeChange"> + + + diff --git a/src/views/room/roomList/sing.tsx b/src/views/room/roomList/sing.tsx new file mode 100644 index 0000000..6524eb8 --- /dev/null +++ b/src/views/room/roomList/sing.tsx @@ -0,0 +1,168 @@ +import { ref } from "vue"; +import { + getSingeSongList +} from "@/api/modules/room"; +export function useData() { + + const loading = ref(true); + const tableList = ref([]); + const isShow = ref(false); + const tagValue = ref(1) + const RoomId = ref(0) + //1-今天,2-本周,3-本月,4-昨天 + const tagList = ref([ + { value: 1, label: '今天' }, + { value: 4, label: '昨天' }, + { value: 2, label: '本周' }, + { value: 3, label: '本月' } + ]) + const pagination = ref({ + total: 0, + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + background: true + }); + const tableLabel = ref([ + { + label: "老板", + prop: "boss_nickname" + }, + { + label: "歌曲名称", + prop: "song_name" + }, + { + label: "演唱者", + prop: "singer_nickname" + }, + { + label: "礼物名称", + prop: "gift_name" + }, + { + label: "礼物数量", + prop: "gift_num" + }, + { + label: "礼物金币", + prop: "gift_price" + }, + { + label: "点歌时间", + prop: "createtime" + }, + { + label: "状态", + prop: "status", + cellRenderer: ({ row }) => ( + {row.status === 0 ? '待演唱' : row.status === 1 ? '正在演唱' : '已演唱'} + ), + } + ]); + const onSearch = async () => { + loading.value = true; + const { data, code } = await getSingeSongList({ + type: tagValue.value, + room_id: RoomId.value, + page: pagination.value.currentPage, + page_limit: pagination.value.pageSize + }); + if (code) { + tableList.value = data.lists; + pagination.value.total = data.count; + pagination.value.currentPage = data.page; + } + loading.value = false; + }; + const handleSizeChange = (val: number) => { + pagination.value.pageSize = val; + onSearch(); + }; + const handleCurrentChange = (val: number) => { + pagination.value.currentPage = val; + onSearch(); + }; + const changeType = (value) => { + console.log(value) + tagValue.value = value + pagination.value.currentPage = 1 + tableList.value = [] + onSearch() + } + // const exportFormRef = ref(null) + // const exportExcel = () => { + // let exportTableList = [] + // addDialog({ + // title: `导出数据`, + // props: { + // formInline: { + // time: '' + // } + // }, + // width: "40%", + // closeOnClickModal: false, + // contentRenderer: () => h(ExportForm, { ref: exportFormRef, formInline: null }), + // beforeSure: (done, { options }) => { + // const FormRef = exportFormRef.value.getRef(); + // const curData = options.props.formInline; + // const exportData = async (formData) => { + // const { data, code } = await queryList({ + // ...formData, + // page: 1, + // page_limit: 20000 + // }); + // if (code) { + // exportTableList = data.lists; + // const res = exportTableList.map(item => { + // const arr = []; + // tableLabel.value.forEach(column => { + // arr.push(item[column.prop as string]); + // }); + // return arr; + // }); + // const titleList = []; + // tableLabel.value.forEach(column => { + // titleList.push(column.label); + // }); + // res.unshift(titleList); + // const workSheet = utils.aoa_to_sheet(res); + // const workBook = utils.book_new(); + // utils.book_append_sheet(workBook, workSheet, "数据报表"); + // writeFile(workBook, `房间列表统计${formData.begin_time} - ${formData.end_time}.xlsx`); + // message("导出成功", { + // type: "success" + // }); + // done() + // } else { + // message("获取数据失败,请重试!", { + // type: "error" + // }); + // } + // } + // FormRef.validate(valid => { + // if (valid) { + // if (curData.time && curData.time.length) { + // exportData({ begin_time: curData.time[0] || '', end_time: curData.time[1] || '' }) + // } + // } + // }); + // } + // }); + + // } + return { + onSearch, + isShow, + tableList, + tableLabel, + pagination, + handleSizeChange, + handleCurrentChange, + loading, + tagList, + tagValue, + RoomId, + changeType + }; +} diff --git a/src/views/room/roomList/sing.vue b/src/views/room/roomList/sing.vue new file mode 100644 index 0000000..840573e --- /dev/null +++ b/src/views/room/roomList/sing.vue @@ -0,0 +1,48 @@ + + + + +