1、背景提出

2、实践目的

3、技术要点

4、技术分工

5、时间分配

6、编写后台代码

(1)管理员登录

(2)快递管理

(3)快递员管理

(4)用户管理

(5)数据库

(6)过滤器

(7)实体类

7、目录

8、微信端实现

9、过程梳理

10、前台实现

11、新知识引入——layer

12、新知识引入——内网穿透

13、发送短信及验证码

14、运行效果


1、背景提出

随着互联网和通信技术的高速发展,使电子商务迅速普及,网购成为人们购物的重要手段之一。据统计2019年双十一,11月11日~16日,受电商平台集中促销影响,业务量达全年高峰,6天内共处理邮(快)件23.09亿件。

疫情期间配送快递成了一件难事。疫情防控已经趋于常态化,很多小区出台了新的治安管理条例,开始禁止快递人员进入。这给民众收发快件造成了极大的不便,因进不去小区,快递人员只能在小区门口周边摆摊设点,也影响了小区周边环境。

除了快递,外卖也一样面临相同的问题。除了小区,写字楼、校园也面临着相同的问题。正是基于对疫情期间配送最后一公里深刻的认识,我们探索出一条解决之道,那就是社区快递e栈(类似快递柜)。

2、实践目的

1、锻炼动手能力

2、融会贯通JavaWeb技术

3、体验项目开发流程

4、做出上线级别的微信端+JavaWeb后端项目

5、为框架阶段打下前后端交互的基础

3、技术要点

html5、css3、js、Jquery、bootstrap、layui、layer、ajax、mysql、tomcat、servlet、filter、listener、jsp、公有云服务器。

4、技术分工

后台必做功能:

1.管理员登录

2.管理员退出

3.快件增加

4.快件删除

5.快件修改

6.快件列表查看

7.用户增加

8.用户删除

9.用户删除

10.用户列表查看

11.快递员增加

12.快递员删除

13.快递员修改

14.快递员查询

选做:

1.控制台-显示快件区域区分图

2.控制台-显示用户人数

3.控制台-显示快递员人数

4.控制台-显示总快件数

5.控制台-显示等待取件数量

前台必做功能:

1.用户/快递员登录

2.用户/快递员注册

3.用户-我的取件列表(未取件/已取件)

4.用户-快件取件码展示

5.快递员-扫码取件

6.快递员-取件码取件

7.首页根据快递单号查询快递信息

选做:

1.快递员-录入快递

2.快递员历史查询

3.个人中心-昵称显示与修改

4.懒人排行榜

5.自动登录

6.修改密码

5、时间分配

3、12开始,……

3、18结束

6、编写后台代码

(1)管理员登录

Controller

@ResponseBody("/admin/login.do")public String login(HttpServletRequest request, HttpServletResponse response){//1.    接参数String username = request.getParameter("username");String password = request.getParameter("password");//2.    调用Service传参数,并获取结果boolean result = AdminService.login(username, password);//3.    根据结果,准备不同的返回数据Message msg = null;if(result){msg = new Message(0,"登录成功");//{status:0,result:"登录成功"}//登录时间 和 ip的更新Date date = new Date();String ip = request.getRemoteAddr();AdminService.updateLoginTimeAndIP(username,date,ip);request.getSession().setAttribute("adminUserName","username");}else{msg = new Message(-1,"登录失败");//{status:-1,result:"登录失败"}}//4.    将数据转换为JSONString json = JSONUtil.toJSON(msg);//5.    将JSON回复给ajaxreturn json;}

Service

public static boolean login(String username,String password){return dao.login(username,password);}
}

(2)快递管理

快递的列表

- 分页查询的列表

