矽昌--Wireless配置简述

news2024/11/18 13:40:03

Wireless配置简述

1 编译

1.1 首次编译

​ 如果是第一次编译时就需要添加wifi模块,请检查所需编译版型的配置,配置位于openwrt-18.06/target/linux/siflower/ 文件夹下,例如sf19a28_ac28_fullmask_def.config为ac28版型的配置。 查看配置并作对应修改:(所有矽昌支持的版型的配置文件均在此路径下)

CONFIG_PACKAGE_dnsmasq=y
CONFIG_PACKAGE_wireless-regdb=y
CONFIG_PACKAGE_kmod-cfg80211=y
CONFIG_PACKAGE_kmod-mac80211=y
CONFIG_PACKAGE_MAC80211_DEBUGFS=y
CONFIG_PACKAGE_MAC80211_MESH=y
CONFIG_PACKAGE_kmod-sf_smac=y
CONFIG_PACKAGE_SFSMAC_DBGINFO_ALLOCS=y
CONFIG_PACKAGE_SFUMAC_WIFI_TEST_SCRIPTS=y
CONFIG_PACKAGE_SFUMAC_WIFI_ATE_TOOLS=y
CONFIG_PACKAGE_SFUMAC_FMAC=y
CONFIG_PACKAGE_libiwinfo=y
CONFIG_PACKAGE_hostapd-common=y
CONFIG_PACKAGE_iw=y
CONFIG_WPA_MSG_MIN_PRIORITY=3
CONFIG_DRIVER_11N_SUPPORT=y
CONFIG_DRIVER_11AC_SUPPORT=y
CONFIG_PACKAGE_wpad-mini=y
CONFIG_PACKAGE_iwinfo=y

修改完成后,若编译ac28镜像,则在openwrt-18.06目录下使用./make.sh ac28即可编译,编译完成后在当前目录即可得到镜像。

1.2 非首次编译

如果不是第一次编译,那么可以使用make menuconfig然后选中以下内容:(默认已经配置好,可以直接make -j V=s)

Kernel modules ---> Wireless Drivers--->kmod-sf_smac  
Network--->hostapd-common
Utilities--->iwinfo  
Base system--->dnsmasq

修改完成之后保存,在openwrt-18.06目录下使用make -j V=s即可编译,镜像位于bin/siflower/openwrt-siflower-sf16a18-mpw0-squashfs-sysupgrade.bin

2 wifi配置

