JRT监听程序

本次设计避免以往设计缺陷,老的主要为了保持兼容性,在用的设计就不好调了。

在这里插入图片描述

首先,接口抽象时候就不在给参数放仪器ID和处理类了,直接放仪器配置实体,接口实现想用什么属性就用什么属性,避免老方式要扩参数时候就波动接口定义,导致不兼容。
在这里插入图片描述

对返回命令取图或者上传文件等不在组串了,直接约定命令,返回查询上传数据或保存数据返回时候直接返回命令的JSON列表,再有监听提供的命令虚拟机执行命令

/*
本框架版权归属于JRT计划,任何单位或个人未经许可,不得以任何方式复制、传播、展示、发布、分发、重新分发、修改、反编译、
反向编译或以其他方式使用本框架的任何部分,包括但不限于源代码、二进制文件、文档、演示文稿、示例代码和API。
使用本框架的用户需遵守以下条款:
用户只能以个人学习和研究为目的使用本框架,不得将其用于商业用途。
用户在使用本框架时,应遵守所有适用的法律和法规,包括但不限于版权法、商标法、专利法和隐私权法。
用户在使用本框架时,应自行承担风险和责任,并确保不会侵犯任何知识产权或个人权利。
本框架的使用仅限于用户自己使用,不得将其分发给其他用户或将其用于任何形式的共享或传播。
在使用本框架时,用户应尊重和保护其他用户的隐私和个人信息,不得将其泄露给任何第三方。
违反以上条款将视为侵权行为,将采取法律手段维护JRT合法权益。
 */
package JRTMachineImpl.Cmd;

import java.util.List;
import JRTMachineImpl.Base.CmdDto;

/**
 * 构造指令,监听再也不按以前固定拼串方式来实现附加功能了,转而提供一系列指令约定,让后台虚拟M按需要返回指令列表,
 * 由监听实现的简单指令执行虚拟机执行,从而达到解耦和实现更灵活和强大的功能
 */
public class MakeCmd {
    /**
     * 添加一个SQL更新或者插入数据的指令到指令列表
     * @param cmdList 指令列表
     * @param setStatusKey 设置状态主键,有的话用该注解调用SetQryStatus设置状态
     * @param sql SQL语句
     * @param Address 连接串,如果上传要单独指定地址的话就传
     * @param UserName 用户名,如果上传要单独指定地址的话就传
     * @param UserPass 密码,如果上传要单独指定地址的话就传
     * @param Driver 驱动,如果上传要单独指定地址的话就传
     */
    public static void AddSqlCmd(List<CmdDto> cmdList,String setStatusKey,String sql,String Address,String UserName,String UserPass,String Driver)
    {
        CmdDto dto=new CmdDto();
        dto.Cmd="SQL";
        dto.P0=sql;
        dto.P1=Address;
        dto.P2=UserName;
        dto.P3=UserPass;
        dto.P4=Driver;
        dto.SetStatusKey=setStatusKey;
        cmdList.add(dto);
    }

    /**
     * 添加一个SQL更新或者插入数据的指令到指令列表
     * @param cmdList 指令列表
     * @param setStatusKey 设置状态主键,有的话用该注解调用SetQryStatus设置状态
     * @param sql SQL语句
     */
    public static void AddSqlCmd(List<CmdDto> cmdList,String setStatusKey,String sql)
    {
        AddSqlCmd(cmdList,setStatusKey,sql,"","","","");
    }

    /**
     * 添加一个写文本数据的指令到指令列表
     * @param cmdList 指令列表
     * @param setStatusKey 设置状态主键,有的话用该注解调用SetQryStatus设置状态
     * @param path 文本路径
     * @param str 写入的串
     * @param isAppend 是否追加
     * @param encode 编码 空默认系统编码,可为:UTF-8 UTF-16 ISO-8859-1 US-ASCII GB2312 GBK Big5 Shift-JIS EUC-KR Windows-1252
     */
    public static void AddTxtCmd(List<CmdDto> cmdList,String setStatusKey,String path,String str,String isAppend,String encode)
    {
        CmdDto dto=new CmdDto();
        dto.Cmd="TXT";
        dto.P0=path;
        dto.P1=str;
        dto.P2=isAppend;
        dto.P3=encode;
        dto.SetStatusKey=setStatusKey;
        cmdList.add(dto);
    }

