项目二技巧一

目录

nginx实现根据域名来访问不同的ip端口

配置Maven私服

快照版和发布版的区别

快照版本(Snapshot)

发布版本(Release)

 导入发布版的父工程

理清楚授权规则

一.首先浏览器发送/manager/**路径请求

 第二步:构造了TokenGatewayFilter方法,并把myConfig对象和当前过滤器对象作为参数传入

第三步:执行了filter方法并校验是否为放行path

第四步:执行AuthFilter的check方法,检验票据的合法性

第五步:执行AuthFilter的auth方法,进行鉴权

第六步:放行

完整的TokenGateWayFilter类

权限管家的api使用


nginx实现根据域名来访问不同的ip端口

nginx.conf配置文件的内容

在server_name中书写域名的名字,只要访问域名的根路径就会把请求反向代理到

proxy_pass http://127.0.0.1:10880 ip端口上

  1. proxy_set_header Host $host;:这行配置设置了代理请求的Host头部,将其设置为原始请求中的Host头部。

  2. proxy_set_header X-Real-IP $remote_addr;:这行配置设置了X-Real-IP头部,将其设置为客户端的IP地址。

  3. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:这行配置设置了X-Forwarded-For头部,用于添加客户端的IP地址到现有的X-Forwarded-For头部中,这对于跟踪客户端的真实IP地址在代理环境中非常有用。

http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {listen       80;server_name  git.sl-express.com;error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}location / {client_max_body_size  1024m;proxy_connect_timeout 300s;proxy_send_timeout 300s;proxy_read_timeout 300s;proxy_pass http://127.0.0.1:10880;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}server {listen       80;server_name  maven.sl-express.com;error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}location / {client_max_body_size  300m;proxy_connect_timeout 300s;proxy_send_timeout 300s;proxy_read_timeout 300s;proxy_pass http://127.0.0.1:8081;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}

这里由于nginx在linux虚拟机上运行,如果我们需要在主机上根据域名来访问虚拟机上的不同ip端口时,需要编写hosts文件的内容

hosts文件所在目录

C:\Windows\System32\drivers\etc

 编写以下内容

192.168.150.101 git.sl-express.com
192.168.150.101 maven.sl-express.com

 这样一来在主机访问git.sl-express.com域名时,就会访问192.168.150.101这个虚拟机的ip,nginx就会根据nginx.conf配置文件的内容反向代理到虚拟机本地的http://127.0.0.1:10880ip端口

配置Maven私服

 Maven 私服(也称为 Maven 仓库管理器)是一个本地的 Maven 仓库,用于存储和管理 Maven 项目依赖的远程仓库中的项目。配置 Maven 私服可以提高构建速度,减少网络延迟,并且可以对依赖进行更好的控制。

配置完成后,当你运行 Maven 构建时,Maven 会首先检查私服中是否有所需的依赖,如果没有,才会从远程仓库下载。

我们可以在私服的 Web 界面中管理依赖,包括上传、下载、删除等操作。

 配置私服

settings.xml文件

在<servers>标签中子标签<server>中配置私服的用户名和密码

<id>sl-releases</id>:这个标签定义了服务器的唯一标识符(ID),在 Maven 的其他配置中,可以通过这个 ID 引用这个服务器配置。例如,在 pom.xml 文件中配置部署或发布时,可以使用这个 ID 来指定要部署到的服务器。
<username>deployment</username>:这个标签定义了访问服务器时使用的用户名。
<password>deployment123</password>:这个标签定义了访问服务器时使用的密码。

<servers>
        <server>
            <id>sl-releases</id>
            <username>deployment</username>
            <password>deployment123</password>
        </server>
        <server>
            <id>sl-snapshots</id>
            <username>deployment</username>
            <password>deployment123</password>
        </server>
    </servers>

mirror镜像,如果私服里没有相关的依赖,就去远程仓库里拉取对应的依赖

 <!-- 使用阿里云maven镜像,排除私服资源库 -->
    <mirrors>
        <mirror>
            <id>mirror</id>
            <mirrorOf>central,jcenter,!sl-releases,!sl-snapshots</mirrorOf>
            <name>mirror</name>
            <url>https://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
    </mirrors> 

  1. <profiles> 标签

    • 这个标签是一个容器,用于包含多个 <profile> 配置。
  2. <profile> 配置

    • <id>sl</id>:这个标签定义了配置文件的唯一标识符(ID),在 Maven 命令中可以通过 -P 参数来激活这个 profile。
  3. <properties> 标签

    • 这个标签用于定义一些属性,这些属性可以在 Maven 构建过程中被引用。
  4. <altReleaseDeploymentRepository><altSnapshotDeploymentRepository> 属性

    • 这两个属性分别定义了发布版本和快照版本的部署仓库地址。格式为 <id>::default::<url>
    • <altReleaseDeploymentRepository>:指定了发布版本的部署仓库地址,这里使用的是 sl-releases 这个 ID,对应于 <servers> 配置中的一个服务器配置。
    • <altSnapshotDeploymentRepository>:指定了快照版本的部署仓库地址,这里使用的是 sl-snapshots 这个 ID,同样对应于 <servers> 配置中的一个服务器配置。
  5. <repositories> 标签

    • 这个标签用于定义项目依赖的远程仓库列表。
  6. 第一个 <repository> 配置

    • <id>sl-releases</id>:定义了仓库的唯一标识符(ID),与 <servers> 配置中的 ID 相对应。
    • <url>:指定了发布版本的远程仓库地址。
    • <releases>:指定了对于发布版本的配置,<enabled>true</enabled> 表示启用发布版本的下载。
    • <snapshots>:指定了对于快照版本的配置,<enabled>false</enabled> 表示禁用快照版本的下载。
  7. 第二个 <repository> 配置

    • <id>sl-snapshots</id>:定义了仓库的唯一标识符(ID),与 <servers> 配置中的 ID 相对应。
    • <url>:指定了快照版本的远程仓库地址。
    • <releases>:指定了对于发布版本的配置,<enabled>false</enabled> 表示禁用发布版本的下载。
    • <snapshots>:指定了对于快照版本的配置,<enabled>true</enabled> 表示启用快照版本的下载。

 

<?xml version="1.0" encoding="UTF-8"?>
<settingsxmlns="http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"><!-- 本地仓库 --><localRepository>F:\maven\repository</localRepository><!-- 配置私服中deploy的账号 --><servers><server><id>sl-releases</id><username>deployment</username><password>deployment123</password></server><server><id>sl-snapshots</id><username>deployment</username><password>deployment123</password></server></servers><!-- 使用阿里云maven镜像,排除私服资源库 --><mirrors><mirror><id>mirror</id><mirrorOf>central,jcenter,!sl-releases,!sl-snapshots</mirrorOf><name>mirror</name><url>https://maven.aliyun.com/nexus/content/groups/public</url></mirror></mirrors><profiles><profile><id>sl</id><!-- 配置项目deploy的地址 --><properties><altReleaseDeploymentRepository>sl-releases::default::http://maven.sl-express.com/nexus/content/repositories/releases/</altReleaseDeploymentRepository><altSnapshotDeploymentRepository>sl-snapshots::default::http://maven.sl-express.com/nexus/content/repositories/snapshots/</altSnapshotDeploymentRepository></properties><!-- 配置项目下载依赖的私服地址 --><repositories><repository><id>sl-releases</id><url>http://maven.sl-express.com/nexus/content/repositories/releases/</url><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots></repository><repository><id>sl-snapshots</id><url>http://maven.sl-express.com/nexus/content/repositories/snapshots/</url><releases><enabled>false</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories></profile></profiles><activeProfiles><!-- 激活配置 --><activeProfile>sl</activeProfile></activeProfiles>
</settings>

配置的内容

http://maven.sl-express.com/nexus/content/repositories/releases

快照版和发布版的区别

在 Maven 中,快照版本(Snapshot)和发布版本(Release)是两种不同类型的版本,它们在版本控制和依赖管理中有着不同的用途和行为:

快照版本(Snapshot)

  • 开发阶段:快照版本通常用于开发阶段,它们表示代码还在积极开发中,可能会频繁变化。
  • 版本号:快照版本的版本号通常会包含时间戳或构建编号,例如 1.0-SNAPSHOT 或 1.0.1-SNAPSHOT
  • 更新频率:快照版本可能会非常频繁地更新,因为它们通常与持续集成(CI)流程相关联。
  • 不稳定性:由于快照版本是开发中的版本,它们可能不稳定,不保证向后兼容性。
  • 依赖更新:在 Maven 项目中,如果依赖了一个快照版本,Maven 会定期检查更新,并在发现新版本时自动更新依赖。

发布版本(Release)

  • 稳定阶段:发布版本用于表示已经稳定的代码,它们是经过测试和验证的,可以用于生产环境。
  • 版本号:发布版本的版本号不包含时间戳或构建编号,例如 1.0 或 1.0.1
  • 更新频率:发布版本的更新频率通常较低,只有在有新功能或修复时才会发布新版本。
  • 稳定性和兼容性:发布版本需要保证稳定性和向后兼容性,以确保依赖它们的项目能够正常运行。
  • 依赖锁定:在 Maven 项目中,如果依赖了一个发布版本,Maven 会锁定该版本的依赖,不会自动更新到新版本,除非显式地更改了版本号。

 导入发布版的父工程

    <parent><groupId>com.sl-express</groupId><artifactId>sl-express-parent</artifactId><version>1.3</version></parent>

快照版的父工程

 

理清楚授权规则

以上是授权路线图,我们需要跟着这幅图来理清楚这个项目的授权规则

一.首先浏览器发送/manager/**路径请求

一般根据请求路径的不同来转发到不同的微服务是由gateway网关来实现的,所以我们去gateway网关的application.yml文件中查看路径断言规则

spring:cloud:nacos:username: nacospassword: nacosserver-addr: 192.168.150.101:8848discovery:namespace: ecae68ba-7b43-4473-a980-4ddeb6157bdcip: 192.168.150.1 #设置本地服务在nacos的地址与虚拟机ip的前三段相同,不然一部分微服务在本地跑,一部分在虚拟机跑#导致在nacos中的ip地址不同,以至于不同的微服务无法互相访问通config:namespace: ecae68ba-7b43-4473-a980-4ddeb6157bdcgateway:globalcors:cors-configurations:'[/**]':allowed-origin-patterns: "*"allowed-headers: "*"allow-credentials: trueallowed-methods:- GET- POST- DELETE- PUT- OPTIONdiscovery:locator:enabled: true #表明gateway开启服务注册和发现的功能,并且spring cloud gateway自动根据服务发现为每一个服务创建了一个router,这个router将以服务名开头的请求路径转发到对应的服务routes:- id: sl-express-ms-web-manageruri: lb://sl-express-ms-web-managerpredicates:- Path=/manager/**filters:- StripPrefix=1- ManagerToken- AddRequestHeader=X-Request-From, sl-express-gateway

可以发现以/manager开头的路径会被负载均衡到lb://sl-express-ms-web-manager这个微服务中

不过在转发请求之前,还有三个过滤器

StripPrefix=1表示会跳过请求中的第一段在进行转发,即原来的路径会去掉/manager

AddRequestHeader=X-Request-From, sl-express-gateway表示添加请求头,表示请求的来源是gateway转发的

ManagerToken是自定义的过滤器,我们需要去查看这个过滤器的实现

   filters:
            - StripPrefix=1
            - ManagerToken
            - AddRequestHeader=X-Request-From, sl-express-gateway

gateway过滤器默认会省略后面的GatewayFilterFactory后缀,即应该为 ManagerTokenGatewayFilterFactory类

找到这个类

内容:

 该类继承了Gateway的AbstractGatewayFilterFactory<Object>类,表示这是一个过滤器

AuthFilter是自定义的接口,规定了检验token,和鉴权的方法

public interface AuthFilter {/*** 校验token** @param token 请求中的token* @return token中携带的数据*/AuthUserInfoDTO check(String token);/*** 鉴权** @param token        请求中的token* @param authUserInfo token中携带的数据* @param path         当前请求的路径* @return 是否通过*/Boolean auth(String token, AuthUserInfoDTO authUserInfo, String path);}
/*** 后台管理员token拦截处理*/
@Component
public class ManagerTokenGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> implements AuthFilter {@Resourceprivate MyConfig myConfig;@Resourceprivate TokenCheckService tokenCheckService;//从配置文件中加载能访问后台管理的角色ids@Value("${role.manager}")private List<Long>managerRoleIds;@Overridepublic GatewayFilter apply(Object config) {return new TokenGatewayFilter(this.myConfig, this);}@Overridepublic AuthUserInfoDTO check(String token) {try {//校验tokenreturn tokenCheckService.parserToken(token);} catch (AuthSdkException e) {// 校验失败}return null;}@Overridepublic Boolean auth(String token, AuthUserInfoDTO authUserInfoDTO, String path) {//获取AuthTemplate对象AuthTemplate authTemplate = AuthTemplateFactory.get(token);//查询该用户拥有的的角色idList<Long> roleIds = authTemplate.opsForRole().findRoleByUserId(authUserInfoDTO.getUserId()).getData();// 和配置的访问角色 取交集Collection<Long> intersection = CollUtil.intersection(roleIds, managerRoleIds);// 判断是否有交集即可判断出是否有权限return CollUtil.isNotEmpty(intersection);}
}

 第二步:构造了TokenGatewayFilter方法,并把myConfig对象和当前过滤器对象作为参数传入

