基于Springboot+Vue实现前后端分离进销存管理系统

简介: 基于Springboot+Vue实现前后端分离进销存管理系统

项目编号:BS-XX-144

引言:


目前整个社会已经进入到一个商品异常丰富的商品时代,商业化的高度发展也加速了商品流通的速度,很多的生产企业和商贸公司也遍地开花似的蓬勃发展起来了。而如何去有效的管理这些琳琅满目的商品的采购、销售、库存信息,是面临的一大难题,传统的靠人工去管理的方式即效率低下,又容易出错,造成损耗,还无法及时统计信息。在当今信息化技术普遍应用的今天,如何利用信息化和数字化去管理商品的进销存信息,是一个值得研究的问题。


本次经过调研走访开发设计的这套进销存管理系统,它的设计与开发主要基于Java开发语言平台,采用Spring 全家桶技术中的轻量级Springboot框架技术,并结合JPA第三方持久层框架开发实现,前端页面使用ElementsUI进行页面的开发布局,并同时使用了Vue等前端技术进行页面美化和图形报表开发。进销存系统的业务数据存储则使用MySQL8数据库。系统使用Tomcat8.5.31来部署运行。


这套进销存管理系统的开发主要是采用产品设计开发的思路去做,尽量做的功能具有普遍适用性,经过走访调查,得出大多数商家的基本功能需求进而进行抽取整合,开发实现了这套进销存管理系统,它具有一定的社会推广性,对整个社会的商业化进行有着广泛而积极的意义。

一,项目简介


基于SpringBoot+Vue实现的一个比较全面的进销存管理系统。系统整体功能比较强大,操作人机交互性比较好,无论是从开发模式还是易用性和技术,都是比较优秀的一个项目,适合有些难度或要求较高的毕业设计项目使用。系统有着完备的权限管理控制,可以自行定义角色和用户并自由分配权限,不同的角色用户进入系统拥有的操作权限也不相同。主要完成的功能 有:


用户注册登陆

  1. 首页仪表盘信息统计功能
  2. 图形报表统计展示功能
  3. 系统管理模块
  1. 部门管理
  2. 用户管理
  3. 菜单管理
  4. 角色管理
  5. 商品分类管理
  6. 供应商管理
  7. 客户管理
  1. 采购管理模块
  1. 采购订单管理模块
  2. 采购入库管理模块
  1. 销售管理模块
  1. 销售订单管理模块
  2. 销售出库管理模块
  1. 库存管理模块
  2. 消息中心模块

二,环境介绍


语言环境:Java:  jdk1.8

数据库:Mysql: mysql8   Redis:redis5.0

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

后台开发技术:Springboot+Mybatis-plus

前端开发技术:Nodejs+Vue+ElemenetUI

第三方技术:七牛云

三,系统展示


用户登陆

image.png

首页统计

image.png

image.png

消息管理

image.png

个人消息

image.png

采购订单

image.png

采购入库

image.png

销售订单

image.png

销售出库

image.png

库存管理

image.png

部门管理

image.png

菜单管理

image.png

角色管理

image.png

用户管理

image.png

商品分类管理

image.png

客户管理

image.png

供应商管理

image.png

四,核心代码展示


