干货 | 日均报错量降低95%,携程小程序生态之自动化错误预警方案

Android16 动态隐藏systemUI右侧音量条 本文介绍了如何屏蔽SystemUI系统音量条并显示自定义音量控制条的实现方法。主要通过两个步骤:1)在编译脚本中定义控制属性persist.rp.show.volume.dialog=off来隐藏系统音量条;2)修改SystemUI源码中的VolumeDialogImpl.java文件,在showH方法中根据属性值判断是否显示系统音量条。当属性值为off时直接return,从而屏蔽系统音量条的显示,实现自定义音量控制条的替代显示。该方法通过系统属性控制显示状态,具有灵活可控的特点。 阅读详情

作者简介

携程前端框架团队,为携程集团各业务线在PC、H5、小程序等各阶段提供优秀的Web解决方案。产品涉及各类前端/Node端应用框架、研发工作台、前端中台化、静态资源发布系统等。当前主要专注方向包括:新一代研发模式探索,Rust构建工具链路升级、Serverless应用框架开发、在线文档系统开发、低代码平台搭建、适老化与无障碍探索等。

摘要

携程小程序自动化错误预警方案是一套完整且通用的小程序前端错误监控方案。此方案提供小程序错误自动采集SDK,并对错误所在的页面路径进行偏移矫正,能够准确通知相应的开发负责人;将错误信息分为生产、测试、开发3种阶段,根据错误发生的阶段提供相应的错误预警及处理方案;开发负责人只需在小程序管理平台配置告警所需信息,即可快速接入、实时监控生产报错、生成告警通知;源码映射能力可以帮助开发者快速定位错误原因,提升修复效率。接入此方案可实时捕获开发环境错误,确保在小程序发布上线前发现并解决业务报错,可极大地减少线上小程序的错误量。

一、为什么要做错误监控

携程小程序产品是to C的,用户访问量大,使用的机型和场景复杂多样;当用户遇到问题时,我们无法保证所有用户都及时反馈,且提供明确、详细的信息。因此,为了保证系统稳定运行、提高用户体验,我们需要主动收集错误信息、实时监控错误变化趋势、及时解决。

为了提升小程序代码质量、守护线上页面质量,Web前端团队提出了携程小程序的小程序错误预警方案,可分为4个阶段,如图1所示:

c15531be6d905282710ab49a2cd9b08a.png

图1 小程序错误预警分阶段图示

携程小程序自动化错误预警方案在自动化部署阶段将buildId 注入代码,并通过固定robotId的方式获取对应的 sourcemap 文件;客户端运行时自动采集错误信息,同时进行埋点上报;服务端处理存储的错误数据,并按照页面路径、错误类型等维度进行分类;告警平台将实时监控报错情况,根据自定义的告警规则给开发负责人发送告警通知,详细的方案设计参见图2:

abdb568afef5d860503d5ac73a13d343.png

图2 错误预警方案设计图

二、sourcemap 存储及映射

携程小程序发布是通过ci工具上传小程序代码实现的。在发布前,我们会将无线持续交付平台(Mobile Continuous Delivery,下文统称为MCD发布平台)创建的buildId注入到小程序代码中,以供运行时获取。由于微信不支持通过版本信息或其他的唯一信息获取对应的 sourcemap 文件,我们设计了一套获取相应 sourcemap 的方案:

  • 我们通过固定robotId的方式上传源码,从而获取对应的 sourcemap 文件;在成功上传小程序代码后,将延迟5秒后使用ci工具拉取最近一次上传版本的 sourcemap 文件;此外,将会比对 sourcemap 的解压源文件中buildId与当前上传代码中的buildId是否一致,如果不一致将再次获取,从而确保上传的源码和获取的 sourcemap 文件是匹配的,保证源码映射的准确性。

  • 随后,将 sourcemap 文件存储到携程的文件服务器,并将服务端返回的文件链接地址、当前的buildId、时间点以及自定义备注等信息以对象的形式保存到数据库中,即可实现buildId与 sourcemap 文件的信息存储及映射。

三、错误采集及日志上报

在小程序客户端运行时,我们会在 wx.onError 和 wx.onUnhandledRejection 的回调函数中捕获到所有的错误信息,随后进行错误信息的筛选、处理和提取。其中,错误的关键信息有:pagePath, message, stack等。此时,我们会对捕获到错误时所在页面的pagePath进行偏移纠正,避免页面偏移导致误报的情况。那么如何实现错误偏移纠正和错误采集呢?

