【MVC】快递信息管理系统

2023-11-16


项目介绍

该项目主要介绍基于快递信息的增删改查。

什么是MVC?
MVC是三个单词的首字母缩写,它们是Model(模型)、View(视图)和Controller(控制)。


开发环境

  1. 运行环境:最好是java jdk 17,我们在这个平台上运行的。其他版本理论上也可以。

  2. IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;

  3. 硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS;

  4. 数据库:MySql 5.7版本;

  5. 是否Maven项目:是


技术栈

  1. 后端:SpringBoot+Mysql+Thymeleaf模板引擎

  2. 前端:HTML+JavaScript+BootStrap


使用说明

  1. 使用idea的数据库,在mysql中创建对应名称的数据库,并导入项目的sql文件;

  2. 使用IDEA导入项目时,若为maven项目请选择maven;进去依赖添加完毕之后出现pom.xml的,即视为成功使用maven;

  3. 将项目中application.properties配置文件中的数据库配置改为自己的配置;

  4. 运行项目,输入localhost:8080/ 进入网页界面


技术要求

使用IDEA新建项目时,要选择Spring Initializr
选择Maven
建议JDK 17
添加以下五个依赖

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


思路过程

1. 搭建框架
在这里插入图片描述


2. model层
存放实体类;有收件人,电话号码,快递状态,一张表对应一个实体类,类属性同表字段相对应。

注:添加@Data用法,可帮我们省去实体类的get()和set()方法,节省时间。
在这里插入图片描述

代码展示:

package com.example.express.model;

import jakarta.persistence.*;
import lombok.Data;

@Data
@Entity
@Table(name = "express")
public class Express {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "person_name")
    private String personName;

    @Column(name = "person_number")
    private String personNumber;

    @Column(name = "state")
    private String state;
}


3. Service层
业务层,service层的作用为完成功能设计。存放业务逻辑处理,不直接对数据库进行操作,有接口和接口实现类,提供controller层调用的方法。设计的功能主要有新增、更新、获取指定id的快递信息、删除指定ID的快递信息、分页、模糊查询快递信息。
在这里插入图片描述

代码展示:

package com.example.express.service;

import com.example.express.model.Express;
import org.springframework.data.domain.Page;

import java.util.List;

public interface ExpressService {

    //获取所有快递
    List<Express> getAllExpress();

    //新增
    void saveExpress(Express express);

    //获取指定单号
    Express getExpressByTd(long id);

    //删除指定单号
    void deleteExpressById(long id);

    //分页
    Page<Express> findPaginated(int pageNo, int pageSize, String sortField, String sortDirection);

    //根据收件人查询
    List<Express> findByPersonName(String personName);
}


4. ExpressServiceImpl.java用来存放接口的实现类对接口函数进行实现。

在这里插入图片描述

代码展示:

package com.example.express.service;

import com.example.express.model.Express;
import com.example.express.repository.ExpressRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class ExpressServiceImpl implements ExpressService {

    @Autowired
    private ExpressRepository expressRepository;

    @Override
    public List<Express> getAllExpress(){
        return expressRepository.findAll();
    }
    @Override
    public void saveExpress(Express express){
        this.expressRepository.save(express);
    }

    @Override
    public Express getExpressByTd(long id) {
        //调用数据访问层查找指定ID的员工,返回Optional对象
        Optional<Express> optional = expressRepository.findById(id);
        Express express = null;
        //如果存在指定id的快递
        if (optional.isPresent()){
            //从Optional对象中获取快递对象
            express = optional.get();
        }else {
            //否则抛出运行时异常
            throw new RuntimeException("找不到快递单号:"+id);

        }
        return express;
    }
    @Override
    public void deleteExpressById(long id){
        this.expressRepository.deleteById(id);
    }

    @Override
    public Page<Express> findPaginated(int pageNo, int pageSize, String sortField, String sortDirection) {
        //设置排序参数,升序ASC/降序DESC?
        Sort sort = sortDirection.equalsIgnoreCase(Sort.Direction.ASC.name())
                ? Sort.by(sortField).ascending()
                : Sort.by(sortField).descending();

        //根据页号/每页记录数/排序依据返回某指定页面数据。
        Pageable pageable = PageRequest.of(pageNo - 1, pageSize, sort);

       return this.expressRepository.findAll(pageable);
    }

    @Override
    public List<Express> findByPersonName(String personName) {
        List<Express> name = expressRepository.findAllByPersonName(personName);

        return name;
    }
}


