天马学航——智慧教务系统(移动端)开发日志四

天马学航——智慧教务系统(移动端)开发日志四

日志摘要:优化了教师端界面的UI,更新了教师端添加课程,提交成绩等功能,修复了一些已知的BUG

1、教师添加课程设计

教师在此界面添加课程,并将数据提交后端进行审核

界面效果
image-20240620111914879
前端源码
@Entry
@Component
struct AddCourse {
  selectedDate: Date = new Date("2010-1-1")
  @State time:string = '请选择时间'
  @State cid:string = '-111'
  @State cname:string = '-111'
  build() {
    Column({ space: 5 }) {
      Text(" ")
      Row({ space: 10 }) {
        Text(" ")
        Image($r('app.media.back'))
          .width(30)
          .height(30)
          .onClick(function () {
            //返回上一页

            router.back() //直接返回
          })
        Text("发布课程")
          .fontSize(30)
          .fontWeight(FontWeight.Bolder)
      }
      .width('100%')
      Text("----------------------------------------------")
      Text(" ")
      Column({space:30}){
        Text("申请发布课程")
        .fontSize(30)
        .fontWeight(FontWeight.Bolder)
        .fontSize(30)
        Row({space:20}){
          Text("课程号    ")
            .fontSize(15)
          TextInput()
            .width('70%')
            .height(50)
            .type(InputType.Normal)
            .onChange(value=>{
              this.cid = value
            })
        }
        .width('100%')
        Row({space:20}){
          Text("课程名称")
            .fontSize(15)
          TextInput()
            .width('70%')
            .height(50)
            .type(InputType.Normal)
            .onChange(value=>{
              this.cname = value
            })
        }
        .width('100%')
        Row({space:20}){
          Text("上课时间")
            .fontSize(15)
           Button("选择时间")
             .width(100)
        .margin(20)
        .onClick(() => {
          DatePickerDialog.show({
            start: new Date("2023-1-1"), // 设置选择器的起始日期
            end: new Date("2055-12-31"), // 设置选择器的结束日期
            selected: this.selectedDate, // 设置当前选中的日期
            lunar: false,
            onAccept: (value: DatePickerResult) => { // 点击弹窗中的“确定”按钮时触发该回调
              // 通过Date的setFullYear方法设置按下确定按钮时的日期,这样当弹窗再次弹出时显示选中的是上一次确定的日期
              this.selectedDate.setFullYear(value.year, value.month, value.day)
              console.info("DatePickerDialog:onAccept()" + JSON.stringify(value))
              this.time=value.year+"-"+(value.month+1)+"-"+ value.day
              if(value.month+1>0&&value.month+1<10){
                this.time=value.year+"-0"+(value.month+1)+"-"+ value.day
              }
              if(value.day>0&&value.day<10){
                this.time=value.year+"-"+(value.month+1)+"-0"+ value.day
              }
              if((value.month+1>0&&value.month+1<10)&&(value.day>0&&value.day<10)){
                this.time=value.year+"-0"+(value.month+1)+"-0"+ value.day
              }
            },
            onCancel: () => { // 点击弹窗中的“取消”按钮时触发该回调
              console.info("DatePickerDialog:onCancel()")
            },
            onChange: (value: DatePickerResult) => { // 滑动弹窗中的滑动选择器使当前选中项改变时触发该回调
              console.info("DatePickerDialog:onChange()" + JSON.stringify(value))
            }
          })
        })
          Text(this.time)
            .fontSize(15)
        }
        .width('100%')
        Column({space:20}){
          Text("*注意:请确认信息后再提交,否则可能导致审核不通过!")
            .fontSize(15)
            .fontColor(Color.Red)
          Button("提交申请")
            .width(200)
            .onClick(()=>{
              if(this.time === "请选择时间" || this.cid === '-111' || this.cname === '-111'){
                promptAction.showToast({
                  message: "请完成表单的填写",
                  duration: 2000,
                  bottom: 50
                });
              }
              else {
                AddCourses.STA(this.cid,this.cname,this.time)
                  .then(resp=>{
                    console.log("后端返回"+resp)
                    promptAction.showToast({
                      message: resp,
                      duration: 2000,
                      bottom: 50
                    });
                  })
              }
            })
        }
      }
      .width('80%')
    }
  }
}
请求源码
class AddCourses {
  baseURL: string = IP.ip

