ElementUI——案例2用户管理(基于SpringBoot实现增删改)

news2024/11/14 11:45:36

1.ElementUI整合SpringBoot前后端分离实现用户增删改查

效果展示
在这里插入图片描述

在这里插入图片描述

2.前端核心代码

项目目录
在这里插入图片描述

main.js引入

import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import router from './router'
import axios from 'axios'

Vue.prototype.$http = axios
Vue.config.productionTip = false
Vue.use(ElementUI);

App.vue

<template>
  <div id="app">
    <el-container>
      <el-header>
          <!--导航菜单-->
          <el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" @select="handleSelect">
              <el-menu-item index="/index">主页</el-menu-item></el-menu-item>
              <el-menu-item index="/userslist">用户管理</el-menu-item></el-menu-item></el-menu-item>
              <el-menu-item index="/mags">消息中心</el-menu-item>
              <el-menu-item index="/orders">订单管理</el-menu-item>
            </el-menu>
      </el-header>
      <el-main>
          <!-- 路由组件 -->
          <router-view/>
      </el-main>
    </el-container>
  </div>
</template>
<script>
export default {
  name: 'App',
  data() {
      return {
        activeIndex: this.$route.path,//获取当前路由路径,解决刷新网页报错问题
      };
    },
    methods: {
      handleSelect(key, keyPath) {
        console.log(key, keyPath);
        // 切换路由
        this.$router.push(key);
      }
    }
}
</script>
<style></style>

路由router目录下index.js

import Vue from 'vue'
import Router from 'vue-router'
import Index from '../components/Index'
import List from '../components/user/List'
Vue.use(Router)

export default new Router({
  routes: [
  {
    path:'/',//配置根路由
    component:Index
  },
    {
      path: '/index',
      component: Index
    },
    {
      path:'/userslist',
      component:List
    }
  ]
})

用户管理页面List.vue(前端核心增删改查业务)

<template lang="">
    <div>
        <el-table
    :data="tableData.filter(data => !search || data.name.toLowerCase().includes(search.toLowerCase()))"
    border
    :height="300"
    style="width: 100%">
    <el-table-column
      fixed
      prop="id"
      label="编号"
      width="150">
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名"
      width="120">
    </el-table-column>
    <el-table-column
      prop="birth"
      label="生日"
      width="120">
    </el-table-column>
    <el-table-column
      prop="address"
      label="地址"
      width="300">
    </el-table-column>
    <el-table-column
      prop="sex"
      label="性别"
      width="120">
    </el-table-column>
    <el-table-column
      fixed="right"
      width="200">
      <template slot="header" slot-scope="scope">
        <el-input
          v-model="search"
          size="mini"
          placeholder="输入关键字搜索"/>
      </template>
      <template slot-scope="scope">
        <el-button
          size="mini"
          @click="editUser(scope.$index, scope.row)">编辑</el-button>
          <el-popconfirm
            confirm-button-text='好的'
            cancel-button-text='不用了'
            icon="el-icon-info"
            icon-color="red"
            title="确定删除吗?"
            @confirm="handleDelete(scope.$index, scope.row)"
          >
        <el-button
          size="mini"
          type="danger"
          slot="reference">删除</el-button>
        </el-popconfirm>
      </template>
    </el-table-column>
  </el-table>
  <!-- 表格分页导航开始 -->
  <el-row>
    <el-col :span="8" :offset="6">
      <el-pagination style="margin: 10px 0px;"
      prev-text="上一页"
      next-text="下一页"
      layout="prev, pager, next , jumper , total , sizes"
      background
      :page-size="size"
      :current-page="pageNow"
      :page-sizes="[2,4,8,12,16,20]"
      @current-change="findPage"
      @size-change="findSize"
      :total="totals">
    </el-pagination>
    </el-col>
  </el-row>
  <!-- 表格分页导航结束 -->
  <el-button style="margin-top: 10px;" type="success" size="mini" @click="show = !show">添加</el-button>
