【Java项目】基于账户服务的收银宝

文章目录

    • 项目难点
        • 1. 结合框架、注解
        • 2. 数据库多表操作
    • 核心需求
    • 核心技术
    • 功能列表
        • 1. 公共端
        • 2. 管理端
        • 3. 客户端
    • 技术实现
        • - 数据库表设计
        • - 项目分层设计
    • 项目效果
      • - 客户端
        • -管理端
    • 项目测试
        • - 功能测试
        • - 性能测试
        • - 容错性测试
    • 项目优化
    • 项目代码









项目难点

1. 结合框架、注解

本次项目通过使用注解将所有命令进行分类,利用反射机制取得注解并将不同的命令通过key-value的方式存入Map中。
(1) 在实体类给项目中四张表中的字段提供属性,得到get和set方法,所以引入了@Data注解
@Data作用:自动为当前所在类提供getter、setter、toString、equals等方法。
eg:使用注解需要在idea中安装lombok插件

以Account表为例:
【Java项目】基于账户服务的收银宝_第1张图片

(2)由于不同类型用户(管理员、客户)登录后看到的页面不同,可以采用注解来进行分类
(if-else也可使用,但是代码量太大,不考虑)

【Java项目】基于账户服务的收银宝_第2张图片
其中:
AdminCommand:管理命令
CommandMeta:存放注解名称
CustomerCommand:客户命令
EntranceCommand:入口命令

  注解释义:
  
   1、@ Retention(RetentionPolicy.RUNTIME):
      注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在
      
    2、@ Target(ElementType.TYPE):
      说明了Annotation所修饰的对象范围:用于描述类、接口(包括注解类型) 或enum声明


2. 数据库多表操作

每个用户购物时下单后产生订单形成订单表和订单内包含的商品形成订单项表,订单和订单项之间是一对多的关系,在查询订单时为了简单易行,在resource中创建【Java项目】基于账户服务的收银宝_第3张图片
并使用左连接来处理两个表的连接


核心需求

  • 登录 注册

  • 管理端

    • 用户管理
    • 商品管理
  • 用户端

    • 商品浏览
    • 订单支付
    • 下单管理

核心技术

  1. JDBC编程
  2. MySQL数据库
  3. Stream式编程
  4. 注解技术
  5. 集合框架

功能列表

1. 公共端

【Java项目】基于账户服务的收银宝_第4张图片

2. 管理端

【Java项目】基于账户服务的收银宝_第5张图片

3. 客户端

【Java项目】基于账户服务的收银宝_第6张图片


技术实现

- 数据库表设计

check_stand数据库中共有四张表 :account(用户表)、goods(商品表)、order(订单表)、order_item(订单项表)
其中四张表的关系如下图所示:
【Java项目】基于账户服务的收银宝_第7张图片

- 项目分层设计

【Java项目】基于账户服务的收银宝_第8张图片
上层依赖于下层而下层不依赖于上层
!!!DAO层 (数据库访问对象)是 Data Access Object 的缩写!!!

1)我们通过 DAO层才能真正操作数据库,AccountDAO、GoodsDAO、OrderDao都继承BaseDao。
BaseDao中涉及到JDBC数据库连接步骤:
1.加载驱动,创建连接
2.创建Statement对象
3.执行SQL语句
4.释放资源

JDBC标准操作及格式可点击此处查看


2)由于我们每一次输入的命令都是通过 Command层 控制 Service层,再通过 Service层 控制 DAO层,不如建立 Command 接口,并写入 Scanner 对象来读入输入流。

public interface Command {
    //每个命令都会创建Scanner对象 在这里直接创建
    Scanner scanner = new Scanner(System.in);
    //统一调用此方法
    void execute(Subject subject);
}

3)由于我们每次执行明令都需要重启 Service层,继而操作 DAO层,浪费资源,不如定义Abstract类,并在其中启动所有服务。

public abstract class AbstractCommand implements Command {
    public AccountService accountService;//用户服务
    public GoodsService goodsService;//商品服务
    public OrderService orderService;//订单服务
    public AbstractCommand() {
        this.accountService = new AccountService();
        this.goodsService = new GoodsService();
        this.orderService = new OrderService();
    }
}

项目效果

- 客户端

  1. 注册
    【Java项目】基于账户服务的收银宝_第9张图片
  2. 登录
    【Java项目】基于账户服务的收银宝_第10张图片
  3. 浏览商品
    【Java项目】基于账户服务的收银宝_第11张图片
  4. 支付订单
    【Java项目】基于账户服务的收银宝_第12张图片
  5. 查看订单
    【Java项目】基于账户服务的收银宝_第13张图片

-管理端

  1. 注册
    【Java项目】基于账户服务的收银宝_第14张图片

  2. 启停账号、重置密码
    【Java项目】基于账户服务的收银宝_第15张图片

  3. 查看账号
    【Java项目】基于账户服务的收银宝_第16张图片
    【Java项目】基于账户服务的收银宝_第17张图片

  4. 上架商品
    【Java项目】基于账户服务的收银宝_第18张图片

  5. 下架商品
    【Java项目】基于账户服务的收银宝_第19张图片

  6. 浏览商品
    【Java项目】基于账户服务的收银宝_第20张图片

  7. 更新商品
    【Java项目】基于账户服务的收银宝_第21张图片


项目测试

- 功能测试

  • 先测试注册、登录,然后通过注册管理员、登录后来测试上架商品、下架商品、浏览商品、更新商品等功能;通过注册客户来测试浏览商品、支付订单、查看订单等功能(图见项目效果部分)

- 性能测试

等价类、边界值:
1)通过对管理端的上架商品中的库存进行测试(如图所示)
库存输入负数也可上架成功
【Java项目】基于账户服务的收银宝_第22张图片
2)通过客户端
首先浏览商品,得知库存为10瓶

【Java项目】基于账户服务的收银宝_第23张图片
然后在支付订单,选择支付11瓶

【Java项目】基于账户服务的收银宝_第24张图片
订单支付成功,库存减少为-1瓶

【Java项目】基于账户服务的收银宝_第25张图片


- 容错性测试

在公共端、客户端、管理端输入不是该端提示字符时,回车,再一次展示之前端
以管理端为例:
【Java项目】基于账户服务的收银宝_第26张图片

项目优化

  1. 功能方面不完善
    存在问题: 甲客户选择了购买的商品后,在未支付的情况下暂时退出离开,此时乙客户选择购买商品后并支付,支付成功并库存相应减少,甲客户再次前来支付会出现库存虚假的情况
    解决方案:结合实际情况,客户并不关心库存量的多少,只关心自己所需要购买的数量是否够,所以可以在当前商品库存为零时进行对未完成支付订单内是否有该商品进行查找,若有:提示该商品已售罄,并在该订单中移除此商品。
  2. 字符界面的视觉不友好性
    存在问题:该下项目的最终以字符界面呈现,用户的体验感较差,但是字符界面也有优势:1)字符界面比图形界面占用的系统资源少;2)字符界面减少了出错、被攻击的可能性。
    解决方案:结合JavaWeb来实现一个网页版的购物收银系统可以使得体验效果更佳。

项目代码

完整代码请点击此处查看

如无法点击,链接如下:https://github.com/LXL7868/Check_Stand/commit/03a20d2bf9057e24bed6f7c013dbc455b60af9a4

你可能感兴趣的:(Java项目)