系统描述
当下,如果还依然使用纸质文档来记录并且管理相关信息,可能会出现很多问题,比如原始文件的丢失,因为采用纸质文档,很容易受潮或者怕火,不容易备份,需要花费大量的人员和资金来管理用纸质文档存储的信息,最重要的是数据出现问题寻找起来很麻烦,并且修改也困难,如果还这样操作会造成很大的资源浪费和经济损失。
库存管理系统运用的工具包括IDEA,Tomcat,Spring Boot框架以及MySQL等。该系统可以实现对公告信息,员工,供应商类型,供应商信用等级,商品类型,公告类型,供应商,商品,商品预定,采购入库,采购入库详情,客户等信息进行管理。
库存管理系统就是采用目前最流行的互联网应用思维,让信息处理变得更加高效,并且处理结果更加的符合预期,只要是关于数据管理方面,不管是添加还是修改,以及数据维护甚至是数据迁移,都可以达到更快更安全的要求。
技术描述
文章末尾获取源码
开发语言:Java
技术框架:SpringBoot
前端语言:Vue\HTML
持久层框架:Mybatis
服务器:Tomcat7\8\9\10
数据库:MySQL5.7以上
项目管理工具:Maven
项目开发工具:IDEA\Eclipse
系统展示
管理员功能实现
供应商管理
实现供应商管理功能,其界面运行的效果图见图5.1。供应商信息有供应商类型,供应商信用等级名称,供应商名称等信息,管理员需要新增供应商,发现登记错误数据的供应商信息可以使用修改功能及时更改,需要删除的供应商信息可以使用删除功能删除。
商品管理
实现商品管理功能,其界面运行的效果图见图5.2。商品信息有商品类型,存储仓库,单位,单价,供应商名称等信息,管理员新增商品信息,使用修改功能对有错误数据的商品信息进行更改,需要删除的商品信息可以使用删除功能删除。
商品统计报表
实现商品统计报表功能,其界面运行的效果图见图5.3。管理员通过柱形图可以查看各个商品的库存数据,管理员可以切换柱形图统计报表为折线图,可以下载商品库存的统计报表图片。
商品预定管理
实现商品预定管理功能,其界面运行的效果图见图5.4。商品预定信息有预定数量,客户姓名,员工姓名,预定的商品,预定时间等信息。商品预定信息可以让管理员新增,需要删除的商品预定信息可以使用删除功能删除。
采购入库管理
实现采购入库管理功能,其界面运行的效果图见图5.5。采购入库信息包括采购入库名称,采购入库流水号等信息,采购入库信息也允许管理员新增,需要删除的采购入库信息也能够使用删除功能删除。管理员查询采购入库信息需要提供的查询条件是采购入库名称。
公告信息管理
实现公告信息管理功能,其界面运行的效果图见图5.6。公告信息有公告类型,公告图片等信息,公告信息允许管理员新增,发现有错误数据的公告信息可以使用修改功能更正,需要删除的公告也能使用删除功能删除。
客户管理
实现客户管理功能,其界面运行的效果图见图5.7。客户信息有客户姓名,客户联系方式,客户性别等信息,管理员也能新增客户信息,客户信息存在数据登记错误的情况,管理员可以使用修改功能更改,需要删除的客户信息可以使用删除功能删除。对于客户信息的查询,需要管理员提供客户姓名,提供客户联系方式等。
员工功能实现
商品管理
实现商品管理功能,其界面运行的效果图见图5.8。员工查看商品存储仓库,查看商品库存,查看商品单价等信息,员工查询商品有很多种方式,可以根据商品名字,商品类型,存储仓库,单价,供应商名称等信息来查询商品。
商品预定管理
实现商品预定管理功能,其界面运行的效果图见图5.9。员工新增商品预定信息,员工只能查看自己登记的商品预定信息的详情信息,同时,员工也只能查询自己登记的商品预定信息,查询商品预定信息也有很多种方式,可以根据预定数量,商品名字,客户姓名,客户联系方式,单号等信息查询。
采购入库管理
实现采购入库管理功能,其界面运行的效果图见图5.10。员工可以新增采购入库信息,主要是登记采购入库名称,选择采购入库类型,主要有采购入库,出库两种采购入库类型可供选择,最后提交新增的采购入库信息。已经提交的采购入库信息,员工也能随时查看其详细信息。
采购入库
实现采购入库功能,其界面运行的效果图见图5.11。员工对商品采购入库时,需要选择采购入库的商品,然后对该商品的入库数量进行编辑,包括增加商品采购入库的数量,减少商品采购入库的数量,查看商品库存,最后提交商品采购入库信息。
采购入库详情管理
实现采购入库详情管理功能,其界面运行的效果图见图5.12。员工主要是查看采购入库的商品的操作数量信息,操作时间信息,采购入库名称以及采购入库类型等信息。查询采购入库详情需要员工提供商品名字,单价,采购入库名称才能查询。
客户管理
实现客户管理功能,其界面运行的效果图见图5.13。员工新增客户信息,查看各个客户的联系方式信息,查询客户需要员工提供客户的联系方式,提供客户姓名等信息才能查询
代码实现:
跨域实现
package com.interceptor;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import com.annotation.IgnoreAuth;
import com.entity.EIException;
import com.entity.TokenEntity;
import com.service.TokenService;
import com.utils.R;
/**
* 权限(Token)验证
*/
@Component
public class AuthorizationInterceptor implements HandlerInterceptor {
public static final String LOGIN_TOKEN_KEY = "Token";
@Autowired
private TokenService tokenService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//支持跨域请求
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization");
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
IgnoreAuth annotation;
if (handler instanceof HandlerMethod) {
annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
} else {
return true;
}
//从header中获取token
String token = request.getHeader(LOGIN_TOKEN_KEY);
/**
* 不需要验证权限的方法直接放过
*/
if(annotation!=null) {
return true;
}
TokenEntity tokenEntity = null;
if(StringUtils.isNotBlank(token)) {
tokenEntity = tokenService.getTokenEntity(token);
}
if(tokenEntity != null) {
request.getSession().setAttribute("userId", tokenEntity.getUserid());
request.getSession().setAttribute("role", tokenEntity.getRole());
request.getSession().setAttribute("tableName", tokenEntity.getTablename());
request.getSession().setAttribute("username", tokenEntity.getUsername());
return true;
}
PrintWriter writer = null;
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
try {
writer = response.getWriter();
writer.print(JSONObject.toJSONString(R.error(401, "请先登录")));
} finally {
if(writer != null){
writer.close();
}
}
// throw new EIException("请先登录", 401);
return false;
}
}
登录实现
package com.controller;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.TokenEntity;
import com.entity.UserEntity;
import com.service.TokenService;
import com.service.UserService;
import com.utils.CommonUtil;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.ValidatorUtils;
/**
* 登录相关
*/
@RequestMapping("users")
@RestController
public class UserController{
@Autowired
private UserService userService;
@Autowired
private TokenService tokenService;
/**
* 登录
*/
@IgnoreAuth
@PostMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
if(user==null || !user.getPassword().equals(password)) {
return R.error("账号或密码不正确");
}
String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
return R.ok().put("token", token);
}
/**
* 注册
*/
@IgnoreAuth
@PostMapping(value = "/register")
public R register(@RequestBody UserEntity user){
// ValidatorUtils.validateEntity(user);
if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
return R.error("用户已存在");
}
userService.insert(user);
return R.ok();
}
/**
* 退出
*/
@GetMapping(value = "logout")
public R logout(HttpServletRequest request) {
request.getSession().invalidate();
return R.ok("退出成功");
}
/**
* 密码重置
*/
@IgnoreAuth
@RequestMapping(value = "/resetPass")
public R resetPass(String username, HttpServletRequest request){
UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
if(user==null) {
return R.error("账号不存在");
}
user.setPassword("123456");
userService.update(user,null);
return R.ok("密码已重置为:123456");
}
/**
* 列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,UserEntity user){
EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/list")
public R list( UserEntity user){
EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
ew.allEq(MPUtil.allEQMapPre( user, "user"));
return R.ok().put("data", userService.selectListView(ew));
}
/**
* 信息
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") String id){
UserEntity user = userService.selectById(id);
return R.ok().put("data", user);
}
/**
* 获取用户的session用户信息
*/
@RequestMapping("/session")
public R getCurrUser(HttpServletRequest request){
Long id = (Long)request.getSession().getAttribute("userId");
UserEntity user = userService.selectById(id);
return R.ok().put("data", user);
}
/**
* 保存
*/
@PostMapping("/save")
public R save(@RequestBody UserEntity user){
// ValidatorUtils.validateEntity(user);
if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
return R.error("用户已存在");
}
userService.insert(user);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody UserEntity user){
// ValidatorUtils.validateEntity(user);
UserEntity u = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername()));
if(u!=null && u.getId()!=user.getId() && u.getUsername().equals(user.getUsername())) {
return R.error("用户名已存在。");
}
userService.updateById(user);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
userService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
}