我们来看一下MyConfig类是什么

可以看到与配置文件中的sl属性继续映射

@Data
@Component
@Configuration
@ConfigurationProperties(prefix = "sl")
public class MyConfig {private String[] noAuthPaths;}

这个属性规定了不需要权限就可以直接访问的所有接口 

sl:noAuthPaths:- /courier/login/account- /courier/swagger-ui.html- /courier/webjars/- /courier/swagger-resources- /courier/v2/api-docs- /courier/doc.html- /customer/user/login- /customer/swagger-ui.html- /customer/webjars/- /customer/swagger-resources- /customer/v2/api-docs- /customer/doc.html- /driver/login/account- /driver/swagger-ui.html- /driver/webjars/- /driver/swagger-resources- /driver/v2/api-docs- /driver/doc.html- /manager/login- /manager/webjars/- /manager/swagger-resources- /manager/v2/api-docs- /manager/doc.html- /manager/captcha
@Slf4j
public class TokenGatewayFilter implements GatewayFilter, Ordered {private MyConfig myConfig;private AuthFilter authFilter;public TokenGatewayFilter(MyConfig myConfig, AuthFilter authFilter) {this.myConfig = myConfig;this.authFilter = authFilter;}
}

第三步:执行了filter方法并校验是否为放行path

如果是不需要授权的路径就直接放行,并从 Authorization请求头中获取token票据信息,如果票据信息为空,就禁止访问