@ResponseBody("/express/list.do")public String list(HttpServletRequest request, HttpServletResponse response){//1.    获取查询数据的起始索引值int offset = Integer.parseInt(request.getParameter("offset"));//2.    获取当前页要查询的数据量int pageNumber = Integer.parseInt(request.getParameter("pageNumber"));//3.    进行查询List<Express> list = ExpressService.findAll(true, offset, pageNumber);List<BootStrapTableExpress> list2 = new ArrayList<>();for(Express e:list){String inTime = DateFormatUtil.format(e.getInTime());String outTime = e.getOutTime()==null?"未出库":DateFormatUtil.format(e.getOutTime());String status = e.getStatus()==0?"待取件":"已取件";String code = e.getCode()==null?"已取件":e.getCode();BootStrapTableExpress e2 = new BootStrapTableExpress(e.getId(),e.getNumber(),e.getUsername(),e.getUserPhone(),e.getCompany(),code,inTime,outTime,status,e.getSysPhone());list2.add(e2);}List<Map<String, Integer>> console = ExpressService.console();Integer total = console.get(0).get("data1_size");//4.    将集合封装为 bootstrap-table识别的格式ResultData<BootStrapTableExpress> data = new ResultData<>();data.setRows(list2);data.setTotal(total);String json = JSONUtil.toJSON(data);return json;}

新增快递

@ResponseBody("/express/insert.do")public String insert(HttpServletRequest request, HttpServletResponse response){String number = request.getParameter("number");String company = request.getParameter("company");String username = request.getParameter("username");String userPhone = request.getParameter("userPhone");//Express e = new Express(number,company,username,userPhone, UserUtil.getUserPhone(request.getSession()));Express e = new Express(number,username,userPhone,company,UserUtil.getUserPhone(request.getSession()));boolean flag = ExpressService.insert(e);Message msg = new Message();if(flag){//录入成功msg.setStatus(0);msg.setResult("快递录入成功!");}else{//录入失败msg.setStatus(-1);msg.setResult("快递录入失败!");}String json = JSONUtil.toJSON(msg);return json;}

- 用户输入内容,后台接收参数,向数据库存储

删除快递

@ResponseBody("/express/delete.do")public String delete(HttpServletRequest request,HttpServletResponse response){int id = Integer.parseInt(request.getParameter("id"));boolean flag = ExpressService.delete(id);Message msg = new Message();if(flag){msg.setStatus(0);msg.setResult("删除成功");}else{msg.setStatus(-1);msg.setResult("删除失败");}String json = JSONUtil.toJSON(msg);return json;}
}

- 用户输入快递单号查询到快递信息
- 浏览快递信息的最后,可以点击删除按钮 ,删除快递

修改快递

@ResponseBody("/express/find.do")public String find(HttpServletRequest request,HttpServletResponse response){String number = request.getParameter("number");Express e = ExpressService.findByNumber(number);Message msg = new Message();if(e == null){msg.setStatus(-1);msg.setResult("单号不存在");}else{msg.setStatus(0);msg.setResult("查询成功");msg.setData(e);}String json = JSONUtil.toJSON(msg);return json;}/*** 更新* @param request* @param response* @return*/@ResponseBody("/express/update.do")public String update(HttpServletRequest request,HttpServletResponse response){int id = Integer.parseInt(request.getParameter("id"));String number = request.getParameter("number");String company = request.getParameter("company");String username = request.getParameter("username");String userPhone = request.getParameter("userPhone");int status = Integer.parseInt(request.getParameter("status"));Express newExpress = new Express();newExpress.setNumber(number);newExpress.setCompany(company);newExpress.setUsername(username);newExpress.setUserPhone(userPhone);newExpress.setStatus(status);boolean flag = ExpressService.update(id, newExpress);Message msg = new Message();if(flag){msg.setStatus(0);msg.setResult("修改成功");}else{msg.setStatus(-1);msg.setResult("修改失败");}String json = JSONUtil.toJSON(msg);return json;}

- 用户输入快递单号查询到快递信息
- 浏览(可修改)快递信息的最后,可以点击确认按钮 ,确认修改快递

(3)快递员管理

快递员的列表

- 分页查询的列表

@ResponseBody("/courier/list.do")public String list(HttpServletRequest request, HttpServletResponse response){int offset = Integer.parseInt(request.getParameter("offset"));// 获取当前页要查询的数据量int pageNumber = Integer.parseInt(request.getParameter("pageNumber"));List<Courier> list = CourierService.findAll(true, offset, pageNumber);List<BootStrapTableCourier> list2 = new ArrayList<>();for (Courier c : list){String enrollTime = DateFormatUtil.format(c.getEnrollTime());String loginTime = c.getLoginTime()==null?"未登录":DateFormatUtil.format(c.getLoginTime());String sendNumber = null;int courierSendNumber = c.getCourierSendNumber();if (courierSendNumber <= 10000){sendNumber = courierSendNumber + "";}else{sendNumber = courierSendNumber/10000 + "w+";}BootStrapTableCourier c2 = new BootStrapTableCourier(c.getId(),c.getCourierName(),c.getCourierPhone(),"******",c.getCourierPassword(),sendNumber,enrollTime,loginTime);list2.add(c2);}List<Map<String, Integer>> console = CourierService.console();Integer total = console.get(0).get("data_size");ResultData<BootStrapTableCourier> data = new ResultData<>();data.setRows(list2);data.setTotal(total);String json = JSONUtil.toJSON(data);return json;}

新增快递员

@ResponseBody("/courier/insert.do")public String insert(HttpServletRequest request, HttpServletResponse response){String courierName = request.getParameter("courierName");String courierPhone = request.getParameter("courierPhone");String courierIdNumber = request.getParameter("courierIdNumber");String courierPassword = request.getParameter("courierPassword");Courier c = new Courier(courierName,courierPhone,courierIdNumber,courierPassword);boolean flag = CourierService.insert(c);Message msg = new Message();if (flag){msg.setStatus(0);msg.setResult("快递员录入成功");}else {msg.setStatus(-1);msg.setResult("快递员录入失败");}String json = JSONUtil.toJSON(msg);return json;}

- 管理员输入内容,后台接收参数,向数据库存储

删除快递

@ResponseBody("/courier/delete.do")public String delete(HttpServletRequest request, HttpServletResponse response){int id = Integer.parseInt(request.getParameter("id"));boolean flag = CourierService.delete(id);Message msg = new Message();if (flag){msg.setStatus(0);msg.setResult("删除成功");}else {msg.setStatus(-1);msg.setResult("删除失败");}String json = JSONUtil.toJSON(msg);return json;}

- 快递员输入快递单号查询到快递信息
- 浏览快递信息的最后,可以点击删除按钮 ,删除快递

修改快递

@ResponseBody("/courier/find.do")public String find(HttpServletRequest request, HttpServletResponse response){String courierPhone = request.getParameter("courierPhone");Courier c = CourierService.findByPhone(courierPhone);Message msg = new Message();if (c == null){msg.setStatus(-1);msg.setResult("手机号不存在");}else {msg.setStatus(0);msg.setResult("查询成功");msg.setData(c);}String json = JSONUtil.toJSON(msg);return json;}@ResponseBody("/courier/update.do")public String update(HttpServletRequest request, HttpServletResponse response){int id = Integer.parseInt(request.getParameter("id"));String courierName = request.getParameter("courierName");String courierPhone = request.getParameter("courierPhone");String courierIdNumber = request.getParameter("courierIdNumber");String courierPassword = request.getParameter("courierPassword");Courier newCourier = new Courier(courierName,courierPhone,courierIdNumber,courierPassword);Message msg = new Message();boolean flag = CourierService.update(id, newCourier);if (flag){msg.setStatus(0);msg.setResult("修改成功");}else {msg.setStatus(-1);msg.setResult("修改失败");}String json = JSONUtil.toJSON(msg);return json;}

- 快递员输入快递单号查询到快递信息
- 浏览(可修改)快递信息的最后,可以点击确认按钮 ,确认修改快递

(4)用户管理

用户的列表

- 分页查询的列表

@ResponseBody("/user/list.do")public String list(HttpServletRequest request, HttpServletResponse response){//1.    获取查询数据的起始索引值int offset = Integer.parseInt(request.getParameter("offset"));//2.    获取当前页要查询的数据量int pageNumber = Integer.parseInt(request.getParameter("pageNumber"));//3.    进行查询List<Express> list = ExpressService.findAll(true, offset, pageNumber);List<BootStrapTableExpress> list2 = new ArrayList<>();for(Express e:list){String inTime = DateFormatUtil.format(e.getInTime());String outTime = e.getOutTime()==null?"未出库":DateFormatUtil.format(e.getOutTime());String status = e.getStatus()==0?"待取件":"已取件";String code = e.getCode()==null?"已取件":e.getCode();BootStrapTableExpress e2 = new BootStrapTableExpress(e.getId(),e.getNumber(),e.getUsername(),e.getUserPhone(),e.getCompany(),code,inTime,outTime,status,e.getSysPhone());list2.add(e2);}List<Map<String, Integer>> console = ExpressService.console();Integer total = console.get(0).get("data1_size");//4.    将集合封装为 bootstrap-table识别的格式ResultData<BootStrapTableExpress> data = new ResultData<>();data.setRows(list2);data.setTotal(total);String json = JSONUtil.toJSON(data);return json;}

新增快递员

@ResponseBody("/user/insert.do")public String insert(HttpServletRequest request, HttpServletResponse response){String userName = request.getParameter("userName");String userPhone = request.getParameter("userPhone");String userIdNumber = request.getParameter("userIdNumber");String userPassword = request.getParameter("userPassword");User u = new User(userName, userPhone, userIdNumber, userPassword);boolean flag = UserService.insert(u);Message msg = new Message();if (flag){msg.setStatus(0);msg.setResult("用户录入成功");}else{msg.setStatus(-1);msg.setResult("用户录入失败");}String json = JSONUtil.toJSON(msg);return json;}

- 用户输入内容,后台接收参数,向数据库存储

删除快递员

@ResponseBody("/user/delete.do")public String delete(HttpServletRequest request, HttpServletResponse response){int id = Integer.parseInt(request.getParameter("id"));boolean flag = UserService.delete(id);Message msg = new Message();if (flag){msg.setStatus(0);msg.setResult("删除成功");}else {msg.setStatus(-1);msg.setResult("删除失败");}String json = JSONUtil.toJSON(msg);return json;}

- 用户输入快递单号查询到快递信息
- 浏览快递信息的最后,可以点击删除按钮 ,删除快递员

修改快递员

@ResponseBody("/user/find.do")public String find(HttpServletRequest request, HttpServletResponse response){String userPhone = request.getParameter("userPhone");User u = UserService.findByUserPhone(userPhone);Message msg = new Message();if (u == null){msg.setStatus(-1);msg.setResult("手机号不存在");}else {msg.setStatus(0);msg.setResult("查询成功");msg.setData(u);}String json = JSONUtil.toJSON(msg);return json;}/*** 删除* @param request* @param response* @return*/@ResponseBody("/user/update.do")public String update(HttpServletRequest request, HttpServletResponse response){int id = Integer.parseInt(request.getParameter("id"));String userName = request.getParameter("userName");String userPhone = request.getParameter("userPhone");String userIdNumber = request.getParameter("userIdNumber");String userPassword = request.getParameter("userPassword");User newUser = new User(userName,userPhone,userIdNumber,userPassword);Message msg = new Message();boolean flag = UserService.update(id, newUser);if (flag){msg.setStatus(0);msg.setResult("修改成功");}else {msg.setStatus(-1);msg.setResult("修改失败");}String json = JSONUtil.toJSON(msg);return json;}

- 用户输入快递单号查询到快递信息
- 浏览(可修改)快递信息的最后,可以点击确认按钮 ,确认修改快递员

(5)数据库

-德鲁伊数据库操作,MYSQL5.7

#德鲁伊数据库连接
url=jdbc:mysql://localhost:3306/e?useUnicode=true&characterEncoding=utf-8
username=root
password=123
driverClassName=com.mysql.jdbc.Driver
initialSize=5
maxActive=10
minIdle=5
maxWait=3000

(6)过滤器

权限

@WebFilter({"/admin/index.html","/admin/views/*","/express/*","/courier/*","/user/*"})
public class AccessControlFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) resp;String userName = UserUtil.getUserName(request.getSession());if(userName != null)chain.doFilter(req, resp);elseresponse.sendError(404,"很遗憾,权限不足");}public void init(FilterConfig config) throws ServletException {}

字符编码

@WebFilter("*.do")
public class CharSetFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("text/json;charset=utf-8");resp.setCharacterEncoding("utf-8");chain.doFilter(req, resp);}public void init(FilterConfig config) throws ServletException {}

