当前位置:首页 > 图书进销存系统(CS)
第9章 图书进存销系统
ImageIO.write(bi2, formatName, new FileOutputStream(output)); return output; }
//返回一个Image对象,当参数bi的宽比高大的时候,使用最大的宽来压缩图片。 //当参数bi的高比宽大的时候,使用最大的高来压缩图片
private static Image getImage(BufferedImage bi) { if (bi.getWidth() > bi.getHeight()) { return bi.getScaledInstance(MAX_WIDTH, -10, Image.SCALE_AREA_AVERAGING); } else { return bi.getScaledInstance(-10, MAX_HEIGHT, Image.SCALE_AREA_AVERAGING); } }
//生成uuid,作为上传的文件名 public static String getUUID() { UUID uuid = UUID.randomUUID(); return uuid.toString(); }
·33·
注意以上代码的黑体部分,当不需要进行压缩处理的时候,直接使用ImageIO输出图像流到新的url中,此处的url可以是相对路径。如果需要进行压缩,那么必须要确定压缩后的图片的高和宽,因此以上代码中的getImage方法返回压缩后的Image对象。下面编写一个文件选择器的类,处理用户选择文件。
代码清单:code\\book\\src\\org\\crazyit\\book\%ui\\BookPanel.java
class FileChooser extends JFileChooser { //书本管理界面对象 }
BookPanel bookPanel;
public FileChooser(BookPanel bookPanel){ this.bookPanel = bookPanel; }
//选择了文件后触发
public void approveSelection() { File file = getSelectedFile();//获得选择的文件 this.bookPanel.upload(file); //调用书本管理界面对象的upload方法 }
super.approveSelection();
以上代码的黑体部分,使用书本管理界面对象的upload方法,以下是upload方法的实现。 代码清单:code\\book\\src\\org\\crazyit\\book\%ui\\BookPanel.java
//上传图片
public void upload(File selectFile) { String uuid = ImageUtil.getUUID();//使用uuid生成文件名,保证文件名唯一 String smallFilePath = \缩略图的url String bigFilePath = \原图的url File file = ImageUtil.makeImage(selectFile, smallFilePath, \生成缩略图 File source = ImageUtil.makeImage(selectFile, bigFilePath, \生成原图 this.currentImage = new ImageIcon(file.getAbsolutePath());//设置界面显示的图片对象 this.currentImagePath = smallFilePath; //设置界面显示的图片url refreshImage();//刷新图片显示区 }
upload方法中,需要生成两张图片,一张是原图的副本,与原图一致,另外一张是缩略图,缩略图
的高和宽都不大于图片显示区的高和宽。显示可以试下图片上传的功能,如图9.10所示。
·34· 第9章 图书进存销系统
图9.10 图片上传功能
如果需要浏览原图,可以为图片显示区的JLabel添加监听器,当点击了该JLabel时,弹出一个JFrame,显示对应图片的原图。
到此,书本的新增功能已经实现,书本的修改功能与出版社的修改功能一样,图片的上传与显示功能与书本的新增功能一样,在此不再赘述。
9.7 销售管理功能
销售管理功能,交互方式与前面几小节的功能类似,但是在表单处理的时候就有所不同,由于一条销售记录可能涉及多本书,因此,在表单中需要有书本交易记录的列表。另外,在为书本交易记录列表增加或者删除一条记录的时候,系统还要为总价和购买数量进行计数量,并显示到相应的地方。当保存销售记录的时候,就需要先保存销售记录,再逐条保存书的销售记录。
9.7.1 销售记录列表
查询所有的销售记录,与前面的类似,不同的地方就是查出结果集合后,需要对该集合进行处理,在9.6书本管理功能中,查出所有的书本后,还需要根据书本的外键设置书本对象(Book)的两个关联对象(Type和Concern)。而在销售管理中,我们还需要为销售记录计算此次交易的总价、交易的书本名称和交易总量。
第9章 图书进存销系统 ·35·
为SaleRecord添加属性:
//销售的总数量 private int amount; //总价钱
private double totalPrice; //书的销售记录
private Vector
为SaleRecord添加几个属性,分别是销售总数量、交易金额、书的交易记录和各本书的名称。各本书的名称字符串,多本书之间使用逗号隔开。剩下的事,就是在业务层对查出来的SaleRecord进行处理,设置我们新增的几个属性。在编写SaleRecord的业务层时,需要在书本交易记录的数据访问层中新加一个方法,根据交易记录的id查找到对应的书本交易记录集合。
代码清单:code\\book\\src\\org\\crazyit\\book\\dao\\impl\\BookSaleRecordDaoImpl.java
public class BookSaleRecordDaoImpl extends CommonDaoImpl implements BookSaleRecordDao { //根据销售记录id获得书的销售记录集合 }
public Collection
以上方法,就可以获得一次交易记录中所有的书的交易记录,同样的也可以取得交易记录中所涉及的书,接下来实现销售记录的业务层。
代码清单:code\\book\\src\\org\\crazyit\\book\\service\\impl\\SaleRecordServiceImpl.java
//实现接口方法
public Collection
Date nextDate = DateUtil.getNextDate(date); //得到今天的日期, 格式为yyyy-MM-dd String today = DateUtil.getDateString(date); //得到明天的日期, 格式为yyyy-MM-dd
String tomorrow = DateUtil.getDateString(nextDate); Collection
//处理一个SaleRecord, 设置它的书本销售记录属性和书本名字属性 private SaleRecord processDatas(SaleRecord r) { //查找该记录所对应的书的销售记录
Collection
setBook(brs);
//设置SaleRecord对象中的书的销售记录集合
r.setBookSaleRecords((Vector
·36·
第9章 图书进存销系统
r.setBookNames(getBookNames(brs)); //设置数量与总价
r.setAmount(getAmount(brs)); r.setTotalPrice(getTotalPrice(brs)); return r; }
//获取一次交易中涉及的总价
private double getTotalPrice(Collection
int tradeSum = Integer.valueOf(br.getTRADE_SUM()); //书的单价
double bookPrice = Double.valueOf(br.getBook().getBOOK_PRICE()); result += (bookPrice * tradeSum); } return result; }
//获取一次交易中所有书本的交易量
private int getAmount(Collection
//设置参数中的每一个BookSaleRecord的book属性 private void setBook(Collection
//获取一次交易中所有书本的名字, 以逗号隔开
private String getBookNames(Collection
return result.substring(0, result.lastIndexOf(\
以上代码中的getTotalPrice方法用于得到一次交易的价格;getAmount方法用于得到一次交易的书本总数;setBook方法用于设置书本销售记录对象(BookSaleRecord)中的book属性,当然,在那之前要为BookSaleRecord类添加book属性;getBookNames方法是将所有交易中涉及的书本的名称集合起来,用逗号隔开。这样,获取全部的交易记录时,得到的每一个交易记录对象(SaleRecord),
共分享92篇相关文档