第一阶段商城系统项目总结

一、项目设计实现步骤

1.1 需求调用

1、需求调用属于产品经理范畴,在需求调研期间需要和客户沟通完成客户的需求,并完成需求分析文档。在该项目的需求文档中需要写明功能需求和其他的需求,并向涉及该项目的所以软件相关人员进行需求考察,务必让软件相关人员明确产品功能需求。

2、需求调研中还需要完成项目功能模块图的设计、项目用例图的设计和该系统功能的详细文字描述。UML是描述操作主体(角色)和功能的图,需要重点掌握,包括但不局限于:活动图、用例图、实体类图、功能模块图等。

1.2 项目设计

项目设计属于重要步骤,在项目的设计中需要完成概要设计,如数据库的设计,系统架构的设计。和详细设计,要详细到具体类、类名、具体方法、方法名、参数、返回值等。

1.3 代码编写

代码的编写是程序员的核心功能。代码编写前后需要程序员做单元测试,以保证自己手下写出的代码能正常运行和无错误,本着谁的代码出错误谁承担错误的原则。所有作为程序员手下产生的代码可以有错,但是一定要在测试后及时修正错误,防止重大错误产生连锁反应,造成损失。

1.4 系统测试

系统测试属于测试部门的工作,系统成型后测试部门开始测试,一般采用禅道平台将BUG分级,然后提交和指派给相应后端开发人员,后端开发人员在修复BUG后,作为测试人员还要进行BUG验证,验证无误后方可关闭该BUG。一个项目的上线要确保没有影响用户正常使用的BUG。所有测试部门也是开发部的重中之重。

二、代码编写

2.1 建包和导入本项目所需jar