(7)实体类

分别生成get/set方法,无参,有参及其他方法

Express(快递)

public class Express {private int id;private String number;private String username;private String userPhone;private String company;private String code;private Timestamp inTime;private Timestamp outTime;private int status;private String sysPhone;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Express express = (Express) o;return id == express.id &&status == express.status &&Objects.equals(number, express.number) &&Objects.equals(username, express.username) &&Objects.equals(userPhone, express.userPhone) &&Objects.equals(company, express.company) &&Objects.equals(code, express.code) &&Objects.equals(inTime, express.inTime) &&Objects.equals(outTime, express.outTime) &&Objects.equals(sysPhone, express.sysPhone);}@Overridepublic int hashCode() {return Objects.hash(id, number, username, userPhone, company, code, inTime, outTime, status, sysPhone);}@Overridepublic String toString() {return "Express{" +"id=" + id +", number='" + number + '\'' +", username='" + username + '\'' +", userPhone='" + userPhone + '\'' +", company='" + company + '\'' +", code='" + code + '\'' +", inTime=" + inTime +", outTime=" + outTime +", status=" + status +", sysPhone='" + sysPhone + '\'' +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getUserPhone() {return userPhone;}public void setUserPhone(String userPhone) {this.userPhone = userPhone;}public String getCompany() {return company;}public void setCompany(String company) {this.company = company;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public Timestamp getInTime() {return inTime;}public void setInTime(Timestamp inTime) {this.inTime = inTime;}public Timestamp getOutTime() {return outTime;}public void setOutTime(Timestamp outTime) {this.outTime = outTime;}public int getStatus() {return status;}public void setStatus(int status) {this.status = status;}public String getSysPhone() {return sysPhone;}public void setSysPhone(String sysPhone) {this.sysPhone = sysPhone;}public Express(String number, String username, String userPhone, String company, String sysPhone,String code) {this.number = number;this.username = username;this.userPhone = userPhone;this.company = company;this.sysPhone = sysPhone;this.code = code;}public Express(String number, String username, String userPhone, String company, String sysPhone) {this.number = number;this.username = username;this.userPhone = userPhone;this.company = company;this.sysPhone = sysPhone;}public Express() {}public Express(int id, String number, String username, String userPhone, String company, String code, Timestamp inTime, Timestamp outTime, int status, String sysPhone) {this.id = id;this.number = number;this.username = username;this.userPhone = userPhone;this.company = company;this.code = code;this.inTime = inTime;this.outTime = outTime;this.status = status;this.sysPhone = sysPhone;}

Courier(快递员)

public class Courier {private int id;private String courierName;private String courierPhone;private String courierIdNumber;private String courierPassword;private int courierSendNumber;private Timestamp enrollTime;private Timestamp loginTime;public Courier() {}public Courier(String courierName, String courierPhone, String courierIdNumber, String courierPassword) {this.courierName = courierName;this.courierPhone = courierPhone;this.courierIdNumber = courierIdNumber;this.courierPassword = courierPassword;}public Courier(int id, String courierName, String courierPhone, String courierIdNumber, String courierPassword, int courierSendNumber, Timestamp enrollTime, Timestamp loginTime) {this.id = id;this.courierName = courierName;this.courierPhone = courierPhone;this.courierIdNumber = courierIdNumber;this.courierPassword = courierPassword;this.courierSendNumber = courierSendNumber;this.enrollTime = enrollTime;this.loginTime = loginTime;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getCourierName() {return courierName;}public void setCourierName(String courierName) {this.courierName = courierName;}public String getCourierPhone() {return courierPhone;}public void setCourierPhone(String courierPhone) {this.courierPhone = courierPhone;}public String getCourierIdNumber() {return courierIdNumber;}public void setCourierIdNumber(String courierIdNumber) {this.courierIdNumber = courierIdNumber;}public String getCourierPassword() {return courierPassword;}public void setCourierPassword(String courierPassword) {this.courierPassword = courierPassword;}public int getCourierSendNumber() {return courierSendNumber;}public void setCourierSendNumber(int courierSendNumber) {this.courierSendNumber = courierSendNumber;}public Timestamp getEnrollTime() {return enrollTime;}public void setEnrollTime(Timestamp enrollTime) {this.enrollTime = enrollTime;}public Timestamp getLoginTime() {return loginTime;}public void setLoginTime(Timestamp loginTime) {this.loginTime = loginTime;}@Overridepublic String toString() {return "Courier{" +"id=" + id +", courierName='" + courierName + '\'' +", courierPhone='" + courierPhone + '\'' +", courierIdNumber='" + courierIdNumber + '\'' +", courierPassword='" + courierPassword + '\'' +", courierSendNumber=" + courierSendNumber +", enrollTime=" + enrollTime +", loginTime=" + loginTime +'}';}

User(用户)

public class User {private int id;private String userName;private String userPhone;private String userIdNumber;private String userPassword;private Timestamp enrollTime;private Timestamp loginTime;private boolean user;public User() {}public User(String userName, String userPhone, String userIdNumber, String userPassword) {this.userName = userName;this.userPhone = userPhone;this.userIdNumber = userIdNumber;this.userPassword = userPassword;}public User(int id, String userName, String userPhone, String userIdNumber, String userPassword, Timestamp enrollTime, Timestamp loginTime) {this.id = id;this.userName = userName;this.userPhone = userPhone;this.userIdNumber = userIdNumber;this.userPassword = userPassword;this.enrollTime = enrollTime;this.loginTime = loginTime;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getUserPhone() {return userPhone;}public void setUserPhone(String userPhone) {this.userPhone = userPhone;}public String getUserIdNumber() {return userIdNumber;}public void setUserIdNumber(String userIdNumber) {this.userIdNumber = userIdNumber;}public String getUserPassword() {return userPassword;}public void setUserPassword(String userPassword) {this.userPassword = userPassword;}public Timestamp getEnrollTime() {return enrollTime;}public void setEnrollTime(Timestamp enrollTime) {this.enrollTime = enrollTime;}public Timestamp getLoginTime() {return loginTime;}public void setLoginTime(Timestamp loginTime) {this.loginTime = loginTime;}@Overridepublic String toString() {return "User{" +"id=" + id +", userName='" + userName + '\'' +", userPhone='" + userPhone + '\'' +", userIdNumber='" + userIdNumber + '\'' +", userPassword='" + userPassword + '\'' +", enrollTime=" + enrollTime +", loginTime=" + loginTime +'}';}

7、目录

前台(主要)

后台

8、微信端实现

前台

以主页进行展示

<!DOCTYPE html>
<html>
<head><title>快件e栈服务平台</title><meta charset="utf-8"><meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" /><link href="css/normalize.css" type="text/css" rel="stylesheet" /><link href="css/main.css" type="text/css" rel="stylesheet" /><script src="js/jquery.min.js" type="text/javascript"></script><script src="js/notice.js"  type="text/javascript"></script><script src="js/common.js" type="text/javascript"></script><script src="layer/layer.js"></script>
</head>
<body><div class="content"><div class="top autoH"><div class="logo autoH"><img src="data:images/logo.png" width="100%"></div></div><div class="middle"><form id="theForm"><div class="forminput"><input type="text" id="expressNum" name="expressNum" placeholder="请输入快递单号..."><input id="PageContext" type="hidden" value="${pageContext.request.contextPath}" /><div class="submBtn"></div></div></form></div><div class="funContdiv"><div class="funCont"><div class="userFun"><p class="funIcon userFunColor1"></p><p class="funTxt">个人中心</p></div><div class="userFun"><p class="funIcon userFunColor2"></p><p class="funTxt">懒人排行</p></div><div class="userFun"><p class="funIcon userFunColor3"></p><p class="funTxt">取货二维码</p></div><div class="userFun"><p class="funIcon userFunColor4"></p><p class="funTxt">我的快件</p></div><div class="userFun" id="userFun5"><p class="funIcon userFunColor5"></p><p class="funTxt">快递助手</p></div><div class="userFun"><p class="funIcon userFunColor6"></p><p class="funTxt">退出登录</p></div></div></div><div class="footer"><p class="copytxt">&copy;新职课版权所有</p></div></div><script type="text/javascript">var isUser;var userPhone;$(function(){$.getJSON("/wx/userInfo.do",null,function(data){//{status:0/1,result:手机号}userPhone = data.result;if(data.status == 0){isUser = true;$("#userFun5").hide();}else{isUser = false;}//layer.msg("欢迎您:"+userPhone);});});$(function(){var pageContextVal = $("#PageContext").val();$(".userFun").click(function(){var clickNum = $(this).index();switch(clickNum){//个人中心case(0): window.location.href= "wxUserhome.html"; break;case(1): window.location.href= "lazyboard.html"; break;case(2): window.location.href= "/wx/createQRCode.do?type=user"; break;case(3): window.location.href= "expressList.html"; break;case(4): window.location.href= "expressAssist.html"; break;case(5)://1.    告知服务器$.getJSON("/wx/logout.do",null,function(data){window.location.href= "login.html";});break;}});var initFunc = function(){var windowH = $(document).height();var windowW = $(document).width();$(".content").css({"height": windowH+"px"});var contentW = $(".content").width();var contentH = $(".content").height();var contH = windowH / 3;$(".autoH").css({"height": contH+"px"});// userFunH  contentvar middleH = $(".middle").height() + 40;var userFunH = contentH - contH - middleH - 30 -20; //footer,userfun(margin)$(".funContdiv").css({"height":userFunH+"px"});var funIconH = $(".funIcon").width(); $(".funIcon").css({"height": funIconH+"px","line-height": funIconH+"px","border-radius": funIconH/2 +"px","font-size":funIconH/2 +"px"});};initFunc();$(window).resize(function(){initFunc();});// input focus$(".middle .forminput input").focus(function(){$(".middle .forminput").css({"border":"1px solid rgba(31,114,255,.75)","box-shadow":"0 0 8px rgba(31,114,255,.5)"});});// input blur$(".middle .forminput input").blur(function(){$(".middle .forminput").css({"border":"1px solid #333333","box-shadow":"none"});});//submit arrow$(".submBtn").click(function(){var expressNum = $("#expressNum").val();//快递单号$.ajax({type:'GET',url:pageContextVal+'/ul/indexQueryExpress',data:{'expressNum':expressNum},dataType: "json",success:function(data){var jsontmp = data;switch(jsontmp.code) {case "1" : rzAlert("操作提示",jsontmp.message); break;case "0" : rzAlert("操作提示",jsontmp.message);break;}},error:function(){}});});});</script>
</body>
</html>

后台

public class ExpressController {@ResponseBody("/wx/findExpressByUserPhone.do")public String findByUserPhone(HttpServletRequest request, HttpServletResponse response){User wxUser = UserUtil.getWxUser(request.getSession());String userPhone = wxUser.getUserPhone();List<Express> list = ExpressService.findByUserPhone(userPhone);List<BootStrapTableExpress> list2 = new ArrayList<>();for(Express e:list){String inTime = DateFormatUtil.format(e.getInTime());String outTime = e.getOutTime()==null?"未出库":DateFormatUtil.format(e.getOutTime());String status = e.getStatus()==0?"待取件":"已取件";String code = e.getCode()==null?"已取件":e.getCode();BootStrapTableExpress e2 = new BootStrapTableExpress(e.getId(),e.getNumber(),e.getUsername(),e.getUserPhone(),e.getCompany(),code,inTime,outTime,status,e.getSysPhone());list2.add(e2);}Message msg = new Message();if(list.size()==0){msg.setStatus(-1);}else{msg.setStatus(0);Stream<BootStrapTableExpress> status0Express = list2.stream().filter(express -> {if (express.getStatus().equals("待取件")) {return true;} else {return false;}}).sorted((o1,o2) -> {long o1Time = DateFormatUtil.toTime(o1.getInTime());long o2Time = DateFormatUtil.toTime(o2.getInTime());return (int)(o1Time-o2Time);});Stream<BootStrapTableExpress> status1Express = list2.stream().filter(express -> {if (express.getStatus().equals("已取件")) {return true;} else {return false;}}).sorted((o1,o2) -> {long o1Time = DateFormatUtil.toTime(o1.getInTime());long o2Time = DateFormatUtil.toTime(o2.getInTime());return (int)(o1Time-o2Time);});Object[] s0 = status0Express.toArray();Object[] s1 = status1Express.toArray();Map data = new HashMap<>();data.put("status0",s0);data.put("status1",s1);msg.setData(data);}String json = JSONUtil.toJSON(msg.getData());return json;}@ResponseBody("/wx/userExpressList.do")public String expressList(HttpServletRequest request,HttpServletResponse response){String userPhone = request.getParameter("userPhone");List<Express> list = ExpressService.findByUserPhoneAndStatus(userPhone, 0);List<BootStrapTableExpress> list2 = new ArrayList<>();for(Express e:list){String inTime = DateFormatUtil.format(e.getInTime());String outTime = e.getOutTime()==null?"未出库":DateFormatUtil.format(e.getOutTime());String status = e.getStatus()==0?"待取件":"已取件";String code = e.getCode()==null?"已取件":e.getCode();BootStrapTableExpress e2 = new BootStrapTableExpress(e.getId(),e.getNumber(),e.getUsername(),e.getUserPhone(),e.getCompany(),code,inTime,outTime,status,e.getSysPhone());list2.add(e2);}Message msg = new Message();if(list.size() == 0){msg.setStatus(-1);msg.setResult("未查询到快递");}else{msg.setStatus(0);msg.setResult("查询成功");msg.setData(list2);}return JSONUtil.toJSON(msg);}

过滤器

防止用户不登录直接进行跳转

@WebFilter({"/index.html"})
public class UserFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {HttpSession session = ((HttpServletRequest)req).getSession();User wxUser = UserUtil.getWxUser(session);if(wxUser != null)chain.doFilter(req, resp);else((HttpServletResponse)resp).sendRedirect("login.html");}public void init(FilterConfig config) throws ServletException {}

9、过程梳理

创建数据库表格

编写DAO

编写Service

编写Controller

前后端的交互

前端发起ajax→XXServlet→Controller→Service→DAO→数据库

10、前台实现

需引入相应的jQuery包

Express

分页

<body><table id="express_list"></table><script>$(function(){$("#express_list").bootstrapTable({url:"/express/list.do",//数据地址striped:true,//是否显示行的间隔pageNumber:1,//初始化加载第几页pagination:true,//是否分页sidePagination:'server',pageSize:5,pageList:[5,10,20],showRefresh:true,queryParams:function(params){var temp = {offset:params.offset,pageNumber:params.limit};return temp;},columns:[{title:"编号",field:"id",sortable:false},{title:"单号",field:"number",sortable:false},{title:"姓名",field:"username",sortable:false},{title:"电话",field:"userPhone",sortable:false},{title:"快递公司",field:"company",sortable:false},{title:"取件码",field:"code",sortable:false},{title:"入库时间",field:"inTime",sortable:false},{title:"出库时间",field:"outTime",sortable:false},{title:"状态",field:"status",sortable:false},{title:"录入人电话",field:"sysPhone",sortable:false}]});});</script>

新增

<script>$(function(){$("#form").submit(function(){var windowId = layer.load();var number = $("input:eq(0)").val();var company = $("input:eq(1)").val();var username = $("input:eq(2)").val();var userPhone = $("input:eq(3)").val();$.post("/express/insert.do",{number:number,company:company,username:username,userPhone:userPhone},function(data){layer.close(windowId);layer.msg(data.result);if(data.status == 0){//录入成功$("input").val("");$("input:eq(1)").val("顺丰速运");}else{//录入失败}});return false;});});</script>

删除

<script src="/qrcode/jquery2.1.4.js"></script><script src="/layer/layer.js"></script><script>$(".header:eq(1),.content:eq(1)").hide();var expressId = null;$(function(){$("#find").click(function(){var windowId = layer.load();var number = $("#number").val();$.getJSON("/express/find.do",{number:number},function(data){layer.close(windowId);//data:{"status":0,"result":"查询成功","data":{"id":2,"number":"124","username":"张三","userPhone":"13843838438","company":"京东快递","code":"213456","inTime":"Jul 21, 2020, 4:26:21 PM","status":0,"sysPhone":"18888888888"}}layer.msg(data.result);if(data.status == 0){$(".header:eq(1),.content:eq(1)").fadeIn(1000);expressId = data.data.id;$("input:eq(1)").val(data.data.number);$("input:eq(2)").val(data.data.company);$("input:eq(3)").val(data.data.username);$("input:eq(4)").val(data.data.userPhone);$("input:eq(1),input:eq(2),input:eq(3),input:eq(4)").prop("disabled",true)if(data.data.status == 0){//未签收$("#status").html("未签收");}else{//已签收$("#status").html("已签收");}}})});$("#delete").click(function(){var windowId = layer.load();$.getJSON("/express/delete.do",{id:expressId},function(data){layer.close(windowId);layer.msg(data.result);if(data.status == 0){$(".header:eq(1),.content:eq(1)").hide();}});});});</script>

修改

<script src="/qrcode/jquery2.1.4.js"></script><script src="/layer/layer.js"></script>
<script>$(".header:eq(1),.content:eq(1)").hide();var expressId = null;var g_userPhone = null;$(function(){$("#find").click(function(){var windowId = layer.load();var number = $("#number").val();$.getJSON("/express/find.do",{number:number},function(data){layer.close(windowId);//data:{"status":0,"result":"查询成功","data":{"id":2,"number":"124","username":"张三","userPhone":"13843838438","company":"京东快递","code":"213456","inTime":"Jul 21, 2020, 4:26:21 PM","status":0,"sysPhone":"18888888888"}}layer.msg(data.result);if(data.status == 0){$(".header:eq(1),.content:eq(1)").fadeIn(1000);expressId = data.data.id;g_userPhone = data.data.userPhone;$("input:eq(1)").val(data.data.number);$("input:eq(2)").val(data.data.company);$("input:eq(3)").val(data.data.username);$("input:eq(4)").val(data.data.userPhone);if(data.data.status == 0){//未签收$(".status:eq(1)").prop("checked",true);}else{//已签收$(".status:eq(0)").prop("checked",true);}}})});$("#update").click(function(){var windowId = layer.load();var number = $("input:eq(1)").val();var company = $("input:eq(2)").val();var username = $("input:eq(3)").val();var userPhone = $("input:eq(4)").val();var status = $(".status:checked").val();var express = {id:expressId,number:number,company:company,username:username,status:status};if(userPhone != g_userPhone){express.userPhone = userPhone;}$.getJSON("/express/update.do",express,function(data){layer.close(windowId);layer.msg(data.result)if(data.status == 0){//修改成功的$(".header:eq(1),.content:eq(1)").hide();}})});});
</script>

User与Courier与其雷同,按照实体类修改相关参数即可

11、新知识引入——layer

layer 至今仍作为 layui 的代表作,它的受众广泛并非偶然,而是这数年来的坚持、不弃的执念,将那些不屑的眼光转化为应得的尊重,不断完善和维护、不断建设和提升社区服务,在 Web 开发者的圈子里口口相传,乃至于成为今天的 layui 最强劲的源动力。目前,layer 已然成为网页弹出层的首选交互方案,几乎随处可见。

学习链接:

layer弹层组件开发文档 - Layui

12、新知识引入——内网穿透

内网穿透即NAT穿透,网络连接时术语,计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。就是说映射端口,能让外网的电脑找到处于内网的电脑,提高下载速度。不管是内网穿透还是其他类型的网络穿透,都是网络穿透的统一方法来研究和解决。NAT穿透,nat穿透中有关于网络穿透的详细信息。

使用步骤(图片)

登录网站

Sunny-Ngrok内网转发内网穿透 - 国内内网映射服务器

注册登录

下一步

需要两元的认证费

之后

配置自己的域名(我用的同学的)

此步骤省略

13、发送短信及验证码

短信

public static boolean send(String phoneNumber,String code) {DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4GJVun7NhPS8FMgSqqS4", "TgTLk8KVJjESFu6iC1jTHsVMK53z5Q");IAcsClient client = new DefaultAcsClient(profile);CommonRequest request = new CommonRequest();request.setSysMethod(MethodType.POST);request.setSysDomain("dysmsapi.aliyuncs.com");request.setSysVersion("2022-3-14");request.setSysAction("SendSms");request.putQueryParameter("RegionId", "cn-hangzhou");request.putQueryParameter("PhoneNumbers", phoneNumber);request.putQueryParameter("SignName", "快件e栈");request.putQueryParameter("TemplateCode", "SMS_196641606");request.putQueryParameter("TemplateParam", "{\"code\":\""+code+"\"}");try {CommonResponse response = client.getCommonResponse(request);System.out.println(response.getData());String json = response.getData();Gson g = new Gson();HashMap result = g.fromJson(json, HashMap.class);if("OK".equals(result.get("Message"))) {return true;}else{System.out.println("短信发送失败,原因:"+result.get("Message"));}} catch (ServerException e) {e.printStackTrace();} catch (ClientException e) {e.printStackTrace();}return false;}public static boolean loginSMS(String phoneNumber,String code) {DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4GKsiFzUmLZ8Qnx1Sfza", "jUhIqqk3wwvhm2T1HOUVbCmIOWNE0O");IAcsClient client = new DefaultAcsClient(profile);CommonRequest request = new CommonRequest();request.setSysMethod(MethodType.POST);request.setSysDomain("dysmsapi.aliyuncs.com");request.setSysVersion("2017-05-25");request.setSysAction("SendSms");request.putQueryParameter("RegionId", "cn-hangzhou");request.putQueryParameter("PhoneNumbers", phoneNumber);request.putQueryParameter("SignName", "快递e栈");request.putQueryParameter("TemplateCode", "SMS_204295076");request.putQueryParameter("TemplateParam", "{\"code\":\""+ code +"\"}");try {CommonResponse response = client.getCommonResponse(request);System.out.println(response.getData());String json = response.getData();Gson g = new Gson();HashMap result = g.fromJson(json, HashMap.class);if("OK".equals(result.get("Message"))) {return true;}else{System.out.println("短信发送失败,原因:"+result.get("Message"));}} catch (ServerException e) {e.printStackTrace();} catch (ClientException e) {e.printStackTrace();}return false;}

验证码

14、运行效果

控制台

Courier:(四个页面,相应为分页、新增、查询、修改)

Express:(四个页面,相应为分页、新增、查询、修改)

User:(四个页面,相应为分页、新增、查询、修改)

基于JavaWeb+MySQL的快递驿站系统相关推荐

  1. 基于javaweb+mysql的学生选课系统(java+javaweb+jdbc)

    基于javaweb+mysql的学生选课系统(java+javaweb+jdbc) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/idea/myeclipse ...

  2. 基于javaweb+mysql的茶叶溯源系统(java+SSM+JSP+bootstrap+layUI+mysql)

    项目介绍 茶叶溯源系统,分为前台与后台.普通用户可在前台通过18位的编码查询茶叶的出售历史. 后台分为两种角色,管理员与经销商: 管理员主要功能包括: 主界面: 管理员管理:管理员列表.添加管理员: ...

  3. 基于javaweb+mysql的水果销售系统(java+SSH+mysql+maven+tomcat)

    一.项目简述 功能: 区分为管理员用户和普通用户,普通用户:用户注册登 录,首页水果展示,商品分类展示,购物车添加,下单, 订单查询,个人信息修改,管理员用户:包括水果基本信 息维护增删改查,分类管理 ...

  4. 基于javaweb+mysql的兼职平台系统(java+Springboot+ssm+HTML+maven+Ajax+mysql)

    一.项目运行 环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持) 项目技术: HTML ...

  5. 基于Java毕业设计智能快递分拣系统源码+系统+mysql+lw文档+部署软件

    基于Java毕业设计智能快递分拣系统源码+系统+mysql+lw文档+部署软件 基于Java毕业设计智能快递分拣系统源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S架构 开 ...

  6. 基于javaweb+mysql的校园快递物流管理系统

    基于javaweb+mysql的校园快递物流管理系统 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/idea/myeclipse/sts等均可配置运行 适用 ...

  7. 基于javaweb的学生综合素质评价系统(java+ssm+thymeleaf+layui+mysql)

    基于javaweb的学生综合素质评价系统(java+ssm+thymeleaf+layui+mysql) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/ide ...

  8. 基于javaweb+jsp的网上商城系统(java+jsp+servlet+mysql+ajax)

    基于javaweb+jsp的网上商城系统(java+jsp+servlet+mysql+ajax) 一.项目简述(+需求文档+PPT) 功能: 主页显示热销商品:所有商品展示,可进行商品搜索:点 击商 ...

  9. 基于javaweb+jsp的家庭理财系统(java+SSM+JSP+Tomcat8+Mysql)

    基于javaweb+jsp的家庭理财系统(java+SSM+JSP+Tomcat8+Mysql) 一.项目简述 功能:家庭理财,财务分析,统计等等. 二.项目运行 运行环境: jdk8+tomcat8 ...

最新文章

  1. 笔记-高项案例题-2017年上-质量管理
  2. 关于三层交换机的路由处理方式和路由器的路由处理方式的不同
  3. Python__模拟实现一个ATM+购物商城程序
  4. linux编程手册读书笔记第一章(20140329)
  5. 【2018山东省赛 - A】Anagram(贪心,费用流,KM算法)
  6. 解决Execution failed for task ':app:clean'. Unable to delete directory问题
  7. JS 操作 HTML 和 AJAX 请求后台数据
  8. Ulipad中设置自定义模块(module)路径的方法(图)
  9. shell 脚本实现的 deamon 守护进程
  10. C++ 面向对象的编程语言有哪些特点?
  11. mac强制关机后悲剧了
  12. SAP R3 系统技术基础
  13. 可达性分析算法中根节点有哪些
  14. iOS视频——视频文件、播放视频
  15. debian java pick up_ubuntu15.04安装java的时出现Picked up JAVA_TOOL_OPTIONS: -jav
  16. 失物招领网站html源码,基于web的失物招领系统(完整源码+论文全套+教学视频)...
  17. 工作小记-Linux磁盘空间告警
  18. X79 – E5 1620 1620v2 黑苹果10.15
  19. Matlab音频格式转换
  20. Unity用Gizmos画线和图

热门文章

  1. 【数据库管理】数据库自动维护任务介绍
  2. Maven项目简单配置Log4j
  3. oracle的后台进程杀掉会有什么影响
  4. 纯前端 vue 导出excel 这里用 vue-json-excel插件
  5. 编程中python怎么读-Python 应该怎么学?
  6. error @typescript-eslint/eslint-plugin@5.3.0: The engine “node“ is incompatible with this module.
  7. 指数和对数总结【图形+公式】
  8. Navicat-导航猫
  9. Python两大佬互相撕逼 技术何苦为难技术?
  10. 讲个鬼故事:小灰的体检报告出来了。。。