票据信息是登录认证时,后端给前端发布的一个票据,包含了用户用户的基本信息和用户拥有的角色id,因为我们设置了获取验证码和登录是不需要验证鉴权的接口,所以可以直接访问然后获取该用户对应的票据信息

 - /manager/login
    - /manager/captcha

    @Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String path = exchange.getRequest().getPath().toString();if (StrUtil.startWithAny(path, myConfig.getNoAuthPaths())) {//无需校验,直接放行return chain.filter(exchange);}//获取header的参数String token = exchange.getRequest().getHeaders().getFirst("Authorization");if (StrUtil.isEmpty(token)) {//没有权限exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}
}

第四步:执行AuthFilter的check方法,检验票据的合法性

 //校验tokenAuthUserInfoDTO authUserInfoDTO = null;try{ //捕获token校验异常authUserInfoDTO = this.authFilter.check(token);}catch (Exception e){log.error("权限校验失败,e:",e);}if (ObjectUtil.isEmpty(authUserInfoDTO)) {//token失效 或 伪造exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}

会去调用AuthFilter的实现类ManagerTokenGatewayFilterFactory的check方法,因为已经把这个类的实例通过TokenGateWayFilter的构造方法传入,因此可以进行回调。

我们来看一下ManagerTokenGatewayFilterFactory的check方法

