网络中心排班系统开发日志-Golang

2022年

5.08 开始学习 Gin 框架

5.11 打开项目,开始用 Golang 重构项目,思考如何从xls课表中提取出想要的信息

5.12 下午五点 xls 分析功能实现完毕,实现 OT(Occupation Table) 提取功能

​ 晚上十一点 数据库结构设计完毕 SQL语句初步书写完毕

5.13 晚上九点半 完成使用 Gorm 框架 实现 OT 表导入数据库

5.14 下午五点半 实现使用Gin框架 从前端POST表单到后台,收集需要排的班次信息,可以开始写排班功能

5.16 上午九点半 完成输入日期,生成排班表功能

​ 下午六点半 完成输入日期,查询指定日期排班表功能

5.18 晚上十点半 完成 OT 表正确初始化并根据课表更新、根据 shift 表 生成 值班时长 duty 表

​ 实现根据当前有空的网管,左连接值班时长表,take 值班时长最少的人排上去

5.19 凌晨三点 完成简单排班功能,班次排得平均得雅痞
6.1 凌晨一点,前端注册表单验证基本实现完毕,使用全局数据库连接

6.8 中午十二点,注册和登录功能实现完毕

6.14 凌晨2点40,现在我们用 cookie 保存用户登录状态 并从后端获取用户信息,在前端显示

6.23 可以选择登录方式

6.28 开始写后台页面,可以查看用户列表

7.3 实现前端组件复用,完善路由传参

TODO:

  • 编写测试用例
  • 前端判断选择的两个排班日期大小,结束日期晚于起始日期
  • 前端输入需要排班日期的时候,输入开始和结束日期之后,要更新下方单选列表,选择每一天的值班类型 单纯用js实现比较麻烦,不如用 Vue
  • 思考到底在哪里连接数据库好
  • 数据库默认值可以用 default 赋
  • 根据课表更新 OT 表 这一步可以使用携程,快速操作,但考虑一学期更新不到几次,这个可以考虑延缓改进
  • initOccupation 可以一次Save 一个网管的
  • 前端开始排班之前,应该还要选择排哪些网管的班次
  • 连续登录五次失败之后需要输入验证码
  • 在 localStorage 中存储用户的选择配置
  • 数据库多一个表,存储学期开始日期,对应周数

需要外置的环境变量参数

钉钉 Appkey

钉钉 AppSecret

/model/database.go dsn

MySQL 数据库地址 用户名 密码

/jwt/generateToken secret Token过期事件

需要用到的网站:

笔记:

​ 前端渲染周日程表的时候,应该的按行渲染的,即一周,一个时间段一个时间段一行过去渲染

​ 获取当前周 -> 获取当前周排班表 ->(option) 选择某一周或者+-周

每个学期要分库分表吗?没必要,一学期的OT表也不超过2MiB,20个人的规模

在给ref对象赋值的时候,要用.value,才能更新到值

毕业设计的题目为《基于Gin、Gorm、Vue的排班OA系统的设计与实现》,提供多人在线实时挑选班次、个人空闲时间管理、调休假、自动排班、考勤统计等功能。

系统后端使用 Golang 语言编写,使用 Gin 作为 http框架、 Gorm 作为对象关系映射框架,系统前端使用 Vue 和 Element UI 组件库,使用 WebSocket 来实现多端实时通讯。

本项目的主要功能之一自动排班已经实现完毕,前端用户 JWT token 路由鉴权也已经测试完毕,在完善前端用户体验的同时,继续学习后端开发技巧,同时该项目借鉴大公司开发中的微服务思想,该项目落地部署以及升级都十分便利。

该需求来自学校网络中心,需要给值班的网管干事排班,以往都是人力去先根据课表知道大家的空闲时间来排班,每周都需要花几个小时排班,费时费力还经常出错,调休也需要人工干预,有了这个系统之后,办公自动化带来的效率是可观的持久的。

系统使用流程:

配置好数据库,创建好表

在每个学期开始时手动初始化该学期的 shift configuration 表,同时更新所有用户的 occupation_init_status 为 0

在要排班之前根据 shift configuration 生成班次,选择开启自由选班几小时或者自动排班

2023/2/13

重新思考项目主要功能框架

  • 解析课程表可以把每一个 cell 解析为事件 类型 起始时间段 结束时间段

