当前位置: 首页 > news >正文

Python 爬取网页水务数据并实现智慧水务前端可视化

提示:本文爬取深圳市环境水务集团有限公司的公开数据作为数据样例进行数据分析与可视化。

文章目录

  • 一、爬虫
  • 二、对爬取的数据进行数据库、excel的存储与数据处理
    • 1.代码实现
  • 三、应用Flask框架将后端获取数据后渲染到前端
  • 四、前端Echarts的使用
    • 1.下载echarts.min.js
    • 2.放入静态文件夹下
    • 3.在要使用echarts的html网页中,导入这个文件
    • 4.在官网中找到自己心仪的图表
    • 5.下载官网中的代码到本地
    • 6.下载后用记事本打开,选取需要的部分
    • 7.将需要的部分粘贴到前端页面中,并将数据修改为后端传递的数据即可
  • 五、最终的效果


一、爬虫

爬虫是一种强大的数据获取工具,可以帮助我们自动化地收集互联网上的各种信息,为数据分析、数据挖掘等领域提供有力的支持。被称为网络爬虫或网页蜘蛛,是一种按照一定规则自动地抓取互联网信息的程序或脚本。Python 爬虫是一种利用 Python 编程语言编写的程序,用于自动地浏览万维网并从网页中提取数据。Python 因其简洁的语法、丰富的库支持和强大的社区支持,成为了实现爬虫项目的热门选择。
基本工作流程:

  1. 发起请求:通过HTTP库(如Python的requests库)向目标网站发送请求,获取网页内容。
  2. 获取响应:接收服务器的响应,通常是HTML格式的网页源代码。
  3. 解析网页:使用解析库(如Python的BeautifulSoup或lxml)对网页内容进行解析,提取出需要的数据(如文本、图片链接、视频链接等)。
  4. 存储数据:将提取出的数据存储到数据库或文件中,供后续处理或分析使用。
    重复以上步骤:根据需要,爬虫可以不断重复上述步骤,以获取更多数据或更新数据

注意事项

  1. 遵守 robots.txt:在编写爬虫时,请确保遵守目标网站的 robots.txt
    文件中的规则,以避免对网站造成不必要的负担或被视为恶意访问。
  2. 合理设置请求头:为了模拟浏览器访问,你可能需要设置 User-Agent 请求头。
    使用代理和延时:为了减少对目标网站服务器的压力,你可以考虑使用代理和设置请求之间的延时。
  3. 处理 JavaScript 渲染的内容:如果目标网页的内容是通过 JavaScript
    动态生成的,那么上述示例中的方法可能无法直接获取到这些内容。这时,你可以考虑使用像 Selenium 这样的工具来模拟浏览器行为。
  4. 法律和道德问题:在编写爬虫时,请确保你的行为符合当地的法律法规,并尊重网站的版权和隐私政策。

爬虫常用的库

网络请求库
urllib:Python3自带的库,提供了基本的URL请求和网页抓取功能。它是最简单的网络请求库,但功能相对基础。
requests:第三方库,建立在urllib3之上,提供了更加人性化的API。它简化了发送HTTP请求和处理响应的过程,是最常用的Python网络请求库之一。
Selenium:自动化测试工具,通过模拟用户在浏览器中的操作来抓取动态网页内容。它支持多种浏览器,如Chrome、Firefox等,适用于需要JavaScript渲染的页面。

网页解析库
Beautiful Soup:第三方库,用于解析HTML和XML文档。它提供了从网页中提取数据的简便方法,支持多种解析器,如Python标准库中的html.parser和lxml。
lxml:第三方库,支持HTML和XML的解析,并且提供了XPath和CSS选择器的支持。它的解析效率非常高,是处理大型网页数据的理想选择。
pyquery:第三方库,类似于jQuery的Python实现,能够以jQuery的语法来操作解析HTML文档。它对于熟悉jQuery的开发者来说非常友好。

