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

news2024/11/27 12:50:36

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

日志摘要:优化了教师端界面的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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【STM32-MAP文件分析】

STM32-MAP文件分析 ■ MDK编译生成文件简介■ .o■ .axf■ .hex■ .crf■ .d■ .dep■ .lnp■ .lst■ .map■ .build_log.htm■ .htm 文件■ .map 文件 ■ map文件分析■ map 文件的 MDK 设置■ 1. 要生成 map 文件 在 Listing 选项卡里面■ 2. Keil5 中打开.map 文件 ■ map 文…

如何用GO语言实现冒泡排序算法?

本章教程,介绍一下如何用GO语言实现基础排序算法中的冒泡排序。 一、程序代码 package mainimport ("fmt""math/rand""time" )// bubbleSort 函数实现冒泡排序算法 func bubbleSort(arr []int) {n

【面试干货】 Java 中的 HashSet 底层实现

【面试干货】 Java 中的 HashSet 底层实现 1、HashSet 的底层实现2、 HashSet 的特点3、 总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; HashSet 是 Java 集合框架中的一个重要成员&#xff0c;它提供了不存储重复元素的集合。但是&am…

诺瓦星云入职认知能力SHL测验Verify职业性格问卷OPQ可搜索带解析求职题库

欢迎您开启诺瓦星云的求职旅程 恭喜您进入测评环节&#xff0c;接下来您需要作答两个测验&#xff0c;分别是职业性格问卷OPQ和认知能力测验Verify&#xff0c;总共用时大约1小时&#xff0c;祝您作答顺利! 【华东同舟求职】由资深各行业从业者建立的一站式人才服务网络平台&a…

蓝桥杯 经典算法题 合并排序数组

题目&#xff1a; 题解&#xff1a; leetcode上也有这道题一模一样。和归并排序的小过程基本一模一样&#xff0c;只不过因为题目要求只能将arr2中元素合并到arr1中&#xff0c;一种可行的方法是按元素从大到小&#xff0c;顺序从每个序列尾部开始操作&#xff0c;第一填的位置…

Introduction to linear optimization 第 2 章课后题答案 11-15

线性规划导论 Introduction to linear optimization (Dimitris Bertsimas and John N. Tsitsiklis, Athena Scientific, 1997)&#xff0c; 这本书的课后题答案我整理成了一个 Jupyter book&#xff0c;发布在网址&#xff1a; https://robinchen121.github.io/manual-introdu…

2024年AI+游戏赛道的公司和工具归类总结

随着人工智能技术的飞速发展,AI在游戏开发领域的应用越来越广泛。以下是对2024年AI+游戏赛道的公司和工具的归类总结,涵盖了从角色和场景设计到音频制作,再到动作捕捉和动画生成等多个方面。 2D与3D创作 2D创作工具:专注于角色和场景的平面设计,提供AI辅助的图案生成和风…

【GUI】LVGL无操作系统移植以及移植过程错误处理

目录 介绍 1. 删除源码 2. 导入lvgl到项目screen_mcu中 3. keil添加分组和头文件 4. 移植显示 5. 移植触摸 6. 添加测试案例 6.1. 测试按钮 6.2. 测试音乐界面 7. 提供时钟 错误处理 L6218E错误 出现花屏 屏幕颜色不对 内存分配 介绍 本文 主要介绍GD32移植…

网络编程(TCP协议,UDP协议)

目录 网络编程三要素 IP IPv4 InetAddress类 端口号 协议 UDP协议 UDP协议发送数据 UDP协议接收数据 UDP的三种通信方式(代码实现) TCP协议 TCP通信程序 三次握手和四次挥手 练习 1、客户端:多次发送数据服务器:接收多次接收数据&#xff0c;并打印 2、客户端…

