13_cgi

news2025/1/19 23:18:38

知识点1【cgi实现计算器案例】

2、GET的同步方式:

index.html

<html>
    <head>
        <title>table</title>
        <meta charset="UTF-8">
        <!--这是描述 js中的函数来之哪个js文件-->
        <script type="text/javascript" src="00_js.js"></script>
    </head>
    <body>
       data1:<input type="text" id="data1">
       <br>
       data2:<input type="text" id="data2">
       <br>
       结果:<label id="ret"></label>
       <br>
       <input type="button" value="add" onclick="calc_fun(1);">
       <input type="button" value="sub" onclick="calc_fun(0);">
       
    </body>
</html>

00_js.js

function getXMLHttpRequest()
{
    var xmlhttp = null;
    if (window.XMLHttpRequest)//自动检测当前浏览器的版本,如果是IE5.0以上的高版本的浏览器
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();//创建请求对象
    }
    else如果浏览器是底版本的
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");//创建请求对象
    }
    return xmlhttp;//返回请求对象
}
function calc_fun(arg)
{
    //1、获取网页输入框的数据data1 data2
    var data1 = document.getElementById("data1").value;
    var data2 = document.getElementById("data2").value;
    //判断data1 data2是否合法
    if(isNaN(data1) || isNaN(data2) )
    {
        document.getElementById("data1").value="";
        document.getElementById("data2").value="";
        alert("请输入有效的数值");
        return;
    }

    //组包请求报文url "/cgi-bin/calc.cgi?10+20"  "/cgi-bin/calc.cgi?10-20"
    var url="/cgi-bin/calc.cgi?";
    url +=data1;
    if(arg == "1")//加
    {
        url +="+";
    }
    else if(arg == "0")//减
    {
        url +="-";
    }
    url+=data2;
    alert("url:"+url);

    //创建一个xmlHttpRequest对象
    var xmlHttp = null;
    xmlHttp =  getXMLHttpRequest();

    //open
    xmlHttp.open("GET", url, false);//false表示同步

    //send
    xmlHttp.send();//将请求url发送给服务器

    //等待服务器的应答(同步)
    if(xmlHttp.readyState == 4 && xmlHttp.status==200)
    {
        //获取服务器的结果
        var ret = xmlHttp.responseText;
        //将ret赋值给label
        document.getElementById("ret").innerHTML=ret;
    }
}

04_calc.c

#include<stdio.h>
#include<stdlib.h>
int main()
{
    //传输HTML 文本第一行输出的内容必须是"content-type:text/html\n\n"
    printf("content-type:text/html\n\n");

    //获取服务器的数据 GET方式 QUERY_STRING
    char *data = getenv("QUERY_STRING");//data-->"10+20"
    
    //解析data
    int data1=0,data2=0;
    char ch = 0;
    sscanf(data,"%d%c%d", &data1, &ch, &data2);
    if(ch == '+')//加法运算
    {
        //将处理的结果 发送给服务器
        printf("%d\n", data1+data2);
    }
    else if(ch == '-')//减法运算
    {
        //将处理的结果 发送给服务器
        printf("%d\n", data1-data2);
    }

    return 0;
}

运行结果:

3、POST的异步方式

index.html

<html>
    <head>
        <title>table</title>
        <meta charset="UTF-8">
        <!--这是描述 js中的函数来之哪个js文件-->
        <script type="text/javascript" src="01_js.js"></script>
    </head>
    <body>
       data1:<input type="text" id="data1">
       <br>
       data2:<input type="text" id="data2">
       <br>
       POST结果:<label id="ret"></label>
       <br>
       <input type="button" value="add" onclick="calc_fun(1);">
       <input type="button" value="sub" onclick="calc_fun(0);">
       
    </body>
</html>

 01_js.js

