商品信息管理系统

目 录

  1. 系统分析 1
    1.1. 系统总体结构 1

  2. 系统设计 3
    2.1. 概要设计(E-R 图) 3
    2.2. 逻辑设计(关系模型) 3
    2.3. 物理设计(数据库表) 4
    2.3.1. 用户表(user) 4
    2.3.2. 商品表(goods) 4
    2.3.3. 商品交易表(goods_transaction) 4
    2.3.4. 仓库表(ware) 4

  3. 系统实现 5
    3.1. 登陆注册 5
    3.2. 商品信息 7
    3.3. 用户信息 11
    3.4. 入库信息 13
    3.5. 商品交易操作 15

  4. 系统测试 17
    4.1. 登陆注册 17
    4.2. 商品信息 19
    4.3. 用户信息 23
    4.4. 入库信息 25
    4.5. 商品交易操作 29

  5. 系统分析
    1.1. 系统总体结构
    有五个模块:登陆注册,商品信息,用户信息,入库信息,商品交易操作。
    项目目录结构:
    Dao:执行数据库语句,进行增删查改。
    Entity:实例类,包含四个对象:用户信息, 商品基本信息,商品交易信息,商品入库。
    Panel:JavaGUI页面显示,对数据库的基本逻辑处理。
    Util:公用的方法包。

图 1.1 系统总体结构图

图 1.2 项目目录

  1. 系统设计
    2.1. 概要设计(E-R 图)

图 2.2 系统 E-R 图
2.2. 逻辑设计(关系模型)
(1) 用户(用户 ID,用户名,密码), 其中“用户 ID”是主键;
(2) 商品基本信息(商品 ID,商品名称,售价,单位,类别),其中,“商品ID”是主键;
(3) 商品交易信息(交易 ID,商品 ID,交易商品名,售价,数量,单位,金额),其中,“交易 ID”是主键,“商品 ID”是外键。
(4)商品入库(仓库 ID,商品ID,数量,时间,用户 ID),其中,“仓库 ID”是主键,“商品 ID”、“用户 ID”是外键。
2.3. 物理设计(数据库表)
2.3.1. 用户表(user)
字段 数据类型 是否为空 是否为主键 其他约束 描述
id int 否 是 无 用户 ID
user_name varchar 否 否 无 用户名
password varchar 否 否 无 密码
2.3.2. 商品表(goods)
字段 数据类型 是否为空 是否为主键 其他约束 描述
id int 否 是 无 商品 ID
goods_name varchar 否 否 无 商品名称
price double 否 否 无 售价
unit varchar 否 否 无 单位
category_id varchar 否 否 无 类别
2.3.3. 商品交易表(goods_transaction)
字段 数据类型 是否为空 是否为主键 其他约束 描述
id int 否 是 无 商品交易ID
goods_id int 否 否 外键 商品 ID
goods_name varchar 否 否 无 商品名称
price double 否 否 无 售价
unit varchar 否 否 无 单位
money double 否 否 无 金额
2.3.4. 仓库表(ware)
字段 数据类型 是否为空 是否为主键 其他约束 描述
id int 否 是 无 商品交易ID
goods_id int 否 否 外键 商品 ID
goods_number int 否 否 无 商品名称
time timestamp 否 否 无 时间
user_id int 否 否 外键 用户 ID
3. 系统实现
3.1. 登陆注册
(1) 效果截图

图 3.1 登录注册面板
(2) 核心代码
*********************** 代码3.1.1 GoodsLoginPanel .java 部分代码**************************
private User setUser() {
String userName=userNameText.getText();
if(userName.length()<1) {
JOptionPane.showMessageDialog(null, “姓名不能为空”);
return null;
}
String pwd=passwordText.getText();
if(pwd.length()<1) {
JOptionPane.showMessageDialog(null, “密码不能为空”);
return null;
}
User user=new User(null,userName,pwd);
return user;
}

