1.系统简要概述
此系统采用java语言,利用java web技术设计而成,主要涉及的内容有:JSP、JavaBean、Servlet、JDBC、Tomact,数据库语言采用的是mysql,另外对echart、MD5加密校验、以及在线接收短信验证技术,也有所运用。此系统难度适中,对标高校平常的课程设计以及毕业设计。
2.系统主要用到的数据库表(列举三个)
admins(管理员、护工)表 管理员相关信息
老人信息表
老人每日健康打卡信息表
3.主要功能
此系统分为管理端和用户端。管理端主要是后台管理员,负责全院人员信息的维护,护工主要功能是对负责的老人每日健康上报,和记录老人的需求等,总的功能框架见下图。
部分功能详细实现:
3.1系统用户管理
在敬老院系统中,系统用户管理算时最基本的功能。因为里面要设置护工信息,随时登记护工的信息,所以在这个基础功能中主要包括查询系统用户、增加系统用户,以及适当的进行修改等几个模块。
3.2老人信息管理
敬老院的主要面向对象就是老人,所以对老人的管理贯穿在整个系统之中,首先老人信息管理包括系统管理员管理和护工管理。其中系统管理员的功能包括老人入院信息登记,查看院里全部老人分布信息,护工的功能包括老人健康信息上报,查看老人信息,以及反馈老人意见到系统等。
3.3疾病记录管理
老人在院里的健康记录非常重要,是评估老人身体发展的一项重大指标,在日常生活中,老人会生病,这时候就需要系统管理员详细的记录老人的疾病状况。
3.4健康数据管理
健康数据管理是此系统的一项重大功能,此功能可以反应近期老人的部分重要健康指标,主要包括血氧饱和度,心率以及体温变化情况。管理员以可视化查询指定老人的健康指标,对近期老人的健康是否有异常能够清晰透彻的观察到。
4.具体实现效果
登录页面:
管理员或护工在使用系统时必须要顺利登录到系统中。在这里有两种登录方式,一种是需要提供账号和密码,另外一种是以手机号接收验证码方式登录。无论哪种都需要提供正确的账号和密码信息,同时在验证中生成动态验证码对用户信息进行验证。如果不正确,提示输入信息有误,请重新输入,如果正确则成功登录系统,并根据登录的用户名不同而进入相应的用户功能界面,具备不同的操作权限。登录界面如图所示。
系统用户管理
系统用户管理是后端管理员管理护工的一项功能,包括护工信息的查看和修改,新增护工信息等。
老人信息汇总
为了达到可视化的效果,此功能接入了Echarts接口,将院里的老人以统计表的形式呈现在网页上面,其效果图如图所示。
健康数据管理
5.代码部分
登陆
login.jsp
<%@ page language="java" import="java.util.*"
contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<link href="css/login.css" rel="stylesheet" rev="stylesheet"
type="text/css" media="all" />
<link href="css/demo.css" rel="stylesheet" rev="stylesheet"
type="text/css" media="all" />
<link rel="stylesheet" href="css/bootstrap.min.css" />
<link rel="stylesheet" href="css/bootstrap-datetimepicker.min.css" />
<script type="text/javascript" src="js/jquery-1.4.4.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<style type="text/css">
#login {
width: 450px;
height: 100px;
margin: 126px auto;
}
#btn {
margin-left: 128px;
margin-top: 3px;
width: 112px;
height: 27px;
font-size: 10px;
background: #eef3f8;
text-align: center;
}
body {
background-color: #ecfcf9;
}
</style>
</head>
<script type="text/javascript">
var InterValObj; //timer变量,控制时间
var count = 60; //间隔函数,1秒执行
var curCount; //当前剩余秒数
function sendMessage() {
curCount = count;
$("#btn").attr("disabled", "true");
$("#btn").val(curCount + "秒后可重新发送");
InterValObj = window.setInterval(SetRemainTime, 1000); //启动计时器,1秒执行一次请求后台发送验证码 TODO
}
//timer处理函数
function SetRemainTime() {
if (curCount == 0) {
window.clearInterval(InterValObj); //停止计时器
$("#btn").removeAttr("disabled"); //启用按钮
$("#btn").val("重新发送验证码");
} else {
curCount--;
$("#btn").val(curCount + "秒后可重新发送");
}
}
</script>
<body>
<div style="background-color: ghostwhite; height: 60px; margin: 3px;">
<h1 align="left" style="margin-left: 120px;">
敬老院信息管理系统 <span style="font-size: 10px; margin-left: 880px;">欢迎光临</span>
</h1>
</div>
<div class="banner">
<div class="login-aside">
<div id="o-box-up"></div>
<div id="o-box-down" style="table-layout:fixed;">
<div class="error-box"></div>
<p style="margin-top: -15px;">
<a href="index.jsp "
style="font-size: 10px; color:#ffb707; margin-left: 200px;">账号密码登录</a>
</p>
<form class="registerform" action="AdminServlet?method=lojin2 "
method="post">
<div class="fm-item">
<label for="logonId" class="form-label">手机号:</label> <input
type="text" maxlength="100" id="phone" name="phone"
class="i-text" placeholder="输入手机号">
<div class="ui-form-explain"></div>
</div>
<div class="fm-item">
<label for="logonId" class="form-label">验证码:</label>
<div class="col-sm-3">
<input type="text" maxlength="100" name="code" class="i-text"
placeholder="输入6位验证码"> <input class="btn btn-default"
id="btn" name="btn" value="发送验证码" onclick="sendMessage()" />
</div>
<div class="ui-form-explain"></div>
</div>
<div class="fm-item">
<label for="logonId" class="form-label"></label> <input
type="submit" value="登录" name="submit" class="btn_btn" id="sub" />
<!-- <input type="submit" value="" tabindex="4" id="send-btn" class="btn-login">-->
<div class="ui-form-explain"></div>
</div>
</form>
</div>
</div>
<div class="bd">
<ul>
<li
style="background:url(images/bg2.png) #CCE1F3 center 0 no-repeat ; background-size: 100% 100%;"></li>
<!-- <li style="background:url(themes/bg.png) #BCE0FF center 0 no-repeat; background-size: 100% 100%;"></li> -->
</ul>
</div>
<!-- <div class="hd"><ul></ul></div> -->
</div>
<!-- <script type="text/javascript">jQuery(".banner").slide({ titCell:".hd ul", mainCell:".bd ul", effect:"fold", autoPlay:true, autoPage:true, trigger:"click" });</script> -->
<div class="banner-shadow"></div>
<div class="footer">
<p>
Copyright © 2023.Company name All rights reserved.<a
target="_blank" href="index.jsp">敬老院信息管理系统v1.0</a>
</p>
</div>
</body>
<script type="text/javascript">
var sms = "";
$("#btn").click(function() {
var phone = $("#phone").val();
var method = "tel_login"
if (phone != "") {
$.ajax({
url : "AdminServlet", //发送请求
async : true,
type : "post",
data : {
"phone" : phone,
"method" : method
},
success : function(result) {
sms = result;
}
});
} else {
alert("请输入手机号");
return false;
}
});
</script>
<script type="text/javascript">
$("#sub").click(function() {
var phone = $("#phone").val();
if (phone == "") {
alert("请输入手机号");
return false;
}
});
</script>
</html>
AdminServlet
//登录
private void Login(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
// TODO 自动生成的方法存根
ComBean cBean = new ComBean();
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
HttpSession session = request.getSession();
String username = request.getParameter("username");
String password = request.getParameter("password");
String entrypassword=MD5util.encrypt(password);//对密码进行加密
System.out.print(entrypassword);
String rember=request.getParameter("rember");//获取是否记住密码
String piccode=(String) request.getSession().getAttribute("piccode");
String checkCode=request.getParameter("checkCode");//取前端值
checkCode=checkCode.toUpperCase();//把字符全部转化为大写的(用于验证码不区分大小写)
//判断
if(username.equals("")||password.equals("")){
out.print("<script>" +
"alert('请输入信息!');" +
"window.location.href=\"index.jsp\";" +
"</script>");
return;
}
String sf = request.getParameter("sf");
if(!username.equals("")&&!password.equals("")&&sf==null){
out.print("<script>" +
"alert('请选择登录身份!');" +
"window.location.href=\"index.jsp\";" +
"</script>");
return;
}
String sql="select realname from admin where username='"+username+"' and password='"+entrypassword+"' and sf='"+sf+"' ";
String str=cBean.getString(sql);
if(str==null){
//request.setAttribute("message", "登录信息错误!");
out.print("<script>" +
"alert('账号或密码错误,请重新输入!');" +
"window.location.href=\"index.jsp\";" +
"</script>");
return;
// request.getRequestDispatcher("index.jsp").forward(request, response);
}
if(!checkCode.equals(piccode)){
out.print("<script>" +
"alert('登录失败!验证码有误');" +
"window.location.href=\"index.jsp\";"+
"</script>");
return;
}
else{
session.setAttribute("user", username);
session.setAttribute("sf", sf);
// if("1".equals(rember)){
// //创建2个Cookie
// Cookie namecookie=new Cookie("username", username);
// //设置Cookie的有效期为三天
// namecookie.setMaxAge(60*60*24*3);
// Cookie pwdcookie=new Cookie("password", entrypassword);
// pwdcookie.setMaxAge(60*60*24*3);
// response.addCookie(namecookie);
// response.addCookie(pwdcookie);
// }
//out.print("登陆成功!");
out.print("<script>" +
"alert('登录成功!');" +
"window.location.href=\"admin/index.jsp\";"+
"</script>");
//request.getRequestDispatcher("admin/index.jsp").forward(request, response);
}
}
UserServlet
//添加老人打卡信息
private void Adddk(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
// TODO 自动生成的方法存根
String date=new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime());
ComBean cBean = new ComBean();
String hg=request.getParameter("hg");
//System.out.print(hg);
PrintWriter out=response.getWriter();
String xm=request.getParameter("xm");
String cw=request.getParameter("cw");
String tw=request.getParameter("tw");
String xy=request.getParameter("xy");
String xl=request.getParameter("xl");
String yc=request.getParameter("yc");
String ms=cBean.getString("select xm from lr where cw='"+cw+"'");
String yf=date.substring(5, 7);
System.out.print(yf);
//需求
//根据日期设置sum值 截取第6和第7位 月份
//获取月份 与表里对比 当没有时 设置上一个月份的sum全为0 这样可以统计每个月打卡的次数
int sum=0;
//System.out.print(ms);
//所有护工先设置未打卡标志 0
cBean.comUp("update admin set stadu='0' where sf='hg'");
if(cBean.getMessageCount("select count(*) from lr_dk where xm='"+xm+"' and sj='"+date+"'")<1){
if(xm.equals(ms)){
int flag2=cBean.getCount("select count(*) from lr_dk where sj like '%_____"+yf+"%'");
if(flag2==0){
int yf1=Integer.parseInt(yf)-1;
cBean.comUp("update lr_dk set sum=0 where sj like '%_____"+yf1+"%'");
}
sum+=1;
int flag=cBean.comUp("insert into lr_dk(xm,cw,tw,xy,xl,yc,hg,sj,sum) values('"+xm+"','"+cw+"','"+tw+"','"+xy+"','"+xl+"','"+yc+"','"+hg+"','"+date+"','"+sum+"')");
if(flag==Constant.SUCCESS){
cBean.comUp("update admin set stadu='1' where username='"+hg+"'");
out.print("<script>;" +
"alert('上报成功!');" +
"window.location.href=\"admin/daka/add.jsp\";" +
"</script>");
}else {
out.print("<script>;" +
"alert('上报失败!');" +
"window.location.href=\"admin/daka/add.jsp\";" +
"</script>");
}
}else {
out.print("<script>;" +
"alert('上报失败!床位与老人不符');" +
"window.location.href=\"admin/daka/add.jsp\";" +
"</script>");
}
}
else {
out.print("<script>;" +
"alert('上报失败!该老人今日以上报');" +
"window.location.href=\"admin/daka/add.jsp\";" +
"</script>");
}
}
pojo层
admin
package bysj_yly.demo.pojo;
/**
*@author:fqx
*@version:2023年5月11日下午4:35:25
*类说明
*/
public class admin {
private String username;
private String password;
private String nl;
private String relname;
private String tel;
private String sf;
private String stadu;
private String addtime;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNl() {
return nl;
}
public void setNl(String nl) {
this.nl = nl;
}
public String getRelname() {
return relname;
}
public void setRelname(String relname) {
this.relname = relname;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getSf() {
return sf;
}
public void setSf(String sf) {
this.sf = sf;
}
public String getStadu() {
return stadu;
}
public void setStadu(String stadu) {
this.stadu = stadu;
}
public String getAddtime() {
return addtime;
}
public void setAddtime(String addtime) {
this.addtime = addtime;
}
}
Dao层
comeBean
package bysj_yly.demo.DAO;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
//import com.mysql.jdbc.PreparedStatement;
import java.sql.Statement;
import bysj_yly.demo.Bean.Constant;
import bysj_yly.demo.Bean.DBA;
/**
*@author:fqx
*@version:2023年1月14日下午6:45:24
*类说明
*/
public class ComBean {
private List list;
private ResultSet rs = null;
private int EVERYPAGENUM = 2;
private int count = -1;
private int qq = 0;
//声明时间变量
String date1=new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime());
String date=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());
//分页查询
public void setEVERYPAGENUM(int EVERYPAGENUM){
this.EVERYPAGENUM=EVERYPAGENUM;
}
public int getMessageCount(String sql) { //得到信息总数
DBA dbo=new DBA();
dbo.open();
try {
rs = dbo.executeQuery(sql);
rs.next();
count = rs.getInt(1);
return count;
} catch (SQLException ex) {
ex.printStackTrace();
return -1;
} finally {
dbo.close();
}
}
public int getPageCount() { //得到共多少页(根据每页要显示几条信息)
if (count % EVERYPAGENUM == 0) {
return count / EVERYPAGENUM;
} else {
return count / EVERYPAGENUM + 1;
}
}
public List getMessage(int page,String sql2,int rr) { //得到每页要显示的信息
DBA dbo=new DBA();
dbo.open();
List list = new ArrayList();
try {
rs = dbo.executeQuery(sql2);
for (int i = 0; i < (page - 1) * EVERYPAGENUM; i++) {
rs.next();
}
for (int t = 0; t < EVERYPAGENUM; t++) {
if (rs.next()) {
qq++;
List list2=new ArrayList();
for(int cc=1;cc<=rr;cc++){
list2.add(rs.getString(cc));
}
list.add(list2);
} else {
break; //减少空循环的时间
}
}
return list;
} catch (SQLException ex) {
ex.printStackTrace();
return null;
} finally {
dbo.close();
}
}
public int comUp(String sql){//增删改
DBA dbo = new DBA();
dbo.open();
try{
int i = dbo.executeUpdate(sql);
if(i == 1){
return Constant.SUCCESS;
}
else{
return Constant.SYSTEM_ERROR;
}
}catch(Exception e){
e.printStackTrace();
return Constant.SYSTEM_ERROR;
}finally{
dbo.close();
}
}
public List getCom(String sql,int row){
DBA dbo = new DBA();
list = new ArrayList();
dbo.open();
try{
rs = dbo.executeQuery(sql);
while(rs.next()){
List list2 = new ArrayList();
for(int i=1;i<=row;i++){
list2.add(rs.getString(i));
}
list.add(list2);
}
return list;
}catch(Exception e){
e.printStackTrace();
return list;
}finally{
dbo.close();
}
}
public List get1Com(String sql,int row){
DBA dbo = new DBA();
list = new ArrayList();
dbo.open();
try{
rs = dbo.executeQuery(sql);
if(rs.next()){
for(int i=1;i<=row;i++){
list.add(rs.getString(i));
}
}
return list;
}catch(Exception e){
e.printStackTrace();
return list;
}finally{
dbo.close();
}
}
public String getString(String sql){
DBA dbo = new DBA();
list = new ArrayList();
dbo.open();
try{
rs = dbo.executeQuery(sql);
if(rs.next())
return rs.getString(1);
else return null;
}catch(Exception e){
e.printStackTrace();
return null;
}finally{
dbo.close();
}
}
public int getCount(String sql){//整数查询个数
DBA dbo = new DBA();
dbo.open();
try{
rs = dbo.executeQuery(sql);
rs.next();
return rs.getInt(1);
}catch(Exception e){
e.printStackTrace();
return 0;
}finally{
dbo.close();
}
}
public float getFloat(String sql){
DBA dbo = new DBA();
dbo.open();
try{
rs = dbo.executeQuery(sql);
rs.next();
return rs.getInt(1);
}catch(Exception e){
e.printStackTrace();
return 0;
}finally{
dbo.close();
}
}
int getSum(String sql){
DBA dbo = new DBA();
dbo.open();
try {
rs=dbo.executeQuery(sql);
rs.next();
return rs.getInt(1);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return 0;
}finally{
dbo.close();
}
}
public boolean insert(String sql,Object... args) throws Exception{
DBA dbo = new DBA();
PreparedStatement statement = (PreparedStatement) dbo.getConnection().prepareStatement(sql);
for (int i=0;i< args.length;i++){
statement.setObject(i+1,args[i]);
}
if (statement.executeUpdate()!=1){
return false;
}
return true;
}
}
6.总结
以上为此系统的简要概括,如有不当或者改进的地方还请大家多多交流。