function getXMLHttpRequest()
{
    var xmlhttp = null;
    if (window.XMLHttpRequest)//自动检测当前浏览器的版本,如果是IE5.0以上的高版本的浏览器
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();//创建请求对象
    }
    else如果浏览器是底版本的
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");//创建请求对象
    }
    return xmlhttp;//返回请求对象
}
function calc_fun(arg)
{
    //1、获取网页输入框的数据data1 data2
    var data1 = document.getElementById("data1").value;
    var data2 = document.getElementById("data2").value;
    //判断data1 data2是否合法
    if(isNaN(data1) || isNaN(data2) )
    {
        document.getElementById("data1").value="";
        document.getElementById("data2").value="";
        alert("请输入有效的数值");
        return;
    }

    //POST数据是密文传输 不能将数据放入?后面
    var url="/cgi-bin/calc.cgi";

    //将发送给服务器的数据data
    var data="";
    data +=data1;
    if(arg == "1")//加
    {
        data +="+";
    }
    else if(arg == "0")//减
    {
        data +="-";
    }
    data+=data2;
    alert("data:"+data);

    //创建一个xmlHttpRequest对象
    var xmlHttp = null;
    xmlHttp =  getXMLHttpRequest();

    //设置回调函数
    xmlHttp.onreadystatechange=function(){
        if(xmlHttp.readyState == 4 && xmlHttp.status==200)
        {
            //获取服务器的结果
            var ret = xmlHttp.responseText;
            //将ret赋值给label
            document.getElementById("ret").innerHTML=ret;
        }
    }

    //open POST
    xmlHttp.open("POST", url, true);

    //POST send 由于url没有数据 所以只能用send将data发送出去
    xmlHttp.send(data);//将data发送给服务器

}

05_post.c

#include<stdio.h>
#include<stdlib.h>
int main()
{
    //传输HTML 文本第一行输出的内容必须是"content-type:text/html\n\n"
    printf("content-type:text/html\n\n");

    //获取服务器的数据 POST方式 QUERY_STRING
    //1、首先的到数据的长度
    char *len = getenv("CONTENT_LENGTH");

    //2、根据长度 从标准输入设备 获取内容
    char data[128]="";
    fgets(data,atoi(len)+1, stdin);//"10+20"
    
    //解析data
    int data1=0,data2=0;
    char ch = 0;
    sscanf(data,"%d%c%d", &data1, &ch, &data2);
    if(ch == '+')//加法运算
    {
        //将处理的结果 发送给服务器
        printf("%d\n", data1+data2);
    }
    else if(ch == '-')//减法运算
    {
        //将处理的结果 发送给服务器
        printf("%d\n", data1-data2);
    }

    return 0;
}

运行结果:

4、POST的同步方式

index.html

<html>
    <head>
        <title>table</title>
        <meta charset="UTF-8">
        <!--这是描述 js中的函数来之哪个js文件-->
        <script type="text/javascript" src="02_js.js"></script>
    </head>
    <body>
       data1:<input type="text" id="data1">
       <br>
       data2:<input type="text" id="data2">
       <br>
       POST同步结果:<label id="ret"></label>
       <br>
       <input type="button" value="add" onclick="calc_fun(1);">
       <input type="button" value="sub" onclick="calc_fun(0);">
       
    </body>
</html>

 02_js.js

function getXMLHttpRequest()
{
    var xmlhttp = null;
    if (window.XMLHttpRequest)//自动检测当前浏览器的版本,如果是IE5.0以上的高版本的浏览器
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();//创建请求对象
    }
    else如果浏览器是底版本的
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");//创建请求对象
    }
    return xmlhttp;//返回请求对象
}
function calc_fun(arg)
{
    //1、获取网页输入框的数据data1 data2
    var data1 = document.getElementById("data1").value;
    var data2 = document.getElementById("data2").value;
    //判断data1 data2是否合法
    if(isNaN(data1) || isNaN(data2) )
    {
        document.getElementById("data1").value="";
        document.getElementById("data2").value="";
        alert("请输入有效的数值");
        return;
    }

    //POST数据是密文传输 不能将数据放入?后面
    var url="/cgi-bin/calc.cgi";

    //将发送给服务器的数据data
    var data="";
    data +=data1;
    if(arg == "1")//加
    {
        data +="+";
    }
    else if(arg == "0")//减
    {
        data +="-";
    }
    data+=data2;
    alert("data:"+data);

    //创建一个xmlHttpRequest对象
    var xmlHttp = null;
    xmlHttp =  getXMLHttpRequest();

    //open POST
    xmlHttp.open("POST", url, false);//false 同步

    //POST send 由于url没有数据 所以只能用send将data发送出去
    xmlHttp.send(data);//将data发送给服务器

    if(xmlHttp.readyState == 4 && xmlHttp.status==200)
    {
        //获取服务器的结果
        var ret = xmlHttp.responseText;
        //将ret赋值给label
        document.getElementById("ret").innerHTML=ret;
    }
}

