源码获取:俺的博客首页 "资源" 里下载!
项目介绍
管理员角色包含以下功能:
管理员登录,修改密码,管理员管理,货号管理,仓库管理,入库管理,出库管理,查看入库信息等功能。
环境需要
1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。
2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;
3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可
4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS;
5.数据库:MySql 5.7版本;
技术栈
1. 后端:Spring+SpringMVC+Mybatis
2. 前端:HTML+CSS+JavaScript+jsp
使用说明
1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;
2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;
3. 将项目中application.yml配置文件中的数据库配置改为自己的配置;
4. 运行项目,输入localhost:8080/ 登录
用户管理控制层:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private RoleService roleService;
/**
* 登录
*
* @param username 用户名
* @param password 密码
* @param request
* @return
*/
@SysLog("登陆操作")
@PostMapping("/login")
public Result login(String username, String password, HttpServletRequest request) {
try {
//获取当前登录主体对象
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
subject.login(token);
LoginUserVO userDTO = (LoginUserVO) subject.getPrincipal();
request.getSession().setAttribute("username", userDTO.getUser());
return Result.success(true, "200", "登录成功");
} catch (UnknownAccountException e) {
e.printStackTrace();
return Result.error(false, "400", "登录失败,用户名不存在");
}catch (IncorrectCredentialsException e) {
e.printStackTrace();
return Result.error(false, "400", "登录失败,密码错误");
}catch (AuthenticationException e) {
e.printStackTrace();
return Result.error(false, "400", "登录失败,账户禁用");
}
}
/**
* 得到登陆验证码
* @param response
* @param session
* @throws IOException
*/
@RequestMapping("/getCode")
public void getCode(HttpServletResponse response, HttpSession session) throws IOException {
//定义图形验证码的长和宽
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(116, 36,4,5);
session.setAttribute("code",lineCaptcha.getCode());
try {
ServletOutputStream outputStream = response.getOutputStream();
lineCaptcha.write(outputStream);
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 查询所有用户信息
*
* @param userVO
* @return
*/
@SysLog("用户查询操作")
@RequestMapping("/userList")
public DataGridViewResult userList(UserVO userVO) {
//分页构造函数
IPage<User> page = new Page<>(userVO.getPage(), userVO.getLimit());
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like(!StringUtils.isEmpty(userVO.getUsername()), "username", userVO.getUsername());
queryWrapper.like(!StringUtils.isEmpty(userVO.getUname()), "uname", userVO.getUname());
/**
* 翻页查询
* @param page 翻页对象
* @param queryWrapper 实体对象封装操作类
*/
IPage<User> userIPage = userService.page(page, queryWrapper);
return new DataGridViewResult(userIPage.getTotal(), userIPage.getRecords());
}
/**
* 添加用户信息
*
* @param user
* @return
*/
@SysLog("用户添加操作")
@PostMapping("/adduser")
public Result addRole(User user) {
user.setUcreatetime(new Date());
String salt = UUIDUtil.randomUUID();
user.setPassword(PasswordUtil.md5("000000", salt, 2));
user.setSalt(salt);
user.setType(1);
boolean bool = userService.save(user);
try {
if (bool) {
return Result.success(true, "200", "添加成功!");
}
} catch (Exception e) {
e.printStackTrace();
}
return Result.error(false, null, "添加失败!");
}
/**
* 校验用户名是否存在
*
* @param username
* @return
*/
@RequestMapping("/checkUserName")
public String checkUserName(String username) {
Map<String, Object> map = new HashMap<>();
try {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username", username);
User user = userService.getOne(queryWrapper);
if (user != null) {
map.put("exist", true);
map.put("message", "用户名已存在");
} else {
map.put("exist", false);
map.put("message", "用户名可以使用");
}
} catch (Exception e) {
e.printStackTrace();
}
return JSON.toJSONString(map);
}
/**
* 修改用户信息
*
* @param user
* @return
*/
@SysLog("用户修改操作")
@PostMapping("/updateuser")
public Result updateUser(User user) {
boolean bool = userService.updateById(user);
try {
if (bool) {
return Result.success(true, "200", "修改成功!");
}
} catch (Exception e) {
e.printStackTrace();
}
return Result.error(false, null, "修改失败!");
}
/**
* 删除单条数据
*
* @param id
* @return
*/
@SysLog("用户删除操作")
@RequestMapping("/deleteOne")
public Result deleteOne(int id) {
boolean bool = userService.removeById(id);
try {
if (bool) {
return Result.success(true, "200", "删除成功!");
}
} catch (Exception e) {
e.printStackTrace();
}
return Result.error(false, null, "删除失败!");
}
/**
* 重置密码
*
* @param id
* @return
*/
@SysLog("用户修改操作")
@PostMapping("/resetPwd")
public Result resetPwd(int id) {
User user = new User();
String salt = UUIDUtil.randomUUID();
user.setUid(id);
user.setPassword(PasswordUtil.md5("000000", salt, 2));
user.setSalt(salt);
boolean bool = userService.updateById(user);
try {
if (bool) {
return Result.success(true, "200", "重置成功!");
}
} catch (Exception e) {
e.printStackTrace();
}
return Result.error(false, null, "重置失败!");
}
/**
* 根据id查询当前用户拥有的角色
*
* @param id
* @return
*/
@RequestMapping("/initRoleByUserId")
public DataGridViewResult initRoleByUserId(int id) {
List<Map<String, Object>> mapList = null;
try {
//查询所有角色列表
mapList = roleService.listMaps();
//根据用户id查询用户拥有的角色
Set<Integer> roleIdList = userService.findRoleByUserId(id);
for (Map<String, Object> map : mapList) {
//定义标记 默认不选中
boolean flag = false;
int roleId = (int) map.get("roleid");
for (Integer rid : roleIdList) {
if (rid == roleId) {
flag = true;
break;
}
}
map.put("LAY_CHECKED", flag);
}
} catch (Exception e) {
e.printStackTrace();
}
return new DataGridViewResult(Long.valueOf(mapList.size()), mapList);
}
/**
* 为用户分配角色
*
* @param roleids
* @param userid
* @return
*/
@SysLog("用户添加操作")
@RequestMapping("/saveUserRole")
public Result saveUserRole(String roleids, int userid) {
try {
if (userService.saveUserRole(userid, roleids)) {
return Result.success(true, null, "分配成功");
}
} catch (Exception e) {
e.printStackTrace();
}
return Result.error(false, null, "分配失败");
}
/**
* 修改密码
*
* @param newPassWord1
* @param newPassWord2
* @return
*/
@RequestMapping("/updateUserPassWord")
public Result updateUserPassWord(String newPassWord1, String newPassWord2,HttpSession session) {
User sessionUser = (User) session.getAttribute("username");
if (newPassWord1.equals(newPassWord2)){
User user = new User();
String salt = UUIDUtil.randomUUID();
user.setUid(sessionUser.getUid());
user.setPassword(PasswordUtil.md5(newPassWord1, salt, 2));
user.setSalt(salt);
boolean bool = userService.updateById(user);
if (bool){
return Result.success(true,null,"修改成功");
}else {
return Result.error(false,null,"修改失败!");
}
}else {
return Result.error(false,null,"修改失败,两次密码不一致!");
}
}
}
进货入库管理控制层:
/**
* 商品出入库管理请求Handler
*
*/
@Controller
@RequestMapping(value = "stockRecordManage")
public class StockRecordManageHandler {
@Autowired
private StockRecordManageService stockRecordManageService;
/**
* 货物出库操作
*
* @param customerID 客户ID
* @param goodsID 货物ID
* @param repositoryIDStr 仓库ID
* @param number 出库数量
* @return 返回一个map,key为result的值表示操作是否成功
*/
@RequestMapping(value = "stockOut", method = RequestMethod.POST)
public
@ResponseBody
Map<String, Object> stockOut(@RequestParam("customerID") Integer customerID,
@RequestParam("goodsID") Integer goodsID,
@RequestParam(value = "repositoryID", required = false) String repositoryIDStr,
@RequestParam("number") long number) throws StockRecordManageServiceException {
// 初始化 Response
Response responseContent = ResponseFactory.newInstance();
String result = Response.RESPONSE_RESULT_ERROR;
boolean authorizeCheck = true;
boolean argumentCheck = true;
Integer repositoryID = null;
// 参数检查
if (repositoryIDStr != null) {
if (StringUtils.isNumeric(repositoryIDStr)) {
repositoryID = Integer.valueOf(repositoryIDStr);
} else {
argumentCheck = false;
responseContent.setResponseMsg("request argument error");
}
}
// 获取 session 中的信息
Subject currentUser = SecurityUtils.getSubject();
Session session = currentUser.getSession();
UserInfoDTO userInfo = (UserInfoDTO) session.getAttribute("userInfo");
String personInCharge = userInfo == null ? "none" : userInfo.getUserName();
Integer repositoryIDBelong = userInfo == null ? -1 : userInfo.getRepositoryBelong();
// 设置非管理员请求的仓库ID
if (!currentUser.hasRole("systemAdmin")) {
if (repositoryIDBelong < 0) {
authorizeCheck = false;
responseContent.setResponseMsg("You are not authorized");
} else {
repositoryID = repositoryIDBelong;
}
}
if (authorizeCheck && argumentCheck) {
if (stockRecordManageService.stockOutOperation(customerID, goodsID, repositoryID, number, personInCharge))
result = Response.RESPONSE_RESULT_SUCCESS;
}
// 设置 Response
responseContent.setResponseResult(result);
return responseContent.generateResponse();
}
/**
* 货物入库操作
*
* @param supplierID 供应商ID
* @param goodsID 货物ID
* @param repositoryIDStr 仓库ID
* @param number 入库数目
* @return 返回一个map,key为result的值表示操作是否成功
*/
@RequestMapping(value = "stockIn", method = RequestMethod.POST)
public
@ResponseBody
Map<String, Object> stockIn(@RequestParam("supplierID") Integer supplierID,
@RequestParam("goodsID") Integer goodsID,
@RequestParam(value = "repositoryID", required = false) String repositoryIDStr,
@RequestParam("number") long number) throws StockRecordManageServiceException {
// 初始化 Response
Response responseContent = ResponseFactory.newInstance();
String result = Response.RESPONSE_RESULT_ERROR;
boolean authorizeCheck = true;
boolean argumentCheck = true;
Integer repositoryID = null;
// 参数检查
if (repositoryIDStr != null) {
if (StringUtils.isNumeric(repositoryIDStr)) {
repositoryID = Integer.valueOf(repositoryIDStr);
} else {
argumentCheck = false;
responseContent.setResponseMsg("request argument error");
}
}
// 获取session中的信息
Subject currentUser = SecurityUtils.getSubject();
Session session = currentUser.getSession();
UserInfoDTO userInfo = (UserInfoDTO) session.getAttribute("userInfo");
String personInCharge = userInfo == null ? "none" : userInfo.getUserName();
Integer repositoryIDBelong = userInfo == null ? -1 : userInfo.getRepositoryBelong();
// 设置非管理员请求的仓库ID
if (!currentUser.hasRole("systemAdmin")) {
if (repositoryIDBelong < 0) {
authorizeCheck = false;
responseContent.setResponseMsg("You are not authorized");
} else {
repositoryID = repositoryIDBelong;
}
}
// 执行 Service
if (authorizeCheck && argumentCheck) {
if (stockRecordManageService.stockInOperation(supplierID, goodsID, repositoryID, number, personInCharge)) {
result = Response.RESPONSE_RESULT_SUCCESS;
}
}
// 设置 Response
responseContent.setResponseResult(result);
return responseContent.generateResponse();
}
/**
* 查询出入库记录
*
* @param searchType 查询类型(查询所有或仅查询入库记录或仅查询出库记录)
* @param repositoryIDStr 查询记录所对应的仓库ID
* @param endDateStr 查询的记录起始日期
* @param startDateStr 查询的记录结束日期
* @param limit 分页大小
* @param offset 分页偏移值
* @return 返回一个Map,其中:Key为rows的值代表所有记录数据,Key为total的值代表记录的总条数
*/
@SuppressWarnings({"SingleStatementInBlock", "unchecked"})
@RequestMapping(value = "searchStockRecord", method = RequestMethod.GET)
public @ResponseBody
Map<String, Object> getStockRecord(@RequestParam("searchType") String searchType,
@RequestParam("repositoryID") String repositoryIDStr,
@RequestParam("startDate") String startDateStr,
@RequestParam("endDate") String endDateStr,
@RequestParam("limit") int limit,
@RequestParam("offset") int offset) throws ParseException, StockRecordManageServiceException {
// 初始化 Response
Response responseContent = ResponseFactory.newInstance();
List<StockRecordDTO> 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 repositoryIDCheck = (StringUtils.isEmpty(repositoryIDStr) || StringUtils.isNumeric(repositoryIDStr));
if (startDateFormatCheck && endDateFormatCheck && repositoryIDCheck) {
Integer repositoryID = -1;
if (StringUtils.isNumeric(repositoryIDStr)) {
repositoryID = Integer.valueOf(repositoryIDStr);
}
// 转到 Service 执行查询
Map<String, Object> queryResult = stockRecordManageService.selectStockRecord(repositoryID, startDateStr, endDateStr, searchType, offset, limit);
if (queryResult != null) {
rows = (List<StockRecordDTO>) queryResult.get("data");
total = (long) queryResult.get("total");
}
} else
responseContent.setResponseMsg("Request argument error");
if (rows == null)
rows = new ArrayList<>(0);
responseContent.setCustomerInfo("rows", rows);
responseContent.setResponseTotal(total);
return responseContent.generateResponse();
}
}
管理员管理控制层:
/**
* 仓库管理员管理请求
*/
@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;
// query
switch (searchType) {
case SEARCH_ALL:
queryResult = repositoryAdminManageService.selectAll(offset, limit);
break;
case SEARCH_BY_ID:
if (StringUtils.isNumeric(keyWord))
queryResult = repositoryAdminManageService.selectByID(Integer.valueOf(keyWord));
break;
case SEARCH_BY_NAME:
queryResult = repositoryAdminManageService.selectByName(offset, limit, keyWord);
break;
case SEARCH_BY_REPOSITORY_ID:
if (StringUtils.isNumeric(keyWord))
queryResult = repositoryAdminManageService.selectByRepositoryID(Integer.valueOf(keyWord));
break;
default:
// do other things
break;
}
return queryResult;
}
/**
* 查询仓库管理员信息
*
* @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;
// 设置 Response
responseContent.setResponseResult(result);
return responseContent.generateResponse();
}
/**
* 查询指定 ID 的仓库管理员信息
*
* @param repositoryAdminID 仓库管理员ID
* @return 返回一个map,其中:key 为 result 的值为操作的结果,包括:success 与 error;key 为 data
* 的值为仓库管理员信息
*/
@RequestMapping(value = "getRepositoryAdminInfo", method = RequestMethod.GET)
public
@ResponseBody
Map<String, Object> getRepositoryAdminInfo(Integer repositoryAdminID) throws RepositoryAdminManageServiceException {
// 初始化 Response
Response responseContent = ResponseFactory.newInstance();
String result = Response.RESPONSE_RESULT_ERROR;
// 查询
RepositoryAdmin repositoryAdmin = null;
Map<String, Object> queryResult = repositoryAdminManageService.selectByID(repositoryAdminID);
if (queryResult != null) {
if ((repositoryAdmin = (RepositoryAdmin) queryResult.get("data")) != null)
result = Response.RESPONSE_RESULT_SUCCESS;
}
// 设置 Response
responseContent.setResponseResult(result);
responseContent.setResponseData(repositoryAdmin);
return responseContent.generateResponse();
}
/**
* 更新仓库管理员信息
*
* @param repositoryAdmin 仓库管理员信息
* @return 返回一个map,其中:key 为 result 的值为操作的结果,包括:success 与 error;key 为 data
* 的值为仓库管理员信息
*/
@RequestMapping(value = "updateRepositoryAdmin", method = RequestMethod.POST)
public
@ResponseBody
Map<String, Object> updateRepositoryAdmin(@RequestBody RepositoryAdmin repositoryAdmin) throws RepositoryAdminManageServiceException {
// 初始化 Response
Response responseContent = ResponseFactory.newInstance();
// 更新
String result = repositoryAdminManageService.updateRepositoryAdmin(repositoryAdmin)
? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR;
// 设置 Response
responseContent.setResponseResult(result);
return responseContent.generateResponse();
}
/**
* 删除指定 ID 的仓库管理员信息
*
* @param repositoryAdminID 仓库ID
* @return 返回一个map,其中:key 为 result 的值为操作的结果,包括:success 与 error;key 为 data
* 的值为仓库管理员信息
*/
@RequestMapping(value = "deleteRepositoryAdmin", method = RequestMethod.GET)
public
@ResponseBody
Map<String, Object> deleteRepositoryAdmin(Integer repositoryAdminID) throws RepositoryAdminManageServiceException {
// 初始化 Response
Response responseContent = ResponseFactory.newInstance();
// 删除记录
String result = repositoryAdminManageService.deleteRepositoryAdmin(repositoryAdminID)
? 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 = "importRepositoryAdmin", method = RequestMethod.POST)
public
@ResponseBody
Map<String, Object> importRepositoryAdmin(MultipartFile file) throws RepositoryAdminManageServiceException {
// 初始化 Response
Response responseContent = ResponseFactory.newInstance();
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();
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();
}
}
}
源码获取:俺的博客首页 "资源" 里下载!