3月4~6日工作内容

First Post:

Last Update:

3月4~6日工作内容

接入Line登录与Vue前端的交互

上周基本完成Line登录的接入,剩下的只有业务的处理。

今天在写相关的业务的时候发现,Line和国内微信不太一样直接获取得到的userId就是openId,不需要通过code再次获取,但是要命的一点是Line开发者账号获取到的用户信息里面没有手机号。

客户说只能一时间没办法认证企业Line,只能下次更新了。

image-20240304155646269

我就先把代码放着,捋一下后续的思路:

App通过/lineLogin/gotoauthpage请求Line登录地址,服务端获取回调信息,服务端携带用户信息重定向到App页面,App页面获取参数请求登录接口

之所以要这么做,是为了防止出现跨域的问题。

image-20240304161548505

随之就是一个难点:RestController通常是返回Json或者字符串,如果想要重定向到某一个地址,该怎么做

一个方式是通过HttpServletResponse

image-20240304161202505

另一个是GPT提到的,通过HttpHeaders

image-20240304161409729

这两种方式我测试都是可行的,各取所好就行。

Java复习

这段时间没有太多的bug要改,索性复习一下专业课吧。

文件比较

在写File的相关操作的时候,发现一个方法compareTo,但是作用的效果不符合预期,主要出现在这三种情况:

  1. file1是通过相对路径创建的,file2是通过file1.getAbsolutePath()创建的:不一样

    1
    2
    File f2 = new File(file.getAbsolutePath());
    System.out.println("比较两个文件:" + file.equals(f2)); //FALSE
  2. file1是通过相对路径创建的,file2是通过file1.getCanonicalPath()创建的:不一样

    1
    2
    File f2 = new File(file.getCanonicalPath());
    System.out.println("比较两个文件:" + file.equals(f2)); //FALSE
  3. file1是通过相对路径的目录+文件名两步创建的,file2是通过file1.getCanonicalPath()创建的:不一样

    1
    2
    File f2 = new File(file.getCanonicalPath());
    System.out.println("比较两个文件:" + file.equals(f2)); //FALSE

也就是说file1是通过相对路径创建的情况下,file2也需要是通过相对路径创建的,两者compareToequals的结果才会使一样。

