後端訂單接口開發

一 準備

1 訂單工具類

/**
* @className: OrderNoUtils
* @description: 訂單號工具類
* @date: 2021/1/2
* @author: cakin
*/
public class OrderNoUtils {
    /**
     * 功能描述:獲取訂單號
     *
     * @return String 訂單號
     * @author cakin
     * @date 2021/1/2
     */
    public static String getOrderNo() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String newDate = sdf.format(new Date());
        String result = "";
        Random random = new Random();
        for (int i = 0; i < 3; i++) {
            result += random.nextInt(10);
        }
        return newDate + result;
    }
}

2 課程Dto對象

/**
* @className: CourseDto
* @description: 課程Dto
* @date: 2021/1/2
* @author: cakin
*/
@Data
public class CourseDto implements Serializable {
    private static final long serialVersionUID = 1L;
    private String id; // 課程ID
    private String title; // 課程標題
    private BigDecimal price; // 課程銷售價格,設置爲0則可免費觀看
    private String cover; // 課程封面圖片路徑
    private String teacherName; // 課程講師
}

DTO(Data Transfer Object):服務和服務之間的數據傳輸對象。

3 會員Dto

/**
* @className: MemberDto
* @description: 會員Dto
* @date: 2021/1/2
* @author: cakin
*/
@Data
public class MemberDto implements Serializable {
    private static final long serialVersionUID = 1L;
    private String id; // 會員id
    private String mobile; // 手機號
    private String nickname; // 暱稱
}

二 service_edu中創建接口

根據課程id獲取訂單中需要的課程和講師信息

1 controller

ApiCourseController

/**
* 功能描述:根據課程id查詢課程信息
*
* @param courseId 課程Id
* @return CourseDto 課程Dto
* @author cakin
* @date 2021/1/2
*/
@ApiOperation("根據課程id查詢課程信息")
@GetMapping("inner/get-course-dto/{courseId}")
public CourseDto getCourseDtoById(@ApiParam(value = "課程ID", required = true) @PathVariable String courseId) {
    CourseDto courseDto = courseService.getCourseDtoById(courseId);
    return courseDto;
}

2 service層

接口

/**
* 功能描述:根據課程id查詢課程信息
*
* @param courseId 課程Id
* @return CourseDto 課程Dto
* @author cakin
* @date 2021/1/2
*/
CourseDto getCourseDtoById(String courseId);

實現

/**
* 功能描述:根據課程id查詢課程信息
*
* @param courseId 課程Id
* @return CourseDto 課程Dto
* @author cakin
* @date 2021/1/2
*/
@Override
public CourseDto getCourseDtoById(String courseId) {
    return baseMapper.selectCourseDtoById(courseId);
}

3 mapper

接口

/**
* 功能描述:根據課程id查詢課程信息
*
* @param courseId 課程Id
* @return CourseDto 課程Dto
* @author cakin
* @date 2021/1/2
*/
CourseDto selectCourseDtoById(String courseId);

XML文件

<select id="selectCourseDtoById" resultType="com.atguigu.guli.service.base.dto.CourseDto">
  SELECT
  c.id,
  c.title,
  CONVERT(c.price, DECIMAL(8,2)) AS price,
  c.cover,
  t.name AS teacherName
  FROM edu_course c
  LEFT JOIN edu_teacher t ON c.teacher_id = t.id
  WHERE
  c.id = #{id}
</select>

三 service_ucenter中創建接口

根據用戶id獲取訂單中需要的會員信息

1 controller

ApiMemberController

/**
* 功能描述:根據會員id查詢會員信息
*
* @param memberId 會員id
* @return MemberDto 會員Dto
* @author cakin
* @date 2021/1/2
*/
@ApiOperation("根據會員id查詢會員信息")
@GetMapping("inner/get-member-dto/{memberId}")
public MemberDto getMemberDtoByMemberId(
        @ApiParam(value = "會員ID", required = true)
        @PathVariable String memberId) {
    MemberDto memberDto = memberService.getMemberDtoByMemberId(memberId);
    return memberDto;
}

2 service

接口

/**
* 功能描述:根據會員id查詢會員信息
*
* @param memberId 會員id
* @return MemberDto 會員Dto
* @author cakin
* @date 2021/1/2
*/
MemberDto getMemberDtoByMemberId(String memberId);

實現

/**
* 功能描述:根據會員id查詢會員信息
*
* @param memberId 會員id
* @return MemberDto 會員Dto
* @author cakin
* @date 2021/1/2
*/
@Override
public MemberDto getMemberDtoByMemberId(String memberId) {
    Member member = baseMapper.selectById(memberId);
    MemberDto memberDto = new MemberDto();
    BeanUtils.copyProperties(member, memberDto);
    return memberDto;
}

