【开源】SpringBoot框架开发超市账单管理系统 JAVA+Vue+SpringBoot+MySQL

在这里插入图片描述


目录

  • 一、摘要
    • 1.1 项目介绍
    • 1.2 项目录屏
  • 二、功能模块
  • 三、系统设计
    • 3.1 总体设计
    • 3.2 前端设计
    • 3.3 后端设计
    • 在这里插入图片描述
  • 四、系统展示
  • 五、核心代码
    • 5.1 查询供应商
    • 5.2 查询商品
    • 5.3 新增超市账单
    • 5.4 编辑超市账单
    • 5.5 查询超市账单
  • 六、免责说明


一、摘要

1.1 项目介绍

基于JAVA+Vue+SpringBoot+MySQL的超市账单管理系统,包含供应商模块、商品管理模块、超市账单模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,超市账单管理系统基于角色的访问控制,给超市管理员、店长使用,可将权限精确到按钮级别,您可以自定义角色并分配权限,系统适合设计精确的权限约束需求。

1.2 项目录屏


二、功能模块

本管理系统主要是适用于中小型超市账单的管理,既要能让用户能够快速上手,也要保证基本功能的齐全,还要易于系统的维护。所以一个比较成熟的超市账单管理系统应包含以下几个模块:

  1. 登录模块:用户通过账号密码可以登入不用权限的账号。
  2. 用户管理模块:查看用户信息、修改用户信息、批量或单个删除用户、增加用户信息、禁用和启动用户账号功能可以在该模块实现。
  3. 供应商管理模块:查看供应商信息、修改供应商信息、批量或单独删除供应商、增加供应商的功能在该模块实现。
  4. 账单管理模块:查看账单信息、修改账单信息、批量或单独删除账单、增加账单的功能在该模块实现。
  5. 部门管理模块:可以建立不同的部门,批量或单独删除某一个部门,修改部门信息以及可以给某个部门设立一个或者多个子部门。
  6. 权限管理模块:不同账号所拥有的权限可以该模块进行分配。
  7. 日志管理模块:系统操作人员登陆系统的时间会被记录在该管理模块下。
  8. 退出登陆模块:退出当前账户到登陆页面。

三、系统设计

本系统主要分为前端和后端两个组成部分,在前端我将采用当下比较流行的技术VUE和Element UI搭建起简洁大方的前端页面,方便用户操作和用户的体验感。

在后端我将采用当下比较流行的技术SpringBoot来完成开发,因为SpringBoot兼容了许多框架,可以帮助我快速搭建起整个系统的框架,其中最核心的框架就是SSM框架,当一个用户在网站页面上发送请求,控制层接收到用户的请求,调用业务层去实现,业务管理层调用不同的执行方法去处理,然后业务层调用DAO层去数据库里进行增删改查的操作,最后将数据结果给用户反馈。

在数据库设计方面,如何设计一个合理安全的数据库,首先要考虑的就是对一个数据库中所有表的属性设置,包括属性的的长度、类型、主外键的设置、索引的设置等等。然后在实际设计开发系统的过程中可以参考一些成熟典型的系统的设计思想,可以帮助我们大大提高程序的可行性、完整性和安全性。

3.1 总体设计

.
在这里插入图片描述

根据本系统的业务功能需求分析,设计出该系统的简易功能设计图(如图3-1),首先在登陆界面输入账号密码,然后就可以进入主界面,根据不同的账号权限,能呈现出不同的系统界面。在登陆界面中包括了员工管理功能,商品管理功能,供应商管理功能,账单管理功能、部门管理功能、系统操作权限管理功能和系统日志输出功能。增删改查四种操作均可在员工管理界面,商品管理界面,供应商管理界面,账单管理、部门管理界面中使用。在权限管理界面,如果是管理员身份登陆可以给用户赋予权限,也可以撤销权限。当要查看一些操作记录和用户登陆系统时间的操作可以在系统监控功能模块中的日志输出查看。

3.2 前端设计

