Spring Boot:Web应用开发之增删改查的实现

news2024/10/5 17:23:36

Spring Boot

  • 前言
  • 实现增删改查功能

在这里插入图片描述

前言

增删改查功能作为 Web 应用中的基础且重要的组成部分,是基本的数据库操作,也是实现业务逻辑和功能的关键要素。下面简单介绍使用 Spring Boot 实现增删改查的功能。

实现增删改查功能

在上一章 Spring Boot:Web应用开发之登录与退出的实现 文章的案例基础上,进行实现增删改查的功能。

简单示例:
首先,创建一个 PublicTemplate.html ,将 html 的公共代码抽离到这页面上,方便其他页面进行复用(使用方式:th:replace=“模版名称::模版⽚段名称”

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>公共页面-抽离与复用</title>
</head>
<body>
    <!-- th:fragment 属性来定义被包含的模版⽚段,以供其他模版使用。模版⽚段名称为 top -->
    <div class="header" th:fragment="header">
        主页面的头部区域
    </div>

    <div class="center">
        <!-- 通用侧边栏区域 -->
        <div class="sidebar" th:fragment="sidebar">
            <!-- 增强效果设置:th:class="${isActive=='Main.html'?'active':''}" 当切换到该页面时,内容设定为 active 的样式 -->
            <a href="#" th:class="${isActive=='Main.html'?'active':''}" th:href="@{Main.html}">主页</a> <br>
            <a href="#" th:class="${isActive=='UserList.html'?'active':''}" th:href="@{UserList.html}">用户列表</a> <br>
            <a th:href="@{/logout.html}">退出</a>
        </div>
    </div>

    <div class="footer" th:fragment="footer">
        主页面的脚部区域
    </div>
</body>
</html>

创建需要用到的页面,有公共的代码便使用 th:replace 调用

Main.html:主页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>MainDemo</title>
    <!--  存放 css 文件默认在 static 目录下 -->
    <link rel="stylesheet" type="text/css" th:href="@{/css/PublicCss.css}">
</head>
<body>
    <!-- th:replace 替换整个标签到引入的文件。使用方式——th:replace="模版名称::模版⽚段名称" -->
    <div th:replace="PublicTemplate::header"></div>

    <dic class="center">
        <!-- 增强效果设置:(isActive='Main.html') -->
        <div th:replace="PublicTemplate::sidebar(isActive='Main.html')"></div>

        <div class="main">
            主页面内容
        </div>
    </dic>

    <div th:replace="PublicTemplate::footer"></div>
</body>
</html>

UserList.html:显示用户列表页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>UserListDemo</title>
    <!--  存放 css 文件默认在 static 目录下 -->
    <link rel="stylesheet" type="text/css" th:href="@{/css/PublicCss.css}">
</head>
<body>
    <!-- th:replace 替换整个标签到引入的文件。使用方式——th:replace="模版名称::模版⽚段名称" -->
    <div th:replace="PublicTemplate::header"></div>

    <dic class="center">
        <div th:replace="PublicTemplate::sidebar(isActive='UserList.html')"></div>

        <div class="main">
            <form th:action="UserSearch.html" method="post">
                <input type="text" name="searchByUsername" />
                <input type="submit" value="查询" />
                <a th:href="@{/UserAdd.html}">添加</a>
            </form>
            <table>
                <tr>
                    <td>id</td>
                    <td>账号</td>
                    <td>密码</td>
                    <td>注册时间</td>
                    <td>地址</td>
                    <td>操作</td>
                </tr>

                <tr th:each="user:${users}">
                    <td th:text="${user.id}"></td>
                    <td th:text="${user.username}"></td>
                    <td th:text="${user.password}"></td>
                    <td th:text="${user.regDate}"></td>
                    <td th:text="${user.address}"></td>

                    <td>
                        <a th:href="@{/UserDelete.html(id=${user.id})}" onclick="return confirm('确定要删除吗?')">删除</a>
                        <a th:href="@{/UserUpdate.html(id=${user.id})}">修改</a>
                    </td>
                </tr>
            </table>
        </div>
    </dic>

    <div th:replace="PublicTemplate::footer"></div>
    </body>
</html>

UserAdd.html:添加用户页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>UserAddDemo</title>
</head>
<body>
    <form th:action="@{/UserAdd.html}" method="post">
        账号:<input type="text" name="username"/> <br>
        密码:<input type="text" name="password"/> <br>
        地址:
        <select name="address.id">
            <option th:value="${address.id}" th:each="address:${addresses}">[[${address.addressInfo}]]</option>
        </select> <br>

        <input type="submit" th:value="添加">
    </form>
</body>
</html>

UserUpdate.html:修改用户页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>UserUpdateDemo</title>
</head>
<body>
    <div class="main">
        <form th:action="@{/UserUpdate.html}" method="post">
            <input type="hidden" name="id" th:value="${user.id}">
            账号:<input type="text" name="username" th:value="${user.username}"/> <br>
            密码:<input type="text" name="password" th:value="${user.password}"/> <br>
            注册时间:<input type="text" name="regDate" th:value="${#dates.format(user.regDate,'yyyy-MM-dd HH:mm:ss')}"/> <br>
            地址:
            <select name="address.id">
                <option th:value="${address.id}" th:selected="${user.address.id == address.id}" th:each="address:${addresses}">[[${address.addressInfo}]]</option>
            </select> <br>

            <input type="submit" th:value="修改">
        </form>
    </div>
</body>
</html>

然后,在 User 实体类上使用 @DateTimeFormat 注解指定日期样式(否则在修改注册时间时,会出现类型转换问题),再创建一个 Address 类
在这里插入图片描述

package cn.edu.SpringBootWebDemo.Entity;

import jakarta.persistence.*;

@Entity
@Table(name = "address")
public class Address {
    private int id;
    private String addressInfo; // 地址详情

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 自增
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column(name = "address_info") // 指定字段名
    public String getAddressInfo() {
        return addressInfo;
    }

    public void setAddressInfo(String addressInfo) {
        this.addressInfo = addressInfo;
    }

    @Override
    public String toString() {
        return "Address{" +
                "id=" + id +
                ", addressInfo='" + addressInfo + '\'' +
                '}';
    }
}

随之,在 UserDao 接口上声明一个模糊查询方法,在 AddressDao 接口上直接继承 JpaRepository<实体类,主键类型> 即可
在这里插入图片描述
在这里插入图片描述

接着,在 Service 包内创建一个 UserService 接口,声明增删改查方法,并创建一个 UserServiceImpl 实现类实现该接口方法; AddressService 接口与 AddressServiceImpl 实现类同理

UserService 接口:

package cn.edu.SpringBootWebDemo.Service;

import cn.edu.SpringBootWebDemo.Entity.User;

import java.util.List;

public interface UserService {
    public User login(User user);

    //增删改查
    public void add(User user);

    public void delete(int id);

    public void update(User user);

    public User get(int id);

    public List<User> getALLUsers();

    public List<User> getByUsernameLike(String string);
}

UserServiceImpl 实现类:

package cn.edu.SpringBootWebDemo.Service;

import cn.edu.SpringBootWebDemo.Dao.UserDao;
import cn.edu.SpringBootWebDemo.Entity.User;
import jakarta.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service("userService")
@Transactional // 放在类上,类上的所有方法都支持事务;也可以只放在一个方法上,只指定那个方法支持事务
public class UserServiceImpl implements UserService{

    @Autowired
    private UserDao userDao;

    @Override
    public User login(User user) {
        // 根据用户名查询有没有对应的账号
        User user1 = userDao.getByUsername(user.getUsername());
        // 判断是否为空或密码错误,登录失败返回 null
        if (user1 == null) return null;
        if(!user1.getPassword().equals(user.getPassword())) return null;
        // 返回 User 对象,登录成功
        return user1;
    }

    @Override
    public void add(User user) {
        userDao.save(user);
    }

    @Override
    public void delete(int id) {
        userDao.deleteById(id);
    }

    @Override
    public void update(User user) {
        userDao.saveAndFlush(user);
    }

    @Override
    public User get(int id) {
        return userDao.findById(id).get();
    }

    @Override
    public List<User> getALLUsers() {
        return userDao.findAll();
    }

    @Override
    public List<User> getByUsernameLike(String string) {
        return userDao.getByUsernameLike(string);
    }
}

AddressService 接口:

package cn.edu.SpringBootWebDemo.Service;

import cn.edu.SpringBootWebDemo.Entity.Address;

import java.util.List;

public interface AddressService {
    public void add(Address address);

    public void delete(int id);

    public void update(Address address);

    public Address get(int id);

    public List<Address> getAllAddress();
}

AddressServiceImpl 实现类:

package cn.edu.SpringBootWebDemo.Service;

import cn.edu.SpringBootWebDemo.Dao.AddressDao;
import cn.edu.SpringBootWebDemo.Entity.Address;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class AddressServiceImpl implements AddressService{
   @Autowired
    private AddressDao addressDao;

    @Override
    public void add(Address address) {
        addressDao.save(address);
    }

    @Override
    public void delete(int id) {
        addressDao.deleteById(id);
    }

    @Override
    public void update(Address address) {
        addressDao.saveAndFlush(address);
    }

    @Override
    public Address get(int id) {
        return addressDao.findById(id).get();
    }

    @Override
    public List<Address> getAllAddress() {
        return addressDao.findAll();
    }
}

再在 Controller 包内的 UserController 控制类上处理用户相关的 HTTP 请求

package cn.edu.SpringBootWebDemo.Controller;

import cn.edu.SpringBootWebDemo.Entity.Address;
import cn.edu.SpringBootWebDemo.Entity.User;
import cn.edu.SpringBootWebDemo.Service.AddressService;
import cn.edu.SpringBootWebDemo.Service.UserService;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import java.util.Date;
import java.util.List;

@Controller
public class UserController {

    @Autowired
    private UserService userService;
    @Autowired
    private AddressService addressService;

    @GetMapping("/Login.html")
    public String login(HttpSession httpSession){
        // 成功登录后不能再返回登录页面,而是跳转到主页
        boolean flag = httpSession.getAttribute("loginUser")==null?true:false;
        if (flag){
            return "Login";
        }else {
            return "redirect:/Main.html";
        }
    }

    @GetMapping("/Main.html")
    public String main(){
        return "Main";
    }

    // 判断登录
    @PostMapping("/Login.html")
    public String login(User user, HttpSession httpSession, Model model){
        // 控制层——接受页面的账号和密码。调用服务层的 login 方法,判断登录是否成功。
        // 成功将返回的 user 对象保存到 session 的域空间;反之返回一个错误提示。
        User user1 = userService.login(user);
        if(user1 != null) {
            // 将返回的 user 对象保存到 session 的域空间,页面跳转到主页中
            httpSession.setAttribute("loginUser",user1);
            return "redirect:/Main.html";
        }else {
            // 登录失败,返回错误提示
            model.addAttribute("loginError","用户名或密码错误!");
            return "Login";
        }
    }

    // 退出
    @GetMapping("/logout.html")
    public String logout(HttpSession httpSession){
        // 通过 invalidate 方法清空 httpSession 里的内容
        httpSession.invalidate();
        return "redirect:/Login.html";
    }

    // 显示用户
    @GetMapping("/UserList.html")
    public String userlist(Model model){
        List<User> users = userService.getALLUsers();
        model.addAttribute("users",users);
        System.out.println(users);
        return "UserList";
    }

    // 模糊查询用户
    @PostMapping("/UserSearch.html")
    // 接受的参数,searchByUsername 名字与页面 input 标签的 name 属性值一致
    public String userSearch(String searchByUsername,Model model){
        List<User> users = userService.getByUsernameLike("%" + searchByUsername + "%");
        model.addAttribute("users",users);
        return "UserList";
    }

    // 先获取所有的地址信息,再进行添加用户
    @GetMapping("/UserAdd.html")
    public String addUser(Model model){
        List<Address> addresses = addressService.getAllAddress();
        model.addAttribute("addresses",addresses);
        return "UserAdd";
    }
    @PostMapping("/UserAdd.html")
    public String addUser(User user){
        user.setRegDate(new Date());
        userService.add(user);
        return "redirect:/UserList.html";
    }

    // 修改实现:1.点击修改按钮,打开修改页面
    @GetMapping("/UserUpdate.html")
    public String updateUser(Model model,Integer id){
        // 获取指定用户信息
        User user = userService.get(id);
        model.addAttribute("user",user);
        // 获取指定地址信息
        List<Address> addresses = addressService.getAllAddress();
        model.addAttribute("addresses",addresses);
        return "UserUpdate";
    }
    // 2.修改实现
    @PostMapping("/UserUpdate.html")
    public String updateUserAchieve(User user){
        userService.update(user);
        return "redirect:/UserList.html";
    }

    // 删除用户
    @GetMapping("/UserDelete.html")
    public String deleteUser(Integer id){
        userService.delete(id);
        return "redirect:/UserList.html";
    }
}

最后,在 SpringBootWebDemoApplication 启动类上使用 @EnableTransactionManagement 注解开启事务,并启动 Spring Boot 进行测试

package cn.edu.SpringBootWebDemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

@EnableTransactionManagement // 开启事务
@SpringBootApplication
public class SpringBootWebDemoApplication {
    // 获取事务管理器类型
//    @Bean
//    public Object testBean(PlatformTransactionManager platformTransactionManager){
//        System.out.println("事务管理器类型:" + platformTransactionManager.getClass().getName());
//        return new Object();
//    }

    // 指定事务管理器,设置后会覆盖默认的事务管理器
//    @Bean
//    public PlatformTransactionManager manager(DataSource dataSource){
//        return new DataSourceTransactionManager(dataSource);
//    }

    public static void main(String[] args) {
        SpringApplication.run(SpringBootWebDemoApplication.class, args);
    }

}

结果如图:
1.登录,进入主页
在这里插入图片描述

2.点击用户列表,进入显示用户列表页面
在这里插入图片描述

3.在显示用户列表页面上,进行模糊查询,输入 “刘” 点击查询
在这里插入图片描述
模糊查询结果:
在这里插入图片描述

4.在显示用户列表页面上,点击添加,进入添加页面,输入用户信息,点击添加用户
在这里插入图片描述
添加用户结果:
在这里插入图片描述

5.在显示用户列表页面上,点击修改,进入修改页面,修改用户信息,点击修改用户
在这里插入图片描述
修改用户结果:
在这里插入图片描述

6.在显示用户列表页面上,点击删除,弹出确认窗口,点击确定
在这里插入图片描述
删除用户结果:
在这里插入图片描述

Web 应用开发案例中的主要目录结构:
在这里插入图片描述

PublicCss.css:设置页面样式的文本文件

body{
    background-image: url("../img/background-image.png");
    background-attachment: fixed;
    background-size: cover;
    background-repeat: no-repeat;
}

.header{
    text-align: center;
    height: 90px;
    line-height: 90px;
    width: 100%;
    border: 2px black solid;
}

.center{
    width: 100%;
    height: 450px;
}

.center .sidebar{
    width: 120px;
    height: 550px;
    float: left;
    border: 2px black solid;
}

.center .main{
    width: 100%;
    height: 550px;
    border: 2px black solid;
}

table{
    border-collapse: collapse;
}

th, td {
    border: 1px silver solid;
    padding: 0.3em 1em;
}

.footer{
    text-align: center;
    height: 90px;
    line-height: 90px;
    width: 100%;
    border: 2px black solid;
}

/* 增强效果设置 */
.active{
    color: darkturquoise;
    text-decoration: none;
}

background-image.png:页面背景图片
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1619423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无人机+光电吊舱:4K AI 180倍混合变焦吊舱技术详解

无人机搭载吊舱是一种常见的配置方式&#xff0c;吊舱可以装载不同的设备&#xff0c;以满足不同的任务需求。吊舱通常挂载在无人机的下方或侧面&#xff0c;可以根据需要进行调整。 随着无人机技术的飞速进步&#xff0c;4K AI 180倍混合变焦吊舱技术的出现&#xff0c;将无人…

ADC内部运行原理

1以一个简单的外置ADC为例讲解 1在外部由地址锁存和译码经行去控制通道选择开关//去控制外部那一条IO口输入&#xff0c;输入到比较器 2逐次逼近寄存器SAR每次从三态锁存缓冲器读取值在由DAC&#xff08;数模转换成模拟电压&#xff09;在输入到比较器当io信号和DAC信号几乎一样…

半导体存储器整理

半导体存储器用来存储大量的二值数据&#xff0c;它是计算机等大型数字系统中不可缺少的组成部分。按照集成度划分&#xff0c;半导体存储器属于大规模集成电路。 目前半导体存储器可以分为两大类&#xff1a; 只读存储器&#xff08;ROM&#xff0c;Read Only Memory&#xff…

StarRocks最佳实践经验

目录 一、部署 1.1 容量规划 1.2 基础环境配置 1.3 机器配置 1.3.1 FE节点 1.3.2 BE节点 1.4 部署方案 二、建模 2.1 建表规范 2.2 模型选择 2.3 排序列和前缀索引选择 2.4 分区选择 2.5 分桶选择 2.6 字段类型 2.7 索引选择 2.7.1 Bitmap索引 2.7.2 Bloom fi…

微电子领域常见概念(七)晶格匹配

微电子领域常见概念&#xff08;七&#xff09;晶格匹配 晶格匹配 晶格匹配&#xff08;Lattice Matching&#xff09;是半导体物理学中的一个概念&#xff0c;主要应用于异质结构的外延生长技术。在半导体器件制造中&#xff0c;异质结构是指在一种半导体材料上生长另一种半导…

Centos7 大数据组件安装

Java 安装 下载JDK 查看Linux 服务区的操作系统位数,下载适合的JKD安装包 [rootmaster ~]# getconf LONG_BIT 64下载jdk-8u361 解压安装JDK tar -zxvf jdk-8u361-linux-x64.tar.gz -C /usr/local添加JAVA 环境变量 执行命令 vi ~/.bash_profile 在~/.bash_profile文件中增…

Linux系统编程——进程

一、进程相关概念 面试中关于进程&#xff0c;应该会问的的几个问题&#xff1a; 1.1 什么是程序&#xff1f;什么是进程&#xff1f;有什么区别&#xff1f; 程序是静态的概念&#xff0c;比如&#xff1a; 磁盘中生成的a.out文件&#xff0c;就叫做&#xff1a;程序 进程…

记录一下用MobaXterm建立隧道的配置

【为什么要建立隧道】 在公司环境中&#xff0c;我们通过本地Windows机器没法直接访问公司的服务器&#xff08;安全考虑&#xff0c;都装了防火墙&#xff09;&#xff0c;要访问公司服务器的通常做法是&#xff0c;在本机安装个代理插件&#xff08;如Proxy SwitchyOmega&am…

维基百科、百度百科和搜狗百科词条的创建流程

随着网络的发展&#xff0c;百度百科、搜狗百科、维基百科等百科网站已经成为大众获取知识的重要途径。因为百科具有得天独厚的平台优势&#xff0c;百科上的信息可信度高&#xff0c;权威性强。所以百科平台也成为商家的必争之地。这里小马识途聊聊如何创建百度百科、搜狗百科…

网络安全之CSRFSSRF漏洞(上篇)(技术进阶)

目录 一&#xff0c;CSRF篇 二&#xff0c;认识什么是CSRF 三&#xff0c;实现CSRF攻击的前提 四&#xff0c;实战演练 【1】案例1 【2】案例2 【3】案例3 【4】案例4&#xff08;metinfo&#xff09; 一&#xff0c;CSRF篇 二&#xff0c;认识什么是CSRF CSRF&#x…

coredns部署

coredns部署 coredns部署 一&#xff1a;coredns-rbac.yaml apiVersion: v1 kind: ServiceAccount metadata:name: corednsnamespace: kube-systemlabels:kubernetes.io/cluster-service: "true"addonmanager.kubernetes.io/mode: Reconcile --- apiVersion: rbac…

NXP恩智浦 S32G电源管理芯片 VR5510 安全概念 Safety Concept (万字长文详解,配21张彩图)

NXP恩智浦 S32G电源管理芯片 VR5510 安全概念 Safety Concept (万字长文详解&#xff0c;配21张彩图) 1. 简介 本应用笔记描述了与S32G处理器和VR5510 PMIC相关的安全概念。该文档涵盖了S32G和VR5510的安全功能以及它们如何相互作用&#xff0c;以确保对ASIL D安全完整性级别…

I2C,UART,SPI(STM32、51单片机)

目录 基本理论知识&#xff1a; 并行通信/串行通信&#xff1a; 异步通信/同步通信&#xff1a; 半双工通信/全双工通信: UART串口&#xff1a; I2C串口&#xff1a; SPI串口&#xff1a; I2C在单片机中的应用&#xff1a; 软件模拟&#xff1a; 51单片机&#xff1a;…

【计算机网络】(三)物理层 - 通信基础

文章目录 【计算机网络】&#xff08;三&#xff09;物理层 - 通信基础前言3.1 物理层的基本概念3.2 数据通信的基础知识3.2.1 数据、信号、码元3.2.2 信源、信宿、信道3.2.3 编码、调制3.2.3.1 基带调制&#xff08;编码&#xff09;3.2.3.2 带通调制&#xff08;调制&#xf…

视频改字祝福 豪车装X系统源码uniapp前端源码

uniapp视频改字祝福 豪车装X系统源码 全开源,只有uniapp前端,API接口需要寻找对应的。 创意无限!AI视频改字祝福,豪车装X系统源码开源,打造个性化祝福视频不再难! 想要为你的朋友或家人送上一份特别的祝福,让他们感受到你的真诚与关怀吗?现在, 通过开源的AI视频改字…

智慧园区引领产业智慧化:深入探索智慧技术如何点亮园区创新发展之路,构建未来产业生态圈,驱动区域经济持续升级

目录 一、引言 二、智慧园区的内涵与特征 三、智慧技术点亮园区创新发展之路 1、智慧技术推动产业转型升级 2、智慧技术促进新兴产业发展 3、智慧技术提升园区创新能力 四、智慧园区在产业智慧化中的作用与价值 1、优化资源配置&#xff0c;提高经济效益 2、提升服务品…

Meta和多表继承,继承与反向关系

1. Meta和多表继承 在Django模型多表继承中&#xff0c;子类不会继承父类中的Meta类。所有的Meta类属性已被应用至父类&#xff0c;在子类中再次应用则会导致行为冲突。因此&#xff0c;子类模型无法访问父类中的Meta类。 不过也有例外情况&#xff0c;若子类未指定ordering属…

单片机使用循环来实现延时和定时器延时的区别是什么?

循环延时是一种简单的实现方式&#xff0c;但由于资源占用和精确度的限制。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频 讲解&#xff0c;项目实战。如果你渴望学习嵌入式&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在…

FPGA秋招-笔记整理(2)

一、数字IC前端设计的主要流程 参考&#xff1a;数字IC前端设计流程及工具【RTL设计功能仿真】【综合】【DFT】【形式验证】【STA静态时序分析】 以门级网表&#xff08;Netlist&#xff09;的生成为界限&#xff0c;将整个流程分为前端和后端。 布局布线之前可以认为是前端…

sudo的设置

sudo指令就是提高你的用户权限&#xff0c;用来完成root可以完成的工作&#xff0c;但是有一个前提&#xff0c;就是被root添加到信任名单中&#xff0c;接下来我们要讲解如何在root中添加用户到信任名单中。 在root中输入指令&#xff1a; 即可到达添加信用列表的位置&#x…