# takeExpress
**Repository Path**: zhangyongji/takeExpress
## Basic Information
- **Project Name**: takeExpress
- **Description**: 快递代取系统
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2022-04-01
- **Last Updated**: 2022-04-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 系统介绍
- 基于SSM的快递代取系统
- 开发成员:fyzn、p1n93r、cassie、cyy
## 工具类
- 邮件发送:EmailUtil.sendEmail("目标邮箱","邮件主题","邮件内容");
## 一些优化及扩展
***Notice:*** 在web.extend包下添加扩展
(1) 扩展:
1. CustomObjectMapper类是自定义的用于json消息转换器的objectMapper类,现在主要完成的扩展:去除json数据中的前后空格
2. CustomWebBindingInitializer类是一个全局的控制器参数绑定初始化器,现在主要完成的扩展:去除表单参数绑定中的数据的前后空格
(2) 优化:
- 控制器数据预处理:比如我User模块下的控制器需要获取当前登陆用户的数据,可以写一个BaseController,在此Base控制器中进行数据预处理,获取当前登陆用户的数据,然后写此模块下的控制器时可以继承BaseController来获取预处理数据。
- 还有一个预防xss的过滤器未完成
## 注意
- gitee创建了一个dev分支用于开发,我们推送代码都推送到dev分支
- 如果控制器写了@ResponseBody,返回的http响应报文的Content-Type为html/text,不是application/json,所以你前端想直接把得到的数据当成js的json对象来用的话,需要在你的控制器的@RequestMapper中的produce设置为:"application/json;charset=utf-8"
## 验证模块
1. 判断登录验证
* 用户的登录判断
通过User_TOKEN获取token
通过token获取用户登录信息json
将json转为pojo对象,使用工具类JsonUtils
如判断当前用户是否登录:
String token = (String) session.getAttribute("User_TOKEN")
String json = session.getAttribute(token)
UserLogin userlogin = JsonUtils.jsonToPojo(json,UserLogin.class);
* 拦截器判断一些页面是否登录才能访问
* 在包web下有一个包Interceptor,包下有两个类loginInterceptor和ManagerLoginInceptor
前者是对用户进行拦截,在该类中重新实现了preHandle,表示访问页面前拦截
发布到服务器上时需要更改这里的地址
* 拦截器的配置
## jsr303数据格式错误返回前端
1. 保证系统能够不因一些错误而崩溃需要弄一个全局的异常抛出,类GlobalExceptionHandler还未编写完成,需要更改CodeMsg这个类异常信息抛出的status和msg
2. 运用jsr303中的@Valid注解获取前端错误时,如果前端数据格式不正确,会抛出一个BindingException,这里的全局抛出异常还未完善,可以大家一起把遇到的一些特殊异常添加,这里不需要做什么,只需要导入这个类就会自动返回错误给前端,但是后台还是会打印出该异常
@NotNull(message = "管理员id不能为空")
private String managerid;
## User表状态说明
0代表权限正常1表示被限制需求发布2代表代取权限被限制3代表所有权限被限制
## 使用dataTable插件时后台运用PageHelper进行分页
* 返回前端的数据,曹淦设置了返回前端的文件是已json的形式返回,这里可以直接返回一个对象
在包common下的类DataTableResult,设置为返回前端的类型
如控制层如下
```
@RequestMapping(value="/scantionUserShow",produces = "application/json;charset=utf-8")
@ResponseBody
public DataTableResult showApplyScantionUser(@RequestParam(defaultValue = "1") Integer start, @RequestParam(defaultValue = "10") Integer length, Integer draw,HttpServletRequest request){
//之所以要用request方式接收前端传回的search参数,是因为前端传回的参数名为 search[value]
//很难直接定义String search[value]
String search = request.getParameter("search[value]");
DataTableResult dataTableResult = manageUserService.ScantionUser(start,length,search);
dataTableResult.setDraw(draw);
dataTableResult.setRecordsFiltered(dataTableResult.getRecordsTotal());
return dataTableResult;
}
```
在这里dataTable返回数据必须设置的参数setDraw(draw),setRecordsFiltered,而参数search是为了接收前端提供搜索设置的参数
service层只需要初始化PageHelper,设置Data、RecordsTotal当然也可以将控制层设置的setRecordsFiltered在service层设置,但是不能缺少,否者分页失效
```
@Override
public DataTableResult registerUser(int start, int length,String search) {
//进行分页处理
//初始化分页插件
PageHelper.startPage(start/length+1,length);
//执行查询
RegisterExample registerExample = new RegisterExample();
if (StringUtils.isNotEmpty(search)) {
//执行查询
registerExample.createCriteria().andLoginIdLike("%"+search+"%");
}
//去除重复的行
registerExample.setDistinct(false);
List list = registerMapper.selectByExample(registerExample);
//取分页信息
PageInfo pageInfo = new PageInfo<>(list);
//取分页信息,这里必须经过PageInfo初始化
DataTableResult result = new DataTableResult();
result.setData(pageInfo.getList());
JurisdictionapplicationExample jurisdictionapplicationExample1 = new JurisdictionapplicationExample();
result.setRecordsTotal((int) jurisdictionapplicationMapper.countByExample(jurisdictionapplicationExample1));
return result;
}
```
* 普通页面分页可以初始化data集合以及pageInfo参数具体步骤如下
```$xslt
1. 初始化PageHelper
如PageHelper.startPage(start/length+1,length);
但值得注意的是,如果前端是通过pageInfo传回的参数时,那start就是具体的那一页,无需再进行运算,如下
PageHelper.startPage(start,length);
2. 执行查询语句获取对象数组
3. 初始化PageInfo
如 PageInfo pageInfo = new PageInfo<>(list);
4. 初始化data集合以及pageInfo参数
如 DataTableResult result = new DataTableResult();
result.setData(pageInfo.getList());
result.setPageInfo(pageInfo);
5. 返回前端
```
* 对于前端运用dataTable框架时,jsp模板可以参照backstage下的jsp
## 面包屑的实现
在每个子页面开始加上如下代码:
```
```
只需要修改li下的相应数据就行。
## ajax提交请求的重定向
1. 后台实现具体看controller下admin包下ShowAdminPageController的方法说明已经继承类的实现。
2. 前端具体我使用的是全局ajax的处理
```
$(document).ajaxComplete(function (event, xhr, settings) {
console.log("ajaxComplete ")
redirectHandle(xhr);
})
function redirectHandle(xhr) {
//获取后台返回的参数
var url = xhr.getResponseHeader("redirectUrl");
console.log("redirectUrl = " + url);
var enable = xhr.getResponseHeader("enableRedirect");
if((enable == "true") && (url != "")){
var win = window;
while(win != win.top){
win = win.top;
}
win.location.href = url;
}
}
```
该js目前还在index.jsp里
## 支付模块
***Notice:*** 已完结支付模块,并写好了demo。
- 控制器编写:com/express/web/controller/test/TestController.java
- 前端调用控制器:src/main/webapp/test.jsp
- 商家账号:xxcckt8859@sandbox.com,商户UID:2088102180921046,登录密码:111111
- 买家账号:ebsivy5168@sandbox.com,登录密码:111111,支付密码:111111
- 以上两个账号需要在沙箱支付宝app才能进行登录,登录买家账号可以打开test.jsp进行扫码支付,成功会alert一下,否则就算关闭交易