Java實(shí)戰(zhàn)之網(wǎng)上書店管理系統(tǒng)的實(shí)現(xiàn)
1.效果展示


2.需求功能
用戶可以進(jìn)行注冊登陸系統(tǒng),在用戶的界面上,其可以進(jìn)行查看網(wǎng)上書店里的圖書類別和所在類別下的圖書,根據(jù)自己的需求可在訂單項(xiàng)目里添加訂單購買自己喜歡的圖書;
管理員可以通過自己的賬號登錄到管理員系統(tǒng)對書店進(jìn)行管理,其可實(shí)現(xiàn)對圖書的添加,修改,查詢,和刪除功能,可以查看用戶的訂單,修改和維護(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)登錄,注冊功能。
- 管理員模塊:實(shí)現(xiàn)對圖書的添加修改和刪除以及對訂單的添加修改和刪除功能。
- 用戶購買模塊:實(shí)現(xiàn)對圖書的查找以及對所需圖書的下單功能。
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 自動生成的 catch 塊
e.printStackTrace();
}
3.2新用戶的注冊
此模塊的核心是創(chuàng)建實(shí)例化對象。
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, "注冊成功!");
resetValue();
}else{
JOptionPane.showMessageDialog(null, "注冊失??!");
}
}catch(Exception e) {
}finally {
try {
dbUtil.closeCon(con);
} catch (Exception e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
JOptionPane.showMessageDialog(null, "注冊失??!");
}
}
}
3.3圖書添加模塊
管理員在此界面上可對系統(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ù)
此模塊主要用于對買家信息的查找和維護(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 自動生成的 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, "請選擇要修改的記錄");
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 自動生成的 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, "請選擇要修改的記錄");
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 自動生成的 catch 塊
e.printStackTrace();
JOptionPane.showMessageDialog(null, "訂單添加失?。?);
}
}
}
4.數(shù)據(jù)庫設(shè)計(jì)
4.1系統(tǒng)數(shù)據(jù)庫設(shè)計(jì)
使用sql語句查詢項(xiàng)目存儲數(shù)據(jù)用到的數(shù)據(jù)庫表格:

1.管理員信息表
| 列名 | 數(shù)據(jù)類型 | 長度 | 主鍵 | 非空 | 自增 |
|---|---|---|---|---|---|
| Id | Int | 11 | √ | √ | √ |
| usename | varchar | 20 | |||
| password | varchar | 20 |
2.圖書類型信息表
| 列名 | 數(shù)據(jù)類型 | 長度 | 主鍵 | 非空 | 自增 |
|---|---|---|---|---|---|
| id | Int | 11 | √ | √ | √ |
| BookTypeName | Varchar | 20 | |||
| bookTypeDes | Varchar | 20 |
3.圖書信息表
| 列名 | 數(shù)據(jù)類型 | 長度 | 主鍵 | 非空 | 自增 |
|---|---|---|---|---|---|
| Bookname | Int | 11 | √ | √ | √ |
| Author | Varchar | 20 | |||
| Sex | Varchar | 10 | |||
| Price | Float | 10 | |||
| bookTypeId | Int | 11 | |||
| bookDesc | Varchar | 1000 |
4.訂單信息表
| 列名 | 數(shù)據(jù)類型 | 長度 | 主鍵 | 非空 | 自增 |
|---|---|---|---|---|---|
| Buyid | Int | 11 | √ | √ | √ |
| Name | Varchar | 20 | |||
| Sex | Varchar | 20 | |||
| Buybooknamtel | Varchar | 20 | |||
| Way | Varchar | 20 | |||
| Address | Varchar | 20 |
5.買家信息表
| 列名 | 數(shù)據(jù)類型 | 長度 | 主鍵 | 非空 | 自增 |
|---|---|---|---|---|---|
| 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ū)動包!
代碼展示:
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ū)動名稱
數(shù)據(jù)庫連接地址 由于數(shù)據(jù)庫為最新版本 導(dǎo)致驅(qū)動名稱已改為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)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Springboot項(xiàng)目全局異常統(tǒng)一處理案例代碼
最近在做項(xiàng)目時(shí)需要對異常進(jìn)行全局統(tǒng)一處理,主要是一些分類入庫以及記錄日志等,因?yàn)轫?xiàng)目是基于Springboot的,所以去網(wǎng)絡(luò)上找了一些博客文檔,然后再結(jié)合項(xiàng)目本身的一些特殊需求做了些許改造,現(xiàn)在記錄下來便于以后查看2023-01-01
java UDP通信客戶端與服務(wù)器端實(shí)例分析
這篇文章主要介紹了java UDP通信客戶端與服務(wù)器端,結(jié)合實(shí)例形式分析了java基于UDP通信的客戶端與服務(wù)器端具體實(shí)現(xiàn)技巧及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-01-01
Java調(diào)用WebService服務(wù)的三種方式總結(jié)
雖然WebService這個(gè)框架已經(jīng)過時(shí),但是有些公司還在使用,在調(diào)用他們的服務(wù)的時(shí)候就不得不面對各種問題,本篇文章總結(jié)了最近我調(diào)用?WebService的心路歷程,3種方式可以分別嘗試,需要的朋友可以參考下2023-08-08
SpringBoot調(diào)用Poi-tl實(shí)現(xiàn)渲染數(shù)據(jù)并生成Word文檔
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何調(diào)用Poi-tl實(shí)現(xiàn)渲染數(shù)據(jù)并生成Word文檔,文中的示例代碼講解詳細(xì),有需要的小伙伴可以了解下2023-09-09
深入理解java異常處理機(jī)制的原理和開發(fā)應(yīng)用
Java異常處理機(jī)制在日常開發(fā)中應(yīng)用頻繁,本篇文章主要在基礎(chǔ)的使用方法上,更進(jìn)一步的,如何更加合理的使用異常機(jī)制,希望可以對各位朋友能有所幫助。2017-04-04