异步及并发库
asyncio:Python标准库(Python 3.4+),提供了异步I/O、时间循环、协同程序和任务等功能。结合aiohttp等异步HTTP库,可以高效地处理大量并发请求。
concurrent.futures:Python标准库,为调用异步执行提供了一个高层次的接口。它支持ThreadPoolExecutor和ProcessPoolExecutor,可以分别用于I/O密集型和CPU密集型任务的并发执行。
aiohttp:基于asyncio实现的HTTP框架,支持异步操作。它提供了与requests类似的API,但具有更高的效率和更好的并发性能。

爬虫框架
Scrapy:一个高级的Web抓取框架,用于从高度复杂的网站中抓取数据。它提供了强大的编码支持、选择器引擎和爬虫引擎,并且支持多种数据库后端和消息队列。Scrapy的学习曲线可能较陡峭,但一旦掌握,可以高效地处理各种爬取任务。
PySpider:一个由国人编写的强大的网络爬虫系统,带有强大的WebUI、脚本编辑器、任务监控器、项目管理以及结果处理器。它支持多种数据库后端和消息队列,并且可以渲染JavaScript页面。
Crawley:一个高速爬取对应网站内容的框架,支持关系和非关系数据库,数据可以导出为JSON、XML等格式。但需要注意的是,Crawley并不是一个广为人知的爬虫框架,可能在使用和社区支持方面存在限制。

其他常用库
fake-useragent:用于生成随机的User-Agent字符串,以模拟不同设备的浏览器请求,有助于绕过一些简单的反爬虫机制。
re:Python标准库,提供了正则表达式的支持。虽然它本身不是爬虫库,但在处理网页数据时经常用于文本匹配和提取。

从深圳市水务局的网站上获取污水处理数据

