|
@@ -1,30 +1,43 @@
|
|
|
-import { Ref, defineComponent, reactive, ref } from 'vue';
|
|
|
+import { Ref, defineComponent, onMounted, reactive, ref } from 'vue';
|
|
|
import styles from '../index.module.less';
|
|
|
-import { NButton, NDataTable, NNumberAnimation } from 'naive-ui';
|
|
|
+import {
|
|
|
+ NButton,
|
|
|
+ NDataTable,
|
|
|
+ NForm,
|
|
|
+ NFormItem,
|
|
|
+ NNumberAnimation,
|
|
|
+ NSpace
|
|
|
+} from 'naive-ui';
|
|
|
import numeral from 'numeral';
|
|
|
import { useECharts } from '@/hooks/web/useECharts';
|
|
|
import Pagination from '/src/components/pagination';
|
|
|
+import { getTrainingStat } from '../api';
|
|
|
+import {
|
|
|
+ getNowDateAndMonday,
|
|
|
+ getNowDateAndSunday,
|
|
|
+ getTimes
|
|
|
+} from '/src/utils/dateFormat';
|
|
|
+import CDatePicker from '/src/components/CDatePicker';
|
|
|
export default defineComponent({
|
|
|
name: 'student-practiceData',
|
|
|
- setup() {
|
|
|
+ props: {
|
|
|
+ studentId: {
|
|
|
+ type: String,
|
|
|
+ default: ''
|
|
|
+ }
|
|
|
+ },
|
|
|
+ setup(props) {
|
|
|
const chartRef = ref<HTMLDivElement | null>(null);
|
|
|
const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
|
|
|
const practiceFlag = ref(true);
|
|
|
const payForm = reactive({
|
|
|
height: '360px',
|
|
|
width: '100%',
|
|
|
- studentNum: 0,
|
|
|
- paymentAmount: 0,
|
|
|
- dateList: [
|
|
|
- '2022-10-10',
|
|
|
- '2022-10-11',
|
|
|
- '2022-10-12',
|
|
|
- '2022-10-13',
|
|
|
- '2022-10-14',
|
|
|
- '2022-10-15',
|
|
|
- '2022-10-16'
|
|
|
- ],
|
|
|
- timeList: [90, 128, 242, 120, 186, 77, 148]
|
|
|
+ practiceDurationAvg: 0,
|
|
|
+ practiceDays: 0,
|
|
|
+ practiceDurationTotal: 0,
|
|
|
+ dateList: [],
|
|
|
+ timeList: []
|
|
|
});
|
|
|
|
|
|
const state = reactive({
|
|
@@ -34,73 +47,24 @@ export default defineComponent({
|
|
|
rows: 10,
|
|
|
pageTotal: 4
|
|
|
},
|
|
|
- tableList: [
|
|
|
- {
|
|
|
- teacherName: '孙忆枫',
|
|
|
- createTime: '2023-06-27',
|
|
|
- endTime: '2023-06-30',
|
|
|
- status: 'ing',
|
|
|
- studentNum: 100,
|
|
|
- submitNum: 100,
|
|
|
- quantityNum: 60,
|
|
|
- submitRate: 100,
|
|
|
- quantityRate: 60
|
|
|
- },
|
|
|
- {
|
|
|
- teacherName: '孙忆枫',
|
|
|
- createTime: '2023-06-27',
|
|
|
- endTime: '2023-06-30',
|
|
|
- status: 'ing',
|
|
|
- studentNum: 100,
|
|
|
- submitNum: 100,
|
|
|
- quantityNum: 60,
|
|
|
- submitRate: 100,
|
|
|
- quantityRate: 60
|
|
|
- },
|
|
|
- {
|
|
|
- teacherName: '孙忆枫',
|
|
|
- createTime: '2023-06-27',
|
|
|
- endTime: '2023-06-30',
|
|
|
- status: 'ing',
|
|
|
- studentNum: 100,
|
|
|
- submitNum: 100,
|
|
|
- quantityNum: 60,
|
|
|
- submitRate: 100,
|
|
|
- quantityRate: 60
|
|
|
- },
|
|
|
- {
|
|
|
- teacherName: '孙忆枫',
|
|
|
- createTime: '2023-06-25',
|
|
|
- endTime: '2023-06-26',
|
|
|
- status: 'end',
|
|
|
- studentNum: 100,
|
|
|
- submitNum: 100,
|
|
|
- quantityNum: 60,
|
|
|
- submitRate: 100,
|
|
|
- quantityRate: 60
|
|
|
- }
|
|
|
- ] as any,
|
|
|
+ tableList: [] as any,
|
|
|
goCourseVisiable: false
|
|
|
});
|
|
|
+ const timer = ref<[number, number]>([
|
|
|
+ getNowDateAndMonday(new Date().getTime()),
|
|
|
+ getNowDateAndSunday(new Date().getTime())
|
|
|
+ ]);
|
|
|
const columns = () => {
|
|
|
return [
|
|
|
{
|
|
|
title: '日期',
|
|
|
- key: 'createTime'
|
|
|
+ key: 'date'
|
|
|
},
|
|
|
{
|
|
|
- title: '练习人数',
|
|
|
- key: 'quantityNum',
|
|
|
+ title: '练习时长(分钟)',
|
|
|
+ key: 'practiceDuration',
|
|
|
render(row: any) {
|
|
|
- return <span>{row.quantityNum}人</span>;
|
|
|
- }
|
|
|
- },
|
|
|
-
|
|
|
- {
|
|
|
- title: '平均练习时长(分钟)',
|
|
|
- key: 'submitNum',
|
|
|
- render(row: any) {
|
|
|
- return <span>{row.submitNum}分钟</span>;
|
|
|
+ return <span>{row.practiceDuration}分钟</span>;
|
|
|
}
|
|
|
}
|
|
|
];
|
|
@@ -113,7 +77,7 @@ export default defineComponent({
|
|
|
tooltip: {
|
|
|
trigger: 'axis',
|
|
|
axisPointer: {
|
|
|
- type: 'none'
|
|
|
+ type: 'shadow'
|
|
|
}
|
|
|
},
|
|
|
legend: {
|
|
@@ -162,6 +126,7 @@ export default defineComponent({
|
|
|
data: payForm.timeList,
|
|
|
type: 'bar',
|
|
|
barWidth: '48px',
|
|
|
+ stack: 'total',
|
|
|
label: {
|
|
|
// 柱图头部显示值
|
|
|
show: true,
|
|
@@ -178,6 +143,7 @@ export default defineComponent({
|
|
|
color: '#D5E9FF'
|
|
|
},
|
|
|
emphasis: {
|
|
|
+ focus: 'series',
|
|
|
color: '#3583FA' //hover时改变柱子颜色
|
|
|
// borderWidth: 4,
|
|
|
// borderColor: 'rgba(213, 233, 255,.4)',
|
|
@@ -215,30 +181,105 @@ export default defineComponent({
|
|
|
// ]
|
|
|
});
|
|
|
};
|
|
|
- setChart();
|
|
|
+
|
|
|
+ const getChartDetail = async () => {
|
|
|
+ try {
|
|
|
+ const res = await getTrainingStat({
|
|
|
+ studentId: props.studentId,
|
|
|
+ ...getTimes(timer.value, ['startTime', 'endTime'], 'YYYY-MM-DD')
|
|
|
+ });
|
|
|
+ payForm.practiceDays = res.data.practiceDays;
|
|
|
+ payForm.practiceDurationAvg = res.data.practiceDurationAvg;
|
|
|
+ payForm.practiceDurationTotal = res.data.practiceDurationTotal;
|
|
|
+ payForm.dateList = res.data.trainingStatDetailList.map((item: any) => {
|
|
|
+ return item.date;
|
|
|
+ });
|
|
|
+
|
|
|
+ payForm.timeList = res.data.trainingStatDetailList.map((item: any) => {
|
|
|
+ return item.practiceDuration;
|
|
|
+ });
|
|
|
+ state.tableList = res.data.trainingStatDetailList;
|
|
|
+ setChart();
|
|
|
+ console.log(payForm);
|
|
|
+ } catch (e) {
|
|
|
+ console.log(e);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ const search = () => {
|
|
|
+ state.pagination.page = 1;
|
|
|
+ getChartDetail();
|
|
|
+ console.log('search');
|
|
|
+ };
|
|
|
+ const onReset = () => {
|
|
|
+ timer.value = [
|
|
|
+ getNowDateAndMonday(new Date().getTime()),
|
|
|
+ getNowDateAndSunday(new Date().getTime())
|
|
|
+ ];
|
|
|
+ search();
|
|
|
+ console.log('onReset');
|
|
|
+ };
|
|
|
+ onMounted(() => {
|
|
|
+ console.log(props.studentId);
|
|
|
+ getChartDetail();
|
|
|
+ });
|
|
|
return () => (
|
|
|
<>
|
|
|
+ <NForm label-placement="left" inline>
|
|
|
+ <NFormItem>
|
|
|
+ <CDatePicker
|
|
|
+ v-model:value={timer.value}
|
|
|
+ separator={'至'}
|
|
|
+ type="daterange"
|
|
|
+ timerValue={timer.value}></CDatePicker>
|
|
|
+ </NFormItem>
|
|
|
+
|
|
|
+ <NFormItem>
|
|
|
+ <NSpace justify="end">
|
|
|
+ <NButton type="primary" class="searchBtn" onClick={search}>
|
|
|
+ 搜索
|
|
|
+ </NButton>
|
|
|
+ <NButton type="primary" ghost class="resetBtn" onClick={onReset}>
|
|
|
+ 重置
|
|
|
+ </NButton>
|
|
|
+ </NSpace>
|
|
|
+ </NFormItem>
|
|
|
+ </NForm>
|
|
|
<div class={styles.homeTrainData}>
|
|
|
<div class={styles.TrainDataTop}>
|
|
|
<div class={styles.TrainDataTopLeft}>
|
|
|
<div class={styles.TrainDataItem}>
|
|
|
<p class={styles.TrainDataItemTitle}>
|
|
|
<span>
|
|
|
- <NNumberAnimation from={0} to={32}></NNumberAnimation>
|
|
|
+ <NNumberAnimation
|
|
|
+ from={0}
|
|
|
+ to={payForm.practiceDurationTotal}></NNumberAnimation>
|
|
|
</span>
|
|
|
人
|
|
|
</p>
|
|
|
- <p class={styles.TrainDataItemsubTitle}>练习人数</p>
|
|
|
+ <p class={styles.TrainDataItemsubTitle}>累计练习时长</p>
|
|
|
</div>
|
|
|
<div class={styles.TrainDataItem}>
|
|
|
<p class={styles.TrainDataItemTitle}>
|
|
|
<span>
|
|
|
- <NNumberAnimation from={0} to={32}></NNumberAnimation>
|
|
|
+ <NNumberAnimation
|
|
|
+ from={0}
|
|
|
+ to={payForm.practiceDurationAvg}></NNumberAnimation>
|
|
|
</span>
|
|
|
分钟
|
|
|
</p>
|
|
|
<p class={styles.TrainDataItemsubTitle}>平均练习时长</p>
|
|
|
</div>
|
|
|
+ <div class={styles.TrainDataItem}>
|
|
|
+ <p class={styles.TrainDataItemTitle}>
|
|
|
+ <span>
|
|
|
+ <NNumberAnimation
|
|
|
+ from={0}
|
|
|
+ to={payForm.practiceDays}></NNumberAnimation>
|
|
|
+ </span>
|
|
|
+ 天
|
|
|
+ </p>
|
|
|
+ <p class={styles.TrainDataItemsubTitle}>练习天数</p>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
<div class={styles.TrainDataTopRight}>
|
|
|
<div
|
|
@@ -270,14 +311,14 @@ export default defineComponent({
|
|
|
loading={state.loading}
|
|
|
columns={columns()}
|
|
|
data={state.tableList}></NDataTable>
|
|
|
- <Pagination
|
|
|
+ {/* <Pagination
|
|
|
v-model:page={state.pagination.page}
|
|
|
v-model:pageSize={state.pagination.rows}
|
|
|
v-model:pageTotal={state.pagination.pageTotal}
|
|
|
onList={getList}
|
|
|
sync
|
|
|
saveKey="orchestraRegistration-key"
|
|
|
- />
|
|
|
+ /> */}
|
|
|
</div>
|
|
|
</div>
|
|
|
</>
|