1806 sdk 中的 wifi 配置沿用了 openwrt 原始的 wifi 配置,
可以参考 openwrt-wifi配置。
配置文件在镜像中的位置为/etc/config/wireless,典型的配置如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rTxXba7R-1671777490458)(https://developers.siflower.cn/document/picture_download?pictureId=5c6d004e5466e40001704766)]

配置分为两层,wifi-device对应到具体的wifi驱动设备,在我们的硬件中支持2.4G和5G两种device,
wifi-iface对应了单个wifi接口,与单个ssid相对应,
一个wifi-device下面可以配置多个wifi-iface,最多支持4个。

2.1 配置选项说明

2.1.1 wifi-device配置选项

注:默认值为”/”时表示该选项不一定会出现,只有在进行了某些设置的情况下才会出现;默认值为”-“时表示2.4G和5G有差异,将在描述里进行说明。

选项值类型默认值描述
wifi-devicestringradio0驱动设备名称
typestringmac80211驱动类型,目前固定为”mac80211”。
countrystringCN国家码,2个大写字母,默认为CN,表示中国(China),国家码会影响信道和发射功率。
channelstring/int-信道,默认2.4G为信道1,值为”auto”时表示自动选取最优信道,不同国家信道限制不同,如中国地区2.4G信道为1~13 ,5G信道为36~64 、149~165。
txpower_lvlint2发射功率,可设值为0、1、2。该值越大,表示功率越大。
max_all_num_staint64驱动所能连接设备个数的最大值
netisolateboolean0设备隔离,如果设置为1,则从该device下的设备无法访问同一网桥(bridge)中其它bssid的设备。
noscanboolean0值为1时,表示不扫描周围信道。
pathstring-对应驱动在/sys/devices/下的节点,一般不作修改。默认2.4G为”platform/11000000.wifi-lb”,5G为”platform/17800000.wifi-hb”。
htmodestring20MHz带宽模式,2.4G支持20MHz/40MHz,5G支持20MHz/40MHz/80MHz。
hwmodestring-wifi工作模式,2.4G支持11b/11g/11n,5G支持11n/11a/11ac,最终的模式是由htmode和hwmode共同决定的
disabledboolean00表示启用该驱动设备,1表示关闭该驱动设备。
ht_coexboolean/值为1时,表示带宽20MHZ/40MHZ共存,与htmode有一定联系

2.1.2 wifi-iface配置选项

选项值类型默认值描述
wifi-ifacestringdefault_radio0wifi-iface节点名称
devicestring-对应wifi-device驱动名称,默认2.4G为radio0,5G为radio1。
ifnamestringwlan0网卡(iface)的名称,使用ifconfig时会显示对应名称。
networkstringlan对应的网桥(bridge)名称,如果需要把wifi加入到lan口则配置该值为lan。
modestringap (sta、minotor)ap对应热点,sta对应站点(station),monitor对应监听模式。默认为ap模式。
ssidstringSiWIFi-****wifi的名称,最大不超过32位。支持中文,但在串口会显示为”…“。默认名称中的数字来源于mac地址。
encryptionstringnone加密方式,”none”表示不加密,如果想加密,建议改成”psk2+ccmp”
keystring12345678wifi密码,psk2需设置8位以上。当加密方式为不加密(none)时此选项不生效,而其他加密方式必须配置密码。
hiddenboolean0是否隐藏热点,1表示隐藏,0表示不隐藏。隐藏后设备只能通过手动添加SSID才能连接wifi。
wpa_group_rekeyint3600刷新GTK(广播/多播加密密钥)的时间间隔(以秒为单位)。若不设置此项,则使用CCMP / GCMP作为组密码时默认为86400秒(每天一次),使用TKIP作为组密码时默认为600秒(每10分钟一次)。
isolateboolean0连接此wifi的各设备之间是否隔离,1表示隔离,0表示不隔离。
groupint-bridge中的分组,各个不同的group之间在bridge中是不能互相访问的。默认2.4G为0,5G为1。
netisolateboolean0如果配置为1,则从该bssid下的设备无法访问同一bridge中其它bssid的设备。

2.1.3 源码中如何修改wifi的默认配置

修改package/kernel/mac80211/files/lib/wifi/mac80211.sh文件即可。

#!/bin/sh
append DRIVERS "mac80211"

lookup_phy() {
	[ -n "$phy" ] && {
		[ -d /sys/class/ieee80211/$phy ] && return
	}

	local devpath
	config_get devpath "$device" path
	[ -n "$devpath" ] && {
		for phy in $(ls /sys/class/ieee80211 2>/dev/null); do
			case "$(readlink -f /sys/class/ieee80211/$phy/device)" in
				*$devpath) return;;
			esac
		done
	}

	local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')"
	[ -n "$macaddr" ] && {
		for _phy in /sys/class/ieee80211/*; do
			[ -e "$_phy" ] || continue

			[ "$macaddr" = "$(cat ${_phy}/macaddress)" ] || continue
			phy="${_phy##*/}"
			return
		done
	}
	phy=
	return
}

find_mac80211_phy() {
	local device="$1"

	config_get phy "$device" phy
	lookup_phy
	[ -n "$phy" -a -d "/sys/class/ieee80211/$phy" ] || {
		echo "PHY for wifi device $1 not found"
		return 1
	}
	config_set "$device" phy "$phy"

	config_get macaddr "$device" macaddr
	[ -z "$macaddr" ] && {
		config_set "$device" macaddr "$(cat /sys/class/ieee80211/${phy}/macaddress)"
	}

	return 0
}