2023/2/16

https://github.com/swaggo/gin-swagger

之后swagger 可以用 oAuth,超帅和安全

https://goswagger.io/

TODO:

  • 自由实时在线挑选班次功能 By webSocket

  • Swagger 接口 API 文档

    https://zhuanlan.zhihu.com/p/549252410?utm_id=0

    放弃使用 swagger 来生成 API 文档,因为接口数量少,接口数量简单

  • 后台可配置每周生成排班时间,排班生成规则

    用配置好的参数调用生成排班方法,发布选班通知,过时间自动补齐空闲班次,补齐后通知未能排上班的班次

    如果有特殊排班需求可配置 维护一个数据库表来管理每天的排班,每个时段排不排班,排几个人

    shift_configuration

2023/2/21

https://zhuanlan.zhihu.com/p/383848749

https://github.com/rs/zerolog

2023/3/2

Golang func() init

2023/3/7

需要确认 个人的当前学期的空闲表是否有被创建

Current_OccupationTable_Status 0->未创建 1->已创建

在旧学期过去两周后(手动),重置所有的user.Current_OccupationTable_Status = 0

管理员功能:

班次管理

生成班次

开启班次自选功能 指定日期的班次 + 截止选班次时间

获取某一周的shiftConfig

发给前端的时间统一用 Unix

前端也要有一套时间转换的工具

ENV 配置项该用起来了

2023/3/9

在管理员审批通过注册的账号的时候,给该账号生成空闲表

2023/3/16

数据库user表 id 要从 1开始,id = 0 会被go视为零值

注册页添加步骤条 注册-》审核》登陆

可以设置不显示页尾 -> 只有首页显示页尾 Footer

https://code-farmer-i.github.io/vue-markdown-editor/zh/

优化需求:通用用户查询接口

  • 将 getUserList controller 内的数据库逻辑抽象成服务

  • 密码输错五次添加验证码模块

  • 事务开始之后,只有成功或者回滚后才能return

  • 设计 should bind query 的请求,number不能从0开始,不然会绑定失败

  • 在每天值班的四个值班时间结束时间点更新数据库 shift.status -> 2

  • 只有自己的班次可以申请换给别人

  • 认领没有人值班的班次接口

  • 实时挑选班次的系统

    还是用数据库做持久化存储

    在进入排班表页面的时候,建立 websocket 连接

    可选:用一个结构体存下当前用户鼠标最后操作的班次,断开 websocket 连接时删除

    实时传输选班次和放弃班次的结果

  • 更新空闲表的接口

  • 获取个人空闲表的接口 按周

  • 管理员可获取所有人的班次表

  • 新增换班表的接口

  • 新增获取换班表详情的接口

  • 新增获取换班表列表的接口

  • 换班表列表的接口添加页数和页码

  • 新增同意或拒绝换班申请的接口 同意后更新班次表

  • 新增请假表接口 同意后修改班次表的状态为已请假

  • 已请假状态别人可以再认领班次

  • 新增干事排班

  • 新增干事的班次类型

  • 班次状态总览: -2 干事未排班; -1 未排班; 1 已排班; 2 干事已排班 3已请假; 4干事已请假; 5旷班; 6干事旷班; 7 已值班; 8干事已值班; 9 任选阶段 10 干事任选阶段

  • 给周班次上锁解锁接口

  • 生成班次的时候,只有两个选项,直接排班 or 任选 x 小时,x小时后自动锁定班次

  • 锁定班次接口

  • 修改密码的接口

  • 防止密码爆破操作

  • 输出日志

  • 值班时长统计

  • 前端用户信息修改点击取消要重新触发表单验证

  • 日志输出格式,信息全写在message中,使用 sprintf

  • 请假

  • 换班

  • 班次调动

  • Notfound 3s 返回

  • 重置 User_item 的接口

https://docs.gitlab.com/runner/configuration/advanced-configuration.html

https://blog.csdn.net/geekqian/article/details/125942407

https://www.jb51.net/article/264471.htm

gin框架参数零值json绑定的问题 https://blog.csdn.net/weixin_42279809/article/details/107800081

https://blog.csdn.net/qq_39618369/article/details/125991257

https://devpress.csdn.net/vue/62f8fd487e6682346618b3e8.html