论坛系统公共组件部分

1.在Java⽬录下创建包,在Resources⽬录下创建⽂件夹,结构如下

├─java # java⽂件区

│   └─com

│        └─example

│                └─demo

│                       ├─common # 公共类

│                       ├─config # 配置类

│                       ├─controller # 控制器层类

│                       ├─dao # 数据库访问类

│                       ├─exception # ⾃定义异常类

│                       ├─interceptor # ⾃定义拦截器类

│                       ├─model # 数据库实体对应模型类

│                       ├─services # 业务服务层接⼝

│                       │ └─impl # 业务服务层接⼝实现类

│                       └─utils # 输助⼯具类

|

|

└─resources # 资源⽂件区

        ├─mapper # 数据库与模型映射⽂件

        │    └─extension # 扩展数据库与模型映射⽂件,⾃定义业务⽅法

        ├─mybatis # Mybatis Generator 配置⽂件

        ├─static # 静态⽂件

        └─templates # 模板⽂件

2.创建generatorConfig.xml

在src/main/resources下创建mybatis⽬录,在mybatis⽬录下创建generatorConfig.xml文件,内容如下:

<?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><!-- 驱动包路径,location中路径替换成自己本地路径 --><classPathEntry location="C:\Users\20278\.m2\repository\mysql\mysql-connector-java\5.1.49\mysql-connector-java-5.1.49.jar"/><context id="DB2Tables" targetRuntime="MyBatis3"><!-- 禁用自动生成的注释 --><commentGenerator><property name="suppressAllComments" value="true"/><property name="suppressDate" value="true"/></commentGenerator><!-- 连接配置 --><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://127.0.0.1:3306/java_forum?characterEncoding=utf8&amp;useSSL=false"userId="root"password="123456"></jdbcConnection><javaTypeResolver><!-- 小数统一转为BigDecimal --><property name="forceBigDecimals" value="false"/></javaTypeResolver><!-- 实体类生成位置 --><javaModelGenerator targetPackage="com.example.demo.model" targetProject="src/main/java"><property name="enableSubPackages" value="true"/><property name="trimStrings" value="true"/></javaModelGenerator><!-- mapper.xml生成位置 --><sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"><property name="enableSubPackages" value="true"/></sqlMapGenerator><!-- DAO类生成位置 --><javaClientGenerator type="XMLMAPPER" targetPackage="com.example.demo.dao"targetProject="src/main/java"><property name="enableSubPackages" value="true"/></javaClientGenerator><!-- 配置生成表与实例, 只需要修改表名tableName, 与对应类名domainObjectName 即可--><table tableName="t_article" domainObjectName="Article" enableSelectByExample="false"enableDeleteByExample="false" enableDeleteByPrimaryKey="false" enableCountByExample="false"enableUpdateByExample="false"><!-- 类的属性用数据库中的真实字段名做为属性名, 不指定这个属性会自动转换 _ 为驼峰命名规则--><property name="useActualColumnNames" value="true"/></table><table tableName="t_article_reply" domainObjectName="ArticleReply" enableSelectByExample="false"enableDeleteByExample="false" enableDeleteByPrimaryKey="false" enableCountByExample="false"enableUpdateByExample="false"><property name="useActualColumnNames" value="true"/></table><table tableName="t_board" domainObjectName="Board" enableSelectByExample="false" enableDeleteByExample="false"enableDeleteByPrimaryKey="false" enableCountByExample="false" enableUpdateByExample="false"><property name="useActualColumnNames" value="true"/></table><table tableName="t_message" domainObjectName="Message" enableSelectByExample="false"enableDeleteByExample="false" enableDeleteByPrimaryKey="false" enableCountByExample="false"enableUpdateByExample="false"><property name="useActualColumnNames" value="true"/></table><table tableName="t_user" domainObjectName="User" enableSelectByExample="false" enableDeleteByExample="false"enableDeleteByPrimaryKey="false" enableCountByExample="false" enableUpdateByExample="false"><property name="useActualColumnNames" value="true"/></table></context>
</generatorConfiguration>

3.运⾏插件⽣成⽂件

    1)在src/main/resources下创建mapper⽬录

    2)点下下图重新加载Maven项⽬,在Plugins节点下出现mybatis-generator,双击运⾏,在对应的⽬录下⽣成相应的类与映射⽂件,如下图所⽰:

4.在 Insert 标签中添加获取主键值的选项

<!-- useGeneratedKeys = true -->
<!-- keyProperty = 主键字段--> 
<!-- 当插⼊⼀条数据后,可以通过user.getId()获取到⾃动⽣成的Id值,如果⽅法中需要⽴即获取Id值,加⼊这个配置 --> <insert id="insert" parameterType="com.example.demo.model.Article" useGeneratedKeys="true" keyProperty="id">

5.添加@Mapper注解

dao包下的每个xxxMapper.java加⼊@Mapper注解

package com.example.demo.dao;import com.example.demo.model.Article;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.util.List;@Mapper
public interface ArticleMapper {int insert(Article row);int insertSelective(Article row);Article selectByPrimaryKey(Long id);int updateByPrimaryKeySelective(Article row);int updateByPrimaryKeyWithBLOBs(Article row);int updateByPrimaryKey(Article row);
}

6.config包下新建MybatisConfig类,指定Mybatis的扫路径

package com.example.demo.config;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;// 配置类
@Configuration
// 指定Mybatis的扫描路径
@MapperScan("com.example.demo.dao")
public class MybatisConfig {
}

7.编写公共代码

    1)定义状态码

     对执⾏业务处理逻辑过程中可能出现的成功与失败状态做针对性描述,⽤枚举定义状态码,先定义⼀部分,业务中遇到新的问题再添加

     在com.example.demo.common包下创建枚举类型命名为ResultCode

package com.example.demo.common;//枚举类型
public enum ResultCode {SUCCESS                   (0, "操作成功"),FAILED                    (1000, "操作失败"),FAILED_UNAUTHORIZED       (1001, "未授权"),FAILED_PARAMS_VALIDATE    (1002, "参数校验失败"),FAILED_FORBIDDEN          (1003, "禁止访问"),FAILED_CREATE             (1004, "新增失败"),FAILED_NOT_EXISTS         (1005, "资源不存在"),FAILED_USER_EXISTS        (1101, "用户已存在"),FAILED_USER_NOT_EXISTS    (1102, "用户不存在"),FAILED_LOGIN              (1103, "用户名或密码错误"),FAILED_USER_BANNED        (1104, "您已被禁言, 请联系管理员, 并重新登录."),FAILED_TWO_PWD_NOT_SAME   (1105, "两次输入的密码不一致"),FAILED_BOARD_NOT_EXISTS   (1201, "版块不存在"),FAILED_ARTICLE_NOT_EXISTS (1301, "帖子不存在"),FAILED_ARTICLE_STATE      (1302, "帖子状态异常"),ERROR_SERVICES            (2000, "服务器内部错误"),ERROR_IS_NULL             (2001, "IS NULL.");//状态码int code;//错误描述String message;ResultCode(int code, String message) {this.code = code;this.message = message;}public int getCode() {return code;}public String getMessage() {return message;}@Overridepublic String toString() {return "code = " + code + ",message = " + message + ".";}}

      2)定义返回结果

            系统实现前后端分离,统⼀返回JSON格式的字符串,需要定义⼀个类,其中包含状态码,描述信息,返回的结果数据  

            a.在com.example.demo.common包下创建AppResult类

            b.属性加⼊@JsonInclude(JsonInclude.Include.ALWAYS)表⽰⽆论是否为空必须序列化