首先,在上传小程序代码包前,我们会通过读取app.json的内容,获取所有注册的页面路径,并将其注入到小程序代码中。接着,在捕获到错误信息时,我们会对error stack进行解析,从上往下进行页面路径贪婪匹配,匹配到的第一个页面就是发生报错的页面。随后,将错误信息、当前的appId以及发布时注入的buildId一同通过用户行为数据采集系统(User Behavior Tracking,下文统称为UBT)的错误接口上报,上传到UBT的服务端。至此,便完成了一次错误采集与上报的流程。

四、数据聚合

采集到上报的错误数据后,服务端会对数据进行清洗、过滤、聚合等操作,随后将预处理后的数据存入APM的MySQL数据库中。通过内部的APM监控平台主动读取数据库中的数据,实现各种自定义维度的数据聚合,比如分别根据部门、客户端平台(Platform)、报错页面路径(PagePath)、小程序版本(version)、Top50错误类型等维度进行排序并展示数据列表(如图3)。

这些处理后的信息为下文的错误告警提供了数据支撑,告警主要依据的是报错页面路径(PagePath)及Top50错误类型这两个维度。

a8b699a622ad60fe2f0a748ef90eec6b.png

图3 APM — 携程微信小程序JS Error

五、错误实时监控告警

除了业务主动去APM上实时查看报错情况,我们还提供了错误告警机制,会在不同阶段对采集到的错误进行消息推送提醒,详细流程如图所示:

d110f1af06ad084e80f6b9eb3578d671.png

图4 小程序错误告警流程

从上图可看出,错误告警贯穿整个小程序的开发流程,共分为三个版本,包括开发版、体验版以及生产版。错误告警服务每隔一段时间轮询不同环境的报错信息(调用APM提供的数据聚合接口),若报错量超过我们设置的告警阈值(详情可见表1),则会根据错误页面找到对应的Bundle(最小的业务线单位),然后再找到对应的开发人员或管理员(对应关系已在小程序管理平台中注册),通过携程内部沟通工具(下文统称为TripPal)将错误提醒推送给相关人员,在收到信息后可以通过点击信息直接跳转到具体的APM错误页面中,在APM中可以进行错误的反查与定位。下表展示了各阶段告警配置的详细情况:

b8406fb9398366e8b08bcd0061cc8099.png

表1 各阶段告警配置

(1)开发版

在开发阶段,及时捕获错误有助于开发人员第一时间进行修改,因此每隔1分钟,服务端会获取每个页面路径的报错量,只要页面有报错,将推送消息至该Bundle的相关人员。

7030251c82b81704218946f3ae4800c1.png

图5 开发版告警

(2)体验版

体验版是一个完整稳定的版本,是可以作为发布候选的版本,因此对该环境的报错进行监控是十分必要的。体验版除了能接收到与开发版一致的错误信息外,还会发送反馈消息,由Bundle管理员进行审批,审批的意义在于告知管理员当前要发布到生产的代码中存在错误,需要管理员知晓并判断是否修改,若10分钟内未处理,将再次发消息进行提醒。

89b521ae5ee89581a9e7c2a43ec8cadd.png

图6 体验版告警

在MCD发布平台生成体验码时,若仍有Bundle未处理体验版报错,将在发布群中再次提醒:

0032d2d77a2710138354b7f0be358a2e.png

图7 MCD构建结果通知

以上两个阶段都属于开发测试阶段,目的在于将所有的业务报错信息都在开发阶段暴露出来,然后让各个业务及时修改,保证发到生产的代码没有业务报错。

(3)生产版

总有意外的情况会导致生产运行出现错误,为了更快更全面的感知生产报错,我们会对生产错误进行两个维度的监控:

  • 每隔5分钟,服务端获取某类错误的报错量超过 100 的页面路径,随即发出通知消息至相应的开发和管理人员,管理人员此时需要重视下频繁报错是否会对生产业务造成影响并给PMO反馈修复的时间以及是否需要紧急发布。

07f594d6fd098550ad177ffec0864925.png

图8 生产版告警(错误类型维度)

  • 每隔1小时,服务端会获取每个页面路径的报错量,然后聚合到每个具体的Bundle,如果发现Bundle一小时报错量超过了300,也将发送告警信息。

d2c2f0c4cd0da651bbf2a267db38bca4.png

图9 生产版告警(Bundle报错量维度)