# -*- codeing = utf-8 -*-
# @Time : 2022/11/29 15:32
# @Author : 小马
# @File: GetData.py
# @Software : PyCharm
#从深圳市水务局获取到深圳各个区的污水处理数据
import urllib.request,urllib.error
import pymysql
import re
from bs4 import BeautifulSoup
import xlwtfindaddress=re.compile(r'<a href="(.*)" target="_blank">20(.*)</a>')
finddataset=re.compile(r'<p style="text-align: center;"><strong>(.*?)</strong></p>')
finddataset2020=re.compile(r'<p style="text-align: left;"><strong>(.*?)</strong></p>')
baseurl="http://swj.sz.gov.cn/xxgk/zfxxgkml/szswgk/tjsj/psgltj/"
#元特区 福田区 罗湖区 盐田区 南山区 宝安区 大鹏新区 龙宝区 龙华区 坪山区 光明区
def ask(url):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.178.400 QQBrowser/11.2.5170.400"}request = urllib.request.Request(url=url, headers=headers)html = ""try:response = urllib.request.urlopen(request)html = response.read().decode("utf-8")except urllib.error.URLError as e:if hasattr(e, "code"):  # hasattr() 函数用来判断某个类实例对象是否包含指定名称的属性或方法。print(e.code)if hasattr(e, "reason"):print(e.reason)return html
def getaddress(baseurl):addressList=[]htmll=ask(baseurl)soup=BeautifulSoup(htmll,"html.parser")for item in soup("a",target="_blank"):item=str(item)add=re.findall(findaddress,item)if(len(add)>0):addressList.append(add[0][0])return addressList
def get2021():  url="http://swj.sz.gov.cn/xxgk/zfxxgkml/szswgk/tjsj/psgltj/content/post_9685824.html"html=ask(url)soup=BeautifulSoup(html,"html.parser")year="2021"districtList=[]districtname=[]sum1=[]sum2=[]for i in soup.tbody:i=str(i)data=re.findall(finddataset,i)if(len(data)>0):if(len(data)==1):districtname.append(data[0])if(len(data)==3):sum1.append(data[1])sum2.append(data[2])# for item in soup("p",style="text-align: center"):#     print(item)# for i in districtname:#     print(i)# for i in sum1:#     print(i)# for i in sum2:#     print(i)for i in range(0,7):district = []district.append(year)district.append(districtname[i])district.append(sum1[i])district.append(sum2[i])districtList.append(district)return districtList
def get2020():    url="http://swj.sz.gov.cn/xxgk/zfxxgkml/szswgk/tjsj/psgltj/content/post_8666858.html"html = ask(url)soup = BeautifulSoup(html, "html.parser")year = "2020"districtList = []districtname = []sum1 = []sum2 = []for i in soup.tbody:i = str(i)data = re.findall(finddataset2020, i)if (len(data) > 0):if (len(data) == 1):districtname.append(data[0])if (len(data) == 3):sum1.append(data[1])sum2.append(data[2])for i in range(0,2):district = []district.append(year)district.append(districtname[i])district.append(sum1[i])district.append(sum2[i])districtList.append(district)district = []district.append(year)district.append("盐田区")district.append(12)district.append(3003.25)districtList.append(district)for i in range(4,10):district = []district.append(year)district.append(districtname[i])district.append(sum1[i])district.append(sum2[i])districtList.append(district)return districtList
def get2019():url="http://swj.sz.gov.cn/xxgk/zfxxgkml/szswgk/tjsj/psgltj/content/post_8123700.html"html = ask(url)soup = BeautifulSoup(html, "html.parser")year = "2019"districtList = []districtname = []sum1 = []sum2 = []for i in soup.tbody:i = str(i)data = re.findall(finddataset2020, i)if (len(data) > 0):if (len(data) == 1):districtname.append(data[0])if (len(data) == 3):sum1.append(data[1])sum2.append(data[2])for i in range(0,7):district = []district.append(year)district.append(districtname[i])district.append(sum1[i])district.append(sum2[i])districtList.append(district)return districtList
def initdb(sql):db=pymysql.connect(host="localhost",user="root",password="root",port=3307,database="student",charset='utf8')try:cursor=db.cursor()data=cursor.execute(sql)print(data)result=cursor.fetchall()for i in result:print(i)db.commit()except Exception as e:db.rollback()print(str(e))finally:db.close()
def usedb():a=get2021()for item in a:item[1]='"'+item[1]+'"'sql = "insert into sewage (year,district,scale,sewagetreatment)values(%s,%s,%s,%s)"%(item[0],item[1],item[2],item[3])initdb(sql)b=get2020()for item in b:item[1] = '"' + item[1] + '"'sql = "insert into sewage (year,district,scale,sewagetreatment)values(%s,%s,%s,%s)" % (item[0], item[1], item[2], item[3])initdb(sql)c=get2019()for item in c:item[1] = '"' + item[1] + '"'sql = "insert into sewage (year,district,scale,sewagetreatment)values(%s,%s,%s,%s)" % (item[0], item[1], item[2], item[3])initdb(sql)
def getDatafromDB():sql="select * from sewage"db = pymysql.connect(host="localhost", user="root", password="root", port=3307, database="student", charset='utf8')try:cursor = db.cursor()data = cursor.execute(sql)result = cursor.fetchall()db.commit()except Exception as e:db.rollback()print(str(e))finally:db.close()return result
def getDatafrom(sql):db = pymysql.connect(host="localhost", user="root", password="root", port=3307, database="student", charset='utf8')try:cursor = db.cursor()data = cursor.execute(sql)result = cursor.fetchall()db.commit()except Exception as e:db.rollback()print(str(e))finally:db.close()return result
if __name__=="__main__":sql = "select sum(sewagetreatment) from sewage where year=2019"sql1 = "select sum(sewagetreatment) from sewage where year=2020"r=getDatafrom(sql)q=getDatafrom(sql1)print(int(r[0][0]))print(int(q[0][0]))

二、对爬取的数据进行数据库、excel的存储与数据处理

