基于SpringBoot、Layuimini、echarts的仓库管理系统(附源码)

集成开发环境:IntelliJ IDEA(2021)

数据库:MySQL 8.0

技术栈:Springboot、mybatisPlus、jquery、echarts

适用于结课大作业,课程设计、项目练习、学习演示等;


目录

第1章 系统定义

第2章  需求分析

2.1 系统需求综述

2.2 数据流图

2.3 用例图

第3章 系统设计

3.1系统功能模块设计

3.2 数据库设计

第四章 功能实现

登录

第五章 代码

5.1数据表对象层

passwordDTO

5.2配置类

5.3数据访问层

5.4业务逻辑层

5.5接口控制层

5.6 工具类

LocalDateTime格式对象映射器

前端数据格式控制类

登录全局拦截器

5.7 页面代码


第1章 系统定义

仓库管理系统是一款标准化、智能化过程导向管理的仓库管理软件,它结合了众多知名企业的实际情况和管理经验,能够准确、高效地管理跟踪客户订单、采购订单、以及仓库的综合管理。使用后,仓库管理模式发生了彻底的转变。从传统的“结果导向”转变成“过程导向”;从“数据录入”转变成“数据采集”,同时兼容原有的“数据录入”方式;从“人工找货”转变成了“导向定位取货”;同时引入了“监控平台”让管理更加高效、快捷。条码管理实质是过程管理,过程精细可控,结果自然正确无误。

第2章  需求分析

2.1 系统需求综述

1. 用户登录:

用户登录模块用于管理员、老师、学生三种用户的登录。登录时需要验证用户的账号、工号、学号及其密码,此时需要与数据库中的用户登录信息进行比较,如果与数据库表中数据一致,则进入对应的系统中,否则,提示用户名或密码错误。

2. 员工信息管理:

员工信息管理模块主要是管理员对于员工信息的管理,管理员可以增加员工信息,其中学生的用户名是唯一,不可重复。还可以通过员工用户名、昵称进行查询。

3. 入库信息查询:

入库信息查询模块是针对管理员和员工对入库信息的查询,管理员和员工可以根据自己的查询的需要,根据入库商品的商品名称、型号、存放位置来进行对需要商品信息的查询。

4. 出库信息查询:

出库信息查询模块是针对管理员和员工对入库信息的查询,管理员和员工可以根据自己的查询的需要,根据出库商品的商品名称、型号、存放位置来进行对需要商品信息的查询。

2.2 数据流图

1. 系统总流图,主要权限为查看入库信息、打印入库单据、查看出库信息、打印出库单据。数据流图如图2-1所示:

图2-1 系统总数据流图

2. 出库信息流图,主要权限为商品出货、打印出货单据。数据流图如图2-2所示:

图2-2 出库信息数据流图

  1. 入库信息流图,主要权限为商品入库、打印入库单据。数据流图如图2-3所示。

       

图2-3 入库信息数据流图

2.3 用例图

1. 用户登录

用户登录模块是用户进入系统的入口,用户在登录时需要通过验证用户登录的账号和密码,在验证成功后才能够进入系统,否则向用户提示账号或密码错误,需要重新登录。用户登录用例图如图4-1所示:

图2-1 用户登录用例图

2. 入库信息管理

学生信息管理模块主要管理员对于入库商品信息的管理,管理员可以增加、编辑、删除信息,其入库信息管理用例图如4-2所示:

图2-2 入库信息管理用例图

3. 入库信息查询

入库信息查询模块主要是管理员和员工对入库商品的信息进行管理,管理员和员工可以查询入库的具体信息。入库信息查询用例图如图4-3所示:

 图2-3 入库商品信息查询用例图

4. 出库信息管理

 班级成绩统计模块主要是管理员对出库商品的管理,管理员可以添加、删除、编辑出库商品信息,用例图如图2-4所示:

图2-4 出库信息用例图

5. 出库信息查询

出库信息查询出要是管理员和员工对出库商品信息的管理,可以根据名称、型号、规格等信息对出库商品信息进行查询,出库信息查询用例图如图4-5所示

 图2-5 出库信息查询用例图

6. 员工信息管理

员工信息管理主要是管理员对需要员工信息进行添加、编辑、删除等工作。可以通过用户名、昵称、性别、联系方式、职位、家庭住址等信息对员工信息进行查看,员工信息管理用例图如图4-6所示:

图2-6 员工信息管理用例图