由于通知消息本身不具备强制性、约束力,因此我们接入了公司的告警治理系统(下文统称为BigEyes)。生产版报错将通过BigEyes进行统一通知,如果告警事件未在预设的响应时间内被响应,则进行通知升级,即通知原对象的上级,以此提高业务方的重视程度及故障恢复效率。

6bd4113def95665339ff031a6d5d1d16.png

图10 小程序告警接入BigEyes

为了便于独立小程序的接入,在现有方案的基础上,我们设计并实现了一套通用的可定制化的错误告警配置服务。独立小程序在引用错误采集SDK的前提下,通过在小程序管理平台配置告警所需信息,包括用于告警的专属Trippal服务号、开发负责人、不同环境(正式、体验、开发)的告警阈值等,即可在触发告警条件时,收到服务号发来的错误通知。

b63d3b32e85ddf5dfdbd220646360750.png

图11 独立小程序错误告警配置页面

六、源码映射

从APM平台查看错误信息时,可以通过错误的详情页面进入小程序错误源码解析系统。由于我们在错误采集时会将buildId和错误相关信息一起上报至服务端,因此错误详细信息内包含报错代码包对应的buildId(如图14);在点击错误堆栈上的链接跳转至错误源码解析系统时,系统将根据buildId获取到相应的 sourcemap 文件;随后,根据错误信息找到对应的 sourcemap 内容、依据错误位置进行反解析;最后,使用 Monaco Editor 将源码展示在页面中,开发者可以据此查看错误所在的源码位置,从而助力开发者快速、准确定位错误原因。

66f718cadafa326f8fb89a44a4b27e26.png

图12 小程序JS Error概览页面

22c16a48e3bda4f39e292ba05d9f0e91.png

图13 小程序JS Error聚合、分类页面

b7090c848400d3d3eb3fcbb833abf52b.png

图14 小程序JS Error详情页面

178e648e2c2f00d1354d61f99f7d71d3.png

图15 小程序JS Error源码解析页面

七、总结

自动化错误预警方案可以帮助各业务方在开发和测试阶段捕获运行时可能出现的业务报错,避免此类错误发布到生产环境,从而降低线上的错误量。在生产环境可以通过告警机制实时监控错误趋势,当出现告警时可通过源码映射系统快速定位错误原因、提高开发者的修复效率。

该方案极大地提升了小程序的运行稳定性,可以有效提升用户体验。自主板小程序接入携程小程序自动化错误预警方案以来,其日均线上报错量降低了95%左右,受到各业务部门的好评,印证了本方案的可行性和有效性。

8c853b7892f8dc5eeddd4654f907cb28.png

图16 2022年携程微信主板小程序每日错误次数统计图

【推荐阅读】

a75fcae65912dfe1d95ecdb2077ca0e9.jpeg

 “携程技术”公众号

  分享,交流,成长

Hindsight 内存爆炸 4 个词排查清单:9,284 条 6 成是 SSH 调试日志——Agent 标签系统的实战复盘 9,284 条记忆里 66% 是 SSH 调试日志。4 个标签被滥用=0 区分度。3 个 entity_labels + retain_mission + retain_every_n_turns 配置把噪声压回 5%——附 PATCH 脚本和实测前后数据。 阅读详情

相关推荐

three.js中如何高效加载并播放GLB格式的3D动画

本文详细介绍了在three.js中高效加载并播放GLB格式3D动画的最佳实践。通过对比GLB与GLTF格式的优势,提供从环境搭建、模型加载到动画控制的完整解决方案,并分享性能优化技巧和常见问题排查方法,帮助开发者提升3D动画项目的开发效率和用户体验。

weixin_27890975的博客 362

干货 | 日访问过亿,办公IM及开放式平台在携程的实践

作者简介Jim,携程高级研发经理,关注Java&Go技术栈后端研发。目前致力于TripPal开放平台的高可用、开放化进程及核心衍生服务。简介携程内部的办公IM项目最早在2016年...

携程技术 1788

从PSDK到ROS节点:实战GPS数据发布与CMake配置

本文详细介绍了如何从大疆PSDK获取GPS数据并封装为ROS节点的实战过程,包括PSDK编译、GPS数据订阅、ROS节点实现及CMake配置优化。通过具体代码示例和调试技巧,帮助开发者快速实现无人机传感器数据与ROS系统的集成,提升开发效率。

weixin_30843605的博客 457