必要性:对爬取的数据进行数据库、Excel的存储与数据处理是数据分析和挖掘过程中非常重要的一步,爬取的数据通常是从网页或其他来源临时获取的。如果不进行存储,一旦程序关闭或数据源更新,这些数据就会丢失。通过将其存储在数据库或Excel文件中,可以确保数据的持久化,即数据可以长期保存并随时访问。存储在数据库或Excel中的数据可以轻松地通过SQL查询、Excel函数或数据分析工具(如Python的pandas库)进行进一步的分析和挖掘。这有助于发现数据中的模式、趋势和关联,从而支持决策制定和业务洞察。在将数据存储到数据库或Excel之前,通常需要进行一系列的数据处理和清洗工作,如去除重复数据、处理缺失值、转换数据类型和格式等。这些工作有助于确保数据的准确性和一致性,为后续的分析和挖掘提供可靠的数据基础。

1.代码实现

# -*- codeing = utf-8 -*-
# @Time : 2022/11/9 19:46
# @Author : 小马
# @File: Methods.py
# @Software : PyCharmimport sqlite3
import xlrd
import xlwt
#从月度总水量表中获得数据并将数据插入到数据表WaterConsumption中
def CreateWaterConsumption():dbpath = "water.db"sql = '''create table WaterConsumption(id integer primary key autoincrement,date text,Machine1 text,Machine2 text,Machine3 text,Machine4 text,Machine5 text,Machine6 text,totaltime text,totalwater text,totalconsumption text)'''conn = sqlite3.connect(dbpath)cur = conn.cursor()cur.execute(sql)conn.commit()cur.close()conn.close()
def searchall():datalist = []con = sqlite3.connect("water.db")cur = con.cursor()sql = "select date,Machine1,Machine2,Machine3,Machine4,Machine5,Machine6,totaltime from WaterConsumption"data = cur.execute(sql)for item in data:datalist.append(item)cur.close()con.close()return datalist
def searchMachine():m1=[]m2=[]m3=[]m4=[]m5=[]m6=[]con = sqlite3.connect("water.db")cur = con.cursor()sql1 = "select Machine1,Machine2,Machine3,Machine4,Machine5,Machine6 from WaterConsumption"data1 = cur.execute(sql1)for item in data1:m1.append(item[0])m2.append(item[1])m3.append(item[2])m4.append(item[3])m5.append(item[4])m6.append(item[5])cur.close()con.close()return m1,m2,m3,m4,m5,m6
def searchDateAndWater():date=[]wate=[]con = sqlite3.connect("water.db")cur = con.cursor()sql = "select date,totaltime from WaterConsumption"data = cur.execute(sql)for item in data:date.append(item[0])wate.append(item[1])cur.close()con.close()return date,watedef ReadExcel():conn=sqlite3.connect("water.db")cur=conn.cursor()data=xlrd.open_workbook("月度总用水量.xls")sheet=data.sheet_by_name("Sheet1")for i in range(1,sheet.nrows):sql = '''insert into WaterConsumption(date,Machine1,Machine2,Machine3,Machine4,Machine5,Machine6,totalconsumption,totaltime,totalwater)values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'''%(sheet.row(i)[0].value, sheet.row(i)[1].value, sheet.row(i)[2].value,sheet.row(i)[3].value,sheet.row(i)[4].value,sheet.row(i)[5].value,sheet.row(i)[6].value,sheet.row(i)[7].value,sheet.row(i)[8].value,sheet.row(i)[9].value)cur.execute(sql)conn.commit()cur.close()conn.close()#创建WaterConsumption水量消耗表格#将注册手机号,邮箱,密码插入到数据库中
def InsertIntoTable(p,pa,e):sql = '''insert into UserTable(phonenumber,password,email,isdeleted)values(%s,%s,%s,0)'''%(p,pa,e)conn=sqlite3.connect("water.db")cur=conn.cursor()cur.execute(sql)conn.commit()cur.close()conn.close()
#根据手机号查询密码和逻辑删除来实现登陆功能
def SelectFromTable(p):sql='''select password from UserTable where phonenumber=%s and isdeleted=0'''%pconn=sqlite3.connect("water.db")cur=conn.cursor()pa=cur.execute(sql)result=pa.fetchone()conn.commit()cur.close()conn.close()return result[0]#创建数据库并建表
def CreateTableAndDataBase():dbpath="water.db"sql='''create table UserTable(id integer primary key autoincrement,phonenumber text,password text,email text,isdeleted integer)'''conn=sqlite3.connect(dbpath)cur=conn.cursor()cur.execute(sql)conn.commit()cur.close()conn.close()
def deleteTable():dbpath = "water.db"sql = '''drop table WaterConsumption'''conn = sqlite3.connect(dbpath)cur = conn.cursor()cur.execute(sql)conn.commit()cur.close()conn.close()
#将数据写入excel表格
def exportTo():data = xlrd.open_workbook("月度总用水量.xls")sheet = data.sheet_by_name("Sheet1")# #for i in range(1, sheet.nrows):workbook = xlwt.Workbook(encoding="UTF-8")  # 创建workbook对象   一个文件worksheet = workbook.add_sheet('sheet1')for i in range(0,10):worksheet.write(0,i,sheet.row(0)[i].value)for i in range(1, sheet.nrows):for j in range(0, 10):worksheet.write(i, j, sheet.row(i)[j].value)workbook.save('C:/Users/DELL/Downloads/月度总用水表.xls')
def searchSumSix():datalist=[]sql="select sum(Machine1),sum(Machine2),sum(Machine3),sum(Machine4),sum(Machine5),sum(Machine6) from WaterConsumption"dbpath = "water.db"conn = sqlite3.connect(dbpath)cur = conn.cursor()data=cur.execute(sql)for item in data:datalist.append(item)conn.commit()cur.close()conn.close()return datalistif __name__=='__main__':d=searchSumSix()print(int(d[0][0]))print(d[0][1])
# -*- codeing = utf-8 -*-
# @Time : 2022/11/12 16:50
# @Author : 小马
# @File: Service.py
# @Software : PyCharm#代价
import xlrd2#将供水管网维修记录表中的信息插入到数据库中
def ReadAndAnalysisExcel():datelist=[]data = xlrd2.open_workbook("供水管网维修记录.xls")sheet = data.sheet_by_name("新交叉表_供水管网")for i in range(1,476):if(sheet.row(i)[7].value == "是"):date="2021-"+(sheet.row(i)[0].value)[4:6]+"-"+(sheet.row(i)[0].value)[6:8]datelist.append(date)return datelist#其他、第三者/人为、非我司管辖范围 外腐蚀 自然老化 施工质量
def ReadAndAnalysisQuestion():result=[]a=0b=0c=0d=0e=0f=0datelist = []data = xlrd2.open_workbook("供水管网维修记录.xls")sheet = data.sheet_by_name("新交叉表_供水管网")for i in range(1,sheet.nrows):if(sheet.row(i)[3].value=="其他"):a=a+1elif(sheet.row(i)[3].value=="第三者/人为"):b=b+1elif (sheet.row(i)[3].value == "非我司管辖范围"):c = c + 1elif (sheet.row(i)[3].value == "外腐蚀"):d = d + 1elif (sheet.row(i)[3].value == "自然老化"):e = e + 1elif (sheet.row(i)[3].value == "施工质量"):f = f + 1result.append(a)result.append(b)result.append(c)result.append(d)result.append(e)result.append(f)return resultif __name__=='__main__':r=ReadAndAnalysisQuestion()print(r[1])

