学员详情;市场管理;

This commit is contained in:
axlrose2333 2023-03-21 15:00:24 +08:00
parent 31bd50111e
commit 35fc9df240
14 changed files with 222 additions and 123 deletions

View File

@ -3,6 +3,7 @@ VITE_CLI_PORT = 8088
VITE_SERVER_PORT = 8888
VITE_BASE_API = /api
VITE_BASE_PATH = http://192.168.1.133
//VITE_BASE_PATH = https://admin.api.gwkjxb.com
VITE_EDITOR = vscode
// VITE_EDITOR = webstorm 如果使用webstorm开发且要使用dom定位到代码行功能 请先自定添加 webstorm到环境变量 再将VITE_EDITOR值修改为webstorm
// 如果使用docker-compose开发模式设置为下面的地址或本机主机IP

View File

@ -54,7 +54,7 @@ const api = {
editDrawData: data => { // 编辑竞拍
return service({
url: '/lottery',
method: 'post',
method: 'put',
data
})
},

View File

@ -16,8 +16,37 @@ const api = {
},
getDealMoneyList: data => { // 获取资金交易明细
return service({
url: '/user/'+data.id,
method: 'get'
url: '/wallet/log/'+data.id,
method: 'get',
params:data
})
},
getDealPointList: data => { // 获取积分交易明细
return service({
url: '/point/log/'+data.id,
method: 'get',
params:data
})
},
getLearningDetailList: data => { // 获取学习记录
return service({
url: '/user/study/record/'+data.id,
method: 'get',
params:data
})
},
getLearningDetailReport:data => { // 获取学习报告
return service({
url: '/user/study/report/'+data.id,
method: 'get',
params:data
})
},
getTestDetailList: data => { // 获取测试记录
return service({
url: '/exam/record/'+data.id,
method: 'get',
params:data
})
}
}

View File

@ -130,6 +130,45 @@ const custom = {
else{
return num/flag+'万'
}
},
getDealType() { // 获取交易类型
return [
{
name:'课程',
value:1
},
{
name:'试卷',
value:4
},{
name:'邀请',
value:7
},{
name:'提现',
value:8
},{
name:'助教',
value:9
},{
name:'助教下学员购买试卷',
value:10
},{
name:'助教下学员购买课程',
value:11
},{
name:'助教下老师卖出试卷',
value:12
},{
name:'助教下老师卖出课程',
value:13
},{
name:'域内 课程',
value:15
},{
name:'域内 试卷',
value:16
}
]
}
}
export default custom

View File

