草庐IT

【开源】基于Java+SpringBoot+Vue+ElementUI的超市管理系统

不懂代码的胖子@ 2024-05-03 原文

目录

系统背景

系统总体设计

运行环境

技术选型

系统架构

系统用例

系统详细设计

系统功能截图

首页统计

RBAC权限管理

商品管理

订单管理

销量统计

售后订单

收银系统

商品采购

供应商管理

采购统计

系统核心功能设计

RBAC权限设计

逻辑删除

EXCEL数据导出功能

EXCEL数据导入功能

SQL监控

MD5加密

RESTful架构风格

数据存储设计

模型图

表结构

获取源码


文章末尾免费获取源码、软件和教程~

系统背景

最初的超市资料管理,都是靠人力来完成的。但近几年我国超市经营规模日趋扩大,销售额和门店数量大幅度增加,而且许多超市正在突破以食品为主的传统格局,向品种多样化发展。小型超市在业务上需要处理大量的库存信息,还要时刻更新产品的销售信息,不断添加商品信息,并对商品各种信息进行统计分析。因此,在超市管理中引进现代化的办公软件,实现超市庞大商品的控制和传输,从而方便销售行业的管理和决策,为超市和超市管理人员解除后顾之忧。

一款好的超市销售管理系统,应该是可以帮助销售部门提高工作效率,帮助超市工作人员利用计算机,极为方便的对超市的有关数据进行管理、输入、输出、查找等有关操作,使杂乱的超市数据能够具体化、直观化、合理化等。

系统总体设计

运行环境

  • Java 开发工具包:jdk v1.8

  • JavaScript运行环境:nodejs v14.15.0

  • Java依赖管理工具:maven v3.3.9

  • 后端代码开发工具:idea

  • 前端代码开发工具:WebStorm

  • 数据库可视化工具:Navicat

  • 数据库:MySQL

技术选型

  • SpringBoot

  • MybatisPlus

  • Vue

  • ElementUI

  • Echarts

  • JWT

系统架构

系统用例

不同的角色具有不同的功能

系统详细设计

系统功能截图

首页统计

通过图表直观查看当天统计数据

RBAC权限管理

分配不同的角色不同权限

商品管理

订单管理

销量统计

售后订单

收银系统

商品采购

供应商管理

采购统计

系统核心功能设计

RBAC权限设计

RBAC权限设计,用于给不同用户分配不同的角色,不同的角色分配不同的权限。从而实现不同的用户有自己界面。

核心代码如下:

@RestController
@RequestMapping("/sys/role")
public class SysRoleController extends AbstractController {
    @Autowired
    private SysRoleService sysRoleService;
    @Autowired
    private SysRoleMenuService sysRoleMenuService;
​
    /**
     * 角色列表
     */
    @GetMapping("/list")
    @RequiresPermissions("sys:role:list")
    public R list(@RequestParam Map<String, Object> params){
        //如果不是超级管理员,则只查询自己创建的角色列表
        if(getUserId() != Constant.SUPER_ADMIN){
            params.put("createUserId", getUserId());
        }
​
        PageUtils page = sysRoleService.queryPage(params);
​
        return R.ok().put("page", page);
    }
    
    /**
     * 角色列表
     */
    @GetMapping("/select")
    @RequiresPermissions("sys:role:select")
    public R select(){
        Map<String, Object> map = new HashMap<>();
        
        //如果不是超级管理员,则只查询自己所拥有的角色列表
        if(getUserId() != Constant.SUPER_ADMIN){
            map.put("create_user_id", getUserId());
        }
        List<SysRoleEntity> list = (List<SysRoleEntity>) sysRoleService.listByMap(map);
        
        return R.ok().put("list", list);
    }
    
    /**
     * 角色信息
     */
    @GetMapping("/info/{roleId}")
    @RequiresPermissions("sys:role:info")
    public R info(@PathVariable("roleId") Long roleId){
        SysRoleEntity role = sysRoleService.getById(roleId);
        
        //查询角色对应的菜单
        List<Long> menuIdList = sysRoleMenuService.queryMenuIdList(roleId);
        role.setMenuIdList(menuIdList);
        
        return R.ok().put("role", role);
    }
    
    /**
     * 保存角色
     */
    @SysLog("保存角色")
    @PostMapping("/save")
    @RequiresPermissions("sys:role:save")
    public R save(@RequestBody SysRoleEntity role){
        ValidatorUtils.validateEntity(role);
        
        role.setCreateUserId(getUserId());
        sysRoleService.saveRole(role);
        
        return R.ok();
    }
    