三、应用Flask框架将后端获取数据后渲染到前端

Flask 是一个非常适合初学者和经验丰富的开发者使用的 Web 框架,它简洁而强大,能够帮助你快速构建出高质量的 Web 应用。

Flask的安装:

pip install Flask

Flask 的特点
轻量级:Flask 核心非常简洁,易于扩展。
灵活:你可以自由地选择数据库、模板引擎等。
WSGI 兼容:Flask 遵循 WSGI(Web Server Gateway Interface)标准,可以与多种服务器兼容。
开发便捷:内置的开发服务器和调试器让开发变得简单快捷。
社区支持:由于 Flask 的流行,其社区非常活跃,提供了大量的插件和扩展。

简单实例:

from flask import Flask  app = Flask(__name__)  @app.route('/')  
def hello_python():  return 'Hello, Python!'  if __name__ == '__main__':  app.run(debug=True)

具体实现

# -*- codeing = utf-8 -*-
# @Time : 2022/11/8 10:44
# @Author : 小马
# @File: app.py
# @Software : PyCharm
import GetData
from flask import Flask,render_template
from flask import request
import sqlite3
import Methods
import json
import Serviceapp=Flask(__name__)
@app.route('/',methods=['GET','POST'])
def login():data=request.get_data()if(len(data)>0):print(data)phonenumber = request.form.get('phonenumber')password = request.form.get('password')p = '"' + phonenumber + '"'password1=Methods.SelectFromTable(p)if(password==password1 or password is password1):return render_template("index.html")else:print(password)print(password1)return render_template("login.html")
@app.route('/forgotpassword')
def forgot():return render_template("forgot-password.html")
@app.route('/index')
def index():return render_template("index.html")@app.route('/utilities-animation')
def animation():result=GetData.getDatafromDB()sql = "select sum(sewagetreatment) from sewage where year=2019"sql1 = "select sum(sewagetreatment) from sewage where year=2020"sql2="select sum(sewagetreatment) from sewage where year=2021"r = GetData.getDatafrom(sql)q = GetData.getDatafrom(sql1)l = GetData.getDatafrom(sql2)return render_template("utilities-animation.html",data=result,d1=int(r[0][0])/1000,d2=int(q[0][0])/1000,d3=int(l[0][0])/1000)@app.route('/question')
def question():r = Service.ReadAndAnalysisQuestion()return render_template("question.html",data=r)
@app.route('/buttons')
def buttons():d=Methods.searchall()return render_template("buttons.html",waterlist=d)
@app.route('/charts')
def charts():d=Service.ReadAndAnalysisExcel()return render_template("charts.html",dateList=d)
@app.route('/export')
def export():Methods.exportTo()d = Methods.searchall()return render_template("buttons.html",waterlist=d)@app.route('/tables')
def tables():return render_template("tables.html")
@app.route('/cards')
def cards():a=Methods.searchMachine()b=Methods.searchSumSix()b1 = int(b[0][0])b2 = int(b[0][1])b3 = int(b[0][2])b4 = int(b[0][3])b5 = int(b[0][4])b6 = int(b[0][5])d=Methods.searchDateAndWater()Xdata=d[0]Ydata=d[1]return render_template("cards.html",Xdata=Xdata,Ydata=Ydata,m1=a[0],m2=a[1],m3=a[2],m4=a[3],m5=a[4],m6=a[5],n1=b1,n2=b2,n3=b3,n4=b4,n5=b5,n6=b6)@app.route('/register',methods=['GET','POST'])
def register():data = request.get_data()print("----------")print(data)if(len(data)>0):phonenumber=request.form.get('phonenumber')password=request.form.get('password')email=request.form.get('email')if(len(phonenumber)>0 and len(password)>0):p='"'+phonenumber+'"'pa='"'+password+'"'e='"'+email+'"'Methods.InsertIntoTable(p,pa,e)return render_template("login.html")return render_template("register.html")if __name__=='__main__':app.run(debug=True)