所以像这种情况需要比较的其实是绝对路径,即file.getAbsolutePath().equals(f2.getCanonicalPath()或者file.getCanonicalPath().equals(f2.getCanonicalPath(),又或者file.getAbsolutePath().equals(f2.getAbsolutePath()

然后测完还看到一篇类似的文章,印证了我的想法。

字节流与字符流

Java IO库有两个支系:

  • 面向字节流的InputStream和OutputStream

    字节小于字符,读写的单位自然就是字节,如果读取的内容是英文的情况下,一个字母自然就是一个字节,如果文本是中文的情况下,那就不是了,直接把读出来的打印结果会是乱码,因为中文不是一个字节一个文字的。

    • FileInputStream的例子
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class StreamDemo1 {
    public static void main(String[] args) {
    try {
    File file = new File("data/2.txt");
    FileInputStream fileInputStream = new FileInputStream((file));
    for (int i = 0; i < file.length(); i++) {
    char ch = (char)(fileInputStream.read());
    System.out.print(ch + " ");
    }
    System.out.println();
    fileInputStream.close();
    } catch (Exception e) {
    System.out.println("文件打开的时候发生了异常");
    }
    }
    }
    • FileOutputStream的例子
    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
    public class StreamDemo2 {
    public static void main(String[] args) {
    try {
    File file = new File("data/3.txt");
    if(!file.exists()) {
    boolean newFile = file.createNewFile();
    if (newFile) {
    System.out.println("文件不存在,创建新文件");
    }
    }
    String str = "learning java fileOutputStream";
    FileOutputStream fileOutputStream = new FileOutputStream(file);
    /*
    // 等同于直接写入字节
    for (int i = 0; i < str.length(); i++) {
    char ch = str.charAt(i);
    fileOutputStream.write(ch);

    }*/
    fileOutputStream.write(str.getBytes());
    fileOutputStream.close();
    } catch (FileNotFoundException e) {
    System.out.println("找不到该文件");
    } catch (IOException e) {
    System.out.println("文件创建的时候出现了错误");
    }
    }
    }

  • 面向字符的Reader和Writer与缓冲流的结合

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class BufferDemo1 {
    public static void main(String[] args) {

    try {
    /*
    File file = new File("data/1.txt");
    BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
    int ch;
    while ((ch = bufferedReader.read()) != -1) {
    System.out.print((char) ch);
    }*/
    String str;
    while ((str = bufferedReader.readLine()) != null) {
    System.out.println(str);
    }
    } catch (FileNotFoundException e) {
    System.out.println("文件找不到");
    } catch (IOException e) {
    System.out.println("读取文件时发生了异常");
    }
    }
    }

计算机网络复习

二进制中的与、或、非、异或的计算方式

这个博主写的文章讲得特别清楚:二进制中的与、或、非、异或运算_二进制或运算-CSDN博客

  • 与(&):两者全真才为真
  • 或(|):其一为真便为真
  • 非(~):取反,真变假 假变真
  • 异或(^):互异才为真

子网划分的四种主要题型

这篇文章讲了子网划分的时候出现的四种主要题型:计算机网络——子网划分(内含习题讲解)-CSDN博客

  1. 知道某主机IP地址和子网掩码,求网络地址和广播地址
  2. 知道某类网络及子网掩码,求可以划分的子网个数及每个子网的子网号
  3. 将某一特定的网络IP,要划分成为指定个数的子网,求每个子网的有效主机地址范围及其对应的子网掩码
  4. 知道网络地址,公司要划几个网,什么部门至少要几个网络

IP地址的一些概念

  1. 主机位及网络位:看子网掩码,子网掩码为“1”的部分就是网络位,为“0”部分就是主机位

  2. 网络号:IP&子网掩码

  3. 广播号:IP的网络号的主机位取反

  4. 主机数:2^(32-子网掩码位数)-2

  5. 子网划分:

    假设我们要将原来的网络(192.168.1.0)划分为两个子网。为了实现这一点,我们可以将子网掩码位数增加1,变为25位子网掩码。

    新的子网掩码位数=24+1=25新的子网掩码位数=24+1=25

    新的主机数=2(32−25)−2=27−2=128−2=126新的主机数=2(32−25)−2=27−2=128−2=126

    现在,每个子网可以容纳126个主机。更新网络设备的子网掩码,例如,第一个子网的网络号为192.168.1.0,第二个子网的网络号为192.168.1.128。这样,我们成功地将原来的网络划分为两个子网,每个子网有更多的IP地址可用。

IP地址分类

  • A类:(1.0.0.0126.0.0.0)(默认子网掩码:255.0.0.0)第一个字节为网络号,后三个字节为主机号。该类地址的最前面为“0”,所以地址的网络号的取值位于128191之间,一般用于大型网络
  • B类:(128.0.0.0191.255.0.0)(默认子网掩码:255.255.0.0)前两个字节为网络号,后两个字节为主机号。该类地址的最前面为“10”,所以地址的网络号的取值位于128191之间,一般用于中型网络
  • C类:(192.0.0.0223.255.255.0)(默认子网掩码:255.255.255.0)前三个字节为网络号,最后一个字节为主机号。该类地址的最前面为“110”,所以地址的网络号的取值位于192223,一般用于小型网络
  • D类:多路广播地址,该类地址最前面为“1110”,所以地址的网络号取值为224-239
  • E类:保留地址,该类地址的最前面为“1111”,所以地址的网络号取值为240~255

在IP地址的三种主要类型中,各保留了一段区域作为私有地址:

A类地址:10.0.0.0~10.255.255.255

B类地址:172.16.0.0~172.31.255.255

C类地址:192.168.0.0~192.168.255.255

一键删除

今天客户的一个需求,项目经理跟我描述时候是这样的

image-20240318160817158

昨晚功能来到客户这边的反馈却是:

image-20240306083339145
所以需求就变成了对现在列出客户进行批量删除,那么就需要看看获取的接口列出的数据有哪些。很这里面的数据到底有哪一些,奇怪的是这个接口请求时候携带的参数中,除了分页并没有特别明确的限制条件,难道是列出全部数据吗?

带着这个疑问,那我就将数据库列出表里未删除的数据量跟系统现在这个区域的数量进行比较,数量是一致的,接口写完,剩下的就是前端的事情了。

涉及这种敏感的大批量操作一定要小心再小心,客户操作的时候可以备份一下表,防止他们又反悔了。

image-20240306085047403

与前端发生的一些问题

最近发生了一些不愉快的事情,公司新来的所谓干了三年的前端,水得一匹,装个前端环境一直抱怨着抱怨那,不是电脑不行就是网络不行。原本这跟我无关,我只需要做好自己的事情就行,可惨的是我一个后端需要跟他对接。

一开始我抱着一种热心的成分,也刚好有空,帮他解决各种问题,结果第三天他环境还是没配好,他最后竟然一直背后跟组长说是后端的问题???我没跟他交接好。可是在这种情况下,我一个后端怎么可能知道前端要交接什么,真是农夫与蛇。

那天他说他电脑要连的上我这边测试环境,我帮他在电脑用小皮配置了nginx,结果这煞毕连webpack配置不会改,一直BB说是我的问题,我真的一肚子火!!!但我忍住了,跟那组长要来前端的权限,弄完他搞了两天没搞完的前端环境,改了webpack配置甩给他看是不是后端问题。

然后来到今天,在做需求的时候,无数据的时候给他传了空数组

企业微信截图_17096283562179

然后他说不行,要这样的

image-20240306090447984

我就纳闷了,这两个data不都是空数组吗,结果人家跟我爆了一句我没传__ob__给他,给我整无语了,我是不是还得把原型传给他?

职场不易,如果后面还有类似情况,我就直接把他的事情反馈出来,我一实习生其实也大不了走人。