免费分享一套SpringBoot+Vue仓库(进销存)管理系统【论文+源码+SQL脚本】,帅呆了~~

news2024/11/26 16:37:27

大家好,我是java1234_小锋老师,看到一个不错的SpringBoot+Vue仓库(进销存)管理系统,分享下哈。

项目视频演示

【免费】SpringBoot+Vue仓库(进销存)管理系统 Java毕业设计_哔哩哔哩_bilibili

项目介绍

该系统的设计初衷是解决传统仓库管理中存在的一些痛点和问题。传统的手工管理往往容易出现库存错误、信息查找困难、操作不便等情况。本系统的目标是通过引入计算机技术和自动化管理,优化仓库管理流程,提升管理的准确性和效率。

系统分为超级管理员、仓库管理员和普通用户三种角色,为不同角色的用户提供不同的功能和权限。超级管理员具备全面管理权限,能够管理管理员和用户信息、仓库和物品分类等。仓库管理员拥有对仓库和物品的管理权限,可以进行入库和出库操作。普通用户则可以查询和管理个人信息、查看物品信息和操作日志。

在系统设计方面,采用了前后端分离的架构,确保系统具备良好的可维护性和扩展性。前端使用Vue框架实现用户界面,后端采用Spring Boot框架处理业务逻辑和数据存储。数据存储方面,使用MySQL数据库进行持久化存储,以确保数据安全性和可靠性。

系统的最终目的是提供一个用户友好的界面和简化的操作流程,帮助用户快速准确地完成仓库管理任务。通过系统的自动化管理和信息化处理,能够减少人为错误和操作失误,提高工作效率和精确度。同时,系统还提供操作日志查询功能,便于管理员进行审计和追踪操作记录,增强仓库管理的透明度和安全性。

总而言之,该仓库管理系统的设计初衷是为了提升仓库管理的效率和精确度,解决传统仓库管理中的问题。通过引入计算机技术和自动化管理,该系统能够帮助企业实现更高效、便捷和安全的仓库管理。

系统展示

部分代码

package com.rabbiter.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.rabbiter.common.QueryPageParam;
import com.rabbiter.common.Result;
import com.rabbiter.entity.Menu;
import com.rabbiter.entity.User;
import com.rabbiter.service.MenuService;
import com.rabbiter.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;


@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    @Autowired
    private MenuService menuService;

    /*
     * 查询全部用户
     * @date 2023/1/2 19:26
     */
    @GetMapping("/list")
    public List<User> list(){
        return userService.list();
    }

    /*
     * 根据账号查找用户
     * @date 2023/1/4 14:53
     */
    @GetMapping("/findByNo")
    public Result findByNo(@RequestParam String no){
        List list = userService.lambdaQuery()
                .eq(User::getNo,no)
                .list();
        return list.size()>0?Result.success(list):Result.fail();
    }

    /*
     * 新增用户
     * @date 2023/1/2 19:11
     */
    @PostMapping("/save")
    public Result save(@RequestBody User user){
        return userService.save(user)?Result.success():Result.fail();
    }

    /*
     * 更新用户
     * @date 2023/1/2 19:11
     */
    @PostMapping("/update")
    public Result update(@RequestBody User user){
        return userService.updateById(user)?Result.success():Result.fail();
    }

    /*
     * 用户登录:登录的时候一并将菜单信息也查询出来
     * @date 2023/1/3 14:08
     */
    @PostMapping("/login")
    public Result login(@RequestBody User user){
        //匹配账号和密码
        List list = userService.lambdaQuery()
                .eq(User::getNo,user.getNo())
                .eq(User::getPassword,user.getPassword())
                .list();

        if(list.size()>0){
            User user1 = (User)list.get(0);
            List<Menu> menuList = menuService.lambdaQuery()
                    .like(Menu::getMenuright,user1.getRoleId())
                    .list();
            HashMap res = new HashMap();
            res.put("user",user1);
            res.put("menu",menuList);
            return Result.success(res);
        }
        return Result.fail();
    }

    /*
     * 修改用户
     * @date 2023/1/4 15:02
     */
    @PostMapping("/mod")
    public boolean mod(@RequestBody User user){
        return userService.updateById(user);
    }
    
    /*
     * 新增或修改:存在用户则修改,否则新增用户
     * @date 2023/1/2 19:12
     */
    @PostMapping("/saveOrUpdate")
    public Result saveOrUpdate(@RequestBody User user){
        return userService.saveOrUpdate(user)?Result.success():Result.fail();
    }

    /*
     * 删除用户
     * @date 2023/1/2 19:15
     */
    @GetMapping("/del")
    public Result delete(Integer id){
        return userService.removeById(id)?Result.success():Result.fail();
    }

    /*
     * 模糊查询
     * @date 2023/1/2 19:36
     */
    @PostMapping("/listP")
    public Result query(@RequestBody User user){
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        if(StringUtils.isNotBlank(user.getName())){
            wrapper.like(User::getName,user.getName());
        }
        return Result.success(userService.list(wrapper));
    }

    /*
     * 分页查询
     * @date 2023/1/2 19:48
     */
