百度网站地图北京专业网站制作公司

news/2025/9/24 8:41:38/文章来源:
百度网站地图,北京专业网站制作公司,网投网站建设,网站网站制作怎么样一、Spring Cloud#xff08;Base工程构建#xff09; 1.1 Spring Cloud 简述 1.1.1 Spring Cloud 版本推荐 在讲解 Spring Cloud 之前#xff0c;首先推荐一下各个依赖的版本#xff0c;以免出现版本错误 版本推荐 必须根据以上版本#xff0c;否则可能会出现一些不…一、Spring CloudBase工程构建 1.1 Spring Cloud 简述 1.1.1 Spring Cloud 版本推荐 在讲解 Spring Cloud 之前首先推荐一下各个依赖的版本以免出现版本错误 版本推荐 必须根据以上版本否则可能会出现一些不必要的错误 1.1.2 Spring Cloud 能做什么 它是一种微服务架构的工具包可以帮助服务找到其他服务并互相连接能集中管理服务的设置信息有熔断和限流的功能让系统更稳定可以把请求分摊到不同的服务实例上处理多个服务间的事务问题能监控服务的状态和性能 1.2.3 Spring Cloud 不同功能对应的不同的组件 Spring Cloud 可以用于实现很多功能方便我们开发 这些功能都对应着Spring Cloud 中的不同的组件 以下是不同服务分别对应的组件 1.2 微服务架构编码 Base 工程模块构建 这边我们直接使用项目来了解微服务 通过 下订单做支付这个案例 先做 Base 工程再依次添加各种模块组件 先简单的做一个通用的 boot微服务 然后逐步挨个引入 cloud 组件纳入微服务支撑体系 1.2.1 微服务 cloud 整体聚合 maven 父工程 Project 1、New Project 新建项目请按照我一下的配置进行创建 将这些多余的包删除这个仅仅是作为我们 maven 的父工程 2、聚合总父工程的名字 这个就是父工程的名字 3、字符编码 设置字符编码为 UTF-8 以防出现乱码 4、注解激活生效 当引入一些新的组件时可能会激活不了所以需要设置 5、java 编译版本选择 17 1.2.2 Maven 父工程 pom 文件内容 在 maven 中添加 packagingpom/packaging 表示该项目作为一个父工程用于组织和管理其他子项目的依赖关系、版本控制等 将以下依赖和版本复制进 pom文件中 propertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncodinghutool.version5.8.22/hutool.versionlombok.version1.18.26/lombok.versiondruid.version1.1.20/druid.versionmybatis.springboot.version3.0.3/mybatis.springboot.versionmysql.version8.0.11/mysql.versionswagger3.version2.2.0/swagger3.versionmapper.version4.2.3/mapper.versionfastjson2.version2.0.40/fastjson2.versionpersistence-api.version1.0.2/persistence-api.versionspring.boot.test.version3.1.5/spring.boot.test.versionspring.boot.version3.2.0/spring.boot.versionspring.cloud.version2023.0.0/spring.cloud.versionspring.cloud.alibaba.version2022.0.0.0-RC2/spring.cloud.alibaba.version/propertiesdependencyManagementdependencies!--springboot 3.2.0--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion${spring.boot.version}/versiontypepom/typescopeimport/scope/dependency!--springcloud 2023.0.0--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring.cloud.version}/versiontypepom/typescopeimport/scope/dependency!--springcloud alibaba 2022.0.0.0-RC2--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${spring.cloud.alibaba.version}/versiontypepom/typescopeimport/scope/dependency!--SpringBoot集成mybatis--dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion${mybatis.springboot.version}/version/dependency!--Mysql数据库驱动8 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion${mysql.version}/version/dependency!--SpringBoot集成druid连接池--dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion${druid.version}/version/dependency!--通用Mapper4之tk.mybatis--dependencygroupIdtk.mybatis/groupIdartifactIdmapper/artifactIdversion${mapper.version}/version/dependency!--persistence--dependencygroupIdjavax.persistence/groupIdartifactIdpersistence-api/artifactIdversion${persistence-api.version}/version/dependency!-- fastjson2 --dependencygroupIdcom.alibaba.fastjson2/groupIdartifactIdfastjson2/artifactIdversion${fastjson2.version}/version/dependency!-- swagger3 调用方式 http://你的主机IP地址:5555/swagger-ui/index.html --dependencygroupIdorg.springdoc/groupIdartifactIdspringdoc-openapi-starter-webmvc-ui/artifactIdversion${swagger3.version}/version/dependency!--hutool--dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion${hutool.version}/version/dependency!--lombok--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion${lombok.version}/versionoptionaltrue/optional/dependency!-- spring-boot-starter-test --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdversion${spring.boot.test.version}/versionscopetest/scope/dependency/dependencies/dependencyManagementproperties 标签内的是依赖的版本号 这样分开写版本号是为了在子工程中添加依赖时如果依赖没有添加版本号则会直接使用父工程的版本更好的实现版本的统一 dependencyManagement 标签来提供一种管理依赖版本号的方式 一般都会在 pom 父工程中使用它能够让所有子工程中不用显示的列出版本号因为 maven 会沿着父子层向上走直接找到拥有 dependencyManagement 元素的项目然后子工程就会使用 dependencyManagement 元素中指定的版本号可以避免每个子项目中都要引入一个版本号如果子项目需要另外一个版本只需要声明 version 即可 dependencyManagement 只是声明依赖并不实现引入因此子项目需要显示的声明需要用的依赖 如果不在子项目中声明依赖是不会从父项目中继承下来的 只有在子项目中写了该依赖并没没有指定版本号才会从父项目中该项 1.2.3 Mysql 驱动说明 1、如果是 Mysql5 JDBC 配置 # mysql5.7---JDBC四件套 jdbc.driverClass com.mysql.jdbc.Driver jdbc.url jdbc:mysql://localhost:3306/db2024?useUnicodetruecharacterEncodingUTF-8useSSLfalse jdbc.user root jdbc.password 123456pom 文件依赖 # Maven的POM文件处理 dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.47/version /dependency 2、如果是 Mysql8 JDBC 配置 # mysql8.0---JDBC四件套 jdbc.driverClass com.mysql.cj.jdbc.Driver jdbc.url jdbc:mysql://localhost:3306/db2024?characterEncodingutf8useSSLfalseserverTimezoneGMT%2B8rewriteBatchedStatementstrueallowPublicKeyRetrievaltrue jdbc.user root jdbc.password 123456pom 文件依赖 # Maven的POM dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.11/version /dependency1.3 Mapper4 一键生成增删改查 1.3.1 数据库搭建 生成增删改查代码之前首先需要我们的 支付订单的数据库 首先创建数据库数据库名为 db2024 然后创建数据表将以下代码导入即可 DROP TABLE IF EXISTS t_pay;CREATE TABLE t_pay (id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,pay_no VARCHAR(50) NOT NULL COMMENT 支付流水号,order_no VARCHAR(50) NOT NULL COMMENT 订单流水号,user_id INT(10) DEFAULT 1 COMMENT 用户账号ID,amount DECIMAL(8,2) NOT NULL DEFAULT 9.9 COMMENT 交易金额,deleted TINYINT(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT 删除标志默认0不删除1删除,create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间,PRIMARY KEY (id)) ENGINEINNODB AUTO_INCREMENT1 DEFAULT CHARSETutf8mb4 COMMENT支付交易表;INSERT INTO t_pay(pay_no,order_no) VALUES(pay17203699,6544bafb424a);SELECT * FROM t_pay;1.3.2 在项目中创建第一个子工程 创建一个子工程名为 mybatis_generator2024 它与业务无关就是一个普通的 maven 工程 有他专门生成数据库的增删改查 在子工程中导入这个模块所需的依赖 复制替换子工程的 pom 文件即可 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.atguigu.cloud/groupIdartifactIdcloud2024/artifactIdversion1.0-SNAPSHOT/version/parent!--我自己独一份只是一个普通Maven工程与boot和cloud无关--artifactIdmybatis_generator2024/artifactIdpropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependencies!--Mybatis 通用mapper tk单独使用自己独有自带版本号--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.13/version/dependency!-- Mybatis Generator 自己独有自带版本号--dependencygroupIdorg.mybatis.generator/groupIdartifactIdmybatis-generator-core/artifactIdversion1.4.2/version/dependency!--通用Mapper--dependencygroupIdtk.mybatis/groupIdartifactIdmapper/artifactId/dependency!--mysql8.0--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependency!--persistence--dependencygroupIdjavax.persistence/groupIdartifactIdpersistence-api/artifactId/dependency!--hutool--dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactId/dependency!--lombok--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scopeexclusionsexclusiongroupIdorg.junit.vintage/groupIdartifactIdjunit-vintage-engine/artifactId/exclusion/exclusions/dependency/dependenciesbuildresourcesresourcedirectory${basedir}/src/main/java/directoryincludesinclude**/*.xml/include/includes/resourceresourcedirectory${basedir}/src/main/resources/directory/resource/resourcespluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationexcludesexcludegroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/exclude/excludes/configuration/pluginplugingroupIdorg.mybatis.generator/groupIdartifactIdmybatis-generator-maven-plugin/artifactIdversion1.4.2/versionconfigurationconfigurationFile${basedir}/src/main/resources/generatorConfig.xml/configurationFileoverwritetrue/overwriteverbosetrue/verbose/configurationdependenciesdependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.33/version/dependencydependencygroupIdtk.mybatis/groupIdartifactIdmapper/artifactIdversion4.2.3/version/dependency/dependencies/plugin/plugins/build/project1.3.3 设置各种配置 这里需要设置数据库配置和生成增删改查的配置 创建 config.properties 数据库配置文件 #User表包名 package.namecom.atguigu.cloud # mysql5.7 jdbc.driverClass com.mysql.jdbc.Driver jdbc.url jdbc:mysql://localhost:3306/db2024?useUnicodetruecharacterEncodingUTF-8useSSLfalse jdbc.user root jdbc.password 123456创建自动生成配置文件 generatorConfig.xml ?xml version1.0 encodingUTF-8? !DOCTYPE generatorConfigurationPUBLIC -//mybatis.org//DTD MyBatis Generator Configuration 1.0//ENhttp://mybatis.org/dtd/mybatis-generator-config_1_0.dtdgeneratorConfigurationproperties resourceconfig.properties/context idMysql targetRuntimeMyBatis3Simple defaultModelTypeflatproperty namebeginningDelimiter value/property nameendingDelimiter value/plugin typetk.mybatis.mapper.generator.MapperPluginproperty namemappers valuetk.mybatis.mapper.common.Mapper/property namecaseSensitive valuetrue//pluginjdbcConnection driverClass${jdbc.driverClass}connectionURL${jdbc.url}userId${jdbc.user}password${jdbc.password}/jdbcConnectionjavaModelGenerator targetPackage${package.name}.entities targetProjectsrc/main/java/sqlMapGenerator targetPackage${package.name}.mapper targetProjectsrc/main/java/javaClientGenerator targetPackage${package.name}.mapper targetProjectsrc/main/java typeXMLMAPPER/table tableNamet_pay domainObjectNamePaygeneratedKey columnid sqlStatementJDBC//table/context /generatorConfiguration1.3.4 一键生成增删改查 打开 pom 管理找到 mybatis_generator2024 的模块点击 mybatis-genertor:generate 即可一键生成 1.4 标准构建微服务工程 完整构建微服务的步骤 ​ 1、建 module 模块 ​ 2、改写 pom 文件 ​ 3、写 yml启动类配置 ​ 4、创建主启动类 ​ 5、创建业务类 首先构建一个微服务的提供者支付 Module 模块 1.4.1 构建提供者微服务模块 提供者模块名为 cloud-provider-payment8001 1.4.2 改写 pom 文件 改写 pom 文件将需要的依赖导入其中 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.atguigu.com/groupIdartifactIdcloud2024/artifactIdversion1.0-SNAPSHOT/version/parentartifactIdcloud-provider-payment8001/artifactIdpropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependencies!--SpringBoot通用依赖模块--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency!--SpringBoot集成druid连接池--dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactId/dependency!-- Swagger3 调用方式 http://你的主机IP地址:5555/swagger-ui/index.html --dependencygroupIdorg.springdoc/groupIdartifactIdspringdoc-openapi-starter-webmvc-ui/artifactId/dependency!--mybatis和springboot整合--dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactId/dependency!--Mysql数据库驱动8 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependency!--persistence--dependencygroupIdjavax.persistence/groupIdartifactIdpersistence-api/artifactId/dependency!--通用Mapper4--dependencygroupIdtk.mybatis/groupIdartifactIdmapper/artifactId/dependency!--hutool--dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactId/dependency!-- fastjson2 --dependencygroupIdcom.alibaba.fastjson2/groupIdartifactIdfastjson2/artifactId/dependency!--lombok--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.28/versionscopeprovided/scope/dependency!--test--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project1.4.3 编写 yml 文件启动类配置 编写 yml 文件启动类的配置 server:port: 8001# applicationName druid-mysql8 driver spring:application:name: cloud-payment-servicedatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db2024?characterEncodingutf8useSSLfalseserverTimezoneGMT%2B8rewriteBatchedStatementstrueallowPublicKeyRetrievaltrueusername: rootpassword: 123456# mybatis mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.atguigu.cloud.entitiesconfiguration:map-underscore-to-camel-case: true并且创建一个 mapper 包 1.4.4 创建主启动类 创建主启动类命名为 Main8001 添加 MapperScan 注解 注意不要导错包 1.4.5 创建业务类 1、entities实体类 创建两个实体 Pay 和 PayDTO Pay 是主实体类PayDTO 是给前端传递数据用的实体类PayDTO 内的属性是前端传给后端的数据 Pay 实体类直接复制 mybatis-generator2024 模块内自动生成的实体类即可 然后创建 PayDTO 传递数据实体类 package com.atguigu.cloud.entities;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.math.BigDecimal;Data AllArgsConstructor NoArgsConstructor public class PayDTO {private Integer id;//支付流水号private String payNo;//订单流水号private String orderNo;//用户账号IDprivate Integer userId;//交易金额private BigDecimal amount; } 2、mapper 分别在 cloud 包下和 resources 包下创建 mapper 包 cloud 包下的 mapper 包存放接口 resources 包下的 mapper 存放 xml 文件 也是同样复制 mybatis-generator2024 模块内自动生成的 mapper即可 3、Service 创建服务接口 PayService定义增删改查方法 package com.atguigu.cloud.service;import com.atguigu.cloud.entities.Pay;import java.util.List;public interface PayService {//增public int add(Pay pay);//根据id删public int delete(Integer id);//改public int update(Pay pay);//根据id查public Pay getById(Integer id);//查询所有public ListPay getAll(); } 创建服务实现类 PayServiceImpl,实现增删改查方法 package com.atguigu.cloud.service.impl;import com.atguigu.cloud.entities.Pay; import com.atguigu.cloud.mapper.PayMapper; import com.atguigu.cloud.service.PayService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service;import java.util.List;Service public class PayServiceImpl implements PayService {ResourcePayMapper payMapper;Overridepublic int add(Pay pay) {return payMapper.insertSelective(pay);}Overridepublic int delete(Integer id) {//按照主键删除return payMapper.deleteByPrimaryKey(id);}Overridepublic int update(Pay pay) {//按照主键主键不为空则更新return payMapper.updateByPrimaryKeySelective(pay);}Overridepublic Pay getById(Integer id) {//根据主键查return payMapper.selectByPrimaryKey(id);}Overridepublic ListPay getAll() {return payMapper.selectAll();} } 4、controller 创建 PayController 类 PayController 代码部分 package com.atguigu.cloud.controller;import cn.hutool.core.bean.BeanUtil; import com.atguigu.cloud.entities.Pay; import com.atguigu.cloud.entities.PayDTO; import com.atguigu.cloud.service.PayService; import jakarta.annotation.Resource; import org.springframework.web.bind.annotation.*;import java.util.List;RestController public class PayController {Resourceprivate PayService payService;PostMapping(/pay/add)public String addPay(RequestBody Pay pay){int add payService.add(pay);return 添加成功,返回值add;}DeleteMapping(/pay/delete/{id})public Integer removePay(PathVariable(id) Integer id){return payService.delete(id);}PutMapping(/pay/update)public String updatePay(RequestBody PayDTO payDTO){Pay paynew Pay();BeanUtil.copyProperties(payDTO,pay);int ipayService.update(pay);return 修改成功,返回值i;}GetMapping(pay/get/{id})public Pay getById(PathVariable(id) Integer id){return payService.getById(id);}GetMapping(pay/getAll)public ListPay getAll(){return payService.getAll();} } 1.5 Swagger3 代码测试 Swagger3 是一个用于测试接口的框架 使用 Swagger3 之前需要导入一个依赖 !-- Swagger3 调用方式 http://你的主机IP地址:5555/swagger-ui/index.html --dependencygroupIdorg.springdoc/groupIdartifactIdspringdoc-openapi-starter-webmvc-ui/artifactId/dependency1.5.1 Swagger3 常用注解 使用 Swagger3 需要在代码中嵌入注解 以下是常用注解 注解标注位置作用Tagcontroller 类表示 controller 的作用Parmeter参数标识参数作用Parmeters参数参数多重说明Schemamodel 层的 JavaBena描述模型作用及每个属性Operation方法描述方法的作用ApiResponse方法描述响应状态码等Schema实体类或实体类字段描述实体类或实体类字段的作用 在我们编写的 PayController 中加入注解 package com.atguigu.cloud.controller;import cn.hutool.core.bean.BeanUtil; import com.atguigu.cloud.entities.Pay; import com.atguigu.cloud.entities.PayDTO; import com.atguigu.cloud.service.PayService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import org.springframework.beans.BeanUtils; import org.springframework.web.bind.annotation.*;import java.util.List;RestController Tag(name 支付微服务模块,description 支付CRUD) public class PayController {ResourcePayService payService;PostMapping(value /pay/add)Operation(summary 新增, description 新增支付流水方法,json串做参数)public String addPay(RequestBody Pay pay) {System.out.println(pay.toString());int i payService.add(pay);return 成功插入记录返回值 i;}DeleteMapping(value /pay/del/{id})Operation(summary 删除, description 删除支付流水方法)public Integer deletePay(PathVariable(id) Integer id) {return payService.delete(id);}PutMapping(value /pay/update)Operation(summary 修改, description 修改支付流水方法)public String updatePay(RequestBody PayDTO payDTO) {Pay pay new Pay();BeanUtils.copyProperties(payDTO, pay);int i payService.update(pay);return 成功修改记录返回值 i;}GetMapping(value /pay/get/{id})Operation(summary 按照ID查流水, description 查询支付流水方法)public Pay getById(PathVariable(id) Integer id) {return payService.getById(id);} }在我们的实体类 Pay 中添加注解描述实体类及字段的作用 package com.atguigu.cloud.entities;import io.swagger.v3.oas.annotations.media.Schema;import javax.persistence.Column; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import java.math.BigDecimal; import java.util.Date;/*** 表名t_pay */ Table(name t_pay) Schema(title 支付交易表) public class Pay {IdGeneratedValue(generator JDBC)private Integer id;/*** 支付流水号*/Column(name pay_no)Schema(title 支付流水号)private String payNo;/*** 订单流水号*/Column(name order_no)Schema(title 订单流水号)private String orderNo;/*** 用户账号ID*/Column(name user_id)Schema(title 用户账号ID)private Integer userId;/*** 交易金额*/private BigDecimal amount;/*** 删除标志默认0不删除1删除*/private Byte deleted;/*** 创建时间*/Column(name create_time)Schema(title 创建时间)private Date createTime;/*** 更新时间*/Column(name update_time)Schema(title 更新时间)private Date updateTime;/*** return id*/public Integer getId() {return id;}/*** param id*/public void setId(Integer id) {this.id id;}/*** 获取支付流水号** return payNo - 支付流水号*/public String getPayNo() {return payNo;}/*** 设置支付流水号** param payNo 支付流水号*/public void setPayNo(String payNo) {this.payNo payNo;}/*** 获取订单流水号** return orderNo - 订单流水号*/public String getOrderNo() {return orderNo;}/*** 设置订单流水号** param orderNo 订单流水号*/public void setOrderNo(String orderNo) {this.orderNo orderNo;}/*** 获取用户账号ID** return userId - 用户账号ID*/public Integer getUserId() {return userId;}/*** 设置用户账号ID** param userId 用户账号ID*/public void setUserId(Integer userId) {this.userId userId;}/*** 获取交易金额** return amount - 交易金额*/public BigDecimal getAmount() {return amount;}/*** 设置交易金额** param amount 交易金额*/public void setAmount(BigDecimal amount) {this.amount amount;}/*** 获取删除标志默认0不删除1删除** return deleted - 删除标志默认0不删除1删除*/public Byte getDeleted() {return deleted;}/*** 设置删除标志默认0不删除1删除** param deleted 删除标志默认0不删除1删除*/public void setDeleted(Byte deleted) {this.deleted deleted;}/*** 获取创建时间** return createTime - 创建时间*/public Date getCreateTime() {return createTime;}/*** 设置创建时间** param createTime 创建时间*/public void setCreateTime(Date createTime) {this.createTime createTime;}/*** 获取更新时间** return updateTime - 更新时间*/public Date getUpdateTime() {return updateTime;}/*** 设置更新时间** param updateTime 更新时间*/public void setUpdateTime(Date updateTime) {this.updateTime updateTime;} }1.5.2 创建迭代的 config 配置类 使用 Swagger3 之前还需要创建含分组迭代的 config 配置类 因此我们需要创建一个 Swagger3 相关的配置类 编写相关代码 package com.atguigu.cloud.config;import io.swagger.v3.oas.models.ExternalDocumentation; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Info; import org.springdoc.core.models.GroupedOpenApi; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class Swagger3Config {Beanpublic GroupedOpenApi PayApi(){return GroupedOpenApi.builder().group(支付微服务模块).pathsToMatch(/pay/**).build();}Beanpublic GroupedOpenApi OtherApi(){return GroupedOpenApi.builder().group(其它微服务模块).pathsToMatch(/other/**, /others).build();}Beanpublic OpenAPI docsOpenApi(){return new OpenAPI().info(new Info().title(cloud2024).description(通用设计rest).version(v1.0)).externalDocs(new ExternalDocumentation().description(www.atguigu.com).url(https://yiyan.baidu.com/));} } 我们微服务的接口会有很多这个配置类就是专门进行了分组 例如 这两个方法分别对应两个不同的模块 PayApi() 对应支付模块OtherApi() 对应其他模块 PayApi() 方法中调用的 PathsToMatch() 方法当中的参数 /pay/** 就表示只要开头为 /pay 的都属于这个模块 docsOpenApi() 方法中的内容则是对文档的一些说明 1.5.3 使用 Swagger3 进行测试 运行启动类 然后打开浏览器输入网址http://localhost:8001/swagger-ui/index.html 成功访问的界面 此时右上角就是你在配置类中定义的分组 这里进行测试即可 1.6 微服务工程项目改进 1.6.1 时间格式问题优化 测试代码时返回给我们的时间格式不是我们常用的类型 这里我们可以使用两种方式来进行优化 1、在相应的类的属性上使用 JsonFormat 注解 在实体类的时间格式的属性上添加 JsonFormat 2、在 Spring boot 项目中还可以在 application.yml 文件中指定 在 application.yml 文件中指定如下 spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone:GMT8这里才是返回了我们想要的时间格式 1.6.2 统一返回值格式 1、具体思路 我们需要封装一个对象给前端返回一个 KV 键值对 定义返回的标准格式三大标配 code 状态值由后端统一定义各种返回结果的状态码message描述本次接口调用的结果描述data数据本次返回的数据code 和 message 就是我们的 key 值data 就是我们的 value 值 定义接口调用时间之类 用于排查错误告诉程序员什么时候调用接口第几次调用接口什么时间段出的故障这就会添加 timestamp 接口调用时间 2、主要步骤 新建枚举类 ReturnCodeEnum 让我们的状态码尽量与 HTTP 的相对应 HTTP 请求返回的状态码 定义 ReturnCodeEnum 枚举类 具体代码 package com.atguigu.cloud.resp;import lombok.Getter;import java.util.Arrays; /*** auther zzyy* create 2023-11-04 11:51*/ Getter public enum ReturnCodeEnum {/**1.举值**//**操作失败**/RC999(999,操作XXX失败),/**操作成功**/RC200(200,success),/**服务降级**/RC201(201,服务开启降级保护,请稍后再试!),/**热点参数限流**/RC202(202,热点参数限流,请稍后再试!),/**系统规则不满足**/RC203(203,系统规则不满足要求,请稍后再试!),/**授权规则不通过**/RC204(204,授权规则不通过,请稍后再试!),/**access_denied**/RC403(403,无访问权限,请联系管理员授予权限),/**access_denied**/RC401(401,匿名用户访问无权限资源时的异常),RC404(404,404页面找不到的异常),/**服务异常**/RC500(500,系统异常请稍后重试),RC375(375,数学运算异常请稍后重试),INVALID_TOKEN(2001,访问令牌不合法),ACCESS_DENIED(2003,没有权限访问该资源),CLIENT_AUTHENTICATION_FAILED(1001,客户端认证失败),USERNAME_OR_PASSWORD_ERROR(1002,用户名或密码错误),BUSINESS_ERROR(1004,业务逻辑异常),UNSUPPORTED_GRANT_TYPE(1003, 不支持的认证模式);/**构造**//**自定义状态码**/private final String code;/**自定义描述**/private final String message;ReturnCodeEnum(String code, String message){this.code code;this.message message;}/**遍历**///遍历枚举V1public static ReturnCodeEnum getReturnCodeEnum(String code){for (ReturnCodeEnum element:ReturnCodeEnum.values()) {if (element.code.equals(code)){return element;}}return null;}//遍历枚举V2public static ReturnCodeEnum getReturnCodeEnumV2(String code){return Arrays.stream(ReturnCodeEnum.values()).filter(x - x.getCode().equalsIgnoreCase(code)).findFirst().orElse(null);}/*public static void main(String[] args){System.out.println(getReturnCodeEnumV2(200));System.out.println(getReturnCodeEnumV2(200).getCode());System.out.println(getReturnCodeEnumV2(200).getMessage());}*/ } 3、如何定义一个通用的枚举类 这里主要讲解一下我们定义枚举的三个小步骤 举值-构造-遍历 举值 罗列出你的枚举值每一个 code 对应的 message 分别是什么 例如我们上面的代码中 第一个举值 RC999 在这个枚举里面第一个举值 999 对应的 message 就是 操作失败 构造 我们的枚举是有两个具体的值所以在构造上面我们就要创建有两个参数的构造函数这个就叫做构造 遍历 我们需要遍历我们的枚举根据我们传过来的 code 状态码来返回所需要的枚举如果没有找到对应的枚举就需要返回一个 null我们这里遍历枚举用了两种方法 4、新建统一返回对象 ResultData 新建类 ResultData 添加四个变量 code、message、data、timestamp 在构造函数中给 timestamp 设置时间表示方法的调用时间 创建两个方法成功和失败设置返回结果 package com.atguigu.cloud.resp;import lombok.Data; import lombok.experimental.Accessors;Data Accessors(chain true) public class ResultDataT {private String code;private String message;private T data;private long timestamp;public ResultData(){this.timestampSystem.currentTimeMillis();}//成功public staticT ResultDataT success(T data){ResultData resultDatanew ResultData();resultData.setCode(ReturnCodeEnum.RC200.getCode());resultData.setMessage(ReturnCodeEnum.RC200.getMessage());resultData.setData(data);return resultData;}//失败public static T ResultDataT fail(String code,String message){ResultData resultDatanew ResultData();resultData.setCode(code);resultData.setMessage(message);resultData.setData(null);return resultData;} }5、修改 PayController 类中的返回值 设置好同意的返回值后我们需要修改先前的 PayController 类中的返回值 将当中方法的返回值实现统一 修改后的代码 package com.atguigu.cloud.controller;import cn.hutool.core.bean.BeanUtil; import com.atguigu.cloud.entities.Pay; import com.atguigu.cloud.entities.PayDTO; import com.atguigu.cloud.resp.ResultData; import com.atguigu.cloud.service.PayService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import org.springframework.beans.BeanUtils; import org.springframework.web.bind.annotation.*;import java.util.List;RestController Tag(name 支付微服务模块,description 支付CRUD) public class PayController {ResourcePayService payService;PostMapping(value /pay/add)Operation(summary 新增, description 新增支付流水方法,json串做参数)public ResultDataString addPay(RequestBody Pay pay) {System.out.println(pay.toString());int i payService.add(pay);return ResultData.success(成功插入记录返回值 i);}DeleteMapping(value /pay/del/{id})Operation(summary 删除, description 删除支付流水方法)public ResultDataInteger deletePay(PathVariable(id) Integer id) {return ResultData.success(payService.delete(id));}PutMapping(value /pay/update)Operation(summary 修改, description 修改支付流水方法)public ResultDataString updatePay(RequestBody PayDTO payDTO) {Pay pay new Pay();BeanUtils.copyProperties(payDTO, pay);int i payService.update(pay);return ResultData.success(成功修改记录返回值 i);}GetMapping(value /pay/get/{id})Operation(summary 按照ID查流水, description 查询支付流水方法)public ResultDataPay getById(PathVariable(id) Integer id) {return ResultData.success(payService.getById(id));} }然后进行测试即可 1.6.3 全局异常处理 定义全局异常处理后将不需要再使用 try-cath 来解决异常了 首先给我们 Controller 类中抛出一个错误 当传输的 id 为 -4 时抛出错误 定义全局异常处理类 GlobalExceptionHandler package com.atguigu.cloud.exp;import com.atguigu.cloud.resp.ResultData; import com.atguigu.cloud.resp.ReturnCodeEnum; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice;RestControllerAdvice public class GlobalExceptionHandler {ExceptionHandler(RuntimeException.class)ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)public ResultDataString exception(Exception e){System.out.println(#### come in GlobalExceptionHandler);return ResultData.fail(ReturnCodeEnum.RC500.getCode(), ReturnCodeEnum.RC500.getMessage());} } ExceptionHandler 注解是具体要捕获的异常类型 ResponseStatus 注解中的 HttpStatus枚举是定义异常和 BUG 的一个标准和规范 ResponseStatus主要作用是为了改变 Http 响应的状态码 测试一下即可执行查询方法传入 id 为 -4 1.7 引入微服务理念 这里主要讲解不同模块之间如何调用 订单微服务80如何才能调用到支付微服务8001 1.7.1 RestTemplate 在引入微服务之前需要介绍一下 API RestTemplate RestTemplate 提供了多种远程范围 HTTP 服务的方法 是一种简单便捷的 restful 服务类 是 Spring 提供的用于访问 Rest 服务的客户端模板工具集 官网访问地址https://docs.spring.io/spring-framework/docs/6.0.11/javadoc-api/org/springframework/web/client/RestTemplate.html 看官网的方法便可得知它提供了两个微服务之间调用的增删改查的方法 使用restTemplate访问restful接口非常的简单粗暴无脑 (url, requestMap, ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型 HTTP响应转换被转换成的对象类型简单理解就是要返回的对象 常用方法 如果访问的是 getForEntity 方法则返回是 RestTemplate 自己封装的一层对象 主要包含了一些重要信息例如响应头响应状态码响应体等 如果访问的是 getForObject方法则直接返回我们指定的返回的对象 GET 请求方法 POST 请求方法 使用 RestTemplate 的两种方式 直接 new 出来 使用 配置类来返回 RestTemplate Configuration public class RestTemplateConfig {Beanpublic RestTemplate restTemplate(){return new RestTemplate();} } 1.7.2 RestTemplate 增删改查使用的方法 以下推荐一下我自己增删改查使用的方法 增postForObject(url,传递参数,返回的对象)删delete(url,传递参数,返回的对象)改put(url,传递参数,返回的对象)查getForObject(url,返回的对象传递的参数) 1.7.3 新建模块 80 按照之前的步骤建模块-改pom-写yml-创建主启动类-创建业务类来创建模块 创建模块 cloud-consumer-order80 改写 pom 文件 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.atguigu.cloud/groupIdartifactIdcloud2024/artifactIdversion1.0-SNAPSHOT/version/parentartifactIdcloud-consumer-order80/artifactIdpropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependencies!--web actuator--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency!--lombok--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency!--hutool-all--dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactId/dependency!--fastjson2--dependencygroupIdcom.alibaba.fastjson2/groupIdartifactIdfastjson2/artifactId/dependency!-- swagger3 调用方式 http://你的主机IP地址:5555/swagger-ui/index.html --dependencygroupIdorg.springdoc/groupIdartifactIdspringdoc-openapi-starter-webmvc-ui/artifactId/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build /project写 yml 文件 server:port: 80创建主启动类名为 Main80 package com.atguigu.cloud;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication public class Main80 {public static void main(String[] args) {SpringApplication.run(Main80.class,args);} }创建业务类 创建实体类 PayDTO 与 8001 模块的 DTO 一致 因为消费者 80 产生的数据只应该是 支付者 8001 暴露出来的东西 给消费者 80 尝试填写对于其他敏感信息其他信息是不应该暴露的 所以需要使用 DTO 来传输数据 将之前在 8001 模块内定义的 统一返回对象拷贝过来 创建 RestTemplat 配置类 创建 Controller 定义两个属性 REST请求地址RestTemplate package com.atguigu.cloud.controller;import jakarta.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate;RestController public class OrderController {public static final String PaymentSrv_URL https://localhost:8001;Resourceprivate RestTemplate restTemplate;}1.7.4 微服务调用实现 80 模块调用 8001 模块中的增删改查方法 然后就可以编写我们的增删改查方法了 首先我们编写一个增加方法用于测试 package com.atguigu.cloud.controller;import com.atguigu.cloud.entities.PayDTO; import com.atguigu.cloud.resp.ResultData; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate;RestController Tag(name 微服务消费模块,description 消费调用支付的CRUD) public class OrderController {public static final String PaymentSrv_URL http://localhost:8001;Resourceprivate RestTemplate restTemplate;PostMapping(/consumer/pay/add)Operation(summary 消费调用支付的新增, description 新增支付流水方法,json串做参数)public ResultData addOrder(PayDTO payDTO){return restTemplate.postForObject(PaymentSrv_URL/pay/add, payDTO, ResultData.class);} } postForObject 方法传递的三个参数就是对应 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型及返回的对象类型 然后启动两个程序 Main8001 和 Main80 一个个启动的话会比较麻烦这边推荐设置到一起启动、 右上角编辑配置 选择 Spring boot添加新的运行配置 命名并且指定模块 选择模块内的主启动类 然后右键运行即可 然后进行测试即可 增删改查的所有代码如下 package com.atguigu.cloud.controller;import com.atguigu.cloud.entities.PayDTO; import com.atguigu.cloud.resp.ResultData; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate;RestController Tag(name 微服务消费模块,description 消费调用支付的CRUD) public class OrderController {public static final String PaymentSrv_URL http://localhost:8001;Resourceprivate RestTemplate restTemplate;//增PostMapping(/consumer/pay/add)Operation(summary 消费调用支付的新增, description 新增支付流水方法,json串做参数)public ResultData addOrder(PayDTO payDTO){return restTemplate.postForObject(PaymentSrv_URL/pay/add, payDTO, ResultData.class);}//删DeleteMapping( /consumer/pay/del/{id})Operation(summary 消费调用支付删除, description 删除支付流水方法)public ResultData delByIdOrder(PathVariable(id) Integer id){restTemplate.delete(PaymentSrv_URL/pay/del/{id},id,ResultData.class);return ResultData.success(okx);}//改PutMapping(/consumer/pay/update)Operation(summary 消费调用支付的修改,description 修改支付流水方法)public ResultData updatePay(RequestBody PayDTO payDTO){restTemplate.put(PaymentSrv_URL/pay/update,payDTO,ResultData.class);return ResultData.success(ok);}//查GetMapping(/consumer/pay/get/{id})Operation(summary 消费调用支付的按照ID查流水, description 查询支付流水方法)public ResultData getById(PathVariable(id) Integer id){return restTemplate.getForObject(PaymentSrv_URL/pay/get/{id},ResultData.class,id);} }1.8 工程重复代码提取 1.8.1 观察问题 在我们的 8001 支付模块和 80 订单模块 两个模块当中都存在一些相同的类例如 可见系统中存在相同的部分 此时我们可以新建一个模块当作项目的一个包 将这些重复的部分写入模块在使用时即可直接调用 1.8.2 新建通用组件模块 新建模块 cloud-api-commons 用于对外暴露通用的组件/api/接口/工具类等 改写 pom 文件 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.atguigu.cloud/groupIdartifactIdcloud2024/artifactIdversion1.0-SNAPSHOT/version/parentartifactIdcloud-api-commons/artifactIdpropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependencies!--SpringBoot通用依赖模块--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency!--hutool--dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactId/dependency/dependencies /project将两个模块通用的部分添加进新模块 使用 maven将 cloud-api-commons 模块打成一个公用的 jar 包 1.8.3 对模块 8001 和 80 进行改造 将模块 cloud-api-commons 打成 jar 包后需要在 8001 和 80 两个模块之间进行引用 在 pom 文件中添加此依赖进行引用 !-- 引入自己定义的api通用包 -- dependencygroupIdcom.atguigu.cloud/groupIdartifactIdcloud-api-commons/artifactIdversion1.0-SNAPSHOT/version /dependency既然已经引入公用的部分了那么两个模块之间公用的部分就可以删除了 rg/xsd/maven-4.0.0.xsd 4.0.0 com.atguigu.cloud cloud2024 1.0-SNAPSHOT artifactIdcloud-api-commons/artifactIdpropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependencies!--SpringBoot通用依赖模块--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency!--hutool--dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactId/dependency/dependencies~~~ 将两个模块通用的部分添加进新模块 [外链图片转存中…(img-4MEDou8X-1711422961090)] 使用 maven将 cloud-api-commons 模块打成一个公用的 jar 包 [外链图片转存中…(img-ZhjxjmYb-1711422961090)] 1.8.3 对模块 8001 和 80 进行改造 将模块 cloud-api-commons 打成 jar 包后需要在 8001 和 80 两个模块之间进行引用 在 pom 文件中添加此依赖进行引用 !-- 引入自己定义的api通用包 -- dependencygroupIdcom.atguigu.cloud/groupIdartifactIdcloud-api-commons/artifactIdversion1.0-SNAPSHOT/version /dependency[外链图片转存中…(img-HllNT61C-1711422961091)] 既然已经引入公用的部分了那么两个模块之间公用的部分就可以删除了 [外链图片转存中…(img-Fqj8AVYG-1711422961091)] 然后自行测试即可

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

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