第3章 系统设计

3.1系统功能模块设计

 图3-1 系统功能模块图

3.2 数据库设计

1.逻辑设计:E-R图

如图所示:

 图3-2 管理员E-R图

       

图3-3 入库单据E-R图

 图3-4 出库单据E-R图

2.数据表

如表3-1所示:

表3-1 管理员表

数据项名

数据项含义

类型

长度

备注

Id

编号

BIGINT

0

主键1

username

管理员账号名

VARCHAR

255

主键2

password

管理员账号密码

VARCHAR

255

name

管理员姓名

VARCHAR

255

sex

性别

VARCHAR

255

classify

种类

VARCHAR

255

phone

电话

VARCHAR

255

address

进货量

VARCHAR

255

入库单据表

用于存放入库单据的详细信息。

表3-2 入库单据表

数据项名

数据项含义

类型

长度

备注

id

商品编号

BIGINT

0

主键1

name

商品名

VARCHAR

255

vendor

生产厂商

VARCHAR

255

model

型号

VARCHAR

255

specification

规格

VARCHAR

255

number

入库数量

BIGINT

0

time

入库时间

DATETIME

0

unit

入库单位

VARCHAR

255

location

存放位置

VARCHAR

255

出库单据表

用于存放出库商品的详细信息。

表3-3 出库单据表

数据项名

数据项含义

类型

长度

备注

id

商品编号

BIGINT

0

主键1

name

商品名

VARCHAR

255

vendor

生产厂商

VARCHAR

255

model

型号

VARCHAR

255

specification

规格

VARCHAR

255

out_number

出库数量

BIGINT

255

out_time

出库时间

DATETIME

0

out_unit

出库单位

VARCHAR

255

deliveryman

送货员

VARCHAR

255

第四章 功能实现

登录

用户在进入系统前必须先登录系统,登录时,员工输入用户名和密码,管理员输入用户名和密码,验证成功后进入主页面,否则提示用户名和密码错误。登录界面展示如图4-1所示:

 图4-1 登录

新增功能:出仓和入仓的图标分析

添加员工

管理员在员工信息管理页面可以点击“添加”进行员工的添加,添加时需要输入员工的用户名、昵称、性别、联系方式、职位、家庭住址等基本信息。添加员工界面展示如图4-2所示:

 图4-2 添加员工

查询员工信息

管理员可以通过输入员工用户名,昵称,查询员工信息(支持模糊查询)界面展示如图4-3所示:

 图4-3 查询学生信息

修改员工信息

管理员可以选择需要修改的员工,同时为他们修改信息。为员工修改信息界面展示如图所示:

 图4-4为员工修改信息

3入库管理

用户进入系统后显示入库商品界面,可以查看入库商品的信息,入库商品信息界面展示如图所示:

 图4-5 入库商品信息公告

添加入库商品信息

管理员可以添加入库商品信息,需要填写添加商品的名称、型号、规格、生产厂商、入库数量、存放位置。添加入库商品界面展示,如图4-6所示:

 图4-6 入库商品信息管理

删除入库商品信息

删除商品信息时,服务器会提示是否删除,避免用户误删。删除公告界面展示如图4-7所示:

 图4-7 删除信息

修改入库信息

管理员可以对入库商品的信息进行修改。修改信息界面展示如图4-8所示:

 图4-8 修改公告

入库商品信息查询

通过输入商品名称、型号、存放位置来找到相应的入库商品信息。入库商品信息查询页面展示如图4-9所示:

图4-9 入库商品信息查询

商品出库

管理员可以出库需要出库的商品,输入它的商品名称、型号、规格、出库数量、出库单位、配送员,即可出库需要出库的商品如图4-10所示:

图4-10 商品出库

商品出库信息查询

管理员在商品出库信息界面可以通过商品名称、型号、配送员进行已经出库商品的查询如图4-11所示:

 图4-11 商品出库信息查询

修改密码

用户可以修改自己的密码,如图4-12所示:

 图4-12 修改密码

第五章 代码

5.1数据表对象层

员工实体类

package com.aliyev.domain;

import lombok.Data;

@Data
public class Employee {
    private Integer id;
    private String username;
    private String password;
    private String name;
    private String sex;
    private String classify;
    private String address;
    private String phone;
}

入库表实体类

package com.aliyev.domain;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.sql.Time;
import java.time.LocalDateTime;