05_post.c

#include<stdio.h>
#include<stdlib.h>
int main()
{
    //传输HTML 文本第一行输出的内容必须是"content-type:text/html\n\n"
    printf("content-type:text/html\n\n");

    //获取服务器的数据 POST方式 QUERY_STRING
    //1、首先的到数据的长度
    char *len = getenv("CONTENT_LENGTH");

    //2、根据长度 从标准输入设备 获取内容
    char data[128]="";
    fgets(data,atoi(len)+1, stdin);//"10+20"
    
    //解析data
    int data1=0,data2=0;
    char ch = 0;
    sscanf(data,"%d%c%d", &data1, &ch, &data2);
    if(ch == '+')//加法运算
    {
        //将处理的结果 发送给服务器
        printf("%d\n", data1+data2);
    }
    else if(ch == '-')//减法运算
    {
        //将处理的结果 发送给服务器
        printf("%d\n", data1-data2);
    }

    return 0;
}

运行结果:

知识点2【web点灯】

了解led原理图:

点亮灯 GPIO为低电平:

GPIOA 32管脚 GPIOB 32管脚

GPIOC7--->gpio71

GPIOC11--->gpio75

GPIOC12--->gpio76

开发板上的程序 必须使用交叉编译器:arm-linux-gcc

index.html

<html>
    <head>
        <title>table</title>
        <meta charset="UTF-8">
        <!--这是描述 js中的函数来之哪个js文件-->
        <script type="text/javascript" src="03_js.js"></script>
    </head>
    <body>
       <img id="led1" src="./image/led_off.png"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
       <img id="led2" src="./image/led_off.png">   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
       <img id="led3" src="./image/led_off.png">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
       <br>
       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
       <input type="button" value="开关" id="btn1" onclick="deal_led('led1');">
       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
       <input type="button" value="开关" id="btn2" onclick="deal_led('led2');">
       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
       <input type="button" value="开关" id="btn3" onclick="deal_led('led3');">
       
    </body>
</html>

 03_js.js

function getXMLHttpRequest()
{
    var xmlhttp = null;
    if (window.XMLHttpRequest)//自动检测当前浏览器的版本,如果是IE5.0以上的高版本的浏览器
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();//创建请求对象
    }
    else如果浏览器是底版本的
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");//创建请求对象
    }
    return xmlhttp;//返回请求对象
}
function deal_led(arg)//arg就是img的id led1  led2 led3
{  
    var url="/cgi-bin/led.cgi?";
    url+=arg;

    var path = document.getElementById(arg).src;
    if(path.indexOf("led_off",0) != -1)
    {
        document.getElementById(arg).src = "./image/led_on.png";
        url+=":1";
    }
    else if(path.indexOf("led_on",0) != -1)
    {
        document.getElementById(arg).src = "./image/led_off.png";
        url+=":0";
    }

    //创建xmlhttp对象
    var xmlhttp = getXMLHttpRequest();
    //设置回调函数
    xmlhttp.onreadystatechange=function(){
        //alert("xmlHttp.readyState="+xmlHttp.readyState,+",xmlHttp.status="+xmlHttp.status);
        if(xmlhttp.readyState == 4 && xmlhttp.status==200)
        {
            //获取服务器的结果
            var ret = xmlhttp.responseText;
            alert("ret="+ret);
        }
    }

    //open
    xmlhttp.open("GET",url, true);//url="/cgi-bin/led.cgi?led2:1"

    //send
    xmlhttp.send();
}

 led.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void led_init()
{
    //判断GPIO是否在系统中打开
    if(access("/sys/class/gpio/gpio71/value", F_OK))//不存在
    {
        system("echo 71 > /sys/class/gpio/export");//到处IO口
    }
    if(access("/sys/class/gpio/gpio75/value", F_OK))//不存在
    {
        system("echo 75 > /sys/class/gpio/export");//到处IO口
    }
    if(access("/sys/class/gpio/gpio76/value", F_OK))//不存在
    {
        system("echo 76 > /sys/class/gpio/export");//到处IO口
    }

    //设置IO的方向(输出 输入)
    system("echo out > /sys/class/gpio/gpio71/direction");
    system("echo out > /sys/class/gpio/gpio75/direction");
    system("echo out > /sys/class/gpio/gpio76/direction");

    //将所有的灯灭掉
    system("echo 1 > /sys/class/gpio/gpio71/value");
    system("echo 1 > /sys/class/gpio/gpio75/value");
    system("echo 1 > /sys/class/gpio/gpio76/value");
}
void set_led(int led, int on_off)
{
    //判断哪一个灯
    if(led == 1)
    {
        //判断开关状态
        if(on_off == 1)//亮
        {
            //io口 输出低电平
            system("echo 0 > /sys/class/gpio/gpio71/value");
        }
        else if(on_off == 0)//灭
        {
            system("echo 1 > /sys/class/gpio/gpio71/value");
        }
    }
    else if(led == 2)
    {
        //判断开关状态
        if(on_off == 1)//亮
        {
            //io口 输出低电平
            system("echo 0 > /sys/class/gpio/gpio75/value");
        }
        else if(on_off == 0)//灭
        {
            system("echo 1 > /sys/class/gpio/gpio75/value");
        }
    }
    else if(led == 3)
    {
        //判断开关状态
        if(on_off == 1)//亮
        {
            //io口 输出低电平
            system("echo 0 > /sys/class/gpio/gpio76/value");
        }
        else if(on_off == 0)//灭
        {
            system("echo 1 > /sys/class/gpio/gpio76/value");
        }
    }
}
int main()
{
    //传输HTML 文本第一行输出的内容必须是"content-type:text/html\n\n"
    printf("content-type:text/html\n\n");

    //获取服务器的数据 GET方式 QUERY_STRING
    char *data = getenv("QUERY_STRING");//data-->"10+20"
    
    //解析data="led2:1"
    int led =0, on_off = 0;
    sscanf(data,"led%d:%d", &led, &on_off);

    //初始化设备
    led_init();

    //设置灯的状态
    set_led(led, on_off);
    
    return 0;
}