check_mac80211_device() {
	config_get phy "$1" phy
	[ -z "$phy" ] && {
		find_mac80211_phy "$1" >/dev/null || return 0
		config_get phy "$1" phy
	}
	[ "$phy" = "$dev" ] && found=1
}

detect_mac80211() {
	devidx=0
	config_load wireless
	while :; do
		config_get type "radio$devidx" type
		[ -n "$type" ] || break
		devidx=$(($devidx + 1))
	done

	for _dev in /sys/class/ieee80211/*; do
		[ -e "$_dev" ] || continue

		dev="${_dev##*/}"

		found=0
		config_foreach check_mac80211_device wifi-device
		[ "$found" -gt 0 ] && continue

		mode_band="g"
		channel="1"
		htmode=""
		ht_capab=""
		ssidprefix="-2.4G"
		noscan="0"
		band="2.4G"
		htcodex="0"
		txpower="20"


		iw phy "$dev" info | grep -q 'Capabilities:' && htmode=HT20

		iw phy "$dev" info | grep -q '5180 MHz' && {
			mode_band="a"
			channel="161"
			ssidprefix=""
			band="5G"
			txpower="25"
			iw phy "$dev" info | grep -q 'VHT Capabilities' && htmode="VHT80"
		}

		[ -n "$htmode" ] && ht_capab="set wireless.radio${devidx}.htmode=$htmode"

		if [ -x /usr/bin/readlink -a -h /sys/class/ieee80211/${dev} ]; then
			path="$(readlink -f /sys/class/ieee80211/${dev}/device)"
		else
			path=""
		fi
		if [ -n "$path" ]; then
			path="${path##/sys/devices/}"
			case "$path" in
				platform*/pci*) path="${path##platform/}";;
			esac
			dev_id="set wireless.radio${devidx}.path='$path'"
		else
			dev_id="set wireless.radio${devidx}.macaddr=$(cat /sys/class/ieee80211/${dev}/macaddress)"
		fi
		[ -f "/sys/devices/factory-read/countryid" ] && {
			country=`cat /sys/devices/factory-read/countryid`
		}
		ssid=SiWiFi-`cat /sys/class/ieee80211/${dev}/macaddress | cut -c 13- | sed 's/://g'`$ssidprefix
		ssid_lease=SiWiFi-租赁-$ssidprefix`cat /sys/class/ieee80211/${dev}/macaddress | cut -c 13- | sed 's/://g'`
		if [ ! -n "$country" ]; then
			country='CN'
		fi

		txpower_lvl=2
		[ -f "/etc/ext_pa_exist" ] && {
			txpower_lvl=1
		}
		uci -q batch <<-EOF
			set wireless.radio${devidx}=wifi-device
			set wireless.radio${devidx}.type=mac80211
			set wireless.radio${devidx}.country=${country}
			set wireless.radio${devidx}.txpower_lvl=${txpower_lvl}
			set wireless.radio${devidx}.txpower=${txpower}
			set wireless.radio${devidx}.channel=${channel}
			set wireless.radio${devidx}.band=${band}
			set wireless.radio${devidx}.hwmode=11${mode_band}
			set wireless.radio${devidx}.noscan=${noscan}
			set wireless.radio${devidx}.netisolate=0
			set wireless.radio${devidx}.max_all_num_sta=64
			set wireless.radio${devidx}.ht_coex=${ht_coex}
			${dev_id}
			${ht_capab}
			set wireless.radio${devidx}.disabled=0

			set wireless.default_radio${devidx}=wifi-iface
			set wireless.default_radio${devidx}.device=radio${devidx}
			set wireless.default_radio${devidx}.network=lan
			set wireless.default_radio${devidx}.mode=ap
			set wireless.default_radio${devidx}.ssid=${ssid}
			set wireless.default_radio${devidx}.encryption=none
			set wireless.default_radio${devidx}.key=12345678
			set wireless.default_radio${devidx}.hidden=0
			set wireless.default_radio${devidx}.ifname=wlan${devidx}
			set wireless.default_radio${devidx}.wpa_group_rekey=36000
			set wireless.default_radio${devidx}.isolate=0
			set wireless.default_radio${devidx}.group=1
			set wireless.default_radio${devidx}.disable_input=0
			set wireless.default_radio${devidx}.wps_pushbutton=1
			set wireless.default_radio${devidx}.wps_label=0

			set wireless.guest_radio${devidx}=wifi-iface
			set wireless.guest_radio${devidx}.device=radio${devidx}
			set wireless.guest_radio${devidx}.network=guest
			set wireless.guest_radio${devidx}.mode=ap
			set wireless.guest_radio${devidx}.ssid=${ssid}-guest
			set wireless.guest_radio${devidx}.encryption=none
			set wireless.guest_radio${devidx}.hidden=0
			set wireless.guest_radio${devidx}.ifname=wlan${devidx}-guest
			set wireless.guest_radio${devidx}.isolate=1
			set wireless.guest_radio${devidx}.group=1
			set wireless.guest_radio${devidx}.netisolate=0
			set wireless.guest_radio${devidx}.disable_input=0
			set wireless.guest_radio${devidx}.disabled=1
