2021年 8月 25日
Aug 25

项目启动

1.进行项目开题——开题PPT
2.与小组成员一起学习使用Gitee团队开发
3.组长分配任务——我主要负责后端
首先学习使用IDEA和SpringBoot框架
实现通过接口接收数据

2021年 8月 26日
Aug 26

实现前后端接口

使用Spring Boot框架连接数据库
本项目使用PostgreSQL数据库
在本地已实现通过API接口获取数据
过程中遇到的问题:
项目/接口只能通过本地IP访问而外网无法访问
解决方案:
通过添加防火墙对于某一端口的规则解决了此问题

2021年 8月 27日
Aug 27

测试前后端数据交互

1.前端可以通过我提供的接口获取数据
2.后端暂时无法收到前端发送的数据
3.前端通过接口对后端数据库进行增删改暂未成功
仅能实现查询的功能——博客资料
过程中遇到的问题:
前端接收数据时遇到了跨域问题

2021年 8月 28日
Aug 28

后端成功接收前端数据

1.使用注解从前端接收数据 根据博客资料大概理解了
@PathVariable("...")和@RequestParam("...")传参的区别
2.实现了前端通过API端口对后端数据库进行增删改查的操作
3.与前端开发同学一起写开发文档——主要规定了项目接口格式
过程中遇到的问题:
启动项目后,在局域网中的用户都可以访问此项目,同理API接口也能被访问
怎么设置项目和接口不能被外界访问?

2021年 8月 29日
Aug 29

登录/注册页面测试成功

1.登陆界面由前端同学开发
2.用户名和密码均为字符串
3.已进行注册,登录的功能的测试
4.开始在团队仓库进行合作开发

2021年 8月 30日
Aug 30

制作用户个人主页

1.主页前端代码由前端同学完成
2.项目主页样式与功能模仿智慧树 访客可以浏览主页上的资源
而教师和学生可以登录到个人主页查看自己的信息和加入的课程
3.学习联合主键的使用来映射多个属性做主键的表——参考资料
4.新建表来存放用户一年每天的活跃度以及用户的个人信息
已实现用接口获取以上数据的功能,并未实现通过接口修改的功能

2021年 8月 31日
Aug 31

后端实现文件上传/下载

1.通过接口传输文件——参考资料
2.学习session和拦截器的使用——参考资料
用来记录和管理用户的登陆状态,进而开启/关闭用户的上传/下载等功能
过程中遇到的问题:
1.项目可正常启动,但是通过接口获取数据时返回空值
已解决:实体类中需要构建Getter and Setter,有对应函数后会正常返回数据
2.文件上传/下载功能暂未测试,不清楚如何通过接口传输文件的原理和机制

2021年 9月 1日
Sept 01

维护接口文档&画E/R图

1.维护开发接口文档
2.画出我负责部分的E/R图
3.已实现文件上传功能——参考资料
并可以根据用户账号,身份和文件类型存放在相应的路径中

2021年 9月 2日
Sept 02

项目引入session模块

1.实现了下载文件资源的端口
与文件上传接口向结合进而实现教学资源的上传于下载
2.已编写传输session变量的接口——参考资料
使用session记录用户登陆状态,保存在浏览器中
与前端相结合可实现页面刷新保持用户登录状态的功能

2021年 9月 3日
Sept 03

修改&测试session接口

1.与前端同学沟通后,修改设置/获取session的接口的格式和参数
通过学习可知,sessionId与一次会话一一对应,也可理解为每个浏览器创建会话后对应一个sessionId
将sessionId和用户名通过接口传到后端,后端通过id找到相应的会话,即可根据用户名判断某一用户的登陆状态
session(一个会话)会在无响应一段时间后自动销毁,一般默认时间为30分钟(可修改)
每次重启项目/服务器session会全部销毁,这时请求登录会重新生成相应的session
2.由于本项目后端由两个人开发,局域网中电脑所在的IP地址不同
所以每次将代码上传到仓库时应不上传个人的配置文件,保存在本地即可
通过修改.gitignore文件来避免开发过程中的冲突
3.修改个人主页所用到的接口,传输session判断登陆状态
4.完全实现使用session判断/保持用户登录状态的功能

2021年 9月 4日
Sept 04

学习使用OpenOffice

学习Open Office的使用 引入相关依赖
参考博客: https://www.cnblogs.com/god-monk/p/11321728.html
参考博客: https://www.cnblogs.com/xl4ng/p/13053544.html
参考博客: https://www.cnblogs.com/honey01/p/8867619.html
已成功将word,ppt转换为pdf文件 可以在线预览
不过还有细节需要完善,例如报错:Could not store document

