| @@ -68,3 +68,16 @@ export function videoListApi(pageNum, pageSize) { | |||
| }) | |||
| } | |||
| /** | |||
| * @description: 已消耗总时长 | |||
| * @param | |||
| * @return: | |||
| */ | |||
| export function currentVideoToalApi(pageNum) { | |||
| let api = localStorage.getItem("isAdmin") === '0' ? '/serviceInfo/currentVideoToal' : '/serviceInfo/privateDeployAdminCurrentVideoTotal' | |||
| return request({ | |||
| url: `${api}`, | |||
| method: 'get', | |||
| }) | |||
| } | |||
| @@ -0,0 +1,147 @@ | |||
| import request from "@/utils/request.js"; | |||
| /** | |||
| * @description 用户列表 | |||
| * @param {*} (pageNum,pageSize) | |||
| * @returns data | |||
| */ | |||
| export function userListApi(params) { | |||
| return request({ | |||
| url: `/wxCUserBasicInfo/list`, | |||
| method: 'get', | |||
| params | |||
| }) | |||
| } | |||
| // 绑定定制模板 | |||
| export function personMouldListApi(pageNum, pageSize) { | |||
| return request({ | |||
| url: `/personMould/alList?onlyCustomizedQuery=1&pageNum=${pageNum}&pageSize=${pageSize}`, | |||
| method: 'get' | |||
| }) | |||
| } | |||
| // 绑定定制模板-已关联模版 | |||
| export function userPersonMouldIdListApi(cUserId) { | |||
| return request({ | |||
| url: `/personMould/userPersonMouldIdList?cUserId=${cUserId}`, | |||
| method: 'get' | |||
| }) | |||
| } | |||
| // 绑定定制模板-关联模版 | |||
| export function associatedUserMouldsApi(data) { | |||
| return request({ | |||
| url: `/personMould/associatedUserMoulds`, | |||
| method: 'post', | |||
| data | |||
| }) | |||
| } | |||
| // 绑定定制声纹 | |||
| export function voiceMouldListApi(pageNum, pageSize) { | |||
| return request({ | |||
| url: `/voiceMould/alList?onlyCustomizedQuery=1&pageNum=${pageNum}&pageSize=${pageSize}`, | |||
| method: 'get' | |||
| }) | |||
| } | |||
| // 绑定定制声纹-已关联模版 | |||
| export function userVoiceIdListApi(cUserId) { | |||
| return request({ | |||
| url: `/voiceMould/userVoiceIdList?cUserId=${cUserId}`, | |||
| method: 'get' | |||
| }) | |||
| } | |||
| // 绑定定制声纹-关联模版 | |||
| export function associatedUserVoicesApi(data) { | |||
| return request({ | |||
| url: `/voiceMould/associatedUserVoices`, | |||
| method: 'post', | |||
| data | |||
| }) | |||
| } | |||
| /** | |||
| * @description 用户列表查看 | |||
| * @param {*} | |||
| * @returns | |||
| */ | |||
| export function userListFindByIdApi() { | |||
| return request({ | |||
| url: ` /wxCUserBasicInfo/findById?id=${id}`, | |||
| method: 'get' | |||
| }) | |||
| } | |||
| /** | |||
| * @description 私人定制模板列表 | |||
| * @param {*} (pageNum,pageSize) | |||
| * @returns data | |||
| */ | |||
| export function userMouldListApi(params) { | |||
| return request({ | |||
| url: `/personMould/userMouldList`, | |||
| method: 'get', | |||
| params | |||
| }) | |||
| } | |||
| /** | |||
| * @description 私人定制声纹列表 | |||
| * @param {*} (pageNum,pageSize) | |||
| * @returns data | |||
| */ | |||
| export function userVoiceListAPi(params) { | |||
| return request({ | |||
| url: `/voiceMould/userVoiceList`, | |||
| method: 'get', | |||
| params | |||
| }) | |||
| } | |||
| /** | |||
| * @description 充值列表 | |||
| * @param {*} (pageNum,pageSize) | |||
| * @returns data | |||
| */ | |||
| export function rechargeListApi(params) { | |||
| return request({ | |||
| url: `/productOrder/paiedOrders`, | |||
| method: 'get', | |||
| params | |||
| }) | |||
| } | |||
| /** | |||
| * @description 充值列表 | |||
| * @param {*} (pageNum,pageSize) | |||
| * @returns data | |||
| */ | |||
| export function videoListApi(params) { | |||
| return request({ | |||
| url: `/userVideo/list`, | |||
| method: 'get', | |||
| params | |||
| }) | |||
| } | |||
| /** | |||
| * @description 充值列表-查看 | |||
| * @param {*} | |||
| * @returns | |||
| */ | |||
| export function videoListFindByIdApi(id) { | |||
| return request({ | |||
| url: `/userVideo/findById?id=${id}`, | |||
| method: 'get' | |||
| }) | |||
| } | |||
| /** | |||
| * @description 充值列表-删除 | |||
| * @param {*} | |||
| * @returns | |||
| */ | |||
| export function videoListDelApi(id) { | |||
| return request({ | |||
| url: `/userVideo/del?id=${id}`, | |||
| method: 'get' | |||
| }) | |||
| } | |||
| @@ -45,6 +45,20 @@ | |||
| <span>视频制作统计</span> | |||
| </el-menu-item> | |||
| </template> | |||
| <!-- v-if="isAdmin === '1'" --> | |||
| <el-sub-menu index="7" v-if="isAdmin == '1'" > | |||
| <template #title> | |||
| <el-icon><i-ep-edit /></el-icon> | |||
| <span>用户管理</span> | |||
| </template> | |||
| <el-menu-item-group> | |||
| <el-menu-item index="7-1" @click="router.push('/userManage')">用户列表</el-menu-item> | |||
| <el-menu-item index="7-2" @click="router.push('/userMouldList')">私人定制模板列表</el-menu-item> | |||
| <el-menu-item index="7-3" @click="router.push('/userVoiceList')">私人定制声纹列表</el-menu-item> | |||
| <el-menu-item index="7-4" @click="router.push('/rechargeList')">充值列表</el-menu-item> | |||
| <el-menu-item index="7-5" @click="router.push('/videoList')">视频列表</el-menu-item> | |||
| </el-menu-item-group> | |||
| </el-sub-menu> | |||
| </el-menu> | |||
| </div> | |||
| </div> | |||
| @@ -227,7 +241,7 @@ const showChildrenRouter = ref(""); | |||
| .myRouter { | |||
| position: relative; | |||
| height: calc(100% - 80px); | |||
| padding: 130px 20px 0; | |||
| padding: 50px 20px 0; | |||
| color: #fff; | |||
| width: 230px; | |||
| // color: #868593; | |||
| @@ -222,6 +222,62 @@ export const constantRoutes: RouteRecordRaw[] = [ | |||
| name: "ruleListMangage.title", | |||
| }, | |||
| }, | |||
| { | |||
| path: "/userManage", | |||
| component: () => import("@/views/userManage/userList.vue"), | |||
| name: "userManage", | |||
| meta: { | |||
| title: "userManage", | |||
| icon: "homepage", | |||
| affix: true, | |||
| name: "ruleListMangage.title", | |||
| }, | |||
| }, | |||
| { | |||
| path: "/userMouldList", | |||
| component: () => import("@/views/userManage/userMouldList.vue"), | |||
| name: "userMouldList", | |||
| meta: { | |||
| title: "userMouldList", | |||
| icon: "homepage", | |||
| affix: true, | |||
| name: "ruleListMangage.title", | |||
| }, | |||
| }, | |||
| { | |||
| path: "/userVoiceList", | |||
| component: () => import("@/views/userManage/userVoiceList.vue"), | |||
| name: "userVoiceList", | |||
| meta: { | |||
| title: "userVoiceList", | |||
| icon: "homepage", | |||
| affix: true, | |||
| name: "ruleListMangage.title", | |||
| }, | |||
| }, | |||
| { | |||
| path: "/rechargeList", | |||
| component: () => import("@/views/userManage/rechargeList.vue"), | |||
| name: "rechargeList", | |||
| meta: { | |||
| title: "rechargeList", | |||
| icon: "homepage", | |||
| affix: true, | |||
| name: "ruleListMangage.title", | |||
| }, | |||
| }, | |||
| { | |||
| path: "/videoList", | |||
| component: () => import("@/views/userManage/videoList.vue"), | |||
| name: "videoList", | |||
| meta: { | |||
| title: "videoList", | |||
| icon: "homepage", | |||
| affix: true, | |||
| name: "ruleListMangage.title", | |||
| }, | |||
| }, | |||
| ], | |||
| } | |||
| ]; | |||
| @@ -8,15 +8,16 @@ export {} | |||
| declare module '@vue/runtime-core' { | |||
| export interface GlobalComponents { | |||
| Breadcrumb: typeof import('./../components/Breadcrumb/index.vue')['default'] | |||
| copy: typeof import('./../components/EditPosition copy.vue')['default'] | |||
| CutImg: typeof import('./../components/cutImg.vue')['default'] | |||
| CutImg1: typeof import('./../components/cutImg1.vue')['default'] | |||
| EditPosition: typeof import('./../components/EditPosition.vue')['default'] | |||
| 'EditPosition copy': typeof import('./../components/EditPosition copy.vue')['default'] | |||
| ElAlert: typeof import('element-plus/es')['ElAlert'] | |||
| ElButton: typeof import('element-plus/es')['ElButton'] | |||
| ElCard: typeof import('element-plus/es')['ElCard'] | |||
| ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] | |||
| ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup'] | |||
| ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] | |||
| ElDialog: typeof import('element-plus/es')['ElDialog'] | |||
| ElDropdown: typeof import('element-plus/es')['ElDropdown'] | |||
| ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] | |||
| @@ -28,11 +29,13 @@ declare module '@vue/runtime-core' { | |||
| ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] | |||
| ElMenu: typeof import('element-plus/es')['ElMenu'] | |||
| ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] | |||
| ElMenuItemGroup: typeof import('element-plus/es')['ElMenuItemGroup'] | |||
| ElOption: typeof import('element-plus/es')['ElOption'] | |||
| ElPagination: typeof import('element-plus/es')['ElPagination'] | |||
| ElRadio: typeof import('element-plus/es')['ElRadio'] | |||
| ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] | |||
| ElSelect: typeof import('element-plus/es')['ElSelect'] | |||
| ElSubMenu: typeof import('element-plus/es')['ElSubMenu'] | |||
| ElSwitch: typeof import('element-plus/es')['ElSwitch'] | |||
| ElTable: typeof import('element-plus/es')['ElTable'] | |||
| ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] | |||
| @@ -0,0 +1,87 @@ | |||
| <template> | |||
| <div> | |||
| <el-checkbox-group v-model="checkboxGroup" size="small" class="checkbox"> | |||
| <el-checkbox v-for="(item, index) in tableData" :key="index" :label="item.id" border> | |||
| <img :src="item.coverImg" width="50" /> | |||
| <p>{{ item.title }}</p> | |||
| </el-checkbox> | |||
| </el-checkbox-group> | |||
| <div style="margin-top: 20px"> | |||
| <el-button @click="handleClose" | |||
| >取消</el-button | |||
| > | |||
| <el-button type="primary" @click="addModel()">确认关联</el-button> | |||
| </div> | |||
| </div> | |||
| </template> | |||
| <script setup> | |||
| import { ref } from 'vue' | |||
| import { personMouldListApi, userPersonMouldIdListApi, associatedUserMouldsApi } from '@/apis/userManage.js' | |||
| import dayjs from "dayjs"; | |||
| const emit = defineEmits(["close"]); | |||
| const props = defineProps({ | |||
| serviceId: { | |||
| required: true, | |||
| } | |||
| }); | |||
| const getDate = (val) => { | |||
| return dayjs(val).format("YYYY-MM-DD"); | |||
| }; | |||
| const checkboxGroup = ref([]) | |||
| const total = ref(0); | |||
| const tableData = ref([]); | |||
| const modelAllListFunc = async () => { | |||
| try { | |||
| const res = await personMouldListApi(1, 10000); | |||
| const modelIds = await userPersonMouldIdListApi(props.serviceId); | |||
| tableData.value = res.data.list; | |||
| total.value = res.data.total * 1; | |||
| setTimeout(()=> { | |||
| if(modelIds.data && modelIds.data.length > 0) { | |||
| modelIds.data.forEach((item) => { | |||
| checkboxGroup.value.push(item) | |||
| }) | |||
| } | |||
| }, 500) | |||
| } catch (error) { | |||
| console.log(error, "err"); | |||
| } | |||
| }; | |||
| const addModel = async () => { | |||
| const data = { | |||
| mouldIds: checkboxGroup.value, | |||
| cUserId: props.serviceId | |||
| } | |||
| const res = await associatedUserMouldsApi(data); | |||
| if(res.code === 200) { | |||
| ElMessage.success("关联成功!"); | |||
| handleClose() | |||
| } | |||
| }; | |||
| function handleClose() { | |||
| emit("close"); | |||
| } | |||
| onMounted(() => { | |||
| modelAllListFunc(1, 10); | |||
| }); | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .checkbox { | |||
| max-height: 500px; | |||
| overflow: auto; | |||
| :deep .el-checkbox.el-checkbox--small { | |||
| width: 110px; | |||
| height:110px; | |||
| margin-bottom: 10px; | |||
| } | |||
| } | |||
| </style> | |||
| @@ -0,0 +1,189 @@ | |||
| <template> | |||
| <div class="page justify-around"> | |||
| <div class="addbtn"> | |||
| <el-form :inline="true" :model="formInline" class="demo-form-inline"> | |||
| <el-form-item label="手机号"> | |||
| <el-input v-model="formInline.phone" placeholder="请输入手机号" clearable /> | |||
| </el-form-item> | |||
| <el-form-item label="商品名"> | |||
| <el-input v-model="formInline.mouldSmIdLike" placeholder="请输入模版号" clearable /> | |||
| </el-form-item> | |||
| <el-form-item label="充值时间段"> | |||
| <el-date-picker | |||
| v-model="formInline.time" | |||
| type="daterange" | |||
| range-separator="To" | |||
| start-placeholder="Start date" | |||
| end-placeholder="End date" | |||
| /> | |||
| </el-form-item> | |||
| <el-form-item> | |||
| <el-button type="primary" @click="getListData"><el-icon><i-ep-plus /></el-icon> 查询</el-button> | |||
| </el-form-item> | |||
| </el-form> | |||
| </div> | |||
| <el-table | |||
| :data="tableData" | |||
| style="width: 100%; height: 90%" | |||
| size="large" | |||
| align="center" | |||
| border | |||
| > | |||
| <el-table-column | |||
| prop="name" | |||
| label="订单号" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="address" | |||
| label="商品名称" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="address" | |||
| label="支付方式" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="address" | |||
| label="支付金额" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="address" | |||
| label="手机号" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="createDate" | |||
| label="创建时间" | |||
| align="center" | |||
| > | |||
| <template #default="scope"> | |||
| {{ getDate(scope.row.createDate) }} | |||
| </template> | |||
| </el-table-column> | |||
| </el-table> | |||
| <!-- 登录账号 --> | |||
| <div class="pagination"> | |||
| <el-pagination | |||
| v-model:current-page="pageNum" | |||
| v-model:page-size="pageSize" | |||
| :page-sizes="[10, 50, 100]" | |||
| :small="false" | |||
| :disabled="false" | |||
| :background="true" | |||
| layout="total, sizes, prev, pager, next, jumper" | |||
| :total="total" | |||
| @size-change="handleSizeChange" | |||
| @current-change="handleCurrentChange" | |||
| /> | |||
| </div> | |||
| </div> | |||
| </template> | |||
| <!-- videoType==1为竖,==2为横 --> | |||
| <script setup> | |||
| //#region 导入 | |||
| import { rechargeListApi } from '@/apis/userManage.js' | |||
| import { useI18n } from "vue-i18n"; | |||
| import dayjs from "dayjs"; | |||
| import { useRoute, useRouter } from "vue-router"; | |||
| const route = useRoute(); | |||
| const router = useRouter(); | |||
| const { locale } = useI18n(); | |||
| const lanChange = ref(locale); | |||
| const tableData = ref([]); | |||
| const pageNum = ref(1); | |||
| const pageSize = ref(10); | |||
| const total = ref(0); | |||
| const getDate = (val) => { | |||
| return dayjs(val).format("YYYY-MM-DD"); | |||
| }; | |||
| const handleSizeChange = (val) => { | |||
| pageSize.value = val; | |||
| getListData(pageNum.value, pageSize.value); | |||
| }; | |||
| const handleCurrentChange = (val) => { | |||
| pageNum.value = val; | |||
| getListData(pageNum.value, pageSize.value); | |||
| }; | |||
| const formInline = ref({ | |||
| phone: '', | |||
| productTitle: '', | |||
| time: '' | |||
| }) | |||
| const getListData = async (PageNum, PageSize) => { | |||
| try { | |||
| let data = { | |||
| PageNum: PageNum || 1, | |||
| PageSize: PageSize || 10, | |||
| phone: formInline.phone, | |||
| projectType: 2, | |||
| productTitle: formInline.productTitle, | |||
| startDate: formInline.time ? formInline.time[0] : '', | |||
| endDate: formInline.time ? formInline.time[1] : '', | |||
| } | |||
| const res = await rechargeListApi(data); | |||
| tableData.value = res.data.list; | |||
| total.value = res.data.total * 1; | |||
| } catch (error) { | |||
| console.log(error, "err"); | |||
| } | |||
| }; | |||
| onMounted(() => { | |||
| getListData(1, 10); | |||
| }); | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .page { | |||
| height: calc(100vh - 80px); | |||
| // height: calc(100vh - 80px); | |||
| background-color: #ffffff; | |||
| border-radius: 30px 0 0 0; | |||
| overflow: hidden; | |||
| padding: 10vh; | |||
| .addbtn { | |||
| margin-bottom: 2vh; | |||
| } | |||
| .formData { | |||
| padding: 5vh 3vh; | |||
| } | |||
| .pagination { | |||
| position: fixed; | |||
| left: 55%; | |||
| bottom: 8vh; | |||
| transform: translateX(-50%); | |||
| border-radius: 5px; | |||
| padding: 10px 20px; | |||
| z-index: 99; | |||
| transition: all 0.3s; | |||
| cursor: pointer; | |||
| &:hover { | |||
| background-color: #b8b8b873; | |||
| } | |||
| } | |||
| } | |||
| </style> | |||
| @@ -0,0 +1,222 @@ | |||
| <template> | |||
| <div class="page justify-around"> | |||
| <div class="addbtn"> | |||
| <el-form :inline="true" :model="formInline" class="demo-form-inline"> | |||
| <el-form-item label="手机号"> | |||
| <el-input v-model="formInline.phone" placeholder="请输入手机号" clearable /> | |||
| </el-form-item> | |||
| <el-form-item> | |||
| <el-button type="primary" @click="dialogVisible = true"><el-icon><i-ep-plus /></el-icon> 新增</el-button> | |||
| </el-form-item> | |||
| </el-form> | |||
| </div> | |||
| <el-table | |||
| :data="tableData" | |||
| style="width: 100%; height: 90%" | |||
| size="large" | |||
| align="center" | |||
| border | |||
| > | |||
| <el-table-column | |||
| prop="name" | |||
| label="用户ID" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="address" | |||
| label="手机号" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="createDate" | |||
| label="注册时间" | |||
| align="center" | |||
| > | |||
| <template #default="scope"> | |||
| {{ getDate(scope.row.createDate) }} | |||
| </template> | |||
| </el-table-column> | |||
| <el-table-column | |||
| prop="poins" | |||
| label="当前币值" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| fixed="right" | |||
| :label="$t('keyMangage.operations')" | |||
| width="400" | |||
| align="center" | |||
| > | |||
| <template #default="scope"> | |||
| <el-button link type="primary" size="small" @click="showDetail(scope.row.id)">查看</el-button> | |||
| <el-button link type="primary" size="small" @click="rechargeDetail(scope.row)">查看充值记录</el-button> | |||
| <el-button link type="primary" size="small" @click="videoDetail(scope.row)"> 查看视频列表</el-button> | |||
| </template> | |||
| </el-table-column> | |||
| </el-table> | |||
| <!-- 登录账号 --> | |||
| <div class="pagination"> | |||
| <el-pagination | |||
| v-model:current-page="pageNum" | |||
| v-model:page-size="pageSize" | |||
| :page-sizes="[10, 50, 100]" | |||
| :small="false" | |||
| :disabled="false" | |||
| :background="true" | |||
| layout="total, sizes, prev, pager, next, jumper" | |||
| :total="total" | |||
| @size-change="handleSizeChange" | |||
| @current-change="handleCurrentChange" | |||
| /> | |||
| </div> | |||
| <el-dialog v-model="detailDialogVisible" v-if="detailDialogVisible" title="查看详情" width="60%" :before-close="handleClose" > | |||
| <el-form :model="form" label-width="120px"> | |||
| <el-form-item label="用户ID"> | |||
| <el-input v-model="form.name" /> | |||
| </el-form-item> | |||
| <el-form-item label="手机号"> | |||
| <el-input v-model="form.phone" /> | |||
| </el-form-item> | |||
| <el-form-item> | |||
| <el-button type="primary" @click="onSubmit">Create</el-button> | |||
| <el-button>Cancel</el-button> | |||
| </el-form-item> | |||
| </el-form> | |||
| </el-dialog> | |||
| </div> | |||
| </template> | |||
| <!-- videoType==1为竖,==2为横 --> | |||
| <script setup> | |||
| //#region 导入 | |||
| import { userListApi, userListFindByIdApi } from '@/apis/userManage.js' | |||
| import { useI18n } from "vue-i18n"; | |||
| import dayjs from "dayjs"; | |||
| import { useRoute, useRouter } from "vue-router"; | |||
| const route = useRoute(); | |||
| const router = useRouter(); | |||
| const { locale } = useI18n(); | |||
| const lanChange = ref(locale); | |||
| const tableData = ref([]); | |||
| const dialogVisible = ref(false); | |||
| const rechargeDetail = (item) => { | |||
| router.push({ | |||
| path: "/rechargeList", | |||
| query: { | |||
| phone: item.phone | |||
| }, | |||
| }); | |||
| }; | |||
| const videoDetail = (item) => { | |||
| router.push({ | |||
| path: "/videoList", | |||
| query: { | |||
| phone: item.phone | |||
| }, | |||
| }); | |||
| }; | |||
| const pageNum = ref(1); | |||
| const pageSize = ref(10); | |||
| const total = ref(0); | |||
| const getDate = (val) => { | |||
| return dayjs(val).format("YYYY-MM-DD"); | |||
| }; | |||
| const handleSizeChange = (val) => { | |||
| pageSize.value = val; | |||
| getListData(pageNum.value, pageSize.value); | |||
| }; | |||
| const handleCurrentChange = (val) => { | |||
| pageNum.value = val; | |||
| getListData(pageNum.value, pageSize.value); | |||
| }; | |||
| const formInline = ref({ | |||
| phone: '' | |||
| }) | |||
| const getListData = async (PageNum, PageSize) => { | |||
| try { | |||
| let data = { | |||
| PageNum: PageNum, | |||
| PageSize: PageSize, | |||
| phone: formInline.phone | |||
| } | |||
| const res = await userListApi(data); | |||
| console.log(res, "res"); | |||
| tableData.value = res.data.list; | |||
| total.value = res.data.total * 1; | |||
| } catch (error) { | |||
| console.log(error, "err"); | |||
| } | |||
| }; | |||
| const form = ref({ | |||
| name: '', | |||
| phone: '' | |||
| }) | |||
| const detailDialogVisible = ref(false) | |||
| function showDetail(id) { | |||
| userListFindByIdApi(id).then(res => { | |||
| detailDialogVisible.value = true | |||
| form.value = res.data | |||
| }) | |||
| } | |||
| function handleClose() { | |||
| detailDialogVisible.value = false | |||
| } | |||
| onMounted(() => { | |||
| getListData(1, 10); | |||
| }); | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .page { | |||
| height: calc(100vh - 80px); | |||
| // height: calc(100vh - 80px); | |||
| background-color: #ffffff; | |||
| border-radius: 30px 0 0 0; | |||
| overflow: hidden; | |||
| padding: 10vh; | |||
| .addbtn { | |||
| margin-bottom: 2vh; | |||
| } | |||
| .formData { | |||
| padding: 5vh 3vh; | |||
| } | |||
| .pagination { | |||
| position: fixed; | |||
| left: 55%; | |||
| bottom: 8vh; | |||
| transform: translateX(-50%); | |||
| border-radius: 5px; | |||
| padding: 10px 20px; | |||
| z-index: 99; | |||
| transition: all 0.3s; | |||
| cursor: pointer; | |||
| &:hover { | |||
| background-color: #b8b8b873; | |||
| } | |||
| } | |||
| } | |||
| </style> | |||
| @@ -0,0 +1,161 @@ | |||
| <template> | |||
| <div class="page justify-around"> | |||
| <div class="addbtn"> | |||
| <el-form :inline="true" :model="formInline" class="demo-form-inline"> | |||
| <el-form-item label="手机号"> | |||
| <el-input v-model="formInline.phone" placeholder="请输入手机号" clearable /> | |||
| </el-form-item> | |||
| <el-form-item label="模版号"> | |||
| <el-input v-model="formInline.mouldSmIdLike" placeholder="请输入模版号" clearable /> | |||
| </el-form-item> | |||
| <el-form-item> | |||
| <el-button type="primary" @click="getListData"><el-icon><i-ep-plus /></el-icon> 查询</el-button> | |||
| </el-form-item> | |||
| </el-form> | |||
| </div> | |||
| <el-table | |||
| :data="tableData" | |||
| style="width: 100%; height: 90%" | |||
| size="large" | |||
| align="center" | |||
| border | |||
| > | |||
| <el-table-column | |||
| prop="name" | |||
| label="模板信息" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="address" | |||
| label="手机号" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="createDate" | |||
| label="注册时间" | |||
| align="center" | |||
| > | |||
| <template #default="scope"> | |||
| {{ getDate(scope.row.createDate) }} | |||
| </template> | |||
| </el-table-column> | |||
| </el-table> | |||
| <!-- 登录账号 --> | |||
| <div class="pagination"> | |||
| <el-pagination | |||
| v-model:current-page="pageNum" | |||
| v-model:page-size="pageSize" | |||
| :page-sizes="[10, 50, 100]" | |||
| :small="false" | |||
| :disabled="false" | |||
| :background="true" | |||
| layout="total, sizes, prev, pager, next, jumper" | |||
| :total="total" | |||
| @size-change="handleSizeChange" | |||
| @current-change="handleCurrentChange" | |||
| /> | |||
| </div> | |||
| </div> | |||
| </template> | |||
| <!-- videoType==1为竖,==2为横 --> | |||
| <script setup> | |||
| //#region 导入 | |||
| import { userMouldListApi } from '@/apis/userManage.js' | |||
| import { useI18n } from "vue-i18n"; | |||
| import dayjs from "dayjs"; | |||
| import { useRoute, useRouter } from "vue-router"; | |||
| const route = useRoute(); | |||
| const router = useRouter(); | |||
| const { locale } = useI18n(); | |||
| const lanChange = ref(locale); | |||
| const tableData = ref([]); | |||
| const pageNum = ref(1); | |||
| const pageSize = ref(10); | |||
| const total = ref(0); | |||
| const getDate = (val) => { | |||
| return dayjs(val).format("YYYY-MM-DD"); | |||
| }; | |||
| const handleSizeChange = (val) => { | |||
| pageSize.value = val; | |||
| getListData(pageNum.value, pageSize.value); | |||
| }; | |||
| const handleCurrentChange = (val) => { | |||
| pageNum.value = val; | |||
| getListData(pageNum.value, pageSize.value); | |||
| }; | |||
| const formInline = ref({ | |||
| phone: '', | |||
| mouldSmIdLike: '' | |||
| }) | |||
| const getListData = async (PageNum, PageSize) => { | |||
| try { | |||
| let data = { | |||
| PageNum: PageNum || 1, | |||
| PageSize: PageSize || 10, | |||
| phone: formInline.phone, | |||
| mouldSmIdLike: formInline.mouldSmIdLike | |||
| } | |||
| const res = await userMouldListApi(data); | |||
| console.log(res, "res"); | |||
| tableData.value = res.data.list; | |||
| total.value = res.data.total * 1; | |||
| } catch (error) { | |||
| console.log(error, "err"); | |||
| } | |||
| }; | |||
| onMounted(() => { | |||
| getListData(1, 10); | |||
| }); | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .page { | |||
| height: calc(100vh - 80px); | |||
| // height: calc(100vh - 80px); | |||
| background-color: #ffffff; | |||
| border-radius: 30px 0 0 0; | |||
| overflow: hidden; | |||
| padding: 10vh; | |||
| .addbtn { | |||
| margin-bottom: 2vh; | |||
| } | |||
| .formData { | |||
| padding: 5vh 3vh; | |||
| } | |||
| .pagination { | |||
| position: fixed; | |||
| left: 55%; | |||
| bottom: 8vh; | |||
| transform: translateX(-50%); | |||
| border-radius: 5px; | |||
| padding: 10px 20px; | |||
| z-index: 99; | |||
| transition: all 0.3s; | |||
| cursor: pointer; | |||
| &:hover { | |||
| background-color: #b8b8b873; | |||
| } | |||
| } | |||
| } | |||
| </style> | |||
| @@ -0,0 +1,160 @@ | |||
| <template> | |||
| <div class="page justify-around"> | |||
| <div class="addbtn"> | |||
| <el-form :inline="true" :model="formInline" class="demo-form-inline"> | |||
| <el-form-item label="手机号"> | |||
| <el-input v-model="formInline.phone" placeholder="请输入手机号" clearable /> | |||
| </el-form-item> | |||
| <el-form-item label="模版号"> | |||
| <el-input v-model="formInline.mouldSmIdLike" placeholder="请输入模版号" clearable /> | |||
| </el-form-item> | |||
| <el-form-item> | |||
| <el-button type="primary" @click="getListData"><el-icon><i-ep-plus /></el-icon> 查询</el-button> | |||
| </el-form-item> | |||
| </el-form> | |||
| </div> | |||
| <el-table | |||
| :data="tableData" | |||
| style="width: 100%; height: 90%" | |||
| size="large" | |||
| align="center" | |||
| border | |||
| > | |||
| <el-table-column | |||
| prop="name" | |||
| label="声纹信息" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="address" | |||
| label="手机号" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="createDate" | |||
| label="注册时间" | |||
| align="center" | |||
| > | |||
| <template #default="scope"> | |||
| {{ getDate(scope.row.createDate) }} | |||
| </template> | |||
| </el-table-column> | |||
| </el-table> | |||
| <!-- 登录账号 --> | |||
| <div class="pagination"> | |||
| <el-pagination | |||
| v-model:current-page="pageNum" | |||
| v-model:page-size="pageSize" | |||
| :page-sizes="[10, 50, 100]" | |||
| :small="false" | |||
| :disabled="false" | |||
| :background="true" | |||
| layout="total, sizes, prev, pager, next, jumper" | |||
| :total="total" | |||
| @size-change="handleSizeChange" | |||
| @current-change="handleCurrentChange" | |||
| /> | |||
| </div> | |||
| </div> | |||
| </template> | |||
| <!-- videoType==1为竖,==2为横 --> | |||
| <script setup> | |||
| //#region 导入 | |||
| import { userVoiceListAPi } from '@/apis/userManage.js' | |||
| import { useI18n } from "vue-i18n"; | |||
| import dayjs from "dayjs"; | |||
| import { useRoute, useRouter } from "vue-router"; | |||
| const route = useRoute(); | |||
| const router = useRouter(); | |||
| const { locale } = useI18n(); | |||
| const lanChange = ref(locale); | |||
| const tableData = ref([]); | |||
| const pageNum = ref(1); | |||
| const pageSize = ref(10); | |||
| const total = ref(0); | |||
| const getDate = (val) => { | |||
| return dayjs(val).format("YYYY-MM-DD"); | |||
| }; | |||
| const handleSizeChange = (val) => { | |||
| pageSize.value = val; | |||
| getListData(pageNum.value, pageSize.value); | |||
| }; | |||
| const handleCurrentChange = (val) => { | |||
| pageNum.value = val; | |||
| getListData(pageNum.value, pageSize.value); | |||
| }; | |||
| const formInline = ref({ | |||
| phone: '', | |||
| mouldSmIdLike: '' | |||
| }) | |||
| const getListData = async (PageNum, PageSize) => { | |||
| try { | |||
| let data = { | |||
| PageNum: PageNum || 1, | |||
| PageSize: PageSize || 10, | |||
| phone: formInline.phone, | |||
| mouldSmIdLike: formInline.mouldSmIdLike | |||
| } | |||
| const res = await userVoiceListAPi(data); | |||
| console.log(res, "res"); | |||
| tableData.value = res.data.list; | |||
| total.value = res.data.total * 1; | |||
| } catch (error) { | |||
| console.log(error, "err"); | |||
| } | |||
| }; | |||
| onMounted(() => { | |||
| getListData(1, 10); | |||
| }); | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .page { | |||
| height: calc(100vh - 80px); | |||
| // height: calc(100vh - 80px); | |||
| background-color: #ffffff; | |||
| border-radius: 30px 0 0 0; | |||
| overflow: hidden; | |||
| padding: 10vh; | |||
| .addbtn { | |||
| margin-bottom: 2vh; | |||
| } | |||
| .formData { | |||
| padding: 5vh 3vh; | |||
| } | |||
| .pagination { | |||
| position: fixed; | |||
| left: 55%; | |||
| bottom: 8vh; | |||
| transform: translateX(-50%); | |||
| border-radius: 5px; | |||
| padding: 10px 20px; | |||
| z-index: 99; | |||
| transition: all 0.3s; | |||
| cursor: pointer; | |||
| &:hover { | |||
| background-color: #b8b8b873; | |||
| } | |||
| } | |||
| } | |||
| </style> | |||
| @@ -0,0 +1,262 @@ | |||
| <template> | |||
| <div class="page justify-around"> | |||
| <div class="addbtn"> | |||
| <el-form :inline="true" :model="formInline" class="demo-form-inline"> | |||
| <el-form-item label="手机号"> | |||
| <el-input v-model="formInline.phone" placeholder="请输入手机号" clearable /> | |||
| </el-form-item> | |||
| <el-form-item label="文本"> | |||
| <el-input v-model="formInline.paperwork" placeholder="请输入模版号" clearable /> | |||
| </el-form-item> | |||
| <el-form-item label="类型"> | |||
| <el-select | |||
| v-model="formInline.videoType" | |||
| placeholder="请选择类型" | |||
| clearable | |||
| > | |||
| <el-option label="竖版" value="1" /> | |||
| <el-option label="横板" value="2" /> | |||
| </el-select> | |||
| </el-form-item> | |||
| <el-form-item label="状态"> | |||
| <el-select | |||
| v-model="formInline.isDel" | |||
| placeholder="请选择状态" | |||
| clearable | |||
| > | |||
| <el-option label="未删除" value="0" /> | |||
| <el-option label="已删除" value="1" /> | |||
| </el-select> | |||
| </el-form-item> | |||
| <el-form-item label="创建时间段"> | |||
| <el-date-picker | |||
| v-model="formInline.time" | |||
| type="daterange" | |||
| range-separator="To" | |||
| start-placeholder="Start date" | |||
| end-placeholder="End date" | |||
| /> | |||
| </el-form-item> | |||
| <el-form-item> | |||
| <el-button type="primary" @click="getListData"><el-icon><i-ep-plus /></el-icon> 查询</el-button> | |||
| </el-form-item> | |||
| </el-form> | |||
| </div> | |||
| <el-table | |||
| :data="tableData" | |||
| style="width: 100%; height: 90%" | |||
| size="large" | |||
| align="center" | |||
| border | |||
| > | |||
| <el-table-column | |||
| prop="name" | |||
| label="类型" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="paperwork" | |||
| label="文本内容" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="address" | |||
| label="状态" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="title" | |||
| label="视频标题" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="coverImg" | |||
| label="封面图" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="videoPlayUrl" | |||
| label="视频地址" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="videoTime" | |||
| label="视频时长" | |||
| align="center" | |||
| > | |||
| <template #default="scope"> | |||
| {{ getDate(scope.row.videoTime) }} | |||
| </template> | |||
| </el-table-column> | |||
| <el-table-column | |||
| prop="videoSize" | |||
| label="视频大小" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="videoMsg" | |||
| label="视频生成信息" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="costPoints" | |||
| label="消耗金币" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="costPointsDetail" | |||
| label="消耗金币明细" | |||
| align="center" | |||
| /> | |||
| <el-table-column | |||
| prop="createDate" | |||
| label="创建时间" | |||
| align="center" | |||
| > | |||
| <template #default="scope"> | |||
| {{ getDate(scope.row.createDate) }} | |||
| </template> | |||
| </el-table-column> | |||
| <el-table-column | |||
| fixed="right" | |||
| :label="$t('keyMangage.operations')" | |||
| width="400" | |||
| align="center" | |||
| > | |||
| <template #default="scope"> | |||
| <el-button link type="primary" size="small" @click="showDetail(scope.row.id)">查看</el-button> | |||
| <el-button link type="primary" size="small" @click="confirmDel(scope.row.id)">删除</el-button> | |||
| </template> | |||
| </el-table-column> | |||
| </el-table> | |||
| <!-- 登录账号 --> | |||
| <div class="pagination"> | |||
| <el-pagination | |||
| v-model:current-page="pageNum" | |||
| v-model:page-size="pageSize" | |||
| :page-sizes="[10, 50, 100]" | |||
| :small="false" | |||
| :disabled="false" | |||
| :background="true" | |||
| layout="total, sizes, prev, pager, next, jumper" | |||
| :total="total" | |||
| @size-change="handleSizeChange" | |||
| @current-change="handleCurrentChange" | |||
| /> | |||
| </div> | |||
| </div> | |||
| </template> | |||
| <script setup> | |||
| //#region 导入 | |||
| import { videoListApi, videoListFindByIdApi, videoListDelApi } from '@/apis/userManage.js' | |||
| import { useI18n } from "vue-i18n"; | |||
| import dayjs from "dayjs"; | |||
| import { useRoute, useRouter } from "vue-router"; | |||
| const route = useRoute(); | |||
| const router = useRouter(); | |||
| const { locale } = useI18n(); | |||
| const lanChange = ref(locale); | |||
| const tableData = ref([]); | |||
| const pageNum = ref(1); | |||
| const pageSize = ref(10); | |||
| const total = ref(0); | |||
| const getDate = (val) => { | |||
| return dayjs(val).format("YYYY-MM-DD HH:mm:ss"); | |||
| }; | |||
| const handleSizeChange = (val) => { | |||
| pageSize.value = val; | |||
| getListData(pageNum.value, pageSize.value); | |||
| }; | |||
| const handleCurrentChange = (val) => { | |||
| pageNum.value = val; | |||
| getListData(pageNum.value, pageSize.value); | |||
| }; | |||
| const formInline = ref({ | |||
| phone: '', | |||
| productTitle: '', | |||
| time: '' | |||
| }) | |||
| const getListData = async (PageNum, PageSize) => { | |||
| try { | |||
| let data = { | |||
| PageNum: PageNum || 1, | |||
| PageSize: PageSize || 10, | |||
| phone: formInline.phone, | |||
| projectType: 2, | |||
| productTitle: formInline.productTitle, | |||
| startDate: formInline.time ? formInline.time[0] : '', | |||
| endDate: formInline.time ? formInline.time[1] : '', | |||
| id: route.query.id || '' | |||
| } | |||
| const res = await videoListApi(data); | |||
| tableData.value = res.data.list; | |||
| total.value = res.data.total * 1; | |||
| } catch (error) { | |||
| console.log(error, "err"); | |||
| } | |||
| }; | |||
| function confirmDel(id) { | |||
| ElMessageBox.confirm('你确定要删除吗?').then(() => { | |||
| videoListDelApi(id).then(res => { | |||
| debugger | |||
| }) | |||
| done() | |||
| }).catch(() => { | |||
| // catch error | |||
| }) | |||
| } | |||
| onMounted(() => { | |||
| getListData(1, 10); | |||
| }); | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .page { | |||
| height: calc(100vh - 80px); | |||
| // height: calc(100vh - 80px); | |||
| background-color: #ffffff; | |||
| border-radius: 30px 0 0 0; | |||
| overflow: hidden; | |||
| padding: 10vh; | |||
| .addbtn { | |||
| margin-bottom: 2vh; | |||
| } | |||
| .formData { | |||
| padding: 5vh 3vh; | |||
| } | |||
| .pagination { | |||
| position: fixed; | |||
| left: 55%; | |||
| bottom: 8vh; | |||
| transform: translateX(-50%); | |||
| border-radius: 5px; | |||
| padding: 10px 20px; | |||
| z-index: 99; | |||
| transition: all 0.3s; | |||
| cursor: pointer; | |||
| &:hover { | |||
| background-color: #b8b8b873; | |||
| } | |||
| } | |||
| } | |||
| </style> | |||
| @@ -0,0 +1,87 @@ | |||
| <template> | |||
| <div> | |||
| <el-checkbox-group v-model="checkboxGroup" size="small" class="checkbox"> | |||
| <el-checkbox v-for="(item, index) in tableData" :key="index" :label="item.id" border> | |||
| <img :src="item.coverImg" width="50" /> | |||
| <p>{{ item.title }}</p> | |||
| </el-checkbox> | |||
| </el-checkbox-group> | |||
| <div style="margin-top: 20px"> | |||
| <el-button @click="handleClose" | |||
| >取消</el-button | |||
| > | |||
| <el-button type="primary" @click="addModel()">确认关联</el-button> | |||
| </div> | |||
| </div> | |||
| </template> | |||
| <script setup> | |||
| import { ref } from 'vue' | |||
| import { voiceMouldListApi, userVoiceIdListApi, associatedUserVoicesApi } from '@/apis/userManage.js' | |||
| import dayjs from "dayjs"; | |||
| const emit = defineEmits(["close"]); | |||
| const props = defineProps({ | |||
| serviceId: { | |||
| required: true, | |||
| } | |||
| }); | |||
| const getDate = (val) => { | |||
| return dayjs(val).format("YYYY-MM-DD"); | |||
| }; | |||
| const checkboxGroup = ref([]) | |||
| const total = ref(0); | |||
| const tableData = ref([]); | |||
| const modelAllListFunc = async () => { | |||
| try { | |||
| const res = await voiceMouldListApi(1, 10000); | |||
| const modelIds = await userVoiceIdListApi(props.serviceId); | |||
| tableData.value = res.data.list; | |||
| total.value = res.data.total * 1; | |||
| setTimeout(()=> { | |||
| if(modelIds.data && modelIds.data.length > 0) { | |||
| modelIds.data.forEach((item) => { | |||
| checkboxGroup.value.push(item) | |||
| }) | |||
| } | |||
| }, 500) | |||
| } catch (error) { | |||
| console.log(error, "err"); | |||
| } | |||
| }; | |||
| const addModel = async () => { | |||
| const data = { | |||
| mouldIds: checkboxGroup.value, | |||
| cUserId: props.serviceId | |||
| } | |||
| const res = await associatedUserVoicesApi(data); | |||
| if(res.code === 200) { | |||
| ElMessage.success("关联成功!"); | |||
| handleClose() | |||
| } | |||
| }; | |||
| function handleClose() { | |||
| emit("close"); | |||
| } | |||
| onMounted(() => { | |||
| modelAllListFunc(1, 10); | |||
| }); | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .checkbox { | |||
| max-height: 500px; | |||
| overflow: auto; | |||
| :deep .el-checkbox.el-checkbox--small { | |||
| width: 110px; | |||
| height:110px; | |||
| margin-bottom: 10px; | |||
| } | |||
| } | |||
| </style> | |||
| @@ -1,6 +1,6 @@ | |||
| <template> | |||
| <div class="page justify-around"> | |||
| <el-alert :title="`已消耗总时长:${crrentVideoToal}`" type="success" :closable="false" /> | |||
| <el-table | |||
| :data="tableData" | |||
| style="width: 100%; height: 90%" | |||
| @@ -36,6 +36,17 @@ | |||
| {{ getDate(scope.row.createTime) }} | |||
| </template> | |||
| </el-table-column> | |||
| <el-table-column | |||
| fixed="right" | |||
| :label="$t('keyMangage.operations')" | |||
| width="400" | |||
| align="center" | |||
| > | |||
| <template #default="scope"> | |||
| <el-button link type="primary" size="small" @click="showDetail(scope.row.id)">查看视频详情</el-button> | |||
| </template> | |||
| </el-table-column> | |||
| </el-table> | |||
| <div class="pagination"> | |||
| @@ -58,7 +69,7 @@ | |||
| <!-- videoType==1为竖,==2为横 --> | |||
| <script setup> | |||
| //#region 导入 | |||
| import { videoListApi } from '@/apis/home.js' | |||
| import { videoListApi,currentVideoToalApi } from '@/apis/home.js' | |||
| import { useI18n } from "vue-i18n"; | |||
| @@ -78,6 +89,16 @@ | |||
| const getDate = (val) => { | |||
| return dayjs(Number(val)).format("YYYY-MM-DD HH:mm:ss"); | |||
| }; | |||
| // 跳转视频列表 | |||
| const showDetail = (id) => { | |||
| router.push({ | |||
| path: "/videoList", | |||
| query: { | |||
| id, | |||
| }, | |||
| }); | |||
| }; | |||
| const handleSizeChange = (val) => { | |||
| pageSize.value = val; | |||
| @@ -109,7 +130,14 @@ | |||
| }, | |||
| }); | |||
| } | |||
| const crrentVideoToal = ref('') | |||
| function getCrrentVideoToal() { | |||
| currentVideoToalApi().then(res => { | |||
| // TODO | |||
| }) | |||
| } | |||
| onMounted(() => { | |||
| getCrrentVideoToal() | |||
| getBusinessListFunc(1, 10); | |||
| }); | |||
| </script> | |||