@Data
@TableName("goods_in")
public class GoodsIn {
    private Integer id;
    private String name;
    private String model;
    private String vendor;
    private String specification;
    private Integer number;
    private LocalDateTime time;
    private String unit;//入库单位
    private String location;
}

出库表实体类

package com.aliyev.domain;

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.time.LocalDateTime;

@Data
@TableName("goods_out")
public class GoodsOut {
    private Integer id;
    private String name;
    private String vendor;
    private String model;
    private String specification;
    private Integer outNumber;
    private LocalDateTime outTime;
    private String outUnit;//入库单位
    private String deliveryman;//配松员
}

passwordDTO

package com.aliyev.domain;

import lombok.Data;

@Data
public class PasswordSetting {
    private Integer id;
    private String newPassword;
    private String oldPassword;
}

5.2配置类

mybatisPlus配置类

package com.aliyev.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MpConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor mp=new MybatisPlusInterceptor();
        mp.addInnerInterceptor(new PaginationInnerInterceptor());
        return mp;
    }
}

SpringMvc配置类

package com.aliyev.config;

import com.aliyev.filter.LoginCheckFilter;
import com.aliyev.utils.JacksonObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.util.List;

@Slf4j
@Configuration
public class SpringMvcConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/layuimini/**").addResourceLocations("classpath:/layuimini/");
    }

    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter messageConverter=new MappingJackson2HttpMessageConverter();
        messageConverter.setObjectMapper(new JacksonObjectMapper());
        converters.add(0,messageConverter);
        super.extendMessageConverters(converters);
    }

}

5.3数据访问层

package com.aliyev.dao;

import com.aliyev.domain.Employee;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface EmployeeDao extends BaseMapper<Employee> {
}
package com.aliyev.dao;

import com.aliyev.domain.GoodsIn;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface GoodsInDao extends BaseMapper<GoodsIn> {
}
package com.aliyev.dao;

import com.aliyev.domain.GoodsOut;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface GoodsOutDao extends BaseMapper<GoodsOut> {
}

5.4业务逻辑层

业务层接口

package com.aliyev.service;


import com.aliyev.dao.EmployeeDao;
import com.aliyev.domain.Employee;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

public interface EmployeeService extends IService<Employee> {
    IPage<Employee> getPage(int currentPage,int pageSize);
}
package com.aliyev.service;


import com.aliyev.domain.Employee;
import com.aliyev.domain.GoodsIn;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

public interface GoodsInService extends IService<GoodsIn> {
    IPage getPage(int currentPage,int pageSize,GoodsIn goodsIn);

}
package com.aliyev.service;


import com.aliyev.domain.Employee;
import com.aliyev.domain.GoodsIn;
import com.aliyev.domain.GoodsOut;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

public interface GoodsOutService extends IService<GoodsOut> {
    IPage getPage(int currentPage, int pageSize, GoodsOut goodsOut);
}

接口实现类

package com.aliyev.service.impl;

import com.aliyev.dao.EmployeeDao;
import com.aliyev.domain.Employee;
import com.aliyev.service.EmployeeService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeDao, Employee> implements EmployeeService  {

    @Autowired
    private EmployeeDao employeeDao;
    @Override
    public IPage<Employee> getPage(int currentPage, int pageSize) {
        IPage<Employee> page=new Page<>(currentPage,pageSize);
        employeeDao.selectPage(page,null);
        return page;
    }
}
package com.aliyev.service.impl;

import com.aliyev.dao.EmployeeDao;
import com.aliyev.dao.GoodsInDao;
import com.aliyev.domain.Employee;
import com.aliyev.domain.GoodsIn;
import com.aliyev.service.EmployeeService;
import com.aliyev.service.GoodsInService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class GoodsInServiceImpl extends ServiceImpl<GoodsInDao, GoodsIn> implements GoodsInService {

    @Autowired
    private GoodsInDao goodsInDao;
    @Override
    public IPage getPage(int currentPage, int pageSize,GoodsIn goodsIn) {

        LambdaQueryWrapper<GoodsIn> lqw=new LambdaQueryWrapper<>();
        lqw.like(Strings.isNotEmpty(goodsIn.getName()),GoodsIn::getName,goodsIn.getName())
                .like(Strings.isNotEmpty(goodsIn.getModel()),GoodsIn::getModel,goodsIn.getModel())
                .like(Strings.isNotEmpty(goodsIn.getLocation()),GoodsIn::getLocation,goodsIn.getLocation());
        IPage page=new Page(currentPage,pageSize);
        goodsInDao.selectPage(page,lqw);
        return page;
    }
}
package com.aliyev.service.impl;

import com.aliyev.dao.EmployeeDao;
import com.aliyev.dao.GoodsOutDao;
import com.aliyev.domain.Employee;
import com.aliyev.domain.GoodsIn;
import com.aliyev.domain.GoodsOut;
import com.aliyev.service.EmployeeService;
import com.aliyev.service.GoodsOutService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class GoodsOutServiceImpl extends ServiceImpl<GoodsOutDao, GoodsOut> implements GoodsOutService {

    @Autowired
    private GoodsOutDao goodsOutDao;
    @Override
    public IPage getPage(int currentPage, int pageSize, GoodsOut goodsIn) {
        LambdaQueryWrapper<GoodsOut> lqw=new LambdaQueryWrapper<>();
        lqw.like(Strings.isNotEmpty(goodsIn.getName()),GoodsOut::getName,goodsIn.getName())
                .like(Strings.isNotEmpty(goodsIn.getModel()),GoodsOut::getModel,goodsIn.getModel())
                .like(Strings.isNotEmpty(goodsIn.getDeliveryman()),GoodsOut::getDeliveryman,goodsIn.getDeliveryman());
        IPage page=new Page(currentPage,pageSize);
        goodsOutDao.selectPage(page,lqw);
        return page;
    }
}

5.5接口控制层

员工控制层

package com.aliyev.controller;

import com.aliyev.domain.Employee;
import com.aliyev.domain.PasswordSetting;
import com.aliyev.service.EmployeeService;
import com.aliyev.utils.Result;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;


@RestController
@RequestMapping(value = "/employee")
@Slf4j
public class EmployeeController {
    @Autowired
    private EmployeeService employeeService;

    /**
     * 获取登录对象数据
     *
     * @param id
     * @return
     */
    @GetMapping("{id}")
    public Result<Employee> user(@PathVariable Integer id) {
        System.out.println("ada" + id);
        Employee emp = employeeService.getById(id);
        return Result.success(emp, "查询成功");
    }

    /**
     * 登录
     *
     * @param employee
     * @param request
     * @return
     */
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public Result<String> login(Employee employee, HttpServletRequest request) {
        String username = employee.getUsername();
        String password = employee.getPassword();

        LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<>();
        lqw.eq(Strings.isNotEmpty(username), Employee::getUsername, username);
        Employee emp = employeeService.getOne(lqw);
        if (emp == null) {
            return Result.error("用户名不存在!");
        }
        if (!emp.getPassword().equals(password)) {
            return Result.error("用户名或密码错误");
        }

        request.getSession().setAttribute("employee", emp.getId());
        return Result.success(emp.getId().toString(), "登录成功~~");
    }

    /**
     * 退出登录
     *
     * @param request
     * @return
     */
    @RequestMapping("/logout")
    public Result<String> logout(HttpServletRequest request) {
        request.getSession().removeAttribute("employee");
        return Result.success("退出登录成功~~");
    }

    /**
     * 分页多田间查询
     *
     * @param currentPage
     * @param pageSize
     * @return
     */
    @RequestMapping()
    public Result<IPage> getEmployssPage(Integer currentPage, Integer pageSize, Employee employee) {
        log.info(employee.toString());
        IPage<Employee> page = employeeService.getPage(currentPage, pageSize);
        LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<>();
        lqw.like(Strings.isNotEmpty(employee.getUsername()), Employee::getUsername, employee.getUsername())
                .like(Strings.isNotEmpty(employee.getClassify()), Employee::getClassify, employee.getClassify())
                .like(Strings.isNotEmpty(employee.getName()), Employee::getName, employee.getName())
                .like(Strings.isNotEmpty(employee.getSex()), Employee::getSex, employee.getSex())
                .like(Strings.isNotEmpty(employee.getAddress()), Employee::getAddress, employee.getAddress());
        employeeService.page(page, lqw);
        //当前页大于无数据时,挑至最大页码
        if (currentPage > page.getPages()) {
            currentPage = (int) page.getPages();
            IPage<Employee> pages = employeeService.getPage(currentPage, pageSize);
            employeeService.page(pages, lqw);
            return Result.success(pages);
        }
        return Result.success(page);
    }

    @RequestMapping(value = "/updataPassword", method = RequestMethod.POST)
    public Result<String> updatePassword(PasswordSetting passwordSetting, HttpServletRequest request) {
        LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<>();
        lqw.eq(Strings.isNotEmpty(passwordSetting.getId().toString()), Employee::getId, passwordSetting.getId())
                .eq(Strings.isNotEmpty(passwordSetting.getOldPassword()), Employee::getPassword, passwordSetting.getOldPassword());
        Employee emp = employeeService.getOne(lqw);
//        log.info(emp.toString());
        if (emp == null) {
            return Result.error("旧密码错误,请重新填写!!!");
        }
        emp.setPassword(passwordSetting.getNewPassword());
        employeeService.updateById(emp);

        //更改成功后重新登录
        request.getSession().removeAttribute("employee");
        return Result.success("修改成功");
    }

    /**
     * 添加员工
     *
     * @param employee
     * @return
     */
    @RequestMapping(method = RequestMethod.POST)
    public Result<String> addEmployee(Employee employee) {
        LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<>();
        lqw.eq(Strings.isNotEmpty(employee.getUsername()), Employee::getUsername, employee.getUsername());
        Employee emp = employeeService.getOne(lqw);
        if (emp != null) {
            return Result.error("该用户名已存在,请重新填写用户名~~");
        }
        employeeService.save(employee);
        return Result.success("添加成功");
    }

    /**
     * 根据id删除
     *
     * @param id
     * @return
     */
    @RequestMapping("/deleteById")
    public Result<String> removeById(Integer id) {

        LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<>();
        lqw.eq(Strings.isNotEmpty(id.toString()), Employee::getId, id);
        Employee emp = employeeService.getOne(lqw);
        if (emp == null) {
            return Result.error("该数据在服务器已不存在,请重新刷新试试~~");
        }

        if (employeeService.removeById(id)) {
            return Result.success("删除成功!");
        }
        return Result.error("删除失败");
    }

    @RequestMapping(value = "updateById", method = RequestMethod.POST)
    public Result<String> updateById(Employee employee) {
        System.out.println(employee);

        return employeeService.updateById(employee) ? Result.success("修改成功~~") : Result.error("修改失败~~");
    }
}

