博客星球大冒险:用Spring Boot和JWT打造你的数字王国

news2024/11/24 13:31:29

揭秘如何在Spring Boot中无缝集成JWT,为你的应用打造一个高度可扩展且安全的认证系统。从添加依赖到创建JWT过滤器,再到实现令牌的有效性管理和刷新机制,每一步都精心设计,确保你的乐园能够迎接成千上万的游客!

文章目录

    • 构建一个基于Spring Boot的个人博客系统
      • 第一部分:搭建基础框架
      • 第二部分:文章的CRUD操作与JWT令牌验证
        • 创建文章
        • 读取文章
        • 更新文章
        • 删除文章
        • JWT令牌验证
      • 第三部分:增强安全性与JWT令牌刷新
        • 使用HTTPS
        • CORS策略配置
        • JWT令牌刷新机制
      • 第四部分:监控与维护,确保系统稳定运行
        • 系统监控
        • 数据备份
        • 用户反馈
        • 性能优化
        • 安全审计
        • 持续集成/持续部署(CI/CD)
      • 实战案例总结与未来展望
        • 实战案例总结
        • 未来展望

在这里插入图片描述

构建一个基于Spring Boot的个人博客系统

第一部分:搭建基础框架

在这个信息爆炸的时代,每个人都有自己的故事想要分享。想象一下,你是一个充满激情的博主,想要搭建一个属于自己的个人博客系统,让世界听到你的声音。而今天,我们就要用Spring Boot和JWT来实现这个梦想。

首先,我们需要搭建一个基础的Spring Boot项目。这就像是准备一块空白的画布,等待我们在上面挥洒创意。

  1. 创建项目:打开你最爱的IDE(比如IntelliJ IDEA或者Eclipse),创建一个新的Spring Boot项目。选择你需要的依赖,比如Spring WebSpring SecurityJWT

  2. 配置文件:在src/main/resources目录下,创建你的application.properties文件,配置数据库连接、服务器端口等信息。

    server.port=8080
    spring.datasource.url=jdbc:mysql://localhost:3306/your_blog_db
    spring.datasource.username=root
    spring.datasource.password=yourpassword
    jwt.secret=your_jwt_secret_key
    
  3. 数据库设计:设计一个简单的数据库,至少包含用户表和博客文章表。用户表存储用户的基本信息,博客文章表存储文章内容。

  4. 实体类:创建对应的实体类(Entity),比如UserPost

    @Entity
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String username;
        private String password;
        // getters and setters
    }
    
    @Entity
    public class Post {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String title;
        private String content;
        @ManyToOne
        private User author;
        // getters and setters
    }
    
  5. 仓库接口:创建Spring Data JPA的仓库接口,用于数据访问。

    public interface UserRepository extends JpaRepository<User, Long> {
        Optional<User> findByUsername(String username);
    }
    
    public interface PostRepository extends JpaRepository<Post, Long> {
        List<Post> findByAuthorId(Long authorId);
    }
    
  6. 安全配置:配置Spring Security,启用JWT认证。

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        // 省略部分代码...
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                // 配置省略...
                .csrf().disable(); // 禁用CSRF,因为JWT是无状态的
        }
    }
    
  7. 用户服务:创建用户服务,用于处理用户注册、登录等业务逻辑。

    @Service
    public class UserService {
        @Autowired
        private UserRepository userRepository;
        @Autowired
        private PasswordEncoder passwordEncoder;
    
        public User registerUser(User user) {
            user.setPassword(passwordEncoder.encode(user.getPassword()));
            return userRepository.save(user);
        }
    
        public String login(String username, String password) {
            User user = userRepository.findByUsername(username)
                .orElseThrow(() -> new RuntimeException("User not found"));
            if (passwordEncoder.matches(password, user.getPassword())) {
                return Jwts.builder()
                    .setSubject(user.getUsername())
                    .signWith(SignatureAlgorithm.HS256, "your_jwt_secret_key".getBytes())
                    .compact();
            }
            throw new RuntimeException("Invalid username or password");
        }
    }
    
  8. 控制器:创建控制器,提供API接口。

    @RestController
    @RequestMapping("/api")
    public class UserController {
        @Autowired
        private UserService userService;
    
        @PostMapping("/register")
        public ResponseEntity<?> register(@RequestBody User user) {
            User registeredUser = userService.registerUser(user);
            return ResponseEntity.ok(registeredUser);
        }
    
        @PostMapping("/login")
        public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
            String token = userService.login(loginRequest.getUsername(), loginRequest.getPassword());
            return ResponseEntity.ok(new AuthenticationResponse(token));
        }
    }
    

