浏览代码

build: :hammer: 代码风格调整

chaooo 2 年之前
父节点
当前提交
c6af7c4392

+ 3 - 3
src/api/equipment/index.ts

@@ -1,12 +1,12 @@
 import request from "@/utils/request";
-import { AxiosPromise } from "axios";
-import { EquipmentManage, EquipmentParams } from "@/api/equipment/types";
+import {AxiosPromise} from "axios";
+import {EquipmentManage, EquipmentParams} from "@/api/equipment/types";
 
 /**
  * 设备管理
  * ///board/v1/equipment?school_id=95&teacher_id=11&sn=
  */
-export function getEquipmentLists(params: EquipmentParams): AxiosPromise<EquipmentManage[]> {
+export function getEquipmentLists(params: EquipmentParams): AxiosPromise<EquipmentManage> {
   return request({
     url: "/board/v1/equipment",
     method: "get",

+ 4 - 4
src/api/student/index.ts

@@ -1,12 +1,12 @@
 import request from "@/utils/request";
-import { AxiosPromise } from "axios";
-import { StudentBoard, StudentList, StudentParams } from "@/api/student/types";
+import {AxiosPromise} from "axios";
+import {StudentBoard, StudentList, StudentManage, 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[]> {
+export function getStudentLists(params: StudentParams): AxiosPromise<StudentManage> {
   return request({
     url: "/board/v1/student",
     method: "get",
@@ -20,6 +20,6 @@ export function getStudentBoard(id: number, school_id: number): AxiosPromise<Stu
   return request({
     url: "/board/v1/student/" + id,
     method: "get",
-    params: { school_id: school_id },
+    params: {school_id: school_id},
   });
 }

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

@@ -1,3 +1,5 @@
+import {TeacherItem} from "@/api/teacher/types";
+
 /**
  * 获取学生管理参数
  */
@@ -22,6 +24,12 @@ export interface StudentList {
   // 训练次数
   count: number;
 }
+export interface StudentManage {
+  lists: StudentItem[];
+  // 数量
+  count: number;
+}
+
 /**
  * 学生管理
  */

+ 1 - 1
src/api/teacher/index.ts

@@ -5,7 +5,7 @@ import {TeacherEquipment, TeacherList, TeacherManage} from "@/api/teacher/types"
 /**
  * 获取教师管理列表
  */
-export function getTeacherManage(id: number, keyword: string): AxiosPromise<TeacherManage[]> {
+export function getTeacherManage(id: number, keyword: string): AxiosPromise<TeacherManage> {
   return request({
     url: "/board/v1/teacher",
     method: "get",

+ 5 - 5
src/api/training/index.ts

@@ -1,12 +1,12 @@
 import request from "@/utils/request";
-import { AxiosPromise } from "axios";
-import { TrainingManage, TrainingParams, TrainingResult } from "@/api/training/types";
+import {AxiosPromise} from "axios";
+import {TrainingManage, TrainingParams, TrainingResult} 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[]> {
+export function getTrainingLists(params: TrainingParams): AxiosPromise<TrainingManage> {
   return request({
     url: "/board/v1/games",
     method: "get",
@@ -18,10 +18,10 @@ export function getTrainingLists(params: TrainingParams): AxiosPromise<TrainingM
  * 训练报告
  * /board/v1/detail?game_record_id=82967
  */
-export function getTrainingResult(id: number): AxiosPromise<TrainingResult[]> {
+export function getTrainingResult(id: number): AxiosPromise<TrainingResult> {
   return request({
     url: "/board/v1/detail",
     method: "get",
-    params: { game_record_id: id },
+    params: {game_record_id: id},
   });
 }

+ 6 - 6
src/api/training/types.ts

@@ -1,4 +1,4 @@
-import { TeacherItem } from "@/api/teacher/types";
+import {TeacherItem} from "@/api/teacher/types";
 
 /**
  * 获取训练记录参数
@@ -78,11 +78,11 @@ export interface TrainingResult {
     content: string;
   };
   minDescription: string[]; //大脑小贴士
-  height_med: string; //深度放松占比
-  average_med: string; //平均放松度
-  high_linemed: string; //最高放松度
-  scope_med: string; //放松度维持区间
-  stable_med: string; //放松度稳定度
+  height_med: number; //深度放松占比
+  average_med: number; //平均放松度
+  high_linemed: number; //最高放松度
+  scope_med: number; //放松度维持区间
+  stable_med: number; //放松度稳定度
   average_content: {
     //放松度平均值描述和星星
     star: number;

+ 2 - 2
src/layout/components/Sidebar/SidebarItem.vue

@@ -23,7 +23,7 @@ const props = defineProps({
     required: true,
   },
 });
-const itemRoute: SidebarRoutes = reactive<SidebarRoutes>(props.item);
+const itemRoute: SidebarRoutes = reactive(props.item as SidebarRoutes);
 const onlyOneChild = ref(); // 临时变量,唯一子路由
 /**
  * 判断当前路由是否只有一个子路由
@@ -85,7 +85,7 @@ function resolvePath(routePath: string): string {
 function addActiveClass(routePath: string) {
   const currentBase: string = routePath.split("/")[1];
   document.querySelectorAll(".el-menu-item").forEach((item) => {
-    const pathBase: string = item.attributes.getNamedItem("mark")?.value.split("/")[1];
+    const pathBase: string = item.attributes.getNamedItem("mark")?.value.split("/")[1] || "/";
     if (currentBase == pathBase) {
       const active = document.querySelectorAll(".el-menu-item.is-active");
       if (active && active.length) {

+ 9 - 8
src/utils/request.ts

@@ -1,12 +1,12 @@
-import axios, { InternalAxiosRequestConfig, AxiosResponse } from "axios";
-import { useUserStoreHook } from "@/store/modules/user";
+import axios, {InternalAxiosRequestConfig, AxiosResponse} from "axios";
+import {useUserStoreHook} from "@/store/modules/user";
 
 // 创建 axios 实例
 // @ts-ignore
 const service = axios.create({
   baseURL: import.meta.env.VITE_APP_BASE_API,
   timeout: 50000,
-  headers: { "Content-Type": "application/json;charset=utf-8" },
+  headers: {"Content-Type": "application/json;charset=utf-8"},
 });
 
 // 请求拦截器
@@ -28,7 +28,7 @@ service.interceptors.request.use(
 // 响应拦截器
 service.interceptors.response.use(
   (response: AxiosResponse) => {
-    const { status, message } = response.data;
+    const {status, message} = response.data;
     if (status === 1) {
       return response.data;
     }
@@ -36,13 +36,13 @@ service.interceptors.response.use(
     if (response.data instanceof ArrayBuffer) {
       return response;
     }
-
-    ElMessage.error(message || "系统出错");
+    // ElMessage.error(message || "系统出错");
+    console.log(message || "系统出错");
     return Promise.reject(new Error(message || "Error"));
   },
   (error: any) => {
     if (error.response.data) {
-      const { status, message } = error.response.data;
+      const {status, message} = error.response.data;
       // token 过期,重新登录
       if (status === 10) {
         ElMessageBox.confirm("当前页面已失效,请重新登录", "提示", {
@@ -53,7 +53,8 @@ service.interceptors.response.use(
           window.location.href = "/";
         });
       } else {
-        ElMessage.error(message || "系统出错");
+        //ElMessage.error(message || "系统出错");
+        console.log(message || "系统出错");
       }
     }
     return Promise.reject(error.message);

+ 9 - 9
src/views/equipment/index.vue

@@ -51,14 +51,14 @@ async function getEquipmentData(schoolId: number) {
   getEquipmentLists(pageParams)
     .then(({data}) => {
       equipmentData.value = data;
-      dataStatus.AI = equipmentData.value?.AI.length > 0 || false;
-      dataStatus.SW = equipmentData.value?.SW.length > 0 || false;
-      dataStatus.KL = equipmentData.value?.KL.length > 0 || false;
-      dataStatus.PP = equipmentData.value?.PP.length > 0 || false;
-      dataStatus.SU = equipmentData.value?.SU.length > 0 || false;
-      dataStatus.SC = equipmentData.value?.SC.length > 0 || false;
-      dataStatus.UF = equipmentData.value?.UF.length > 0 || false;
-      dataStatus.JM = equipmentData.value?.JM.length > 0 || false;
+      dataStatus.AI = (equipmentData.value?.AI.length || 0) > 0;
+      dataStatus.SW = (equipmentData.value?.SW.length || 0) > 0;
+      dataStatus.KL = (equipmentData.value?.KL.length || 0) > 0;
+      dataStatus.PP = (equipmentData.value?.PP.length || 0) > 0;
+      dataStatus.SU = (equipmentData.value?.SU.length || 0) > 0;
+      dataStatus.SC = (equipmentData.value?.SC.length || 0) > 0;
+      dataStatus.UF = (equipmentData.value?.UF.length || 0) > 0;
+      dataStatus.JM = (equipmentData.value?.JM.length || 0) > 0;
       equipmentStatus.value =
         dataStatus.AI ||
         dataStatus.SW ||
@@ -110,7 +110,7 @@ watch(
         v-model="pageParams.sn"
         placeholder="请输入设备编号"
         size="large"
-        @input="(value) => (pageParams.sn = trimInput(value))" />
+        @input="(value:string) => (pageParams.sn = trimInput(value))" />
       <el-button size="large" type="primary" @click="getEquipmentSearch()">查找</el-button>
     </div>
     <template v-if="equipmentStatus">

+ 1 - 1
src/views/evaluation/index.vue

@@ -70,7 +70,7 @@ const indicatorsData = ref([
             v-model="studentInfo"
             placeholder="请输入学生名称或手机号码"
             size="large"
-            @input="(value) => (studentInfo = trimInput(value))" />
+            @input="(value:string) => (studentInfo = trimInput(value))" />
           <el-button size="large" type="primary">查找</el-button>
         </div>
         <div class="result">

+ 26 - 27
src/views/student/download.vue

@@ -23,7 +23,7 @@ defineOptions({
 // 数据状态
 const dataStatus = ref(false);
 const dataMessage = ref("加载中...");
-let chartData: StudentBoard = reactive({});
+const chartData = ref<StudentBoard>();
 // 五维雷达图
 let radarData: number[][] = reactive([]);
 async function getChartData(schoolId: number) {
@@ -31,12 +31,9 @@ async function getChartData(schoolId: number) {
   const studentId = Number(getUrlParam("id")) || 0;
   getStudentBoard(studentId, schoolId)
     .then(({data}) => {
-      chartData = <StudentBoard>{...data};
+      chartData.value = data;
       dataStatus.value = true;
-      radarData = [chartData.after, chartData.front];
-      setTimeout(() => {
-        dialogVisible.value = true;
-      }, 500);
+      radarData = [chartData.value?.after || [], chartData.value?.front || []];
     })
     .catch((error) => {
       dataStatus.value = false;
@@ -49,11 +46,11 @@ function starElement(index: number, compare: number) {
   let value = 0;
   let tag = "";
   if (compare == 0) {
-    star = chartData.eeg[index].front[1];
-    value = chartData.eeg[index].front[0];
+    star = chartData.value?.eeg[index].front[1] || 1;
+    value = chartData.value?.eeg[index].front[0] || 0;
   } else {
-    star = chartData.eeg[index].after[1];
-    value = chartData.eeg[index].after[0];
+    star = chartData.value?.eeg[index].after[1] || 1;
+    value = chartData.value?.eeg[index].after[0] || 0;
   }
   if (star == 1) {
     tag = "重度不足";
@@ -66,6 +63,7 @@ function starElement(index: number, compare: number) {
   } else if (star == 5) {
     tag = "优秀水平";
   }
+  //return `<div class="star s${star}"></div><div class="status">${tag}</div>`;
   return ["star s" + star, tag, value];
 }
 
@@ -79,12 +77,13 @@ onMounted(() => {
 const exportPage = ref();
 // 下载页面内容为图片
 const downloadHandle = (name: string) => {
+  const containerElement = <HTMLElement>document.querySelector(".result-container");
   // html2canvas(绑定的元素,{})
   html2canvas(exportPage.value, {
     backgroundColor: "#f3f6fd", //海报的背景颜色
     useCORS: true, //允许跨域
-    width: document.querySelector(".result-container")?.offsetWidth, //生成海报的width,默认px
-    height: document.querySelector(".result-container")?.offsetHeight, //生成海报的height
+    width: containerElement?.offsetWidth || 750, //生成海报的width,默认px
+    height: containerElement?.offsetHeight || 1080, //生成海报的height
   })
     .then((canvas) => {
       // canvas 其实就是返回报文,我们所讲的response的意思
@@ -109,13 +108,13 @@ const downloadHandle = (name: string) => {
   <div class="container">
     <el-dialog v-model="dialogVisible" title="已生成【训练效果分析】离线报告,您可以:">
       <el-button @click="dialogVisible = false">预览</el-button>
-      <el-button class="mr-3" color="#626aef" @click="downloadHandle(chartData.name)">下载报告</el-button>
+      <el-button class="mr-3" color="#626aef" @click="downloadHandle(chartData?.name || '')">下载报告</el-button>
       <router-link :to="'/student/result?id=' + getUrlParam('id')"
         ><el-button color="#626aef" plain>返回上一页</el-button></router-link
       >
     </el-dialog>
     <div class="download-btn">
-      <el-button class="mr-5" color="#626aef" @click="downloadHandle(chartData.name)">下载报告</el-button>
+      <el-button class="mr-5" color="#626aef" @click="downloadHandle(chartData?.name || '')">下载报告</el-button>
       <router-link :to="'/student/result?id=' + getUrlParam('id')"
         ><el-button color="#626aef" plain>返回上一页</el-button></router-link
       >
@@ -125,27 +124,27 @@ const downloadHandle = (name: string) => {
         <el-row class="box-card">
           <el-col :span="24">
             <div class="l1">
-              <span>{{ chartData.name }}</span>
+              <span>{{ chartData?.name }}</span>
             </div>
-            <div class="l2">{{ chartData.phone }}</div>
+            <div class="l2">{{ chartData?.phone }}</div>
           </el-col>
           <el-col :span="6">
             <div class="l1">
-              <span>{{ chartData.count }}</span>
+              <span>{{ chartData?.count }}</span>
             </div>
             <div class="l2">训练次数累计</div>
           </el-col>
           <el-col :span="7">
             <div class="l1">
-              <span>{{ chartData.minute }}</span
-              >分<span>{{ chartData.second }}</span
+              <span>{{ chartData?.minute }}</span
+              >分<span>{{ chartData?.second }}</span
               >秒
             </div>
             <div class="l2">训练时长累计</div>
           </el-col>
           <el-col :span="11">
             <div class="l1">
-              前<span>{{ chartData.sort }}%</span>
+              前<span>{{ chartData?.sort }}%</span>
             </div>
             <div class="l2">在所有通过训练的学员中你的位置是</div>
           </el-col>
@@ -174,11 +173,11 @@ const downloadHandle = (name: string) => {
             <el-row>
               <el-col :span="24">
                 <div class="charts pieChart">
-                  <template v-if="chartData.percentage?.length > 0">
+                  <template v-if="(chartData?.percentage.length || 0) > 0">
                     <PieChart
                       id="pieChart"
-                      :key="chartData.percentage.toString()"
-                      :data="chartData.percentage"
+                      :key="chartData?.percentage.toString()"
+                      :data="chartData?.percentage || []"
                       width="500px"
                       height="400px"
                       class="chart"
@@ -190,8 +189,8 @@ const downloadHandle = (name: string) => {
                 <div class="charts last">
                   <CircleChart
                     id="resultChart1"
-                    :key="chartData.height"
-                    :data="chartData.height"
+                    :key="chartData?.height"
+                    :data="chartData?.height || 0"
                     height="220px"
                     width="220px"
                     color="#4284f2"
@@ -207,8 +206,8 @@ const downloadHandle = (name: string) => {
                 <div class="charts last">
                   <DoubleChart
                     id="doubleChart1"
-                    :key="chartData.height_num"
-                    :data="chartData.height_num"
+                    :key="chartData?.height_num"
+                    :data="chartData?.height_num || 0"
                     height="220px"
                     width="220px"
                     color="#4e68b0"

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

@@ -61,6 +61,9 @@ async function getStudentData(schoolId: number) {
 function getStudentSearch() {
   getStudentData(userStore.schoolId);
 }
+function alertError() {
+  ElMessage.error("该学生训练数据还不足以进行训练效果分析,请至少完成16次专注力训练后再来查看。");
+}
 onMounted(() => {
   // 获取班级
   getGradeData(userStore.schoolId);
@@ -90,7 +93,7 @@ watch(
         v-model="studentSearch.search"
         placeholder="请输入学生名称或手机号码"
         size="large"
-        @input="(value) => (studentSearch.search = trimInput(value))" />
+        @input="(value:string) => (studentSearch.search = trimInput(value))" />
       <el-button size="large" type="primary" @click="getStudentSearch()">查找</el-button>
       <span
         >共<b>{{ studentCount }}</b
@@ -111,12 +114,7 @@ watch(
             <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>
+            <button v-else class="table-btn disabled" @click="alertError()">训练效果分析</button>
           </template>
         </el-table-column>
         <!-- 无数据插槽 -->

+ 1 - 1
src/views/student/result.vue

@@ -164,7 +164,7 @@ watch(
             </el-col>
             <el-col :xs="24" :span="10">
               <div class="charts last">
-                <template v-if="chartData?.percentage?.length > 0">
+                <template v-if="(chartData?.percentage.length || 0) > 0">
                   <PieChart
                     id="pieChart"
                     :key="chartData?.percentage.toString()"

+ 1 - 1
src/views/teacher/index.vue

@@ -87,7 +87,7 @@ watch(
         v-model="searchKeyword"
         placeholder="请输入教师名称或手机号码"
         size="large"
-        @input="(value) => (searchKeyword = trimInput(value))" />
+        @input="(value:string) => (searchKeyword = trimInput(value))" />
       <el-button size="large" type="primary" @click="teacherSearch()">查找</el-button>
       <span
         >共<b>{{ teacherCount }}</b

+ 5 - 15
src/views/training/index.vue

@@ -14,10 +14,13 @@ defineOptions({
 });
 
 const pageParams: TrainingParams = reactive({
-  is_formal: 0,
+  school_id: userStore.schoolId,
+  is_formal: 0, // 1正式,2非正式
   grade_id: 0,
   page_no: 1,
   page_size: 12,
+  // 学生名称/手机号
+  search: "",
 });
 /**
  * 班级数据
@@ -49,19 +52,6 @@ async function getTrainingData(schoolId: number) {
       console.log(error);
     });
 }
-
-const tableData = ref<any>([
-  {
-    number: 1,
-    name: "学生A",
-    type: "智脑水舞",
-    phone: "15814111616",
-    date: "2023-08-22",
-    times: "1分12秒",
-    cls: "向日葵小班",
-  },
-]);
-
 function getTrainingSearch() {
   getTrainingData(userStore.schoolId);
 }
@@ -95,7 +85,7 @@ watch(
         v-model="pageParams.search"
         placeholder="请输入学生名称或手机号码"
         size="large"
-        @input="(value) => (pageParams.search = trimInput(value))" />
+        @input="(value:string) => (pageParams.search = trimInput(value))" />
       <el-button size="large" type="primary" @click="getTrainingSearch()">查找</el-button>
     </div>
     <!-- 学生数据 -->

+ 25 - 25
src/views/training/result.vue

@@ -3,9 +3,9 @@ import RadarChart from "@/components/Charts/RadarChart.vue";
 import FocusCircleChart from "@/components/Charts/FocusCircleChart.vue";
 import CurveLineChart from "@/components/Charts/CurveLineChart.vue";
 import SimplePieChart from "@/components/Charts/SimplePieChart.vue";
-import { getUrlParam } from "@/utils";
-import { getTrainingResult } from "@/api/training";
-import { TrainingResult } from "@/api/training/types";
+import {getUrlParam} from "@/utils";
+import {getTrainingResult} from "@/api/training";
+import {TrainingResult} from "@/api/training/types";
 defineOptions({
   name: "TrainingResult",
   inheritAttrs: false,
@@ -22,32 +22,32 @@ const curveData = ref<number[][]>();
 // 专注力分布饼图
 const pieData = ref<number[]>();
 
-const gameType = ref(getUrlParam("type"));
-let games = ref<TrainingResult>();
+const gameType = ref(Number(getUrlParam("type")));
+const games = ref<TrainingResult>();
 const chartStatus = ref(false);
 async function getTrainingData() {
-  const gameId = <number>getUrlParam("id") || 0;
+  const gameId = Number(getUrlParam("id")) || 0;
   getTrainingResult(gameId)
-    .then(({ data }) => {
-      games.value = <TrainingResult>{ ...data };
+    .then(({data}) => {
+      games.value = data;
       if (gameType.value == 0) {
-        focusData.value = games.value.height_med;
+        focusData.value = games.value?.height_med || 0;
         focusTitle.value = "深度放松占比";
       } else {
-        focusData.value = games.value.height_value;
+        focusData.value = games.value?.height_value || 0;
         focusTitle.value = "高专注占比";
       }
       // 五维雷达图
       radarData.value = [];
-      radarData.value.push(games.value.radar[0]);
-      radarStar.value = games.value.radar[1];
+      radarData.value?.push(games.value?.radar[0] || []);
+      radarStar.value = games.value?.radar[1] || [];
       // 专注力分布饼图
       curveData.value = [];
-      curveData.value.push(games.value.line);
-      curveData.value.push(games.value.line_med);
-      curveData.value.push(games.value.amp);
+      curveData.value?.push(games.value?.line || []);
+      curveData.value?.push(games.value?.line_med || []);
+      curveData.value?.push(games.value?.amp || []);
       // 专注力分布饼图
-      pieData.value = games.value.percentage;
+      pieData.value = games.value?.percentage || [];
       chartStatus.value = true;
     })
     .catch((error) => {
@@ -146,8 +146,8 @@ onMounted(() => {
             <template v-if="chartStatus">
               <RadarChart
                 id="radarChart1"
-                :key="radarData.toString()"
-                :data-sets="radarData"
+                :key="radarData?.toString()"
+                :data-sets="radarData || [[], []]"
                 :star="radarStar"
                 :tag="radarTag"
                 width="450px"
@@ -164,8 +164,8 @@ onMounted(() => {
             <template v-if="chartStatus">
               <CurveLineChart
                 id="curveLineChart"
-                :key="curveData.toString()"
-                :data-sets="curveData"
+                :key="curveData?.toString()"
+                :data-sets="curveData || [[], []]"
                 width="450px"
                 height="350px"
                 class="chart"
@@ -312,11 +312,11 @@ onMounted(() => {
                   title="专注力数值比例"
               /></template>
               <div class="data">
-                <p><span class="tag">81-100</span>({{ pieData[4] }})</p>
-                <p><span class="tag">61-80</span>({{ pieData[3] }})</p>
-                <p><span class="tag">41-60</span>({{ pieData[2] }})</p>
-                <p><span class="tag">21-40</span>({{ pieData[1] }})</p>
-                <p><span class="tag">0-20</span>({{ pieData[0] }})</p>
+                <p><span class="tag">81-100</span>({{ pieData?.[4] || 0 }}%)</p>
+                <p><span class="tag">61-80</span>({{ pieData?.[3] || 0 }}%)</p>
+                <p><span class="tag">41-60</span>({{ pieData?.[2] || 0 }}%)</p>
+                <p><span class="tag">21-40</span>({{ pieData?.[1] || 0 }}%)</p>
+                <p><span class="tag">0-20</span>({{ pieData?.[0] || 0 }}%)</p>
               </div>
             </div>
           </div>