Mysql安装 /lib64/libc.so.6: version `GLIBC_2.28‘ not found 缺少 glibc-2.28.tar.gz

问题&#xff1a;安装Mysql出现 Error mysql/bin/mysqld: /lib64/libm.so.6: version GLIBC_2.27 not found (required by mysql/bin/mysqld) mysql/bin/mysqld: /lib64/libc.so.6: version GLIBC_2.28 not found (required by mysql/bin/mysqld) mysql/bin/mysqld: /lib64/lib…

云计算之CDN

目录 一.什么是CDN&#xff1f; 二.使用CDN的好处&#xff1a; 三.主要特点&#xff1a; 四.关键功能&#xff1a; 一.什么是CDN&#xff1f; 1.CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和…

LabVIEW电动汽车核心部件检测系统

LabVIEW开发的电动汽车核心部件检测系统&#xff0c;通过硬件接入板和数据采集卡实现信号采集和分析。系统具备智能诊断、模块化设计和用户友好的特点&#xff0c;能够快速、精确地定位故障&#xff0c;提高电动汽车的维护效率和可靠性&#xff0c;支持新能源汽车市场的快速发展…

【教程】PVE下uhd630核显直通HDMI输出 以NUC9为例村雨Murasame

大家好&#xff0c;村雨本雨又来发教程了 最近在搞小主机&#xff0c;之前hp400g3仅仅200多元成功核显直通HDMI&#xff0c;作为简单NAS、解码机、伺服机、中控都非常棒&#xff0c;待机仅9w 村雨Murasame&#xff1a;【教程】7代核显直通HDMI成功输出画面 PVE下7代intel核显…

多路h265监控录放开发-(8)完成摄像机管理的修改和删除功能

xviewer.h public:XViewer(QWidget* parent Q_NULLPTR);//编辑摄像机void SetCam(int index);//121 public slots:void AddCam(); //新增摄像机配置120void SetCam(); //121void DelCam(); //121 private:Ui::XViewerClass ui;QMenu left_menu_; xviewer.cpp void XView…

2024最新1小时零基础编写uniapp和小程序管理后台,基于uniadmin和vue3实现uniapp小程序的网页管理后台

一&#xff0c;创建uniAdmin项目 打开开发者工具Hbuilder,然后点击左上角的文件&#xff0c;点新建&#xff0c;点项目。如下图。 选择uniadmin&#xff0c;编写项目名&#xff0c;然后使用vue3 记得选用阿里云服务器&#xff0c;因为最便宜 点击创建&#xff0c;等待项目创…

Postman 接口测试 安装使用教程

1 下载官网:https://www.postman.com/downloads/ 2 方便下载,特提供百度云网盘: 链接&#xff1a;Postman 3 windows10 安装&#xff0c;点击安装包 #自动安装&#xff0c;并打开 4 举例&#xff0c;比如豆瓣&#xff0c;get 查询时间&#xff0c;图片登 5 举例&#xff0…

Android网络编程之Http通信

//使用HttpURLConnection打开连接 2.HttpURLConnection urlConn (HttpURLConnection) url.openConnection(); //得到读取的内容(流) 4.InputStreamReader in new InputStreamReader(urlConn.getInputStream()); // 为输出创建BufferedReader BufferedReader buffer new …

小米测开二面—80min中核

小米测开二面—80min中核 3.28 无自我介绍直接开问&#xff01;你的第一份实习是一个开发工作你的第二实习为什么又跑到测试了你的第一份实习遇到了哪些挑战你的逆向开发的开发目标是什么&#xff0c;使用了什么工具你最终开发落地是用在了什么方面上&#xff0c;比如机器人路…

【FPGA + Nvidia/算能GPU+AI】自动驾驶多核异构实现 16路车载摄像头实时AI分析解决方案

基于 Xilinx 公司ZYNQ Ultrascale MPSoC系列 FPGA 芯片设计&#xff0c;应用于无人驾驶、慢速特种车及数据采集车、车载仿真测试系统等自动驾驶领域 自动驾驶&#xff1a;16通道车载摄像头PCIE采集卡方案。 16 通道摄像头 最多支持 16 通道 GMSL1/2 摄像头输入 8MP 摄像头 最…

[火灾警报系统]yolov5_7.0-pyside6火焰烟雾识别源码

国内每年都会发生大大小小的火灾&#xff0c;造成生命、财产的损失。但是很多火灾如果能够早期发现&#xff0c;并及时提供灭火措施&#xff0c;将会大大较小损失。本套源码采用yolov5-7.0目标检测算法结合pyside6可视化界面源码&#xff0c;当检测到火灾时&#xff0c;能否发出…