四、前端Echarts的使用

1.下载echarts.min.js

链接:
https://github.com/apache/echarts/tree/master/dist

2.放入静态文件夹下

在这里插入图片描述

3.在要使用echarts的html网页中,导入这个文件

在这里插入图片描述
代码如下:

<script src="static/js/echarts.min.js"></script>

4.在官网中找到自己心仪的图表

在这里插入图片描述

5.下载官网中的代码到本地

在这里插入图片描述

6.下载后用记事本打开,选取需要的部分

在这里插入图片描述

7.将需要的部分粘贴到前端页面中,并将数据修改为后端传递的数据即可

后端传递的数据

@app.route('/charts')
def charts():d=Service.ReadAndAnalysisExcel()return render_template("charts.html",dateList=d)

前端接收和调用

var datelist={{dateList|tojson}};

五、最终的效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将代码的链接放到了最后,有喜欢的小伙伴在下载时给作者点一个star
智慧水务:https://gitee.com/majunlong1/IntelligentWater
在这里插入图片描述

相关文章:

Python 爬取网页水务数据并实现智慧水务前端可视化

提示&#xff1a;本文爬取深圳市环境水务集团有限公司的公开数据作为数据样例进行数据分析与可视化。 文章目录 一、爬虫二、对爬取的数据进行数据库、excel的存储与数据处理1.代码实现 三、应用Flask框架将后端获取数据后渲染到前端四、前端Echarts的使用1.下载echarts.min.js…...

