Преглед изворни кода

build: 学生管理接口调试

chaooo пре 2 година
родитељ
комит
a88e402177

+ 2 - 2
src/api/dashboard/index.ts

@@ -3,7 +3,7 @@ import { AxiosPromise } from "axios";
 import { DashboardCard, DashboardData } from "./types";
 
 /**
- * 获取学校列表
+ * 获取首页数据卡片
  */
 export function getDashboardTop(id: number): AxiosPromise<DashboardCard> {
   return request({
@@ -13,7 +13,7 @@ export function getDashboardTop(id: number): AxiosPromise<DashboardCard> {
   });
 }
 /**
- * 获取班级列表
+ * 获取首页图表数据
  */
 export function getDashboardData(id: number): AxiosPromise<DashboardData> {
   return request({

+ 40 - 0
src/api/grade/index.ts

@@ -0,0 +1,40 @@
+import request from "@/utils/request";
+import {AxiosPromise} from "axios";
+import {GradeItem, GradeList} from "@/api/grade/types";
+import {StudentList} from "@/api/student/types";
+/**
+ * 获取班级列表(班级select下拉列表)
+ */
+export function getGradeSelect(id: number): AxiosPromise<GradeList[]> {
+	return request({
+		url: "/board/v1/choose-grade",
+		method: "get",
+		params: {school_id: id},
+	});
+}
+
+/**
+ * 班级管理
+ * status: 0全部1未结课2已结课
+ */
+export function getGradeList(
+	id: number,
+	status: number
+): AxiosPromise<GradeItem[]> {
+	return request({
+		url: "/board/v1/grade",
+		method: "get",
+		params: {school_id: id, status: status},
+	});
+}
+
+/**
+ * 班级管理-学生列表
+ */
+export function getGradeStudents(id: number): AxiosPromise<StudentList[]> {
+	return request({
+		url: "/board/v1/students",
+		method: "get",
+		params: {grade_id: id},
+	});
+}

+ 35 - 0
src/api/grade/types.ts

@@ -0,0 +1,35 @@
+import {StudentList} from "@/api/student/types";
+
+/**
+ * 班级列表
+ */
+export interface GradeList {
+	// 班级id
+	id: number;
+	// 班级名称
+	name: string;
+}
+
+/**
+ * 班级数据
+ */
+export interface GradeItem {
+	// 班级id
+	id: number;
+	// 班级名称
+	name: string;
+	// 0未结课1已结课
+	grade_status: number;
+	// 班级号
+	num: string;
+	// 学生数量
+	count: number;
+	// 教师名称
+	teacher_name: string;
+	// 结课时间
+	grade_time: string;
+	// 折叠面板使用
+	active: number[];
+	// 学生列表
+	students: StudentList[];
+}

+ 2 - 78
src/api/school/index.ts

@@ -1,13 +1,6 @@
 import request from "@/utils/request";
-import { AxiosPromise } from "axios";
-import {
-  SchoolList,
-  GradeList,
-  GradeItem,
-  StudentList,
-  TeacherList,
-  TeacherEquipment,
-} from "./types";
+import {AxiosPromise} from "axios";
+import {SchoolList} from "./types";
 
 /**
  * 获取学校列表
@@ -18,72 +11,3 @@ export function getSchoolSelect(): AxiosPromise<SchoolList[]> {
     method: "get",
   });
 }
-/**
- * 获取班级列表(班级select下拉列表)
- */
-export function getGradeSelect(id: number): AxiosPromise<GradeList[]> {
-  return request({
-    url: "/board/v1/choose-grade",
-    method: "get",
-    params: { school_id: id },
-  });
-}
-/**
- * 班级管理
- * status: 0全部1未结课2已结课
- */
-export function getGradeList(
-  id: number,
-  status: number
-): AxiosPromise<GradeItem[]> {
-  return request({
-    url: "/board/v1/grade",
-    method: "get",
-    params: { school_id: id, status: status },
-  });
-}
-/**
- * 班级管理-学生列表
- */
-export function getGradeStudents(id: number): AxiosPromise<StudentList[]> {
-  return request({
-    url: "/board/v1/students",
-    method: "get",
-    params: { grade_id: id },
-  });
-}
-/**
- * 获取教师列表
- */
-export function getTeacherList(
-  id: number,
-  keyword: string
-): AxiosPromise<TeacherList[]> {
-  return request({
-    url: "/board/v1/teacher",
-    method: "get",
-    params: { school_id: id, search: keyword },
-  });
-}
-/**
- * 获取教师设备
- */
-export function getTeacherEquipment(
-  id: number
-): AxiosPromise<TeacherEquipment> {
-  return request({
-    url: "/board/v1/teacher-equipment",
-    method: "get",
-    params: { teacher_id: id },
-  });
-}
-/**
- * 获取教师班级
- */
-export function getTeacherGrade(id: number): AxiosPromise<GradeList[]> {
-  return request({
-    url: "/board/v1/teacher-class",
-    method: "get",
-    params: { teacher_id: id },
-  });
-}

+ 0 - 91
src/api/school/types.ts

@@ -9,94 +9,3 @@ export interface SchoolList {
   // 学校号
   num: string;
 }
-/**
- * 班级列表
- */
-export interface GradeList {
-  // 班级id
-  id: number;
-  // 班级名称
-  name: string;
-}
-/**
- * 班级数据
- */
-export interface GradeItem {
-  // 班级id
-  id: number;
-  // 班级名称
-  name: string;
-  // 0未结课1已结课
-  grade_status: number;
-  // 班级号
-  num: string;
-  // 学生数量
-  count: number;
-  // 教师名称
-  teacher_name: string;
-  // 结课时间
-  grade_time: string;
-  // 折叠面板使用
-  active: number[];
-  // 学生列表
-  students: StudentList[];
-}
-/**
- * 学生列表
- */
-export interface StudentList {
-  // 学生id
-  id: number;
-  // 学生名称
-  name: string;
-  // 电话号码
-  phone: number;
-  // 训练次数
-  count: number;
-}
-/**
- * 教师列表
- */
-export interface TeacherList {
-  lists: TeacherItem[];
-  // 数量
-  count: number;
-}
-export interface TeacherItem {
-  // 学生id
-  id: number;
-  // 学生名称
-  name: string;
-  // 注册时间
-  create_time: string;
-  // 折叠面板使用
-  active: number[];
-  // 教师的设备
-  equipment: TeacherEquipment;
-  // 负责班级
-  grades: GradeList[];
-  // 表格行数
-  lines: number;
-}
-export interface TeacherEquipment {
-  // 脑机
-  AI: Equipment[];
-  // 水舞
-  SW: Equipment[];
-  // 恐龙
-  KL: Equipment[];
-  // 碰碰车
-  PP: Equipment[];
-  // SUV
-  SU: Equipment[];
-  // 赛车
-  SC: Equipment[];
-  // UFO
-  UF: Equipment[];
-  // 积木
-  JM: Equipment[];
-}
-export interface Equipment {
-  // 设备号
-  sn: string;
-}

+ 15 - 0
src/api/student/index.ts

@@ -0,0 +1,15 @@
+import request from "@/utils/request";
+import {AxiosPromise} from "axios";
+import {StudentList, StudentParams} from "@/api/student/types";
+
+/**
+ * 学生管理
+ * //school_id=95&grade_id=35&search=略&page_no=1&page_size=10
+ */
+export function getStudentLists(params: StudentParams): AxiosPromise<StudentList[]> {
+	return request({
+		url: "/board/v1/student",
+		method: "get",
+		params: params,
+	});
+}

+ 33 - 0
src/api/student/types.ts

@@ -0,0 +1,33 @@
+/**
+ * 获取学生管理参数
+ */
+export interface StudentParams {
+	school_id: number;
+	grade_id:number;
+	page_no: number;
+	page_size: number;
+	// 学生名称/手机号
+	search: string;
+}
+/**
+ * 学生列表
+ */
+export interface StudentList {
+  // 学生id
+  id: number;
+  // 学生名称
+  name: string;
+  // 电话号码
+  phone: number;
+  // 训练次数
+  count: number;
+}
+/**
+ * 学生管理
+ */
+export interface StudentItem extends StudentList{
+	// 学生名称
+	create_time: string;
+	// 班级名称
+	grade_name: string;
+}

+ 41 - 0
src/api/teacher/index.ts

@@ -0,0 +1,41 @@
+import request from "@/utils/request";
+import {AxiosPromise} from "axios";
+import {GradeList} from "@/api/grade/types";
+import {TeacherEquipment, TeacherList} from "@/api/teacher/types";
+/**
+ * 获取教师列表
+ */
+export function getTeacherList(
+	id: number,
+	keyword: string
+): AxiosPromise<TeacherList[]> {
+	return request({
+		url: "/board/v1/teacher",
+		method: "get",
+		params: {school_id: id, search: keyword},
+	});
+}
+
+/**
+ * 获取教师设备
+ */
+export function getTeacherEquipment(
+	id: number
+): AxiosPromise<TeacherEquipment> {
+	return request({
+		url: "/board/v1/teacher-equipment",
+		method: "get",
+		params: {teacher_id: id},
+	});
+}
+
+/**
+ * 获取教师班级
+ */
+export function getTeacherGrade(id: number): AxiosPromise<GradeList[]> {
+	return request({
+		url: "/board/v1/teacher-class",
+		method: "get",
+		params: {teacher_id: id},
+	});
+}

+ 50 - 0
src/api/teacher/types.ts

@@ -0,0 +1,50 @@
+import {GradeList} from "@/api/grade/types";
+/**
+ * 教师列表
+ */
+export interface TeacherList {
+	lists: TeacherItem[];
+	// 数量
+	count: number;
+}
+
+export interface TeacherItem {
+	// 学生id
+	id: number;
+	// 学生名称
+	name: string;
+	// 注册时间
+	create_time: string;
+	// 折叠面板使用
+	active: number[];
+	// 教师的设备
+	equipment: TeacherEquipment;
+	// 负责班级
+	grades: GradeList[];
+	// 表格行数
+	lines: number;
+}
+
+export interface TeacherEquipment {
+	// 脑机
+	AI: Equipment[];
+	// 水舞
+	SW: Equipment[];
+	// 恐龙
+	KL: Equipment[];
+	// 碰碰车
+	PP: Equipment[];
+	// SUV
+	SU: Equipment[];
+	// 赛车
+	SC: Equipment[];
+	// UFO
+	UF: Equipment[];
+	// 积木
+	JM: Equipment[];
+}
+
+export interface Equipment {
+	// 设备号
+	sn: string;
+}

+ 1 - 0
src/assets/icons/download.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1688087757190" class="icon" viewBox="0 0 1264 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1212" xmlns:xlink="http://www.w3.org/1999/xlink" width="246.875" height="200"><path d="M934.02529297 336.77246094C919.10058594 182.54638672 789.22021484 62 631.11816406 62 474.95410156 62 346.428125 179.65039062 328.90625 331.12988281 177.6640625 355.4140625 62 486.2375 62 644.35273438 62 819.77978516 204.22021484 962 379.64726562 962h502.94091797v-1.36669922c163.01162109-13.44726563 291.17636719-149.78935547 291.17636719-316.28056641 0-148.50878906-102.04189453-272.78349609-239.73925781-307.58027343z m-316.14257813 572.28662109L320.86425781 591.41181641h214.69746094V300.23544922h158.82363281v291.17636719H914.89941406z" p-id="1213" fill="#4284f2"></path></svg>

+ 15 - 10
src/layout/components/Navbar/SchoolSelect.vue

@@ -9,17 +9,24 @@ const userStore = useUserStore();
  * 学校数据
  */
 const schoolData = ref<SchoolList[]>();
-const schoolId = ref(0);
-const schoolNum = ref("");
+const schoolId = ref(userStore.schoolId||0);
+const schoolNum = ref(userStore.schoolNum||"");
 async function getSchoolData() {
   getSchoolSelect()
     .then(({ data }) => {
       schoolData.value = data;
-      if (schoolId.value == 0) {
-        schoolId.value = data[0].school_id;
-        schoolNum.value = data[0].num;
-        userStore.changeSchool(schoolId.value, schoolNum.value);
-      }
+			if (userStore.schoolNum && userStore.schoolNum != "") {
+				schoolData.value?.some((item)=>{
+					if(item.num == userStore.schoolNum){
+						schoolId.value = item.school_id;
+						schoolNum.value = item.num;
+					}
+				});
+			}else{
+				schoolId.value = data[0].school_id;
+				schoolNum.value = data[0].num;
+			}
+			userStore.changeSchool(schoolId.value, schoolNum.value);
     })
     .catch((error) => {
       console.log(error);
@@ -31,14 +38,12 @@ onMounted(() => {
 watch(
   () => schoolId.value,
   (newValue) => {
-    let num: string = "";
     schoolData.value?.some((school) => {
       if (newValue == school.school_id) {
-        num = school.num;
+				userStore.changeSchool(newValue, school.num);
         return true;
       }
     });
-    userStore.changeSchool(newValue, num);
   }
 );
 </script>

+ 12 - 10
src/views/dashboard/index.vue

@@ -3,13 +3,13 @@ import DataCard from "@/views/dashboard/components/DataCard.vue";
 import LiquidChart from "@/views/charts-components/LiquidChart.vue";
 import CircleChart from "@/views/charts-components/CircleChart.vue";
 import PercentBarChart from "@/views/charts-components/PercentBarChart.vue";
-import { GradeList } from "@/api/school/types";
 import { watch } from "vue";
 import { useUserStore } from "@/store/modules/user";
 
-import { getGradeSelect } from "@/api/school";
 import { getDashboardData, getDashboardTop } from "@/api/dashboard";
 import { DashboardCard, DashboardData } from "@/api/dashboard/types";
+import {getGradeSelect} from "@/api/grade";
+import {GradeList} from "@/api/grade/types";
 
 const userStore = useUserStore();
 defineOptions({
@@ -42,14 +42,16 @@ const gradeData = ref<GradeList[]>();
 // 班级编号
 let gradeId = ref(0);
 async function getGradeData(schoolId: number) {
-  getGradeSelect(schoolId)
-    .then(({ data }) => {
-      data.unshift({ id: 0, name: "全部班级" });
-      gradeData.value = data;
-    })
-    .catch((error) => {
-      console.log(error);
-    });
+	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);
+		});
 }
 /**
  * 图表数据

+ 2 - 1
src/views/equipment/index.vue

@@ -1,11 +1,12 @@
 <script setup lang="ts">
+import {GradeList} from "@/api/grade/types";
+
 defineOptions({
   name: "EquipmentIndex",
   inheritAttrs: false,
 });
 import { watch } from "vue";
 import { useUserStore } from "@/store/modules/user";
-import { GradeList } from "@/api/school/types";
 
 const userStore = useUserStore();
 watch(

+ 2 - 2
src/views/grade/index.vue

@@ -1,9 +1,9 @@
 <script setup lang="ts">
-import { GradeItem } from "@/api/school/types";
 import { watch } from "vue";
 import { useUserStore } from "@/store/modules/user";
 
-import { getGradeList, getGradeStudents } from "@/api/school";
+import {getGradeList, getGradeStudents} from "@/api/grade";
+import {GradeItem} from "@/api/grade/types";
 
 const userStore = useUserStore();
 defineOptions({

+ 2 - 2
src/views/login/index.vue

@@ -88,8 +88,8 @@ const autoLogin = ref(true);
 const loginData = ref<LoginData>({
   // phone: "18770033942",
   // password: "123456",
-  phone: atob(localStorage.getItem("autoName")) || "",
-  password: atob(localStorage.getItem("autoPass")) || "",
+  phone: localStorage.getItem("autoName")?atob(localStorage.getItem("autoName")):"",
+  password: localStorage.getItem("autoPass")?atob(localStorage.getItem("autoPass")):"",
 });
 
 const loginRules = {

+ 88 - 44
src/views/student/index.vue

@@ -1,72 +1,113 @@
 <script setup lang="ts">
-defineOptions({
-  name: "StudentIndex",
-  inheritAttrs: false,
-});
+import {GradeList} from "@/api/grade/types";
 import { watch } from "vue";
 import { useUserStore } from "@/store/modules/user";
-import { GradeList } from "@/api/school/types";
+import {getGradeSelect} from "@/api/grade";
+import {getStudentLists} from "@/api/student";
+import {StudentItem, StudentList, StudentParams} from "@/api/student/types";
 const userStore = useUserStore();
+defineOptions({
+	name: "StudentIndex",
+	inheritAttrs: false,
+});
+/**
+ * 班级数据
+ */
+const gradeData = ref<GradeList[]>();
+// 班级编号
+let gradeId = ref(0);
+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 studentCount = ref(0);
+const studentData = ref<StudentItem[]>();
+let keywords = ref("");
+async function getStudentData() {
+	const studentSearch:StudentParams = {
+		school_id: userStore.schoolId,
+		grade_id: gradeId.value,
+		search: keywords.value,
+		page_no: 0,
+		page_size: 12
+	}
+	getStudentLists(studentSearch)
+		.then(({ data }) => {
+			const {count, lists} = data;
+			studentCount.value = count;
+			studentData.value = lists;
+		})
+		.catch((error) => {
+			console.log(error);
+		});
+}
+onMounted(() => {
+	// 获取班级
+	getGradeData(userStore.schoolId);
+	// 获取学生数据
+	getStudentData();
+});
 watch(
-  () => userStore.schoolId,
-  (newValue, oldValue) => {
-    console.log(newValue, oldValue);
-  }
+	() => userStore.schoolId,
+	(newValue) => {
+		// 学校切换后重新加载数据
+		gradeId.value = 0;
+		getGradeData(newValue);
+	}
 );
-let studentInfo = ref("");
-// 班级编号
-let classNumber = ref(0);
-const gradeData = ref<GradeList[]>([
-  {
-    id: 0,
-    name: "全部班级",
-  },
-]);
-const tableData = ref<any>([
-  {
-    number: 1,
-    name: "学生A",
-    cls: "向日葵小班",
-    phone: "15814111616",
-    date: "2023-08-22",
-    times: 22,
-  },
-]);
 </script>
 
 <template>
   <div class="student-container">
     <!-- 学生查找 -->
     <div class="student-search">
-      <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="gradeId" 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="studentInfo"
+        v-model="keywords"
         size="large"
         placeholder="请输入学生名称或手机号码"
       />
-      <el-button size="large" type="primary">查找</el-button>
-      <span>共<b>40</b>人</span>
+      <el-button size="large" type="primary" @click="getStudentData()">查找</el-button>
+      <span>共<b>{{ studentCount }}</b>人</span>
     </div>
     <!-- 学生数据 -->
     <div class="list-table">
-      <el-table :data="tableData" style="width: 100%">
-        <el-table-column prop="number" label="序号" align="center" />
+      <el-table :data="studentData" 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="cls" label="所在班级" align="center" />
+        <el-table-column prop="grade_name" label="所在班级" align="center" />
         <el-table-column prop="phone" label="手机号码" align="center" />
-        <el-table-column prop="date" label="注册时间" align="center" />
-        <el-table-column prop="times" label="训练次数" align="center" />
+        <el-table-column prop="create_time" label="注册时间" align="center" />
+        <el-table-column prop="count" label="训练次数" align="center" />
         <el-table-column />
         <el-table-column label="操作" align="center">
           <router-link to="/student/result" class="table-btn">训练效果分析</router-link>
         </el-table-column>
+				<!-- 无数据插槽 -->
+				<template #empty>
+					<div class="empty">
+						<img src="../../assets/empty.png" alt="数据为空">
+						<p>未查询到学生数据,请更换查询条件重新查找!</p>
+					</div>
+				</template>
       </el-table>
     </div>
   </div>
@@ -140,4 +181,7 @@ const tableData = ref<any>([
     }
   }
 }
+.empty{
+	padding:100px 0;
+}
 </style>

+ 15 - 2
src/views/student/result.vue

@@ -28,6 +28,10 @@ const pieData = ref([12, 18, 20, 28, 22]);
 
 <template>
   <div class="result-container">
+		<router-link to="/student/download" class="download-btn">
+			<svg-icon icon-class="download" size="3rem"/>
+			<span>下载报告</span>
+		</router-link>
     <div class="result-title">
       <el-row class="box-card">
         <el-col :xs="10" :sm="5" :md="5">
@@ -49,8 +53,6 @@ const pieData = ref([12, 18, 20, 28, 22]);
       </el-row>
     </div>
 
-		<router-link to="/student/download" class="table-btn"><el-icon :size="20" color="#409EFC"><UploadFilled/></el-icon>下载报告</router-link>
-
     <el-row class="result-chart" :gutter="15">
       <el-col :xs="24" :sm="7" :md="7">
         <div class="box-card">
@@ -251,6 +253,17 @@ const pieData = ref([12, 18, 20, 28, 22]);
 </template>
 
 <style lang="scss" scoped>
+.download-btn{
+	position: absolute;
+	z-index: 99;
+	right: 4rem;
+	top: 4rem;
+	width:100px;
+	height:70px;
+	line-height: 16px;
+	text-align: center;
+	span{display: inline-block;width: 100%;}
+}
 .result-container {
   position: relative;
   padding: 30px;

+ 2 - 6
src/views/teacher/index.vue

@@ -2,12 +2,8 @@
 import { watch } from "vue";
 import { useUserStore } from "@/store/modules/user";
 
-import { TeacherItem, TeacherList } from "@/api/school/types";
-import {
-  getTeacherEquipment,
-  getTeacherGrade,
-  getTeacherList,
-} from "@/api/school";
+import {getTeacherEquipment, getTeacherGrade, getTeacherList} from "@/api/teacher";
+import {TeacherItem, TeacherList} from "@/api/teacher/types";
 
 const userStore = useUserStore();
 defineOptions({

+ 4 - 4
src/views/training/index.vue

@@ -1,14 +1,14 @@
 <script setup lang="ts">
-import DialogData from "@/views/training/components/DialogData.vue";
+import {watch} from "vue";
+import {useUserStore} from "@/store/modules/user";
+
+import {GradeList} from "@/api/grade/types";
 
 defineOptions({
   name: "TrainingIndex",
   inheritAttrs: false,
 });
 
-import { watch } from "vue";
-import { useUserStore } from "@/store/modules/user";
-import { GradeList } from "@/api/school/types";
 const userStore = useUserStore();
 watch(
   () => userStore.schoolId,