该商超管理系统是为了能够帮助超市进行更加有效的人员管理,更加高效的完成购物结算以及库存管理,使用Java来模拟设计该系统统一进行商品信息和职员信息的管理,大大降低人工和时间成本。该系统在之前学习的java知识体系中运用到文件流、面向对象、集合、泛型等诸多知识,是一个知识更加综合运用的小项目。
对该系统进行功能需求分析,该系统是应用于小型超市,需要满足超市以下的基本功能:1.对日常商品信息的维护功能(对商品进行增删改查),2.对购买商品后的结算收银功能,3.对商品当日销量和总收入进行统计和管理,4.对超市工作人员进行管理(对工作人员进行增删改查)。
现在就对系统中的各个主要对象类进行设计:
1.Menu 类:菜单类定义了菜单的选择菜单的返回等操作。
2.Market 类:商超类定义了商品、管理员存放的集合。
3.Manager 类:管理员类,定义了管理员的增删改查及收银等操作。
4.Goods 类:商品类定义了商品的增删改及各种查询方式。
5.DataManager 类,定义了读取写入数据的方法。
6.其他类:加密工具类MD5Util,测试类TestMarket,当日商品销售类 DailySales。
设计好系统各类后,接下来简述一下实现思路和具体的功能实现。首先由于本次系统没有使用到数据库,所以数据还是使用文件进行存储,在项目中新建存储系统人员信息的manager.txt文件,存储商品信息的goods.txt文件以及存储当天销售的商品信息todaysales.txt文件。在启动程序的同时需要把manager.txt文件和goods.txt文件里存储的信息读取到对应的List<Manager> manager管理员集合和List<Goods> goods商品集合中为后续的操作奠定数据基础,但我设计的文件中初始都为空(即使为空也需要读取,预防里面已经存有数据),然后就调用菜单类进入菜单界面。程序代码顺序如图:
登录系统之前需要做一个小操作,因为之前的manager.txt文件中没有任何数据,默认没有数据的情况下创建一个用户名为:admin ;密码为:admin 的管理员权限级别的用户作为超级管理员。实现逻辑如图:
接下来展现登录界面,让用户进行登录,输入自己的用户名和密码,用户名或密码3次输入错误将强制退出系统。效果展示如下:
输入正确的用户名和密码,进入到主菜单显示界面。效果展示如下:
进入主菜单后根据功能进行选择,此处也有一个细节需要注意:只有管理员才有权限对所有功能进行操作,而普通收银员只有前台收银的功能,所以在选择后需要对当前登录用户的权限进行判断,权限足够才能进入相关功能界面。目前我添加了一个用户名为spring的收银员权限的员工,让他选择商品维护功能是不能进入的。效果展示如下:
为了演示其他功能还是使用超级管理员权限进行登录操作,现在逐一介绍商品维护、前台收银、商品管理、员工管理这四个功能包含的具体实现。选择1进入商品维护界面,该界面下具有添加商品、更改商品、删除商品、显示所有商品、查询商品这5个功能。效果展示如下:
这里面的商品的增删改查最核心的就是根据控制台的输入匹配到对应的商品对象,并在容器集合中调用方法进行操作。以更改商品功能作为展示,控制台输入要进行更改的商品名称,通过把商品名称传入findGood(name)中,返回一个商品对象,之后对该对象进行判断是否为空,如果不为空就对该商品进行更改操作,可以选择更改商品的数量、名称及价格,更改成功重新添加到集合容器并写入文件中保存,其他几个功能可以自行模仿。效果展示如下:
更改商品核心功能代码:
// 更新商品
public static void updateGoods() {
while (true) {
System.out.println("执行更改商品操作:");
System.out.println("输入更改商品的名称:");
String name = SC.next();
//根据商品名称找到集合中的具体对象
Goods good = findGood(name);
if(good != null) {
showInfo(name);
System.out.println("请选择你要更改的内容:");
System.out.println("1.更改商品名称:");
System.out.println("2.更改商品价格:");
System.out.println("3.更改商品数量:");
int command = SC.nextInt();
switch (command) {
case 1:
System.out.println("请输入已更改商品名称:");
String newShopName = SC.next();
// 修改商品名称
good.setName(newShopName);
System.out.println("修改成功!");
showInfo(newShopName);
break;
case 2:
System.out.println("请输入已更改商品价格:");
double newPrice = SC.nextDouble();
good.setPrice(newPrice);
System.out.println("修改成功!");
break;
case 3:
System.out.println("请输入已更改商品数量:");
int newNumber = SC.nextInt();
good.setStorage(newNumber);
System.out.println("修改成功!");
break;
default:
System.out.println("输入错误,请重新输入");
}
}
DataManage.writeFile("goods",good);
if(good == null){
System.out.println("没有找到该商品的信息");
return;
}
System.out.println("是否继续(y/n)");
String input = SC.next();
switch (input) {
case "y":
break;
default:
return;//回到菜单1
}
}
}
选择2进入前台收银界面,该界面下只有购物收银和退出收银这2个功能。效果展示如下:
购物结算顾名思义就是根据顾客购买的商品数量和价格进行金额计算并收银的操作。根据用户的商品名称和数量,查找该商品对象如果不为空就对进行结算收银操作,金额等于商品单价*商品数量(若有多个不同商品金额累加),结算后让对应商品库存数量减少卖出数量:(g.getStorage() - buyNum),该销售量增加卖出数量: g.setSale(g.getSale() + buyNum),并把当前卖出时间记录一起写入到当日销量todaysales文件中保存起来。效果展示如下:
购物结算核心功能代码:
// 购物结算
public static void pay() {
while (true) {
System.out.print("请选择商品:");
String shopName = SC.next();
System.out.print("请输入购买数量:");
int buyNum = SC.nextInt();
Goods g = findGood(shopName);
if(g != null) {
double price = 0;
price += buyNum * g.getPrice();
System.out.println(shopName + "\t\t\t\t\t¥" + g.getPrice() + "\t\t\t\t\t购买数量" + buyNum + "\t\t\t\t\t" +
shopName + "总价" + price);
g.setStorage(g.getStorage() - buyNum);
g.setSale(g.getSale() + buyNum);
Date time = new Date();
String nowTime = Format(time);
g.setTime(nowTime);
// 把更新后的数据写入文件中
DataManage.writeFile("goods",g);
DataManage.writeFile("todaysales",g);
System.out.println("是否继续购买(y/n)");
String input = SC.next();
switch (input) {
case "y":
break;
default:
System.out.println("总计:" + price);
System.out.println("请输入实际缴费金额:");
double money = SC.nextDouble();
// 判断金额是否足够
if(money >= price){
System.out.println("找钱:" + (money - price));
System.out.println("谢谢光临!");
return;
}
if(money < price){
System.out.println("总价:" + price + "元" + "客户已付" + money + "客户应补" + (price - money) + "元");
return;
}
}
}
if(g == null){
System.out.println("该商品不存在");
}
}
}
选择3进入商品管理界面,该界面下只有展示今日售出商品和收银情况这个功能。效果展示如下:
展示数据其实就是去读取对应文件中的数据封装成对象后展示,今日售出商品和收银情况功能最重要的就是判断数据中存放的时间和当前查看时间的时间跨度是否在一天之类,取出todaysales文件中商品售出是的时间字符串与当前的时间对象进行比较。
商品管理核心功能代码:
// 商品管理
public static void manageGoods() {
System.out.println("今日售出商品情况:");
// 查看前读文件
DataManage.readFile("todaysales");
double money = 0;
int totalSales = 0;
System.out.println("商品名称\t\t\t\t\t" + "商品价格\t\t\t\t\t" + "商品数量\t\t\t\t\t" + "销量\t\t\t\t\t" + "备注");
for (DailySales ds : Market.dailySales) {
//判断是否是当天
String day = ds.getTime().split("-")[2];
Date time = new Date();
String s = Format(time).split("-")[2];
if(day.equals(s)) {
//说明都是当日售出的商品
System.out.println(day);
System.out.println(ds.getName() + "\t\t\t\t\t" + ds.getPrice() + "\t\t\t\t\t" +
ds.getStorage() + "\t\t\t\t\t" + ds.getSale() + (ds.getStorage() < 10 ? "\t\t\t\t\t*库存不足10件!" : ""));
}
money += ds.getPrice()*ds.getSale();
totalSales += ds.getSale();
System.out.println( "今日总销量:" + totalSales);
System.out.println("今日收银:" + money);
}
}
选择4进入员工管理界面,该界面下有添加员工信息、更改员工信息、删除员工信息、显示所有员工信息、查询员工这5个功能。效果展示如下:
这里面的员工的增删改查最核心的就是获取到对应的Manager对象,并在容器集合中调用方法进行操作。以添加员工功能作为展示,管理员控制台输入新添加的员工姓名,密码默认同一设置为123,权限默认设置为收银员,把这些属性封装到manager容器集合中并把数据写入到manager.txt文本文件中进行保存,其他功能大同小异,可借鉴此操作。
添加员工信息核心功能代码:
// 添加员工
public static void addStaff(){
while (true) {
System.out.println("请输入新员工的姓名:");
String userName = SC.next();
String pass = "123";
pass = MD5Util.MD5ToString(pass);
String roleId = "2";
Manager m = new Manager(userName,pass,roleId);
Market.manager.add(m);
System.out.println("员工添加成功");
DataManage.writeFile("manager",m);
System.out.println("是否继续(y/n)");
String input = SC.next();
switch (input) {
case "y":
break;
default:
return;//回到调用处
}
}
}
到这里此次的商超管理系统的分享就到此结束了,希望学习的人都能学有所成,在技术方面愈加精进,代码之路没有捷径,熟能生巧,实践出真知!
标签:SC,Java,管理系统,更改,System,商品,商超,println,out From: https://blog.51cto.com/u_15101214/6388856