3.1用户模块

3.1.1 功能效果图

1.注册功能

images-wps3.jpg

 

2.登录功能

images-wps4.jpg

3.1.2功能实现相关API

业务实体 数据访问层接口及功能方法 数据访问层接口实现类 业务逻辑层接口及功能方法 业务逻辑层接口实现类 控制层Servlet
User UserDao UserDaoImpl UserService UserServiceImpl UserServlet
验证用户名 checkUserName(String userName) checkUserName()
验证邮箱 checkEmail(String email)(String userName) checkEmail()
注册功能 addUser(User user) regist()
登录验证 checkLogin(User user) checkLogin()

3.1.3特殊技术点说明

1.注册功能使用Ajax实现用户名与邮箱的唯一验证

参考代码:

//验证用户名的非空、是否存在的验证

$("#username").blur(function(){

//获取用户名

var username = $("#username").val();

//判断

if(username==null||username==""){

$("#username_msg").text("用户名不能为空").css("color","red");

}else{

//向后台提交请求

$.ajax({

url:"user",

type:"post",

data:{"username":username,"method":"checkUserName"},

dataType:"json",

success:function(obj){

if(obj){

$("#username_msg").text("该用户名已被注册").css("color","red");

}else{

$("#username_msg").text("用户名验证通过").css("color","green");

}

}

})

  1. 登录功能实现验证码验证

参考代码:

@Override

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//JSP页面禁止浏览器使用缓存,因为验证码每次使用完就失效

response.setHeader("Pragma", "No-cache");

response.setHeader("Cache-Control", "no-cache");

response.setDateHeader("Expires", 0); //设置响应数据类型为图片 response.setContentType("image/jpeg"); //生成随机字串

String verifyCode = VerifyCodeUtils.generateVerifyCode(); //存入会话session

HttpSession session = request.getSession(true); //删除以前的

session.removeAttribute("verCode");

session.setAttribute("verCode", verifyCode.toLowerCase()); //生成图片

int w = 100, h = 30;

VerifyCodeUtils.outputImage(w, h, response.getOutputStream(), verifyCode);

}

3.2医生模块

3.2.1 功能效果图

登录成功进入后台主页,左侧超链接进行不同模块的管理。

images-wps5.jpg

查看医生信息列表,根据医生姓名和科室查询,其中医生名是模糊查询,同时进行分页查询。

images-wps6.jpg

添加新医生功能:

images-wps7.jpg

查看医生详情链接:

images-wps8.jpg

更改记录功能:先进行信息的回显,再修改

images-wps9.jpg

列表页面全选全不选,通过批量删除按钮实现删除多条记录功能。

images-wps10.jpg

3.2.2功能实现相关API

业务实体 数据访问层接口及功能方法 数据访问层接口实现类 业务逻辑层接口及功能方法 业务逻辑层接口实现类 控制层Servlet
Doctor DoctorDao DoctorDaoImpl DoctorService DoctorServiceImpl DoctorServlet
分页查询 findDoctorByPage(Doctor doctor,PageTool pageTool) findDoctorByPage()
总记录数 getTotalCount(Doctor doctor) ——
添加方法 insertDoctor(Doctor doctor) insertDoctor()
修改方法 updateDoctor(Doctor doctor) updateDoctor()
编号查询 findDoctorByDid(String did) findDoctorByDid()
批量删除 deleteDoctor(String ids) deleteDoctor()

3.2.3 特殊技术点说明

分页查询功能在每一个模块中都存在,因此将分页查询封装成工具类以备使用:

package com.offcn.utils;

//分页查询的工具类

//分析分页查询:

1、总记录数: totalCount 从数据表中查询

2、每页显示几条(页容量): pageSize 指定一个固定的值

3、总页数:totalPages totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1

4、当前页码:currentPage 从页面获取

5、上一页:prePage currentPage-1

6、下一页:nextPage currentPage+1

7、每页首条记录的起始下标:startIndex pageSize*(currentPage-1)

public class PageTool {

public PageTool(int totalCount,String currentPage) {

this.totalCount=totalCount;

initCurrentPage(currentPage);

public void initCurrentPage(String currentPage) {

if (currentPage==null) {

this.currentPage=1;

}else {

this.currentPage=Integer.valueOf(currentPage);

}

}

//总页数初始化

public void initTotalPages() {

this.totalPages=totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1;

}

//初始化上一页

public if (this.currentPage==1) {

this.prePage=1;

}else {

this.prePage=this.currentPage-1;

}

}

//下一页

public void initNextPage() {

if (this.currentPage==this.totalPages) {

this.nextPage=this.totalPages;

}else {

this.nextPage=this.currentPage+1;

}

}

//每页首条记录的超始下标

public void initStartIndex() {

this.startIndex=pageSize(currentPage-1);

}

private int totalCount;//总记录数

private int pageSize;//页容量

private int totalPages;//总页数

private int currentPage;//当前页码

private int prePage;//上一页

private int nextPage;//下一页

private int startIndex;//每页中首条记录的起始下标

public int getTotalCount() {

return totalCount;

}

public void setTotalCount(int totalCount) {

this.totalCount = totalCount;

}

public int getPageSize() {

return pageSize;

}

public void setPageSize(int pageSize) {

this.pageSize = pageSize;

}

public int getTotalPages() {

return totalPages;

}

public void setTotalPages(int totalPages) {

this.totalPages = totalPages;

}

public int getCurrentPage() {

return currentPage;

}

public void setCurrentPage(int currentPage) {

this.currentPage = currentPage;

}

public int getPrePage() {

return prePage;

}

public void setPrePage(int prePage) {

this.prePage = prePage;

}

public int getNextPage() {

return nextPage;

}

public void setNextPage(int nextPage) {

this.nextPage = nextPage;

}

public int getStartIndex() {

return startIndex;

}

public void setStartIndex(int startIndex) {

this.startIndex = startIndex;

}

}

3.3药品模块

3.3.1功能效果图

列表显示页面:根据药品名称和类别进行条件查询,其中药品名称是模糊查询

images-wps11.jpg

添加新药功能:

images-wps12.jpg

批量删除功能:

images-wps13.jpg

详情链接查看药品信息:

images-wps14.jpg

更改链接进行药品信息的修改,先回显要修改的信息,再进行修改操作。

images-wps15.jpg

3.3.2功能实现相关API

业务实体 数据访问层接口及功能方法 数据访问层接口实现类 业务逻辑层接口及功能方法 业务逻辑层接口实现类 控制层Servlet
Medicine MedicineDao MedicineDaoImpl MedicineService MedicineServiceImpl MedicineServlet
分页查询 findMedicineByPage(Medicine medicine,PageTool pageTool) findMedicineByPage()
总记录数 getTotalCount(Medicine medicine) ——
添加方法 insertMedicine(Medicine medicine) insertMedicine()
修改方法 updateMedicine(Medicine medicine) updateMedicine()
编号查询 findMedicineByMid(String mid) findMedicineByMid()
批量删除 deleteMedicine(String mids) deleteMedicine()

3.3.3特殊技术点说明

文件上传功能也是一个通用功能,因此将其封装成工具类方便后续调用 :

public class UploadUtil {

public static String upload(Part part, HttpServletRequest request, HttpServletResponse response, String errorPath) {

//头像上传:上传的文件不能为空上传的文件必须是图片格式

//保存文件的名称

String newfilename="";

if (part.getSize()==0) {

//没有上传文件

//在文件上传页面给出提示

request.setAttribute("msg", "请选择一张图片上传!");

//请求转发注册页面

try {

request.getRequestDispatcher(errorPath).forward(request, response);

} catch (Exception e) { **

e.printStackTrace();

}

return "";

}else {

//获取上传的文件名称

String fileName = part.getSubmittedFileName();

//处理同名文件覆盖问题:随机字符串+原来文件名 newfilename=UUID.randomUUID().toString()+"_"+fileName;

//System.out.println(fileName);

//截取后缀的起始索引

int beginIndex=fileName.indexOf(".")+1;

//截取后缀的结束索引

int endIndex=fileName.length();

//判断上传的文件是否是图片:bmp,jpg,png,tif,gif,pcx,tga,exif, fpx,svg,psd,cdr,pcd,dxf,ufo,eps,ai,raw,WMF,webp

//根据文件名称中的后缀名来判断是否是图片格式:获取文件的后缀名称

String type = fileName.substring(beginIndex, endIndex);

System.out.println(type);

if (!type.equals("jpg")&&!type.equals("png")&&!type.equals("gif")) {

//上传不是图片:在注册页面给出提示

request.setAttribute("msg", "上传的文件必须是图片格式!");

try {

request.getRequestDispatcher(errorPath).forward(request, response);

} catch (Exception e) {

e.printStackTrace();

}

return "";

}

//设置图片的目标文件地址

String path="E:/bookpic/";

//判断目标路径是否存在

File file=new File(path);

if(!file.exists()) {

//如果目标路径不存在就创建目标出来

file.mkdirs();

}

//将文件保存

try {

part.write(path+newfilename);

} catch (IOException e) {

e.printStackTrace();

}

}

return newfilename;

}

}

3.4挂号模块

3.4.1功能效果图

列表显示页面,根据病历号、姓名、科室进行条件查询,同时使用分页显示列表。

images-wps16.jpg

门诊挂号功能:

images-wps117.jpg

批量删除:

images-wps118.jpg

详情链接显示病人详细信息:

images-wps119.jpg

更改链接先进行信息回显,再修改病人信息,要求状态为挂号状态才可更改。

images-wps120.jpg

3.4.2功能实现相关API

业务实体 数据访问层接口及功能方法 数据访问层接口实现类 业务逻辑层接口及功能方法 业务逻辑层接口实现类 控制层Servlet
Register RegisterDao RegisterDaoImpl RegisterService RegisterServiceImpl RegisterServlet
分页查询 findRegisterByPage(Register register,PageTool pageTool) findRegisterByPage()
总记录数 getTotalCount(Register register) ——
添加方法 insertRegister(Register register) insertRegister()
修改方法 updateRegister(Register register) updateRegister()
编号查询 findRegisterByMid(String rid) findRegisterByMid()
批量删除 deleteRegister(String rids) deleteRegister()

3.4.3特殊技术点说明

挂号信息表与医生表之间存在主外键关联,因此在挂号信息显示时要注册关联表的数据的展示,解决方式即在Register业务实体中添加一个医生的实体对象作为属性,以辅助查询功能。

private Doctor doctor;

//辅助显示的实体对象

public Doctor getDoctor() {

return doctor;

}

public void setDoctor(Doctor doctor) {

this.doctor = doctor;

}

//在业务逻辑层进行数据查询处理 //分页查询

public List findRegisterByPage(PageTool pageTool, Register r) {

List rList = rDao.findRegisterByPage(pageTool, r);

for (Register register : rList) {

int did = register.getDid();

//医生的编号

register.setDoctor(dDao.findDoctorByDid(did+""));

}

return rList;

}

 

//根据rid查询

public Register findRegisterByRid(String rid) {

Register register = rDao.findRegisterByRid(rid); register.setDoctor(dDao.findDoctorByDid(register.getDid()+""));

return register;

}