一个简单的前端页面构成三个基本要素:HTML、CSS、JavaScript。有了这三要素就可以完成一个前端页面的开发。Vue框架同样兼容这三个要素,并且如果真要自己写出一个美观的页面是十分麻烦的,但Vue支持使用其他的组件库,例如Element UI,是一款网站快速成型工具,上面有许多美观的页面组件。相比于传统的前端页面开发,是通过操作DOM,形成基本的视图结构,然后再通过CSS的修饰,让页面变得美观,最后在涉及交互部分,就需要用到JavaScript来接收用户请求,并通事件响应来进行交互操作,并且在事件的处理函数中涉及到各种数据的修改。我们知道一个网站包含的页面元素是非常多的,在结构和很庞大的页面中,如果视图和数据都混合在一起,要想操作其中的一个元素的难度就会很大,正所谓牵一发而动全身。而Vue的核心在于它主关注视图层,它将视图单独剥离出来,主要目的就是分离视图层和数据层,而实现分离是通过MVVM模式,MVVM的核心是ViewModel层,它能够随时观察到数据的变化,并对视图对应的内容实时进行更新,当视图发生改变的同时,数据也会随之发生变化,这就是双向绑定。

3.3 后端设计

在后端方面我将选择基于SpringBoot框架来进行开发。之所以选择用框架来开发是学过Javaweb的同学都知道,开发一个web应用,从最初开始接触Servlet结合Tomcat服务器,然后再通过手动连接JDBC来进行数据连接,在IDEA软件上写SQL查询语句。这样就会导致一个问题,会产生大量繁杂冗余的代码,并且代码出错率高,不容易排查,大大加长了开发时间。

所以我将运用框架来开发系统,利用SpringBoot框架进行系统开发,可以快速搭建出系统的框架,只需要我们把依赖和配置文件导入,剩下的就是编写业务逻辑功能。经过2个月我自己对Spring的学习研究,总结出SpringBoot框架
开发便捷的原因是从以下三个策略出发。

  1. SpringBoot可以通过启动器来管理项目所需要的依赖,无需指定依赖的版本。
  2. SpringBoot利用几个核心注解做到了根据添加的依赖进行自动配置,不需要配置xml文件。
  3. SpringBoot内置了许多项目所需要的功能,例如数据监控、用户认证。

在还没有使用SpringBoot框架之前,我也早早听说了这个框架厉害的传闻,并且一直流传着一句话“约定大于配置”,在还没有深入学习之前,我还是对这句话一知半解,但随着深入学习,我开始慢慢理解这句话的含义,简单的理解来说就是在使用SpringBoot框架的项目中,在没有规定配置的地方,都是采用默认的配置,而开发人员仅仅需要做的就是当有特殊需求的时候,通过config模块中根据需求自定义配置就可以了,这样就帮助开发人员大大减少了配置工作,这就是所谓的“约定”。

并且SpringBoot集成了很多框架配置和应用模板,当需要什么框架和模板,直接开箱就能使用。但在SpringBoot项目开发中,本质最主要的还是SSM框架,SSM框架就是Spring、SpringMVC、Mybatis,在使用SpringBoot时,它就会默认配置好这个框架的使用方式。整个系统的执行流程(如图4-1),从客户端发送请求到服务器,控制层接收到用户的请求,调用业务层去实现,业务管理层调用不同的执行方法去处理,业务层调用DAO层去数据库里进行增删改查的操作,然后将数据结果反馈给用户。

在这里插入图片描述

四、系统展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


五、核心代码

5.1 查询供应商

@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "分页获取供应商")
public Result<IPage<Supplier>> getByPage(@ModelAttribute Supplier supplier, @ModelAttribute PageVo page){QueryWrapper<Supplier> qw = new QueryWrapper<>();if(StrUtil.isNotBlank(supplier.getAddress())) {qw.eq("address",supplier.getAddress());}if(StrUtil.isNotBlank(supplier.getMobile())) {qw.eq("mobile",supplier.getMobile());}if(StrUtil.isNotBlank(supplier.getName())) {qw.eq("name",supplier.getName());}if(StrUtil.isNotBlank(supplier.getType())) {qw.eq("type",supplier.getType());}IPage<Supplier> data = iSupplierService.page(PageUtil.initMpPage(page),qw);return new ResultUtil<IPage<Supplier>>().setData(data);
}