知识点3【路由器项目】

不同网段通信的桥梁

将我们的ubuntu作为路由器。

 

//ubuntu里
//1、创建一个原始套接字 用来收发数据
int sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
//2、创建一个线程 用来接受网络数据recvfrom
unsigned char buf[1500]="";
int len = recvfrom(sockfd, buf);
3、判断buf中的目的mac地址 和 路由器的哪块网卡的mac相同 就表明哪块网卡收到
4、buf中帧类型0x0800提取目的IP,如果目的IP和路由器的某块网卡是同一个网段,
数据就从该网卡出去(src_mac该网卡的mac 目的mac为目的主机mac)
5、buf中帧类型0x0800提取目的IP,入宫目的IP和路由器的所有网卡都不同一个网段,
查看路由表 寻找下一跳 查看路由器的哪块网卡 和下一跳同一个网段,还数据就从
改网卡 发送到下一跳(src_mac该网卡的mac 目的mac为下一跳mac)
注意:以上目的主机或者下一跳的mac 如果没有记录记得用arp获取 并存入arp表中

2、和路由器交互(终端、网页)(创新)

 3、win10配置(静态的):只需将网关设置eth0的IP

4、手机设置(静态的):ip:192.168.1.3 网关是192.168.1.2

5、虚拟的设置:

添加网卡:

 

 

设置成桥接模式:

 

 给eth0设置指定的IP

 添加新的连接:

 

 配置成功:

基本功能完成:

如果win10 ping通 手机

手机 ping通 win10

创新:

1、多网卡 3个

2、防火墙不转发

3、动态获取ip mac

补充思路:

unsigned char phone_mac[]={};
unsigned char phone_ip[]={};
unsigned char win_mac[]={};
unsigned char win_ip[]={};
int main()
{
	int sockfd = sockfd(原始套接字);
	
	//获取网络接口
	getinterface();
	
	while(1)
	{
		
		int len = recvfrom(sokcfd, buf,sizeof(buf),0,NULL,NULL);
		
		//转发ip报文
		unsigned short mac_type = ntohs(*(unsigned short *)(buf+12));
		if(mac_type == 0x0800)//转发
		{
			//判断 buf中的目的IP 和 路由器的哪块网卡同一个网段
			unsigned char *dst_ip =  buf+14+16;
			int i=0;
			for(i=0;i<interface_num;i++)
			{
				if(memcmp(dst_ip, net_interface[i].ip, 3) == 0 && \
				memcmp(dst_ip, net_interface[i].ip, 4) != 0)
				{
					//修改buf中源mac未路由器的接口mac
					memcpy(buf+6, net_interface[i].mac, 6);
					
					//修改目的mac
					#if 0
					//固定
					if(memcmp(dst_ip, phone_ip, 4) == 0)
						memcpy(buf, phone_mac, 6);
					else if(memcmp(dst_ip, win_ip, 4) == 0)
						memcpy(buf, win_mac, 6);
					#else
					//从arp表中查找dst_ip对应的mac
					unsigned char *dst_mac = find_from_arp();
					if(dst_mac  == NULL)
					{
						//发送arp请求
						break;
					}
					else if(dst_mac != NULL)
					{
						memcpy(buf, dst_mac, 6);
					}
					#endif
					
					my_sendto(sockfd, net_interface[i].name, buf,len, );
					break;
				}
			}
			
			//目的ip和路由器的所有接口都不在同一个网段
			if(i == interface_num)
			{
				//分析路由器表
			}
			
		}
		else if(mac_type == 0x0806)//arp 应答  更新arp表
		{
		
		
		}
	}
	
}

 

 

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

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

相关文章

Kafka基础与核心概念

本文&#xff0c;我们将试图回答什么是apache kafka。 kafka是一个分布式流平台或者分布式消息提交日志 分布式 Kafka 由一个或多个节点组成的工作集群&#xff0c;这些节点可以位于不同的数据中心&#xff0c;我们可以在 Kafka 集群的不同节点之间分布数据/负载&#xff0c;并…

【学习笔记47】开关变量和拖拽效果

一、开关案例 <button>点击获取验证码</button>&#xff08;一&#xff09;基本功能的实现 // 获取标签对象const oBtn document.querySelector(button);// 给按钮添加点击事件oBtn.addEventListener(click, function () {// 定义变量 用于获取验证码let count 5…

javaSE- 方法的使用

一、方法的基本用法 方法就是一个代码片段. 类似于 C 语言中的 “函数”. 方法存在的意义(不要背, 重在体会): 是能够模块化的组织代码(当代码规模比较复杂的时候).做到代码被重复使用, 一份代码可以在多个位置使用.让代码更好理解更简单.直接调用现有方法开发, 不必重复造轮…

04_SpringBoot整合Mybatis

文章目录SpringBoot整合Mybatis0x01_创建项目导入依赖0x02_编写配置文件0x03_编写功能代码SpringBoot整合Mybatis 欢迎关注公众号“小东方不败” 0x01_创建项目导入依赖 创建项目&#xff1a; 目前稳定的最新版本是2.7.5,勾选两个依赖&#xff1a;Lombok和Spring Web 然后需…

Nodejs -- Express 路由原理及设置模块化路由

文章目录1. 路由的概念1.1 什么是路由1.2 显示生活中的路由1.3 Express中的路由1.4 Express中路由的例子1.5 路由的匹配过程2 路由的使用2.1 最简单的用法2.2 模块化路由2.3 为路由模块添加统一前缀1. 路由的概念 1.1 什么是路由 广义上来讲&#xff0c;路由就是映射关系 1.…

yarn : 无法加载文件 C:\Users\sunlight\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本。

问题&#xff1a; yarn安装好了&#xff0c;vscode报错 报错问题&#xff1a;yarn 无法加载文件 C:\Users\sunlight\AppData\Roaming\npm\yarn.ps1&#xff0c;因为在此系统上禁止运行脚本。 具体问题&#xff1a;cmd&#xff08;管理员运行&#xff09;中安装好了yarn &…

Angular使用管道和指令进行多语言切换

工作中经常遇到需要进行多种语言切换的项目。本文记录了一种在Angular页面中通过使用管道和自定义指令实现的语言切换方案。 1、实现效果 页面显示文字根据选择的语言自动进行翻译切换&#xff0c;如下图所示&#xff1a; 此时&#xff0c;页面模板的字符串全部按照管道格式书…

2023年IB生物有什么变化?

今天我们详细了解下2023年IBDP生物新课程内容、考试评估、内容、技能发展、科学本质等详细内容。IBDP生物新课程概述 IBDP新生物课程将于2023年2月开课&#xff0c;2023年8月首次授课&#xff0c;2025年5月进行首次考试。新课程反映社会变革&#xff0c;更加关注技能和概念、背…