  STA(cid: string, cname: string, ctime: string): Promise<string> {
    const data = {
      cid: cid,
      cname: cname,
      ctime: ctime
    }
    return new Promise((resolve, reject) => {
      let httpRequest = http.createHttp()
      httpRequest.request(
        `${this.baseURL}/InsertCourse`,
        {
          method: http.RequestMethod.GET,
          extraData: data,
          connectTimeout: 10000,
          readTimeout: 10000
        },
      )
        .then(resp=>{
          if(resp.responseCode===200){
            console.log("请求成功!"+resp.result)
            resolve(resp.result.toString())
          }
          else {console.log("请求出现问题"+resp.responseCode)}

        })
        .catch(err=>{
          console.log("请求失败")
        })
    })
  }
}

const sc1 = new AddCourses()
export default sc1 as AddCourses
后端源码
public class TeacherInsertCourse extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("application/json");
        resp.setCharacterEncoding("UTF-8");
        String sid = req.getParameter("sid");
        String cid = req.getParameter("cid");
        String grade = req.getParameter("grade");
        System.out.println("教师提交成绩"+sid+cid+grade);

        //Mybatis
        SqlSession sql = MybatisUntills.getSqlSession();
        CourseMapper mapper = sql.getMapper(CourseMapper.class);
        Map<String,Object> map = new HashMap<String, Object>();
        map.put("sid",sid);
        map.put("cid",cid);
        map.put("grade",grade);
        int i = mapper.TeacherInsertGrade(map);
        sql.commit();
        if(i==1){
            resp.getWriter().write("上传成功");
        }
        else {
            resp.getWriter().write("上传失败");
        }
        sql.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

2、教师提交成绩功能设置

前端从后端获取本教师任教的课程,并显示在前端,前端通过表单收集每门课程的评分,并向后端发送请求

image-20240620111914879
前端源码
struct AddGrade {
  @State grades:Grade[] = []
  @State g:string = '000'

  aboutToAppear(){
    this.getinfo()
  }

  build() {
    Column({ space: 5 }) {
      Text(" ")
      Row({ space: 10 }) {
        Text(" ")
        Image($r('app.media.back'))
          .width(30)
          .height(30)
          .onClick(function () {
            //返回上一页

            router.back() //直接返回
          })
        Text("提交成绩")
          .fontSize(30)
          .fontWeight(FontWeight.Bolder)
      }
      .width('100%')

      Text("----------------------------------------------")
      Text(" ")
      List({space:20}){
        ForEach(
          this.grades,
          grade=>{
            ListItem(){
              Row({space:30}){
                Text(" ")
                Column({space:10}){
                  Text("学号:"+grade.sid)
                  Text("姓名:"+grade.sname)
                  Text("课程名称:"+grade.cname)
                  Text("课程号:"+grade.cid)
                  Row(){
                    Text("成绩:")
                    TextInput({placeholder:"给分有理,扣分有据"})
                      .width(200)
                      .type(InputType.Number)
                      .onChange(value=>{
                        this.g = value
                      })
                  }
                  Button("提交")
                    .onClick(()=>{
                      InsertGrade.STA(grade.sid,grade.cid,this.g)
                        .then(resp=>{
                          promptAction.showToast({
                            message: resp,
                            duration: 2000,
                            bottom: 50
                          });
                        })
                      router.pushUrl({
                        url:"pages/view/Teacher/AddGrade"
                      },
                        router.RouterMode.Single,
                        err => {
                          if(err){
                            console.log("跳转失败")
                          }
                        }
                      )
                    })
                }
                .width('100%')
                .justifyContent(FlexAlign.Start)
                .alignItems(HorizontalAlign.Start)
              }
              .width('95%')
              .padding(20)
              .backgroundColor(Color.White)
              .borderRadius(15)
              .shadow({ radius: 6, color: '#1F000000', offsetX: 2, offsetY: 4 })
            }
          }
        )
      }
    }
  }
  getinfo(){
    GetCourse.GT()
      .then(resp=>{
        console.log("前端收到数据"+resp);
        this.grades = resp
        if(resp.length === 0){
          promptAction.showToast({
            message: "您已上传完所有成绩~",
            duration: 2000,
            bottom: 50
          });
        }
      })
  }
}
请求源码
请求课程
class GetCourse {
  baseURL: string = IP.ip