5. Controller层

控制器层,controller层的功能为请求和响应控制。
controller层负责前后端交互,接受前端请求,调用service层,接收service层返回的数据,最后返回具体的页面和数据到客户端。

在这里插入图片描述

代码展示:

package com.example.express.controller;

import com.example.express.model.Express;
import com.example.express.service.ExpressService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
public class ExpressController {
    @Autowired
    private ExpressService expressService;

    @GetMapping("/")
    public String viewHomePage(Model model) {
        return findPaginated(1, "personName", "asc", model);
    }


    /**
     * 跳转
     */
    @GetMapping("/showNewExpressForm")
    public String showNewExpressForm(Model model){
        Express express = new Express();
        model.addAttribute("express", express);
        return "new_express";
    }
    @GetMapping("/query{inpname}")
    public String query(@PathVariable(value = "inpname") String inpame,Model model){
        List<Express> listpersonnumber = expressService.findByPersonName(inpame);
        model.addAttribute("listExpress",listpersonnumber);
        return "index";
    }

    /**
     * 添加
     */
    @PostMapping("/saveExpress")
    public String saveExpress(@ModelAttribute("express") Express express){
        expressService.saveExpress(express);
        return "redirect:/";
    }

    /**
     * 更新跳转
     */
    @GetMapping("/showFormForUpdate/{id}")
    public String showFormForUpdate(@PathVariable(value = "id") long id,Model model){
        Express express = expressService.getExpressByTd(id);
        model.addAttribute("express", express);
        return "update_express";
    }

    /**
     * 删除
     */
    @GetMapping("/deleteExpress/{id}")
    public String deleteExpress(@PathVariable(value = "id") long id){
        this.expressService.deleteExpressById(id);
        return "redirect:/";
    }

    //获取分页数据
    @GetMapping("/page/{pageNo}")
    public String findPaginated(@PathVariable (value = "pageNo") int pageNo,
                                @RequestParam("sortField") String sortField,
                                @RequestParam("sortDir") String sortDir,
                                Model model) {
        int pageSize = 5;
        //分页查询
        Page<Express> page = expressService.findPaginated(pageNo, pageSize, sortField, sortDir);
        List<Express> listExpress = page.getContent();
        model.addAttribute("currentPage", pageNo);
        model.addAttribute("totalPages", page.getTotalPages());
        model.addAttribute("totalItems", page.getTotalElements());
        model.addAttribute("sortField", sortField);
        model.addAttribute("sortDir", sortDir);
        model.addAttribute("reverseSortDir", sortDir.equals("asc") ? "desc" : "asc");
        model.addAttribute("listExpress", listExpress);
        return "index";
    }
}


6. repository层

  • 调用ExpressRepository进行数据库操作。查询Express里面的personName对象;

  • select * from xxx中xxx也不是数据库里面真正的表名,而是对应的实体名;

  • 补充:sql中的字段名也不是数据库中真正的字段名,而是实体的字段名。
    在这里插入图片描述

代码展示:

package com.example.express.repository;

import com.example.express.model.Express;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface ExpressRepository extends JpaRepository<Express,Long> {
    @Query("select g from Express g where g.personName like %:personName%")
    List<Express> findAllByPersonName(@Param("personName") String personName);
}

7. 配置application.properties

本人使用的是远程数据库

  • 如使用本地数据库,localhost即可

在这里插入图片描述

代码展示:

# DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.url=jdbc:mysql://(数据库ip):3306/express?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
spring.datasource.username=root
spring.datasource.password=自定义

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# for Spring Boot 2
# spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5InnoDBDialect

# for Spring Boot 3
spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQLDialect

# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto= update

#?????hibernate-sql
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE

8. index.html部分页面展示

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

ps:html 的源码这里就不往上放了,大家感兴趣可自行摸索或私信我。


9. 使用BootStrap
进入到BootStrap官网中,选择符合主题或自己喜欢的样式,将他添加进html页面中的head标签中。
官网:BootStrap官网
在这里插入图片描述

难点及解决方法

难点

  • 图片导入到 html 时,却在网页界面上不显示;使用其相对路径和绝对路径也都不显示;

