SDUSTSourceServer

前言

鉴于学校缺少一个资源站(或者我不知道)决定设计一个校园资源服务器来给全校师生提供一个资源下载和共享的平台。
编程语言我选择了Go语言,因为这一阶段都在学习Go语言,且得益于Go本身的Web包和各种开源框架能够较为简单的架设起整个环境。

使用了哪些工具

1.Golang 1.14
2.Gin框架1.6.3
3.gorm框架
4.mysql

功能介绍

main.go 是主程序的入口,包括了服务器数据交互,GET/POST请求处理等多个基本功能。
gotools 包内是包含了对Html/Javascript 进行转义或相应处理的方法。我在后续的更新中会持续为这个包添加新的方法。

版本信息

v1.0.1在宿舍和机房调试后暂时都可以正常运行,多用户访问内网IP均可正常服务。
已有的功能
用户注册信息并保存至服务器。
登录后可以在个人中心页面查看当前登录状态、资料完整度。
一次登录即可在客户端保存Cookie[120s]。
Cookie存活期内访问权限页面时服务器会根据Cookie的内容查询数据库有无对应账户,合法用户会允许访问,非法用户会禁止访问并返回JSON。(完成Cookie-Session双重认证功能)
访问主站地址为IP+端口,如192.168.135.103:9090/ 或 192.168.135.103:9090。若登陆过并且Cookie活动时间还存在的用户再次访问该地址将自动重定向到个人中心页面。
登录用户可以访问上传页面和下载页面,当前设置并无上传和下载次数限制。


v1.0.2
本次更新的功能:增设了获取服务器本地IP的功能,可以根据不的网络自动配置Cookie中的domain信息,不必每次手动输入IP。
将获取IP的功能实现设计为函数,后续决定要不要单独设置一个包。
修正了第一次注册登陆的用户无法存储Cookie的问题,目前的Cookie自动刷新只有老用户登录、新用户注册两个接口可以调用。
setCookie 功能封装为一个方法,后续版本决定是否设置单独包和包合并的问题 见H1
消息系统开发:依托于Go模板引擎和JS解析JSON,从服务器发送系列化后的消息数据数组(JSON),通过模板传递给前端,前端JS代码调用模板获取JSON字符串,
将其用JS解析成可以识别的JS对象,呈现在页面上。
用户点击主页的“我的消息”会跳转到一个链接,链接中以表格的形式显示用户的消息列表,目前设置四个字段:Sender Receiver Content Read。
页面可以向任意用户发送消息:
通过本页面的form输入接收者学号、信件内容即可发送消息,发送失败(无效的接收者)会重载页面并标记错误,成功则会刷新页面。

_H1:已创建Cookies包和SDUSTUser包用于存储跟Cookie相关的功能以及用户结构体及其相关方法


v1.0.3

计划加入的特性:密码加密功能,对接受的来自用户的密码进行加密算法,初步设想是自己设计,为tools包下的secret.go中,看看效果如何再移植,如果自己的算法效果不好就用已有的算法。

重写了Cookie/Session部分,采用了更加安全的验证方法,通过设计一组方法簇来抽象出针对不同实现形式的Session管理器,依托管理器来对Session进行管理,完成Session的初始化、管理等;同时使Session不直接与数据库/底层存储交互,利用管理器来减少耦合性。 [TIPS]:Session开发不完备,对于GC和生命周期未完善。