package cn.toesbieya.jxc.controller;
import cn.toesbieya.jxc.model.vo.LoginParam;
import cn.toesbieya.jxc.model.vo.PasswordUpdateParam;
import cn.toesbieya.jxc.model.vo.RegisterParam;
import cn.toesbieya.jxc.model.vo.UserVo;
import cn.toesbieya.jxc.service.AccountService;
import cn.toesbieya.jxc.util.SessionUtil;
import cn.toesbieya.jxc.util.IpUtil;
import cn.toesbieya.jxc.model.vo.R;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
@RestController
@RequestMapping("account")
public class AccountController {
    @Resource
    private AccountService service;
    @PostMapping("login")
    public R login(HttpServletRequest request, @Valid @RequestBody LoginParam param) {
        return service.login(param, IpUtil.getIp(request));
    }
    @GetMapping("logout")
    public R logout(HttpServletRequest request) {
        UserVo user = SessionUtil.get(request);
        return service.logout(user, IpUtil.getIp(request));
    }
    @PostMapping("register")
    public R register(@Valid @RequestBody RegisterParam param) {
        return service.register(param);
    }
    @PostMapping("updatePwd")
    public R updatePwd(@RequestBody PasswordUpdateParam param) {
        UserVo user = SessionUtil.get();
        param.setId(user.getId());
        String errMsg = validateUpdatePwdParam(param);
        if (errMsg != null) return R.fail(errMsg);
        return service.updatePwd(param);
    }
    @GetMapping("updateAvatar")
    public R updateAvatar(@RequestParam String key) throws UnsupportedEncodingException {
        if (StringUtils.isEmpty(key)) return R.fail("参数错误");
        return service.updateAvatar(SessionUtil.get(), URLDecoder.decode(key, "utf-8"));
    }
    @GetMapping("validate")
    public R validate(@RequestParam String pwd) {
        UserVo current = SessionUtil.get();
        if (!pwd.equals(current.getPwd())) {
            return R.fail("校验失败");
        }
        return R.success("校验通过");
    }
    @GetMapping("checkLoginName")
    public R checkLoginName(@RequestParam(required = false) Integer id, @RequestParam String name) {
        if (StringUtils.isEmpty(name)) {
            return R.success();
        }
        return R.success(service.isLoginNameExist(name, id) ? "该登录名已存在" : null);
    }
    @GetMapping("checkNickName")
    public R checkNickName(@RequestParam(required = false) Integer id, @RequestParam String name) {
        if (StringUtils.isEmpty(name)) {
            return R.success();
        }
        return R.success(service.isNickNameExist(name, id) ? "该昵称已存在" : null);
    }
    private String validateUpdatePwdParam(PasswordUpdateParam vo) {
        if (vo.getId() == null) return "修改失败,参数错误";
        if (StringUtils.isEmpty(vo.getOldPwd())) return "修改失败,原密码不能为空";
        if (StringUtils.isEmpty(vo.getNewPwd())) return "修改失败,新密码不能为空";
        if (vo.getOldPwd().equals(vo.getNewPwd())) return "修改失败,新密码不得与旧密码相同";
        if (vo.getNewPwd().length() != 32) return "修改失败,密码参数有误";
        return null;
    }
}
package cn.toesbieya.jxc.controller;
import cn.toesbieya.jxc.model.vo.search.StockSearch;
import cn.toesbieya.jxc.service.BizStockService;
import cn.toesbieya.jxc.model.vo.R;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
@RestController
@RequestMapping("stock/current")
public class BizStockController {
    @Resource
    private BizStockService service;
    @PostMapping("search")
    public R search(@RequestBody StockSearch vo) {
        return R.success(service.search(vo));
    }
    @GetMapping("getDetail")
    public R getDetail(@RequestParam String cids) {
        if (StringUtils.isEmpty(cids)) return R.fail("参数错误");
        return R.success(service.getDetail(cids));
    }
    @GetMapping("getDetailById")
    public R getDetailById(@RequestParam String ids) {
        if (StringUtils.isEmpty(ids)) return R.fail("参数错误");
        return R.success(service.getDetailById(ids));
    }
    @PostMapping("export")
    public void export(@RequestBody StockSearch vo, HttpServletResponse response) throws Exception {
        service.export(vo, response);
    }
}
package cn.toesbieya.jxc.controller.sys;
import cn.toesbieya.jxc.model.entity.SysCategory;
import cn.toesbieya.jxc.model.vo.search.CategorySearch;
import cn.toesbieya.jxc.service.sys.SysCategoryService;
import cn.toesbieya.jxc.model.vo.R;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@RequestMapping("system/category")
public class CategoryController {
    @Resource
    private SysCategoryService service;
    @GetMapping("getAll")
    public R getAll() {
        return R.success(service.getAll());
    }
    @PostMapping("search")
    public R search(@RequestBody CategorySearch vo) {
        return R.success(service.search(vo));
    }
    @PostMapping("add")
    public R add(@RequestBody SysCategory category) {
        String errMsg = validateCategoryCreateParam(category);
        if (errMsg != null) return R.fail(errMsg);
        category.setId(null);
        category.setCtime(System.currentTimeMillis());
        return service.add(category);
    }
    @PostMapping("update")
    public R update(@RequestBody SysCategory category) {
        String errMsg = validateCategoryUpdateParam(category);
        if (errMsg != null) return R.fail(errMsg);
        return service.update(category);
    }
    @PostMapping("del")
    public R del(@RequestBody SysCategory category) {
        if (category.getId() == null) return R.fail("删除失败,参数错误");
        return service.del(category);
    }
    private String validateCategoryCreateParam(SysCategory category) {
        if (category.getPid() == null) return "创建失败,参数错误";
        if (StringUtils.isEmpty(category.getName())) return "创建失败,分类名称不能为空";
        return null;
    }
    private String validateCategoryUpdateParam(SysCategory category) {
        if (category.getId() == null) return "修改失败,参数错误";
        if (category.getPid() == null) return "创建失败,参数错误";
        if (StringUtils.isEmpty(category.getName())) return "创建失败,分类名称不能为空";
        return null;
    }
}
package cn.toesbieya.jxc.controller.sys;
import cn.toesbieya.jxc.model.entity.SysCustomer;
import cn.toesbieya.jxc.model.vo.search.CustomerSearch;
import cn.toesbieya.jxc.service.sys.SysCustomerService;
import cn.toesbieya.jxc.model.vo.R;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@RequestMapping("system/customer")
public class CustomerController {
    @Resource
    private SysCustomerService service;
    @GetMapping("getLimitRegion")
    public R getLimitRegion() {
        return R.success(service.getLimitRegion());
    }
    @PostMapping("search")
    public R search(@RequestBody CustomerSearch vo) {
        return R.success(service.search(vo));
    }
    @PostMapping("add")
    public R add(@RequestBody SysCustomer customer) {
        String errMsg = validateCreateParam(customer);
        if (errMsg != null) return R.fail("创建失败," + errMsg);
        customer.setId(null);
        customer.setCtime(System.currentTimeMillis());
        return service.add(customer);
    }
    @PostMapping("update")
    public R update(@RequestBody SysCustomer customer) {
        String errMsg = validateUpdateParam(customer);
        if (errMsg != null) return R.fail("修改失败," + errMsg);
        return service.update(customer);
    }
    @PostMapping("del")
    public R del(@RequestBody SysCustomer customer) {
        if (customer.getId() == null) return R.fail("删除失败,参数错误");
        return service.del(customer);
    }
    private String validateCreateParam(SysCustomer customer) {
        if (StringUtils.isEmpty(customer.getName())) return "客户名称不能为空";
        if (StringUtils.isEmpty(customer.getRegion())) return "客户行政区域不能为空";
        if (StringUtils.isEmpty(customer.getAddress())) return "客户地址不能为空";
        if (StringUtils.isEmpty(customer.getLinkman())) return "客户联系人不能为空";
        if (StringUtils.isEmpty(customer.getLinkphone())) return "客户联系电话不能为空";
        return null;
    }
    private String validateUpdateParam(SysCustomer customer) {
        if (customer.getId() == null) return "参数错误";
        return validateCreateParam(customer);
    }
}
package cn.toesbieya.jxc.controller.sys;
import cn.toesbieya.jxc.model.entity.RecUserAction;
import cn.toesbieya.jxc.model.entity.SysUser;
import cn.toesbieya.jxc.model.vo.search.UserSearch;
import cn.toesbieya.jxc.util.ThreadUtil;
import cn.toesbieya.jxc.service.sys.SysUserService;
import cn.toesbieya.jxc.model.vo.R;
import org.springframework.util.StringUtils;
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.RestController;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
@RestController("sysUserController")
@RequestMapping("system/user")
public class UserController {
    @Resource
    private SysUserService service;
    @PostMapping("search")
    public R search(@RequestBody UserSearch vo) {
        return R.success(service.search(vo));
    }
    @PostMapping("add")
    public R add(@RequestBody SysUser user) {
        String errMsg = validateUserCreateParam(user);
        if (errMsg != null) {
            return R.fail(errMsg);
        }
        return service.add(user);
    }
    @PostMapping("update")
    public R update(@RequestBody SysUser user) {
        String errMsg = validateUserUpdateParam(user);
        if (errMsg != null) {
            return R.fail(errMsg);
        }
        return service.update(user);
    }
    @PostMapping("del")
    public R del(@RequestBody SysUser user) {
        if (user.getId() == null) {
            return R.fail("删除失败");
        }
        return service.del(user);
    }
    @PostMapping("kick")
    public R kick(@RequestBody List<SysUser> users) {
        if (users == null || users.isEmpty()) {
            return R.fail("参数错误");
        }
        RecUserAction action = ThreadUtil.getAction();
        List<String> names = users.stream().map(SysUser::getLoginName).collect(Collectors.toList());
        action.setAction("踢出用户:【" + String.join(",", names) + "】");
        return service.kick(users);
    }
    @PostMapping("resetPwd")
    public R resetPwd(@RequestBody SysUser user) {
        if (user.getId() == null || StringUtils.isEmpty(user.getLoginName())) {
            return R.fail("参数错误");
        }
        return service.resetPwd(user);
    }
    private String validateUserCreateParam(SysUser user) {
        if (user.getId() != null) return "创建失败,参数错误";
        if (StringUtils.isEmpty(user.getLoginName())
                ||StringUtils.isEmpty(user.getNickName())) {
            return "创建失败,用户名称不能为空";
        }
        if (user.getRole() == null) return "创建失败,用户角色不能为空";
        return null;
    }
    private String validateUserUpdateParam(SysUser user) {
        if (user.getId() == null) return "修改失败,参数错误";
        if (StringUtils.isEmpty(user.getLoginName())
                ||StringUtils.isEmpty(user.getNickName())) {
            return "创建失败,用户名称不能为空";
        }
        if (user.getRole() == null) return "修改失败,用户角色不能为空";
        return null;
    }
}

