<2021SC@SDUSC>山东大学软件工程应用与实践JPress代码分析(八)

2021SC@SDUSC

优惠券功能(一)

本篇文章与下一篇文章,我们着重分析JPress财务管理相关功能的优惠券功能项目。JPress的主要功能文章功能、页面功能、商品功能和附件功能。优惠券作为商品功能必不可少的一部分,JPress从创建、管理、使用、记录等方面完美呈现了优惠券的创建、使用、流通方式。

一、功能展现

1.1 优惠券功能

选择控制面板优惠券,填写相关信息,如只有会员可用、绝对时效、状态等,点击提交,生成优惠券。
在这里插入图片描述
创建成功后界面如下,显示优惠券的详细信息。
在这里插入图片描述
点击分配优惠券,可以给对应用户分发优惠。

在这里插入图片描述
在这里插入图片描述
最后可以看到优惠券的领取列表,有领取用户、领取时间等相关信息。
在这里插入图片描述

1.2 所涉及数据库表

coupon:优惠券,记录创建的优惠券基本信息。
在这里插入图片描述
coupon_code:优惠券码,记录优惠券的分发情况、生成的优惠码等关键信息。
在这里插入图片描述
coupon_used_record:优惠券使用记录。
在这里插入图片描述

二、补充:JFinal ActiveRecord-Model

我们在JPress中操作数据库中呢?这得益于JFinal的ActiveRecord。在之前的文章中,我们介绍过ActiveRecord的DB+Record模式与paginate分页API,本次需要熟悉ActiveRecordPlugin与Model,才能更好的理解代码。

2.1 ActiveRecord

  • ActiveRecord 是 JFinal 最核心的组成部分之一,通过 ActiveRecord 来操作数据库,将极大地减少代码量,极大地提升开发效率。
  • ActiveRecord 模式的核心是:一个 Model 对象唯一对应数据库表中的一条记录,而对应关系依靠的是数据库表的主键值。因此,ActiveRecord 模式要求数据库表必须要有主键。
  • 所以在之前的代码分析中,我们不是以某个具体的对象对数据库进行操作,而是依赖Model对象。

2.2 ActiveRecordPlugin

  • ActiveRecord是作为JFinal的Plugin而存在的,所以使用时需要在JFinalConfig中配置ActiveRecordPlugin。
  • ActiveReceord中定义了addMapping(String tableName, Class<? extends Model> modelClass>)方法,该方法建立了数据库表名到Model的映射关系

2.3 Model

  • Model是ActiveRecord中最重要的组件之一,它充当MVC模式中的Model部分。以下是Model定义示例代码:
public class User extends Model<User> {    public static final User dao = new User().dao();}
  • 以上代码中的User通过继承Model,便立即拥有的众多方便的操作数据库的方法。在User中声明的dao静态对象是为了方便查询操作而定义的,该对象并不是必须的。基于ActiveRecord的Model无需定义属性,无需定义getter、setter方法,无需XML配置,无需Annotation配置,极大降低了代码量。

三、对Model的具体使用示例

我们以CouponServiceProvider举例。

3.1 继承JbootServiceBase

继承JbootServiceBase<M extends JbootModel<M>>,在泛型中加入model操作的对象,并调用相关方法。

public class CouponServiceProvider extends JbootServiceBase<Coupon> implements CouponService {

    @Inject
    private CouponCodeService couponCodeService;

    @Inject
    private CouponUsedRecordService usedRecordService;

    @Override
    public void doSyncTakeCount(long couponId) {
        long count = couponCodeService.queryCountByCouponId(couponId);
        Coupon coupon = findById(couponId);
        coupon.setTakeCount(count);
        update(coupon);
    }
}

3.2 调用JbootServiceBase的方法

  • 调用方法是,传入需要操作的对象,即可实现对数据库的操作。
  • 比如上例代码中的doSyncTakeCount(long couponId)方法中的update(coupon),最终在JbootServiceBase的方法调用如下:
public boolean update(M model) {
    boolean result = model.update();
    if (result) {
        this.shouldUpdateCache(3, model, model._getIdValue());
    }

    return result;
}

使用Model对数据库、缓存进行更新操作。

四、总结

本篇文章从优惠券的面板功能用法、对Model概念的补充、对Model实际操作数据库的代码进行描述,这有利于我们对后面代码的底层实现的理解。下篇文章优惠券功能(二)会具体讲述JPress中优惠券操作的相关代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值