今天我们来学习如何用java语言来写一个简单用户登入模块,本次主要利用java中面向对象程序设计的三大特性“封装,继承,多态”来完成代码编写。
(1)要求:通过用户输入,获取用户名和口令;与事先记录在程序中的用户信息进行对比,通过口令验证后登入系统。用户分为系统管理人员、档案录入人员,档案浏览人员三类,相关类图如下所示。
(2)思路:由类图看出,Administrator,Operator,Browser三个类继承于超类User,因此将User类定义为抽象类,将name,passowrd,role三个属性封装在User抽象类中,并通过定义get()方法和set()方法来实现对属性的访问。本部分源代码见下图,代码后有详细注释。
abstract class User{//定义抽象类class private String name;
private String password;
private String role;//将访问权限设置为私有权限,体现了Java封装的特性
User(String name,String password,String role){//定义构造方法,对name,password,role三个变量赋初值,注意构造方法无方法体
this.name=name;
this.password=password;
this.role=role; //用this关键字代替User类的对象(因为还未创建对象)
}
public boolean changeSelfInfo(String password) {//定义修改用户密码的方法
System.out.println("请输入新密码");
Scanner sc=new Scanner(System.in);
password=sc.next();
if (Dateprocessing.update(name, password, role)){//update方法定义在另外一个类中
this.password=password;
System.out.println("修改成功");
return true;
}else
return false;
}
public boolean downloadFile(String filename) throws IOException{//定义下载文件的方法
System.out.println("下载文件... ...");
return true;
}
public void showFileList(){
System.out.println("列表... ...");
}
public abstract void showMenu();//将showMenu()方法定义为抽象方法,无方法体
public void exitSystem(){//退出系统
System.out.println("系统退出, 谢谢使用 ! ");
System.exit(0);
}
public String getName() {//返回name
return name;
}
public void setName(String name) {设置name值
this.name = name;
}
public String getPassword() {//返回password
return password;
}
public void setPassword(String password) {//定义password值
this.password = password;
}
public String getRole() {//返回role值
return role;
}
public void setRole(String role) {//设置role值
this.role = role;
}
}
定义完抽象类User类之后,我们要做的是定义三个子类Administrator,Operator,Browser,并且分别实现类中预先的定义方法,源代码如下:
class Administrator extends User{//定义Administrator类
Administrator(String name,String password,String role) {//定义构造方法
super(name,password,role);}//super关键字用于对父类构造方法的调用
public void showMenu() {//显示菜单
System.out.println("******欢迎进入管理员菜单系统******\n"+ " 1.修改用户\n"
+"2删除用户\n"
+"3新增用户\n"
+"4列出用户\n"
+"5下载文件\n"
+"6文件列表\n"
+"7修改本人密码\n"
+"8退出\n"+"*********");
System.out.print("请选择菜单:"); }
public void changeuser(String name,String password,String role) {//修改用户
System.out.println("修改用户\n请输入用户名");
Scanner Input2=new Scanner(System.in);
name=Input2.next();
System.out.println("请输入密码");
password=Input2.next();
System.out.println("请输入角色");
role=Input2.next();
Dateprocessing.update(name,password,role);//
System.out.println("修改成功!");
Input2.close();//关闭输入流}
public void deluser(String name) {//删除用户
System.out.println("删除用户\n请输入用户名");
Scanner sc=new Scanner(System.in);
name=sc.next();
Dateprocessing.delete(name);//delete方法定义在public类中
sc.close();//关闭输入流
}
public boolean downloadFile(String file) {//下载文件
System.out.println("下载文件\n请输入档案号");
Scanner scc=new Scanner(System.in);
file=scc.next();
System.out.println("下载文件。。。。\n下载成功!!!");
scc.close();
return true;
}
}
定义Operator类
class Operator extends User{
public Operator(String name,String password,String role) {//定义构造方法
super(name,password,role);
}
public void showMenu() {
System.out.println("****欢迎进入档案录入员菜单******\n"
+ " 1.上传文件 \n"+
" 2.下载文件 \n"+
" 3.文件列表 \n"+
" 4.修改密码 \n"+
" 5.退 出 \n"+
"********************************");
System.out.print("请选择菜单:");
};
public void uploadFile() {//上传文件
System.out.println("上传文件\n请输入文件名:");
Scanner input2=new Scanner(System.in);
String file_0=input2.nextLine();
System.out.println("请输入档案号:");
String file_1=input2.nextLine();
System.out.println("请输入档案描述:");
String file_2=input2.nextLine();
System.out.println("上传文件... ...\n上传成功!");
input2.close();
};
public boolean downloadFile(String file) {//下载文件
System.out.println("下载文件\n请输入档案号:");
Scanner input2=new Scanner(System.in);
file=input2.nextLine();
System.out.println("下载文件... ...\n下载成功!");input2.close();
return true;
}
public void adduser(String name,String password,String role) {//添加用户
System.out.println("添加用户\n请输入用户名字");
Scanner ssc=new Scanner(System.in);
name=ssc.next();
System.out.println("请输入密码");
password=ssc.next();
System.out.println("请输入角色");
role=ssc.next();
Dateprocessing.insert(name,password,role);ssc.close();//insert方法定义在public类中
}
//列出用户
public void listUser() {//列出用户
System.out.println("列出用户");
Enumeration<User> e = Dateprocessing.users.elements();
while(e.hasMoreElements())
{User a=(User) e.nextElement();
System.out.println("Name:"+a.getName()+" Password:"+
a.getPassword()+" Role:"+
a.getRole());
}
}
}
定义Browser类
class Browser extends User{
public Browser (String name,String password,String role) {//定义 构造方法
super(name,password,role);
}
public void showMenu() {
System.out.println("****欢迎进入档案浏览员菜单******\n"
+ " 1.下载文件 \n"+
" 2.文件列表 \n"+
" 3.修改密码 \n"+
" 4.退 出 \n"+
"********************************");
System.out.print("请选择菜单:");
};
public boolean downloadFile(String file) {//下载文件
System.out.println("下载文件\n请输入档案号:");
Scanner input2=new Scanner(System.in);
file=input2.nextLine();
System.out.println("下载文件... ...\n下载成功!");input2.close();return true;
}
}
按照上述方法,我们定义了一个超类User和三个子类Administrator,Operator,Browser,接下来需要定义一个public类来执行main进程,源代码如下:
public class Dateprocessing {
static Hashtable<String, User> users;//定义哈希表类,key项存放name,value项存放抽象类User,User类中存放了name,password,role等属性
static {
users = new Hashtable<String, User>();
users.put("jack", new Operator("jack","123","operator"));
users.put("rose", new Browser("rose","123","browser"));
users.put("kate", new Administrator("kate","123","administrator"));
}
public static User search(String name, String password) //定义搜寻用户是否存在的方法
{
if (users.containsKey(name)) {
User temp =users.get(name);
if ((temp.getPassword()).equals(password))
return temp;
}
return null;
}
public static Enumeration<User> getAllUser() {//列出用户
Enumeration<User> e = users.elements();
return e;
}
public static boolean update(String name, String password, String role) {更改用户的密码和角色
User user;
if (users.containsKey(name)) {
if (role.equalsIgnoreCase("administrator"))
user = new Administrator(name,password, role);
else if (role.equalsIgnoreCase("operator"))
user = new Operator(name,password, role);
else
user = new Browser(name,password, role);
users.put(name, user);
return true;
}else
return false;
}
public static boolean insert(String name, String password, String role) {//添加新用户
User user;
Scanner sc=new Scanner(System.in);
System.out.println("请输入新增用户姓名");name=sc.next();
System.out.println("请输入新增用户密码");password=sc.next();
System.out.println("请输入新增用户角色");role=sc.next();
if(!((role.equalsIgnoreCase("administrator"))||(role.equalsIgnoreCase("operator"))||(role.equalsIgnoreCase("browser")))){
System.out.println("无此角色!");}
if (users.containsKey(name))
{System.out.println("该用户已存在!");sc.close();return false;}
{
if (role.equalsIgnoreCase("administrator"))
user = new Administrator(name,password, role);
else if (role.equalsIgnoreCase("operator"))
user = new Operator(name,password, role);
else
user = new Browser(name,password, role);
users.put(name, user);System.out.println("添加成功!");sc.close();
return true;
}
}
public static boolean delete(String name) {//删除用户
if (users.containsKey(name)){
users.remove(name);
return true;
}else
return false;
}
}
public static void main(String[] args) {//main方法
// TODO Auto-generated method stub
String name,password,role=null;
String tip_system="档案系统";
String tip_menu="请选择菜单";
String tip_exit="退出系统,谢谢您的使用哦亲!!!";
String info="*******欢迎使用"+tip_system+"******\n\t"+"1 登录\n\t"+"2 退出"+"******";
System.out.println(info);
System.out.println(tip_menu);
Scanner Input1=new Scanner(System.in);
int k=Input1.nextInt();
if(k==1) {
System.out.println("请输入用户姓名");
name=Input1.next();
System.out.println("请输入密码");password=Input1.next();
if(!users.containsKey(name)) {System.out.println("不存在该用户哦亲!!!");System.exit(0);}
if(!(users.get(name).getPassword().equals(password))) {System.out.println("密码错误!!!");System.exit(0);}
switch(search(name,password).getRole()){
case("administrator"):Administrator a=new Administrator(name,password,search(name,password).getRole());
a.showMenu();int i=Input1.nextInt();
switch(i) {
case(1):a.changeuser(name,password,role );break;
case(2):a.deluser(name);break;
case(3):insert(name,password,role);break;
case(4):getAllUser();break;
case(5):a.downloadFile(name);break;
case(6):a.showFileList();break;
case(7):a.changeuser(name, password, role);break;
case(8):a.exitSystem();break;
} break;
case("operator"):Operator o=new Operator(name,password,search(name,password).getRole());o.showMenu();int m=Input1.nextInt();
switch(m) {
case(1):o.uploadFile();break;
case(2):o.downloadFile(name );break;
case(3):o.showFileList();break;
case(4):o.changeSelfInfo(password);break;
case(5):o.exitSystem();break;
}break;
case("browser"):Browser b=new Browser(name,password,search(name,password).getRole());b.showMenu(); int n=Input1.nextInt();
switch(n) {
case(1):b.downloadFile(name);break;
case(2):b.showFileList();break;
case(3):b.changeSelfInfo(password);break;
case(4):b.exitSystem();break;
}break;
}
}
else if(k==2) {
System.out.println(tip_exit);
System.exit(0);
}
else System.out.println("输入错误!!");
Input1.close();
}
}
这次我们主要学习了如何利用封装,继承,多态三大特性来编写用户登入模板,代码看上去挺多,但通俗易懂,因本次是面向初学着,故把异常处理,数据库,多线程等方面的代码简化掉