现在,我们已经搭建了一个基本的个人博客系统的框架。在下一部分,我们将实现文章的创建、查询、更新和删除功能,同时加入JWT令牌的验证,确保只有登录用户才能操作自己的文章。敬请期待,我们的个人博客系统即将变得更加完善和安全!

第二部分:文章的CRUD操作与JWT令牌验证

随着我们的个人博客系统的基础框架搭建完成,现在我们要进入更加激动人心的部分——实现文章的CRUD(创建、读取、更新、删除)操作,并确保通过JWT令牌验证来保护这些操作的安全。

创建文章

首先,我们需要允许用户创建文章。这就像是在乐园中添加新的游乐设施,让游客们有更多新鲜事物可以体验。

  1. 文章控制器:在控制器中添加创建文章的接口。

    @RestController
    @RequestMapping("/api/posts")
    public class PostController {
        @Autowired
        private PostService postService;
    
        @PostMapping("/")
        public ResponseEntity<?> createPost(@RequestBody Post post, @AuthenticationPrincipal User currentUser) {
            if (post.getAuthor().getId().equals(currentUser.getId())) {
                Post createdPost = postService.createPost(post);
                return ResponseEntity.ok(createdPost);
            }
            return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
        }
    }
    
  2. 文章服务:在服务层实现创建文章的逻辑。

    @Service
    public class PostService {
        @Autowired
        private PostRepository postRepository;
    
        public Post createPost(Post post) {
            return postRepository.save(post);
        }
        // 其他服务方法...
    }
    
读取文章

接下来,我们需要允许用户读取文章。这就像是在乐园中设置指示牌,让游客们知道每个游乐设施的位置和介绍。

  1. 读取单篇文章:允许用户通过文章ID来读取单篇文章。

    @GetMapping("/{id}")
    public ResponseEntity<?> getPostById(@PathVariable Long id) {
        Optional<Post> post = postRepository.findById(id);
        if (post.isPresent()) {
            return ResponseEntity.ok(post.get());
        }
        return ResponseEntity.notFound().build();
    }
    
  2. 读取用户所有文章:允许用户读取自己所有的文章。

    @GetMapping("/user/{userId}")
    public ResponseEntity<?> getPostsByUser(@PathVariable Long userId, @AuthenticationPrincipal User currentUser) {
        if (currentUser.getId().equals(userId)) {
            List<Post> posts = postService.getPostsByUser(userId);
            return ResponseEntity.ok(posts);
        }
        return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
    }
    
更新文章

更新文章就像是给游乐设施进行维护和升级,确保它们始终保持最佳状态。

  1. 更新文章接口:在控制器中添加更新文章的接口。

    @PutMapping("/{id}")
    public ResponseEntity<?> updatePost(@PathVariable Long id, @RequestBody Post postDetails, @AuthenticationPrincipal User currentUser) {
        Optional<Post> post = postRepository.findById(id);
        if (post.isPresent() && post.get().getAuthor().getId().equals(currentUser.getId())) {
            post.get().setTitle(postDetails.getTitle());
            post.get().setContent(postDetails.getContent());
            Post updatedPost = postRepository.save(post.get());
            return ResponseEntity.ok(updatedPost);
        }
        return ResponseEntity.notFound().build();
    }
    