  GT(): Promise<Grade[]> {
    return new Promise((resolve, reject) => {
      let Http = http.createHttp()
      Http.request(
        `${this.baseURL}/GetTeacherCourse`,
        {
          method: http.RequestMethod.GET,
          connectTimeout: 10000,
          readTimeout: 10000
        }
      )
        .then(resp=>{
          if(resp.responseCode === 200){
            console.log("请求成功"+resp.result)
            resolve(JSON.parse(resp.result.toString()))
          }
          else {
            console.log("请求发现异常"+resp.responseCode)
          }
        })
        .catch(err=>{
          console.log("请求失败"+err)
        })
    })
  }
}

const sc = new GetCourse()
export default sc as GetCourse
向后端返回成绩
class InsertGrade {
  baseURL: string = IP.ip

  STA(sid: string, cid: string, grade: string): Promise<string> {
    const data = {
      cid: cid,
      sid: sid,
      grade: grade
    }
    return new Promise((resolve, reject) => {
      let httpRequest = http.createHttp()
      httpRequest.request(
        `${this.baseURL}/TeacherInertCourse`,
        {
          method: http.RequestMethod.GET,
          extraData: data,
          connectTimeout: 10000,
          readTimeout: 10000
        },
      )
        .then(resp=>{
          if(resp.responseCode === 200){
            console.log("后端返回成功"+resp.result)
            resolve(resp.result.toString())
          }
          else {
            console.log("请求出现问题:"+resp.responseCode)
          }
        })
        .catch(err=>{
          console.log("请求失败"+err)
        })
    })
  }
}

const sc = new InsertGrade()
export default sc as InsertGrade
后端源码

请求课程部分与学生选课第一部分业务逻辑相似,这里不再赘述

这里只写出后端处理前端返回成绩的部分

public class TeacherInsertCourse extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("application/json");
        resp.setCharacterEncoding("UTF-8");
        String sid = req.getParameter("sid");
        String cid = req.getParameter("cid");
        String grade = req.getParameter("grade");
        System.out.println("教师提交成绩"+sid+cid+grade);

        //Mybatis
        SqlSession sql = MybatisUntills.getSqlSession();
        CourseMapper mapper = sql.getMapper(CourseMapper.class);
        Map<String,Object> map = new HashMap<String, Object>();
        map.put("sid",sid);
        map.put("cid",cid);
        map.put("grade",grade);
        int i = mapper.TeacherInsertGrade(map);
        sql.commit();
        if(i==1){
            resp.getWriter().write("上传成功");
        }
        else {
            resp.getWriter().write("上传失败");
        }
        sql.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

3、BUG修复

修复了一些已知的BUG

4、UI优化

优化教师端图标和界面布局,使得更加人性化

image-20240620111914879

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/733597.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP发送HTML邮件的步骤?设置模板的技巧?