五,项目总结


数字化和信息化是近年来各行业的发展趋势。各种规模的公司正在迅速崛起。许多从事生产经营管理的企业都有自己的产品生产和销售,其中有代表性的就是各大超市与食品工厂。这些超市和工厂的食品需要存放在仓库中。对于每个超市和工厂来说,随着规模的不断扩大和产品数量的急剧增加,产品的种类将不断更新和发展,关于产品的信息量也将成倍增长。面对海量的产品信息,如何有效地管理库存产品对这些超市和工厂来说非常重要。仓库管理的重点是销售信息能否及时反馈,从而保证超市和工厂的运营效率。在当今的数字时代,为了加快仓库管理员的管理,我们必须依靠计算机,使货物数据的管理更加简单和到位。基于以上原因,迫切需要开发一套进销存管理系统。本文是基于计算机对仓库中的大量数据进行处理和处理的研究。


进销存管理涉及产品进出仓库、销售人员和客户等各个方面。如何管理这些信息数据是一项复杂的系统工程,它充分考验着仓库管理员的工作能力。可以想象,工作量很重。因此,需要设计出一套进销存管理系统来提高库存管理的效率,这对于规范管理、数据统计、快速查询信息、减少管理工作量、调动员工积极性、提高生产效率具有重要的现实意义。