//    @PostMapping("/listPage")
//    public Result page(@RequestBody QueryPageParam query){
//        HashMap param = query.getParam();
//        String name = (String)param.get("name");
//
//        Page<User> page = new Page();
//        page.setCurrent(query.getPageNum());
//        page.setSize(query.getPageSize());
//
//        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
//        wrapper.like(User::getName,name);
//
//        IPage result = userService.page(page,wrapper);
//        return Result.success(result.getRecords(),result.getTotal());
//    }

    @PostMapping("/listPage")
    public List<User> listPage(@RequestBody QueryPageParam query){
        HashMap param = query.getParam();
        String name = (String)param.get("name");
        System.out.println("name=>"+(String)param.get("name"));

        Page<User> page = new Page();
        page.setCurrent(query.getPageNum());
        page.setSize(query.getPageSize());

        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper();
        lambdaQueryWrapper.like(User::getName,name);


        IPage result = userService.page(page,lambdaQueryWrapper);

        System.out.println("total=>"+result.getTotal());

        return result.getRecords();
    }

    /*
     * 查询功能:根据前端表单输入的信息或者下拉框选择查询用户,并以分页的形式返回前端
     * @date 2023/1/4 20:28
     */
    @PostMapping("/listPageC1")
    public Result listPageC1(@RequestBody QueryPageParam query){
        HashMap param = query.getParam();
        String name = (String)param.get("name");
        String sex = (String)param.get("sex");
        String roleId = (String)param.get("roleId");

        Page<User> page = new Page();
        page.setCurrent(query.getPageNum());
        page.setSize(query.getPageSize());

        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper();
        if(StringUtils.isNotBlank(name) && !"null".equals(name)){
            lambdaQueryWrapper.like(User::getName,name);
        }
        if(StringUtils.isNotBlank(sex)){
            lambdaQueryWrapper.eq(User::getSex,sex);
        }
        if(StringUtils.isNotBlank(roleId)){
            lambdaQueryWrapper.eq(User::getRoleId,roleId);
        }

        IPage result = userService.pageCC(page,lambdaQueryWrapper);

        System.out.println("total=>"+result.getTotal());

        return Result.success(result.getRecords(),result.getTotal());
    }

}

<template>
    <div
        style="
            text-align: center;
            height: 100%;
            padding: 20px 0 0 0;
            margin: 0px;
        "
    >
        <div class="welcome">
            <b>
                <span> 欢迎使用仓库管理系统,</span>
                <span style="color: black">
                    {{ user.name }}
                </span>
            </b>


        </div>
    
        <br />
        <br />
        <h5 style="font-size: 26px">
            <span style="color: grey; font-size: 22px">您当前的角色是:</span>
            {{
                user.roleId == 0
                    ? "超级管理员"
                    : user.roleId == 1
                    ? "管理员"
                    : "用户"
            }}
        </h5>
        <DateUtils></DateUtils>

        <div style="text-align: center; height: 18vw">
            <img
                :src="require('@/assets/background.jpg')"
                style="height: 100%"
            />
        </div>
    </div>
</template>

<script>
import DateUtils from "./DateUtils";
export default {
    name: "Home",
    components: { DateUtils },
    data() {
        return {
            user: {},
        };
    },
    computed: {},
    methods: {
        init() {
            this.user = JSON.parse(sessionStorage.getItem("CurUser"));
        },
    },
    created() {
        this.init();
    },
};
</script>

<style scoped>
.welcome {
    font-size: 30px;
    color: grey;
}
</style>

源码下载