5.2 查询商品

@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查询商品")
public Result<IPage<Commodity>> getByPage(@ModelAttribute Commodity commodity, @ModelAttribute PageVo page){QueryWrapper<Commodity> qw = new QueryWrapper<>();if(StrUtil.isNotBlank(commodity.getName())) {qw.eq("name",commodity.getName());}if(StrUtil.isNotBlank(commodity.getType())) {qw.eq("type",commodity.getType());}if(StrUtil.isNotBlank(commodity.getStock())) {qw.eq("stock",commodity.getStock());}if(StrUtil.isNotBlank(commodity.getSupplierId())) {qw.eq("supplier_id",commodity.getSupplierId());}if(StrUtil.isNotBlank(commodity.getUnitPrice())) {qw.eq("unit_price",commodity.getUnitPrice());}IPage<Commodity> data = iCommodityService.page(PageUtil.initMpPage(page),qw);for (Commodity com : data.getRecords()) {Supplier supplier = iSupplierService.getById(com.getSupplierId());if(supplier != null) {com.setSupplierName(supplier.getName());}}return new ResultUtil<IPage<Commodity>>().setData(data);
}

5.3 新增超市账单

@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增账单")
public Result<Bill> insert(Bill bill) {bill.setDateTime(DateUtils.getCompleteNowDate());bill.setUserId(securityUtil.getCurrUser().getId());String price = bill.getPrice();String number = bill.getNumber();Double sum = Double.parseDouble(price) * Double.parseDouble(number);sum = Math.ceil(sum * 10.0) / 10.0;bill.setSum(sum + "");if(iBillService.saveOrUpdate(bill)){return new ResultUtil<Bill>().setData(bill);}return new ResultUtil<Bill>().setErrorMsg("新增账单失败");
}

5.4 编辑超市账单

@RequestMapping(value = "/update", method = RequestMethod.POST)
@ApiOperation(value = "编辑账单")
public Result<Bill> update(Bill bill) {if(iBillService.saveOrUpdate(bill)){return new ResultUtil<Bill>().setData(bill);}return new ResultUtil<Bill>().setErrorMsg("编辑账单失败");
}

5.5 查询超市账单

@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查询账单")
public Result<IPage<Bill>> getByPage(@ModelAttribute Bill bill, @ModelAttribute PageVo page){QueryWrapper<Bill> qw = new QueryWrapper<>();if(!ZwzNullUtils.isNull(bill.getUserId())) {qw.eq("user_id",bill.getUserId());}if(!ZwzNullUtils.isNull(bill.getCommodityId())) {qw.eq("commodity_id",bill.getCommodityId());}if(!ZwzNullUtils.isNull(bill.getSupplierId())) {qw.eq("supplier_id",bill.getSupplierId());}IPage<Bill> data = iBillService.page(PageUtil.initMpPage(page),qw);for (Bill bill1 : data.getRecords()) {Supplier supplier = iSupplierService.getById(bill1.getSupplierId());if(supplier != null) {bill1.setSupplierName(supplier.getName());} else {bill1.setSupplierName("无");}Commodity commodity = iCommodityService.getById(bill1.getCommodityId());if(commodity != null) {bill1.setCommodityName(commodity.getName());} else {bill1.setCommodityName("无");}User user = iUserService.getById(bill1.getUserId());if(user != null) {bill1.setUserName(user.getNickname());} else {bill1.setUserName("无");}}return new ResultUtil<IPage<Bill>>().setData(data);
}

六、免责说明

  • 本项目仅供个人学习使用,商用授权请联系博主,否则后果自负。
  • 博主拥有本软件构建后的应用系统全部内容所有权及独立的知识产权,拥有最终解释权。
  • 如有问题,欢迎在仓库 Issue 留言,看到后会第一时间回复,相关意见会酌情考虑,但没有一定被采纳的承诺或保证。