前端监控告警平台原理,及如何捕捉全局错误,异步promise错误,资源错误,vue错误

监控告警平台可以监控并上报我们的网页在运行时发生的错误,那么监控平台的原理是什么呢,本文介绍了前端监控告警平台原理,包括window.onerror,window.addEventListener等方法.及如何捕捉全局错误,异步promise错误,资源错误,vue错误。

weixin_50488897的博客 1683

手把手教你用树莓派蓝牙抓取小米温湿度计2代数据,接入HomeAssistant(附密钥获取避坑指南)

本文详细介绍了如何通过树莓派蓝牙抓取小米温湿度计2代数据并接入HomeAssistant的完整流程。重点解析了获取32位加密密钥的三种方法,包括使用Telink Flasher工具、米家APP抓包和开源工具ATC_MiThermometer,并提供了HomeAssistant集成配置和常见问题排查指南,帮助用户实现稳定可靠的温湿度监测。

一名菜鸟攻城师 779

DDR Study - LPDDR5 Power-Up and Initialization Sequence

本文深入解析LPDDR5内存的上电初始化流程,涵盖电源斜坡、复位信号释放和初始化训练等关键阶段。通过实际案例分享,详细探讨了电源轨时序、RESET信号处理、ZQ校准和CA总线训练等核心技术要点,帮助硬件工程师规避常见设计陷阱,确保DDR内存稳定运行。

weixin_42523792的博客 302

自己部门日均1000+告警?如何减少90%无效告警?

告警治理的核心在于提高告警的质量,减少无效告警的数量,确保关键告警能够得到及时响应。这不仅有助于提升运维效率,还能改善团队的工作环境,减少因无效告警带来的疲劳感。

无休居士的博客 2151

常见的AXI总线仲裁器概述-AXI协议理解(一)

SoC 设计广泛采用共享总线式的片上通信,其中的仲裁器是共享总线的关键技术之一。AMBA AXI 总线协议以高性能、高频率的系统设计为目标,适合高带宽、低延迟的系统设计,可以达到高频率的操作而不需要复杂的总线桥,满足众多部件的接口要求,具备高度灵活的互联结构,并且向后兼容 AHB 和 APB 接口。

Paul 安的博客 1万+

UED专栏 | 带你认识携程插画系统1.0

本文作者为携程平台UED团队,同时感谢机票、度假、酒店UED团队协同搭建插画系统。对于每一个设计师来说,插画总是让人喜爱又烦恼。喜爱是因为插画具有特殊的表现力、丰富的图形语言、鲜明的个性...

携程技术 2013

Codesys电子凸轮实战:从机械替代到虚轴设计的5个关键步骤

本文详细介绍了Codesys电子凸轮技术在运动控制领域的实战应用,从机械替代到虚轴设计的5个关键步骤。通过电子凸轮技术,操作员可以快速调整切割模式,显著提升产线效率。文章还探讨了虚轴架构、CAM表设计、动态耦合技巧及调试避坑指南,为工业自动化领域提供了实用的解决方案。

tech5的博客 767

YOLOv11 改进 - Mamba | 集成Mamba-YOLO(AAAI 2025),Mamba-YOLOv11-B 替换骨干,破解全局依赖建模难题,实现高效实时检测

本文介绍Mamba YOLO,为图片物体识别提供了“又快又准”的新方案。传统CNN架构运行快但难以捕捉远距离关联物体,Transformer架构精度高但计算量呈平方级增长,而SSM虽计算量为线性级且能抓全局关联,但用于图片识别时细节定位不准。为此,Mamba YOLO做了三项关键优化:引入ODMamba骨干网络,解决自注意力的二次复杂度问题,且无需预训练;设计ODMamba宏观结构确定最佳阶段比例和缩放大小;采用多分支结构的RG块建模通道维度,解决SSM在序列建模中的不足。在COCO数据集测试中,其小版本推

魔改工程师的博客 857

前端错误监控警报系统Sentry(哨兵)私有化部署手札

1.What —— sentry 是什么 它是一个前端错误监控警报系统。 对于一个前端应用,即使经过开发自测——>前端团队内部评审——>测试团队测试后,仍然无法完全避免线上出现的错误,比如网络请求错误、前端逻辑异常等。 sentry 可以监控前端应用的线上运行,当用户在使用应用的过程中遇到应用报错时(有时页面可能没反应,但报错会在控制台出现),它可以及时将错误信息上报给sentry的服务端程序,服务端程序可以通过开发者自定义的方式(比如,邮件、钉钉等)及时向开发者报警,并给出详细的错误信息。 当