public void loginUser() {
	User u = setUser();
	if(u==null)return;
	User uFind =userDao.findUser(u.getUserName(),u.getPassword());
	if(uFind==null) {
		JOptionPane.showMessageDialog(null, "登录失败,该用户不存在或者密码错误.");
	}else{
		System.out.println("success login");
		new SimpleGoodsPanelApp(uFind.getId());
		setVisible(false);
	}
}
private void reginsterUser() {
	User u = setUser();
	if(u==null)return;
	String pwd=u.getPassword();
	String userName=u.getUserName();
	if(userDao.findByName(userName)){
		JOptionPane.showMessageDialog(null, "用户名已存在,请换一个。");
		return;
	}
	pwd=EnCryptStr.EnCrypt(pwd);//密码加密
	User user=new User(null,userName,pwd);
	if(userDao.add(user)) {
		JOptionPane.showMessageDialog(null, "注册成功,请登录。");
	}else{
		JOptionPane.showMessageDialog(null, "注册失败.");
	}
}

************************* 代码3.1.2 EnCryptStr.java 部分代码*****************************
//加密后的串
public static String EnCrypt(String str) {
char list[]=str.toCharArray(),c;
if(CheckString.isDigit(str))return EnCrypt(numberStr,numberStrRandom,list);
if(CheckString.isLetter(str))return EnCrypt(letterStr,letterStrRandom,list);

	char listN[]=new char[list.length];
	StackByArray<Character> all=new StackByArray<Character>(list.length);
	for(int i=0;i<list.length;i++) {
		if(Character.isDigit(list[i])) {
			c=EnCrypt(numberStr,numberStrRandom,list[i]);
			all.push(c);
		}else if(Character.isLetter(list[i])) {
			c=EnCrypt(letterStr,letterStrRandom,list[i]);
			all.push(c);
		}else {
			all.push(list[i]);
		}
	}
	for(int i=list.length-1;i>=0;i--) {
		listN[i]=all.pop();
	}
	return String.valueOf(listN);
}

注:该代码运用了串和栈的功能。
3.2. 商品信息
(1) 效果截图

图 3.2 商品信息
(2) 核心代码
************************ 代码3.2.1 GoodsQueryPanel.java 部分代码**************************
public void setCurrentGoods(int index){
if(index<0 || index>(listmode.size()-1))
resultlist.setSelectedIndex(listmode.size()-1);
else
resultlist.setSelectedIndex(index);
}
public Goods getCurrentGoods(){
int index=resultlist.getSelectedIndex();
Goods s=null;
if(index>=0){
s=listmode.getElementAt(index);
}
return s;
}

protected void queryDesc() {
	ArrayList<Goods> list=goodsDao.findAllByName("");
	Goods temp;
	int len=list.size();
	int i,j;
	for(i=0;i<len-1;i++) {
		for(j=0;j<len-1-i;j++) {
			if(list.get(j).getPrice()<list.get(j+1).getPrice()) {
				temp=list.get(j+1);
				list.set(j+1,list.get(j));
				list.set(j,temp);
			}
		}
	}
	query(list);
}
protected void queryAsc() {
	ArrayList<Goods> list=goodsDao.findAllByName("");
	Goods temp;
	int len=list.size();
	int i,j;
	for(i=0;i<len-1;i++) {
		for(j=0;j<len-1-i;j++) {
			if(list.get(j).getPrice()>list.get(j+1).getPrice()) {
				temp=list.get(j+1);
				list.set(j+1,list.get(j));
				list.set(j,temp);
			}
		}
	}
	query(list);
}
private void queryById(String str) {
	Goods goods=goodsDao.findById(str);
	listmode.clear();
	if(goods==null){
		Goods temp=new Goods();
		temp.setGoodsName("没有符合条件数据");
		listmode.addElement(temp);
		return;
	}
	listmode.addElement(goods);
}
public void queryByCId(String str) {
	query(goodsDao.findAllByCid(str));
}
public void query(String str) {
	query(goodsDao.findAllByName(str));
}
public void query(ArrayList<Goods> bag) {
	listmode.clear();
	if(bag==null){
		Goods temp=new Goods();
		temp.setGoodsName("没有符合条件数据");
		listmode.addElement(temp);
		return;
	}
	Iterator<Goods> i=bag.iterator();
	while(i.hasNext()){
		Goods t=i.next();
		listmode.addElement(t);
	}
}

