【开源】基于JAVA语言的免税店商城管理系统

在这里插入图片描述


目录

  • 一、摘要
    • 1.1 项目介绍
    • 1.2 项目录屏
  • 二、系统设计
    • 2.1 功能模块设计
    • 2.2 研究方法
  • 三、系统展示
  • 四、核心代码
    • 4.1 查询免税种类
    • 4.2 查询物品档案
    • 4.3 新增顾客
    • 4.4 新增消费记录
    • 4.5 审核免税
  • 五、免责说明


一、摘要

1.1 项目介绍

基于JAVA+Vue+SpringBoot+MySQL的免税店商城管理系统,包含了顾客模块、免税物品模块、免税费率模块、购买登记模块和免税审核模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,免税店商城管理系统基于角色的访问控制,给免税管理员、免税工作人员使用,可将权限精确到按钮级别,您可以自定义角色并分配权限,系统适合设计精确的权限约束需求。

1.2 项目录屏


二、系统设计

本项目是基于Vue和SpringBoot的免税店商城管理系统,是一个前后端分离的项目,是当下软件开发主流模式。

2.1 功能模块设计

在这里插入图片描述

该项目中包括三个角色,分别是免税店管理员、审核员、系统管理员。对于免税店管理员而言,免税店管理员主要负责对顾客信息和购买物品进行登记并上传到系统,以便审核员审核顾客信息。对于审核员而言,审核员负责发布免税最新比例在系统中,设置各类商品的免税比例,方便物品税率改变后物品价值计算,以及免税物品发货审核,经过审核之后的商品才会发货。对于系统管理员而言,系统管理员负责在审核员审核顾客不满足购买免税店商品条件之后的会员卡退费,以及对会员和审核员的登陆账号、角色、权限进行配置,还有维护数据库稳定。

登录方面,系统前端将账号、密码、验证码转化为 JSON 格式,使用 ajax 请求后端 API 接口,后端接口完成业务逻辑判断,再将登陆结果返回给前端,前端将根据返回结果判断接下来的页面跳转。登陆页面包含账号密码和手机号码两个选择来进行登录。输入账号、密码和验证码后点击登陆,即可登陆系统,此处账号密码不能为空,如果密码输入错误,系统将进行密码错误提示,不能登陆系统,如果验证码过期,则需要重新获取验证。登陆鉴权功能由后端完成。 此系统用于三类人群进行登陆、使用,分别是免税店管理员、系统管理员、审核员。界面方面块使用了 View UI 的 Table 组件,和 Form 组件作为搜索栏。添加弹窗使用了 View UI 的 Drawer 抽屉组件。确认弹窗使用了 View UI 的 Modal 组件。

2.2 研究方法

采用的研究方法主要是文献研究法、功能分析法、描述研究法。首先文献研究法是根据所研究的目的或课题,通过调查文献获取资料,从而全面地、正确地了解掌握免税店商城管理方面的相关知识。然后用描述研究法对于相关的技术进行进一步了解,最后通过功能分析法对要完成的设计进行功能模块具体分析,从而实现整个系统。

首先是进行文献分析。大量收集有关免税店商城管理系统的文献,进行研究。为后续的系统分析建立基础。

第二是系统分析。学习有关SpringBoot、Vue、MySQL等技术以及免税店商城管理系统相关的技术。然后对系统进行可行性和需求分析,包括对该系统操作、技术和管理员等方面的分析论证,以及对系统的登录、审核管理、顾客信息登记功能进行需求分析论证。

第三是系统设计。先对设计思想、目标和系统结构进行简单概述。然后对各角色的实现要求进行分析,最后根据以上功能涉及的数据库结构设计进行详细描述,展示该系统的全部功能。

最后是系统开发。对以上的分析进行逐步开发设计,搭建后台,实现框架后填充各个功能,并且不断完善不足之处。


三、系统展示

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


四、核心代码

4.1 查询免税种类

@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查询免税种类")
public Result<IPage<Insurance>> getByPage(@ModelAttribute Insurance insurance ,@ModelAttribute PageVo page){
    QueryWrapper<Insurance> qw = new QueryWrapper<>();
    if(!ZwzNullUtils.isNull(insurance.getTitle())) {
        qw.like("title",insurance.getTitle());
    }
    if(!ZwzNullUtils.isNull(insurance.getContent())) {
        qw.like("content",insurance.getContent());
    }
    IPage<Insurance> data = iInsuranceService.page(PageUtil.initMpPage(page),qw);
    return new ResultUtil<IPage<Insurance>>().setData(data);
}

4.2 查询物品档案

