图书管理系统

来源:互联网 发布:smtp 端口 编辑:程序博客网 时间:2024/05/24 07:08

图书管理系统

该图书管理系统是我研一时候的一个课程设计,当时也刚重新学完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();//创建用于显示当前用户的JListJScrollPane 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();};};@Overridepublic 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")@Overridepublic 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);//accountuser_info[1]=rs.getString(2);//user_nameuser_info[2]=rs.getString(3);//passworduser_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());}@Overridepublic 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();};};@Overridepublic 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();};};@Overridepublic 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);}}@Overridepublic 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){}}@Overridepublic 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);}}@Overridepublic 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);}}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic 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);}elseUpdate((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)移动客户端



源码下载


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 蓝色的衣服晒红怎么办 厨房用的剪刀开合很紧怎么办 理发的剪刀钝了怎么办 小孩眼睛肿了怎么办才能消肿 柿子和螃蟹后要怎么办 柿子和螃蟹吃了怎么办 吃了没熟的虾怎么办 邻居小孩怕我家小狗怎么办 心里有一道坎过不去了怎么办 刚买的小狗怕人怎么办 一年级孩子字写不好怎么办 小狗三天没吃了怎么办 捡到一只流浪猫怎么办 仓鼠四肢红肿圈状怎么办 泰迪的鼻子干燥怎么办 小狗眼睛有白色浓稠物怎么办 流浪狗生了小狗怎么办 学生字写得很差怎么办 猫身上粘老鼠胶怎么办 抄东西抄的手疼怎么办 皮质物品被油性笔划了怎么办 在小区猫丢了怎么办 母猫把小猫丢了怎么办 小狗不吃东西没精神怎么办 小狗的鼻子烂了怎么办 狗老是在家拉尿怎么办 狗狗鼻子有点干怎么办 狗的鼻头不黑了怎么办 金毛鼻头不黑怎么办 金毛毛掉了不长怎么办 狗狗鼻子烂了怎么办 小比熊鼻子不黑怎么办 狗狗鼻子起皮怎么办 金鱼身子弯了是怎么办 属狗的纹龙怎么办 卫生间的墙空的怎么办 花生苗长得好怎么办 菊花上面的白虫怎么办 小狗不吃东西还吐怎么办 小狗呕吐不吃东西没精神怎么办 小狗生病了不吃东西怎么办