下载地址:
链接:https://pan.baidu.com/s/11-7DeDGjkZulRTTEBmHgwg 
提取码:1234 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2035415.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高可用集群KEEPALIVED

文章目录 高可用集群KEEPALIVEDVRRPkeepalived 部署环境准备 开启通信功能设置独立日志设置独立子配置文件抢占模式和非抢占模式延迟抢占非抢占模式 单播模式邮箱邮件通知脚本 双主架构实现ipvs的高可用性lvs-dr VRRP Script实现HAProxy高可用 文章相关连接如下&#xff1a; 如…

力扣 | 动态规划 | 在字符串的应用 | 最长回文子串、最长回文子序列、单词拆分、编辑距离

文章目录 1.最长回文子串2.最长回文子序列3.单词拆分4.编辑距离5. 共同点和思路6. 各个问题的思路和扩展1. 最长回文子串2. 最长回文子序列3. 单词拆分4. 编辑距离 在解答字符串动态规划的应用时&#xff0c;我们需要非常注意一个问题&#xff1a;   有时候我们定义 d p [ i …

MoonBit 周报 Vol.53:新增高级循环语法、引入字符串插值、MoonBit AI 支持代码解释!

weekly 2024-08-05 MoonBit更新 添加了基于 Iter 和 Iter2 类型的 for .. in 循环支持&#xff1a; fn main {for x in [ 1, 2, 3 ] {println(x)}for k, v in { "x": 1, "y": 2 } {println("\{k} > \{v}")} }for 与 in 之间可以使用 1&…

事务及事务的控制.特性

一.事务 1.事务定义 ​ 逻辑上多个DML操作形成的一个整体,多个DML操作要么全都执行成功,要么全都执行失败,如果是DDL的操作会自动提交事务. 2.事务的控制 命令 start transaction开启事务rollback 回滚commit提交事务 mysql默认自动提交事务,每个DML执行完毕后,直接提交事…

【Linux】编译器gcc/g++ 、程序翻译过程、动静态库

目录 1.gcc/g Linux编译器1.1. gcc与g的安装1.2. gcc与g用法1.2.1.gcc用法1.2.2. g用法 1.3. 程序翻译的过程1.3.1. 前提知识&#xff1a;1.3.2. 预处理&#xff08;语言种类不变&#xff09;条件编译用途&#xff1a; 1.3.3. 编译&#xff08;生成汇编语言&#xff09;1.3.4. …

性能测试工具之JMeter

JMeter Apache JMeter应用程序是开源软件,是一个100%纯Java应用程序,旨在负载测试功能行为和衡量性能。它最初是为测试Web应用程序而设计的,但后来扩展到其他测试功能。 JMeter是一个免费、开源、跨平台的性能测试工具,于20世纪90年代后期面世。这是一个成熟、健全且具有…

‘Task‘ object is not callable ERROR

pycharm 调试异步的代码报错 TypeError: ‘Task‘ object is not callable ERROR: Exception in callback &#xff1c;Task 解决方法&#xff1a;点击菜单栏帮助-查找操作-注册表&#xff0c;在注册表中搜索python.debug.asyncio.repl禁用即可

卷大模型,还是卷应用?一次看明白

自从ChatGPT横空出世以来&#xff0c;中美之间围绕大模型的科技竞争愈演愈烈&#xff0c;也渐渐分化出两条差异化发展路线&#xff1a;一派侧重将AI能力投入应用场景&#xff0c;另一派则侧重让基础模型能力更强。于是&#xff0c;“卷应用”还是“卷大模型”成为中国许多新入场…

phpmailer如何配置SSL以发送安全电子邮件?

phpmailer支持哪些邮件附件类型&#xff1f;如何使用phpmailer&#xff1f; PHPMailer作为一个广泛使用的PHP邮件发送类库&#xff0c;支持通过SSL发送加密邮件&#xff0c;以确保信息在传输过程中的安全性。AokSend将探讨如何配置PHPMailer以使用SSL发送安全的电子邮件。 Ph…

M12防水分线盒双通道PNP型8路预铸线缆半导体制造设备

M12防水分线盒双通道PNP型8路预铸线缆&#xff0c;作为工业自动化设备中关键的组件之一&#xff0c;在提升系统稳定性与可靠性方面发挥着至关重要的作用。以钡铼技术DB系列为例&#xff0c;这款8路M12双通道预铸线缆分线盒在设计和材料选择上均体现了工业级的高标准&#xff0c…

