3.1-媒资管理之需求分析+搭建Nacos

文章目录

  • 媒资管理模块
    • 1 模块需求分析
      • 1.1 模块介绍
      • 1.2 业务流程
        • 1.2.1 上传图片
        • 1.2.2 上传视频
        • 1.2.3 处理视频
        • 1.2.4 审核媒资
      • 2.2 搭建Nacos
        • 2.2.1 服务发现中心
        • 2.2.2 配置中心
          • 2.2.2.1 配置三要素
          • 2.2.2.3配置content-api
        • 2.2.3 公用配置
        • 2.2.4 配置优先级
        • 2.2.5 导入配置文件
        • 2.2.6 作业
      • 2.3 搭建Gateway
      • 2.4 搭建媒资工程

媒资管理模块

1 模块需求分析

1.1 模块介绍

媒资管理系统是每个在线教育平台所必须具备的,查阅百度百科对它的定义如下:
媒体资源管理(Media Asset Management,MAM)系统是建立在多媒体、网络、数据库和数字存储等先进技术基础上的一个对各种媒体及内容(如视/音频资料、文本文件、图表等)进行数字化存储、管理以及应用的总体解决方案,包括数字媒体的采集、编目、管理、传输和编码转换等所有环节。其主要是满足媒体资源拥有者收集、保存、查找、编辑、发布各种信息的要求,为媒体资源的使用者提供访问内容的便捷方法,实现对媒体资源的高效管理,大幅度提高媒体资源的价值。
每个教学机构都可以在媒资系统管理自己的教学资源,包括:视频、教案等文件。
目前媒资管理的主要管理对象是视频、图片、文档等,包括:媒资文件的查询、文件上传、视频处理等。
媒资查询:教学机构查询自己所拥有的媒资信息。
文件上传:包括上传图片、上传文档、上传视频。
视频处理:视频上传成功,系统自动对视频进行编码处理。
文件删除:教学机构删除自己上传的媒资文件。
在这里插入图片描述

1.2 业务流程

1.2.1 上传图片

教学机构人员在课程信息编辑页面上传课程图片,课程图片统一记录在媒资管理系统。
下图是上传图片的界面:
在这里插入图片描述

1.2.2 上传视频

1、教学机构人员进入媒资管理列表查询自己上传的媒资文件。
点击“媒资管理”
在这里插入图片描述
进入媒资管理列表页面查询本机构上传的媒资文件。
在这里插入图片描述

2、教育机构用户在"媒资管理"页面中点击 “上传视频” 按钮。
在这里插入图片描述
点击“上传视频”打开上传页面

3、选择要上传的文件,自动执行文件上传,视频上传成功会自动处理。
在这里插入图片描述

1.2.3 处理视频

对需要转码处理的视频系统会自动对其处理,处理后生成视频的URL。
处理视频没有用户界面,完全是后台自动执行。

1.2.4 审核媒资