package com.example.demo.common;import com.fasterxml.jackson.annotation.JsonInclude;public class AppResult<T> {//自定义状态码@JsonInclude(JsonInclude.Include.ALWAYS)private int code;//描述信息@JsonInclude(JsonInclude.Include.ALWAYS)private String message;//具体返回的数据@JsonInclude(JsonInclude.Include.ALWAYS)private T data;//构造方法public AppResult(int code, String message) {this.code = code;this.message = message;}public AppResult(int code, String message, T data) {this.code = code;this.message = message;this.data = data;}//成功方法,泛型方法/**** @param message  描述信息* @param data  具体的数据* @return* @param <T>*/public static <T> AppResult<T> success(String message,T data){return new AppResult<>(ResultCode.SUCCESS.code,message,data);}public static <T> AppResult<T> success(String message){return new AppResult<>(ResultCode.SUCCESS.code,message,null);}public static <T> AppResult<T> success(T data){return new AppResult<>(ResultCode.SUCCESS.getCode(),ResultCode.SUCCESS.getMessage(),data);}public static AppResult success(){return  new AppResult(ResultCode.SUCCESS.getCode(),ResultCode.SUCCESS.getMessage(),null);}//失败方法public static AppResult failed(){return new AppResult(ResultCode.FAILED.getCode(),ResultCode.FAILED.getMessage());}public static AppResult failed(String message){return new AppResult(ResultCode.FAILED.getCode(),message);}public static AppResult failed(ResultCode resultCode){return new AppResult(resultCode.getCode(), resultCode.getMessage());}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getData() {return data;}public void setData(T data) {this.data = data;}
}

        3)⾃定义异常

              创建⼀个异常类,加⼊状态码与状态描述属性

               在com.example.demo.exception包下创建ApplicationException

package com.example.demo.exception;import com.example.demo.common.AppResult;
import com.example.demo.common.ResultCode;public class ApplicationException extends RuntimeException{//自定义的异常描述private AppResult errorResult;public ApplicationException(AppResult appResult) {//构造异常中的Message属性super(appResult.getMessage());//自定义的错误描述this.errorResult = appResult;}public ApplicationException(String message) {super(message);//根据异常描述构建返回对象this.errorResult = new AppResult((ResultCode.FAILED.getCode()),message);}//指定异常public ApplicationException(Throwable cause){super(cause);}//自定义异常描述,异常信息public ApplicationException(String message,Throwable cause){super(message,cause);}public AppResult getErrorResult() {return errorResult;}public void setErrorResult(AppResult errorResult) {this.errorResult = errorResult;}
}

       4)全局异常处理

               使⽤@ControllerAdvice+@ExceptionHandler注解实现统⼀异常处理

               @ControllerAdvice表⽰控制器通知类

               在com.example.demo.exception包下创建GlobalExceptionHandler