PHP发送HTML邮件怎么设置模板&#xff1f;如何用PHP群发邮件&#xff1f; PHP提供了强大的功能来发送HTML格式的电子邮件&#xff0c;这在需要发送格式化内容的邮件时特别有用。AokSend将详细介绍PHP发送HTML邮件的步骤&#xff0c;涵盖了必要的准备工作和实际操作过程。 PHP…

【十三】图解mybatis缓存模块之装饰器模式

图解mybatis缓存模块之装饰器模式 简介 之前有写过一篇博客介绍过mybatis的缓存模块设计【九】mybatis 缓存模块设计-CSDN博客 &#xff0c;当时着重讲解的是mybatis种一级缓存和二级缓存&#xff0c;本次博客补充讲解一下装饰器模式的应用&#xff0c;本篇主要分两部分讲解&a…

NSIS 入门教程 (一)

介绍 大多数应用程序都附带一个安装程序&#xff0c;它将所需的文件复制到正确的文件夹中&#xff0c;创建注册表项&#xff0c;并提供卸载例程以&#xff08;希望&#xff09;从计算机中彻底删除应用程序. 有多种解决方案可以为自主开发的应用程序配备安装程序。除了Install …

微软Edge浏览器全解析

微软Edge浏览器全解析(一) 解决浏览器的主页被篡改后无法通过浏览器的自带设置来恢复的问题 相信各位都有发现新买的联想电脑浏览器的主页设置不太满意,但从浏览器自带的设置上又无法解决此问题,网上找了许多方法都无济于事,特别对有着强迫症的小伙伴们更是一种煎熬。 通…

【转】FreeRTOS通用移植,以keil和IAR工程 M7核为例

目录 keil: IAR keil: 原文在https://bbs.eeworld.com.cn/thread-1281875-1-1.html 本篇讲述移植FreeRTOS,并创建运行一个任务&#xff0c;对象芯片为M7系列的兆易创新GD32H7xx系列。 一.准备工作 1.下载FreeRTOS源码官网 http://www.freertos.org/ 或者托管网站FreeRTOS…

Add and Remove Rows

New Item Row 数据网格可以显示一个空行&#xff0c;使用户可以添加新记录。该行由显示在相应行指示符单元格内的星号&#xff08;*&#xff09;标识。若要取消添加新行&#xff0c;用户可以按Esc键。 相关API GridOptionsView.NewItemRowPosition — 允许您启用一个新的项…

1.2 DataX 数据同步工具详细介绍

DataX 是阿里巴巴开源的一款高效的数据同步工具&#xff0c;旨在实现多种异构数据源之间的高效数据同步。以下是对 DataX 的详细介绍&#xff1a; 架构 DataX 的架构主要包括以下几个核心组件&#xff1a; DataX Core&#xff1a;负责任务调度、插件加载、日志管理等核心功能…

【Matlab】-- BP反向传播算法

文章目录 文章目录 00 写在前面01 BP算法介绍02 基于Matlab的BP算法03 代码解释 00 写在前面 BP算法可以结合鲸鱼算法、飞蛾扑火算法、粒子群算法、灰狼算法、蝙蝠算法等等各种优化算法一起&#xff0c;进行回归预测或者分类预测。 01 BP算法介绍 BP&#xff08;Backpropag…

09--keepalived高可用集群

前言&#xff1a;高可用集群配置是大型网站的一个基础&#xff0c;网站可用性的基础保障之一&#xff0c;这里将对应的概念知识和实操步骤进行整理与收集。 1、基础概念详解 1.1、高可用集群 高可用集群&#xff08;High Availability Cluster&#xff0c;简称HA Cluster&am…

内容安全复习 5 - 深在线社交网络分析与舆情监测

文章目录 在线社交网络分析什么是在线社交网络什么是在线社交网络分析社交网络信息传播基本模型影响力模型传染模型影响力计算公式 网络舆情监测网络舆情概述网络舆情监测系统 在线社交网络分析 什么是在线社交网络 在线社交网络是一种在信息网络上由社会个体集合及个体之间的…