注:该代码运用了冒泡排序的功能。
*********************** 代码3.2.2 GoodsMainPanel.java 部分代码****************************
public void showGoods(Goods s){
if(s!=null) {
goodsNameText.setText(s.getGoodsName());
priceText.setText(String.valueOf(s.getPrice()));
unitText.setText(s.getUnit());
categoryIdText.setText(s.getCategoryId());
}
}

public void clearText(){
	querypane.query("");
	goodsNameText.setText("");
	priceText.setText("");
	unitText.setText("");
	categoryIdText.setText("");
}

private Goods setGoods() {
	String goodsName=goodsNameText.getText();
	if(goodsName.length()<1) {
		JOptionPane.showMessageDialog(null, "商品名不能为空");
		return null;
	}
	String price=priceText.getText();
	if(price.length()<1) {
		JOptionPane.showMessageDialog(null, "价格不能为空");
		return null;
	}else if(!(CheckString.isDouble(price)||CheckString.isInt(price))) {
		JOptionPane.showMessageDialog(null, "输入的价格("+price+")有误,请填写数字!");
		return null;
	}
	String unit=unitText.getText();
	if(unit.length()<1) {
		JOptionPane.showMessageDialog(null, "单位不能为空");
		return null;
	}
	String categoryId=categoryIdText.getText();
	return new Goods(goodsName,Double.parseDouble(price),unit,categoryId);
}
public void addGoods(){
	Goods s=setGoods();
	if(s==null)return;
	if(s!=null) isSuccess(goodsDao.add(s),"添加",s.getGoodsName());
}
public void updateGoods(){
	Goods g=(Goods) querypane.getCurrentGoods();//得到当前选中的信息
	if(g==null) {
		JOptionPane.showMessageDialog(null, "请在列表框选择你要修改的商品");
		return;
	}
	Goods s=setGoods();
	if(s==null)return;
	s.setId(g.getId());
	isSuccess(goodsDao.update(s),"修改",s.getGoodsName());
}

public void delGoods(){
	Goods s=(Goods)querypane.getCurrentGoods();
	if(s==null) {
		JOptionPane.showMessageDialog(null, "请在列表框选择你要删除的商品车信息");
		return;
	}
	String id=s.getId();
	isSuccess(goodsDao.deleteById(id),"删除",s.getGoodsName());
}
private void isSuccess(boolean b,String type,String name) {
	if(b) {
		JOptionPane.showMessageDialog(null, "成功"+type+"了"+name+"的商品信息");
		querypane.query("");
	}else{
		JOptionPane.showMessageDialog(null, name+"的商品信息"+type+"失败");
	}
}

3.3. 用户信息
(1) 效果截图

图 3.3 用户信息
(2) 核心代码
*********************** 代码3.3.1 UserPanel.java 部分代码***************************
private void showUser(String id) {
user=userDao.findById(id);
userNameText.setText(user.getUserName());
passwordText.setText(user.getPassword());
}

private void updateUser() {
	String userName=userNameText.getText();
	if(userName.length()<1) {
		JOptionPane.showMessageDialog(null, "姓名不能为空");
		return;
	}
	String pwd=passwordText.getText();
	if(pwd.length()<1) {
		JOptionPane.showMessageDialog(null, "密码不能为空");
		return;
	}
	if(user.getUserName().equals(userName)){//全局变量
		JOptionPane.showMessageDialog(null, "未修改姓名。");
		return;
	}else if(userDao.findByName(userName)){
		JOptionPane.showMessageDialog(null, "用户名已存在,请换一个。");
		return;
	}
	pwd=EnCryptStr.EnCrypt(pwd);//密码加密
	User user=new User(null,userName,pwd);
	if(userDao.add(user)) {
		JOptionPane.showMessageDialog(null, "修改成功。");
	}else{
		JOptionPane.showMessageDialog(null, "修改失败.");
	}
}

3.4. 入库信息
(1) 效果截图

图 3.4 入库信息
(2) 核心代码
************************* 代码3.4.1 WareMainPanel .java 部分代码**************************
public void clearText(){
querypane.query(“”);

	goodsIdText.setText("");
	goodsNumberText.setText("");
}