2021年 9月 5日
Sept 05

在线预览&资源列表

Afternoon
1.完善在线预览功能,可实现word,ppt,excel等文件的转换
2.在数据库中建表,为完成课程章节的资源列表做准备
其中有章节,标签,文件等信息——参考资料
每个课程包含多个章节;每个章节包含多个标签;
每个章节下有多个文件;每个文件包含多个标签;
章节下文件标签的集合就是章节的标签
3.维护了接口文档

Evening
1.增加将txt文件转换为pdf的选项
2.md文件转换后会出现乱码的情况,可能是编码方式不同的原因
暂时无法解决

2021年 9月 6日
Sept 06

完善个人主页&资源列表&课程创建接口

1.增加更新/修改个人信息的接口
2.为前端提供图片外链——参考资料
3.增加个人信息中获取/上传/更新头像的接口
4.完善用户上传教学资源的接口

2021年 9月 7日
Sept 07

与前端对接口——个人主页

1.个人主页接口——上传/获取/更新个人信息&头像
2.解决了静态资源不会刷新的问题——参考资料
3.更改session过期时间为30min

2021年 9月 8日
Sept 08

与前端对接口——课程页面&文件列表

1.创建课程接口——上传/获取/更新课程信息
2.自定义void函数对数据库进行删除操作——参考资料
3.文件列表接口——上传/下载文件
4.修改上传文件大小限制——参考资料
理解了max-file-size和max-request-size的区别——参考资料

2021年 9月 9日
Sept 09

与前端对接口——文件列表

文件列表接口——上传/下载/在线预览课程资源
Bug: 点击下载后会下载一个不存在的f.txt文件

2021年 9月 10日
Sept 10

动态日志-建表&接口

1.新建vclog表存放日志内容
2.新建接口-新建日志&获取全部日志

2021年 9月 11日
Sept 11

动态日志&文件删除

1.修改/完善vclog表存放日志内容
2.新建接口-根据课程id获取所有日志/最新的100条日志
3.新建文件删除接口 只有老师有权限删除文件

2021年 9月 12日
Sept 12

文件删除&订阅课程

1.完善文件删除接口 如果之前有通过OpenOffice插件转换的pdf文件
删除时同时将pdf删除 避免出现文件重复/空间浪费的情况
2.完善文件上传接口 通过文件id确定唯一文件 统一用户不可上传相同类型的相同文件
3.使用@Schedule注解设置每天凌晨5点清空所有session——参考资料
其中也用到了Cron表达式来设置时间——参考资料
4.增加课程订阅功能 编写相关接口——订阅课程&获取某课程所有订阅者
5.新增接口——通过老师/同学用户名获取创建/订阅的所有课程
修改Bug:
1.当老师修改昵称后,老师创建的课程仍显示之前的昵称(已解决)

2021年 9月 13日
Sept 13

用户活跃度(Git日历)&课程安排(课表)

1.用于显示个人主页的活跃值 每次显示去年的同一天到今天的活跃值
组成用户的年活跃表 与Github和Gitee个人主页的Git提交日历相似
2.给课程安排建表 用来存放本学期/本学年的进度与安排

2021年 9月 14日
Sept 14

课程安排(课表)

编写课表接口————接收/获取/删除

2021年 9月 15日
Sept 15

成功实现课程安排(课表)

1.课表可在课程主页下拉查看
2.老师可以先选择起始日期和结束日期来生成空课表
3.老师可以编辑课表每一项的内容

2021年 9月 21日
Sept 21

学习并实现给文件加水印

水印统一为: 天津大学智能与计算学部
参考资料——https://www.jianshu.com/p/e139982c20e8
参考资料——https://blog.csdn.net/sjmz30071360/article/details/84754791

2021年 9月 22日
Sept 22

课程添加绘制思维导图功能

老师可以给每个课程绘制一个思维导图
提交后将数据存在后端
获取后前端渲染来实现

2021年 9月 23日
Sept 23

查找并解决Bug&优化代码

Bug:
1.txt文件无法在线预览
2.删除文件时没有将在线预览生成的pdf文件删除
3.文件输出流未关闭
4.ppt文件类型设置错误
5.md文件无法在线预览(未解决)
优化:
1.尝试将项目中绝对路径改为相对路径(已实现)
通过获取项目根目录地址,加上文件存储的路径得到文件的绝对路径
变相的实现了项目的可移植性
项目总结