删除文章

最后,我们需要允许用户删除文章。这就像是在乐园中拆除老旧的设施,为新的创意腾出空间。

  1. 删除文章接口:在控制器中添加删除文章的接口。

    @DeleteMapping("/{id}")
    public ResponseEntity<?> deletePost(@PathVariable Long id, @AuthenticationPrincipal User currentUser) {
        Optional<Post> post = postRepository.findById(id);
        if (post.isPresent() && post.get().getAuthor().getId().equals(currentUser.getId())) {
            postRepository.delete(post.get());
            return ResponseEntity.ok().build();
        }
        return ResponseEntity.notFound().build();
    }
    
JWT令牌验证

为了确保用户只能操作自己的文章,我们在每个需要认证的请求处理方法中,通过@AuthenticationPrincipal注解注入了当前认证的用户信息。然后,我们检查当前用户是否是文章的所有者。

通过这种方式,我们不仅实现了文章的CRUD操作,还确保了操作的安全性,防止了未授权的访问。

在本实战案例的下一部分,我们将深入探讨如何进一步增强我们的博客系统的安全性,包括使用HTTPS、配置CORS策略以及实现JWT的刷新机制等。敬请期待,让我们的博客系统更加坚不可摧!
在这里插入图片描述

第三部分:增强安全性与JWT令牌刷新

随着我们个人博客系统的CRUD功能实现,现在是时候加强系统的安全性,确保我们的数据和用户信息安全无虞。在这部分,我们将通过几个关键步骤来提升我们系统的安全等级。

使用HTTPS

首先,我们需要确保所有的数据传输都是加密的。这就像是给我们的乐园加上了一层隐形的防护罩,保护游客的安全。

  1. 获取SSL证书:你可以从证书颁发机构(CA)获取免费的SSL证书,或者如果你的服务器支持,也可以自签名一个证书。

  2. 配置HTTPS:在Spring Boot应用中配置HTTPS,通常涉及到配置server.ssl.key-store和相关的密钥密码。

    server.port=8443
    server.ssl.key-store=classpath:your.keystore
    server.ssl.key-store-password=your_keystore_password
    server.ssl.keyStoreType=PKCS12
    server.ssl.keyAlias=your_keyalias
    
  3. 强制重定向:在应用中强制所有HTTP请求重定向到HTTPS。

    @Configuration
    public class HttpsRedirectConfig {
        @Bean
        public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
            return http
                .requiresChannel()
                .anyRequest().requiresSecure()
                .and()
                .build();
        }
    }
    
CORS策略配置

跨源资源共享(CORS)是一个重要的安全机制,可以防止恶意网站访问我们的资源。我们需要合理配置CORS策略。

  1. CORS配置:在Spring Security配置中添加CORS策略。

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .cors().configurationSource(request -> {
                CorsConfiguration config = new CorsConfiguration();
                config.setAllowedOrigins(Collections.singletonList("https://your-client-domain.com"));
                config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
                return config;
            })
            .and()
            // 其他配置...
    }
    
JWT令牌刷新机制

