项目编写过程
项目的代码已经上传到了我的gitee仓库:https://gitee.com/zhonghaoqiang/ControllerDemo
后台
微信端
项目涉及技术点
html、css、js、Jquery、bootstrap、layui、layer、ajax、mysql、tomcat、servlet、filter、listener、jsp、公有云服务器。
手写MVC框架(基于SpringMVC)
servlet -> 映射器 -> 调用方法 -> 将结果返回
配置web.xml、servlet类、ResponseBody注解、ResponseView注解、记录方法返回值枚举类ResponseType、映射器、配置文件(记录请求处理类)
使用Map集合建立请求和请求处理方法的键值对
框架前的前端补充
二维码生成
步骤:
1. 引入Jquery.js文件
2. 引入jquery.qrcode.js文件
3. 引入支持中文的编码js文件 (utf.js)
4. 在网页中编写一个div 用于显示二维码
5. 准备二维码的规格对象(JSON)
var config = {
width:数字,//值是number类型, 表示的单位是px 必须传递
height:数字,//值是number类型, 表示的单位是px 必须传递
text:"内容",//text就表示二维码中存储的数据 必须传递
correctLevel:数字,//取值为0|1|2|3 表示二维码的纠错级别0:L/1:M/2:Q/3:H ,默认0 可选参数
background:"#rrggbb",//默认白色, 表示二维码的后景颜色 可选参数
foreground:"#rrggbb",//默认黑色, 表示二维码的前景颜色 可选参数
render:"绘制模式"//取值:table/canvas , 默认table 可选参数
};
6. 通过选择器, 查找到上述的div ,得到Jquery对象, 通过jquery对象的qrcode函数生成二维码
$("#div1").qrcode(config);
阿里云短信
在阿里云的sms控制台 签名在阿里云的sms控制台创建短信模版code值在阿里云的RAM访问控制中心新建一个用户accessKeyId在阿里云的RAM访问控制中心新建一个用户AccessKeySecret
后台管理(分五块)
前台后台交互过程
一、管理员(登录注册)
二、快递管理(增删改查快递表)
快递的列表
分页查询的列表
新增快递
用户输入内容,后台接受参数,向数据库存储
删除快递
用户输入快递单号查询带快递信息浏览快递信息的最后,可以点击删除按钮,删除快递
修改快递
用户输入快递单号查询到快递信息浏览(可修改)快递信息的最后,可以点击确认按钮,确认修改快递
编写的流程
创建数据库表格(Express)
编写DAO
编写Service
编写Controller
前后端交互
前端发起ajax->DispatcherServlet->Controller->Service->DAO->数据库操作
标准流程
前端发起ajax
//登录,用户存在,用户不存在
$(".login-button").click(function () {
var username = $("#username").val();
var password = $("#password").val();
//1. 先使用layer,弹出load(提示加载中...)
var windowId = layer.load();
//2. ajax与服务器交互
//请求,数据,回调函数,回复数据类型
//不加/是相对路径,加/是绝对路径
$.post("/login.do",{username:username,password:password},function(data){
//接收结果
//3. 关闭load窗口
layer.close(windowId);
//4. 将服务器回复的结果进行显示
layer.msg(data.result);
if (data.status == 0) {
//登录成功跳进主界面
location.assign("index.html");
}
},"JSON")
})
编写Controller,用于处理ajax的请求
在Controller中调用service处理处理完毕,根据service返回的结果,给ajax返回
api文档(前后端数据交互的数据格式)
给前端提供接口的文档,接口的地址,和参数
console部分:
1.用于获取控制台所需的快递数据
请求地址:express/console.do
参数列表:无
返回的格式示例:
{
status:0,
result:“获取成功”,
data:[
data1:{//全部的快递信息
size:1000,//快递总数
day:100//今日新增
},
data2:{
size:500,//代取件数
day:100//进入新增
}
]
}
2.快件列表(分页)
请求地址:express/findAll.do
参数列表:
1. limit:
值:0,表示开启分页(默认)
值:1,表示查询所有
2. offset:
值:数字,表示SQL语句起使索引
3.pageNumber:
值:数字,表示获取的快递数量
返回的格式示例:
3.根据单号查询快递信息
请求地址:express/finByNumber.do
参数列表:
1. number:快递单号
返回的格式示例:
4.根据取件码查询快递的信息
请求地址:express/finByCode.do
参数列表:
1. code:取件码
返回的格式示例:
5.根据用户的手机号码,查询快递信息
请求地址:express/finByPhoneNumber.do
参数列表:
1. userPhone:手机号码
2. status:状态码
值:0表示待取件的快递(默认)
值:1表示查询已取件的快递
值:2查询用户的所用快递
返回的格式示例:
6.根据录入人的手机号码,查询快递信息(快递员或者柜子的历史记录)
请求地址:express/finBySysPhone.do
参数列表:
1. sysPhone:手机号码
返回的格式示例:
8.快件录入
请求地址:express/insert.do
参数列表:
1. number:快递单号
2. company:快递公司
3. username:收件人姓名
4. userPhone:收件人手机号码
录入成功返回的格式示例:
录入失败返回的格式示例:
录入时有两个可以遇见到的异常,一个就是快递单号重复(数据库里设置了unique),另一个是取件码重复,这两个异常要去特殊处理一下,一个提示用户,另一个重新生成取件码
9.修改快递信息
请求地址:express/update.do
参数列表:
1. id:要修改的快递id
2. number:新的快递单号
3. company:新的快递公司
4. username:新的收货人姓名
5. userPhone:新的收件人的手机号码(手机号码更新,重新生成取件码,并发送短信)
6. status:新的快递的状态
返回的格式示例:
10.根据id删除快递信息
请求地址:express/delete.do
参数列表:
1. id: 要删除的快递的id
返回的格式示例
11.确认取件
请求地址:express/updateStatus.do
参数列表:
1. code: 要更改状态为已取件的快递取件码
返回的格式示例
三、用户管理(增删改查用户表)
用户列表
用户的增加
用户的修改
用户的删除
编写的流程
建立用户表
编写DAO
Service
Controller
前后端交互
api文档
1.用于获取控制台的用户人数
请求地址:user/console.do
参数列表:无
返回的格式示例:
{
status:0,
result:“获取成功”,
data:{//全部的用户
size:1000,//用户总数
day:100//今日新增注册用户
}
}
2.用户列表(分页)
请求地址:user/findAll.do
参数列表:
1. limit:
值:0,表示开启分页(默认)
值:1,表示查询所有
2. offset:
值:数字,表示SQL语句起使索引
3.pageNumber:
值:数字,表示获取的用户数量
返回的格式示例:
3.用户添加
请求地址:user/insert.do
参数列表:
1. username:用户姓名
2. userphone:用户手机号码
3. usernumber:用户身份证
4. password:密码
返回数据格式:
4.根据用户手机号码,修改用户
请求地址:user/update.do
参数列表:
1. userphone要修改的用户手机号码
1. username:新的用户姓名
2. userphone:新的用户手机号码(手机号码更新,并发送短信确认)
3. usernumber:新的用户身份证
4. password:新的密码
返回数据格式:
5.根据用户手机号码,删除用户
请求地址:user/delete.do
参数列表:
1. userphone要删除的用户手机号码
返回的格式示例
6.根据用户手机号码,展示用户信息(微信端的个人中心)
请求地址:user/findByPhoneNumber.do
参数列表:
1. userphone要查询的用户的手机号码
返回的格式示例
7.进行快递数量的排序查询(用户表)
请求地址:user/lazyboard.do
参数列表:
1. type:
值:0,表示查询总排名
值:1,表示查询年排名
值:2,表示查询月排名
返回的格式示例
8.用户登录
请求地址:user/login.do
四、快递员管理(增删改查快递员表)
快递员列表
快递员录入
快递员修改
快递员删除
编写过程
建立快递员表
编写DAO
Service
Controller
前后端交互
api文档
1.用于获取控制台的快递员人数
请求地址:courier/console.do
参数列表:无
返回的格式示例:
{
status:0,
result:“获取成功”,
data:{//全部的快递员
size:1000,//快递员总数
day:100//今日新增注册快递员
}
}
2.快递员列表(分页)
请求地址:courier/findAll.do
参数列表:
1. limit:
值:0,表示开启分页(默认)
值:1,表示查询所有
2. offset:
值:数字,表示SQL语句起使索引
3. pageNumber:
值:数字,表示获取的快递员数量
返回的格式示例:
3.快递员录入
请求地址:courier/insert.do
参数列表:
1. username:快递员姓名
2. userphone:快递员手机号码
3. usernumber:快递员身份证
4. password:密码
返回数据格式:
4.根据快递员手机号码,修改快递员信息
请求地址:courier/update.do
参数列表:
1. userphone:要修改的快递员手机号码
2. username:新的快递员姓名
3. userphone:新的快递员手机号码
4. password:新的密码
返回的格式示例:
5.根据快递员手机号码,删除快递员信息
请求地址:courier/delete.do
参数列表:
1. userphone:要删除的快递员手机号码
返回的格式示例:
五、控制台显示
使用filter过滤器去进行登录限制,防止非法登录
微信端(zhqprogram.zaixianke.cn)
ngrok:内网穿透
使用内网穿透技术消除局域网限制,使其他人能够登录站点
原理:端口映射,大致过程相当于Socket,我们的端口主动连接ngrok的服务器去接受外网的连接请求
我使用的是http://ngrok.cc/的服务器(因为免费,测试时服务器稳不稳定全看脸)
前置需求
mp.weixin.qq.com 申请自己的微信公众号
1. 务必修改
1. com.kaikeba.wx.util.SignatureUtil类 88 行的appid 否则无法调用api
2. com.kaikeba.wx.util.TokenUtil类的34行的appid
3. com.kaikeba.wx.util.TokenUtil类的35行的secret
appid和密钥来自于:
mp.weixin.qq.com --> 开发者设置
2. 添加JS安全域名:
自己再ngrok官网定义的别名地址
3. 添加白名单ip:
1. 映射服务器地址: (可以通过发送请求查找微信指定的配置文件,找到请求发送到的地址)
2. 本机ip地址: 百度或360搜索 ip:
六、改进
整个系统最大的缺点:由于阿里云平台限制没办法合理处理固定时间内发送多条短信提醒
后期引入非关系型数据库redis和rabbitmq信息推送
页面后端
改进的地方:(1)修改手机号码的时候要发手机验证,前端页面没有写
(2)实现查询柜子的历史记录
(3)前端页面输入信息的时候,要异步验证是否存在,像用户名要保证唯一,因为数据库没有确立唯一字段,像身份证,快递单号这些唯一字段,都可能会出现重复异常,要提示用户(是选用提前,还是提交之后再提醒),不用捕捉异常
(4)改用户手机号码时,用户之前手机号码还没取件的快递怎么办
(5) 改快递员手机号码时,快递员之前录入还未取件的快递怎么办(本来想创建单独修改手机号码和取件码的dao方法,由于status的字段为int,很难进行判断,暂时放弃,选择破坏快递表和用户表的外键关系)选择在前端建一个新的参数,如果修改的快递状态赋值
(6) 用缓存或者数据结构显示的更快(各种分页查询)
(7)快递单号没有验证
(8)密码没有验证
微信端的改进
(1)在退出销毁session之后,如果不刷新,能通过后退返回到主页
:由于阿里云平台限制没办法合理处理固定时间内发送多条短信提醒
后期引入非关系型数据库redis和rabbitmq信息推送
页面后端
改进的地方:(1)修改手机号码的时候要发手机验证,前端页面没有写
(2)实现查询柜子的历史记录
(3)前端页面输入信息的时候,要异步验证是否存在,像用户名要保证唯一,因为数据库没有确立唯一字段,像身份证,快递单号这些唯一字段,都可能会出现重复异常,要提示用户(是选用提前,还是提交之后再提醒),不用捕捉异常
(4)改用户手机号码时,用户之前手机号码还没取件的快递怎么办
(5) 改快递员手机号码时,快递员之前录入还未取件的快递怎么办(本来想创建单独修改手机号码和取件码的dao方法,由于status的字段为int,很难进行判断,暂时放弃,选择破坏快递表和用户表的外键关系)选择在前端建一个新的参数,如果修改的快递状态赋值
(6) 用缓存或者数据结构显示的更快(各种分页查询)
(7)快递单号没有验证
(8)密码没有验证
微信端的改进
(1)在退出销毁session之后,如果不刷新,能通过后退返回到主页
(2)用户取件完成后,用户查看的快递不会刷新