北大青鸟第一单元超市收银管理系统(版)由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“超市收银管理系统设计”。
包结构
四个包,九个类,一个资源文件
客户端类
package com.supermarket.Client;/**
* 客户端界面
*/
import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.Scanner;
import com.supermarket.Tools.Datas;import com.supermarket.Tools.SysConstans;import com.supermarket.entity.Goods;
public cla Client {
//定义扫描器,用于键盘输入
public static Scanner input=new Scanner(System.in);//创建客户端业务类对象,调用方法
public static ClientB cb=new ClientB();public static void main(String[] args){ do{
System.out.println(“***********欢迎使用青鸟超市系统*************”);System.out.println(“1.登录”+“n2.退出”);System.out.println(“***********请选择1/2*************”);
String choice=input.next();
if(choice.equals(“1”)){
//登录视图
createLoginView();break;} else if(choice.equals(“2”)){ //退出
System.exit(0);} else{ //输入有误,报错
System.out.println(“无此选项!”);} }while(true);System.out.println(“***********谢谢使用青鸟超市系统*************”);
} /**
* 登录视图
* 通过输入的用户名与密码验证用户身份,管理员则进入管理界面,收银员则进入收银界面,都不是则提示错误,并重新进行输入
*/
public static void createLoginView(){ do { //提示登录信息
System.out.println(“请输入用户名:”);String name = input.next();System.out.println(“请输入密码:”);String paword = input.next();//调用客户端登录方法,接收返回值,判断登录者的身份 Datas datas = cb.doLogin(name, paword);//判断是管理员还是收银员
if(datas.getFlag().equals(SysConstans.SYS_ADMIN)){
createAdminView();
break;
} else if
(datas.getFlag().equals(SysConstans.SYS_CASHIER)){
createCashierView();
break;
} else { System.out.println(“用户名或密码有误,请重新输入”);
}
} while(true);}
/**
* 管理员菜单 * 实现管理员功能:
* 1.商品入库 2.商品出库 3.新增商品 4.查询全部商品 5.按编号查询商品 6.退出
*/
private static void createAdminView(){
//循环操作 // 管理员菜单
System.out.println(“管理员登录成功,进入管理员界面”);do{
System.out.println(“***********欢迎进入青鸟超市库存管理系统*************”);System.out.println(“1.商品入库t2.商品出库t3.新增商品t4.查询全部商品t5.按序号查询商品t6.退出”);
//提示用户选择
System.out.println(“请输入您的选择”);int choice=input.nextInt();switch(choice){ //商品入库,调入库方法 case 1:
//提示输入要入库的编号
System.out.println(“请输入入库商品编号:”);//定义变量接收输入的编号
String goodnum=input.next();//调用方法判断库存中是否有要入库的商品
if(cb.Find(goodnum).getFlag().equals(SysConstans.SYS_SUCCESS)){
System.out.println(“请输入入库数量:”);
int count=input.nextInt();
if(count>=0){
Datas datas=cb.RuKu(goodnum,count);
if(datas.getFlag().equals(SysConstans.SYS_SUCCESS)){
System.out.println(“入库成功!”);
showList(cb.FindAll());}
}else{
System.out.println(“入库数量必须大于0”);
} }else{ System.out.println(“无此商品,请选择3新增”);} break;//商品出库,调出库方法
case 2: do{
//提示输入出库商品编号
System.out.println(“请选择出库商品编号:”);//定义变量接收编号
String goodid=input.next();//先查询是否由此商品
if(cb.Find(goodid).getFlag().equals(SysConstans.SYS_SUCCESS)){
//提示输入出库数量
System.out.println(“请输入出库数量:”);
int count=input.nextInt();
if(count>0){
Datas datas=cb.ChuKu(goodid,count);
if(datas.getFlag().equals(SysConstans.SYS_LACK)){
System.out.println(“库存不足!”);
showGood(datas);break;}else{
System.out.println(“出库成功!”);
showList(datas);
break;
} }else{ }
System.out.println(“出库数量必须大于0!”);
}else{ System.out.println(“库存中无此商品,请选择3新增”);
break;} }while(true);break;case 3: //新增商品,调新增方法
//提示输入新增商品编号 do{ System.out.println(“请输入新增商品的编号:”);
String newgoodid=input.next();
if(cb.Find(newgoodid).getFlag().equals(SysConstans.SYS_SUCCESS)){
System.out.println(“商品已存在”);break;} else{
System.out.println(“请输入商品名称:”);String name=input.next();System.out.println(“请输入商品单价:”);double price=input.nextDouble();System.out.println(“请输入商品单位:”);String unit=input.next();System.out.println(“请输入商品数量:”);
int count=input.nextInt();
Goods good=new Goods(newgoodid,(name+“t”),price,unit,count);
//把要新增的商品通过调用方法传给业务类,并接收返回值 Datas datas=cb.Add(good);System.out.println(“新增商品成功!”);//打印商品列表
showList(cb.FindAll());
break;} }while(true);break;//查询全部商品的方法 case 4: //查询商品,调用showList方法参数为Datas类型,是FindAll传回来的 showList(cb.FindAll());break;//按编号查询商品,调按编号查询方法 case 5:
//提示输入编号
System.out.println(“请输入要查询的编号:”);//定义变量接收输入
String id=input.next();//判断库存中是否存在编号为goodid的商品 Datas datas=cb.Find(id);//如果存在,调用方法,打印商品
if(datas.getFlag().equals(SysConstans.SYS_SUCCESS)){
showGood(datas);
}else{
System.out.println(“没有此商品”);} break;case 6: //退出
System.out.println(“管理员退出成功!”);System.exit(0);default :
//提示无此选项
System.out.println(“无此选项,请重新输入:”);
} }while(true);} /**
* 收银员管理界面.* 实现收银员的功能:
* 1.扫描商品 2.修改购买商品的数量
*/
//收银员管理界面
private static void createCashierView(){
//循环操作收银界面 while(true){ System.out.println(“收银员登录成功,进入收银员界面”);System.out.println(“***********欢迎进入青鸟超市收银
3.结账
4.退出
管理系统*************”);System.out.println(“1.扫描商品t2.修改数量t3.结账t4.退出”);
//提示用户输入操作选项
System.out.println(“请输入您的选择:”);int choice=input.nextInt();switch(choice){ case 1:
//调用扫描方法 do{ //提示输入扫描编号
System.out.println(“请输入要扫描的商品编号:”);
String scannum=input.next();//如果查询到编号,说明商品存在,否则商品不存在if(cb.Find(scannum).getFlag().equals(SysConstans.SYS_SUCCESS)){
//如果商品存在,调用扫描的方法 Datas datas=cb.scan(scannum);//判断返回的标识
if(datas.getFlag().equals(SysConstans.SYS_SUCCESS)){
System.out.println(“扫描成功”);
showScan(datas);break;}else{
System.out.println(“扫描失败”);//
showScan(datas);
break;} }else{
System.out.println(“商品不存在!”);
break;
} }while(true);
break;case 2: //修改数量的方法 //判断购买列表是否为空
if(cb.result().getFlag().equals(SysConstans.SYS_ERROR)){ System.out.println(“购买列表中还没有购买物品!”);
continue;}
//循环操作数据 do{ //提示用户输入要修改的编号,并判断购买列表中是否存在此编号
System.out.println(“请输入要修改的商品编号:”);String changeid=input.next();Datas datas=new Datas();//调用方法判断是否存在商品编号 if(hasid(changeid)){
//存在,提示修改数量
System.out.println(“请输入修改后的数量”);
int changenum=input.nextInt();
if(changenum>1){
datas=cb.ChangeCount(changeid,changenum);
if(datas.getFlag().equals(SysConstans.SYS_LACK)){
System.out.println(“数量不足,请确认!”);
showGood(cb.Find(changeid));continue;}else{
System.out.println(“修改成功!”);
showScan(cb.result());
break;}
}else{
System.out.println(“购买数量必须大于0!”);
break;} } //如果包含,提示修改数量
System.out.println(“购买列表中无此商品,请核实”);
continue;}while(true);break;case 3: //调用结账方法
creatOver();break;case 4: //退出
System.out.println(“收银员退出系统成功!”);System.exit(0);default: //错误提示 System.out.println(“输入有问题,请重新输入:”);
}
}
} /**
* 打印商品列表的方法,参数是Datas类型,无返回值 * 通过调用客户端业务类的方法得到返回值,打印商品列表 * @param datas */ //打印商品列表
private static void showList(Datas datas){
System.out.println(“---”);System.out.println(“商品编号tt商品名称tttt商品单价tt单位tt数量”);
for(Goods good:datas.getGoodslist()){
System.out.println(good.getGoodid()+“tt”+good.getGoodname()+“tt”+good.getGoodprice()+“tt”+good.getGoodunit()+“tt”+good.getGoodcount());
}
System.out.println(“---”);
} /**
* 按编号查询商品的方法.得到返回值,直接打印返回值中的商品 * @param datas */
//打印单个商品
private static void showGood(Datas datas){
System.out.println(“---”);System.out.println(“商品编号tt商品名称tttt商品单价tt单位tt数量”);
System.out.println(datas.getGood().getGoodid()+“tt”+datas.getGood().getGoodname()+“tt”
+datas.getGood().getGoodprice()+“tt”+datas.getGood().getGoodunit()+“tt”+datas.getGood().getGoodcount());
System.out.println(“---”);
} /**
* 收银员菜单中的扫描商品的方法后打印扫描商品列表的方法 *
* @param datas */
//打印扫描商品列表
private static void showScan(Datas datas){ if(datas.getFlag().equals(SysConstans.SYS_SUCCESS)){
//定义列表接收扫描后的购买列表
ArrayList scanlist=datas.getBuylist();//输出商品列表
System.out.println(“商品编号t商品名称tttt数量tt单价tt金额”);
System.out.println(“---”);
for(Goods good:scanlist){
System.out.println(good.getGoodid()+“t”+good.getGoodname()+“tt”+good.getGoodcount()+“tt”+good.getGoodprice()+“tt”+
(good.getGoodprice()*good.getGoodcount()));
}
System.out.println(“---”);
} } /**
* 查询购买列表中是否存在要修改数量的商品
* 参数为商品编号,如果存在,返回true.不存在则返回false * @param id * @return */
//查询购买列表中是否存在要修改数量商品的编号
private static boolean hasid(String id){ Datas datas=new Datas();datas.setBuylist(cb.result().getBuylist());for(Goods good:datas.getBuylist()){
if(good.getGoodid().equals(id)){
return true;
} }
return false;} /**
* 结账方法,分为普通结账和会员结账
* 普通结账和会员结账,分别调用普通结账方法和会员结账方法 */ //结账方法
private static void creatOver(){ //首先打印购买列表,算出总金额.调用普通结账,或vip结账 double money=sum(cb.result());System.out.println(“您的消费金额是:”+money);//提示选择结账方法 if(money!=0){
System.out.println(“请选择结账方法:”);System.out.println(“1.普通结账t2.会员结账”);int choice=input.nextInt();if(choice==1){
//普通会员结账方法
System.out.println(“您的消费金额是:”+money);do{
System.out.println(“请输入金额:”);int pay=input.nextInt();if(pay
System.out.println(“请输入正确金额!”);//
}else if(pay
System.out.println(“金额不足,请确认!”);
//
}else if(pay>=money){ System.out.println();
//结账成功.调用结账方法,打印小票,并跳出结账.Over(money, pay);break;}else{
System.out.println(“请输入正确格式:”);
} }while(true);}else if(choice==2){
//vip会员结账方法,会员卡号2011.System.out.println(“您的消费金额是:”+money);System.out.print(“请输入您的会员卡号:”);do{ int vip = input.nextInt();if(vip==2013){
System.out.print(“会员卡号正确,请输入您要支付的金额:”);
int vippay=input.nextInt();if(vippay>0){
if(vippay>money){
//金额足够时调用vip结账方法
VipOver(money, vippay);break;}else{
System.out.println(“付款金额不足”);
} }else{
System.out.println(“付款金额必须大于0!”);
} }else{
System.out.println(“您的会员卡号不正确:”);} }while(true);}else{ System.out.println(“无此结账方法”);} }else { System.out.println(“您还没有扫描商品”);}
} /**
* 结账时用到的计算购买金额的方法,如果buylist不为空,则返回购买金额.否则返回0.*
* @param result * @return */
//算出购买总金额的方法
private static double sum(Datas result){ //首先判断购买列表是否为空,不为空则算出购买金额
if(cb.result().getFlag().equals(SysConstans.SYS_SUCCESS)){
ArrayList list=cb.result().getBuylist();
double sum=0;//购买总额
for(int i=0;i
sum+=list.get(i).getGoodprice()*list.get(i).getGoodcount();
}
} return sum;}else
return 0;
//计算购买数量的方法
private static int sumBuyListCount(Datas result){
if(cb.result().getFlag().equals(SysConstans.SYS_SUCCESS)){
ArrayList list=cb.result().getBuylist();
int goodscount=0;
for(int i=0;i
goodscount+=list.get(i).getGoodcount();
}
return goodscount;
}else{
return 0;
}
} /**
* 普通结账方法.返回结账视图,并清空购买菜单 * @param money * @param pay */
//普通用户结账的方法
private static void Over(double money,int pay){ //首先打印,小票的表头
System.out.println(“***************************************************************************************************”);
System.out.println(“tttt青鸟超市”);System.out.println(“收银员:1001t小票号:” + ticket());//显示购买列表
showbuylist();//显示购买金额和购买的数量,结账提示 System.out.println(“总数量:” + sumBuyListCount(cb.result())+ “ttt应收: ” + money);System.out.println(“实收: ” + pay + “tt找零: ” +(pay-money));
System.out.println(Date());System.out.println(“此小票是您退换货及核对积分的凭证,请妥善保存!”);
System.out.println(“***************************************************************************************************”);
//购买列表清空
cb.clear();} /**
* Vip会员结账方法.返回结账视图,累计会员积分,并清空购买菜单 * @param money * @param pay */
//vip用户结账方法
private static void VipOver(double money,int vippay){ //首先打印,小票的表头
System.out.println(“***************************************************************************************************”);
System.out.println(“tttt青鸟超市”);System.out.println(“收银员:1001t小票号:” + ticket());//显示购买列表
showbuylist();//显示购买金额和购买的数量,结账提示 System.out.println(“总数量:”
+sumBuyListCount(cb.result())+ “ttt应收: ” + money);System.out.println(“实收: ” + vippay + “tt找零: ” +(vippay-money));
//Vip积分提示
System.out.println(“本次累计积分成功tt卡号:2011”);System.out.println(“消费前积分 + 本次消费积分 = 消费后积分”);
System.out.println(2000+“+”+(int)money+“=”+(2000+(int)money));
System.out.println(Date());System.out.println(“此小票是您退换货及核对积分的凭证,请妥善保存!”);
System.out.println(“***************************************************************************************************”);
//购买列表清空
cb.clear();} /**
* 打印购买菜单的方法.*/
//打印购买列表的方法
private static void showbuylist(){ ArrayList buylist=cb.result().getBuylist();System.out.println(“序tt商品名称(单位)tttt数量
tt单价tt金额”);
System.out.println(“---”);
for(int i=0;i
System.out.println((i+1)+“tt(”+buylist.get(i).getGoodid()+“)”+buylist.get(i).getGoodname()+buylist.get(i).getGoodunit()+“ttt”+buylist.get(i).getGoodcount()+“tt”+buylist.get(i).getGoodprice()+“tt”+buylist.get(i).getGoodcount()*buylist.get(i).getGoodprice());
}
System.out.println(“---”);} /**
* 得到日期的方法,在结账时显示日期用 * @return */
//显示日期的方法
private static String Date(){
Date date=new Date();
SimpleDateFormat sdf=new
SimpleDateFormat(“yyyy/MM/dd/ hh:mm:”);
String paydate= sdf.format(date);
return paydate;} /**
* 得到小票号的方法.日期+(1-1000)的随机数 * @return */
//打印票据的方法
private static String ticket(){
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(“yyyyMMddhhmm”);
String ticket = sdf.format(date)+(int)(Math.random()* 1000);
return ticket;} }
客户端业务类
package com.supermarket.Client;/**
* 客户端业务类.* 功能:客户端调用业务类的方法,实现和服务器端的数据交互 */
import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.net.Socket;import java.net.UnknownHostException;
import com.supermarket.Tools.Datas;import com.supermarket.Tools.SysConstans;import com.supermarket.Tools.Tools;import com.supermarket.entity.Goods;import com.supermarket.entity.User;
public cla ClientB {
//创建Socket实例 Socket socket=null;//创建输入输出流
ObjectOutputStream oos=null;ObjectInputStream ois=null;/**
* 初始化输入输出流的方法,每次调用方法时都要初始化 输入输出流 */
//初始化流的方法
public void initSocket(){ try {//socket=new Socket(localhost,8888)
socket=new
Socket(Tools.getVlaue(SysConstans.SYS_HOSTNAME),Integer.parseInt(Tools.getVlaue(SysConstans.SYS_LISTENERPORT)));//获得输入输出流
oos=new
ObjectOutputStream(socket.getOutputStream());
ois=new
ObjectInputStream(socket.getInputStream());
} catch(NumberFormatException e){
// TODO 自动生成的 catch 块
e.printStackTrace();} catch(UnknownHostException e){ // TODO 自动生成的 catch 块
e.printStackTrace();} catch(IOException e){ // TODO 自动生成的 catch 块
e.printStackTrace();} } /**
* 关闭输入输出流的方法.* 每次调用方法之后都要关闭输入输出流 */
public void closeSocket(){
//关闭流的方法
try {
oos.close();ois.close();socket.close();} catch(IOException e){ // TODO 自动生成的 catch 块
e.printStackTrace();}
} /**
* 客户端登录方法.* 接收客户端发送参数,发送到服务器端验证,并接收服务器端返回的数据信息
* @param name
* @param paword
* @return
*/
//登录方法
public Datas doLogin(String name, String paword){
initSocket();
User user=new User();
user.setUsername(name);
user.setPaword(paword);
Datas datas=new Datas();
datas.setFlag(SysConstans.SYS_LOGIN);
datas.setUser(user);
//写入流
try {
oos.writeObject(datas);
//接收服务器返回值
datas=(Datas)ois.readObject();
return datas;
} catch(IOException e){
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch(ClaNotFoundException e){ // TODO 自动生成的 catch 块
e.printStackTrace();
}
finally{
closeSocket();
}
return null;} /**
* 客户端查询全部商品的方法
* @return */
//查询全部商品的方法
public Datas FindAll(){ initSocket();Datas datas=new Datas();datas.setFlag(SysConstans.SYS_FINDALL);try {
oos.writeObject(datas);
datas=(Datas)ois.readObject();
return datas;} catch(IOException e){
// TODO 自动生成的 catch 块
e.printStackTrace();} catch(ClaNotFoundException e){ // TODO 自动生成的 catch 块
e.printStackTrace();}finally{
closeSocket();} return null;} /**
* 客户端实现按编号查询商品的方法 * 功能:接收编号,到服务器查询,接收返回值 * @param goodid * @return */
//按编号查询商品的方法
public Datas Find(String goodid){ initSocket();Goods good=new Goods();good.setGoodid(goodid);Datas datas=new Datas();datas.setFlag(SysConstans.SYS_FIND);datas.setGood(good);try {
oos.writeObject(datas);
datas=(Datas)ois.readObject();return datas;} catch(IOException e){ // TODO 自动生成的 catch 块
e.printStackTrace();} catch(ClaNotFoundException e){ // TODO 自动生成的 catch 块
e.printStackTrace();} finally{
closeSocket();} return null;} /**
* 客户端管理员实现入库商品的方法 * @param goodid * @param count * @return */ //入库方法
public Datas RuKu(String goodid,int count){ initSocket();Goods good=new Goods();good.setGoodid(goodid);good.setGoodcount(count);Datas datas=new Datas();datas.setFlag(SysConstans.SYS_RUKU);datas.setGood(good);try {
oos.writeObject(datas);
datas=(Datas)ois.readObject();
return datas;} catch(IOException e){
// TODO 自动生成的 catch 块
e.printStackTrace();} catch(ClaNotFoundException e){ // TODO 自动生成的 catch 块
e.printStackTrace();} finally{
closeSocket();} return null;} /**
* 客户端管理员实现商品出库的方法
* @param goodid * @param count * @return */
public Datas ChuKu(String goodid, int count){ initSocket();// 接收参数
Goods good=new Goods();good.setGoodid(goodid);good.setGoodcount(count);Datas datas=new Datas();datas.setFlag(SysConstans.SYS_CHUKU);datas.setGood(good);try {
oos.writeObject(datas);
datas =(Datas)ois.readObject();
return datas;} catch(IOException e){ // TODO 自动生成的 catch 块
e.printStackTrace();} catch(ClaNotFoundException e){ // TODO 自动生成的 catch 块
e.printStackTrace();}finally{
closeSocket();} return null;} /**
* 客户端管理员实现商品新增的方法
* @param good * @return */
//新增商品方法
public Datas Add(Goods good){ initSocket();Datas datas=new Datas();datas.setFlag(SysConstans.SYS_ADD);datas.setGood(good);try {
oos.writeObject(datas);
datas=(Datas)ois.readObject();} catch(IOException e){
// TODO 自动生成的 catch 块
e.printStackTrace();} catch(ClaNotFoundException e){ // TODO 自动生成的 catch 块
e.printStackTrace();}finally{
closeSocket();} return null;} /**
* 客户端收银员实现扫描商品的方法 * @param scannum * @return */ //扫描方法
public Datas scan(String scannum){
// TODO 自动生成的方法存根
initSocket();Goods good=new Goods();good.setGoodid(scannum);Datas datas=new Datas();datas.setGood(good);datas.setFlag(SysConstans.SYS_SCAN);try {
oos.writeObject(datas);datas =(Datas)ois.readObject();return datas;} catch(IOException e){ // TODO 自动生成的 catch 块
e.printStackTrace();} catch(ClaNotFoundException e){ // TODO 自动生成的 catch 块
e.printStackTrace();}finally{
closeSocket();}
return null;} /**
* 客户端收银员实现结账时返回购买列表的方法 * @return */
//结账方法.返回购买列表
public Datas result(){ initSocket();Datas datas=new Datas();datas.setFlag(SysConstans.SYS_RESULT);try {
oos.writeObject(datas);
datas=(Datas)ois.readObject();
return datas;} catch(IOException e){
// TODO 自动生成的 catch 块
e.printStackTrace();} catch(ClaNotFoundException e){ // TODO 自动生成的 catch 块
e.printStackTrace();}finally{ closeSocket();}
{
return null;
} /**
* 客户端收银员实现修改数量的方法 * @param changeid * @param changenum * @return */
//收银员,修改数量的方法
public Datas ChangeCount(String changeid, int changenum)
initSocket();Goods good=new Goods();good.setGoodid(changeid);good.setGoodcount(changenum);Datas datas=new Datas();datas.setFlag(SysConstans.SYS_UPDATA);datas.setGood(good);try { oos.writeObject(datas);datas=(Datas)ois.readObject();return datas;} catch(IOException e){ // TODO 自动生成的 catch 块
e.printStackTrace();} catch(ClaNotFoundException e){ // TODO 自动生成的 catch 块
e.printStackTrace();}finally{
closeSocket();} return null;
} /**
* 客户端收银员实现清空购买列表的方法 * @return */
public Datas clear(){
// TODO 自动生成的方法存根
initSocket();Datas datas=new Datas();datas.setFlag(SysConstans.SYS_CLEAR);try { oos.writeObject(datas);datas=(Datas)ois.readObject();
return datas;
} catch(IOException e){
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch(ClaNotFoundException e){
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally{
closeSocket();
}
return null;
} }
商品类
package com.supermarket.entity;/** * 商品类
* 实现序列化
* 属性:String goodid商品编号
*
String goodname商品名称
*
String goodprice商品单价
*
String goodunit商品单位
*
String goodcount商品库存(数量)* 商品属性和Set/Get方法
* 有参和无参的构造方法
*/ import java.io.Serializable;
public cla Goods implements Serializable { private String goodid;//商品编号
private String goodname;//商品名称
private double goodprice;//商品单价
private String goodunit;//商品单位
private int goodcount;//商品数量
//商品无参数构造方法
public Goods(){
} //商品有参数构造方法
public Goods(String goodid,String goodname,double goodcount){
this.goodid=goodid;
this.goodname=goodname;
this.goodprice=goodprice;
this.goodunit=goodunit;
this.goodcount=goodcount;
} public String getGoodid(){
return goodid;} public void setGoodid(String goodid){
this.goodid = goodid;} public String getGoodname(){
return goodname;} public void setGoodname(String goodname){
this.goodname = goodname;} public double getGoodprice(){
return goodprice;} public void setGoodprice(double goodprice){
if(goodprice>0){
this.goodprice = goodprice;
}
else{
System.out.println(“价格必须大于0”);
} } public String getGoodunit(){
return goodunit;} public void setGoodunit(String goodunit){
goodprice,String goodunit,int
this.goodunit = goodunit;} public int getGoodcount(){
return goodcount;} public void setGoodcount(int goodcount){
this.goodcount = goodcount;
}
}
用户类
package com.supermarket.entity;/** * 用户类
* 实现序列化
* 属性:用户名和密码
* 方法:Set和Get方法
*/ import java.io.Serializable;
public cla User implements Serializable { private String username;//用户名
private String paword;//密码 /* public User(){
//无参数构造方法
} //有参数构造方法
public User(String username,String paword){
this.username=username;
this.paword=paword;}*/ //Set和Get方法
public String getUsername(){
return username;} public void setUsername(String username){
this.username = username;} public String getPaword(){
return paword;}
public void setPaword(String paword){
this.paword = paword;}
}
服务器类
package com.supermarket.Server;/** * 服务器
* 继承线程类,创建ServerService接口,监听客户端请求
* 判断客户端传递的标识,通过标识调用服务端业务类操作数据的方法,并给与客户端响应
*/ import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.net.ServerSocket;import java.net.Socket;
import com.supermarket.Tools.Datas;import com.supermarket.Tools.SysConstans;import com.supermarket.Tools.Tools;
public cla ServerListener extends Thread{ public static void main(String[] args){
// TODO 自动生成的方法存根
new ServerListener().start();} @Override public void run(){
//服务器启动
System.out.println(“服务器启动”);
//创建ServerSocket,Socket服务器socket初始化
ServerSocket serversocket = null;
Socket socket =null;
ObjectOutputStream oos =null;
ObjectInputStream ois= null;
try {//实例化ServerSocketsocket 端口号8888
serversocket =new ServerSocket(Integer.parseInt(Tools.getVlaue(SysConstans.SYS_LISTENERPORT)));
//死循环监听请求
while(true){
socket=serversocket.accept();
oos=new ObjectOutputStream(socket.getOutputStream());
} ois = new ObjectInputStream(socket.getInputStream());//接受客户请求的对象
Datas datas =(Datas)ois.readObject();String flag = datas.getFlag();//创建服务器服务类的对象
ServerService =new ServerService();//判断客户端传过来的标识是想调用什么方法
if(datas.getFlag().equals(SysConstans.SYS_LOGIN)){ datas=.doLogin(datas);}else if(flag.equals(SysConstans.SYS_ADD)){ datas =.add(datas);// 商品出库
} else if(flag.equals(SysConstans.SYS_CHUKU)){ datas =.down(datas);// 商品入库
} else if(flag.equals(SysConstans.SYS_RUKU)){ datas =.up(datas);// 编号查看
} else if(flag.equals(SysConstans.SYS_FIND)){ datas =.find(datas);// 查看所有
} else if(flag.equals(SysConstans.SYS_FINDALL)){ datas =.findAll(datas);// 扫描商品
} else if(flag.equals(SysConstans.SYS_SCAN)){ datas =.scan(datas);// 修改商品
} else if(flag.equals(SysConstans.SYS_UPDATA)){ datas =.upData(datas);// 商品结账
} else if(flag.equals(SysConstans.SYS_RESULT)){ datas =.result(datas);//商品清空
} else if(flag.equals(SysConstans.SYS_CLEAR)){ datas =.clear();}else{ datas.setFlag(SysConstans.SYS_ERROR);} //把datas作为返回值写入客户端 oos.writeObject(datas);oos.flush();socket.shutdownOutput();
} catch(NumberFormatException e){
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch(IOException e){
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch(ClaNotFoundException e){
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally{
//关闭流
try {
oos.close();
ois.close();
socket.close();
} catch(IOException e){
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
System.out.println(“服务器终止服务!”);} }
服务器业务类
package com.supermarket.Server;
import java.util.ArrayList;
import com.supermarket.Tools.Datas;import com.supermarket.Tools.SysConstans;import com.supermarket.entity.Goods;import com.supermarket.entity.User;/** * 服务业务类.* 用来初始化商品列表,创建管理员和收银员对象
* 存放服务器端调用的方法
* @author Administrator * */ public cla ServerService { /**
* 初始化管理员对象和收银员对象
* 管理员对象:用户名:admin 密码:admin
* 收银员对象:用户名:user 密码:user
* 初始化商品列表和购买列表
*/ private static User stockman;//库管对象
private static User cashier;//收银对象
private static ArrayList goodslist=new ArrayList();//商品列表
private static ArrayList buylist=new ArrayList();//购买列表
static{
//初始化库管和收银
stockman=new User();
stockman.setUsername(“1101”);
stockman.setPaword(“1111”);
cashier=new User();
cashier.setUsername(“1001”);
cashier.setPaword(“0000”);
//初始化商品列表
goodslist=new ArrayList();
goodslist.add(new Goods(“1001”, “吉百芝麻油 t”,9.5,“125ml”,200));
goodslist.add(new Goods(“1002”, “雀巢奶香咖啡t”,1.5,“13g”,200));
goodslist.add(new Goods(“1003”, “脉动水蜜桃 t”,7.0,“1.5l”,500));
goodslist.add(new Goods(“1004”, “旺仔苹果Q糖t”,2.5,“70g”,700));
goodslist.add(new Goods(“1005”, “桃李熟切片 t”,6.5,“400g”,150));
goodslist.add(new Goods(“1006”, “白玉黄豆芽 t”,2.4,“350g”,200));
goodslist.add(new Goods(“1007”, “白如内酯豆腐t”,1.0,“400g”,100));} /**
* 登录方法验证客户端传过来的信息,判断登录人员身份
* 管理员,返回管理员标识
* 收银员,返回收银员标识
* 都不是则返回错误标识
* @param datas
* @return
*/ //登录方法.验证是管理员还是收银员登录,如果错误,返回错误标识
public Datas doLogin(Datas datas){
if(datas.getUser().getUsername().equals(stockman.getUsername())&&datas.getUser().getPaword().equals(stockman.getPaword())){
datas.setFlag(SysConstans.SYS_ADMIN);
}else if(datas.getUser().getUsername().equals(cashier.getUsername())&&datas.getUser().getPaword().equals(cashier.getPaword())){
datas.setFlag(SysConstans.SYS_CASHIER);
}else{
datas.setFlag(SysConstans.SYS_ERROR);
}
return datas;
} /**
* 仓库管理员的方法
*/ /**
* 管理员新增商品的方法,* @param datas
* @return
*/ //新增商品
public Datas add(Datas datas){
// TODO 自动生成的方法存根
goodslist.add(datas.getGood());
datas.setFlag(SysConstans.SYS_SUCCESS);// datas.setGoodslist(goodslist);
return datas;} /**
* 管理员商品出库的方法
* 判断商品列表中是否存在,如果存在判断库存是否充足,充足,返回成功标识,并操作商品列表中的数量
* 如果库存不充足,返回缺货标识
* 如果商品列表中没有此商品,返回失败标识
* @param datas
* @return
*/ //出库方法
public Datas down(Datas datas){
// TODO 自动生成的方法存根
for(int i=0;i
if(goodslist.get(i).getGoodid().equals(datas.getGood().getGoodid())){
if(goodslist.get(i).getGoodcount()>=datas.getGood().getGoodcount()){
goodslist.get(i).setGoodcount(goodslist.get(i).getGoodcount()-datas.getGood().getGoodcount());
datas.setGoodslist(goodslist);
datas.setFlag(SysConstans.SYS_SUCCESS);
return datas;
}else{
datas.setFlag(SysConstans.SYS_LACK);
return datas;
}
}
}
datas.setFlag(SysConstans.SYS_ERROR);
return datas;} /**
* 管理员商品入库方法
* 在商品列表中查询到商品的位置,并修改数量
* @param datas
* @return
*/ //入库的方法
public Datas up(Datas datas){
// TODO 自动生成的方法存根
for(int i=0;i
if(goodslist.get(i).getGoodid().equals(datas.getGood().getGoodid())){
goodslist.get(i).setGoodcount(goodslist.get(i).getGoodcount()+datas.getGood().getGoodcount());
datas.setGoodslist(goodslist);
datas.setFlag(SysConstans.SYS_SUCCESS);
return datas;
}
}
return null;} /**
* 管理员按编号查找商品的方法
* 查询到返回成功标识
* 否则返回错误标识
* @param datas
* @return
*/ //按编号查找商品
public Datas find(Datas datas){
// TODO 自动生成的方法存根
for(int i=0;i
if(goodslist.get(i).getGoodid().equals(datas.getGood().getGoodid())){
datas.setFlag(SysConstans.SYS_SUCCESS);
datas.setGood(goodslist.get(i));
return datas;
}
}
datas.setFlag(SysConstans.SYS_ERROR);
return datas;} /**
* 管理员查询全部商品的方法
* @param datas
* @return
*/ //查询全部商品列表的方法
public Datas findAll(Datas datas){
//设置标识为succe,并设置商品列表.返回datas数据
datas.setFlag(SysConstans.SYS_SUCCESS);
datas.setGoodslist(goodslist);
return datas;} /**
* 收银员调用的方法
* @param datas
* @return
*/ /**
* 管理员扫描商品的方法
* 首先查询购买列表中是否存在扫描的商品,如果没有则从商品列表中找到,修改数量后添加到购买列表
* 如果购买列表中存在扫描商品,则数量加1,商品列表中相对应的商品数量-1;
* @param datas
* @return
*/ //管理员扫描商品的方法
public Datas scan(Datas datas){
// TODO 自动生成的方法存根
for(int i=0;i
//如果购买列表中存在商品说明已经扫描过了,数量加一并返回,商品列表中数量-1
if(buylist.get(i).getGoodid().equals(datas.getGood().getGoodid())){
buylist.get(i).setGoodcount(buylist.get(i).getGoodcount()+1);
datas.setFlag(SysConstans.SYS_SUCCESS);
datas.setBuylist(buylist);
goodslist.get(i).setGoodcount(goodslist.get(i).getGoodcount()-1);//
datas.setBuylist(buylist);
return datas;
}
}
//遍历之后如果没有,说明商品还没有扫描,在商品列表中扫描,并加入到购买列表
for(int j=0;j
//如果编号正确,判断数量
if(goodslist.get(j).getGoodid().equals(datas.getGood().getGoodid())){
if(goodslist.get(j).getGoodcount()>0){
//如果商品数量大于1,则扫描成功,把扫描的商品加入购买列表,把商品列表中的数量-1,返回datas.Goods good=new Goods();
good.setGoodid(goodslist.get(j).getGoodid());
good.setGoodname(goodslist.get(j).getGoodname());
good.setGoodprice(goodslist.get(j).getGoodprice());
good.setGoodunit(goodslist.get(j).getGoodunit());
good.setGoodcount(1);
buylist.add(good);
datas.setFlag(SysConstans.SYS_SUCCESS);
datas.setBuylist(buylist);
goodslist.get(j).setGoodcount(goodslist.get(j).getGoodcount()-1);
return datas;
}else{
datas.setFlag(SysConstans.SYS_LACK);
return datas;
}
}
}
datas.setFlag(SysConstans.SYS_ERROR);
return datas;} /**
* 收银员修改商品数量的方法
* 首先在商品列表中找到商品,判断数量是否足够,够则操作数量,返回成功标识
* 不够则返回缺乏标识
* 如果不存在则返回错误标识
* @param datas
* @return
*/ public Datas upData(Datas datas){
// 遍历购买列表得到购买商品id
for(int i=0;i
if(buylist.get(i).getGoodid().equals(datas.getGood().getGoodid())){//得到id判断库存数量是否足够
if(datas.getGood().getGoodcount()
buylist.get(i).setGoodcount(datas.getGood().getGoodcount());
goodslist.get(i).setGoodcount(goodslist.get(i).getGoodcount()+1-datas.getGood().getGoodcount());
datas.setFlag(SysConstans.SYS_SUCCESS);
datas.setBuylist(buylist);
return datas;
}
else{
datas.setFlag(SysConstans.SYS_LACK);
return datas;
}
}
}//遍历购买列表后没找到商品编号,返回错误标识
datas.setFlag(SysConstans.SYS_ERROR);
return datas;} /**
* 收银员返回购买列表的方法
* 如果购买列表不为空,返回列表和成功标识
* 如果为空,返回错误标识
* @param datas
* @return
*/ //产生购买列表用以查询
public Datas result(Datas datas){
// TODO 自动生成的方法存根
if(buylist.size()!= 0){
datas.setBuylist(buylist);
datas.setFlag(SysConstans.SYS_SUCCESS);
return datas;
}
datas.setFlag(SysConstans.SYS_ERROR);
return datas;} /**
* 收银员结账后清空购买列表的方法
* @return
*/ //结账后清空购买列表
public Datas clear(){
// TODO 自动生成的方法存根
buylist.clear();
Datas datas=new Datas();
return datas;} }
传递数据类
package com.supermarket.Tools;/** * 数据类.用来传递数据
* 属性:标识符 flag *
用户
user *
商品
good *
商品列表 goodslist *
购买列表 buylist * 方法:Set和Get方法
*/ import java.io.Serializable;import java.util.ArrayList;
import com.supermarket.entity.Goods;import com.supermarket.entity.User;
public cla Datas implements Serializable { private String flag;//传递对象
private User user;//传递用户
private Goods good;//传递商品
private ArrayList goodslist;//传递的商品列表
private ArrayList buylist;//结账列表
//Set和Get方法
public String getFlag(){
return flag;} public void setFlag(String flag){
this.flag = flag;} public User getUser(){
return user;} public void setUser(User user){
this.user = user;} public Goods getGood(){
return good;}
public void setGood(Goods good){
this.good = good;} public ArrayList getGoodslist(){
return goodslist;} public void setGoodslist(ArrayList goodslist){
this.goodslist = goodslist;} public ArrayList getBuylist(){
return buylist;} public void setBuylist(ArrayList buylist){
this.buylist = buylist;}
} 常量列表类
package com.supermarket.Tools;/**
* 常量列表类.用来存放常量
* @author Administrator * */
public cla SysConstans {
public static final String SYS_PROPERTYNAME =“sys.properties”;public static final String SYS_LISTENERPORT =“PORT”;public static final String SYS_HOSTNAME =“HOST”;public static final String SYS_SUCCESS =“SUCCESS”;public static final String SYS_ERROR =“ERROR”;public static final String SYS_LOGIN =“LOGIN”;//添加一个 管理员常量
public static final String SYS_ADMIN=“ADMIN”;//添加一个收银常量
public static final String SYS_CASHIER= “CASHIER”;;//查询商品
public static final String SYS_FIND =“FIND”;//查询所有
public static final String SYS_FINDALL =“FINDALL”;//添加一个入库常量
public static final String SYS_RUKU =“RUKU”;//添加一个出库常量
public static final String SYS_CHUKU =“CHUKU”;//添加一个添加常量
public static final String SYS_ADD=“ADD”;//商品扫描
public static final String SYS_SCAN=“SCAN”;//修改商品数量
public static final String SYS_UPDATA=“UPDATA”;
//删除商品
public static final String SYS_DELETE =“DELETE”;//商品结账
public static final String SYS_RESULT = “RESULL”;//商品清空
public static final String SYS_CLEAR = “CLEAR”;//库存缺乏
public static final String SYS_LACK = “LACK”;
}
工具类
package com.supermarket.Tools;/** * 工具类.用来调用常量
*/ import java.io.IOException;import java.util.Properties;public cla Tools { private static Properties p= new Properties();
//读取properties配置文件信息
static {
//加载资源文件
try {
p.load(Tools.cla.getClaLoader().getResourceAsStream(SysConstans.SYS_PROPERTYNAME));
} catch(IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//通过关键字取值
public static String getVlaue(String key){
return p.getProperty(key);
} } 资源文件
HOST=localhost PORT=8888