JWT令牌通常有一个过期时间,所以我们需要一个机制来刷新令牌,而不是让用户重新登录。

  1. 刷新令牌(Refresh Token):当用户登录时,除了访问令牌外,我们还发放一个具有更长有效期的刷新令牌。

    public class AuthenticationResponse {
        private String accessToken;
        private String refreshToken;
    
        // 构造函数、getter和setter
    }
    
  2. 刷新令牌存储:刷新令牌需要被安全地存储在服务端,通常可以使用Redis等内存数据库。

  3. 刷新接口:创建一个接口,允许用户使用刷新令牌来获取新的访问令牌。

    @PostMapping("/refresh")
    public ResponseEntity<?> refreshAuthenticationToken(@RequestBody RefreshTokenRequest request) {
        String refreshToken = request.getRefreshToken();
        // 验证刷新令牌的有效性,如果有效,生成新的访问令牌
        // ...
    }
    
  4. 自动刷新令牌:在客户端,我们可以编写逻辑来自动检测令牌过期,并使用刷新令牌来获取新的访问令牌。

    // 假设我们有一个函数来检查令牌是否过期
    function isTokenExpired(token) {
        // 实现检查逻辑
    }
    
    // 刷新令牌的函数
    async function refreshToken() {
        const response = await fetch('/api/refresh', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({ refreshToken: localStorage.refreshToken })
        });
        const data = await response.json();
        localStorage.setItem('accessToken', data.accessToken);
        // 更新访问令牌并重试请求
    }
    
    // 在发送请求前检查令牌
    if (isTokenExpired(localStorage.accessToken)) {
        refreshToken().catch(error => console.error('Refresh token failed', error));
    }
    

通过这些步骤,我们不仅增强了个人博客系统的安全性,还提升了用户体验,让用户能够无缝地继续他们的活动,即使在令牌过期后也能平滑过渡。

接下来,我们将探讨如何监控和维护我们的系统,确保它始终运行在最佳状态。敬请期待,让我们的个人博客系统成为乐园中最闪亮的星!

第四部分:监控与维护,确保系统稳定运行

随着我们的个人博客系统功能日益完善,安全性得到加强,现在是时候关注系统的监控与维护了。这就像是乐园的日常运营,需要确保一切运转顺畅,给游客提供最好的体验。

系统监控

监控是确保系统稳定运行的关键。我们需要监控服务器性能、应用状态以及用户活动。

  1. 服务器监控:使用工具如Nagios、Zabbix或云服务提供商的监控工具来监控CPU、内存、磁盘和网络状态。

  2. 应用性能监控(APM):利用New Relic、Datadog或Spring Boot Actuator等工具来监控应用性能,包括响应时间、错误率等。

  3. 日志管理:配置日志管理系统,如ELK Stack(Elasticsearch, Logstash, Kibana)或Graylog,来收集、搜索和分析日志。

    logging.file.name=logs/myblog.log
    logging.level.root=WARN
    logging.level.com.example.myblog=DEBUG
    
  4. 健康检查:实现健康检查端点,用于实时监控应用状态。

    @GetMapping("/actuator/health")
    public Map<String, Object> healthCheck() {
        // 实现健康检查逻辑
    }
    
数据备份

数据是任何系统最宝贵的资产,因此定期备份至关重要。

  1. 定期备份:设置定期备份计划,备份数据库和重要文件。

  2. 灾难恢复计划:制定灾难恢复计划,确保在发生严重故障时能够快速恢复服务。

用户反馈

用户的反馈是改进系统的重要途径。

  1. 收集用户反馈:提供一个渠道,让用户可以报告问题或提出改进建议。

  2. 用户行为分析:分析用户行为数据,了解用户如何使用你的应用,并发现潜在的改进点。

性能优化

随着用户量的增加,性能优化变得尤为重要。

  1. 代码优化:定期审查和优化代码,减少不必要的计算和资源消耗。

  2. 数据库优化:优化数据库查询,使用索引,定期清理和维护数据库。

  3. 缓存策略:使用缓存来减少数据库访问次数,提高响应速度。

    @Cacheable("posts")
    public Post getPostById(Long id) {
        // 数据库查询逻辑
    }
    
安全审计

定期进行安全审计,确保没有安全漏洞。

  1. 代码审计:定期进行代码审计,查找潜在的安全漏洞。

  2. 依赖审计:使用工具如OWASP Dependency-Check来检查项目依赖中的已知漏洞。

  3. 安全测试:定期进行渗透测试和安全扫描,确保系统安全。

持续集成/持续部署(CI/CD)

