记账网页

2021.4.23

今天中午在 YouTube 上刷到一个记录北京程序员一天的视频. 别的没看到, 就惦记着别人使用一个记账软件记录自己每天的开销, 觉得自己现在学会了一点皮毛, 想要自己动手去制作一个适合自己的网页, 来记录自己的每天的开销.

说做咱就做, 不过现阶段还是以考研为主, 所以我觉得每天就拿出来 2 个小时空余时间来完成这个小项目. 感觉应该不算太耽误时间, 而且每天看汤家凤的视频真的有点… 没精神 . 就当做这个网页来开心开心吧.

第一天, 我决定先制定计划. 首先, 我虽然每天都在用 go 写数据结构, 但是对于 go 的框架还不是很熟悉. 到现在为止还只是使用过 gin, 编写过一个 helloword 的接口. 对于 gorm 等一些东西完全没有概念. 而且我觉得自己完成一个项目, 虽然不会有沟通方面的问题, 但会出现自己技术张不全面的问题.

所以, 我决定先设计好底层. 由于我想要实现的功能比较单一, 而且总体来说数据库读写并不是特别的复杂. 所以我觉得我应该优先设计数据库表, 再编写后端接口, 最后实现前端界面.

不过, 最开始肯定需要分析一下的是: 这个网页的需求. 我认为可以分析为一下几个方面:

  1. 能够为每日的开销记账, 应该只用输入最基础的开销, 例如 吃饭、话费、卫生纸啥的. 当然, 每笔账单应该包
    含备注.
  2. 每次的账单应该记录时间, 我认为精确到分钟或者秒不太现实, 因为不可能获取支付宝的 api, 所以可能做到
    付钱时记录时间, 而且让用户记录支付时间是不科学的. 考虑到用户基本上都是在每天、或者每个星期记账的,
    所以应该添加一个“记录时刻”的属性.
  3. 最后是分析数据, 这个我认为可以以后再讨论, 因为这些是可以前端来实现的.

总结:

我认为我这个项目的后端和数据库所需的心思并不是太多, 而且基本上只用一个数据表就可以记录所有的信息, 因为是给我个人使用的, 所以我觉得不需要账号和密码(其实是我懒). 然后我认为我最近需要学习的就是 gin 框架和 gorm 数据框架, 应该花时间学习一下.

今天的日记就记录到这吧.


2021.4.25

这两天主要设计了一个数据库, 然后完成了用户部分的接口设计.

总体来说时间超过了很多, 我觉得我完全就是一个兴趣驱动的人. 我觉得考研对我的兴趣吸引完全不及我去做项目, 所以我基本上就拿出了大量的时间去做项目了. 不过我觉得以后还是得控制一下, 毕竟考研才是目前的主要任务.

分析一下这两天所做的事情. 首先, 设计了项目的数据库表, 我认为只需要两张表, 其实一张表也可以, 但是为了以后方便扩展, 就采用了两张表. 一张表是用户信息表, 用于存储用户的信息, 比如用户名、密码、邮箱啥的, 我想的是邮箱是唯一的, 是不能重复的, 而且如果要做登陆系统的话, 就使用邮箱和密码作为登陆的输入. 第二张表就是记录账单的表了, 这张表主要记录了金额、类型啥的, 感觉暂时也只需要这些吧.

然后就是学习gingorm的过程了. 我是从b 站视频官方文档学习的 , 说实话, 坑还挺多的. 我现在就来详细地说一说:

项目结构的问题, 一开始我跟着视频写, 结果 gin 引擎、gorm 数据库连接、路由配置以及路由函数的处理都写在一个 mian.go 文件中, 感觉非常拥挤, 而且十分不便于管理.

所以我在 GitHub 上找到一个 gin-gorm 项目结构模版, 不过我使用的是2.0 版本, 因为我认为以我的项目的规模来说, 这个版本就已经完全够用了.

然后在这个结构中遇到了许多的坑, 我就很奇怪为啥需要把一个配置写的这么复杂, 不是应该只需要把常量导出就可以了吗? 为啥还是用 init 函数初始化? 真的没搞懂. 然后对于数据库的配置我也没看很懂, 将数据库的所有配置设计成了一个结构体, 然后再将结构体的每个属性拼接成了数据库连接的配置… 好吧, 虽然确实拆分了, 但是对于一个项目来说真的需要这么做吗?

不过, 我个人认为这个项目结构还是非常好用的, 也成功地将每个函数和路由分离了, 能够在 models 编写操作数据库的函数, 然后在 controller 编写 API 函数, 最后加载在 api 的路由中就可以了. 这种由底层逐步上升的感觉比在一个文件中改改写写好多了.

然后就是 gin 和 gorm 的问题了, 可能要归罪于我经常使用 Python 的原因, 对于 Go 的语法还不是非常熟悉.遇到的困难具体为一下几点:

  1. 数据库操作的问题, 因为已经很久没写过 sql 语句了, 导致很多时候设计操作数据库函数时并不是非常熟练,而且 gorm 的链式语法也还没有完全掌握, 导致出现很多 bug.
  2. gin 接口传值的问题, 在请求头传参和在请求体传参傻傻分不清, 而且在使用 Apifox 的过程中也没很好地认清. 然后就是准备接收 json 格式的参数时, 在调试软件 Apifox 中没有写在请求体中, 最后导致浪费了非常多的时间在改 bug 上.
  3. 关于 Go 语言的 err 处理问题, 一开始没有做统一的规划, 在每个函数中都打印了 err, 导致不知道是哪里出现了问题. 现在统一改成了 数据库操作函数将 err 返回, 然后在 api 函数中打印 err 的类型和 err 的内容.

学习到了很多东西, 也成功地将有关 user_info 表的内容实现了, 可喜可贺, 感觉我的进步还是很大的.


2021.4.26

今天基本上已经把所有的接口实现了. 感觉这个项目的后端设计并不是非常复杂, 总共一起也只有 10 个接口的样子, 感觉一起写在 main.go 文件中也是能够完成的, 但是为了以后的扩展性, 使用这样的项目结构也不算坏.

今天主要完成的是就是账单方面的接口实现和测试啦. 其实在完成用户方面的接口后, 账单的接口也就不难实现了, 因为逻辑本身就没有太大的区别, 都不过是 CURD 而已. 唯一感觉有点麻烦的是 Go 语言的 time 包没有搞很清楚, 我在测试时输入的时间字段完全没有录入进去, 也不知道前端应该怎么给后端传值. 所以我是使用 string 保存的时间, 没有使用 Go 包中的 time 基础库. 至于格式什么的都交给前端去处理吧, 感觉 js 没有类型, 处理起来应该还挺方便的.(那为啥我感觉后端的事情这么少呀, 突然以后想做后端了)

现在后端要做的事情基本上已经, 剩下的基本上就是前端 Vue 页面设计了.


2021.4.27

今天进行了一些简单的前端页面设计, 主要是测试了在页面中调用 api.

结果在过程中一只显示无法访问, 我就很好奇为什么, 无论怎么调用都没有办法…

先后进行了调端口、重启数据库、改变 js 函数调用. 结果发现都没有问题, 最后想起来在上个项目中使用 Django 配置了跨域访问的问题, 这才想起来没有在 Go 中设置, 于是在网络上搜索了一下, 发现编写了一个中间件就可以完成了. 最后在网络的力量下解决了跨域问题.


正是你花费在玫瑰上的时间才使得你的玫瑰花珍贵无比