在我国,从二十世纪七十年代计算机得以应用后,国内企业才逐渐配合该技术产生相应进销存管理应用,然而受当时软硬件水平局限该类系统也仅支持完成那些较简单性的管理操作。直到八十年代,沈阳一家鼓风机厂率先引进COPICS系统(由IBM公司开发)才打破此种僵局,拉开在我国畜牧业应用MRPII系统的序幕[10]。


到上世纪末,受计算机技术发展及863计划双重影响,我国大量企业开始引进使用外国先进系统来完善自身企业管理。


   本世纪以来,在我国实施信息化带动工业化政策响应下,更多外国先进知名企业开始青睐我国市场,在我国加设办事处。不仅增大了我国市场还激发了国有化产品的研发.进度,也给我国进销存管理应用软件行业带来了新的契机促进其高速发展。一时之间我国的联想、华为等许多知名企业基于其所引进的外国先进软件结合自身实际情况与市.场需要,开发出了许多更加适合我国实际问题的应用商品,并在推出后取得极好的市场反映。

相关文章
|
21天前
|
前端开发 安全 Java
基于springboot+vue开发的会议预约管理系统
一个完整的会议预约管理系统,包含前端用户界面、管理后台和后端API服务。 ### 后端 - **框架**: Spring Boot 2.7.18 - **数据库**: MySQL 5.6+ - **ORM**: MyBatis Plus 3.5.3.1 - **安全**: Spring Security + JWT - **Java版本**: Java 11 ### 前端 - **框架**: Vue 3.3.4 - **UI组件**: Element Plus 2.3.8 - **构建工具**: Vite 4.4.5 - **状态管理**: Pinia 2.1.6 - **HTTP客户端
129 4
基于springboot+vue开发的会议预约管理系统
|
5月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
470 1
|
2月前
|
前端开发 JavaScript Java
基于springboot+vue开发的校园食堂评价系统【源码+sql+可运行】【50809】
本系统基于SpringBoot与Vue3开发,实现校园食堂评价功能。前台支持用户注册登录、食堂浏览、菜品查看及评价发布;后台提供食堂、菜品与评价管理模块,支持权限控制与数据维护。技术栈涵盖SpringBoot、MyBatisPlus、Vue3、ElementUI等,适配响应式布局,提供完整源码与数据库脚本,可直接运行部署。
101 0
基于springboot+vue开发的校园食堂评价系统【源码+sql+可运行】【50809】
|
JSON 前端开发 Java
SpringBoot+Vue表单文件上传
版权声明:本文首发 http://asing1elife.com ,转载请注明出处。 https://blog.csdn.net/asing1elife/article/details/82811812 ...
4196 0
|
6月前
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
431 7
|
5月前
|
供应链 JavaScript BI
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
这是一款专为小微企业打造的 SaaS ERP 管理系统,基于 SpringBoot+Vue+ElementUI+UniAPP 技术栈开发,帮助企业轻松上云。系统覆盖进销存、采购、销售、生产、财务、品质、OA 办公及 CRM 等核心功能,业务流程清晰且操作简便。支持二次开发与商用,提供自定义界面、审批流配置及灵活报表设计,助力企业高效管理与数字化转型。
483 2
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
|
9月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的留守儿童爱心网站设计与实现(计算机毕设项目实战+源码+文档)
博主是一位全网粉丝超过100万的CSDN特邀作者、博客专家,专注于Java、Python、PHP等技术领域。提供SpringBoot、Vue、HTML、Uniapp、PHP、Python、NodeJS、爬虫、数据可视化等技术服务,涵盖免费选题、功能设计、开题报告、论文辅导、答辩PPT等。系统采用SpringBoot后端框架和Vue前端框架,确保高效开发与良好用户体验。所有代码由博主亲自开发,并提供全程录音录屏讲解服务,保障学习效果。欢迎点赞、收藏、关注、评论,获取更多精品案例源码。
|
9月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的家政服务管理平台设计与实现(计算机毕设项目实战+源码+文档)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
9月前
|
JavaScript 搜索推荐 Java
基于SpringBoot+Vue实现的家乡特色推荐系统设计与实现(源码+文档+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
11月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
340 62