Explorar el Código

build: 训练管理接口调试

chaooo hace 2 años
padre
commit
856f0428c9

+ 16 - 0
src/api/training/index.ts

@@ -0,0 +1,16 @@
+import request from "@/utils/request";
+import {AxiosPromise} from "axios";
+import {TrainingManage, TrainingParams} from "@/api/training/types";
+
+/**
+ * 训练记录
+ * /board/v1/games?school_id=95&is_formal=1&search=略&grade_id=35&page=1&page_size=10
+ */
+export function getTrainingLists(params: TrainingParams): AxiosPromise<TrainingManage[]> {
+	return request({
+		url: "/board/v1/games",
+		method: "get",
+		params: params,
+	});
+}
+

+ 36 - 0
src/api/training/types.ts

@@ -0,0 +1,36 @@
+import {TeacherItem} from "@/api/teacher/types";
+
+/**
+ * 获取训练记录参数
+ * ?school_id=95&is_formal=1&search=略&grade_id=35&page=1&page_size=10
+ */
+export interface TrainingParams {
+	school_id: number;
+	grade_id:number;
+	// 1正式,2非正式
+	is_formal: number;
+	// 学生名称/手机号
+	search: string;
+	page_no: number;
+	page_size: number;
+}
+
+/**
+ * 训练记录列表
+ */
+export interface TrainingItem {
+	name: string;
+	phone: string;
+	device_id: number;
+	device_name: string;
+	create_time: string;
+	play_time: string;
+	grade_name: string;
+	game_record_id: number;
+}
+
+export interface TrainingManage {
+	lists: TrainingItem[];
+	// 数量
+	count: number;
+}

+ 1 - 1
src/styles/sidebar.scss

@@ -68,7 +68,7 @@
       width: 210px;
       height: 38px;
       line-height: 38px;
-      border-radius: 5px;
+      border-radius: 6px;
       color: #657dbc;
       font-size: 16px;
       padding-left: 30px;

+ 8 - 22
src/views/equipment/index.vue

@@ -5,28 +5,14 @@ import {TeacherList, TeacherManage} from "@/api/teacher/types";
 import {getTeacherList} from "@/api/teacher";
 import {EquipmentManage, EquipmentParams} from "@/api/equipment/types";
 import {getEquipmentLists} from "@/api/equipment";
-
 const userStore = useUserStore();
 defineOptions({
 	name: "EquipmentIndex",
 	inheritAttrs: false,
 });
 
-
-let equipmentInfo = ref("");
-// 教师编号
-let teacherNumber = ref(0);
-// const teacherData = ref<GradeList[]>([
-//   {
-//     id: 0,
-//     name: "全部",
-//   },
-// ]);
-
-
 // 获取教师
 const teacherSelect = ref<TeacherList[]>();