2021年 9月 24日
Sept 24

结项汇报&改Bug

Bug:
1.对于新创建的老师用户,如果没有设置个人信息,则无法创建课程(已解决)
在新建账户后,自动生成只包含账号、昵称和身份的个人信息,昵称默认为用户名,其余为空
项目汇报——结项PPT

2021年 10月 31日
Oct 31

提交结课报告

个人结课报告

项目介绍

项目背景

本次实践我们选择的项目为《计算机系统基础》虚拟教研室在线平台。以小组形式进行组织,组内共4人,2人负责前端同时另外两人负责后端。我是后端开发成员之一。之前一直没有接触过后端及其相关知识的学习,所以这次实践对我个人来说算是一次挑战同时也是一次不错的合作开发经历

主要目标

作为后端负责人之一,首先要实现通过接口发送/接收/存储数据,与数据库进行交互。在这次虚拟教研室的项目中,需要实现有关信息交流、资源共享以及信息筛选等功能。我们的共同目标是使用应用程序设计语言完成较为复杂并且有一定使用价值的软件设计,在合作开发中提升自身的技术沟通能力和项目管理能力。制定相关项目计划并严格执行,不耽误团队进度。同时锻炼自己的创新思维和自学能力

我已经把这次项目个人的详细工作日志整理到了个人博客上,其中包括每天的具体安排、遇到的问题、解决方法以及参考资料等信息

主要工作内容

我所负责的工作内容如下

  • 资源共享:提供教学资源上传、下载并支持云平台在线预览的功能
  • 信息筛选:支持根据章节、知识点类型、文件类型等多元形式筛选教学资源
  • 用户信息:提供用户注册/登录的功能,每个用户拥有自己的个人主页,显示个人信息,贡献日历以及所订阅的课程
  • 登陆状态:通过引入session模块实现维持用户登陆状态的功能
  • 动态日志:在教师所创建的课程中,实现动态日志模块记录教师与学生的活动
  • 课程安排:老师可创建课程的课表(课程安排),与上海交通大学课表类似
  • 文件水印:在线预览课程资源时,为提高版权意识,增加天津大学智能与计算学部水印
  • 思维导图:老师可给自己创建的课程绘制思维导图供学生查看,类似于知识点拓扑图,课程大纲

以上大致是我的主要工作内容,本次实践中上述功能已全部实现,不过编码风格及数据库建表存储方面还有很大的提升空间

技术路线

  1. 首先我自学了Spring Boot框架用来搭建后端服务

在大二下半学期系统学习了Java面向对象编程语言😄。使用Spring Boot框架的主要原因是它是基于Java平台上的一种开源应用框架,提供了具有控制反转特性的容器。此外,其简化了新Spring应用的初始搭建以及开发过程。该架构使用了特定的较为简单的方式进行配置,从而使开发人员不再需要定义样板化的配置。可以基于其Gradle插件创建独立的Spring应用程序,并且内嵌Tomcat容器,便于部署。Spring Boot框架继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程,通过集成大量的框架使得依赖包的版本冲突以及引用的不稳定性等问题得到了很好的解决

  1. 使用PostgreSQL管理与维护数据库

同时在大二下半学期系统学习了PostgreSQL,了解到PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统,其支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询、外键、触发器、视图、事务完整性、多版本并发控制等。同样,PostgreSQL也可以用许多方法扩展,例如通过增加新的数据类型、函数、操作符、聚集函数、索引方法、过程语言等。更重要的是,因为许可证的灵活,任何人都可以以任何目的免费使用、修改和分发PostgreSQL😁

  1. 使用Open Office插件实现文件资源的在线预览功能

在项目需求中老师明确提到了项目需要实现文件资源的在线预览功能,推荐我们使用Open Office插件。在网上了解到OpenOffice.org是一套跨平台的办公室软件套件,能在多操作系统上运行,并且与各个主要的办公室软件套件兼容。此外,OpenOffice.org是自由软件,任何人都可以免费下载、使用及推广它😉。在本次实践中,使用Open Office插件实现了多种文件的转换以及在线预览,包括word文档、PPT、txt文本、PDF、图片、markdown等文件类型,除markdown外都可成功转换并预览,markdown出现乱码情况,我猜可能是不同文件的编码不同所导致的,暂时没有解决

  1. 使用iText组件实现给文件资源加水印的功能