    /**
     * 添加一个删除文件或者文件夹的指令到指令列表
     * @param cmdList 指令列表
     * @param path 路径
     */
    public static void AddRMCmd(List<CmdDto> cmdList,String path)
    {
        CmdDto dto=new CmdDto();
        dto.Cmd="RM";
        dto.P0=path;
        dto.SetStatusKey="";
        cmdList.add(dto);
    }

    /**
     * 添加一个拷贝文件的指令到指令列表
     * @param cmdList 指令列表
     * @param filePathOld 源文件路径
     * @param filePathNew 新文件路径
     */
    public static void AddCPCmd(List<CmdDto> cmdList,String filePathOld,String filePathNew)
    {
        CmdDto dto=new CmdDto();
        dto.Cmd="CP";
        dto.P0=filePathOld;
        dto.P1=filePathNew;
        dto.SetStatusKey="";
        cmdList.add(dto);
    }

    /**
     * 添加一个获取图片的指令到指令列表
     * @param cmdList 指令列表
     * @param epis 流水号
     * @param imgClass 图片类别代码
     * @param imgPath 图片路径
     * @param newName 新名称,不给的话就是文件名
     */
    public static void AddGetImageCmd(List<CmdDto> cmdList,String epis,String imgClass,String imgPath,String newName)
    {
        if(newName==null)
        {
            newName="";
        }
        CmdDto dto=new CmdDto();
        dto.Cmd="GETIMAGE";
        dto.P0=epis;
        dto.P1=imgClass;
        dto.P2=imgPath;
        dto.P3=newName;
        dto.SetStatusKey="";
        cmdList.add(dto);
    }
}

命令执行器

/*
本框架版权归属于JRT计划,任何单位或个人未经许可,不得以任何方式复制、传播、展示、发布、分发、重新分发、修改、反编译、
反向编译或以其他方式使用本框架的任何部分,包括但不限于源代码、二进制文件、文档、演示文稿、示例代码和API。
使用本框架的用户需遵守以下条款:
用户只能以个人学习和研究为目的使用本框架,不得将其用于商业用途。
用户在使用本框架时,应遵守所有适用的法律和法规,包括但不限于版权法、商标法、专利法和隐私权法。
用户在使用本框架时,应自行承担风险和责任,并确保不会侵犯任何知识产权或个人权利。
本框架的使用仅限于用户自己使用,不得将其分发给其他用户或将其用于任何形式的共享或传播。
在使用本框架时,用户应尊重和保护其他用户的隐私和个人信息,不得将其泄露给任何第三方。
违反以上条款将视为侵权行为,将采取法律手段维护JRT合法权益。
 */
package JRTMachineImpl.Cmd;

import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.List;

import JRTMachineImpl.Base.BaseDeal;
import JRTMachineImpl.Base.CmdDto;
import JRTMachineImpl.Base.ConfDto;
import JRTMachineImpl.Util.FileService;
import JRTMachineImpl.Util.LogUtils;
import JRTMachineImpl.WebService.OutValue;
import JRTMachineImpl.WebService.Parameters;
import JRTMachineImpl.WebService.WebGetData;
import JRTMachineImpl.DB.DBHelper;

/**
 * 指令执行的虚拟机,按指令约定执行指令
 */
