结合上一期的基于pyqt5开发的图书管理系统UI(带登录页面)文章做一个此章节的补充。因为老师说需要结合数据库实现登录系统。于是我就想起了自己在腾讯云上买的一个服务器。因此经过百度查询大量的资料,功夫不负有心人,在这个Pyqt5实现的可视化界面上,实现了通过服务器的数据库实现登录、和注册账号。因为老师要求我们做一个串口助手,因此也简单实现了串口助手的功能。
一、python登录系统接入腾讯云服务器数据库
由于Python和服务器相关的知识都是自己自学的,所有很多专业知识可能自己阐述不清楚,有什么疑问欢迎大家在评论区留言。
首先大家需要购买一台服务器,至于什么品牌的大家可以自行选择。对于第一次接触服务器相关知识来说,大家可以在服务器中安装宝塔面板。至于怎么在自己服务器安装宝塔面板,大家可以参考宝塔官网的教程宝塔面板 - 简单好用的Linux/Windows服务器运维管理面板,安装好后打开如下:
然后直接创建数据库,随便取一个名字,比如wqeq并点击进入phpmyadmin
进入后找到你创建的数据库
输入自己想创建的数据表名,字段数代表有几个输入框,比如:账号、密码,那么字段数为2。点击创建即可
创建后如上,类型选择TEXT(按照直接需求填写),长度值就代表 usname和password用户设置用户名和密码的长度,其实这就相当于excel表格,剩下的参数我也没有探究,直接点击保存即可。创建好后。
回到宝塔面板,记得设置右边的权限,设置为所有人。
我们再看Python连接服务器的代码。
需要填写的内容都在这
def go_to_login(self):
uname = self.ui.lineEdit_4.text()
upwd = self.ui.lineEdit_3.text()
#conn = connect(host='服务器Ip地址', user='test', password='密码',
# db='test', port=3306, charset='utf8')
conn = connect(host='服务器Ip地址', user='用户名', password='密
码', db='数据库名', port=3306, charset='utf8')
# 其他的保持不变
# 得到一个游标对象
cs1 = conn.cursor()
# 2, 执行sql语句
sql = """select password(创建的列名) from users(创建的表名) where usname(创建的列名) =%s """
cs1.execute(sql, (uname,))
result = cs1.fetchone()
#这里的password和usname跟在表格当中设置的列名一致
if result == None:
self.ui.label_7.setText("用户名错误,登录失败")
elif result[0] == upwd:
homepageWindow()
self.close()
else:
self.ui.label_7.setText("密码错误,登录失败")
第一次的小白可以和我的设置的数据名保持一致防止出错。sql = """select password(创建的列名) from users(创建的表名) where usname(创建的列名) =%s """这里一点都不能错哦。
附上完整的登录和注册代码,因为时间关系,还要准备比赛之类的,就写了最简单毫无验证的注册登录。如果闪退就是服务器连接失败了,这里没有写连接失败的函数。如下:
def go_to_login(self):
uname = self.ui.lineEdit_4.text()
upwd = self.ui.lineEdit_3.text()
conn = connect(host='服务器地址', user='test', password='密码',
db='test', port=3306, charset='utf8')
# 得到一个游标对象
cs1 = conn.cursor()
# 2, 执行sql语句
sql = """select password from users where usname =%s """
cs1.execute(sql, (uname,))
result = cs1.fetchone()
if result == None:
self.ui.label_7.setText("用户名错误,登录失败")
elif result[0] == upwd:
homepageWindow()
self.close()
else:
self.ui.label_7.setText("密码错误,登录失败")
def go_to_enroll(self):
uname = self.ui.lineEdit_5.text()
upwd = self.ui.lineEdit_6.text()
# 打开与数据库的连接
conn = connect(host='服务器地址', user='test', password='密码',
db='test', port=3306, charset='utf8')
cur = conn.cursor()
# 判断用户名是否存在
sql = 'select count(*) from users where usname=%s'
# params = [uname]
cur.execute(sql, (uname,))
result = cur.fetchone()
if result[0]:
self.ui.label_8.setText('用户名已经存在,请重新注册')
else:
# 用户名不存在
sql = 'insert into users(usname, password) values(%s, %s)'
# params = [uname, upwd]
result = cur.execute(sql, (uname, upwd))
conn.commit()
if result == 1:
self.ui.label_8.setText('注册成功')
else:
self.ui.label_8.setText('注册失败')
二、python的串口助手
因为老师想做的是串口采集信息,串口发送指令,本来做了大概的串口助手界面,但是不符合要求,就删掉了,最终界面如下。
因为采集的信息是温湿度之类的,所有自己也想做一个用matplotlib库的数据可视化,但是确定没有太多的时间就没有深入的去研究,只加入了库,没有设置变量这些。做一个串口助手,重要的地方在,接收信息并处理,发送16进制信息等。接收信息处理等。如何提取数据有效需要实际操作,因为我们是接收stm32的数据,所以用ser.read(100)来处理,ser为一个类,9代表一次读取多少位的数据,如这串FF F5 05 02 01 00 00 01 03数据。如果发送数据则使用b=bytearray([0xFF,0xF5,0x05,0x02,0x01,0x00,0x00,0x01,0x03])
b=bytes.fromhex('FF F5 05 02 01 00 00 01 03')
ser.write(d)
因为stm32的交互大多数都是16进制,这里提供两个发送16进制的方法。
最后如果有小伙伴想要做串口助手,可以下载一个虚拟串口助手,可以模拟两个虚拟串口进行测试。最后上源码:
def read_msg_thring(self):
t = Thread(target=self.read_msg)
t.start()
# 接收数据
def read_msg(self):
global ser
ser = serial.Serial(port="COM200",
baudrate=38200,
bytesize=serial.SEVENBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_TWO,
timeout=0.5)
print("开启成功")
while True:
data = ser.read(11) # 递归读取串口
if ((data[0] == 0xFF) & (data[1] == 0xFD)):
if (data[2] == 0x00):
x=float(int(chr(data[4]))+(int(chr(data[5]))/10))
# y=float(x * 1000 / 3.3)
self.ui.label_135.setText((str(x) + '0Lx'))
if (data[2] == 0x01):
self.ui.label_99.setText((str(int(data[4])+(int(data[5]))/10))+"℃")
self.ui.label_104.setText((str(int(data[6]) +(int(data[7]))/10))+'%')
def kaiq(self):
# data = bytearray([0xFF,0xF5,0x05,0x02,0x01,0x00,0x00,0x01,0x03])
# ser.write(data)
d = bytes.fromhex('FF F5 05 02 01 00 00 01 03')
ser.write(d)
# ser.write(b'\xFA\xFB\x07\x01\x00\x00\x00\x00\x00')
print("打开")
# FF F5 05 02 01 00 00 01 03
def guan(self):
data = bytearray([0xFF,0xF5,0x05,0x02,0x01,0x00,0x00,0x02,0x02])
ser.write(data)
这里有接收和发送函数,大家可以参考,因为接收是while True循环,所有加了个多线程,其中完整代码还有信号实现多线程的例子,感兴趣的朋友可以下载完整源码查看。下载完程序直接运行main.py及可以运行,还有一些没有完善的功能就不细说了。希望对于想做串口助手的小伙伴和实现登录验证的小伙伴有所帮助。源码请看我的个人中心,不需要积分纯属免费哦,有什么疑问欢迎评论区打扰。