在这里插入图片描述

解决方法

  1. 先使用 “…/static/img/p1.jpg” 方法法插入;点击浏览器预览

在这里插入图片描述

  1. 此时是正常显示的;
    但注意看,这里有一个链接,可以看到是先项目名称才到后面的templates/index.html,之后我们的图片就应该
    “http://localhost:63342/Express/src/main/resources/static/img/p1.jpg”
    这样我们使用项目的时候localhost:8080才可以正常访问!

在这里插入图片描述

在这里插入图片描述
至此,问题就解决了。


效果展示

(1) 网页界面首页
p1


(2) 增加快递信息
在这里插入图片描述

在这里插入图片描述


(3)更新
将张三更改为张四
在这里插入图片描述

在这里插入图片描述


(4)删除
将张四删除
在这里插入图片描述

在这里插入图片描述


(5) 查找——根据收件人的名字模糊查询
查询包含 “谢” 的收件人信息
在这里插入图片描述


(6) 分页(大于5行数据可显示页面)
在这里插入图片描述


总结

SpringBoot是一款非常优秀的框架,不仅提供了简化开发的工具和功能,还能帮助我们更好地理解和应用Spring框架。并且它还提供了一种快速、简单的方式来构建独立的、可执行的Spring应用程序。

通过学习我对Java应用程序的开发有了更深入的认识,也提升了自己的技能水平。我相信在未来的工作中,SpringBoot将会成为我们不可或缺的利器。