-
 async function getTeacherData(schoolId: number) {
 	getTeacherList(schoolId)
 			.then(({data}) => {
@@ -40,7 +26,7 @@ async function getTeacherData(schoolId: number) {
 }
 
 // 获取设备
-const equipmentParams: EquipmentParams = reactive({});
+const pageParams: EquipmentParams = reactive({});
 let equipmentData: EquipmentManage = reactive({});
 const equipmentStatus = ref(false);
 const dataStatus = reactive({
@@ -56,8 +42,8 @@ const dataStatus = reactive({
 const dataMessage = ref("加载中...");
 
 async function getEquipmentData(schoolId: number) {
-	equipmentParams.school_id = schoolId;
-	getEquipmentLists(equipmentParams)
+	pageParams.school_id = schoolId;
+	getEquipmentLists(pageParams)
 			.then(({data}) => {
 				equipmentData = <EquipmentManage>{...data};
 				dataStatus.AI = equipmentData?.AI.length > 0 || false;
@@ -91,9 +77,9 @@ watch(
 		() => userStore.schoolId,
 		(newValue) => {
 			// 学校切换后重新获取
-			equipmentParams.school_id = newValue;
-			equipmentParams.teacher_id = 0;
-			equipmentParams.sn = "";
+			pageParams.school_id = newValue;
+			pageParams.teacher_id = 0;
+			pageParams.sn = "";
 			getTeacherData(newValue);
 			getEquipmentData(newValue);
 		}
@@ -105,7 +91,7 @@ watch(
 		<!-- 设备查找 -->
 		<div class="equipment-search">
 			<el-select
-					v-model="equipmentParams.teacher_id"
+					v-model="pageParams.teacher_id"
 					placeholder="请选择使用者名称"
 					size="large"
 			>
@@ -117,7 +103,7 @@ watch(
 				/>
 			</el-select>
 			<el-input
-					v-model="equipmentParams.sn"
+					v-model="pageParams.sn"
 					size="large"
 					placeholder="请输入设备编号"
 			/>

+ 5 - 3
src/views/student/index.vue

@@ -109,7 +109,8 @@ watch(
         <el-table-column />
         <el-table-column label="操作" align="center" >
 					<template #default="scope">
-						<router-link :to="'/student/result?id='+scope.row.id" class="table-btn">训练效果分析</router-link>
+						<router-link v-if="scope.row.count>16" :to="'/student/result?id='+scope.row.id" class="table-btn">训练效果分析</router-link>
+						<button v-else class="table-btn disabled" @click="ElMessage.error('该学生训练数据还不足以进行训练效果分析,请至少完成16次专注力训练后再来查看。')">训练效果分析</button>
 					</template>
         </el-table-column>
 				<!-- 无数据插槽 -->
@@ -155,7 +156,8 @@ watch(
     font-size: 16px;
     padding: 0 26px;
     margin: 0 20px;
-    border-radius: 12px;
+    border-radius: 10px;
+		background: #4284f2;
   }
   b {
     font-size: 20px;
@@ -192,7 +194,7 @@ watch(
     line-height: 38px;
     padding: 0 15px;
     background: #4284f2;
-    border-radius: 10px;
+    border-radius: 6px;
     color: #ffffff;
     &.disabled {
       background: #bfbfbf;

+ 97 - 64
src/views/training/index.vue

@@ -1,30 +1,55 @@
 <script setup lang="ts">
 import {watch} from "vue";
 import {useUserStore} from "@/store/modules/user";
-
 import {GradeList} from "@/api/grade/types";
+import {TrainingItem, TrainingParams} from "@/api/training/types";
+import {getGradeSelect} from "@/api/grade";
+import {getTrainingLists} from "@/api/training";
 
+const userStore = useUserStore();
 defineOptions({
   name: "TrainingIndex",
   inheritAttrs: false,
 });
 
-const userStore = useUserStore();
-watch(
-  () => userStore.schoolId,
-  (newValue, oldValue) => {
-    console.log(newValue, oldValue);
-  }
-);
-let studentType = ref("");
-let classNumber = ref("");
-let trainingType = ref("");
-const gradeData = ref<GradeList[]>([
-  {
-    id: 0,
-    name: "全部班级",
-  },
-]);
+const pageParams:TrainingParams = reactive({
+	is_formal: 0,
+	grade_id: 0,
+	page_no: 1,
+	page_size: 12,
+});
+/**
+ * 班级数据
+ */
+const gradeData = ref<GradeList[]>();
+async function getGradeData(schoolId: number) {
+	getGradeSelect(schoolId)
+		.then(({ data }) => {
+			gradeData.value = data;
+			gradeData.value?.unshift({ id: 0, name: "全部班级" })
+		})
+		.catch((error) => {
+			gradeData.value = [];
+			gradeData.value?.unshift({ id: 0, name: "全部班级" })
+			console.log(error);
+		});
+}
+const trainingData = ref<TrainingItem[]>();
+const trainingCount = ref(0);
+async function getTrainingData(schoolId: number) {
+	pageParams.school_id = schoolId;
+	getTrainingLists(pageParams)
+		.then(({ data }) => {
+			const {count, lists} = data;
+			trainingData.value = lists;
+			trainingCount.value = count;
+		})
+		.catch((error) => {
+			console.log(error);
+		});
+}
+
+
 const tableData = ref<any>([
   {
     number: 1,
@@ -36,6 +61,23 @@ const tableData = ref<any>([
     cls: "向日葵小班",
   },
 ]);
+
+
+function getTrainingSearch(){
+	getTrainingData(userStore.schoolId);
+}
+onMounted(() => {
+	getGradeData(userStore.schoolId);
+	getTrainingData(userStore.schoolId);
+});
+watch(
+	() => userStore.schoolId,
+	(newValue) => {
+		// 学校切换后重新获取
+		getGradeData(newValue);
+		getTrainingData(newValue);
+	}
+);
 </script>
 
 <template>
@@ -43,64 +85,54 @@ const tableData = ref<any>([
     <!-- 学生查找 -->
     <div class="training-search">
       <el-select
-        v-model="studentType"
+        v-model="pageParams.is_formal"
         placeholder="正式学生/体验用户"
         size="large"
       >
-        <el-option key="1" value="1" label="正式学生"></el-option>
-        <el-option key="2" value="2" label="体验用户"></el-option>
-      </el-select>
-      <el-select
-        v-model="classNumber"
-        placeholder="请选择班级名称"
-        size="large"
-      >
-        <el-option
-          v-for="item in gradeData"
-          :key="item.id"
-          :label="item.name"
-          :value="item.id"
-        />
-      </el-select>
-      <el-select
-        v-model="trainingType"
-        placeholder="请选择训练方式"
-        size="large"
-      >
-        <el-option
-          key="1"
-          value="1"
-          label="专注模式(脑机专注力训练)"
-        ></el-option>
-        <el-option key="2" value="2" label="智脑水舞"></el-option>
-        <el-option key="2" value="2" label="智脑恐龙"></el-option>
-        <el-option key="2" value="2" label="智脑碰碰车"></el-option>
-        <el-option key="2" value="2" label="智脑SUV"></el-option>
-        <el-option key="2" value="2" label="智脑积木"></el-option>
-        <el-option key="2" value="2" label="智脑UFO"></el-option>
-        <el-option
-          key="2"
-          value="2"
-          label="放松模式(脑机放松度训练,即正念)"
-        ></el-option>
+				<el-option key="0" :value="Number(0)" label="全部学生"></el-option>
+        <el-option key="1" :value="Number(1)" label="正式学生"></el-option>
+        <el-option key="2" :value="Number(2)" label="体验用户"></el-option>
       </el-select>
+				<el-select v-model="pageParams.grade_id" placeholder="请选择班级" size="large">
+					<el-option
+							v-for="item in gradeData"
+							:key="item.id"
+							:label="item.name"
+							:value="item.id"
+					/>
+				</el-select>
+				<el-input
+						v-model="pageParams.search"
+						size="large"
+						placeholder="请输入学生名称或手机号码"
+				/>
+				<el-button size="large" type="primary" @click="getTrainingSearch()">查找</el-button>
     </div>
     <!-- 学生数据 -->
     <div class="list-table">
-      <el-table :data="tableData" style="width: 100%">
-        <el-table-column prop="number" label="序号" align="center" />
+      <el-table :data="trainingData" style="width: 100%">
+				<el-table-column type="index" label="序号" align="center" width="80" />
         <el-table-column prop="name" label="学生名称" align="center" />
         <el-table-column prop="phone" label="手机号码" align="center" />
-        <el-table-column prop="type" label="训练方式" align="center" />
-        <el-table-column prop="date" label="训练时间" align="center" />
-        <el-table-column prop="times" label="训练时长" align="center" />
-        <el-table-column prop="cls" label="所在班级" align="center" />
+        <el-table-column prop="device_name" label="训练方式" align="center" />
+        <el-table-column prop="create_time" label="训练时间" align="center" />
+        <el-table-column prop="play_time" label="训练时长" align="center" />
+        <el-table-column prop="grade_name" label="所在班级" align="center" />
         <el-table-column />
-        <el-table-column label="操作" align="center">
-					<router-link to="/training/result" class="table-btn">报告详情</router-link>
-        </el-table-column>
+				<el-table-column label="操作" align="center" >
+					<template #default="scope">
+						<router-link :to="'/training/result?id='+scope.row.game_record_id" class="table-btn">报告详情</router-link>
+					</template>
+				</el-table-column>
       </el-table>
     </div>
+		<pagination
+				v-if="trainingCount > 0"
+				v-model:total="trainingCount"
+				v-model:page="pageParams.page_no"
+				v-model:limit="pageParams.page_size"
+				@pagination="getTrainingSearch()"
+		/>
   </div>
 </template>
 
@@ -127,7 +159,8 @@ const tableData = ref<any>([
     font-size: 16px;
     padding: 0 26px;
     margin: 0 20px;
-    border-radius: 12px;
+		border-radius: 10px;
+		background: #4284f2;
   }
 }
 :deep(.el-input__wrapper) {