基于javaweb的SSM服装进销存管理系统(java+ssm+html+js+jsp+mysql)

运行环境

Java≥8、MySQL≥5.7、Tomcat≥8

开发工具

eclipse/idea/myeclipse/sts等均可配置运行

适用

课程设计,大作业,毕业设计,项目练习,学习演示等

功能说明

190023362402

200023362402

210023362402

220023362402

230023362402

240023362402

基于javaweb的SSM服装进销存管理系统(java+ssm+html+js+jsp+mysql)

项目介绍

管理员角色包含以下功能: 管理员登录,修改密码,管理员管理,货号管理,仓库管理,入库管理,出库管理,查看入库信息等功能。

环境需要

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 page = new Page<>(userVO.getPage(), userVO.getLimit());

QueryWrapper 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 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 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 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 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) 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 rows = null;

long total = 0;

// 查询

Map<String, Object> queryResult = query(keyWord, searchType, offset, limit);

if (queryResult != null) {

rows = (List) 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 repositoryAdmins;

Map<String, Object> queryResult = query(keyWord, searchType, -1, -1);

if (queryResult != null)

repositoryAdmins = (List) 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();


项目链接:
https://javayms.github.io?id=131122532008200qb
https://javayms.pages.dev?id=131122532008200qb