与老师开小组例会时,老师强调需要提高版权意识,给在线预览的文件资源加上水印。于是我使用了iText组件来实现。iText组件是一种生成PDF报表的Java组件,通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件,是一个著名的开源项目。iText的安装和使用也非常方便,下载iText.jar文件后,只需要在系统的环境变量——CLASSPATH中加入其路径,在程序中就可以使用iText类库了。在实现时首先引入依赖,再根据其代码逻辑与方法对PDF文件加水印即可

问题汇总

  1. 接口只能通过本地IP访问而局域网内其余IP地址无法访问

通过添加防火墙对于某一端口的入站和出站规则解决了此问题

  1. 项目启动后,局域网中的所有用户都可访问此项目以及相关API接口

通过在项目中引入session模块,只有在用户登录后才可访问相关信息,在项目中使用Cron表达式已设置每天定时刷新已存储的session id,并且设置过期时间为1小时,这样就可以确保不被外网用户访问

  1. 部分项目接口返回空值

在实体类中需要构建Getter与Setter方法,有对应函数后就会正常返回数据

  1. 如何通过接口传输文件

使用POST请求,使用MultiFile类进行文件传输,接收文件后按照项目中已设置的路径,存储在本地

  1. 引入OpenOffice实现在线预览

在项目配置文件中设置OpenOffice插件路径,启动项目时会自动启用该服务。在实现中,使用DocumentConverter类对文件进行转换,均转换为PDF文件。通过接口,在response以文件流的方式发送给前端从而实现在线预览。为提高版权意识,引入iText包加上水印,防止直接下载传播

  1. 项目静态资源如何自动刷新

用户上传文件后,需要重启项目才能够访问该文件。通过修改运行配置,改为自动刷新静态资源,从而解决此问题

  1. 如何增加项目的可移植性

首先是关于路径问题,在项目中有多处使用到项目的路径,假如设置为绝对路径,就极大程度降低了项目的可移植性。现在已通过改为绝对路径从而解决此问题

系统实现

在本次项目中的后端架构中,通过controller层向前端提供接口,通过repository层与数据库进行交互。entity类为与数据库映射的实体类,embedded类为实现联合主键的辅助类

对于用户实体,映射到vclassuser类中,记录用户的账号、密码以及身份,以账号为主键,不可更改。在controller层中各类中需要验证用户身份,登陆状态等信息时,都需要通过UserRepository与数据库进行信息核对,确认无误后才可进行后续操作

controller层各类功能如下所示

  • UserController
    • 个人用户以用户账号为主键,不可更改
    • 注册新用户:用户自定义账号及密码,选择身份
    • 登录:输入账号密码,验证通过后即可登录
    • 更改密码:通过旧密码可能改密码
    • 登出:取消用户的登陆状态
1
2
3
4
5
// UserController
{{ip}}:8080/user/api/add/ 注册 新增用户
{{ip}}:8080/user/api/update/username={username} 更改密码
{{ip}}:8080/user/api/login/ 登录
{{ip}}:8080/user/api/logout/ 登出
  • UserInfoController&UserActivityController
    • 用户信息实体类同样以用户账号为主键,不可更改
    • 在用户个人主页,需要使用此类中的各个接口对页面信息进行填充与更新
    • 详细信息包括头像、昵称、签名、地址、年级、个人主页以及活跃度日历表
1
2
3
4
5
6
7
8
// UserInfoController
{{ip}}:8080/user/api/getInfo/ 获取个人信息
{{ip}}:8080/user/api/updateInfo/ 更新个人信息
{{ip}}:8080/user/api/getAvatar/ 获取用户头像
{{ip}}:8080/user/api/setAvatar/ 设置用户头像
// UserActivityController
{{ip}}:8080/user/api/getAct/ 获取一年内个人活跃度记录
{{ip}}:8080/user/api/setAct/ 根据用户活动更新活跃度信息
  • CourseController
    • 课程实体类以课程id为主键,不可更改
    • 老师创建课程时会调用此类中的相关接口,传输课程信息,存储到数据库中
    • 在用户浏览课程主页时,使用接口获取课程相关信息
    • 在学生进入个人主页时,使用接口获取已参加的课程
    • 在老师进入个人主页时,使用接口获取已创建的课程
    • 用户可在课程主页订阅 / 退订课程,通过接口与后端交互
