三月份以来,上海疫情成为全国焦点。
根据上海卫健委通报,上海市自2月底始,到4月29日止,本土新冠肺炎确诊病例已经超过5万例。而2021年,全国全年新冠肺炎确诊病例数(包含境外输入)为15243例——在近两个月的时间内,上海的本土确诊病例数已经达到去年全年的三倍左右。
但是,比这更令人担忧的,是高速跃进的无症状感染者数量。3月24日后,上海市新增无症状感染者规模已达到数千人。在4月4日至4月26日,上海每日新增的无症状感染者数量,曾连续二十余日达到万数。
上海,我国国际经济、金融、贸易、航运、科技创新中心,也是世界重要城市之一,眼下正面临十分复杂的防疫形势:传染性极强的变异株,规模庞大的社会流动人口,都是上海防疫工作的压力源。
现在,从3月1日报告新增本土病例以来,上海本轮疫情已经超过60天。在60多天里,上海为迎击奥密克戎做了哪些努力?目前形势如何?让我们一起通过数据了解一下。
一、上海:全国疫情风暴眼
2022年3月1日,上海通报新增1例本土新冠肺炎确诊病例和1例无症状感染者,前者为普陀区一名退休市民,后者则是徐汇区一个入境人员隔离点的工作人员。在发生疫情后,上海市对相关密切接触者进行了集中隔离观察。
2022年3月3日,上海市松江区一永辉超市的2名员工被确诊为新冠肺炎病例,3名员工被诊断为无症状感染者。根据上海市卫健委通报,上述5人涉及195名密切接触者,次密接者342人,且均对其进行集中隔离观察。上海三区三地在三天内相继出现本土病例,上海新一轮疫情由此开始。
在疫情初期,上海市几乎每天都有不同区域报告零星的确诊病例,直至3月29日,上海市新增本土确诊病例数字从28日的96扩大到326。进入四月后,上海市本土确诊病例数量、无症状感染者数量均迅速增加,上海疫情进入高速发展的态势。
此次疫情,本土无症状感染者总数和增速都远远高于本土确诊病例。通过整理上海市卫健委公开数据,我们发现,3月31日到4月10日这段时间里,上海市的无症状感染者每日新增数量从开始的4000余例扩大到了25000余例,是上海市无症状感染者新增数量最多的一段时间。
上海市共有16个行政区,其中,浦东新区面积最大、人口最多。从数量上看,也成为本轮疫情最严重的区域。浦东新区在3月10日报告本区3月首例本土确诊病例,新增本土确诊病例数在3月30日迎来第一个小高峰。目前,浦东新区既是本土确诊病例数最多的地区,也是无症状感染者累计数量最多的地区。
将上海市新冠肺炎疫情防控工作新闻发布会上的信息整理发现,此轮疫情初期集中暴发在三个重点区域:普陀区石泉街道宁强路33号石泉社区文化活动中心、松江区九里亭街道永辉超市沪亭北路店、上海徐汇区徐家汇街道漕溪北路1200号(入境人员隔离点)。疫情之初,上海市传播链比较清晰,但随着疫情发展,上海逐渐从小范围传播到广泛社区传播,造成更加复杂和严峻的疫情防控形势。
在通报发现本土确诊病例后,上述三个地点相继被划分为中风险地区。随着疫情发展,前后有25个地点曾被划分为中风险地区。目前,上海市有13个中风险地区,为全国中风险地区最多的地方。
另外,上海市在4月11日发布了“三区”名单,对上海全市按照封控区、管控区和防范区进行差异化管理。在4月20日,上海市划定了封控区16650个,涉及1187.8万人;管控区13304个,涉及448万人。截至4月29日,上海市封控区数量达到6393个,管控区数量达到3759个;防范区域为9239个。
二、上海的抗疫难点到底在哪里?
上海本轮疫情,面临着几大难点。
首先是奥密克戎亚型变异株BA.2的挑战。
根据4月26日上海市疫情防控工作新闻发布会上的介绍,导致上海本轮本土疫情的新冠病毒,绝大部分为奥密克戎BA.2型和BA.2.2型。这两种毒株均为奥密克戎毒株的亚型变异株。
奥密克戎毒株的遗传谱系名称为B.1.1.529,根据世界卫生组织的报告,奥密克戎变异株是目前全球流行的主要变异株【1】。在11月26日,世卫组织将其列为“需要关注”的变异毒株(Variant of Concern)。
作为奥密克戎亚型变异株的BA.2,有研究显示,Omicron BA.2是最具传染性的变异,其传染性是Delta 变异的4.2倍;且奥密克戎BA.2在早期难以识别,因此又被非正式地称为“隐形变种”。
其次是规模庞大的社会流动人口。
上海是一个超大型的国际化都市,其城区人口规模居于我国首位。2019年,根据联合国发布的《世界城镇化前景展望》,上海的总人口规模居于全球第三。
除此之外,上海市还拥有发达的市内交通网络,也是国内乃至国际交通运输网中的重要节点。根据《上海市综合交通发展“十四五”规划》,2019年航空客货吞吐量达到1.22亿人次、406万吨,分别位列全球城市第4位、第3位,网络通达性在亚洲处于领先地位。
也正是其作为我国重要交通枢纽的地位,上海市面临着疫情外溢的风险。根据人口迁徙大数据显示,上海市迁出人口大多去往江苏、浙江两省,全国多个省市也都报告了与上海疫情相关的本土病例。3月10日,在江苏苏州,就有多地要求有上海市旅居史(行程卡带*)人员实行“3+11”健康管理措施。
自新冠肺炎疫情暴发以来,上海市一直面临着境外输入的防控压力。在今年的1月至2月,上海市新增的境外输入病例就已经相当于2021年全年的80%;截至目前,上海也已经成为全国境外输入确诊病例最多的城市。
三、上海防控六十余天,哪些问题最受关注?
三月以来的六十多天里,上海市每日召开新冠肺炎疫情防控工作新闻发布会。在六十场发布会上媒体的提问中,我们看到了这段时间,上海市疫情防控措施中最为突出的几个关键词:物资、医疗。
首先,是封控期内物资供应的问题。
上海市是一个高度依赖外埠市场供应蔬菜的城市。2013年,上海市蔬菜的自给率在55%左右;到2019年,上海市地产蔬菜对蔬菜总消费量的占比下降到44%。对此轮疫情暴发的三、四月份,根据2013年的调查,正是上海市全年外埠蔬菜上市的第一个小高峰。
根据2013年和2019年的调查,上海市蔬菜主要来源于江苏和山东等地。因疫情防控,截至4月10日,江苏关闭了129个高速收费站,数量在全国仅次于辽宁。上海也对外地货车出入进行严格的车证管理,非保供企业几乎无法进出上海。
4月14日,国务院联防联控机制综合组交通管控与运输保障专班发布了全国统一样式的《重点物资运输车辆通行证》(以下简称《通行证》),上海市商务委员会也在23日下发通知,为上海市商贸物资和生活物资企业办理《通行证》。另外,上海市也在加大铁路、水运通道的运输量,以确保物资供应。
但是,根据4月6日在新闻发布会上的信息,上海市由于终端运力不足,导致生活物资配送并不及时。
因为封控,上海在岗骑手数量急剧减少。根据上海市4月19日举行的疫情防控工作新闻发布会上的介绍,上海市当时在岗骑手为2万人左右;而此前,在2019年的媒体报道中,上海仅浦东地区登记骑手总人数就超过了1.8万人。
针对这个问题,上海市已经采取大数据中心提供的技术平台,制定电商平台、快递公司“企业白名单”和配送寄递“人员白名单”,并为其制发“电子通行证”,在“电子通行证”内展示48小时核酸检测阴性证明和“健康码”绿码等信息,作为配送寄递人员上岗的必要条件和通行凭证,以增强市内运力。
另外,是上海的防疫医疗资源承载问题。
据上海市新冠肺炎疫情防控工作发布会上的信息,依据国家最新公布的《新型冠状病毒肺炎诊疗方案(试行第九版)》,新冠肺炎轻型病例实行集中隔离管理,隔离场所不限于医疗机构,如病情加重,将转至定点医院治疗。上海根据防疫要求建造的若干方舱医院,则是符合标准要求的集中隔离救治场所,有医务人员进驻,主要用于对轻症、无症状感染者的集中隔离观察或适当的对症治疗。
国务院联防联控机制赴上海工作组成员、国家卫生健康委医管中心信息数据管理与医疗机构运行管理处处长向准4月16日接受新华社采访时透露,截至4月13日24时,上海已有方舱医院床位约20.4万张,在建的方舱医院计划近期开放床位3.5万张,合计约24万张。而截至4月27日,上海市本土阳性感染者已经达到53万余人。
目前,上海正通过加快方舱医院的建设,提升现有方舱医院的流转效率等方式,尽力实现“四应四尽”、日清日结。全国各省也在不断向上海输送援沪医疗队,尽可能增加上海市的医疗承载能力。
目前,上海市已经连续三日(4月27日、28日、29日)新增无症状感染者数量都已经下降到千位;本轮疫情中,上海市累计治愈出院人数也已经接近3万人。疫情防控形势有了好转的态势。
凯特·阿歇尔曾在《纽约:一座超级城市是如何运转的》中说:“任何一个大都市的居民,都很少停下来思考城市生活的复杂性,或者是那些日日夜夜使城市维持正常运转的系统有多复杂。”对于纽约是如此,对于上海来说亦是如此。复杂的城市系统,决定了上海复杂的防疫情势。但是,每一个人,每一片社区,每一个还在运转的机构,都还在奋力争取胜利的曙光。我们共同期待那一天。
【1】原文:“The Omicron variant remains the dominant variant circulating globally,accounting for nearly all sequences recently reported to GISAID”,COVID-19 Weekly Epidemiological Update,Edition 86,published 5,April 2022
【2】吴俣,刘民. 不同新型冠状病毒变异株感染的COVID-19潜伏期研究[J].2022年
【3】周燕,奥岩松.上海市场外埠蔬菜消费现状及其特点研究[J].2013
【5】孙占刚;杨娟;彭飚;马骜;柴立平,上海蔬菜市场状况与市场开拓建议[J],2020年
【6】李干琼;王盛威;许世卫;赵京音;马佳.大城市蔬菜供需分析与预测研究——以上海市为例[J].2021
【7】解有成;康殷楠;高春;刘珊山;郑立婷;于晓辉;张久聪.新冠病毒“奥密克戎亚型变异...株BA.2”的最新研究进展[J].2022年
【8】陈姗姗,马晨晨,胥会云.上海外防输入压力到底有多大?数据告诉你真相.第一财经.https://www.yicai.com/news/101350912.html.
【9】张倩,白廷俊,周力.上海本轮疫情累计报告535600例新冠本土阳性感染者.央视网.https://content-static.cctvnews.cctv.com/snow-book/index.html?item_id=1968372601727033723&t=1651025113096&toc_style_id=feeds_default&share_to=wechat&track_id=f6495ffc-4562-4999-90df-0f286fbd43af.
【10】包志明.封面报道之二|上海:精准防控的失控.财新网.https://weekly.caixin.com/2022-04-02/101864942.html
数据新闻编辑:赵林
新媒体设计:许骁勇
动效设计:李亚珍
校对:李立军
之前闲时,花了几个下班时间使用VUE+Spring Boot前后端分离做了一个博客,博客文章编辑采用vue-quill-editor插件,做了一些简单的配置后,就直接可用了,可惜在编辑文章时,默认的图片上传为Base64存放在文章内容中,这使得原本存储在数据库中的5这个大字段会因一篇文章的图片上传多而变得沉重。因为我使得的是云服务当服务器,有用过云服务的都知道,网络带宽很贵。在带宽只有3M的情况下,读取一篇几兆的文章会有几秒的延迟。一开始我以为是数据库读取问题,所以我把文章内容这个字段做了中间缓存,把常变字段(如阅读数)依然从数据库中读取,在逻辑上进行两者拼接返回给前端,但依然速度很慢。如下图,文章内容中的图片是BASE64存储,存储大小782KB,如果一篇文章的上传图片越多,也就会导致这个文章内容字段越大。
在不考虑提高带宽成本的情况下,准备把富文本图片默认存储为Base64的方案改成图片存储服务器,用URL引用,这样可以减少文章内容的读写IO。以下我将从引用富本文到图片改造再到后端接收上传的图片来介绍。
一、下载富文本依赖
npm install vue-quill-editor --save
下载完依赖后,在package.json中,将可以找到对应的版本。
二、在main.js中引用富文本,可以按Ctrl键+鼠标点击vue-quill-editor,看下是否可以看到源码,这样可以再次确认是否下载成功(我用的编译器是JetBrains WebStorm 2018.3.5 x64)
import VueQuillEditor from 'vue-quill-editor'
三、富文本的使用
1、HTML部分代码
<template> //中间省去其他内容,只显示富文本HTML <div class="edit_container"> <quill-editor v-model="blogsContent" ref="myQuillEditor" :options="editorOption" @blur="onEditorBlur($event)" @focus="onEditorFocus($event)" @change="onEditorChange($event)"> </quill-editor> </div> </template>
2、JS部分代码
<script> import {quillEditor} from "vue-quill-editor"; //调用编辑器 import quillConfig from '../../api/quill-config.js'//重写富文本,使得图片走自定义上传 import 'quill/dist/quill.core.css'; import 'quill/dist/quill.snow.css'; import 'quill/dist/quill.bubble.css'; export default { name: 'editor', components: { quillEditor }, data() { return { editorOption: quillConfig,//重写 } } }
3、重写自定义图片上传quill-config.js代码
以下代码可以直接复制,然后改一下接口地址和你所要的参数即可
/*富文本编辑图片上传配置*/ const uploadConfig={ // 必填参数 图片上传地址 action: '/api/file/up/img', // 必填参数 图片上传接口地址 methods: 'POST', // 必填参数 图片上传方式 token: '', // 可选参数 如果需要token验证,假设你的token有存放在sessionStorage name: 'img', // 必填参数 文件的参数名 size: 500, // 可选参数 图片大小,单位为Kb, 1M=1024Kb accept: 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon' // 可选 可上传的图片格式 }; // toolbar工具栏的工具选项(默认展示全部) const toolOptions=[ ['bold', 'italic', 'underline', 'strike'], ['blockquote', 'code-block'], [{'header': 1}, {'header': 2}], [{'list': 'ordered'}, {'list': 'bullet'}], [{'script': 'sub'}, {'script': 'super'}], [{'indent': '-1'}, {'indent': '+1'}], [{'direction': 'rtl'}], [{'size': ['small', false, 'large', 'huge']}], [{'header': [1, 2, 3, 4, 5, 6, false]}], [{'color': []}, {'background': []}], [{'font': []}], [{'align': []}], ['clean'], ['link', 'image', 'video'] ]; const handlers={ image: function image() { var self=this; var fileInput=this.container.querySelector('input.ql-image[type=file]'); if (fileInput===null) { fileInput=document.createElement('input'); fileInput.setAttribute('type', 'file'); // 设置图片参数名 if (uploadConfig.name) { fileInput.setAttribute('name', uploadConfig.name); } // 可设置上传图片的格式 fileInput.setAttribute('accept', uploadConfig.accept); fileInput.classList.add('ql-image'); // 监听选择文件 fileInput.addEventListener('change', function () { // 创建formData,append这个方法是添加参数的方法,如果你的接口需要添加其他参数,比如用户ID,也可以在后面加进去。 var formData=new FormData(); formData.append(uploadConfig.name, fileInput.files[0]); formData.append('object','product'); // 如果需要token且存在token if (uploadConfig.token) { formData.append('token', uploadConfig.token) } // 图片上传 var xhr=new XMLHttpRequest(); xhr.open(uploadConfig.methods, uploadConfig.action, true); // 上传数据成功,会触发 xhr.onload=function (e) { if (xhr.status===200) { // var res=JSON.parse(xhr.responseText);//如果你图片上传接口返回的是一个Json对象,就需要这个转,然后在下面获取图片URL let length=self.quill.getSelection(true).index; //这里很重要,你图片上传成功后,img的src需要在这里添加,res.path就是你服务器返回的图片链接。 //如果只是图片地址,在前端是显示不了的,需要添加前缀,你可以使用接口全路径,也可以使用我下面的VUE路由解决跨域问题 self.quill.insertEmbed(length, 'image','/api/file/get/img?url='+xhr.responseText); self.quill.setSelection(length + 1) } fileInput.value='' }; // 开始上传数据 xhr.upload.onloadstart=function (e) { fileInput.value='' }; // 当发生网络异常的时候会触发,如果上传数据的过程还未结束 xhr.upload.onerror=function (e) { }; // 上传数据完成(成功或者失败)时会触发 xhr.upload.onloadend=function (e) { // console.log('上传结束') }; xhr.send(formData) }); this.container.appendChild(fileInput); } fileInput.click(); } }; export default { placeholder: '', theme: 'snow', // 主题 modules: { toolbar: { container: toolOptions, // 工具栏选项 handlers: handlers // 事件重写 } } };
4、JAVA图片上传接口
@PostMapping("/up/img") @ApiOperation(value="上传") public String upImg(HttpServletRequest request, @ApiParam(name="userId", value="id") String userId, MultipartFile img){ String fileName=ServiceCommon.ymdhmsdfStr.format(new Date())+"_"+img.getOriginalFilename();//防止图片重名覆盖,生成一个当前时间+图片名 String path=filePath;//配置文件中的图片存储前缀,如d://img/ String nameTypePath="/" +userId+ "/blog_img" ;//中间路径 return upFileImgService.upFileService("/" + fileName, path + nameTypePath, nameTypePath, img);//接口看后面Service层 }
4.1、Service层
public Result upFileService(String fileName, String filePath, String nameTypePath, MultipartFile file) { try { File file1=new File(filePath);//按路径生成文件对象 if(!file1.exists()){//如果文件不存在,将创建一个文件 file1.mkdirs(); } byte [] bytes=file.getBytes();//获取文件二进制字节数组 String url=filePath+fileName;//存储路径+文件名,产生一个文件存储地址 Path path=Paths.get(url); Files.write(path,bytes);//文件写入 return nameTypePath+fileName;//返回URL(我这个URL返回的前缀地址是截取掉的,不会显示IP等信息,只返回给前端后半地址,前端在调用图片获取时,将在接口中带入前缀,防止全路径暴露给前端) } catch (IOException e) { e.printStackTrace(); return ""; } }
5、图片获取接口
@GetMapping("/get/img") @ApiOperation(value="获取图片") public void getImg(HttpServletResponse response, @ApiParam(name="url", value="文件路径") @RequestParam(required=true) String url, @ApiParam(name="resType", value="文件以什么类型输出(pdf,jpg)") @RequestParam(required=false) String resType) { String path=filePath + url; upFileImgService.download(path, response, "get", resType); }
5.1、图片获取接口Service层
public void download(String filePath, HttpServletResponse response,String type,String resType) { File file=new File(filePath); response.setContentLength((int)file.length()); try ( FileInputStream fis=new FileInputStream(file); OutputStream os=response.getOutputStream()) { byte[] buf=new byte[1024 * 256]; int i; while ((i=fis.read(buf)) !=-1) { os.write(buf, 0, i); } os.flush(); } catch (IOException e) { System.out.println(e.getMessage()); } }
到此VUE富文本编辑器+Spring Boot接口就完成了。代码基本复制改改就可以使用。最后看下效果如何,如下图上,从原来的Base64内容变成URL地址,整个文章字段就缩小几十倍,这在IO读取时也加快了几十倍。
点击链接查看图片:https://content-static.cctvnews.cctv.com/snow-book/index.html?item_id=2051731297093853307&toc_style_id=feeds_default&share_to=wechat&track_id=aa32c371-8b5b-4005-8805-82347702c060
近日,在吉林珲春城郊一处绿化带里,摄影师拍到了可爱的“蓝精灵”。“蓝精灵”特别喜欢照相机的镜头,对照相机上看、下看、左看、右看,并且把照相机当作舞台,表演各种“绝活”。
幽默的摄影师用另一个照相机抓拍了一组《“蓝大胆”要入镜》的画面。“蓝大胆”就是普通?(shi),为?科?属的鸟类,俗名蓝大胆、穿树皮、松枝儿、贴树皮。多生活于山中的针叶林、阔叶林、针阔混交林。
“蓝大胆”可以在树干的裂缝中觅食昆虫,因而能消灭许多其它森林鸟类吃不到的害虫;它也能到地面上啄食各种鳞翅目的幼虫及其蛹;也取食一部分益虫,例如蜜蜂、食蚜虻、瓢虫等。秋、冬季节,“蓝大胆”以植物种子、叶片、果实为食,包括橡实、松、杉、椴、桦等,冬季有时也到居民点取食禽畜的饲料。
监制 | 裴奔 张英林 周军
主编 | 张旭成
统筹 | 梁洋
合作 | 珲春市融媒体中心
图片 | 高飞
来源:中央广播电视总台吉林总站
*请认真填写需求信息,我们会在24小时内与您取得联系。