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);
        }
  • 相关阅读:
    CCF-CSP201703-3 Markdown
    HDU1008 Elevator
    Java使用Preconditions.checkNotNull(.....)优雅地判空对象, 并处理可能的NullPointerException异常
    StringUtils的isBlank()方法
    java.math.RoundingMode 几个参数详解
    把String集合数据去"[ ]" 转成list和把String集合数据去除[ "" ,""] 转成list 工具类
    BeanUtils.copyProperties(复制对象属性方法)
    关于 mybatis 中 in 写法,<foreach collection="xxx" item="xxx" index="index" open="(" separator="," close=")"> 参数详解
    JAVA_collection_集合相关知识点(二、获取集合对象中某个属性的集合——CollectionUtils.collect()方法)
    @AllArgsConstructor @NoArgsConstructor
  • 原文地址:https://www.cnblogs.com/dmzna/p/12876362.html
Copyright © 2011-2022 走看看