1
2
3
4
5
6
7
8
// CourseController
{{ip}}:8080/course/api/updateCourseInfo/ 用于新建或修改课程相关信息
{{ip}}:8080/course/api/getCourse/ 进入课程主页时获取课程信息
{{ip}}:8080/course/api/getAllCourseByTeacherusername/ 获取老师创建的全部课程
{{ip}}:8080/course/api/getAllCourseByStudentusername/ 获取学生加入的全部课程
{{ip}}:8080/course/api/getAllCourse/ 获取整个虚拟教研室系统中的全部课程
{{ip}}:8080/course/api/subscribe/ 学生用户调用此接口来订阅课程
{{ip}}:8080/course/api/getAllSubscriber/ 获取某一课程的全部订阅者
  • CourseScheduleController
    • 老师在创建课程后,可定制课程安排
    • 选择起始时间以及结束时间,之后对课表内容进行编辑,由接口接受数据后存储在数据库中
    • 在获取时使用此类中相关接口传输相关课程的全部课表信息
1
2
3
4
// CourseScheduleController
{{ip}}:8080/course/schedule/api/getSchedule/ 获取课程的课程安排
{{ip}}:8080/course/schedule/api/setSchedule/ 设置课程的课程安排
{{ip}}:8080/course/schedule/api/deleteSchedule/ 删除课程安排
  • CourseMindMapController
    • 与课程安排相似,老师在创建课程后,可绘制课程的思维导图
    • 通过前端的交互页面进行创建,结点与联系存储在后端
    • 获取时通过此类接口传输数据,由前端接收并渲染生成思维导图
