zoukankan      html  css  js  c++  java
  • 在线教育项目-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);
        }
  • 相关阅读:
    14_java之变量|参数|返回值|修饰符
    NYOJ 202 红黑树 (二叉树)
    NYOJ 138 找球号(二) (哈希)
    NYOJ 136 等式 (哈希)
    NYOJ 133 子序列 (离散化)
    NYOJ 129 树的判定 (并查集)
    NYOJ 117 求逆序数 (树状数组)
    NYOJ 93 汉诺塔 (数学)
    HDU 2050 折线分割平面 (数学)
    天梯赛L2-008 最长对称子串 (字符串处理)
  • 原文地址:https://www.cnblogs.com/dmzna/p/12876362.html
Copyright © 2011-2022 走看看