入库控制层

package com.aliyev.controller;

import com.aliyev.domain.GoodsIn;
import com.aliyev.service.GoodsInService;
import com.aliyev.utils.Result;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;

@RestController
@RequestMapping("/goodsIn")
@Slf4j
public class GoodsInController {

    @Autowired
    private GoodsInService goodsInService;

    /**
     * 分页查询
     * @param currentPage
     * @param pageSize
     * @param goodsIn
     * @return
     */
    @RequestMapping()
    public Result<IPage> getAll(Integer currentPage, Integer pageSize, GoodsIn goodsIn) {
        IPage page = goodsInService.getPage(currentPage, pageSize, goodsIn);
        if(currentPage>page.getPages()){
            IPage newPage = goodsInService.getPage((int) page.getPages(), pageSize, goodsIn);
            return Result.success(newPage,"查询成功!");
        }
        if ((page.getPages() == 0 && (goodsIn.getName() != null || goodsIn.getModel() != null))
                && (page.getPages() == 0 && goodsIn.getName() != null && goodsIn.getModel() != null)) {
            Result.success(page, "查无此数据!!");
        } else if (page.getPages() == 0 && goodsIn.getName() == null && goodsIn.getModel() == null) {
            return Result.error("服务器故障,请联系管理员~~");
        }
        return Result.success(page,"查询成功");
    }