private Ware setWare() {
	String goodsId=goodsIdText.getText();
	if(goodsId.length()<1) {
		JOptionPane.showMessageDialog(null, "商品id不能为空");
		return null;
	}
	if(new GoodsDao().findById(goodsId)==null) {
		JOptionPane.showMessageDialog(null, "商品id不存在,请到前一个面板“商品信息”里面查找存在的商品或者创建一个新的商品。");
		return null;
	}
	String number=goodsNumberText.getText();
	if(number.length()<1) {
		JOptionPane.showMessageDialog(null, "数量不能为空");
		return null;
	}else if(!CheckString.isInt(number)) {
		JOptionPane.showMessageDialog(null, "输入的价格("+number+")有误,请填写整数!");
		return null;
	}
	return new Ware(goodsId,Integer.parseInt(number),userId);
}

protected void addWare() {
	Ware s=setWare();
	if(s==null)return;
	if(wareDao.findByGoodsId(s.getGoodsId())!=null) {
		JOptionPane.showMessageDialog(null, "商品id("+s.getGoodsId()+")已入库,请修改。");
		return;
	}
	if(s!=null) {
		isSuccess(wareDao.add(s),"添加");
	}
}

protected void updateWare() {
	Ware w=(Ware) querypane.getCurrentWare();//得到当前选中的信息
	checkMess(w,"修改");
	Ware s = setWare();
	if(s==null)return;
	s.setId(w.getId());
	isSuccess(wareDao.update(s),"修改");
}

protected void delWare(){
	Ware s=(Ware)querypane.getCurrentWare();
	if(s==null)return;
	checkMess(s,"删除");
	String id=s.getId();
	isSuccess(wareDao.deleteById(id,userId),"删除");
}

private void checkMess(Ware s,String str) {
	if(s==null) {
		JOptionPane.showMessageDialog(null, "请在列表框选择你要"+str+"的商品车信息");
		return;
	}
	if(!s.getUserId().equals(userId)) {
		JOptionPane.showMessageDialog(null, "你不是的商品仓库的操作人,不可"+str);
		return;
	}
}

private void isSuccess(boolean b,String type) {
	if(b) {
		JOptionPane.showMessageDialog(null, type+"成功");
			querypane.query("");
	}else{
		JOptionPane.showMessageDialog(null,type+"失败");
	}
}

public void showWare(Ware s) {
	if(s!=null) {
		goodsIdText.setText(s.getGoodsId());
		goodsNumberText.setText(String.valueOf(s.getGoodsNumber()));
	}
}

注:入库信息、商品交易信息和商品信息都有相似之处。
3.5. 商品交易操作
(1) 效果截图

图 3.5 登录页
(2) 核心代码
******************** 代码3.5.1 GoodsTransactionPanel .java 部分代码************************
outReceipt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
System.out.println(“outReceipt”);
ArrayList bag=new GoodsTransactionDao().findAllByName(“”);
if(bag==null) {
JOptionPane.showMessageDialog(null, “暂无数据,请添加商品交易信息。”);
}else {
JFrame f=new JFrame(“后台导出小票”);
f.getContentPane().add(new ReceiptPanel());
f.setSize(500, 400);//设置窗口的大小和位置
f.setVisible(true);
// 实现窗口的关闭时间监听
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
f.dispose();//关闭窗口,释放事件
}
});
}
}
});


************************ 代码3.5.2 ReceiptPanel .java 部分代码***************************
private void outReceipt() {
int totalNumber=0,count=0;
double totalMoney=0;

	ArrayList<GoodsTransaction> bag=new GoodsTransactionDao().findAllByName("");
	DefaultTableModel tableModel = (DefaultTableModel) table_good.getModel();
	tableModel.setRowCount(0);
	tableModel.addRow(new Object[]{"编号","品名","单位",
			"数量","售价","金额"});
	for(GoodsTransaction g:bag){
		if(g.getNumber()!=0) {
			tableModel.addRow(new Object[] {count,g.getGoodsName(),
					g.getUnit(),g.getNumber(),g.getPrice(),g.getMoney()});
			totalNumber+=g.getNumber();
			totalMoney+=g.getMoney();
			count++;
		}
	}

	tableModel.addRow(new Object[] {""});
	tableModel.addRow(new Object[] {"","","","共",totalNumber,"数量"});
	tableModel.addRow(new Object[] {"","","","共",count,"项商品"});
	tableModel.addRow(new Object[] {"","","","共",totalMoney,"元"});
	table_good.setRowHeight(30);
	table_good.setModel(tableModel);
}

  1. 系统测试
    4.1. 登陆注册
    在用户注册页面进行注册操作,输入基本信息,在点击注册按钮之前,姓名和密码不能为空、姓名不可重复。

