|
@@ -0,0 +1,286 @@
|
|
|
+import { Ref, defineComponent, reactive, ref } from 'vue';
|
|
|
+import styles from '../index.module.less';
|
|
|
+import { NButton, NDataTable, NNumberAnimation } from 'naive-ui';
|
|
|
+import numeral from 'numeral';
|
|
|
+import { useECharts } from '@/hooks/web/useECharts';
|
|
|
+import Pagination from '/src/components/pagination';
|
|
|
+export default defineComponent({
|
|
|
+ name: 'home-practiceData',
|
|
|
+ setup() {
|
|
|
+ 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]
|
|
|
+ });
|
|
|
+
|
|
|
+ const state = reactive({
|
|
|
+ loading: false,
|
|
|
+ pagination: {
|
|
|
+ page: 1,
|
|
|
+ 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,
|
|
|
+ goCourseVisiable: false
|
|
|
+ });
|
|
|
+ const columns = () => {
|
|
|
+ return [
|
|
|
+ {
|
|
|
+ title: '日期',
|
|
|
+ key: 'createTime'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '练习人数',
|
|
|
+ key: 'quantityNum',
|
|
|
+ render(row: any) {
|
|
|
+ return <span>{row.quantityNum}人</span>;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ {
|
|
|
+ title: '平均练习时长(分钟)',
|
|
|
+ key: 'submitNum',
|
|
|
+ render(row: any) {
|
|
|
+ return <span>{row.submitNum}分钟</span>;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ];
|
|
|
+ };
|
|
|
+ const getList = () => {
|
|
|
+ console.log('1');
|
|
|
+ };
|
|
|
+ const setChart = () => {
|
|
|
+ setOptions({
|
|
|
+ tooltip: {
|
|
|
+ trigger: 'axis',
|
|
|
+ axisPointer: {
|
|
|
+ type: 'none'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ legend: {
|
|
|
+ show: false,
|
|
|
+ selected: {
|
|
|
+ //在这里设置默认展示就ok了
|
|
|
+ '练习时长(分钟)': practiceFlag.value
|
|
|
+ }
|
|
|
+ },
|
|
|
+ xAxis: {
|
|
|
+ type: 'category',
|
|
|
+ boundaryGap: true,
|
|
|
+ axisLabel: {
|
|
|
+ show: true,
|
|
|
+ interval: 0
|
|
|
+ },
|
|
|
+ data: payForm.dateList
|
|
|
+ },
|
|
|
+ yAxis: [
|
|
|
+ {
|
|
|
+ type: 'value',
|
|
|
+ axisLabel: {
|
|
|
+ formatter: '{value} min'
|
|
|
+ },
|
|
|
+ axisTick: {
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+ splitArea: {
|
|
|
+ show: false,
|
|
|
+ areaStyle: {
|
|
|
+ color: ['rgba(255,255,255,0.2)']
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ grid: {
|
|
|
+ left: '1%',
|
|
|
+ right: '1%',
|
|
|
+ top: '2%',
|
|
|
+ bottom: 0,
|
|
|
+ containLabel: true
|
|
|
+ },
|
|
|
+ series: [
|
|
|
+ {
|
|
|
+ // smooth: true,
|
|
|
+ data: payForm.timeList,
|
|
|
+ type: 'bar',
|
|
|
+ barWidth: '48px',
|
|
|
+ label: {
|
|
|
+ // 柱图头部显示值
|
|
|
+ show: true,
|
|
|
+ position: 'top',
|
|
|
+ color: '#333',
|
|
|
+ fontSize: '12px',
|
|
|
+ fontWeight: 600
|
|
|
+ },
|
|
|
+
|
|
|
+ itemStyle: {
|
|
|
+ normal: {
|
|
|
+ //这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
|
|
|
+ barBorderRadius: [8, 8, 0, 0],
|
|
|
+ color: '#D5E9FF'
|
|
|
+ },
|
|
|
+ emphasis: {
|
|
|
+ color: '#3583FA' //hover时改变柱子颜色
|
|
|
+ // borderWidth: 4,
|
|
|
+ // borderColor: 'rgba(213, 233, 255,.4)',
|
|
|
+ // borderType: 'solid'
|
|
|
+ }
|
|
|
+ } as any
|
|
|
+ }
|
|
|
+ ],
|
|
|
+
|
|
|
+ formatter: (item: any) => {
|
|
|
+ if (Array.isArray(item)) {
|
|
|
+ return [
|
|
|
+ item[0].axisValueLabel,
|
|
|
+ ...item.map(
|
|
|
+ (d: any) =>
|
|
|
+ `<br/>${
|
|
|
+ d.marker
|
|
|
+ }<span style="margin-top:10px;margin-left:5px;font-size: 13px;font-weight: 500;
|
|
|
+ color: #131415;font-weight: 600;
|
|
|
+ margin-top:12px
|
|
|
+ line-height: 18px;">练习时长: ${d.value}${'分钟'} </span>`
|
|
|
+ )
|
|
|
+ ].join('');
|
|
|
+ } else {
|
|
|
+ return item;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // dataZoom: [
|
|
|
+ // {
|
|
|
+ // type: 'slider',
|
|
|
+ // start: 5,
|
|
|
+ // end: 100,
|
|
|
+ // filterMode: 'empty'
|
|
|
+ // }
|
|
|
+ // ]
|
|
|
+ });
|
|
|
+ };
|
|
|
+ setChart();
|
|
|
+ return () => (
|
|
|
+ <>
|
|
|
+ <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>
|
|
|
+ </span>
|
|
|
+ 人
|
|
|
+ </p>
|
|
|
+ <p class={styles.TrainDataItemsubTitle}>练习人数</p>
|
|
|
+ </div>
|
|
|
+ <div class={styles.TrainDataItem}>
|
|
|
+ <p class={styles.TrainDataItemTitle}>
|
|
|
+ <span>
|
|
|
+ <NNumberAnimation from={0} to={32}></NNumberAnimation>
|
|
|
+ </span>
|
|
|
+ 分钟
|
|
|
+ </p>
|
|
|
+ <p class={styles.TrainDataItemsubTitle}>平均练习时长</p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class={styles.TrainDataTopRight}>
|
|
|
+ <div
|
|
|
+ // onClick={() => {
|
|
|
+ // practiceFlag.value = !practiceFlag.value;
|
|
|
+ // setChart();
|
|
|
+ // }}
|
|
|
+ class={[
|
|
|
+ styles.DataTopRightItem,
|
|
|
+ practiceFlag.value ? '' : styles.DataTopRightItemDis
|
|
|
+ ]}>
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.DataTopRightDot,
|
|
|
+ styles.DataTopRightDotBlue
|
|
|
+ ]}></div>
|
|
|
+ <p>练习时长(分钟)</p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class={styles.chatrs}>
|
|
|
+ <div
|
|
|
+ ref={chartRef}
|
|
|
+ style={{ height: payForm.height, width: payForm.width }}></div>
|
|
|
+ </div>
|
|
|
+ <div class={styles.tableWrap}>
|
|
|
+ <NDataTable
|
|
|
+ class={styles.classTable}
|
|
|
+ loading={state.loading}
|
|
|
+ columns={columns()}
|
|
|
+ data={state.tableList}></NDataTable>
|
|
|
+ <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>
|
|
|
+ </>
|
|
|
+ );
|
|
|
+ }
|
|
|
+});
|