林中路 6446

群晖如何安装软路由OpenWrt/iStoreOS作为旁路由(含网络设置、设置密码、还原出厂设置等linux命令ipk包)

openwrt的固件。

XiaoqiangClub的博客 7017

智慧充电桩小程序全栈实战:从架构设计到云快充协议对接

本文介绍一套开源、无加密的智慧充电桩小程序系统,涵盖用户充电全流程与场站运营全链路。系统基于uni-app与SpringBoot架构,支持微信小程序多端发布,集成云快充及中电联互联互通协议,实现扫码充电、实时监控、订单支付、会员管理、数据看板等功能。具备有序充电、光储充一体化、V2G等扩展能力,适用于充电运营商、物业自建、车企服务等场景,提供完整源码、数据库脚本与部署文档,助力快速构建可二次开发的新能源充电平台。

weixin_42648890的博客 245

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

生鲜配送小程序的难点不在下单,在分拣、缺货和售后

生鲜配送小程序需突破标准化商城逻辑,核心在于应对称重不精准、缺货频繁、售后复杂等挑战。应设计“下单-实收”双层金额机制,明确差额处理规则;建立缺货替换、售后拍照上传等流程化状态;区分预售与现货库存,细化权限管理与配送签收规则。系统设计须以时间线为骨架,先聚焦基础履约环节,逐步迭代,让损耗可追溯、管理更透明。

nhgworld的博客 171

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

小程序备案和 APP 备案区别是什么?上线 AI 小程序到底要办哪一个

回到开头那个问题:小程序备案和 APP 备案区别是什么?上线 AI 小程序到底要办哪一个?现在可以给出完整的回答了。关于区别它们的区别是载体形态的区别,不是制度归属的区别。同一套 APP 备案制度,在小程序上落地叫"小程序备案",在独立安装包上落地叫"APP 备案"。区别体现在六个具体的地方——入口、特有材料、负责人设置、审核链路的角色名称、编号后缀、编号展示方式。其中最能一眼分辨的,是备案号最后那个字母:A 是 APP,X 是小程序,K 是快应用,没有字母是网站。关于办哪一个。

powubaiyu的博客 349

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

2026短期用小程序,平台模板还是定制开发?按团队规模做一次工程取舍

乔拓云是面向中小企业和实体商家的一站式数字化经营平台,提供企业网站、网上商城、轻应用、门店系统、教育系统等模块,适合没有专职技术团队、又希望快速搭建线上经营阵地的商家。短期项目先跑通、先验证,把工程成本压到最低,等真实业务把定制的理由逼出来,再投入也不迟,这才是对短期项目最负责的工程姿态。工程上的关键是留好接口和数据通路:模板平台要支持数据导出,后续如果要把试点业务迁到自建系统,客户名单、订单、内容能平滑迁出,而不是试点做完成了数据孤岛。真要深度二次开发,那是自建的路,先评估值不值得为短期验证投入。

tiaotiao_999的博客 169

求职招聘管理系统:仿Boss直聘的招聘小程序与招聘网站全栈解决方案(附源码与截图)

本项目为一套仿Boss直聘的全流程求职招聘管理系统,覆盖求职者、企业、平台三方角色,支持H5、小程序、PC端、APP及管理后台多端部署。系统具备职位发布、简历投递、在线沟通、面试邀约、数据统计等核心功能,基于SpringBoot+MyBatis-Plus+MySQL后端与uni-app/Vue前端技术栈,实现一次开发多端发布。业务链路闭环,权限清晰,适合二次开发,适用于招聘平台搭建、企业内招系统及毕业设计,是学习与落地兼具的优质参考。

weixin_42648890的博客 163

校园终端开发:智慧班牌从安卓端、小程序到后台整体方案

智慧班牌是集信息展示、考勤采集、家校互通与班级管理于一体的智慧校园终端,支持刷脸/刷卡签到、动态课表、德育评价、通知推送等功能。系统基于Java+Vue+SpringBoot技术栈,采用SaaS多租户架构,兼容私有化、云部署,可对接教务、一卡通等平台。具备设备远程管控、数据统计分析及模块化扩展能力,广泛适配中小学、中职、高校场景,助力校园数字化、精细化管理。

爱笑的源码博客 244

