7.MidBook项目经验之阿里OSS,微信支付(退款),定时任务,图表数据处理

news2024/11/16 23:47:40

1.阿里云实名认证

  1. 阿里云对象存储oss,标准高频率访问, 低频访问存储,归档存储(根本不经常访问)
    冗余存储(备份) 读写权限(所有人还是自己访问)
   @Component public class ConstantOssPropertiesUtils implements InitializingBean {不用注入,由spring创建bean
  1. 使用流 MultipartFile得到流,返回url,防止文件覆盖(使用uuid)
   //生成UUID,但是遇到-全部替换为空格
   UUID.randomUUID().toString().replaceAll("-","");
  1. 根据日期分类(好用配合joda-time日期工具)
     new DateTime().toString("yyyy/MM/dd");
   	 fileName=timeUrl+"/"+fileName; 
  1. 用户认证信息在请求头得到,然后通过id更新用户认证信息

2.nuxt 跳/user固定路由 需要创建 page/user/index.vue

3.如果没有用户认证不能预约

4.写用户进行预约之前的增删改查,和管理员进行审核(改状态为2)
//分页对象遍历

 pages.getRecords().stream().forEach(item->{});

//重要的是处理 标志位的值为 其他数据,pack方法聚合数据
如:

   @Override
    public OrderInfo getOrder(String orderId) {//根据字典整合数据
        OrderInfo orderInfo = baseMapper.selectById(orderId);
        OrderInfo orderInfo1 = this.packOrderInfo(orderInfo);
        return orderInfo1;
    }
private OrderInfo packOrderInfo(OrderInfo orderInfo) {
    orderInfo.getParam().put("orderStatusString", OrderStatusEnum.getStatusNameByStatus(orderInfo.getOrderStatus()));
    return orderInfo;
}

5.预约挂号,获取可预约的日期(天数)
//放号时间(用户打开10点 过去了,需要可预约的时间+1)+周期

 releaseTime.isBeforeNow()//判断当前时间  过期
 new DateTime().plusDays(i).toString("yyyy-MM-dd"); //for,得到可预约的所有日期
 //对list分页,数据全部放进去会自动分页
    IPage<Date> ip=new Page(page,7,dateList.size());
     ip.setRecords(pageList);

6.预约挂号的统计日期,和处理统计mongodb的数据使用Aggregation
//聚合就是把一个对象,转换为另外一个对象(临时改一个对象的数据)
图预约日期聚合
在这里插入图片描述

7.list转map 使用流

8.如果业务太复杂就拆分成多个方法实现 如果是最后一页就设置为等待放号,某天如果超过预约时间就停止挂号

9.生成下单
修改预约数-1和可用预约数-1 使用mq,更新和短信通知

10.整合mq,提高下单的并发性,异步削峰(以免服务奔溃)

0.管理交换机和routing和队列的实体类

public class MqConst {
    /**
     * 预约下单
     */
    public static final String EXCHANGE_DIRECT_ORDER 
= "exchange.direct.order";
    public static final String ROUTING_ORDER = "order";
    //队列
    public static final String QUEUE_ORDER  = "queue.order";
    /**
     * 短信
     */
    public static final String EXCHANGE_DIRECT_MSM = "exchange.direct.msm";
    public static final String ROUTING_MSM_ITEM = "msm.item";
    //队列
    public static final String QUEUE_MSM_ITEM  = "queue.msm.item";


    public static final String EXCHANGE_DIRECT_TASK = "exchange.direct.task";
    public static final String ROUTING_TASK_8 = "task.8";
    //队列
    public static final String QUEUE_TASK_8 = "queue.task.8";
}

1.写MQ配置类,使用Jackson转换Json为字符串

@Configuration
public class MQConfig {
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}

2.通用MQ发送消息的类

@Service
public class RabbitService {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    /**
     *  发送消息
     * @param exchange 交换机
     * @param routingKey 路由键
     * @param message 消息
     */
    public boolean sendMessage(String exchange, String routingKey, Object message) {
        rabbitTemplate.convertAndSend(exchange, routingKey, message);
        return true;
    }
}
  1. 服务模块写监听类
@Component
public class HospitalReceiver {

    @Autowired
    private ScheduleService scheduleService;

    @Autowired
    private RabbitService rabbitService;

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = MqConst.QUEUE_ORDER, durable = "true"),
            exchange = @Exchange(value = MqConst.EXCHANGE_DIRECT_ORDER),
            key = {MqConst.ROUTING_ORDER}
    ))
    public void receiver(OrderMqVo orderMqVo, Message message, 
        //xxx写业务方法
    }
}

