1.注册功能
2.登录功能
业务实体 | 数据访问层接口及功能方法 | 数据访问层接口实现类 | 业务逻辑层接口及功能方法 | 业务逻辑层接口实现类 | 控制层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() |
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");
}
}
})
参考代码:
@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);
}
登录成功进入后台主页,左侧超链接进行不同模块的管理。
查看医生信息列表,根据医生姓名和科室查询,其中医生名是模糊查询,同时进行分页查询。
添加新医生功能:
查看医生详情链接:
更改记录功能:先进行信息的回显,再修改
列表页面全选全不选,通过批量删除按钮实现删除多条记录功能。
业务实体 | 数据访问层接口及功能方法 | 数据访问层接口实现类 | 业务逻辑层接口及功能方法 | 业务逻辑层接口实现类 | 控制层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() |
分页查询功能在每一个模块中都存在,因此将分页查询封装成工具类以备使用:
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;
}
}
列表显示页面:根据药品名称和类别进行条件查询,其中药品名称是模糊查询
添加新药功能:
批量删除功能:
详情链接查看药品信息:
更改链接进行药品信息的修改,先回显要修改的信息,再进行修改操作。
业务实体 | 数据访问层接口及功能方法 | 数据访问层接口实现类 | 业务逻辑层接口及功能方法 | 业务逻辑层接口实现类 | 控制层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() |
文件上传功能也是一个通用功能,因此将其封装成工具类方便后续调用 :
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;
}
}
列表显示页面,根据病历号、姓名、科室进行条件查询,同时使用分页显示列表。
门诊挂号功能:
批量删除:
详情链接显示病人详细信息:
更改链接先进行信息回显,再修改病人信息,要求状态为挂号状态才可更改。
业务实体 | 数据访问层接口及功能方法 | 数据访问层接口实现类 | 业务逻辑层接口及功能方法 | 业务逻辑层接口实现类 | 控制层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() |
挂号信息表与医生表之间存在主外键关联,因此在挂号信息显示时要注册关联表的数据的展示,解决方式即在Register业务实体中添加一个医生的实体对象作为属性,以辅助查询功能。
private Doctor doctor;
//辅助显示的实体对象
public Doctor getDoctor() {
return doctor;
}
public void setDoctor(Doctor doctor) {
this.doctor = doctor;
}
//在业务逻辑层进行数据查询处理 //分页查询
public List
List
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;
}