企业信息管理系统开发实战:基于 Spring Boot+MyBatis+Thymeleaf

引言:企业信息管理系统的核心价值

在企业日常运营中,高效的信息管理是提升效率的关键。本文将手把手教你开发一套企业信息管理系统,涵盖用户登录、信息增删改查、权限控制等核心功能。系统采用 Spring Boot 作为后端框架,MyBatis 处理数据交互,Thymeleaf 实现前端页面渲染,Druid 作为数据源保障性能,最终形成一套轻量、易用、可扩展的企业级解决方案。

一、系统架构与技术栈

1.1 系统功能概述

本系统聚焦企业用户信息管理,核心功能包括:

  • 用户登录 / 退出(含权限拦截)
  • 用户信息列表展示
  • 用户信息添加、修改、删除
  • 前端页面动态渲染与交互

1.2 技术栈选择

  • 后端:Spring Boot 3.2.8(框架核心)、MyBatis 3.0.3(ORM 框架)、Druid 1.2.20(数据源)
  • 前端:Thymeleaf 3.1.2(模板引擎)、HTML5/CSS3(页面结构与样式)、jQuery 3.7.1(前端交互)
  • 数据库:MySQL 8.0(数据存储)
  • 开发工具:IntelliJ IDEA、Maven(依赖管理)

二、环境搭建与项目初始化

2.1 数据库设计

首先创建系统所需的数据库表,以my_user表为例(存储用户信息):