审核媒资包括程序自动审核和人工审核,程序可以通过鉴黄接口(https://www.aliyun.com/product/lvwang?spm=5176.19720258.J_3207526240.51.e93976f4rSq796)审核视频,对有异议的视频由人工进行审核。
1.运营用户登入运营平台并进入媒资管理页面,查找待审核媒资
在这里插入图片描述
2.点击列表中媒资名称链接,可预览该媒资,若是视频,则播放视频。
在这里插入图片描述

3.点击列表中某媒资后的"审核" 按钮,既完成媒资的审批过程。
在这里插入图片描述

点击“审核”,选择审核结果,输入审核意见。
在这里插入图片描述

1.2.5 绑定媒资
课程计划创建好后需要绑定媒资文件,比如:如果课程计划绑定了视频文件,进入课程在线学习界面后点课程计划名称则在线播放视频。如下图:

在这里插入图片描述
如何将课程计划绑定媒资呢?
1.教育机构用户进入课程管理页面并编辑某一个课程,在"课程大纲"标签页的某一小节后可点击”添加视频“。
在这里插入图片描述

2.弹出添加视频对话框,可通过视频关键字搜索已审核通过的视频媒资。
在这里插入图片描述

3.选择视频媒资,点击提交按钮,完成课程计划绑定媒资流程。

在这里插入图片描述

课程计划关联视频后如下图:
在这里插入图片描述

1.3 数据模型
本模块媒资文件相关的数据表如下:
在这里插入图片描述

媒资文件表:存储文件信息,包括图片、视频、文档等。
media_process: 待处理视频表。
media_process_history: 视频处理历史表,记录已经处理成功的视频信息。
媒资文件与课程计划绑定关系表如下:
在这里插入图片描述

2 搭建模块环境
2.1 架构的问题分析
当前要开发的是媒资管理服务,目前为止共三个微服务:内容管理、系统管理、媒资管理,如下图:
在这里插入图片描述
后期还会添加更多的微服务,当前这种由前端直接请求微服务的方式存在弊端:
如果在前端对每个请求地址都配置绝对路径,非常不利于系统维护,比如下边代码中请求系统管理服务的地址使用的是localhost
在这里插入图片描述

当系统上线后这里需要改成公网的域名,如果这种地址非常多则非常麻烦。
基于这个问题可以采用网关来解决,如下图:
在这里插入图片描述

这样在前端的代码中只需要指定每个接口的相对路径,如下所示:
在这里插入图片描述

在前端代码的一个固定的地方在接口地址前统一加网关的地址,每个请求统一到网关,由网关将请求转发到具体的微服务。
为什么所有的请求先到网关呢?
有了网关就可以对请求进行路由,路由到具体的微服务,减少外界对接微服务的成本,比如:400电话,路由的试可以根据请求路径进行路由、根据host地址进行路由等, 当微服务有多个实例时可以通过负载均衡算法进行路由,如下:
在这里插入图片描述

另外,网关还可以实现权限控制、限流等功能。
项目采用Spring Cloud Gateway作为网关,网关在请求路由时需要知道每个微服务实例的地址,项目使用Nacos作用服务发现中心和配置中心,整体的架构图如下:
在这里插入图片描述

流程如下:
1、微服务启动,将自己注册到Nacos,Nacos记录了各微服务实例的地址。
2、网关从Nacos读取服务列表,包括服务名称、服务地址等。
3、请求到达网关,网关将请求路由到具体的微服务。
要使用网关首先搭建Nacos,Nacos有两个作用:
1、服务发现中心。
微服务将自身注册至Nacos,网关从Nacos获取微服务列表。
2、配置中心。
微服务众多,它们的配置信息也非常复杂,为了提供系统的可维护性,微服务的配置信息统一在Nacos配置。

2.2 搭建Nacos

2.2.1 服务发现中心

Spring Cloud :一套规范
Spring Cloud alibaba: nacos服务注册中心,配置中心
根据上节讲解的网关的架构图,要使用网关首先搭建Nacos。
首先搭建Nacos服务发现中心。
在搭建Nacos服务发现中心之前需要搞清楚两个概念:namespace和group
namespace:用于区分环境、比如:开发环境、测试环境、生产环境。
group:用于区分项目,比如:xuecheng-plus项目、xuecheng2.0项目
首先在nacos配置namespace:
登录Centos,启动Naocs,使用sh /data/soft/restart.sh将自动启动Nacos。
访问:http://192.168.101.65:8848/nacos/
账号密码:nacos/nacos
登录成功,点击左侧菜单“命名空间”进入命名空间管理界面,

点击“新建命名空间”,填写命名空间的相关信息。如下图:
在这里插入图片描述

使用相同的方法再创建“测试环境”、"生产环境"的命名空间。
在这里插入图片描述
在这里插入图片描述

创建成功,如下图:
在这里插入图片描述

在教学中可以创建具体班级的命名空间,假如创建1010班级的命名空间,如下:
在这里插入图片描述

注意:如果使用dev1010命名空间,在下边的配置中对namespace配置为dev1010。

首先完成各服务注册到Naocs,下边将内容管理服务注册到nacos中。

  1. 在xuecheng-plus-parent中添加依赖管理
XML
<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>

2)在内容管理模块的接口工程、系统管理模块的接口工程中添加如下依赖

XML
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

3)配置nacos的地址
在系统管理的接口工程的配置文件中配置如下信息:

YAML
#微服务配置
spring:application:name: system-servicecloud:nacos:server-addr: 192.168.101.65:8848discovery:namespace: devgroup: xuecheng-plus-project

