后端SpringBoot+前端Vue前后端分离的项目(一)

前言:后端使用SpringBoot框架,前端使用Vue框架,做一个前后端分离的小项目,需求:实现一个表格,具备新增、删除、修改的功能。

目录

一、数据库表的设计

二、后端实现

环境配置

数据处理-增删改查

model层

mapper层

XML配置

Service层

controller层

单元测试

三、前后端交互

配置

vite.config.ts文件配置

创建axios实例 

业务请求

四、前端实现

环境配置

Main.vue

interface接口

五、效果展示

六、总结


一、数据库表的设计

设计了一个merchandise表,id是编号,唯一的,类型为int,category是一级类别,type是二级类别,name是商品的名称,sum_quantity是总数量,sold_quantity是售卖的数量。

数据库里的字段名使用的是下划线连接,在java中变量命名一般使用驼峰式,需要在application.properties文件中进行配置

mybatis.configuration.map-underscore-to-camel-case=true

二、后端实现

model层

package com.mrjj.java.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class merchandise {
    public int id;
    public String category;
    public String type;
    public String name;
    public String sum_quantity;
    public String sold_quantity;
}

环境配置

引入需要的依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</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</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3</version>
        </dependency>

 完成application.properties文件的配置,连接mysql

server.port=8888
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mrjj?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
mybatis.mapper-locations=classpath:/mapper/*.xml
mybatis.configuration.map-underscore-to-camel-case=true

数据处理-增删改查

model层

映射数据库中的字段

package com.mrjj.java.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Merchandise {
    public int id;
    public String merchandiseCategory;
    public String merchandiseType;
    public String merchandiseName;
    public int sumQuantity;
    public int soldQuantity;
}

返回结果字段

package com.mrjj.java.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
    private Integer code;
    private String msg;
    private T data;

    public Result(String msg, Integer code) {
        this.msg = msg;
        this.code = code;
    }

    public Result(T data) {
        this.data = data;
        this.code = 1000;
    }

    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>(data);
        result.setCode(200);
        result.setMsg("请求成功");
        return result;
    }

    public static <T> Result<T> success(String msg, T data) {
        Result<T> result = new Result<>(data);
        result.setCode(200);
        result.setMsg(msg);
        return result;
    }

    public static <T> Result fail(int code, String message, T data) {
        Result<T> resultData = new Result<>();
        resultData.setCode(code);
        resultData.setMsg(message);
        resultData.setData(data);
        return resultData;
    }
}

mapper层

package com.mrjj.java.mapper;

import com.mrjj.java.model.Merchandise;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface MerchandiseMapper {

    @Select("select * from merchandise")
    List<Merchandise> getMerchandise();

    @Insert("insert into merchandise values(#{id},#{merchandiseCategory},#{merchandiseType},#{merchandiseName},#{sumQuantity},#{soldQuantity})")
    int addMerchandise(Merchandise merchandise);

    @Delete("delete from merchandise where id=#{id}")
    int deleteOneMerchandise(@Param("id") Long id);

    int updateMerchandise(List<Merchandise> merchandise);
}

XML配置

注意!!!

要配置上allowMultiQueries=true,才能批量处理!!!这个问题查了蛮久的!!!

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace:填写映射当前的Mapper接口,所有的增删改查的参数和返回值类型,
		就可以直接填写缩写,不区分大小写,直接通过方法名去找类型-->
<mapper namespace="com.mrjj.java.mapper.MerchandiseMapper">
    <!--    id 对应的是mapper.CaseMapper里的方法名-->

    <delete id="deleteMoreMerchandise">
        delete from merchandise
        <where>
            <foreach collection="list" separator="," item="item" open="id in (" close=")">
                #{item}
            </foreach>
        </where>
    </delete>

    <update id="updateMerchandise" parameterType="java.util.List">
        <foreach collection="list" item="item" separator=";">
            update merchandise
            <set>
                <if test="#{item.merchandiseCategory}!=null">
                    merchandise_category=#{item.merchandiseCategory},
                </if>
                <if test="#{item.merchandiseType}!=null">
                    merchandise_type=#{item.merchandiseType},
                </if>
                <if test="#{item.merchandiseName}!=null">
                    merchandise_name=#{item.merchandiseName},
                </if>
                <if test="#{item.sumQuantity}!=null">
                    sum_quantity=#{item.sumQuantity},
                </if>
                <if test="#{item.soldQuantity}!=null">
                    sold_quantity=#{item.soldQuantity},
                </if>

            </set>
            where id=#{item.id}
        </foreach>
    </update>
</mapper>

Service层

package com.mrjj.java.service;

import java.util.List;

public interface MerchandiseService {
    int deleteMoreMerchandise(List<Long> ids);
}
package com.mrjj.java.service.impl;

import com.mrjj.java.mapper.MerchandiseMapper;
import com.mrjj.java.service.MerchandiseService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service("MerchandiseService")
public class MerchandiseServiceImpl implements MerchandiseService {
    @Resource
    MerchandiseMapper merchandiseMapper;


    @Override
    public int deleteMoreMerchandise(List<Long> ids) {
        int delCount = 0;
        for (Long id : ids) {
            delCount += merchandiseMapper.deleteOneMerchandise(id);
        }
        System.out.println("删除了" + delCount + "条用例");
        return delCount;
    }
}

controller层

package com.mrjj.java.controller;

import com.mrjj.java.mapper.MerchandiseMapper;
import com.mrjj.java.model.Merchandise;
import com.mrjj.java.model.Result;
import com.mrjj.java.service.MerchandiseService;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import java.util.List;

@RestController
@RequestMapping("/mrjjMerchandise")
public class MerchandiseController {
    @Resource
    MerchandiseMapper merchandiseMapper;
    @Resource
    MerchandiseService merchandiseService;

    @GetMapping
    public Result listMerchandise() {
        List<Merchandise> Marchandise = merchandiseMapper.getMerchandise();
        System.out.println("查到的商品是" + Marchandise);
        return Result.success(Marchandise);
    }

    @GetMapping("/view")
    public ModelAndView showMerchandise() {
        ModelAndView MarchandiseView = new ModelAndView();
        List<Merchandise> Marchandise = merchandiseMapper.getMerchandise();
        MarchandiseView.addObject("mrjjMarchandiseView", Marchandise);
        MarchandiseView.setViewName("mrjjMarchandise");
        return MarchandiseView;
    }

    @PostMapping
    public Result addMerchandise(@RequestBody Merchandise merchandise) {
        int i = merchandiseMapper.addMerchandise(merchandise);
        if (i > 0) {
            return Result.success(merchandise);
        } else {
            return Result.fail(210, "新增商品信息失败", merchandise);
        }
    }

    @PutMapping
    public Result updateMerchandise(@RequestBody List<Merchandise> MerchandiseList) {
        System.out.println("修改");
        int i = merchandiseMapper.updateMerchandise(MerchandiseList);
        if (i > 0)
            return Result.success("修改商品信息成功");
        else
            return Result.fail(230, "修改商品信息失败", MerchandiseList);
    }

    @DeleteMapping("/{id}")
    public Result deleteOneMerchandise(@PathVariable Long id) {
        System.out.println(id);
        int i = merchandiseMapper.deleteOneMerchandise(id);
        System.out.println("删除的结果是:" + i);
        if (i > 0) {
            return Result.success("删除商品成功");
        } else {
            return Result.fail(240, "删除商品信息用例失败", "删除商品信息失败");
        }
    }

    @DeleteMapping("/ids/{ids}")
    public int deleteMoreMerchandise(@PathVariable List<Long> ids) {
        return merchandiseService.deleteMoreMerchandise(ids);
    }


}

单元测试

package com.mrjj.java.controller;

import com.mrjj.java.model.Result;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

import java.util.ArrayList;
import java.util.List;

@SpringBootTest
@RunWith(SpringRunner.class)
@Transactional
@Rollback(value=true)
class MerchandiseControllerTest {
    @Resource
    MerchandiseController merchandiseController;

    @Test
    public void testQuery() {
        Result queryData = merchandiseController.listMerchandise();
        System.out.println(queryData);
    }
    @Test
    public void testDelete(){
        Result deleteData = merchandiseController.deleteOneMerchandise(4L);
        System.out.println(deleteData);
    }
    @Test
    public void testDeleteMore(){
        List<Long> list1 = new ArrayList<>();
        list1.add(0,5L);
        list1.add(1,4L);
        int deleteMoreData = merchandiseController.deleteMoreMerchandise(list1);
        System.out.println(deleteMoreData);
    }
}

三、前后端交互

配置

大致画了个流程图

可以看到在发送请求时,路径以及变了 

vite.config.ts文件配置

target是本地服务的地址和端口号

添加的路径/mrjj

server:{
    open:true,
    proxy:{
      '/mrjj': {
        target: 'http://localhost:8888',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/mrjj/, ''),
      },
    }
  }

创建axios实例 

import axios, { type AxiosResponse } from 'axios'
const instance = axios.create({
  baseURL: '/mrjj',
  timeout: 30000,
  headers: { 'Content-Type': 'application/json;charset=utf-8' }
})

instance.interceptors.response.use(
  function (response: AxiosResponse) {
    const { code } = response.data
    if (code === 200) {
      return response.data
    }
  },
  function (error) {
    return Promise.reject(error)
  }
)
export default instance

业务请求

baseURL对应本地服务的接口地址

导出后端服务增删改查方法

import request from '../request'
import axios, { type AxiosPromise } from 'axios'
import type { MrjjMerchandise } from '@/types/merchandises/type'
const instance = axios.create({
  baseURL: '/mrjjMerchandise',
  timeout: 30000,
  headers: { 'Content-Type': 'application/json;charset=utf-8' }
})
export default instance

export function listMerchandiseApi(): AxiosPromise<MrjjMerchandise[]> {
  return request({
    url: '/mrjjMerchandise',
    method: 'get'
  })
}

export function addMerchandiseApi(data: MrjjMerchandise) {
  return request({
    url: '/mrjjMerchandise',
    method: 'post',
    data: data
  })
}

export function changeMerchandiseApi(data: MrjjMerchandise) {
  return request({
    url: '/mrjjMerchandise',
    method: 'put',
    data
  })
}

export function deleteMerchandiseApi(ids: string) {
  return request({
    url: '/mrjjMerchandise/ids/' + ids,
    method: 'delete'
  })
}

四、前端实现

环境配置

import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import zhCn from 'element-plus/es/locale/lang/zh-cn'
import VXETable from 'vxe-table'
import 'vxe-table/lib/style.css'
import router from './router'
createApp(App).use(router).use(ElementPlus, { locale: zhCn }).use(VXETable).mount('#app')

Main.vue

<template>
  <el-dialog title="添加商品" v-model="isAdd" width="30%">
    <el-form :model="newMerchandise" ref="form" label-width="80px" :inline="false" size="normal">
      <el-form-item label="一级分类">
        <el-input v-model="newMerchandise.merchandiseCategory"></el-input>
      </el-form-item>
      <el-form-item label="二级分类">
        <el-input v-model="newMerchandise.merchandiseType"></el-input>
      </el-form-item>
      <el-form-item label="商品名称">
        <el-input v-model="newMerchandise.merchandiseName"></el-input>
      </el-form-item>
      <el-form-item label="总数量">
        <el-input v-model="newMerchandise.sumQuantity"></el-input>
      </el-form-item>
      <el-form-item label="已售出">
        <el-input v-model="newMerchandise.soldQuantity"></el-input>
      </el-form-item>
    </el-form>
    <template #footer>
      <span
        ><el-button @click="closeAdder">取消</el-button>
        <el-button type="primary" @click="addMerchandise">确认</el-button></span
      >
    </template>
  </el-dialog>

  <el-card shadow="always" :body-style="{ padding: '0px' }">
    <template #header>
      <div>
        <el-row :gutter="16">
          <el-col :span="4" class="case-title"><span>商品信息</span></el-col>
          <el-col :span="4" :offset="16">
            <el-button type="success" @click="openMerchandiseAdd"
              ><el-icon><Plus /></el-icon> 新增商品</el-button
            >
          </el-col>
          <el-button type="primary" size="default" @click="changeMerchandise"
            ><el-icon><Promotion /></el-icon>提交修改</el-button
          >
          <el-button
            type="danger"
            size="default"
            @click="deleteChecked"
            :disable="checkedMoreIds?.length === 0"
            ><el-icon><Delete /></el-icon>删除选中商品</el-button
          >
        </el-row>
      </div>
    </template>
    <vxe-table
      ref="merchandiseTable"
      border
      show-header-overflow
      show-overflow
      @checkbox-all="selectMoreMerchandiseEvent"
      :column-config="{ resizable: true }"
      :data="Merchandises"
      :edit-config="{ trigger: 'dblclick', mode: 'cell' }"
    >
      <vxe-column type="checkbox" width="60"></vxe-column>
      <vxe-column
        field="merchandiseCategory"
        title="一级类别"
        :edit-render="{ name: 'input' }"
      ></vxe-column>
      <vxe-column
        field="merchandiseType"
        title="二级类别"
        :edit-render="{ name: 'input' }"
      ></vxe-column>
      <vxe-column
        field="merchandiseName"
        title="商品名称"
        :edit-render="{ name: 'input' }"
      ></vxe-column>
      <vxe-column field="sumQuantity" title="总数量" :edit-render="{ name: 'input' }"></vxe-column>
      <vxe-column field="soldQuantity" title="已售出" :edit-render="{ name: 'input' }"></vxe-column>
      <vxe-column field="" title="操作">
        <template #default="{ row }">
          <el-button type="primary" size="default" @click="deleteMerchandise(row)" :icon="Delete"
            >删除</el-button
          ></template
        >
      </vxe-column>
    </vxe-table>
  </el-card>
</template>

<script setup lang="ts">
import { Delete, Promotion, Plus } from '@element-plus/icons-vue'
import type { VxeTableInstance } from 'vxe-table'
import type { MerchandiseShow, MrjjMerchandise } from '../types/merchandises/type'
import {
  listMerchandiseApi,
  addMerchandiseApi,
  deleteMerchandiseApi,
  changeMerchandiseApi
} from '../api/merchandise'
import { ref, onMounted, reactive, computed } from 'vue'
onMounted(() => {
  listMerchandises()
})
let isAdd = ref(false)
let isEdit = ref(false)
let merchandiseTable = ref<VxeTableInstance>()
let Merchandises = ref([])
let emptyMerchandise = {
  merchandiseCategory: '',
  merchandiseType: '',
  merchandiseName: '',
  sumQuantity: '',
  soldQuantity: ''
}
let newMerchandise = reactive<MerchandiseShow>({
  merchandiseCategory: '',
  merchandiseType: '',
  merchandiseName: '',
  sumQuantity: '',
  soldQuantity: ''
})
const checkedMoreIds = computed(() => {
  return merchandiseTable.value?.getCheckboxRecords().map((MrjjMerchandise) => {
    return MrjjMerchandise.id
  })
})
function closeAdder() {
  isAdd.value = false
}
function openMerchandiseAdd() {
  isAdd.value = true
}
function listMerchandises() {
  console.log('正在发送请求')
  listMerchandiseApi()
    .then(({ data }) => {
      Merchandises.value = data
      console.log('获取到的用例信息是:', Merchandises)
    })
    .catch((error: any) => {
      console.log('报错了', error)
    })
}
function addMerchandise() {
  let lastId =
    Merchandises.value.length > 0 ? Merchandises.value[Merchandises.value.length - 1].id : -1
  let addMerchandise: MrjjMerchandise = { ...newMerchandise, id: 0 }
  addMerchandise.id = lastId + 1
  console.log('要新增的商品是:', addMerchandise)
  addMerchandiseApi(addMerchandise).then(() => {
    listMerchandises()
  })
  closeAdder()
}

function deleteMerchandise(deleteOneMerchandise: MrjjMerchandise) {
  deleteMerchandiseApi(deleteOneMerchandise.id + '').then(() => {
    listMerchandises()
  })
}
function deleteChecked() {
  console.log('选中的id是', checkedMoreIds.value?.toString())

  deleteMerchandiseApi(checkedMoreIds.value!.toString()).then(() => {
    listMerchandises()
  })
}
function changeMerchandise() {
  changeMerchandiseApi(Merchandises.value).then(() => {
    listMerchandises()
  })
}
</script>

<style scoped>
.case-title {
  font-size: large;
  color: red;
  font-weight: bolder;
}
</style>

interface接口

export interface MerchandiseShow{
    merchandiseCategory:string;
    merchandiseType:string;
    merchandiseName:string;
    sumQuantity:number;
    soldQuantity:number;
    [key:string]: any;
    }
    export interface MrjjMerchandise extends MerchandiseShow{
        id:number;
    }
    export interface MrjjMerchandiseEdit extends MrjjMerchandise{
        isEdit:boolean;
    }

五、效果展示

实现了查询、新增、删除、修改的功能

 修改后,数据库里的值也发生了变化

六、总结

通过对数据库表、后端接口设计、前端页面编写,已经实现了一个前后端分离的小项目了,当然还可以进一步完善这个功能,比如新增时可以加上参数校验,可以做一个树形结构的列表,实现数据的拖拽,还可以加上查询、分页、排序等功能,后续博客会对不断进行完善。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python自动化测试-自动化基本技术原理

1 概述 在之前的文章里面提到过&#xff1a;做自动化的首要本领就是要会 透过现象看本质 &#xff0c;落实到实际的IT工作中就是 透过界面看数据。 掌握上面的这样的本领可不是容易的事情&#xff0c;必须要有扎实的计算机理论基础&#xff0c;才能看到深层次的本质东西。 …

【狂神】Spring5(Aop的实现方式)

今天没有偷懒&#xff0c;只是忘了Mybatis&#xff0c;所以去补课了~ ┏━━━━━━━━━━━━━━━┓ NICE PIGGY PIG.. ┗━━━━━━━△━━━━━━━┛ ヽ(&#xff65;ω&#xff65;)&#xff89; | / UU 1.Aop实现方式一 1.1、什…

基于Java的OA办公管理系统,Spring Boot框架,vue技术,mysql数据库,前台+后台,完美运行,有一万一千字论文。

基于Java的OA办公管理系统&#xff0c;Spring Boot框架&#xff0c;vue技术&#xff0c;mysql数据库&#xff0c;前台后台&#xff0c;完美运行&#xff0c;有一万一千字论文。 系统中的功能模块主要是实现管理员和员工的管理&#xff1b; 管理员&#xff1a;个人中心、普通员工…

FPGA优质开源项目 – UDP万兆光纤以太网通信

本文开源一个FPGA项目&#xff1a;UDP万兆光通信。该项目实现了万兆光纤以太网数据回环传输功能。Vivado工程代码结构和之前开源的《UDP RGMII千兆以太网》类似&#xff0c;只不过万兆以太网是调用了Xilinx的10G Ethernet Subsystem IP核实现。 下面围绕该IP核的使用、用户接口…

Linux入门之进程信号|信号产生的方式

文章目录 一、信号入门 1.linux信号的基本概念 2.使用kill -l 命令可以查看系统定义的信号列表 3.信号处理常见方式 二、产生信号 1.通过终端按键产生信号 2.通过调用系统函数向进程发信号 3.由软条件产生信号 4.硬件异常产生信号 1. /0异常 2.模拟野指针 一、信号入门…

操作系统备考学习 day2 (1.3.2 - 1.6)

操作系统备考学习 day2 计算机系统概述操作系统运行环境中断和异常的概念系统调用 操作系统体系结构操作系统引导虚拟机 计算机系统概述 操作系统运行环境 中断和异常的概念 中断的作用 CPU上会运行两种程序&#xff0c;一种是操作系统内核程序&#xff0c;一种是应用程序。…

2023_Spark_实验一:Windows中基础环境安装

Ⅰ、WINDOWS中安装JDK1.8 一、下载安装包 链接&#xff1a;百度网盘 请输入提取码 所在文件夹&#xff1a;根目录或者大数据必备工具--》开发工具(前端后端)--》后端 下载文件名称&#xff1a;jdk-8u191-windows-x64.exe 二、安装JDK 1.现在转到下载的exe文件可用的文件夹&…

大数据学习:kafka-producer源码分析

kafka-producer源码分析 kafka-1.0.1源码下载地址 一.kafka发送示例 /*** Created by XiChuan on 2021/6/7.*/ public class ProducerTest {public static void main(String[] args) throws Exception {KafkaProducer<String, String> producer createProducer();JSO…

【LeetCode75】第四十四题 省份数量

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一个二维数组&#xff0c;表示城市之间的连通情况&#xff0c;连在一起的城市为一个省份&#xff0c;问我们一共有多少个省份。 这…

Jmeter(二十九):Jmeter常用场景梳理

一、每秒钟固定调用次数 如果想控制每秒发送请求数量,仅仅通过线程数与循环次数是不够的,因为这只能控制发送总数,而要控制每秒发送数量,需要线程数与常数吞吐量控制器的搭配使用,这种场景在性能测试中使用不多。 例如每秒钟调用30次接口,那么把线程数设置为30,将常数…

vue的 ECMAScript 6的学习

一 ECMAScript 6 1.1 ECMAScript 6 ECMAScript 和 JavaScript 的关系是&#xff0c;前者是后者的规格&#xff0c;后者是前者的一种实现&#xff08;另外的 ECMAScript 方言还有 Jscript 和 ActionScript&#xff09;。 因此&#xff0c;ES6 既是一个历史名词&#xff0c;也…

【Redis】redis入门+java操作redis

目录 一、Redis入门 1.1 Redis简介 1.2 Redis下载与安装 1.2.1 下载 1.2.2 linux安装 1.2.3 windows安装 1.3 Redis服务启动与停止 1.3.1 linux启动、停止Redis服务 1.3.2 windows启动、停止Redis服务 1.4 修改Redis启动密码 1.4.1 Linux修改设置 1.4.2 windows设…

【日积月累】后端刷题日志

刷题日志 说说对Java的理解JAVA中抽象类和接口之间的区别Java中的泛型 和equals()的区别八种基本数据类型与他们的包装类在一个静态方法内调用一个非静态成员为什么是非法的静态方法与实例方法有何不同重载与重写深拷贝浅拷贝面向过程与面向对象成员变量与局部变量封装对象三大…

【LeetCode】剑指 Offer <二刷>(4)

目录 题目&#xff1a;剑指 Offer 09. 用两个栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 10- I. 斐波那契数列 - 力扣&am…

计算机网络-笔记-第四章-网络层

&#x1f338;章节汇总 一、第一章——计算机网络概述 二、第二章——物理层 三、第三章——数据链路层 四、第四章——网络层 五、第五章——运输层 六、第六章——应用层 目录​​​​​​​ 四、第四章——网络层 1、网络层概述 &#xff08;1&#xff09;虚电路服务——…

Qt应用开发(基础篇)——字体选择器 QFontDialog

一、前言 QFontDialog类继承于QDialog&#xff0c;是一个设计用来选择字体的对话框部件。 对话框窗口QDialog QFontDialog字体选择对话框&#xff0c;设计用来让用户选择某一种字体&#xff0c;一般用于文本编辑窗口、标签显示和一些需要文本输入的场景。你可以直接使用静态函数…

Qt应用开发(基础篇)——消息对话框 QMessageBox

一、前言 QMessageBox类继承于QDialog&#xff0c;是一个模式对话框&#xff0c;常用于通知用户或向用户提出问题并接收答案。 对话框QDialog QMessageBox消息框主要由四部分组成&#xff0c;一个主要文本text&#xff0c;用于提醒用户注意某种情况;一个信息文本informativeTex…

【Go 基础篇】Go语言数组遍历:探索多种遍历数组的方式

数组作为一种基本的数据结构&#xff0c;在Go语言中扮演着重要角色。而数组的遍历是使用数组的基础&#xff0c;它涉及到如何按顺序访问数组中的每个元素。在本文中&#xff0c;我们将深入探讨Go语言中多种数组遍历的方式&#xff0c;为你展示如何高效地处理数组数据。 前言 …

手撕 视觉slam14讲 ch7 / pose_estimation_3d2d.cpp (1)

首先理清我们需要实现什么功能&#xff0c;怎么实现&#xff0c;提供一份整体逻辑&#xff1a;包括主函数和功能函数 主函数逻辑&#xff1a; 1. 读图,两张rgb&#xff08;cv::imread&#xff09; 2. 找到两张rgb图中的特征点匹配对 2.1定义所需要的参数&#xff1a;keypoints…

Springboot集成Docker并将镜像推送linux服务器

案例使用springboot项目&#xff0c;在IDEA 中集成Docker生成镜像&#xff0c;并将镜像发布到linux服务器 具体步骤如下&#xff1a; 1、Centos7安装Docker 更新系统的软件包列表 sudo yum update安装Docker所需的软件包和依赖项&#xff1a; sudo yum install docker完成…