自动化的CI/CD流程可以确保代码质量,并快速部署新功能和修复。

  1. 自动化测试:编写单元测试和集成测试,确保代码更改不会引入新的错误。

  2. 构建自动化:使用Jenkins、GitLab CI或GitHub Actions等工具自动化构建过程。

  3. 自动化部署:自动化部署流程,确保新版本可以平滑上线。

通过这些监控与维护措施,我们的个人博客系统将能够稳定运行,为用户提供持续的服务。这不仅能够提升用户满意度,还能确保我们能够及时发现并解决问题,保持系统的长期健康。

随着本实战案例的结束,我们希望读者能够从中获得宝贵的知识和经验,构建出自己的安全、稳定、高效的个人博客系统。记住,技术之路永无止境,持续学习、实践和改进,你的乐园将越来越精彩!
在这里插入图片描述

实战案例总结与未来展望

在本系列的实战案例中,我们从零开始,一步步构建了一个基于Spring Boot和JWT的个人博客系统。我们不仅实现了基本的CRUD功能,还加强了系统的安全性,实现了用户认证和授权,并通过HTTPS、CORS策略和JWT刷新机制来保护用户数据。此外,我们还探讨了如何对系统进行监控和维护,以及如何通过社区建设和开源协作来促进项目的持续发展。

实战案例总结
  1. 基础框架搭建:我们创建了用户和文章的实体类,配置了数据库,并实现了基本的Spring Security认证流程。

  2. CRUD功能实现:我们为博客文章提供了完整的创建、读取、更新和删除功能,并通过@AuthenticationPrincipal注解确保了操作的安全性。

  3. 安全性加强:通过实现HTTPS、CORS策略和JWT刷新机制,我们加强了系统的安全性,保护了用户数据和隐私。

  4. 监控与维护:我们讨论了如何对系统进行监控,包括服务器性能、应用状态和用户活动,并强调了数据备份和灾难恢复计划的重要性。

  5. 社区贡献与持续发展:我们探讨了如何通过社区建设、开源协作、持续学习、用户支持和国际化来促进项目的持续发展和创新。

未来展望

随着技术的不断进步和用户需求的不断变化,我们的个人博客系统也需要不断地演进和改进。以下是一些可能的未来发展方向:

  1. 人工智能集成:利用机器学习算法来分析用户行为,提供个性化的内容推荐。

  2. 移动应用开发:开发移动应用版本,让用户能够随时随地撰写和阅读博客。

  3. 社交功能增强:增加社交互动功能,如评论、点赞和分享,以提高用户参与度。

  4. 多云和微服务架构:随着用户量的增长,考虑采用多云策略和微服务架构来提高系统的可扩展性和可用性。

  5. 区块链技术应用:探索区块链技术在内容版权保护和用户身份验证方面的应用。

  6. 增强现实(AR)和虚拟现实(VR):利用AR和VR技术为用户提供沉浸式的内容体验。

  7. 国际化和本地化:进一步扩展多语言支持,为全球用户提供本地化的用户体验。

  8. 环境友好和可持续性:优化系统架构,减少能源消耗,致力于构建环境友好的绿色应用。

通过这些未来展望,我们可以看到个人博客系统的潜力和可能性是无限的。随着技术的不断发展,我们有理由相信,我们的系统将变得更加智能、互动和全球化。

在此,我们的实战案例告一段落。希望大伙们能够从本系列中获得启发,不仅在技术上有所提升,更在思维和视野上得到拓展。记住,每一次代码的编写,都是我们构建未来世界的一小步。让我们携手前进,共同创造一个更加美好的数字世界。

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

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

相关文章

HOW - BFF 服务实践系列(一)

目录 一、BFF 介绍1.1 BFF 的概念1.2 为什么需要 BFF1.3 举例说明 二、适用于Web前端的BFF应该提供哪些能力2.1 接口聚合&#xff08;重要&#xff09;2.2 简化和优化的API2.3 安全和身份验证&#xff08;重要&#xff09;2.4 缓存机制2.5 错误处理和重试机制2.6 数据格式转换2…

