网络中心排班系统开发日志-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过期事件
需要用到的网站:
- Go 库 https://pkg.go.dev/
- Gorm DAO https://gorm.io/
- GIN web 框架 https://gin-gonic.com/
- Vue3 js https://v3.cn.vuejs.org/
- gormt 根据数据库自动生成 model https://github.com/xxjwxc/gormt
- element+ Vue3 组件库 https://element-plus.gitee.io/zh-CN
- Vue3 ts 快速上手 https://24kcs.github.io/vue3_study
- 快速用 go gin 构建项目教程 https://developer.okta.com/blog/2021/02/17/building-and-securing-a-go-and-gin-web-application
- 为 Gin 框架配置跨域(暂时没用到) https://zhuanlan.zhihu.com/p/43255082
- 密码加盐加密存储及其登录验证方式 https://zhuanlan.zhihu.com/p/342051053
- axios 基于 promise 的网络请求库 https://axios-http.com/zh/docs/intro
- Vue3 前端教程-登录功能 https://blog.csdn.net/qq_18671803/article/details/120920955
- Vue3 / Ts Router 讲解 https://blog.csdn.net/Royzilong/article/details/123736090
- Typescript 快速上手 https://www.tslang.cn/
- axios 正确用法 https://www.likecs.com/ask-7991875.html
- 定义 gorm db 全局变量 https://www.h5w3.com/182882.html
- 前端常用加密方式 https://blog.csdn.net/GTH07399/article/details/123136428
- 前端加密AES、RSA、SHA256用法 https://blog.csdn.net/weixin_44545318/article/details/122824608
- crypto-js https://github.com/brix/crypto-js
- JWT IETF docs https://self-issued.info/docs/draft-ietf-oauth-json-web-token.html
- golang-jwt https://github.com/golang-jwt/jwt
- golang-jwt介绍 https://blog.csdn.net/weixin_44294408/article/details/122095919
- jwt 介绍(阮一峰) http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
- 在 gin 中使用 golang-jwt https://blog.csdn.net/weixin_43987921/article/details/119639309
- RBAC权限系统分析、设计与实现 https://shuwoom.com/?p=3041
- async 函数的含义和用法 http://www.ruanyifeng.com/blog/2015/05/async.html
- 前端鉴权必须了解的 5 个兄弟:cookie、session、token、jwt、单点登录 https://baijiahao.baidu.com/s?id=1710656941076243312&wfr=spider&for=pc
- 前端鉴权的兄弟们:cookie、session、token、jwt、单点登录 https://juejin.cn/post/6898630134530752520
- cookie https://javascript.ruanyifeng.com/bom/cookie.html
- 前端存储-cookie https://blog.csdn.net/weixin_43845090/article/details/109291316
- JavaScript 教程 https://wangdoc.com/javascript/basic/index.html
- Argument of type ‘‘ is not assignable to parameter of type ‘never‘. https://blog.csdn.net/survivorsfyh/article/details/112184818
- gin-vue-admin https://github.dev/flipped-aurora/gin-vue-admin
- Go 每日一库 https://github.com/darjun/go-daily-lib
- Github Daily https://github.com/GitHubDaily/GitHubDaily
- vue-router(v4) 组合式API https://router.vuejs.org/zh/guide/advanced/composition-api.html#%E5%9C%A8-setup-%E4%B8%AD%E8%AE%BF%E9%97%AE%E8%B7%AF%E7%94%B1%E5%92%8C%E5%BD%93%E5%89%8D%E8%B7%AF%E7%94%B1
- git commit 书写规范 https://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html
笔记:
前端渲染周日程表的时候,应该的按行渲染的,即一周,一个时间段一个时间段一行过去渲染
获取当前周 -> 获取当前周排班表 ->(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,超帅和安全
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
2023/3/2
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