public class CmdVM {
    /**
     * 执行指令
     * @param cmdList 指令列表
     * @param conf 监听配置
     * @return 返回值,正常返回空,否则返回错误
     */
    public static String ExeCmd(List<CmdDto> cmdList, JRTMachineImpl.Base.ConfDto conf) throws Exception
    {
        //循环执行指令
        for(CmdDto cmd:cmdList)
        {
            try {
                ExeOneCmd(cmd, conf);
            }
            catch (Exception ex)
            {
                StringWriter stringWriter = new StringWriter();
                ex.printStackTrace(new PrintWriter(stringWriter));
                LogUtils.WriteDebugLog("执行命令异常:" + stringWriter.toString());
                LogUtils.WriteExceptionLog("执行命令异常", ex);
            }
        }
        return "";
    }

    /**
     * 执行指令
     * @param cmd 指令
     * @param conf 监听配置
     * @return 返回值,正常返回空,否则返回错误
     */
    public static String ExeOneCmd(CmdDto cmd, JRTMachineImpl.Base.ConfDto conf) throws Exception
    {
        //执行SQL
        if(cmd.Cmd.equals("SQL"))
        {
            ConfDto confNew=new ConfDto();
            confNew.Address=conf.Address;
            confNew.UserName=conf.UserName;
            confNew.UserPass=conf.UserPass;
            confNew.Driver=conf.Driver;
            //命令指定了要换驱动
            if(cmd.P1!=null&&!cmd.P1.isEmpty())
            {
                confNew.Address=cmd.P1;
                confNew.UserName=cmd.P2;
                confNew.UserPass=cmd.P3;
                confNew.Driver=cmd.P4;
            }
            JRTMachineImpl.DB.DBHelper dbHelper=new DBHelper(confNew);
            LogUtils.WriteDebugLog("执行SQL:"+cmd.P0);
            //执行SQL语句
            int ret=dbHelper.ExecUpdateSQL(cmd.P0);
            LogUtils.WriteDebugLog("执行SQL返回:"+ret);
            //设置状态
            if(ret==1&&!cmd.SetStatusKey.isEmpty())
            {
                Parameters param=new Parameters();
                param.P0=conf.MachID;
                param.P1=cmd.SetStatusKey;
                OutValue session = new OutValue();
                OutValue out = new OutValue();
                LogUtils.WriteDebugLog("调用:"+conf.DealProcess+"的:SetQryStatus设置状态");
                String setStatusRet=WebGetData.GetData(BaseDeal.WebServicAddress,conf.DealProcess,"SetQryStatus",param,session,out);
                LogUtils.WriteDebugLog("设置状态返回:"+setStatusRet);
            }
        }
        //写文件
        else if(cmd.Cmd.equals("TXT"))
        {
            File fi=new File(cmd.P0);
            boolean isAppend=false;
            if(cmd.P2.equals("1"))
            {
                isAppend=true;
            }
            String model=",模式:覆盖";
            if(isAppend==true)
            {
                model=",模式:追加";
            }
            LogUtils.WriteDebugLog("往文件:"+cmd.P0+",写入:"+cmd.P1+model+",编码:"+cmd.P3);
            JRTMachineImpl.Util.TxtUtil.WriteText2File(fi,cmd.P1,isAppend,cmd.P3);
            //设置状态
            if(!cmd.SetStatusKey.isEmpty())
            {
                Parameters param=new Parameters();
                param.P0=conf.MachID;
                param.P1=cmd.SetStatusKey;
                OutValue session = new OutValue();
                OutValue out = new OutValue();
                LogUtils.WriteDebugLog("调用:"+conf.DealProcess+"的:SetQryStatus设置状态");
                String setStatusRet=WebGetData.GetData(BaseDeal.WebServicAddress,conf.DealProcess,"SetQryStatus",param,session,out);
                LogUtils.WriteDebugLog("设置状态返回:"+setStatusRet);
            }
        }
        //删除文件和目录
        else if(cmd.Cmd.equals("RM"))
        {
            LogUtils.WriteDebugLog("删除:"+cmd.P0);
            JRTMachineImpl.Util.DirUtil.DeleteFileOrDir(new File(cmd.P0));
        }
        //拷贝文件
        else if(cmd.Cmd.equals("CP"))
        {
            Path source = Paths.get(cmd.P0);
            Path target = Paths.get(cmd.P1);
            LogUtils.WriteDebugLog("拷贝:"+cmd.P0+"到:"+cmd.P1);
            Files.copy(source,target, StandardCopyOption.REPLACE_EXISTING);
        }
        //得到图片
        else if(cmd.Cmd.equals("GETIMAGE"))
        {
            FileService fileService=new FileService();
            Parameters param=new Parameters();
            param.P0=conf.MachID;
            OutValue session = new OutValue();
            OutValue out = new OutValue();
            LogUtils.WriteDebugLog("调用:"+conf.DealProcess+"的:GetFileService得到文件服务路径");
            String fileServerPath=WebGetData.GetData(BaseDeal.WebServicAddress,conf.DealProcess,"GetFileService",param,session,out);
            LogUtils.WriteDebugLog("文件服务路径:"+fileServerPath);
            File fi=new File(cmd.P2);
            if(fi.exists())
            {
                String [] arr=fileServerPath.split("\\^");
                LogUtils.WriteDebugLog("准备上传:"+cmd.P2+",新名称:"+cmd.P3+",相对路径:"+arr[1]+"到:"+arr[0]);
                String ret=fileService.Upload(arr[0],cmd.P2,cmd.P3,arr[1]);
                LogUtils.WriteDebugLog("上传返回:"+ret);
                if(ret.isEmpty())
                {
                    param=new Parameters();
                    param.P0=conf.MachID;
                    param.P1=cmd.P0;
                    param.P2=cmd.P1;
                    param.P3=fi.getName();
                    param.P4=fi.getAbsolutePath();
                    LogUtils.WriteDebugLog("调用:"+conf.DealProcess+"的:SaveImage保存文件路径");
                    String saveRet=WebGetData.GetData(BaseDeal.WebServicAddress,conf.DealProcess,"SaveImage",param,session,out);
                    LogUtils.WriteDebugLog("保存文件返回:"+saveRet);
                }
                else
                {
                    LogUtils.WriteDebugLog("上传文件服务失败:"+ret);
                }
            }
            else
            {
                LogUtils.WriteDebugLog("文件:"+cmd.P2+"不存在");
            }
        }
        return "";
    }
}