宠物门店 SaaS|PRD 需求拆解:C 端小程序 + 双后台多角色权限与业务流程

前面两篇我们完成了项目整体定位、业务价值梳理以及整套系统分层技术架构的设计。架构是系统的骨架,PRD 就是填充骨架的业务血肉,明确系统角色权责、每个页面的功能、交互逻辑、数据流转规则、异常分支。这套宠物门店 SaaS 一共有三类入口:面向养宠客户的 C 端小程序、PC 管理后台、小程序管理后台。PC 后台和小程序管理后台共用同一套后端权限、同一套数据库,只是终端载体不同,适配不同场景:电脑端适合管理员配置、财务对账、批量导出;小程序管理后台适合美容师、前台在门店随手接单、更新工单、快速核销。

T0115618的博客 341

APP开发技术选型全景解析:原生、跨端与小程序的决策模型、成本结构与迁移策略

核心立场:多数选型讨论集中在性能跑分上,但真实项目中决定成败的变量排序是渠道、团队、成本、性能。把性能当第一标准,通常得出的结论是「全部原生」,而这恰恰是中小团队最贵的一条路;把渠道当第一标准,大部分场景的答案会自动收敛。本文适合的读者正在立项,需要在原生、跨端、小程序之间做决策的技术负责人已有小程序业务,在考虑是否要扩展独立 APP 的产品负责人外包甲方,想看懂乙方报价单里技术路线差异的人准备转型的开发者,想搞清楚三条路线的能力边界与就业面先纠正的三个认知常见认知实际情况纠偏依据。

zhongben_keji的博客 241

基于springboot+vue+uniapp的羽毛球预约小程序(Websocket智能沟通、Echarts数据分析、会员闭环管理、灵活运营规则、全流程预约)

本系统基于B/S架构,采用前后端分离设计,集成微信小程序与管理后台,实现多角色权限管控。核心亮点包括:全流程可视化预约、灵活运营规则配置、会员闭环管理(含余额、充值、退款)、ECharts多维度数据分析及WebSocket智能客服。支持语音、图片沟通,提升服务效率。系统覆盖用户、工作人员、管理员全链路功能,实现场馆资源高效管理与用户体验优化。

paopaokaka_luck的博客 226

盲盒源码系统小程序V6MAX:首单优惠与0.01首抽如何避免活动叠加混乱

盲盒源码系统小程序V6MAX:首单优惠与0.01首抽如何避免活动叠加混乱

208

微信小程序开发踩坑记(三)小程序图片保存

本文记录纯本地图片处理小程序(压缩、加水印、长图拼接、裁剪)提交审核时,被判定图片存在信息安全风险驳回的踩坑过程。区分官方《小程序平台运营规范》条文与线上审核实操差异;分享一套折中方案:原图临时上传后端走 `mediaCheckAsync` 安全校验,校验完成后删除云端文件,尽量贴近 “本地优先” 的产品定位,同时满足平台审核要求。

XGStudio2024的博客 193

中小理疗馆多诊室排队管理痛点与轻量化小程序解决方案

中小理疗馆面临多诊室接诊时排队混乱、纸质登记易错漏、前台负担重等问题。基于小程序的轻量化排队方案,实现多队列隔离、手机自助取号、一键叫号与语音播报,支持多角色权限管理,降低人力成本与出错率。无需昂贵硬件,配置简单,显著提升候诊效率与顾客体验,助力门店数字化升级。

QTKLBJB的博客 168

洗浴中心小程序的手牌、钟房与更衣柜:一套离线优先的场馆系统怎么做

洗浴中心是典型的"重场馆、弱线上"业态:客人入场后几小时的活动全发生在线下,小程序的价值集中在入场、手牌、点单、钟房排钟四个环节。青海青帝信息科技有限公司在西北地区的场馆类项目中反复验证过这套模式的适用性:凡是"客人随身一张凭证、全场分散消费、末端统一结算"的业态,水上乐园、温泉、展馆,都可以套用同样的架构骨架,按业务差异替换消费模型即可。搓澡、按摩这类按钟点计的服务有独立的"钟房"调度逻辑:技师按手法与等级排班,客人点单后从对应技能组的在线技师里选人,技师服务中不可再接钟,服务完成打"下钟"。

青企通 395
上一篇: 干货 | 提升内存管理效率,携程酒店查询服务轻量化探索和实践
下一篇: 干货 | 降低复杂度提升效率,DDD在携程用车/租车订单系统重构中的实践
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值