团队介绍
成员姓名 | 负责任务 |
---|---|
杨涛 | 编码规范、GUI设计及代码编写 |
吴执涛 | DAO接口及文件读写方法编写 |
蔡锦涛 | 前期调查与功能设计、货物操作类、博客制作 |
Git地址
前期调查
用户首先通过输入账号密码登录账号,随后在商场中浏览商品,并将心仪的商品添加到购物车中,在购物车中可以将商品的数量增加或减少,且可以删除商品。
由以上可知,购物车应大概拥有这些功能:
1.设计一个小商城,为了更加灵活,我们将商城设置成自由添加商品。
2.购物车可以随意添加或删除商品,增加或减少商品数量
3.可以清空或结算购物车
程序运行效果
登录注册:
商品栏添加商品:
商品栏删除商品:
在购物车中添加商品:
删除购物车中的商品:
在购物车中增加商品数量:
在购物车中减少商品数量:
清空购物车:
结算购物车:
系统功能结构图
系统描述
点击运行购物车软件,输入账号和密码,或者直接注册一个账号。登录成功后进入主界面,主界面包含商城和购物车两个模块。在商城中,可以自行填入商品名称和单价并把商品添加进商城,也可以从商城中删除商品,遇到心仪的商品可以加入购物车。在购物车中,可以修改商品数量,也可以直接删除商品,或者清空购物车将商品全都删除,最后可以结算购物车,计算总价格。
UML类图
MVC模式
MVC模式简述
MVC模式中,M指Model(业务模型),V指View(视图),C指Controller(控制器),其中Controller也就是事件监听器。就让我们拿
MVC模式的好处:
1.代码耦合度低。每个模块各司其职,M、V、C分别负责不同的功能,对界面的操作代码和业务逻辑代码之间分离。
2.可以做到分层开发。编写业务逻辑代码的程序员不用考虑界面操作,编写控制器的只需要处理与view交互的数据,并选择合适的业务逻辑代码处理数据即可。
3.扩展性和可维护性高。由于各功能模块之间代码分离,修改某部分代码时只要处理好接口,就不会影响到其他代码。
MVC模式在程序中的体现
就让我们拿在 商品栏添加商品 来举例。
MVC分为Model, View, Controller。其中Controller即为监听器,即上图中的addActionPerformed,当用户输入完商品名称和单价,并点击添加按钮,就会触发Controller,Controller就会从nameText,priceText获取信息,即从视图层获取信息,创建DefaultTableModel对象存放goods模型,然后将获取到的信息添加到模型里,并更新视图,同时存放到本地文档里。
DAO模式
DAO模式,是将业务逻辑与数据的具体访问相分离的一种模式,它可以根据后台数据存储方式的不同,定义不同的实现方法。例如,编写GUI相关代码时,无需考虑数据操作的具体实现方法,只需要调用相应DAO方法。如果底层数据存储方式需要改变,只要增加DAO接口的新实现类即可,有利于不同人员的分工合作,提高效率。
项目包结构和关键代码
包结构
将对界面操作的代码和业务逻辑代码相分离,分成两个包,分别为gui和shopping
关键代码
把商品添加到购物车中:
public int putIn(Product p) {
Entry e = new Entry(p);
int flag = 0;
int index = -1;
if (this.list.size() == 0) {
this.list.add(e);
} else {
for (int i = 0; i < this.list.size(); i++) {
Entry x = this.list.get(i);
if (p.equals(x.getP())) {
x.setCount(x.getCount() + 1);
x.setTotalPrice(x.getTotalPrice() + p.getPrice());
this.list.set(i, x);
index = i;
flag = 1;
}
}
if (flag == 0) {
this.list.add(e);
}
}
return index;
}
在商品栏中删除商品:
private void deleteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteActionPerformed
// TODO add your handling code here:
DefaultTableModel model = (DefaultTableModel) goods.getModel();
int[] selectRows = goods.getSelectedRows();
for (int i = selectRows.length - 1; i >= 0; i--) {
int selectRow = selectRows[i];
if (selectRow != -1) {
model.removeRow(selectRow);
}
}
String[] name=new String[goods.getRowCount()];
Double[] price=new Double[goods.getRowCount()];
TableModel model1 = goods.getModel();
for (int i = 0; i <goods.getRowCount() ; i++) {
name[i]=(String)model1.getValueAt(i,0);
price[i]=(Double)model1.getValueAt(i,1);
}
try {
deleteGoods(name,price);
} catch (IOException e) {
e.printStackTrace();
}
}
读取本地文件到商品栏:
private boolean readGoods() throws FileNotFoundException, IOException {
DefaultTableModel model = (DefaultTableModel) goods.getModel();
String pathName = ".\goods.txt";
if (System.getProperty("os.name").equals("Mac OS X")) {
pathName = "./goods.txt";
}
File f = new File(pathName);
if (!f.exists()) {
try {
f.createNewFile();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
try (FileReader reader = new FileReader(pathName);
BufferedReader br = new BufferedReader(reader) ){
String line1, line2;
while ((line1 = br.readLine()) != null) {
if(line1.equals(""))
break;
line2 = br.readLine();
String name = line1;
Double price = Double.parseDouble(line2);
Object[] o = {name, price};
model.addRow(o);
}
} catch (IOException e) {
e.printStackTrace();
}
return true;
}