(杨子航 编辑于 2019/01/01)
IT侠预约系统设计方案,整体结构的说明文档,希望能给有兴趣的或者没有兴趣但是碰巧看到这里的人或者其他生物提供一些有意义的参考。
时隔两个多月我又来更新了,更新的原因一是代码写不动了,二是真的太久没有更了…
此处预约系统指的是2018年下半年开始开发的新系统…
而不是(至少2019前)一直在使用的老系统以及曾经在开发的另外一个新系统
也许应该想办法区分一下它们。
在此 感谢曾经为IT侠网站建设做出贡献的各位前辈
项目路径
下面是新系统的各个部分在github上的地址,此处还有一个说明…
除了前端是完全开源的之外,node和java、python部分保留了一些不公开的配置文件。
所以直接拉下来的项目是没有办法直接运行的,如果需要运行请联系我或者其他开发人员
服务器上保留了可以让项目运行的几份文件。
至于为什么我们把项目拆成了这么多个部分(不得不说其实这一个学期以来我经常因为这个稍微有些复杂的项目结构感到头痛,在其中仍然存在许多不合理的部分,留给新的一年处理吧),
一开始的考虑其实非常简单,IT侠的人员组成可能会包含了各个院系的成员,不同的成员钟爱的开发语言不尽相同,我们希望不同语言的开发者都可以参与进来。
目前已经搭好了架子可以上手开发的有:
- Vue前端
- Java后端
- JavaScript后端(我可能会混着用js,node,express来指代这一份后端,这一部分有特殊的职责)
- Python后端
如果有新的语言加入,需要完成的事情有:
- 一份从拉取代码到构建并完成部署项目的shell脚本
- 一份能将项目部署至docker的Dockerfile
- 一些私有的配置文件(如果有)
好废话先到这里,具体的事情我应该在另外的文档或者这份的尾部进行说明…
前端
前端使用Vue开发,下面是项目地址:
https://github.com/NJU-itxia/itxia-vue.git
文档等参见README
后端-node
此部分用于统一处理前端请求,包含权限管理和反向代理。使用express开发。
https://github.com/NJU-itxia/back-end-controller.git
后端-java server
https://github.com/NJU-itxia/back-end-java-server.git
后端-python server
地址在这里,感谢我们的开发者 赵懿晨、 齐家乐 (排名先后为我想起来的顺序)
https://github.com/NJU-itxia/back-end-python-server
整体结构
图中内容与实际结构稍有出入,毕竟,这个图是两个多月前的一个构想。
业务流程
用户通过浏览器访问网站。前端提供页面,并通过ajax向node中间层请求服务,node中间层检查用户的权限后,根据不同后端服务器实现的不同的服务,将请求转发至对应的后端,获取到结果后向前端返回json数据,前端对返回的数据进行渲染后呈现给用户。
此外,对于配置的需要对应权限才能访问的路径,以及登陆登出等与权限相关的操作,都交由node中间层完成。也就是对于一些需要权限的路径(url),会在node层执行权限检查之后再决定是否转发至后端。
我们用一串不太友好的伪代码来说明:
1 | def req 前端请求 |
前端
这里应该是一段对前端的说明…
阐述一下现状:
一边在把该出的界面出完 一边在整理杂乱的代码
至于为什么在整理杂乱的代码,当然是因为代码写得乱了。
前端开发的任务放在了这个github自带的看板: https://github.com/NJU-itxia/itxia-vue/projects/1
后端
- 后端由node层统一负责与前端的通信以及权限验证
- java server目前负责完成绝大部分的功能
- python server负责邮件服务、短信服务以及文件服务等(计划)
- 其他……后续补充
后端也有对应的看板,打开github项目的project就可以看到了。此处不贴链接。
数据服务
数据服务仍在计划中,可能会使用Jpa完成IT侠相关数据的服务,使用thrift或grpc提供给后端各个服务调用的接口。
也可能直接使用http接口调用。有得用就好了,现在的情况是至少node部分和java在各自使用同一个数据库,所以一个简单的自动加密密码的想法一直没有实施。
项目的部署
我想用jenkins但是没有用,看起来是杀鸡用牛刀,但是现在看起来是造了一个残缺的轮子。
目前的自动部署的方式就是…
在服务器上放了一个用ruby写的服务器,代码push到github上时会触发webhook,发送对应的请求到服务器,服务器根据不同的路径选择执行不同的部署脚本。
不同的脚本就是简单的shell脚本,干的事情如下:
- 把代码来下来
- build一下,成功了继续
- 找到写好的Dockerfile
- build一个docker image
- 把上一个版本清掉,清理掉,丢掉
- 使用最新的image运行一个container
当然我觉得直接就运行脚本太粗暴了,应该有一个队列,如果有好几个一样的请求一起来,没必要一个一个都处理的…
(能用就好了能用就好了,我觉得燕麦味道很一般)
还有一些小问题没有解决,放在这里:
- 我的几个docker image在build之后,dns有问题,无法使用域名访问,检查发现/etc/resolv.conf有一些问题,但是在Dockerfile中使用RUN修改文件内容没有效果,所以目前调用阿里云的服务出了问题。
- 还有一个问题就是我一下想不起来还有什么问题了