解决方案:如何在虚拟机中扩展 Windows 11 C 盘,绕过恢复分区的限制!

第2章 背景 不管是虚拟化还是物理机&#xff0c;我们安装Windows 11 时候经常遇到无法直接扩容盘&#xff0c;我们简单介绍下Windows中C盘组成。 ### 恢复分区的目的 恢复分区是 Windows 操作系统安装过程中创建的一个特殊分区&#xff0c;主要用于以下目的&#xff1a; 1. …

如何修复 VLC 无法播放 MKV 问题

VLC 是一个媒体播放器&#xff0c;您可以用它来播放各种格式的音频或视频文件。但有时&#xff0c;您无法在 VLC 媒体播放器上运行 MKV 文件。问题可能是黑屏、没有声音、视频断断续续或错误消息&#xff08;例如“无法识别的编解码器&#xff1a;VLC 无法识别音频或视频编解码…

自助创建 1Panel 应用

自助创建 1Panel 应用 前言 1Panel 作为一款开源的 Linux 服务器运维管理面板&#xff0c;其优质的 应用商店 想必也是很多人喜爱它的原因&#xff0c;除了官方的 应用列表 &#xff0c;开源社区内也涌现出了许多优质的第三方应用商店资源&#xff0c;比如 okxlin/appstore 等…

【MySQL】什么是索引?了解索引的底层原理

索引的概念 索引是一种用于提高数据库查询效率的数据结构。它类似于书籍的目录&#xff0c;通过快速定位数据的方式&#xff0c;减少了数据检索的时间。索引在数据库表中可以被看作是一个指向数据的指针&#xff0c;它们存储了列的值及其对应行的位置&#xff0c;从而使得数据…

《老俞闲话|唯爱和热情不可辜负》读后感

《老俞闲话&#xff5c;唯爱和热情不可辜负》读后感 俞敏洪先生的这篇讲话充满了深情与智慧&#xff0c;他以自己丰富的人生经历和教育实践&#xff0c;向我们展现了一位教育家对于教育事业的热爱和对教师角色的深刻理解。 情感真挚&#xff0c;触动人心 俞敏洪先生的讲话中流…

嵌入式day25

进程线程 多任务编程 1、进程 2、线程 进程&#xff08;process&#xff09; 进行中的程序 --- 正在运行中的程序 进程 --- 程序的一次执行的过程 进程 是程序的一个实例 进程是跑起来的程序 一个程序可以对应多个进程 程序 静态 硬盘 进程 动态 内存 为什么需要进程…

ECharts 数据可视化 入门基本知识 下载安装常用的图表 【1】

ECharts一个基于 JavaScript 的开源可视化图表库&#xff0c;即将数据以图形或图像的方式展现成在屏幕上显示出来&#xff0c;这种方式称为数据可视化。数据可视化有助于我们分析数据&#xff0c;帮助我们更深入更直观的理解数据。今天回顾顺便总结一下echarts的基本知识&#…

基于SpringBoot和Vue框架的体育馆场地预约系统的设计与实现---附源码15155

摘要 本研究设计和开发了一款体育馆场地预约系统。该系统旨在提供一个方便、高效的方式&#xff0c;让用户能够轻松预约体育馆场地&#xff0c;并实现对预约信息的管理与统计。系统主要分为普通用户和管理员两个角色。普通用户可以浏览通知公告、体育资讯&#xff0c;查看各个体…

并发编程(第二天)

interrupt 方法详解 打断 sleep&#xff0c;wait&#xff0c;join 的线程 这几个方法都会让线程进入阻塞状态 打断 sleep 的线程, 会清空打断状态打断正常运行的线程 打断正常运行的线程, 不会清空打断状态打断 park 线程 打断 park 线程, 不会清空打断状态 如果打断标记已经…

Apache Tomcat服务器版本号隐藏

渗透测试时发现有一台服务器的404报错页面中&#xff0c;有Apache Tomcat的版本号信息显示&#xff0c;发生了信息泄露&#xff0c;可能导致服务器被攻击。如下所示&#xff1a; 解决步骤如下&#xff1a; 1. 隐藏HTTP响应头中的Server信息 Tomcat默认会在HTTP响应头中包含S…