User与DataProcessing类由任课老师提供,解决了最难的部分
package 实验1;
public abstract class User {
private String name;
private String password;
private String role;
public User(String name,String password,String role){
this.name=name;
this.password=password;
this.role=role;
}
public User(){//这个不加,子类自动创建的构造函数会报错
}
public boolean changeSelfInfo(String password){
if (DataProcessing.update(name, password, role)){
this.password=password;
System.out.println("更改密码成功");
return true;
}else
return false;
}
public abstract void showMenu();
public boolean downloadFile(String filename){
System.out.println("[下载文件中]······\n 下载成功!");
return true;
}
public void showFileList(){
System.out.println("文件列表\n");
}
public void exitSystem(){
System.out.println("系统退出,谢谢使用\n");
System.exit(0);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
}
user类刚开始我的并没有空的User(),最后的整体架构可能重点不在user。
package 实验1;
import java.util.*;
public class DataProcessing {
static Hashtable<String, User> users;//静态对象
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 searchUser(String name){
if (users.containsKey(name)) {
return users.get(name);
}
return null;
}
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;
if (users.containsKey(name))
return false;
else{
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;
}
}
public static boolean delete(String name){
if (users.containsKey(name)){
users.remove(name);
return true;
}else
return false;
}
}
DataProcessing可以说是精华所在,里面已经实现了绝大多数方法,其他的类只需要使用就好,另外有几点,大部分方法是类方法,可以直接使用而不用实例化对象,例如addministrator类实现增加函数时,简单把键盘输入的name,password,role用DataProcessing.insert(name,password,role).
hashtable可以理解为map的同等实现,以键/值的关系无重复无序插入,后面的修改只要put(name,user)可完成插入和覆盖。
Administrator类
package 实验1;
import java.util.Enumeration;
public class Administrator extends User{//管理员
public Administrator(String name, String password, String role){
super.setName(name);
super.setPassword(password);
super.setRole(role);
}
public boolean changeUserInfo(String name, String password, String role){
if(DataProcessing.update(name,password,role)==true){//更新信息并返回是否成功
return true;
}else return false;
}
public boolean delUser(String name){
if(DataProcessing.delete(name)==true) return true;//删除信息并返回是否成功
else return false;
}
public boolean addUser(String name, String password, String role){//增加信息并返回是否成功
if(DataProcessing.insert(name,password,role)==true) return true;
else return false;
}
public void listUser(){//打印所有用户信息
Enumeration<User> e=DataProcessing.getAllUser();
User user;
while( e.hasMoreElements() )
{
user=e.nextElement();
System.out.println("Name:"+user.getName()+"\t Password:" +user.getPassword()+"\t Role:" +user.getRole());
}
}
public void showMenu(){
String tip_system="系统管理员菜单";
String tio_menu="请选择菜单:";
String infos="****欢迎进入"+tip_system+"****\n\t"+
"1.修改用户\n\t"+
"2.删除用户\n\t"+
"3.新增用户\n\t"+
"4.列出用户\n\t"+
"5.下载文件\n\t"+
"6.文件列表\n\t"+
"7.修改(本人)密码\n\t"+
"8.退出\n\t";
while(true){
System.out.println(tip_system+"\n"+tio_menu+"\n"+infos);
int choice=Main.scanner.nextInt();
switch (choice){
case 1:{
System.out.println("修改用户");
String name,password,role;
System.out.println("请输入修改的用户名");
name=Main.scanner.next();
System.out.println("请输入口令");
password=Main.scanner.next();
System.out.println("请输入角色");
role=Main.scanner.next();
if(changeUserInfo(name,password,role)==true){
System.out.println("修改成功");
}else{
System.out.println("或无此用户,修改失败");
}
}break;
case 2:{
System.out.println("删除用户");
String name=Main.scanner.next();
if(delUser(name)==true){
System.out.println("删除成功");
}else{
System.out.println("或无此用户,删除失败");
}
}break;
case 3:{
System.out.println("新增用户");
String name,password,role;
System.out.println("请输入新增的用户名");
name=Main.scanner.next();
System.out.println("请输入口令");
password=Main.scanner.next();
System.out.println("请输入角色");
role=Main.scanner.next();
if(addUser(name,password,role)==true){
System.out.println("增加成功");
}else{
System.out.println("或有此用户,增加失败");
}
}break;
case 4:{
System.out.println("列出用户");
listUser();
}break;
case 5:{
System.out.println("下载文件");
String filename=Main.scanner.next();
this.downloadFile(filename);
}break;
case 6:{
System.out.println("文件列表");
this.showFileList();
}break;
case 7:{
System.out.println("修改(本人)密码");
String passwrod=Main.scanner.next();
if(this.changeSelfInfo(passwrod)==true){
}else{
System.out.println("修改密码失败");
}
}break;
case 8:{
exitSystem();
}break;
default:{
System.out.println("输入命令有误,请重新输入");
}
}
}
}
}
可以看到Administrator类可以直接使用Dataprocessing的静态方法,和用this的User父类里的方法实现,而listUser里的Enumeration可以理解成数组头地址般的存在。
Main类
至于Browser和Operator类,基本就是从Administrator类里分出去的,写的时候甚至没花10分钟
package 实验1;
import java.util.Scanner;
public class Main {
public static Scanner scanner =new Scanner(System.in);
public static void main(String args[]){
String tip_system="档案系统";
String tip_menu="请选择菜单:";
String tip_exit="退出系统,谢谢使用!";
String infos="****欢迎进入"+tip_system+"****\n\t"+"1.登录\n 2.退出\n"+"******************";
while(true){
System.out.println(infos+"\n"+tip_menu+"\n");
int choice= scanner.nextInt();
switch (choice){
case 1:{
System.out.println("请输入名字");
String name = scanner.next();
System.out.println("请输入口令");
String password=scanner.next();
if(DataProcessing.search(name,password)!=null){
DataProcessing.search(name,password).showMenu();
}else{
System.out.println("登录错误,无此账号");
System.out.println("请重新输入");
}
}
break;
case 2:{
System.out.println(tip_exit);
System.exit(0);
}
break;
default:{
System.out.println("输入错误或者无此命令");
System.out.println("请重新输入");
}
}
}
}
}
Main类只要控制好循环和哪里使用menu就行,由于Administrator,Browser,Operator都继承了User,重写了showmenu方法,所以可以直接通过DataProcessing.search(name,password).showMenu();就可以进入别的界面
第一次实验完
代码还有问题,比如有点长,至于为什么现在写这个记录,当然是宿舍封控(武理特色)导致实验已经到第三次了,打算在来不及前写完,顺便存一下将来实验报告要用的。