我有一个想法,开一个常用的热门工具版块,欢迎大家推荐和留言!!!
点赞3评论7收藏2浏览2192023-05-25 14:11:31918为什么要拉防空警报防空警报响是什么意思?
918为什么要拉防空警报?9月18日是“九一八”事变爆发纪念日。九一八事变发生时是1931年9月18日晚上10点半,日军炸断柳条湖铁路,然后进攻沈阳,是日本帝国主义侵华的开端。为了铭记历史,为了警醒广大市民勿忘国耻、居安思危。也是为了增强人们的国防观念和人民防空意识。因此,这天就会拉响防空警报。什么时间拉防空警报呢?9月18日这天虽然很多城市会拉响防空警报,但是试鸣时间并未统一,大部分城市,如:北京、南京等时间是9月18日上午10时开始响起警报声,而新疆会在中午12点开始。什么是防空警报?人民防空警报是战时报知敌空袭的信号,可分为预先警报、空袭警报和解除警报。预先警报信号:鸣36秒,停24秒,反复3遍为一个周期,时长3分钟。空袭警报信号:鸣6秒,停6秒,反复15遍为一个周期,时长3分钟。解除警报信号:连续鸣响3分钟防空警报响了怎么办?依法开展防空警报试鸣,是《中华人民共和国人民防空法》赋予的重要职责,是和平环境下提高公民国防意识的重要手段,更是一种行之有效的人防宣传教育形式。因此,试鸣防空警报期间,除参加疏散掩蔽演练的部分社区居民和在校学生外,不需要采取任何措施,继续保持正常的工作和生活秩序。听到“预先警报”后如何行动?通常在发现敌机有空袭征候时,发放预先警报。听到预先警报后,应立即拉断电闸,关闭燃气,熄灭炉火,盖严储存饮水,转移易燃物品,关闭门窗,帮助老幼病残,携带好个人防护器材和必须的生活用品(食物、水、证件),迅速有序地就近进入人防工程或指定的安全隐蔽地域。听到“空袭警报”后如何行动?在敌机即将空袭时,发放空袭警报。听到空袭警报后,应迅速进入人防工程隐蔽。如情况紧急无法进入人防工程时,要利用地形地物就近隐蔽。在室内:可在跨度较小的卫生间,靠墙角的桌下、床下卧倒,避开门窗和易燃易爆物。在室外:在开阔地、低洼地、草地迅速卧倒隐蔽,不要在高压线、油库等危险处停留。卧倒时双手交叉,放到胸前,脸部夹于两臂之间,嘴巴微张,防止爆炸带来的冲击波损伤。在公共场所:不要惊慌、拥挤、乱跑,就近进入防空地下室、地铁车站等地隐蔽。听到“解除警报”后如何行动?解除警报是判明敌人一个波次的空袭已经结束时的警报信号。听到解除警报,应清点携带好自己的物品,有组织地撤出危险区域,进入安全地带。并配合人防专业队伍开展抢险抢修工作,如就近救护伤员、找寻被困人员、扑灭初起火灾、消除沾染、消除潜在危险等。警报解除后,仍要注意收听广播,了解行动注意事项,如哪些道路不能走,哪类食物、饮水不能食用;关注疫情通报、放射性沾染、染毒或带菌情况通报;了解敌空袭规模、方式及城市破坏情况通报,以及下一次敌空袭的预测等,以便有效地做好再次防空行动的准备。
查看详情点赞3评论收藏浏览2372023-09-18 10:12:45流程引擎在Java中的使用
流程引擎是指一种用于定义、执行和管理业务流程的软件工具。在Java中,常用的流程引擎有Activiti、Camunda、jBPM等。这些流程引擎提供了一套标准的流程定义语言、流程执行引擎和流程管理工具,可以帮助开发人员快速地设计、实现和优化业务流程。以下是使用流程引擎的基本步骤:引入流程引擎库:根据具体的流程引擎选择相应的库文件,并将其引入项目中。定义流程模型:使用流程引擎提供的图形化工具或者XML文件定义业务流程模型。流程模型包括流程节点、流程变量、流程条件等。部署流程模型:将定义好的流程模型部署到流程引擎中,可以使用API接口或者管理界面实现。启动流程实例:根据流程模型创建流程实例,可以使用API接口或者管理界面实现。执行流程任务:根据流程模型执行流程任务,每个任务对应一个流程节点,可以使用API接口或者管理界面实现。处理流程事件:流程引擎支持各种事件(如流程开始、结束、节点执行等),可以通过注册事件监听器的方式进行处理。监控流程状态:流程引擎提供了流程监控工具,可以实时查看流程状态和性能指标。总之,在Java中使用流程引擎可以帮助开发人员快速实现业务流程,并提高流程的可控性和可管理性。但是需要注意,流程引擎并不是银弹,需要根据具体场景选择合适的解决方案。
查看详情点赞2评论1收藏1浏览1012023-03-02 11:44:54JS 获取当前IP,城市定位
突然奇想,想做一个获取当前的IP,然后可以做一些客户端的埋点之类的。网上查了很多资料,确实有很多办法可以实现。首先,用百度地图,高德地图的api是肯定可以取得你当前的IP,定位,城市的。我也试了一下可以实现,但是要注册账号之类一堆还是算是麻烦的。然后我也测试了几个记录了下来。1、获取当前IP$.ajax({ url:'https://api.ipify.org?format=jsonp', type:'GET', dataType:'jsonp', success:function(data){ console.log(data); } })这个可以获取到当前的IP,这里是外网IP{ip: '188.25.0.66'}2、获取当前IP,城市因为之前百度可以直接输入IP查找,我也测试了一下。确实也比较方便,暂时也没有太多次数限制。 $.ajax({ url:'https://qifu-api.baidubce.com/ip/local/geo/v1/district', type:'GET', dataType:'application/json', success:function(data){ console.log(data); } })返回结果{ "code": "Success", "data": { "continent": "亚洲", "country": "中国", "zipcode": "610015", "timezone": "UTC+8", "accuracy": "城市", "owner": "中国电信", "isp": "中国电信", "source": "数据挖掘", "areacode": "CN", "prov": "四川省", "city": "成都市", "district": "" }, "charge": false, "msg": "查询成功", "ip": "188.25.0.66", "coordsys": "WGS84" }
查看详情点赞2评论1收藏浏览1002023-05-21 20:39:11运营人必须掌握的6大类26个基本模型
5W2H分析法概念5W:Who、When、Where、What、Why2H:How、How MuchWHAT:是什么?目的是什么?做什么工作?WHY:为什么要做?可不可以不做?有没有替代方案?WHO:谁?由谁来做?WHEN:何时?什么时间做?什么时机最适宜?WHERE:何处?在哪里做?HOW :怎么做?如何提高效率?如何实施?方法是什么?HOW MUCH:多少?做到什么程度?数量如何?质量水平如何?费用产出如何?使用场景对场景和业务流程进行全面梳理,有助于完善用户故事的描述,弥补考虑问题时的疏漏STAR分析法概念按照4个维度,对任务或者场景状态去思考及总结。S:环境(Situation)T:目标(Task)A:行动(Action)R:成果(Result)使用场景对于场景和业务流程进行梳理,有助于需求调研收集、完善用户故事的描述,规划和明确产品的关键功能SMART分析法概念按照5个维度,对去任务或者项目进考核目标和考核标准的思考。S:具体项(Specific)M:可度量(Measurable)A:可实现(Attainable)R:关联情况(Relevant)T:时限(Time-based)使用场景明确任务的边界范围,确定产品功能的需求实现效果,参考制定工作任务项规划。SWOT分析法概念态势分析,就是将与研究对象密切相关的各种主要内部的优势(Strengths)、劣势(Weakness)和外部的机会(Opportunities)、威胁(Threats)等,依照矩阵形式排列列出,然后用系统地把各种因素相互匹配起来加以分析,从中得出一系列相应的结论。SO(优势-机会):利用起来,增长性战略WO(弱点-机会):需要改进,扭转型战略ST(优势-威胁):监视起来,多种经营战略WT(弱点-威胁):需要消除,防御型战略使用场景竞品分析,自身产品的战略规划,制定核心功能方向麦肯斯MECE分解法概念全称 Mutually Exclusive Collectively Exhaustive,中文意思“相互独立,完全穷尽”。各部分之间相互独立 (Mutually Exclusive):每项工作之间要独立,每项工作之间不要有交叉和重叠。所有部分完全穷尽 (Collectively Exhaustive):全部内容是全面、周密的、不遗漏的。使用场景对场景/用户/业务等分类拆解和梳理,分析事务的各项因素及核心因素WBS工作分解结构概念工作分解结构,全称Work Breakdown Structure,简称WBS。WBS的过程,是把一个项目按一定的原则进行分解,项目分解成一项项工作,直到分解不下去为止。如:项目→任务→工作→活动,分解好的一项项工作,可以再对应到“人、时间、资金投入”中。使用场景明确项目任务的边界范围,梳理工作事项,制定工作进度计划,确定阶段性的可交付成果SCQA模型概念SCQA模型是一个“结构化表达”工具,是麦肯锡咨询顾问芭芭拉·明托在《金字塔原理》中提出的。S(Situation)情景——由大家都熟悉的情景、事实引入。C(Complication)冲突——实际情况往往和我们的要求有冲突。Q(Question)疑问——怎么办?A(Answer)回答——我们的解决方案是……使用场景在任何场合的表达,开场白,开会发言,演讲报告,都可以通过SCQA模型快速组织内容。还适用于归纳总结,提升工作效率。DFEAS模型概念基于人的动物本能的“DFEAS”模型Demand需求Find找到Evaluation评估Action行动Share分享使用场景DFEAS营销模式加入了(Demand需求)和(Evaluation评估),锁定有需求的客户进行传播,加入品牌影响力和销售力,这使得企业可以在数十亿网民中选择精准的、有需求的客户进行有效传播和影响;让客户在购买时的各个产品和品牌的对比中,企业因为预先布局而获得优势;AIDMA模型概念AIDMA是消费者行为学领域很成熟的理论模型之一,AIDMA(S)模型。Attention注意Interest兴趣Desire欲望Memory记忆Action行动使用场景消费者如何从接触到信息到最后达成购买的一种逻辑。作为营销者,你可以按照模型去构建自己的获客模型,去检验自己的获客模型是否有效。AISAS模型概念AISAS模式的转变。在全新的营销法则中,两个具备网络特质的“s”——search(搜索),share(分享)的出现,指出了互联网时代下搜索(Search)和分享(Share)的重要性,而不是一味地向用户进行单向的理念灌输,充分体现了互联网对于人们生活方式和消费行为的影响与改变。Attention:引起注意Interest:引起兴趣Search:进行搜索Action:购买行动Share:人人分享使用场景AISAS 模型是目前最通用的“用户决策行为分析模型”,作为运营者就需要考虑如何引导用户的消费行为,形成人人分享的病毒传播效果。SIPS模型概念SIPS模型Sympathize 共鸣—— Identify 确认—— Participate 参与—— Share 分享使用场景“SIPS模型”则深刻展现了社交媒体时代消费者行为的新特点,打破了传统单向的消费模式,更加注重消费者与企业、消费者与消费者之间的双向互动,强调用户的意见和行为受到聚合特定人群的影响,从而产生独特的内在规律。大众媒体之前,消费者行为模式是DFEAS:需求-搜寻-评价-行动-分享;大众媒体时代,消费者行为模式是AIDMA(S):注意-兴趣-欲望-记忆-行动-分享;网络分众时代,消费者行为模式变为AISAS:注意-兴趣-搜索-行动-分享;移动互联时代,消费者行为模式又变为SIPS:共鸣-确认-参与-分享。用户体验5要素概念对产品设计进行5个层级的划分,从“抽象”逐步到“具体”:战略层:对应产品目标,用户需求。战略是对目标,需求的商业化方案的归纳。范围层:对应产品的信息和功能点,涉及到产品的侧重点和取舍。结构层:对应产品的实际落地,产品在这个层面开始具体化。框架层:对应产品具体内容的呈现,产品进一步具体化,落实到界面。表现层:对应产品的视觉传达和交互体验,是产品的美化。使用场景对工作计划进行阶段化梳理,产品的全流程过程的协作中都可参考马斯洛需求层次理论概念由美国心理学家马斯洛提出,认为人的需求由五个等级构成,从下到上分别是:生理需求安全需求归属与爱的需求尊重需求自我实现的需求使用场景对于用户需求、用户痛点的分析KANO模型概念通过分析“需求实现程度”与“用户满意度”的影响,将需求分为以下5种类型:兴奋型需求:让用户意想不到的好需求,实现了以后用户会赞不绝口。期望型需求:随着需求的完成,用户满意度也逐步变好。无差异型需求:做出来后,用户满意度也不会变好。基本型需求:必备,理所应当。反向型需求:做出来后,用户满意度反而变糟。使用场景需求调研和需求分析,需求分类、需求优先级迭代规划,产品上线后的反馈验证参照工作流程优先级排序概念以“轻重缓急”的四象限法来确定需求优先级。马上做:如果你总是有紧急又重要的事情要做,说明你在时间管理上存在问题,设法减少它。计划做:尽可能地把时间花在重要但不紧急(第二象限)的事情上,这样才能减少第一象限的工作量。授权做:对于紧急但不重要的事情的处理原则是授权,让别人去做。减少做:不重要也不紧急的事情尽量少做。使用场景新产品需求的规划排期,功能开发和缺陷解决的优先级排序,确立产品下一次迭代优化的重点和方向,日常工作的排期和处理先后顺序PDCA循环概念PDCA循环的含义是将质量管理分为四个阶段,即:P:计划 (Plan) 包括方针和目标的确定,以及活动规划的制定。D:执行 (Do) 根据已知信息,设计具体的行动方案;再根据方案,执行具体行动。C:检查 (Check) 总结结果,明确效果,找出问题。A:处理 (Act) 对检查的结果和问题进行具体处理,没有解决的问题进入下一个PDCA循环。使用场景敏捷项目Scrum模式或MVP产品的规划、设计、开发,对于需求缺陷的跟踪流程,需求的优化和迭代AARRR模型概念用户增长的5个指标,分别是:A:获取(Acquisition)A:激活(Activation)R:留存(Retention)R:收入(Revenue)R:传播(Referral)使用场景理解获客和维护客户的原理,根据跳转情况验证用户体验细节,根据漏斗模型判断流失情况。RFM模型概念基于三个维度,分析客户消费行为特征。R:最近一次消费 (Recency)F:消费频率 (Frequency)M:消费金额 (Monetary)简单地根据三个维度高低划分进行的客户分类:重要价值客户:R近、F频次和M金额都很高,超级的忠实客户,重点维护的VIP。重要保持客户:R远、F频次和M金额都很高,说明这是个一段时间没来的忠诚客户。重要发展客户:R近、M金额很高,但F频次不高,忠诚度不高,是潜力用户。重要挽留客户:R远、F频次不高,但M金额高,是将要流失或者已经要流失的用户。事实上,维度的指标可以更细,就能得到更细分的用户分类。使用场景根据不同维度的多级指标对客户进行更细分的分类完善用户画像或用户标签用户金字塔模型概念运营工作时需要抓住的是金字塔顶端20%的用户;可以利用用户进行有效地管理用户;并且每个模块可以再进行拆解成小金字塔,作为管理工具,增加用户和用户之间的关系。使用场景产品拓新的时候,从KOL到KOC,进而逐渐到普通用户,如此这般可以更快速的获得产品启动。而且还可以对金字塔模型进行拆解,建立圈层文化。用户增长s型,J型曲线概念优秀产品的生命周期好比一条S形曲线:首先是初期阶段,产品的市场渗透率增长比较缓慢。随后,渗透率将进入一个从缓慢到快速的爬坡过程,也就是增长期。对于较差的产品来说,这个曲线不会趋于平稳,最终会走向零点。与之相反,优秀产品的曲线会有上升的过程,最后趋于平稳。使用场景根据实际情况选择有意义的指标和时间段,通过增加产品线,扩大总目标市场,开拓新市场,保证各个产品的增长曲线相互叠加,从而保证整体的持续增长。生命周期概念生命周期(Life Cycle)的概念应用很广泛,特别是在政治、经济、环境、技术、社会等诸多领域经常出现,其基本涵义可以通俗地理解为“从摇篮到坟墓”(Cradle-to-Grave)的整个过程。对于某个产品而言,就是从自然中来回到自然中去的全过程,也就是既包括制造产品所需要的原材料的采集、加工等生产过程,也包括产品贮存、运输等流通过程,还包括产品的使用过程以及产品报废或处置等废弃回到自然过程,这个过程构成了一个完整的产品的生命周期。使用场景不管是用户还是产品,都是有生命周期的说法,作为运营人员,需要根据用户/产品的不同阶段,指定不同的运营策略。90-9-1法则概念“90-9-1”规则是内容社区的一个知名理论,指的是在内容社区中 90%的用户只是浏览,9%的用户会参与讨论,只有 1%的用户会积极的创造内容。当然具体的数值多少不重要,核心是“参与度的极大不均衡”。使用场景虽然90-9-1法则在某些特定的社区已经被不复存在,但是我们依然可以通过这个法则去挖掘更优质是内容创造者。通过顶部流量用户引导底部90%的用户参与到内容创作中来北极星指标概念北极星指标又叫唯一重要指标,就是把商业闭环设计的核心价值主张,作为用户增长的第一关键指标,为公司发展提供了选择正确的方向。使用场景新的增长模式是数据驱动的增长模式,是精益地、敏捷地进行“构建-衡量-学习”循环,即通过对数据的分析提出假设,通过实验验证假设,衡量实验得到的数据,重复这一循环来找到增长点。LTV概念LTV(CLV):用户的终身价值LTV的相对准确的计算公式是:(某个客户每个月的购买频次*每次的客单价*毛利率)*(1/月流失率)。其中的LT(生命周期)=1/月流失率是得出平均每个客户在该平台能够留存的总时长是多少月。使用场景结合上面的用户生命周期来看,运营人员就是需要通过各种运营策略提高用户留存,尽一切可能延长用户的生命周期,并且在生命周期中尽一切可能产生商业价值。CAC概念CAC:用户获取成本CAC 是 Customer Acquisition Cost 的缩写,意思是“用户获取成本”。使用场景判断不同渠道下用户的获取成本,通过综合计算和优化投放策略,降低用户获取成本。小结:增量期:CAC低,LTV低。如果一款产品单独切入用户需求开辟蓝海市场,又恰好用户的需求确实没有满足,市场仍旧存在真空。那么早期用户的CAC也不会太高。这时候还是要关注产品的迭代和用户增长。成长期:CAC高,LTV低。某模式或领域证明其有可行性,或者单纯的资本热,就会吸引其他玩家入场,竞争对手出现,瓜分蛋糕。导致CAC的升高。用户增长的作用还是很重要,同时要做好市场和竞品分析,在竞争中保持自己的优势。成熟期:CAC高,LTV高。产品和用户产生黏性。例如社交产品的关系链,电商产品的会员,以及用户积分和等级体系等,都会让用户手机常驻几款APP。用户能开始展现商业价值,故称为成熟期。这时候需要关注的是商业化和变现,提高用户的价值。衰退期:CAC高,CLV低。市场已经饱和,没有持续的新用户为产品输血。这时候更应该关注用户的留存,延长产品的生命,同时关注新机遇。PBP概念PBP的意思是花出去的用户获取成本可以在多长时间内回本。如果忽略PBP(回收期),哪怕LTV>CAC公司也可能会出问题。一般市场上认为PBP在一年以内为佳,因为LTV的计算是可以长达5-10年的,但现金流和融资压力却是逐年累积的,PBP越短,越有利于公司的现金流和再投入,也能减轻公司的融资压力等。使用场景PBP就是加入了时间限制——多少时间内,LTV大于CAC。PBP太长,就要和用户流失和市场周期做抗争了。后记:当然,在实际工作中,还有很多相关的模型,比如GMV计算模式,转化率漏斗,ARPU值模型,PLC模型,Heart模型等等。这些都是需要我们在运营过程中不断学习的。参考链接:https://www.zhihu.com/question/423613286/answer/2334398764?utm_psn=1649690718703792128
查看详情点赞2评论收藏1浏览822023-06-07 10:14:17Go 生成静态二维码和动态二维码
在我们生活和工作中,会遇到很多需要用到二维码的地方。二维码在很多场合使用,比如打开链接,扫码支付,扫码打开链接,扫码加好友等等。今天我们使用go来生成一下二维码试试,我们可以用这个库来生成。github.com/skip2/go-qrcode1、生成静态二维码比如我们经常用到的,扫码打开一个网页。package main import ( "image/color" "log" "github.com/skip2/go-qrcode" ) func main() { qr, err := qrcode.New("http://www.alingfeng.cn/", qrcode.Medium) if err != nil { log.Fatal(err) } else { qr.BackgroundColor = color.RGBA{255, 255, 255, 255} qr.ForegroundColor = color.Black qr.WriteFile(256, "./go_code.png") } }运行一下,就可以看到我们的二维码图片2、生成动态二维码也有很多时候我们会用到动态的二维码,如扫码支付,扫码打开链接,扫码加好友等,结合http 库,动态生成qrcode 并返回。而无需保存成图片。package main import ( "fmt" "log" "net/http" "time" "github.com/skip2/go-qrcode" ) func main() { http.HandleFunc("/qrcode", Qrcode) log.Fatal(http.ListenAndServe(":8008", nil)) } func Qrcode(w http.ResponseWriter, req *http.Request) { var err error defer func() { if err != nil { w.WriteHeader(500) return } }() q, err := qrcode.New(fmt.Sprintf("http://www.alingfeng.cn/?t=%d", time.Now().Unix()), qrcode.Medium) if err != nil { return } png, err := q.PNG(256) if err != nil { return } w.Header().Set("Content-Type", "image/png") w.Header().Set("Content-Length", fmt.Sprintf("%d", len(png))) w.Write(png) }然后我们访问地址就可以看到图片: 127.0.0.1:8008/qrcode,每刷新一下二维码会相应变化。
查看详情点赞2评论收藏1浏览752023-06-12 16:12:55学习node+websocket+vue3搭建多人聊天室
跟着做小白都能做出来~~首先搭建前端Vite 项目兼容性注意Vite 需要 Node.js 版本 14.18+,16+。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。使用 npm或yarn、pnpm任意安装,个人推荐pnpm,原因如下快速:pnpm比传统方案(yarn, npm)安装包的速度快了两倍,甚至比yarn2,pnp模式还要快更严格高效:node_modules 中的文件是从一个单一的可内容寻址的存储中链接过来的,代码无法访问任意包monorepo:天然内置支持当仓库多包$ npm create vite@latest $ yarn create vite $ pnpm create vite1.安装并输入项目名称2.这里选择vue3.根据个人选择,这里选择js4.到这里就成功快速搭建完成vite3+vue3前端基础框架了,跟着下面的命令执行即可在vsocde编辑器中打开打开src目录,建立以下模块结构首先cofigjs这里是用来统一管理地址的,后期维护也方便只需要修改地址即可1.congfig-index.js中,这里写的是websokct// 域名地址(项目实地址)这里写的是本地的地址 const BASE_URL='127.0.0.1' // 端口号 const WS_PORT='8000' // WebSocket协议的URL export const WS_ADDRESS=`ws://${BASE_URL}:${WS_PORT}`这里的hooks是vue3借鉴的react函数式组件的优点2.hooks-index.js// 这里的index.js文件用于统一引用导出hooks的方法。更规范 import useWebSocket from './websocket' export { useWebSocket }hooks-websocket.js// 引用config-index.js封装好的WebSocket协议的URL import { WS_ADDRESS } from "../configs" // 封装一个使用websocket的高阶函数 // 这里的handleMessage用于接收及发送的消息 function useWebSocket(handleMessage) { // 建立连接(创建WebSocket对象): // const ws = new WebSocket(url, [protocol]);// url:服务器端地址;protocol:可选,指定可接受的子协议。 const ws = new WebSocket(WS_ADDRESS) const init = () => { bindEvent() } init() function bindEvent() { // ws.onopen():连接建立时触发的事件 ws.addEventListener('open', handleOpen, false); // ws.onclose():关闭连接方法 ws.addEventListener('close', handleClose, false); // ws.onerror():通信发生错误时触发 ws.addEventListener('error', handleError, false); // ws.onmessage(): 客户端接收服务器端发送的信息时触发 ws.addEventListener('message', handleMessage, false); } function handleOpen(e) { console.log('WebSocket open', e) } function handleClose(e) { console.log('WebSocket close', e) } function handleError(e) { console.log('WebSocket error', e) } return ws } export default useWebSocket3.pages-home.vue建立简单的聊天页面<script setup> // onMounted:挂载完数据 // reactive:响应式数据,reactive 参数必须是对象 (json / arr) // toRaw:响应式转化普通对象 // toRefs:降reactive中的响应式结构为一个个的ref响应式数据 import { onMounted, reactive, toRaw, toRefs } from "vue"; // 引用全局路由对象useRouter import { useRouter } from "vue-router"; // 引用hooks中封装好的高阶函数,用于消息发送 import { useWebSocket } from '../hooks' // 这里useWebSocket(handleMessage)用于接收消息 const ws = useWebSocket(handleMessage) const router = useRouter() // 定义state用于接收和发送的消息 const state = reactive({ msg: '', msgList: [] }) // 结构state const { msg, msgList } = toRefs(state) // 获取用户名,没有就跳转到登录页 let username = '' onMounted(() => { username = localStorage.getItem('username') if (!username) { router.push('/login') return } }) // 发送消息按钮 const sendMsg = () => { if (msg.length < 1) { return } // ws.send():发送信息的方法 // 由于后台接收的是JSON类型,这里发送的消息需要JSON.stringify ws.send(JSON.stringify({ id: new Date().getTime(), user: localStorage.getItem('username'), dateTime: new Date().getTime(), // 这里必须让msg失去响应式或深拷贝该值,否则造成发送的消息根据再次输入的消息发生变更 msg: toRaw(msg.value), })) // 发送完清空消息框 msg.value = '' } // 用于接收发送过来的消息 function handleMessage(e) { // 由于后台接收的是JSON类型,这里发送的消息需要JSON.parse const msgData = JSON.parse(e.data) // 向列表添加每条聊天消息 msgList.value.push(msgData) } </script> <template> <div> <ul> <li v-for="item in msgList" :key="item.id"> <p>用户名:{{ item.user }}</p> <p>{{ new Date(item.dateTime) }}</p> <p>消息:{{ item.msg }}</p> </li> </ul> <input type="text" placeholder="请输入消息" v-model="msg"> <button @click="sendMsg">发送</button> </div> </template> <style scoped> li p { text-align: left; } </style> pages-login.vue进入聊天室的页面<template> <div> <input type="text" placeholder="请输入用户名" v-model="userName"> <button @click="enterSocket">进入聊天室</button> </div> </template> <script setup> import { onMounted, ref } from "vue"; import { useRouter} from 'vue-router' const router=useRouter() const userName=ref('') onMounted(()=>{ userName.value=localStorage.getItem('username') // 简单的判断是否已进入聊天室 if(userName.value){ router.push('/home') return } }) // 进入聊天室 const enterSocket=()=>{ if(userName.value<6){ alert('用户名不小于6位') return } localStorage.setItem('username',userName.value) userName.value='' router.push('/home') } </script>4.router-index.js 由于框架是没有自带router的这里需要去pnpm i vue-router安装下import { createRouter, createWebHashHistory } from "vue-router"; import routes from "./router"; const router = createRouter({ history: createWebHashHistory(), routes, }); export default router;router-router.jsimport login from "../pages/login.vue"; // 路由列表 let routes= [ { path: "/login", name: "login", component: login, }, { path: "/home", name: "home", component: () => import("../pages/home.vue"), children: [], }, ]; export default routes; 5.App.vue<template> <router-view></router-view> </template> 6.main.jsimport { createApp } from 'vue' import './style.css' import App from './App.vue' import router from "./router"; createApp(App).use(router).mount('#app') 6.在当前目录下新建server目录,用于node服务进入server目录生成package.json然后安装包在安装websocket的插件wx接着是node的目录如一下就完成在package.json中配置启动命令如index.js中写// 使用CommonJS require引入 // CommonJS 中的 require/exports 和 ES6 中的 import/export 区别 // CommonJS 模块是运行时加载,ES6 Modules 是编译时加载并输出接口。 // CommonJS 输出是值的拷贝;ES6 Modules输出的是值的引用,被输出模块的内部的改变会影响引用的改变。 // CommonJs 导入的模块路径可以是一个表达式,因为它使用的是 require() 方法,甚至这个表达式计算出来的内容是错误的路径,也可以通过编译到执行阶段再出错; // 而ES6 Modules 只能是字符串,并且路径不正确,编译阶段就会抛错。 // CommonJS this 指向当前模块,ES6 Modules this 指向 undefined // ES6 Modules 中没有这些顶层变量:arguments、require、module、exports、__filename、__dirname const Websocket=require('ws') ;((Ws)=>{ // 建立ws服务地址,这里跟前端都类似了唯一的区别是connection和message(连接和消息) const server=new Ws.Server({port:8000,host:"0.0.0.0"}) const init=()=>{ bindEvent() } function bindEvent(){ server.on('open',function(event){ server.send('OpenBarScanner') }) server.on('close',handelClose) server.on('error',handelError) server.on('connection',handelConnection) } function handelOpen(){ console.log('handelOpen') } function handelClose(){ console.log('handelClose') } function handelError(){ console.log('handelError') } // 连接时提示消息并发送到客户端 function handelConnection(ws){ console.log('WebSocket Connection') ws.on('message',handelMessage) } // 用于接收发送的消息 function handelMessage(msg){ server.clients.forEach((c)=>{ // 由于node发送到客户端的消息是Blob类型,这里需要用Buffer.form().toString()转化为utf8类型识别消息 c.send(Buffer.from(msg).toString('utf8')) }) } init() })(Websocket)
查看详情点赞2评论1收藏1浏览862023-06-15 15:25:03GitHub Copilot --Your AI pair programmer
一、介绍 GitHub Copilot是一种基于人工智能的代码自动补全工具,由GitHub和OpenAI联合开发。它可以根据上下文和注释,生成代码片段和函数,帮助开发者快速编写代码。 GitHub Copilot是通过机器学习技术实现的。 它的工作原理是,通过分析开发者的代码库,学习代码的语法和结构,并生成与当前上下文相关的代码建议。它可以同时处理多种编程语言,包括Java、Python、JavaScript、TypeScript、Ruby、Golang等。开发者可以在编辑器中直接使用GitHub Copilot,它会自动提示代码片段和函数,大大提高了开发效率。二、GitHub Copilot的功能 - 代码自动生成 - 代码补全 - 代码提示三、如何使用GitHub Copilot 1. 访问 https://github.com/features/copilot/ ,安装GitHub Copilot:在VS Code编辑器中搜索安装GitHub Copilot插件,并按照提示进行安装,其他编辑器类似。 2. 配置编辑器:在安装完GitHub Copilot插件后,需要进行相关配置。你需要在VS Code的设置中,将“editor.suggestSelection”设置为“first”,以便在输入代码时,GitHub Copilot的代码建议优先显示。此外,你还可以根据需要进行其他相关设置。 3. 使用GitHub Copilot:在编辑器中输入代码时,GitHub Copilot会自动提示代码片段和函数,你可以选择使用或者忽略。如果你选择使用,GitHub Copilot会自动补全代码,并根据上下文和注释生成相应的代码。如果你不满意生成的代码,可以通过修改代码或者提供更多的上下文来改进生成结果。 四、GitHub Copilot限制 1. 代码生成的准确性:GitHub Copilot的代码生成基于机器学习,它需要大量的数据和算法模型来进行训练和优化。然而,由于训练数据的限制和算法模型的不完善,GitHub Copilot生成的代码可能存在一定的准确性问题,需要人工进行修正和调整。 2. 缺乏创造性:GitHub Copilot只能根据已有的代码片段和函数,生成与当前上下文相关的代码建议。它缺乏创造性和创新性,无法像人类开发者一样,通过思考和创造来解决复杂的问题。 3. 安全性问题:由于GitHub Copilot是基于机器学习的技术,它需要训练数据来进行学习和优化。然而,训练数据可能包含敏感信息或机密代码,如果不加以保护,可能会导致安全性问题。 4. 版权和知识产权问题:GitHub Copilot的代码生成可能涉及到版权和知识产权问题。如果生成的代码涉及到他人的版权或知识产权,可能会引发法律纠纷和争议。 5. 依赖于互联网:GitHub Copilot需要连接互联网才能进行学习和优化。如果没有良好的互联网连接,可能会影响其性能和准确性。 6. 收费,个人每月10美元,每年100美元的价格,对大多数人来说存在门槛。 总的来说,GitHub Copilot虽然是一种非常有前途的技术,但也存在一些限制和局限性。在使用GitHub Copilot时,需要注意这些限制和局限性,并进行必要的修正和调整,以确保生成的代码的准确性和安全性五、总结 1. 提高软件开发效率:GitHub Copilot可以根据上下文和注释,生成与当前上下文相关的代码建议,帮助开发者快速编写代码。这将大大提高软件开发的效率,减少开发者的重复劳动和错误率。 2. 降低软件开发门槛:GitHub Copilot可以自动生成代码,使得软件开发的门槛降低,即使是没有编程经验的人也可以快速编写代码。这将有助于推动软件开发的普及和发展。 3. 挑战传统软件开发模式:GitHub Copilot的出现挑战了传统的软件开发模式,即由开发者手动编写代码。未来,随着人工智能技术的不断发展,自动化代码生成的比例可能会越来越高,从而改变软件开发的方式和模式。 4. 面临法律和道德问题:GitHub Copilot的代码生成基于机器学习,可能会涉及到版权、知识产权等法律和道德问题。未来,相关法律和政策的制定和完善将对GitHub Copilot的发展产生重要影响。 总的来说,GitHub Copilot是一种具有潜在影响的技术,它将对软件开发产生重要影响。未来,随着人工智能技术的不断发展,GitHub Copilot的功能和应用场景可能会不断扩展,我们需要密切关注其发展趋势和影响。
查看详情点赞2评论1收藏1浏览1152023-06-27 11:12:53Shell 基础命令语法
因为工作要用到shell自动部署一个项目,所以今天我们先来研究一下shell的基础命令。#!/bin/bash # 上面这个shell脚本的头,每门语言都有自己的头字符串echo "hello" echo "hi" # 变量 num="我是变量" echo $num num1=10 num2=50 #env env是读取环境变量 # 读取进程 echo "进程号:$0" echo "进程号:$$" # ``这个符号执行变量 echo `date` # 转义字符 加上-e才行 echo -e "你好啊\n成都"判断和if条件语句# 判断 test $num1 -eq $num2 echo "相等:$?" # 条件判断 if [ $num1 = 10 ]; then echo "这是等于10" else echo "默认" fi文件夹和文件基础创建# 创建文件夹,文件系列 dirName="aaa" if [ -e $dirName ]; then echo "文件夹存在,即将进入文件夹" cd $dirName echo "创建一个文件名字叫 a.txt" touch a.txt else echo "文件夹不存在,创建该文件夹" mkdir $dirName echo "进入文件夹,然后创建文件a.txt" cd $dirName touch a.txt fi用户交互# 读取键盘输入的内容,用户交互 read -p "请输入文件夹的名字:" dirFileName if [ -e $dirFileName ]; then echo "存在该文件夹" else mkdir $dirFileName fi # 命令选择 read -p "请输入y创建文件夹,n直接退出:" yes if [ $yes = "y" ]; then mkdir haaha elif [ $yes = "n" ]; then echo "退出了" ficase语句# case语句 read -p "请输入yes/no:" choice case $choice in yes | y* | Y*) echo "输入了yes" ;; no | n* | N*) echo "输入了no" ;; *) echo "输入了其他" ;; esacfor循环# for循环 declare -i sum=0 declare -i i=0 for (( i=0; i<=100; i++ )) do sum=$sum+$i; done echo "sum=$sum" for i in 1 2 3 4 5 do sum=$sum+$i; done echo "sum=$sum" # 扫描文件 for fileName in `ls` do if [ -d $fileName ]; then echo "$fileName是文件夹" elif [ -f $fileName ]; then echo "$fileName是文件" fi done函数# 函数 function getMax() { if [ $1 -gt $2 ]; then return $1 else return $2 fi } read -p "请输入数值1:" data1 read -p "请输入数值2:" data2 # 函数调用 getMax $data1 $data2 echo "$data1和$data2的最大值为:$?"
查看详情点赞2评论收藏浏览762023-06-27 15:44:37shell脚本读取PHP文件数组的值,放到shell变量中使用方法
今天在用shell执行PHP文件,需要读取PHP数组中的一些值的时候。遇到了问题,找了很多资料,最后问了AI。经常一翻和AI的纠缠。终于给了我正确的答案,整理如下。事实证明AI真强大。PHP文件中的数组:web_data.php<?php $web_data = [ "port"=>"10764", "secret"=>"LU2DuzNpi94Ff8jastAscGvv2HbGK2UJ", "mainDoain"=>"lxl.petuu.shop", "domain"=>"", 'mysqlUser' => "userName", 'mysqlPassword' => "gehrht1646", ]; return $web_data;shell脚本中写法:projectName=$(php -r 'include "web_data.php"; echo $web_data["mainDoain"];') echo $projectName搞定
查看详情点赞2评论收藏浏览1182023-06-29 16:24:24