基于ssm+vue646的物流配送管理系统的设计与实现

博主介绍:专注于Java(springboot ssm 等开发框架) vue  .net  php phython node.js    uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作
☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟
我的博客空间发布了1500+毕设题目 方便大家学习使用
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
更多项目地址 介绍  翰文编程CSDN博客
文末下方有源码获取地址 翰文编程-CSDN博客

4.1系统的总体设计

本系统是以B/S开发结构为基础进行设计和实现的,并且通过关键的开发技术,比如Java语言、SSM框架、MySQL数据库等技术,对系统的功能模块、后台管理模块等进行实现,系统功能实现后,用户可以通过使用浏览器,运行和使用系统。通过需求分析的相关内容,可以确定用户对于本系统的具体使用需求,进而规划出系统基本需要具备的功能模块。基于web的物流配送管理系统的使用对象主要分为管理员角色和用户角色,主要的功能需求包括用户管理、车辆信息管理、货物订单管理等。系统总体功能设计图如图4-1所示。

图4-1系统总体功能设计图

4.2数据库设计

4.2.1概念设计

MySQL数据库是免费的面向使用对象,其源代码对外也是公开发布的,也就是说设计人员在经过源代码设计人员的同意之后,就可以根据自身的一定需求,对相关代码进行使用和修改,由此极大的节约了软件开发成本[15]。而且,MySQL数据库占用极少的内存资源,系统与用户之间的交互性强,响应速度和运行速度也比较快,非常适用于中小型系统的开发和设计。从一定意义上说,MySQL数据库的使用价值是非常高的,其相关的语法语义也比较容易理解和掌握,因此本人使用MySQL数据库完成对相关的系统数据的存储和管控。数据库设计过程主要包括概念设计和逻辑设计两个阶段。其中,概念设计是逻辑设计的基础依据,逻辑设计是概念设计的具体实现。

概念设计阶段主要目的是将真实世界的工作任务转化为抽象世界的概念模型,通过设计实体-联系图(E-R图)的方式,来表示实际生活中的工作功能中的实体和属性[16]。这样一来,在物流配送管理系统中,就可以对每一个工作流程进行设计,进而实现对相关的用户信息传递和共享,并由此构建出与系统有关的实体及其属性。本阶段的设计内容是将现实世界中用户对系统的相关功能需求,描述成为便于数据库设计人员理解的概念模型。系统的各实体E-R图设计如图4-2、图4-3、图4-4、图4-5、图4-6、图4-7、图4-8、图4-9、图4-10、图4-11所示,总体E-R图设计如图4-12所示。

图4-2管理员信息E-R图

图4-3员工信息E-R图

图4-4客户信息E-R图

图4-5字典信息E-R图

图4-6车辆信息E-R图

图4-7货物信息E-R图

图4-8货物订单信息E-R图

图4-9出入库信息E-R图

图4-10出入库详情信息E-R图

图4-11公告信息E-R图

图4-12系统的总体E-R图

4.2.2逻辑设计

逻辑设计阶段主要的目的是将概念设计中已经构建好的概念数据模型,转变成数据库能够识别和存储的二维数据表格的形式[17]。本阶段的设计内容是数据库设计人员将理解好的概念模型,描述成为MySQL数据库能够识别的数据表格。本阶段具体的实现方式是将上一阶段设计的E-R图转变成方便数据库进行存储和管理的数据表格,具体的数据表格设计如表4-1、表4-2、表4-3、表4-4、表4-5、4-6、表4-7、表4-8、表4-9、4-10所示。

表4-1 管理员信息表

序号

列名

数据类型

说明

允许空

1

id

Int

编号

2

username

String

用户名

3

password

String

密码

4

role

String

角色

5

addtime

Date

新增时间

表4-2 员工信息表

序号

列名

数据类型

说明

允许空

1

id

Int

编号

2

yonghu_uuid_

number

String

工作证号

3

username

String

账户

4

password

String

密码

5

yonghu_name

String

员工姓名

6

yonghu_photo

String

头像

7

sex_types

Integer

性别

8

bumen_types

Integer

部门

9

yonghu_phone

String

联系方式

10

yonghu_id_number

String

员工身份证号

11

yonghu_email

String

邮箱

12

yonghu_address

String

居住地址

13

yonghu_time

date

出生年月

14

yonghu_delete

Integer

假删

15

create_time

Date

创建时间

表4-3 客户信息表

序号

列名

数据类型

说明

允许空

1

id

Int

编号

2

kehu_uuid_number

