实习修炼第十一天

整体进程

优惠券领取的整个业务流程开发与测试

~~

功能实现

~~

sql.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//dal.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="Coupon">
    <sql id="tableName">coupon</sql>
    <resultMap id="CouponTemplate" type="com.mini.coupon.dal.domainobject.CouponDO">
        <result property="id" column="id"/>
        <result property="couponId" column="coupon_id"/>
        <result property="groupId" column="group_id"/>
        <result property="userId" column="user_id"/>
        <result property="value" column="value"/>
        <result property="useTrade" column="use_trade"/>
        <result property="userTime" column="use_time"/>
        <result property="status" column="status"/>
        <result property="isValid" column="is_valid"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <result property="packId" column="pack_id"/>
        <result property="fromTime" column="from_time"/>
        <result property="endTime" column="end_time"/>

    </resultMap>

    <sql id="allColumns">
        id,coupon_id,group_id,user_id,`value`,use_trade,use_time,status,is_valid,create_time,update_time,pack_id,from_time,end_time
    </sql>

    <insert id="addCouponToUser" parameterType="com.mine.coupon.dal.domainobject.CouponDO">
        insert into
        <include refid="tableName"/>
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <include refid="allColumns"/>
        </trim>
        <trim prefix="value (" suffix=")" suffixOverrides=",">
            #{id},#{couponId},#{groupId},#{userID},#{value},#{useTrade},#{userTime},#{status},#{isValid},
            #{createTime},#{updateTime},#{packId},#{fromTime},#{endTime}
        </trim>
    </insert>
</mapper>

/** 
*sql创建语句及其字段解释
CREATE TABLE `coupon` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`coupon_id` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '优惠券id',
`group_id` int(11) NOT NULL COMMENT '优惠券组ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`value` int(11) NOT NULL COMMENT '面额',
`use_trade` bigint(20) DEFAULT NULL COMMENT '消费的tradeID',
`use_time` datetime DEFAULT NULL COMMENT '使用日期',
`status` int(11) NOT NULL DEFAULT '1' COMMENT '1-未使用 2-支付未完成被冻结 3-已使用',
`is_valid` int(11) NOT NULL DEFAULT '1' COMMENT '当前数据是否有效 1-有效 0-无效',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`pack_id` int(10) unsigned DEFAULT NULL COMMENT '大礼包ID,通过礼包领取的,自字段有值',
`from_time` datetime DEFAULT NULL,
`end_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `coupon_id_index` (`coupon_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
**/

Dal层数据

DO层 对应数据库表

package com.mine.coupon.dal.domainobject;


import lombok.Data;

import java.io.Serializable;
import java.util.Date;

@Data
public class CouponDO implements Serializable {
    private static final long serialVersionUID = -126022541889839881L;
    private Long id;
    //优惠券id
    private Long couponId;
    //优惠券组ID
    private Long groupId;
    //用户ID
    private Long userID;
    //面额
    private Integer value;
    //消费的tradeID
    private Long useTrade;
    //使用日期
    private Date userTime;
    //1-未使用 2-支付未完成被冻结 3-已使用
    private Integer status;
    //当前数据是否有效 1-有效 0-无效
    private Integer isValid;
    //创建时间
    private Date createTime;
    //更新时间
    private Date updateTime;
    //大礼包id
    private Long packId;
    //开始时间
    private Date fromTime;
    //截止时间
    private Date endTime;

}

DAO层数据库持久化

package com.mine.coupon.dal.dao;

import com.mine.coupon.dal.domainobject.CouponDO;
import lombok.Data;
import org.mybatis.spring.SqlSessionTemplate;
import javax.annotation.Resource;

/**
 * @create 2019-07-04 4:35
 */
public class CouponDAO {
    @Resource
    private SqlSessionTemplate couponSqlSession;

    /**
     *用户领取优惠券
     *
     * @param couponDO
     */
    public void  drawCoupon (CouponDO couponDO){
        couponSqlSession.insert("Coupon.addCouponToUser",couponDO);
    }
}


Manager层

功能调用层

package com.mine.coupon.manager;

import com.mine.coupon.dal.dao.CouponDAO;
import com.mine.coupon.dal.domainobject.CouponDO;

import javax.annotation.Resource;

public class CouponManager {
    @Resource
    private CouponDAO couponsDAO;

    private SequenceManager sequenceManager;

    public void drawCouponToUser(CouponDO couponDO){
        //Long Id = sequenceManager.nextCouponId();
        //couponDO.setId(Id);
        couponsDAO.drawCoupon(couponDO);
    }
}

Facade.impl层实现api包接口

外部层,用于直接调用

package com.mine.coupon.facade.impl;

