作业要求和分析:

使用Java Swing 框架实现一个类似推特的客户端GUI。客户端可以和学校提供的Server通信,实现下列功能:

实现账户创建,登录功能,本地保存用户名密码的功能

实现session功能,其应有自动刷新token防止过期的功能

实现获取和发送推文的功能。其中应包括获取最近的推文,获取某个用户的推文和获取特定tag的推文。

实现关注用户的功能

扩展功能:可以展示富文本,可以回复特定的推文,提供桌面快速启动等等

作业分析:

这个作业可能是考虑到课时和学生的能力,没有让学生实现所有推特的功能:客户端和服务端。这样一来,学生只需要关注客户端的实现,而更重要的用户系统,数据系统等等被封装到一个jar包里。可以说,出发点是好的,但是这样有一些缺陷,比如登录以后服务器没有返回token,也不提供credential验证的功能,这实际上是大公司基本都会用的技术,但是jar包服务端没有这样做,导致想要本地保存用户名密码就只能明文保存。这些留到后文细说。

作业考察的方面:

代码是否有清晰的分层,模块化。

是否使用合适的包。

代码是否清晰简单。

是否使用了合适的数据结构。

是否有清楚的注释。

是否正确使用GIT提交代码。

作业难点和分析

项目框架

作业难点

Swing框架。跟学生聊过以后得知,学生之前没接触过GUI框架。意味着学生需要先学习框架才能开发。Swing框架是一个比较成熟的框架,学习不需要太多时间,但如果学生多线程,listener等相关知识如果了解不够深,还是会在使用中遇到不小问题。

本地保存用户名密码的需求,要求学生掌握FILE IO,多线程等知识。

如何选定合适的数据结构存储相应的数据,方便做展示,排序,查询等等。

如何划分模块,确定各个模块的生命周期。

How to do it:根据作业要求见招拆招

如何实现自动刷新token:用线程不断发起独立的请求从而刷新token

要有独立的登录,注册和展示界面:使用三个window负责不同的功能。每个window有独立的生命周期。

要能搜索和展示推文:使用textfield和button调用搜索接口,使用textarea封装和展示推文,推文用List封装和排序。

如何保存关注特定用户:使用cache保存,当用户登出后把关注的用户列表和当前登录用户写入特定文件。

h3 My thought about the project

Had some issue when compiling the project. It complained cannot find source. To solve it I made a jar from the class file and add it as library.

About registration. The API isActiveName and register are confusing. Took me a while to know that isActiveName() is the method to know if a user is active.

About login. The biggest confuse part. The client doesn’t have an API to verification user credential, so in order to do the verification, I have to save password in cache when user registers. And when user login, compare input password with password in cache as verification.

About the way to keep credential and login verification. In order to keep the credential I choose to use a file to store the credential. Once registered, save the username, password and token in a config file, so next when logging on there’s no need to login again. For verification, since there’s no API for verification, I have to do it myself using the password saved in the config file.

About tag: there’s no straight way to get messages so just get ids and loop them to get message. The number of calls is 20 per second so the max tagged messages are 20.

Some issue with getTags(). I’ve tried input “#final” and it returns with a String[] but the element is empty.

About following user(s): the doc doesn’t require to save followed users for each user or be able to keep followed user when restarts, so I just save it in memory.

About TwooterEvent.DISCONNECT: Since I use a button to disable live feed manually, there’s nothing I need to do with this event.

作业总结: 服务端不够强大,否则能做的更好。比如说credential validation,关注的用户等等