EOF
		uci -q commit wireless

			if [ "$devidx" == "0" ]; then
				uci -q batch <<-EOF
				set wireless.lease_radio${devidx}=wifi-iface
				set wireless.lease_radio${devidx}.device=radio${devidx}
				set wireless.lease_radio${devidx}.network=lease
				set wireless.lease_radio${devidx}.mode=ap
				set wireless.lease_radio${devidx}.ssid=${ssid_lease}
				set wireless.lease_radio${devidx}.encryption=none
				set wireless.lease_radio${devidx}.hidden=0
				set wireless.lease_radio${devidx}.ifname=wlan${devidx}-lease
				set wireless.lease_radio${devidx}.isolate=1
				set wireless.lease_radio${devidx}.group=1
				set wireless.lease_radio${devidx}.netisolate=0
				set wireless.lease_radio${devidx}.disable_input=0
				set wireless.lease_radio${devidx}.maxassoc=64
				set wireless.lease_radio${devidx}.disabled=1
				EOF
				uci -q commit wireless
			fi

		devidx=$(($devidx + 1))
	done
}

2.1.4 htmode与hwmode的对应关系

不同的hwmode决定了htmode可以配置的选项,下表列举了不同模式的对应关系。

2.1.4.1 2.4G配置
2.4G模式配置描述
11boption hwmode 11b该模式下option htmode必须删除
该模式下option ht_coex必须删除
11goption hwmode 11g该模式下option htmode必须删除
该模式下option ht_coex必须删除
11noption hwmode 11g option htmode HT20 (或option htmode HT40) option ht_coex 1当ht_coex的值为1时,处于20MHz/40MHz混合模式;
当ht_coex的值为0时,htmode的值就是频宽
2.1.4.2 5G配置
5G模式配置描述
11aoption hwmode 11a该模式下option htmode必须删除
该模式下option ht_coex必须删除
11noption hwmode 11a option htmode HT20 (或option htmode HT40) option ht_coex 1当ht_coex的值为1时,处于20MHz/40MHz混合模式;
当ht_coex的值为0时,htmode的值就是频宽
11acoption hwmode 11a option htmode VHT20 (或option htmode VHT40 或option htmode VHT80)该模式下option ht_coex必须删除

2.1.5 encryption加密方式

WPA版本密钥加密协议
psk2+tkip+ccmp psk2+tkip+aesWPA2 Personal (PSK)TKIP, CCMP
psk2+tkipWPA2 Personal (PSK)TKIP
psk2+ccmp psk2+aes psk2WPA2 Personal (PSK)CCMP
psk+tkip+ccmp psk+tkip+aesWPA Personal (PSK)TKIP, CCMP
psk+tkipWPA Personal (PSK)TKIP
psk+ccmp psk+aes pskWPA Personal (PSK)CCMP
psk-mixed+tkip+ccmp psk-mixed+tkip+aesWPA/WPA2 Personal (PSK) mixed modeTKIP, CCMP
psk-mixed+tkipWPA/WPA2 Personal (PSK) mixed modeTKIP
psk-mixed+ccmp psk-mixed+aes psk-mixedWPA/WPA2 Personal (PSK) mixed modeCCMP
wepWEP

