首页 > 其他分享 >实现一个增删改查系统的过程

实现一个增删改查系统的过程

时间:2024-11-19 20:58:26浏览次数:1  
标签:const String boot 系统 value plan 增删 end 改查

今天讲一下做一个增删改查系统的具体过程,案例为之前发布的随笔,企业erp生产管理系统。

要完成整个系统的前端后端流程,配置系统环境是必不可少的,比如,我用到的环境有:

语言环境:Java1.8

数据库:mysql8.0

用到的数据库图形化软件:Navicat

由于项目是基于的SpingBoot,用到了Maven框架,用起来很方便

这些都可以在B站搜到配置教程,这些都配置好了就可以创建一个基于Springboot的项目,如下图

创建好以后,需要配置一下pom文件,一般有一个现成的项目就可以直接拿过来复制粘贴用了,下面是我的这个项目的pom代码,springboot的版本一定要对应自己的数据库,第一次配置会下载一段时间

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.8</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>ProductionPlan</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>ProductionPlan</name>
    <description>ProductionPlan</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>org.mybatis.spring.boot</groupId>-->
<!--            <artifactId>mybatis-spring-boot-starter-test</artifactId>-->
<!--            <version>3.0.3</version>-->
<!--            <scope>test</scope>-->
<!--        </dependency>-->
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置好pom文件加载成功后,才可以正常运行,然后按照要求创建数据库和字表信息,用navicat可以直接配置,也可以直接在idea中测试链接mysql,如图

 

 然后按照表中的数据写对应的dao层代码,尽量与数据库中的表对应,再编写getter setter toString方法,这里可以用到快捷键Alt+Insert快速编写 很方便

 同时写一个Result记录响应后端能否接收数据,写相应成功和失败的函数,这里代码比较固定,Select类负责封装根据数据库中所含字段的函数

接下来写Bean层代码,一般用到Mapper接口和其镜像用起来很方便,在里面编写数据库增删改查语句,以调用数据库,如下是新增sql语句,每写一个语句在下面写后端数据的对应方法,注意调用函数的返回值要对应,比如新增的返回值为空就为Void,而查询的语句返回值需为整体Plan

@Insert("INSERT INTO product_plan(id, name, overview, productway, begin, end, technology) VALUES(#{id},#{name},#{overview},#{productway},#{begin},#{end},#{technology})")
    void insert(String id, String name, String overview, String productway, LocalDateTime begin, LocalDateTime end, String technology);

接下来需要编写接受前端数据的代码,也就是控制层,这里需要配置一个网页链接 创建一个逻辑访问层的对象, 并用这个对象处理接收的数据,增加用Post,删除Delete,修改用Put,查看用Get.,这里也比较通用,需要用到

@Autowired来自动装载对象
@RequestMapping("/plan")用来定位网页的地址

新增的举例
    //增加
    @PostMapping("/add")
    public Result addPlan(@RequestBody Plan plan) {
        try {
            System.out.println(plan);
            planService.addPlan(plan);
            return Result.success(plan);
        } catch (Exception e) {
            e.printStackTrace(); // 输出异常信息到控制台
            throw e; // 抛出异常以查看更多详细信息
        }
    }

这里需要调用逻辑访问层的新增代码,所以需要写Service层写对数据处理(增删改查)的函数方法,供给控制层调用处理前端接收的数据

Service层需要创建一个自动封装的Mapper对象,用这个对象写函数方便调用,如新增

 @Autowired
    private PlanMapper planMapper;

    //增加
    public void addPlan(Plan plan) {
        String id = plan.getId();
        String name = plan.getName();
        String overview = plan.getOverview();
        String productway = plan.getProductway();
        LocalDateTime begin = plan.getBegin();
        LocalDateTime end = plan.getEnd();
        String technology = String.join(",", plan.getTechnology());
        planMapper.insert(id, name, overview, productway, begin, end, technology);
    }

这里分别用到了dao层代码的各种get方法,实现了函数多层调用,最后用到了mapper层写的insert新增方法将新增的信息添加到数据库中,到这里后端的新增方法也就写的差不多了,但是还需要写前端的页面进行交互,

前端新增页面代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>新增生产计划</title>
    <style>
        body {
            font-family: Arial, sans-serif;
        }

        #root {
            margin: 20px;
        }

        h2 {
            font-size: 18px;
            margin-bottom: 10px;
        }

        label {
            display: block;
            margin-bottom: 5px;
        }

        input, select {
            width: 300px;
            padding: 5px;
            font-size: 16px;
        }

        button {
            display: block;
            margin-top: 10px;
            padding: 10px;
            background-color: #007bff;
            color: #fff;
            border: none;
            border-radius: 3px;
            cursor: pointer;
        }
    </style>
