天天看点

图书管理系统图书管理系统

图书管理系统

该图书管理系统是我研一时候的一个课程设计,当时也刚重新学完Java。你可能会“重新”是什么意思。唉,说来惭愧,大学时我先学了点Java的皮毛,就投奔搞Android去了,所以对Java的基础比较薄弱。而现在学完了,所以就想试着弄个小系统来练练手,所以参考了上一篇中国象棋的代码,就做了这个图书管理系统。

同样,这个系统采用的是客户端/服务端(C/S)的模式,相对于上一篇的中国象棋,该系统保留了Socket和多线程编程外,增加了JDBC编程,对数据库进行操作。数据库采用的是SqlServer 2005,建立了用户信息表以及图书信息表,两者是一对多的关系,下面下载的源码中已包含了建数据库和建表,以及插入用户数据以及图书数据。

此外,我还增加了手机移动端,毕竟之前玩过Android,就想做着玩玩。

该图书管理系统包含如下四个模块,分别是登录模块,查询模块,借书模块,还书模块。

  • 用户验证登录:本系统含有三种用户级别,分别是学生、老师、管理员。学生和老师是一样的,只能查询和借还书,而管理员可以对用户和书本的数据执行增删改查。
  • 图书的查询检索:可进行模糊查询,包括按书名查询,按作者查询,按出版社查询,按索引号查询。
  • 图书的借阅和还书:借书还书记录的登记和清除。

(1)系统整体框架

整个系统只能在局域网里运行,而且这里并没有考虑多线程下的并发问题,对于多个用户同时访问同一数据资源并不做考虑。

图书管理系统图书管理系统

服务端和客户端的交互过程(ServerSocket、Socket的交互过程)

图书管理系统图书管理系统

电脑客户端

图书管理系统图书管理系统

手机客户端

图书管理系统图书管理系统

(2)服务器端

服务器端参照一篇中国象棋的服务器,我只是该了一下业务逻辑的代码。

图书管理系统图书管理系统

服务端UI代码

package Library_Server;

public class Library_ServerUI extends JFrame implements ActionListener{

	JLabel jlPort=new JLabel("端 口 号");//创建提示输入端口号标签
	JTextField jtfPort=new JTextField("9999");//用于输入端口号的文本框
	JButton jbStart=new JButton("启动");//创建"启动"按钮
	JButton jbStop=new JButton("关闭");//创建"关闭"按钮
	JPanel jps=new JPanel();//创建一个JPanel对象
	JList jlUserOnline=new JList();//创建用于显示当前用户的JList
	JScrollPane jspx=new JScrollPane(jlUserOnline);//将显示当前用户的JList放在JScrollPane中
	ServerSocket socket;//声明ServerSocket引用
	ServerThread serverthread;//声明ServerThread引用
	JSplitPane jspz=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jspx,jps);//创建JSplitPane对象
	Vector onlineList=new Vector();
	
	public Library_ServerUI() {
		initialComponent();
		addListener();
		initialFrame();
	}
	
	public static void main(String[] args) {
		new Library_ServerUI();
	}
	
	public void initialComponent(){
		jps.setLayout(null);//设为空布局
		jlPort.setBounds(20,20,50,20);
		jps.add(jlPort);//添加用于提示输入端口号的标签
		this.jtfPort.setBounds(85,20,60,20);
		jps.add(this.jtfPort);//添加用于输入端口号的文本框
		this.jbStart.setBounds(18,50,60,20);
		jps.add(this.jbStart);//添加"开始"按钮
		this.jbStop.setBounds(85,50,60,20);
		jps.add(this.jbStop);//添加"关闭"按钮
		this.jbStop.setEnabled(false);//将"关闭"按钮设为不可用
	}
	
	public void addListener(){
		this.jbStart.addActionListener(this);//为"开始"按钮注册事件监听器
		this.jbStop.addActionListener(this);//为"关闭"按钮注册事件监听器
	}
	
	public void initialFrame(){
		this.setTitle("图书管理系统--服务器端");//设置窗体标题
		Image image=new ImageIcon("./image/library_ico.jpg").getImage();
		this.setIconImage(image);
		this.add(jspz);//将JSplitPane添加到窗体中
		jspz.setDividerLocation(250);
		jspz.setDividerSize(4);//设置分割线的位置和宽度
		Dimension scrSize=Toolkit.getDefaultToolkit().getScreenSize(); //获取屏幕长宽
		this.setBounds(scrSize.width/3,scrSize.height/3,420,320);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);//设置可见性
		this.setResizable(false);
		this.addWindowListener(mywindowadapter);
	}
	
	public WindowAdapter mywindowadapter=new WindowAdapter() {
		public void windowClosing(WindowEvent e) {
			dispose();
		};
	};
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==this.jbStart)
		{//当单击"启动"按钮时
			this.jbStart_event();
		}
		else if(e.getSource()==this.jbStop)
		{//单击"关闭"按钮后
			this.jbStop_event();
		}
	}
	
	public void jbStart_event(){
		//单击"启动"按钮的业务处理代码
		int port=0;
		try{
			//获得用户输入的端口号,并转化为整型
			port=Integer.parseInt(this.jtfPort.getText().trim());
		}catch(Exception ee){//端口号不是整数,给出提示信息
			JOptionPane.showMessageDialog(this,"端口号只能是整数","错误",JOptionPane.ERROR_MESSAGE);
			return;
		}if(port>65535||port<0){//断口号不合法,给出提示信息
			JOptionPane.showMessageDialog(this,"端口号只能是0-65535的整数","错误",JOptionPane.ERROR_MESSAGE);
			return;
		}
		try{
			this.jbStart.setEnabled(false);//将开始按钮设为不可用
			this.jtfPort.setEnabled(false);//将用于输入端口号的文本框设为不可用
			this.jbStop.setEnabled(true);//将停止按钮设为可用
			socket=new ServerSocket(port);//创建ServerSocket对象
			serverthread=new ServerThread(this,socket);//创建服务器线程
			serverthread.start();//启动服务器线程
		}catch(Exception ee){
			//给出服务器启动失败的提示信息
			JOptionPane.showMessageDialog(this,"服务器启动失败","错误",JOptionPane.ERROR_MESSAGE);
			this.jbStart.setEnabled(true);//将开始按钮设为可用
			this.jtfPort.setEnabled(true);//将用于输入端口号的文本框设为可用
			this.jbStop.setEnabled(false);//将停止按钮设为不可用
		}
	}
	public void jbStop_event()
	{
		//单击"关闭"按钮的业务处理代码
		try{
			socket.close();
			serverthread=null;
			this.jbStart.setEnabled(true);//将开始按钮设为可用
	    	this.jtfPort.setEnabled(true);//将用于输入端口号的文本框设为可用
		    this.jbStop.setEnabled(false);//将停止按钮设为不可用
		}catch(Exception ee){
			ee.printStackTrace();
		}
	}
	
	public void refreshList(){
		this.jlUserOnline.setListData(onlineList);
	}

}
           