import com.mine.common.service.domain.ServiceResponse;
import com.mine.coupon.common.CouponInfo2DO;
import com.mine.coupon.dal.domainobject.CouponDO;
import com.mine.coupon.entity.CouponInfo;
import com.mine.coupon.manager.CouponManager;
import com.mine.coupon.model.DrawCouponReq;
import org.springframework.stereotype.Service;
import com.mine.coupon.facade.CouponFacade;
import com.mine.common.service.error.CommonError;

import javax.annotation.Resource;

@Service("couponFacade")
public class CouponFacadeImpl implements CouponFacade{
    @Resource
    private CouponManager couponManager;

    @Override
    public ServiceResponse<Void> drawCoupon(DrawCouponReq drawCouponReq){
        CouponDO couponDO = new CouponDO();
        CouponInfo couponInfo = drawCouponReq.getCouponInfo();
        CouponInfo2DO couponInfo2DO = new CouponInfo2DO();
        couponInfo2DO.setCouponDO(couponDO);
        couponInfo2DO.setCouponInfo(couponInfo);
        couponDO = couponInfo2DO.convertInfo2DO(couponInfo);
        System.out.println(couponInfo2DO.getCouponDO().getCouponId());
        couponManager.drawCouponToUser(couponDO);
        return new ServiceResponse<>(CommonError.SUCCESS.getCode(),"领取优惠券成功");
    }
}

Service.impl层实现接口方法

package com.mine.coupon.service.impl;

import com.alibaba.dubbo.common.logger.Logger;
import com.alibaba.dubbo.common.logger.LoggerFactory;
import com.mine.common.service.domain.ServiceResponse;
import com.mine.coupon.common.Response;
import com.mine.coupon.facade.CouponFacade;
import com.mine.coupon.model.DrawCouponReq;
import com.mine.coupon.service.CouponService;
import lombok.extern.java.Log;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service("couponService")
public class CouponServiceImpl implements CouponService {

    private static final Logger logger = LoggerFactory.getLogger("running");

    @Resource
    private Response response;
    @Resource
    private CouponFacade couponFacade;

    @Override
    public ServiceResponse<Void> drawCoupon(DrawCouponReq drawCouponReq){
        if(drawCouponReq != null){
            couponFacade.drawCoupon(drawCouponReq);
        }
        return response.SUCCESS;
    }
}

pom.xml文件的使用

在项目中试图在service-provider层调用service-api层的接口进行实现,但是发现无法调用,原因是未添加依赖,他们两个是完全无关联的,需要添加依赖以完成调用。pom.xml文件解析传送门
查看api层pom文件的下面部分,重点关注及其下面两行,因为一般情况下,maven是通过groupId、artifactId、version这三个元素值(俗称坐标)来检索该构件, 然后引入另外的的工程。所以如果想引用现在开发的这个项目(前提是已开发完毕并发布到了远程仓库),就需要在被引入工程的pom文件中新建一个dependency节点,将本项目的groupId、artifactId、version写入, maven就会把这个上传的jar包下载到他的本地。
在这里插入图片描述
然后将其添加到provider层的pom文件中的里买呢就可以实现想要完成的依赖。另外需要注意的是不能互相进行依赖,否则会报错。

~~

功能测试

~~
测试类介绍在此不再赘述,上一篇文章简单介绍过,下面着重介绍测试类实现过程重环境的配置。
可以看到测试基类主要代码如下图所示在这里插入图片描述
其中runwith注解就是一个运行器,在上文是用与让测试运行于Spring测试环境;
另外contextConfiguration用于配置文件,其中dalTest-applicationContext.xml是测试配置文件,其配置如下所示

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	   xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
	   xmlns:aop="http://www.springframework.org/schema/aop"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd 
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd ">


	<context:component-scan base-package="com.zhicong.coupon" />
	<context:property-placeholder ignore-resource-not-found="true" location="application-dev.properties"/>

    <import resource="classpath*:/spring/test/*.xml"/>
</beans>

需要注意的是最后三句配置,倒数第三句指的是扫描的包;

  • 倒数第三句指的是扫描的包;spring可以自动扫描base-package下面或者子包下面的java文件,如果扫描有@Component @Service @Controller等这些注解的类,则把这些类注册为bean。
  • 倒数第二句适用于制定运行环境文件application-dev.properties,有了这一句之后/src/main/resources/application-dev.properties文件就会被spring加载;可以参考 https://www.cnblogs.com/baininghan/p/3995710.html
  • 倒数第一句就是用于引入所有测试用到的配置文件。在Spring的配置文件,有时候为了分模块的更加清晰的进行相关实体类的配置,在一个整体的配置文件中使用 引入。

具体如下图所示。
在这里插入图片描述
还有一个值得注意的是前面已经提过的
System.setProperty(“disconf.conf”, “application-test.properties”);
在java中System.setProperty()用于设置系统属性,在上面是用于将系统环境设置到测试环境下。
对于setProperty (String prop, String value);他的属性含义如下所示:

  • prop - 系统属性的名称。
  • value - 系统属性的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值