关于健康码识别的网站开发进度记录
咕咕咕 fishing

关于这个网站

这个网站是大创项目的网站。用于健康码识别,目前什么都没有,只有一个空项目。啊,对,没错。
github仓库地址

关于网站的架构

网站前端打算使用vue,前端由青虬负责编写
网站后端打算使用springboot,由我负责
项目核心功能由顾のEvery Day负责,他也是这个项目的负责人(组长)。 图像识别那块,我暂时还不是很懂啦,反正很厉害就对了
前后端肯定是要分离的,使用ajax,数据格式使用json。 jsp不分离属实痛苦
后端与图像识别的python程序,目前打算使用socket(套接字)进行通信。 目前只是了解过,还需要学习
而且临近期末,springboot暂时还没学完,所以开发进度在七月前估计会很慢。 可能根本没有进度

目前进度:确认大体需求
image

2022-05-21
周六,楼下的广场舞很吵。

数据库设计

数据库设计了四张表,老师、学生、权限、班级
因为需求比较简单,比如权限暂时只有两种——能否查看统计信息,所以并没有采取复杂的角色和权限表。
同时因为对学院和专业没有什么明确的实际操作,所以写在了班级中,并未单独分表。
关于学生健康码信息的表,目前计划动态新建表,即每天新建一张表用于存储健康码的相关信息

目前进度:创建数据库,搭建项目基本配置
image

2022-07-05
果然七月前完全没有进度,紧张的期末也终于是结束了。python实训(网课)开始了。
(还有几门成绩还不出,是不打算出了吗)

具体开发过程

