前置文章

Windows VMWare Centos环境下安装Docker并配置MySqlhttps://blog.csdn.net/u013224722/article/details/148928081

Windows VMWare Centos Docker部署Springboot应用https://blog.csdn.net/u013224722/article/details/148958480

Windows VMWare Centos Docker部署Nginx并配置对Springboot应用的访问代理https://blog.csdn.net/u013224722/article/details/149007158

一、MySql 建库建表

1、新建数据库

        通过Widnows宿主机安装的数据库管理工具“Navicat Premium”连上在VMWare Centos Docker中创建的MySQL数据库。新建一个数据库‘duel_db’。

2、新建数据表

新建managers表, 用于系统管理员的登录。

新建表,用于存储用户信息

新建files表, 用于上传文档信息的存储

二、 Springboot应用使用MySql

1、在IDEA中连接数据库方式参考

查看VMware Centos的ip

在IDEA右侧的Database面板新建Data Source

2、Springboot应用配置mybatis

2.1 修改pom.xml

打开pom.xml文件,添加MySQL  mybatis以及注解相关依赖

        <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.4</version></dependency><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.4.2</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>

pom.xml文件修改Build,用于mybatis自动生成数据表对象以及mapper。 

  <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.4.2</version><dependencies><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>9.2.0</version></dependency></dependencies><configuration><configurationFile>src/main/resources/generatorConfig.xml</configurationFile><overwrite>true</overwrite><verbose>true</verbose></configuration></plugin></plugins></build>

2.2 修改application.properties 

新增数据库连接相关属性,添加mybatis相关设置。

