docker部署ruoyi-vue-pro前后端详细笔记
docker部署ruoyi-vue-pro前后端详细笔记
参考:YuDaoCloud:Docker 部署 - 那个码农
1.准备工作
1.1 需要准备服务器,安装bt面板方便操作
if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh;fi;bash install_panel.sh ed8484bec
安装完成
会出现面板登录地址和账号密码,前往登录
可能遇到的问题
1.2 无法访问的情况:
1.防火墙没放行对应的端口 2.防火墙放行了,但是云服务器的安全组没有放行 3.若是轻量型应用服务器,也要到服务器官网放行
命令:
firewall-cmd --zone=public --list-ports firewall-cmd --zone=public --add-port=13366/tcp --permanent firewall-cmd --zone=public --list-ports firewall-cmd --reload
以后遇到无法访问都可能是防火墙问题,放行对应的端口即可
登录后,需要绑定手机号
然后选择LNMP一键安装,本文是使用docker运行nginx,redis,server,php7.2,数据库是使用本地mysql5.7(方便使用navicat工具进行管理)
1.3 安装docker
1.3.1.懒人版:
dnf install -y device-mapper-persistent-data lvm2 yum -y install dnf dnf install -y device-mapper-persistent-data lvm2 dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo dnf install 'dnf-command(config-manager)' dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo dnf list docker-ce dnf install -y docker-ce --nobest dnf install -y docker-ce docker -v systemctl start docker systemctl enable docker
如果报错无命令,使用下面命令安装
yum -y install dnf
继续安装
dnf install -y device-mapper-persistent-data lvm2
设置镜像源
dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
如果报错,应该是叫你安装管理工具,使用下面命令即可
dnf install 'dnf-command(config-manager)'
安装好后继续添加源
dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
查看版本
dnf list docker-ce
安装
dnf install -y docker-ce --nobest
报错的话,除掉后面的nobest
dnf install -y docker-ce
安装后查看版本
docker -v
启动并且设置为开机自启动
systemctl start docker systemctl enable docker
1.3.2 安装redis (docker)
执行如下命令,使用 Docker 启动 Redis 容器。
docker run -d --name redis --restart=always -p 6379:6379 m.daocloud.io/docker.io/redis
-
端口是 6379,密码未设置
1.3.3 安装nginx(docker)
Nginx 挂载到服务器的目录:
-
/work/nginx/conf.d
用于存放配置文件 -
/work/nginx/html
用于存放网页文件 -
/work/nginx/logs
用于存放日志 -
/work/nginx/cert
用于存放 HTTPS 证书
创建主目录和子目录
mkdir -p /work/nginx/{conf.d,html,logs,cert}
设置权限(确保 Docker 容器可读写)
chmod -R 755 /work/nginx
创建 /work/nginx
目录,并在该目录下新建 nginx.conf
文件,避免稍后安装 Nginx 报错。内容如下:
user nginx; worker_processes 1; events {worker_connections 1024; } error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; http {include /etc/nginx/mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65; log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"'; # access_log /var/log/nginx/access.log main; gzip on;gzip_min_length 1k; # 设置允许压缩的页面最小字节数gzip_buffers 4 16k; # 用来存储 gzip 的压缩结果gzip_http_version 1.1; # 识别 HTTP 协议版本gzip_comp_level 2; # 设置 gzip 的压缩比 1-9。1 压缩比最小但最快,而 9 相反gzip_types text/plain application/x-javascript text/css application/xml application/javascript; # 指定压缩类型gzip_proxied any; # 无论后端服务器的 headers 头返回什么信息,都无条件启用压缩 include /etc/nginx/conf.d/*.conf; ## 加载该目录下的其它 Nginx 配置文件 }
然后去到宝塔面板关闭原来一开始安装的nginx,下面是停止后的图
启动 Nginx
① 执行如下命令,使用 Docker 启动 Nginx 容器。
docker run -d \ --name nginx --restart always \ -p 80:80 -p 443:443 \ -e "TZ=Asia/Shanghai" \ -v /work/nginx/nginx.conf:/etc/nginx/nginx.conf \ -v /work/nginx/conf.d:/etc/nginx/conf.d \ -v /work/nginx/logs:/var/log/nginx \ -v /work/nginx/cert:/etc/nginx/cert \ -v /work/nginx/html:/usr/share/nginx/html \ m.daocloud.io/docker.io/nginx
② 执行 docker ps
命令,查看到 Nginx 容器的状态是 UP
的。
1.3.4 mysql配置允许远程navicat连接
一开始使用phpdamin连接,通过面板,注意,需要开启ssl,不然会报错
修改root密码,点击数据库-->点击root密码即可,然后开启nacvicat远程连接数据库
参考:navicat 远程云服务器的mysql问题-CSDN博客
随后在自己电脑上成功连接
恭喜你🎉,至此,你已经完成基础环境的安装了;
可以在面板上点击docker-->容器,看到自己创建的容器
下面是本文重头戏前后端打包部署!
2.后端部署
2.1 配置文件修改
激活配置:(application.yaml)
修改登录验证图片的文字水印 (application.yml)
修改数据库等重要信息,与自己的服务器ip配对(application-dev.yaml)
⚠️给出mysql5.x跟mysql8的配置(本文用的是5.7)
# url: jdbc:mysql://ip:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例url: jdbc:mysql://ip:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例
redis,微信小程序id等,下面是参考
server:port: 48080 --- #################### 数据库相关配置 #################### spring:autoconfigure:exclude:- org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置- de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置- de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置- de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置# 数据源配置项datasource:druid: # Druid 【监控】相关的全局配置web-stat-filter:enabled: truestat-view-servlet:enabled: trueallow: # 设置白名单,不填则允许所有访问url-pattern: /druid/*login-username: # 控制台管理用户名和密码login-password:filter:stat:enabled: truelog-slow-sql: true # 慢 SQL 记录slow-sql-millis: 100merge-sql: truewall:config:multi-statement-allow: truedynamic: # 多数据源配置druid: # Druid 【连接池】相关的全局配置initial-size: 5 # 初始连接数min-idle: 10 # 最小连接池数量max-active: 20 # 最大连接池数量max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒validation-query: SELECT 1 # 配置检测连接是否有效test-while-idle: truetest-on-borrow: falsetest-on-return: falseprimary: masterdatasource:master: # url: jdbc:mysql://8.138.40.47:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例url: jdbc:mysql://47.17.2.5:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例username: rootpassword: 123456slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改lazy: true # 开启懒加载,保证启动速度 # url: jdbc:mysql://8.138.40.47:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例url: jdbc:mysql://47.17.2.5/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例username: rootpassword: 123456 # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优data:redis:host: 47.17.2.5 # 地址 # host: 8.138.40.47 # 地址port: 6379 # 端口database: 1 # 数据库索引password: 123456syz@ # 密码,建议生产环境开启 --- #################### 定时任务相关配置 #################### # Quartz 配置项,对应 QuartzProperties 配置类 spring:quartz:auto-startup: true # 测试环境,需要开启 Jobscheduler-name: schedulerName # Scheduler 名字。默认为 schedulerNamejob-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 trueproperties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档org:quartz:# Scheduler 相关配置scheduler:instanceName: schedulerNameinstanceId: AUTO # 自动生成 instance ID# JobStore 相关配置jobStore:# JobStore 实现类。可见博客:https://blog.csdn.net/weixin_42458219/article/details/122247162class: org.springframework.scheduling.quartz.LocalDataSourceJobStoreisClustered: true # 是集群模式clusterCheckinInterval: 15000 # 集群检查频率,单位:毫秒。默认为 15000,即 15 秒misfireThreshold: 60000 # misfire 阀值,单位:毫秒。# 线程池相关配置threadPool:threadCount: 25 # 线程池大小。默认为 10 。threadPriority: 5 # 线程优先级class: org.quartz.simpl.SimpleThreadPool # 线程池类型jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置initialize-schema: NEVER # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。 --- #################### 消息队列相关 #################### # rocketmq 配置项,对应 RocketMQProperties 配置类 rocketmq:name-server: 127.0.0.1:9876 # RocketMQ Namesrv spring:# RabbitMQ 配置项,对应 RabbitProperties 配置类rabbitmq:host: 127.0.0.1 # RabbitMQ 服务的地址port: 5672 # RabbitMQ 服务的端口username: guest # RabbitMQ 服务的账号password: guest # RabbitMQ 服务的密码# Kafka 配置项,对应 KafkaProperties 配置类kafka:bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 --- #################### 服务保障相关配置 #################### # Lock4j 配置项 lock4j:acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒 --- #################### 监控相关配置 #################### # Actuator 监控端点的配置项 management:endpoints:web:base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuatorexposure:include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 # Spring Boot Admin 配置项 spring:boot:admin:# Spring Boot Admin Client 客户端的相关配置client:url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址instance:service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]# Spring Boot Admin Server 服务端的相关配置context-path: /admin # 配置 Spring # 日志文件配置 logging:file:name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径 --- #################### 微信公众号相关配置 #################### wx:mp: # 公众号配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档app-id: wx0fc626fe05ddfb99 # 测试号(自己的 wx2ee5bbbb1fd812dc)secret: d2e5580b7c937bb9949910818b44aa7c# 存储配置,解决 AccessToken 的跨节点的共享config-storage:type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取key-prefix: wx # Redis Key 的前缀http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档appid: wx2ee5bbbb1fd812dc # wenhualian的接口测试号secret: bf350f2e1386ac7a5c10d636fdbcdfb2config-storage:type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取key-prefix: wa # Redis Key 的前缀http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 #wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档 # mp: # # 公众号配置(必填) # app-id: wx041349c639b268b # secret: 5abee51948c9f8cb37ce280e814bd0 # # 存储配置,解决 AccessToken 的跨节点的共享 # config-storage: # type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 # key-prefix: wx # Redis Key 的前缀 # http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 # miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档 # appid: wx63c28e3248a3e7 # secret: 6f270509227ae1296bbf1c8cb97aed # config-storage: # type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 # key-prefix: wa # Redis Key 的前缀 # http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 --- #################### 芋道相关配置 #################### # 芋道配置项,设置当前项目所有自定义的配置 yudao:pay:order-notify-url: http://47.17.2.5/admin-api/pay/notify/order # 支付渠道的【支付】回调地址refund-notify-url: http://47.17.2.5/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址transfer-notify-url: https://47.17.2.5/admin-api/pay/notify/transfer # 支付渠道的【转账】回调地址demo: false # 开启演示模式tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc justauth:enabled: truetype:DINGTALK: # 钉钉client-id: dingvrnreaje3qvzhxgclient-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLIignore-check-redirect-uri: trueWECHAT_ENTERPRISE: # 企业微信client-id: wwd411c69a39ad54client-secret: 1wTb7hYT2TUbIeHGXGo7T0odav1ic10mLdyyATOwagent-id: 1000004ignore-check-redirect-uri: true# noinspection SpringBootApplicationYamlWECHAT_MINI_APP: # 微信小程序client-id: ${wx.miniapp.appid}client-secret: ${wx.miniapp.secret}ignore-check-redirect-uri: trueignore-check-state: true # 微信小程序,不会使用到 state,所以不进行校验WECHAT_MP: # 微信公众号client-id: ${wx.mp.app-id}client-secret: ${wx.mp.secret}ignore-check-redirect-uri: truecache:type: REDISprefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟 --- #################### iot相关配置 TODO 芋艿:再瞅瞅 #################### iot:emq:# 账号username: anhaohao# 密码password: ahh@123456# 主机地址hostUrl: tcp://chaojiniu.top:1883# 客户端Id,不能相同,采用随机数 ${random.value}client-id: ${random.int}# 默认主题default-topic: test# 保持连接keepalive: 60# 清除会话(设置为false,断开连接,重连后使用原来的会话 保留订阅的主题,能接收离线期间的消息)clearSession: true
关闭演示(application-dev.yaml 能够进行数据库写入删除操作)
2.2 下面进行打包:
mvn clean package -Dmaven.test.skip=true
mac可以使用命令scp传输
scp yudao-server.jar root@ip:/root
输入账号密码即可
构建镜像
① 在 /work/projects/yudao-server
目录下(没有就创建),新建 Dockerfile 文件,用于制作后端项目的 Docker 镜像。编写内容如下:
FROM m.daocloud.io/docker.io/eclipse-temurin:21-jre ## 创建目录,并使用它作为工作目录 RUN mkdir -p /yudao-server WORKDIR /yudao-server ## 将后端项目的 Jar 文件,复制到镜像中 COPY yudao-server.jar app.jar ## 设置 TZ 时区 ## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖 ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx512m" ## 暴露后端项目的 48080 端口 EXPOSE 48080 ## 启动后端项目 ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar
② 执行如下命令,构建名字为 yudao-server
的 Docker 镜像。
cd /work/projects/yudao-server docker build -t yudao-server .
③ 在 /work/projects/yudao-server
目录下,新建 Shell 脚本 deploy.sh
,使用 Docker 启动后端项目。编写内容如下:
#!/bin/bash set -e ## 第一步:删除可能启动的老 yudao-server 容器 echo "开始删除 yudao-server 容器" docker stop yudao-server || true docker rm yudao-server || true echo "完成删除 yudao-server 容器" ## 第二步:启动新的 yudao-server 容器 \ echo "开始启动 yudao-server 容器" docker run -d \ --name yudao-server \ -p 48080:48080 \ -e "SPRING_PROFILES_ACTIVE=dev" \ -v /work/projects/yudao-server:/root/logs/ \ yudao-server echo "正在启动 yudao-server 容器中,需要等待 60 秒左右"
-
应用日志文件,挂载到服务器的的
/work/projects/yudao-server
目录下 -
通过
SPRING_PROFILES_ACTIVE
设置为dev
开发环境
启动后端
① 执行 sh deploy.sh
命令,使用 Docker 启动后端项目。日志如下:
开始删除 yudao-server 容器 yudao-server yudao-server 完成删除 yudao-server 容器 开始启动 yudao-server 容器 0dfd3dc409a53ae6b5e7c5662602cf5dcb52fd4d7f673bd74af7d21da8ead9d5 正在启动 yudao-server 容器中,需要等待 60 秒左右
② 执行 docker logs yudao-server
命令,查看启动日志。看到如下内容,说明启动完成:
3.前端部署
3.1 修改配置文件
3.2 打包dist上传
打包命令
npm run build:dev
打包好的dist文件夹里的所有文件放到服务器的
/work/nginx/html下
3.3 创建nginx配置文件
在/work/nginx/conf.d,创建ruoyi-vue-pro.conf文件
server {listen 80;server_name 139.9.196.247; ## 重要!!!修改成你的外网 IP/域名 location / { ## 前端项目root /usr/share/nginx/html/yudao-admin-ui;index index.html index.htm;try_files $uri $uri/ /index.html;} location /admin-api/ { ## 后端项目 - 管理后台proxy_pass http://192.168.0.213:48080/admin-api/; ## 重要!!!proxy_pass 需要设置为后端项目所在服务器的 IPproxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;} location /app-api/ { ## 后端项目 - 用户 Appproxy_pass http://192.168.0.213:48080/app-api/; ## 重要!!!proxy_pass 需要设置为后端项目所在服务器的 IPproxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;} }
3.4 命令验证重启服务
docker exec nginx nginx -t
docker exec nginx nginx -s reload
4.访问测试
相关文章:
docker部署ruoyi-vue-pro前后端详细笔记
docker部署ruoyi-vue-pro前后端详细笔记 参考:YuDaoCloud:Docker 部署 - 那个码农 1.准备工作 1.1 需要准备服务器,安装bt面板方便操作 if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wg…...
软考中级数据库系统工程师学习资料分享
软考中级数据库系统工程师考试对于很多 IT 从业者和计算机专业的大学生来说,是一个重要的职业资格认证。它不仅能够提升个人的专业技能,还能为职业发展增添有力的砝码。今天,我将为大家分享一套全面且实用的学习资料,帮助大家更好…...
RESTful学习笔记(一)
Web发展 一、API 程序硬件接口(Application Programming Interface),是预先定义好的逻辑函数,软件系统不同组成部分衔接的约定,直接调用函数,无序访问代码细节,分为SDK和Web应用接口两类 SDK…...
基于 FFmpeg 的音视频处理基础原理与实验探究
目录 1 基本知识1.1 解封装1.2 AAC和ADTS说明 1.3 H2641.3.1 H264编码结构解析1.3.2 NALU1.3.2 分类 2 实验1 探究音视频信息2.1 重要结构体介绍2.2 相关的API 3 实验二 提取AAC数据4 实验三 提取h264 1 基本知识 1.1 解封装 封装的逆向操作:封装是把音频流、视频流…...
spark和hadoop的区别
一、核心定位与架构差异 Hadoop • 定位:分布式存储与计算的基础框架,核心解决海量数据的存储(HDFS)和离线批处理计算(MapReduce)问题,适合对实时性要求不高的大规模数据离线处理场景。 • 架构…...
vue使用语音识别
vue使用语音识别 使用 Web Speech API 实现语音识别功能 语音转换的原理可以简单概括为以下几个步骤: 声音捕捉:将声波转化为数字信号。特征提取:分析声音中的关键特征。声学模型:将声音特征与音素匹配。语言模型:根据…...
代码随想录算法训练营day8(栈与队列)
华子目录 用栈实现队列思路 用栈实现队列 https://leetcode.cn/problems/implement-queue-using-stacks/description/ push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。思路 初始化两个栈…...
GPT,Genini, Claude Llama, DeepSeek,Qwen,Grok,选对LLM大模型真的可以事半功倍!
选对大模型真的可以事半功倍! 基于公开的技术报告、基准测试结果、在线反馈及用户使用情况,深入探讨各模型的特点、擅长领域及典型应用场景,为用户和开发者选择和应用合适的模型提供参考。 1. 引言 大型语言模型(Large Language…...
Unocss 类名基操, tailwindcss 类名
这里只列出 unocss 的可实现类名,tailwindcss 可以拿去试试用 1. 父元素移入,子元素改样式 <!-- 必须是 group 类名 --> <div class"group"><div class"group-hover:color-red">Text</div> </div>2…...
Flowable7.x学习笔记(十)分页查询已部署 BPMN XML 流程
前言 上一篇文章我们已经完成了流程的部署功能,那么下一步就是要激活流程了,但是我们要需要明确的指定具体要激活部署后的哪一条流程,所以我们先把已部署的基础信息以及具体定义信息分页查询出来,本文先把基础代码生成以及完成分页…...
【阿里云大模型高级工程师ACP学习笔记】2.1 用大模型构建新人答疑机器人
学习目标 在备考阿里云大模型高级工程师ACP认证时,学习《2.1用大模型构建新人答疑机器人》这部分内容,主要是为了掌握利用大模型技术构建高效答疑机器人的方法,提升在大模型应用开发领域的专业能力。具体目标如下: 掌握大模型API调用:学会通过API调用通义千问大模型,熟悉…...
设计模式深度总结:概念、实现与框架中的应用
【全网最全】23种设计模式思维导图详解 | 含React/Vue/Spring实战案例 导图概述 本文通过高清思维导图系统梳理了23种设计模式,分为创建型、结构型、行为型三大类,并标注了各模式在主流框架(如React、Vue、Spring)中的典型应用场…...
2025 活体识别+人脸认证工具类【阿里云api,需要先申请试用】
(1)获取活体检测的人脸URL地址和Token。 (2)活体检测成功后,使用Token验证人脸检测结果的一致性。 (3)对于检测结果一致的人脸照片,进行姓名、身份证号和照片的认证流程。 一、活…...
【HDFS】verifyEC命令校验EC数据正确性
verifyEC命令是HDFS里用于验证EC文件正确性的一个工具。这是一个非常实用的工具,能帮助我们确定EC的数据内容是否正确,并且如果不正确的话,还有可能会触发reportBadBlock给NN,让NN进行块的重构。 本文先介绍一下verifyEC命令的使用方法,再描述其实现原理细节。 一、命令…...
【PCIE730】基于PCIe总线架构的4路10G光纤通道适配器
板卡简介 PCIE730是一款基于PCI Express总线架构的4路10G光纤通道适配器,板卡具有4通道SFP万兆光纤接口,x8 PCIE主机接口,具有1组64位DDR3 SDRAM作为高速缓存,可以实现4通道光纤网络数据的高速采集、实时记录和宽带回放。 该板卡还…...
蚂蚁全媒体总编刘鑫炜再添新职,出任共工新闻社新媒体研究院院长
2025年4月18日,共工新闻社正式宣布聘任蚂蚁全媒体总编刘鑫炜为新媒体研究院院长。此次任命标志着刘鑫炜在新媒体领域的专业能力与行业贡献再次获得权威机构认可。 刘鑫炜深耕新媒体领域多年,曾担任中国新闻传媒集团新媒体研究院院长、蚂蚁全媒体总编等职…...
C++11——可调用对象
目录 lambda 表达式语法 捕捉列表 function bind 调整参数个数 参数顺序 lambda 表达式语法 lambda表达式本质上是匿名函数对象,该表达式在语法使用层是没有类型的,一般用auto或模板参数定义的对象去接收它的对象(模板参数定义的对象…...
【上位机——MFC】运行时类信息机制
运行时类信息机制的使用 类必须派生自CObject类内必须添加声明宏DECLARE_DYNAMIC(theClass)3.类外必须添加实现宏 IMPLEMENT_DYNAMIC(theClass,baseClass) 具备上述三个条件后,CObject::IsKindOf函数就可以正确判断对象是否属于某个类。 代码示例 #include <…...
数据中的知识产权问题
首席数据官高鹏律师团队编著 数据中的知识产权问题涉及法律、技术和社会多个层面,其复杂性随着数据价值的提升和数字化发展日益凸显。以下是核心要点的梳理和分析: 一、数据本身的知识产权属性 1. 原始数据(Raw Data) 通常不直…...
若依框架免登陆、页面全屏显示、打开新标签页(看板大屏)
1.免登陆:找到项目目录下src/permission.js,在白名单whiteList中添加上你的看板大屏路由地址,这样就不会校验该路由的token(这里我添加的是/mesBoard/mesqualityboard); 要注意的是此时免登陆进来也会报404…...
算法-策略(递归,二叉搜索)
分而治之 一个大问题不断拆成各种小问题,大问题与小问题的方向要一致。 递归函数(递减) 分析时间函数的两种方法:递归树(跟踪树) ,代换法。 例1 例2 这里的代换法注意,不要轻易的把常数加在一起,加在一起后看不出规…...
unity TEngine学习4
上一篇我们学习了UI部分,这一篇我们学习其他部分,按照老规矩还是先打开官方文档 ResourceModule 在官方文档里介绍了当前加载的设置,但是我们是小白看不懂,那就不管他内部怎么实现的,我们主要看下面的代码给的方法&am…...
掌握常见 HTTP 方法:GET、POST、PUT 到 CONNECT 全面梳理
今天面试还问了除了 get 和 post 方法还有其他请求方法吗,一个都不知道,这里记录下。 🌐 常见 HTTP 请求方法一览 方法作用描述是否幂等是否常用GET获取资源,参数一般拼接在 URL 中✅ 是✅ 常用POST创建资源 / 提交数据ÿ…...
在线查看【免费】 mp3,wav,mp4,flv 等音视频格式文件文件格式网站
可以免费在线查看 .docx/wps/Office/wmf/ psd/ psd/eml/epub/dwg, dxf/ txt/zip, rar/ jpg/mp3 m.gszh.xyz m.gszh.xyz 免费支持以下格式文件在线查看类型 支持 doc, docx, xls, xlsx, xlsm, ppt, pptx, csv, tsv, dotm, xlt, xltm, dot, dotx, xlam, xla, pages 等 Office 办…...
部署Kimi-VL-A3B-Instruct视频推理
部署Kimi-VL-A3B-Instruct视频推理 契机 ⚙ 最近国内AI公司月之暗面推出了Kimi-VL开源视觉模型。模型参数16.4B,但是推理时候激活参数2.8B。看了huggingface主页的Full comparison,在多项Benchmark的时候都展示出了不俗的实力。由于业务中使用了qwen-v…...
力扣面试经典150题(第二十四题)
问题 给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必…...
Electron Demo 的快速编译与启动
前言 本文将带你从零开始,快速搭建并运行一个基于 OpenIMSDK 的 Electron 应用。本项目以 OpenIMSDK 开源版为基础,借助 openim/electron-client-sdk 与 openim/wasm-client-sdk,能够同时构建 Web 端及桌面端(Windows、macOS、Lin…...
Web3核心技术解析:从区块链到C++实践
Web3作为下一代互联网的核心架构,正在通过区块链、智能合约、分布式存储等技术的融合,重塑数字世界的信任与协作模式。本文将从技术原理、应用场景及C实践案例三个维度,深入解析Web3的核心技术体系。 一、Web3的核心技术栈 1. 区块链&#x…...
Elasticsearch中的_source字段讲解
_source 在 Elasticsearch 查询中用于限制返回的字段,类似于 SQL 中的 SELECT 指定列。 代码示例: esSearchResults = es_service.search_documents({"query": {"terms": {"file_id":...
LlamaIndex 生成的本地索引文件和文件夹详解
LlamaIndex 生成的本地索引文件和文件夹详解 LlamaIndex 在生成本地索引时会创建一个 storage 文件夹,并在其中生成多个 JSON 文件。以下是每个文件的详细解释: 1. storage 文件夹结构 1.1 docstore.json 功能:存储文档内容及其相关信息。…...
笔记:react中 父组件怎么获取子组件中的属性或方法
在子组件中我们可以使用下面两个方法去暴露你所要放行的属性或方法👇 1.useImperativeHandle 2.orwardRef 搭配使用例子 import React, { useState, forwardRef, useImperativeHandle } from "react"function Son(props, ref) {const [data] useStat…...
Python+CoppeliaSim+ZMQ remote API控制机器人跳舞
这是一个使用Python和CoppeliaSim(V-REP)控制ASTI人型机器人进行舞蹈动作的演示项目。 项目描述 本项目展示了如何使用Python通过ZeroMQ远程API与CoppeliaSim仿真环境进行交互,控制ASTI人型机器人执行预定义的舞蹈动作序列。项目包含完整的机…...
oracle rac时区问题导致远程查询时间不准
远程工具SQLDev工具和应用出来的时间都要慢12个小时 检查操作系统和硬件时间 # date Fri Apr 18 15:54:11 CST 2025 date -R Fri, 18 Apr 2025 16:06:24 0800 # hwclock -r Fri 18 Apr 2025 04:08:38 PM CST -0.313786 seconds 都是没有问题,时间和时区都是…...
LPO 光模块:下一代数据中心网络的节能高效新选择
一、LPO 光模块的定义与核心原理 LPO(Linear Pluggable Optics,线性可插拔光模块)是光通信领域针对高速率、低功耗需求推出的创新解决方案。其核心突破在于摒弃传统光模块中的 DSP(数字信号处理)芯片,采用线…...
MCP Server Java 开发框架的体验比较(spring ai mcp 和 solon ai mcp)
目前已知的两个 mcp-server java 应用开发框架(ID类的,封装后体验都比较简洁): spring-ai-mcp,支持 java17 或以上solon-ai-mcp,支持 java8 或以上(也支持集成到 springboot2, jfinal, vert.x …...
OpenCV 图形API(45)颜色空间转换-----将图像从 BGR 色彩空间转换为 YUV 色彩空间函数BGR2YUV()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从BGR色彩空间转换为YUV色彩空间。 该函数将输入图像从BGR色彩空间转换为YUV。B、G和R通道值的常规范围是0到255。 输出图像必须是8位无符…...
C++入门语法
C入门 首先第一点,C中可以混用C语言中的语法。但是C语言是不兼容C的。C主要是为了改进C语言而创建的一门语言,就是有人用C语言用不爽了,改出来个C。 命名空间 c语言中会有如下这样的问题: 那么C为了解决这个问题就整出了一个命名…...
个性化的配置AndroidStudio
Android Studio 提供诸多向导和模板,可用于验证 Java 开发套件 (JDK) 和可用 RAM 等系统要求,以及配置默认设置,例如经过优化的默认 Android 虚拟设备 (AVD) 模拟和更新的系统映像。本文档介绍了可用于自定义 Android Studio 使用方式的其他配…...
Python-24:小R的随机播放顺序
问题描述 小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌,播放后将其从歌单中移除。如果歌单中还有歌曲,则会将当前第一首歌移到最后一首。这个过程会一直重复,直到歌单中没有任何歌曲。 例如,给定歌单 [5, 3, 2, 1,…...
JavaScript — 总结
介绍 JavaScript是一种广泛应用于Web开发的高级脚本语言,主要用于为网页添加交互功能。作为前端开发的三大核心技术之一,它与HTML(结构)和CSS(样式)协同工作,通过操作DOM元素实现动态内容更新、…...
解决 Ubuntu 下 VTune 无法收集 CPU 硬件时间计数数据的问题
解决 Ubuntu 下 VTune 无法收集 CPU 硬件时间计数数据的问题 在 Ubuntu 上使用 Intel VTune Profiler 时遇到无法收集 CPU 硬件性能计数器数据的问题,通常是由于权限和系统配置问题导致的。以下是解决方案: 1. 检查并加载性能监控模块 首先确保 Linux…...
MySQL《事务》
文章目录 前言一、什么是事务?二、事务的ACID特性三、如何使用事务?3.1 查看支持事务的存储引擎3.2 语法3.3 开启一个事务,执行修改后回滚3.4 开启一个事务,执行修改后提交3.5 保存点3.6 自动/手动提交事务 四、事务的隔离性和隔离…...
微服务划分的思考
为什么 微服务不是十全十美的,不是银弹,是什么原因导致必须要做微服务划分,是否有足够的动机支撑,是项目需要,还是领导的想法,公司层面是否有相应的规划。 拆分后的服务谁来维护,研发同学是否愿意参与 为什么,思考清楚了,接下来看还需要考虑怎么做 单体应用的不足…...
介绍XML
XML(Extensible Markup Language,可扩展标记语言)是一种用于存储、传输和交换数据的标记语言,由万维网联盟(W3C)在1998年制定。它通过自定义标签描述数据结构,具有平台无关性、自描述性和结构化…...
从0开始配置spark-local模式
安装Spark的过程就是下载和解压的过程。接下来的操作,我们把它上传到集群中的节点,并解压运行。 1.启动虚拟机 2.通过finalshell连接虚拟机,并上传安装文件到 /opt/software下 3.解压spark安装文件到/opt/module下 tar -zxvf spark-3.3.1-…...
CSS基础-即学即用 -- 笔记1
目录 前言CSS 基础1. 层叠样式表来源理解优先级源码顺序经验法则继承inherit 关键字initial 关键字 2. 相对单位em 和 rem响应式面板视口的相对单位使用vw定义字号使用calc()定义字号自定义属性(即CSS变量) 3. 盒模型调整盒模型 前言 只需一分钟就能学会…...
日志文件太大,如何分卷压缩便于传输
在IT系统维护和开发工作中,日志文件的作用举足轻重,它不仅记录了系统运行过程中的详细信息,还能帮助技术人员诊断问题、追踪事件和分析性能。 然而,随着系统的长期运行,日志文件可能会迅速膨胀,特别是在高…...
【Django】设置让局域网内的人访问
操作步骤 1. 命令行窗口下查询【本机ip】 ipconfig2. Django项目的全局设置【settings.py】中进行如下设置 ALLOWED_HOSTS ["本机ip"]3. 启动Django项目:命令行下执行如下命令 python manage.py runserver 0.0.0.0:80004. 测试效果:浏览器…...
智慧教室电子班牌-智能管理系统源码,后端基于Spring Boot框架,前端使用Vue.js框架进行组件化开发
智慧班牌系统是一种集成了多种功能的电子班牌,包括校园信息发布、综合素质评价、考勤管理、家校互通、教务管理、考场管理和成绩分析等。它为班级和学校提供了一个多层次、多内容的信息发布平台,同时也为教师、家长和学生提供了一个安全、快捷、全面的互…...
[密码学实战]密评考试训练系统v1.0程序及密评参考题库(获取路径在文末)
[密码学实战]密评考试训练系统v1.0程序及密评参考题库 引言:密评考试的重要性与挑战 商用密码应用安全性评估(简称"密评") 作为我国密码领域的重要认证体系,已成为信息安全从业者的必备技能。根据国家密码管理局最新数据,截至2024年6月,全国仅有3000余人持有…...