手把手教你写代码——基于控制台的通讯录管理系统(多人)(代码详细注释)

写在前面

本文章适合刚开始学习java的同学,不适合已参与java开发的人群!本项目源代码已绑定资源中可免费获取!如果对你有帮助请

栏目介绍

本栏目专为入门java学习者设计的一些简单的入门项目

功能介绍

本项目为简单的基于控制台的通讯录管理系统,所需要的环境仅仅为jdk以及mysql(版本不限)!只有一个简单的eclipse软件以及我们的mysql可视化工具(视频使用navicat)

本项目数据库表有二个,本项目是之前的单表项目的升级版本
本项目使用mvc设计模式,使用面向对象的开发思想
本项目使用最基础的jdbc的方式链接的数据库

本项目主要实现的功能有:

  • 注册登录
  • 系统运行成功后的欢迎及菜单页面
  • 按照登录人添加联系人功能
  • 按照登录人进行联系人查询功能(分名称和手机号查询)
  • 按照登录人显示联系人列表
  • 按照登录人根据编号删除指定编号的联系人
  • 按照登录人修改指定编号的联系人
  • 退出登录

业务点处理:

当前登录人操作只能操作自己的数据,用户登录成功后,显示的列表只能显示自己录入的数据!
注册:用户表按照的是用户名作为唯一标识,也就是不能注册重复的用户名
新增:对于不同用户来说通讯录的no是可以重复的,但是对于同一个用户来说录入的通讯通好友的编号no是不允许重复的
修改:用户修改也是通过编号以及自己的登录状态来修改自己的数据
删除:用户删除输入的编号也是只针对自己的数据

项目实现截图

项目结构:
手把手教你写代码——基于控制台的通讯录管理系统(多人)(代码详细注释)_第1张图片

数据表结构

1.登录用户表
在这里插入图片描述
2.用户的通讯录数据表
手把手教你写代码——基于控制台的通讯录管理系统(多人)(代码详细注释)_第2张图片

页面截图

手把手教你写代码——基于控制台的通讯录管理系统(多人)(代码详细注释)_第3张图片
手把手教你写代码——基于控制台的通讯录管理系统(多人)(代码详细注释)_第4张图片
手把手教你写代码——基于控制台的通讯录管理系统(多人)(代码详细注释)_第5张图片
手把手教你写代码——基于控制台的通讯录管理系统(多人)(代码详细注释)_第6张图片

项目功能及代码

1.JDBC数据库连接工具类:

package com.maker.address.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 数据库连接工具类
 * @author Administrator
 *
 */
public class DBUtil {
    
    public static String db_url = "jdbc:mysql://localhost:3306/addressbook?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&characterEncoding=utf-8";
    public static String db_user = "root";
    public static String db_pass = "123456";
    
    public static Connection getConn () {
        Connection conn = null;
        
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(db_url, db_user, db_pass);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return conn;
    }
    
