欢迎添加微信互相交流学习哦!
项目源码:https://gitee.com/oklongmm/biye
-
- 系统目标
根据需求分析的描述,现在制定系统实现目标如下:
- 界面设计简洁、友好、美观大方
- 操作简单、快捷方便
- 数据存储安全、可靠
- 信息分类清晰、准确
- 强大的查询功能、保证数据查询的灵活性
- 提供销售排行,为管理员提供真实的数据信息
- 提供灵活、方便的权限设置功能,使整个系统的管理分工明确
- 对用户的输入的数据,系统进行严格的数据检验,尽可能排人为错误
- 3.小型超市管理系统系统概念设计文档
- 系统E-R图说明:
- 超市中用户可以销售多种商品,商品可以被多个用户销售
- 超市中商品可由多个供应商供应,供应商可供应多种商品
- 超市中合格的商品入库,不合格的商品被回收即被退回
- 视图设计
(4)逻辑设计文档
a.系统关系模型
1)用户登录表(用户编号,用户名称,用户密码,用户类型,用户状态)
2)商品信息表(商品编号,供应商编号,商品名称,入库日期,生产日期,进货价格,销售价格,有效期,数量下限,单位)
3)供应商信息表(供应商编号,供应商名称,供应商地址,供应商电话)
4)销售表(销售编号,销售日期,商品名称,商品数量,商品金额,商品编号,操作员)
5)进货入库表(入库编号,入库日期,商品编号,供应商编号,商品数量,操作员)
6)退货销售表(退票编号,商品编号,商品数量,商品金额,退货时间,操作员)
7)退货商品表(退货编号,商品编号,商品名称,退货时间,供应商编号,操作员,数量)
8)库存信息表(库存编号,商品编号,用户编号,统计,总价)
- 系统数据库表结构
数据库表索引
表名 |
中文名 |
account |
用户登录表 |
manager |
用户信息表 |
commodity |
商品信息表 |
provider |
供应商信息表 |
returncommodity |
退货商品表 |
returnsale |
退货销售表 |
sale |
销售表 |
storage |
进货入库表 |
storageinfo |
库存信息表 |
用户登录表(account)
字段名 |
类型 |
长度 |
主/外键 |
字段约束 |
中文名 |
Accountnumber |
Integer |
|
primary |
|
登录号 |
Accountname |
varchar |
30 |
|
Not null |
登录名 |
Accountpassword |
varchar |
20 |
|
Not null |
登录密码 |
accountType |
smallint |
6 |
|
Not null |
登录类型 |
accountState |
smallint |
6 |
|
Not null |
登录状态 |
managerID |
Integer |
|
foreign |
Not null |
用户ID |
用户信息表(manager)
字段名 |
类型 |
长度 |
主/外键 |
字段约束 |
中文名 |
managerID |
Integer |
|
primary |
|
用户编号 |
managername |
varchar |
20 |
|
Not null |
用户姓名 |
mobilephone |
varchar |
15 |
|
|
手机号码 |
phone |
varchar |
15 |
|
|
固定电话 |
manageremail |
varchar |
30 |
|
|
电子邮件 |
商品信息表(commodity)
字段名 |
类型 |
长度 |
主/外键 |
字段约束 |
中文名 |
commodityID |
Integer |
|
primary |
|
商品编号 |
Commodityname |
varchar |
40 |
|
Not null |
商品名称 |
producedate |
datatime |
|
|
not null |
生产日期 |
Inprice |
numeric |
2 |
|
Not null |
进货价格 |
saleprice |
numeric |
2 |
|
Not null |
销售价格 |
storagetime |
int |
|
|
Not null |
有效期 |
downlimit |
int |
|
|
Not null |
数量下限 |
unit |
varchar |
8 |
|
Not null |
单位 |
providernumber |
int |
|
外键 |
|
供应商编号 |
indate |
date |
|
|
|
进货日期 |
供应商表(provider)
字段名 |
类型 |
长度 |
P/F |
约束 |
中文名 |
providernumber |
int |
|
P |
|
供应商编号 |
providername |
varchar |
40 |
|
Not null |
供应商名称 |
provideraddress |
varchar |
60 |
|
Not null |
供应商地址 |
phone |
varchar |
20 |
|
Not null |
供应商电话 |
销售表(sale)
字段名 |
类型 |
长度 |
P/F |
约束 |
中文名 |
saleid |
int |
|
P |
|
销售票号 |
commodityid |
int |
|
F |
Not null |
商品编号 |
selltime |
date |
|
|
Not null |
销售日期 |
number |
int |
|
|
Not null |
销售数量 |
money |
float |
|
|
Not null |
收入 |
operator |
varchar |
45 |
|
Not null |
销售员 |
commodityname |
varchar |
45 |
|
Not null |
商品名称 |
销售退货(returnsale)
字段名 |
类型 |
长度 |
P/F |
约束 |
中文名 |
Rsaleid |
int |
|
P |
|
退货票号 |
commodityid |
int |
|
|
Not null |
商品编号 |
commodityname |
varchar |
|
|
|
商品名称 |
number |
Int |
|
|
Not null |
商品数量 |
moeny |
folat |
|
|
Not null |
金额 |
returntime |
date |
|
|
Not null |
退货时间 |
operator |
varchar |
45 |
|
Not null |
操作员 |
入库退货表(returncommodity)
字段名 |
类型 |
长度 |
P/F |
约束 |
中文名 |
Rid |
int |
|
P |
|
退货编号 |
commodityname |
varcgar |
45 |
|
Not null |
商品名称 |
commodityid |
int |
|
|
Not |
商品编号 |
price |
float |
|
|
Not null |
价格 |
outdate |
date |
|
|
Not null |
退货时间 |
provider |
varchar |
45 |
|
Not null |
供应商名称 |
operator |
varchar |
45 |
|
Not null |
销售员 |
number |
int |
|
|
Not null |
退货数量 |
unit |
varchar |
8 |
|
Not null |
单位 |
库存信息表(storage)
字段名 |
类型 |
长度 |
P/F |
约束 |
中文名 |
storageid |
int |
|
P |
|
入库编号 |
commodityname |
varchar |
45 |
|
Not null |
商品名称 |
commodityid |
varchar |
|
|
Not null |
商品编号 |
unit |
vachar |
45 |
|
Not null |
单位 |
price |
float |
45 |
|
Not null |
单价 |
outdate |
date |
|
|
Not null |
退货时间 |
provider |
varchar |
45 |
|
Not null |
供应商 |
operator |
varchar |
45 |
|
Not null |
操作员 |
number |
int |
|
|
Not null |
数量 |
6. 物理设计文档
/*----------创建数据库----------*/
本系统使用mysql数据库,首先我们在Navicat for MySQL的Host: localhost下创建数据库limitedmarket,选择数据库编码为utf8 -- UTF-8 Unicode。
或使用sql语句create database limitedmarket创建数据库。
/*----------创建基本表----------*/
/*
创建account表
*/
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`accountNumber` Integer NOT NULL auto_increment,
`accountName` varchar(30) NOT NULL,
`accountPassword` varchar(20) NOT NULL,
`accountType` smallint(6) NOT NULL,
`managerID` Integer default NULL,
`accountState` smallint(6) NOT NULL,
PRIMARY KEY (`accountNumber`),
KEY `FK_manage` (`managerID`),
CONSTRAINT `FK_manage` FOREIGN KEY (`managerID`) REFERENCES `manager` (`managerID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*
创建manage表
*/
DROP TABLE IF EXISTS `manager`;
CREATE TABLE `manager` (
`managerID` Integer NOT NULL auto_increment,
`managerName` varchar(20) NOT NULL,
`managerMobilephone` varchar(15) ,
`managerRegionNumber` varchar(4) ,
`managerEMail` varchar(30) default NULL,
`managerPhone` varchar(10) ,
PRIMARY KEY (`managerID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*
创建commodity表
*/
DROP TABLE IF EXISTS `commodity`;
CREATE TABLE `commodity` (
`commodityID` integer NOT NULL auto_increment,
`providernumber` int(11) default NULL,
`commodityname` varchar(45) NOT NULL,
`inDate` datetime NOT NULL,
`producedate` datetime NOT NULL,
`inprice` float NOT NULL,
`saleprice` float NOT NULL,
`storagetime` int(11) NOT NULL,
`downlimit` int(11) NOT NULL,
`unit` varchar(8) default NULL,
PRIMARY KEY (`commodityID`),
KEY `FK_supply` (`providernumber`),
CONSTRAINT `FK_supply` FOREIGN KEY (`providernumber`) REFERENCES `provider` (`providernumber`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*
创建returncommodity
*/
DROP TABLE IF EXISTS `returncommodity`;
CREATE TABLE `returncommodity` (
`RCid` int unsigned NOT NULL auto_increment,
`commodityname` varchar(45) NOT NULL,
`commodityid` varchar(45) NOT NULL,
`unit` varchar(45) NOT NULL,
`price` float NOT NULL,
`outdate` datetime NOT NULL,
`provider` varchar(45) NOT NULL,
`operator` varchar(45) NOT NULL,
`number` int unsigned NOT NULL,
PRIMARY KEY (`RCid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*
创建sale表
*/
DROP TABLE IF EXISTS `sale`;
CREATE TABLE `sale` (
`commodityname` varchar(45) NOT NULL,
`commodityid` int unsigned NOT NULL,
`sellTime` datetime NOT NULL,
`number` varchar(45) NOT NULL,
`money` double NOT NULL,
`operator` varchar(45) NOT NULL,
`saleid` int NOT NULL auto_increment,
PRIMARY KEY (`saleid`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 PACK_KEYS=1;
/*
创建returnsale表
*/
DROP TABLE IF EXISTS `returnsale`;
CREATE TABLE `returnsale` (
`Rsaleid` int unsigned NOT NULL auto_increment,
`commodityid` int unsigned NOT NULL,
`commodityname` varchar(45) NOT NULL,
`number` int unsigned NOT NULL,
`money` double NOT NULL,
`returnTime` datetime NOT NULL,
`operator` varchar(45) NOT NULL,
PRIMARY KEY (`Rsaleid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*
创建provider表
*/
DROP TABLE IF EXISTS `provider`;
CREATE TABLE `provider` (
`providernumber` int(11) NOT NULL auto_increment,
`phone` varchar(20) NOT NULL,
`provideraddress` varchar(60) NOT NULL,
`providername` varchar(40) NOT NULL,
PRIMARY KEY (`providernumber`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*
创建stroge表
*/
DROP TABLE IF EXISTS `storage`;
CREATE TABLE `storage` (
`storageid` int unsigned NOT NULL auto_increment,
`commodityname` varchar(45) NOT NULL,
`commodityid` int unsigned NOT NULL,
`unit` varchar(45) NOT NULL,
`price` float NOT NULL,
`indate` datetime NOT NULL,
`provider` varchar(45) NOT NULL,
`operators` varchar(45) NOT NULL,
`number` int unsigned NOT NULL,
PRIMARY KEY (`storageid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*
创建storageinfo表
*/
DROP TABLE IF EXISTS `storageinfo`;
CREATE TABLE `storageinfo` (
`commoditynumber` int unsigned NOT NULL,
`accountid` int unsigned NOT NULL,
`amount` int unsigned NOT NULL,
`storageid` int unsigned NOT NULL auto_increment,
`money` double NOT NULL,
PRIMARY KEY (`storageid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
由于本系统设计较复杂,很多需要用到数据冗余性,所以部复杂功能借助‘存储功能‘ 和 ’触发器‘,本系统需要用到的存储过程和触发器的代码,如下:
-----------------------存储过程操作数据--------------------------
/*
向commodity插入值
*/
drop procedure if exists insertcommodity;
delimiter /
create procedure insertcommodity(IN providernumber int, commodityname varchar(45), inprice float,saleprice float, storagetime int, downlimit int, unit varchar(8) , indate date, producedate date)
begin
insert into commodity(providernumber, commodityname, inprice, saleprice, storagetime, downlimit, unit,indate, producedate)
values(providernumber, commodityname, inprice, saleprice, storagetime, downlimit, unit, indate, producedate);
end
/
delimiter ;
/*
更新commodity的值
*/
drop procedure if exists updatecommodity;
delimiter /
create procedure updatecommodity(IN providernumber int, commodityname varchar(45), inprice float,saleprice float, storagetime int, downlimit int, unit varchar(8) , indate date, producedate date, id int(11))
begin
update commodity set providernumber = providernumber, commodityname=commodityname, inprice = inprice, saleprice=saleprice, storagetime=storagetime, downlimit=downlimit,unit=unit, indate=indate, producedate = producedate where commodityid= id ;
end
/
delimiter ;
/* 向表storageinfo插入数据*/
drop procedure if exists insertstorageinfo;
delimiter /
create procedure insertstorageinfo(IN commoditynumber int(10),accountid int(10), amount int(10), money double)
begin
insert into storageinfo( commoditynumber,accountid, amount,money) values(commoditynumber,accountid , amount, money);
end
/
delimiter ;
/*
向resale表插入数据
*/
drop procedure if exists insertreturnsale;
delimiter /
create procedure insertreturnsale(IN commodityname varchar(45), commodityid int(10),returnTime varchar(45), number int(10) ,money double,operator varchar(45))
begin
insert into returnsale(commodityname , commodityid, returnTime, number,money, operator)
values(commodityname , commodityid, returnTime, number,money,operator);
end
/
delimiter ;
/*
向storage表插入数据
*/
drop procedure if exists ruku;
delimiter /
create procedure ruku(IN commodityname varchar(45), commodityid int, unit varchar(45), price float,indate varchar(45), provider varchar(45), operators varchar(45), number int)
begin
insert into storage (commodityname , commodityid, unit, price,indate, provider, operators, number)
values(commodityname , commodityid, unit, price,indate, provider, operators, number);
end
/
delimiter ;
/*
向sale插入数据
*/
drop procedure if exists insertsale;
delimiter /
create procedure insertsale(IN commodityname varchar(45), commodityid int,sellTime varchar(45), number int ,money double,operator varchar(45))
begin
insert into sale(commodityname , commodityid, sellTime, number,money, operator)
values(commodityname , commodityid, sellTime, number,money,operator);
end
/
delimiter ;
/*
查询storageinfo的值
*/
drop procedure if exists storageQuery;
delimiter /
create procedure storageQuery(IN commodityid int)
begin
select * from storageinfo where commoditynumber=commodityid;
end
/
delimiter ;
/*
更新storageinfo数据
*/
drop procedure if exists storageupdate;
delimiter /
create procedure storageupdate(IN amount int, commodityid int)
begin
update storageinfo set amount=amount where commoditynumber=commodityid;
end
/
delimiter ;
/*
向returncommodity插入数据
*/
drop procedure if exists tuihuo;
delimiter /
create procedure tuihuo(IN commodityname varchar(45), commodityid int, unit varchar(45), price float,outdate varchar(45), provider varchar(45), operator varchar(45), number int)
begin
insert into returncommodity(commodityname , commodityid, unit, price,outdate, provider, operator, number)
values(commodityname , commodityid, unit, price,outdate, provider, operator, number);
end
/
delimiter ;
-------------------触发器更新数据----------------------------
/*
更新storageinfo的数据(销售时库存的添加情况)
*/
delimiter /
create trigger tuihuo before insert on returnsale
for each row begin
update storageinfo set amount= amount + new.number where commoditynumber = new.commodityid;
end/
delimiter ;
/*
更新storageinfo的数据(退货时库存的减少情况)
*/
delimiter /
create trigger storageupdate before insert on sale
for each row begin
update storageinfo set amount= amount - new.number where commoditynumber = new.commodityid;
end/
delimiter ;
小结
本系统完成了超市系统的基本功能模块,由于时间上的仓促,没有完成系统的数据备份和数据恢复,这是遗憾之处。同时系统没有优化,还存在很多细节上的缺陷。本系统采用mysql数据库,swing布局,使用的IDE是netbeans6.7。