package com.example.demo.exception;import com.example.demo.common.AppResult;
import com.example.demo.common.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {//捕获自己的ApplicationException异常//以body形式返回@ResponseBody@ExceptionHandler(ApplicationException.class)public AppResult handleApplicationException(ApplicationException e){//打印异常,上传线上要注释掉e.printStackTrace();//记录日志log.error(e.getMessage());//获取异常信息if(e.getErrorResult() != null){//返回异常类中记录的状态return e.getErrorResult();}//默认返回异常信息return AppResult.failed(e.getMessage());}/*** 处理全部未捕获的其他异常* @param e* @return*/@ResponseBody@ExceptionHandler(Exception.class)public AppResult handleException(Exception e){//打印异常e.printStackTrace();//记录日志log.error(e.getMessage());if(e.getMessage() == null){return AppResult.failed(ResultCode.ERROR_SERVICES);}//默认返回异常信息return AppResult.failed(e.getMessage());}}

 8.登录拦截器

      在interceptor包下创建LoginInterceptor

      

package com.example.demo.interceptor;import com.example.demo.config.AppConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;@Component
public class LoginInterceptor implements HandlerInterceptor {//从配置文件中获取默认登陆页的URL@Value("${java_forum.login.url")private String defaultURL;/*** 请求的前置处理* @param request* @param response* @param handler* @return true 校验成功,继续请求流程  <br/>false 中断请求流程* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//获取session,并做已登录用户信息的校验HttpSession session = request.getSession(false);if(session != null && session.getAttribute(AppConfig.USER_SESSION_KEY) != null){//校验通过return true;}//保证跳转页面的路径正确性if(!defaultURL.startsWith("/")){defaultURL = "/" + defaultURL;}//校验未通过,跳转到登录页面response.sendRedirect(defaultURL);//中止请求return false;}
}

      在interceptor包下创建AppInterceptorConfigurer

    

package com.example.demo.interceptor;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import javax.annotation.Resource;@Configuration
public class AppInterceptorConfigurer implements WebMvcConfigurer {@Resourceprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 添加登录拦截器registry.addInterceptor(loginInterceptor)       // 添加用户登录拦截器.addPathPatterns("/**")                 // 拦截所有请求.excludePathPatterns("/sign-in.html")   // 排除登录HTML.excludePathPatterns("/sign-up.html")   // 排除注册HTML.excludePathPatterns("/user/login")     // 排除登录api接口.excludePathPatterns("/user/register")  // 排除注册api接口.excludePathPatterns("/user/logout")    // 排除退出api接口.excludePathPatterns("/swagger*/**")    // 排除登录swagger下所有.excludePathPatterns("/v3*/**")         // 排除登录v3下所有,与swagger相关.excludePathPatterns("/dist/**")        // 排除所有静态文件.excludePathPatterns("/image/**").excludePathPatterns("/**.ico").excludePathPatterns("/js/**");}
}

9.实现API⾃动⽣成

   使⽤Springfox Swagger⽣成API,并导⼊Postman,完成API单元测试

10.编写配置类

     在com.example.demo.config包下新建SwaggerConfig.java

package com.example.demo.config;
import org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties;
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
import org.springframework.boot.actuate.endpoint.ExposableEndpoint;
import org.springframework.boot.actuate.endpoint.web.*;
import org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpointsSupplier;
import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier;
import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.util.StringUtils;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;import java.util.ArrayList;
import java.util.Collection;
import java.util.List;/*** Swagger配置类** @Author 比特就业课*/
// 配置类
@Configuration
// 开启Springfox-Swagger
@EnableOpenApi
public class SwaggerConfig {/*** Springfox-Swagger基本配置* @return*/@Beanpublic Docket createApi() {Docket docket = new Docket(DocumentationType.OAS_30).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.example.demo.Controller")).paths(PathSelectors.any()).build();return docket;}// 配置API基本信息private ApiInfo apiInfo() {ApiInfo apiInfo = new ApiInfoBuilder().title("论坛系统API").description("论坛系统前后端分离API测试").contact(new Contact("Tech", "https://gitee.com/tanjiawe/java_forum", "tjiawen2024@yeah.net")).version("1.0").build();return apiInfo;}/*** 解决SpringBoot 6.0以上与Swagger 3.0.0 不兼容的问题* 复制即可**/@Beanpublic WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier,ServletEndpointsSupplier servletEndpointsSupplier,ControllerEndpointsSupplier controllerEndpointsSupplier,EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties,WebEndpointProperties webEndpointProperties, Environment environment) {List<ExposableEndpoint<?>> allEndpoints = new ArrayList();Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();allEndpoints.addAll(webEndpoints);allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());String basePath = webEndpointProperties.getBasePath();EndpointMapping endpointMapping = new EndpointMapping(basePath);boolean shouldRegisterLinksMapping = this.shouldRegisterLinksMapping(webEndpointProperties, environment,basePath);return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes,corsProperties.toCorsConfiguration(), new EndpointLinksResolver(allEndpoints, basePath),shouldRegisterLinksMapping, null);}private boolean shouldRegisterLinksMapping(WebEndpointProperties webEndpointProperties, Environment environment,String basePath) {return webEndpointProperties.getDiscovery().isEnabled() && (StringUtils.hasText(basePath)|| ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT));}}

11.创建MD5加密⼯具类

        项⽬中使⽤commons-codec,它是Apache提供的⽤于摘要运算、编码解码的⼯具包。常⻅的编码解码⼯具Base64、MD5、Hex、SHA1、DES等。

        在com.example.demo.utils包下创建MD5Utils类,代码如下:

package com.example.demo.utils;import org.apache.commons.codec.digest.DigestUtils;public class MD5Utils {/*** //返回一个用MD5加密后的字符串* @param str 原始字符串* @return*/public static String md5(String str){return DigestUtils.md5Hex(str);}/*** 明文加盐生成最终的密文* @param str 要加密的明文* @param salt 盐* @return 密文*/public static String md5Salt(String str, String salt){//先对明文进行MD5加密String s = DigestUtils.md5Hex(str);//加密后的原文与盐拼接在一起之后再进行一次MD5加密String ciphertext = DigestUtils.md5Hex(s + salt);//返回密文return ciphertext;}
}

12.创建⽣成UUID⼯具类

        在com.example.demo.utils包下创建UUIDUtils类,代码如下:

package com.example.demo.utils;import java.util.UUID;public class UUIDUtils {/*** 生成一个UUID* @return*/public static String UUID_36(){return UUID.randomUUID().toString();}/*** 生成一个32位的UUID* @return*/public static String UUID_32(){return UUID.randomUUID().toString().replace("-","");}
}

13.创建字符串⼯具类

         在com.example,demo.utils包下创建StringUtils类,代码如下:

package com.example.demo.utils;public class StringUtils {/*** 校验字符串是否为空* @param value 待校验的字符串* @return true空,<br/>false非空*/public static boolean isEmpty(String value){if(value == null ||value.isEmpty()){return true;}return false;}
}

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

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

相关文章

MySQL表操作

目录 一、创建mysql表的结构 1.在mydb数据库下创建一个表格名字为stu_info&#xff0c;里面结构包含了学号和姓名的名称&#xff0c;字符型以及他的引擎为innodb 字符集为gbk 校队规则为gbk_chinese_ci 二、数据库表查看的基本用法语句 1.查看数据库表明 2.查看数据库表的结…

数字图像处理:亮度对比度-几何变换-噪声处理

文章目录 数字图像增强亮度与对比度转换几何变换图像裁剪尺寸变换图像旋转 噪声处理添加噪声处理噪声 数字图像增强 亮度与对比度转换 图像变换可分为以下两种&#xff1a; 点算子&#xff1a;基于像素变换&#xff0c;在这一类图像变换中&#xff0c;仅仅根据输入像素值计算…

【计算机网络】 ARP协议和DNS协议

文章目录 数据包在传输过程中的变化过程单播组播和广播ARP协议ARP代理免费ARP路由数据转发过程DNS协议 数据包在传输过程中的变化过程 在说ARP和DNS之前&#xff0c;我们需要知道数据包在传输过程的变化过程 从图片中可以看到&#xff0c;发送方的原数据最开始是在应用层&…

vscode使用delve调试golang程序

环境配置 delve仓库&#xff0c;含有教程&#xff1a;https://github.com/go-delve/delve golang的debugging教程&#xff1a;https://github.com/golang/vscode-go/wiki/debugging > go version go version go1.20 windows/amd64> go install github.com/go-delve/de…

华为云Stack的学习(五)

六、华为云stack服务简介 1.云服务在华为云Stack中的位置 云服务对接多个数据中心资源池层提供的资源&#xff0c;并向各种行业应用提供载体。 2.华为云Stack通用服务 2.1 云计算的服务模式 2.2 计算相关的云服务 2.3 存储相关的云服务 2.4 网络相关的云服务 3.云化案例 **…

如何取消KEIL-MDK工程中出现的CMSIS绿色图标

如何取消KEIL-MDK工程中出现的CMSIS绿色图标&#xff1f;我以前经常遇到&#xff0c;不知道怎么搞&#xff0c;好像也不影响编译结果。以前问过其他人&#xff0c;但是不知道怎么搞&#xff0c;相信很多人也遇到过。水平有限&#xff0c;表达不清楚&#xff0c;见下图&#xff…

Bootstrap的标题类(标题样式h1~h6)

Bootstrap 的标题字体大小通常遵循以下样式规则&#xff1a; h1 标题的字体大小为 2.5rem&#xff08;40像素&#xff09;。h2 标题的字体大小为 2rem&#xff08;32像素&#xff09;。h3 标题的字体大小为 1.75rem&#xff08;28像素&#xff09;。h4 标题的字体大小为 1.5re…

【trie树】CF Edu12 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 这其实是一个套路题 区间异或转化成前缀异或&#xff0c;然后枚举 i 对于每一个 i&#xff0c;ai ^ x k&#xff0c;对 x 计数 先建一棵字典树&#xff0c;然后在字典树上计数 先去对 > k 的部分计数&a…

国际版阿里云/腾讯云:弹性高性能计算E-HPC入门概述

入门概述 本文介绍E-HPC的运用流程&#xff0c;帮助您快速上手运用弹性高性能核算。 下文以创立集群&#xff0c;在集群中安装GROMACS软件并运转水分子算例进行高性能核算为例&#xff0c;介绍弹性高性能核算的运用流程&#xff0c;帮助您快速上手运用弹性高性能核算。运用流程…

易云维®医院后勤管理系统软件利用物联网智能网关帮助实现医院设备实现智能化、信息化管理

近年来&#xff0c;我国医院逐渐意识到医院设备信息化管理的重要性&#xff0c;逐步建立医院后勤管理系统软件&#xff0c;以提高信息化管理水平。该系统是利用数据库技术&#xff0c;为医院的中央空调、洁净空调、电梯、锅炉、医疗设备等建立电子档案&#xff0c;把设备监控、…

性能炸裂c++20协程+iocp/epoll,超轻量高性能异步库开发实战

前言&#xff1a; c20出来有一段时间了。其中一大功能就是终于支持协程了&#xff08;c作为行业大哥大级别的语言&#xff0c;居然到C20才开始支持协程&#xff0c;我也是无力吐槽了&#xff0c;让多少人等了多少年&#xff0c;等了多少青春&#xff09;但千呼万唤他终于还是来…

基于Matlab实现多个图像融合案例(附上源码+数据集)

图像融合是将多幅图像合成为一幅图像的过程&#xff0c;旨在融合不同图像的信息以获得更多的细节和更丰富的视觉效果。在本文中&#xff0c;我们将介绍如何使用Matlab实现图像融合。 文章目录 简单案例源码数据集下载 简单案例 首先&#xff0c;我们需要了解图像融合的两种主…

【STM32】IIC的初步使用

IIC简介 物理层 连接多个devices 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中&#xff0c;可连接多个 I2C 通讯设备&#xff0c;支持多个通讯主机及多个通讯从机。 两根线 一个 I2C 总线只使用两条总线线路&#xff0c;一条双向串行数…

Android Studio 汉化

一、汉化&#xff1a; 查看版本号&#xff0c;查看Android Studio版本&#xff0c;根据版本下载对应的汉化包。例如我的是223。 下载汉化包&#xff1a; 中文语言包下载地址 找到对应的版本 回到Android Studio 1、进入设置 2、从磁盘安装插件 3、选择下载好的包点击OK 4、…

介绍OpenCV

OpenCV是一个开源计算机视觉库&#xff0c;可用于各种任务&#xff0c;如物体识别、人脸识别、运动跟踪、图像处理和视频处理等。它最初由英特尔公司开发&#xff0c;目前由跨学科开发人员社区维护和支持。OpenCV可以在多个平台上运行&#xff0c;包括Windows、Linux、Android和…

AJAX学习笔记6 JQuery对AJAX进行封装

AJAX学习笔记5同步与异步理解_biubiubiu0706的博客-CSDN博客 AJAX请求相关的代码都是类似的&#xff0c;有很多重复的代码&#xff0c;这些重复的代码能不能不写&#xff0c;能不能封装一个工具类。要发送ajax请求的话&#xff0c;就直接调用这个工具类中的相关函数即可。 用J…

深圳-海岸城购物中心数据分析

做数据分析的时候&#xff0c;如果要对商场进行分析&#xff0c;可以从这些数据纬度进行分析&#xff0c;如下图所示&#xff1a; 截图来源于数位观察&#xff1a;https://www.swguancha.com/

如何炒伦敦金

由于疫情的影响&#xff0c;目前世界上多个国家降低存款利率&#xff0c;以推动经济发展&#xff0c;由此也引发了比较严重的通胀问题&#xff0c;尤其是在俄乌冲突之后&#xff0c;国际油价不断上涨&#xff0c;加大了这种通货膨胀的影响。进行伦敦金投资是一种规避通胀的好方…

Python爬虫-某网酒店数据

前言 本文是该专栏的第5篇,后面会持续分享python爬虫案例干货,记得关注。 本文以某网的酒店数据为例,实现根据目标城市获取酒店数据。具体思路和方法跟着笔者直接往下看正文详细内容。(附带完整代码) 正文 地址:aHR0cHM6Ly93d3cuYnRoaG90ZWxzLmNvbS9saXN0L3NoYW5naGFp …

Python 中下划线详解(_、_xx、xx_、__xx、__xx__)

文章目录 1 概述2 演示2.1 _&#xff1a;不重要的变量2.2 _xx&#xff1a;声明私有&#xff0c;仅内部调用2.3 xx_&#xff1a;区分关键字2.4 __xx&#xff1a;声明私有&#xff0c;仅当前类中可用2.5 __xx__&#xff1a;内置函数 1 概述 2 演示 2.1 _&#xff1a;不重要的变…