Java實(shí)戰(zhàn)之網(wǎng)上書店管理系統(tǒng)的實(shí)現(xiàn)
1.效果展示
2.需求功能
用戶可以進(jìn)行注冊(cè)登陸系統(tǒng),在用戶的界面上,其可以進(jìn)行查看網(wǎng)上書店里的圖書類別和所在類別下的圖書,根據(jù)自己的需求可在訂單項(xiàng)目里添加訂單購買自己喜歡的圖書;
管理員可以通過自己的賬號(hào)登錄到管理員系統(tǒng)對(duì)書店進(jìn)行管理,其可實(shí)現(xiàn)對(duì)圖書的添加,修改,查詢,和刪除功能,可以查看用戶的訂單,修改和維護(hù)訂單。添家客戶的信息用以統(tǒng)計(jì)數(shù)據(jù)。
在構(gòu)造系統(tǒng)時(shí),首先從需求出發(fā)構(gòu)造數(shù)據(jù)庫,然后再由數(shù)據(jù)庫表結(jié)合需求劃分系統(tǒng)功能模塊。這樣,就把一個(gè)大的系統(tǒng)解成了幾個(gè)小系統(tǒng)。這里把系統(tǒng)劃分為了三個(gè)模塊:用戶登錄模塊,管理員模塊,用戶購買模塊。模塊分別能夠?qū)崿F(xiàn)以下功能:
- 登錄模塊:實(shí)現(xiàn)登錄,注冊(cè)功能。
- 管理員模塊:實(shí)現(xiàn)對(duì)圖書的添加修改和刪除以及對(duì)訂單的添加修改和刪除功能。
- 用戶購買模塊:實(shí)現(xiàn)對(duì)圖書的查找以及對(duì)所需圖書的下單功能。
3.系統(tǒng)總體設(shè)計(jì)及部分代碼
3.1登錄模塊設(shè)計(jì)
用戶正確輸入用戶名和密碼,連接到數(shù)據(jù)庫,登錄成功!
private void loginActionPerformed(ActionEvent evt) { String userName=this.userNameTxt.getText(); String password=new String(this.passwordTxt.getPassword()); if(StringUtil.isEmpty(userName)){ JOptionPane.showMessageDialog(null, "用戶名不能為空!"); return; } if(StringUtil.isEmpty(password)){ JOptionPane.showMessageDialog(null, "密碼不能為空!"); return; } CUser cuser=new CUser(userName,password); Connection con=null; try { con=dbUtil.getCon(); CUser currentCUser =cuserDao.login(con,cuser); if(currentCUser!=null){ dispose(); new CMainFrm().setVisible(true); }else{ JOptionPane.showMessageDialog(null, "用戶名或者密碼錯(cuò)誤!"); } } catch (Exception e) { // TODO 自動(dòng)生成的 catch 塊 e.printStackTrace(); }
3.2新用戶的注冊(cè)
此模塊的核心是創(chuàng)建實(shí)例化對(duì)象。
private void registrationActionPerformed(ActionEvent evt) { String userName=this.userNameTxt.getText(); String password=this.passwordTxt.getText(); if(StringUtil.isEmpty(userName)){ JOptionPane.showMessageDialog(null, "用戶名不能為空!"); return; } if(StringUtil.isEmpty(password)){ JOptionPane.showMessageDialog(null, "密碼不能為空!"); return; } Registration registration= new Registration(userName,password); Connection con= null; try { con=dbUtil.getCon(); int n= registrationDao.add(con, registration); if(n==1){ JOptionPane.showMessageDialog(null, "注冊(cè)成功!"); resetValue(); }else{ JOptionPane.showMessageDialog(null, "注冊(cè)失??!"); } }catch(Exception e) { }finally { try { dbUtil.closeCon(con); } catch (Exception e) { // TODO 自動(dòng)生成的 catch 塊 e.printStackTrace(); JOptionPane.showMessageDialog(null, "注冊(cè)失??!"); } } }
3.3圖書添加模塊
管理員在此界面上可對(duì)系統(tǒng)里的圖書進(jìn)行查詢修改和刪除。
public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { BookAddInterFrm frame = new BookAddInterFrm(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); }
3.4圖書添加事件
此界面主要實(shí)現(xiàn)圖書的添加功能。
/** *圖書添加事件 */ private void bookAddActionPerformed(ActionEvent evt) { String bookName=this.bookNameTxt.getText(); String author=this.authorTxt.getText(); String price=this.priceTxt.getText(); String bookDesc=this.bookDescTxt.getText(); if(StringUtil.isEmpty(bookName)){ JOptionPane.showMessageDialog(null, "圖書名稱不能為空!"); return; } if(StringUtil.isEmpty(author)){ JOptionPane.showMessageDialog(null, "圖書作者不能為空!"); return; } if(StringUtil.isEmpty(price)){ JOptionPane.showMessageDialog(null, "圖書價(jià)格不能為空!"); return; } String sex=""; if(manJrb.isSelected()){ sex="男"; }else if(femaleJrb.isSelected()){ sex="女"; } BookType bookType=(BookType) bookTypeJcb.getSelectedItem(); int bookTypeId=bookType.getId(); Book book=new Book(bookName,author, sex, Float.parseFloat(price) , bookTypeId, bookDesc); Connection con=null; try{ con=dbUtil.getCon(); int addNum=bookDao.add(con, book); if(addNum==1){ JOptionPane.showMessageDialog(null, "圖書添加成功!"); resetValue(); }else{ JOptionPane.showMessageDialog(null, "圖書添加失??!"); } }catch(Exception e){ e.printStackTrace(); JOptionPane.showMessageDialog(null, "圖書添加失敗!"); }finally{ try { dbUtil.closeCon(con); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 重置表單 */ private void resetValue(){ this.bookNameTxt.setText(""); this.authorTxt.setText(""); this.priceTxt.setText(""); this.manJrb.setSelected(true); this.bookDescTxt.setText(""); if(this.bookTypeJcb.getItemCount()>0){ this.bookTypeJcb.setSelectedIndex(0); } } /** * 初始化圖書類別下拉框 */ private void fillBookType(){ Connection con=null; BookType bookType=null; try{ con=dbUtil.getCon(); ResultSet rs=bookTypeDao.list(con, new BookType()); while(rs.next()){ bookType=new BookType(); bookType.setId(rs.getInt("id")); bookType.setBookTypeName(rs.getString("bookTypeName")); this.bookTypeJcb.addItem(bookType); } }catch(Exception e){ e.printStackTrace(); }finally{ } } }
3.5買家信息維護(hù)
此模塊主要用于對(duì)買家信息的查找和維護(hù)。
/** * 買家信息搜索事件處理 */ protected void consumerSerachActionPerformed(ActionEvent evt) { String s_consumerName= this.s_consumerNameTxt.getText(); Consumer consumer=new Consumer(); consumer.setConsumerName(s_consumerName); this.fillTable(consumer); } private void fillTable(Consumer consumer){ DefaultTableModel dtm=(DefaultTableModel) consumerTable.getModel(); dtm.setRowCount(0); // 設(shè)置成0行 Connection con=null; try{ con=dbUtil.getCon(); ResultSet rs=consumerDao.list(con, consumer); while(rs.next()){ Vector v=new Vector(); v.add(rs.getString("id")); v.add(rs.getString("consumerName")); v.add(rs.getString("sex")); v.add(rs.getString("age")); v.add(rs.getString("number")); v.add(rs.getString("bookName")); dtm.addRow(v); } }catch(Exception e){ e.printStackTrace(); }finally { try { dbUtil.closeCon(con); } catch (Exception e) { // TODO 自動(dòng)生成的 catch 塊 e.printStackTrace(); } } } /** * 買家信息修改 */ private void consumerUpdateActionEvet(ActionEvent evt) { String id=idTxt.getText(); String consumerName=consumerNameTxt.getText(); String sex=sexTxt.getText(); String age=ageTxt.getText(); String number=numberTxt.getText(); String bookName=bookNameTxt.getText(); if(StringUtil.isEmpty(id)){ JOptionPane.showMessageDialog(null, "請(qǐng)選擇要修改的記錄"); return; } if(StringUtil.isEmpty(consumerName)){ JOptionPane.showMessageDialog(null, "購書者名稱不能為空"); return; } if(StringUtil.isEmpty(age)){ JOptionPane.showMessageDialog(null, "年齡不能為空"); return; } if(StringUtil.isEmpty(number)){ JOptionPane.showMessageDialog(null, "聯(lián)系方式不能為空"); return; } if(StringUtil.isEmpty(bookName)){ JOptionPane.showMessageDialog(null, "圖書名稱不能為空"); return; } if(StringUtil.isEmpty(sex)){ JOptionPane.showMessageDialog(null, "性別不能為空"); return; } Consumer consumer=new Consumer(Integer.parseInt(id),consumerName,sex,age,number,bookName); Connection con=null; try { con=dbUtil.getCon(); con=dbUtil.getCon(); int modifyNum=consumerDao.update(con, consumer); if(modifyNum==1){ JOptionPane.showMessageDialog(null, "修改成功"); this.resetValue(); this.fillTable(new Consumer()); }else{ JOptionPane.showMessageDialog(null, "修改失敗"); } }catch(Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(null, "修改失敗"); }finally { try { dbUtil.closeCon(con); } catch (Exception e) { // TODO 自動(dòng)生成的 catch 塊 e.printStackTrace(); } } }
3.6訂單管理模塊
此模塊用于圖書訂單管理,查找,修改,刪除等功能的實(shí)現(xiàn)。
/** * 訂單修改事件 */ protected void orderUpdateActionPerformed(ActionEvent evt) { String id=this.idTxt.getText(); if(StringUtil.isEmpty(id)){ JOptionPane.showMessageDialog(null, "請(qǐng)選擇要修改的記錄"); return; } String addressee=this.addresseeTxt.getText(); String number=this.numberTxt.getText(); String deliveryMent=this.deliveryMentTxt.getText(); String paymentMethod=this.paymentMethodTxt.getText(); String shippingAddress=this.shippingAddressTxt.getText(); if(StringUtil.isEmpty(addressee)){ JOptionPane.showMessageDialog(null, "收件人不能為空!"); return; } if(StringUtil.isEmpty(number)){ JOptionPane.showMessageDialog(null, "購買數(shù)量不能為空!"); return; } if(StringUtil.isEmpty(deliveryMent)){ JOptionPane.showMessageDialog(null, "運(yùn)送方式不能為空!"); return; } if(StringUtil.isEmpty(paymentMethod)){ JOptionPane.showMessageDialog(null, "支付方式不能為空!"); return; } if(StringUtil.isEmpty(paymentMethod)){ JOptionPane.showMessageDialog(null, "收件地址不能為空!"); return; } Book book=(Book) this.bookNameJcb.getSelectedItem(); int bookId=book.getId(); Order order =new Order(Integer.parseInt(id), addressee, number, deliveryMent, paymentMethod, shippingAddress, bookId); Connection con =null; try { con=dbUtil.getCon(); int addNum=orderDao.update(con, order); if(addNum==1) { JOptionPane.showMessageDialog(null, "訂單修改成功!"); resetValue(); this.fillTable(new Order()); }else { JOptionPane.showMessageDialog(null, "訂單修改失敗!"); } }catch(Exception e) { e.printStackTrace(); }finally { try { dbUtil.closeCon(con); } catch (Exception e) { // TODO 自動(dòng)生成的 catch 塊 e.printStackTrace(); JOptionPane.showMessageDialog(null, "訂單添加失?。?); } } }
4.數(shù)據(jù)庫設(shè)計(jì)
4.1系統(tǒng)數(shù)據(jù)庫設(shè)計(jì)
使用sql語句查詢項(xiàng)目存儲(chǔ)數(shù)據(jù)用到的數(shù)據(jù)庫表格:
1.管理員信息表
列名 | 數(shù)據(jù)類型 | 長(zhǎng)度 | 主鍵 | 非空 | 自增 |
---|---|---|---|---|---|
Id | Int | 11 | √ | √ | √ |
usename | varchar | 20 | |||
password | varchar | 20 |
2.圖書類型信息表
列名 | 數(shù)據(jù)類型 | 長(zhǎng)度 | 主鍵 | 非空 | 自增 |
---|---|---|---|---|---|
id | Int | 11 | √ | √ | √ |
BookTypeName | Varchar | 20 | |||
bookTypeDes | Varchar | 20 |
3.圖書信息表
列名 | 數(shù)據(jù)類型 | 長(zhǎng)度 | 主鍵 | 非空 | 自增 |
---|---|---|---|---|---|
Bookname | Int | 11 | √ | √ | √ |
Author | Varchar | 20 | |||
Sex | Varchar | 10 | |||
Price | Float | 10 | |||
bookTypeId | Int | 11 | |||
bookDesc | Varchar | 1000 |
4.訂單信息表
列名 | 數(shù)據(jù)類型 | 長(zhǎng)度 | 主鍵 | 非空 | 自增 |
---|---|---|---|---|---|
Buyid | Int | 11 | √ | √ | √ |
Name | Varchar | 20 | |||
Sex | Varchar | 20 | |||
Buybooknamtel | Varchar | 20 | |||
Way | Varchar | 20 | |||
Address | Varchar | 20 |
5.買家信息表
列名 | 數(shù)據(jù)類型 | 長(zhǎng)度 | 主鍵 | 非空 | 自增 |
---|---|---|---|---|---|
Id | Int | 11 | √ | √ | √ |
Consumername | Varchar | 50 | |||
Sex | Varchar | 50 | |||
Age | Varchar | 50 | |||
Number | Varchar | 50 | |||
Bookname | Varchar | 50 |
4.2系統(tǒng)E-R圖設(shè)計(jì)
5.JDBC連接數(shù)據(jù)庫
一定要安裝數(shù)據(jù)庫jdbc驅(qū)動(dòng)包!
代碼展示:
package com.util; import java.sql.Connection; import java.sql.DriverManager; /** * 數(shù)據(jù)庫工具類 */ public class DbUtil { private String jdbcName="com.mysql.cj.jdbc.Driver"; // 驅(qū)動(dòng)名稱 數(shù)據(jù)庫連接地址 由于數(shù)據(jù)庫為最新版本 導(dǎo)致驅(qū)動(dòng)名稱已改為com.mysql.cj.jdbc.Driver //由于時(shí)區(qū)錯(cuò)亂 執(zhí)行命令給MySQL服務(wù)器設(shè)置時(shí)區(qū)為東八區(qū) serverTimezone=GMT%2B8 private String dbUrl="jdbc:mysql://localhost:3306/db_book?serverTimezone=GMT%2B8";// 數(shù)據(jù)庫連接地址 private String dbuserName = "root"; // 用戶名 private String dbpassWord = "abc123"; // 密碼 /** * 獲取數(shù)據(jù)庫連接 */ public Connection getCon()throws Exception{ Class.forName(jdbcName); Connection con=DriverManager.getConnection(dbUrl, dbuserName, dbpassWord); return con; } /** * 關(guān)閉數(shù)據(jù)庫連接 */ public void closeCon(Connection con)throws Exception{ if(con!=null){ con.close(); } } public static void main(String[] args) { DbUtil dbUtil=new DbUtil(); try { dbUtil.getCon(); System.out.println("數(shù)據(jù)庫連接成功!"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("數(shù)據(jù)庫連接失敗"); } } }
以上就是Java實(shí)戰(zhàn)之網(wǎng)上書店管理系統(tǒng)的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Java書店管理系統(tǒng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java反射(JDK)與動(dòng)態(tài)代理(CGLIB)詳解
下面小編就為大家?guī)硪黄獪\談Java反射與動(dòng)態(tài)代理。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2021-08-08Java實(shí)現(xiàn)直接插入排序與折半插入排序的示例詳解
這篇文章主要為大家詳細(xì)介紹了插入排序中兩個(gè)常見的排序:直接插入排序與折半插入排序。本文用Java語言實(shí)現(xiàn)了這兩個(gè)排序算法,感興趣的可以學(xué)習(xí)一下2022-06-06Spring整合多數(shù)據(jù)源實(shí)現(xiàn)動(dòng)態(tài)切換的實(shí)例講解
下面小編就為大家?guī)硪黄猄pring整合多數(shù)據(jù)源實(shí)現(xiàn)動(dòng)態(tài)切換的實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07Spring框架花式創(chuàng)建Bean的n種方法(小結(jié))
這篇文章主要介紹了Spring框架花式創(chuàng)建Bean的n種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03macbook中springboot的jmeter壓測(cè)示例
這篇文章主要介紹了macbook中springboot的jmeter壓測(cè)示例詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11spring boot springjpa 支持多個(gè)數(shù)據(jù)源的實(shí)例代碼
這篇文章主要介紹了spring boot springjpa 支持多個(gè)數(shù)據(jù)源的實(shí)例代碼,需要的朋友可以參考下2018-04-04MyBatis CodeHelperPro激活方法詳細(xì)教程
MyBatisCodeHelper-Pro是IDEA下的一個(gè)插件,功能類似mybatis plugin,今天小編給大家分享MyBatis CodeHelperPro激活方法,需要的朋友跟隨小編一起看看吧2021-07-07