Nvidia Orin/Jetson +GMSL/RLINC/VbyOne/FPDLink 同轴AI多相机同步车载视觉解决方案

在本次演讲中&#xff0c;介绍了多相机同步技术在自主机器中的应用情况&#xff0c;围绕无人配送小车、控制器视觉传感器方案升级、人形机器人三个典型案例中如何为客户提供高效的多相机同步解决方案进行了详细的讲解&#xff0c;并进一步介绍如何通过创新的多相机同步技术&…

掌控未来,爱普生SR3225SAA用于汽车钥匙、射频电路的智慧引擎

为了响应市场需求&#xff0c;Epson使用独家QMEMS*2技术所生产的石英振荡器&#xff0c;与其精巧的半导体技术所制造的射频传输器电路&#xff0c;开发了SR3225SAA。不仅内建的石英震荡器之频率误差仅有2 ppm&#xff0c;更使其封装尺寸达仅3.2 mm x 2.5 mm&#xff0c;为客户大…

Maven简介和快速入门

1.1Maven介绍 Maven – Introduction (apache.org) Maven就是一个软件&#xff0c;掌握软件安装、配置、以及基本功能&#xff08;项目构建、依赖管理&#xff09;。 1.2Maven主要作用 1.依赖管理&#xff1a; Maven 可以管理项目的依赖&#xff0c;包括自动下载所需依赖库、…

Aigtek功率放大器的主要性能要求有哪些

功率放大器是电子系统中的重要组件&#xff0c;用于将低功率信号放大到高功率水平。功率放大器的性能直接影响到信号的放大质量和系统的整体性能。下面西安安泰将介绍功率放大器的主要性能要求。 增益&#xff1a;功率放大器应当具有足够的增益&#xff0c;即将输入信号的幅度放…

机器人控制系列教程之D-H参数建模法

机器人运动学的研究依赖于机器人的模型的建立&#xff0c;目前较为多见的两种方法分别是Denavit-Hartenberg建模法&#xff08;简称&#xff1a;D-H建模法&#xff09;。该方法时由Denavit和Hartenberg于19955年提出的一种为关节链中的每一个杆件建立一个坐标系的矩阵方法&…

VIO System 丨适用于控制器开发前期的测试系统

VIO综述 嵌入式软件的HIL测试需要复杂的测试系统及完整的ECU硬件&#xff0c;这导致通常只能在开发流程的后期阶段进行测试。全新推出的低成本解决方案VIO System&#xff0c;使得在开发前期不仅可以进行总线通讯测试&#xff0c;也可以同时进行I/O信号测试。 该系统旨在通过…

产品上市新闻稿怎么写?纯干货

一个产品的上市&#xff0c;想要达到一个非常好的宣传效果&#xff0c;前期的预热造势是必不可少的&#xff0c;投放产品上市新闻稿到权威专业的媒体&#xff0c;潜移默化去影响用户的心智&#xff0c;产品上市新闻稿怎么写&#xff1f;接下来伯乐网络传媒就来给大家分享一下&a…

MFC 解决Enter回车键和Esc取消键默认关闭窗口的三种方法

文章目录 问题描述问题原因解决办法方法一&#xff1a;在重载的PreTranslateMessage 函数中屏蔽回车和ESC 的消息方法二&#xff1a;重载OnOK函数方法三&#xff1a;将所有按钮类型设为普通按钮&#xff0c;并设置其中一个按钮为默认按钮 问题描述 一般情况下编写的MFC对话框程…

8086 汇编笔记(三):第一个程序

一、一个源程序从写出到执行的过程 第一步&#xff1a;编写汇编源程序 第二步&#xff1a;对源程序进行编译连接 第三步&#xff1a;执行可执行文件中的程序 二、源程序 codesg segment ; 定义一个段&#xff0c;段的名称为“codesg”&#xff0c;这个段从此开始…