<!-- 添加表单开始 -->
  <transition name="el-fade-in-linear">
    <div v-show="show" class="transition-box">
        <el-form ref="form" :model="form" label-width="80px" label-suffix=":">
            <el-form-item label="姓名">
              <el-input v-model="form.name"></el-input>
            </el-form-item>
            </el-form-item>
            <el-form-item label="生日">
                <el-date-picker value-format="yyyy-MM-dd" type="date" placeholder="选择日期" v-model="form.birth" style="width: 100%;"></el-date-picker>
            </el-form-item>
            <el-form-item label="性别">
              <el-radio-group v-model="form.sex">
                <el-radio label="男"></el-radio>
                <el-radio label="女"></el-radio>
              </el-radio-group>
            </el-form-item>
            <el-form-item label="地址">
              <el-input type="textarea" v-model="form.address"></el-input>
            </el-form-item>
            <el-form-item>
              <el-button type="primary" @click="onSubmit">保存信息</el-button></el-button>
              <el-button @click="show = false">取消</el-button>
            </el-form-item>
          </el-form>
    </div>
  </transition>
  <!-- 添加表单结束 -->
  <!-- 对话框开始 -->
  <el-dialog title="修改用户信息" :visible.sync="dialogFormVisible">
    <el-form  :hide-required-asterisk="false" :rules="rules" ref="userForm" :model="form" label-width="80px" label-suffix=":">
      <el-form-item label="姓名" prop="name">
        <el-input v-model="form.name"></el-input>
      </el-form-item>
      </el-form-item>
      <el-form-item label="生日" prop="birth">
          <el-date-picker type="date" placeholder="选择日期" v-model="form.birth" style="width: 100%;"></el-date-picker>
      </el-form-item>
      <el-form-item label="性别">
        <el-radio-group v-model="form.sex">
          <el-radio label="男"></el-radio>
          <el-radio label="女"></el-radio>
        </el-radio-group>
      </el-form-item>
      <el-form-item label="地址" prop="address">
        <el-input type="textarea" v-model="form.address"></el-input>
      </el-form-item>
    </el-form>
    <div slot="footer" class="dialog-footer">
      <el-button @click="dialogFormVisible = false">取 消</el-button>
      <el-button type="primary" @click="update('userForm')">确 定</el-button>
    </div>
  </el-dialog>
  <!-- 对话框结束 -->
    </div>
</template>
<script>
export default {
    methods: {
      findSize(size){//用来处理每页显示记录发生变化的方法
        this.size = size
        this.findAllTableData(this.page,size)
      },
      findPage(page){//用来处理分页相关方法
          this.page=page
          this.findAllTableData(page,this.size)
      },
      editUser(index,row){
        this.dialogFormVisible=true
        this.$http("http://localhost:8989/user/findUserById?id="+row.id).then(res=>{
          this.form = res.data;
        })
      },
      update(userForm){
        //添加表单验证
        this.$refs[userForm].validate((valid) => {
          if (valid) {
            //验证通过发送更新请求
            //发送一个axios请求
            this.$http.post("http://localhost:8989/user/saveUserById",this.form).then(res=>{
                if(res.data.status){
                    this.$message({
                    message: res.data.msg,
                    type: 'success'
                    });
                    //关闭对话框
                    this.dialogFormVisible=false
                    //添加成功以后还要清空表单信息
                    this.form={}
                    //调用查询数据方法,重新渲染数据
                    this.findAllTableData();
                }else{
                    this.$message.error(res.data.msg);
                }
            })
          } else {
            this.$message.error("用户数据不合法");
            return false;
          }
        });
       
      },
      handleDelete(index, row) {
        console.log(index, row);
        //发送删除接口
        this.$http.get("http://localhost:8989/user/deleteUserById?id="+row.id).then(res=>{
          if(res.status){
            this.$message({
                message: res.data.msg,
                type: 'success'
                });
                //刷新表格数据
                this.findAllTableData();
          }else{
            this.$message.error(res.data.msg);
          }
        })
      },
      onSubmit() {
        console.log('submit!');
        //发送一个axios请求
        this.$http.post("http://localhost:8989/user/save",this.form).then(res=>{
            if(res.data.status){
                this.$message({
                message: '恭喜你,'+res.data.msg,
                type: 'success'
                });
                //添加成功以后还要清空表单信息
                this.form={}
                //隐藏表单
                this.show=false
                //调用查询数据方法,重新渲染数据
                this.findAllTableData();
            }else{
                this.$message.error(res.data.msg);
            }
            
        })
      },
      findAllTableData(page,size){
        //处理page参数初始化问题
        page = page?page:this.pageNow;
        size = size?size:this.size;
        this.$http.get("http://localhost:8989/user/findByPage?pageNow="+page+"&pageSize="+size).then(res=>{
            //回调中获取响应结果
            console.log(res)
            this.tableData = res.data.users;
            this.totals = res.data.total;
        })
      }
    },
    data() {
      return {
        tableData: [],
        search: '',
        show: true,
        form: {
          id:'',
          name: '',
          birth:'',
          sex:'男',
          address:''
        },
        dialogFormVisible: false,
        rules: {
          name: [
            { required: true, message: '请输入用户姓名!', trigger: 'blur' }
          ],
          birth: [
            { required: true, message: '请输入用户出生年月!', trigger: 'blur' }
          ],
          address: [
            { required: true, message: '请输入用户地址!', trigger: 'blur' }
          ],
        },
        //分页相关参数
        totals:0,
        size:4,
        pageNow:1
      }
    },
    created() {
        this.findAllTableData();
    },
}
</script>
<style lang="">
    .transition-box {
    margin-bottom: 10px;
    width: 100%;
    height: 600px;
    border-radius: 4px;
    color: #fff;
    padding: 40px 20px;
    box-sizing: border-box;
    margin-right: 20px;
  }
