资源描述
书店管理系统的设计与实现
——书籍销售管理模块
学生姓名: 指导老师:
摘 要 本课程设计重要解决书店的管理问题,设计开发一个简朴的书店管理系统 ,实现分类登陆,书籍管理,仓库库存管理,会员管理以及各种查询等功能。在课程设计中,系统开发平台为Windows 7,程序设计语言采用Java,数据库采用Oracle Database 11g Express Edition,程序运营平台为Windows 7。程序通过调试运营,初步实现了设计目的,并且通过适当完善后,将可以应用在普通书店的管理中,解决实际问题。
关键词 书店管理系统;数据库;Java
目 录
1 引言 1
1.1课题背景 1
1.2课程设计目的 1
1.3课程设计任务 2
2 系统结构分析 3
2.1需求分析 3
2.2 功能模块图 4
3 系统数据库设计 6
3.1 概念结构设计 6
3.2逻辑结构设计 7
3.3数据库表的建立 8
4 系统实现 9
4.1 数据库的连接 9
4.2 系统功能模块设立 10
5 系统测试方案和测试报告 12
5.1测试方案 12
5.2测试过程 12
6 结束语 17
参考文献 18
附录:部分程序代码 19
1 引言
1.1课题背景
随着科学技术的不断发展,电子技术悄无声息地走进了我们生活的各个角落,无时无刻的不在影响和改善着我们生活的各个方面。同时,越来越多的人开始意识到计算机技术在平常生活中所起到的重大作用。如今,随着书店规模的不断扩大,书籍种类和数量的不断增长,使得人工管理模式的局限性越发突出。因此,运用计算机技术来优化书店管理具有重大的实际意义。
计算机信息管理技术的应用,除了能在相称大的限度上代替人工作业,从而减少人员工作量,减轻工作承担,减少工作中因人为因素而产生的错误从而避免不必要的损失外,更重要的是能建立准确畅通、简便的信息流通渠道,为工作提供所需要的准确、及时的信息以帮助做出对的而及时的选择与决定,从而给采用这门技术的单位带来了巨大的可见或不可见的利益与效益。
1.2课程设计目的
一个业绩好的书店天天都会销售出大量书籍,使用书店信息管理系统可以大大提高工作效率,减少工作中不必要的失误。与此同时,通过书店管理系统,我们可以知晓书籍的销售情况,从而进一步总结出哪些书籍最为畅销,而哪些书籍鲜有人问津,通过对销售状况的总结,我们就可以知道需要大量购进哪些书籍,以便获得更大的经济效益。并且,通过书店管理系统,我们可以对一些常来书店购书的客户实行适当的会员优惠,以留住一部分客户群体进行长期的合作,这样书店就能获取相称可观的经济效益。本论文旨在论述书店管理系统的设计与开发。
通过书店管理系统的设计,纯熟掌握Java、Oracle Database 10g Express Edition等工具软件,系统地掌握需求分析、数据库设计、编码实现、测试等软件开发的流程,提高自身分析问题、解决问题的能力。
1.3课程设计任务
本课程设计任务是通过开发一个数据库书店管理系统,学习数据库系统的设计与开发,采用JAVA和Oracle Database 11g Express Edition等软件为开发工具。通过对计算机硬件和软件解决方案的论证,相应用领域进行调查分析,参考各种资料和进行数据库系统开发实践。在指导老师的帮助下,已经基本上成功地实现了设计任务书的规定,使得设计的数据库系统可以实现一般数据库的管理。
2 系统结构分析
2.1需求分析
书店管理系统是适应时代发展的需要,提高管理的效率而开发设计的。通过对信息的收集、存储、传递、记录、分析、综合查询、报表输出和信息共享,及时为书店管理人员提供全面、准确的各种数据。实现了书店管理的简朴化和规划化,提高了书店的工作效率,从而使书店可以以少的投入获得更好的社会效益与经济效益。
通过综合分析,拟定了书店管理系统的重要涉及以下功能:
(1). 书籍信息管理功能
系统设立涉及书籍编号设立、书籍名称设立、书籍作者设立、出版社设立、书籍进价、书籍售价和书籍数量。基本信息管理模块可以实现添加和重置书籍信息功能:。
(2). 会员信息管理功能
系统设立涉及会员编号设立、会员姓名设立、会员等级设立、会员折扣设立和会员累计消费。基本信息管理模块可以实现查询和删除会员信息功能。
(3). 账单信息管理功能
系统设立涉及会员姓名设立和当前消费金额设立。通过此模块能基本实现修改会员信息功能。
2.2 功能模块图
1. 根据上述的功能,可以设计出系统的总体功能模块,如图2.1所示。
会员信息管理
书店管理系统
账单信息管理
书籍信息管理
图2.1 书店管理系统功能模块示意图
2.“书籍信息管理”功能模块用于书籍编号设立、书籍名称设立、书籍作者设立、出版社设立、书籍进价、书籍售价和书籍数量,其功能模块如图2.2所示。
书籍信息管理
书籍编号管理
书籍数量管理
出版社管理
书籍进价管理
书籍名称管理
书籍作者管理
书籍售价管理
图2.2 书籍管理信息设立
3. “会员信息管理”功能模块用于会员编号设立、会员姓名设立、会员等级设立、会员折扣设立和累计消费设立,其功能模块如图2.3所示。
会员信息设立
会员编号管理
会员等级管理
会员折扣管理
会员姓名管理
累计消费管理
图2.3 会员信息管理
4. “账单信息管理”功能模块用于会员姓名设立和当前消费金额设立,其功能模块如图2.4所示。
会员姓名管理
当前消费金额管理
账单信息管理
图2.4 账单信息管理
3 系统数据库设计
3.1 概念结构设计
根据需求分析抽象出信息结构,可得该系统的E-R图。
(1)书籍管理E-R图,如图3.1所示。
售价
进价
出版社
作者
名称
编号
书籍
数量
图3.1 书籍管理E-R图
(2)会员管理E-R图,如图3.2所示。
会员
姓名
等级
折扣
编号
消费
图3.2 会员管理E-R图
(3)账单管理E-R图,如图3.3所示。
当前消费
账单
会员姓名
图3.3 账单管理E-R图
3.2逻辑结构设计
根据上述的概念结构设计出逻辑结构,将E-R图转换为关系模型。
数据库Book包含以下5个表:书籍信息表book、会员信息表member 、账单信息表bill。
(1) 书籍信息表book
订单信息表book用来保存书籍编号、书籍名称、书籍作者、书籍出版社、书籍进价、书籍售价和数量等信息。表book 的结构如表3-1所示。
表3-1 表book的结构
编号
字段名称
数据结构
说明
1
Book_id
Varchar2(10)
记录书籍编号
2
Book_name
Varchar2(20)
记录书籍名称
3
Book_author
Varchar2(20)
记录书籍作者
4
Book_press
Varchar2(20)
记录出版社
5
Book_sale_price
Number(10)
记录书籍售价
6
Book_purchase_price
Number(10)
记录书籍进价
7
Book_amount
Number(10)
记录书籍库存数量
通过对上面表的分析,查找等操作,所有模式都符合3NF。
前面是通过前台来实现系统安全性的,我们也可以对数据库进行身份验证,可以从服务器角度建一个登录名,使得不同的服务器角色拥有不同的权限,从而实现对数据库的不同权限的管理,以此来增强书店管理系统的安全性。
3.3数据库表的建立
在设计数据库表结构之前,一方面要创建一个数据库。本系统使用的数据库为Book。可以在公司管理器中创建数据库,也可以在查询分析器中执行以下Transact—SQl语句:
(1) 创建表Book
CREATE TABLE BOOK
( BOOK_ID NUMBER(10),
BOOK_NAME VARCHAR2(20),
BOOK_AUTHOR VARCHAR2(20),
BOOK_PRESS VARCHAR2(20),
BOOK_SALE_PRICE NUMBER(10),
BOOK_AMOUNT NUMBER(10),
BOOK_PURCHASE_PRICE NUMBER(10)
)
(2) 创建表Bookid
CREATE TABLE BOOKID
( BOOK_ID NUMBER(10)
)
(3) 创建表member
CREATE TABLE MEMBER
( MEMBER_ID NUMBER(10) NOT NULL ENABLE,
MEMBER_NAME VARCHAR2(20) NOT NULL ENABLE,
MEMBER_LEVEL NUMBER(20) NOT NULL ENABLE,
MEMBER_REBATE FLOAT(2) DEFAULT 0.9 NOT NULL ENABLE,
MEMBER_CONSUMPTION FLOAT(126) NOT NULL ENABLE
)
(4) 创建表bill
CREATE TABLE BILL
( MEMBER_NAME VARCHAR2(10),
MONEY NUMBER(10)
)
4 系统实现
4.1 数据库的连接
在该系统中使用的数据库是Oracle Database 11g Express Edition。客户端采用的是PL/SQL Developer。Java运营环境为Eclipse Indigo。
在安装好了软件之后,数据库的连接设立在Eclipse里的Properties功能键中。 如图4.1所示
图4.1 数据库连接
在Java Build Path中的Libraries中,运营Add External JARs…找到classes12.jar并添加,则此时已将数据库和Java程序成功连接。
4.2 系统功能模块设立
(1) 设计书籍销售管理界面
书籍销售管理界面可以用来查询书籍、将选定书籍加入购买目录和账单结算。创建一个选项卡面板,将其命名为OprationInfoPanel。
选项卡面板的布局如图4.2所示。
图4.2 面板OprationInfoPanel的布局
面板启动,当你点击查找功能键时,则会出现要查询的书籍信息,此时你可以实现将选定书籍加入购买目录。
当用户单击“查询”按钮时,将执行findDao(String bookName)函数,通过模糊查询检索出相关书籍信息;当用户单击“加入购买目录”按钮时,将执行addShoppingCart(int bookId)函数,系统将会自动加选定书籍添加到购买目录中并在显示出来;当用户单击“账单结算”按钮时,将执行new BillDialog(float money),弹出账单结算对话框。
(2) 设计账单结算管理对话框
账单结算管理对话框可以用来结算账单信息。添加一个对话框,将其命名为BillDialog。
对话框的布局如图4.3所示。
图4.3 对话框BillDialog的布局
对话框启动,输入相关信息,当你点击“确认账单”时,将执行confirmBillDao(String memberName)函数,则会显示根据数据库所计算出客户所需支付金额,当点击“提交账单”时,将执行submitOrdersDao(OrderVo vo)函数,系统自动将本次交易的金额存入会员信息中,以便会员升级和下次调用会员信息。
5 系统测试方案和测试报告
5.1测试方案
由于系统规模较小,所以没有安排单独的白盒测试,而是相应地将这部分测试归并到系统编码过程中。整个测试过程基于自顶向下测试的组装模块的方法,先对主模块进行基本测试,然后在按深度优先策略逐个将子模块组装到主模块上进行测试,最后再对系统进行全面的整体测试。
5.2测试过程
(1)书籍销售管理主界面测试
运营程序,登录成功后进入书籍销售管理界面,如图5.1所示:
图5.1 书籍销售管理界面
(2)书籍查询功能测试
输入书籍名称可查询到自己想要的书籍信息,本查询为模糊查询,会显示包含所输入字符所有书籍,如图5.2所示:
图5.2 模糊查询
显示出的书籍分五本为一页,通过点击“上页”和“下页”按钮可以查询其他页码的书籍,如图5.3和5.4所示:
图5.3 分页显示查询结果(a)
图5.4 分页显示查询结果(b)
(3)选择书籍并加入购买目录功能测试
选择查询出的一条数据,并单击加入购物车按钮,将自动把选中书籍添加到购买目录中,如图5.5所示:
图5.5 添加书籍至购买目录
(4)订单管理功能测试
移除书籍:选定购买目录中的一本书,点击“移除”按钮,将自动把所选书籍从购买目录中移除,如图5.6所示:
图5.6 移除书籍
账单结算:点击“账单结算”,按钮,将自动弹出一个账单结算窗口,“订单查询”,如图5.7所示:
图5.7 账单结算界面
输入会员名称和实付金额,点击确认账单,将自动计算根据会员折扣后所需找零金额,如图5.8所示:
图5.8 账单结算功能
点击“提交账单”,将提醒账单提交成功,将会吧数据传到数据库,并对相应的数据进行解决,如图5.9所示:
图5.9 提交账单
6 结束语
本系统完毕了一个书店管理系统的基本功能,涉及书籍销售管理、库存管理、会员管理等。我们小组将该系统分为三大模块,分别由三位小组成员负责,最后再一起汇总,通过不断的调试,所有功能通过测试均可以对的运营,操作简便,界面和谐。
通过小组合作完毕本次课程设计,我对数据库这门课程有了更加深刻的理解,同时也能纯熟的运用eclipse来编写较为简朴的java程序,并且也使得自己在对系统数据库的分析、设计有更深刻的了解。我们在各自编写程序中碰到了很多问题,通过查阅相关资料,问题得到了解决,同时也学到了一定的java编程知识。此外,通过运用JDBC数据库连接技术,我对java数据库编程技术也有了一定的了解和结识,希望通过以后的学习继续加深这方面知识的掌握。
参考文献
[1]王汝传.计算机图形学[M].北京:人民邮电出版社,1999:123-130.
[2]刘榴娣,刘明奇,党长民.实用数字图像解决[M].北京:北京理工大学出版,2023:12-25..
[3] 李彦,韩光林,李玉波. SQL SERVE完全自学手册[M]. 北京:电子工业出版社,2023
[4] 萨师煊,王珊. 数据库系统概论. 北京:高等教育出版社. 2023
附录:部分程序代码
// 程序名称: MainFrame.java
// 程序功能:主界面
// 程序作者:漆盛
// 最后修改日期:2023-09-26
package .view;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JTabbedPane;
import .view.panel.MemberInfoPanel;
import .view.panel.OprationInfoPanel;
import .view.panel.WarehouseInfoPanel;
public class MainFrame extends JFrame {
private static final long serialVersionUID = 1L;
private JTabbedPane tab;
private boolean flag;
public MainFrame(boolean flag){
this.flag=flag;
init();
}
private void init(){
this.add(createTab(),BorderLayout.CENTER);
this.setTitle("书店管理系统");
this.setSize(1000, 700);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setResizable(false);
}
private JTabbedPane createTab() {
if(tab==null){
tab=new JTabbedPane();
}
tab.add("书籍销售管理",new OprationInfoPanel());
if(flag){
tab.add("仓库库存管理",new WarehouseInfoPanel());
tab.add("会员信息管理",new MemberInfoPanel());
}
return tab;
}
}
/*书籍销售管理选项卡面板*/
package .view.panel;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import .action.OprationInfoPanelAction;
import .vo.BookVo;
import .vo.PageVo;
public class OprationInfoPanel extends JPanel {
private static final long serialVersionUID = 1L;
@SuppressWarnings("rawtypes")
private Vector title = new Vector();
@SuppressWarnings("rawtypes")
private Vector title1 = new Vector();
private JScrollPane scroll;
private DefaultTableModel model;
private DefaultTableModel model1;
private JTable table;
private JTable cartTable;
private OprationInfoPanelAction action = new OprationInfoPanelAction(this);
private JTextField bookName = new JTextField(10);
private int row = -1;
private BookVo vo;
private int rows = -1;
private JPanel createOprationPanel;
private JPanel createCartPanel;
private JTextField pageText = new JTextField(2);
private PageVo pageVo;
private JPanel pagePanel;
private JLabel cartName = new JLabel("购买目录");
private JScrollPane cartScroll;
private int cartRow;
public OprationInfoPanel() {
init();
}
private void init() {
this.setLayout(null);
this.add(createOprationPanel());
createOprationPanel.setBounds(0, 0, 1000, 40);
this.add(createScroll());
scroll.setBounds(0, 45, 1000, 125);
this.add(createPagePanel());
pagePanel.setBounds(0, 170, 1000, 40);
this.add(cartName);
cartName.setBounds(0, 200, 80, 40);
this.add(createCartScroll());
cartScroll.setBounds(0, 240, 1000, 250);
this.add(createCartPanel());
createCartPanel.setBounds(0, 490, 1000, 50);
}
private JPanel createPagePanel() {
if (pagePanel == null) {
pagePanel = new JPanel();
}
pagePanel.add(createBut("首页"));
pagePanel.add(createBut("上页"));
pagePanel.add(new JLabel("第"));
pagePanel.add(pageText);
pagePanel.add(new JLabel("页"));
pageText.setEditable(false);
pagePanel.add(createBut("下页"));
pagePanel.add(createBut("末页"));
return pagePanel;
}
private JPanel createOprationPanel() {
if (createOprationPanel == null) {
createOprationPanel = new JPanel();
}
createOprationPanel.add(new JLabel("书籍名称:"));
createOprationPanel.add(bookName);
createOprationPanel.add(createBut("查询"));
createOprationPanel.add(createBut("加入购买目录"));
return createOprationPanel;
}
private JPanel createCartPanel() {
if (createCartPanel == null) {
createCartPanel = new JPanel();
createCartPanel.add(createBut("刷新"));
createCartPanel.add(createBut("移除"));
createCartPanel.add(createBut("账单结算"));
}
return createCartPanel;
}
private JScrollPane createScroll() {
if (scroll == null) {
scroll = new JScrollPane(createTable());
}
return scroll;
}
private JScrollPane createCartScroll() {
if (cartScroll == null) {
cartScroll = new JScrollPane(createCartTable());
}
return cartScroll;
}
@SuppressWarnings("unchecked")
private JTable createTable() {
title.add("书籍编号");
title.add("书籍名称");
title.add("作者");
title.add("出版社");
title.add("价格");
model = new DefaultTableModel(title, 0);
if (table == null) {
table = new JTable(model);
}
return table;
}
@SuppressWarnings("unchecked")
private JTable createCartTable() {
title1.add("书籍编号");
title1.add("书籍名称");
title1.add("作者");
title1.add("出版社");
title1.add("价格");
title1.add("数量");
model1 = new DefaultTableModel(title1, 0);
if (cartTable == null) {
cartTable = new JTable(model1);
}
return cartTable;
}
private JButton createBut(String butName) {
JButton but = new JButton(butName);
but.addActionListener(action);
return but;
}
public String getBookName() {
return bookName.getText();
}
public BookVo setBookVo() {
row = table.getSelectedRow();
if (row != rows) {
vo = null;
}
if (vo == null) {
rows = row;
vo = new BookVo(Integer.parseInt(table.getValueAt(row, 0)
.toString()), table.getValueAt(row, 1).toString(), table.getValueAt(row, 2).toString(), table.getValueAt(row, 3)
.toString(), Integer.parseInt(table.getValueAt(row, 4) .toString()));
}
return vo;
}
@SuppressWarnings("rawtypes")
public void setModel(Vector rowData) {
model.setDataVector(rowData, title);
}
@SuppressWarnings("rawtypes")
public void setModel1(Vector rowData) {
model1.setDataVector(rowData, title1);
}
public int getBookId() {
int bookId = 0;
row = table.getSelectedRow();
bookId = Integer.parseInt(table.getValueAt(row, 0).toString());
return bookId;
}
public int getCartBookId() {
int bookId = 0;
cartRow = cartTable.getSelectedRow();
bookId = Integer.parseInt(cartTable.getValueAt(cartRow, 0).toString());
return bookId;
}
public PageVo getPageVo() {
if (pageVo == null) {
pageVo = new PageVo();
}
return pageVo;
}
public void setPageText(String page) {
pageText.setText(page);
}
public void removeRow() {
cartRow = cartTable.getSelectedRow();
model1.removeRow(cartRow);
}
}
/*按钮事件监听*/
package .action;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.JOptionPane;
import .dao.BookDao;
import .dao.PageDao;
import .view.dialog.BillDialog;
import .view.panel.OprationInfoPanel;
public class OprationInfoPanelAction implements ActionListener {
private OprationInfoPanel panel;
public OprationInfoPanelAction(OprationInfoPanel panel) {
this.panel=panel;
}
@SuppressWarnings({ "rawtypes" })
@Ocerride
public void actionPerformed(ActionEvent e) {
String butName=e.getActionCommand();
BookDao dao=new BookDao();
PageDao pageDao = new PageDao();
if(butName.equals("查询")){
Vector rowData =new Vector();
rowData=dao.findDao(panel.getBookName());
panel.getPageVo().changePageVo(1, 1, 5);
panel.setPageText(Integer.toString(1));
panel.setModel(rowData);
}else if(butName.equals("加入购买目录")){
Vector rowData;
rowData=dao.addShoppingCart(panel.getBookId());
panel.setModel1(rowData);
}else if(butName.equals("刷新")){
Vector rowData1;
rowData1=dao.refreshCart();
panel.setModel1(rowData1);
}else if(butName.equals("移除")){
boolean flag;
flag = dao.delBookInfo(panel.getCartBookId());
if (flag) {
panel.removeRow();
JOptionPane.showMessageDialog(null, "移除成功!!!", "移除成功",JOptionPane.OK_CANCEL_OPTION);
}
} else if(butName.equals("账单结算")){
int i = JOptionPane.showConfirmDialog(null, "是否结算", "账单结算", JOptionPane.YES_NO_OPTION);
if (i == 0) {
new BillDialog(dao.cartInfoDao());
}
} else{
Vector rowData = pageDao.bookPageDao(butName, panel.getBookName(),panel.getPageVo());panel.setPageText(Integer
.toString(panel.getPageVo().getStartLine() / 5 + 1));
panel.setModel(rowData);
}
}
}
/*数据库操作代码*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public Vector findDao(String bookName) {
Vector rowData = new Ve
展开阅读全文