day25-XML

1.xml 1.1概述【理解】 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年&#xff0c;又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者&#xff1a; Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域最具权威和影响力的国际中立性技术标准机构。 到目前为…

散射技术在AI去衣中的作用及其伦理考量

引言&#xff1a; 在人工智能的众多应用领域中&#xff0c;图像处理一直是一个热门话题。近年来&#xff0c;随着深度学习技术的飞速发展&#xff0c;AI去衣功能引起了广泛的关注和讨论。这项技术的核心在于利用先进的算法对图像进行处理&#xff0c;以实现从图片或视频中移除衣…

java家政上门系统源码,一套同城预约、上门服务的家政系统源码

一款同城预约、上门服务的家政系统源码&#xff0c;用户端、服务端、管理端各端相互依赖又相互独立&#xff0c;支持选择项目、选择服务人员的下单方式&#xff0c;支持多城市并且设置每个城市专属服务项目。 技术架构&#xff1a;java1.8springboot mysql htmlThymeleaf uni…

Spring Cloud Alibaba-09-Seata分布式事务

Lison <dreamlison163.com>, v1.0.0, 2024.5.03 Spring Cloud Alibaba-09-Seata分布式事务 文章目录 Spring Cloud Alibaba-09-Seata分布式事务分布式事务基础事务本地事务分布式事务分布式事务的场景 分布式事务的解决方案全局事务可靠消息服务最大努力通知TCC事务 Se…

【C++】vector和list的迭代器

目录 前言 一.迭代器的使用 1.vector迭代器 2.list迭代器的使用 二.迭代器失效问题 1.vector迭代器失效问题 2.list迭代器失效问题 三.vector和list的对比 前言 我们在学习CSTL部分的时候&#xff0c;在vector和list的部分初步认识了迭代器&#xff0c;以及在初学阶段…

autocad背景色、引线文字大小

一、改变背景 在命令行输入op&#xff0c;回车&#xff0c;弹出配置对话框&#xff1a; 二、改变引线文字大小 选中引线&#xff0c;右键选择【特性】&#xff0c;在文字选项卡中设置文字高度&#xff1a;

小程序项目创建与Vant-UI引入

一&#xff0c;创建小程序项目 AppID可先用测试号&#xff1b; 模板来源选择 ’全部来源‘ &#xff0c;’基础‘ 。模板一定JS开头的&#xff1b; vant-weapp 官网 vant-Weapp 二&#xff0c;下载vant-weapp 组件 1&#xff0c;在新项目中打开 ’调试器‘&#xff1b; 2…

2024年人工智能与机械自动化技术国际会议( ICAIMAT 2024)

2024年人工智能与机械自动化技术国际会议( ICAIMAT 2024) 会议简介 随着科技的飞速发展&#xff0c;人工智能和机械化自动化技术已成为全球产业升级和经济发展的重要动力。为了进一步促进国际交流与合作&#xff0c;推动人工智能和机械化自动化技术的创新与应用&#xff0c;我…

【IDEA】-使用IDEA查看类之间的依赖关系

1、父子类的继承、实现关系 1.1、使用CTRL Alt U 选择 java class 依据光标实际指向的类位置 用实心箭头表示泛化关系 是一种继承的关系&#xff0c;指向父类 可以提前设置需要显示的类的属性、方法等信息 快捷键 Ctrl Alt S &#xff0c;然后搜索 Diagrams 1.2、使用…

java期末突击

目录 1. 快速入门 2. 类 3. 成员方法 4. 构造器 5. 单例模式 6. 继承 7. 抽象类 8. 多线程&#xff08;Thread与Runnable&#xff09; 1. 快速入门 public class Hello {public static void main(String[] args){System.out.println("Hello,World&q…