在内容管理的接口工程的配置文件中配置如下信息:

	YAMLspring:application:name: content-apicloud:nacos:server-addr: 192.168.101.65:8848discovery:namespace: devgroup: xuecheng-plus-project

4)重启内容管理服务、系统管理服务。
待微服务启动成功,进入Nacos服务查看服务列表
在这里插入图片描述

在 “开发环境” 命名空间下有两个服务这说明内容管理微服务和系统管理微服务在Nacos注册成功。
点击其它一个微服务的“详情”
在这里插入图片描述

通过上图可以查看微服务实例的地址。

2.2.2 配置中心
2.2.2.1 配置三要素

搭建完成Nacos服务发现中心,下边搭建Nacos为配置中心,其目的就是通过Nacos去管理项目的所有配置。
先将项目中的配置文件分分类:
1、每个项目特有的配置
是指该配置只在有些项目中需要配置,或者该配置在每个项目中配置的值不同。
比如:spring.application.name每个项目都需要配置但值不一样,以及有些项目需要连接数据库而有些项目不需要,有些项目需要配置消息队列而有些项目不需要。
2、项目所公用的配置
是指在若干项目中配置内容相同的配置。比如:redis的配置,很多项目用的同一套redis服务所以配置也一样。
另外还需要知道nacos如何去定位一个具体的配置文件,即:namespace、group、dataid.
1、通过namespace、group找到具体的环境和具体的项目。
2、通过dataid找到具体的配置文件,dataid有三部分组成
比如:content-service-dev.yaml配置文件 由(content-service)-(dev). (yaml)三部分组成
content-service:第一部分,它是在application.yaml中配置的应用名,即spring.application.name的值。
dev:第二部分,它是环境名,通过spring.profiles.active指定,
Yaml: 第 所以,如果我们要配置content-service工程的配置文件:
在开发环境中配置content-service-dev.yaml
在测试环境中配置content-service-test.yaml
在生产环境中配置content-service-prod.yaml
我们启动项目中传入spring.profiles.active的参数决定引用哪个环境的配置文件,例如:传入spring.profiles.active=dev表示使用dev环境的配置文件即content-service-dev.yaml。

2.2.2.2 配置content-service
下边以开发环境为例对content-service工程的配置文件进行配置,进入nacos,进入开发环境。
在这里插入图片描述

点击加号,添加一个配置
在这里插入图片描述

输入data id、group以及配置文件内容。
为什么没在nacos中配置下边的内容 ?
YAML

spring:application:name: content-service

因为刚才说了dataid第一部分就是spring.application.name,nacos 客户端要根据此值确定配置文件 名称,所以spring.application.name不在nacos中配置,而是要在工程的本地进行配置。
在content-service工程的test/resources 中添加bootstrap.yaml,内容如下:
YAML

spring:application:name: content-servicecloud:nacos:server-addr: 192.168.101.65:8848discovery:namespace: devgroup: xuecheng-plus-projectconfig:namespace: devgroup: xuecheng-plus-projectfile-extension: yamlrefresh-enabled: true#profiles默认为devprofiles:active: dev

在内容管理模块的接口工程和service工程配置依赖:
XML

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

配置完成,运行content-service工程 的单元测试文件,能否正常测试,跟踪单元测试方法可以正常读取数据库的数据,说明从nacos读取配置信息正常。
通过运行观察控制台打印出下边的信息,NacosRestTemplate.java通过Post方式与nacos服务端交互读取配置信息。

Plain Text
[NacosRestTemplate.java:476] - HTTP method: POST, url: http://192.168.101.65:8848/nacos/v1/cs/configs/listener, body: {Listening-Configs=content-service.yaml?xuecheng-plus-project??dev?content-service-dev.yaml?xuecheng-plus-project?88459b1483b8381eccc2ef462bd59182?dev?content-service?xuecheng-plus-project??dev?, tenant=dev}
2.2.2.3配置content-api

以相同的方法配置content-api工程的配置文件,在nacos中的开发环境中配置content-api-dev.yaml,内容如下:

server:servlet:context-path: /contentport: 63040# 日志文件配置路径
logging:config: classpath:log4j2-dev.xm
# swagger 文档配置
swagger:title: "学成在线内容管理系统"description: "内容系统管理系统对课程相关信息进行业务管理数据"base-package: com.xuecheng.contentenabled: trueversion: 1.0.0