String

客户编号

3

kehu_gongshi

String

公司名称

4

kehu_address

String

公司地址

5

sex_types

Integer

性别

6

kehu_name

String

联系人

7

kehu_phone

String

联系方式

8

kehu_email

String

邮箱

9

kehu_delete

Integer

假删

10

create_time

Date

创建时间

表4-4 字典信息表

序号

列名

数据类型

说明

允许空

1

id

Int

编号

2

dic_code

String

字段

3

dic_name

String

字段名

4

code_index

Integer

编码

5

index_name

String

编码名字

6

super_id

Integer

父字段编号

7

beizhu

String

备注

8

create_time

Date

创建时间

表4-5 车辆信息表

序号

列名

数据类型

说明

允许空

1

id

Int

编号

2

cheliang_uuid_number

String

车辆编号

3

cheliang_name

String

车辆名称

4

cheliang_types

Integer

车辆类型

5

cheliang_number

Integer

车辆数量

6

cheliang_content

String

车辆详情

7

create_time

Date

创建时间

表4-6 货物信息表

序号

列名

数据类型

说明

允许空

1

id

Int

编号

2

goods_name

String

货物名称

3

goods_types

Integer

货物类型

4

goods_photo

String

货物图片

5

goods_kucun_number

Integer

货物数量

6

goods_money

BigDecimal

货物价格

7

goods_content

String

货物详情

8

create_time

Date

创建时间

表4-7货物订单信息表

序号

列名

数据类型

说明

允许空

1

id

Int

编号

2

goods_name

String

货物订单号

3

goods_id

Integer

货物

4

kehu_id

Integer

购买客户

5

cheliang_id

Integer

车辆

6

goods_order_number

Integer

购买数量

7

goods_order_shouhuoren

String

收货人

8

goods_order_phone

String

联系方式

9

goods_order_address

String

送货地点

10

goods_order_types

Integer

订单状态

11

create_time

Date

创建时间

表4-8出入库信息表

序号

列名

数据类型

说明

允许空

1

id

Int

编号

2

goods_churu_inout_uuid_number

String

出入库流水号

3

goods_churu_inout_name

String

出入库名称

4

goods_churu_inout_types

Integer

出入库类型

5

goods_churu_inout_content

String

备注

6

insert_time

Date

添加时间

7

create_time

Date

创建时间

表4-9出入库详情信息表

序号

列名

数据类型

说明

允许空

1

id

Int

编号

2

goods_churu_inout_

id

Integer

出入库

3

goods_id

Integer

货物

4

goods_churu_inout_list_number

Integer

操作数量

5

insert_time

Date

操作时间

6

create_time

Date

创建时间

表4-10公告信息表

序号

列名

数据类型

说明

允许空

1

id

Int

编号

2

news_name

String

公告标题

3

news_types

Integer

公告类型

4

news_photo

String

公告图片

5

insert_time

Date

公告时间

6

news_content

String

公告详情

7

create_time

Date

创建时间

第五章 系统实现

5.1个人中心

个人中心模块设计的主要目的是方便用户对个人信息进行管理,用户可以根据自己的实际需求,选择每隔一段时间,对个人账户的密码等相关信息进行更新操作,修改密码界面设计如图5-1所示,个人信息界面如图5-2所示。

图5-1修改密码界面

图5-2个人信息界面

5.2管理员管理

管理员管理模块设计的主要目的是方便管理用户对相关的管理员信息进行管理,管理用户可以选择查看管理员的用户名,修改管理员的密码,管理员管理界面设计如图5-3所示。

图5-3管理员管理界面

5.3员工管理

员工管理模块设计的主要目的是方便管理用户对相关的员工信息进行管理,管理用户可以选择查看员工的邮箱,修改员工的手机号码,员工管理界面设计如图5-4所示。

图5-4用户管理界面

5.4客户管理

客户管理模块设计的主要目的是方便管理用户对相关的客户信息进行管理,管理用户可以选择查看客户的邮箱,修改客户的手机号码,客户管理界面设计如图5-5所示。

图5-5客户管理界面

5.5车辆信息管理

车辆信息管理模块设计的主要目的是方便用户对相关的车辆信息进行管理,用户可以选择查看车辆的详细信息,修改车辆的名称,车辆信息管理界面设计如图5-6所示。

图5-6车辆信息管理界面

