资源描述
洛 阳 理 工 学 院
课 程 设 计 报 告
课程名称 面向对象程序设计课程设计
设计题目 药店管理系统
专 业 计算机科学和技术
班 级
学 号
姓 名
完成日期 .1.6
课 程 设 计 任 务 书
设计题目: 药店管理系统
设计内容和要求:
1.问题描述
设计实现药店管理系统。能够实现药品库存管理、销售信息管理和查询功效。 2.基础要求
库存管理:包含药品入库、出库管理,药品库存报警,药品使用期管理(过期报警)。
销售管理:依据实际销售自动生成销售单据。假如是会员,则药品价格按95折计算。
查询及统计功效:对指定时间段内出/入库进行查询/统计,对药品使用期进行查询/统计,对药品过期进行查询/统计,对指定时间段内药品销售进行查询/统计和利润查询/统计等。能帮用户查询药品信息,能按品名、生产厂家、药品类别、存货量进行查询。
指导老师:
12 月 20 日
课 程 设 计 评 语
成绩:
指导老师:
年 月 日
目 录
第1章 需求分析 1
1.1功效需求 1
1.2数据需求 1
第2章 数据库设计 2
2.1数据库逻辑级设计 2
2.2 关系模式 2
2.3基础表 3
第3章 概要设计 4
3.1系统结构和模块功效 4
第4章 具体设计和实现 6
4.1模块步骤图 6
4.2界面效果图及代码 7
第5章 总结 14
第1章 需求分析
1.1功效需求
药店管理系统能够实现药品库存、销售信息管理和查询功效,依据实际销售自动生成销售单据。能帮用户查询药品信息,能按品名、生产厂家、药品类别、存货量进行查询。
库存管理:包含药品入库、出库管理,药品库存报警,药品使用期管理(过期报警)。
销售管理:依据实际销售自动生成销售单据。假如是会员,则药品价格按95折计算。
查询及统计功效:对指定时间段内出/入库进行查询/统计,对药品使用期进行查询/统计,对药品过期进行查询/统计,对指定时间段内药品销售进行查询/统计和利润查询/统计等。能帮用户查询药品信息,能按品名、生产厂家、药品类别、存货量进行查询。
1.2数据需求
经过对学校周围药店调研和在网上查找资料,药店药品管理系统处理对象关键包含:药品信息、供给商信息、用户信息、药品销售信息、药品存放信息等多个方面。依据市场需求需要数据组成以下需要数据有操作员、会员、药品、订单、厂家、进货单这些实体组成数据有,操作人员需要包含:账号、密码、姓名、联络电话、邮箱、地址;会员表:账号、姓名、年纪、联络电话、邮箱、地址;药品信息中含有:药品ID、药品名、类别、生产日期、使用期、进价、售价、生产厂家;订单详情中含有有:订单编号、药品名、购置数量、售价、购置人员、销售日期;厂家信息包含:厂家编号、厂家名、电话、地址;进药表、药品ID、操作员、进药日期、进药数量
第2章 数据库设计
2.1数据库逻辑级设计
E-R以下图所表示存放
N
仓库
N
1
年纪
姓名
账号
电话
邮箱
编号
品名
数量
售价
买家
日期
账号
密码
姓名
电话
邮箱
地址
药品
操作员
订单
会员
提交
参考
处理
厂家
生产
1
1
厂名
类别
ID
电话
地址
名称
编号
编号
数量
生产期
使用期
进价
售价
批次
ID
1
1
N
N
N
N
N
2.2 关系模式
管理员(账号、密码、姓名、联络电话、邮箱、地址)
会员(账号、姓名、年纪、联络电话、邮箱、地址)
药品(药品ID、药品名称、类别、生产厂家编号)
仓库(批次ID、药品ID、药品名、类别、生产日期、使用期、进价、售价、生产厂家)
订单详情(订单编号、药品名、购置数量、售价、购置人员、销售日期、操作员姓名)
厂家(厂家编号、厂家名、电话、地址)
进药(药品ID、操作员姓名、进药日期、进药数量)
其中下划线部分为主键
2.3基础表
依据需求构建表基础组成。
(1)管理员表图2-1
名称
字段名称
数据类型
长度
主键
许可空值
账号
Mno
varchar
10
是
否
密码
Mpassw
varchar
20
否
否
姓名
Mname
varchar
20
否
否
电话
Mphone
char
11
否
是
邮箱
Memail
varchar
20
否
是
地址
Maddress
varchar
50
否
是
图2-1
(2)会员表图2-2
名称
字段名称
数据类型
长度
主键
许可空值
会员号
Cno
varchar
10
是
否
姓名
Cname
varchar
20
否
否
年纪
Cage
int
否
是
电话
Cphone
char
11
否
是
邮箱
Cemail
varchar
20
否
是
地址
Caddress
varchar
50
否
是
图2-2
(3)药品表图2-3
名称
字段名称
数据类型
长度
主键
许可空值
编号
Dno
varchar
10
是
否
品名
Dname
varchar
20
否
否
类别
Dclass
varchar
20
否
否
生产商
Sname
varchar
20
否
否
图2-3
(4)供给商表图2-4
名称
字段名称
数据类型
长度
主键
许可空值
编号
Sno
varchar
10
是
否
供给商名
Sname
varchar
20
否
否
电话
Sphone
char
11
否
是
邮箱
Semail
varchar
20
否
是
地址
Saddress
varchar
50
否
是
图2-4
(5)库存表图2-5
名称
字段名称
数据类型
长度
主键
许可空值
批次
Lno
varchar
10
是
否
药品ID
Dno
varchar
10
否
否
药品名
Dname
varchar
20
否
否
药品类别
Dclass
varchar
20
否
否
数量
Pquantity
int
否
否
入库时间
Idate
date
否
否
过期时间
out_date
date
否
否
进价
Dbidd
float
否
否
售价
Dprice
float
否
否
供给商
Sname
varchar
20
否
否
图2-5
(6)销售表图2-6
名称
字段名称
数据类型
长度
主键
许可空值
订单
Slno
varchar
10
是
否
批次
Lno
varchar
10
否
否
会员ID
Cno
varchar
10
否
是
售价
Ddprice
float
否
否
数量
Mquantity
int
否
否
总价
Amoney
float
否
否
日期
Idate
date
否
否
图2-6
(7)缺货单表图2-7
名称
字段名称
数据类型
长度
主键
许可空值
缺货单号
Lno
varchar
10
是
否
药品ID
Dno
varchar
10
否
否
数量
Pquantity
int
否
否
日期
Pdade
date
否
否
状态
Astate
varchar
10
否
否
图2-7
第3章 概要设计
3.1系统结构和模块功效
本系统结构关键包含登录模块,主界面模块,添加药品名模块,修改和删除品名模块,入库模块, 会员管理模块,出售管理模块,使用期查询模块,盈利查询模块,缺货查询模块。
(1) 登录界面设计:为了保护药店销售管理系统安全性,所以设置必需输入账号密码才能进入系统。
(2) 主界面设计:为了让系统愈加简练,愈加人性化,特加入主界面,能够让操作人员愈加清楚找到需要功效,只要用户在该界面选择对应按钮,她就会弹出和各个相对应界面。
(3) 添加品名设计:为了能够使自己药店愈加多元化,愈加轻易管理,引入添加药品名称设计。能够让使用者愈加清楚知道现现在自己药店中药品种类和药品类型,以进行愈加方便进货和添加新药品。
(4) 修改品名设计:为了让使用者在不使用某一家药品或药品信息更改后进行立即删除修改。保持药品库实时性。
(5) 入库设计:能够在该页面对已经录入药品名进行入库,会自动添加入库时间,生成一个批次编号,方便管理,能够在售卖中立即发觉哪批货物为最先入库。
(6) 会员管理设计:进行会员系统设计能够让药店愈加好锁定固定用户,在此界面中,使用者能够对会员信息进行录入,修改和删除。
(7) 出售管理设计:出售管理中能够依据药品ID和药品名称进行搜索,查找药品然后售卖,而且有会员检测机制,当输入正确会员ID后检测然后进行打折。
(8) 使用期查询设计:能够对库存中药品进行使用期查询,当使用期低于一定时间就会在此窗口显示出来,而且支持对立即过期药品和已经过期药品进行销毁处理。
(9) 盈利查询设计:能够对要求时间范围订单进行查询,而且计算总定价、总售价和总盈利。能够具体显示药品批次ID、购置人ID,时间、数量。假如是非会员就会显示出为匿名,默认是对全部订单进行计算查询
(10) 缺货查询设计:自动对售卖过程中药品进行统计,当数量低于一定数值会自动在缺货单中显示出来,而且显示现在状态,假如进行进货后会将未处理改为已处理。
(11) 退出功效设计:此功效比较简单,仅仅在弹出警告窗口后退出。
第4章 具体设计和实现
4.1模块步骤图
依据系统需求做出模块之间大致步骤图以下4-1所表示。
添加
修改
入库
会员
出售
使用期
盈利
缺货
药品管理
库存管理
销售管理
查询管理
登录
主界面
图4-1
4.2界面效果图及代码
(1)药店登录界面图4-1
图4-1
关键代码以下
private void loginActionPerformed(ActionEvent evt) {
String userName=this.UserNameTxt.getText();
String password=new String(this.UserPawTxt.getPassword());
if(StringUtil.isEmpty(userName)){
JOptionPane.showMessageDialog(null, "用户名不能为空!");
return;
}
if(StringUtil.isEmpty(password)){
JOptionPane.showMessageDialog(null, "密码不能为空!");
return;
}
User user=new User(userName,password);
Connection con=null;
try {
con=dbUtil.getCon();
User currentUser=userDao.login(con, user);
if(currentUser!=null){
dispose();
new MainFrm().setVisible(true);
}else{
JOptionPane.showMessageDialog(null, "用户名或密码错误!");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
dbUtil.closeCon(con);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}}}
(2)药店主界面图4-2
图4-2
(3)入库界面图4-3
图4-3
关键代码:
private void DrugAddAction(ActionEvent e){
Connection con=null;
String dName=dNameTxt.getText();
String dClass=dClassTxt.getText();
String sName=sNameTxt.getText();
String dNo="";int a = 0;
DrugDao drugDao = new DrugDao();
Drug drug=new Drug(dNo,dName,dClass,sName);
try {
con=dbUtil.getCon();
a=drugDao.insert(con,drug);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if(a==1){
JOptionPane.showConfirmDialog(null, "添加成功");
resetValue();
}else{
JOptionPane.showConfirmDialog(null, "添加失败");
}}
(4)添加药品图4-4
图4-4
(5)修改药品图4-5
图4-5
关键代码以下:
private void drugAddActionPerformed(ActionEvent evt) throws SQLException {
String pQuantity=this.pQuantityTxt.getText();
String dBidd=this.dBiddTxt.getText();
String dprice=this.dPriceTxt.getText();
String out_date=this.out_dateTxt.getText();
int row=drugTable.getSelectedRow();
String dno=(String)drugTable.getValueAt(row, 0);
String dname=(String)drugTable.getValueAt(row, 1);
String dclass=(String)drugTable.getValueAt(row, 2);
String sname=(String)drugTable.getValueAt(row, 3);
if(StringUtil.isEmpty(pQuantity)){
JOptionPane.showMessageDialog(null, "数量不能为空!");
return;
}
if(StringUtil.isEmpty(dBidd)){
JOptionPane.showMessageDialog(null, "进价不能为空!");
return;
}
if(StringUtil.isEmpty(dprice)){
JOptionPane.showMessageDialog(null, "售价不能为空!");
return;
}
DrugStore drugStore=new DrugStore(dno,dname,dclass,sname,Integer.parseUnsignedInt(pQuantity),Float.parseFloat(dBidd),Float.parseFloat(dprice),out_date,mName);
Connection con=null;
try{
con=dbUtil.getCon();
int addNum=drugStoreDao.add(con, drugStore);
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();
}}}
(6)会员管理界面图4-6
图4-6
关键代码以下:
private void custromerAddActionEvent(ActionEvent e){
Connection con=null;
String cNo=this.cNoTxt.getText();
String cName=this.cNameTxt.getText();
String cAge=this.cAgeTxt.getText();
String cPhone=this.cPhoneTxt.getText();
String cEmail=this.cEmailTxt.getText();
String cAddress=this.cAddressTxt.getText();
Customer customer = new Customer(cNo,cName,Integer.parseInt(cAge),cPhone,cEmail,cAddress);
try {
con=dbUtil.getCon();
int addNum=customerDao.add(con, customer);
if(addNum==1){
JOptionPane.showMessageDialog(null, "添加成功!");
resetValue();
}else{
JOptionPane.showMessageDialog(null, "添加失败!");
}
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();}}
(7)出售管理界面图4-7
图4-7
关键代码以下:
//监听会员信息事件
private void isNotUser1(ActionEvent e2) {
int row=drugTable.getSelectedRow();
Connection con=null;
String cNo=this.cNoTxt.getText();
custormerDao=new CustomerDao();
Customer customer =new Customer(cNo);
try {
con=dbUtil.getCon();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(custormerDao.IsCustomer(con,customer)){
userTxt.setText("是");
per=(float) 0.95;
}else{
per=1;
userTxt.setText("否");
return;}}
//计算总金额事件
private void drugActionMoney(MouseEvent arg0){
String cmuantity=this.cMuantityTxt.getText();
if(StringUtil.isNotEmpty(this.cMuantityTxt.getText())){
if(Integer.parseInt(cmuantity)<=Integer.parseInt(cMuantity)){
cMoneyTxt.setText(String.valueOf(per*money*Integer.parseInt(cmuantity)));
zmoney=per*money*Integer.parseInt(cmuantity);}
else{
JOptionPane.showConfirmDialog(null, "购置数量不能大于库存量");
return;}}}
(8)使用期查询图4-8
图4-8
(9)销售查询图4-9
图4-9
(10)缺货查询图4-10
图4-10
第5章 总结
生活中四处需要处理数据,在人工管理阶段,大家花费大量人力、时间等来处理这些数据,不仅效率低、而且犯错率较高。现在,我们处于信息时代,有了电脑这种高科技产品,使得我们生活变得信息化,各行各业全部和电脑计算机联络起来了,人工管理数据时代已经逐步远去,取而代之是数据库管理,它使得大家工作效率大大提升了。
在这个课程设计中,我题目是药店管理系统,在今天,我们周围部分小型个体在药品管理上还是由人来实现,所以,我想法是设计一个针对小型个体药店管理系统。
Java监听器是Java功效实现关键组成部分,监听器中接口也是很关键一个步骤。两个类中两个类似功效,调用她们类动态决定一个实现,那她们提供一个抽象父类,子类分别实现父类所定义方法。问题出现:Java是一个单继承语言,通常情况下,哪个具体类可能已经有了一个超类,处理是给它父类加父类,或给它父类父类加父类,直到移动到类等级结构最顶端。这么一来,对一个具体类可插入性设计,就变成了对整个等级结构中全部类修改。
在刚开始试验时候,按键总是没反应,以后才知道是没有安装监听器原因,加上监听器后又出现问题了,还是没反应,原因是没有让监听器实现其反应,在监听器中实现其方法后成功处理问题。总而言之,此次试验就是这么一步步探索出来,哪里出现问题,就在哪里寻求原因,还好总算把试验做出来了。
展开阅读全文