在content-api工程 的本地配置bootstrap.yaml,内容如下:
YAML

#微服务配置
spring:application:name: content-apicloud:nacos:server-addr: 192.168.101.65:8848discovery:namespace: devgroup: xuecheng-plus-projectconfig:namespace: devgroup: xuecheng-plus-projectfile-extension: yamlrefresh-enabled: trueextension-configs:- data-id: content-service-${spring.profiles.active}.yamlgroup: xuecheng-plus-projectrefresh: trueprofiles:active: dev

注意:因为api接口工程依赖了service工程 的jar,所以这里使用extension-configs扩展配置文件 的方式引用service工程所用到的配置文件。

extension-configs:- data-id: content-service-${spring.profiles.active}.yamlgroup: xuecheng-plus-projectrefresh: true

如果添加多个扩展文件,继续在下添加即可,如下:

extension-configs:- data-id: content-service-${spring.profiles.active}.yamlgroup: xuecheng-plus-projectrefresh: true- data-id: 填写文件 dataidgroup: xuecheng-plus-projectrefresh: true        

启动content-api工程,查询控制台是否打印出了请求nacos的日志,如下:
Bash
[NacosRestTemplate.java:476] - HTTP method: POST, url: http://192.168.101.65:8848/nacos/v1/cs/configs/listener
并使用Httpclient测试课程查询接口是否可以正常查询。

2.2.3 公用配置

还有一个优化的点是如何在nacos中配置项目的公用配置呢?
nacos提供了shared-configs可以引入公用配置。
在content-api中配置了swagger,所有的接口工程 都需要配置swagger,这里就可以将swagger的配置定义为一个公用配置,哪个项目用引入即可。
单独在xuecheng-plus-common分组下创建xuecheng-plus的公用配置,进入nacos的开发环境,添加swagger-dev.yaml公用配置
在这里插入图片描述

删除接口工程中对swagger的配置。
项目使用shared-configs可以引入公用配置。在接口工程的本地配置文件 中引入公用配置,如下:

YAML
spring:application:name: content-apicloud:nacos:server-addr: 192.168.101.65:8848discovery:namespace: devgroup: xuecheng-plus-projectconfig:namespace: devgroup: xuecheng-plus-projectfile-extension: yamlrefresh-enabled: trueextension-configs:- data-id: content-service-${spring.profiles.active}.yamlgroup: xuecheng-plus-projectrefresh: trueshared-configs:- data-id: swagger-${spring.profiles.active}.yamlgroup: xuecheng-plus-commonrefresh: true- data-id: logging-${spring.profiles.active}.yamlgroup: xuecheng-plus-commonrefresh: trueprofiles:active: dev

再以相同 的方法配置日志的公用配置。
在这里插入图片描述

在接口工程和业务工程,引入logging-dev.yaml公用配置文件
在这里插入图片描述

配置完成,重启content-api接口工程,访问http://localhost:63040/content/swagger-ui.html 查看swagger接口文档是否可以正常访问,查看控制台log4j2日志输出是否正常。

2.2.4 配置优先级

到目前为止已将所有微服务的配置统一在nacos进行配置,用到的配置文件有本地的配置文件 bootstrap.yaml和nacos上的配置文件,SpringBoot读取配置文件 的顺序如下:
在这里插入图片描述

引入配置文件的形式有:
1、以项目应用名方式引入
2、以扩展配置文件方式引入
3、以共享配置文件 方式引入
4、本地配置文件
各配置文件 的优先级:项目应用名配置文件 > 扩展配置文件 > 共享配置文件 > 本地配置文件。

有时候我们在测试程序时直接在本地加一个配置进行测试,比如下边的例子:
我们想启动两个内容管理微服务,此时需要在本地指定不同的端口,通过VM Options参数,在IDEA配置启动参数
在这里插入图片描述

通过-D指定参数名和参数值,参数名即在bootstrap.yml中配置的server.port。
在这里插入图片描述

启动ContentApplication2,发现端口仍然是63040,这说明本地的配置没有生效。
这时我们想让本地最优先,可以在nacos配置文件 中配置如下即可实现:
YAML

#配置本地优先
spring:cloud:config:override-none: true

再次启动ContentApplication2,端口为63041。

2.2.5 导入配置文件