目前这个系统的设计所需要建立的包如下:

  • com.singerw.entity ——实体类,和数据库表结构字段一致,三大步(GetSet、构造器、toString
  • com.singerw.dao ——数据库操作
  • com.singerw.tools ——工具
  • com.singerw.ui ——UI界面
  • com.singerw.servies ——业务层

本项目所需的jar包如下:

  • commons-logging.jar
  • commons-collections.jar
  • commons-beanutils.jar
  • mysql-connector-java-8.0.16.jar

2.2 entity层实体类的建立

1、entity层中实体类的建立,类名需要见名知意,本项目的类名采用数据库的表名进行命名,如UserEntityGoodsEntity

2、类新建后,属性或称成员变量的定义要和数据库表中的字段名相同,并且数据类型也要尽量相同,以保证后续的操作比较方便,数据类型的定义也可以看具体情况去定义,比如这次在定义时间类型的时候遇到错误,就直接将时间定义成String类型了。

3、接着在新建的类中生成GetSet、构造器和toString,用于后续的调用。

2.3 Dao层中关于数据库的操作

1、Dao成建立和类的建立

Dao层中建立的类名一般也和数据库表名相同,本项目在Dao层中类的命名也采用了数据库中的表名进行命名,如:UserDaoGoodsDao

2、Dao层中类方法的定义

类建立后,在类中定义方法,一般在该类中定义对应该数据库表的基本增加、删除、修改和查询方法,方法的命名也要见名知意,如:addUserdeleteUsersByIdgetUserByLike

3、类方法的返回值

在方法中,方法的返回值需要重点考虑,比如我增加一个用户或者一件商品,增加后需要知道是否增加成功,所以该返回值需要是一个boolean

public boolean addUser(UserEntity users) {
    if (users == null) {
        return false;
    }
    String sql = "insert into tbl_user values(null,?,?,?,?,?,?)";
    // 增加调用DBUtil.exupdate方法
    int n = DBUtil.exUpdate(sql, users.getCname(), users.getCpwd(), users.getCphone(), users.getCaddress(), users.getLevel(), users.getLastlogin());
    return n > 0;
}

比如说,通过定义一个String类型的关键字String keywords作为参数,模糊查询去查询用户的所有信息,那么可能会返回一条用户信息,也可能会返回多条用户信息,所有这时的返回值就是个集合,就需要用到List<UserEntity>了。

public List<UserEntity> getUserByLike(String keywords) {
    String sql = "select * from tbl_user where cid like ? or cname like ?";
    Object obj = DBUtil.exQuery(sql, UserEntity.class, keywords, keywords);
    if (obj instanceof List) {
        List<UserEntity> list = (List) obj;
        return list;
    }
    return null;
}

在比如说,通过定义一个int类型的关键字int cid 作为参数,用cid去查询某一个用户的信息,这是返回的信息如果按正常情况下就是一条信息,所以这是的返回值就是一个UserEntity

public GoodsEntity getUserById(int cid) {
    String sql = "select * form tbl_user where cid = ?";
    Object obj = DBUtil.exQuery(sql, GoodsEntity.class, cid);

    // 返回值是List类型
    if (obj instanceof List) {
        List<GoodsEntity> list = (List) obj;
        if (list.size() > 0) {
            return list.get(0);
        }
        return null;
    }
    return null;
}

4、类方法的参数

参数本着需要什么就定义什么的原则,比如要增加的是一个用户或者一件商品,所以参数需要一个UserEntity user或者GoodsEntity goods

public boolean addUser(UserEntity users) {
        if (users == null) {
            return false;
        }
        String sql = "insert into tbl_user values(null,?,?,?,?,?,?)";
        // 增加调用DBUtil.exupdate方法
        int n = DBUtil.exUpdate(sql, users.getCname(), users.getCpwd(), users.getCphone(), users.getCaddress(), users.getLevel(), users.getLastlogin());
        return n > 0;
}

在比如说,我要通过用户的ID或者Name去查询一个用户,进行一些修改或者删除操作,这时的参数就需要一个int id或者String name

public GoodsEntity getUserById(int cid) {
    String sql = "select * form tbl_user where cid = ?";
    Object obj = DBUtil.exQuery(sql, GoodsEntity.class, cid);

    // 返回值是List类型
    if (obj instanceof List) {
        List<GoodsEntity> list = (List) obj;
        if (list.size() > 0) {
            return list.get(0);
        }
        return null;
    }
    return null;
}
public UserEntity getUserByNameAndPwd(String cname, String cpwd) {
        String sql = "select * from tbl_user where cname=? and cpwd=?";
        Object obj = DBUtil.exQuery(sql, UserEntity.class, cname, cpwd);

        // 返回值是List类型
        if (obj instanceof List) {
            List<UserEntity> list = (List) obj;
            if (list.size() > 0) {
                return list.get(0);
            }
        }
    return null;
}

再如果通过定义一个String类型的关键字String keywords作为参数,模糊查询去查询用户的所有信息,这时String keywords作为参数,该方法会返回一个或多个用户信息,返回值是一个用户集合。

public List<UserEntity> getUserByLike(String keywords) {
    String sql = "select * from tbl_user where cid like ? or cname like ?";
    Object obj = DBUtil.exQuery(sql, UserEntity.class, keywords, keywords);
    if (obj instanceof List) {
        List<UserEntity> list = (List) obj;
        return list;
    }
    return null;
}

在参数与返回值这一块需要重点研究和掌握

2.4 本项目中的特殊参数

   /**
     * @param orders
     * @param orderDetailEntityList
     * @return
     * @Author CodeSleep
     * @Date: 2021-06-22 15:20
     * @Description: //TODO 添加订单信息
     */
    public boolean addOrder(OrderEntity orders, List<OrderDetailEntity> orderDetailEntityList) {
        if (orders == null) {
            return false;
        }
        String order_sql = "INSERT INTO `mall_db`.`tbl_order` (`oid`, `cid`, `odate`, `address`, `total`) VALUES (?, ?,now(), ?, ?)";
        String orderdetail_sql = "INSERT INTO `mall_db`.`tbl_orderdetail` (`id`, `oid`, `gid`, `gcount`, `gprice`, `total`) VALUES (null,?, ?, ?, ?, ?)";
        String updategstact_sql = "UPDATE `mall_db`.`tbl_goods` SET `gstock` = `gstock`- ? WHERE `gid` = ?";
        String updatestate_sql = "UPDATE `mall_db`.`tbl_cart` SET `state` = 0 ,gcount = 0 WHERE `cid` = ? and state = 1";
        // 执行增加操作
        // 创建pstmt对象
        Connection conn = null;
        try {
            conn = DBUtil.getConn();
            PreparedStatement pstmt = null;
            // 设置事务不自动提交
            conn.setAutoCommit(false);

            // ************** 1订单表插入记录insert 开始 **************
            pstmt = conn.prepareStatement(order_sql);
            // 设置占位符对应参数值
            pstmt.setString(1, orders.getOid());
            pstmt.setInt(2, orders.getCid());
            pstmt.setString(3, orders.getAddress());
            pstmt.setDouble(4, orders.getTotal());
            System.out.println("订单表插入pstmt:" + pstmt);
            // 执行增删改方法
            int n = pstmt.executeUpdate();
            // ************** 1订单表插入记录insert 结束 **************


            // ************** 2订单详情表插入记录insert 开始 **************
            pstmt = conn.prepareStatement(orderdetail_sql);
            for (OrderDetailEntity orderDetailEntity : orderDetailEntityList) {
                // 设置占位符对应参数值
                pstmt.setString(1, orderDetailEntity.getOid());
                pstmt.setInt(2, orderDetailEntity.getGid());
                pstmt.setInt(3, orderDetailEntity.getGcount());
                pstmt.setDouble(4, orderDetailEntity.getGprice());
                pstmt.setDouble(5, orderDetailEntity.getTotal());
                System.out.println("订单详情表插入pstmt:" + pstmt);
                // 执行增删改方法
                pstmt.addBatch();
            }
            // 统一发送请求,执行一遍增加操作
            int[] m = pstmt.executeBatch();
            // ************** 2订单详情表插入记录insert 结束 **************


            // ************** 3库存减少 tbl_goods gstock 开始 **************
            pstmt = conn.prepareStatement(updategstact_sql);
            for (OrderDetailEntity orderDetailEntity : orderDetailEntityList) {
                // 设置占位符对应参数值
                pstmt.setInt(1, orderDetailEntity.getGcount());
                pstmt.setInt(2, orderDetailEntity.getGid());
                System.out.println("库存减少pstmt:" + pstmt);
                // 执行增删改方法
                pstmt.addBatch();
            }
            // 统一发送请求,执行一遍增加操作
            int[] o = pstmt.executeBatch();
            // ************** 3库存减少 tbl_goods gstock 结束 **************


            // ************** 4删除购物车记录 逻辑删除 tbl_cart 开始 **************
            pstmt = conn.prepareStatement(updatestate_sql);
            pstmt.setInt(1, CommonInfo.cid);

            int p = pstmt.executeUpdate();
            System.out.println("p" + p);
            // ************** 4删除购物车记录 逻辑删除 tbl_cart 结束 **************

            // 事务提交
            conn.commit();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();

            try {
                conn.rollback();
                return false;
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return true;
    }

三、UI界面与监听事件

四、entity层中补增实体类

五、JForm的使用

5.1 JFormDesigner插件

Swing GUI design made easy!

六、IDEA项目打包

后续编写更新中。。。。。。

最后修改:2021 年 10 月 14 日 03 : 53 PM
如果觉得我的文章对你有用,请随意赞赏