图书管理系统
来源:互联网 发布: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
- 图书管理系统论文
- 图书管理系统(1)
- 图书管理系统(2)
- 图书管理系统(3)
- java-图书管理系统
- 图书管理系统
- 图书管理系统
- 简单图书管理系统
- 图书管理系统
- 图书管理系统
- 图书仓库管理系统
- 《图书管理系统》毕业论文
- 图书管理系统
- 图书管理系统
- 图书管理系统
- 图书管理系统
- 图书管理系统
- 图书管理系统
- 第7章4-6题
- 第7章 7-8题
- Python自然语言处理-第二章总结:获得文本语料与词汇
- 第7章 9-10题
- 第8章 1-3题
- 图书管理系统
- 第八章4-7题
- 第九章第1题
- linux安装mysql
- 第九章2-3题
- 第九章第4题
- 巴什博弈(hdu 2897)
- Linux Kernel设备驱动模型之 struct device_node
- 第10章第1题