16.1 场 景 问 题

16.1.1 登录控制

几乎所有的应用系统,都需要系统登录控制的功能,有些系统甚至有多个登录控制的功能,比如,普通用户可以登录前台,进行相应的业务操作;而工作人员可以登录后台,进行相应的系统管理或业务处理。

现在有这么一个基于Web的企业级应用系统,需要实现这两种登录控制,直接使用不同的登录页面来区分它们,把基本的功能需求分别描述如下。

先看看普通用户登录前台的登录控制的功能。

■ 前台页面:用户能输入用户名和密码;提交登录请求,让系统进行登录控制。

■ 后台:从数据库获取登录人员的信息。

■ 后台:判断从前台传递过来的登录数据和数据库中已有的数据是否匹配。

■ 前台Action:如果匹配就转向首页,如果不匹配就返回到登录页面,并显示错误提示信息。

再来看看工作人员登录后台的登录控制功能。

■ 前台页面:用户能输入用户名和密码;提交登录请求,让系统进行登录控制。

■ 后台:从数据库获取登录人员的信息。

■ 后台:把从前台传递过来的密码数据使用相应的加密算法进行加密运算,得到加密后的密码数据。

■ 后台:判断从前台传递过来的用户名和加密后的密码数据和数据库中已有的数据是否匹配。

■ 前台Action:如果匹配就转向首页,如果不匹配就返回到登录页面,并显示错误提示信息。

提示

说明:普通用户和工作人员在数据库中是存储在不同表里面的;当然也是不同的模块来维护普通用户的数据和工作人员的数据;另外工作人员的密码是加密存放的。

16.1.2 不用模式的解决方案

由于普通用户登录和工作人员登录是不同的模块,有不同的页面、不同的逻辑处理和不同的数据存储,因此,在实现上完全作为两个独立的小模块来完成。这里把它们的逻辑处理部分分别实现出来。

(1)先来看看普通用户登录的逻辑处理部分。示例代码如下:

79be54ceee3b4b6aae4480df6275db9a

b5801fef04394369b20341bf36e03ab8

e9537a11827947c69b7527c3d0f6b437

对应的LoginModel,示例代码如下:

8c3487846f364111a833d2286c478bcf

对应的UserModel,示例代码如下:

89ea6da57f3b44218784a670c1293f38

6f67eeaa446f4d2481dc6285bf537bf5

(2)再看看工作人员登录的逻辑处理部分。示例代码如下:

d04595f012a74daab9a028db24da527b

6a58d939a3174325af2bc08583775814

d49e897a6d994feba92c69c79e0b807c

对应的LoginModel,示例代码如下:

e2e73a1f07ca42728050eb68de8452e2

8f25f08f9c7a420a89e57370995be222

对应的WorkerModel,示例代码如下:

6f325f20b3b848d1992e405acdc52c20

6fe3beedd55b4e65b728ed329b721374

16.1.3 有何问题

看了上面的实现示例,是不是很简单。但是,仔细看看,总会觉得有点问题,两种登录的实现太相似了,现在是完全分开,当作两个独立的模块来实现的,如果今后要扩展功能,比如要添加“控制同一个编号同时只能登录一次”的功能,那么两个模块都需要修改,是很麻烦的。而且,现在的实现中,也有很多相似的地方,显得很重复;另外,具体的实现和判断的步骤混合在一起,不利于今后变换功能,比如要变换加密算法等。

总之,上面的实现,有两个很明显的问题:一是重复或相似代码太多;二是扩展起来很不方便。

那么该怎样解决呢?如何实现才能让系统既灵活又能简洁地实现需求功能呢?