基于javaweb+mysql的ssm+maven仓库管理系统(java+ssm+maven+bootstrap+mysql)
运行环境
Java≥8、MySQL≥5.7、Tomcat≥8
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb+mysql的SSM+Maven仓库管理系统(java+ssm+maven+bootstrap+mysql)
功能:
- 系统操作权限管理。系统提供基本的登入登出功能,同时系统包含两个角色:系统超级管理员和普通管理员,超级管理员具有最高的操作权限,而普通管理员仅具有最基本的操作权限,而且仅能操作自己被指派的仓库。 * 请求URL鉴权。对于系统使用者登陆后进行操作发送请求的URL,后台会根据当前用户的角色判断是否拥有请求该URL的权限。 * 基础数据信息管理。对包括:货物信息、供应商信息、客户信息、仓库信息在内的基础数据信息进行管理,提供的操作有:添加、删除、修改、条件查询、导出为Excel和到从Excel导入。 * 仓库管理员管理。对仓库管理员信息CRUD操作,或者为指定的仓库管理员指派所管理的仓库。上述中的仓库管理员可以以普通管理员身份登陆到系统。 * 库存信息管理。对库存信息的CRUD操作,导入导出操作,同时查询的时候可以根据仓库以及商品ID等信息进行多条件查询。 * 基本仓库事务操作。执行货物的入库与出库操作。 * 系统登陆日志查询。超级管理员可以查询某一用户在特定时间段内的系统登陆日志。 * 系统操作日志查询。超级管理员可以查询某一用户在特定时间段内对系统进行操作的操作记录。、 * 密码修改。
使用到的框架和库:
- Apache POI * MyBatis * Spring Framework * Spring MVC * Apache Shiro * Ehcache * Apache Commons * Log4j * Slf4j * Jackson * C3P0 * Junit * MySQL-Connector * jQuery * Bootstrap
/**
* 仓库管理员管理请求 Handler
*
*/
@Controller
@RequestMapping(value = "/**/repositoryAdminManage")
public class RepositoryAdminManageHandler {
@Autowired
private RepositoryAdminManageService repositoryAdminManageService;
// 查询类型
private static final String SEARCH_BY_ID = "searchByID";
private static final String SEARCH_BY_NAME = "searchByName";
private static final String SEARCH_BY_REPOSITORY_ID = "searchByRepositoryID";
private static final String SEARCH_ALL = "searchAll";
/**
* 通用记录查询
*
* @param keyWord 查询关键字
* @param searchType 查询类型
* @param offset 分页偏移值
* @param limit 分页大小
* @return 返回所有符合条件的记录
*/
private Map<String, Object> query(String keyWord, String searchType, int offset, int limit) throws RepositoryAdminManageServiceException {
Map<String, Object> queryResult = null;
* @param userIDStr 用户ID
* @param accessType 记录类型(登入、登出或全部)
* @param startDateStr 记录的起始日期
* @param endDateStr 记录的结束日期
* @param offset 分页的偏移值
* @param limit 分页的大小
* @return 返回 JSON 数据 其中:Key为rows的值代表所有记录数据,Key为total的值代表记录的总条数
* @throws SystemLogServiceException SystemLogServiceException
*/
@SuppressWarnings("unchecked")
@RequestMapping(value = "getAccessRecords", method = RequestMethod.GET)
public @ResponseBody
Map<String, Object> getAccessRecords(@RequestParam("userID") String userIDStr,
@RequestParam("accessType") String accessType,
@RequestParam("startDate") String startDateStr,
@RequestParam("endDate") String endDateStr,
@RequestParam("offset") int offset,
@RequestParam("limit") int limit) throws SystemLogServiceException {
// 创建 Response 对象
Response response = ResponseFactory.newInstance();
List<AccessRecordDO> rows = null;
long total = 0;
// 检查参数
String regex = "([0-9]{4})-([0-9]{2})-([0-9]{2})";
boolean startDateFormatCheck = (StringUtils.isEmpty(startDateStr) || startDateStr.matches(regex));
boolean endDateFormatCheck = (StringUtils.isEmpty(endDateStr) || endDateStr.matches(regex));
boolean userIDCheck = (StringUtils.isEmpty(userIDStr) || StringUtils.isNumeric(userIDStr));
if (startDateFormatCheck && endDateFormatCheck && userIDCheck) {
// 转到 Service 执行查询
Integer userID = -1;
if (StringUtils.isNumeric(userIDStr))
userID = Integer.valueOf(userIDStr);
Map<String, Object> queryResult = systemLogService.selectAccessRecord(userID, accessType, startDateStr, endDateStr, offset, limit);
if (queryResult != null) {
rows = (List<AccessRecordDO>) queryResult.get("data");
total = (long) queryResult.get("total");
}
} else
response.setResponseMsg("Request Argument Error");
if (rows == null)
rows = new ArrayList<>(0);
// 返回 Response
response.setCustomerInfo("rows", rows);
response.setResponseTotal(total);
return response.generateResponse();
}
/**
* 查询系统的操作日志
if (file != null) {
// 设置响应头
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
FileInputStream inputStream = new FileInputStream(file);
OutputStream outputStream = response.getOutputStream();
byte[] buffer = new byte[8192];
int len;
while ((len = inputStream.read(buffer, 0, buffer.length)) > 0) {
outputStream.write(buffer, 0, len);
outputStream.flush();
}
inputStream.close();
outputStream.close();
}
}
}
package com.ken.wms.common.controller;
/**
* 仓库信息管理请求 Handler
*
// 设置 Session
HttpSession session = request.getSession();
session.setAttribute("checkCode", checkCodeString);
// 将验证码输出
ImageIO.write(checkCodeImage, "png", outputStream);
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/png");
} catch (IOException e) {
log.error("fail to get the ServletOutputStream");
}
}
}
}
package com.ken.wms.common.controller;
/**
* 删除供应商记录
*
* @param supplierID 供应商ID
* @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 error
*/
@RequestMapping(value = "deleteSupplier", method = RequestMethod.GET)
public
@ResponseBody
Map<String, Object> deleteSupplier(@RequestParam("supplierID") Integer supplierID) {
// 初始化 Response
Response responseContent = ResponseFactory.newInstance();
// 刪除
String result = supplierManageService.deleteSupplier(supplierID) ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR;
// 设置 Response
responseContent.setResponseResult(result);
return responseContent.generateResponse();
}
/**
* 导入供应商信息
*
* @param file 保存有供应商信息的文件
* @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与
* error;key为total表示导入的总条数;key为available表示有效的条数
*/
@RequestMapping(value = "importSupplier", method = RequestMethod.POST)
public
@ResponseBody
Map<String, Object> importSupplier(@RequestParam("file") MultipartFile file) throws SupplierManageServiceException {
// 初始化 Response
Response responseContent = ResponseFactory.newInstance();
String result = Response.RESPONSE_RESULT_SUCCESS;
// 读取文件内容
int total = 0;
int available = 0;
if (file == null)
result = Response.RESPONSE_RESULT_ERROR;
Map<String, Object> importInfo = supplierManageService.importSupplier(file);
if (importInfo != null) {
total = (int) importInfo.get("total");
available = (int) importInfo.get("available");
}
// 设置 Response
responseContent.setResponseResult(result);
responseContent.setResponseTotal(total);
responseContent.setCustomerInfo("available", available);
return responseContent.generateResponse();
protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) {
if(log.isDebugEnabled()) {
log.debug("Authentication exception", e);
}
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
if (!"XMLHttpRequest".equalsIgnoreCase(httpServletRequest.getHeader("X-Requested-With"))){
// 请求为普通请求
this.setFailureAttribute(request, e);
return true;
}else{
// 请求为 Ajax 请求
// do some thing to return a json
httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
return false;
}
}
}
package com.ken.wms.common.controller;
/**
* 处理文件下载请求
*
*/
@Controller
@RequestMapping("/commons/fileSource")
public class FileSourceHandler {
@RequestMapping(value = "download/{fileName:.+}", method = RequestMethod.GET)
public void fileDownload(@PathVariable("fileName") String fileName, HttpServletRequest request,
HttpServletResponse response) throws IOException {
if (fileName == null)
return;
// 创建 Response 对象
Response response = ResponseFactory.newInstance();
List<AccessRecordDO> rows = null;
long total = 0;
// 检查参数
String regex = "([0-9]{4})-([0-9]{2})-([0-9]{2})";
boolean startDateFormatCheck = (StringUtils.isEmpty(startDateStr) || startDateStr.matches(regex));
boolean endDateFormatCheck = (StringUtils.isEmpty(endDateStr) || endDateStr.matches(regex));
boolean userIDCheck = (StringUtils.isEmpty(userIDStr) || StringUtils.isNumeric(userIDStr));
if (startDateFormatCheck && endDateFormatCheck && userIDCheck) {
// 转到 Service 执行查询
Integer userID = -1;
if (StringUtils.isNumeric(userIDStr))
userID = Integer.valueOf(userIDStr);
Map<String, Object> queryResult = systemLogService.selectAccessRecord(userID, accessType, startDateStr, endDateStr, offset, limit);
if (queryResult != null) {
rows = (List<AccessRecordDO>) queryResult.get("data");
total = (long) queryResult.get("total");
}
} else
response.setResponseMsg("Request Argument Error");
if (rows == null)
rows = new ArrayList<>(0);
// 返回 Response
response.setCustomerInfo("rows", rows);
response.setResponseTotal(total);
return response.generateResponse();
}
/**
* 查询系统的操作日志
*
* @param userIDStr 用户ID
* @param startDateStr 记录的起始日期
* @param endDateStr 记录的结束日期
* @param offset 分页的偏移值
* @param limit 分页的大小
* @return 返回 JSON 数据 其中:Key为rows的值代表所有记录数据,Key为total的值代表记录的总条数
* @throws SystemLogServiceException SystemLogServiceException
String result = Response.RESPONSE_RESULT_ERROR;
// 读取文件
long total = 0;
long available = 0;
if (file != null) {
Map<String, Object> importInfo = repositoryAdminManageService.importRepositoryAdmin(file);
if (importInfo != null) {
total = (long) importInfo.get("total");
available = (long) importInfo.get("available");
result = Response.RESPONSE_RESULT_SUCCESS;
}
}
// 设置 Response
responseContent.setResponseResult(result);
responseContent.setResponseTotal(total);
responseContent.setCustomerInfo("available", available);
return responseContent.generateResponse();
}
/**
* 导出仓库管理员信息到文件中
*
* @param searchType 查询类型
* @param keyWord 查询关键字
* @param response HttpServletResponse
*/
@SuppressWarnings("unchecked")
@RequestMapping(value = "exportRepositoryAdmin", method = RequestMethod.GET)
public void exportRepositoryAdmin(@RequestParam("searchType") String searchType,
@RequestParam("keyWord") String keyWord, HttpServletResponse response) throws RepositoryAdminManageServiceException, IOException {
// 导出文件名
String fileName = "repositoryAdminInfo.xlsx";
// 查询
List<RepositoryAdmin> repositoryAdmins;
Map<String, Object> queryResult = query(keyWord, searchType, -1, -1);
if (queryResult != null)
repositoryAdmins = (List<RepositoryAdmin>) queryResult.get("data");
else
repositoryAdmins = new ArrayList<>();
// 生成文件
File file = repositoryAdminManageService.exportRepositoryAdmin(repositoryAdmins);
// 输出文件
if (file != null) {
// 设置响应头
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
FileInputStream inputStream = new FileInputStream(file);
OutputStream outputStream = response.getOutputStream();
available = (long) importInfo.get("available");
result = Response.RESPONSE_RESULT_SUCCESS;
}
}
// 设置 Response
responseContent.setResponseResult(result);
responseContent.setResponseTotal(total);
responseContent.setCustomerInfo("available", available);
return responseContent.generateResponse();
}
/**
* 导出仓库管理员信息到文件中
*
* @param searchType 查询类型
* @param keyWord 查询关键字
* @param response HttpServletResponse
*/
@SuppressWarnings("unchecked")
@RequestMapping(value = "exportRepositoryAdmin", method = RequestMethod.GET)
public void exportRepositoryAdmin(@RequestParam("searchType") String searchType,
@RequestParam("keyWord") String keyWord, HttpServletResponse response) throws RepositoryAdminManageServiceException, IOException {
// 导出文件名
String fileName = "repositoryAdminInfo.xlsx";
// 查询
List<RepositoryAdmin> repositoryAdmins;
Map<String, Object> queryResult = query(keyWord, searchType, -1, -1);
if (queryResult != null)
repositoryAdmins = (List<RepositoryAdmin>) queryResult.get("data");
else
repositoryAdmins = new ArrayList<>();
// 生成文件
File file = repositoryAdminManageService.exportRepositoryAdmin(repositoryAdmins);
// 输出文件
if (file != null) {
// 设置响应头
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
FileInputStream inputStream = new FileInputStream(file);
OutputStream outputStream = response.getOutputStream();
byte[] buffer = new byte[8192];
* @param response HttpServletResponse
*/
@SuppressWarnings("unchecked")
@RequestMapping(value = "exportSupplier", method = RequestMethod.GET)
public void exportSupplier(@RequestParam("searchType") String searchType, @RequestParam("keyWord") String keyWord,
HttpServletResponse response) throws SupplierManageServiceException, IOException {
String fileName = "supplierInfo.xlsx";
// 根据查询类型进行查询
List<Supplier> suppliers = null;
Map<String, Object> queryResult;
queryResult = query(searchType, keyWord, -1, -1);
if (queryResult != null) {
suppliers = (List<Supplier>) queryResult.get("data");
}
// 获取生成的文件
File file = supplierManageService.exportSupplier(suppliers);
// 写出文件
if (file != null) {
// 设置响应头
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
FileInputStream inputStream = new FileInputStream(file);
OutputStream outputStream = response.getOutputStream();
byte[] buffer = new byte[8192];
int len;
while ((len = inputStream.read(buffer, 0, buffer.length)) > 0) {
outputStream.write(buffer, 0, len);
outputStream.flush();
}
inputStream.close();
outputStream.close();
}
}
}
package com.ken.wms.common.controller;
*
* @param searchType 查询类型
* @param offset 分页偏移值
* @param limit 分页大小
* @param keyWord 查询关键字
* @return 返回一个Map,其中key=rows,表示查询出来的记录;key=total,表示记录的总条数
*/
@SuppressWarnings("unchecked")
@RequestMapping(value = "getRepositoryAdminList", method = RequestMethod.GET)
public
@ResponseBody
Map<String, Object> getRepositoryAdmin(@RequestParam("searchType") String searchType,
@RequestParam("keyWord") String keyWord, @RequestParam("offset") int offset,
@RequestParam("limit") int limit) throws RepositoryAdminManageServiceException {
// 初始化 Response
Response responseContent = ResponseFactory.newInstance();
List<RepositoryAdmin> rows = null;
long total = 0;
// 查询
Map<String, Object> queryResult = query(keyWord, searchType, offset, limit);
if (queryResult != null) {
rows = (List<RepositoryAdmin>) queryResult.get("data");
total = (long) queryResult.get("total");
}
// 设置 Response
responseContent.setCustomerInfo("rows", rows);
responseContent.setResponseTotal(total);
return responseContent.generateResponse();
}
/**
* 添加一条仓库管理员信息
*
* @param repositoryAdmin 仓库管理员信息
* @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 error
*/
@RequestMapping(value = "addRepositoryAdmin", method = RequestMethod.POST)
public
@ResponseBody
Map<String, Object> addRepositoryAdmin(@RequestBody RepositoryAdmin repositoryAdmin) throws RepositoryAdminManageServiceException {
// 初始化 Response
Response responseContent = ResponseFactory.newInstance();
// 添加结果
String result = repositoryAdminManageService.addRepositoryAdmin(repositoryAdmin)
? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR;
* @param searchType 搜索类型
* @param offset 如有多条记录时分页的偏移值
* @param limit 如有多条记录时分页的大小
* @param keyWord 搜索的关键字
* @return 返回所有符合要求的记录
*/
@SuppressWarnings("unchecked")
@RequestMapping(value = "getGoodsList", method = RequestMethod.GET)
public
@ResponseBody
Map<String, Object> getGoodsList(@RequestParam("searchType") String searchType,
@RequestParam("offset") int offset, @RequestParam("limit") int limit,
@RequestParam("keyWord") String keyWord) throws GoodsManageServiceException {
// 初始化 Response
Response responseContent = ResponseFactory.newInstance();
List<Supplier> rows = null;
long total = 0;
// 查询
Map<String, Object> queryResult = query(searchType, keyWord, offset, limit);
if (queryResult != null) {
rows = (List<Supplier>) queryResult.get("data");
total = (long) queryResult.get("total");
}
// 设置 Response
responseContent.setCustomerInfo("rows", rows);
responseContent.setResponseTotal(total);
return responseContent.generateResponse();
}
/**
* 添加一条货物信息
*
* @param goods 货物信息
* @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 error
*/
@RequestMapping(value = "addGoods", method = RequestMethod.POST)
public
@ResponseBody
Map<String, Object> addGoods(@RequestBody Goods goods) throws GoodsManageServiceException {
// 初始化 Response
Response responseContent = ResponseFactory.newInstance();
// 添加记录
String result = goodsManageService.addGoods(goods) ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR;
// 设置 Response
responseContent.setResponseResult(result);
return responseContent.generateResponse();
}
int total = 0;
int available = 0;
if (file != null) {
Map<String, Object> importInfo = storageManageService.importStorage(file);
if (importInfo != null) {
total = (int) importInfo.get("total");
available = (int) importInfo.get("available");
result = Response.RESPONSE_RESULT_SUCCESS;
}
}
// 设置 Response
responseContent.setResponseResult(result);
responseContent.setResponseTotal(total);
responseContent.setCustomerInfo("available", available);
return responseContent.generateResponse();
}
/**
* 导出库存信息
*
* @param searchType 查询类型
* @param keyword 查询关键字
* @param repositoryBelong 查询所属仓库
* @param request 请求
* @param response 响应
*/
@SuppressWarnings("unchecked")
@RequestMapping(value = "exportStorageRecord", method = RequestMethod.GET)
public void exportStorageRecord(@RequestParam("searchType") String searchType,
@RequestParam("keyword") String keyword,
@RequestParam(value = "repositoryBelong", required = false) String repositoryBelong,
HttpServletRequest request, HttpServletResponse response) throws StorageManageServiceException, IOException {
String fileName = "storageRecord.xlsx";
HttpSession session = request.getSession();
UserInfoDTO userInfo = (UserInfoDTO) session.getAttribute("userInfo");
Integer sessionRepositoryBelong = userInfo.getRepositoryBelong();
if (sessionRepositoryBelong > 0)
repositoryBelong = sessionRepositoryBelong.toString();
List<Storage> storageList = null;
Map<String, Object> queryResult = query(searchType, keyword, repositoryBelong, -1, -1);
if (queryResult != null)
storageList = (List<Storage>) queryResult.get("data");
File file = storageManageService.exportStorage(storageList);
int len;
while ((len = inputStream.read(buffer, 0, buffer.length)) > 0) {
outputStream.write(buffer, 0, len);
outputStream.flush();
}
inputStream.close();
outputStream.close();
}
}
}
package com.ken.wms.common.controller;
/**
* 供应商信息管理请求 Handler
*
*/
@RequestMapping(value = "/**/supplierManage")
@Controller
public class SupplierManageHandler {
@Autowired
private SupplierManageService supplierManageService;
private static final String SEARCH_BY_ID = "searchByID";
@RequestParam("offset") int offset, @RequestParam("limit") int limit) throws StorageManageServiceException {
// 初始化 Response
Response responseContent = ResponseFactory.newInstance();
List<Storage> rows;
long total = 0;
// query
Map<String, Object> queryResult = query(searchType, keyword, repositoryBelong, offset, limit);
if (queryResult != null) {
rows = (List<Storage>) queryResult.get("data");
total = (long) queryResult.get("total");
} else
rows = new ArrayList<>();
// 设置 Response
responseContent.setCustomerInfo("rows", rows);
responseContent.setResponseTotal(total);
return responseContent.generateResponse();
}
/**
* 查询库存信息,查询所属的仓库为session保存的信息
*
* @param keyword 查询关键字
* @param searchType 查询类型
* @param offset 分页偏移值
* @param limit 分页大小
* @param request 请求
* @return 结果的一个Map,其中: key为 rows 的代表记录数据;key 为 total 代表结果记录的数量
*/
@SuppressWarnings("unchecked")
@RequestMapping(value = "getStorageList", method = RequestMethod.GET)
public
@ResponseBody
Map<String, Object> getStorageList(@RequestParam("keyword") String keyword,
@RequestParam("searchType") String searchType, @RequestParam("offset") int offset,
@RequestParam("limit") int limit, HttpServletRequest request) throws StorageManageServiceException {
// 初始化 Response
Response responseContent = ResponseFactory.newInstance();
List<Storage> rows = null;
long total = 0;
HttpSession session = request.getSession();
UserInfoDTO userInfo = (UserInfoDTO) session.getAttribute("userInfo");
Integer repositoryID = userInfo.getRepositoryBelong();
if (repositoryID > 0) {
Map<String, Object> queryResult = query(searchType, keyword, repositoryID.toString(), offset, limit);
if (queryResult != null) {
rows = (List<Storage>) queryResult.get("data");
/**
* 仓库信息管理请求 Handler
*
*/
@Controller
@RequestMapping(value = "/**/repositoryManage")
public class RepositoryManageHandler {
@Autowired
private RepositoryService repositoryService;
private static final String SEARCH_BY_ID = "searchByID";
private static final String SEARCH_BY_ADDRESS = "searchByAddress";
private static final String SEARCH_ALL = "searchAll";
/**
* 通用的记录查询
*
* @param searchType 查询方式
* @param keyword 查询关键字
* @param offset 分页偏移值
* @param limit 分页大小
* @return 返回所有符合条件的查询结果
*/
private Map<String, Object> query(String searchType, String keyword, int offset, int limit) throws RepositoryManageServiceException {
Map<String, Object> queryResult = null;
switch (searchType) {
case SEARCH_BY_ID:
if (StringUtils.isNumeric(keyword)) {
queryResult = repositoryService.selectById(Integer.valueOf(keyword));
}
break;
case SEARCH_BY_ADDRESS:
queryResult = repositoryService.selectByAddress(offset, limit, keyword);
break;
case SEARCH_ALL:
queryResult = repositoryService.selectAll(offset, limit);
break;
default:
// do other thing
* error;key为total表示导入的总条数;key为available表示有效的条数
*/
@RequestMapping(value = "importStorageRecord", method = RequestMethod.POST)
public
@ResponseBody
Map<String, Object> importStorageRecord(@RequestParam("file") MultipartFile file) throws StorageManageServiceException {
// 初始化 Response
Response responseContent = ResponseFactory.newInstance();
String result = Response.RESPONSE_RESULT_ERROR;
int total = 0;
int available = 0;
if (file != null) {
Map<String, Object> importInfo = storageManageService.importStorage(file);
if (importInfo != null) {
total = (int) importInfo.get("total");
available = (int) importInfo.get("available");
result = Response.RESPONSE_RESULT_SUCCESS;
}
}
// 设置 Response
responseContent.setResponseResult(result);
responseContent.setResponseTotal(total);
responseContent.setCustomerInfo("available", available);
return responseContent.generateResponse();
}
/**
* 导出库存信息
*
* @param searchType 查询类型
* @param keyword 查询关键字
* @param repositoryBelong 查询所属仓库
* @param request 请求
* @param response 响应
*/
@SuppressWarnings("unchecked")
@RequestMapping(value = "exportStorageRecord", method = RequestMethod.GET)
public void exportStorageRecord(@RequestParam("searchType") String searchType,
@RequestParam("keyword") String keyword,
@RequestParam(value = "repositoryBelong", required = false) String repositoryBelong,
HttpServletRequest request, HttpServletResponse response) throws StorageManageServiceException, IOException {
String fileName = "storageRecord.xlsx";
HttpSession session = request.getSession();
UserInfoDTO userInfo = (UserInfoDTO) session.getAttribute("userInfo");