@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查询物品档案")
public Result<IPage<Operation>> getByPage(@ModelAttribute Operation operation ,@ModelAttribute PageVo page){
    QueryWrapper<Operation> qw = new QueryWrapper<>();
    if(!ZwzNullUtils.isNull(operation.getTitle())) {
        qw.like("title",operation.getTitle());
    }
    if(!ZwzNullUtils.isNull(operation.getType())) {
        qw.like("type",operation.getType());
    }
    if(!ZwzNullUtils.isNull(operation.getDescribed())) {
        qw.like("described",operation.getDescribed());
    }
    IPage<Operation> data = iOperationService.page(PageUtil.initMpPage(page),qw);
    return new ResultUtil<IPage<Operation>>().setData(data);
}

4.3 新增顾客

@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增顾客")
public Result<Roster> insert(Roster roster){
    Insurance insurance = iInsuranceService.getById(roster.getInsuranceId());
    if(insurance != null) {
        roster.setInsuranceName(insurance.getTitle());
    }
    iRosterService.saveOrUpdate(roster);
    return new ResultUtil<Roster>().setData(roster);
}

4.4 新增消费记录

@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增消费记录")
public Result<SeeDoctor> insert(SeeDoctor seeDoctor){
    Roster roster = iRosterService.getById(seeDoctor.getUserId());
    if(roster == null) {
        return ResultUtil.error("顾客不存在");
    }
    seeDoctor.setUserName(roster.getName());
    seeDoctor.setDate(DateUtil.today());
    iSeeDoctorService.saveOrUpdate(seeDoctor);
    roster.setMoney(seeDoctor.getBalanceNew());
    iRosterService.saveOrUpdate(roster);
    // 生成审核单
    Examine examine = new Examine();
    examine.setUserId(roster.getId());
    examine.setUserName(roster.getName());
    examine.setExemptionId(roster.getInsuranceId());
    examine.setExemptionName(roster.getInsuranceName());
    examine.setMoney(seeDoctor.getPriceYou());
    examine.setStatus(0);
    examine.setMessage("");
    examine.setRemark("");
    iExamineService.saveOrUpdate(examine);
    return new ResultUtil<SeeDoctor>().setData(seeDoctor);
}

4.5 审核免税

@RequestMapping(value = "/audit", method = RequestMethod.POST)
@ApiOperation(value = "审核免税")
public Result<Object> audit(@RequestParam String id,@RequestParam String msg){
    Examine examine = iExamineService.getById(id);
    if(examine == null) {
        return ResultUtil.error("审核单不存在");
    }
    examine.setStatus(1);
    examine.setMessage(msg);
    iExamineService.saveOrUpdate(examine);
    return ResultUtil.success();
}

五、免责说明

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

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

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码之外:工程师的成长进阶秘籍

程序员只懂技术能行吗&#xff1f; 为什么说技术人员“说”和“写”总得擅长一个&#xff1f; 你以为的“关注结果”是真的结果吗&#xff1f; 从一线工程师跃升团队管理者一共分几步&#xff1f; 在不断变化的职场环境中&#xff0c;技术人如何保持竞争力并实现自我增值&a…

【消息队列】RocketMQ 生产和消费中的集群模式和广播模式

在消息队列系统中&#xff0c;生产者和消费者的模式通常包括集群模式和广播模式。这两种模式分别用于不同的场景&#xff0c;具有不同的特点和优势。 1. 集群模式&#xff08;Cluster Mode&#xff09;&#xff1a; 在集群模式下&#xff0c;多个相同角色的实例组成一个集群&…

精品量化公式——“筹码动态”,筹码动态改进版,增加了三个买点信号标识

不多说&#xff0c;直接上效果如图&#xff1a; ► 日线表现 代码评估 技术指标代码评估&#xff1a; 散筹估算: 使用EMA&#xff08;指数移动平均&#xff09;方法计算(WINNER(C*1.1)-WINNER(C*0.9))*70的3日均线&#xff0c;用黄色粗线表示。这是用于估算市场中散户投资者的…

三维重建(3)--单视几何

目录 一、无穷远点、无穷远线、无穷远平面 1、2D平面上的无穷远问题 2、3D平面上的无穷远问题 二、影消点与影消线 1、2D平面上的无穷远点&#xff0c;无穷远线变换 2、影消点 3、影消线 三、单视重构 1、两平行线夹角与影消线关系 2、单视图标定 一、无穷远点、无…

Vue3 在 history 模式下通过 vite 打包部署白屏

Vue3 在 history 模式下通过 vite 打包部署后白屏; 起因 hash 模式 url 后面跟个 # 强迫症犯了改成了 history,就此一波拉锯战开始了 ... 期间 nigix 和 router 各种反复排查尝试最终一波三折后可算是成功了 ... Vue官方文档 具体配置可供参考如下: 先简要介绍下,当前项目打包…

【网站项目】331基于jsp的超市库存商品管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

paramiko 、netmiko抛出 No existing session的解决方法。