    /**
     * 商品入库
     * @param goodsIn
     * @return
     */
    @RequestMapping(method = RequestMethod.POST)
    public Result<String> saveGoods(GoodsIn goodsIn){
        goodsIn.setTime(LocalDateTime.now());
        LambdaQueryWrapper<GoodsIn> lqw=new LambdaQueryWrapper<>();
        lqw.eq(Strings.isNotEmpty(goodsIn.getName()),GoodsIn::getName,goodsIn.getName())
                .eq(Strings.isNotEmpty(goodsIn.getModel()),GoodsIn::getModel,goodsIn.getModel())
                .eq(Strings.isNotEmpty(goodsIn.getVendor()),GoodsIn::getVendor,goodsIn.getVendor())
                .eq(Strings.isNotEmpty(goodsIn.getSpecification()),GoodsIn::getSpecification,goodsIn.getSpecification())
                .eq(Strings.isNotEmpty(goodsIn.getUnit()),GoodsIn::getUnit,goodsIn.getUnit());
        GoodsIn goodIn = goodsInService.getOne(lqw);
        if(goodIn!=null){
            goodIn.setTime(LocalDateTime.now());
            goodIn.setNumber(goodIn.getNumber()+goodsIn.getNumber());
            goodsInService.updateById(goodIn);
            return Result.success("入库成功~~");
        }else if(goodIn==null){
            goodsInService.save(goodsIn);
            return Result.success("入库成功~~");
        }else{
            return Result.error("入库失败,系统发生故障,请联系管理员~~");
        }
    }

