SpringCloud+Vue+Python人工智能(fastAPI,机器学习,深度学习)前后端架构各功能实现思路——主目录(持续更新)
随着公司业务的增加,公司需要一个java+python人工智能相互配合架构,正常网站业务用java来做,而ai,例如电价预测等回归任务,以及大模型预测全网负荷,新能源出力等任务,使用python通过fastapi暴露接口来做,那么就需要springcloud架构注册发现。前端统一使用Vue进行效果的展示
因此本文会将我的解决思路中,关于架构(不涉及核心业务代码)的通用逻辑分享给大家
在此,感谢各位领导满足我对知识开源分享的执拗,同意我将部分通用代码进行开源分享
文章目录
- 一、java后端SpringCloud架构
- 1. 必要的需要单独下载的第三方包
- 1.1 安装启动
- 1.2 配置
- 2. springCloud核心架构搭建
- 2.1 根目录pom文件
- 2.2 base模块
- 2.3 common模块
- 2.4 getway网关
- 2.5 security权限管理
- 3. 工具类
- 3. gateway网关
- 4. mybatis-plus,代码生成器
- 5. Sa-Token权限管理模块rbac
- 二、Python后端FastAPI架构
- 三、Vue3.0前端架构
- 1. 后台系统
- 1.1 前端环境搭建
- 1.2 登录
- 1.3 权限管理模块前端实现
一、java后端SpringCloud架构
1. 必要的需要单独下载的第三方包
1.1 安装启动
1. nacos,阿里巴巴开源的服务注册中心:https://github.com/alibaba/nacos/tags,点进去下载nacos-server.zip压缩包解压缩即可(注意不要下载源码)
解压后进入bin目录,打开cmd窗口,输入命令
.\startup.cmd -m standalone
(其中,-m standalone表示单机启动,因为目前没有集群)
进入其给出的地址,即可进入可视化界面
2. seata,做数据一致性的强大工具,因为分布式服务对数据一致性的要求很高:https://seata.apache.org/zh-cn
2.2之前的版本,直接进入bin目录下双击
seata-server.bat
运行即可
2.2版本,先进入seata-server,然后进入bin目录运行
seata-server.bat
3. redis,大佬请进!redis大佬的知名度就不用过多介绍了吧,https://github.com/tporadowski/redis/releases
解压后,双击redis-server.exe运行即可
1.2 配置
1. 进入seata官网,进入文档,配置中心章节中,有Nacos配置中心,文档中给出了配置文件应该怎么配置,并给出了配置文件的github地址
2. nacos配置中心新增配置seataServer.properties,将上面复制的内容粘贴过去,并修改数据库相关的配置
#For details about configuration items, see https://seata.io/zh-cn/docs/user/configurations.html
#Transport configuration, for client and server
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableTmClientBatchSendRequest=false
transport.enableRmClientBatchSendRequest=true
transport.enableTcServerBatchSendResponse=false
transport.rpcRmRequestTimeout=30000
transport.rpcTmRequestTimeout=30000
transport.rpcTcRequestTimeout=30000
transport.threadFactory.bossThreadPrefix=NettyBoss
transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
transport.threadFactory.shareBossWorker=false
transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
transport.threadFactory.clientSelectorThreadSize=1
transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
transport.threadFactory.bossThreadSize=1
transport.threadFactory.workerThreadSize=default
transport.shutdown.wait=3
transport.serialization=seata
transport.compressor=none#Transaction routing rules configuration, only for the client
service.vgroupMapping.default_tx_group=default
#If you use a registry, you can ignore it
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false#Transaction rule configuration, only for the client
client.rm.asyncCommitBufferLimit=10000
client.rm.lock.retryInterval=10
client.rm.lock.retryTimes=30
client.rm.lock.retryPolicyBranchRollbackOnConflict=true
client.rm.reportRetryCount=5
client.rm.tableMetaCheckEnable=true
client.rm.tableMetaCheckerInterval=60000
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.rm.sagaJsonParser=fastjson
client.rm.tccActionInterceptorOrder=-2147482648
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
client.tm.interceptorOrder=-2147482648
client.undo.dataValidation=true
client.undo.logSerialization=jackson
client.undo.onlyCareUpdateColumns=true
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
client.undo.logTable=undo_log
client.undo.compress.enable=true
client.undo.compress.type=zip
client.undo.compress.threshold=64k
#For TCC transaction mode
tcc.fence.logTableName=tcc_fence_log
tcc.fence.cleanPeriod=1h#Log rule configuration, for client and server
log.exceptionRate=100#Transaction storage configuration, only for the server. The file, db, and redis configuration values are optional.
store.mode=file
store.lock.mode=file
store.session.mode=file
#Used for password encryption
store.publicKey=#If `store.mode,store.lock.mode,store.session.mode` are not equal to `file`, you can remove the configuration block.
store.file.dir=file_store/data
store.file.maxBranchSessionSize=16384
store.file.maxGlobalSessionSize=512
store.file.fileWriteBufferCacheSize=16384
store.file.flushDiskMode=async
store.file.sessionReloadReadSize=100#These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block.
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/yd_oa_db?serverTimeZone=GMT%2B8&useUnicode=true&rewriteBatchedStatements=true
store.db.user=root
store.db.password=root
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.distributedLockTable=distributed_lock
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000#These configurations are required if the `store mode` is `redis`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `redis`, you can remove the configuration block.
store.redis.mode=single
store.redis.single.host=127.0.0.1
store.redis.single.port=6379
store.redis.sentinel.masterName=
store.redis.sentinel.sentinelHosts=
store.redis.sentinel.sentinelPassword=
store.redis.maxConn=10
store.redis.minConn=1
store.redis.maxTotal=100
store.redis.database=0
store.redis.password=
store.redis.queryLimit=100#Transaction rule configuration, only for the server
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackFailedUnlockEnable=false
server.distributedLockExpireTime=10000
server.xaerNotaRetryTimeout=60000
server.session.branchAsyncQueueSize=5000
server.session.enableBranchAsyncRemove=false
server.enableParallelRequestHandle=false#Metrics configuration, only for the server
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898
2. springCloud核心架构搭建
如果使用maven引入包后,写代码依然无法找到包,或者莫名其妙报错的,可以先指向Lifecycle中的clean,然后执行install
还不行就点一下刷新Maven依赖按钮
2.1 根目录pom文件
1. 新建一个空项目,新建src文件夹,然后创建pom.xml文件
2. 根目录的pom主要是引入全局依赖的版本控制,根目录也是我们的父工程,而我们的父工程也需要有一个父工程,就是spring-boot-starter-parent。子模块引入jar包时,无需手动指定版本,根目录pom统一控制
3. 同时我们要将通用的jar包控制起来,每个子模块若有差异化,就不配置在父工程(请以给出代码为主,图片仅供参考,日后如果修改,不会改图片,只会改给出的代码)
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion>
<!-- 指定父工程为spring-boot-starter-parent --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.18</version><relativePath/></parent>
<!-- 我们自己的父工程groupID --><groupId>com.yd_oa_java_cloud.cloud</groupId>
<!-- 指定自己名字,我们的的坐标就是父工程groupId加上自己的artifactId ,当前跟目录的父工程就是spring-boot-starter-parent--><artifactId>yd_oa_java_cloud</artifactId><version>1.0</version><packaging>pom</packaging>
<!--父工程的子模块--><modules></modules><!--统一管理jar包版本--><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><skipTests>true</skipTests><springboot.version>2.7.18</springboot.version><spring-cloud.version>2021.0.6</spring-cloud.version><spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version><spring-openfeign.version>2.2.2.RELEASE</spring-openfeign.version><spring-cloud-gateway.version>3.1.9</spring-cloud-gateway.version><mybatis.version>1.3.2</mybatis.version><logback.version>1.2.10</logback.version><mysql.version>8.0.23</mysql.version><aspectjweaver.version>1.9.3</aspectjweaver.version><fastjson.version>1.2.83</fastjson.version><commons.lang3.version>3.4</commons.lang3.version><commons.csv.version>1.2</commons.csv.version><commons.codec.version>1.9</commons.codec.version><commons.io.version>2.5</commons.io.version><feign-okhttp.version>10.2.0</feign-okhttp.version><okhttp3.version>4.12.0</okhttp3.version><lombok.version>1.18.22</lombok.version><captcha.verion>1.6.2</captcha.verion><es.version>3.3.2</es.version></properties>
<!--锁定jar包版本--><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${springboot.version}</version><exclusions><exclusion><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId></exclusion><exclusion><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- SpringCloud Alibaba 微服务 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>${spring-openfeign.version}</version></dependency><!--网关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><version>${spring-cloud-gateway.version}</version></dependency><!--seata--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><version>2021.0.5.0</version><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></exclusion><exclusion><groupId>io.seata</groupId><artifactId>seata-all</artifactId></exclusion><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>2.7.18</version></dependency><!--springboot 集成seata--><dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.6.1</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.version}</version></dependency><!-- 数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!-- 日志版本 --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>${logback.version}</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>${logback.version}</version></dependency><!--切面--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${aspectjweaver.version}</version></dependency><!--okhttp--><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>${okhttp3.version}</version></dependency><!--fastjson--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><!--apache common--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-csv</artifactId><version>${commons.csv.version}</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>${commons.lang3.version}</version></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>${commons.codec.version}</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>${commons.io.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>${springboot.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>${es.version}</version></dependency><dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>${captcha.verion}</version></dependency></dependencies></dependencyManagement>
</project>
2.2 base模块
base模块和common都是公用的,但是为了避免包的冲突,所以搞两个。base是最基础的包,是给网关gateway使用的,而gateway和web包是冲突的。而common是给业务子模块使用的,它可以引入base,然后额外引入web包,给业务模块使用。
1. 建立base子模块,并建立pom.xml文件
2. 建立src\main\java文件夹,将java标识为source文件夹
3. 新建在main文件夹下,java文件夹同级,建立resources文件夹,标识为Resources Root
4. 编写pom.xml文件,然后将模块加到父模块中
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion>
<!-- 父模块坐标 --><parent><groupId>com.yd_oa_java_cloud.cloud</groupId><artifactId>yd_oa_java_cloud</artifactId><version>1.0</version></parent>
<!-- 自己的坐标--><groupId>com.yd_oa_java_cloud.cloud</groupId><artifactId>yd_oa_java_base</artifactId><version>1.0</version>
<!-- 打包方式为jar--><packaging>jar</packaging>
<!-- 配置--><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><skipTests>true</skipTests></properties>
<!-- jar包--><dependencies><!-- 日志版本 --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId></dependency><!--fastjson--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--apache common--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-csv</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></dependency></dependencies>
</project>
2.3 common模块
base模块只有最基础的包,而common要考虑的就很多了
1. 构建common模块,与base同理创建基本文件夹后,建立pom.xml
2. 编写pom.xml,注意common要引入base模块,最后将模块加入父模块中
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 父模块坐标 --><parent><groupId>com.yd_oa_java_cloud.cloud</groupId><artifactId>yd_oa_java_cloud</artifactId><version>1.0</version></parent><!-- 自己的坐标--><groupId>com.yd_oa_java_cloud.cloud</groupId><artifactId>yd_oa_java_common</artifactId><version>1.0</version><!-- 打包方式为jar--><packaging>jar</packaging><!-- 配置--><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><skipTests>true</skipTests></properties><!-- jar包--><dependencies>
<!-- 引入我们的base模块--><dependency><groupId>com.yd_oa_java_cloud.cloud</groupId><artifactId>yd_oa_java_base</artifactId><version>1.0</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--nacos的配置管理依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--负载均衡--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><!-- 数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--切面--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId></dependency><!--okhttp--><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp-sse</artifactId></dependency><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId></dependency></dependencies>
</project>
2.4 getway网关
1. 步骤一样,不多赘述,getway网关引入base模块
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.yd_oa_java_cloud.cloud</groupId><artifactId>yd_oa_java_cloud</artifactId><version>1.0</version></parent><artifactId>yd_oa_java_gateway</artifactId><version>1.0</version><packaging>jar</packaging><!-- <properties>-->
<!-- <maven.compiler.source>21</maven.compiler.source>-->
<!-- <maven.compiler.target>21</maven.compiler.target>-->
<!-- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>-->
<!-- </properties>--><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><skipTests>true</skipTests></properties><dependencies><!-- 引入我们的base模块--><dependency><groupId>com.yd_oa_java_cloud.cloud</groupId><artifactId>yd_oa_java_base</artifactId><version>1.0</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--nacos的配置管理依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><!--负载均衡--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency></dependencies>
<!-- 最终打包部署时使用 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.2.6.RELEASE</version><configuration><mainClass>com.yd_oa_java_cloud.gateway.YdOaCloudGatewayRunApplication</mainClass></configuration></plugin></plugins></build>
</project>
2.5 security权限管理
这个属于普通web服务,也就是一个普通的springboot项目。但是它的权限管理又是几乎所有模块都需要用的,我们直接将其写为单独的微服务,通过一致性处理,解决分布式问题
它只需要引入common模块即可,其余依赖可以在实际写程序时进行引入,不要忘了在父模块中加载这个新伙伴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.yd_oa_java_cloud.cloud</groupId><artifactId>yd_oa_java_cloud</artifactId><version>1.0</version></parent><artifactId>yd_oa_java_security</artifactId><version>1.0</version><packaging>jar</packaging>
<!-- <properties>-->
<!-- <maven.compiler.source>21</maven.compiler.source>-->
<!-- <maven.compiler.target>21</maven.compiler.target>-->
<!-- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>-->
<!-- </properties>--><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><skipTests>true</skipTests></properties><dependencies>
<!-- 引入common模块--><dependency><groupId>com.yd_oa_java_cloud.cloud</groupId><artifactId>yd_oa_java_common</artifactId><version>1.0</version></dependency></dependencies>
<!-- 打包的时候用--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.2.6.RELEASE</version><configuration><mainClass>com.yd_oa_java_cloud.security.YdOaCloudSecurityRunApplication</mainClass></configuration></plugin></plugins></build>
</project>
3. 工具类
1. base模块中,专门处理JSON数据的工具类
package com.yd_oa_java_cloud.base.utils;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.List;/*** 处理json的工具类*/
public class JsonUtils {private static final Logger logger = LoggerFactory.getLogger(JsonUtils.class);//对象转jsonpublic static String convertObjToJson(Object obj){return JSON.toJSONString(obj);}//json转对象public static <T> T convertJsonToObj(String json,Class<T> classz){return JSONObject.parseObject(json,classz);}//json转对象列表public static <T> List<T> convertJsonArrayToList(String json, Class<T> classz){return JSONArray.parseArray(json,classz);}}
2. base模块中,建立响应VO(响应值对象ValueObject),封装响应的状态码等信息
根据不同用户习惯,提供两种,一个是ResponseVO,完全通过get和set自定义响应。还有一个是Result类,提供封装好的响应,例如Result.ok(),但是这个类依赖于下面介绍的枚举类,代码放在和枚举类一起
package com.yd_oa_java_cloud.base.entity.vo;/*** ResonseValueObject* RESTful API中,使用VO来封装响应数据是一种常见的做法。响应VO用于封装API接口的返回结果,通常包含状态码、提示信息及数据部分,这样前端可以清晰地获取每次请求的结* @param <T>*/
public class ResponseVO<T> {private String status;//响应状态private Integer code; //响应码private String info; //响应信息private T data; //响应数据public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getInfo() {return info;}public void setInfo(String info) {this.info = info;}public T getData() {return data;}public void setData(T data) {this.data = data;}
}
3. base模块中,建立响应枚举类,封装响应码和信息
基于枚举类封装的Result
package com.yd_oa_java_cloud.base.entity.enums;/*** 响应code,msg枚举类*/
public enum ResponseCodeEnum {CODE_20000(20000,"请求成功!"),CODE_20001(20001,"请求失败!"),CODE_404(404,"请求地址不存在!"),CODE_600(600,"请求参数错误!"),CODE_601(601,"信息已存在!"),CODE_500(500,"服务器响应出错,请联系管理员!"),CODE_503(503,"应用服务错误,请联系管理员!"),//具体微服务错误CODE_50014(50014,"Token过期,请重新登录!"),CODE_50008(50008,"非法令牌Token!"),CODE_50012(50012,"其他客户端已登录!"),CODE_901(901,"未登录或登录超时,请重新登录!"),;private Integer code;private String msg;ResponseCodeEnum(Integer code, String msg) {this.code = code;this.msg = msg;}public Integer getCode() {return code;}public String getMsg() {return msg;}
}
package com.yd_oa_java_cloud.base.entity.vo;import com.yd_oa_java_cloud.base.entity.enums.ResponseCodeEnum;import java.io.Serializable;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;public class YdOaResult extends LinkedHashMap<String,Object> implements Serializable {private Integer code;//状态码private String msg;//返回信息public YdOaResult(){}public YdOaResult(int code, String msg, Object data) {this.setCode(code);this.setMsg(msg);this.setData(data);}public Integer getCode() {return (Integer)this.get("code");}public String getMsg() {return (String)this.get("msg");}public Object getData() {return this.get("data");}public YdOaResult setCode(int code) {this.put("code", code);return this;}public YdOaResult setMsg(String msg) {this.put("msg", msg);return this;}public YdOaResult setData(Object data) {this.put("data", data);return this;}public YdOaResult set(String key, Object data) {this.put(key, data);return this;}public YdOaResult removeDefaultFields() {this.remove("code");this.remove("msg");this.remove("data");return this;}public YdOaResult removeNonDefaultFields() {Iterator var1 = this.keySet().iterator();while(var1.hasNext()) {String key = (String)var1.next();if (!"code".equals(key) && !"msg".equals(key) && !"data".equals(key)) {this.remove(key);}}return this;}public static YdOaResult ok() {ResponseCodeEnum code20000 = ResponseCodeEnum.CODE_20000;return new YdOaResult(code20000.getCode(), code20000.getMsg(), (Object)null);}public static YdOaResult ok(String msg) {ResponseCodeEnum code20000 = ResponseCodeEnum.CODE_20000;return new YdOaResult(code20000.getCode(), msg, (Object)null);}public static YdOaResult code(int code) {return new YdOaResult(code, (String)null, (Object)null);}public static YdOaResult data(Object data) {ResponseCodeEnum code20000 = ResponseCodeEnum.CODE_20000;return new YdOaResult(code20000.getCode(),code20000.getMsg(), data);}public static YdOaResult error() {ResponseCodeEnum code20001 = ResponseCodeEnum.CODE_20001;return new YdOaResult(code20001.getCode(), code20001.getMsg(), (Object)null);}public static YdOaResult error(String msg) {ResponseCodeEnum code20001 = ResponseCodeEnum.CODE_20001;return new YdOaResult(code20001.getCode(), msg, (Object)null);}public static YdOaResult get(int code, String msg, Object data) {return new YdOaResult(code, msg, data);}public static YdOaResult empty() {return new YdOaResult();}public String toString() {return "{\"code\": " + this.getCode() + ", \"msg\": " + this.transValue(this.getMsg()) + ", \"data\": " + this.transValue(this.getData()) + "}";}private String transValue(Object value) {if (value == null) {return null;} else {return value instanceof String ? "\"" + value + "\"" : String.valueOf(value);}}
}
4. base模块构建自定义异常类,封装自定义异常
package com.yd_oa_java_cloud.base.exception;import com.yd_oa_java_cloud.base.entity.enums.ResponseCodeEnum;/*** 自定义异常*/
public class BusinessException extends RuntimeException{private ResponseCodeEnum codeEnum;//引入响应信息枚举private Integer code;//自定义异常响应码private String message; //自定义异常响应信息//构造方法public BusinessException(String message,Throwable e){super(message,e);//调用父类构造方法,将异常信息传入this.message = message;}public BusinessException(String message){super(message);this.message = message;}public BusinessException(Throwable e) {super(e);}public BusinessException(ResponseCodeEnum codeEnum){super(codeEnum.getMsg());this.codeEnum=codeEnum;this.code = codeEnum.getCode();this.message = codeEnum.getMsg();}public BusinessException(Integer code, String message){super(message);this.code = code;this.message = message;}public ResponseCodeEnum getCodeEnum() {return codeEnum;}public Integer getCode() {return code;}@Overridepublic String getMessage() {return message;}/*** 重新fillInStackTrace 业务异常不需要堆栈信息,提高效率*/@Overridepublic Throwable fillInStackTrace() {return this;}
}
3. gateway网关
由于篇幅原因,将其放在:https://blog.csdn.net/grd_java/article/details/145000544 |
---|
4. mybatis-plus,代码生成器
按需加载,可以使用mybatis自己写全流程,这一步是可选项
由于篇幅原因,将其放在:https://blog.csdn.net/grd_java/article/details/145061518 |
---|
5. Sa-Token权限管理模块rbac
本来想使用spring security的,但是考虑到实际工作中,大家都在用国产的Sa-Token框架实现相关功能,所以采用此框架实现权限认证
这个框架真的很好用呀,spring security玩了这么久,现在有了Sa-Token以后,除了高安全性需求场景基本用不上spring security了,文档还难读,Sa-Token再发展两年,真的可以把spring security关小黑屋了
由于篇幅原因,将其放在:https://blog.csdn.net/grd_java/article/details/145013189 |
---|
二、Python后端FastAPI架构
三、Vue3.0前端架构
1. 后台系统
1.1 前端环境搭建
由于篇幅原因,将其放在:https://blog.csdn.net/grd_java/article/details/144904996 |
---|
1.2 登录
由于篇幅原因,将其放在:https://blog.csdn.net/grd_java/article/details/145251917 |
---|
1.3 权限管理模块前端实现
由于篇幅原因,将其放在:https://blog.csdn.net/grd_java/article/details/145253695 |
---|
相关文章:
SpringCloud+Vue+Python人工智能(fastAPI,机器学习,深度学习)前后端架构各功能实现思路——主目录(持续更新)
随着公司业务的增加,公司需要一个javapython人工智能相互配合架构,正常网站业务用java来做,而ai,例如电价预测等回归任务,以及大模型预测全网负荷,新能源出力等任务,使用python通过fastapi暴露接…...
【GIS操作】使用ArcGIS Pro进行海图的地理配准(附:墨卡托投影对比解析)
文章目录 一、应用场景二、墨卡托投影1、知识点2、Arcgis中的坐标系选择 三、操作步骤1、数据转换2、数据加载3、栅格投影4、地理配准 一、应用场景 地理配准是数字化之前必须进行的一项工作。扫描得到的地图数据通常不包含空间参考信息,需要通过具有较高位置精度的…...
C#,入门教程(03)——Visual Studio 2022编写彩色Hello World与动画效果
C#,入门教程(01)—— Visual Studio 2022 免费安装的详细图文与动画教程https://blog.csdn.net/beijinghorn/article/details/123350910 C#,入门教程(02)—— Visual Studio 2022开发环境搭建图文教程https://blog.csdn.net/beijinghorn/article/detail…...
使用 ChatGPT 生成和改进你的论文
文章目录 零、前言一、操作引导二、 生成段落或文章片段三、重写段落四、扩展内容五、生成大纲内容六、提高清晰度和精准度七、解决特定的写作挑战八、感受 零、前言 我是虚竹哥,目标是带十万人玩转ChatGPT。 ChatGPT 是一个非常有用的工具,可以帮助你…...
Unity2021.3.13崩溃的一种情况
如果出现如下的报错,可能是软件冲突的原因。自己的原因是使用f.lux这款软件似乎和Unity相互冲突,出现下面报错。 错误信息如上图...
通过ssh连接debian
使用方法 ssh usernameipaddress [inputpasswd]root用户默认无法由ssh连接, 可以通过修改配置 sudo vim /etc/ssh/sshd_config去掉PermitRootLogin前的‘#’,并修改为 PermitRootLogin yes 重启sshd服务 sudo systemctl restart sshd参考 https://linuxconfig.or…...
Transformer 与注意力机制原理说明与面试笔试题
文章大纲 注意力机制不同 种类的注意力机制Encoder Decoder 框架自注意力自注意力机制概述**基本原理****优点与应用****自注意力与多头注意力的关系****总结**多头注意力**多头注意力机制概述****基本原理****计算过程****多头注意力的优势****多头自注意力与多头注意力的区别…...
C语言之装甲车库车辆动态监控辅助记录系统
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 C语言之装甲车库车辆动态监控辅助记录系统 目录 一、前言 1.1 (一)…...
先进制造aps专题二十七 西门子opcenter aps架构分析
欧美的商业aps,主要就是sap apo,西门子opcenter aps,达索quintiq 从技术的层面,西门子aps是不如sap apo的,但是西门子aps是西门子数字化工厂产品的核心,有很多特色,所以分析 西门子aps主要分计划器和排产器两个部分 计…...
C++/QT环境下图像在窗口下等比例渲染绘制
本文中通过QT获取到opengl上下文环境,通过opengl3.0API将图像等比例渲染到QOpenGLWidget组件上面,相比cpu,渲染能力更强。 有以下四步骤。opengl基本知识点可参照之前文章OPENGL初学习 定义opengl渲染表面属性通过initializeGL接口初始化opengl上下文环境,然后加载并链接着…...
npm ERR! code CERT_HAS_EXPIRED
很不幸看到这个提示。 查了很多网上的解决方案,都提到一个解决方案: npm install -g npmlatest 靠就是执行install报的错,你要我通过install来解决这个问题。可见大多数人都是转发,从不自己试试。 第二个是看系统时间。这个基…...
[系统安全] 六十一.恶意软件分析 (12)LLM赋能Lark工具提取XLM代码的抽象语法树(初探)
您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…...
网络Web存储之LocalStorage
文章目录 LocalStorage介绍定义特点兼容性常用方法存值取值删除指定键值对清空所有键值对通过索引获取键名获取所有值判断是否含有某个键(key)拓展遍历得到key存储和读取复杂类型的数据 应用场景 LocalStorage介绍 定义 LocalStorage 是HTML5提供的一种…...
HTML知识点复习
1.src 和 href 的区别 src:表示对资源的引用, src指向的内容会嵌入到其标签里。 当浏览器解析到该元素时候,会暂停其他资源的下载和处理, 直到将该资源加载、编译、执行完毕,所以js脚本一般会放在页面底部 href&…...
【Leetcode 热题 100】45. 跳跃游戏 II
问题背景 给定一个长度为 n n n 的 0 0 0 索引 整数数组 n u m s nums nums。初始位置为 n u m s [ 0 ] nums[0] nums[0]。 每个元素 n u m s [ i ] nums[i] nums[i] 表示从索引 i i i 向前跳转的最大长度。换句话说,如果你在 n u m s [ i ] nums[i] nums[i…...
《offer 来了:Java 面试核心知识点精讲 -- 原理篇》
在 Java 面试的战场上,只知皮毛可不行,面试官们越来越看重对原理的理解。今天就给大家分享一本能让你在面试中脱颖而出的 “武林秘籍”——《offer 来了:Java 面试核心知识点精讲 -- 原理篇》。 本书详细介绍了Java架构师在BAT和移动互联网公司面试中常被问及的核心知识,内…...
Spring Boot中的自动配置原理是什么
Spring Boot 自动配置原理 Spring Boot 的自动配置机制基于 条件化配置,通过 EnableAutoConfiguration 注解来启用。自动配置的核心原理是 基于类路径和环境条件来推断所需要的配置,Spring Boot 会根据项目中引入的依赖和当前环境来自动装配相关的配置项…...
蓝桥杯3525 公因数匹配 | 枚举+数学
题目传送门 这个题目是一个数学题,由于只需要找到存在大于1的公因数的两数,所以比较方便的做法是统计每一个数的(质)因数。可以通过筛法统计质因数降低复杂度,但是直接枚举因数也可以满足要求。使用字典记录每个因数出…...
elasticsearch基础
分布式搜索引擎01 1. 初始elasticsearch 1.1. 了解ES 1.1.1. elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在github搜索代码: 在电…...
【JsonViewer】Json格式化
使用 Notepad 对 Json 数据进行格式化处理,使数据在结构上更清晰 1.在线安装 安装之后,重启应用,在插件菜单栏即可看到 JsonViewer 选项,在 Notepad 中放入 Json 数据,点击 Format Json 进行数据格式化 2.离线安装 …...
线性代数概述
矩阵与线性代数的关系 矩阵是线性代数的研究对象之一: 矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,是线性代数中的核心概念之一。矩阵的定义和性质构成了线性代数中矩阵理论的基础,而矩阵运算则简洁地表示和…...
计算机毕业设计Python+卷积神经网络租房推荐系统 租房大屏可视化 租房爬虫 hadoop spark 58同城租房爬虫 房源推荐系统
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Linux(DISK:raid5、LVM逻辑卷)
赛题拓扑: 题目: DISK 添加4块大小均为10G的虚拟磁盘,配置raid-5磁盘。创建LVM命名为/dev/vg01/lv01,大小为20G,格式化为ext4,挂在到本地目录/webdata,在分区内建立测试空文件disk.txt。[root@storagesrv ~]# yum install mdadm -y [root@storagesrv ~]# mdadm -C -n …...
RIME-CNN-LSTM-Attention多变量多步时序预测Matlab实现
SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测 目录 SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RIME-CNN-LSTM-Multihead-Attention霜冰算法…...
机器学习中的方差与偏差
文章目录 方差与偏差1.1 数据1.1.1 数据的分布1.1.2 拟合 1.2 方差与偏差1.2.1 泛化误差的拆分1.2.2 理解方差偏差 1.3 方差-偏差trade-off1.3.1 方差-偏差trade-off1.3.2 方差与偏差诊断 1.4 降低策略1.4.1 噪声1.4.2 高偏差1.4.3 高方差 方差与偏差 1.1 数据 1.1.1 数据的分…...
Ubuntu 22.04虚拟机安装配置调整(语言输入法字体共享剪切板等等
2025.01.07安装配置Ubuntu 22.04 记一下 快捷键 截屏 在设置-键盘-快捷键查看 跟搜到的不一样…不过shiftprint感觉也够用 安装 用的是VMware 参考:VMware中安装配置Ubuntu(2024最新版 超详细) 调教(? 语言 改了…...
[创业之路-255]:《华为数字化转型之道》-1-主要章节、核心内容、核心思想
目录 前言:数字化转型对于企业而言,是一种全方位的变革 一、主要章节 1、认知篇(第1~2章)- Why 2、方法篇(第3~5章)- How 3、实践篇(第6~10章)- 实践 4、平台篇(第…...
Java 接口安全指南
Java 接口安全指南 概述 在现代 Web 应用中,接口(API)是前后端交互的核心。然而,接口的安全性常常被忽视,导致数据泄露、未授权访问等安全问题。本文将详细介绍 Java 中如何保障接口安全,涵盖以下内容&am…...
Redis学习笔记1【数据类型和常用命令】
Redis学习笔记 基础语法 1.数据类型 String: 最基本的类型,可以存储任何数据,例如文本或数字。示例值为 hello world。Hash: 用于存储键值对,适合存储对象或结构体。示例值为 {"name": "Jack", "age": 21}。…...
Oracle graph 图数据库体验-安装篇
服务端安装 环境准备 安装数据库 DOCKER 安装23AI FREE ,参考: https://container-registry.oracle.com/ords/f?p113:4:111381387896144:::4:P4_REPOSITORY,AI_REPOSITORY,AI_REPOSITORY_NAME,P4_REPOSITORY_NAME,P4_EULA_ID,P4_BUSINESS_AREA_ID:1…...
Android 13 动态显示隐藏 HomeButton,RecentsButton
com.android.launcher3.taskbar.NavbarButtonsViewController.initButtons mEnabledValue状态<T> StatePropertyHolder(T target, IntPredicate enabledCondition,Property<T, Float> property, float enabledValue, float disabledValue) {mEnableCondition = ena…...
前端开发中的状态管理与网络请求封装
本文将对比 Vuex 和 Pinia 在状态管理中的使用,并介绍如何封装 Axios 进行网络请求。此外,我们还将讨论动态路由、404 页面跳转以及面包屑导航的实现。 话不多说,正文开始~~~ 一、状态管理:Vuex 与 Pinia 对比 1. Vuex Vuex 是…...
AI 大爆发时代,音视频未来路在何方?
AI 大模型突然大火了 回顾2024年,计算机领域最大的变革应该就是大模型进一步火爆了。回顾下大模型的发展历程: 萌芽期:(1950-2005) 1956年:计算机专家约翰麦卡锡首次提出“人工智能”概念,标志…...
30分钟内搭建一个全能轻量级springboot 3.4 + 脚手架 <5> 5分钟集成好caffeine并使用注解操作缓存
快速导航 <1> 5分钟快速创建一个springboot web项目 <2> 5分钟集成好最新版本的开源swagger ui,并使用ui操作调用接口 <3> 5分钟集成好druid并使用druid自带监控工具监控sql请求 <4> 5分钟集成好mybatisplus并使用mybatisplus generator自…...
STM32 FreeRTOS中断管理
目录 FreeRTOS的中断管理 1、STM32中断优先级管理 2、FreeRTOS任务优先级管理 3、寄存器和内存映射寄存器 4、BASEPRI寄存器 5、FreeRTOS与STM32中断管理结合使用 vPortRaiseBASEPRI vPortSetBASEPRI 6、FromISR后缀 7、在中断服务函数中调用FreeRTOS的API函数需注意 F…...
第10章:Python TDD优化货币类方法与引入工厂方法
写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…...
嵌入式硬件篇---基本组合逻辑电路
文章目录 前言基本逻辑门电路1.与门(AND Gate)2.或门(OR Gate)3.非门(NOT Gate)4.与非门(NAND Gate)5.或非门(NOR Gate)6.异或门(XOR Gate&#x…...
回归人文主义,探寻情感本质:从文艺复兴到AI时代,我的情感探索之旅
回归人文主义,探寻情感本质:从文艺复兴到AI时代,我们的情感探索之旅 多年来,我们的团队一直关注人工智能,尤其是AI在音乐领域的应用研究。随着技术的不断演进,我们也不断反思:在“算法、代码、…...
接上回--综合AIDemo测试
一,前言 上回外挂了知识库之后,我们需要使用知识库中的信息,让AI为我们实际处理业务上的需求。 这里我们让AI扮演公司的人事助手,帮我们处理员工请假的业务。 具体流程如下 感知用户需要请假提取用户请假信息获取用户数据库中…...
几何数据结构之四叉树与八叉树
几何数据结构之四叉树与八叉树 四叉树的定义四叉树深度的计算公式推导假设:计算过程:1. 划分空间:2. 节点容纳的最小距离:3. 解出深度:4. 考虑常数项: 总结: 八叉树 四叉树的定义 四叉树&#…...
postman请求参数化
postman界面介绍 一、使用环境变量(Environment Variables)进行参数化 1、在请求中使用环境变量 在请求的url、请求头(Headers)、请求体(Body)等部分都可以使用环境变量。 URL 部分示例 点击 Postman 界面右上角的 “眼睛” 图标(Environment Quick Look)打开环境管理…...
java实现word转html(支持docx及doc文件)
private final static String tempPath "C:\\Users\\xxx\\Desktop\\Word2Html\\src\\test\\";//图片及相关文件保存的路径public static void main(String argv[]) {try {JFileChooser fileChooser new JFileChooser();fileChooser.setDialogTitle("Select a …...
<电子幽灵>开发笔记:BAT基础笔记(一)
BAT脚本基础笔记(一) 介绍 费曼学习法最重要的部分,即把知识教给一个完全不懂的孩子——或者小白。 为了更好的自我学习,也为了让第一次接触某个知识范畴的同学快速入门,我会把我的学习笔记整理成电子幽灵系列。 提示:作为低代码…...
Leetcode::3427.变长子数组求和
给你一个长度为 n 的整数数组 nums 。对于 每个 下标 i(0 < i < n),定义对应的子数组 nums[start ... i](start max(0, i - nums[i]))。 返回为数组中每个下标定义的子数组中所有元素的总和。 子数组 是数组中…...
通过以太网加载linux内核、设备树、根文件系统方法(以stm32MP135为例)
0 硬件平台 正点原子stm32MP135开发板 1 通过以太网加载linux内核、设备树、根文件系统方法(以stm32MP135为例) 在产品正式发布前,为了调试方便,我们可以使用以太网加载linux内核、设备树、根文件系统以加快调试速度。本文以stm3…...
mac配置stable diffusion以及模型出图优化
1. 基础stable diffusion webui安装 使用的工程是stable-diffusion-webui,直接clone下来即可。 然后创建一个conda环境,python为3.9 激活conda环境后,执行./webui.sh即可。脚本会自动安装必要的包,然后启动网页。 默认有一个sd…...
LeetCode热题100(子串篇)
LeetCode热题100 说是子串,其实是子区间~ 560. 和为 K 的子数组 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 思路 思路: 和为k的子数组,看到…...
从密码学原理与应用新方向到移动身份认证与实践
相关学习资料放下面啦! 记得关注❤️~后续分享更多资料 通过百度网盘分享的文件:从密码学原理与应... 链接https://pan.baidu.com/s/1mHpHkvPuf8DUwReQkoYQlw?pwdGza7 提取码:Gza7 复制这段内容打开「百度网盘APP 即可获取」 记…...
【Flink系列】9. Flink容错机制
9. 容错机制 在Flink中,有一套完整的容错机制来保证故障后的恢复,其中最重要的就是检查点。 9.1 检查点(Checkpoint) 9.1.1 检查点的保存 1)周期性的触发保存 “随时存档”确实恢复起来方便,可是需要我…...
【物联网】ARM核介绍
文章目录 一、芯片产业链1. CPU核(1)ARM(2)MIPS(3)PowerPc(4)Intel(5)RISC-V 2. SOC芯片(1)主流厂家(2)产品解决方案 3. 产品 二、ARM核发展1. 不同架构的特点分析(1)VFP(2)Jazelle(3)Thumb(4)TrustZone(5)SIMD(6)NEON 三、ARM核(ARMv7)工作模式1. 权限级别(privilege level)2.…...