</head>
<body>
<h1 style="text-align: center">新增生产计划</h1>
<div id="root" style="border: 1px solid black">
    <h2>增加生产计划</h2>
    <form id="addForm">
        <label for="planId">计划编号:</label>
        <input type="text" id="planId" name="planId" required oninput="limitInput(this)" maxlength="10">
        <label for="planName">计划名称:</label>
        <input type="text" id="planName" name="planName" required>
        <label for="planOverview">计划概述:</label>
        <input type="number" id="planOverview" name="planOverview">
        <label>排产方式:</label>
        <div id="way">
            <label><input type="radio" name="way" value="串行排产">串行排产</label>
            <label><input type="radio" name="way" value="并行排产">并行排产</label>
            <label><input type="radio" name="way" value="串并行排产">串并行排产</label>
        </div>
        <label for="beginTime">开始时间:</label>
        <input type="datetime-local" id="beginTime" name="beginTime">
        <label for="endTime">结束时间:</label>
        <input type="datetime-local" id="endTime" name="endTime">
        <label>包含工艺:</label>
        <div id="technology">
            <label><input type="checkbox" name="technology" value="锯">锯</label>
            <label><input type="checkbox" name="technology" value="热">热</label>
            <label><input type="checkbox" name="technology" value="车">车</label>
            <label><input type="checkbox" name="technology" value="铣">铣</label>
            <label><input type="checkbox" name="technology" value="钳">钳</label>
            <label><input type="checkbox" name="technology" value="去">去</label>
            <label><input type="checkbox" name="technology" value="珩">珩</label>
            <label><input type="checkbox" name="technology" value="表镀铬">表镀铬</label>
            <label><input type="checkbox" name="technology" value="表喷砂">表喷砂</label>
            <label><input type="checkbox" name="technology" value="综检">综检</label>
            <label><input type="checkbox" name="technology" value="洗">洗</label>
            <label><input type="checkbox" name="technology" value="包">包</label>
            <label><input type="checkbox" name="technology" value="入">入</label>
            <label><input type="checkbox" name="technology" value="装">装</label>
        </div>
        <button type="submit">添加生产计划</button>
    </form>
    <div>
        <a href="index.html">
            <button>返回主界面</button>
        </a>
    </div>
</div>
</body>
<script>
    document.getElementById("addForm").addEventListener("submit", function (event) {
        event.preventDefault();
        const planId = document.getElementById("planId");
        const planName = document.getElementById("planName");
        const planOverview = document.getElementById("planOverview");
        const way = document.querySelectorAll('input[name="way"]');
        let w;

        way.forEach(radio => {
            if (radio.checked) {
                w = radio.value;
                alert(w);
            }
        });
        const begin = document.getElementById("beginTime");
        const end = document.getElementById("endTime");
        const technologies = document.querySelectorAll('input[name="technology"]:checked');
        const teList = [];
        for (const t of technologies) {
            teList.push(t.value);
        }
        fetch('plan/add',
            {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({
                    id: planId.value,
                    name: planName.value,
                    overview: planOverview.value,
                    productway: w,
                    begin: begin.value,
                    end: end.value,
                    technology: teList,
                })
            })
            .then(res => res.json())
            .then(data => {
                if (data.msg === 'success') {
                    alert("添加成功");
                    console.log(data);
                } else {
                    alert("添加失败  " + data.msg);
                }
            })
            .catch(error => {
                alert("请求失败,请重试");
                console.error(error);
            });
    });
</script>
<script>
    function limitInput(input) {
        const value = input.value;
        if (value.length > 10) {
            input.value = value.slice(0, 10);
        }
        if (value.length < 10) {
            input.setCustomValidity('计划编号前八位必须为年月份后两位为编号');
        } else {
            input.setCustomValidity('');
        }
    }
</script>
</html>

这里比较重要的是

fetch('plan/add',
            {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({
                    id: planId.value,
                    name: planName.value,
                    overview: planOverview.value,
                    productway: w,
                    begin: begin.value,
                    end: end.value,
                    technology: teList,
                })
            })
            .then(res => res.json())
            .then(data => {
                if (data.msg === 'success') {
                    alert("添加成功");
                    console.log(data);
                } else {
                    alert("添加失败  " + data.msg);
                }
            })
            .catch(error => {
                alert("请求失败,请重试");
                console.error(error);
            });

