1、书店管理系统的设计与实现书籍销售管理模块学生姓名: 指导老师:摘 要 本课程设计重要解决书店的管理问题,设计开发一个简朴的书店管理系统 ,实现分类登陆,书籍管理,仓库库存管理,会员管理以及各种查询等功能。在课程设计中,系统开发平台为Windows 7,程序设计语言采用Java,数据库采用Oracle Database 11g Express Edition,程序运营平台为Windows 7。程序通过调试运营,初步实现了设计目的,并且通过适当完善后,将可以应用在普通书店的管理中,解决实际问题。关键词 书店管理系统;数据库;Java目 录1 引言11.1课题背景11.2课程设计目的11.3课程设计
2、任务22 系统结构分析32.1需求分析32.2 功能模块图43 系统数据库设计63.1 概念结构设计63.2逻辑结构设计73.3数据库表的建立84 系统实现94.1 数据库的连接94.2 系统功能模块设立105 系统测试方案和测试报告125.1测试方案125.2测试过程126 结束语17参考文献18附录:部分程序代码191 引言1.1课题背景随着科学技术的不断发展,电子技术悄无声息地走进了我们生活的各个角落,无时无刻的不在影响和改善着我们生活的各个方面。同时,越来越多的人开始意识到计算机技术在平常生活中所起到的重大作用。如今,随着书店规模的不断扩大,书籍种类和数量的不断增长,使得人工管理模式的
3、局限性越发突出。因此,运用计算机技术来优化书店管理具有重大的实际意义。计算机信息管理技术的应用,除了能在相称大的限度上代替人工作业,从而减少人员工作量,减轻工作承担,减少工作中因人为因素而产生的错误从而避免不必要的损失外,更重要的是能建立准确畅通、简便的信息流通渠道,为工作提供所需要的准确、及时的信息以帮助做出对的而及时的选择与决定,从而给采用这门技术的单位带来了巨大的可见或不可见的利益与效益。1.2课程设计目的一个业绩好的书店天天都会销售出大量书籍,使用书店信息管理系统可以大大提高工作效率,减少工作中不必要的失误。与此同时,通过书店管理系统,我们可以知晓书籍的销售情况,从而进一步总结出哪些书
4、籍最为畅销,而哪些书籍鲜有人问津,通过对销售状况的总结,我们就可以知道需要大量购进哪些书籍,以便获得更大的经济效益。并且,通过书店管理系统,我们可以对一些常来书店购书的客户实行适当的会员优惠,以留住一部分客户群体进行长期的合作,这样书店就能获取相称可观的经济效益。本论文旨在论述书店管理系统的设计与开发。通过书店管理系统的设计,纯熟掌握Java、Oracle Database 10g Express Edition等工具软件,系统地掌握需求分析、数据库设计、编码实现、测试等软件开发的流程,提高自身分析问题、解决问题的能力。1.3课程设计任务本课程设计任务是通过开发一个数据库书店管理系统,学习数据
5、库系统的设计与开发,采用JAVA和Oracle Database 11g Express Edition等软件为开发工具。通过对计算机硬件和软件解决方案的论证,相应用领域进行调查分析,参考各种资料和进行数据库系统开发实践。在指导老师的帮助下,已经基本上成功地实现了设计任务书的规定,使得设计的数据库系统可以实现一般数据库的管理。2 系统结构分析2.1需求分析书店管理系统是适应时代发展的需要,提高管理的效率而开发设计的。通过对信息的收集、存储、传递、记录、分析、综合查询、报表输出和信息共享,及时为书店管理人员提供全面、准确的各种数据。实现了书店管理的简朴化和规划化,提高了书店的工作效率,从而使书店
6、可以以少的投入获得更好的社会效益与经济效益。通过综合分析,拟定了书店管理系统的重要涉及以下功能:(1). 书籍信息管理功能系统设立涉及书籍编号设立、书籍名称设立、书籍作者设立、出版社设立、书籍进价、书籍售价和书籍数量。基本信息管理模块可以实现添加和重置书籍信息功能:。(2). 会员信息管理功能系统设立涉及会员编号设立、会员姓名设立、会员等级设立、会员折扣设立和会员累计消费。基本信息管理模块可以实现查询和删除会员信息功能。(3). 账单信息管理功能 系统设立涉及会员姓名设立和当前消费金额设立。通过此模块能基本实现修改会员信息功能。2.2 功能模块图1. 根据上述的功能,可以设计出系统的总体功能模
7、块,如图2.1所示。会员信息管理书店管理系统账单信息管理书籍信息管理图2.1 书店管理系统功能模块示意图2.“书籍信息管理”功能模块用于书籍编号设立、书籍名称设立、书籍作者设立、出版社设立、书籍进价、书籍售价和书籍数量,其功能模块如图2.2所示。书籍信息管理书籍编号管理书籍数量管理出版社管理书籍进价管理书籍名称管理书籍作者管理书籍售价管理图2.2 书籍管理信息设立3 “会员信息管理”功能模块用于会员编号设立、会员姓名设立、会员等级设立、会员折扣设立和累计消费设立,其功能模块如图2.3所示。会员信息设立会员编号管理会员等级管理会员折扣管理会员姓名管理累计消费管理 图2.3 会员信息管理4 “账单
8、信息管理”功能模块用于会员姓名设立和当前消费金额设立,其功能模块如图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
9、包含以下5个表:书籍信息表book、会员信息表member 、账单信息表bill。(1) 书籍信息表book 订单信息表book用来保存书籍编号、书籍名称、书籍作者、书籍出版社、书籍进价、书籍售价和数量等信息。表book 的结构如表3-1所示。 表3-1 表book的结构编号字段名称数据结构说明1Book_idVarchar2(10)记录书籍编号2Book_nameVarchar2(20)记录书籍名称3Book_authorVarchar2(20)记录书籍作者4Book_pressVarchar2(20)记录出版社5Book_sale_priceNumber(10)记录书籍售价6Book_pu
10、rchase_priceNumber(10)记录书籍进价7Book_amountNumber(10)记录书籍库存数量 通过对上面表的分析,查找等操作,所有模式都符合3NF。前面是通过前台来实现系统安全性的,我们也可以对数据库进行身份验证,可以从服务器角度建一个登录名,使得不同的服务器角色拥有不同的权限,从而实现对数据库的不同权限的管理,以此来增强书店管理系统的安全性。3.3数据库表的建立在设计数据库表结构之前,一方面要创建一个数据库。本系统使用的数据库为Book。可以在公司管理器中创建数据库,也可以在查询分析器中执行以下TransactSQl语句:(1) 创建表Book CREATE TABL
11、E 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) 创建表memberCREATE TABLE MEMBER (MEMBER_ID NUMBER(10) NO
12、T 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 数据库的连接在该系统中使用的数据库是
13、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) 设计书籍销售管理界面书籍销售管理界面可以用来查询书籍、将选定书籍加入购买目录和账单结算。创建一个选项卡
14、面板,将其命名为OprationInfoPanel。选项卡面板的布局如图4.2所示。图4.2 面板OprationInfoPanel的布局面板启动,当你点击查找功能键时,则会出现要查询的书籍信息,此时你可以实现将选定书籍加入购买目录。当用户单击“查询”按钮时,将执行findDao(String bookName)函数,通过模糊查询检索出相关书籍信息;当用户单击“加入购买目录”按钮时,将执行addShoppingCart(int bookId)函数,系统将会自动加选定书籍添加到购买目录中并在显示出来;当用户单击“账单结算”按钮时,将执行new BillDialog(float money),弹出
15、账单结算对话框。(2) 设计账单结算管理对话框账单结算管理对话框可以用来结算账单信息。添加一个对话框,将其命名为BillDialog。对话框的布局如图4.3所示。图4.3 对话框BillDialog的布局对话框启动,输入相关信息,当你点击“确认账单”时,将执行confirmBillDao(String memberName)函数,则会显示根据数据库所计算出客户所需支付金额,当点击“提交账单”时,将执行submitOrdersDao(OrderVo vo)函数,系统自动将本次交易的金额存入会员信息中,以便会员升级和下次调用会员信息。5 系统测试方案和测试报告5.1测试方案由于系统规模较小,所以没
16、有安排单独的白盒测试,而是相应地将这部分测试归并到系统编码过程中。整个测试过程基于自顶向下测试的组装模块的方法,先对主模块进行基本测试,然后在按深度优先策略逐个将子模块组装到主模块上进行测试,最后再对系统进行全面的整体测试。5.2测试过程(1)书籍销售管理主界面测试运营程序,登录成功后进入书籍销售管理界面,如图5.1所示:图5.1 书籍销售管理界面(2)书籍查询功能测试输入书籍名称可查询到自己想要的书籍信息,本查询为模糊查询,会显示包含所输入字符所有书籍,如图5.2所示:图5.2 模糊查询显示出的书籍分五本为一页,通过点击“上页”和“下页”按钮可以查询其他页码的书籍,如图5.3和5.4所示:图
17、5.3 分页显示查询结果(a)图5.4 分页显示查询结果(b)(3)选择书籍并加入购买目录功能测试选择查询出的一条数据,并单击加入购物车按钮,将自动把选中书籍添加到购买目录中,如图5.5所示:图5.5 添加书籍至购买目录(4)订单管理功能测试移除书籍:选定购买目录中的一本书,点击“移除”按钮,将自动把所选书籍从购买目录中移除,如图5.6所示:图5.6 移除书籍账单结算:点击“账单结算”,按钮,将自动弹出一个账单结算窗口,“订单查询”,如图5.7所示:图5.7 账单结算界面输入会员名称和实付金额,点击确认账单,将自动计算根据会员折扣后所需找零金额,如图5.8所示:图5.8 账单结算功能点击“提交
18、账单”,将提醒账单提交成功,将会吧数据传到数据库,并对相应的数据进行解决,如图5.9所示:图5.9 提交账单6 结束语本系统完毕了一个书店管理系统的基本功能,涉及书籍销售管理、库存管理、会员管理等。我们小组将该系统分为三大模块,分别由三位小组成员负责,最后再一起汇总,通过不断的调试,所有功能通过测试均可以对的运营,操作简便,界面和谐。通过小组合作完毕本次课程设计,我对数据库这门课程有了更加深刻的理解,同时也能纯熟的运用eclipse来编写较为简朴的java程序,并且也使得自己在对系统数据库的分析、设计有更深刻的了解。我们在各自编写程序中碰到了很多问题,通过查阅相关资料,问题得到了解决,同时也学
19、到了一定的java编程知识。此外,通过运用JDBC数据库连接技术,我对java数据库编程技术也有了一定的了解和结识,希望通过以后的学习继续加深这方面知识的掌握。参考文献1王汝传.计算机图形学M.北京:人民邮电出版社,1999:123130.2刘榴娣,刘明奇,党长民.实用数字图像解决M.北京:北京理工大学出版,2023:1225.3 李彦,韩光林,李玉波. SQL SERVE完全自学手册M. 北京:电子工业出版社,20234 萨师煊,王珊. 数据库系统概论. 北京:高等教育出版社. 2023附录:部分程序代码/ 程序名称: MainFrame.java/ 程序功能:主界面/ 程序作者:漆盛/ 最
20、后修改日期:2023-09-26package .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 serialVers
21、ionUID = 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)
22、;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
23、.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 c
24、lass 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 mode
25、l1;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;
26、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();creat
27、eOprationPanel.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(crea
28、teCartPanel();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
29、);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(查询);createO
30、prationPanel.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
31、 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(书籍名
32、称);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(数量);mo
33、del1 = 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 setB
34、ookVo() 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.getVal
35、ueAt(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(
36、);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 P
37、ageVo();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 jav
38、ax.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;Sup
39、pressWarnings( rawtypes )Ocerridepublic 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);
40、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(移除)b
41、oolean 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(
42、dao.cartInfoDao(); elseVector 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