定时上传执行命令
在这里插入图片描述

保存返回执行命令
在这里插入图片描述

仪器业务处理示例

import JRT.Core.Dto.CmdDto;
import JRT.Core.Dto.OutValue;
import JRT.Core.Util.LogUtils;
import JRT.Core.Util.MakeCmdUtil;
import JRT.Core.Util.TimeParser;
import JRTBLLBase.BaseHttpHandlerNoSession;
import JRTBLLBase.Helper;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 监听模式的仪器测试
 */
public class JRTMachineTest extends BaseHttpHandlerNoSession {
    /**
     * 记录已经上传的数据
     */
    private static HashMap<String, Boolean> hasUpData = new HashMap();

    /**
     * 保存仪器数据
     *
     * @param mi        仪器主键
     * @param data      数据
     * @param epis      流水号
     * @param fileName  文件全名
     * @param DBColName 数据库列名
     * @param index     序号,-1为最后一行
     * @param P6
     * @param P7
     * @param P8
     * @param P9
     * @param P10
     * @param P11
     * @param P12
     * @param P13
     * @param Session
     * @param Output
     * @return
     * @throws Exception
     */
    public String SaveData(String mi, String data, String epis, String fileName, String DBColName, String index, String P6, String P7, String P8, String P9, String P10, String P11, String P12, String P13, OutValue Session, OutValue Output) throws Exception {
        //先写Log测试
        LogUtils.WriteDebugLog("mi:" + mi + ",data:" + data + ",epis:" + epis + ",fileName:" + fileName + ",DBColName:" + DBColName);
        //返回的数据
        List<CmdDto> cmdList = new ArrayList<>();
        MakeCmdUtil.AddGetImageCmd(cmdList, "998", "P2", "D:\\OUT\\2.bmp", "");
        return Helper.Object2Json(cmdList);
    }