百度智能云发布3款轻量级+2款场景大模型

文心大模型ERNIE 3.5是目前百度智能云千帆大模型平台上最受欢迎的基础大模型之一。针对用户的常见通用的对话场景&#xff0c;ERNIE 3.5 在指令遵循、上下文学习和逻辑推理能力三方面分别进行了能力增强。 ERNIE Speed作为三款轻量级大模型中的“大个子”&#xff0c;推理场景…...

UE基础 —— 编辑器界面

菜单栏 UE中每个编辑器都有一个菜单栏&#xff0c;部分菜单会出现在所有编辑器窗口中&#xff0c;如File、Window、Help&#xff0c;其他则是其编辑器特有的&#xff1b; 主工具栏 UE中部分最常用的工具和命令的快捷方式&#xff1b; 1&#xff0c;保存按钮&#xff08;ctrls&a…...

2024年Vue组件库大比拼:谁将成为下一个Element?

2024 年&#xff0c;Vue生态蓬勃发展&#xff0c;越来越多的开发者开始探索更适合自己项目的组件库。 今天我们来看一下2024年最受欢迎的几款Vue开源组件库&#xff0c;除了Element&#xff0c;开发者们还有哪些选择呢&#xff1f; 1.Vuetify Vuetify是由社区支持的Vue组件库&…...

SS9283403 sqlite3交叉编译并部署到SS928(六)

1.Sqlite3下载 连接&#xff1a;SQLite Download Page 2.解压 tar zxvf sqlite-autoconf-3460000.tar.gz 3.配置并编译 进入解压目录&#xff0c;打开命令行&#xff0c;输入如下命令 ./configure CCaarch64-mix210-linux-gcc --hostarm-linux --prefix/home/mc/work/sqlite…...

java3d-1_4_0_01-windows-i586.exe

下载 Java 3D API 安装 C:\Program Files\Java\Java3D\1.4.0_01\bin C:\Java\jre6 C:\Java\jdk1.6.0_45 C:\Windows 记录下这 4 个目录&#xff0c;去检查下 4 哥目录下文件多了什么 检查目录① C:\Program Files\Java\Java3D\1.4.0_01\bin 检查目录② C:\Java\jre6 C:…...

Vue3中的history模式路由:打造无缝导航体验!

Hey小伙伴们&#xff0c;今天给大家带来Vue3中使用history模式路由的实战案例&#xff01;&#x1f31f; &#x1f50d; 项目背景 Vue3的路由功能非常强大&#xff0c;可以帮助我们轻松实现单页面应用中的页面切换。但是你知道吗&#xff1f;默认情况下Vue Router使用的是has…...

python(6)

一、datetime函数 方法一&#xff1a; 前一个datetime是模块。后一个datetime是类型 方法二&#xff1a; 方法三&#xff1a; 二、逆序字符串 三 、旋转字符串...

以Zed项目为例学习大型Rust项目的组织与管理

说明 Zed项目代码&#xff1a;https://github.com/zed-industries/zed.git本文项目代码&#xff1a;https://github.com/VinciYan/zed_workspace.git Zed是一款由Atom创始人开发的高性能、协作友好的现代开源代码编辑器&#xff0c;使用Rust编写&#xff0c;集成AI辅助功能&a…...

正点原子imx6ull-mini-Linux驱动之Linux RS232/485/GPS 驱动实验(23)

错误1&#xff1a;我一直找不到为什么我的minicom用不了&#xff0c;编译啥的都通过了&#xff0c;原来是我的密码文件命名错了&#xff0c;我就习以为常的命名为password&#xff0c;谁知道应该是passwd&#xff0c;所以以后该复制的还是复制&#xff0c;不然就容易找不到源头…...

