一 準備
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();
}