图 4.1 点击注册时的提示-姓名为空

图 4.2 点击注册时的提示-用户已存在
系统进行验证用户是否已存在、密码和确认密码是否一致并且不为空,如出现以上情况则给出提示,否则无法登陆。

图 4.3 点击登录时的提示
经过测试,登陆注册模块正常显示相关信息以及正常跳转。
4.2. 商品信息
在商品信息进行增删查改,输入基本信息,在点击新增按钮之前,判断数据是否正确。商品名、价格、单位、分类编号不能为空;判断价格是否为数字。

图 4.4 商品信息-新增按钮-校验信息

图 4.5 商品信息-新增按钮-前端校验信息
在点击修改按钮之前,要在列表选择数据,判断数据是否正确。信息无误便可修改信息。

图 4.6 商品信息-修改按钮-前端校验信息

图 4.7 商品信息-修改按钮-修改成功
在点击删除按钮之前,在旁边列表点击选择,便可删除成功,否则有弹窗提示。

图 4.8 商品信息-修改按钮-删除成功
点击查询按钮,均可正常显示信息。无信息则显示“没有符合条件数据”。

图 4.9 商品信息-查询商品名

图 4.10 商品信息-查询商品id

图 4.11 商品信息-查询商品的分类编号

图 4.12 商品信息-价格升序

图 4.13 商品信息-价格降序
经过测试,商品信息模块正常显示相关信息以及正常跳转。
4.3. 用户信息
在用户信息进行修改操作,输入基本信息,在点击修改按钮之前,校验信息是否正确。姓名和密码不为空;用户名不可重复。

图 4.14 用户信息-修改-校验信息

图 4.15 用户信息-修改-校验信息

图 4.16 用户信息-修改-校验信息
经过测试,用户信息模块正常显示相关信息以及正常跳转。
4.4. 入库信息
在入库信息进行进行增删查改操作,输入基本信息,在点击新增按钮之前,校验信息是否正确。商品id和商品数量不为空;商品id检验是否存在;商品数量检验是否是数字;商品id在仓库中不可重复。

图 4.17 入库信息-新增-校验信息

图 4.18 入库信息-新增-校验信息

图 4.19 入库信息-新增-校验信息

图 4.20 入库信息-新增-添加成功
在点击修改按钮之前,要在列表选择数据,判断数据是否正确。信息无误便可修改信息。当前用户只可操作自己创建的数据。

图 4.21 入库信息-修改-校验信息

图 4.22 入库信息-修改成功

图 4.23 入库信息-删除成功
点击查询按钮,均可正常显示信息。无信息则显示“没有符合条件数据”。

图 4.24 入库信息-查询商品id

图 4.25 入库信息-查询仓库id
经过测试,入库信息模块正常显示相关信息以及正常跳转。
4.5. 商品交易操作
在商品交易进行新增操作,输入基本信息,在点击新增按钮之前,要在列表选择数据,判断商品数量是否为整型。

图 4.26 商品交易-新增-校验信息

图 4.27 商品交易-新增-校验信息

图 4.28 商品交易-新增-校验信息

图 4.29 商品交易-新增

图 4.30 商品交易-修改

图 4.31 商品交易-删除
点击查询按钮,均可正常显示信息。无信息则显示“没有符合条件数据”。

图 4.32 入库信息-查询商品名

图 4.33 入库信息-查询交易id
经过测试,商品交易模块正常显示相关信息以及正常跳转。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值