目 录
-
系统分析 1
1.1. 系统总体结构 1 -
系统设计 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 -
系统实现 5
3.1. 登陆注册 5
3.2. 商品信息 7
3.3. 用户信息 11
3.4. 入库信息 13
3.5. 商品交易操作 15 -
系统测试 17
4.1. 登陆注册 17
4.2. 商品信息 19
4.3. 用户信息 23
4.4. 入库信息 25
4.5. 商品交易操作 29 -
系统分析
1.1. 系统总体结构
有五个模块:登陆注册,商品信息,用户信息,入库信息,商品交易操作。
项目目录结构:
Dao:执行数据库语句,进行增删查改。
Entity:实例类,包含四个对象:用户信息, 商品基本信息,商品交易信息,商品入库。
Panel:JavaGUI页面显示,对数据库的基本逻辑处理。
Util:公用的方法包。
图 1.1 系统总体结构图
图 1.2 项目目录
- 系统设计
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);
}
- 系统测试
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
经过测试,商品交易模块正常显示相关信息以及正常跳转。