11.枚举类 values()得到所有枚举类

12.微信支付.查询微信支付状态, 其实就是要调用其他的服务接口

//注意支付的数量.要求参数是xml,用wx工具类可以设置(map转换) //二维码2个小时过期,使用redis
qriously前端显示二维码,因为微信返回地址是 weixin://协议
//在前端clearInterval定时不停查询后端支付状态(后端调用要修改数据库的相关接口)
//微信返回xml,又得变为map

/**
 * 根据订单号下单,生成支付链接
 */
@Override
public Map createNative(Long orderId) {
    try {
        Map payMap = (Map) redisTemplate.opsForValue().get(orderId.toString());
        if(null != payMap) return payMap;
        //根据id获取订单信息
        OrderInfo order = orderService.getById(orderId);
        // 保存交易记录
        paymentService.savePaymentInfo(order, PaymentTypeEnum.WEIXIN.getStatus());
        //1、设置参数
        Map paramMap = new HashMap();
        paramMap.put("appid", ConstantPropertiesUtils.APPID);
        paramMap.put("mch_id", ConstantPropertiesUtils.PARTNER);
        paramMap.put("nonce_str", WXPayUtil.generateNonceStr());
        String body = order.getReserveDate() + "就诊"+ order.getDepname();
        paramMap.put("body", body);
        paramMap.put("out_trade_no", order.getOutTradeNo());
        //paramMap.put("total_fee", order.getAmount().multiply(new BigDecimal("100")).longValue()+"");
       //以分为单位
        paramMap.put("total_fee", "1");
        paramMap.put("spbill_create_ip", "127.0.0.1");
        paramMap.put("notify_url", "http://guli.shop/api/order/weixinPay/weixinNotify");
        paramMap.put("trade_type", "NATIVE");
        //2、HTTPClient来根据URL访问第三方接口并且传递参数
        HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
        //client设置参数
        client.setXmlParam(WXPayUtil.generateSignedXml(paramMap, ConstantPropertiesUtils.PARTNERKEY));
        client.setHttps(true);
        client.post();
        //3、返回第三方的数据
        String xml = client.getContent();
        Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);
        //4、封装返回结果集
        Map map = new HashMap<>();
        map.put("orderId", orderId);
        map.put("totalFee", order.getAmount());
        map.put("resultCode", resultMap.get("result_code"));
        map.put("codeUrl", resultMap.get("code_url"));
        if(null != resultMap.get("result_code")) {
            //微信支付二维码2小时过期,可采取2小时未支付取消订单
            redisTemplate.opsForValue().set(orderId.toString(), map, 1000, TimeUnit.MINUTES);
        }
        return map;
    } catch (Exception e) {
        e.printStackTrace();
        return new HashMap<>();
    }
}

13.取消预约

1.未支付取消订单(直接修改数据库)
2.已经支付取消订单(需要退款) 先退款后更新(需要微信证书)写到配置文件(斜杠转义)
先查后改(http工具类设置证书)
//过了取消日期不能退款 最后mq更新预约数量
在这里插入图片描述

14.就医提醒(提前提醒不要超时)
//定时任务8点执行
//类加注解

   @Component
   @EnableSchedule
   //方法加
    @Scheduled(cron="")
    //生成工具 https://cron.qqe2.com复制七位(它生成了8位)
    //使用mq发送消息,其他服务监听到mq消息,进行发送短信

全部代码:

@Component
@EnableScheduling
public class ScheduledTask {

    @Autowired
    private RabbitService rabbitService;

    /**
     * 每天8点执行 提醒就诊
     */
    //@Scheduled(cron = "0 0 1 * * ?")
    @Scheduled(cron = "0/30 * * * * ?")
    public void task1() {
        System.out.println("aaa");
        rabbitService.sendMessage(MqConst.EXCHANGE_DIRECT_TASK, MqConst.ROUTING_TASK_8, "");
    }
}

15.预约统计(Echarts是百度捐给apache)柱状图饼图折线图
//x,y轴, 还有显示的统计数据数组
//mybatis的mapper文件的动态sql, 接口写@Param(“vo”)起别名,类写resultType=“全限定路径.xx”