下载本系统代码或使用本系统的用户,必须同意以下内容,否则请勿下载!

  1. 出于自愿而使用/开发本软件,了解使用本软件的风险,且同意自己承担使用本软件的风险。
  2. 利用本软件构建的网站的任何信息内容以及导致的任何版权纠纷和法律争议及后果和博主无关,博主对此不承担任何责任。
  3. 在任何情况下,对于因使用或无法使用本软件而导致的任何难以合理预估的损失(包括但不仅限于商业利润损失、业务中断与业务信息丢失),博主概不承担任何责任。
  4. 必须了解使用本软件的风险,博主不承诺提供一对一的技术支持、使用担保,也不承担任何因本软件而产生的难以预料的问题的相关责任。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Adobe Camera Raw for Mac v16.1.0中文激活版

Adobe Camera Raw for Mac是一款强大的RAW格式图像编辑工具&#xff0c;它能够处理和编辑来自各种数码相机的原始图像。以下是关于Adobe Camera Raw for Mac的一些主要特点和功能&#xff1a; 软件下载&#xff1a;Adobe Camera Raw for Mac v16.1.0中文激活版 RAW格式支持&…

EMQX Enterprise 5.3 发布:审计日志、Dashboard 访问权限控制与 SSO 一站登录

EMQX Enterprise 5.3.0 版本已正式发布&#xff01; 新版本带来多个企业特性的更新&#xff0c;包括审计日志&#xff0c;Dashboard RBAC 权限控制&#xff0c;以及基于 SSO&#xff08;单点登录&#xff09;的一站式登录&#xff0c;提升了企业级部署的安全性、管理性和治理能…

C遗漏知识(个人向)

之前C语言遗漏的一些。 数据在内存中的存储 原码、反码、补码 整数的2进制表⽰⽅法有三种&#xff0c;即 原码、反码和补码 正整数的原、反、补码都相同。 负整数的三种表⽰⽅法各不相同。 原码&#xff1a;直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。 反码&…

Project 2019下载安装教程,保姆级教程,附安装包和工具

前言 Project是一款项目管理软件&#xff0c;不仅可以快速、准确地创建项目计划&#xff0c;而且可以帮助项目经理实现项目进度、成本的控制、分析和预测&#xff0c;使项目工期大大缩短&#xff0c;资源得到有效利用&#xff0c;提高经济效益。软件设计目的在于协助专案经理发…

云计算 - 弹性计算技术全解与实践

一、引言 在过去的十年里&#xff0c;云计算从一个前沿概念发展为企业和开发者的必备工具。传统的计算模型通常局限于单一的、物理的位置和有限的资源&#xff0c;而云计算则通过分布式的资源和服务&#xff0c;为计算能力带来了前所未有的"弹性"。 弹性&#xff1a;…

浅谈分布式系统

常见基本概念 在正式引入架构演进之前&#xff0c;先了解几个比较重要的概念做前置介绍。 应用(Application)/系统(System) 一个应用&#xff0c;就是一个/一组服务器程序 模块(Module)/组件(Component) 一个应用&#xff0c;里面有很多个功能。每个独立的功能&#xff0c;就可…

Unity AnimationRigging无法修改权重?

个人理解&#xff0c;已解决无法修改权重的问题: unity自带的动画系统是在FixUpdate和Update之后LateUpdate之前执行&#xff0c;如果在这FixedUpdate或Update函数内更新AnimationRigging内的权重后&#xff0c;内部动画系统会覆盖权重的修改&#xff0c;导致无法正确更新&…

外贸邮件群发如何做?外贸邮件群发靠谱吗?

外贸邮件群发有哪些平台&#xff1f;外贸群发邮件用什么邮箱&#xff1f; 外贸邮件群发是许多企业在开展国际贸易时常用的营销手段&#xff0c;它不仅能够快速地将产品信息和促销活动传达给目标客户&#xff0c;还能够有效地建立和维护客户关系。下面&#xff0c;就让蜂邮探讨…

创建TextMeshPro字体文件

相比于Unity的Text组件&#xff0c;TextMesh Pro提供了更强大的文本格式和布局控制&#xff0c;更高级的文本渲染技术&#xff0c;更灵活的文本样式和纹理支持&#xff0c;更好的性能以及更易于使用的优点。但unity自带TextMeshPro字体不支持中文。这里使用普通字体文件生成Tex…