# MySql
spring.datasource.url=jdbc:mysql://192.168.23.134:3306/duel_db?useSSL=false
spring.datasource.username=root
spring.datasource.password=pwd123456
spring.datasource.driver-class-name= com.mysql.cj.jdbc.Driver# Mybatis
mybatis.mapper-locations=classpath:mapper/*.xml

 2.3 创建mybatis相关配置文件

在resources文件夹下新建 generatorConfig.xml文件,并设置model、mapper相关文件的自动存储目录。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><!-- 引入 application.properties 中的配置(可选) --><properties resource="application.properties"/><!-- 数据库驱动路径(如果未通过Maven依赖管理) --><!-- <classPathEntry location="/path/to/mysql-connector-java-8.0.33.jar"/> --><context id="duel_db" targetRuntime="MyBatis3"><!-- 生成的Java文件编码 --><property name="javaFileEncoding" value="UTF-8"/><!-- 生成的Java文件的注释 --><commentGenerator><!-- 注释配置:不生成注释 --><property name="suppressAllComments" value="true"/><!-- 生成注释 --><!--            <property name="addRemarkComments" value="true"/>--></commentGenerator><!-- 数据库连接信息 --><jdbcConnection driverClass="${spring.datasource.driver-class-name}"connectionURL="${spring.datasource.url}"userId="${spring.datasource.username}"password="${spring.datasource.password}"></jdbcConnection><!-- Java模型生成配置 --><javaModelGenerator targetPackage="com.duelapi.model" targetProject="src/main/java"><property name="enableSubPackages" value="true"/><property name="trimStrings" value="true"/></javaModelGenerator><!-- 生成 SQL Map XML 文件的配置 --><sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"><property name="enableSubPackages" value="false"/></sqlMapGenerator><!-- Mapper接口生成配置 --><javaClientGenerator type="XMLMAPPER" targetPackage="com.duelapi.mapper" targetProject="src/main/java"><property name="enableSubPackages" value="false"/></javaClientGenerator><table schema="Local" tableName="files" domainObjectName="FileRecord"enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"enableSelectByExample="false" selectByExampleQueryId="false"></table><table schema="Local" tableName="members" domainObjectName="MemberRecord"enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"enableSelectByExample="false" selectByExampleQueryId="false"></table><table schema="Local" tableName="managers" domainObjectName="ManagerRecord"enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"enableSelectByExample="false" selectByExampleQueryId="false"></table></context>
</generatorConfiguration>

修改启动类,新增@MapperScan("com.duelapi.mapper")

package com.duelapi;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.duelapi.mapper")
public class DuelApiApplication {public static void main(String[] args) {SpringApplication.run(DuelApiApplication.class, args);}}

2.4 生成Model及Mapper文件 

在右侧Maven面板,双击 mybatis-generator,自动执行生成操作。

 2.5 新增数据库查询语句

ManagerRecordMapper.java、  ManagerRecordMapper.xml中新增查询管理员的SQL

 ManagerRecord selectByAccount(String account);
  <select id="selectByAccount" parameterType="java.lang.String" resultMap="BaseResultMap">select<include refid="Base_Column_List" />from managerswhere account = #{account,jdbcType=VARCHAR}</select>

ManagerRecordMapper.java、  ManagerRecordMapper.xml中新增查询member的SQL 

    List<MemberRecord> selectAll();
  <select id="selectAll" resultMap="BaseResultMap">select<include refid="Base_Column_List" />from members</select>

 3、新增MySQL交互相关接口

 MemberRecord.java 新增转键值对的方法。

    public Map<String, Object> toMap(){Map<String, Object> result = new HashMap<>();result.put("id", this.getId());result.put("memberName", this.getMemberName());result.put("account", this.getAccount());return result;}

  新建ManageController.java

package com.duelapi.controller;import com.duelapi.model.MemberRecord;
import com.duelapi.service.IManageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;import java.util.Map;@Controller
@RequestMapping("/manage")
public class ManageController {private IManageService manageService;@Autowiredpublic ManageController(IManageService manageService){this.manageService = manageService;}@RequestMapping(value = "/managerLogin", method = RequestMethod.GET)@ResponseBodypublic Map<String, Object> managerLogin(@RequestParam(value = "account") String account,@RequestParam(value = "pwd") String pwd) {return this.manageService.managerLogin(account, pwd);}@RequestMapping(value = "/getMemberList", method = RequestMethod.GET)@ResponseBodypublic Map<String, Object> getMemberList() {return this.manageService.getMemberList();}@RequestMapping(value = "/addMember", method = RequestMethod.POST)@ResponseBodypublic Map<String, Object> addMember(@RequestBody MemberRecord memberInfo) {return this.manageService.addMember(memberInfo);}@RequestMapping(value = "/deleteMember", method = RequestMethod.GET)@ResponseBodypublic Map<String, Object> deleteMember(@RequestParam(value = "id") Integer id) {return this.manageService.deleteMember(id);}
}

新建 interface   IManageService.java 

package com.duelapi.service;import com.duelapi.model.MemberRecord;import java.util.Map;public interface IManageService {Map<String, Object> managerLogin(String account, String pwd);Map<String, Object> addMember(MemberRecord memberRec);Map<String, Object> deleteMember(Integer id);Map<String, Object> getMemberList();
}

新建 ManageService.java 实现 IManageService.java 

package com.duelapi.serviceimpl;import com.duelapi.mapper.ManagerRecordMapper;
import com.duelapi.mapper.MemberRecordMapper;
import com.duelapi.model.ManagerRecord;
import com.duelapi.model.MemberRecord;
import com.duelapi.service.IManageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.*;
import java.util.stream.Collectors;@Service
public class ManageService implements IManageService {private ManagerRecordMapper managerMapper;private MemberRecordMapper memberMapper;@Autowiredpublic ManageService(ManagerRecordMapper managerMapper,MemberRecordMapper memberMapper){this.managerMapper = managerMapper;this.memberMapper = memberMapper;}@Overridepublic Map<String, Object> managerLogin(String account, String pwd) {Map<String, Object> resultMap = new HashMap<>();ManagerRecord rec = this.managerMapper.selectByAccount(account);if(rec != null){if( rec.getPwd().equals(pwd)) {resultMap.put("status", "1");resultMap.put("msg", "success");}else {resultMap.put("status", "0");resultMap.put("msg", "密码错误");}}else{resultMap.put("status", "0");resultMap.put("msg", "管理员账户不存在");}return resultMap;}@Overridepublic Map<String, Object> addMember(MemberRecord memberRec) {Map<String, Object> resultMap = new HashMap<>();int nFlag = this.memberMapper.insertSelective(memberRec);if(nFlag == 1){resultMap.put("status", "1");resultMap.put("msg", "success");}else{resultMap.put("status", "0");resultMap.put("msg", "数据保存至数据库出错!");}return resultMap;}@Overridepublic Map<String, Object> deleteMember(Integer id) {Map<String, Object> resultMap = new HashMap<>();int nFlag = this.memberMapper.deleteByPrimaryKey(id);if(nFlag == 1){resultMap.put("status", "1");resultMap.put("msg", "success");}else{resultMap.put("status", "0");resultMap.put("msg", "数据库删除时出错!");}return resultMap;}@Overridepublic Map<String, Object> getMemberList() {List<MemberRecord> arrRecords = this.memberMapper.selectAll();List<Map<String, Object>> ltMaps = new ArrayList<>();int nAmount = 0;if (arrRecords != null && !arrRecords.isEmpty()) {ltMaps = arrRecords.stream().map(vo -> vo.toMap()).collect(Collectors.toList());nAmount = arrRecords.size();}Map<String, Object> resultMap = new HashMap<>();resultMap.put("rows", ltMaps);resultMap.put("total", nAmount);return resultMap;}
}

创建完成后的文件目录如下 

 

启动测试 

浏览器直接访问接口进行测试,测试通过。

4、前后端分离测试 

1、新建一个H5项目,添加JQuery、bootstrap、bootstrap-table引用

const.js 文件中定义接口访问地址

constUtils = {Server:"http://localhost:8093/",
};

index.html中实现对接口的调用及测试结果显示

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>测试</title><link href="./plugins/bootstrap/css/bootstrap.min.css" rel="stylesheet"><link href="./plugins/bootstrap/css/bootstrap-table.min.css" rel="stylesheet">
</head>
<body><div style="max-width: 720px; margin: 30px auto"><div id="tabToolbar"></div><table id="tabMain" data-toolbar="#tabToolbar"></table><div style="margin-top: 40px; background: #e7e7e7; padding: 30px"><h4>新增测试</h4><div style="padding: 20px 0"><label style="display: block"> 姓名:<input type="text" id="txtName"></label><label style="display: block"> 账号:<input type="text" id="txtAccount"></label><label style="display: block"> 密码:<input type="password" id="txtPwd"></label></div><button id="btnAddManager" type="button" class="btn btn-primary" onclick="addNewMember()">提交</button></div>
</div><script type="text/javascript" src="js/const.js"></script>
<script type="text/javascript" src="js/jquery.min.js?v2.1.4"></script>
<script src="./plugins/bootstrap/js/bootstrap.min.js"></script>
<script src="./plugins/bootstrap/js/bootstrap-table.min.js"></script><script>$(document).ready(function () {doUpdateTab();});function doUpdateTab() {$('#tabMain').bootstrapTable('destroy');$('#tabMain').bootstrapTable({method: 'get',toolbar: '#tabToolbar',    //工具按钮用哪个容器striped: true,      //是否显示行间隔色cache: false,      //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)pagination: true,     //是否显示分页(*)sortable: false,      //是否启用排序sortOrder: "desc",     //排序方式pageNumber: 1,      //初始化加载第一页,默认第一页pageSize: 50,      //每页的记录行数(*)pageList: [10, 25, 50, 100],  //可供选择的每页的行数(*)url: constUtils.Server + "manage/getMemberList",//这个接口需要处理bootstrap table传递的固定参数queryParamsType: 'undefined', //默认值为 'limit' ,在默认情况下 传给服务端的参数为:offset,limit,sortqueryParams: function queryParams(queryParams) {   //设置查询参数return {};},//前端调用服务时,会默认传递上边提到的参数,如果需要添加自定义参数,可以自定义一个函数返回请求参数sidePagination: "server",   //分页方式:client客户端分页,server服务端分页(*)search: true,      //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大strictSearch: false,showColumns: true,     //是否显示所有的列showRefresh: true,     //是否显示刷新按钮minimumCountColumns: 2,    //最少允许的列数clickToSelect: true,    //是否启用点击选中行searchOnEnterKey: true,columns: [{title: '序号',align: 'center',formatter: function (value, row, index) {return index + 1;}},{field: 'memberName',title: '姓名',searchable: true,align: 'center'},{field: 'account',title: '账号',searchable: true,align: 'center'},{title: '操作',align: 'center',searchable: false,formatter: function (value, row, index) {return '<a class="btn" style="margin-left: 10px;" ' +' onclick="deleteRecord(\'' + row.id + '\')">删除</a>';}}],onLoadSuccess: function (data) {  //加载成功时执行console.log(data)},onLoadError: function (err) {console.log(err);},showToggle: false,    //是否显示详细视图和列表视图的切换按钮cardView: false,     //是否显示详细视图detailView: false,     //是否显示父子表});}function deleteRecord(id) {$.ajax({method: "GET",url: constUtils.Server + "manage/deleteMember",data: {id:id},cache: false,dataType: "json",contentType: "application/json",async: false, //同步success: function (res) {console.log(res);$('#tabMain').bootstrapTable('refresh');},error: function (err) {console.log(err);}});}function addNewMember(){let memberInfo ={memberName: $('#txtName').val(),account: $('#txtAccount').val(),pwd: $('#txtPwd').val()};console.log(memberInfo);$.ajax({method: "POST",url: constUtils.Server + "manage/addMember",data: JSON.stringify(memberInfo),cache: false,dataType: "json",contentType: "application/json",async: false, //同步success: function (res) {console.log(res);$('#tabMain').bootstrapTable('refresh');},error: function (err) {console.log(err);}});}</script></body>
</html>

浏览器中加载H5进行测试

初始运行,Member 列表为空。

填写Member信息并提交

 提交后,表格中显示了新增的member,接口实现成功。 正常对MySql进行读写。

三、发布至Docker

1、发布jar包并部署至Docker

       Idea 中pom.xml修改version为 0.0.2,将springboot应用打包为 dapi-0.0.2.jar. 我使用的打包方式前置文章中有介绍。 将Jar包拷贝进VMWare Centos系统中。

修改Dockerfile 

#Dockerfile 内容FROM openjdk:24# 后端工作目录
VOLUME /app# 后端jar包名称
COPY dapi-0.0.2.jar /app/dapi.jar# 后端项目的端口号
EXPOSE 8093#启动时指令
ENTRYPOINT ["java", "-jar", "/app/dapi.jar"]

移除Docker中的dapi-0.0.1版本 

duel@localhost:~/workspace$ sudo docker ps -a
duel@localhost:~/workspace$ sudo docker stop dapi
duel@localhost:~/workspace$ sudo docker rm dapi
duel@localhost:~/workspace$ sudo docker ps -a
duel@localhost:~/workspace$ sudo docker images
duel@localhost:~/workspace$ sudo docker rmi dapi:1.0.0

安装上0.0.2版本 

#执行Image安装$ sudo docker build -t dapi:0.0.2 .#启动容器并映射端口$ sudo docker run --name dapi -p 8093:8093 -d dapi:0.0.2 --restart=always

Terminal终端日志如下: 

VMWare Centos 打开Firefox浏览器测试接口,成功。

切换Nginx代理的端口号 【38081】,测试成功。我的Nginx的配置可在前置文章中查看

2、发布静态网页至Docker

Windows 中 用 Webstorm创建的前端测试H5,拷贝至VMWare Center Os 中

VMWare Centos 系统下存放位置如下:

移除Nginx容器,重新创建Nginx。

Nginx配置方式可参考我的前置文章:

Windows VMWare Centos Docker部署Nginx并配置对Springboot应用的访问代理-CSDN博客

VMWare Centos 打开Firefox浏览器测试接口,成功。

3、Windows宿主机测试

     回到Windows宿主机,打开Chrome浏览器, 通过虚拟机Centos的ip + Docker中配置的Nginx的代理端口号对静态网页和接口分别进行测试。

接口访问成功,静态网页访问成功,网页调用接口加载数据失败:

查找原因:localhost 仅在 VMWare Centos 系统内部有效

修改接口地址后,重新发布

测试成功

至此,前后端分类的 Html  + Springboot + mybatis + MySql + Nginx 项目在VMWare Centos Docker中完整实践完成。

下一篇,继续实践 Springboot 处理文件上传后在Docker中的存储以及返回 http://upload_file_web_url 相关功能。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【科普】Cygwin与wsl与ssh连接ubuntu有什么区别?DIY机器人工房

Cygwin、WSL&#xff08;Windows Subsystem for Linux&#xff09;和通过 SSH 连接 Ubuntu 是三种在 Windows 环境下与类 Unix/Linux 系统交互的工具&#xff0c;但它们的本质、运行环境、功能范围有显著区别。以下从核心定义、关键差异和适用场景三个维度详细说明&#xff1a;…

Web前端数据可视化:ECharts高效数据展示完全指南

Web前端数据可视化&#xff1a;ECharts高效数据展示完全指南 当产品经理拿着一堆密密麻麻的Excel数据走向你时&#xff0c;你知道又到了"化腐朽为神奇"的时刻。数据可视化不仅仅是把数字变成图表那么简单&#xff0c;它是将复杂信息转化为直观洞察的艺术。 在过去两…

# IS-IS 协议 | LSP 传输与链路状态数据库同步机制

略作整理&#xff0c;待校。 SRM 和 SSN 标志的作用 SRM 标志 功能&#xff1a;SRM 标志用于跟踪路由器从一个接口向邻居发送链路状态协议数据单元&#xff08;LSP&#xff09;的状态。作用&#xff1a;确保 LSP 的正确传输和状态跟踪。 SSN 标志 广播网络 功能&#xff1…

Windows DOS CMD 100

1. systeminfo&#xff1a;显示系统详细信息&#xff08;安装日期/补丁/内存等&#xff09; 2. sfc /scannow&#xff1a;扫描并修复系统文件损坏 [管理员] 3. chkdsk /f&#xff1a;检查磁盘错误并修复&#xff08;需重启&#xff09; [管理员] 4. cleanmgr&#xff1a;启动…

HTML初学者第三天

<1>文档类型声明标签——<!DOCTYPE><!DOCTYPE>文档声明&#xff0c;作用是告诉浏览器使用哪种HTML版本来显示网页。<!DOCTYPE html>这句代码的意思是&#xff1a;当前页面采用的是HTML5版本来显示网页。注意&#xff1a;-<!DOCTYPE>声明位于文档…

学车笔记6

“不踩离合利用发动机制动”是指在驾驶过程中&#xff0c;驾驶员抬起油门踏板&#xff0c;但不踩下离合器踏板&#xff0c;利用发动机自身的阻力来减缓车辆速度的一种制动方式。具体介绍如下&#xff1a; #### 原理 - **动力传递反向**&#xff1a;正常情况下&#xff0c;发动…

人体坐姿检测系统项目教程(YOLO11+PyTorch+可视化)

&#x1f4a1;本文主要内容&#xff1a;本项目基于YOLO11深度学习目标检测算法&#xff0c;设计并实现了一个人体坐姿检测系统。系统能够自动识别图像或视频中的多种坐姿类型&#xff08;如&#xff1a;正常坐姿、不良坐姿等&#xff09;&#xff0c;为健康监测、智能教室、办公…

服务网格可观测性深度实践与创新优化

主题&#xff1a;突破服务网格监控瓶颈——基于eBPF的无侵入式全链路可观测性实践 技术领域&#xff1a;云原生/微服务/服务网格&#xff08;Service Mesh&#xff09; 一、问题背景&#xff1a;传统服务网格监控的痛点 在Istio、Linkerd等服务网格架构中&#xff0c;可观测…

微信小程序41~50

1.列表渲染-进阶用法 如果要对默认的变量名和下标进行修改&#xff0c;可以使用wx:for-item和wx:for-index wx:for-item可以指定数组当前元素的变量名 wx:for-index可以指定数组当前下标的变量名将wx:for用在标签上&#xff0c;以渲染一个包含多个节点的结构快 并不是一个组件…

向量数据库-Milvus快速入门

Milvus 概述 向量是神经网络模型的输出数据格式&#xff0c;可以有效地对信息进行编码&#xff0c;在知识库、语义搜索、检索增强生成&#xff08;RAG&#xff09;等人工智能应用中发挥着举足轻重的作用。 Milvus 是一个开源的向量数据库&#xff0c;适合各种规模的人…

uniapp的光标跟随和打字机效果

1、准备好容器文字的显示textRef&#xff0c;以及光标的显示 &#xff0c;使用transform-translate对光标进行移动到文字后面<template><view class"container" ref"contentRef"><u-parse :content"nodeText" ref"textRef&q…

「ECG信号处理——(21)基于Pan-Tompkins和随机森林(RF)的睡眠呼吸暂停检测算法」2025年7月4日

目录 1、引言 2、数据库介绍&#xff08;Apnea-ECG Database) 3、基于Pan-Tompkins和随机森林&#xff08;RF&#xff09;的睡眠呼吸暂停检测算法 3.1 算法概述 3.2 心电信号预处理及QRS波检测算法 3.3 心电信号的随机森林睡眠呼吸暂停识别 4、实验结果 4.1 心电信号预处理及QR…

C++学习之STL学习:list的模拟实现

在上一篇学习了list的使用后&#xff0c;在本篇我们将通过模拟实现的方式深入了解list的底层运作原理。 作者的个人gitee&#xff1a;楼田莉子 (riko-lou-tian) - Gitee.com 感兴趣的读者可以看一看 目录 前置准备 结点的定义 链表类的定义 迭代器 普通迭代器 const迭代器 …

不引入变量 异或交换的缺点

文章目录选择排序正确代码交换两个数位置的方法引入中间变量不引入中间变量&#xff0c;使用异或的方法错误原因优化代码选择排序正确代码 // 数组中交换i和j位置的数public static void swap(int[] arr, int i, int j) {int tmp arr[i];arr[i] arr[j];arr[j] tmp;}// 选择排…

VS Code中使用Git的方法:环境配置与Git操作

本文介绍在Windows电脑的VS Code中&#xff0c;配置Git环境并使用Git命令、功能的方法。 1 环境部署 首先&#xff0c;我们需要分别安装Git环境与VS Code软件。这里需要注意&#xff0c;即使是在VS Code中使用Git&#xff0c;也需要我们首先在电脑上单独配置好Git的环境&#…

在 Windows 上安装和运行 Apache Kafka

Apache Kafka是一款开源应用程序&#xff0c;用于实时处理海量数据流。Apache Kafka 是一个发布-订阅消息系统。消息系统允许您在进程、应用程序和服务器之间发送消息。广义上讲&#xff0c;Apache Kafka 是一款可以定义主题并进行进一步处理的软件。 下载和安装 Apache Kafk…

【嵌入式电机控制#8】编码器测速实战

一、编码器测速重要参数有刷电机编码器参数&#xff08;其他的后面会慢慢提及&#xff0c;也可以在某宝看&#xff09;1. 编码器分辨率&#xff08;PPR&#xff09;2. 编码器工作电压 3. 电机减速比 例如 30&#xff1a;1 指的就是电机减速轴转1圈&#xff0c;编码器转30圈。注…

在C#中,可以不实例化一个类而直接调用其静态字段

这是因为静态成员&#xff08;static members&#xff09;属于类本身&#xff0c;而不是类的实例。这是静态成员的核心特性1. 静态成员属于类&#xff0c;而非实例当用static关键字修饰字段、方法或属性时&#xff0c;这些成员会绑定到类级别&#xff0c;而不是实例级别。它们在…

Win11 安装 Visual Studio(保姆教程 - 更新至2025.07)

Visual Studio 安装&#xff08;保姆教程 - 更新至2025.07&#xff09; 前言安装须知安装过程1. 下载安装包2. 安装3. 注册4. 创建桌面快捷方式 前言 本教程针对 非计算机相关专业的小白用户 &#xff0c;手把手教你如何基于 win11 操作系统 安装 Visual Studio 2022。安装搭载…

工商银行杭州软开校招面经分享

近年来,央国企成为了很多求职者的首选,无论是校招还是社招。不过,在选择央国企的时候,还是尽量要选择垄断性或者盈利多的。 昨天看到一份 2024 年中国企业 500 强榜单中提到的最赚钱的十家央国企的名单,给大家分享一下。 排名企业名称成立时间主要业务描述2024年营收(万…