1.新建模块service-order
2.创建表 t_order
表t_pay_log
3.引入依赖
<dependencies> <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version>0.0.3</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> </dependency> </dependencies>
4.创建配置文件
# 服务端口
server.port=8005
# 服务名
spring.application.name=service-order
# 环境设置:dev、test、prod
spring.profiles.active=dev
# mysql数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#Springboot2.0以上要加时区
spring.datasource.url=jdbc:mysql://localhost:3306/onlineedu?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
#返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
#配置mapper xml文件的路径
mybatis-plus.mapper-locations=classpath:com/dm/educenter/mapper/xml/*.xml
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#开启熔断机制
feign.hystrix.enabled=true
# 设置hystrix超时时间,默认1000ms
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
5.使用代码生成器生成对应结构
public class CodeGenerator { @Test public void run() { // 1、创建代码生成器 AutoGenerator mpg = new AutoGenerator(); // 2、全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getProperty("user.dir"); gc.setOutputDir("D:\idea\online_education\service\service-order" + "/src/main/java"); gc.setAuthor("DM"); gc.setOpen(false); //生成后是否打开资源管理器 gc.setFileOverride(false); //重新生成时文件是否覆盖 gc.setServiceName("%sService"); //去掉Service接口的首字母I gc.setIdType(IdType.ID_WORKER); //主键策略 gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型 gc.setSwagger2(true);//开启Swagger2模式 mpg.setGlobalConfig(gc); // 3、数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://localhost:3306/onlineedu?serverTimezone=GMT%2B8"); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("123456"); dsc.setDbType(DbType.MYSQL); mpg.setDataSource(dsc); // 4、包配置 PackageConfig pc = new PackageConfig(); pc.setParent("com.dm"); pc.setModuleName("eduorder"); //模块名 pc.setController("controller"); pc.setEntity("entity"); pc.setService("service"); pc.setMapper("mapper"); mpg.setPackageInfo(pc); // 5、策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setInclude("t_order","t_pay_log"); strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略 strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀 strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略 strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作 strategy.setRestControllerStyle(true); //restful api风格控制器 strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符 mpg.setStrategy(strategy); // 6、执行 mpg.execute(); } }
注意以下三个改动
6.书写对应接口
1.生成订单的接口
需要课程信息,所以我们需要nacos远程调用service-edu和,service-ucenter
为了能够返回一个通用对象,我们在common-utils中去创建两个实体类
和子模块内容是一样的
先写edu模块的方法
@PostMapping("getCourseOrderInfo/{id}") public CourseWebVoOrder getCourseOrderInfo(@PathVariable String id){ CourseWebVo courseWebVo=courseService.selectInfoWebById(id); CourseWebVoOrder courseWebVoOrder=new CourseWebVoOrder(); BeanUtils.copyProperties(courseWebVo,courseWebVoOrder); return courseWebVoOrder; }
再写Ucenter中的
//根据用户id获取用户信息 @PostMapping("getUserOrderInfo/{id}") public UcenterMemberOrder getUserOrderInfo(@PathVariable String id){ UcenterMemberOrder memeber=new UcenterMemberOrder(); UcenterMember ucenterMember=memberService.getById(id); //复制 BeanUtils.copyProperties(ucenterMember,memeber); return memeber; }
大致流程相同
2.要调用先需要nacos中注册
1.先在配置文件配置nacos地址
# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
2.在启动类上加注解
@EnableDiscoveryClient
3.在order子模块的启动类加上
@EnableFeignClients
3.创建两个远程调用方法
@Component @FeignClient("service-edu") public interface EduClient { @PostMapping("eduservice/coursefront/getCourseOrderInfo/{id}") public CourseWebVoOrder getCourseOrderInfo(@PathVariable("id") String id); }
@Component @FeignClient("service-ucenter") public interface UcenterClient { @PostMapping("/educenter/ucenter-member/getUserOrderInfo/{id}") public UcenterMemberOrder getUserOrderInfo(@PathVariable("id") String id); }
4.书写controller
//1生成订单方法 @PostMapping("createOrder/{courseid}") public R saveOrder(@PathVariable String courseid, HttpServletRequest request){ String userId=JwtUtils.getMemberIdByJwtToken(request); //返回订单号 String ordernum=orderService.createOrders(courseid,userId); return R.OK().data("orderId",ordernum); }
5. 书写ServiceImpl
@Override public String createOrders(String courseid, String userId) { //通过远程调用获取用户信息 UcenterMemberOrder ucenterMember=ucenterClient.getUserOrderInfo(userId); //通过远程调用获取课程信息 CourseWebVoOrder courseDto=eduClient.getCourseOrderInfo(courseid); TOrder order=new TOrder(); order.setOrderNo(OrderNoUtil.getOrderNo()); order.setCourseId(courseid); order.setCourseTitle(courseDto.getTitle()); order.setCourseCover(courseDto.getCover()); order.setTeacherName(courseDto.getTeacherName()); order.setTotalFee(courseDto.getPrice()); order.setMemberId(userId); order.setMobile(ucenterMember.getMobile()); order.setNickname(ucenterMember.getNickname()); order.setStatus(0); //支付类型 order.setPayType(1); baseMapper.insert(order); return order.getOrderNo(); }
5.书写controller
根据订单id查询订单信息
//2.根据订单id查询信息
@GetMapping("getOrderInfo/{orderid}")
public R getOrderInfo(@PathVariable String orderid){
QueryWrapper<TOrder> wrapper=new QueryWrapper<>();
wrapper.eq("order_no",orderid);
TOrder order=orderService.getOne(wrapper);
return R.OK().data("item",order);
}