当前位置: 首页 > news >正文

网站推广的搜索引擎推广做建材哪个网站平台好

网站推广的搜索引擎推广,做建材哪个网站平台好,如何注册一个app平台,制作网站协议书订单管理 1. Spring Task1.1 介绍1.2 cron表达式1.3 入门案例1.3.1 Spring Task使用步骤1.3.2 代码开发1.3.3 功能测试 2.订单状态定时处理2.1 需求分析2.2 代码开发2.3 功能测试 3. WebSocket3.1 介绍3.2 入门案例3.2.1 案例分析3.2.2 代码开发3.2.3 功能测试 4. 来单提醒4.1 … 订单管理 1. Spring Task1.1 介绍1.2 cron表达式1.3 入门案例1.3.1 Spring Task使用步骤1.3.2 代码开发1.3.3 功能测试 2.订单状态定时处理2.1 需求分析2.2 代码开发2.3 功能测试 3. WebSocket3.1 介绍3.2 入门案例3.2.1 案例分析3.2.2 代码开发3.2.3 功能测试 4. 来单提醒4.1 需求分析和设计4.2 代码开发4.3 功能测试 5. 客户催单5.1 需求分析和设计5.2 代码开发5.2.1 Controller层5.2.2 Service层接口5.2.3 Service层实现类 1. Spring Task 1.1 介绍 Spring Task 是Spring框架提供的任务调度工具可以按照约定的时间自动执行某个代码逻辑。 定位定时任务框架 作用定时自动执行某段Java代码 应用场景 1). 信用卡每月还款提醒 2). 银行贷款每月还款提醒 3). 火车票售票系统处理未支付订单 4). 入职纪念日为用户发送通知 强调只要是需要定时处理的场景都可以使用Spring Task 1.2 cron表达式 cron表达式其实就是一个字符串通过cron表达式可以定义任务触发的时间 构成规则分为6或7个域由空格分隔开每个域代表一个含义 每个域的含义分别为秒、分钟、小时、日、月、周、年(可选) 举例 2022年10月12日上午9点整 对应的cron表达式为0 0 9 12 10 ? 2022 说明一般日和周的值不同时设置其中一个设置另一个用表示。 比如描述2月份的最后一天最后一天具体是几号呢可能是28号也有可能是29号所以就不能写具体数字。 为了描述这些信息提供一些特殊的字符。这些具体的细节我们就不用自己去手写因为这个cron表达式它其实有在线生成器。 cron表达式在线生成器 可以直接在这个网站上面只要根据自己的要求去生成corn表达式即可。所以一般就不用自己去编写这个表达式。 通配符 * 表示所有值 ? 表示未说明的值即不关心它为何值 - 表示一个指定的范围 , 表示附加一个可能值 / 符号前表示开始时间符号后表示每次递增的值 cron表达式案例 */5 * * * * ? 每隔5秒执行一次 0 */1 * * * ? 每隔1分钟执行一次 0 0 5-15 * * ? 每天5-15点整点触发 0 0/3 * * * ? 每三分钟触发一次 0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发 0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发 0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时 0 0 10,14,16 * * ? 每天上午10点下午2点4点 1.3 入门案例 1.3.1 Spring Task使用步骤 1). 导入maven坐标 spring-context 2). 启动类添加注解 EnableScheduling 开启任务调度 3). 自定义定时任务类 1.3.2 代码开发 编写定时任务类 进入sky-server模块中 package com.sky.task;import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;import java.util.Date;/*** 自定义定时任务类*/ Component Slf4j public class MyTask {/*** 定时任务 每隔5秒触发一次*/Scheduled(cron 0/5 * * * * ?)public void executeTask(){log.info(定时任务开始执行{},new Date());} }开启任务调度 启动类添加注解 EnableScheduling package com.sky;SpringBootApplication EnableTransactionManagement //开启注解方式的事务管理 Slf4j EnableCaching EnableScheduling public class SkyApplication {public static void main(String[] args) {SpringApplication.run(SkyApplication.class, args);log.info(server started);} }1.3.3 功能测试 启动服务查看日志 每隔5秒执行一次。 2.订单状态定时处理 2.1 需求分析 用户下单后可能存在的情况 下单后未支付订单一直处于待支付状态用户收货后管理端未点击完成按钮订单一直处于派送中状态 支付超时的订单如何处理 派送中的订单一直不点击完成如何处理 对于上面两种情况需要通过定时任务来修改订单状态具体逻辑为 通过定时任务每分钟检查一次是否存在支付超时订单下单后超过15分钟仍未支付则判定为支付超时订单如果存在则修改订单状态为“已取消”通过定时任务每天凌晨1点检查一次是否存在“派送中”的订单如果存在则修改订单状态为“已完成” 2.2 代码开发 1). 自定义定时任务类OrderTask待完善 package com.sky.task;/*** 自定义定时任务实现订单状态定时处理*/ Component Slf4j public class OrderTask {Autowiredprivate OrderMapper orderMapper;/*** 处理支付超时订单*/Scheduled(cron 0 * * * * ?)public void processTimeoutOrder(){log.info(处理支付超时订单{}, new Date());}/*** 处理“派送中”状态的订单*/Scheduled(cron 0 0 1 * * ?)public void processDeliveryOrder(){log.info(处理派送中订单{}, new Date());}}2). 在OrderMapper接口中扩展方法: /*** 根据状态和下单时间查询订单* param status* param orderTime*/Select(select * from orders where status #{status} and order_time #{orderTime})ListOrders getByStatusAndOrdertimeLT(Integer status, LocalDateTime orderTime);3). 完善定时任务类的processTimeoutOrder方法 /*** 处理支付超时订单*/Scheduled(cron 0 * * * * ?)public void processTimeoutOrder(){log.info(处理支付超时订单{}, new Date());LocalDateTime time LocalDateTime.now().plusMinutes(-15);// select * from orders where status 1 and order_time 当前时间-15分钟ListOrders ordersList orderMapper.getByStatusAndOrdertimeLT(Orders.PENDING_PAYMENT, time);if(ordersList ! null ordersList.size() 0){ordersList.forEach(order - {order.setStatus(Orders.CANCELLED);order.setCancelReason(支付超时自动取消);order.setCancelTime(LocalDateTime.now());orderMapper.update(order);});}}4). 完善定时任务类的processDeliveryOrder方法 /*** 处理“派送中”状态的订单*/Scheduled(cron 0 0 1 * * ?)public void processDeliveryOrder(){log.info(处理派送中订单{}, new Date());// select * from orders where status 4 and order_time 当前时间-1小时LocalDateTime time LocalDateTime.now().plusMinutes(-60);ListOrders ordersList orderMapper.getByStatusAndOrdertimeLT(Orders.DELIVERY_IN_PROGRESS, time);if(ordersList ! null ordersList.size() 0){ordersList.forEach(order - {order.setStatus(Orders.COMPLETED);orderMapper.update(order);});}}2.3 功能测试 开启定时任务 启动服务观察控制台日志。处理支付超时订单任务每隔1分钟执行一次。 3. WebSocket 3.1 介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手两者之间就可以创建持久性的连接 并进行双向数据传输。 HTTP协议和WebSocket协议对比 HTTP是短连接WebSocket是长连接HTTP通信是单向的基于请求响应模式WebSocket支持双向通信HTTP和WebSocket底层都是TCP连接 思考既然WebSocket支持双向通信功能看似比HTTP强大那么我们是不是可以基于WebSocket开发所有的业务功能 WebSocket缺点 服务器长期维护长连接需要一定的成本 各个浏览器支持程度不一 WebSocket 是长连接受网络限制比较大需要处理好重连 结论WebSocket并不能完全取代HTTP它只适合在特定的场景下使用 WebSocket应用场景 1). 视频弹幕 2). 网页聊天 3). 体育实况更新 4). 股票基金报价实时更新 3.2 入门案例 3.2.1 案例分析 需求实现浏览器与服务器全双工通信。浏览器既可以向服务器发送消息服务器也可主动向浏览器推送消息。 效果展示 实现步骤 1). 直接使用websocket.html页面作为WebSocket客户端 2). 导入WebSocket的maven坐标 3). 导入WebSocket服务端组件WebSocketServer用于和客户端通信 4). 导入配置类WebSocketConfiguration注册WebSocket的服务端组件 5). 导入定时任务类WebSocketTask定时向客户端推送数据 3.2.2 代码开发 1). 定义websocket.html页面 !DOCTYPE HTML html headmeta charsetUTF-8titleWebSocket Demo/title /head bodyinput idtext typetext /button onclicksend()发送消息/buttonbutton onclickcloseWebSocket()关闭连接/buttondiv idmessage/div /body script typetext/javascriptvar websocket null;var clientId Math.random().toString(36).substr(2);//判断当前浏览器是否支持WebSocketif(WebSocket in window){//连接WebSocket节点websocket new WebSocket(ws://localhost:8080/ws/clientId);}else{alert(Not support websocket)}//连接发生错误的回调方法websocket.onerror function(){setMessageInnerHTML(error);};//连接成功建立的回调方法websocket.onopen function(){setMessageInnerHTML(连接成功);}//接收到消息的回调方法websocket.onmessage function(event){setMessageInnerHTML(event.data);}//连接关闭的回调方法websocket.onclose function(){setMessageInnerHTML(close);}//监听窗口关闭事件当窗口关闭时主动去关闭websocket连接防止连接还没断开就关闭窗口server端会抛异常。window.onbeforeunload function(){websocket.close();}//将消息显示在网页上function setMessageInnerHTML(innerHTML){document.getElementById(message).innerHTML innerHTML br/;}//发送消息function send(){var message document.getElementById(text).value;websocket.send(message);}//关闭连接function closeWebSocket() {websocket.close();} /script /html2). 导入maven坐标 在sky-server模块pom.xml中已定义 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-websocket/artifactId /dependency3). 定义WebSocket服务端组件 直接导入到sky-server模块即可 package com.sky.websocket;/*** WebSocket服务*/ Component ServerEndpoint(/ws/{sid}) public class WebSocketServer {//存放会话对象private static MapString, Session sessionMap new HashMap();/*** 连接建立成功调用的方法*/OnOpenpublic void onOpen(Session session, PathParam(sid) String sid) {System.out.println(客户端 sid 建立连接);sessionMap.put(sid, session);}/*** 收到客户端消息后调用的方法** param message 客户端发送过来的消息*/OnMessagepublic void onMessage(String message, PathParam(sid) String sid) {System.out.println(收到来自客户端 sid 的信息: message);}/*** 连接关闭调用的方法** param sid*/OnClosepublic void onClose(PathParam(sid) String sid) {System.out.println(连接断开: sid);sessionMap.remove(sid);}/*** 群发** param message*/public void sendToAllClient(String message) {CollectionSession sessions sessionMap.values();for (Session session : sessions) {try {//服务器向客户端发送消息session.getBasicRemote().sendText(message);} catch (Exception e) {e.printStackTrace();}}}}4). 定义配置类注册WebSocket的服务端组件(从资料中直接导入即可) package com.sky.config;/*** WebSocket配置类用于注册WebSocket的Bean*/ Configuration public class WebSocketConfiguration {Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}5). 定义定时任务类定时向客户端推送数据(从资料中直接导入即可) package com.sky.task;Component public class WebSocketTask {Autowiredprivate WebSocketServer webSocketServer;/*** 通过WebSocket每隔5秒向客户端发送消息*/Scheduled(cron 0/5 * * * * ?)public void sendMessageToClient() {webSocketServer.sendToAllClient(这是来自服务端的消息 DateTimeFormatter.ofPattern(HH:mm:ss).format(LocalDateTime.now()));} }3.2.3 功能测试 启动服务打开websocket.html页面 浏览器向服务器发送数据 服务器向浏览器间隔5秒推送数据 4. 来单提醒 4.1 需求分析和设计 用户下单并且支付成功后需要第一时间通知外卖商家。通知的形式有如下两种 语音播报弹出提示框 设计思路 通过WebSocket实现管理端页面和服务端保持长连接状态当客户支付后调用WebSocket的相关API实现服务端向客户端推送消息客户端浏览器解析服务端推送的消息判断是来单提醒还是客户催单进行相应的消息提示和语音播报约定服务端发送给客户端浏览器的数据格式为JSON字段包括typeorderIdcontent type 为消息类型1为来单提醒 2为客户催单orderId 为订单idcontent 为消息内容 4.2 代码开发 在OrderServiceImpl中注入WebSocketServer对象修改paySuccess方法加入如下代码 Autowiredprivate WebSocketServer webSocketServer;/*** 支付成功修改订单状态** param outTradeNo*/public void paySuccess(String outTradeNo) {// 当前登录用户idLong userId BaseContext.getCurrentId();// 根据订单号查询当前用户的订单Orders ordersDB orderMapper.getByNumberAndUserId(outTradeNo, userId);// 根据订单id更新订单的状态、支付方式、支付状态、结账时间Orders orders Orders.builder().id(ordersDB.getId()).status(Orders.TO_BE_CONFIRMED).payStatus(Orders.PAID).checkoutTime(LocalDateTime.now()).build();orderMapper.update(orders);//Map map new HashMap();map.put(type, 1);//消息类型1表示来单提醒map.put(orderId, orders.getId());map.put(content, 订单号 outTradeNo);//通过WebSocket实现来单提醒向客户端浏览器推送消息webSocketServer.sendToAllClient(JSON.toJSONString(map));///}4.3 功能测试 登录管理端后台 登录成功后浏览器与服务器建立长连接 5. 客户催单 5.1 需求分析和设计 用户在小程序中点击催单按钮后需要第一时间通知外卖商家。通知的形式有如下两种 语音播报弹出提示框 设计思路 通过WebSocket实现管理端页面和服务端保持长连接状态;当用户点击催单按钮后调用WebSocket的相关API实现服务端向客户端推送消息;客户端浏览器解析服务端推送的消息判断是来单提醒还是客户催单进行相应的消息提示和语音播报; 约定服务端发送给客户端浏览器的数据格式为JSON字段包括typeorderIdcontent type 为消息类型1为来单提醒 2为客户催单;orderId 为订单id;content 为消息内容; 当用户点击催单按钮时向服务端发送请求。 接口设计(催单) 5.2 代码开发 5.2.1 Controller层 根据用户催单的接口定义在user/OrderController中创建催单方法 /*** 用户催单** param id* return*/GetMapping(/reminder/{id})ApiOperation(用户催单)public Result reminder(PathVariable(id) Long id) {orderService.reminder(id);return Result.success();}5.2.2 Service层接口 在OrderService接口中声明reminder方法 /*** 用户催单* param id*/void reminder(Long id);5.2.3 Service层实现类 在OrderServiceImpl中实现reminder方法 /*** 用户催单** param id*/public void reminder(Long id) {// 查询订单是否存在Orders orders orderMapper.getById(id);if (orders null) {throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);}//基于WebSocket实现催单Map map new HashMap();map.put(type, 2);//2代表用户催单map.put(orderId, id);map.put(content, 订单号 orders.getNumber());webSocketServer.sendToAllClient(JSON.toJSONString(map));}5.2.4 Mapper层 在OrderMapper中添加getById /*** 根据id查询订单* param id*/Select(select * from orders where id#{id})Orders getById(Long id);后记 美好的一天到此结束下次继续努力欲知后续请看下回分解写作不易感谢大家的支持
http://www.lakalapos1.cn/news/28001/