【iMessage苹果推群发】苹果相册推archive到appstore开发证书(Development certificate)

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

DCHP通讯协议

从通讯TCP/IP的构成传输&#xff0c;到IP地址的分类&#xff0c;再到局域网与广域网的设置。 通讯协议的构成概述IPDHCP-设定动态IPDNS数据的流动广域网 网关局域网 交换机NAT桥接模式实操概述 前景知识&#xff1a;虚拟机与工艺库管理 扩展&#xff1a;NAT模式的实操。 1、T…

yolov5量化注意事项

&#xff08;1&#xff09;使用onnxsim 0.4.1版本、ort版本1.13.1 否则使用--dynamic True时所生成的onnx就会乱掉。 &#xff08;2&#xff09;利用trtexec生成engine 所使用的命令如下&#xff1a; trtexec.exe --onnxyolov5n_ptq_detect_dynamic.onnx --saveEngineptq_int…

小白学流程引擎-FLowable(二) — 从零搭建自己的FLowable服务 — 搭建流程服务-FLowable的新手指南

一、介绍 纵览Gitee搜索Flowable开源项目&#xff0c;大多都是已开发好的项目&#xff0c;而笔者从零开始搭建属于自己的Flowable引擎&#xff0c;并且是可以拿到生产上使用的。 二、软件架构 Springboot Flowable modeler idm Mysql SrpingBoot version&#xff1a;2.7…

牛客网verilog刷题知识点盘点(75道题的版本)

牛客网verilog刷题知识点盘点(75道题的版本) 还有几个坑没填 任务和函数 1.任务和函数必须在模块内定义&#xff0c;其作用范围仅适用于该模块&#xff0c;可以在模块内多次调用。 2.任务和函数中可以声明局部变量&#xff0c;如寄存器&#xff0c;时间&#xff0c;整数&…

企业云工如何高效居家协同办公?试试这个方法

近日的疫情反扑让全国各地的防疫压力增加&#xff0c;并且甚至很多地方不知道的啥时候就要被居家隔离&#xff0c;所以在新的防疫背景下&#xff0c;居家就顺理成章地成为一种常态化的学习和工作方式。 现在越来越多公司也将日常业务搬到了线上&#xff0c;以保证疫情期间公司的…

基于ssm的旅游网站的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

vue——路由

目录 一、介绍路由 1、路由是什么 Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成&#xff0c;让用 Vue.js 构建单页应用变得轻而易举。 2、为什么要使用路由 3、主要用途 二、安装路由 1、安装命令 2、配置文件 3、在main.js 中进行挂载 三、案例展示 …

Linux服务器配置与管理(基于Centos7.2)任务目标(五)

文章目录一、知识目标二、能力目标二、任务实施任务一&#xff1a;安装Apache任务二&#xff1a;配置简单Web站点任务三&#xff1a;配置基于主机名的虚抛主机任务四&#xff1a;安装vsftpd任务五&#xff1a;匿名用户访问FTP服务器任务六&#xff1a;本地用户配置一、知识目标…

HummerRisk 使用场景-混合云安全治理(2)--阿里云安全最佳实践

背景&#xff1a; 阿里云安全最佳实践&#xff0c;是基于众多客户上云的成功案例萃取而成的最优化企业上云指导。每个最佳实践包括使用场景、多产品部署架构及部署手册。 最佳实践目前覆盖23种常用场景&#xff0c;目前有200篇最佳实践&#xff0c;涉及100款以上阿里云产品的…

20221128-1Spring_day02(资料来自黑马程序)

Spring_day02 今日目标 掌握IOC/DI配置管理第三方bean掌握IOC/DI的注解开发掌握IOC/DI注解管理第三方bean完成Spring与Mybatis及Junit的整合开发 1&#xff0c;IOC/DI配置管理第三方bean 前面所讲的知识点都是基于我们自己写的类&#xff0c;现在如果有需求让我们去管理第三方…

安卓讲课笔记5.11 菜单

文章目录零、本讲学习目标一、导入新课二、新课讲解&#xff08;一&#xff09;菜单概述1、选项菜单2、上下文菜单3、子菜单&#xff08;二&#xff09;选项菜单案例演示1、创建安卓应用2、准备图片素材3、字符串资源文件4 、主布局资源文件5、主界面类实现功能6、启动应用&…