    /**
     * 删除商品
     * @param id
     * @return
     */
    @RequestMapping("deleteGoods")
    public Result<String> deleteByIdGoods(Integer id){
        LambdaQueryWrapper<GoodsIn> lqw=new LambdaQueryWrapper<>();
        lqw.eq(Strings.isNotEmpty(id.toString()),GoodsIn::getId,id);
        GoodsIn good = goodsInService.getOne(lqw);
        if(good==null){
            return Result.error("数据库中无该数据,请重新刷新看看~~");
        }
            return goodsInService.removeById(id)?Result.success("删除成功!"):Result.error("服务器故障,删除失败,请联系管理员!");

    }

    /**
     * 修改商品信息
     * @param goodsIn
     * @return
     */
    @RequestMapping("updateGoods")
    public Result<String> UpdateById(GoodsIn goodsIn){
        goodsIn.setTime(LocalDateTime.now());
        LambdaQueryWrapper<GoodsIn> lqw=new LambdaQueryWrapper<>();
        lqw.eq(Strings.isNotEmpty(goodsIn.getId().toString()),GoodsIn::getId,goodsIn.getId());
        GoodsIn good = goodsInService.getOne(lqw);
        if(good==null){
            return Result.error("数据库中无该数据,请重新刷新看看~~");
        }
        return goodsInService.updateById(goodsIn)?Result.success("修改成功!"):Result.error("修改失败!");
    }
}

出库控制层

package com.aliyev.controller;

import com.aliyev.domain.GoodsIn;
import com.aliyev.domain.GoodsOut;
import com.aliyev.service.GoodsInService;
import com.aliyev.service.GoodsOutService;
import com.aliyev.utils.Result;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;

@RestController
@RequestMapping("/goodsOut")
@Slf4j
public class GoodsOutController {
    @Autowired
    private GoodsOutService goodsOutService;

    @Autowired
    private GoodsInService goodsInService;

    /**
     * 商品出库
     * @param goodsOut
     * @return
     */
    @RequestMapping(method = RequestMethod.POST)
    public Result<String> saveGoodsOut(GoodsOut goodsOut){
        log.info("接收的数据"+goodsOut);
        LambdaQueryWrapper<GoodsIn> law=new LambdaQueryWrapper<>();
        law.eq(Strings.isNotEmpty(goodsOut.getName()),GoodsIn::getName,goodsOut.getName())
                .eq(Strings.isNotEmpty(goodsOut.getVendor()),GoodsIn::getVendor,goodsOut.getVendor())
                .eq(Strings.isNotEmpty(goodsOut.getModel()),GoodsIn::getModel,goodsOut.getModel())
                .eq(Strings.isNotEmpty(goodsOut.getSpecification()),GoodsIn::getSpecification,goodsOut.getSpecification())
                .eq(Strings.isNotEmpty(goodsOut.getId().toString()),GoodsIn::getId,goodsOut.getId());
        GoodsIn goodsIn = goodsInService.getOne(law);
        System.out.println("查询到的数据"+goodsIn);
        if(goodsIn==null){
            return Result.error("服务器故障,请刷新!");
        }
        if(goodsOut.getOutNumber()>goodsIn.getNumber()){
            return Result.error("当前货存量只有"+goodsIn.getNumber());
        }
        int number=goodsIn.getNumber()-goodsOut.getOutNumber();
        if(number==0){
            goodsInService.removeById(goodsIn.getId());
            goodsOut.setOutTime(LocalDateTime.now());
            goodsOut.setId(null);
            goodsOutService.save(goodsOut);
            return Result.success("出库成功");
        }else{
            goodsOut.setOutTime(LocalDateTime.now());
            goodsOut.setId(null);
            goodsOutService.save(goodsOut);
            goodsIn.setNumber(number);
            goodsInService.updateById(goodsIn);
            return Result.success("出库成功~~~");
        }
    }

