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

发布于:2024-06-22 ⋅ 阅读:(98) ⋅ 点赞:(0)

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

日志摘要:完成了学生端+教师端登陆功能的实现以及相应功能的后端调优

开发日志中所有图片均为概念图,请大家以实际发布上线为准

一、学生端登陆功能开发

老生常谈的问题:

没有思路怎么办:那就先写前端!

前端技术:HarmonyOS

1、使用ArkTS构建简单的前端界面:

请添加图片描述

import router from '@ohos.router'
import promptAction from '@ohos.promptAction'
import StudentLogins from '../../HttpModel/Student/StudentLogins'
@Entry
@Component
struct StudentLogin {
  @State message: string = 'Hello World'
  sid:string = null
  pwd:string = null
  build() {
    Row(){
      Column({space:30}) {
        Text("学生登陆")
          .fontSize(40)
          .fontWeight(FontWeight.Bolder)
          .fontFamily("楷体")
        //账号
        Row({space:20}){
          Text("账号")
            .fontSize(20)
          TextInput({placeholder:'请输入账号'})
            .width(250)
            .height(50)
            .onChange(value=>{
              this.sid=value
            })
        }
        .width('100%')
        .justifyContent(FlexAlign.Center)
        //密码
        Row({space:20}){
          Text("密码")
            .fontSize(20)
          TextInput({placeholder:'请输入密码'})
            .width(250)
            .height(50)
            .type(InputType.Password)
            .onChange(value=>{
              this.pwd=value
            })
        }
        .width('100%')
        .justifyContent(FlexAlign.Center)
        //登陆按钮
        Button("登陆")
          .width(100)
          .onClick(()=>{
            console.log("前端数据"+this.sid+this.pwd)
           //此处向后端发送请求并处理相应
      }
      .width('100%')
      .height(300)
      .justifyContent(FlexAlign.Center)
      .backgroundColor(Color.White)
      .borderRadius(10)
    }
    .height('100%')
    .width('100%')
  }
}

2、在前端调用向后端发送请求方法

StudentLogins.StuLogin(this.sid,this.pwd)
    .then(resp => {
    if(resp.toString()==='1'){
        promptAction.showToast({
            message: '登陆成功',
            duration: 2000,
            bottom: 50
        });
        router.pushUrl({
            url:"pages/view/Student/Student",
            params:{'id':1}
        },
                       router.RouterMode.Single,
                       err => {
            if(err){
                console.log("跳转失败")
            }
        }
                      )
    }
    else if(resp.toString()==='0'){
        promptAction.showToast({
            message: '账号密码错误',
            duration: 2000,
            bottom: 50
        });
    }
    else {
        promptAction.showToast({
            message: '请求失败,请检查网络设置',
            duration: 2000,
            bottom: 50
        });
    }
})
})

3、发送以及接收请求方法:

import http from '@ohos.net.http';
import IP from '../../IP'

class StudentLogins{
  baseUrl:string = IP.ip
  StuLogin(id:string,pwd:string):Promise<number>{//异步处理返回值
    const data = {
      username:id,
      password:pwd
    }
    return new Promise((resolve,reject) => {
      //创建请求
      let httpRequest = http.createHttp()
      //发送请求
      httpRequest.request(
        `${this.baseUrl}/Slogin`,
        {
          method:http.RequestMethod.GET,
          extraData:data,
          connectTimeout: 10000,
          readTimeout:10000
        },
      )
        .then(resp => {
          if(resp.responseCode === 200){
            console.log('http请求成功!'+resp.result)
            if(resp.result === '欢迎同学'){
              resolve(1)
            }
            else resolve(0)
          }
          else {
            console.log('请求失败')
          }
        })
        .catch(error => {
          console.log("请求发现异常"+error)
          reject(-1)
        })
    })
  }
}

const studentlogin = new StudentLogins()
export default studentlogin as StudentLogins

3、后端代码:

技术选型:Java web

由于移动端和网页端结构不一样,所以这里采用context进行优化,专一于移动端

package contaller.Student;

import MyBatisModel.dao.StudentMapper;
import MyBatisModel.pojo.LoginStudent;
import MyBatisModel.utills.MybatisUntills;
import org.apache.ibatis.session.SqlSession;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class StudentLogin extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("application/json");
        resp.setCharacterEncoding("UTF-8");
        ServletContext ctx = getServletContext();//移动端
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("接收到前端的数据");
        System.out.println("账号:"+username+"密码: "+password);

        //Mybatis操作
        SqlSession sql = MybatisUntills.getSqlSession();
        StudentMapper mapper = sql.getMapper(StudentMapper.class);
        Map<String,Object> map = new HashMap<String, Object>();
        map.put("sid",username);
        map.put("pwd",password);
        List<LoginStudent> st = mapper.StudentLogin(map);
        if(st.size()==0){
            resp.getWriter().write("账号或密码错误!");
            sql.close();
        }
        else {
            resp.getWriter().write("欢迎同学");
            HttpSession session = req.getSession();
            session.setAttribute("username",username);//存入session
            ctx.setAttribute("username",username);//移动端
            sql.close();
        }
    }

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

Mybatis部分大家可以参考JDBC

二、教师端登陆功能开发

与学生端相同,这里不再赘述

三、兼容性问题

由于Java web中的session不支持手机端的数据同步

在不使用令牌的条件下,我在后端使用了Servletcontext对手机端数据同步的问题进行进一步的优化

以确保每个界面能同步到该用户的用户名信息

 ServletContext ctx = getServletContext();//移动端
 
   resp.getWriter().write("欢迎同学");
            HttpSession session = req.getSession();
            session.setAttribute("username",username);//存入session
            ctx.setAttribute("username",username);//移动端
            sql.close();
        }