基于java+ssm+vue的花卉库存管理系统

项目介绍

如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统花卉库存信息管理难度大,容错率低,管理人员处理数据费工费时,所以专门为解决这个难题开发了一个花卉库存管理系统,可以解决许多问题。

花卉库存管理系统实现的功能包括货物出入库管理,货物出入库详情管理,货物管理,仓库管理,分库管理员管理,员工管理等功能。该系统采用了Mysql数据库,Java语言,SSM框架等技术进行编程实现。

花卉库存管理系统可以提高花卉库存信息管理问题的解决效率,优化花卉库存信息处理流程,保证花卉库存信息数据的安全,它是一个非常可靠,非常安全的应用程序。

4.2 功能结构设计
图4.1即为设计的管理员功能结构,管理员权限操作的功能包括管理员工和分库管理员,以及对货物,仓库,出入库信息进行管理。
在这里插入图片描述
图4.2即为设计的分库管理员功能结构,分库管理员权限操作的功能包括查看货物出入库的信息,增删改查仓库以及货物信息,查看公告等。
在这里插入图片描述
图4.3即为设计的员工功能结构,员工权限操作的功能包括对货物入库,对货物出库,查看货物出入库明细,查看货物信息,仓库信息以及公告信息等。
在这里插入图片描述

开发环境

编程语言:Java
数据库 :Mysql
系统架构:B/S
后端框架:SSM
编译工具:idea或者eclipse,jdk1.8,maven
支持定做:java/php/python/android/小程序/vue/爬虫/c#/asp.net

系统实现

5.1 管理员功能实现
5.1.1 分库管理员管理
图5.1 即为编码实现的分库管理员管理界面,分库管理员信息有手机号,姓名,头像等信息,管理员除了可以新增分库管理员信息,也能使用修改功能对有错误数据的分库管理员信息进行更正以及删除需要删除的分库管理员信息等。
在这里插入图片描述

图5.1 分库管理员管理界面

5.1.2 公告信息管理
图5.2 即为编码实现的公告信息管理界面,公告的标题还有内容都是管理员登记的信息,管理员也负责对公告信息管理界面展示的所有公告进行维护。
在这里插入图片描述

图5.2 公告信息管理界面

5.1.3 员工管理
图5.3 即为编码实现的员工管理界面,员工的信息管理也是管理员管理的内容,管理方式主要还是增删改查员工信息。
在这里插入图片描述

图5.3 员工管理界面

5.2 分库管理员功能实现
5.2.1 仓库信息管理
图5.4 即为编码实现的仓库信息管理界面,仓库信息包括最大库存,最小库存,货物现有库存,仓库地址等信息,分库管理员主要负责新增仓库信息,查看仓库详情,查询仓库信息以及删除需要删除的仓库信息等。
在这里插入图片描述

图5.4 仓库信息管理界面

5.2.2 货物管理
图5.5 即为编码实现的货物管理界面,货物信息包括了仓库类型,货物名称,货物供应商,货物库存,货物存放规则等信息,分库管理员需要新增货物信息,选择查询条件来查询货物,查询条件包括货物供应商,货物名称,仓库编号,仓库类型等。分库管理员也能在货物管理界面修改货物信息,对货物信息进行下架操作或者是上架操作等。
在这里插入图片描述

图5.5 货物管理界面

5.2.3 出入库查看
图5.6 即为编码实现的出入库查看界面,分库管理员只能查询货物出入库信息,或者是对货物的入库信息,出库信息的详情进行查看。
在这里插入图片描述

图5.6 出入库查看界面

5.3 员工功能实现
5.3.1 货物出库
图5.7 即为编码实现的货物出库界面,员工可以对需要出库的货物进行出库操作,需要员工先选择需要出库的货物,然后对其出库数量进行增加或减少,最后提交该货物的出库信息。
在这里插入图片描述

图5.7 货物出库界面

5.3.2 货物入库
图5.8 即为编码实现的货物入库界面,员工对需要入库的货物进行入库操作,包括选择需要入库的货物,然后对其入库的数量进行增减,登记货物入库的备注信息,最后提交货物入库信息。
在这里插入图片描述

图5.8 货物入库界面

5.3.3 货物查看
图5.9 即为编码实现的货物查看界面,员工查询货物,在查询框中编辑货物名称也能查询,通过货物供应商也能查询,或者是通过仓库编号也能查询货物。除了可以查询货物之外,员工也能查看货物详情。
在这里插入图片描述

图5.9 货物查看界面

核心代码

package com.controller;

import java.io.File;
import java.math.BigDecimal;
import java.net.URL;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.*;
import java.lang.reflect.InvocationTargetException;

import com.service.DictionaryService;
import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.*;
import com.entity.view.*;
import com.service.*;
import com.utils.PageUtils;
import com.utils.R;
import com.alibaba.fastjson.*;