3.固件烧录之后的wifi配置

3.1 如何修改wifi配置

​ 直接修改配置文件/etc/config/wireless保存后执行**wifi reload**即可

wifi指令执行脚本位于/sbin/wifi,相关使用方法见下表格所示

指令参数描述
wifi-不加任何参数,则重新启用”全部wifi”
wificonfig当”/etc/config/wireless”文件不存在时重新生成该文件
wifireload重新启用”配置有所更改的wifi”
wifidown关闭全部wifi
wifiup启用全部wifi
wifistatus以json串的方式打印wifi信息

3.2 查看wifi信息

使用”iw”指令可查看wifi相关信息,下面列出常见的iw指令。

指令参数描述示例
iwinfo/列出所有无线网络信息iwinfo
iw info列出单个wifi信息iw wlan0 info
iwlist列出所有无线设备信息iw list
iw scan扫描周围信号iw wlan1 scan
iw station dump列出连接该wifi的所有设备信息iw wlan0 station sump

3.3 新增AP节点

在/etc/config/wireless中增加一段即可,最简单的一种配置如下:

  config wifi-iface
        option device 'radio0'
        option network 'lan'  
        option mode 'ap'
        option ssid 'SiWiFi-new-ap'
        option encryption 'psk2+ccmp'
        option key '12345678'
        option ifname 'wlan0-1'

3.4 新增sta节点

在/etc/config/wireless中增加一段即可,实例如下:

config wifi-iface
        option key '12345678'
        option ifname 'sfi0'
        option network 'wwan'
        option encryption 'psk2+ccmp'
        option device 'radio0'
        option mode 'sta'
        option bssid 'A8:5A:F3:00:02:3F'
        option ssid 'SiWiFi-023c-2.4G-8_1'

4.wifi配置生效流程

4.1 如何修改默认配置?

​ 在板子上生成默认配置的脚本为lib/wifi/mac80211.sh,其在源码中位于package/kernel/mac80211/files/lib/wifi/mac80211.sh,此脚本用于生成/etc/config/wirelesss

4.2 默认配置生成后被应用到哪里?

​ /etc/config/wirelesss会被netifd和hostapd使用。
对于netifd,将直接读取wireless的配置;
对于hostapd,会由脚本/lib/netifd/wireless/mac80211.sh读取配置,生成配置文件/var/run/hostapd-phy.conf以供hostapd使用,该脚本在源码中位于package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh*。

4.3 wifi配置流程图

5 wifi驱动模块

wifi模块存放在板子上的目录为/lib/modules/4.14.90/,在板子启动过程中这些模块会依序自动加载

5.1 wifi驱动相关模块加载流程

5.2 wifi驱动模块的相关指令

指令参数描述
insmod“模块名称” …加载该模块,简单指令如insmod /lib/modules/4.14.90/startcore.ko (或insmod startcore.koinsmod startcore)。需要注意的是,有些模块加载需要附加较多参数,建议使用sfwifi指令进行模块操作。
rmmod“模块名称” …卸载该模块
modinfo“模块名称” …显示该模块相关信息
sfwifiremove移除wifi驱动相关模块,包括sf16a18_rf.ko、startcore.ko、sf16a18_fmac.ko
sfwifireload重新加载wifi驱动模块
sfwifireset重新启动wifi驱动相关模块

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

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

相关文章

截至2022年12月共计451个信息安全国家标准汇总

写在前面 早年刚参加信息安全工作更多的学点皮毛技术&#xff0c;到处找安全工具&#xff0c;跟踪poc&#xff0c;拿到一个就全网扫一遍&#xff0c;从来没有想过&#xff0c;系统化的安全工作应该怎样搞?我做的工作在安全体系中处于哪个阶段? 后来有机会做企业安全建设&…