    /**
     * 修改角色
     */
    @SysLog("修改角色")
    @PostMapping("/update")
    @RequiresPermissions("sys:role:update")
    public R update(@RequestBody SysRoleEntity role){
        ValidatorUtils.validateEntity(role);
        
        role.setCreateUserId(getUserId());
        sysRoleService.update(role);
        
        return R.ok();
    }
    
    /**
     * 删除角色
     */
    @SysLog("删除角色")
    @PostMapping("/delete")
    @RequiresPermissions("sys:role:delete")
    public R delete(@RequestBody Long[] roleIds){
        sysRoleService.deleteBatch(roleIds);
        
        return R.ok();
    }
}

逻辑删除

表采用逻辑删除,企业应用都不会真实地从数据库删除数据,而是进行伪删除,极大地提高了系统安全性和可恢复性。每个实体类有添加@TableLogic

核心代码如下:

EXCEL数据导出功能

支持页面数据导出

EXCEL数据导入功能

支持下载excel模板,填入数据后,支持数据导入

SQL监控

引入SQL监控插件,可以查看每条sql的执行次数和执行时间等相关信息,从而方便进行系统优化

MD5加密

密码采用加密,就算是后台人员也无法直接查看和破解密码,极大保障用户数据安全

RESTful架构风格

采用这种架构风格,前后端对接能很好地进行交互

代码如下:

@RestController
@RequestMapping("generator/mallgoods")
public class MallGoodsController extends AbstractController {
    @Autowired
    private MallGoodsService mallGoodsService;
​
    /**
     * 列表
     */
    @RequestMapping("/list")
    @RequiresPermissions("generator:mallgoods:list")
    public R list(@RequestParam Map<String, Object> params){
        PageUtils page = mallGoodsService.queryPage(params);
​
        return R.ok().put("page", page);
    }
​
    /**
     * 列表
     */
    @RequestMapping("/queryAll")
    @RequiresPermissions("generator:mallgoods:list")
    public R queryAll(){
        List<MallGoodsEntity> all = mallGoodsService.list();
​
        return R.ok().put("all", all);
    }
​
    /**
     * 信息
     */
    @RequestMapping("/info/{id}")
    @RequiresPermissions("generator:mallgoods:info")
    public R info(@PathVariable("id") Long id){
        MallGoodsEntity mallGoods = mallGoodsService.getById(id);
​
        return R.ok().put("mallGoods", mallGoods);
    }
​
    /**
     * 保存
     */
    @RequestMapping("/save")
    @RequiresPermissions("generator:mallgoods:save")
    public R save(@RequestBody MallGoodsEntity mallGoods){
​
        mallGoods.setSalesCount(0L);
        mallGoods.setStock(0L);
        mallGoods.setCreateUserId(getUserId());
        mallGoods.setUpdateUserId(getUserId());
        Date date = new Date();
        mallGoods.setCreateTime(date);
        mallGoods.setUpdateTime(date);
        mallGoodsService.save(mallGoods);
​
        return R.ok();
    }
​
    /**
     * 修改
     */
    @RequestMapping("/update")
    @RequiresPermissions("generator:mallgoods:update")
    public R update(@RequestBody MallGoodsEntity mallGoods){
​
        mallGoods.setUpdateUserId(getUserId());
        Date date = new Date();
        mallGoods.setUpdateTime(date);
        mallGoodsService.updateById(mallGoods);
​
        return R.ok();
    }
​
    /**
     * 删除
     */
    @RequestMapping("/delete")
    @RequiresPermissions("generator:mallgoods:delete")
    public R delete(@RequestBody Long[] ids){
        mallGoodsService.removeByIds(Arrays.asList(ids));
​
        return R.ok();
    }
​
}

数据存储设计

模型图

表结构

  • 商品信息

  • 商品分类

  • 商品采购订单

  • 商品采购单明细

  • 供应商

  • 订单

  • 订单明细

  • 售后订单

  • 售后订单明细

获取源码

觉得不错就点赞、收藏、关注、评论 吧。致力于将企业开发模式运用于项目学习中,在项目的学习中,同时了解企业开发模式和业务设计。系统包含源码、全套安装软件和视频安装教程。详情私聊我吧。

有关【开源】基于Java+SpringBoot+Vue+ElementUI的超市管理系统的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  3. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  4. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  5. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  6. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  7. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  8. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  9. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  10. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

随机推荐