【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】快递信息管理系统 的相关文章

  • SpringMVC异常处理

    1 概述 SpringMVC 框架处理异常的常用方式 使用 ExceptionHandler 注解处理异常 2 ExceptionHandler注解和用 ControllerAdvice注解 2 1 ExceptionHandler注解 使
  • Spring Web MVC框架(六) 异常处理

    Spring Web MVC对异常处理有着完善的支持 我们可以捕获控制器中抛出的任何异常 然后按照异常类型将异常信息映射到某个视图文件 向用户显示对应的信息 ExceptionHandler 最简单的办法就是使用 ExceptionHand
  • dao层代码

    dao层 数据接口层 方法层 介于业务逻辑层和数据库之间 进行数据的访问和操作 在实际业务处理过程中 往往需要进行多次数据库的访问 这些访问性质往往是相同的 采用Dao层可以将对数据库访问进行封装 避免经行重复性数据库访问开发操作 同时降低
  • 网站发布一般步骤以及解决方法

    1 在D盘 随便一个地方 新建文件夹 2 在vs项目中点击发布弹出对话框 3 配置文件选择自定义 4 下一步 Publish method 选择file system 5 target location选择第一步创建的文件夹 6 下一步 f
  • MVC模式 &三层架构思想完成增删改查.

    MVC模式图解 三层架构图解 表现层 业务逻辑层 数据访问层互不干扰 也就是说比如我们表现层更改代码不会干涉到其他两层 com itheima web 这代表的是包名 也就是说最好把表现层或者业务逻辑层放到此对应的包名下 以后会用三大框架封
  • Spring MVC静态资源映射

    Spring MVC静态资源映射 静态资源映射 使用容器的默认Servlet location mapping cache period order Spring MVC需要对RESTful风格的URL提供支持 而真正的RESTful风格的
  • 如何实现自定义MVC框架(最终版本)

    目录 一 将MVC框架源码导成jar包 1 1优化的思路 1 2具体步骤 二 创建需要的工具包 分析思路 具体的代码 三 总结 前言 我们通过框架的形式实现一个具有增删改查的网页 一 将MVC框架源码导成jar包 1 1优化的思路 相比我们
  • 在Spring中配置多个View解析器

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

    文章目录 关于架构 框架和设计模式三者的说明 一 MVC 1 概念 2 结构 3 模式 4 优缺点 5 适用场景 二 MVP 1 概念 2 结构 3 与MVC对比 4 优缺点 5 适用场景 三 MVVM 1 结构 2 解析 3 MVVM架构
  • MVC 向页面传值方式总结

    总结发现ASP NET MVC中Controller向View传值的方式共有6种 分别是 ViewBag ViewData TempData 向普通View页面传一个Model对象 向强类型页面传传一个Model对象 用一个ViewMode
  • Android面试题——javaMVC、AndroidMVC

    中的 模型 对象 是应用程序的主体部分 多有业务逻辑都应该放到该层 视图 对象 是应用程序中负责生成用户界面的部分 也是整个 架构中用户唯一可以看到的一层 接受用户的输入 显示处理结果 3 控制器 controller 对象 是根据用户的输
  • 解决No converter for [class java.util.ArrayList] with preset Content-Type ‘null‘问题

    一 出现问题 二 解决方法 1 检查Maven依赖是否成功导入 记得clear后刷新
  • JSP&EL表达式&MVC&三层结构综合案例

    文章目录 JSP 1 JSP 概述 2 JSP 快速入门 2 1 搭建环境 2 2 导入 JSP 依赖 2 3 创建 jsp 页面 2 4 编写代码 2 5 测试 3 JSP 原理 4 JSP 脚本 4 1 JSP 脚本分类 4 2 案例
  • 关于我写了三万字博客后悔了好久这件事之第二个三万字GUI(swing)

    目录 简介 使用Swing的优势 Swing的特征 Swing基本组件的用法 Swing组件层次 AWT组件的Swing实现 简单了解swing JFrame 弹窗 标签 面板 按钮 3 6 列表 3 7 文本框 JTree TreeMod
  • MVVM框架极简总结

    MVVM是一个前端框架 由model view viewmodel组成 是MVC的升级版 变成了由viewmodel进行m和v之间的双向数据绑定 虽然代码量相较于MVC变得更多了一点 逻辑和视图分开来写 但是更利于代码解耦 也更方便测试来自
  • SpringBoot实现微信支付,微信扫码支付,Native支付(全网最详细教程)

    1 添加微信支付依赖
  • Handler和Controller的区别

    以前一直以为这两个概念貌似是没有太大的区别 调研发现还是有一些区别的 Handler HandlerMapping接口实现从URL映射到请求处理程序bean 支持映射到bean实例和bean names Controller Base Co
  • 基于SpringBoot的图书管理系统

    基于SpringBoot的图书管理系统 里面整合了比较全的内容 可以说是麻雀虽小五脏俱全 如果看懂了所有的内容可以说是已经非常精通SpringBoot了 一 引言 由于近期看了SpringBoot 一站式开发特别方便 情不自禁用Spring
  • 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