/**
 * 仓库信息
 * 后端接口
 * @author
 * @email
*/
@RestController
@Controller
@RequestMapping("/cangku")
public class CangkuController {
    private static final Logger logger = LoggerFactory.getLogger(CangkuController.class);

    @Autowired
    private CangkuService cangkuService;


    @Autowired
    private TokenService tokenService;
    @Autowired
    private DictionaryService dictionaryService;

    //级联表service

    @Autowired
    private FenkuguanliService fenkuguanliService;
    @Autowired
    private YonghuService yonghuService;


    /**
    * 后端列表
    */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
        logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(false)
            return R.error(511,"永不会进入");
        else if("分库管理员".equals(role))
            params.put("fenkuguanliId",request.getSession().getAttribute("userId"));
        else if("员工".equals(role))
            params.put("yonghuId",request.getSession().getAttribute("userId"));
        if(params.get("orderBy")==null || params.get("orderBy")==""){
            params.put("orderBy","id");
        }
        PageUtils page = cangkuService.queryPage(params);

        //字典表数据转换
        List<CangkuView> list =(List<CangkuView>)page.getList();
        for(CangkuView c:list){
            //修改对应字典表字段
            dictionaryService.dictionaryConvert(c, request);
        }
        return R.ok().put("data", page);
    }

    /**
    * 后端详情
    */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id, HttpServletRequest request){
        logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
        CangkuEntity cangku = cangkuService.selectById(id);
        if(cangku !=null){
            //entity转view
            CangkuView view = new CangkuView();
            BeanUtils.copyProperties( cangku , view );//把实体数据重构到view中

            //修改对应字典表字段
            dictionaryService.dictionaryConvert(view, request);
            return R.ok().put("data", view);
        }else {
            return R.error(511,"查不到数据");
        }

    }

    /**
    * 后端保存
    */
    @RequestMapping("/save")
    public R save(@RequestBody CangkuEntity cangku, HttpServletRequest request){
        logger.debug("save方法:,,Controller:{},,cangku:{}",this.getClass().getName(),cangku.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(false)
            return R.error(511,"永远不会进入");

        Wrapper<CangkuEntity> queryWrapper = new EntityWrapper<CangkuEntity>()
            .eq("cangku_name", cangku.getCangkuName())
            .eq("cangku_types", cangku.getCangkuTypes())
            .eq("cangku_address", cangku.getCangkuAddress())
            .eq("cangku_max_number", cangku.getCangkuMaxNumber())
            .eq("cangku_min_number", cangku.getCangkuMinNumber())
            .eq("cangku_kucun_number", cangku.getCangkuKucunNumber())
            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        CangkuEntity cangkuEntity = cangkuService.selectOne(queryWrapper);
        if(cangkuEntity==null){
            cangku.setCreateTime(new Date());
            cangkuService.insert(cangku);
            return R.ok();
        }else {
            return R.error(511,"表中有相同数据");
        }
    }

    /**
    * 后端修改
    */
    @RequestMapping("/update")
    public R update(@RequestBody CangkuEntity cangku, HttpServletRequest request){
        logger.debug("update方法:,,Controller:{},,cangku:{}",this.getClass().getName(),cangku.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));
//        if(false)
//            return R.error(511,"永远不会进入");
        //根据字段查询是否有相同数据
        Wrapper<CangkuEntity> queryWrapper = new EntityWrapper<CangkuEntity>()
            .notIn("id",cangku.getId())
            .andNew()
            .eq("cangku_name", cangku.getCangkuName())
            .eq("cangku_types", cangku.getCangkuTypes())
            .eq("cangku_address", cangku.getCangkuAddress())
            .eq("cangku_max_number", cangku.getCangkuMaxNumber())
            .eq("cangku_min_number", cangku.getCangkuMinNumber())
            .eq("cangku_kucun_number", cangku.getCangkuKucunNumber())
            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        CangkuEntity cangkuEntity = cangkuService.selectOne(queryWrapper);
        if(cangkuEntity==null){
            cangkuService.updateById(cangku);//根据id更新
            return R.ok();
        }else {
            return R.error(511,"表中有相同数据");
        }
    }



    /**
    * 删除
    */
    @RequestMapping("/delete")
    public R delete(@RequestBody Integer[] ids){
        logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
        cangkuService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }


    /**
     * 批量上传
     */
    @RequestMapping("/batchInsert")
    public R save( String fileName, HttpServletRequest request){
        logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
        Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            List<CangkuEntity> cangkuList = new ArrayList<>();//上传的东西
            Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
            Date date = new Date();
            int lastIndexOf = fileName.lastIndexOf(".");
            if(lastIndexOf == -1){
                return R.error(511,"该文件没有后缀");
            }else{
                String suffix = fileName.substring(lastIndexOf);
                if(!".xls".equals(suffix)){
                    return R.error(511,"只支持后缀为xls的excel文件");
                }else{
                    URL resource = this.getClass().getClassLoader().getResource("../../upload/" + fileName);//获取文件路径
                    File file = new File(resource.getFile());
                    if(!file.exists()){
                        return R.error(511,"找不到上传文件,请联系管理员");
                    }else{
                        List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
                        dataList.remove(0);//删除第一行,因为第一行是提示
                        for(List<String> data:dataList){
                            //循环
                            CangkuEntity cangkuEntity = new CangkuEntity();
//                            cangkuEntity.setCangkuName(data.get(0));                    //仓库编号 要改的
//                            cangkuEntity.setCangkuTypes(Integer.valueOf(data.get(0)));   //仓库类型 要改的
//                            cangkuEntity.setCangkuAddress(data.get(0));                    //仓库地址 要改的
//                            cangkuEntity.setCangkuMaxNumber(Integer.valueOf(data.get(0)));   //最大库存 要改的
//                            cangkuEntity.setCangkuMinNumber(Integer.valueOf(data.get(0)));   //最小库存 要改的
//                            cangkuEntity.setCangkuKucunNumber(Integer.valueOf(data.get(0)));   //货物现有库存 要改的
//                            cangkuEntity.setCangkuContent("");//详情和图片
//                            cangkuEntity.setCreateTime(date);//时间
                            cangkuList.add(cangkuEntity);


                            //把要查询是否重复的字段放入map中
                        }

                        //查询是否重复
                        cangkuService.insertBatch(cangkuList);
                        return R.ok();
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            return R.error(511,"批量插入数据异常,请联系管理员");
        }
    }






}

论文参考

在这里插入图片描述

目 录
摘 要 I
Abstract II
第1章 绪论 1
1.1 课题背景 1
1.2 课题意义 1
1.3 研究内容 1
第2章 开发环境与技术 3
2.1 Java语言 3
2.2 MYSQL数据库 3
2.3 IDEA开发工具 4
2.4 SSM框架 4
第3章 系统分析 5
3.1 可行性分析 5
3.1.1 技术可行性 5
3.1.2 经济可行性 5
3.1.3 操作可行性 5
3.2 系统流程 5
3.2.1 操作流程 6
3.2.2 登录流程 6
3.2.3 删除信息流程 7
3.2.4 添加信息流程 7
3.3 性能需求 8
3.4 功能需求 9
第4章 系统设计 12
4.1 系统设计思想 12
4.2 功能结构设计 13
4.3 数据库设计 15
4.3.1 数据库概念设计 15
4.3.2 数据库物理设计 18
第5章 系统实现 22
5.1 管理员功能实现 22
5.1.1 分库管理员管理 22
5.1.2 公告信息管理 22
5.1.3 员工管理 23
5.2 分库管理员功能实现 23
5.2.1 仓库信息管理 23
5.2.2 货物管理 24
5.2.3 出入库查看 24
5.3 员工功能实现 25
5.3.1 货物出库 25
5.3.2 货物入库 25
5.3.3 货物查看 26
第6章 系统测试 27
6.1 功能测试 27
6.1.1 登录功能测试 27
6.1.2 修改密码功能测试 28
6.2 系统测试结果 29
结 论 30
参考文献 31
致 谢 32

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
花卉管理系统的Java代码主要包括花卉信息管理、库存管理、销售管理和用户权限管理等功能。首先,花卉信息管理模块包括花卉的名称、价格、供应商信息等,以及对花卉信息的添加、修改、删除和查询操作。其次,库存管理模块负责记录花卉的库存数量,并能够实现入库、出库和库存查询等功能。销售管理模块主要包括销售订单的录入、统计和查询,能够实现销售额、销售量等数据的统计分析。最后,用户权限管理模块能够对不同角色的用户进行权限设置,包括管理员和员工等不同角色的权限管理,确保系统安全稳定运行。 在Java代码中,可以使用面向对象的程序设计思想,定义花卉、库存、销售订单等相关类,并建立它们之间的关联关系。同时,使用数据库连接技术,将花卉信息、库存记录、销售订单等数据存储到数据库中,实现数据的持久化存储和管理。另外,可以使用图形用户界面(GUI)技术,设计直观美观的系统界面,方便用户进行操作和管理。 在编写花卉管理系统的Java代码时,需要考虑系统的健壮性、性能和安全性。尽量避免出现空指针异常、数组越界等错误,保证系统运行的稳定性;优化算法和查询语句,提高系统的性能和响应速度;同时加强对用户输入和操作的验证和权限控制,防止非法操作和数据泄露。通过不断优化和完善,构建一个功能完备、安全稳定的花卉管理系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

q_2781179521

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值