注册部分(未完成

注册部分使用邮箱进行验证,使用到了springboot自带的mail组件。还挺好用的,和之前使用的javax.mail的大体流程(邮件的设置之类的)是一样的。
同时也决定使用redis数据库,来解决同一用户使用不同浏览器或设备来进行邮件验证的数据共享问题。比之前采取静态类存取sessionId的方式会好一些。
最后,在发送邮件的调试过程中,我也决定使用日志来打印一些信息,进行排错,而非System.out.println()。

目前进度:大概完成了注册的三分之一。

2022-07-08
今天也算是见证历史了,日本前首相安倍晋三今天中午遇刺,下午宣布死亡。
考虑以后可以给博客添加上类似历史上的今天这类tips。应该会有意义吧

老师注册部分(基本完成

注册的流程大概如下:

  1. 发送注册请求
  2. 生成验证码,将验证码同用户信息一起写入redis,发送验证邮件
  3. 访问验证链接
  4. 验证验证码是否正确
    1. 正确则修改redis中的数据,将用户改为在线状态,用户邮箱写入cookie,同时修改它们的生命周期(方便后期登录使用),发送注册成功的邮件,写入数据库
    2. 错误则返回错误信息

redis中缓存的信息也从原来的string改成了hash,因为考虑到登录会使用,所以缓存中用户信息得记录详细。
关于验证的链接,返回的是html页面,使用的是thymeleaf,其实不太想用的,但总不能返回个json数据吧。因为页面显示完信息后,应该会3s后跳转到首页。比jsp方便了一些吧。(暂时没有好的处理方式
最后就是关于Controller层和Service层的一些想法。
业务层应该把这个请求分解成一个个服务,不同的请求也可以重用服务,提高代码的复用性。dao层就只做与数据库的交互。
对于Controller层和Service层的划分和设计,目前设计的还不是很好。得多写多看吧。

2022-07-10
脑子有点乱,去睡会觉。想把个人介绍写写,但还没想好怎么写。

重新设计

想了想,现在的注册虽然完成了,但是过于复杂。在邮件里嵌入链接进行验证是一个不太聪明的行为。
所以决定重新设计下使用流程:

  1. 注册
    1. 输入图片验证码,发送带有验证码的邮件。
    2. 同一页面,输入邮件的验证码提交后。即注册完成
  2. 登录
    1. 账号,密码,图片验证码。
    2. 正确则登陆成功
  3. 忘记密码
    1. 输入图片验证码,发送带有验证码的邮件。
    2. 同一页面,输入邮件的验证码以及新密码提交后。即重置完成

顺带把接口写好,需要什么,返回什么得提前规划好。

2022-07-11
脑子不是一般的乱,之前的设计问题很大。虽然也不是不能实现。
好的设计会让程序更加简洁高效,接口写了一部分,先实现这部分。

被大佬推荐了两个工具
自动生成api文档的swagger包,经过一番调试,终于能正常的扫描到controller中的所有api了。后面要使用他的注解来使生成的api更详细。
还有个就是Apifox,可以模拟各种请求,方便了调试。同时,也支持将swagger生成的api数据导入。也可以多人协同开发。应该会蛮好用的。

2022-07-11
晚上补充,重构真痛苦啊。
在博客上写的接口文档就不用了,不如软件生成的。害,亏我写了蛮久的

注册功能,重新写好了。比之前的逻辑简单了许多。重置密码的流程和注册是一样的,也方便后面开发。
使用spring-session-data-redis。把数据存到session中,session把数据存到redis,实现数据共享。
(不存redis问题好像也不大,因为改变了设计,不在邮件中夹杂链接,所以不需要考虑用户不同源访问的数据共享问题。这个依赖包是解决分布式session共享的问题的,用在这感觉没啥必要,纯session存储就足够了。不过都写好了也无所谓了)

2022-07-13
昨天忘写了。python实训布置了最后的大作业,就做个东西交上去,也没什么限制。我到现在也没想好要做啥,这几天要暂停去写大作业了。

注册,登录,重置的接口基本实现了,但是没有完整的测试。
昨天试着写了上传图片的模块,还行,能上传,问题不大。后面要考虑如何和python程序进行数据交互了。
所以暂时缓一缓,因为负责python的人跑去上夜班了,没啥时间交流。
所以这几天先学学nginx吧。后面部署还是我。nginx看完再考虑别的。

2022-07-20
python实训的大作业交了个qq机器人,也不知道老师能不能跑起来。等python熟练点了,把qq机器人的配置和部署记录下。

测试socket

java客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package org.example;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Client {
public static void main(String args[]) {
// 要连接的服务端IP地址和端口
String host = "124.222.100.205";
int port = 55533;
// 与服务端建立连接
Socket socket = new Socket(host, port);
// 建立连接后获得输出流
OutputStream outputStream = socket.getOutputStream();
String message = "你好 socket test1!";
socket.getOutputStream().write(message.getBytes("UTF-8"));
//通过shutdownOutput高速服务器已经发送完数据,后续只能接受数据
socket.shutdownOutput();

InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = inputStream.read(bytes)) != -1) {
//注意指定编码格式,发送方和接收方一定要统一,建议使用UTF-8
sb.append(new String(bytes, 0, len, "UTF-8"));
}
System.out.println("get message from server: " + sb);

inputStream.close();
outputStream.close();
socket.close();
}
}

python服务端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import socket

host = '0.0.0.0'
port = 55533

try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(1)
except socket.error:
print('create socket failed')

print('socket created')

while 1:
conn, addr = s.accept()
print("from" + str(addr))
while 1:
data = conn.recv(1024)
if len(data) == 0:
conn.send('end'.encode())
else:
print(data.decode())
conn.send('end'.encode())
break
conn.close()

客户端报错:Connection timed out: connect
原因:服务器端口未开放

客户端报错:Connection refused: connect
原因:服务端监听端口为 127.0.0.1:55533,但127.0.0.1表示本机地址,即客户端与服务端同时运行在这台服务器上才能进行连接。所以需要绑定到网卡的ip,或者使用0.0.0.0绑定到所有的网络地址

2022-07-30

socket通信,也许会使用队列,一个个发给python端。但这样好像效率不高。
另一种方式是采取类似数据库连接池的方法,或者多线程。

2022-08-01
讨论了一下,边写边想吧。

结束

一句话,寄了。