四 service_trade遠程調用

1 調用service_edu

接口:

@Service
@FeignClient(value = "service-edu", fallback = EduCourseServiceFallback.class)
public interface EduCourseService {
    /**
     * @className: EduCourseService
     * @description: 根據課程Id獲得課程信息
     * @date: 2021/1/2
     * @author: cakin
     */
    @GetMapping("/api/edu/course/inner/get-course-dto/{courseId}")
    CourseDto getCourseDtoById(@PathVariable(value = "courseId") String courseId);
}

容錯:

/**
* @className: EduCourseServiceFallback
* @description: 容錯處理
* @date: 2021/1/2
* @author: cakin
*/
@Service
@Slf4j
public class EduCourseServiceFallback implements EduCourseService {
    @Override
    public CourseDto getCourseDtoById(String courseId) {
        log.info("熔斷保護");
        return null;
    }
}

2 調用service_ucenter

接口:

/**
* 功能描述:根據會員Id獲得會員信息
*
* @param memberId 會員id
* @return MemberDto 會員Dto
* @author cakin
* @date 2021/1/2
*/
@GetMapping("/api/ucenter/member/inner/get-member-dto/{memberId}")
MemberDto getMemberDtoByMemberId(@PathVariable(value = "memberId") String memberId);

容錯:

/**
* @className: UcenterMemberServiceFallback
* @description: 會員容錯
* @date: 2021/1/2
* @author: cakin
*/
@Service
@Slf4j
public class UcenterMemberServiceFallback implements UcenterMemberService {
    @Override
    public MemberDto getMemberDtoByMemberId(String memberId) {
        log.info("熔斷保護");
        return null;
    }
}

五 在service_trade中保存訂單

1 controller

ApiOrderController創建新增訂單方法

/**
* 功能描述:新增訂單
*
* @author cakin
* @date 2021/1/2
* @param courseId 課程id
* @param request 從中會得到jwtInfo
* @return R 返回給前端的數據
*/
@ApiOperation("新增訂單")
@PostMapping("auth/save/{courseId}")
public R save(@PathVariable String courseId, HttpServletRequest request){


    JwtInfo jwtInfo = JwtUtils.getMemberIdByJwtToken(request);
    String orderId = orderService.saveOrder(courseId, jwtInfo.getId());
    return R.ok().data("orderId", orderId);
}

2 service

OrderService接口

/**
* 功能描述:新增訂單
*
* @author cakin
* @date 2021/1/2
* @param courseId 課程id
* @param memberId 會員Id
* @return String 訂單號
*/
String saveOrder(String courseId, String memberId);

OrderServiceImpl實現

/**
* 功能描述:新增訂單
*
* @author cakin
* @date 2021/1/2
* @param courseId 課程id
* @param memberId 會員Id
* @return String 訂單號
*/
@Override
public String saveOrder(String courseId, String memberId) {
    // 查詢當前用戶是否已有當前課程的訂單
    QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("course_id", courseId);
    queryWrapper.eq("member_id", memberId);
    Order orderExist = baseMapper.selectOne(queryWrapper);
    if(orderExist != null){
        return orderExist.getId(); // 如果訂單已存在,則直接返回訂單id
    }
    // 查詢課程信息
    CourseDto courseDto = eduCourseService.getCourseDtoById(courseId);
    if(courseDto == null){
        throw new GuliException(ResultCodeEnum.PARAM_ERROR);
    }
    // 查詢用戶信息
    MemberDto memberDto = ucenterMemberService.getMemberDtoByMemberId(memberId);
    if(memberDto == null){
        throw new GuliException(ResultCodeEnum.PARAM_ERROR);
    }
    // 創建訂單
    Order order = new Order();
    order.setOrderNo(OrderNoUtils.getOrderNo()); //訂單號
    order.setCourseId(courseId);
    order.setCourseTitle(courseDto.getTitle());
    order.setCourseCover(courseDto.getCover());
    order.setTeacherName(courseDto.getTeacherName());
    order.setTotalFee(courseDto.getPrice().multiply(new BigDecimal(100))); // 單位:分
    order.setMemberId(memberId);
    order.setMobile(memberDto.getMobile());
    order.setNickname(memberDto.getNickname());
    order.setStatus(0); // 未支付
    order.setPayType(1); // 微信支付
   baseMapper.insert(order);
   return order.getId();
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章