Java-springboot基于分布式存储的仿小米卡包优惠券后台系统(二)商户投放系统开发

(一)实体对象定义

创建包entity,创建商户对象模型,这里使用了大量的注解方法来去构建实体对象来去映射到数据库中的数据表

这里可能会报错:错误是关于通过Idea连接数据库,按照提示在IDEA连接数据库就行,也就是上面所提到的方法,当然我测试了一下,我将程序跑起来也没有出现运行时的错误

package com.hyb.passbook.merchants.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

/**
 * 商户对象模型
 */
@Data //实现get和set方法
@NoArgsConstructor //实现无参的构造函数
@AllArgsConstructor //实现全参的构造函数
@Entity //表明是一个实体对象
@Table(name = "merchants") //表明是数据表实体对象的定义,定义了表的名字
public class Merchants {
    /** 商户 id, 主键 */
    @Id
    @GeneratedValue //自动生成
    @Column(name = "id", nullable = false)
    private Integer id;

    /** 商户名称, 需要是全局唯一的 */
    @Basic
    @Column(name = "name", unique = true, nullable = false)
    private String name;

    /** 商户 logo */
    @Basic
    @Column(name = "logo_url", nullable = false)
    private String logoUrl;

    /** 商户营业执照 */
    @Basic
    @Column(name = "business_license_url", nullable = false)
    private String businessLicenseUrl;

    /** 商户的联系电话 */
    @Basic
    @Column(name = "phone", nullable = false)
    private String phone;

    /** 商户地址 */
    @Basic
    @Column(name = "address", nullable = false)
    private String address;

    /** 商户是否通过审核 */
    @Basic
    @Column(name = "is_audit", nullable = false)
    private Boolean isAudit = false;
}

(二)定义dao层,创建相关接口

package com.hyb.passbook.merchants.dao;

import com.hyb.passbook.merchants.entity.Merchants;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * 描述 : dao接口
 * Merchants:映射表的实体类
 * Interger:主键的类型
 */
public interface MerchantsDao extends JpaRepository<Merchants,Integer> {
    //根据id,获取商户对象
    Merchants findById(Integer id);

    //根据商户名称,获取商户对象
    Merchants findByName(String name);
}

(三)定义service层和service的实现

创建VO包和VO类:作用是在service之间做业务传递的存在

package com.hyb.passbook.merchants.vo;

import com.hyb.passbook.merchants.constant.ErrorCode;
import com.hyb.passbook.merchants.dao.MerchantsDao;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
 * 描述:投放的优惠券对象定义
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PassTemplate {
    //所属商户id
    private Integer id;

    //优惠券标题
    private String title;

    //优惠券的摘要
    private String summary;

    //优惠券的详细信息
    private String desc;

    //最大个数限制
    private Long limit;

    //优惠券是否有token,token 存储于Redis 中,每次领取从Redis中获取
    private Boolean hasToken;

    //优惠券背景色
    private Integer background;

    //优惠券开始时间
    private Date start;

    //优惠券结束时间
    private Date end;

    //校验优惠券对象的有效性:校验优惠券的ID在不在商户表中保存
    public ErrorCode validate(MerchantsDao merchantsDao){
        if (null == merchantsDao.findById(id)){
            return ErrorCode.MERCHANTS_NOT_EXIST;
        }
        return ErrorCode.SUCCESS;
    }
}
package com.hyb.passbook.merchants.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 描述:通用的响应对象给客户端
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Response {
    //错误码:正确返回0
    private Integer errorCode;

    //错误信息,正确返回空字符串
    private String errorMsg;

    //返回对象
    private Object data;

    //正确响应的构造函数
    public Response(Object data) {
        this.data = data;
    }
}

创建商户的请求和响应对象

我在这里遇到一个坑,我在entity中加入@Data后并在调用类的时候,并没有get和set的方法,是因为没有安装Lombok插件的原因,等插件安装完后,就能解决这个问题

package com.hyb.passbook.merchants.vo;

