今天我们来学习如何用java语言来写一个简单用户登入模块,本次主要利用java中面向对象程序设计的三大特性“封装,继承,多态”来完成代码编写。

(1)要求:通过用户输入,获取用户名和口令;与事先记录在程序中的用户信息进行对比,通过口令验证后登入系统。用户分为系统管理人员、档案录入人员,档案浏览人员三类,相关类图如下所示。


Java登录的逻辑 java编写登录系统_语言


(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();
	}
}

这次我们主要学习了如何利用封装,继承,多态三大特性来编写用户登入模板,代码看上去挺多,但通俗易懂,因本次是面向初学着,故把异常处理,数据库,多线程等方面的代码简化掉