@ -33,9 +33,12 @@ const dealTypeList = ref([
value:2
},
])
const deal_types = ref([])
//
onMounted(() => {
// getDealMoneyList()
queryParams.value.id = parseInt(route.params.user_id)
deal_types.value = custom.getDealType()
getDealMoneyList()
})
//
async function getDealMoneyList() {
@ -43,6 +46,7 @@ async function getDealMoneyList() {
if(res.code === 0) {
tableData.value = res.data.records
total.value = res.data.total
console.log(res.data)
}
}
function onSubmit() {
@ -64,6 +68,11 @@ function handleSizeChange(val) {
queryParams.value.pageSize = val
getDealMoneyList()
}
function getTypeName(type) {
return deal_types.value.filter((item,i) => {
return item.value == type
})[0].name
}
</script>
<template>
<div>
@ -71,25 +80,25 @@ function handleSizeChange(val) {
<div class="gva-search-box">
<el-form ref="searchForm" :inline="true" :model="queryParams">
<el-form-item label="交易类别">
<el-select v-model="queryParams.subject" clearable placeholder="请选择">
<el-select v-model="queryParams.type" clearable placeholder="请选择">
<el-option
v-for="item in dealTypeList"
:key="item.id"
v-for="item in deal_types"
:key="item.value"
:label="item.name"
:value="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="交易时间">
<el-date-picker class="oi-item" style="margin-left:5px"
v-model="queryParams.deal_time"
type="date"
placeholder="交易时间"
format="YYYY-MM-DD"
value-format="x"
/>
</el-form-item>
<!-- <el-form-item label="交易时间">-->
<!-- <el-date-picker class="oi-item" style="margin-left:5px"-->
<!-- v-model="queryParams.deal_time"-->
<!-- type="date"-->
<!-- placeholder="交易时间"-->
<!-- format="YYYY-MM-DD"-->
<!-- value-format="x"-->
<!-- />-->
<!-- </el-form-item>-->
<el-form-item>
<el-button size="small" type="primary" icon="search" @click="onSubmit">查询</el-button>
@ -101,10 +110,10 @@ function handleSizeChange(val) {
<div class="gva-table-box">
<!-- 数据列表-->
<el-table :data="tableData">
<el-table-column align="left" label="交易单号" min-width="150" prop="question_id" />
<el-table-column align="left" label="类别" min-width="150" prop="name" >
<el-table-column align="left" label="交易单号" min-width="150" prop="wallet_log_id" />
<el-table-column align="left" label="类别" min-width="150">
<template #default="scope">
{{custom.getExercisesTypeName(scope.row.type)}}
{{getTypeName(scope.row.wallet_log_type)}}
</template>
</el-table-column>
<el-table-column align="left" label="交易时间" min-width="150" >
@ -112,10 +121,10 @@ function handleSizeChange(val) {
{{formatDate(scope.row.CreatedAt)}}
</template>
</el-table-column>
<el-table-column align="left" label="交易方式" min-width="150" prop="subject" />
<el-table-column align="left" label="交易详情" min-width="150" prop="teacher_id" />
<el-table-column align="left" label="交易金额" min-width="150" prop="teacher_id" />
<el-table-column align="left" label="资产余额" min-width="150" prop="teacher_id" />
<!-- <el-table-column align="left" label="交易方式" min-width="150" prop="subject" />-->
<el-table-column align="left" label="交易详情" min-width="150" prop="desc" />
<el-table-column align="left" label="交易金额" min-width="150" prop="consume" />
<el-table-column align="left" label="资产余额" min-width="150" prop="balance" />
</el-table>
<div class="gva-pagination">

View File

@ -13,8 +13,15 @@ import {ref,onMounted } from 'vue'
import { useRouter, useRoute } from 'vue-router'
const router = useRouter()
const route = useRoute()
//
onMounted(() => {
queryParams.value.id = parseInt(route.params.user_id)
deal_types.value = custom.getDealType()
getDealPointList()
})
//
const typeList = custom.getExercisesTypeList()
const deal_types = ref([])
const queryParams = ref({
page:1,
pageSize:10,
@ -32,10 +39,6 @@ const dealTypeList = ref([
value:2
},
])
//
onMounted(() => {
// getDealPointList()
})
//
async function getDealPointList() {
const res = await api.getDealPointList(queryParams.value)
@ -63,6 +66,11 @@ function handleSizeChange(val) {
queryParams.value.pageSize = val
getDealPointList()
}
function getTypeName(type) {
return deal_types.value.filter((item,i) => {
return item.value == type
})[0].name
}
</script>
<template>
<div>
@ -72,8 +80,8 @@ function handleSizeChange(val) {
<el-form-item label="交易类别">
<el-select v-model="queryParams.subject" clearable placeholder="请选择">
<el-option
v-for="item in dealTypeList"
:key="item.id"
v-for="item in deal_types"
:key="item.value"
:label="item.name"
:value="item.name"
/>
@ -100,10 +108,10 @@ function handleSizeChange(val) {
<div class="gva-table-box">
<!-- 数据列表-->
<el-table :data="tableData">
<el-table-column align="left" label="交易单号" min-width="150" prop="question_id" />
<el-table-column align="left" label="交易类型" min-width="150" prop="name" >
<el-table-column align="left" label="交易单号" min-width="150" prop="wallet_log_id" />
<el-table-column align="left" label="交易类型" min-width="150">
<template #default="scope">
{{custom.getExercisesTypeName(scope.row.type)}}
{{getTypeName(scope.row.wallet_log_type)}}
</template>
</el-table-column>
<el-table-column align="left" label="交易时间" min-width="150" >
@ -111,9 +119,9 @@ function handleSizeChange(val) {
{{formatDate(scope.row.CreatedAt)}}
</template>
</el-table-column>
<el-table-column align="left" label="交易详情" min-width="150" prop="teacher_id" />
<el-table-column align="left" label="交易积分" min-width="150" prop="teacher_id" />
<el-table-column align="left" label="积分余额" min-width="150" prop="teacher_id" />
<el-table-column align="left" label="交易详情" min-width="150" prop="desc" />
<el-table-column align="left" label="交易积分" min-width="150" prop="consume" />
<el-table-column align="left" label="积分余额" min-width="150" prop="balance" />
</el-table>
<div class="gva-pagination">

View File

@ -20,7 +20,6 @@ const queryParams = ref({
user_id:0,
last_time:'',
subject:''
})
const subjectParams = ref({
page:1,
@ -28,37 +27,10 @@ const subjectParams = ref({
})
const tableData = ref([])
const subjectList = ref([])
// const deleteVisible = ref(false)
// const question_ids = ref([])
const total = ref(0)
// const dialogFormVisible = ref(false)
// const dialogTitle = ref('')
// const form =ref({})
// const rules = ref({
// name: [{ required: true, message: '', trigger: 'blur' }]
// })
// const question_id = ref(0)
// const content = ref(null)
// const options = ref([]) //
// const dealTypeList = ref([
// {
// name:'',
// value:1
// },{
// name:'',
// value:2
// },
// ])
//
onMounted(() => {
// getLearningDetailList()
getSubject()
initChart()
})
//
function initChart() { // echart
const myChart = echarts.init(document.getElementById('myEcharts'));
const option = ref({
//
// const myChart = echarts.init(document.getElementById('myEcharts'));
const option = ref({
tooltip: {
trigger: 'axis',
axisPointer: {
@ -90,6 +62,22 @@ function initChart() { // echart
}
]
});
//
onMounted(() => {
queryParams.value.id = parseInt(route.params.user_id)
getLearningDetailList()
getSubject()
})
//
async function getLearningDetailReport() {
const res = await api.getLearningDetailReport({id:queryParams.value.id})
if(res.code === 0) {
option.value.series[0].data = res.data
initChart()
}
}
function initChart() { // echart
const myChart = echarts.init(document.getElementById('myEcharts'));
option.value && myChart.setOption(option.value);
}
async function getSubject(){ //
@ -104,6 +92,7 @@ async function getLearningDetailList() {
if(res.code === 0) {
tableData.value = res.data.records
total.value = res.data.total
getLearningDetailReport()
}
}
function onSubmit() {
@ -170,16 +159,12 @@ function handleSizeChange(val) {
<el-table-column align="left" label="ID" prop="course_id" />
<el-table-column align="left" label="最后学习时间" min-width="150" >
<template #default="scope">
{{formatDate(scope.row.CreatedAt)}}
</template>
</el-table-column>
<el-table-column align="left" label="科目" min-width="150" prop="name">
<template #default="scope">
{{custom.getExercisesTypeName(scope.row.type)}}
{{formatDate(scope.row.UpdatedAt)}}
</template>
</el-table-column>
<el-table-column align="left" label="科目" min-width="150" prop="subject"></el-table-column>
<el-table-column align="left" label="课程" min-width="150" prop="subject" />
<el-table-column align="left" label="学习时长" min-width="150" prop="teacher_id" />
<el-table-column align="left" label="学习时长(分钟)" min-width="150" prop="duration" />
</el-table>
<div class="gva-pagination">

View File

@ -28,7 +28,8 @@ const subjectList = ref([])
const total = ref(0)
//
onMounted(() => {
// getTestDetailList()
queryParams.value.id = parseInt(route.params.user_id)
getTestDetailList()
getSubject()
})
//
@ -66,6 +67,13 @@ function handleSizeChange(val) {
queryParams.value.pageSize = val
getTestDetailList()
}
async function getCourseName(course_id) {
const res = await capi.getCourse({id:course_id})
if(res.code === 0) {
return res.data.step1.name
}
return ''
}
</script>
<template>
<div>
@ -104,23 +112,27 @@ function handleSizeChange(val) {
<div class="gva-table-box">
<!-- 数据列表-->
<el-table :data="tableData">
<el-table-column align="left" label="ID" prop="course_id" />
<el-table-column align="left" label="ID" prop="exam_id" />
<el-table-column align="left" label="测试时间" min-width="150" >
<template #default="scope">
{{formatDate(scope.row.CreatedAt)}}
</template>
</el-table-column>
<el-table-column align="left" label="科目" min-width="150" prop="name">
<el-table-column align="left" label="科目" min-width="150" prop="subject"></el-table-column>
<el-table-column align="left" label="课程" min-width="150" prop="name"></el-table-column>
<el-table-column align="left" label="测试用时/限时" min-width="150">
<template #default="scope">
{{custom.getExercisesTypeName(scope.row.type)}}
{{scope.row.duration/scope.row.duration}}
</template>
</el-table-column>
<el-table-column align="left" label="课程" min-width="150" prop="subject" />
<el-table-column align="left" label="测试用时/限时" min-width="150" prop="teacher_id" />
<el-table-column align="left" label="测试状态" min-width="150" prop="status" />
<el-table-column align="left" label="测试名次" min-width="150" prop="status" />
<el-table-column align="left" label="测试消费" min-width="150" prop="status" />
<el-table-column align="left" label="测试收益" min-width="150" prop="status" />
<el-table-column align="left" label="测试状态" min-width="150" prop="status">
<template #default="scope">
{{scope.row.score && scope.row.rank ? '已公布':scope.row.score && !scope.row.rank?'提交未公布':'未提交'}}
</template>
</el-table-column>
<el-table-column align="left" label="测试名次" min-width="150" prop="rank" />
<el-table-column align="left" label="测试消费" min-width="150" prop="price" />
<el-table-column align="left" label="测试收益" min-width="150" prop="reward" />
</el-table>
<!-- 分页-->
<div class="gva-pagination">

View File

@ -139,6 +139,10 @@ const drawFormRules = ref({
end_time:[{ required: true, message: '请输入截止时间', trigger: 'blur' }],
begin_time:[{ required: true, message: '请输入开始时间', trigger: 'blur' }],
product_cover:[{ required: true, message: '请选择商品封面', trigger: 'blur' }],
egg_quantity:[{ required: true, message: '请输入金蛋数量', trigger: 'blur'},
{ type: 'number', message: '请输入正确的格式' }],
prize_number:[{ required: true, message: '请输入中奖号码', trigger: 'blur'},
{ type: 'number', message: '请输入正确的格式' }],
})
const drawFormRef = ref(null)
function openDialog() {
@ -318,21 +322,23 @@ async function drawStateFunc(row,type) { //竞拍上架 下架
<el-table-column align="center" label="满员人数" prop="full_member" />
<el-table-column align="center" label="发布日期" min-width="150" >
<template #default="scope">
{{custom.timestampToDate(scope.row.begin_time)}}
{{custom.timestampToDate2(scope.row.begin_time)}}
</template>
</el-table-column>
<el-table-column align="center" label="截止日期" min-width="150" >
<template #default="scope">
{{custom.timestampToDate(scope.row.end_time)}}
{{custom.timestampToDate2(scope.row.end_time)}}
</template>
</el-table-column>
<el-table-column align="center" label="已参与人数" min-width="150" prop="in_member" />
<el-table-column align="center" label="奖品装蛋" min-width="150" prop="loading_egg" >
<template #default="scope">
{{scope.row.loading_egg?'是':'否'}}
</template>
</el-table-column>
<el-table-column align="center" label="金蛋数量" min-width="150" prop="egg_quantity" />
<el-table-column align="center" label="中奖号" min-width="150" prop="prize_number" />
<!-- <el-table-column align="center" label="奖品装蛋" min-width="150" prop="loading_egg" >-->
<!-- <template #default="scope">-->
<!-- {{scope.row.loading_egg?'是':'否'}}-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column align="center" label="最高积分" prop="most_point" />-->
<el-table-column align="center" label="状态">
<template #default="scope">
@ -438,9 +444,15 @@ async function drawStateFunc(row,type) { //竞拍上架 下架
value-format="x"
/>
</el-form-item>
<el-form-item label="奖品装蛋" >
<el-switch @change="loadingEggChange" v-model="drawForm.loading_egg" active-text="" inactive-text="" :active-value="true" inactive-value="false" />
<el-form-item label="金蛋数量" prop="egg_quantity">
<el-input v-model.number="drawForm.egg_quantity" placeholder="请输入金蛋数量" autocomplete="off" />
</el-form-item>
<el-form-item label="中奖号码" prop="prize_number">
<el-input v-model.number="drawForm.prize_number" placeholder="请输入中奖号码" autocomplete="off" />
</el-form-item>
<!-- <el-form-item label="奖品装蛋" >-->
<!-- <el-switch @change="loadingEggChange" v-model="drawForm.loading_egg" active-text="" inactive-text="" :active-value="true" inactive-value="false" />-->
<!-- </el-form-item>-->
<el-form-item label="奖品详情" prop="product_introduce">
<el-upload
class="avatar-uploader"

View File

@ -51,9 +51,13 @@ async function getExamGroupList() {
type_list.value = res.data.records
total.value = res.data.total
console.log('子组件获取行为')
if(type_list.value.length==0) {
type_list.value = _.cloneDeep(has_exam_types.value)
}
// if(type_list.value.length==0 && has_exam_types.value.length > 0) {
// type_list.value = _.cloneDeep(has_exam_types.value)
// }
// else{
//
// }
}
}
function chooseChapterChildExercises() {
@ -111,14 +115,14 @@ function oFunc(val) {
}
}
function checkFunc(row) { //
let flag = true
for(let item of has_exam_types.value) {
if(item.persons == row.persons) { //
if( item.expiry_date > Date.parse(new Date())) { //
flag = false
}
}
}
let flag = false
// for(let item of has_exam_types.value) {
// if(item.persons == row.persons) { //
// if( item.expiry_date > Date.parse(new Date())) { //
// flag = false
// }
// }
// }
return flag
}
function assigntTermFunc() { //
@ -131,16 +135,16 @@ function assigntTermFunc() { // 赋值期数
return term
}
function enterDb() { // /
if(edit_flag.value) { //
}
else{ //
// let f = checkFunc(gform.value)
// if(!f) { // ,
// ElMessage.error('!')
// return
// if(edit_flag.value) { //
//
// }
// else{ //
// // let f = checkFunc(gform.value)
// // if(!f) { // ,
// // ElMessage.error('!')
// // return
// // }
// }
}
if(!edit_flag.value) { //
gform.value.term = assigntTermFunc()
// id

View File

@ -44,7 +44,7 @@ const question_ids = ref([])
const total = ref(0)
const dialogFormVisible = ref(false)
const dialogTitle = ref('')
const form =ref({})
const form =ref({price:4.9})
const rules = ref({
name: [{ required: true, message: '请输入课程名称', trigger: 'blur' }]
})
@ -101,7 +101,7 @@ function openDialog(type) {
switch (type){
case 'add':
dialogTitle.value = '新增试卷'
form.value = {}
form.value = {price:4.9}
break;
case 'edit':
// params.question_id = question_id.value
@ -199,7 +199,7 @@ async function enterDialog() { // 提交
return item
})
// console.log(form.value)
form.value.price = Number(form.value.price )*100
form.value.price = parseInt(Number(form.value.price )*100)
form.value.duration = parseInt(form.value.duration)
const params = {
...form.value
@ -412,7 +412,7 @@ function addGroupFunc(data) {
<el-input type="number" v-model="form.duration" placeholder="请输入测试时长(分钟)" />
</el-form-item>
<el-form-item label="测试价格" >
<el-input type="number" v-model="form.price" placeholder="请输入测试价格(元)" />
<el-input type="number" v-model="form.price" disabled placeholder="请输入测试价格(元)" />
</el-form-item>
<el-form-item label="测试组别" >
<groupPool @addFunc="addGroupFunc" :exam_types="exam_types" :exam_id="form.exam_id" />

View File

@ -228,14 +228,14 @@ async function pOk() { // 审核提交
size="small"
type="primary"
link
@click="processFunc(scope.row,2)"
@click="processFunc(scope.row,3)"
>同意</el-button>
<el-button v-if="scope.row.status == 1"
icon="delete"
size="small"
type="danger"
link
@click="processFunc(scope.row,3)"
@click="processFunc(scope.row,2)"
>拒绝</el-button>
</template>
</el-table-column>

View File

@ -211,7 +211,7 @@ async function pOk() { // 审核提交
<el-table-column align="center" label="累计销售" prop="exam_sale" />
<el-table-column align="center" label="状态" prop="exam_sale">
<template #default="scope">
<div>{{scope.row.status == 1?'审核中':scope.row.status == 2?'已同意':'已拒绝'}}</div>
<div>{{scope.row.status == 1?'审核中':scope.row.status == 2?'已拒绝':'已同意'}}</div>
</template>
</el-table-column>
<el-table-column align="center" label="审核说明" prop="desc" />

View File

@ -272,10 +272,10 @@ function getProvinceName(province) {
<el-form-item label="区域">
<el-select v-model="queryParams.province" clearable placeholder="请选择">
<el-option
v-for="item in cityList"
v-for="(item,i) in cityList"
:key="item.ProID"
:label="item.name"
:value="item.ProID"
:value="i"
/>
</el-select>
</el-form-item>