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

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方法聚合数据
如:

   @Overridepublic 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 {@Beanpublic MessageConverter messageConverter(){return new Jackson2JsonMessageConverter();}
}

2.通用MQ发送消息的类

@Service
public class RabbitService {@Autowiredprivate 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 {@Autowiredprivate ScheduleService scheduleService;@Autowiredprivate 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 {@Autowiredprivate 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.mzph.cn/news/109797.shtml

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

相关文章

Flask自定义装饰和g的使用

1. 在commons.py文件中新增一个装饰器类: 注&#xff1a;一定要加入wraps进行装饰否则&#xff0c;装饰器在给多个函数进行装饰时会报错 from functools import wraps from flask import session, current_app, g# 定义登陆装饰器&#xff0c;封装用户的登陆数据 def user_log…

软考-认证技术原理与应用

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 by 2023年10月 网络安全认证技术是指通过密码、数字证书、生物特征识别等手段&#xff0c;对使用网络的用…

【Mac】时间机器频繁提示磁盘没有正常推出

问题描述 有一次在进行时间机器备份的时候总是提示“磁盘没有正常推出”&#xff0c;并且好几次直接导致系统重启… 估计是 MacOS 系统 bug 解决 看了 Vex 一个帖子之后设置了一个硬盘是否休眠就好了&#xff0c;不要勾选让硬盘处于休眠就可以了&#xff0c;在电池选项界面中…

MySQL 8.0 OCP认证精讲视频、环境和题库之五 事务、缓存

redo log buffer&#xff1a; 缓存与事务有关的redo log ,用来对mysql进行crash恢复&#xff0c;不可禁用&#xff1b; 日志缓冲区是存储要写入磁盘上日志文件的数据的内存区域。日志缓冲区大小由innodb_Log_buffer_size变量定义。 默认大小为16MB。日志缓冲区的内容会定…

2023-10-17 mysql-从库从binlog回放事件-分析

摘要: 2023-10-17 mysql-从库从binlog回放事件-分析 上下文: 2023-10-17 mysql-配置主从-记录-CSDN博客 场景: 两个机器上分别装mysql一个mysql配置成master,另外一个配置成slave, 并建立主从关系配置binlog为row格式在master上insert一条数据在slave的handler接口ha_write…

微信小程序-4

一、使用scss编译wxss文件 1.vscode安装easysass扩展 vscode插件 - - - easysass - - - 安装 2.微信小程序 导入vscode扩展 开发者工具 - - - 视图 - - - 扩展 - - - 右侧三个点 - - - 导入已安装的vscode扩展 3.编辑 打开编辑器扩展目录&#xff0c;找到easysass文件夹&…

spring-statemachine 状态机自定义持久化入库

使用 spring-statemachine 状态机持久化时&#xff0c;可以通过内存、spring-statemachine-redis 或 spring-statemachine-data-jpa 现有方式持久化处理。 因项目审核操作记录频繁&#xff0c;数据量大&#xff0c;使用 内存 或 spring-statemachine-redis 模式不可取&#xf…

QTday02(常用类、UI界面下的开发、信号与槽)

今日任务 1. 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#x…

v-model表单数据双向绑定-表单提交示例

示例如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>v-model表单数据双向绑定<…

354 俄罗斯套娃信封问题(贪心+二分)

题目 链接 给你一个二维整数数组 envelopes &#xff0c;其中 envelopes[i] [wi, hi] &#xff0c;表示第 i 个信封的宽度和高度。 当另一个信封的宽度和高度都比这个信封大的时候&#xff0c;这个信封就可以放进另一个信封里&#xff0c;如同俄罗斯套娃一样。 请计算 最多…

【17.19消失的两个数字】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:vector<int> missingTwo(vector<int>& nums) {//找到a^bint temp0;for(auto num:nums){temp^num;}for(int i1;i<nums.size()2;i){temp^i;}//找…

Flink测试利器之DataGen初探 | 京东云技术团队

什么是 Flinksql Flink SQL 是基于 Apache Calcite 的 SQL 解析器和优化器构建的&#xff0c;支持ANSI SQL 标准&#xff0c;允许使用标准的 SQL 语句来处理流式和批处理数据。通过 Flink SQL&#xff0c;可以以声明式的方式描述数据处理逻辑&#xff0c;而无需编写显式的代码…

React 路由总结 react-router-dom6+react-router-dom5

开题 单页面应用和多页面应用 SPA&#xff1a;单页面应用程序&#xff0c;整个应用中只有一个页面(index.html) MPA&#xff1a;多页面应用程序&#xff0c;整个应用中有很多页面(*.html) react路由 现在的前端应用大多都是SPA单页面应用程序&#xff0c;也就是一个HTML页面的…

百度OCR识别图片文本字符串——物联网上位机软件

一、开发背景 根据项目需求&#xff0c;我们需要完成LED显示屏实时显示歌词的效果。最优的方法是调用歌曲播放器的API获取歌词&#xff0c;但是由于这个开发资格不是很好申请&#xff0c;因此我们采用其他方案&#xff0c;即通过OCR识别获取歌词&#xff0c;并投射到LED显示屏上…

二、电脑装机实践

计算机装机实践 一、零部件组装与启动二、操作系统安装与使用2.0 先导内容&#xff1a;BIOS引导模式、Boot Loader-引导加载程序、硬盘分区模式2.1 Win11安装2.2 Ubuntu22.042.2.0 Ubuntu简介2.2.1 Ubuntu22.04安装2.2.2 Ubuntu22.04使用2.2.2.1 新建文件模版2.2.2.2 给新安装应…

ExposureDiffusion: Learning to Expose for Low-light Image Enhancement论文阅读笔记

南洋理工大学、鹏城实验室、香港理工大学在ICCV2023发表的暗图增强论文。用diffusion模型来进行raw图像暗图增强&#xff0c;同时提出了一个自适应的残差层用来对具有不同信噪比的不同区域采取不同的去噪策略。 方法的框图如下所示&#xff1a; 一张raw图片可以由信号和噪声…

如何解决idea运行出现java: 程序包XX不存在

原因一&#xff1a;pom.xml没有将程序包XXX的<dependency>配置 直接将程序包的<dependency>配置写上即可 原因二&#xff1a;maven配置问题 打开idea的Settings, 进入Build Execution Deployment/Build Tools/Maven/Runner,将Delegate IDE勾上就可以了。(将idea…

Maven 基础教程系列

Maven是一个项目开发管理和理解工具。基于项目对象模型的概念&#xff1a;构建、依赖关系管理、文档创建、站点发布和分发发布都由pom.xml声明性文件控制。Maven可以通过插件进行扩展&#xff0c;以使用许多其他开发工具来报告或构建过程。 一、Maven 使用教程-CSDN博客 二、…

Eclipse Xtext 实现PLC ST 语言到C的转换

Eclipse Xtext 是开发领域专用语言&#xff08;DSL&#xff09;的工具。例如数据库的SQL 语言&#xff0c;PLC 的ST 语言都是一种领域专用语言。在开放自动化领域&#xff0c;提倡基于模型的设计方法。DSL 是描述模型的强有力工具。 在开发PLC 程序IDE时&#xff0c;开发ST编译…

网络安全内网渗透之信息收集--systeminfo查看电脑有无加域

systeminfo输出的内容很多&#xff0c;包括主机名、OS名称、OS版本、域信息、打的补丁程序等。 其中&#xff0c;查看电脑有无加域可以快速搜索&#xff1a; systeminfo|findstr "域:" 输出结果为WORKGROUP&#xff0c;可见该机器没有加域&#xff1a; systeminfo…