<select >
           <where>
                       <if test="vo.hosname!=null and vo.hosname!='' ">
                                 and hosname like CONCAT('%',#{vo.hosname},'%') 
                       </if>
                       <if test="vo.reserve_date!=null and vo.reserve_date!='' ">
                              and  reserve_date >= #{vo.begin}
                       </if>
                            //坑爹,需要转义
                       <if test="vo.reserve_dateEnd!=null and vo.reserve_dateEnd!='' ">
                               and reserve_date &lt;= #{vo.reserve_dateEnd}
                       </if>
                           and is_deleted=0
          </where>
   </select>   
//还需要注意maven加打包插件
//map放两个list方便数据返回

16.stream流将list中的成员遍历变 1个list(如多个对象,只需要取到其中的name变为list)(方便前端图标显示)

   list.stream().map(Vo::name).collect(Collectors.toList());

17.NoSql总结

   1.redis做缓存和验证码有效时间
   2.mongodb存储数据提升查询效率 复杂查询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1106579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot整合RabbitMQ并实现消息发送与接收

系列文章目录 解析JSON格式参数 & 修改对象的key VUE整合Echarts实现简单的数据可视化 Java中运用BigDecimal对字符串的数值进行加减乘除等操作 List&#xff1c;HashMap&#xff1c;String,String&#xff1e;&#xff1e;实现自定义字符串排序&#xff08;key排序、Valu…

Node介绍(nvm安装和npm常用命令)

文章目录 Node 介绍为什么要学习 Node.jsNode.js 是什么Node能做什么nvm常用的 nvm 命令npm 快捷键npm 常用命令切换 npm 下包镜像源常用命令 Node 介绍 为什么要学习 Node.js 企业需求 具有服务端开发经验更改front-endback-end全栈开发工程师基本的网站开发能力 服务端前端…

TP4067带电池反接保护500MA线性锂电池充电芯片

概述 TP4067 是一款完整的单节锂电池充电器&#xff0c;带电池正负极反接保护输入电源正负极反接保护的单芯片&#xff0c;兼容大小3mA-600mA充电电流。采用涓流、恒流、恒压控制&#xff0c;SOT23-6封装与较少的外部元件数目使得TP4067成为便携式应用的理想选择.TP4067可以适…

ims-go项目搭建

通过集成开发工具Goland创建项目 整合Gin框架&#xff0c;在终端中输入如下命令&#xff1a; go get -u github.com/gin-gonic/gin 整合Gorm&#xff0c;安装命令如下&#xff1a; go get -u gorm.io/gorm 安装sqlserver驱动&#xff0c;安装命令如下&#xff1a; go get -u…

docker报错问题解决:Error Invalid or corrupt jarfile app.jar

文章目录 1.问题描述2.问题分析3.问题解决 1.问题描述 此时处在 /home/ubuntu/app 目录下&#xff0c;并且在该目录下有一个 jenkins-0.0.1-SNAPSHOT.jar。 我在 /home/ubuntu/app 目录下执行了 docker 容器运行命令&#xff1a; # 映射 8859 端口 # 容器名为 jenkins-demo #…

常用Python自动化测试框架有哪些?优缺点对比

随着技术的进步和自动化技术的出现&#xff0c;市面上出现了一些自动化测试框架。只需要进行一些适用性和效率参数的调整&#xff0c;这些自动化测试框架就能够开箱即用&#xff0c;大大节省了测试时间。而且由于这些框架被广泛使用&#xff0c;他们具有很好的健壮性&#xff0…

Unity DOTS System与SystemGroup概述

最近DOTS终于发布了正式的版本, 我们来分享以下DOTS里面System关键概念&#xff0c;方便大家上手学习掌握Unity DOTS开发。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经验呀&#xff01; System是迭代计算与处理World中的…

面试总结分享:25道数据库测试题

1&#xff09;什么是数据库测试&#xff1f; 数据库测试也称为后端测试。数据库测试分为四个不同的类别。数据完整性测试 数据有效性测试 数据库相关的性能 测试功能&#xff0c;程序和触发器 2&#xff09;在数据库测试中&#xff0c;我们需要正常检查什么&#xff1f; 通常&a…

【UE5】 ListView使用DataTable数据的蓝图方法

【UE5】 ListView使用DataTable数据的蓝图方法 ListView 是虚幻引擎中的一种用户界面控件&#xff0c;用于显示可滚动的列表。它可以用于显示大量的数据&#xff0c;并提供了各种功能和自定义选项来满足不同的需求。 DataTable是虚幻引擎中的一种数据表格结构&#xff0c;用于存…

美创科技信创数据安全「利基者」!

近日&#xff0c;第一新声研究部正式发布《2023年中国信创网络安全产品竞争力象限》&#xff08;下称“象限报告“&#xff09;。 ◼︎ 象限报告综合考虑企业占有率、在技术/应用上的成熟度、在客户方面的交付完成度及口碑、产品在市场/营销/商业模式/行业拓展等战略上的领先性…

在ERP管理系统中,库存管理的基本流程是什么?

在ERP管理系统中&#xff0c;库存管理的基本流程是什么&#xff1f; 下面我就以我们公司正在用的简道云库存管理系统为例&#xff0c;为大家进行库存管理基本流程的演示 这个系统是我们公司自己搭建的&#xff0c;大家如果有需要可以自取&#xff0c;也可以在模板的基础上自行…

0.3万粉暴涨700万播放,实现B站流量、变现双丰收

- 导语 经过国庆长假&#xff0c;2023年已经进入最后一个季度&#xff0c;平台内的热点一换再换&#xff0c;现在B站年轻人们正在关心什么内容、喜欢什么内容呢&#xff1f;本期飞瓜数据&#xff08;B站版&#xff09;盘点近期热点内容&#xff0c;提取有效素材和创作模式&…

基于JAVA实现的WEB端UI自动化 -自动化测试简单介绍

1 - Web自动化测试简介 软件测试领域技术不断创新 手工测试重复性工作量较大 技术革新&#xff0c;通过使用工具或者脚本代码让计算机帮助测试人员完成一些简单操作 1.1 自动化测试的本质 其本质是把手工测试转化成使用计算机、软件、程序来测试产品的过程。在设计 测试用例并…

GitLab-访问返回403 forbidden问题处理

访问gitlab时报错forbidden 一般访问量大&#xff0c;密码错误频率高的时候&#xff0c;gitlab防爆机制启动了&#xff0c;对IP做了封禁&#xff0c;导致某些IP访问的是否返回 403 forbidden 1. 查看被封的IP /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/red…

基于Spring boot轻松实现一个多数据源框架

Spring Boot 提供了 Data JPA 的包&#xff0c;允许你使用类似 ORM 的接口连接到 RDMS。它很容易使用和实现&#xff0c;只需要在 pom.xml 中添加一个条目&#xff08;如果使用的是 Maven&#xff0c;Gradle 则是在 build.gradle 文件中&#xff09;。 <dependencies>&l…

颠覆传统有线通讯,虹科IO-Link wireless解决方案让智能机床的旋转部件实现可靠低延迟无线通信

作为新工业革命的一部分&#xff0c;传统机床正迅速发展成为智能机床。在工业4.0技术的推动下&#xff0c;新的创新应用使机床的效率和功能达到了更高的水平。要实现这些功能&#xff0c;需要在机床上集成传感器和执行器&#xff0c;以提供实时数据和自动化控制。然而&#xff…

【数据结构】队列的实现与优化指南

一、前言 队列是一种重要的数据结构&#xff0c;它按照“先入先出”&#xff08;FIFO&#xff09;的原则管理数据。本文将介绍队列的概念、应用场景&#xff0c;以及如何使用数组实现普通队列和环形队列。 二、内容 2.1 概述 &#xff08;1&#xff09;什么是队列&#xff1…

ant的echo任务

通过echo&#xff0c;可以将一个消息输出到当前的日志记录器、监听器&#xff0c;如果没有覆盖的话&#xff0c;默认就是在控制台输出&#xff08;即System.out&#xff09;。 也可以将消息发送到文件。 可以使用的参数&#xff1a; 举例&#xff0c;build.xml文件的的内容如…

Sectigo OV通配符1590元

通配符SSL证书是一种特殊的SSL证书&#xff0c;它能够为多个域名提供加密保护&#xff0c;这种证书可以用于保护一个主域名及其所有子域名&#xff0c;适合子域名比较多的个人或者企事业单位使用。通配符SSL证书既节省了管理证书的时间&#xff0c;又减少了购买SSL证书的成本&a…

7、Linux驱动开发:设备-自动创建设备节点

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…