    /**
     * 关闭链接
     * @param state
     * @param conn
     */
    public static void close (Statement state, Connection conn) {
        if (state != null) {
            try {
                state.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 关闭链接
     * @param state
     * @param conn
     */
    public static void close (ResultSet rs, Statement state, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        if (state != null) {
            try {
                state.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

2.运行程序的主类:UserMain

主类中包含各种页面显示以及主方法入口

package com.maker.address.web;

import java.util.ArrayList;
import java.util.Scanner;

import com.maker.address.entity.Login;
import com.maker.address.entity.User;
import com.maker.address.service.LoginService;
import com.maker.address.service.UserService;


//主类  程序从这里的main方法开始
public class UserMain {
	//静态的user服务层对象
	static UserService user = new UserService();
	//静态的用户登录服务层对象
	static LoginService loginService = new LoginService();
	//静态的全局的用户输入对象
	static Scanner sc = new Scanner(System.in);
	//登录对象保存
	static Login LOGIN = null;
	
	/**
	 * main方法执行后先执行start方法
	 * 这里就是对登录注册的页面显示的操作
	 */
	public static void start(){
		System.out.println("=======请选择=====");
		System.out.println("【1】注册");
		System.out.println("【2】登录");
		int index = sc.nextInt();
		//根据用户输入的操作来进行下一步的指令
		//每一个指令之后都是重新进行start方法,只有在登录成功的时候,登录方法内部进入了into这个方法,就是进入系统中了
		switch(index){
		case 1:
			//注册
			toRegist();
			start();
			break;
		case 2:
			//登录
			login();
			start();
			break;
			default:
				System.out.println("请输入正确的指令!");
				start();
				break;
		}
	}

	//登录方法
	private static void login() {
		// TODO Auto-generated method stub
		System.out.println("请输入用户名:");
		String username = sc.next();
		System.out.println("请输入密码:");
		String password = sc.next();
		//根据输入的用户名密码来调用服务层接口
		LOGIN = loginService.toLogin(username, password);
		if(LOGIN!=null){
			//登录成功的时候会返回数据库中的登录对象,然后将对象赋值给全局的登录对象,这样在做其他操作的时候直接使用就行
			//登录成功后进入系统中
			into();
		}
	}

	//注册的方法
	private static void toRegist() {
		// TODO Auto-generated method stub
		System.out.println("请输入用户名:");
		String username = sc.next();
		System.out.println("请输入密码:");
		String password = sc.next();
		System.out.println("请确认密码:");
		String rePassword = sc.next();
		//根据用户输入的用户名密码来进行校验
		if(password.equals(rePassword)){
			//注册成功不做其他操作,在start方法中会重新执行start
			loginService.toRegist(username, rePassword);
		}else{
			System.out.println("二次密码输入不一致!");
		}
	}
		
	/**
	 * 这里就是用户登录成功后进入系统的页面显示方法
	 */
	public static void into() {
		System.out.println("=======通讯录管理系统=====");
		System.out.println("【1】添加联系人");
		System.out.println("【2】联系人查询");
		System.out.println("【3】显示联系人列表");
		System.out.println("【4】根据编号删除指定编号的联系人");
		System.out.println("【5】修改指定编号的联系人");
		System.out.println("【0】退出");
		System.out.println("=============================");
		int i = sc.nextInt();
		//接收用户输入的指令来进行不同的操作
		switch (i) {
		case 1:
			//添加联系人
			add();
			into();
			break;
		case 2:
			//联系人查询
			System.out.println("【1】通过联系人姓名查询/【2】通过联系人电话查询");
			int a = sc.nextInt();
			findbyName(a);
			into();
			break;
		case 3:
			//显示联系人列表
			show();
			into();
			break;
		case 4:
			//根据编号删除指定编号的联系人
			del();
			into();
			break;
		case 5:
			//修改指定编号的联系人
			update();
			into();
			break;
		case 0:
			//退出
			System.out.println("谢谢使用,再见!");
			System.exit(0);
			break;
		default:
			//不存在的指令
			System.out.println("请输入正确的指令!");
			into();
			break;
		}
	}

	/**
	 * 修改用户的方法
	 * 1.接收用户输入的联系人编号以及修改的数据
	 * 2.然后中间进行手机号验证以及邮箱验证
	 * 3.最后调用服务层updateUser方法去执行修改操作
	 */
	private static void update() {
		// TODO Auto-generated method stub
		System.out.println("请输入要修改的联系人编号:");
		int a = sc.nextInt();
		System.out.println("请输入姓名:");
		String b = sc.next();
		System.out.println("请输入手机号:");
		String c = sc.next();
		judgePhone(c);
		System.out.println("请输入QQ:");
		String d = sc.next();
		System.out.println("请输入邮箱地址:");
		String e = sc.next();
		judgeEmail(e);
		User x = new User(a, b, c, d, e,LOGIN.getId());
		if (user.updateUser(x)) {
			System.out.println("修改成功!");
		}
	}

	/**
	 * 新增方法
	 * 1.接收用户输入的相关信息
	 * 2.中间进行手机号验证以及邮箱验证
	 * 3.调用服务器addUser新增接口
	 */
	public static void add() {
		System.out.println("请输入联系人编号:");
		int a = sc.nextInt();
		System.out.println("请输入联系人姓名:");
		String b = sc.next();
		System.out.println("请输入联系人手机号:");
		String c = sc.next();
		judgePhone(c);
		System.out.println("请输入联系人QQ:");
		String d = sc.next();
		System.out.println("请输入联系人邮箱地址:");
		String e = sc.next();
		judgeEmail(e);
		User x = new User(a, b, c, d, e,LOGIN.getId());
		if (user.addUser(x)) {
			System.out.println("添加成功!");
		}
	}

	/**
	 * 校验手机号  
	 * 规则:11位  数字1开头  第二位为34589 后面9位1-9任意
	 * 
	 * 校验不通过后可以重新输入
	 * @param phone 手机号
	 */
	public static void judgePhone(String phone) {

		if (phone.matches("1[34589][0-9]{9}")) {

		} else {
			System.out.println("手机号输入有误,请重新输入");
			String v = sc.next();
			judgePhone(v);
		}
	}
	/**
	 * 校验邮箱
	 * 规则:不包括特殊字符  中间有@
	 * 
	 * 校验不通过后可以重新输入
	 * @param email 邮箱
	 */
	public static void judgeEmail(String email) {

		if (email.matches("[A-Za-z0-9]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)")) {

		} else {
			System.out.println("邮箱格式输入有误,请重新输入");
			String v = sc.next();
			judgeEmail(v);
		}
	}

	/**
	 * 查询联系人方法
	 * 
	 * 查询方法调用user服务层接口然后参数加上当前登录人的id
	 * 
	 * @param a  输入的指令  1按照姓名  2按照电话
	 */
	public static void findbyName(int a) {
		if (a == 1) {
			System.out.println("请输入联系人姓名");
		} else {
			System.out.println("请输入联系人电话");
		}
		String name = sc.next();
		User user = UserMain.user.searchByName(name,LOGIN.getId());
		System.out.println(user);
	}

	/**
	 * 显示所有联系人的方法
	 * 调用user服务层接口根据当前登录人的id查询
	 */
	public static void show() {
		ArrayList list = user.showInfo(LOGIN.getId());
		for (Object o : list) {
			System.out.println(o);
		}
	}

	/**
	 * 删除方法
	 * 1.根据用户输入的要删除的联系人编号
	 * 2.调用user服务器接口根据当前登录人id以及要删除的联系人编号进行删除
	 */
	public static void del() {
		System.out.println("请输入编号");
		int no = sc.nextInt();
		if (user.delUser(no,LOGIN.getId())) {
			System.out.println("删除成功");
		}
	}

	//运行程序的主方法,右键运行后会执行start方法
	public static void main(String[] args) {
		start();
	}
}

  1. user的服务层代码 UserService
package com.maker.address.service;

import java.util.ArrayList;
import java.util.Objects;

import com.maker.address.dao.UserDao;
import com.maker.address.entity.User;

/**
 * 用户服务层
 * @author Administrator
 *
 */
public class UserService {
	 	UserDao ud = new UserDao();
	 
	 	//新增用户
	    public boolean addUser(User user){
	    	//判断编号是否存在,存在的话将不允许新增
	    	User record = ud.queryByNo(user.getNo(),user.getUserId());
	    	if(record!=null){
	    		System.out.println("编号已存在!");
	    		return false;
	    	}
	        return ud.add(user);
	    }
	 
	    /**
	     * 公共的查询所有数据的方法
	     * 查询出当前登录人的所有的联系人
	     * @param userId 当前登录人id
	     * @return
	     */
	    public ArrayList showInfo(Integer userId){
	        return ud.getAll(userId);
	    }
	    
	    /**
	     * 通过名称或者电话查询联系人
	     * 1.通过showInfo查询当前登录人的所有联系人
	     * 2.通过字段进行过滤查询出符合的联系人
	     * 
	     * @param name 用户输入的
	     * @param userId 当前登录人的id
	     * @return
	     */
	    public User searchByName(String name,Integer userId){
	    	ArrayList<User> s = showInfo(userId);
	        for (User user : s) {
	            if (Objects.equals(name,user.getName()) ||Objects.equals(name,user.getPhone())){
	                return user;
	            }
	        }
	        return null;
	    }
	 
	    /**
	     * 修改方法
	     * @param user 要修改的实体
	     * @return 
	     */
	    public boolean updateUser(User user){
	    	boolean num = ud.updateUser(user);
	        if(!num) {
	            System.out.println("该用户不存在");
	            return false;
	        }
	        return true;
	    }
	 
	    /**
	     * 删除联系人的方法
	     * 1.通过showInfo查询当前登录人的所有联系人
	     * 2.过滤查询要删除的联系人的编号
	     * 3.执行删除
	     * @param no  要删除人的编号
	     * @param userid 当前登录人id
	     * @return
	     */
	    public boolean delUser(int no,Integer userid){
	    	ArrayList<User> s = showInfo(userid);
	        User user = null;
	        for(User u:s) {
	            if(no == u.getNo()) {
	                user = u;
	                break;
	            }
	        }
	        if(user == null) {
	            System.out.println("该用户不存在");
	            return false;
	        }
	        return ud.remove(user);
	    }
}

4.user的Dao层代码 UserDao

package com.maker.address.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import com.maker.address.entity.User;
import com.maker.address.util.DBUtil;

/**
 * dao层处理对数据库的操作
 * @author Administrator
 *
 */
public class UserDao {

	//新增用户
	public boolean add(User user) {
		// TODO Auto-generated method stub
		String sql = "insert into user(no,name,phone,qq,email,userid) values ("+user.getNo()+",'"+user.getName()+"','"+user.getPhone()+"','"+user.getQQ()+"','"+user.getEmail()+"',"+user.getUserId()+")";
		Connection conn = DBUtil.getConn();
		Statement state = null;
		int num = 0;
		System.out.println(sql);
		try {
			state = conn.createStatement();
			num = state.executeUpdate(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			DBUtil.close(state, conn);
		}
		return num > 0;
	}

	//查询所有用户
	public ArrayList getAll(Integer userid) {
		// TODO Auto-generated method stub
		String sql = "select * from user where userid =" + userid;
		Connection conn = DBUtil.getConn();
		Statement state = null;
		ArrayList<User> list = new ArrayList<>();
		ResultSet rs = null;
		try {
			state = conn.createStatement();
			rs = state.executeQuery(sql);
			while(rs.next()){
				//结果集中有数据  代表查询出来有数据
				//创建user对象,将数据存入到对象集合中
				User user = new User();
				user.setNo(rs.getInt("no"));
				user.setName(rs.getString("name"));
				user.setPhone(rs.getString("phone"));
				user.setQQ(rs.getString("qq"));
				user.setEmail(rs.getString("email"));
				user.setUserId(rs.getInt("userid"));
				list.add(user);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			DBUtil.close(rs,state, conn);
		}
		return list;
	}

	//按照编号查询用户
	public User queryByNo(int no,Integer userid) {
		// TODO Auto-generated method stub
		String sql = "select * from user where no="+no + " and userid="+userid;
		Connection conn = DBUtil.getConn();
		Statement state = null;
		User user = null;
		ResultSet rs = null;
		try {
			state = conn.createStatement();
			rs = state.executeQuery(sql);
			while(rs.next()){
				user = new User();
				//结果集中有数据  代表查询出来有数据
				//创建user对象,将数据存入到对象集合中
				user.setNo(rs.getInt("no"));
				user.setName(rs.getString("name"));
				user.setPhone(rs.getString("phone"));
				user.setQQ(rs.getString("qq"));
				user.setEmail(rs.getString("email"));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			DBUtil.close(rs,state, conn);
		}
		return user;
	}

	//删除用户按照编号
	public boolean remove(User user) {
		// TODO Auto-generated method stub
		String sql = "delete from user where no = '"+user.getNo()+"' and userid="+user.getUserId();
		Connection conn = DBUtil.getConn();
		Statement state = null;
		int num = 0;
		try {
			state = conn.createStatement();
			num = state.executeUpdate(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			DBUtil.close(state, conn);
		}
		return num > 0;
	}

	//修改用户按照编号修改
	public boolean updateUser(User user) {
		// TODO Auto-generated method stub
		String sql = "update user set name='"+user.getName()+"',phone='"+user.getPhone()+"',qq='"+user.getQQ()+"',email='"+user.getEmail()+"' where no = "+user.getNo();
		
		Connection conn = DBUtil.getConn();
		Statement state = null;
		int num = 0;
		try {
			state = conn.createStatement();
			num = state.executeUpdate(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			DBUtil.close(state, conn);
		}
		return num > 0;
	}
}

这里贴出的是关于User的一系列操作类,如果需要所有源代码的可以直接免费下载去!!

你可能感兴趣的:(Java免费小项目,通讯录管理系统,多人,注册登录,控制台程序,java基础)