不合法就返回null

    @Overridepublic AuthUserInfoDTO check(String token) {try {//校验tokenreturn tokenCheckService.parserToken(token);} catch (AuthSdkException e) {// 校验失败}return null;}

第五步:执行AuthFilter的auth方法,进行鉴权

 authUserInfoDTO是解析token时解析出来的用户的基本信息

        //鉴权Boolean result = false;try { //捕获鉴权异常result = this.authFilter.auth(token, authUserInfoDTO, path);}catch (Exception e){log.error("鉴权失败,e:",e);}if (!result) {//没有权限exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);return exchange.getResponse().setComplete();}

回调的ManagerTokenGatewayFilterFactory的auth方法

配置的可以访问的角色id是可以访问/manger开头接口的角色id,如果没有这些角色id就拒绝访问

这个配置文件在nacos配置中心中 

   //从配置文件中加载能访问后台管理的角色ids@Value("${role.manager}")private List<Long>managerRoleIds;
#角色id
role.manager = 986227712144197857,989278284569131905,996045142395786081,996045927523359809
    @Overridepublic Boolean auth(String token, AuthUserInfoDTO authUserInfoDTO, String path) {//获取AuthTemplate对象AuthTemplate authTemplate = AuthTemplateFactory.get(token);//查询该用户拥有的的角色idList<Long> roleIds = authTemplate.opsForRole().findRoleByUserId(authUserInfoDTO.getUserId()).getData();// 和配置的访问角色 取交集Collection<Long> intersection = CollUtil.intersection(roleIds, managerRoleIds);// 判断是否有交集即可判断出是否有权限return CollUtil.isNotEmpty(intersection);}

所以,如果该用户可以访问就返回true,反之

第六步:放行

并添加了两个请求头,把用户的基本信息序列化成json格式,并把票据加上token请求头中 

    //增加参数exchange.getRequest().mutate().header("userInfo", JSONUtil.toJsonStr(authUserInfoDTO));exchange.getRequest().mutate().header("token", token);//校验通过放行return chain.filter(exchange);

完整的TokenGateWayFilter类

@Slf4j
public class TokenGatewayFilter implements GatewayFilter, Ordered {private MyConfig myConfig;private AuthFilter authFilter;public TokenGatewayFilter(MyConfig myConfig, AuthFilter authFilter) {this.myConfig = myConfig;this.authFilter = authFilter;}@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String path = exchange.getRequest().getPath().toString();if (StrUtil.startWithAny(path, myConfig.getNoAuthPaths())) {//无需校验,直接放行return chain.filter(exchange);}//获取header的参数String token = exchange.getRequest().getHeaders().getFirst("Authorization");if (StrUtil.isEmpty(token)) {//没有权限exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}//校验tokenAuthUserInfoDTO authUserInfoDTO = null;try{ //捕获token校验异常authUserInfoDTO = this.authFilter.check(token);}catch (Exception e){log.error("权限校验失败,e:",e);}if (ObjectUtil.isEmpty(authUserInfoDTO)) {//token失效 或 伪造exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}//鉴权Boolean result = false;try { //捕获鉴权异常result = this.authFilter.auth(token, authUserInfoDTO, path);}catch (Exception e){log.error("鉴权失败,e:",e);}if (!result) {//没有权限exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);return exchange.getResponse().setComplete();}//增加参数exchange.getRequest().mutate().header("userInfo", JSONUtil.toJsonStr(authUserInfoDTO));exchange.getRequest().mutate().header("token", token);//校验通过放行return chain.filter(exchange);}@Overridepublic int getOrder() {return Integer.MIN_VALUE;}
}

权限管家的api使用

依赖

    <dependency><groupId>com.itheima.em.auth</groupId><artifactId>itcast-auth-spring-boot-starter</artifactId></dependency>
@SpringBootTest(properties = "spring.main.web-application-type = reactive")
public class AuthTemplateTest {@Resourceprivate AuthTemplate authTemplate;@Resourceprivate TokenCheckService tokenCheckService;@Autowiredprivate AuthorityProperties authorityProperties;@Testpublic void testLogin() {//登录,生成tokenResult<LoginDTO> result = this.authTemplate.opsForLogin().token("hhh", "123456");//得到tokenString token = result.getData().getToken().getToken();System.out.println("token为:" + token);//得到用户的消息UserDTO user = result.getData().getUser();System.out.println("user信息:" + user);//查询这个用户拥有的角色iddResult<List<Long>> resultRole = AuthTemplateFactory.get(token).opsForRole().findRoleByUserId(user.getId());System.out.println(resultRole);}@Testpublic void checkToken() {//上面方法中生成的tokenString token = "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxMzEyNDQ2OTcwNjUyMDAyODQ5IiwiYWNjb3VudCI6ImhoaCIsIm5hbWUiOiLkvZUiLCJvcmdpZCI6MTAyNTEwMzE3Njk0NjM5NTU4NSwic3RhdGlvbmlkIjoxMDI0NzA1NDg5NDM2NDk0NzIxLCJhZG1pbmlzdHJhdG9yIjpmYWxzZSwiZXhwIjoxNzMyOTk2NzI5fQ.lkOPgWXwOJ6OUuBiw4ctOyU7gl9sypxsYn2Sca4waHOFfxkQcVtSFzcKt-aieBS3Dn-vWfKx2YVQXkmggXOYIg";AuthUserInfoDTO authUserInfo = this.tokenCheckService.parserToken(token);System.out.println(authUserInfo);System.out.println(JSONUtil.toJsonStr(authUserInfo));}
}

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

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

相关文章

简单获取json预览

data: JSON 数据。 collapsedNodeLength: 对象或数组的长度超过此阈值时会折叠 deep: json路径深度超过此值时会折叠 showLineNumber: 显示左侧行号 showIcon: 显示图标。 virtual: 使用虚拟滚动 height: 使用虚拟滚动时列表的高度 itemHeight: 使用虚拟滚动时节点的高…

使用zabbix监控k8s

一、 参考文献 小阿轩yx-案例&#xff1a;Zabbix监控kubernetes云原生环境 手把手教你实现zabbix对Kubernetes的监控 二、部署经验 关于zabbix监控k8s&#xff0c;总体来说是分为两块内容&#xff0c;一是在k8s集群部署zabbix-agent和zabbix- proxy。二是在zabbix进行配置。…

第三方Express 路由和路由中间件

文章目录 1、Express 应用使用回调函数的参数&#xff1a; request 和 response 对象来处理请求和响应的数据。2、Express路由1.路由方法2.路由路径3.路由处理程序 3. 模块化路由4. Express中间件1.中间件简介2.中间件分类3.自定义中间件 1、Express 应用使用回调函数的参数&am…

港科夜闻 |香港科大推出 InvestLM生成式人工智能平台,支持金融中小企应用AI技术潜力...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大推出 InvestLM生成式人工智能平台&#xff0c;支持金融中小企应用AI技术潜力。香港科大商学院继去年研究团队成功开发本港首个专为金融界而设、应用于生成式人工智能(生成式AI)的开源大语言模型InvestLM后&#…

[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker pull线上镜像方式构建编译环境

T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求&#xff1a; 硬件&#xff1a; 设备容量备注硬盘>500G多版本系统测试&#xff0c;必须固态&#xff0c;否则编译卡死硬盘>300G单系统…

Git 快速入门:全面了解与安装步骤

Git 快速入门&#xff1a;全面了解与安装步骤 一、关于Git 1.1 简介 Git 是一个开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 于 2005 年创建&#xff0c;最初是为了更好地管理 Linux 内核开发而设计。 Git用于跟踪计算机文件的变化&#xff0c;特别是源代码文件…

基于Java Springboot奶茶点餐微信小程序

一、作品包含 源码数据库万字文档全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA,微信开发者工具 数据…

vulnhub靶场【哈利波特】三部曲之Fawkes

前言 这次的靶机与前面不同&#xff0c;这里涉及到缓冲区溢出等 这个靶机也让我知道薄弱点了&#xff0c;缓冲溢出这方面之前接触少&#xff0c;所以刚拿到这个靶机打开后&#xff0c;人蒙了&#xff0c;在网上查阅好多资料&#xff0c;也只是浅学一下&#xff0c;这里主要也是…

神经网络中常见的激活函数Sigmoid、Tanh和ReLU

激活函数在神经网络中起着至关重要的作用&#xff0c;它们决定了神经元的输出是否应该被激活以及如何非线性地转换输入信号。不同的激活函数适用于不同的场景&#xff0c;选择合适的激活函数可以显著影响模型的性能和训练效率。以下是三种常见的激活函数&#xff1a;Sigmoid、T…

基于Java Springboot蛋糕订购小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

<项目代码>YOLOv8 红绿灯识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

ProtonBase 教育行业解决方案

01/方案概述 当前&#xff0c;大数据、云计算等技术正加速教育行业的数字化转型&#xff0c;教学模式从线下转向线上&#xff0c;传统教育企业向具有互联网性质的新型教育企业转变。在此背景下&#xff0c;教育企业亟需探索多源数据的融合扩展&#xff0c;以应对复杂的业务场景…

Mybatis:CRUD数据操作之删除一行数据

Mybatis基础环境准备请看&#xff1a;Mybatis基础环境准备 本篇讲解Mybati数据CRUD数据操作之单条删除数据 当用户点击了该按钮&#xff0c;就会将改行数据删除掉。那我们就需要思考&#xff0c;这种删除是根据什么进行删除呢&#xff1f;是通过主键id删除&#xff0c;因为id是…

力扣1382:将二叉搜索树便平衡

给你一棵二叉搜索树&#xff0c;请你返回一棵 平衡后 的二叉搜索树&#xff0c;新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法&#xff0c;请你返回任意一种。 如果一棵二叉搜索树中&#xff0c;每个节点的两棵子树高度差不超过 1 &#xff0c;我们就称这棵二…

架构01-演进中的架构

零、文章目录 架构01-演进中的架构 1、原始分布式时代&#xff1a;Unix设计哲学下的服务探索 &#xff08;1&#xff09;背景 时间&#xff1a;20世纪70年代末到80年代初计算机硬件&#xff1a;16位寻址能力、不足5MHz时钟频率的处理器、128KB左右的内存转型&#xff1a;从…

MySQL —— MySQL 程序

目录 前言 一、MySQL 程序简介 二、mysqld -- MySQL 服务器 三、mysql -- MySQL 客户端 1. mysql 客户端简介 2. mysql 客户端选项 &#xff08;1&#xff09;指定选项的方式 &#xff08;2&#xff09;mysql 客户端命令常用选项 &#xff08;3&#xff09;在命令行中使…

GoogleTest做单元测试

目录 环境准备GoogleTest 环境准备 git clone https://github.com/google/googletest.git说cmkae版本过低了&#xff0c;解决方法 进到googletest中 cmake CMakeLists.txt make sudo make installls /usr/local/lib存在以下文件说明安装成功 中间出了个问题就是&#xff0c;…

Flink四大基石之CheckPoint

1、State Vs Checkpoint State:状态,是Flink中某一个Operator在某一个时刻的状态,如maxBy/sum,注意State存的是历史数据/状态,存在内存中。 Checkpoint:快照点, 是Flink中所有有状态的Operator在某一个时刻的State快照信息/存档信息。 一句话概括: Checkpoint就是State的快照…

基于TensorFlow的手写体数字识别训练与测试

需求&#xff1a; 选择一个最简单的细分方向&#xff0c;初步了解AI图像识别的训练、测试过程TensorFlow、PyTorch、c&#xff0c;三种代码方案&#xff0c;先从TensorFlow入手探讨最基本问题的优化问题 总结&#xff1a; 基于TensorFlow的python代码库自带了mnist 训练数据…

YOLO系列论文综述(从YOLOv1到YOLOv11)【第11篇:YOLO变体——YOLO+Transformers、DAMO、PP、NAS】

YOLO变体 1 DAMO-YOLO2 PP-YOLO, PP-YOLOv2, and PP-YOLOE2.1 PP-YOLO数据增强和预处理2.2 PP-YOLOv22.3 PP-YOLOE 3 YOLO-NAS4 YOLO Transformers5 YOLOv1-v8及变体网络结构总结 YOLO系列博文&#xff1a; 【第1篇&#xff1a;概述物体检测算法发展史、YOLO应用领域、评价指标…