在线教育项目-day15【微信支付后端开发-生成订单】

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);
    }
原文地址:https://www.cnblogs.com/dmzna/p/12876362.html