课程资料中提供了系统用的所有配置文件nacos_config_export.zip,下边将nacos_config_export.zip导入nacos。
进入具体的命名空间,点击“导入配置”
在这里插入图片描述

打开导入窗口
在这里插入图片描述

相同的配置选择覆盖配置。

点击“上传文件”选择资料中的nacos_config_export.zip开始导入。

2.2.6 作业

按照上边的方法 自行将系统管理服务的配置信息在nacos上进行配置。

2.3 搭建Gateway

本项目使用Spring Cloud Gateway作为网关,下边创建网关工程。
新建一个网关工程。
在这里插入图片描述

工程结构
在这里插入图片描述

添加依赖:
XML

<parent><groupId>com.xuecheng</groupId><artifactId>xuecheng-plus-parent</artifactId><version>0.0.1-SNAPSHOT</version><relativePath>../xuecheng-plus-parent</relativePath>
</parent>
<artifactId>xuecheng-plus-gateway</artifactId><dependencies><!--网关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--服务发现中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- 排除 Spring Boot 依赖的日志包冲突 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><!-- Spring Boot 集成 log4j2 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency></dependencies>

配置网关的bootstrap.yaml配置文件
YAML

#微服务配置
spring:application:name: gatewaycloud:nacos:server-addr: 192.168.101.65:8848discovery:namespace: devgroup: xuecheng-plus-projectconfig:namespace: devgroup: xuecheng-plus-projectfile-extension: yamlrefresh-enabled: trueshared-configs:- data-id: logging-${spring.profiles.active}.yamlgroup: xuecheng-plus-commonrefresh: trueprofiles:active: dev

在nacos上配置网关路由策略:
在这里插入图片描述

详细配置如下:
YAML

server:port: 63010 # 网关端口
spring:cloud:gateway:
#      filter:
#        strip-prefix:
#          enabled: trueroutes: # 网关路由配置- id: content-api # 路由id,自定义,只要唯一即可# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址uri: lb://content-api # 路由的目标地址 lb就是负载均衡,后面跟服务名称predicates: # 路由断言,也就是判断请求是否符合路由规则的条件- Path=/content/** # 这个是按照路径匹配,只要以/content/开头就符合要求
#          filters:
#            - StripPrefix=1- id: system-api# uri: http://127.0.0.1:8081uri: lb://system-apipredicates:- Path=/system/**
#          filters:
#            - StripPrefix=1- id: media-api# uri: http://127.0.0.1:8081uri: lb://media-apipredicates:- Path=/media/**
#          filters:
#            - StripPrefix=1

启动网关工程,通过网关工程访问微服务进行测试。
在http-client-env.json中配置网关的地址
在这里插入图片描述

使用httpclient测试课程查询 接口,如下:
JSON

### 课程查询列表
POST {{gateway_host}}/content/course/list?pageNo=2&pageSize=1
Content-Type: application/json{"auditStatus": "202002","courseName": ""
}

运行,观察是否可以正常访问接口 ,如下所示可以正常请求接口。

JSON
http://localhost:63010/content/course/list?pageNo=2&pageSize=1HTTP/1.1 200 OK
transfer-encoding: chunked
Content-Type: application/json
Date: Sun, 11 Sep 2022 09:54:32 GMT{"items": [{"id": 26,"companyId": 1232141425,"companyName": null,"name": "spring cloud实战","users": "所有人","tags": null,"mt": "1-3","mtName": null,"st": "1-3-2","stName": null,"grade": "200003","teachmode": "201001","description": "本课程主要从四个章节进行讲解: 1.微服务架构入门 2.spring cloud 基础入门 3.实战Spring Boot 4.注册中心eureka。","pic": "https://cdn.educba.com/academy/wp-content/uploads/2018/08/Spring-BOOT-Interview-questions.jpg","createDate": "2019-09-04 09:56:19","changeDate": "2021-12-26 22:10:38","createPeople": null,"changePeople": null,"auditStatus": "202002","status": "203001","coursePubId": null,"coursePubDate": null}],"counts": 29,"page": 2,"pageSize": 1
}

网关工程搭建完成即可将前端工程中的接口地址改为网关的地址
在这里插入图片描述

启动前端工程,测试之前开发内容管理模块的功能。
观察网关控制台,通过网关转发课程查询的日志如下:

Bash
Handler is being applied: {uri=http://192.168.101.1:63040/content/course/list?pageNo=2&pageSize=1, method=POST}

2.4 搭建媒资工程

至此网关、Nacos已经搭建完成,下边将媒资工程导入项目。
从课程资料中获取媒资工程 xuecheng-plus-media,拷贝到项目工程根目录。
右键pom.xml转为maven工程。
在这里插入图片描述

下边做如下配置:
1、创建媒资数据库xc_media,并导入资料目录中的xcplus_media.sql
2、修改nacos上的media-service-dev.yaml配置文件中的数据库链接信息
重启media-api工程只要能正常启动成功即可,稍后根据需求写接口。

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

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

相关文章

机器学习系列 - Mean Shift聚类

文章目录 前言一、原理前置知识点Mean Shift计算步骤 二、应用举例-图像分割三、聚类实战-简单实例bandwidth1bandwidth2总结 前言 Mean Shift&#xff08;均值漂移&#xff09;是基于密度的非参数聚类算法&#xff0c;其算法思想是假设不同簇类的数据集符合不同的概率密度分布…

Open CASCADE学习|创建多段线与圆

使用Open CASCADE Technology (OCCT)库来创建和显示一些2D几何形状。 主要过程如下&#xff1a; 包含头文件&#xff1a;代码首先包含了一些必要的头文件&#xff0c;这些头文件提供了创建和显示几何形状所需的类和函数。 定义变量&#xff1a;在main函数中&#xff0c;定义…

Java 将TXT文本文件转换为PDF文件

与TXT文本文件&#xff0c;PDF文件更加专业也更适合传输&#xff0c;常用于正式报告、简历、合同等场合。项目中如果有使用Java将TXT文本文件转为PDF文件的需求&#xff0c;可以查看本文中介绍的免费实现方法。 免费Java PDF库 本文介绍的方法需要用到Free Spire.PDF for Java…

开源!免费!Hugging Face推出GPT商城

Hugging Face发布开源AI助手制造工具&#xff0c;与OpenAI的定制GPT形成竞争 Hugging Face今年1月31日推出一款开源AI代码库——Hugging Chat Assistants&#xff0c;允许用户轻松创建特定功能的定制AI聊天机器人。 不同于OpenAI的ChatGPT商城需要每月20美金成为会员才能使用…

c语言--指针数组(详解)

目录 一、什么是指针数组&#xff1f;二、指针数组模拟二维数组 一、什么是指针数组&#xff1f; 指针数组是指针还是数组&#xff1f; 我们类比一下&#xff0c;整型数组&#xff0c;是存放整型的数组&#xff0c;字符数组是存放字符的数组。 那指针数组呢&#xff1f;是存放…

编译原理实验1——词法分析(python实现)

文章目录 实验目的实现定义单词对应的种别码定义输出形式&#xff1a;三元式python代码实现运行结果检错处理 总结 实验目的 输入一个C语言代码串&#xff0c;输出单词流&#xff0c;识别对象包含关键字、标识符、整型浮点型字符串型常数、科学计数法、操作符和标点、注释等等。…

大数据术语系列(1)——COW和MOR,我如何使用chatgpt通俗易懂地理解了hudi这两种表类型

从传统数据库到大数据的转变&#xff0c;首当其冲的是各种术语的理解。 所以我与chatgpt发生了一系列对话&#xff0c;以便于我能快速理解这些术语。 我先把汇总的结果放在前边&#xff0c;后边会一步步地来说明我是如何获取这些信息的。前边我也发过一些关于chatgpt提示词相…

寒假提升(5)[利用位操作符的算法题]

日子是一天天地走&#xff0c;书要一页页地读。 ——毕淑敏 算法 位操作符的合理使用来解决问题1、题目大概2、理解和想办法解决3、结果 位操作符的合理使用来解决问题 1、题目大概 题目要求让我们把一个数字用二进制表示出来的时候&#xff0c;将他的奇数位置和偶数位置交换…

HarmonyOS 鸿蒙应用开发(十、第三方开源js库移植适配指南)

在前端和nodejs的世界里&#xff0c;有很多开源的js库&#xff0c;通过npm(NodeJS包管理和分发工具)可以安装使用众多的开源软件包。但是由于OpenHarmony开发框架中的API不完全兼容V8运行时的Build-In API&#xff0c;因此三方js库大都需要适配下才能用。 移植前准备 建议在适…

如何找准用户真实需求,建立情感连接?

品牌如果想要长久发展&#xff0c;除了独特的理念以及过硬的产品质量外还需要一点&#xff0c;那就在于它能持续、正确的为用户创造生活幸福感。这满足了用户的真实需求&#xff0c;并与其产生了情感连接&#xff0c;从而让品牌有机会逐渐融入、改善用户的生活实现长期价值与口…

10个简单有效的编辑PDF文件工具分享

10个编辑PDF文件工具作为作家、编辑或专业人士&#xff0c;您可能经常发现自己在处理 PDF 文件。无论您是审阅文档、创建报告还是与他人共享工作&#xff0c;拥有一个可靠的 PDF 编辑器供您使用都非常重要。 10个简单适用的编辑PDF文件工具 在本文中&#xff0c;我们将介绍当今…

操作系统-信号量机制(整型信号量 记录型信号量)与用信号量实现进程互斥,同步,前驱关系

文章目录 信号量机制总览信号量机制整型信号量记录型信号量例子记录型信号量小结 小结 用信号量实现进程互斥&#xff0c;同步&#xff0c;前驱关系总览信号量机制实现进程互斥信号量机制实现进程同步进程同步信号量实现进程同步 信号量机制实现前驱关系小结 信号量机制 总览 …

freeRTOS总结(十五)软件定时

1&#xff0c;软件定时器的简介&#xff08;了解&#xff09; 定时器&#xff1a; 从指定的时刻开始&#xff0c;经过一个指定时间&#xff0c;然后触发一个超时事件&#xff0c;用户可自定义定时器的周期 硬件定时器&#xff1a; 芯片本身自带的定时器模块&#xff0c;硬件定…

使用dbeaver导入Excel到mysql数据库

最近业务需要将Excel导入到mysql数据库中&#xff0c;之前一直用的heisql&#xff0c;但是heidisql的导入功能太弱了&#xff0c;后来用了dbeaver&#xff0c;功能很强大。 一、安装dbeaver 首先去官网下载dbeaver社区版&#xff0c;社区版免费&#xff1a;dbeaver.io/ dbea…

3.2-媒资管理之MinIo分布式文件系统+上传图片

媒资管理 3 分布式文件系统 3.1 什么是分布式文件系统 要理解分布式文件系统首先了解什么是文件系统。 查阅百度百科&#xff1a; 文件系统是负责管理和存储文件的系统软件&#xff0c;操作系统通过文件系统提供的接口去存取文件&#xff0c;用户通过操作系统访问磁盘上的文…

JavaScript基础第三天

JavaScript 基础第三天 今天我们学习for循环、while循环、终止循环和无限循环。 1. for 循环 1.1. 语法 // 1. 语法格式 // for(起始值; 结束条件; 累加器) { // // 要重复执行的代码 // }1.2. 示例代码 let sum 0; for (let i 0; i < 100; i) {sum i; } alert(&q…

jsp康养小镇管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP康养小镇管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&a…

[超分辨率重建]ESRGAN算法训练自己的数据集过程

一、下载数据集及项目包 1. 数据集 1.1 文件夹框架的介绍&#xff0c;如下图所示&#xff1a;主要有train和val&#xff0c;分别有高清&#xff08;HR&#xff09;和低清&#xff08;LR&#xff09;的图像。 1.2 原图先通过分割尺寸的脚本先将数据集图片处理成两个相同的图像…

JavaScript中call、apply、bind方法的应用与区别

在JavaScript中&#xff0c;call、apply和bind是函数的三个重要方法&#xff0c;它们虽然功能不同&#xff0c;但都可以用来改变函数的执行上下文或者传递参数。本文将分别介绍call、apply和bind方法的应用和区别&#xff0c;并附带示例代码。 一、call方法 call方法的作用是…

Spring GateWay

概述简介 能干什么 反向代理 鉴权 流量控制 熔断 日志监控 Spring Cloud Gateway 与Zuul的区别 在SpringCloud Finchley正式版之前&#xff0c;Spring Cloud推荐的网关是 Netflix提供的Zuul: 1、Zuul 1.x&#xff0c;是一个基于阻塞Ⅳ/O的APl Gateway 2、Zuul 1.x基于Servl…