    /**
     * 得到文件服务地址供接口上传图片
     *
     * @param mi
     * @param P1
     * @param P2
     * @param P3
     * @param P4
     * @param P5
     * @param P6
     * @param P7
     * @param P8
     * @param P9
     * @param P10
     * @param P11
     * @param P12
     * @param P13
     * @param Session
     * @param Output
     * @return
     * @throws Exception
     */
    public String GetFileService(String mi, String P1, String P2, String P3, String P4, String P5, String P6, String P7, String P8, String P9, String P10, String P11, String P12, String P13, OutValue Session, OutValue Output) throws Exception {
        //返回文件服务路径
        return "http://localhost:8080/JRTWeb/FileService/^/zlzmach/" + TimeParser.GetNowDate();
    }

    /**
     * 保存文件到数据库
     *
     * @param mi
     * @param epis
     * @param ImageClass
     * @param fileName
     * @param FullName
     * @param P5
     * @param P6
     * @param P7
     * @param P8
     * @param P9
     * @param P10
     * @param P11
     * @param P12
     * @param P13
     * @param Session
     * @param Output
     * @return
     * @throws Exception
     */
    public String SaveImage(String mi, String epis, String ImageClass, String fileName, String FullName, String P5, String P6, String P7, String P8, String P9, String P10, String P11, String P12, String P13, OutValue Session, OutValue Output) throws Exception {
        //先写Log测试
        LogUtils.WriteDebugLog("mi:" + mi + ",epis:" + epis + ",ImageClass:" + ImageClass + ",fileName:" + fileName + ",FullName:" + FullName);
        return "";
    }

    /**
     * 查询要上传的指令
     *
     * @param mi      仪器
     * @param P1
     * @param P2
     * @param P3
     * @param P4
     * @param P5
     * @param P6
     * @param P7
     * @param P8
     * @param P9
     * @param P10
     * @param P11
     * @param P12
     * @param P13
     * @param Session
     * @param Output
     * @return
     * @throws Exception
     */
    public String QryUpdata(String mi, String P1, String P2, String P3, String P4, String P5, String P6, String P7, String P8, String P9, String P10, String P11, String P12, String P13, OutValue Session, OutValue Output) throws Exception {
        //先写Log测试
        LogUtils.WriteDebugLog("mi:" + mi + ",调用上传查询");
        //返回的数据
        List<CmdDto> cmdList = new ArrayList<>();
        //读文本仪器
        if (mi.equals("1")) {
            if (!hasUpData.containsKey("0947809")) {
                MakeCmdUtil.AddTxtCmd(cmdList, "0947809", "D:\\OUT\\uptxt.dttmp", "这是JRT上传的文本串", "0", "");
                MakeCmdUtil.AddCPCmd(cmdList, "D:\\OUT\\uptxt.dttmp", "D:\\OUT\\uptxt.dt");
                MakeCmdUtil.AddRMCmd(cmdList, "D:\\OUT\\uptxt.dttmp");
            }
        }
        //读数据库仪器
        else if (mi.equals("2")) {
            if (!hasUpData.containsKey("0947810")) {
                MakeCmdUtil.AddSqlCmd(cmdList, "0947810", "insert into DBUpHistory(DataCode,KeyData,DateStr,Data) values('0947809','1','这是JRT用SQL插入的数据','1')");
            }
        }
        MakeCmdUtil.AddGetImageCmd(cmdList, "999", "P1", "D:\\OUT\\1.bmp", "");
        return Helper.Object2Json(cmdList);
    }

    /**
     * 设置上传指令执行状态
     *
     * @param mi           仪器
     * @param setStatusKey 设置状态的主键
     * @param P2
     * @param P3
     * @param P4
     * @param P5
     * @param P6
     * @param P7
     * @param P8
     * @param P9
     * @param P10
     * @param P11
     * @param P12
     * @param P13
     * @param Session
     * @param Output
     * @return
     * @throws Exception
     */
    public String SetQryStatus(String mi, String setStatusKey, String P2, String P3, String P4, String P5, String P6, String P7, String P8, String P9, String P10, String P11, String P12, String P13, OutValue Session, OutValue Output) throws Exception {
        //先写Log测试
        LogUtils.WriteDebugLog("mi:" + mi + ",setStatusKey:" + setStatusKey + "设置状态");
        hasUpData.put(setStatusKey, true);
        return "";
    }
}