这里需要对页面上显示的数据进行一个接收并以josn的数据形式存在,以便于后端controller层进行调用时查到数据,正是后端用到了@PostMapping("/add")和 @RequestBody才能成功接受到数据,@RequestBody主要用来接收前端传递给后端的json字符串中的数据的至此一个简单的增删改查中的新增也就做好了,增删改查基本上是一个道理,换汤不换药,按照这个逻辑都可以迎刃而解。

标签:const,String,boot,系统,value,plan,增删,end,改查
From: https://www.cnblogs.com/liubaiii/p/18555539

相关文章

  • AI是一个真正的系统而不仅仅是软件
        当AI没有被比作魔法或邪恶实体时,它通常被简化为一个单一的术语:软件。这种简化可能会掩盖构建真正AI系统的复杂性和丰富结构的元素之间的相互作用。尽管我更愿意听到AI被描述为软件,而不是听到关于其意识或自由意志的故事,让我们讨论为什么AI远不止是一段代码。定义AI   ......
  • flask框架儿童认知图文辅助系统(毕设源码+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于儿童认知辅助教育的研究,现有研究主要以传统教学方式为主,如单纯的课本知识传授或简单的动画演示等。专门针对将图文结合并融入学生......
  • 一个基于 .NET 8.0 构建的简单、跨平台、模块化商城系统
    前言今天给大家分享一个基于.NET8.0构建的开源免费(MITLicense)、简单、跨平台、模块化的商城系统:ModuleShop。主要功能销售:订单、物流。内容:首页配置、评论、回复。配置:国家、用户、仓库、运费、高级设置。商品:分类、品牌、单位、选项(销售属性)、属性、属性模板、属性组......
  • 如何解决多系统数据重复与冲突问题?
    多系统并行运作已成为现代企业的常态。企业通常同时使用ERP、CRM、HR等多个业务系统来管理不同的功能模块。然而,这种多系统环境也带来了一个常见且棘手的问题:数据重复与矛盾。由于各系统独立运行且缺乏有效的集成机制,不同系统间的数据容易出现不一致、冗余或冲突的情况。这不仅......
  • 【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
    Linux学习笔记:https://blog.csdn.net/2301_80220607/category_12805278.html?spm=1001.2014.3001.5482前言:在多任务操作系统中,进程优先级是影响任务调度的重要因素之一。操作系统通过设置不同的优先级来控制进程对CPU的使用权,从而实现资源的高效利用和任务的公平分配。本文......
  • 20222408 2024-2025-1 《网络与系统攻防技术》实验五实验报告
    1.实验内容1.1实验要求(1)选择一个DNS域名进行查询,获取如下信息:DNS注册人及联系方式、该域名对应IP地址、IP地址注册人及联系方式、IP地址所在国家、城市和具体地理位置。(2)尝试获取QQ中某一好友的IP地址,并查询获取该好友所在的具体地理位置。(3)使用nmap开源软件对靶机环境进行扫......
  • 基于SpringBoot+Vue的旅游网站管理系统设计与实现毕设(文档+源码)
    目录一、项目介绍二、开发环境三、功能介绍四、核心代码五、效果图六、源码获取:         大家好呀,我是一个混迹在java圈的码农。今天要和大家分享的是一款基于SpringBoot+Vue的旅游网站管理系统,项目源码请点击文章末尾联系我哦~目前有各类成品毕设JavaWeb......
  • 基于SpringBoot+Vue的论坛管理系统设计与实现毕设(文档+源码)
    目录一、项目介绍二、开发环境三、功能介绍四、核心代码五、效果图六、源码获取:         大家好呀,我是一个混迹在java圈的码农。今天要和大家分享的是一款基于SpringBoot+Vue的论坛管理系统,项目源码请点击文章末尾联系我哦~目前有各类成品毕设JavaWeb SSM......
  • 使用SSM框架实现Pet表的增删改查功能效果案例
    1.查询功能@RequestMapping("/index")publicStringindex(Modelmodel){List<Pet>petList=petService.findPetList();model.addAttribute("petList",petList);return"index";}2.修改功能@Re......
  • ll: command not found(同一个系统或项目中不同的用户使用 ll 命令结果不同)
    在Linux系统中,命令行为的差异是常见现象,尤其是当不同用户对相同操作的反馈不一致时:用户A使用ll和ls命令可以查看目录内容。用户B使用ll显示ll:commandnotfound,但ls命令正常工作。  基础概念:ll与ls的区别ls命令:ls是一个标准的Linux系统命......