    /**
     * 获取全部数据
     * @param currentPage
     * @param pageSize
     * @param goodsOut
     * @return
     */
    @RequestMapping()
    public Result<IPage> getAll(Integer currentPage, Integer pageSize, GoodsOut goodsOut) {
        IPage page = goodsOutService.getPage(currentPage, pageSize, goodsOut);
        if(currentPage>page.getPages()){
            IPage newPage = goodsOutService.getPage((int) page.getPages(), pageSize, goodsOut);
            return Result.success(newPage,"查询成功!");
        }
        if ((page.getPages() == 0 && (goodsOut.getName() != null || goodsOut.getModel() != null))
                && (page.getPages() == 0 && goodsOut.getName() != null && goodsOut.getModel() != null)) {
            Result.success(page, "查无此数据!!");
        } else if (page.getPages() == 0 && goodsOut.getName() == null && goodsOut.getModel() == null) {
            return Result.error("服务器故障,请联系管理员~~");
        }
        return Result.success(page,"查询成功");
    }
    @RequestMapping("deleteGoods")
    public Result<String> deleteByIdGoods(Integer id){
        LambdaQueryWrapper<GoodsOut> lqw=new LambdaQueryWrapper<>();
        lqw.eq(Strings.isNotEmpty(id.toString()),GoodsOut::getId,id);
        GoodsOut good = goodsOutService.getOne(lqw);
        if(good==null){
            return Result.error("数据库中无该数据,请重新刷新看看~~");
        }
        return goodsOutService.removeById(id)?Result.success("删除成功!"):Result.error("服务器故障,删除失败,请联系管理员!");

    }
}

5.6 工具类

LocalDateTime格式对象映射器

package com.aliyev.utils;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;

import java.math.BigInteger;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;

/**
 * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
 * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
 * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
 */
public class JacksonObjectMapper extends ObjectMapper {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    public JacksonObjectMapper() {
        super();
        //收到未知属性时不报异常
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

        //反序列化时,属性不存在的兼容处理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);


        SimpleModule simpleModule = new SimpleModule()
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))

                .addSerializer(BigInteger.class, ToStringSerializer.instance)
                .addSerializer(Long.class, ToStringSerializer.instance)
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

        //注册功能模块 例如,可以添加自定义序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}

前端数据格式控制类

package com.aliyev.utils;

import lombok.Data;

import java.util.HashMap;
import java.util.Map;

@Data
public class Result<T> {
    private Integer code;//0失败,1成功
    private String msg;
    private T Data;
    private Map map=new HashMap();//动态数据

    //成功数据封装
    public static <T> Result<T> success(T obj){
        Result<T> r = new Result<>();
        r.code=1;
        r.Data=obj;
        return r;
    }
    public static <T> Result<T> success(T obj,String msg){
        Result<T> r = new Result<>();
        r.code=1;
        r.Data=obj;
        r.msg=msg;
        return r;
    }

    //失败数据封装
    public static <T> Result<T> error(String msg){
        Result<T> r = new Result<>();
        r.code=0;
        r.msg=msg;
        return r;
    }

    //
    public Result<T> add(String key, String value){
        this.map.put(key,value);
        return this;
    }

}

登录全局拦截器

package com.aliyev.filter;


import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {
    private static final AntPathMatcher PATH_MATCHER=new AntPathMatcher();//通配符比较器
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String requestURI = request.getRequestURI();
        String[] urls=new String[]{
                "/employee/login",
                "/employee/logout",
                "/layuimini/css/**",
                "/layuimini/images/**",
                "/layuimini/js/**",
                "/layuimini/lib/**",
                "/layuimini/pages/user/login.html",
        };
        for (String url : urls) {
            if(PATH_MATCHER.match(url,requestURI)){
                filterChain.doFilter(request,response);
                log.info("释放的资源{}",requestURI);
                return;
            }
        }
        //检查是否登录
        if(request.getSession().getAttribute("employee")!=null){
            filterChain.doFilter(request,response);
            return;
        }

        response.sendRedirect("/layuimini/pages/user/login.html");
        return;
    }


}

5.7 页面代码

由于页面代码涉及太多,需要者留下邮箱,博主看到私发~~~

创作不易,需要者自取,留下一个小赞在走吧~~~~

猜你喜欢

转载自blog.csdn.net/qq_61544409/article/details/128487088