用户上下文打通+本地缓存Guava

文章目录 &#x1f31e; Sun Frame&#xff1a;SpringBoot 的轻量级开发框架&#xff08;个人开源项目推荐&#xff09;&#x1f31f; 亮点功能&#x1f4e6; spring cloud模块概览常用工具 &#x1f517; 更多信息1.设计1.链路流程2.详细设计 2.网关过滤器获取唯一标识放到Hea…...

Windows图形界面(GUI)-MFC-C/C++ - 树形视图(Tree Control) - CTreeCtrl

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 树形视图(Tree Control) - CTreeCtrl 创建和初始化 添加和删除项 获取和设置项属性 操作项 项选择变化 项双击 项展开 示例代码 树形视图(Tree Control) - CTreeCtrl 创建和初始…...

C语言 --- 枚举、位运算

&#xff08;一&#xff09;枚举 1.概念&#xff1a;枚举是指将变量的值一一列举出来&#xff0c;变量的值只限于列举出来的值的范围 2.作用&#xff1a;a.提高代码可读性&#xff1b;b.提高代码的安全性 3.枚举类型&#xff1a; enum 枚举名 { 列举各种值 //枚举元素或枚…...

12322222222

当您和老王不在同一个网段时&#xff0c;您们之间的通信需要通过路由器来实现。这是因为不同的网段被视为不同的网络&#xff0c;而路由器的作用之一就是连接不同的网络并负责数据包的转发。下面是详细的通信流程&#xff1a; 本地网络通信尝试&#xff1a;您的设备&#xff0…...

知识改变命运:Java 语言 【可变参数】

可变参数 概念&#xff1a;Java允许一个类中多个同名同功能但是参数不同的方法&#xff0c;封装为一个方法。 基本语法&#xff1a; 访问修饰符 返回值 方法名 (数据类型...参数名) { ...... }案例&#xff1a;写一个类名DyMethod 方法名sum 计算两个整数和&#xff0c;三个整…...

Spring及相关框架的重要的问题

Java框架 问题一&#xff1a;Spring框架中的单例bean是线程安全的吗&#xff1f; 看下图&#xff0c;不能被修改的成员变量就是无状态的类&#xff0c;无状态的类没有线程安全问题&#xff0c;所以在开发中尽量避免可修改的成员变量。 回答&#xff1a;不是线程安全的&#xf…...

Linux Vim教程

Linux Vim 教程 Vim&#xff08;Vi IMproved&#xff09;是一个强大的文本编辑器&#xff0c;广泛用于编程和系统管理。本文将带你全面了解 Vim 的基础使用、常用命令、高级功能等。 1. 安装 Vim 在大多数 Linux 发行版中&#xff0c;Vim 已经预装。如果没有&#xff0c;可以…...

【学习笔记】多进程信号量控制

目录 1、CreateSemaphore 2、ReleaseSemaphore 3、CreateEvent 4、SetEvent 5、WaitForSingleObject 程序案例1&#xff1a; 程序案例2&#xff1a; 1、CreateSemaphore 创建一个计数信号量对象&#xff0c;成功时返回信号量对象的句柄&#xff1b;失败时返回NULL&…...

Redis与Memorycache的区别

Redis与Memorycache主要是持久线程和持久化的区别 1、从性能方面来说&#xff1a; Redis是单线程的&#xff0c;优点是CPU开销小&#xff0c;省去多线程线程之间切换的开销&#xff0c;但是相对于Memorycache来说海量数据的相对较低 Memorycache使用了多线程技术&#xff0c;数…...

docker和Helm Chart的基本命令和操作

一、docker基本命令和操作 1. docker login【登录】 登录 docker client&#xff0c;登录成功之后会显示 Login Succeeded。 docker login登陆到指定的镜像仓库&#xff0c;docker pull 和 docker push 操作都需要预先执行 docker login 操作&#xff1b; 指令&#xff1a;&a…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...