1
2
3
4
5
// CourseMindMapController
// 课程思维导图由若干结点组成
{{ip}}:8080/course/mindMap/api/addMindMapNode/ 新建思维导图结点
{{ip}}:8080/course/mindMap/api/getMindMap/ 获取课程思维导图的全部结点
{{ip}}:8080/course/mindMap/api/deketeMindMap/ 删除课程思维导图
  • ChapterController&FileController
    • 在老师创建课程时,可新建课程的若干章节及其涉及的相关知识点
    • 在不同章节下老师和学生均可上传课程资源,每个课程资源带有各自的知识点标签
    • 只有老师有删除文件的权限,学生和老师均可下载资源
    • 游客登录的账户仅有在线预览的权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// ChapterController
{{ip}}:8080/course/chapter/api/updateChapter/ 新建或更新课程的章节以及详细信息
{{ip}}:8080/course/chapter/api/deleteAllChapter/ 删除课程下的所有章节
{{ip}}:8080/course/chapter/api/getAllChapter/ 获取课程全部章节及具体内容
// FileController
{{ip}}:8080/file/api/uploadFile/ 用户上传文件时所用的接口
{{ip}}:8080/file/api/downloadFile/ 用户下载文件时所用的接口
{{ip}}:8080/file/api/OnlineBrowsing/ 用户在线预览文件时所用的接口
{{ip}}:8080/file/api/getAllFile/ 按章节分类获取课程下的所有文件资源
{{ip}}:8080/file/api/deleteFile/ 删除课程下某一章节的文件资源
// Add Water Mark "天津大学智能与计算学部"
private void addWaterMark(File srcFile,File destFile,File destFileWithWatermark) {
// 加水印
try {
PdfReader reader=new PdfReader(new FileInputStream(destFile.getPath()));
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(destFileWithWatermark.getPath()));
BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
PdfGState gs = new PdfGState();
int pageCount = reader.getNumberOfPages() + 1;
PdfContentByte content;
Rectangle pageRect=null;
for (int i = 1; i < pageCount; i++)
{
content = stamper.getOverContent(i);
gs.setFillOpacity(0.5f);
content.setGState(gs);
content.beginText();
content.setColorFill(BaseColor.LIGHT_GRAY);
content.setFontAndSize(baseFont, 45);
pageRect=stamper.getReader().getPageSizeWithRotation(i);
float x = pageRect.getWidth() / 2;
float y = pageRect.getHeight() / 2;
content.showTextAligned(Element.ALIGN_CENTER, "天津大学智能与计算学部", x, 3*y/2, 45);
content.showTextAligned(Element.ALIGN_CENTER, "天津大学智能与计算学部", x, y/2, 45);
content.endText();
}
stamper.close();
reader.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
// Online Browsing 通过文件流传输文件, 同时调用加水印函数实现在线预览
private String OnlineBrowsing(@RequestParam("uploaderUsername") String uploaderUsername,
@RequestParam("ftype") String ftype,
@RequestParam("fname") String fname) {
List<vclassuser> vclassuserList=userRepository.findUserByUsername(uploaderUsername);
if(vclassuserList.isEmpty()) return "fail";
vclassuser u=vclassuserList.get(0);
String src=root+"//VClass//"+u.getStatus()+"//"+uploaderUsername+"//"+ftype+"//"+fname+getSuffixByFileType(ftype);
String dest=root+"//VClass//"+u.getStatus()+"//"+uploaderUsername+"//"+"OpenOffice//temp//"+ftype+"//"+fname+".pdf";
String destWithWatermark=root+"//VClass//"+u.getStatus()+"//"+uploaderUsername+"//"+"OpenOffice//"+ftype+"//"+fname+".pdf";
File srcFile=new File(src);
File destFile=new File(dest);
File destFileWithWatermark=new File(destWithWatermark);
if(!srcFile.getParentFile().exists()) {
srcFile.getParentFile().mkdirs();
}
if(!destFile.getParentFile().exists()) {
destFile.getParentFile().mkdirs();
}
if(!destFileWithWatermark.getParentFile().exists()) {
destFileWithWatermark.getParentFile().mkdirs();
}
try {
// 文件转换为pdf
converter.convert(srcFile).to(destFile).execute();
// 加水印
addWaterMark(srcFile,destFile,destFileWithWatermark);
//使用response,将pdf文件以流的方式发送给前端
ServletOutputStream outputStream = response.getOutputStream();
InputStream in = new FileInputStream(destFileWithWatermark);// 读取文件
// copy文件
int i = IOUtils.copy(in, outputStream);
System.out.println(i);
in.close();
outputStream.close();
}
catch (Exception e) {
e.printStackTrace();
}
return "OpenOffice";
}
  • LogController
    • 在课程主页会显示课程相关的动态日志
    • 在用户上传/下载/在线预览课程资源时,会调用此类中接口增加记录
1
2
3
4
// LogController
{{ip}}:8080/log/api/addLog/ 新建课程的动态日志记录
{{ip}}:8080/log/api/getAllLog/ 获取课程的全部动态日志
{{ip}}:8080/log/api/getTopHundredLog/ 获取最近100条记录

总结反思

在本次开发过程中,我自学了后端开发的相关知识,在Spring Boot框架下与前端进行交互,使用PostgreSQL数据库,通过接口发送/接收数据。我主要负责的部分是登录/注册,用户个人信息,课程以及文件相关的接口。本次项目中我的大部分工作为接收/存储/发送数据。此外,项目要求中有需要实现文件在线预览的功能,在老师建议下通过OpenOffice插件将文件转换为pdf,为提高版权意识再加上水印——天津大学智能与计算学部,最后传给前端。最让我印象深刻的是与前端对接口的过程,它并不是简单的结合,需要不断地纠错与修改,耗费了大量的时间。这次实践也遇到了一些问题,首先就是刚才所提到的对接口所用的实践,可能是因为接口文档没有认真维护;这是第一次合作开发,把本地代码合并到远程仓库的过程中遇到过几次冲突。我们解决冲突的方法是在线上通过Web IDE解决,或是直接关闭PR请求,在本地解决后,新建一个没有冲突的请求;项目完成后,再看所写的代码,仅仅实现了功能,但是编码水平和细节以及数据库建表存储方面还有很大的提升空间

项目致谢

首先感谢我们项目的指导老师,每周组会帮我们纠正在设计当中出现的问题,并耐心地解答我们的疑惑,定期的检查和认真指导使我们的项目能够保质保量的完成。在开发过程中,为程序的需求、框架的设计、代码的撰写等方面提供了很多宝贵的意见与建议,为我们推荐了许多有用的资料和工具,使我们受益匪浅。在中期检查、作品验收以及最后答辩时,都给予了我们很多鼓励和帮助

其次要感谢我们项目小组中的成员,在组长的带领下,按照计划严格实行,积极完成相关工作。进行了gitee合作开发的尝试与指导,实现前后端接口的传输,将所学的理论知识运用于实践当中。遇到问题时通过独立思考以及团队讨论进行分析找出解决办法,明确设计思路,扫清了系统设计上的障碍,保证按时完成相关任务

经过四周的合作开发,小学期的项目暂时告一段落。由衷的感谢指导老师以及小组的成员们,老师严谨求实的态度和同学们辛苦努力的精神都是十分值得我们去学习的。过程中锻炼了自身的专业素质,培养了耐心踏实的工作作风,为今后的学习生活打下坚实的基础