SET FOREIGN_KEY_CHECKS=0;-- 用户表结构
DROP TABLE IF EXISTS `my_user`;
CREATE TABLE `my_user` (`pid` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',`username` varchar(255) DEFAULT NULL COMMENT '用户名',`password` varchar(255) DEFAULT NULL COMMENT '密码',`p_addr` varchar(255) DEFAULT NULL COMMENT '地址(下划线命名)',`gender` int(11) DEFAULT NULL COMMENT '性别(1-男,0-女)',`birth` date DEFAULT NULL COMMENT '生日',PRIMARY KEY (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户信息表';-- 初始化测试数据
INSERT INTO `my_user` VALUES (1, 'zhangsan', '123', '北京', 1, '2020-06-14');

2.2 项目结构设计

遵循 Spring Boot 最佳实践,项目结构如下:

src/
├── main/
│   ├── java/com/qcby/inforcontrollersystem/
│   │   ├── config/           # 配置类(Druid、MyBatis、MVC等)
│   │   ├── controller/       # 控制器(处理请求)
│   │   ├── entity/           # 实体类(与数据库表映射)
│   │   ├── interceptor/      # 拦截器(登录验证等)
│   │   ├── mapper/           # MyBatis映射接口
│   │   ├── service/          # 业务逻辑层(含Impl实现)
│   │   └── InforControllerSystemApplication.java  # 启动类
│   ├── resources/
│   │   ├── application.yaml  # 主配置文件
│   │   ├── static/           # 静态资源(css、images、js)
│   │   └── templates/        # Thymeleaf模板(login.html、main.html等)
└── test/                      # 单元测试目录

2.3 核心依赖配置(pom.xml)

通过 Maven 管理依赖,关键依赖如下:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.8</version>
</parent><dependencies><!-- Spring Boot Web核心 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Thymeleaf模板引擎 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!-- MyBatis整合 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency><!-- Druid数据源(适配Spring Boot 3) --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.20</version></dependency><!-- MySQL驱动 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!-- jQuery(WebJars方式) --><dependency><groupId>org.webjars</groupId><artifactId>jquery</artifactId><version>3.7.1</version></dependency><!-- 测试依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

三、核心配置详解

3.1 数据源配置(Druid)

Druid 作为高性能数据源,需配置连接池参数和监控功能,创建DruidConfig.java

package com.qcby.inforcontrollersystem.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;@Configuration
public class DruidConfig {// 绑定application.yaml中spring.datasource前缀的配置@Bean@ConfigurationProperties(prefix = "spring.datasource")public DataSource dataSource() {return new DruidDataSource();}
}

3.2 MyBatis 配置(解决驼峰映射)

数据库表字段采用下划线命名(如p_addr),实体类采用驼峰命名(如pAddr),需配置映射规则:

package com.qcby.inforcontrollersystem.config;import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MybatisConfig {@Beanpublic ConfigurationCustomizer configurationCustomizer() {// 开启下划线转驼峰映射return configuration -> configuration.setMapUnderscoreToCamelCase(true);}
}

3.3 MVC 配置(视图映射与拦截器)

配置页面路由和登录拦截器,确保未登录用户无法访问核心功能:

package com.qcby.inforcontrollersystem.config;import com.qcby.inforcontrollersystem.interceptor.LoginInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.ArrayList;
import java.util.List;@Configuration
@MapperScan("com.qcby.inforcontrollersystem.mapper") // 扫描MyBatis Mapper接口
public class TxMvcConfig implements WebMvcConfigurer {// 视图映射:直接将请求路径映射到模板页面@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/toLogin").setViewName("login"); // /toLogin -> login.htmlregistry.addViewController("/index").setViewName("index");   // /index -> index.htmlregistry.addViewController("/menu").setViewName("menu");     // /menu -> menu.html}// 注册拦截器:拦截未登录用户@Overridepublic void addInterceptors(InterceptorRegistry registry) {List<String> excludePaths = new ArrayList<>();// 排除登录页、静态资源等不需要拦截的路径excludePaths.add("/css/**");excludePaths.add("/images/**");excludePaths.add("/toLogin");excludePaths.add("/login");registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**") // 拦截所有请求.excludePathPatterns(excludePaths); // 排除指定路径}
}

四、核心功能实现

4.1 实体类设计(MyUser.java)

my_user表映射,包含用户基本信息:

package com.qcby.inforcontrollersystem.entity;import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;public class MyUser {private Integer pid;         // 主键private String username;     // 用户名private String password;     // 密码private String pAddr;        // 地址(驼峰命名,对应表中p_addr)private Integer gender;      // 性别@DateTimeFormat(pattern = "yyyy-MM-dd") // 日期格式转换private Date birth;          // 生日// 构造方法、Getter、Setter(省略,需手动生成)
}

4.2 登录拦截器(LoginInterceptor.java)

拦截未登录用户,强制跳转至登录页:

package com.qcby.inforcontrollersystem.interceptor;import com.qcby.inforcontrollersystem.entity.MyUser;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HttpSession session = request.getSession();MyUser user = (MyUser) session.getAttribute("user"); // 从Session获取用户信息if (user == null) {// 未登录,重定向到登录页response.sendRedirect(request.getContextPath() + "/toLogin");return false;}// 已登录,放行return true;}
}

4.3 数据访问层(Mapper 接口)

通过 MyBatis 注解实现数据库操作:

package com.qcby.inforcontrollersystem.mapper;import com.qcby.inforcontrollersystem.entity.MyUser;
import org.apache.ibatis.annotations.*;
import java.util.List;
import java.util.Map;public interface MyUserMapper {// 新增用户(自增主键回写)@Options(useGeneratedKeys = true, keyProperty = "pid")@Insert("insert into my_user(username, password, p_addr, gender, birth) " +"values(#{username}, #{password}, #{pAddr}, #{gender}, #{birth})")void insert(MyUser user);// 查询所有用户@Select("select * from my_user")List<MyUser> selectUsers();// 登录验证(根据用户名和密码查询)@Select("select * from my_user where username = #{username} and password = #{password}")MyUser selectUsersByUsernameAndPassword(Map<String, String> map);// 根据ID查询用户(用于修改)@Select("select * from my_user where pid = #{pid}")MyUser selectUserById(int pid);// 更新用户信息@Update("update my_user set username=#{username}, password=#{password}, p_addr=#{pAddr}, " +"gender=#{gender}, birth=#{birth} where pid=#{pid}")void update(MyUser user);// 删除用户@Delete("delete from my_user where pid = #{pid}")void delete(int pid);
}

4.4 业务逻辑层(Service)

封装业务逻辑,调用 Mapper 接口:

// 接口定义
package com.qcby.inforcontrollersystem.service;import com.qcby.inforcontrollersystem.entity.MyUser;
import java.util.List;
import java.util.Map;public interface MyUserService {void insert(MyUser user);List<MyUser> selectUsers();MyUser selectUsersByUsernameAndPassword(Map<String, String> map);MyUser selectUserById(int pid);void update(MyUser user);void delete(int pid);
}// 实现类
package com.qcby.inforcontrollersystem.service.Impl;import com.qcby.inforcontrollersystem.entity.MyUser;
import com.qcby.inforcontrollersystem.mapper.MyUserMapper;
import com.qcby.inforcontrollersystem.service.MyUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;@Service
@Transactional // 开启事务管理
public class MyUserServiceImpl implements MyUserService {@Autowiredprivate MyUserMapper userMapper;@Overridepublic void insert(MyUser user) {userMapper.insert(user);}@Overridepublic List<MyUser> selectUsers() {return userMapper.selectUsers();}@Overridepublic MyUser selectUsersByUsernameAndPassword(Map<String, String> map) {return userMapper.selectUsersByUsernameAndPassword(map);}@Overridepublic MyUser selectUserById(int pid) {return userMapper.selectUserById(pid);}@Overridepublic void update(MyUser user) {userMapper.update(user);}@Overridepublic void delete(int pid) {userMapper.delete(pid);}
}

4.5 控制器(Controller)

处理前端请求,协调视图与数据:

(1)登录控制器(LoginController.java)
package com.qcby.inforcontrollersystem.controller;import com.qcby.inforcontrollersystem.entity.MyUser;
import com.qcby.inforcontrollersystem.service.MyUserService;
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.HashMap;
import java.util.Map;@Controller
public class LoginController {@Autowiredprivate MyUserService myUserService;// 跳转到登录页@GetMapping("/toLogin")public String toLogin() {return "login";}// 处理登录请求@PostMapping("/login")public String login(HttpSession session, String username, String password, Model model) {Map<String, String> map = new HashMap<>();map.put("username", username);map.put("password", password);MyUser user = myUserService.selectUsersByUsernameAndPassword(map);if (user != null) {// 登录成功,将用户信息存入Sessionsession.setAttribute("user", user);return "redirect:/index"; // 重定向到首页} else {// 登录失败,回显错误信息model.addAttribute("tip", "用户名或密码错误");return "login";}}// 退出登录@GetMapping("/logout")public String logout(HttpSession session) {session.invalidate(); // 清除Sessionreturn "redirect:/toLogin";}
}
(2)用户管理控制器(UserController.java)
package com.qcby.inforcontrollersystem.controller;import com.qcby.inforcontrollersystem.entity.MyUser;
import com.qcby.inforcontrollersystem.service.MyUserService;
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 org.springframework.web.bind.annotation.RequestParam;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;@Controller
public class UserController {@Autowiredprivate MyUserService myUserService;// 展示用户列表@GetMapping("/main")public String showUserList(Model model) {List<MyUser> users = myUserService.selectUsers();model.addAttribute("users", users); // 存入模型,供前端渲染return "main";}// 跳转到添加用户页面@GetMapping("/add")public String toAddPage() {return "add";}// 保存新用户@PostMapping("/save")public String saveUser(MyUser user, @RequestParam String birth) {try {// 转换日期格式(前端传递字符串,需转为Date)if (birth != null && !birth.isEmpty()) {user.setBirth(new SimpleDateFormat("yyyy-MM-dd").parse(birth));}myUserService.insert(user);} catch (ParseException e) {e.printStackTrace();}return "redirect:/main"; // 重定向到列表页}// 跳转到修改页面(携带用户ID)@GetMapping("/getUser")public String toUpdatePage(@RequestParam int pid, Model model) {MyUser user = myUserService.selectUserById(pid);model.addAttribute("user", user); // 回显用户信息return "update";}// 更新用户信息@PostMapping("/update")public String updateUser(MyUser user, @RequestParam String birth) {try {if (birth != null && !birth.isEmpty()) {user.setBirth(new SimpleDateFormat("yyyy-MM-dd").parse(birth));}myUserService.update(user);} catch (ParseException e) {e.printStackTrace();}return "redirect:/main";}// 删除用户@GetMapping("/delete")public String deleteUser(@RequestParam int pid) {myUserService.delete(pid);return "redirect:/main";}
}

五、前端页面实现(Thymeleaf 模板)

5.1 登录页(login.html)

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>用户登录</title><link th:href="@{/css/login.css}" rel="stylesheet"> <!-- 引入CSS --><script th:src="@{/webjars/jquery/3.7.1/jquery.min.js}"></script> <!-- 引入jQuery --><script>// 登录表单验证function login1() {const username = $("input[name='username']").val().trim();const password = $("input[name='password']").val().trim();if (!username) {alert("请输入用户名");return;}if (!password) {alert("请输入密码");return;}$("form").submit(); // 提交表单}</script>
</head>
<body>
<div id="login"><div id="top"><div id="top_left"><img th:src="@{/images/login_03.gif}" alt="系统Logo"></div></div><form th:action="@{/login}" method="post"><div id="center"><div id="center_middle"><!-- 登录错误提示 --><div style="color: red; text-align: center" th:text="${tip}"></div><div id="user">用户名:<input type="text" name="username" placeholder="请输入用户名"></div><div id="password">密码:<input type="password" name="password" placeholder="请输入密码"></div><div id="btn"><a href="#" onclick="login1()">登录</a><a href="#" onclick="$('form')[0].reset()">清空</a></div></div></div></form>
</div>
</body>
</html>

5.2 用户列表页(main.html)

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>用户列表</title><style>.mt { margin: 20px auto; width: 90%; border-collapse: collapse; }.mt th, .mt td { border: 1px solid #ddd; padding: 10px; text-align: center; }.add-btn { margin: 20px 0 0 5%; padding: 6px 12px; background: #4CAF50; color: white; text-decoration: none; }</style>
</head>
<body>
<!-- 添加用户按钮 -->
<a th:href="@{/add}" class="add-btn">添加用户</a><!-- 用户列表表格 -->
<table class="mt"><tr><th>用户名</th><th>密码</th><th>地址</th><th>性别</th><th>生日</th><th>操作</th></tr><!-- 遍历用户列表(Thymeleaf语法) --><tr th:each="user : ${users}"><td th:text="${user.username}"></td><td th:text="${user.password}"></td><td th:text="${user.pAddr}"></td><td th:text="${user.gender == 1 ? '男' : '女'}"></td> <!-- 性别转换 --><td th:text="${#calendars.format(user.birth, 'yyyy-MM-dd')}"></td> <!-- 日期格式化 --><td><a th:href="@{/getUser(pid=${user.pid})}">修改</a><a th:href="@{/delete(pid=${user.pid})}" onclick="return confirm('确定删除?')">删除</a></td></tr>
</table>
</body>
</html>

5.3 添加用户页(add.html)

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>添加用户</title><style>.mt { margin: 30px auto; border-collapse: collapse; }.mt td { padding: 10px; }input { padding: 6px; width: 250px; }</style>
</head>
<body>
<form th:action="@{/save}" method="post"><table class="mt"><tr><td>用户名</td><td><input type="text" name="username" required></td></tr><tr><td>密码</td><td><input type="password" name="password" required></td></tr><tr><td>地址</td><td><input type="text" name="pAddr"></td></tr><tr><td>性别</td><td><input type="radio" name="gender" value="1" checked>男<input type="radio" name="gender" value="0">女</td></tr><tr><td>生日</td><td><input type="date" name="birth"></td></tr><tr><td></td><td><input type="submit" value="保存"></td></tr></table>
</form>
</body>
</html>

六、系统配置文件(application.yaml)

统一配置数据源、MyBatis 等参数:

spring:datasource:username: rootpassword: rooturl: jdbc:mysql://localhost:3306/boot_demo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource# Druid连接池参数initialSize: 5minIdle: 5maxActive: 20maxWait: 60000timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: falsefilters: stat,wall  # 开启监控和防火墙# MyBatis配置
mybatis:mapper-locations: classpath:mapper/*.xml  # 若使用XML映射,需指定路径type-aliases-package: com.qcby.inforcontrollersystem.entity  # 实体类别名

七、系统测试与运行

  1. 启动项目:运行InforControllerSystemApplication.javamain方法,Spring Boot 内置 Tomcat 启动,默认端口 8080。
  2. 访问登录页:浏览器输入http://localhost:8080/toLogin,使用初始化数据(用户名zhangsan,密码123)登录。
  3. 功能验证
    • 登录成功后跳转至首页,展示用户列表;
    • 点击 "添加用户",填写信息后保存,列表页会新增记录;
    • 点击 "修改" 可更新用户信息,点击 "删除" 可移除记录;
    • 未登录时直接访问/main会被拦截,强制跳转至登录页。

 

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

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

相关文章

NLP自然语言处理的一些疑点整理

PyTorch评估模式&#xff08;torch.no_grad和model.eval&#xff09;差异在PyTorch中&#xff0c;model.eval()和torch.no_grad()是模型评估和推理阶段的两个关键工具&#xff0c;它们各自扮演着不同的角色&#xff0c;但常常被一起使用以确保模型行为的正确性和计算效率。理解…

物流仓储自动化升级:Modbus TCP与DeviceNet的协议融合实践

一、项目背景在我们物流厂的日常运营中&#xff0c;分拣效率和仓储精准度一直是瓶颈。传统人工分拣不仅速度慢&#xff0c;还容易因疲劳出错&#xff1b;仓储区域的货物定位全靠人工记录&#xff0c;时常出现找货难、盘点耗时的问题。生产线的核心控制依赖施耐德PLC&#xff0c…

产品动态 | 同创永益IStorM Chaos 混沌工程平台V4.0震撼发布:智能驱动,筑牢系统稳定性防线

当混沌工程从试点走向企业级大规模推广&#xff0c;标准化缺失、专家依赖高、实施效率低等痛点成为阻碍系统稳定性升级的 “拦路虎”。此刻&#xff0c;同创永益重磅推出IStorM Chaos 混沌工程平台 V4.0&#xff0c;以智能技术为核心驱动力&#xff0c;为企业构建更高效、更灵活…

C++中的反向迭代器

C中的反向迭代器 为啥反向迭代器的讲解要单独拎出来讲&#xff0c;没有在讲各个容器的时候顺手讲了呢&#xff1f; 主要是因为c中的反向迭代器和正向迭代器的实现不太一样。 它思想不复杂&#xff0c;主要是巧。来&#xff0c;我们按照我们刚刚的想法把代码写出来 #pragma once…

【一步步ai】数据增强与预处理

提升NL2SQL系统性能是一个复杂的多维度优化问题&#xff0c;涉及数据工程、模型架构、训练策略和评估方法等多个层面。以下是一些有效的提升方向和具体方法&#xff1a; 一、数据增强与预处理 多样化数据生成 模板扩展&#xff1a;基于SQL语法模板自动生成多样化的NL-SQL对&am…

站在哪个肩膀上开始学习卡尔曼滤波

站在哪个肩膀上开始学习卡尔曼滤波前言从自适应滤波的角度正交性原理到维纳解kalman滤波的提出innovation process新息过程kalman滤波算法Kalman 自适应滤波器算法初始条件输入观测向量过程已知参数计算&#xff1a;n1&#xff0c;2&#xff0c;3&#xff0c;..参考前言 不知道…

什么是FCR,如何提升FCR?

‌ FCR&#xff08;First Call Resolution&#xff0c;首次呼叫解决率&#xff09;&#xff0c;意思是指客户首次联系客服时&#xff0c;问题在单次交互中被完全解决的比率。‌ ‌FCR &#xff08;首次解决的通话量 / 总首次通话量&#xff09; 100%一、关键要点&…

【浏览器插件冲突】Edge浏览器加载不出来CSDN创作者中心

【浏览器插件冲突】Edge浏览器加载不出来CSDN创作者中心写在最前面报错GPT的全部回复&#xff0c;可以参考&#x1f50d; 具体错误解释&#xff1a;1. **CORS错误**2. **XHR 请求失败**3. **ReaderArticleFinder / Readability**&#x1f6e0;️ 为什么页面没有内容显示&#x…

从零开发Java坦克大战:架构设计与难点突破 (下)

6. 游戏引擎类:6.1 完整源码展示: import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.ArrayList; import java.util.HashSet; import java.util.Random; import java.util.Set;public class Gam…

Git下载与安装全攻略

引言 Git是当今最流行的分布式版本控制系统&#xff0c;由Linus Torvalds于2005年创建。它帮助开发者高效管理代码变更&#xff0c;支持多人协作开发&#xff0c;是现代软件开发不可或缺的工具。无论是个人项目还是团队协作&#xff0c;Git都能提供强大的版本控制功能。 本文…

【Elasticsearch】快照生命周期管理 SLM(理论篇)

《Elasticsearch 集群》系列&#xff0c;共包含以下文章&#xff1a; 1️⃣ 冷热集群架构2️⃣ 合适的锅炒合适的菜&#xff1a;性能与成本平衡原理公式解析3️⃣ ILM&#xff08;Index Lifecycle Management&#xff09;策略详解4️⃣ Elasticsearch 跨机房部署5️⃣ 快照与恢…

深入理解 UDP 协议:从原理到实战的技术解析

UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;作为 TCP 的 "轻量型伙伴"&#xff0c;在实时通信、流媒体传输等场景中发挥着不可替代的作用。与 TCP 的可靠传输不同&#xff0c;UDP 以 "简单、快速、无连接" 为设计理念&a…

c语言-数据结构-沿顺相同树解决对称二叉树问题的两种思路

二叉树OJ前言对称二叉树前言 本篇继续讲解二叉树OJ题目之对称二叉树 对称二叉树 题目链接&#xff1a;https://leetcode.cn/problems/symmetric-tree/description/ 该题要求比较这棵树是否对称&#xff0c;对称&#xff0c;指的是结构对称并且值也要对称&#xff0c;即对应…

云原生可观测-日志观测(Loki)最佳实践

一、Loki 简介 云原生可观测三大支柱 支柱工具用途MetricsPrometheus性能趋势、系统负载LogsLoki原始事件记录、错误诊断TracesTempo / Jaeger分布式链路追踪 一、Loki 简介 1.1 Loki 是什么 Loki 是由 Grafana Labs 开发的 日志聚合系统&#xff0c;与 Prometheus 架构一…

Windows Server 2003 R2系统C盘扩容教程

一、PAGreen软件下载 下载地址&#xff1a; ExtPart.zip https://pan.baidu.com/s/1FxK61XNI0t-4JIEWK1QA8Q?pwd8888 提取码: 8888 二、将软件解压缩 (1)、执行步骤一下载的程序 双击下图所示可执行程序 (2)、选择好解压路径&#xff0c;点击「Unzip」进行解压缩 (3)、磁…

Kubernetes配置管理

目录什么是ConfigMap创建ConfigMap1&#xff1a;基于目录创建ConfigMap1.创建conf目录&#xff0c;放置文件2.基于目录下的所有文件创建ConfigMap3.查看当前创建的ConfigMap2&#xff1a;基于文件创建ConfigMap1.单个文件创建ConfigMap2.使用带有key的命令创建ConfigMap3.多个文…

golang怎么实现每秒100万个请求(QPS),相关系统架构设计详解

一.需求 使用Golang,以Gin框架为基础,设计一个能够处理每秒100万请求(QPS 1M)的系统架构 注意:100万QPS是一个很高的数字,单机通常难以处理,所以必须采用分布式架构,并且需要多层次的架构设计和优化 二.搭建步骤 1.系统架构设计 为了实现高并发,需要考虑以下几个方面…

HCIA再复习

第一章.网络基础1.1 网络类型分类网络按照二层链路类型分为以下四种&#xff1a;多点接入网络&#xff08;MA&#xff09;&#xff1a;1&#xff0c;广播型多点接入&#xff08;BMA&#xff09;&#xff1a;如以太网&#xff0c;支持广播&#xff0c;设备通过MAC地址通信&#…

Qt 数据库连接池实现与管理

在 Qt 应用程序中&#xff0c;频繁创建和销毁数据库连接会带来显著的性能开销。数据库连接池通过复用现有连接&#xff0c;避免重复创建和销毁连接的开销&#xff0c;从而提高应用程序的响应速度和吞吐量。本文将详细介绍 Qt 中数据库连接池的实现与管理方法。 一、数据库连接池…

数据采集分析:从信息洪流中掘金的科学与艺术

——如何将原始数据转化为商业决策的黄金&#xff1f;&#x1f310; 引言&#xff1a;我们正淹没在数据的海洋&#xff0c;却渴求着知识的甘泉每天全球产生 2.5万亿字节 数据&#xff08;相当于每秒下载4.5万部高清电影&#xff09;&#xff0c;但未经分析的数据如同未提炼的原…