揭示数据库内核的奥秘--手写数据库toadb开源项目

揭示数据库内核的奥秘–手写数据库toadb 数据为王的时代 在信息化时代&#xff0c;数据已成为企业和应用不可或缺的核心&#xff0c;而数据库不仅是数据的仓库&#xff0c;更是支撑业务决策、系统运行的基石。对于求职者而言&#xff0c;掌握数据库知识已成为求职市场上的必考…

守护清远采矿安全:可燃气体报警器检定工作的必要性与实施

清远市地处广东省北部&#xff0c;矿产资源丰富&#xff0c;包括金属矿产、非金属矿产等多种类型。采矿行业作为清远的重要产业之一&#xff0c;对当地经济发展起到了积极的推动作用。 然而&#xff0c;随着采矿业的快速发展&#xff0c;安全问题也逐渐凸显出来&#xff0c;尤…

鱼缸补水器工作原理是什么

鱼缸补水器是一种应用广泛的智能设备&#xff0c;主要用于自动监测和补充鱼缸内的水位&#xff0c;以确保鱼类生存环境的稳定。其工作原理简单而高效&#xff0c;为饲主提供了方便和安全的使用体验。 该补水器通常由两部分组成&#xff1a;控制器和吸盘。首先&#xff0c;用户…

《平衡小车控制系统》电子设计大赛校赛感悟

我们学校举行了一次电子设计大赛选拔赛&#xff0c;虽然我们在测试的时候全部都可以完成&#xff0c;最后考核的时候因为方案选择问题以及各种设计逻辑等原因没能成功晋级&#xff0c;但我能从这次备赛中学到很多东西&#xff0c;遂分享一下&#xff0c;与广大网友交流经验。&a…

【PyCUDA安装问题集锦:网站失效】

windows 下 pycuda 安装问题 问题一 安装不上的主要问题&#xff1a;pip默认安装最新版&#xff0c;导致pycuda版本和系统版本不对应。 1.先查看cuda版本 nvidia-smi2.查看需要安装的虚拟环境的python版本&#xff08;如python3.8&#xff09; 3.前往下载python扩展包&…

C语言入门系列:数据类型转换

文章目录 一&#xff0c;自动类型转换1&#xff0c;赋值运算1.1&#xff0c;浮点数赋值给整型变量-不安全1.2&#xff0c;整数赋值给浮点数变量-安全1.3&#xff0c;窄类型赋值给宽类型-安全1.4&#xff0c;宽类型赋值给窄类型-不安全 2&#xff0c;混合类型的运算2.1&#xff…

探秘企业成功的秘密武器:这个知识库搭建攻略你必须知道

在数字化浪潮中,你的企业还在用传统的信息管理方式吗?别落后了!最新的企业知识库搭建攻略来了,它将是你提升企业竞争力、创新能力和员工效率的强力工具。让我们一起探索如何构建自己的知识王国,解锁企业成功的秘诀! 一、为什么你的企业需要立刻行动搭建知识库? 信息孤…

开启数字新纪元:全球首款开源AI女友,你的私人数字伴侣

在这个数字化飞速发展的时代,人工智能已经不再是科幻小说中的幻想,而是实实在在走进了我们的生活。今天,我们要介绍的,不仅仅是一项技术革新,更是一场关于陪伴的革命——全球首款开源AI女友,DUIX,已经横空出世! 🚀 革命性的开源平台 DUIX,由硅基智能精心打造,不…

INVS利用gatearray实现post-mask的function ECO

随着现代IC的设计发展&#xff0c;设计的规模和复杂度逐步增加&#xff0c;对于验证完备性的挑战越来越大&#xff0c;加之TO的时间压力&#xff0c;芯片设计通常会出现下列的场景&#xff1a; 芯片回片一次点亮大部分的case都可以顺利通过小部分的功能需要修正 对于重要的特…