宿舍管理系统代码详解(登录界面)

        之前已经对这个管理系统进行了大体上的结构的展现,后面的篇章将对其中的前端代码进行详细的介绍与展示。

目录

一、数据库建表

二、登录界面前端代码

        1.样式展示

        2.代码详解        

(1)template部分

(2)script部分

(3)安全问题

        添加cookie:

        web会话跟踪:

三、后端代码 

1.admin

2.LoginServelet

3.LoginDao

四、过滤器


一、数据库建表

-- 管理员表
CREATE TABLE admin(
id INT PRIMARY KEY AUTO_INCREMENT,
account VARCHAR(20),
PASSWORD VARCHAR(50),
gender CHAR(1),
phone VARCHAR(11),
oper_time DATETIME
)

        管理员是不可能从前端的操作页面上添加信息的,所以一般都是在数据库中添加好管理员的信息。

二、登录界面前端代码

        1.样式展示

        2.代码详解        

        前端是以vue框架为基础搭建的,所以代码会有三部分(<template>,<script>,<style>)

(1)template部分

<template><el-form ref="form" :model="form" label-width="80px"><el-form-item label="账号" style="width: 300px;"><el-input v-model="form.account"></el-input></el-form-item><el-form-item label="密码" style="width: 300px;"><el-input type="password" v-model="form.password"></el-input></el-form-item><el-form-item><el-button type="primary" @click="onSubmit">登录</el-button><el-button>取消</el-button></el-form-item></el-form>
</template>

        这部分是引用element-UI组件的代码,然后对代码进行修改,已达到自己想要的样式(Element - 网站快速成型工具)

<el-input></el-input>简单的文本框输入,type中可添加“password”使输入的内容隐藏

<el-button></el-button>按钮组件

(2)script部分