计网第二章.物理层

以下是湖科大计算机网络公开课的笔记&#xff1a; 1. 物理层的基本概念 物理层是解决在各种传输媒体上传输比特0和1的问题。 像用双绞线还是光纤或同轴电缆、接线器形状、尺寸、引脚数目、电压范围、某一电平的电压表示何种意义… 物理层为数据链路层屏蔽了各种传输媒体的差…

React学习32(深浅克隆之Immutable.js)

Immutable.js github地址&#xff1a;https://github.com/immutable-js/immutable-js 介绍 每次修改一个immutable对象时都会创建一个新的不可变的对象&#xff0c;在新对象上操作并不会影响到原 对象的数据&#xff0c;那Immutable这个库的实现是深拷贝还是浅拷贝&#xff…

【数据结构】优先级队列(堆)与PriorityQueue

目录 一、堆 二、Java里的集合类PriorityQueue 1、优先级队列的概念 2、构造方法 3、常用方法 1.入队offer 2.出队poll 3.获取队首元素peek 4.扩容机制 4、 注意事项 三、实现大根堆 1、准备字段 2、创建大根堆 3、offer 4、poll 5、peek 一、堆 如果有一个关键…

Selenium WebDriver定位策略(一)

WebDriver中使用的定位策略列表: 下面以百度搜索输入框为例进行讲解 1、按ID定位策略 通过元素的id属性来定位&#xff0c;前提&#xff1a;元素必须有id属性 driver.find_element_by_id("kw")2、按名称查找策略 通过元素的name属性来定位&#xff0c;前提&…

Go语言设计与实现 -- 关键字for和range

如果我们查看汇编代码的话&#xff0c;可以发现&#xff0c;经过优化的for-range循环的汇编代码和普通for的结构相同。也就是说&#xff0c;使用for-range的控制结构最终也会被Go语言编译器换成普通的for循环。 现象提出 现象1&#xff1a;循环永动机 func main() {arr : []…

如何在anaconda中配置graphviz包

文章目录GraphViz简介一&#xff1a;安装graphviz二&#xff1a;配置环境变量三&#xff1a;检测Graphviz是否配置成功。四&#xff1a;安装graphviz包GraphViz简介 graphviz是贝尔实验室开发的一个开源的工具包&#xff0c;它使用一个特定的DSL(领域特定语言):dot作为脚本语言…

android apk 目录结构

APK的目录结构 更改APK的后缀后&#xff0c;可以看到APK的组成如下&#xff1a; assets 其中assets中存放静态资源。 Res res中存放静态资源。 与assets不同之处&#xff0c;res文件夹下的所有文件会生成资源Id.lib 包括依赖的jar包库&#xff0c;so文件等。 so文件是利…

GD32F450以太网(2-2): PHY芯片IP101GR介绍

PHY芯片IP101GR 文章目录PHY芯片IP101GR1. 预备知识2. IP101GR简介3. IP101GR基于RMII接口的PCB设计重点解析3.1 时钟设置3.2. led灯设计3.3. PHY芯片地址设置4. pcb设计5. 寄存器描述6. 附加&#xff1a;IP101GR和GD32F450引脚连接情况1. 预备知识 接上文 《GD32F450以太网(…

液晶OLED接口MIPI之DSI协议学习

文章目录一、概念介绍MIPI----MIPI联盟发起的为移动应用处理器制定的开放标准MIPI-DSI---Display Serial Interface 2定义了处理器和显示模组之间的高速串行接口DCS---Display Command Set 显示命令集合&#xff08;MIPI-DSI的command模式使用通用标准命令&#xff09;DSC---Di…

字符串函数剖析(3)---strstr函数

1.strstr函数的巧妙 – 查找子字符串 1.1模拟实现strstr函数 strstr函数&#xff1a;在一个字符串中查找子串 学习新函数时&#xff0c;先去c库查找该函数的相关资料&#xff0c;更加助于你的学习 const char * strstr ( const char * str1, const char * str2 );先看函数的…

