纯javaSE案例(一)之用户登录注册

纯javaSE案例之用户登录注册

案例需求:

直接上图:
这里写图片描述

涉及知识

面向对象,接口,Java序列化,HashMap,IO流,最重要的是锻炼自顶向下逐步细化的思想。

欢迎界面

package cn.jixiang.front.menu;

public class BootStrap {

    public static void main(String[] args) {
        System.out.println("欢迎来到吉祥自动售货系统,请选择:");
        FrontMenu.showFirstLevelMeun();
    }
}

一级目录

package cn.jixiang.front.menu;

import java.util.Scanner;

import cn.jixiang.front.service.UserService;
import cn.jixiang.front.service.UserServiceImp;

public class FrontMenu {
    public static void showFirstLevelMeun() {
        UserService userService = new UserServiceImp();

        System.out.println("1、注册    2、登录");
        Scanner sc = new Scanner(System.in);
        String select = sc.nextLine();
        //注册
        if(select.equals("1")) {
            System.out.println("请输入用户名:");
            String username = sc.nextLine();
            System.out.println("请输入密码:");
            String password = sc.nextLine();
            System.out.println("请再次输入密码:");
            String password2 = sc.nextLine();
            if(password.equals(password2)) {
                boolean isExists = userService.isExists(username);
                if(isExists) {
                    System.out.println("此用户名已存在");
                    showFirstLevelMeun();
                }else {
                    System.out.println("请输入地址:");
                    String address = sc.nextLine();
                    userService.regist(username,password,address);
                }

            }else {
                System.out.println("您输入的密码不一致");
                showFirstLevelMeun();
            }
        }else if(select.equals("2")) {
            //登录
            System.out.println("请输入用户名:");
            String username = sc.nextLine();
            System.out.println("请输入密码:");
            String password = sc.nextLine();
            boolean success = userService.login(username,password);
            if(success) {
                System.out.println("登录成功");
            }else {
                System.out.println("用户名或者密码错误");
                showFirstLevelMeun();
            }
        }else {
            System.out.println("您输入的选项不正确");
            showFirstLevelMeun();
        }
    }
}

登录注册功能交互

通过接口的方法,定义抽象类。
此处体现了接口使用的意义所在,先定义后实现。先定义承上,后实现启下。体现了程序自顶向下的特点。接口就像连接上下层的一条具有固定规格的管子。

package cn.jixiang.front.service;

public interface UserService {

    /**
     * 判断用户名是否已经存在
     * @param username
     * @return
     */
    boolean isExists(String username);

    /**
     * 注册一个用户
     * @param username
     * @param password
     */
    void regist(String username, String password,String address);

    /**
     * 登录
     * @param username
     * @param password
     * @return
     */
    boolean login(String username, String password);
}

实现接口中的具体方法

package cn.jixiang.front.service;

import java.util.HashMap;

import cn.jixiang.front.dao.UserDao;
import cn.jixiang.front.dao.UserDaoImp;
import cn.jixiang.front.menu.FrontMenu;
import cn.jixiang.product.User;

public class UserServiceImp implements UserService{

    UserDao userdao = new UserDaoImp();

    /**
     * 判断用户名是否存在
     */
    @Override
    public boolean isExists(String username) {

        HashMap<String,User> userMap = userdao.loadUserData();
        return userMap.containsKey(username);
    }

    /**
     * 注册
     */
    @Override
    public void regist(String username, String password,String address) {

        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        user.setAddress(address);



        //调用dao将user数据添加到hashmap中
        HashMap<String,User> userMap = userdao.loadUserData();
//      HashMap<String,User> userMap = new HashMap<>();
        //将新用户对象添加到userMap中
        userMap.put(user.getUsername(), user);

        //调用dao将添加后usermap保存到数据文件中
        userdao.saveUserData(userMap);

        System.out.println("注册成功");
        FrontMenu.showFirstLevelMeun();
    }

    /**
     * 登录
     */
    @Override
    public boolean login(String username, String password) {
        //调用dao将user数据添加到hashmap中
        HashMap<String,User> userMap = userdao.loadUserData();
        if(userMap.containsKey(username)) {
            User user = userMap.get(username);
            if(user.getPassword().equals(password)) {
                return true;
            }else {
                return false;
            }

        }else {
            return false;
        }
    }

}

程序中的用户数据与磁盘文件存储数据的接口

由于是纯javaSE故不适用数据库,而使用java中的序列化和反序列化来实现。

package cn.jixiang.front.dao;

import java.util.HashMap;

import cn.jixiang.product.User;


public interface UserDao {
    /**
     * 将数据文件中得数据读取到hashmap中
     * @return
     */
    HashMap<String, User> loadUserData();

    /**
     * 将hashmap中的数据保存到数据文件中
     * @param userMap
     */
    void saveUserData(HashMap<String, User> userMap);
}

实现接口中的具体方法

package cn.jixiang.front.dao;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

import cn.jixiang.product.User;

public class UserDaoImp implements UserDao{

    /**
     * 将hashMap中的数据保存到用户数据文件中
     */
    @Override
    public HashMap<String, User> loadUserData() {

        File file = new File("D:/abc/user.data");
        try {
            if(!file.exists()) {
                HashMap<String, User> userMap = new HashMap<String, User>();
                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
                oos.writeObject(userMap);
                oos.close();
                return userMap;
            }
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));   
            HashMap<String, User> userMap = (HashMap<String, User>)ois.readObject();
            ois.close();
            return userMap;

        } catch (Exception e) {
            System.out.println("文件里没有对象");
            e.printStackTrace();
        }
        System.out.println(3);
        return null;
    }

    /**
     * 将hashMap中的数据保存文件中
     */
    @Override
    public void saveUserData(HashMap<String, User> userMap) {
//      
        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:/abc/user.data"));
            oos.writeObject(userMap);
            //oos.flush();
            oos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

使用的user类

package cn.jixiang.product;

import java.io.Serializable;

/**
 * 用户类
 * @author 吉祥
 *
 */
public class User implements Serializable{
    private String username;
    private String password;
    private String address;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    } 
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }


}

注意事项:

1.进行序列化的对象必须要实现Serializable接口
2.IO流的关流操作
3.HashMap的与序列化的相互转化细节,容易出现空指针异常
- - -解决办法是: 记住关流操作,从文件不存在时,返回的HashMap是不是新定义的HashMap,当文件不存在时,返回的HashMap是不是从文件中读取到的HashMap。

猜你喜欢

转载自blog.csdn.net/qq_42982169/article/details/81989308