import com.hyb.passbook.merchants.constant.ErrorCode;
import com.hyb.passbook.merchants.dao.MerchantsDao;
import com.hyb.passbook.merchants.entity.Merchants;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 描述:创建商户请求对象
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CreateMerchantsRequest {
    //商户名称
    private String name;

    //商户logo的URL
    private String logoUrl;

    //商户营业执照
    private String businessLicenseUrl;

    //商户联系电话
    private String phone;

    //商户地址
    private String address;

    //商户验证请求的有效性
    public ErrorCode vaildate(MerchantsDao merchantsDao){
        if (merchantsDao.findByName(this.name) !=null) {
            return ErrorCode.DUPLICATE_NAME;
        }
        if (null == this.logoUrl) {
            return ErrorCode.EMPTY_LOGO;
        }
        if (null == this.businessLicenseUrl) {
            return ErrorCode.EMPTY_BUSINESS_LICENSE;
        }
        if (null == this.address){
            return ErrorCode.EMPTY_ADDRESS;
        }
        if (null == this.phone) {
            return ErrorCode.ERROR_PHONE;
        }
        return ErrorCode.SUCCESS;
    }
    //将请求对象转化为Merchants数据库对象
    public Merchants toMerchants(){
        Merchants merchants = new Merchants();
        merchants.setName(name);
        merchants.setLogoUrl(logoUrl);
        merchants.setBusinessLicenseUrl(businessLicenseUrl);
        merchants.setAddress(address);
        merchants.setPhone(phone);
        return merchants;
    }
}

package com.hyb.passbook.merchants.vo;

import com.hyb.passbook.merchants.constant.ErrorCode;
import com.hyb.passbook.merchants.dao.MerchantsDao;
import com.hyb.passbook.merchants.entity.Merchants;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 描述:创建商户响应对象
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CreateMerchantsResponse {
    //商户id 创建失败为-1
    private Integer id;
}

创建商户服务接口与实现

package com.hyb.passbook.merchants.service;

import com.hyb.passbook.merchants.vo.CreateMerchantsRequest;
import com.hyb.passbook.merchants.vo.PassTemplate;
import com.hyb.passbook.merchants.vo.Response;

/**
 * 商户服务接口定义
 */
public interface IMerchantsService {
    //创建商户服务
    Response createMerchants(CreateMerchantsRequest request);

    //根据ID构造商户信息
    Response bulidMerchantsInfoById(Integer id);

    //投放优惠券
    Response dropPassTemplate(PassTemplate template);
}
package com.hyb.passbook.merchants.service.impl;

import com.hyb.passbook.merchants.constant.ErrorCode;
import com.hyb.passbook.merchants.dao.MerchantsDao;
import com.hyb.passbook.merchants.service.IMerchantsService;
import com.hyb.passbook.merchants.vo.CreateMerchantsRequest;
import com.hyb.passbook.merchants.vo.CreateMerchantsResponse;
import com.hyb.passbook.merchants.vo.PassTemplate;
import com.hyb.passbook.merchants.vo.Response;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * 描述:商户服务接口实现
 */
@Slf4j
@Service
public class IMerchantsServiceImpl implements IMerchantsService {
    @Autowired
    private  MerchantsDao merchantsDao;

//kafka 这里会报错,是因为IDEA不能识别kafka,不会有运行时的错误
    @Autowired
    private KafkaTemplate<String,String> kafkaTemplate;
    
    @Override
    @Transactional
    public Response createMerchants(CreateMerchantsRequest request) {
        Response response = new Response();
        CreateMerchantsResponse merchantsResponse = new CreateMerchantsResponse();
        //先对用户的请求进行校验
        ErrorCode errorCode = request.vaildate(merchantsDao);
        if (errorCode != ErrorCode.SUCCESS) {
            merchantsResponse.setId(-1);
            response.setErrorCode(errorCode.getCode());
            response.setErrorMsg(errorCode.getDesc());
        }else {
            merchantsResponse.setId(merchantsDao.save(request.toMerchants()).getId());
        }
        response.setData(merchantsResponse);
        return response;
    }

