(一)实体对象定义
创建包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)));
}



1157



被折叠的 条评论
为什么被折叠?



