一键式自动化工具OneClickCopaw:从Shell脚本到CI/CD的部署实践

news2026/5/12 4:49:39
1. 项目概述与核心价值最近在折腾一些自动化脚本时发现了一个挺有意思的项目叫iwanglei1/OneClickCopaw。光看名字你可能会有点懵“Copaw”是什么其实这是一个典型的“一键式”自动化工具旨在解决特定场景下的重复性、繁琐性操作。对于经常需要处理文件同步、环境配置或者批量任务的朋友来说这类工具简直是“生产力倍增器”。我自己在多个项目间切换或者给新机器部署环境时就经常被各种手动复制、粘贴、修改配置搞得头大。OneClickCopaw的出现正是瞄准了这类痛点试图用一个命令或一次点击完成一系列预设的复杂操作。它的核心价值在于“化繁为简”。想象一下你每次接手一个新项目都需要从某个中央仓库拉取代码、安装特定版本的依赖、配置数据库连接、设置环境变量……这一套流程下来少说也得十几二十分钟而且容易出错。OneClickCopaw的理念就是把这一整套流程固化成一个可执行的脚本或配置你只需要运行它剩下的就交给自动化。这不仅仅是节省时间更重要的是保证了操作的一致性和可重复性对于团队协作和持续集成/持续部署CI/CD流程的搭建有着非常积极的意义。无论是个人开发者提升效率还是运维人员规范部署流程这个项目都提供了一个轻量级、可定制的解决方案思路。2. 项目核心思路与技术选型拆解2.1 “一键式”自动化背后的设计哲学OneClickCopaw的设计哲学非常明确用户友好和场景聚焦。它不追求做一个大而全的自动化平台而是针对一个或几个具体的、高频的“复制-粘贴-配置”场景进行深度优化。这种设计思路的好处是上手门槛极低用户不需要理解复杂的编排语言或学习新的框架通常只需要提供一个配置文件或者甚至不需要配置直接运行即可。为了实现“一键”项目通常会采用以下几种技术路径Shell脚本封装这是最直接、最轻量的方式。将一系列命令行操作如cp,scp,sed,echo封装在一个 Bash 或 Shell 脚本中。通过参数化设计如接收源路径、目标路径作为参数使脚本具备一定的灵活性。OneClickCopaw很可能采用了这种方式或者以其为核心。配置文件驱动将需要变动的部分如文件路径、服务器地址、版本号抽象到独立的配置文件如 JSON、YAML、.env 文件中。主脚本读取配置然后动态执行操作。这样做的好处是逻辑和配置分离用户只需修改配置文件无需触碰脚本代码更安全也更易维护。任务编排引擎对于更复杂的场景可能会引入轻量级的任务编排比如使用Makefile来定义不同的任务make deploy,make sync或者利用 Python 的invoke、fabric库。这比纯 Shell 脚本在复杂逻辑控制和错误处理上更有优势。从项目名OneClickCopaw推测“Copaw”可能是“Copy”和“Paw”爪子引申为操作的组合词或者是一个特定场景的缩写。其核心功能很可能围绕着“智能复制”或“条件同步”展开不仅仅是简单的cp -r可能包含了文件过滤、内容替换、状态检查、错误回滚等更高级的功能。2.2 关键技术组件与依赖分析要构建一个健壮的“一键式”工具除了核心逻辑还需要考虑周边支撑组件。我们来拆解一下OneClickCopaw可能涉及或应该考虑的关键技术点脚本语言Bash (Shell)是首选因为它天然兼容所有 Linux/macOS 环境并且直接调用系统命令效率最高。对于需要跨平台Windows支持的情况可能会选择Python或Node.js它们有更强大的标准库和第三方包来处理文件、网络请求等。配置管理简单的场景可以用环境变量或命令行参数。复杂配置推荐使用YAML可读性好或JSON机器友好。项目中可能会有一个config.yaml或settings.json文件。文件操作这是核心。除了基本的复制可能涉及模式匹配使用通配符*、?或正则表达式来筛选需要操作的文件。内容模板渲染复制文件后根据配置替换文件内的占位符如{{database_url}}。这可以用sed、awk命令或者 Python 的Jinja2模板引擎。差异比较与同步实现类似rsync的功能只同步发生变化的文件提高效率。这需要计算文件哈希或比较修改时间。错误处理与日志一个专业的工具必须有良好的错误处理。脚本需要检查每一步命令的返回值$?如果失败应该给出清晰的错误信息并决定是继续、重试还是中止。同时将操作日志输出到文件或控制台方便排查问题。用户交互虽然是“一键”但有时也需要用户确认或输入少量信息。可以使用read命令进行简单的命令行交互或者设计一个极简的 CLI命令行界面使用像argparse(Python)、commander(Node.js) 这样的库来解析更复杂的命令和选项。注意在技术选型时务必考虑目标用户的环境。如果希望工具尽可能通用依赖应越少越好。例如优先使用系统自带的命令和工具避免要求用户预先安装不常见的第三方运行时。3. 核心功能模块深度解析与实操3.1 配置文件设计与解析实战配置文件是OneClickCopaw的“大脑”。一个好的配置设计应该直观、灵活、有容错能力。假设我们采用 YAML 格式因为它层次清晰支持注释。# config.yaml project: name: 我的应用部署 version: 1.0.0 source: # 源目录或文件 path: ./source_template # 可以包含排除列表 exclude: - *.log - temp/ - .git/ target: # 目标基础路径 base_path: /opt/myapp # 目标可能是一个列表支持批量操作 hosts: - address: 192.168.1.100 user: deploy # 密码或密钥路径实践中建议使用SSH密钥此处仅为示例 # 绝对不要在配置文件中明文存储密码应使用环境变量或密钥文件。 # key_path: ~/.ssh/id_rsa - address: 192.168.1.101 user: deploy operations: - type: copy src: {{ source.path }}/app dst: {{ target.base_path }}/app # 可选文件过滤 include: *.py,*.yaml exclude: *.pyc - type: template src: {{ source.path }}/config/config.yaml.j2 # Jinja2模板 dst: {{ target.base_path }}/config/config.yaml vars: db_host: localhost db_port: 5432 - type: command # 复制完成后在目标端执行的命令例如重启服务 cmd: systemctl restart myapp.service # 指定在哪个主机上执行如果不指定则在所有target.hosts上执行 run_on: target # 全局设置 settings: dry_run: false # 干跑模式只显示将要执行的操作不实际执行 backup: true # 执行前是否备份目标位置原有文件 log_level: INFO # 日志级别在 Shell 脚本中解析 YAML 相对复杂通常可以借助yq一个命令行 YAML 处理器类似jq之于 JSON。如果选择 Python 实现用PyYAML库就非常简单。这里以 Shell yq为例展示如何读取配置#!/bin/bash # 示例读取项目名和干跑模式设置 CONFIG_FILE./config.yaml # 检查yq是否安装 if ! command -v yq /dev/null; then echo 错误yq 未安装。请先安装 yq (https://github.com/mikefarah/yq)。 exit 1 fi PROJECT_NAME$(yq e .project.name $CONFIG_FILE) DRY_RUN$(yq e .settings.dry_run $CONFIG_FILE) echo 项目: $PROJECT_NAME if [ $DRY_RUN true ]; then echo 当前处于干跑模式不会实际修改文件。 fi # 遍历操作列表 OPERATION_COUNT$(yq e .operations | length $CONFIG_FILE) for ((i0; iOPERATION_COUNT; i)); do OP_TYPE$(yq e .operations[$i].type $CONFIG_FILE) echo 准备执行操作 [$((i1))/$OPERATION_COUNT]: 类型$OP_TYPE # 根据类型调用不同的处理函数 case $OP_TYPE in copy) handle_copy $i ;; template) handle_template $i ;; command) handle_command $i ;; *) echo 未知操作类型: $OP_TYPE跳过。 ;; esac done实操心得配置文件最好能支持环境变量插值比如path: ${HOME}/projects。这样能更好地适应不同用户的环境。可以使用envsubst命令在脚本开始时预处理配置文件。3.2 智能复制与同步引擎实现“复制”是核心操作但OneClickCopaw的“智能”体现在哪里我认为至少有以下几点差异同步不是无脑全量覆盖。可以比较源和目标的文件修改时间mtime或计算 MD5/SHA256 哈希只复制更新的文件。这可以借助rsync命令的强大功能来实现它是这方面的专家。# 使用rsync进行差异同步示例 RSYNC_OPTS-avz --checksum # -a归档模式-v详细-z压缩--checksum基于校验和而非时间大小 RSYNC_EXCLUDE--exclude*.log --excludetemp/ SOURCE_DIR./source/ TARGET_DIR/opt/myapp/ TARGET_HOSTuserremotehost # 本地同步 rsync $RSYNC_OPTS $RSYNC_EXCLUDE $SOURCE_DIR $TARGET_DIR # 远程同步需要SSH配置免密登录 rsync $RSYNC_OPTS $RSYNC_EXCLUDE $SOURCE_DIR $TARGET_HOST:$TARGET_DIR在脚本中可以将rsync命令封装起来根据配置动态生成--include和--exclude参数。条件复制根据文件内容、名称或其他属性决定是否复制。例如只复制最近7天内修改过的文件或者只复制包含特定关键字的配置文件。这需要结合find命令和条件判断。# 复制source目录下最近1天内修改过的所有.py文件到target目录 find ./source -name *.py -mtime -1 -exec cp {} /opt/myapp/ \;冲突处理当目标文件存在时怎么办直接覆盖、备份后覆盖、跳过还是询问用户这应该在配置中提供策略选项。handle_copy() { local op_index$1 local src$(yq e .operations[$op_index].src $CONFIG_FILE) local dst$(yq e .operations[$op_index].dst $CONFIG_FILE) local conflict_policy$(yq e .operations[$op_index].conflict_policy // \backup\ $CONFIG_FILE) # 默认备份 src$(resolve_path $src) # 解析路径中的变量 dst$(resolve_path $dst) if [ -e $dst ]; then case $conflict_policy in overwrite) echo 警告目标存在直接覆盖。 ;; backup) local backup_file${dst}.bak.$(date %Y%m%d%H%M%S) cp -r $dst $backup_file echo 已备份原文件至: $backup_file ;; skip) echo 目标已存在根据策略跳过。 return 0 ;; *) echo 冲突处理策略$conflict_policy无效跳过。 return 1 ;; esac fi # 执行复制操作 cp -r $src $dst echo 复制成功: $src - $dst }3.3 模板渲染与动态内容生成对于配置文件我们经常需要根据部署环境开发、测试、生产注入不同的值。这就是模板渲染的用武之地。一个简单的模板文件config.yaml.j2可能如下# config.yaml.j2 database: host: {{ db_host }} port: {{ db_port }} name: myapp_{{ env_name }} # env_name 也可以作为变量 logging: level: {{ log_level|default(INFO) }} # 使用过滤器提供默认值在 Shell 中我们可以用sed进行简单的替换但对于复杂的循环、条件判断sed力不从心。如果项目依赖 Python强烈推荐使用Jinja2。一个简单的渲染函数如下# 假设使用Python和Jinja2 render_template() { local op_index$1 local template_src$(yq e .operations[$op_index].src $CONFIG_FILE) local output_dst$(yq e .operations[$op_index].dst $CONFIG_FILE) local vars_section$(yq e .operations[$op_index].vars | to_json $CONFIG_FILE) # 调用Python脚本进行渲染 python3 -c import yaml, jinja2, json, sys with open($template_src, r) as f: template_content f.read() vars_dict json.loads($vars_section) template jinja2.Template(template_content) result template.render(**vars_dict) with open($output_dst, w) as f: f.write(result) print(模板渲染完成: $template_src - $output_dst) }如果不想引入 Python 依赖也可以自己写一个简单的变量替换函数用awk或循环sed实现但功能会受限。注意事项模板渲染时要注意特殊字符的转义尤其是 YAML/JSON 文件中的引号和换行符。Jinja2等专业模板引擎会处理好这些细节。3.4 远程操作与命令执行模块很多部署场景需要操作远程服务器。OneClickCopaw很可能通过 SSH 来执行远程命令。安全起见应优先使用 SSH 密钥认证避免在脚本中硬编码密码。execute_remote_command() { local host$1 local user$2 local cmd$3 local key_path${4:-} # 可选密钥路径 local ssh_opts-o StrictHostKeyCheckingno -o ConnectTimeout10 if [ -n $key_path ]; then ssh_opts$ssh_opts -i $key_path fi echo 在 $user$host 上执行: $cmd if [ $DRY_RUN true ]; then echo [干跑模式] 将执行: ssh $ssh_opts $user$host \$cmd\ return 0 fi # 实际执行 ssh $ssh_opts $user$host $cmd local exit_code$? if [ $exit_code -ne 0 ]; then echo 错误在 $host 上执行命令失败退出码: $exit_code # 这里可以加入重试逻辑或全局错误处理 return $exit_code fi return 0 }对于文件传输如前所述rsync本身支持 SSH 协议是远程同步的最佳选择。脚本只需要正确构造rsync命令即可。4. 完整工作流与实操案例让我们结合一个具体的场景串联起上述所有模块。假设我们要将一个 Web 应用部署到两台远程服务器上。场景部署一个 Flask 应用到两台生产服务器。步骤从本地模板目录同步应用代码到服务器。根据每台服务器的环境变量渲染 Nginx 配置文件。在服务器上重启应用和 Nginx 服务。deploy.yaml配置示例project: name: Flask App 生产部署 source: path: ./deploy_templates target: hosts: - address: prod-server-01.example.com user: deployer env: prod app_port: 8001 - address: prod-server-02.example.com user: deployer env: prod app_port: 8002 operations: # 1. 同步应用代码 - type: sync # 使用rsync进行差异同步 src: {{ source.path }}/app_code dst: /var/www/myflaskapp exclude: *.pyc, __pycache__/, .git/ rsync_opts: -avz --delete # --delete 删除目标端源端没有的文件 # 2. 为每台主机渲染独立的Nginx配置 - type: template_for_each_host # 这是一个自定义操作类型需要对每台主机执行一次 src: {{ source.path }}/nginx.conf.j2 dst: /etc/nginx/sites-available/myflaskapp_{{ host.address }}.conf vars: server_name: {{ host.address }} app_port: {{ host.app_port }} static_path: /var/www/myflaskapp/static # 3. 在每台主机上执行部署后命令 - type: command_for_each_host cmds: - sudo systemctl restart myflaskapp.service - sudo nginx -t sudo systemctl reload nginx run_on: target主脚本 (oneclick_deploy.sh) 的核心循环逻辑#!/bin/bash set -euo pipefail # 严格模式遇到错误退出防止未定义变量 CONFIG_FILEdeploy.yaml source ./utils.sh # 假设工具函数放在这里 # 读取配置 TARGET_HOSTS$(yq e .target.hosts | to_json $CONFIG_FILE) # 使用jq解析JSON数组如果没装jq可以用yq迭代 # 这里假设用Python的yq输出为JSON然后用jq解析 HOSTS_COUNT$(echo $TARGET_HOSTS | jq length) for ((i0; iHOSTS_COUNT; i)); do HOST_JSON$(echo $TARGET_HOSTS | jq -c .[$i]) HOST_ADDR$(echo $HOST_JSON | jq -r .address) HOST_USER$(echo $HOST_JSON | jq -r .user) HOST_ENV$(echo $HOST_JSON | jq -r .env) HOST_PORT$(echo $HOST_JSON | jq -r .app_port) echo 开始处理主机: $HOST_ADDR # 为当前主机设置上下文变量供后续操作使用 export CURRENT_HOST_ADDR$HOST_ADDR export CURRENT_HOST_PORT$HOST_PORT # 执行所有操作在操作函数内部可以通过环境变量或参数获取当前主机信息 OPERATION_COUNT$(yq e .operations | length $CONFIG_FILE) for ((op_idx0; op_idxOPERATION_COUNT; op_idx)); do OP_TYPE$(yq e .operations[$op_idx].type $CONFIG_FILE) case $OP_TYPE in sync) handle_sync $op_idx $HOST_ADDR $HOST_USER ;; template_for_each_host) handle_template_for_host $op_idx $HOST_ADDR $HOST_USER $HOST_JSON ;; command_for_each_host) handle_commands_for_host $op_idx $HOST_ADDR $HOST_USER ;; *) echo 跳过未知操作类型: $OP_TYPE ;; esac done echo 主机 $HOST_ADDR 处理完成。 done echo 所有部署任务执行完毕这个脚本展示了如何遍历多台主机并为每台主机依次执行不同类型的操作。handle_sync,handle_template_for_host等函数需要根据前面章节的原理来实现它们会读取配置中对应操作的详细参数并组合成具体的rsync、scp、ssh命令来执行。5. 高级特性与扩展思路一个基础的“一键”工具满足基本需求后可以考虑加入更多提升可靠性和易用性的高级特性。5.1 状态追踪与回滚机制自动化最怕的是执行到一半出错系统处于一个未知的中间状态。实现简单的状态追踪和回滚能极大增强信心。状态追踪在执行每个关键步骤如复制文件、修改配置前记录当前状态。可以简单地将要覆盖的文件备份到一个临时目录或者记录下要执行的命令和预期结果。回滚机制当某个步骤失败时自动或手动触发回滚将系统恢复到执行前的状态。对于文件操作回滚就是把备份的文件还原。对于数据库操作可能需要执行反向的 SQL 脚本。# 伪代码示例 perform_with_rollback() { local action_cmd$1 local rollback_cmd$2 local step_name$3 echo 开始步骤: $step_name # 执行操作 if ! eval $action_cmd; then echo 步骤 $step_name 失败正在回滚... eval $rollback_cmd echo 回滚完成。 exit 1 fi echo 步骤 $step_name 成功。 } # 使用示例复制文件回滚是删除目标文件或从备份恢复 backup_file /etc/nginx/nginx.conf /tmp/backup/nginx.conf.$(date %s) perform_with_rollback \ cp new_nginx.conf /etc/nginx/nginx.conf \ cp /tmp/backup/nginx.conf.* /etc/nginx/nginx.conf \ 更新Nginx配置5.2 插件化与自定义操作支持为了让工具更灵活可以设计一个插件系统。用户可以将自己常用的复杂操作写成独立的脚本插件然后在主配置中引用。operations: - type: plugin name: setup_database plugin_path: ./plugins/database_setup.sh params: db_name: myapp_prod db_user: appuser主脚本在遇到type: plugin时动态加载并执行对应的插件脚本并传入参数。插件脚本需要遵循一定的接口规范比如通过环境变量或命令行参数接收输入。5.3 与CI/CD流水线集成OneClickCopaw这类工具天然是 CI/CD 流水线中的一环。你可以在 GitLab CI、GitHub Actions、Jenkins 等工具中将其作为一个构建或部署步骤来调用。例如在 GitHub Actions 工作流中# .github/workflows/deploy.yml name: Deploy to Production on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - name: Setup OneClickCopaw run: | chmod x oneclick_deploy.sh # 可能需要安装yq, jq等依赖 sudo apt-get install -y jq pip install yq - name: Execute Deployment env: DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_PRIVATE_KEY }} PROD_SERVER_IP: ${{ secrets.PROD_SERVER_IP }} run: | echo $DEPLOY_SSH_KEY deploy_key chmod 600 deploy_key # 将密钥和服务器IP写入配置或通过环境变量传递 ./oneclick_deploy.sh --config deploy_prod.yaml这样每次向主分支推送代码时就会自动触发部署流程实现真正的“一键部署”。6. 常见问题、排查技巧与优化建议在实际使用和开发这类工具时你会遇到各种各样的问题。下面是一些典型问题及其解决思路。6.1 权限问题Permission Denied这是最常见的问题尤其是在操作/etc、/var/www等系统目录时。问题脚本尝试复制文件到/etc/nginx/但被拒绝。排查检查执行脚本的用户身份whoami。检查目标目录的权限ls -ld /etc/nginx。解决使用sudo在需要特权的命令前加上sudo并确保当前用户在/etc/sudoers文件中配置了无需密码执行特定命令的权限NOPASSWD。注意在脚本中谨慎使用sudo避免安全风险。更改目标目录权限如果可能将目标目录的所属组改为一个普通用户所在的组并赋予该组写权限。例如sudo chown -R :deployers /var/www sudo chmod -R gw /var/www。以特权用户运行直接以root用户运行整个脚本不推荐安全性差。实操心得在涉及权限的操作前先使用dry_run模式或echo打印出将要执行的命令确认无误后再实际运行。对于需要sudo的命令可以考虑在脚本开头使用sudo -v验证权限并设置一个合理的超时时间。6.2 网络与连接超时在操作远程主机时网络不稳定或 SSH 配置问题会导致连接失败。问题ssh: connect to host xxx port 22: Connection timed out或Permission denied (publickey).排查手动执行ssh userhost看是否能连接。检查防火墙设置是否开放了22端口。检查 SSH 密钥是否正确公钥是否已添加到远程主机的~/.ssh/authorized_keys中。解决增加重试机制在脚本的 SSH 或rsync命令外包裹一个重试循环。max_retries3 retry_delay5 for i in $(seq 1 $max_retries); do if execute_remote_command $host $user echo test; then break else echo 连接失败第$i次重试等待${retry_delay}秒... sleep $retry_delay fi done使用连接池或保持连接对于需要连续执行多个远程命令的情况可以使用ssh的-M主连接模式或ControlMaster选项来复用连接避免多次握手大幅提升速度。# 在脚本开头建立主连接 ssh -o ControlMasteryes -o ControlPath~/.ssh/cm-%r%h:%p -o ControlPersist10m -N -f userhost # 后续命令使用相同的连接通道 ssh -o ControlPath~/.ssh/cm-%r%h:%p userhost command1 ssh -o ControlPath~/.ssh/cm-%r%h:%p userhost command2 # 脚本结束时关闭主连接 ssh -o ControlPath~/.ssh/cm-%r%h:%p -O exit userhost6.3 环境差异与路径问题在不同机器上如开发机 Mac 和服务器 Linux工具路径、命令版本可能不同。问题脚本中使用了rsync但某台服务器上安装的是旧版本参数不兼容。排查在脚本关键步骤前检查所需命令是否存在及其版本。check_command() { local cmd$1 local required_version$2 # 可选 if ! command -v $cmd /dev/null; then echo 错误未找到命令 $cmd请先安装。 exit 1 fi # 如果需要检查版本 # local version$($cmd --version | head -1) # ... } check_command rsync check_command jq解决使用绝对路径尽量使用/usr/bin/rsync而不是rsync。设置PATH在脚本开头显式设置PATH环境变量。条件判断针对不同操作系统uname -s或发行版cat /etc/os-release执行不同的命令分支。6.4 脚本自身的健壮性使用set -euo pipefail在脚本开头加上这行可以让脚本在遇到错误命令失败、未定义变量、管道中任意阶段失败时立即退出避免在错误的状态下继续执行。详细的日志不仅输出到控制台也重定向到文件。使用不同的日志级别INFO, WARN, ERROR。log() { local level$1 local message$2 local timestamp$(date %Y-%m-%d %H:%M:%S) echo [$timestamp] [$level] $message | tee -a $LOG_FILE } log INFO 开始部署流程... log ERROR 文件复制失败输入验证对所有从配置文件中读取的路径、主机名等参数进行基本的验证比如检查路径是否存在、主机名是否可解析等。6.5 性能优化建议当需要同步的文件很多或网络延迟高时性能可能成为瓶颈。并行执行如果操作是多台独立主机之间的可以尝试并行执行。使用将命令放入后台然后用wait等待所有后台任务完成。for host in ${hosts[]}; do ( deploy_to_single_host $host ) # 将部署任务放到子shell后台执行 done wait # 等待所有后台任务完成 echo 所有主机部署完成。注意并行执行会使得日志输出交错需要更小心地处理输出和错误。增量同步坚定不移地使用rsync的差异同步功能避免传输未变化的文件。压缩传输使用rsync -z或scp -C在传输时压缩数据对于文本文件效果显著。减少连接次数如前所述使用 SSH 连接复用。开发OneClickCopaw这类工具是一个不断迭代和打磨的过程。从最初能跑通的简单脚本到加入配置、错误处理、日志再到实现状态管理、插件化每一步都让工具变得更可靠、更强大。最重要的是它解决的是你自己或团队的真实痛点。在开始动手前先想清楚最核心的那个“一键”到底要完成什么然后把它做透、做稳。在这个基础上其他的功能都可以逐步添加上去。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…