小伙伴们可以添加其他功能哦!
不合适的地方,望大牛指正。欢迎交流学习!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【MVC】快递信息管理系统 的相关文章

  • SpringBoot框架

    目录 1 1 简介 1 2 特性 1 3 四大核心 2 springboot入门案例 2 1 SpringBoot 项目开发步骤 2 2 创建一个 Spring MVC 的 Spring BootController 2 3 分析 2 4
  • MVC中的项目案例

    我们先一起来看看超期的效果图吧 以上就是超期的效果图 我来解析一下 超期操作的模态窗体弹出的条件与归还一样 应选择需要超期的书籍 再弹出模态窗体 模态窗体弹出 数据自动回填上去 罚款金额 超期天数 0 2 获取当前时间为罚款时间 罚款成功后
  • SpringMVC异常处理

    1 概述 SpringMVC 框架处理异常的常用方式 使用 ExceptionHandler 注解处理异常 2 ExceptionHandler注解和用 ControllerAdvice注解 2 1 ExceptionHandler注解 使
  • 自定义MVC框架原理

    目录 一 什么是MVC 1 模型 Model 2 视图 View 3 控制器 Controller 二 自定义mvc核心思想 三 自定义MVC的核心原则 四 三层架构和MVC的区别 1 结构层次不同 2 重点关注不同 3 强调的功能不同 4
  • 如何在 CentOS/RHEL 7 上安装 Laravel 8

    Laravel是一个开源 PHP 框架 旨在更快地使用 PHP 开发 MVC Web 应用程序 本文将帮助您在 CentOS RHEL 7 系统上安装 Laravel 8 PHP 框架 第 1 步 设置 Yum 存储库 首先 您需要在系统中
  • 网站发布一般步骤以及解决方法

    1 在D盘 随便一个地方 新建文件夹 2 在vs项目中点击发布弹出对话框 3 配置文件选择自定义 4 下一步 Publish method 选择file system 5 target location选择第一步创建的文件夹 6 下一步 f
  • Head First的MVC之歌(英文版)

    MVC之歌 歌名 模型 视图 控制器 ModelViewController 词曲 James Dempsey https pan baidu com s 1PXDVDqRQVpKcZ1bQwCLNLQ 请大佬 翻译并唱 出来
  • 在Spring中配置多个View解析器

    1 简介 在Spring中 提供了View Resolver来使用模型中可用的数据来解析视图 而无需与JSP Velocity或Thymeleaf等View技术紧密绑定 Spring可以根据需要轻松灵活地配置一个或多个View Resolv
  • Spring系列——Spring MVC配置文件

    Spring系列 Spring MVC配置文件 一 前端控制器DispatcherServlet 二 RequestMapping注解 1 使用方法 1 1 标注在方法上 1 2 标注在类上 2 RequestMapping注解的属性 3
  • 40 个 常用的 SpringBoot 注解,你知道几个?

    一 Spring Web MVC 与 Spring Bean 注解 Spring Web MVC 注解 RequestMapping RequestMapping注解的主要用途是将Web请求与请求处理类中的方法进行映射 Spring MVC
  • @RequestMapping注解和Controller方法建立映射的流程

    当你的才华还撑不起你的野心的时候 唯有静下心来学习 有没有想过 为什么在controller类的方法上 添加一个 RequestMapping toIndex 注解的时候 从浏览器的输入localhost 8080 toIndex请求就可以
  • layui中监听单击和双击事件的使用

    作者 张铭标 撰写时间 2019年 6月27日 平时在做数据回填的时候 我们需要用到layui中的监听单击和双击事件来进行数据的获取和回填 具体的使用如图所示 从图中看出这是监听单击事件 一开始需要先引入layui插件就不用多说了 先写一个
  • mybatis的熟练运用以及反射知识讲解

    JSP常用设计模式MVC模式 Mybatis mybatis的使用 我们在写项目的时候必定要写DAO 写DAO的时候不难发现对每张表的DAO都差不多 只是sql语句不同 DAO中的每个方法其实也差不多 所以直接用JDBC写DAO是在太麻烦
  • 狂神说SpringMVC 最全学习笔记

    SpringMVC 1 回顾MVC 1 1 什么是MVC MVC是模型 Model 视图 Views 控制器 Controller 得缩写 是一种软件设计规范 是将业务逻辑 数据 显示分离得方法组织代码 MVC主要作用是降低了视图与业务逻辑
  • SSM框架-小区物业管理系统(附源码和运行视频)

    文章目录 系列文章目录 前言 一 开发框架与业务需求 1 开发框架 2 开发环境 3 整体业务 二 项目结构以及页面展示 1 注册 登录页展示 2 首页 小区管理 3 房产 业主信息管理 4 停车位 服务管理 三 ssm框架配置以及代码包级
  • vue +C# mvc 坑

    1 把input标签放入到form表单中后 再将input中的值新增到数据库后 界面会刷新 解决 删除form 标签 原因待查
  • .NET Core 下定时任务调度

    一 增加本地json持久化调度任务 无需数据库 1 首先 我们创建一个空白的ASP NET Core 项目 MVC Razor和WebAPI都行 如图 2 通过nuget引用最新版本的GZY Quartz MUI组件 如图 组件的项目地址G
  • html理解MVC模型与MVVM模型底层实现

    一 MVC模型的底层实现 1 1 相关代码 div div
  • BugkuCTF-WEB题文件上传

    启动场景 发现是文件上传 只能上传图像 不能上传PHP文件 那应该是寻找漏洞上传PHP文件 PHP文件里写入一句话木马 使用burp抓包 不断尝试发现发现需要修改的地方有三个 一个是http head里的Content Type multi
  • 扩展Spring MVC框架的消息转换器

    扩展Spring MVC框架的消息转换器 param Override protected void extendMessageConverters List