监听用户连接

package Library_Server;

public class ServerThread extends Thread{
	
	Library_ServerUI father;
	ServerSocket ss;//声明ServerSocket的引用
	ObjectOutputStream Write_out;
	ObjectInputStream Read_in;
	IO_in IOin=new IO_in();
	IO_out IOout=new IO_out();
	String socket_name;
	
	public ServerThread( Library_ServerUI father,ServerSocket ss) {
		this.father=father;
		this.ss=ss;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public void run(){
		super.run();
		while(true){
			try{
				Socket socket=ss.accept();//等待客户端连接
				if(Authentication(socket)){
					this.father.onlineList.addElement(socket_name);
					this.father.refreshList();
					new ServerAgentThread(father,socket,socket_name).start();
				}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}

	public boolean Authentication(Socket socket) throws Exception{
		Read_in=new ObjectInputStream(socket.getInputStream());
		User user=(User)IOin.ReceiveMessage(Read_in);
		socket_name=user.getUserId();
		String[] user_info=qurey_position(user.getUserId(),user.getPasswd());//得到数据库中的数据
		if(user.getPosition().equals(user_info[3])){//接收到的职位与数据库中的职位对比
			user.setIsuser(true);
			user.setUsername(user_info[1]);
		}
		Write_out=new ObjectOutputStream(socket.getOutputStream());
		IOout.SendMessage(Write_out,user);
		return user.grtIsuser();
	}
	
	public String[] qurey_position(String user,String passwd){
		String[] user_info = new String[4];
		Database database = null;
		String sql="select account,user_name,password,position from User_Info where account=? and password=?";
		try{
			database=new Database();
			ResultSet rs=database.query_user(sql, user, passwd);
			if(rs.next())
			{
				user_info[0]=rs.getString(1);//account
				user_info[1]=rs.getString(2);//user_name
				user_info[2]=rs.getString(3);//password
				user_info[3]=rs.getString(4);//position
			}
		}catch(Exception e){}
		finally 
		{
			database.close();
		}
		return user_info;
	}
}
           

服务端代理线程代码

package Library_Server;
public class ServerAgentThread extends Thread{

	Library_ServerUI father;
	Socket socket;//声明Socket的引用
	/*	PrintWriter Write_out;//获取Socket的输出流,用来向客户端发送数据  
	BufferedReader Read_in;//获取Socket的输入流,用来接收从客户端发送过来的数据  */	
	ObjectOutputStream Write_out;
	ObjectInputStream Read_in;
	boolean flag=true;//控制线程的标志位
	IO_in IOin=new IO_in();
	IO_out IOout=new IO_out();

	public ServerAgentThread(Library_ServerUI father,Socket sc,String socket_name) throws UnsupportedEncodingException, IOException {
		this.father=father;
		this.socket=sc;
		this.setName(socket_name);
		/*		Write_out= new PrintWriter(new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream(),"utf-8")),true);
		Read_in= new BufferedReader(new InputStreamReader(this.socket.getInputStream(),"utf-8")); */
		Read_in=new ObjectInputStream(socket.getInputStream());
		Write_out=new ObjectOutputStream(this.socket.getOutputStream());
	}

	@Override
	public void run() {
		super.run();
		while (flag) {
			try {
				String sql = null;
				String msg=(String)IOin.ReceiveMessage(Read_in);
				if(msg.startsWith(Order_format.All_book)){//从数据库中返回所有书并打包发送
					sql="select * from Book_Info";
					Vector<Book_Info> vector= Search_Book(sql);
					IOout.SendMessage(Write_out,vector);
				}else if(msg.startsWith(Order_format.bookname)){//返回搜索的书
					sql="select * from Book_Info where bookname like '"+msg.substring(Order_format.count2)
					+"%' "+"or bookname like '%"+msg.substring(Order_format.count2)+"%'";
					Vector<Book_Info> vector= Search_Book(sql);
					IOout.SendMessage(Write_out,vector);
				}else if(msg.startsWith(Order_format.author)){
					sql="select * from Book_Info where author like '"+msg.substring(Order_format.count3)
					+"%' "+"or author like '%"+msg.substring(Order_format.count3)+"%'";
					Vector<Book_Info> vector= Search_Book(sql);
					IOout.SendMessage(Write_out,vector);
				}else if(msg.startsWith(Order_format.Callno)){
					sql="select * from Book_Info where Callno like '"+msg.substring(Order_format.count5)
					+"%' "+"or Callno like '%"+msg.substring(Order_format.count5)+"%'";
					Vector<Book_Info> vector= Search_Book(sql);
					IOout.SendMessage(Write_out,vector);
				}else if(msg.startsWith(Order_format.publishment)){
					sql="select * from Book_Info where publishment like '"+msg.substring(Order_format.count4)
					+"%' "+"or publishment like '%"+msg.substring(Order_format.count4)+"%'";
					Vector<Book_Info> vector= Search_Book(sql);
					IOout.SendMessage(Write_out,vector);
				}else if(msg.startsWith(Order_format.Borrow_Book)){
					sql="select * from Record_Info where account=?";
					String[] user_book=Get_Borrow_book(sql,this.getName());//得到借的5本书,不管有没有
					Update_Borrow_Record(user_book,msg.substring(Order_format.count6),this.getName());
				}else if(msg.startsWith(Order_format.User_book)){
					sql="select * from Record_Info where account=?";
					String[] user_book=Get_Borrow_book(sql,msg.substring(Order_format.count7));//得到借的5本书,不管有没有
					GetBack_Book(user_book);
				}else if(msg.startsWith(Order_format.Return_Book)){
					sql="select * from Record_Info where account=?";
					String[] user_book=Get_Borrow_book(sql,this.getName());//得到借的5本书,不管有没有
					Update_Return_Record(user_book,msg.substring(Order_format.count8),this.getName());//换的书变为null,并设置该书在架上
					String[] user_book1=Get_Borrow_book(sql,this.getName());//得到更新后的借的5本书
					GetBack_Book(user_book1);
				}else if(msg.startsWith(Order_format.Exit)){
					this.father.onlineList.removeElement(this.getName());
					this.father.refreshList();
					socket.close();
					flag=false;
				}
			} catch (ClassNotFoundException|IOException e){
				e.printStackTrace();
			}
		}
	}

	public Vector<Book_Info> Search_Book(String sql){
		Database database = null;
		Book_Info book_info;
		Vector<Book_Info> vector=new Vector<Book_Info>();
		try{
			database=new Database();
			ResultSet rs=database.query_Book(sql);
			while(rs.next())
			{
				book_info=new Book_Info();
				book_info.setBookname(rs.getString(1));
				book_info.setAuthor(rs.getString(2));
				book_info.setPublishment(rs.getString(3));
				book_info.setState(rs.getString(4));
				book_info.setCallno(rs.getString(5));
				vector.addElement(book_info);
			}
		}catch(Exception e){}
		finally 
		{
			database.close();
		}
		return vector;
	}

	public String[] Get_Borrow_book(String sql,String loginID){
		Database database = null;
		String[] user_book = new String[5];
		try {
			database=new Database();
			ResultSet rs=database.query_Bookcount(sql, loginID);
			while(rs.next()){
				for(int i=0;i<user_book.length;i++)
					user_book[i]=rs.getString(i+2);
			}
		} catch (Exception e) {}
		finally 
		{
			database.close();
		}
		return user_book;
	}

	public void Update_Borrow_Record(String[] user_book,String bookname,String loginID){
		Database database = null;
		String sql=null;
		boolean flag=false;
		if(user_book[0]==null){
			sql="update Record_Info set Borrow_Book1='"+bookname+"' where account=?";
		}else if(user_book[1]==null){
			sql="update Record_Info set Borrow_Book2='"+bookname+"' where account=?";
		}else if(user_book[2]==null){
			sql="update Record_Info set Borrow_Book3='"+bookname+"' where account=?";
		}else if(user_book[3]==null){
			sql="update Record_Info set Borrow_Book4='"+bookname+"' where account=?";
		}else if(user_book[4]==null){
			sql="update Record_Info set Borrow_Book5='"+bookname+"' where account=?";
		}else{
			flag=true;
		}
		if(!flag){
			try {
				database=new Database();
				database.Update_Record(sql,loginID);
			} catch (Exception e) {}
			finally 
			{
				database.close();
			}

			sql="update Book_Info set state='已借出' where bookname=?";
			try {
				database=new Database();
				database.Update_Allbook(sql, bookname);
			} catch (SQLException e) {}
			finally 
			{
				database.close();
			}

			sql="select * from Book_Info";
			try {
				IOout.SendMessage(Write_out,Search_Book(sql));
			} catch (IOException e) {}
		}else{
			try {
				IOout.SendMessage(Write_out,"<#All_out#>对不起,你的借阅数量已达上限!");
			} catch (IOException e) {}
		}
	}
	
	public void Update_Return_Record(String[] user_book,String bookname,String loginID){
		Database database = null;
		String sql=null;
		for(int i=0;i<user_book.length;i++){//防止user_book[0].equals(bookname)出错
			if(user_book[i]==null)
				user_book[i]="";
		}
		if(user_book[0].equals(bookname)){
			sql="update Record_Info set Borrow_Book1=null where account=?";
		}else if(user_book[1].equals(bookname)){
			sql="update Record_Info set Borrow_Book2=null where account=?";
		}else if(user_book[2].equals(bookname)){
			sql="update Record_Info set Borrow_Book3=null where account=?";
		}else if(user_book[3].equals(bookname)){
			sql="update Record_Info set Borrow_Book4=null where account=?";
		}else if(user_book[4].equals(bookname)){
			sql="update Record_Info set Borrow_Book5=null where account=?";
		}
		try {
			database=new Database();
			database.Update_Record(sql,loginID);
		} catch (Exception e) {}
		finally 
		{
			database.close();
		}
		
		sql="update Book_Info set state='在架上' where bookname=?";
		try {
			database=new Database();
			database.Update_Allbook(sql, bookname);
		} catch (SQLException e) {}
		finally 
		{
			database.close();
		}
		
	}
	
	public void GetBack_Book(String[] user_book){
		String sql="select * from Book_Info where bookname like '"+user_book[0]+"' or bookname like '"+user_book[1]
				+"' or bookname like '"+user_book[2]+"' or bookname like '"+user_book[3]+"' or bookname like '"+user_book[4]+"'";
		Vector<Book_Info> vector=Search_Book(sql);
		try {
			IOout.SendMessage(Write_out,vector);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}
           

(3)电脑客户端

客户端就只贴电脑客户端的代码,至于手机客户端就不贴了,感兴趣的可以自行下载代码!

用户登陆UI

图书管理系统图书管理系统
package Library_Client;

public class Library_LoginUI extends JFrame implements ActionListener{
	
	public static final String title="图书馆系统";
	ImageIcon background=new ImageIcon("./image/background.jpg");
	JPanel jps=new JPanel();//创建一个JPanel对象
	JLabel Jl_background=new JLabel(background);
	JLabel Jl_title=new JLabel(title,JLabel.CENTER);
	JLabel Jl_IP=new JLabel("IP:",JLabel.RIGHT);
	JLabel Jl_stytle=new JLabel("类型:",JLabel.RIGHT);
	JLabel Jl_user=new JLabel("账号:",JLabel.RIGHT);
	JLabel Jl_password=new JLabel("密码:",JLabel.RIGHT);
	
	JTextField Jf_IP=new JTextField("127.0.0.1");
	JTextField Jf_user=new JTextField("1534041005");
	JComboBox<String> Jb_stytle=new JComboBox<String>();
	JPasswordField jpassword=new JPasswordField("1234567");
	JButton Jlogin=new JButton(new ImageIcon("./image/login.jpg"));
	Socket socket;//声明Socket引用
	ClientThread clientThread;
	
	ObjectOutputStream Write_out;
	ObjectInputStream Read_in;
	IO_in IOin=new IO_in();
	IO_out IOout=new IO_out();
	
	public Library_LoginUI() {
		initialComponent();
		addListener();
		initialFrame();
	}
	
	public static void main(String[] args) {
		new Library_LoginUI();
	}
	
	public void initialComponent(){
		jps.setLayout(null);//设为空布局
		Jl_title.setBounds(350, 100, 300, 50);
		Jl_title.setFont(new Font(title, 1,50));
		Jl_title.setForeground(Color.GREEN);
		jps.add(Jl_title);
		
		Jl_IP.setBounds(250, 250, 110, 25);
		Jl_IP.setFont(new Font("IP:", 1,25));
		Jl_IP.setForeground(Color.lightGray);
		jps.add(Jl_IP);
		
		Jl_stytle.setBounds(250, 300, 110, 25);
		Jl_stytle.setFont(new Font("类型:", 1,25));
		Jl_stytle.setForeground(Color.lightGray);
		jps.add(Jl_stytle);
		
		Jl_user.setBounds(250, 350, 110, 25);
		Jl_user.setFont(new Font("账号:", 1,25));
		Jl_user.setForeground(Color.lightGray);
		jps.add(Jl_user);
		
		Jl_password.setBounds(250, 400, 110, 25);
		Jl_password.setFont(new Font("密码:", 1,25));
		Jl_password.setForeground(Color.lightGray);
		jps.add(Jl_password);
		
		Jf_IP.setBounds(370, 250, 200, 25);
		jps.add(Jf_IP);
		
		Jb_stytle.setBounds(370, 300, 200, 25);
		Vector<String> v=new Vector<String>();
		v.add("学生");
		v.add("管理员");
		v.add("老师");
		Jb_stytle.setModel(new DefaultComboBoxModel<String>(v));
		jps.add(Jb_stytle);
		
		Jf_user.setBounds(370, 350, 200,25);
		jps.add(Jf_user);
		
		jpassword.setBounds(370, 400, 200,25);
		jps.add(jpassword);
		
		Jlogin.setBounds(620, 385, 80,40);
		jps.add(Jlogin);
		
		Jl_background.setBounds(0, 0, background.getIconWidth(),background.getIconHeight());
		jps.add(Jl_background);
	}
	
	public void addListener(){
		Jlogin.addActionListener(this);
	}
	
	public void initialFrame(){
		this.setTitle("图书管理系统--客户端");//设置窗体标题
		Image image=new ImageIcon("./image/library_ico.jpg").getImage();
		this.setIconImage(image);
		Dimension scrSize=Toolkit.getDefaultToolkit().getScreenSize(); //获取屏幕长宽
		this.setBounds(scrSize.width/6,scrSize.height/6, background.getIconWidth(),background.getIconHeight());

		this.add(jps);
		this.setVisible(true);//设置可见性
		this.setResizable(false);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.addWindowListener(mywindowadapter);
	}
	
	
	public WindowAdapter mywindowadapter=new WindowAdapter() {
		public void windowClosing(WindowEvent e) {
			dispose();
//				socket.close();
		};
	};
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==this.Jlogin){
			jbConnect_event();
		}
	}
	
	public void jbConnect_event(){
		String ip=Jf_IP.getText().trim();
		String user=Jf_user.getText().trim();
		String password=jpassword.getText().trim();
		String position=(String)Jb_stytle.getSelectedItem();
		if(!isIP(ip)){
			JOptionPane.showMessageDialog(this,"IP地址错误!","错误",JOptionPane.ERROR_MESSAGE);
			return;
		}
		if(!(user.length()>0)||!(password.length()>0))
		{
			JOptionPane.showMessageDialog(this,"用户名和密码不能为空!","错误",JOptionPane.ERROR_MESSAGE);
			return;
		}
		
		try{
			socket=new Socket(ip,9999);//创建Socket对象
			User user_info=Authentication(socket,user,password,position);
			if(user_info.grtIsuser()){
				if(position.equals("管理员")){
					
				}else{
					new Library_ClientUI(socket,user_info.getUserId(),user_info.getUsername(),user_info.getPosition());
				}
				dispose();
			}
			
		}catch(Exception e){}
	}
	
    public boolean isIP(String addr)
    {
      if(addr.length() < 7 || addr.length() > 15 || "".equals(addr))
      {
        return false;
      }
      /**
       * 判断IP格式和范围
       */
      String rexp = "([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}";
      Pattern pat = Pattern.compile(rexp);  
      Matcher mat = pat.matcher(addr);  
      boolean ipAddress = mat.find();
      return ipAddress;
    }
    
    public User Authentication(Socket socket,String user,String password,String position) throws IOException, ClassNotFoundException{
		User u=new User();
		u.setUserId(user);
		u.setPasswd(password);
		u.setIsuser(false);
		u.setPosition(position);
		Write_out=new ObjectOutputStream(socket.getOutputStream());
		IOout.SendMessage(Write_out, u);
		
		Read_in=new ObjectInputStream(socket.getInputStream());
		User user1=(User)IOin.ReceiveMessage(Read_in);
		return user1;
    }

}
           

电脑客户端UI

用户登陆后,点检索键会把所有图书的信息列出来,从中我们可以看到那些图书已经借出去了,哪些还没有借。对于已经借出去的图书,你是不能选中的,而没借出去的可以双击选中。

图书管理系统图书管理系统
package Library_Client;

public class Library_ClientUI extends JFrame implements ActionListener,MouseListener{
	
	Socket socket;
	String user_ID,position,user_name;
	ObjectOutputStream Write_out;
	ObjectInputStream Read_in;
	IO_in IOin=new IO_in();
	IO_out IOout=new IO_out();
	JPanel title_Jpanel=new JPanel();
	JLabel title_bg;
	JLabel title;
	JLabel Welcome;
	
	ImagePanel Menu_Jpanel;
	JLabel Menu_title;
	JLabel Menu1,Menu2,Menu3,Menu4,Menu5,Menu6;
	Image Menu_bg;
	
	JPanel Main_Jpanel=new JPanel();
	JLabel Spacer_bar;
	JPanel inter_Jpanel=new JPanel();
	JPanel Search_Jpanel=new JPanel();
	JComboBox<String> Search_Key;
	String[] key={"关键词","索书号","书名","作者名","出版社"};
	JTextField key_name;
	JButton Search_Button;
	
	Show_BookList List_Jpanel;
	JPanel title_name=new JPanel();
	JLabel Sel_book,Book_name,Author,Status,Callno;
	

	public Library_ClientUI(Socket socket,String user_ID,String user_name,String position) throws IOException {
		this.socket=socket;
		this.user_ID=user_ID;
		this.position=position;
		this.user_name=user_name;
		Write_out=new ObjectOutputStream(this.socket.getOutputStream());
		Read_in=new ObjectInputStream(this.socket.getInputStream());
		initialComponent();
		initialFrame();
	}
	public Library_ClientUI(){
		initialComponent();
		initialFrame();
	}
	
	
/*	public static void main(String[] args) {
		new Library_ClientUI();
	}*/
	
	private void initialComponent(){
		title_Jpanel.setLayout(new BorderLayout());
		
		title=new JLabel("暨南大学图书馆",JLabel.CENTER);
		title.setBounds(300, 10,400, 80);
		title.setFont(new Font("暨南大学图书馆", 1,50));
		title.setForeground(Color.black);
		title_Jpanel.add(title,BorderLayout.NORTH);
		Welcome=new JLabel("欢迎!"+user_name);
		Welcome.setFont(new Font("欢迎!"+user_name, 1,15));
		Welcome.setForeground(Color.black);
		title_Jpanel.add(Welcome,BorderLayout.SOUTH);
		title_bg=new JLabel(new ImageIcon("./image/title_bg.jpg"),JLabel.CENTER);
		title_bg.setBounds(0, 0, 1000, 100);
		title_Jpanel.add(title_bg,BorderLayout.NORTH);
		
		try {
			Menu_bg=ImageIO.read(new File("./image/Menu_bg.jpg"));
		} catch (Exception e) {}
		Menu_Jpanel=new ImagePanel(Menu_bg);
		Menu_Jpanel.setLayout(new GridLayout(7,1));
		Cursor myCursor=new Cursor(Cursor.HAND_CURSOR);
		Menu_title=new JLabel(new ImageIcon("./image/mylibrary.jpg"),JLabel.CENTER);
		Menu_Jpanel.add(Menu_title);
		Menu1=new JLabel("借阅图书",new ImageIcon("image/Borrow_book.jpg"),JLabel.CENTER);
		Menu1.setCursor(myCursor);
		Menu1.setFont(new Font("借阅图书", 1,15));
		Menu1.setEnabled(false);
		Menu1.addMouseListener(this);
		Menu_Jpanel.add(Menu1);
		Menu2=new JLabel("预约培训",new ImageIcon("image/Pre_book.jpg"),JLabel.CENTER);
		Menu2.setCursor(myCursor);
		Menu2.setFont(new Font("预约培训", 1,15));
		Menu2.setEnabled(false);
		Menu2.addMouseListener(this);
		Menu_Jpanel.add(Menu2);
		Menu3=new JLabel("电子资源",new ImageIcon("image/e-resources.jpg"),JLabel.CENTER);
		Menu3.setCursor(myCursor);
		Menu3.setFont(new Font("电子资源", 1,15));
		Menu3.setEnabled(false);
		Menu3.addMouseListener(this);
		Menu_Jpanel.add(Menu3);
		Menu4=new JLabel("书库检索",new ImageIcon("image/DataBase_retrieval.jpg"),JLabel.CENTER);
		Menu4.setCursor(myCursor);
		Menu4.setFont(new Font("书库检索", 1,15));
		Menu4.setEnabled(false);
		Menu4.addMouseListener(this);
		Menu_Jpanel.add(Menu4);
		Menu5=new JLabel("好书收藏",new ImageIcon("image/collect_book.jpg"),JLabel.CENTER);
		Menu5.setCursor(myCursor);
		Menu5.setFont(new Font("好书收藏", 1,15));
		Menu5.setEnabled(false);
		Menu5.addMouseListener(this);
		Menu_Jpanel.add(Menu5);
		Menu6=new JLabel("个人资料",new ImageIcon("image/Personal _info.jpg"),JLabel.CENTER);
		Menu6.setCursor(myCursor);
		Menu6.setFont(new Font("个人资料", 1,15));
		Menu6.setEnabled(false);
		Menu6.addMouseListener(this);
		Menu_Jpanel.add(Menu6);
		
		inter_Jpanel.setLayout(new BorderLayout());
		Search_Jpanel.setLayout(new GridLayout(2, 5,50,40));
		Search_Jpanel.add(new JPanel());//起间隔作用
		Search_Key=new JComboBox<>(key);
		Search_Jpanel.add(Search_Key);
		key_name=new JTextField(20);
		Search_Jpanel.add(key_name);
		Search_Button=new JButton("检索");
		Search_Button.addActionListener(this);
		Search_Jpanel.add(Search_Button);
		Search_Jpanel.add(new JPanel());//起间隔作用
		Search_Jpanel.add(new JPanel());//起间隔作用
		Search_Jpanel.add(new JPanel());//起间隔作用
		Search_Jpanel.add(new JPanel());//起间隔作用
		Search_Jpanel.add(new JPanel());//起间隔作用
		Search_Jpanel.add(new JPanel());//起间隔作用
		inter_Jpanel.add(Search_Jpanel,BorderLayout.NORTH);
		
		List_Jpanel=new Show_BookList(socket,Read_in,Write_out);
		inter_Jpanel.add(List_Jpanel, BorderLayout.CENTER);
		
		Main_Jpanel.setLayout(new BorderLayout());
		Spacer_bar=new JLabel(new ImageIcon("image/spacer_bar.jpg"));
		Main_Jpanel.add(Spacer_bar,BorderLayout.WEST);
		Main_Jpanel.add(inter_Jpanel,BorderLayout.CENTER);
	}

	
	private void initialFrame() {
		this.setTitle("图书管理系统--客户端");//设置窗体标题
		Image image=new ImageIcon("./image/library_ico.jpg").getImage();
		this.setIconImage(image);
		Dimension scrSize=Toolkit.getDefaultToolkit().getScreenSize(); //获取屏幕长宽
		this.setBounds(scrSize.width/6,scrSize.height/6,1000,700);


		this.add(title_Jpanel,BorderLayout.NORTH);
		this.add(Menu_Jpanel,BorderLayout.WEST);
		this.add(Main_Jpanel,BorderLayout.CENTER);
		this.setVisible(true);//设置可见性
		this.setResizable(false);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.addWindowListener(mywindowadapter);
	}
	
	public WindowAdapter mywindowadapter=new WindowAdapter() {
		public void windowClosing(WindowEvent e) {
			try {
				IOout.SendMessage(Write_out, Order_format.Exit);//通知服务器退出
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			dispose();
		};
	};
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==this.Search_Button){//检索按键
			try {
				Search_Book();
			} catch (IOException | ClassNotFoundException e1) {}
		}
		
	}
	
	public void Search_Book() throws IOException, ClassNotFoundException{
		List_Jpanel.Isclick_ture();
		switch (Search_Key.getSelectedIndex()) {
		case 0: Got_Allbook();break;
		case 1:Search_Gotbook(Order_format.Callno);break;
		case 2:Search_Gotbook(Order_format.bookname);break;
		case 3:Search_Gotbook(Order_format.author);break;
		case 4:Search_Gotbook(Order_format.publishment);break;
		default:
			break;
		}
	}
	
	@SuppressWarnings("unchecked")
	public void Got_Allbook() throws IOException, ClassNotFoundException{
		IOout.SendMessage(Write_out, Order_format.All_book+key_name.getText().trim());
		Vector<Book_Info> vector=(Vector<Book_Info>) IOin.ReceiveMessage(Read_in);
		List_Jpanel.Update(vector);
	}
	
	public void Search_Gotbook(String order) throws IOException, ClassNotFoundException{
		String msg=key_name.getText().trim();
		if(msg.length()>0){
			IOout.SendMessage(Write_out, order+msg);
			Vector<Book_Info> vector=(Vector<Book_Info>) IOin.ReceiveMessage(Read_in);
			if(vector.size()!=0)
				List_Jpanel.Update(vector);
			else{
				List_Jpanel.clear();
				JOptionPane.showMessageDialog(this,"木有查询结果!","提醒",JOptionPane.ERROR_MESSAGE);
			}
		}else{
			JOptionPane.showMessageDialog(this,"输入框不能为空!","错误",JOptionPane.ERROR_MESSAGE);
		}
	}

	
	@Override
	public void mouseClicked(MouseEvent e) {
		if(e.getSource()==this.Menu1){
			try {
				IOout.SendMessage(Write_out, Order_format.User_book+this.user_ID);
				Vector<Book_Info> vector=(Vector<Book_Info>) IOin.ReceiveMessage(Read_in);
				List_Jpanel.Update(vector);
				List_Jpanel.Isclick_false();
			} catch (IOException e1) {
				e1.printStackTrace();
			} catch (ClassNotFoundException e1) {
				e1.printStackTrace();
			}
		}else if(e.getSource()==this.Menu2){

		}else if(e.getSource()==this.Menu3){

		}else if(e.getSource()==this.Menu4){

		}else if(e.getSource()==this.Menu5){

		}else if(e.getSource()==this.Menu6){

		}
	}
	@Override
	public void mouseEntered(MouseEvent e) {
		if(e.getSource()==this.Menu1){
			Menu1.setEnabled(true);
		}else if(e.getSource()==this.Menu2){
			Menu2.setEnabled(true);
		}else if(e.getSource()==this.Menu3){
			Menu3.setEnabled(true);
		}else if(e.getSource()==this.Menu4){
			Menu4.setEnabled(true);
		}else if(e.getSource()==this.Menu5){
			Menu5.setEnabled(true);
		}else if(e.getSource()==this.Menu6){
			Menu6.setEnabled(true);
		}
	}
	@Override
	public void mouseExited(MouseEvent e) {
		if(e.getSource()==this.Menu1){
			Menu1.setEnabled(false);
		}else if(e.getSource()==this.Menu2){
			Menu2.setEnabled(false);
		}else if(e.getSource()==this.Menu3){
			Menu3.setEnabled(false);
		}else if(e.getSource()==this.Menu4){
			Menu4.setEnabled(false);
		}else if(e.getSource()==this.Menu5){
			Menu5.setEnabled(false);
		}else if(e.getSource()==this.Menu6){
			Menu6.setEnabled(false);
		}
	}
	@Override
	public void mousePressed(MouseEvent e) {

	}
	@Override
	public void mouseReleased(MouseEvent e) {
		
	}

}
           

查询功能以及借书还书功能

图书管理系统图书管理系统
图书管理系统图书管理系统
图书管理系统图书管理系统
package Library_Client;

public class Show_BookList extends JPanel {

	Socket socket;
	ObjectOutputStream Write_out;
	ObjectInputStream Read_in;
	IO_in IOin=new IO_in();
	IO_out IOout=new IO_out();
	boolean Isclick;

	Vector<String> head = new Vector<String>();
	{//定义表头
		head.add("书名");head.add("作者");head.add("出版社");
		head.add("状态");head.add("索引号");
	}
	Vector<Vector> data=new Vector<Vector>();//定义检索出的书的基本信息
	DefaultTableModel TableModel=new DefaultTableModel(data,head);	//创建表格模型
	JTable head_table=new JTable(TableModel){
		public boolean isCellEditable(int row, int column) { //表格不可编辑
			return false;
		}
	}; //创建Jtable对象
	JScrollPane ScrollPane=new JScrollPane(head_table);//将JTable封装到滚动窗格

	public Show_BookList(Socket socket,ObjectInputStream Read_in,ObjectOutputStream Write_out){
		this.socket=socket;
		this.Read_in=Read_in;
		this.Write_out=Write_out;

		this.setLayout(new BorderLayout());
		head_table.addMouseListener(new MouseAdapter(){
			public void mouseClicked(MouseEvent e) {
				if(e.getClickCount()==2){
					if(head_table.getValueAt(head_table.getSelectedRow(), 3).toString().equals("在架上")){//判断是否已借出
						Object value= head_table.getValueAt(head_table.getSelectedRow(), 0);//得到选中的单元格的值,表格中都是字符串
						try {
							Correct_Borrow(JOptionPane.showConfirmDialog
									(null,"是否借阅 “"+value.toString()+"” 这本书?","提示", JOptionPane.YES_NO_OPTION),value.toString());
						} catch (HeadlessException | IOException e1) {
							e1.printStackTrace();
						}
					}else{
						if(Isclick)
							JOptionPane.showMessageDialog(null,"该书已借出!","提醒",JOptionPane.ERROR_MESSAGE);
						else{
							Object value= head_table.getValueAt(head_table.getSelectedRow(), 0);//得到选中的单元格的值,表格中都是字符串
							try {
								Correct_return(JOptionPane.showConfirmDialog
										(null,"是否还 “"+value.toString()+"” 这本书?","提示", JOptionPane.YES_NO_OPTION),value.toString());
							} catch (HeadlessException | IOException e1) {
								e1.printStackTrace();
							}
						}
					}
				}
			}
		}); 

		this.add(ScrollPane,BorderLayout.NORTH);
		this.setVisible(true);
	}

	public void Update(Vector<Book_Info> vector){
		Vector<Vector> data=new Vector<Vector>();
		Vector<String> a;
		for(int i=0;i<vector.size();i++){
			a=new Vector<String>();
			a.addElement(vector.get(i).getBookname());
			a.addElement(vector.get(i).getAuthor());
			a.addElement(vector.get(i).getPublishment());
			a.addElement(vector.get(i).getState());
			a.addElement(vector.get(i).getCallno());
			data.addElement(a);
		}
		TableModel.setDataVector(data,head);
		head_table.updateUI();
		head_table.repaint();
	}

	public void clear(){
		Vector<Vector> data=new Vector<Vector>();
		TableModel.setDataVector(data,head);
		head_table.updateUI();
		head_table.repaint();
	}

	public void Correct_Borrow(int a,String msg) throws IOException{
		if(a==0){
			msg=Order_format.Borrow_Book+msg;
			IOout.SendMessage(Write_out,msg);
			try {
				Object ms=(Object) IOin.ReceiveMessage(Read_in);
				if(ms instanceof String){//判断接收数据的类型
					String m=(String)ms;
					JOptionPane.showMessageDialog(this,m.substring(11),"提醒",JOptionPane.ERROR_MESSAGE);
				}else
					Update((Vector<Book_Info>)ms);//刷新数据

			} catch (ClassNotFoundException e) {}
		}
	}
	
	public void Correct_return(int a,String msg) throws IOException{
		if(a==0){
			msg=Order_format.Return_Book+msg;
			IOout.SendMessage(Write_out,msg);
			try {
				Update((Vector<Book_Info>)IOin.ReceiveMessage(Read_in));
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
	}

	public void Isclick_false(){
		Isclick=false;
	}
	public void Isclick_ture(){
		Isclick=true;
	}

}
           

其余代码就不贴出来了,有兴趣可以自己下载!

(4)移动客户端

图书管理系统图书管理系统

源码下载