<script>export default {data() {return {form: {account: "admin",password: "4321"}}},methods: {onSubmit() {if (this.form.account.length == 0) {this.$message({message: '账号不能为空!',type: 'warning'});return;}if (this.form.password.length == 0) {this.$message({message: '密码不能为空!',type: 'warning'});return;}//与后端交互this.$http.post("login", "account=" + this.form.account + "&password=" + this.form.password).then((resp) => {if (resp.data.code == 200) {sessionStorage.setItem("account", resp.data.result.account);sessionStorage.setItem("gender", resp.data.result.gender);sessionStorage.setItem("phone", resp.data.result.phone);sessionStorage.setItem("token", resp.data.result.token);this.$router.push("/Main");}if (resp.data.code == 201) {this.$message({message: resp.data.desc,type: 'warning'});return;} else {this.$message({message: resp.data.desc,type: 'warning'});return;}});}}}
</script>

1.data中是前端中的数据,登录需要9账号(account)和密码(password)两个数据,可以将这两个数据放在form中,方便调用

        为了测试方便,就直接在前端给账号密码赋值了,后续测试中就不用来回输入数据了,在整体的项目结束后,不要忘了在前端赋值的数据删除

2.methods——方法,用来写js中的函数,方法包含一系列语句和算法,用于执行特定的任务。通过调用方法,可以对对象进行操作、访问字段或返回特定的结果。方法是类中的核心组成部分,用于封装可重用的代码块。

3.onSubmit()函数:用来判断账号密码是否为空,不为空时才能进入到操作页面。

this.$http.post("login", "account=" + this.form.account + "&password=" + this.form.password).then((resp)

在js中的数据是json类型的,要传到前端需要进行序列化(即将json对象序列化为 键=值&键=值)所以需要这么一段话进行拼接,但是这只适合少量的数据,如果数据量大的话,就会十分麻烦,所以就可以写一个函数专门用来对象序列化:

function jsonToString(form) {var str = "";for (var s in form) {str += s + "=" + form[s] + "&";}return str.substring(0, str.length - 1);}

后面就可以直接调用这个函数即可。

4.从网页接受data.code值,然后进行判断。如果为200,就将管理员的数据一并由路由导航跳转到后面的操作页面,否则就进行报错。

(3)安全问题

        1.登陆成功后,在前端获取到后端响应的信息

        前端存储用户信息

        2.在前端判断用户是否登录

        目前除了访问login.vue是不需要登录,除此之外的组件,都必须是登录后才能访问

        使用vue-router中的路由导航守卫,在前端每次发生路由跳转时会触发拦截

        判断访问哪些组件,哪些组件需要登录,那些组件不需要登录

        3.路由嵌套

        在main路由下,嵌套其他的子路由

        4.后端判断用户身份

        添加cookie:
package com.ffyc.dormserver.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
后端向前端响应时,告诉前端,本次响应是安全的*/
@WebFilter(urlPatterns = "/*")
public class CorsFilter implements Filter {public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws IOException, ServletException {HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;//允许携带Cookie时不能设置为* 否则前端报错httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("origin"));//允许所有请求跨域httpResponse.setHeader("Access-Control-Allow-Methods", "*");//允许跨域的请求方法GET, POST, HEAD 等httpResponse.setHeader("Access-Control-Allow-Headers", "*");//允许跨域的请求头httpResponse.setHeader("Access-Control-Allow-Credentials", "true");//是否携带cookiefilterChain.doFilter(servletRequest, servletResponse);}
}
        web会话跟踪:

        因为http请求是无状态,一次请求响应结束后,就结束了,下一次再向服务器发送请求,服务器并不知道是谁向他发送的

        我们需要对整个会话过程进行跟踪:

        1.当登录时,后端验证账号密码是否正确,如果账号正确,就需要在后端为当前登录的用户生成一个令牌(token),将令牌信息响应给前端

        2.前端存储token

        3.后面每次从前端向后端发送请求,都要携带token

        4.后端验证令牌,如果令牌有效,继续向后执行,如果令牌无效,向前端返回

package com.ffyc.dormserver.filter;import com.fasterxml.jackson.databind.ObjectMapper;
import com.ffyc.dormserver.model.Result;
import com.ffyc.dormserver.util.JWTUtil;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;@WebFilter(urlPatterns = "/api/*")
public class TokenFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request=(HttpServletRequest)servletRequest;//向下转型String token=request.getHeader("token");//请求头中的tokenSystem.out.println("token验证过滤器");//验证tokenboolean res= JWTUtil.verify(token);if(res){//token验证成功,继续向后执行,到达目标servlet程序filterChain.doFilter(servletRequest,servletResponse);}else{//token验证失败,向前端响应401Result result=new Result(401,"token认证失败",null);servletResponse.getWriter().print(new ObjectMapper().writeValueAsString(result));}}
}

三、后端代码 

1.admin

package com.ffyc.dormserver.model;public class Admin {private int id;private String account;private String password;private String gender;private String phone;private String token;public String getToken() {return token;}public void setToken(String token) {this.token = token;}public int getId() {return id;}public String getAccount() {return account;}public String getPassword() {return password;}public String getGender() {return gender;}public String getPhone() {return phone;}public void setId(int id) {this.id = id;}public void setAccount(String account) {this.account = account;}public void setPassword(String password) {this.password = password;}public void setGender(String gender) {this.gender = gender;}public void setPhone(String phone) {this.phone = phone;}
}

在后端获取管理员的信息

2.LoginServelet

package com.ffyc.dormserver.web;import com.fasterxml.jackson.databind.ObjectMapper;
import com.ffyc.dormserver.dao.LoginDao;
import com.ffyc.dormserver.model.Admin;
import com.ffyc.dormserver.model.Result;
import com.ffyc.dormserver.util.JWTUtil;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;/*
登录处理的servlet程序--web层(与前端交互的一层)*/
@WebServlet(urlPatterns = "/login",name="login",loadOnStartup = 1)
public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//接收前端提交的数据String account=req.getParameter("account");String password=req.getParameter("password");//调用其他的程序处理LoginDao loginDao=new LoginDao();Result<Admin>result=null;//标准的数据结果try {Admin admin=loginDao.login(account,password);//向后端做出响应if(admin!=null){//登陆成功后为当前登录的用户生成tokenString token= JWTUtil.getToken(admin);admin.setToken(token);result=new Result<>(200,"登陆成功",admin);//resp.getWriter().print(new ObjectMapper().writeValueAsString(admin));}else{result=new Result<>(201,"账号或密码错误",null);//resp.getWriter().print("账号或密码错误!");}} catch (Exception throwables) {throwables.printStackTrace();result=new Result<>(500,"系统忙!",null);//resp.getWriter().print("系统忙!");}resp.getWriter().print(new ObjectMapper().writeValueAsString(result));//向前端做出响应}
}

登录界面只需要将数据返回到后端,所以只有dopost方法,没有doget方法

在dopost方法中,需要接受传到后端的账号和密码两个数据,然后调用dao类判断数据库中是否有对应的值,然后返回对应的admin值

3.LoginDao

package com.ffyc.dormserver.dao;import com.ffyc.dormserver.model.Admin;
import com.mysql.jdbc.Driver;import java.sql.*;public class LoginDao {public Admin login(String account, String passwords) throws SQLException {DriverManager.registerDriver(new Driver());String url = "jdbc:mysql://127.0.0.1:3306/dormdb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";Connection connection = null;PreparedStatement ps = null;Admin admin = null;try {//建立与数据库的连接connection = DriverManager.getConnection(url, user, password);ps = connection.prepareStatement("select id,account,gender,phone from admin where account=? and password=?");ps.setString(1, account);ps.setString(2, passwords);ResultSet rs = ps.executeQuery();while (rs.next()) {admin = new Admin();admin.setId(rs.getInt("id"));admin.setAccount(rs.getString("account"));admin.setGender(rs.getString("gender"));admin.setPhone(rs.getString("phone"));}return admin;} finally {if (ps != null) {ps.close();}if (connection != null) {connection.close();}}}
}

与后端交互的代码,只用查找前端传过来的数据在数据库中是否存在即可

连接好数据库后,进行查找,将查找出来的值传给damin

四、过滤器

package com.ffyc.dormserver.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/*
设置请求和响应编码集*/
@WebFilter(urlPatterns = "/*")
public class EncodingFilter implements Filter {/*执行过滤操作的方法*/@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("编码过滤器");//设置请求编码集servletRequest.setCharacterEncoding("utf-8");//设置响应编码集servletResponse.setContentType("text/html;charset=utf-8");//让请求离开过滤器,继续向下执行,下一个可能是过滤器,也可能是目标访问的servletfilterChain.doFilter(servletRequest,servletResponse);}
}

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

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

相关文章

DC/DC 隔离定电,压输入电源(0.1-3W)介绍

定电压输入非稳压输出 SMD(0.25-2W)系列&#xff0c;典型性能:直流输入、直流输出隔离型模块电源SMD 表贴型产品&#xff0c;完全实现采用全自动贴片机来组装和满足回流焊工艺&#xff0c;大大提高产能和人工费用。此产品小&#xff0c;效率高&#xff0c;低输出纹波及提供 300…

SSH 免密登录,设置好仍然需要密码登录解决方法

说明&#xff1a; ssh秘钥登录设置好了&#xff0c;但是登录的时候依然需要提供密码 查看系统安全日志&#xff0c;定位问题 sudo cat /var/log/auth.log或者 sudo cat /var/log/secure找到下面的信息 Authentication refused: bad ownership or modes...&#xff08;网上的…

重大升级 | OpenSCA SaaS全面接入供应链安全情报!

结合社区用户反馈及研发小伙伴的积极探索&#xff0c; OpenSCA 项目组再次发力&#xff0c;SaaS版本重大升级啦&#xff01; 用户的需求是OpenSCA前进的动力&#xff0c;欢迎更多感兴趣的朋友们积极试用和反馈~ 更 新 内 容 1.全面接入云脉XSBOM供应链安全情报 2.强大的资产…

嫦娥六号揭秘真相:阿波罗登月是真是假?一文终结所有疑问!

近期&#xff0c;嫦娥六号的成功发射如同璀璨的星辰&#xff0c;再次将人们的视线聚焦于浩瀚的宇宙&#xff0c;与此同时&#xff0c;网络上关于美国阿波罗登月是否造假的争议也如潮水般涌现。一些声音宣称&#xff0c;嫦娥六号的发射为揭示美国阿波罗登月任务的真实性提供了关…

宝塔面板各种疑难杂症处理命令教程

下载地址&#xff1a;宝塔面板各种疑难杂症处理命令教程 这份宝塔面板各种疑难杂症处理命令教程&#xff0c;可以解决市面上遇到的各种难题&#xff0c;建议有技术能行的下载使用&#xff0c;小白也可以下载来学习可以帮助你解决宝塔面板遇到的各种难题

对中介者模式的理解

目录 一、场景1、题目 【[来源](https://kamacoder.com/problempage.php?pid1094)】1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 二、不采用中介者设计模式1 代码2 问题 三、中介者设计模式1 代码2 更好的例子 四、个人思考 一、场景 设计模式不是银弹&am…

宝塔纯净版 7.6.0版本无需手机登录 [稳定版本/推荐]

下载地址&#xff1a;宝塔纯净版 7.6.0版本无需手机登录.zip 宝塔纯净版介绍 无需手机登录&#xff1a;不再有手机登录提示&#xff0c;或按照提示输入任意手机号密码即可模拟绑定&#xff1b; 安全&#xff1a;剥离了所有与宝塔官方的通信、上报、下发&#xff1b;并且不与…

有哪些网络兼职适合大学生参与?揭秘几个简单又实用的兼职机会

有哪些网络兼职适合大学生参与&#xff1f;揭秘几个简单又实用的兼职机会 对于大学生而言&#xff0c;除了专注于学业&#xff0c;利用空余时间参与一些网络兼职&#xff0c;不仅能锻炼个人技能&#xff0c;还能为未来的职业生涯积累宝贵的经验。想象一下&#xff0c;步入社会…

Linux-磁盘管理类实训

一、Linux分区和磁盘操作命令 &#xff08;1&#xff09;将系统内所有的分区&#xff08;文件系统&#xff09;列出来&#xff09; &#xff08;2&#xff09;将系统中所有特殊文件格式及名称都列出来 &#xff08;3&#xff09;将/bin下面的可以用的磁盘容量以易读的容量格式…

房屋出租管理系统需求分析及功能介绍

房屋租赁管理系统适用于写字楼、办公楼、厂区、园区、商城、公寓等商办商业不动产的租赁管理及租赁营销&#xff1b;提供资产管理&#xff0c;合同管理&#xff0c;租赁管理&#xff0c; 物业管理&#xff0c;门禁管理等一体化的运营管理平台&#xff0c;提高项目方管理运营效率…

OpenAI之Whisper实时语音分析转文字

1.安装ffmpeg 2.安装python3.11 3.安装whisper pip install whisper conda环境安装whisper conda install whisper 命令行安装openai-whisper pip install openai-whisper 设置环境变量 4.分析语音并输出(默认使用GPU计算&#xff0c;如果没有安装CUDA,请使用CPU) whisper …

吃透前端文件上传与文件相关操作

最近在学文件上传的操作,所以想把学习到东西写成一文章 这片文章是我以小白视角 慢慢学习并熟悉前端文件相关操作的流程总结出来的 前端文件上传 我首先想到是 <input type"file">选择文件</input>如果我们想限制上传文件的格式,大小或进行裁剪分片上传…

2024审计师报名流程图解❗报名时间汇总❗

2024年审计专业技术资格考试报名正在进行中 &#x1f50d;审计报名流程 一、考生注册 打开浏览器登录中国人事考试网进行【考生注册】&#xff0c;按照提示认真填写个人注册信息&#xff0c;确保个人信息真实、完整、准确&#xff0c;并上传已处理好的照片。 二、考生报名 1⃣考…

[C++核心编程-09]----C++类和对象之继承

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

C++进阶:哈希(1)

目录 1. 简介unordered_set与unordered_map2. 哈希表&#xff08;散列&#xff09;2.1 哈希表的引入2.2 闭散列的除留余数法2.2.1 前置知识补充与描述2.2.2 闭散列哈希表实现 2.3 开散列的哈希桶2.3.1 结构描述2.3.2 开散列哈希桶实现2.3.3 哈希桶的迭代器与key值处理仿函数 3.…

7B2 PRO主题5.4.2 免授权开心版源码 | WordPress主题

简介&#xff1a; B2 PRO 5.4.2 最新免授权版不再需要改hosts&#xff0c;和正版一样上传安装就可以激活。 直接在WordPress上传安装即可 点击下载

巴奴火锅翻车,杜中兵后悔暗讽海底捞

曾经喊出“服务不过度&#xff0c;样样都讲究”、内涵海底捞的巴奴火锅&#xff0c;又改回了2012年的广告语&#xff0c;试图重回“产品主义”。 巴奴火锅于2001年创立于河南安阳&#xff0c;彼时被视作火锅界的黑马。巴奴火锅创始人的杜中兵&#xff0c;坚信“产品主义”一定…

基于SpringBoot + Vue的学生宿舍课管理系统设计与实现+毕业论文(15000字)+开题报告

系统介绍 本系统包含管理员、宿管员、学生三个角色。 管理员&#xff1a;管理宿管员、管理学生、修改密码、维护个人信息。 宿管员&#xff1a;管理公寓资产、管理缴费信息、管理公共场所清理信息、管理日常事务信息、审核学生床位安排信息。 学生&#xff1a;查看公共场所清理…

【C++】 string类:应用与实践

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

ASP.NET Web Api 如何使用 Swagger 管理 API

前言 Swagger 是一个开源的框架&#xff0c;支持 OpenAPI 规范&#xff0c;可以根据 API 规范自动生成美观的、易于浏览的 API 文档页面&#xff0c;包括请求参数、响应示例等信息&#xff0c;并且&#xff0c;Swagger UI 提供了一个交互式的界面&#xff0c;可以帮助我们快速…