    @Override
    public Response bulidMerchantsInfoById(Integer id) {
        //创建响应对象
        Response response = new Response();
        //根据商户ID查询优惠券信息
        Merchants merchants = merchantsDao.findById(id);
        //查询为空,则报错
        if (merchants == null) {
            response.setErrorCode(ErrorCode.MERCHANTS_NOT_EXIST.getCode());
            response.setErrorMsg(ErrorCode.MERCHANTS_NOT_EXIST.getDesc());
        }
        //查询不为空,则将查询结果返回
        response.setData(merchants);
        return response;
    }

    @Override
    public Response dropPassTemplate(PassTemplate template) {
        Response response = new Response();
        //进行优惠券在不在商户的校验
        ErrorCode errorCode = template.validate(merchantsDao);
        if (errorCode != ErrorCode.SUCCESS) {
            response.setErrorCode(errorCode.getCode());
            response.setErrorMsg(errorCode.getDesc());
        }else {
            String passTemplate = JSON.toJSONString(template);
            kafkaTemplate.send(
                    Constant.TEMPLATE_TOPIC,
                    Constant.TEMPLATE_TOPIC,
                    passTemplate
            );
            log.info("Drop PassTemplates : {}",passTemplate);
        }
    return response;
    }
}

商户商户服务测试,将3个接口测试的代码和结果同一打印出来

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class IMerchantsServiceImplTest extends TestCase {
    @Autowired
    private IMerchantsService merchantsService;
    @Test
    @Transactional
    public void testCreateMerchants() {
        CreateMerchantsRequest request = new CreateMerchantsRequest();
        request.setName("hyb");
        request.setLogoUrl("http:xxx.com");
        request.setBussinessLicenseUrl("hyb.logo");
        request.setPhone("123456");
        request.setAddress("china");
        System.out.println(JSON.toJSONString(merchantsService.createMerchants(request)));
    }
        @Test
    public void testBulidMerchantsInfoById() {
        System.out.println(JSON.toJSONString(merchantsService.bulidMerchantsInfoById(1)));
    }
        @Test
    public void testDropPassTemplate() {
        PassTemplate passTemplate = new PassTemplate();
        passTemplate.setId(1);
        passTemplate.setTitle("hyb");
        passTemplate.setSummary("good");
        passTemplate.setDesc("hello");
        passTemplate.setLimit(1000L);
        passTemplate.setHasToken(false);
        passTemplate.setBackground(2);
        passTemplate.setStart(new Date());
        passTemplate.setEnd(new Date());
        System.out.println(JSON.toJSONString(merchantsService.dropPassTemplate(passTemplate)));
    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
惠多优惠券系统2013最新版,更新日期2013年6月 功能列表: 1. 智能搜索,分词搜索,能根据街道、商家名称、地址、商圈、优惠名称等关键词检索; 2. 可扩展全国城市分站(分站费用另计),搜优惠,搜商家,积分商城,活动专区,分类导航功能,品牌导航功能,商家联盟功能; 3. 后台多级管理,可实现不同权限管理员分版块管理,并由总管理员统一管理; 4. 注册用户分三级,a:网友,b:商家,c:VIP商家;网友先登记自己的店铺,然后申请并认领店铺,就拥有了商家管理权限。商家可管理店铺信息,相册,地图,发布优惠券等,优惠券智能管理,根据优惠时段区别显示,一般网友注册后能下载、打印使用优惠券,发点评、晒消费经验等等; 5. 短信优惠券下载(短信付费),下载数量可后台设置;会员可打印数量也可在后台控制,方便管理,短信、下载记录可在后台及时查看;商家后台也可查看网友消费记录等; 6 商家在线高清相册、在线打印优惠券、在线纸媒DM阅读,传统广告媒体和互联网新媒体有效结合,利用四种渠道做广告模式:电脑,手机,杂志,终端触摸机等; 7. 自带3G手机站版,支持iphone,andriod等主流智能机屏幕显示,手机访问速度快,下载优惠更快捷,接收短信更方便; 8. 网站各页面的广告位灵活管理,优惠券频道页可实现优惠券置顶并排序(类似百度竞价排名)功能; 9. 系统整体完美兼容各款浏览器 ie6 ie7 ie8 ie9 chrome firefox 等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值