相关文章:

  • 青岛网站制作永诚宣传片的拍摄思路
  • 自建网站推广浙江建设信息港网址
  • 公司网站建设发展趋势在网站开发中如何设置登录
  • 保定外贸网站建设用手机做电影网站
  • 淘宝网站的论坛做的怎么样西宁做网站君博先进
  • 做网站直接开二级域名北京网络推广公司wyhseo
  • 网站建设提供书面资料清单设计医院网站建设
  • php网站服务建设小程序外包公司
  • 建设银行招聘官网网站网站开发一般要用到哪些软件
  • 内部优惠券网站建站安徽制作网站的公司哪家好
  • 谷歌上怎样做网站创建网站的软件
  • 做网站公司东莞安装wordpress500
  • c qq 互联网站开发代码公众号开发神器
  • 网站做微信支付制作公司网站视频
  • 一个网站交互怎么做vps做网站的环境
  • 济南市做网站的公司刷关键词优化排名
  • 爱做网站免费关于网站建设的案例分析
  • 展厅设计制作网站wordpress 视频缩略图
  • 东莞市十大广告公司网站播放视频速度优化
  • 郑州便宜网站建设报价html5做个网站多少钱
  • 网站划分栏目集团网站建设工作方案
  • 东莞大岭山做网站公司vr开发公司
  • 做家教网站代理wordpress ck
  • 免费建站系统个人wordpress后台是什么样的
  • 寺庙招人做网站维护吗找个男做那个视频网站好
  • wordpress 采集插件seo公司是怎么做的
  • 游戏ui素材网站仪表东莞网站建设
  • 网站制作便宜网站代码怎么优化
  • 哪个公司需要做网站如何做一个个人做网站
  • 哪里有做企业网站的网站建设免费空间哪里有