这样,一套超越以前设计的监听架构就出来了。JRT拥有Web、打印导出Client、JRT浏览器、JRTMachine、jrt运维命令、齐全了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件安全测试报告如何编写?权威的安全测试报告如何获取?

软件安全测试报告是一份详尽的文件&#xff0c;它主要通过对软件进行全面、系统的测试&#xff0c;评估软件的安全性&#xff0c;并在测试结束后起草编写的报告。该报告能清晰地展示出软件的各项安全风险以及潜在威胁&#xff0c;为用户提供安全方面的决策依据&#xff0c;并帮…

PMP考试成绩如何查询?

PMP考试成绩已经陆续出来了&#xff0c;出成绩时间大概一周左右&#xff0c;没收到的别着急&#xff0c;先把如何查询成绩路径弄清楚。 【如何查询成绩】 1、输入网址&#xff08;PMI官网&#xff0c;不知道网址的私戳&#xff09;&#xff0c;点击 Log In 如果忘记 PMI 的账…

如何在Windows系统上部署docker

上次在Windows系统上部署成功Ubuntu系统&#xff0c;这次准备在Windows上部署docker desktop应用 这个应用软件类似于虚拟机&#xff0c;可以在该应用软件上部署多个镜像容器。其最直观的表现就是可以借用Windows和Ubuntu终端来访问docker“模拟的系统”。 Docker简介 Docke…

JAVA建造者模式详解

建造者模式 1 建造者模式介绍 建造者模式 (builder pattern), 也被称为生成器模式 , 是一种创建型设计模式. 定义: 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 **建造者模式要解决的问题 ** 建造者模式可以将部件和其组装过程分开…

cesium系列篇:Entity vs Primitive 源码解析(从Entity到Primitive)02

上篇文章中&#xff0c;我们介绍了使用viewer.entities.add添加entity之后的信号传递以及最后entity对象被传递到GeometryVisualizer&#xff1b; 这篇文章&#xff0c;我们则介绍如何在逐帧渲染的过程中根据GeometryVisualizer中的entity对象创建相应的primitive 这是下文中…

正点原子--STM32通用定时器学习笔记(2)

1. 通用定时器输入捕获部分框图介绍 捕获/比较通道的输入部分&#xff08;通道1&#xff09; 采样频率&#xff1a;控制寄存器 1(TIMx_CR1)的CKD[1:0] ⬇⬇⬇​​​​​​​滤波方式选择&#xff1a; 捕获/ 比较模式寄存器 1(TIMx_CCMR1)的输入捕获部分⬇​​​​​​​⬇​…

机器人工具箱学习(一)

一、机器人工具箱介绍 机器人工具箱是由来自昆士兰科技大学的教授Peter Corke开发的&#xff0c;被广泛用于机器人进行仿真&#xff08;主要是串联机器人&#xff09;。该工具箱支持机器人一些基本算法的功能&#xff0c;例如三维坐标中的方向表示&#xff0c;运动学、动力学模…

pwn旅行之[WUSTCTF 2020]getshell2(一些小知识)

题目分析1 首先打开这个题目的链接的时候&#xff0c;看到了ret2syscall&#xff0c;以为是一个纯正的syscall的题&#xff0c;结果&#xff0c;做的时候发现这个题的危险函数限制的字符串个数不足以写入syscall需要的所有地址&#xff0c;所以&#xff0c;这里参考dalao们的方…

时光峰峦文物璀璨,预防性保护筑安全