2023年12月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 一个非零的二进制正整数,在其末尾添加两个“0”,则该新数将是原数的?( ) A:10倍 B:2倍 C:4倍 D:8倍 答案:C 二进制进位规则是逢二进一,因此末尾添加一个0,是扩大2倍,添加两个0…

天线阵列车载应用——第1章 介绍 1.1节 汽车工业中的天线阵列:应用和频率范围

1.1 汽车工业中的天线阵列:应用和频率范围 无线通信系统的发展需要新的技术来支持更高质量的通信、新的服务和应用。近年来&#xff0c;汽车无线通信市场得到了极大的扩展。现代汽车使用不同的服务:AM/FM收音机、卫星广播(SDARS)、移动电话通信、数字音频广播(DAB)、远程无钥匙…

【Docker与微服务】基础篇

1 Docker简介 1.1 docker是什么 1.1.1 问题&#xff1a;为什么会有docker出现&#xff1f; 假定您在开发一个项目&#xff0c;您使用的是一台笔记本电脑而且您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。您正在开发的应用依赖于您当前的配置且还要依…

机器人运动学林沛群——变换矩阵

对于仅有移动&#xff0c;由上图可知&#xff1a; A P B P A P B o r g ^AP^BP^AP_{B org} APBPAPBorg​ 对于仅有转动&#xff0c;可得&#xff1a; A P B A R B P ^AP^A_BR^BP APBA​RBP 将转动与移动混合后&#xff0c;可得&#xff1a; 一个例子 在向量中&#xff…

CentOS下安装vlc

一、引言 vlc是一跨多媒体播放器&#xff0c;可以播放本地媒体文件和网络串流&#xff0c;帮助我们排查音视频开发过程中遇到的问题。大部分情况下&#xff0c;我们只需要在Windows系统下安装vlc就可以了。但有一种情况是需要在Linux下安装vlc的&#xff1a;我们的音视频拉流软…

Vue.js2+Cesium1.103.0 十五、绘制视锥,并可实时调整视锥姿态

Vue.js2Cesium1.103.0 十五、绘制视锥&#xff0c;并可实时调整视锥姿态 Demo <template><divid"cesium-container"style"width: 100%; height: 100%;"/> </template><script> /* eslint-disable no-undef */ /* eslint-disable …

Golang 基础 Go Modules包管理

Golang 基础 Go Modules包管理 在 Go 项目开发中&#xff0c;依赖包管理是一个非常重要的内容&#xff0c;依赖包处理不好&#xff0c;就会导致编译失败&#xff0c;本文将系统介绍下 Go 的依赖包管理工具。 我会首先介绍下 Go 依赖包管理工具的历史&#xff0c;并详细介绍下…

三网码支付系统源码,三网免挂有PC软件,有云端源码,附带系统搭建教程

搭建教程 1.先上传云端源码 然后配置Core/Config.php文件里面数据库信息注改&#xff1b;数据库帐号密码 2.云端源码里面Core/Api_Class/Instant_Url_List.php文件配置终端地址注改&#xff1b;第4 http://终端地址/ 3.导入云端数据库 账号admin 密码123456注改&#xff1…

以“防方视角”观JS文件信息泄露

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 案例概述02 攻击路径03 防方思路 01 案例概述 这篇文章来自微信公众号“黑白之道”&#xff0c;记录的某师傅从js文件泄露接口信息&#xff0c;未授权获取大量敏感信息以及通过逻辑漏洞登录管理员账…

Go语言Gin框架安全加固:全面解析SQL注入、XSS与CSRF的解决方案

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 前言 在使用 Gin 框架处理前端请求数据时&#xff0c;必须关注安全性问题&#xff0c;以防范常见的攻击…

ChatGPT论文指南|ChatGPT论文写作过程中6个润色与查重提示词

论文完成初稿之后&#xff0c;一般情况下&#xff0c;宝子们还需要找专家给我们提出评审意见。找专家评审其实并不容易&#xff0c;即使对老师来说&#xff0c;找人评审论文也是一件苦活。我们这个时候可以通过文字提示让 ChatGPT充当我们的评审专家&#xff0c;为论文提出问题…