</style>

3.后端核心代码

项目架构如下
在这里插入图片描述
数据库sql

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_users
-- ----------------------------
DROP TABLE IF EXISTS `t_users`;
CREATE TABLE `t_users`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `name` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `birth` timestamp(0) NULL DEFAULT NULL,
  `sex` varchar(4) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `address` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_users
-- ----------------------------
INSERT INTO `t_users` VALUES (1, 'b0', '2023-01-02 08:00:00', '男', '成都');
INSERT INTO `t_users` VALUES (2, 'kuku', '2023-01-01 22:59:08', '男', '四川');
INSERT INTO `t_users` VALUES (3, 'b0', '2023-01-09 08:00:00', '男', '自贡');
INSERT INTO `t_users` VALUES (9, 'kuku', '2023-01-10 08:00:00', '男', 'hello');
INSERT INTO `t_users` VALUES (10, 'sadas', '2023-01-09 08:00:00', '女', 'asdasd');
INSERT INTO `t_users` VALUES (11, 'asdasd', '2023-01-29 08:00:00', '女', 'asdasd');
INSERT INTO `t_users` VALUES (12, 'asdasd', '2023-01-12 08:00:00', '女', 'asdasd');
INSERT INTO `t_users` VALUES (13, '12321', '2023-01-27 08:00:00', '男', '1231231');
INSERT INTO `t_users` VALUES (14, '123123', '2023-01-24 08:00:00', '男', '123123');

SET FOREIGN_KEY_CHECKS = 1;

配置文件

server:
  port: 8989
spring:
  application:
    name: elementusers
  devtools:
    remote:
      context-path: /
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/elementusers?characterEncoding=UTF-8
    username: root
    password: 123456
  web:
    resources:
      static-locations: classpath:/static/
