超市收银管理系统
User用户
User(id,username,password,type)
type:0表示超市管理员,1表示收银员
Goods商品
Goods(id,goodsname,price,unit,num)
id表示商品编号
goodsname表示商品名称
price表示商品单价
unit表示商品单位
num表示商品库存
二.业务
通过网络编程实现+多线程实现
分为客户端工程和服务端工程(两个独立工程)
客户端功能:
1.负责收集客户端的操作及操作参数
2.负责接收服务端返回的数据,控制台展现业务逻辑
服务端功能:
1.数据仓库
用户信息和商品信息都以集合形式存放在服务端
2.接收客户端的请求,把相应数据结果响应给客户端
示例介绍
如用户通过客户端进行用户登录,
则客户端收集用户输入的用户名和密码
客户端连接服务端,把收集信息传递给服务端
服务端获取用户信息,和数据仓库中的用户信息查行比较.
如果匹配正确,响应给客户端相应数据(用户匹配正确),
客户端拿到(用户匹配正确的相关信息后),进行下一步操作
如果客户端拿到(用户验证不正确),则应该提示用户输入正确用户名或密码,
进行下一次传递验证!只能验证成功才能进行下 一步操作!
1.登录
开始页面
欢迎使用xx超市管理系统
1 .登陆
2. 退出系统
请选择数字1/2**
登录
1.输入用户名和密码进行登录,如果不匹配,请提示"用户名或者密码输入错误!登录失败!"
2.用户名和密码正确,则登录到系统中
3.根据用户的type类型,来弹出菜单
a.如果是管理员,则菜单如下:
*****欢迎登录xx超市库存管理系统*****
请选择进行的操作:1.商品入库 2.商品出库 3.新增商品 4.查询全部商品 5.按查询号查询商品 6.退出
b.如果是收银员,则菜单如下:
欢迎登录XX超市收银系统
请选择进行的操作:1.扫描商品 2.修改数量 3.打印账单 4.退出
2.管理员操作
2.1 商品入库
不是新增商品,而是对原有商品库存的改变
输入商品编号,如果编号不存在,不能入库,请给于提示,
否则,则可以入库,输入入库商品的数量,执行入库操作.
2.2 商品出库
和入库是相反的操作
输入商品编号,如果编号不存在,不能出库,请给于提示,
否则,则可以出库,输入出库商品的数量,执行出库操作.数据库中该商品的数量相应减少
2.3 新增商品
输入商品编号,如果编号存在,不能新增,给于相应提示
否则,可以进行新增商品操作,输入商品名,价格,单位,数量,执行新增操作.
2.4 查询全部商品
输出数据库中商品的所有信息,如:
商品编号 商品名称 商品单价 单位 数量
1008 吉百家芝麻油 9.5 125ml 20
1007 白玉内酯豆腐 1.0 400g 15
1006 白玉黄豆芽 2.4 350g 20
1005 桃李醇熟切片 6.5 400g 10
1004 旺仔QQ糖 2.5 70g 70
1003 脉动水蜜桃 7.0 1.5l 50
1002 雀巢咖啡 1.5 13g 200
1001 吉百家芝麻油 9.5 125ml 20
2.5 按编号查询商品
输入商品编号,如果编号不存在,则给于提示,商品不存在
否则,列出该商品的详细信息
3.收银员操作
3.1 扫描商品和打印账单
扫描的商品编号,如果商品存在,则表示购买成功,还可以接着扫描,直到打印账单,进行结账,
这时,购物流程结束,输出小票信息,如下:
收银员号:3333 小票号:20200214103514
序 商品名称 数量 单价 金额
1 雀巢咖啡13g 1 1.5 1.5
2 吉百家芝麻油125ml 1 9.5 9.5
合计: 2 11.0
注意:对应商品的库存,应该相应减少
代码如下
第一个包 client
/**
* 客户端类
*/
public class Client {
static Scanner scanner = new Scanner(System.in);
static MoneyReceiverViewer moneyReceiverViewer = new MoneyReceiverViewer();
static RepertoryView repertoryView = new RepertoryView();
static ClientBIZ clientBIZ=ClientBIZimpl.getInstance();
public static void main(String[] args) {
// 调用登陆界面的方法
showMainMenuView();
}
/**
* 登陆的方法
*/
private static void showMainMenuView() {
System.out.println("***********欢迎使用xx超市管理系统**************");
System.out.println("1.登陆\n" + "2.退出系统");
System.out.println("***************请选择数字1/2*********************");
// 接受用户输入
int c = scanner.nextInt();
if (c == 1) {
// 调用登陆的方法
showLoginView();
} else {
System.out.println("谢谢使用!");
clientBIZ.logout();
System.exit(0);
}
}
private static void showLoginView() {
System.out.print("用户名称:");
String name = scanner.next();
System.out.print("用户密码:");
String password = scanner.next();
Data dats = clientBIZ.dologin(name, password);
if (!SysConstants.succ.equals(dats.getFlag())) {
System.out.println("用户名或密码错误!登陆失败!");
showLoginView();
} else {
User user = (User) dats.getDat();
if (SysConstants.repertory.equals(user.getRole())) {
repertoryView.showMainMenuView();
} else {
moneyReceiverViewer.setUser(user);
moneyReceiverViewer.showMainViewView();
}
}
}
}
public interface ClientBIZ {
Data dologin(String name, String password);// 登陆方法
boolean isExist(int goodsId);// 判断商品是否存在的方法
Data vipDologin(int cardID);// 会员登陆的方法
Data setVipIntegeral(int intergralNew);// 设置会员积分的方法
Data in(int goodID, int count);// 商品入库的方法
Data out(int goodID, int count);// 商品出库的方法
Data queryAll(); // 查询全部商品的信息
boolean newGoods(int goodsID, String goodsName, double goodsPrice,
String goodsUnit, int goodsCount);// 根据五个属性添加新商品
Data queryById(int goodsID);// 通过商品编号查询所属商品信息
void showDoodsIfo(Goods goods);// 单个商品显示方法
Data modify(int id, int count);//修改商品数量
void closeSocket();// 关闭流的方法
void logout();// 退出的方法
public class ClientBIZimpl implements ClientBIZ {
Socket sock = new Socket();
ObjectInputStream ois = null;
ObjectOutputStream oos = null;
private static ClientBIZ instance = new ClientBIZimpl();//创建对象
public static ClientBIZ getInstance(){
return instance;
}
private ClientBIZimpl() {
// 实例化Socket对象
try {
sock = new Socket(Tools.getValue(SysConstants.SYS_HOSTNAME),Integer.parseInt(Tools.getValue(SysConstants.SYS_LISTENERPORT)));
oos = new ObjectOutputStream(sock.getOutputStream());
ois = new ObjectInputStream(sock.getInputStream());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* 根据单个对象显示单个商品信息
*/
public void showDoodsIfo(Goods goods) {
String s = String.format("%d\t\t%s\t\t%.2f\t\t%s\t\t\t%d",
goods.getId(), goods.getName(), goods.getPrice(),
goods.getUnit(),goods.getCount());
System.out.println(s);
}
/*
* 根据用户名和密码登陆
*/
@Override
public Data dologin(String name, String password) {
Data dat = new Data();
dat.setFlag(SysConstants.login);
User user = new User();
user.setName(name);
user.setPassword(password);
dat.setDat(user);
try {
// 向服务器发送对象
oos.writeObject(dat);
// 接受服务器的返回
dat = (Data) ois.readObject();
return dat;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/*
* 根据商品编号判断这个商品时否存在
*/
@Override
public boolean isExist(int goodsId) {
Goods good = new Goods();
good.setId(goodsId);
Data data = new Data();
data.setDat(good);
data.setFlag(SysConstants.isExist);
boolean flag;
try {
// 向服务器发送数据
oos.writeObject(data);
// 接收服务器返回的数据
data = (Data) ois.readObject();
if (SysConstants.succ.equals(data.getFlag())) {
flag = true;
} else {
return false;
}
return flag;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
// 商品入库
public Data in(int goodID, int count) {
Data data = new Data();
data.setFlag(SysConstants.in);
Goods goods =