相关文章

品牌创意型网站建设山东省城乡建设厅官网

目录 1.背景介绍1.1. 项目背景1.2. 项目难点1.3. 项目环境 2. flask后端开发实现的功能3. flask部署和前后端对接3.1. flask运行配置和服务器部署3.2. flask前后端传参 4. 后端测试工具4.1. 工具介绍4.2. 工具使用 后记 1.背景介绍 1.1. 项目背景 就是前几个月临时接手了一个…

html网站开发心得体会大丰市市城乡建设局网站

来源:中国电子信息产业发展研究院10月19日,由北京市人民政府、工业和信息化部主办,工业和信息化部装备工业发展中心、中国电子信息产业发展研究院(以下简称“赛迪研究院”)等机构共同承办的“世界智能网联汽车大会”进…

互联网app下载手机优化加速有什么用

dubbo自定义了很多xml标签,例如,那么这些自定义标签是怎么与spring结合起来的呢?我们先看一个简单的例子。一 编写模型类1 packagecom.hulk.testdubbo.model;23 public classHero {4 privateString name;5 private intage;67 publicString ge…

北京网站设计济南兴田德润团队怎么样专门代写平台

点击上方蓝字关注我们(本文阅读时间:4 分钟)活动介绍▌MAUI 跨平台应用开发实战前端应用开发往往需要面对 iOS、Android、Windows 等多平台开发的问题。如能用一种开发工具进行多平台的开发,可以跨平台共享 UI 布局和设计&#xf…

电子商务公司名称大全简单大气wordpress优化软件

可以设置小程序跳转,引流也不错支持小程序后台流量主激励视频广告用户下载一次观看一次视频广告,收入非常可观支持小程序后台流量主banner广告支持全网短视频解析,苹果安卓通用支持后台无限生成卡密支持自定义文字广告支持图片广告支持小程序…

网站数据库模板下载90设计手机站

小张一年前入职,当时毕业已经一年了,一年换了4份工作。最少的才呆了一周。 小张的简历很正规,彩色打印,整整5页。技能篇写的很全,基本上市面上的技术都写到了,都是精通。面试的时候,表现也很好&…

Java实现双色球历史是否中奖查询

Java实现双色球历史是否中奖查询 在一些问答里,很多彩友都在问:如何查看自己的双色球号码在历史期次中有没有中过奖?作为开发者兼彩友,这个问题就简单了,决定解决一下这个问题,先上结果: 双色球历史是否中奖查询…

iframe引入界面有el-date-picker日期框,点击出现闪退问题处理 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

ABC424 游记(VP)

前五题没什么难度,第六题恰好会,运气好 6t 没寄。省流 前五题没什么难度,第六题恰好会,运气好 6t 没寄。9.23 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 下午下大雨没去图书馆,浪费了一下午,晚上准备…

Java实现大乐透历史是否中奖查询

Java实现大乐透历史是否中奖查询 在一些问答里,很多彩友都在问:如何查看自己的大乐透号码在历史期次中有没有中过奖?作为开发者兼彩友,这个问题就简单了,决定解决一下这个问题,先上结果: 大乐透历史是否中奖查询…

怎么弄网站做网站卖东西wordpress 怎样写函数

在Android开发中使用View制作一个引导动画发布时间:2020-11-20 16:46:16来源:亿速云阅读:98作者:Leah这篇文章将为大家详细讲解有关在Android开发中使用View制作一个引导动画,文章内容质量较高,因此小编分享…

网站如何做会员通用西安网站制作网站

第一种方案:使用CountDownLatch工具类 CountDownLatch:是Java多线程编程中的一个同步工具类(计数锁),它允许一个或多个线程等待其他线程完成操作后再继续执行。其内部维护了一个计数器,当线程在执行任务完…

如何把网站做的和别人一样网站的具体内容

XSS漏洞(跨站脚本) 1.XSS 漏洞简介 ​ XSS又叫CSS(Cross Site Script)跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从…

新类型网站利用js做网站

1. 题目 2. 分析 合理地改造原数据,这样会使得代码逻辑大大简化。 为了让代码走相同的逻辑,这里需要在原数据后面追加一个price 0。这个price 0大大地简化了处理[1,2,3,4,5] 这类型数据的复杂度。 3. 代码 class Solution:def maxProfit(self, pri…

怎么做网站不用备案怀宁做网站

高斯模糊、加载监听、圆角图片这些相信大家都很熟悉,那如何实现这些效果,请大家参考本文进行学习。1、引用compile com.github.bumptech.glide:glide:3.7.02、加载图片2.1 基本加载Glide.with(context).load(url).into(imageView);2.2 设置加载中和加载失…

找项目seo网站设计多少钱

集合里面的 E是泛型 暂且认为是object转载于:https://www.cnblogs.com/classmethond/p/10011374.html

如何做聚合类网站业务员销售管理软件

1.题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意…

潭州教育网站开发网站建设开发报价单

定义 标识符只能由字母、数字、下划线(_)和美元符号($)组成。标识符必须以字母、下划线或美元符号开头,不能以数字开头。标识符对大小写敏感,例如"myVariable"和"myvariable"是不同的…

昆山网站建设义搏专业制作假行驶证

文章目录显示/隐藏文件快捷键修改“访达”属性修改文件隐藏属性设置特殊文件名实现隐藏使用命令设置文件隐藏属性显示/隐藏文件 快捷键 按下 Shift Command . 可以显示隐藏型的文件,再按下 Shift Command . 则不显示隐藏型的文件 修改“访达”属性 defaults…

拖拽式制作网站自己做网站代理产品

实战案例分析 为了更好地理解爬虫逆向的实际应用,我们以一个具体的案例进行分析。 案例背景 假设我们需要从某电商网站上获取商品价格信息,但该网站采取了反爬虫措施,包括动态Token和用户行为分析等。 分析与挑战 动态Token:…