测开工具:spring boot 实现同步数据库表结构(持续更新)

一、使用场景 一个项目&#xff0c;有多套开发环境。有一套标准的数据库&#xff0c;不同的开发环境&#xff0c;有各自的一套数据库。 标准数据库的表结构经常发生变化&#xff0c;不同的开发环境中的数据库&#xff0c;需要与标准数据库的表结构保持一致。当标准数据库表结…

HNU编译原理实验一cminus_compiler-2022-fall

前言&#xff1a;实验不是很难&#xff0c;主要考察正则表达式部分 lab1实验报告实验要求 根据cminux-f的词法补全lexical_analyer.l文件&#xff0c;完成词法分析器&#xff0c;能够输出识别出的token&#xff0c;type ,line(刚出现的行数)&#xff0c;pos_start(该行开始位置…

[机缘参悟-95] :不同人生、社会问题的本质

事情的本质是物极必反&#xff08;轮回、周期&#xff09; 社会的本质是优胜劣汰&#xff08;迭代、发展&#xff09; 道德的本质是伦理秩序&#xff08;未定、秩序&#xff09; 战争的本质是资源占用&#xff08;弱肉、强食&#xff09; 商业的本质是价值交换 金钱的本质…

基于JAVA SpringBoot+ JWT+Redis的ERP系统,VUE+Element-UI 前后端分离的Saas平台

项目简介 简云Saas平台 基于SpringBoot2.2.0, Mybatis, JWT, Redis, VUEElement-UI 的前后端分离的Saas平台管理系统 在线报表开发 在线表单设计 工作流设计 自定义打印模板定义 **产品分二个版本: 开源版本(包含了系统基础架构在线表单设计). 此版本代码完全开源ERP版本…

Flink-基本的合流操作

文章目录1.基本的合流操作2.1联合&#xff08;Union&#xff09;2.2 连接&#xff08;Connect&#xff09;2.基于时间的合流——双流联结&#xff08;Join&#xff09;2.1 窗口联结&#xff08;Window Join&#xff09;2.2 间隔联结&#xff08;Interval Join&#xff09;2.3 窗…

《面向对象分析与设计》总结

面向对象的软件工程1 面向对象的演化1.1 生活中复杂系统的特点1.2 软件系统的复杂性1.2.1 复杂性的四个方面1.2.1.1 问题域的复杂性1.2.1.2 管理开发的困难性1.2.1.3 软件中的灵活性1.2.1.4 描述离散系统行为1.2.2 复杂系统的五个属性1.2.2.1 层次结构1.2.2.1.1 对象结构1.2.2.…

数据分析神器:数据自动录入并生成BI报表

做报表、分析数据、做汇报是许多打工人的日常&#xff0c;每天都要耗费不少的时间用Excel来整理、清洗数据和生成好看的报表。如果这些数据都是手动整理、复制粘贴的话&#xff0c;不仅费时费力&#xff0c;而且很容易出错。 在越来越多企业采用SaaS产品和不同数据应用的今天&…

来看一个vue-element-表单之登录页面,最后送上一个登录页面

vue-element 表单之登录页面使用 0. 先留下属性表格 表单验证&#xff1a;Form 组件提供了表单验证的功能&#xff0c;只需要通过 rules 属性传入约定的验证规则&#xff0c;并将 Form-Item 的 prop 属性设置为需校验的字段名即可。 1. 表单属性表(el-form) 2. 表单项属性表…

php工作流引擎再发新版本—Tpflow7.0重磅发布

2022年已接近尾声&#xff0c;又到了每年发布大版本的时候&#xff0c;Tpflow历经一个多月的意见征集及版本优化&#xff0c;从底层改进&#xff0c;从UI调整&#xff0c;增强了事件功能。 发布日期&#xff1a;2022年12月23日 发布版号&#xff1a;V7.0.0 Tpflow 工作流引擎…