目录
一、Java swing进销存系统系统说明
此套系统的重点在于通过有效的仓库管理提高零售店的效益,因此需要完成商品管理,销售管理,出入库管理,仓库管理,用户管理几个模块,以保证系统能够有效,高效地帮助零售店完成现代化销售管理。而销售管理则对系统数据的精确性和安全性有着较高的要求,即系统要求设计严密的输入输出验证机制,保证对输入与输出的严格把控,另外,系统应当制定灵活的权限机制,对不同身份的用户开放对应的操作权限接口,保证系统有序地运行。
此套系统首先分为五大部分,分别为登录、首页、基础数据、进销存管理、用户管理,首页为欢迎页面,基础数据下设商品管理功能模块,进销存管理下设销售单、入库单、出库单、仓库管理四个功能模块,用户管理为单独功能模块。
功能结构图如下所示:
图1 系统功能结构图
二、系统功能设计
以下将结合用户调研结果细化分析每个功能模块的需求:
2.1 用户登录
打开登录页面,输入用户名和密码,点击登录,系统验证输入的合法性,若输入不合法,则弹出错误提示,若输入合法,系统自动跳转到首页欢迎页面,等待用和操作。
2.2 添加商品
点击添加按钮,系统弹出添加商品窗口,输入商品信息,用户提交信息,后台验证输入的合法性,系统返回对应的提示信息,刷新商品列表,保证系统实时同步数据库。
2.3 修改商品
点击修改按钮,判断用户是否已经选择数据,若未选择数据,系统则返回错误提示信息,若已选择数据,则通过所选商品的id查询商品其他信息,弹出修改商品信息的窗口,回写商品信息,用户修改数据后,提交信息,后台验证输入的合法性,系统返回对应的提示信息,刷新商品列表,保证系统实时同步数据库。
2.4 删除商品
点击删除按钮,,判断用户是否已经选择数据,若未选择数据,系统则返回错误提示信息,若已选择数据,则弹出确认删除对话框,防止用户的误操作,用户取消删除,则返回上一级,若用户确定删除,点击确定按钮,系统将通过获取到的商品id删除记录,然后返回提示信息,刷新商品列表,保证系统实时同步数据库。
2.5. 条件查询销售单
系统默认查询所有商品信息,允许用户根据商品种类和所属仓库筛选销售单信息,用户输入商品种类,所属仓库时,系统作条件查询,刷新商品列表,保证系统实时同步数据库。
2.6 添加销售单
点击添加按钮,系统弹出添加销售单窗口,输入销售单信息,用户提交信息,后台验证输入的合法性,并由系统根据时间生成订单号,并减少商品库存,系统返回对应的提示信息,刷新销售单列表,保证系统实时同步数据库。
II条件查询销售单
系统默认查询所有销售单信息,允许用户根据商品名模糊查询,根据商品种类和所属仓库筛选商品信息,用户输入商品名,商品种类,所属仓库时,系统作条件查询,刷新销售单列表,保证系统实时同步数据库。
④入库单
2.7 添加入库单
点击添加按钮,系统弹出添加入库单窗口,输入入库单信息,用户提交信息,后台验证输入的合法性,并由系统根据时间生成订单号,并增加商品库存,系统返回对应的提示信息,刷新入库单列表,保证系统实时同步数据库。
2.8 删除入库单
点击删除按钮,,判断用户是否已经选择数据,若未选择数据,系统则返回错误提示信息,若已选择数据,则弹出确认删除对话框,防止用户的误操作,用户取消删除,则返回上一级,若用户确定删除,点击确定按钮,系统将通过获取到的入库单id删除记录,然后返回提示信息,刷新入库单列表,保证系统实时同步数据库。
2.9 条件查询入库单
若当前用户身份为管理员,系统默认查询所有入库单信息,若当前用户身份为普通用户,则只允许查看当前用户所经手的入库单,系统支持用户根据商品名模糊查询,根据商品种类和所属仓库筛选入库单信息,用户输入商品名,商品种类,所属仓库时,系统作条件查询,刷新入库单列表,保证系统实时同步数据库。
⑤出库单
2.10 添加出库单
点击添加按钮,系统弹出添加出库单窗口,输入出库单信息,用户提交信息,后台验证输入的合法性,并由系统根据时间生成订单号,并减少商品库存,系统返回对应的提示信息,刷新出库单列表,保证系统实时同步数据库。
2.11 删除出库单
点击删除按钮,,判断用户是否已经选择数据,若未选择数据,系统则返回错误提示信息,若已选择数据,则弹出确认删除对话框,防止用户的误操作,用户取消删除,则返回上一级,若用户确定删除,点击确定按钮,系统将通过获取到的出库单id删除记录,然后返回提示信息,刷新出库单列表,保证系统实时同步数据库。
2.12 条件查询出库单
若当前用户身份为管理员,系统默认查询所有入库单信息,若当前用户身份为普通用户,则只允许查看当前用户所经手的出库单,系统支持用户根据商品名模糊查询,根据商品种类和所属仓库筛选出库单信息,用户输入商品名,商品种类,所属仓库时,系统作条件查询,刷新出库单列表,保证系统实时同步数据库。
⑥仓库管理
2.13 添加仓库
点击添加按钮,系统弹出添加商品窗口,输入仓库信息,用户提交信息,后台验证输入的合法性,系统返回对应的提示信息,刷新仓库列表,保证系统实时同步数据库。
2.14 修改仓库
点击修改按钮,判断用户是否已经选择数据,若未选择数据,系统则返回错误提示信息,若已选择数据,则通过所选仓库的id查询仓库其他信息,弹出修改仓库信息的窗口,回写仓库信息,用户修改数据后,提交信息,后台验证输入的合法性,系统返回对应的提示信息,刷新仓库列表,保证系统实时同步数据库。
2.15 删除仓库
点击删除按钮,,判断用户是否已经选择数据,若未选择数据,系统则返回错误提示信息,若已选择数据,则弹出确认删除对话框,防止用户的误操作,用户取消删除,则返回上一级,若用户确定删除,点击确定按钮,系统将通过获取到的仓库id删除记录,然后返回提示信息,刷新仓库列表,保证系统实时同步数据库。
⑦用户管理
2.16 修改用户名
进入用户管理,系统将根据当前用户id回写用户信息(隐藏密码),且用户名不允许修改,点击修改按钮,弹出用户验证窗口,要求输入当前用户原始密码,用户确定,系统验证密码的合法性,若密码非法,则返回对应错误提示信息,返回用户管理主页,若密码合法,则允许用户修改信息,当用户提交修改时,系统验证输入的合法性,返回对应的提示信息,修改成功则要求用户重新登录。
2.17 修改密码
进入用户管理,系统将根据当前用户id回写用户信息(隐藏密码),且密码不允许修改,点击修改按钮,弹出用户验证窗口,要求输入当前用户原始密码,用户确定,系统验证密码的合法性,若密码非法,则返回对应错误提示信息,返回用户管理主页,若密码合法,则允许用户修改信息,当用户提交修改时,系统验证输入的合法性,返回对应的提示信息,修改成功则要求用户重新登录。
三、系统详细设计
1.适配器模式
系统登录模块的核心问题就是用户身份的验证,应注意的是要控制好输入的合法化,防止系统错误的发生,若用户身份验证失败,系统则弹出错误信息,然后返回登陆界面,提供重新登录;若用户身份验证成功,系统则跳转进入主界面。
流程图如下:
使用了适配器模式, 在类适配器模式中,适配器类实现了目标抽象类接口并继承了适配者类,在目标抽象类的实现方法中调用所继承的适配者类的方法。实现了解耦合,让代码量减少,各个模块分块来做。
public void mouseClicked(MouseEvent e) {
if (e.getSource() == button_login) {
if ("用户名/账号".equals(username.getText())) {
JOptionPane.showMessageDialog(null, "用户名不能为空");
} else if ("密码".equals(password.getText())) {
JOptionPane.showMessageDialog(null, "用户密码不能为空");
} else {
String params[] = { username.getText(), password.getText() };
UserServiceImpl userService = new UserServiceImpl();
try {
User user = userService.selectOne(params);
if (user == null) {
JOptionPane.showMessageDialog(null, "用户名密码有误");
} else {
this.setVisible(false);
new IndexJFrame(user);
}
} catch (Exception e1) {
e1.printStackTrace();
}
2.策略模式
主界面等IndexJFrame,LoginJFrame以及其他JFrame都实现了MouseListener等监听接口,使用了策略模式,策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现。让各个模块如登录,管理的操作都有响应。
public class LoginJFrame extends JFrame implements MouseListener, FocusListener {
// 全局的位置变量,用于表示鼠标在窗口上的位置
static Point origin = new Point();
// 定义全局组件
JTextField username = new JTextField(20);
JPasswordField password = new JPasswordField(20);
ImagePanel backgroundPanel = null;
JButton button_minimize, button_close, button_login, button_reset;
public class GoodsManagerJPanel implements ActionListener, MouseListener {
// 定义全局组件
JPanel backgroundPanel, topPanel, toolPanel, searchPanel, tablePanel;
JComboBox select_category, select_warehouse;
BaseTableModule baseTableModule;
JTable table;
JScrollPane jScrollPane;
JLabel label_category, label_warehouse, tool_add, tool_modify, tool_delete;
- 模板方法
模板方法是一种行为模式,父类的一个方法定义完成这个方法的步骤,但不具体实现具体细节,由子类完成各个步骤的实现,在创建子类对象时,最终实现过程是子类的方法。在系统中,定义Dao层进行数据库的操作,在dao包中进行父类方法的定义,但是没有实现,在dao.Impl中继承父类的方法,实现对应的功能,完成数据库操作。
/**
*
* 说明:基础Dao数据库操作接口
*
* @author LS
*
* */
public interface BaseDao {
public List select(String sql, int columnNum, Object[] paraArray)
throws SQLException;
public int insert(String sql, Object[] paraArray) throws SQLException;
public int update(String sql, Object[] paraArray) throws SQLException;
public int delete(String sql, Object[] paraArray) throws SQLException;
}
/**
*
* 说明:基础Dao数据库操作实现
*
* @author LS
*
*
*/
public class BaseDaoImpl implements BaseDao {
private static Logger logger = Logger.getLogger(BaseDaoImpl.class);
private Connection conn;
private PreparedStatement pst;
private ResultSet rs;
// 构造方法获取数据库连接
public BaseDaoImpl() {
conn = new JdbcUtil().getJdbcUtil().getConnection();
}
// 重写查询数据方法
@Override
public List select(String sql, int columnNum, Object[] paraArray) throws SQLException {
List list = new ArrayList();
pst = conn.prepareStatement(sql);
if (paraArray != null) {
for (int i = 0, length = paraArray.length; i < length; i++) {
pst.setObject(i + 1, paraArray[i]);
}
}
ResultSet rs = pst.executeQuery();
while (rs.next()) {
Object[] array = new Object[columnNum];
for (int i = 0; i < columnNum; i++) {
array[i] = rs.getObject(i + 1);
}
list.add(array);
}
new JdbcUtil().getJdbcUtil().release(rs, pst, conn);
return list;
}
- 单例模式
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建,在进行数据库链接创建时,保证每次调用只有一个数据库链接被创建,使用后进行销毁,使用了单例模式
/**
* 创建一个数据库连接
*
* @return 一个数据库连接
*
*/
public Connection getConnection() {
Connection conn = null;
// 创建数据库连接
try {
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
logger.error("创建数据库连接发生异常", e);
}
return conn;
}
工厂模式
一种非常常用的创建型设计模式,其提供了创建对象的最佳方式。在创建对象时,不会对客户端暴露对象的创建逻辑,而是通过使用共同的接口来创建对象。在创建BaseDAO时候,后面继承的方法会直接通过创建使用BaseDAO来获取对象, 保证客户端无法看到对象的创建逻辑。
public class BaseDaoImpl implements BaseDao {
private static Logger logger = Logger.getLogger(BaseDaoImpl.class);
private Connection conn;
private PreparedStatement pst;
private ResultSet rs;
// 构造方法获取数据库连接
public BaseDaoImpl() {
conn = new JdbcUtil().getJdbcUtil().getConnection();
}
@Override
public Vector<Vector> selectStockInputByCondition(Object[] paraArray) throws Exception {
Vector<Vector> rows = new Vector<Vector>();
BaseDaoImpl dao = new BaseDaoImpl();
StringBuilder sqlBuilder = new StringBuilder(
"select s.id,s.bill_no,g.name,s.amount,c.name,w.name,u.name,c.id,w.id "
+ " from stock_order s,goods g,user u,category c,warehouse w "
+ " where s.handler_id=u.id and s.goods_id=g.id and s.category_id=c.id and s.warehouse_id=w.id and s.sign='0' and s.del_flag='0' and g.del_flag='0' and c.del_flag=0 and w.del_flag='0' ");
String name = paraArray[0].toString().trim();
四、课程设计总结
这次课程设计让我学到很多知识,在处理过程中遇到了数据库链接不上,字段转换有异常等原因,好在同学们帮助我,让我解决了问题。提高了自身实践能力的同时让我明白了自己的不足之处,如所学知识范围局限,拘泥于课本,实践能力差等等。因此在以后的工作学习过程中我的目标是要提高自己的自学、研究、实践能力,让自己的知识功底更加扎实。
总的来说,在本次课程设计中,我真正学到了很多实践知识,都是在课堂内所学不到的知识,收获很大,最后也要感谢同学以及老师的鼓励和帮助,让我顺利的完成了本次课程。
以上资源包括源码,mysql数据库文件,文档,代码中需要修改成自己的数据库账号密码,jar包需要build path进去,不会运行可+Q 2410068425
下载地址:https://download.csdn.net/download/qq_39336564/85906191