mybatis:
  mapper-locations: classpath:com/b0/mapper/*.xml
  type-aliases-package: com.b0.elementusers.entity
  configuration:
    map-underscore-to-camel-case: true


后端使用springboot+mybatis 结合Lombok快速开发接口
实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Accessors(chain = true)
public class User {
    private Integer id;
    private String name;
    //导包导import java.util.Date;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birth;
    private String sex;
    private String address;
}

vo返回值拓展类

@Data
public class Result {
    private Boolean status=true;
    private String msg;
}

mybatis数据库操作接口

@Mapper
public interface UserDAO {
    //查询所有用户信息
    List<User> findAll();
    //保存用户信息
    void saveUser(User user);
    //根据id删除用户信息
    void deleteUserById(@Param("id") Integer id);
    //根据id查询用户
    User findUserById(@Param("id") Integer id);
    //根据用户id修改用户信息
    void updateUserById(User user);
    //分页查询
    List<User> findByPage(@Param("start") Integer start,@Param("rows") Integer rows);
    // 查询总条数
    Long findTotals();
}

mybatis配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace="com.b0.mybatis.mapper.UserMapper" -->
<mapper namespace="com.b0.elementusers.dao.UserDAO">
    <!--    查询所有的方法:List<User> findAll();-->
    <select id="findAll" resultType="User">
        select id,name,birth,sex,address
        from t_users
    </select>
<!--    保存用户:void saveUser(User user);useGeneratedKeys配置自增长key-->
    <insert id="saveUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
        insert into t_users values(#{id},#{name},#{birth},#{sex},#{address})
    </insert>
<!--    根据id删除用户信息:void deleteUserById(Integer id);-->
    <delete id="deleteUserById" parameterType="Integer">
        delete from t_users where id = #{id}
    </delete>
<!--  根据id查看用户信息:void findUserById(Integer id);  -->
    <select id="findUserById" resultType="User">
        select id,name,birth,sex,address
        from t_users where id = #{id}
    </select>
<!--    根据用户id修改用户:void updateUserById(User user);-->
    <update id="updateUserById" parameterType="User">
        update t_users
        set name=#{name},birth=#{birth},sex=#{sex},address=#{address}
        where id=#{id}
    </update>
<!--  分页查询List<User> findByPage(@Param("start") Integer start,@Param("rows") Integer rows);-->
    <select id="findByPage" resultType="User">
        select id,name,birth,sex,address
        from t_users limit #{start},#{rows}
    </select>
<!--   查询总条数Long findTotals();-->
    <select id="findTotals" resultType="Long">
        select count(id) from t_users
    </select>
</mapper>

service接口

public interface UserService {
    //查询所有方法
    List<User> findAll();
    //保存用户信息
    void saveUser(User user);
    //根据id删除用户信息
    void deleteUserById(Integer id);
    //根据id查询用户
    User findUserById(@Param("id") Integer id);
    //根据用户id修改用户信息
    void updateUserById(User user);
    //分页查询
    List<User> findByPage(Integer pageNow, Integer rows);
    // 查询总条数
    Long findTotals();
}

service实现类

@Service
@Transactional
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDAO userDAO;
    @Override
    public List<User> findAll() {
        return userDAO.findAll();
    }

    @Override
    public void saveUser(User user) {
        userDAO.saveUser(user);
    }

    @Override
    public void deleteUserById(Integer id) {
        userDAO.deleteUserById(id);
    }

    @Override
    public User findUserById(Integer id) {
        return userDAO.findUserById(id);
    }

    @Override
    public void updateUserById(User user) {
        userDAO.updateUserById(user);
    }

    @Override
    public List<User> findByPage(Integer pageNow, Integer rows) {
        int start = (pageNow-1)*rows;
        List<User> userList = userDAO.findByPage(start, rows);
        return userList;
    }

    @Override
    public Long findTotals() {
        Long totals = userDAO.findTotals();
        return totals;
    }
}

controller控制层

@RestController
@CrossOrigin(origins = "*")//全局跨域,解决跨域相关问题
@RequestMapping("user")
public class UserController {
    @Autowired
    private UserService userService;
    //根据id查询用户findUserById
    @RequestMapping("findUserById")
    public User findUserById(Integer id){
        return userService.findUserById(id);
    }
    //删除用户
    @GetMapping("deleteUserById")
    public Result deleteUserById(Integer id){
        Result result = new Result();
        try {
            userService.deleteUserById(id);
            result.setMsg("删除用户成功!");
        }catch (Exception e){
            e.printStackTrace();
            result.setStatus(false);
            result.setMsg("删除用户失败!");
        }
        return result;
    }
    //查询所有用户
    @GetMapping("findAll")
    public List<User> findAll(){
        return userService.findAll();
    }
    //保存用户
    @PostMapping("save")
    public Result saveUser(@RequestBody User user){
        Result result = new Result();
        try {
            userService.saveUser(user);
            result.setMsg("保存用户成功!");
        }catch (Exception e){
            e.printStackTrace();
            result.setStatus(false);
            result.setMsg("保存用户失败!");
        }
        return result;
    }
    //根据用户id保存用户
    @PostMapping("saveUserById")
    public Result updateUserById(@RequestBody User user){
        Result result = new Result();
        try {
            userService.updateUserById(user);
            result.setMsg("修改用户数据成功!");
        }catch (Exception e){
            e.printStackTrace();
            result.setStatus(false);
            result.setMsg("修改用户数据失败!");
        }
        return result;
    }
    //分页查询的方法
    @GetMapping("findByPage")
    public Map<String,Object> findByPage(Integer pageNow,Integer pageSize){
        Map<String,Object> result = new HashMap<>();
        pageNow = pageNow==null?1:pageNow;
        pageSize = pageSize==null?4:pageSize;
        List<User> users = userService.findByPage(pageNow, pageSize);
        //总条数
        Long totals = userService.findTotals();
        result.put("users",users);
        result.put("total",totals);
        return result;
    }
}

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

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

相关文章

SQL 存储过程

文章目录存储过程简介存储过程的创建及调用存储过程的删除 如何删除存储过程存储过程的优缺点现需要向学生表中插入新的学生数据。但在插入学生数据的时&#xff0c;需要同 时检查老师表里的数据。如果插入学生的老师不在老师表里&#xff0c;则先向老师表中插入一条老师数据&a…

高级IO-多路转接

高级IO 以前的都是拷贝接口。write什么的就是将字符串拷贝到发送缓冲区中。 应用层等待接收缓冲区填写数据的过程算是IO吗&#xff1f;算 IO等待拷贝数据&#xff1b; 真正的IO的过程就是拷贝的过程。比如等待鱼上钩的时候也算是钓鱼(adj)&#xff0c;当把鱼拿上来的时候也…

【Spring篇】代理模式

&#x1f353;个人主页&#xff1a;个人主页 &#x1f352;系列专栏&#xff1a;SSM框架 目录 一、场景模拟 二、提出问题 三、代理模式 1.静态代理 2.动态代理 一、场景模拟 ①声明接口 声明计算器接口Calculator&#xff0c;包含加减乘除的抽象方法 public interface…

hadoop基础搭建(hadoop+hive+hbase+zk)(一)

文章目录一、基础环境&插件安装&#xff08;root&#xff09;二、创建启动脚本&#xff0c;后续使用三、安装JDK&#xff08;root&#xff09;四、安装Hadoop五、安装 rsync&#xff08;root&#xff09;六、网络配置&#xff08;4台服务器&#xff0c;root&#xff09;七、…

使用html2canvas,将页面转换成图片的采坑记录(Web/Taro h5)

使用html2canvas将页面转换成图片的采坑记录 "html2canvas": "^1.4.1","tarojs/taro": "3.4.0-beta.0"问题: 1. 生成的图片很模糊 2. 生成的图片是空白 3. 生成的图片不完整 截图前是这样 截图后这样 截图后的图片图片缺省了一部分…

【消息中间件】1小时快速上手RabbitMQ

前 言 &#x1f349; 作者简介&#xff1a;半旧518&#xff0c;长跑型选手&#xff0c;立志坚持写10年博客&#xff0c;专注于java后端 ☕专栏简介&#xff1a;深入、全面、系统的介绍消息中间件 &#x1f330; 文章简介&#xff1a;本文将介绍RabbitMQ&#xff0c;一小时快速上…

Good Bye 2022: 2023 is NEAR D. Koxia and Game

原题链接&#xff1a;Problem - D - Codeforces 题面&#xff1a; 大概意思就是给你一个数组a和数组b&#xff0c;你自己设计一个数组c&#xff0c;Koxia可以从a[i]、b[i]和c[i]中选一个&#xff0c;而Mahiru只能从另外两个里选一个&#xff0c;问你有多少个数组c一定能使Mah…

给GitHub装扮个性化首页

我的主页 如何配置 需要创建一个仓库&#xff0c;仓库名要跟GitHub的用户名一样,我的已经创建过了 喜欢我的主页可以直接fork然后在自己的仓库修改&#xff0c;如果想自己装扮直接看下一步 地址&#xff1a;https://github.com/linweiqian 开始装扮 下面展示仓库状态统计的设…

工业控制系统安全控制应用缩略语汇总

声明 本文是学习GB-T 32919-2016 信息安全技术 工业控制系统安全控制应用指南. 下载地址 http://github5.com/view/585而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 工业控制系统安全控制应用缩略语 ICS 工业控制系统&#xff08;Industrial Contro…

线程的高效利用——线程池

文章目录线程的开销线程池的工作方式ThreadPoolExecutor基础线程池结果的处理线程的开销 线程作为一种昂贵的资源&#xff0c;开销包括如下几点&#xff1a; 1、线程的创建与启动的开销。 2、线程的销毁的开销。 3、线程调度的开销。线程的调度会产生上下文切换&#xff0c;从…

skywalking解析-入门

前几天从github上看最近比较火的项目&#xff0c;发现了skywalking&#xff0c;就进行了些了解&#xff0c;发现这个领域自己目前知之甚少&#xff0c;打算通过对源码的分析深入了解一下分布式追踪。首先从对skywalking介绍开始。 目录一、简介二、整体架构三、源码下载四、系统…

spark-RDD学习笔记

本文是19年学生时学习林子雨老师课程中的一些学习笔记&#xff0c;主要内容包括RDD的概念和运行原理,rdd相关编程api接口以及对应的实例。关于RDD的内容&#xff0c;这个笔记描述的2019年年底之前的pyspark版本&#xff0c;2023年年初时在pyspark的实际工作中rdd已经很少用或者…

【Kafka】Kafka概述

一、闲话 这是2023年的第一篇博客&#xff0c;祝大家在新的一年里一帆风顺&#xff0c;身体健康 二、基本要点 1、Kafka概述 Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue)&#xff0c;主要用于大数据实时处理领域 2、消息队列的好处 解耦&#xff1a;…

CAS原理、实践、缺陷分析及优化

文章目录CAS介绍CAS在Java中的底层实现Java源码中使用举例自己实际运用乐观锁举例简单的CAS操作ABA问题及优化实践缺陷及优化只能保证单个变量操作原子性当比较失败后,通常需要不断重试,浪费CPUCAS介绍 CAS(Compare And swap),比较并交换,是一种乐观锁.它是解决多线程并行情况…

【力扣Java】第一个出现两次的字母(HashSet与<<左移)

目录 题目描述 思路与算法 方法一&#xff1a;哈希表 HashSet说明 解题代码 方法二&#xff1a;位运算 左移运算符&#xff08;<<&#xff09; 右移运算符&#xff08;>>&#xff09; 解题代码 题目描述 给你一个由小写英文字母组成的字符串 s &#xff…

事务四大特性

没有开启事务的话直接提交、修改数据&#xff0c;有事务则进行两阶段提交&#xff1a; ①原子性 undolog 来实现一旦失败就马上触发回滚 当前事务是不可再分的&#xff0c;要么一起执行&#xff0c;要么都不执行。 start transaction redolog日志池存储undolog日志&#xff…

【Android OpenCV】Visual Studio 创建支持 OpenCV 库的 CMake 工程 ④ ( OpenCV 官方代码示例 )

文章目录一、OpenCV 官方代码示例1、Windows 平台代码示例2、Android 平台代码示例参考 【Android OpenCV】Visual Studio 创建支持 OpenCV 库的 CMake 工程 ① ( 下载 OpenCV 库 | Windows 中安装 OpenCV 库 ) 博客 , 可下载 OpenCV 库 ; CSDN 下载地址 : https://download.c…

educoder数据结构 字符串匹配 第2关:实现KMP字符串匹配

本文已收录于专栏 &#x1f332;《educoder数据结构与算法_大耳朵宋宋的博客-CSDN博客》&#x1f332; 任务描述 本关的编程任务是补全 step2/kmp.cpp 文件中的KmpGenNext函数&#xff0c;以实现 KMP 字符串匹配。该函数生成给定字符串的next数组。 相关知识 第 1 关中实现…

LEETCODE 19. 删除链表的倒数第 N 个结点

给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示例 3&#xff1a;…

shell流程控制之条件判断练习案列

练习案例1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。2、判断web服务是否运行&#xff08;1、查看进程的方式判断该程序是否运行&#xff0c;2、通过查看端口的方式判断该程序是否运行…