随机推荐

  • vite postcss

    PostCSS PostCSS是一款使用JavaScript插件对CSS实现转换的工具 PostCSS拥有非常强大的插件 典型的比如autoprefixer cssnext css modules等 PostCSS插件的处理方式类似CSS预
  • CSS:基本选择器中的ID选择器和class选择器的区别

    ID选择器 通过标签的id名称来选择标签 id 类选择器 class选择器 选择一个类别 className 区别 1 ID 选择器的是以井号 开头来定义的 类 选择器是以点 来定义的 2 ID 选择器在 HTML 中是可以通过 id 属性
  • 2_Nginx 语法

    文章目录 一些说明 配置静态资源服务器 常用指令 一些说明 指令 指令块 指令以分号结尾 一条指令可以有一个或多个参数 参数之间以空格分隔 例如 server name 指令块可以有名字或者没有名字 include 允许组合多个配置文件 以
  • 面经(一)广州保伦电子有限公司校招宣讲面经

    前言 本章主要讲述我曾参加广州保伦有限公司的学校宣讲并笔试的经历 一 经历概述 宣讲前 在得知该公司会来我们学校进行宣讲时 我看到有招聘Java开发职位 就马上决定参加该公司的宣讲 因为我们学校是最后一次宣讲的地方 自己心里也知道人肯定是招
  • Design Compiler (七)——环境、设计规则和面积约束

    本文如果有错 欢迎留言更正 此外 转载请标明出处 http www cnblogs com IClearner 作者 IC learner 本文的主要内容是讲解 约束针对的是逻辑综合下的约束 而实战部分则是在DC的拓扑模式下进行 环境属性的
  • image not loaded  try to open it externally to fix format problem

    image not loaded try to open it externally to fix format problem 图片没有加载 请从外部打开图片以解决格式问题 由于项目是直接复制过来的 图片从外部打开显示为空 直接全部替换重
  • 编码规范(三)----静态分析工具PMD

    一 简介 1 1 什么是静态代码分析 静态代码分析是指无需运行被测代码 仅通过分析或检查源程序的语法 结构 过程 接口等来检查程序的正确性 找出代码隐藏的错误和缺陷 如参数不匹配 有歧义的嵌套语句 错误的递归 非法计算 可能出现的空指针引用
  • 形象的理解TCP协议为什么要“三次握手”

    我们先来看看专业的解读是怎么简单描述 三次握手 的 以下图片来自百度百科 如果你看完一脸懵圈 不妨想想三次握手的目的 那就是确保客户端和服务器能够正常通讯 当然 本文只是从非专业的角度解释为何TCP建立连接的三次握手就能保证正常通讯 为何不
  • Java创建对象数组出现空指针报错

    public static void main String args teacher d new teacher 2 System out println d 0 其中创建的数组d的内存状态为空 输出数组d其中一个元素是null 即使随便
  • 你了解模糊测试(fuzz testing)吗?

    模糊测试 fuzz testing 是一类安全性测试的方法 说起安全性测试 大部分人头脑中浮现出的可能是一个标准的 黑客 场景 某个不修边幅 脸色苍白的年轻人 坐在黑暗的房间中 正在熟练地使用各种工具尝试进入某个系统 这种由安全人员 模拟黑
  • 图像&视频编辑工具箱MMEditing使用示例:图像超分辨率(super-resolution)

    MMEditing的介绍及安装参考 https blog csdn net fengbingchun article details 126331541 这里给出图像超分的测试代码 论文 Learning Continuous Image
  • go 流媒体服务搭建-01

    这里写自定义目录标题 go 流媒体服务搭建 01 go 流媒体服务搭建 01 新建go 项目 配置go 版本1 19 新增main go package main func main 新增go mod 文件 go mod init mym7
  • C语言之路---三大结构

    目录 1 选择结构 1 1 if else语句 1 2 switch case 语句 1 3 条件运算符 2 循环结构 2 1 whi
  • 直接修改数据库表数据

    直接修改数据库表中的数据 1 写SQL语句 select from 表名 for update 如下图所示 写好SQL后点击执行按钮或者直接按F8 2 执行完SQL后选择行上的按钮 让行信息变成可编辑状态 如下图所示 3 可按增加或者删除一
  • lambda qt 参数 槽函数_Qt界面开发(3)

    参考 QT界面开发 哔哩哔哩 干杯 bilibili www bilibili com 接 juliar Qt界面开发 1 juliar Qt界面开发 2 一 带参数的信号 前面关于信号signal 我们了解到 signals是Qt扩展的关
  • C++的STL库,vector sort排序时间复杂度 及常见容器比较

    http www cnblogs com sthv p 5511921 html http www 169it com article 3215620760 html http www cnblogs com sharpfeng archi
  • js求三个数的最大值和最小值

    如何求三个数的最大值和最小值 var x 9 y 12 c 50 var max x gt y x gt c x c y gt c y c var min x lt y x lt c x c y lt c y c console log m
  • Sharp Memory LCD (ls013b7dh03)驱动

    lcd main c include ls013b7dh03 h include oled font h void lcd main void lcd init lcd clear lcd print char 16 16 a 16 1 l
  • typeAliases设置别名会爆红?sql映射写sql语句没有提示?

    typeAliases设置别名会爆红 明明设置了别名 为什么还是爆红
  • 【MVC】快递信息管理系统

    文章目录 项目介绍 开发环境 技术栈 使用说明 技术要求 思路过程 难点及解决方法 效果展示 总结 项目介绍 该项目主要介绍基于快递信息的增删改查 什么是MVC MVC是三个单词的首字母缩写 它们是Model 模型 View 视图 和Con