[REMAKE:移除Cookie包内容,将Cookie包内的部分功能和Session包合并,将原来的代码保存,修改所有API,设计新包DBCheck,用于实现各种管理器和数据库交互的功能。

计划加入用户"独立文件空间"概念,并第一个提供用户头像功能。
独立地址空间设计:UAS
给每个用户提供独立的文件夹目录用于存储用户的文件等信息,计划是如网盘软件一样限制每个用户的空间大小,给予一定分配。

所要做的任务:

  • 用户第一次注册时创建好一个文件夹,用于放该用户的文件信息。
  • 这部分功能需要依托OS来完成mkdir等工作. 指定文件夹的名称为唯一地址,并将地址存储于数据库的表中。
  • 由于采用orm连接数据库表的方式,所以这里打算考虑结构的类型,直接利用表迁移功能确定表的结构
type UserAddrSpace struct{
	Model
	userID string
	userAddr string
	currentSpace uint64
	MAXSpace uint64
}

其中userID是可以区分一个用户的唯一标识,userAddr是分配给每个用户的根目录,对用户屏蔽该目录,只暴露子目录给用户,该根目录存储一些用户的文件,用来方便系统对其进行管理。
最后两个字段用于记录当前使用程度。


已设计完成的计划:
添加UAS及其管理器部分功能,整合了model包以及更新了gotools包。
添加了一个简单的日志生成工具,需要继续增加细节和整理。
修改main函数中的handlFunc独立出来,但未完全独立,仍与main函数在同一个文件下,因为handleFunc中有一些管理器等参数,暂时无法直接剥离,会在后续开发中完善。
凭借UAS实现了一个简单的用户头像功能,初次注册即可初始化UAS空间,并内置一个headImage文件夹(用户屏蔽此层)用于存放头像。
其他部分作为用户个人空间。

其他:前端部分已有新的开发人员帮助开发,期待更美观的界面。


v1.0.4

更新:修改了用户密码的存储方式,使用了加密算法使得用户数据更为安全。
设计更新了secret包,在其中做安全存储的功能。其中有加密方法、验证方法和加盐常量设置。将此包重命名为Secret

设计了Save包,内部存放一些关于对于文件的操作,通过设置此包来减少主程序与文件的直接操作。


v1.0.5

更新:本次更新将项目的重点转移到了前端重构上,使用了Bootstrap框架,对原来的内容进行了重新设计,核心功能不变,依旧以上个版本的更新内容为主,对前端布局重新设计,更为美观和直观。

在这次重构的过程中设计了多个计划的项目,包括但不仅限于:

将注册和登陆页面数据格式验证功能转移到前端,采用JavaScript判断并予以反馈,对于数据的正确性则仍旧在后端完成。

注册页面提供一个项目条款确认控件,需要完善内容。

登录页提供一个找回密码/修改密码的功能,尚未写具体实现。

导航栏中“我的”按钮部分的具体内容只完成了消息和个人空间转到功能,需要完善其他内容。如云空间、其他

主页中更多产品关于我们等项目尚未完善具体的页面。

仍有太多页面存在bug需要修复。

关于屏幕适配没有做完善。

后端做出的修改:

对于版本描述写了新的conf用来管理,将最新的更新说明放到目录下,服务器根据版本号提取配置文件,发送给前端。


v1.1.1

修正:上个版本为v1.1.0

由于引入了新的前端框架,所以此后的版本为1.1.*,这个版本段的主要工作内容为填坑,补全之前设计的内容,并尽量修复bug。

更新日志设计规范:

更新[NEW]:添加的新项目

修改[MOD]:修改之前版本内容

重写[OVR]:重写某一个模块

移除[RMV]:删除某一个功能/模块

完善[RCH]:完善某一个之前设定的预期内容

本次开发主要针对前端样式进行进一步的修饰,添加了模态框这一内容,用以增强某些视觉效果。
引入了一种新式的前后端交互方式,完全良好的利用了模板引擎这一特征,直接将数据传送到前端,而前端只需要一个对象接受这些数据,在实际的操作中完成分发的行为即可。
这也是在本系统开发中定义的第一个标准。

[STD#01]项目开发规范标准#01:
服务器提交给前端数据仍旧以模板的方式交互,在后端代码中规范返回的数据内容,以不同的字段代表数据,其数据集合为一个标准的对象;前端使用代码var msg = {{ . }}获取总的对象实例,根据后端定义的数据内容获取指定字段的数据,对前端的功能、属性进行对应的部署。通过这种规范标准化前后端的工作内容,简化工作步骤,减小两者之间的交互复杂性。代表性的应用是模态框接收alert警告的处理方式(见注册页和登录页)。
见详细日志

本次更新的一个重要内容就是对于云空间这一部分的设计,由于本系统是专门提供资源下载共享服务的,因此需要不断实现这一核心功能。
在此次更新中,对于后端我设计了特定url资源的访问与下载。这个技术可以在之后在深度开发,提供更为稳健,更为良好的服务。
对于前端我独立设计了一个目录系统检索框架,模拟了用户对于自己目录系统的访问和查看效果,速度很快,基本实现了基础的功能,可以在之后的设计中对这个框架进一步开发细化。

在之后的版本里我会对于云空间 这一模块继续开发完善。

见详细日志 位置:Dev/mylog_1.1.1.md


其他

资源部份有五张Stardewvalley资源图片,若存在侵权请联系我删除。
感谢Q1mi老师的go教程,受益匪浅。其博客地址liwenzhou.com