主要代码:

 /**
    * 后端列表
    */
    @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("yonghuId",request.getSession().getAttribute("userId"));
        if(params.get("orderBy")==null || params.get("orderBy")==""){
            params.put("orderBy","id");
        }
        PageUtils page = cheliangService.queryPage(params);

        //字典表数据转换
        List<CheliangView> list =(List<CheliangView>)page.getList();
        for(CheliangView 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);
        CheliangEntity cheliang = cheliangService.selectById(id);
        if(cheliang !=null){
            //entity转view
            CheliangView view = new CheliangView();
            BeanUtils.copyProperties( cheliang , view );//把实体数据重构到view中

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

    }

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

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

        Wrapper<CheliangEntity> queryWrapper = new EntityWrapper<CheliangEntity>()
            .eq("cheliang_uuid_number", cheliang.getCheliangUuidNumber())
            .eq("cheliang_name", cheliang.getCheliangName())
            .eq("cheliang_types", cheliang.getCheliangTypes())
            .eq("cheliang_number", cheliang.getCheliangNumber())
            ;

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

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

        String role = String.valueOf(request.getSession().getAttribute("role"));
//        if(false)
//            return R.error(511,"永远不会进入");
        //根据字段查询是否有相同数据
        Wrapper<CheliangEntity> queryWrapper = new EntityWrapper<CheliangEntity>()
            .notIn("id",cheliang.getId())
            .andNew()
            .eq("cheliang_uuid_number", cheliang.getCheliangUuidNumber())
            .eq("cheliang_name", cheliang.getCheliangName())
            .eq("cheliang_types", cheliang.getCheliangTypes())
            .eq("cheliang_number", cheliang.getCheliangNumber())
            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        CheliangEntity cheliangEntity = cheliangService.selectOne(queryWrapper);
        if(cheliangEntity==null){
            cheliangService.updateById(cheliang);//根据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());
        cheliangService.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<CheliangEntity> cheliangList = 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){
                            //循环
                            CheliangEntity cheliangEntity = new CheliangEntity();
//                            cheliangEntity.setCheliangUuidNumber(data.get(0));                    //车辆编号 要改的
//                            cheliangEntity.setCheliangName(data.get(0));                    //车辆名称 要改的
//                            cheliangEntity.setCheliangTypes(Integer.valueOf(data.get(0)));   //车辆类型 要改的
//                            cheliangEntity.setCheliangNumber(Integer.valueOf(data.get(0)));   //车辆数量 要改的
//                            cheliangEntity.setCheliangContent("");//详情和图片
//                            cheliangEntity.setCreateTime(date);//时间
                            cheliangList.add(cheliangEntity);


                            //把要查询是否重复的字段放入map中
                                //车辆编号
                                if(seachFields.containsKey("cheliangUuidNumber")){
                                    List<String> cheliangUuidNumber = seachFields.get("cheliangUuidNumber");
                                    cheliangUuidNumber.add(data.get(0));//要改的
                                }else{
                                    List<String> cheliangUuidNumber = new ArrayList<>();
                                    cheliangUuidNumber.add(data.get(0));//要改的
                                    seachFields.put("cheliangUuidNumber",cheliangUuidNumber);
                                }
                        }

                        //查询是否重复
                         //车辆编号
                        List<CheliangEntity> cheliangEntities_cheliangUuidNumber = cheliangService.selectList(new EntityWrapper<CheliangEntity>().in("cheliang_uuid_number", seachFields.get("cheliangUuidNumber")));
                        if(cheliangEntities_cheliangUuidNumber.size() >0 ){
                            ArrayList<String> repeatFields = new ArrayList<>();
                            for(CheliangEntity s:cheliangEntities_cheliangUuidNumber){
                                repeatFields.add(s.getCheliangUuidNumber());
                            }
                            return R.error(511,"数据库的该表中的 [车辆编号] 字段已经存在 存在数据为:"+repeatFields.toString());
                        }
                        cheliangService.insertBatch(cheliangList);
                        return R.ok();
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            return R.error(511,"批量插入数据异常,请联系管理员");
        }

5.6基础数据管理

基础数据管理模块设计的主要目的是方便用户对相关的部门、货物类型、公告类型信息进行管理,用户可以选择查看部门、货物类型、公告类型的详细信息,修改部门、货物类型、公告类型的名称,部门管理界面设计如图5-7所示,货物类型管理界面设计如图5-8所示,公告类型管理界面设计如图5-9所示。

图5-7部门管理界面

图5-8货物类型管理界面


大家点赞、收藏、关注、评论啦  其他的定制服务  下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者

猜你喜欢

转载自blog.csdn.net/qq_41221322/article/details/143380075