写这篇文章&#xff0c;是因为我在H3C交换机上很正常的代码&#xff0c;可以ssh登录&#xff0c;但huawei交换机上失败&#xff0c;用CSDN上的文章关于allow_agentFalse,look_for_keysFalse 处理还是失败后&#xff0c;找相关的一些帖子总结的必须修改paramiko的源代码文章。 如…

Mysql:重点且常用的 SQL 标签整理

目录 1 <resultMap> 标签 2 <sql> 标签 3 <where> 标签 4 <if> 标签 5 <trim> 标签 6 <foreach> 标签 7 <set> 标签 1 <resultMap> 标签 比如以下代码&#xff1a; <resultMap type"SysCollege" id&qu…

【2024.1.19练习】B:01串的熵

B: 01串的熵&#xff08;5分&#xff09; 问题描述 对于一个长度为23333333的01串&#xff0c;如果其信息熵为11625907.5798&#xff0c;且0 出现次数比1 少&#xff0c;那么这个01 串中0出现了多少次&#xff1f; 我的代码&#xff1a; 注意调用<cmath>以便于对数运算…

Android-三方框架的源码

ARouter Arouter的整体思路是moduelA通过中间人ARouter把路由信息的存到仓库WareHouse&#xff1b;moduleB发起路由时&#xff0c;再通过中间人ARouter从仓库WareHouse取出路由信息&#xff0c;这要就实现了没有依赖的两者之间的跳转与通信。其中涉及Activity的跳转、服务prov…

2024 Move开发者大会在上海圆满落幕,第三期星航计划启动

*以下文章来源于MoveFuns &#xff0c;作者MoveFuns 至各位Mover&#xff1a; 2024 Move DevConfShanghai 圆满成功。在这次盛会上&#xff0c;我们围绕着Move生态关键的一年这一主题进行了深入的讨论和交流。 以下是本次会议的总结回顾&#xff1a; 大会盛况 本次大会在上…

大模型学习与实践笔记(九)

一、LMDeply方式部署 使用 LMDeploy 以本地对话方式部署 InternLM-Chat-7B 模型&#xff0c;生成 300 字的小故事 2.api 方式部署 运行 结果&#xff1a; 显存占用&#xff1a; 二、报错与解决方案 在使用命令&#xff0c;对lmdeploy 进行源码安装是时&#xff0c;报错 1.源…

innoDB存储引擎

1.逻辑存储结构 行数据->行->页->区->段->表空间 表空间(ibd文件)&#xff0c;一个mysql实例可以对应多个表空间&#xff0c;来存储记录&#xff0c;索引等数据。 段&#xff1a;分为数据段和索引段&#xff0c;回滚段&#xff0c;数据段就是B树的叶子节点&am…

神器yakit之web fuzzer功能

前言 yakit并不像burp一样单独设置爆破模块&#xff0c;但是yakit也是可以爆破的&#xff0c;并且更好用&#xff08;个人感觉&#xff09;。 手工测试场景中需要渗透人员对报文进行反复的发送畸形或者特定的payload进行查看服务器的反馈并以此来进行下一步的判断。 Fuzz标签便…

Gazebo的模型下载。

git clone zouxu634866/gazebo_modelshttps://gitee.com/zouxu6348660/gazebo_models.git&#xff0c;并完成路径配置。 &#xff08;本文提供了gitee下载&#xff0c;国外的Github下载较慢。&#xff09;

《WebKit 技术内幕》之四(1): 资源加载和网络栈

第四章 资源加载和网络栈 使用网络栈来下载网页和网页资源是渲染引擎工作的第一步 1.WebKit 资源加载机制 1.1 资源 网页本身就是一种资源、网页还需要依赖很多其他的资源(图片、视频) &#xff08;1&#xff09;HTML 支持的资源主要包括以下几种类型&#xff1a; HTML 页…

【并发编程系列】putIfAbsent和getOrDefault用法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

高效火情监测,科技助力森林防火【数字地球开放平台】

数字地球开放平台-以卫星遥感为核心的空天信息服务开放平台 (geovisearth.com) 2019年3月30日&#xff0c;四川省凉山州木里县爆发了一场森林火灾&#xff0c;火点位于海拔3800米左右&#xff0c;地形险峻、坡度陡峭、谷深难以抵挡火势。在扑救的过程中&#xff0c;27名森林消防…

服务器自动拉取git代码运行脚本

# 1.场景分析 工作中常常会遇到本地编辑shell脚本或者python脚本完成后需要在服务器上运行的情况&#xff0c;每次进行拷贝费时费力。下面介绍下通过git管理器&#xff0c;实现本地与服务器代码同步的方式。选择公司搭建的gitlab为例&#xff1a; 2.gitlab配置服务器ssh密钥 …