在璀璨的历史长河中&#xff0c;珍贵文物如同时间的印记&#xff0c;承载着过往的辉煌。《人文山水时光峰峦——多彩贵州历史文化展》便是这样一场文化的盛宴&#xff0c;汇聚了众多首次露面的宝藏。然而&#xff0c;文物的保存对环境要求极为苛刻&#xff0c;温湿度波动都可能…

python coding with ChatGPT 打卡第18天| 二叉树:从中序与后序遍历序列构造二叉树、最大二叉树

相关推荐 python coding with ChatGPT 打卡第12天| 二叉树&#xff1a;理论基础 python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历 python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历 python coding with ChatGPT 打卡第15天| 二叉树&#xff1a;翻转…

clickhouse计算前后两点间经纬度距离

问题 计算如图所示前后两点经纬度的距离&#xff1f; 方法 1、用开窗函数将如图所示数据下移一行 selectlongitude lon1,latitude lat1,min(longitude) over(order by time1 asc rows between 1 PRECEDING and 1 PRECEDING) lon2,min(latitude) over(order by time1 asc row…

CentOS 7安装Nodejs

说明&#xff1a;本文介绍如何在云服务器上CentOS 7操作系统上安装Nodejs。以及安装过程中遇到的问题。 下载压缩包&解压 首先&#xff0c;先去官网下载Linux版本的Node。 将下载下来的压缩包&#xff0c;上传到云服务器上&#xff0c;解压。配置环境变量。 &#xff08…

Stable Diffusion 模型下载:Schematics(原理图)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 “Schematics”是一个非常个性化的LORA&#xff0c;我的目标是创建一个整体风格&#xff0c;但主要面向某些风格美学&#xff0c;因此它可以用于人物、物体、风景等…

CGAL-3D 凸包算法

3D 凸包算法 一、概述二、静态凸包构造1. Traits 特征类2. 极端点3. 半空间相交4. 凸性检验 三、动态凸包构造四、性能 一、概述 一个点集 S∈R3 是凸的&#xff0c;如果对于任意两点 p 和 q 在集合中&#xff0c;具有端点的线段 p 和 q 包含在 S。集合的凸包 P 包含点集 S 的最…

Leetcode21:合并两个有序链表

一、题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[]输入&#…

ubuntu篇---ubuntu安装python3.9

ubuntu篇—ubuntu安装python3.9 在ubuntu上安装Python有两种方法:在线安装和源码编译安装。 方法1&#xff1a;使用apt在线安装 1.更新软件包列表并安装必备组件&#xff1a; $ sudo apt update $ sudo apt install software-properties-common2.将Deadsnakes PPA添加到系统…

ORM模型类

模型 创建两个表 创建模型类 from django.db import models# Create your models here. class BookInfo(models.Model):name models.CharField(max_length10, uniqueTrue) # 书名pub_date models.DateField(nullTrue) # 发布时间read_count models.IntegerField(default…

TCP 粘包/拆包

文章目录 概述粘包拆包发生场景解决TCP粘包和拆包问题的常见方法Netty对粘包和拆包问题的处理小结 概述 TCP的粘包和拆包问题往往出现在基于TCP协议的通讯中&#xff0c;比如RPC框架、Netty等 TCP 粘包/拆包 就是你基于 TCP 发送数据的时候&#xff0c;出现了多个字符串“粘”…

查看网络配置的ipconfig命令

ipconfig是调试计算机网络的常用命令&#xff0c;通常大家使用它显示计算机中网络适配器的IP地址、子网掩码及默认网关。其实这只是ipconfig的不带参数用法&#xff0c;而它的带参数用法&#xff0c;在网络中应用也是相当不错的。 1.语法 ipconfig [/all] [/renew[Adapter]] [/…

(四)elasticsearch 源码之索引流程分析

https://www.cnblogs.com/darcy-yuan/p/17024341.html 1.概览 前面我们讨论了es是如何启动&#xff0c;本文研究下es是如何索引文档的。 下面是启动流程图&#xff0c;我们按照流程图的顺序依次描述。 其中主要类的关系如下: 2. 索引流程 (primary) 我们用postman发送请求&…