ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

腾讯云微搭低代码实战:两周构建微信小程序代备案网站

腾讯云微搭低代码实战:两周构建微信小程序代备案网站 1. 项目缘起一个“代备案”需求的诞生去年年底我接到了一个朋友公司的需求他们是一家为中小微企业提供一站式工商财税服务的公司。随着微信小程序生态的繁荣他们的客户群体——那些开餐馆、做零售、搞培训的老板们也开始琢磨着要做个小程序来引流或者做线上生意。但问题来了很多老板对“小程序备案”这个环节一头雾水流程繁琐、材料复杂自己搞不定找代办又怕不靠谱。朋友公司嗅到了这个商机想开发一个“微信小程序代备案”的线上服务平台让客户能像网购一样在线提交资料、支付费用他们后端团队跟进处理全程可视化。需求很明确一个面向C端用户的网站功能包括备案流程说明、资料清单展示、在线下单支付、订单状态跟踪。技术栈上他们希望前端能快速成型、易于维护并且能方便地嵌入到微信公众号菜单或者生成独立的H5链接进行传播。在评估了Vue、React等框架后我们最终把目光投向了腾讯云微搭低代码平台Tencent Cloud Low-code简称QClaw。原因很简单第一这是腾讯自家的产品与微信生态小程序、公众号的集成理论上会更顺畅第二低代码能极大压缩前端页面的开发周期让我们能把精力集中在业务逻辑和用户体验上第三它支持直接发布为H5网站完美契合“网站”这个形态需求。于是这个“用QClaw从零搭建微信小程序代备案网站”的项目就正式启动了。整个过程更像是一次对低代码平台在真实商业场景中应用深度的探索其中既有“拖拽即得”的爽快也有遇到边界时需要“写代码”的挑战。下面我就把这次实战的完整记录和核心思考分享出来。2. 初识QClaw环境搭建与核心概念梳理QClaw不是一个独立的IDE它完全基于浏览器工作。你只需要一个腾讯云账号开通微搭低代码服务就能在控制台进入工作台。对于前端开发者而言第一次进入其编辑器界面会感到一种“熟悉的陌生感”。它的界面分为几个核心区域左侧是组件库和页面树中间是画布和实时预览右侧是当前选中组件的属性、样式、事件配置面板下方则是数据源管理和代码编辑器入口。整个布局逻辑清晰对于有前端基础的人来说上手非常快。这里有几个关键概念需要在一开始就理清这直接决定了后续的开发效率应用、页面与组件在QClaw中你创建的是一个“应用”。我们这个代备案网站就是一个独立的应用。应用由多个“页面”组成比如首页、流程页、下单页、个人中心页。而页面则由各种各样的“组件”通过拖拽拼接而成。组件是基石从基础的文本、图片、按钮到复杂的表单容器、轮播图、列表视图应有尽有。低代码与自定义代码QClaw的“低代码”体现在对于大部分基础的UI搭建和数据绑定你确实不需要写一行代码。例如设置一个文本的内容绑定一个按钮的点击事件跳转到指定页面都可以通过右侧面板可视化配置。但是当你的业务逻辑变得复杂比如需要对用户输入的数据进行复杂校验、调用第三方API、或者实现动态的计算逻辑时就必须用到“自定义代码”。QClaw允许你在组件的事件处理、页面的生命周期函数中编写JavaScript代码这给了我们足够的灵活性去突破低代码的局限。数据源与模型这是QClaw连接后端数据的桥梁。你可以创建“数据模型”来定义数据结构类似于数据库表比如我们创建了Order订单模型包含字段订单号、用户ID、小程序名称、备案状态、创建时间等。QClaw会自动为这个模型生成增删改查的API。更强大的是它支持连接外部已有的API通过“自定义连接器”或者直接使用腾讯云开发TCB的数据库。我们因为已有后端系统所以主要使用“HTTP请求”方式调用我们自己的API。样式体系QClaw的样式配置非常CSS化支持类名、内联样式也支持编写全局的CSS样式文件。对于熟悉CSS的开发者来说这几乎没有学习成本。你可以精确控制每个组件的边距、颜色、字体、布局Flexbox。一个重要的技巧是善用“容器”组件。容器本身没有视觉表现但它是一个强大的布局工具通过设置容器的display: flex和相关属性可以轻松实现各种复杂的页面布局这是摆脱“低代码页面呆板”印象的关键。注意在项目开始前建议花半小时通读官方文档的“核心概念”部分。虽然很多操作可以“摸着石头过河”但建立正确的认知模型能避免后期出现“为什么这个数据绑不上”、“这个事件为什么不触发”等基础问题节省大量排查时间。3. 页面规划与UI搭建从设计稿到可交互原型我们拿到了UI设计师提供的Figma设计稿。传统的开发流程是“切图-写HTML/CSS-对接数据”而在QClaw里流程变成了“规划组件结构-拖拽基础组件-微调样式-绑定数据”。3.1 首页结构拆解首页需要展示服务优势、备案流程导图、客户案例、行动按钮。我们将其拆解为以下几个部分顶部导航栏使用“导航栏”组件配置Logo和菜单项首页、流程、下单、我的订单。轮播图/Banner使用“轮播图”组件上传设计稿中的Banner图片并配置自动播放和指示点样式。这里遇到了第一个细节调整设计稿的轮播图比例是16:9但不同屏幕宽度下需要自适应。我们通过设置轮播图容器的宽度为100%高度为auto并固定一个最大高度来解决。服务优势图标区这里用到了一个“网格布局”的技巧。拖入一个“容器”设置其布局为flexflex-wrap: wrapjustify-content: space-between。然后在这个容器里放入多个子容器每个子容器包含一个“图标”组件和一个“文本”组件。通过计算子容器的宽度例如在PC端设置为width: 22%实现自动换行的网格效果。流程导图这是视觉重点。设计师给的是横向流程图的图片。低代码平台里没有现成的流程图组件。我们的方案是使用多个“容器”和“文本”、“图标”组件手动拼接。水平方向用一个大的Flex容器里面并列放置多个代表步骤的小容器。每个小容器包含步骤序号圆形背景的文本、步骤标题和描述步骤之间用CSS绘制虚线箭头连接使用::after伪元素和border属性。虽然比直接贴图麻烦但这样做出来的流程导图是矢量的在任何分辨率下都清晰且后续如果需要为每个步骤添加点击查看详情的功能也会非常方便。底部页脚包含版权信息、联系方式等。使用一个通栏的容器设置背景色和居中对齐的文本即可。3.2 表单页下单页的精细打磨下单页是核心转化页面需要收集用户的小程序信息、联系人信息、上传营业执照等材料。我们使用了“表单容器”组件它内置了校验和提交逻辑。字段布局表单容器内默认是纵向堆叠。对于“联系人姓名”和“联系电话”这种需要并排显示的字段我们就在表单容器内再嵌套一个Flex布局的容器将两个“表单项”组件放进去并设置各占50%宽度。数据绑定每个表单项输入框、选择器都有一个“字段名”属性。这个字段名就对应了我们要提交的数据对象的key。例如姓名输入框的字段名设为contactName那么在表单的提交事件里我们就能通过event.detail.value.contactName获取到用户输入的值。文件上传这是代备案的关键。QClaw提供了“文件上传”组件可以配置上传数量、文件类型如图片、PDF、上传到腾讯云COS等。我们这里需要上传到自己的服务器。所以我们配置组件触发上传后在其onSuccess事件中编写自定义代码获取到文件的临时URL然后调用我们自己的后端API将这个文件上传到我们的OSS并最终将返回的永久文件URL存储到订单数据中。自定义校验除了必填、格式手机号、邮箱等基础校验业务校验需要写代码。比如我们要求“小程序名称”不能包含某些敏感词。我们在表单的“提交前”事件中编写JS函数对event.detail.value.appName进行校验如果不符合规则就调用wx.showToast发布为H5时对应的是浏览器alert风格的提示提示用户并执行event.detail.preventDefault()来阻止表单提交。// 在表单的“提交前”事件中编写的自定义JS代码示例 export default async function({event, data}) { const formData event.detail.value; const forbiddenWords [测试, 违规, 非法]; // 示例敏感词库 for (let word of forbiddenWords) { if (formData.appName.includes(word)) { // 提示用户 $w.utils.showToast({ title: 小程序名称包含不允许的词汇“${word}”, icon: none }); // 阻止表单提交 event.detail.preventDefault(); return; // 终止后续逻辑 } } // 如果校验通过可以在这里继续处理例如将数据暂存到页面变量或发起API预检 }通过这样的组合我们在一两天内就搭建出了一个视觉还原度高、且具备完整交互逻辑的网站原型效率远超传统开发。4. 核心业务逻辑实现数据流转与状态管理UI搭建是“面子”业务逻辑是“里子”。代备案网站的核心业务逻辑围绕“订单”展开创建订单、查询订单状态、更新订单进度。4.1 调用后端API自定义数据源我们的后端是独立的Java服务。QClaw通过“自定义数据源”来调用。在数据源管理页面新建一个“HTTP请求”数据源命名为OrderAPI。我们需要配置几个关键方法createOrder:POST /api/order/create 用于提交订单。getOrderList:GET /api/order/list?userId{userId} 用于查询用户的订单列表。getOrderDetail:GET /api/order/detail/{orderId} 用于查询订单详情。配置时需要注意请求头和参数的设置。例如我们的API需要Authorization头传递Token。Token从哪里来来自用户登录。我们使用微信网页授权登录OAuth2.0用户授权后后端返回一个JWT Token我们需要将这个Token存储起来例如使用QClaw提供的$w.localStorage并在每次调用OrderAPI时通过“全局变量”或直接在数据源配置的“请求前置处理器”中动态添加到请求头里。4.2 页面间数据传递用户从订单列表页点击某个订单需要跳转到订单详情页并把订单ID传过去。QClaw提供了几种方式URL Query参数在跳转事件中设置目标页面的路径为/page-order-detail?orderId123。在详情页的onPageLoad生命周期函数中可以通过$w.page.params.orderId获取到这个参数。这是最常用、最符合Web习惯的方式。全局变量对于一些全局状态比如用户信息可以存储在$w.globalData中。但要注意全局变量在页面刷新后会丢失适合存储会话期间不变的数据。数据源查询详情页也可以不依赖参数而是在onPageLoad中直接调用getOrderDetail数据源方法。但这通常需要用户身份信息来限定查询范围不如传递ID直接。我们选择第一种。在订单列表页为每个订单项绑定点击事件事件动作选择“跳转页面”目标页面选择“订单详情页”并在“页面参数”里设置{orderId: item._id}假设item是列表当前项的数据对象其中_id是订单ID。4.3 订单状态的可视化展示订单状态如“待付款”、“资料审核中”、“管局审核中”、“备案成功”需要清晰地展示给用户。我们不仅用文本显示还设计了一个时间轴组件。 在详情页我们调用getOrderDetail接口获取订单数据其中包含一个statusLog数组记录了状态变更的时间点和备注。我们在页面上放置一个垂直排列的容器使用$w.for循环QClaw的列表渲染指令来遍历statusLog。// 在详情页的onPageLoad中 export default async function({event, data}) { const orderId $w.page.params.orderId; const result await $w.cloud.callDataSource({ name: OrderAPI, methodName: getOrderDetail, params: { orderId: orderId } }); if (result.code 0) { // 将订单详情数据赋值给页面变量orderDetail $w.page.state.set({ orderDetail: result.data }); // 状态日志数据会自动绑定到使用了$w.for循环的视图组件上 } }在视图部分我们为时间轴的每个节点设计不同的图标和颜色。通过判断当前循环项的状态值动态绑定不同的CSS类名从而实现“已完成”节点是绿色对勾“进行中”节点是蓝色圆点“未开始”节点是灰色圆圈的效果。这完全依靠QClaw的数据绑定和条件渲染能力实现无需手动操作DOM。5. 深度定制与踩坑实录当低代码遇到复杂需求低代码平台不是万能的尤其是当需求超出其预设组件的边界时。以下是我们在项目中遇到的几个典型挑战及解决方案。5.1 富文本内容展示与样式隔离我们需要在“备案流程”页面展示大段的、带有格式加粗、列表、标题的说明文字。直接从后台API获取到的是HTML字符串。QClaw的“文本”组件只支持纯文本而“富文本”组件在渲染复杂HTML时其自带的样式可能会污染全局。解决方案我们使用了“容器”组件并将其innerHTML属性绑定到我们的HTML数据。但这带来了样式冲突。我们的做法是在获取到HTML字符串后通过一个自定义的JavaScript函数使用正则表达式给所有可能冲突的标签如div,p,span加上一个特定的类名前缀例如.rich-text-content p { ... }。然后在页面的全局样式或该容器的样式里只针对这个前缀下的元素编写CSS规则。这样就实现了样式的隔离。5.2 与微信生态的深度集成登录与支付网站需要嵌入微信公众号菜单因此必须接入微信网页授权登录。QClaw没有现成的微信登录组件。解决方案我们在腾讯云侧配置了公众号的网页授权域名。在网站首页的onPageLoad中编写自定义代码判断URL中是否带有微信返回的code。如果没有则拼接微信OAuth2.0授权URL并使用$w.navigateTo重定向到该URL注意这里不能使用平台自带的跳转需用window.location.href进行整个页面的重定向。用户授权后跳转回我们指定的页面带code我们在该页面的onPageLoad中用这个code调用我们自己的后端接口换取用户信息和服务端的Token。将Token存入$w.localStorage并更新全局用户状态。支付环节类似我们跳转到后端生成的微信支付中间页或使用JSAPI调起支付支付成功后后端回调通知我们我们再更新订单状态。5.3 列表页的复杂筛选与分页加载订单列表页需要支持按状态筛选并且滚动到底部自动加载更多。QClaw的“列表视图”组件支持分页但默认的分页逻辑是“点击加载更多”按钮。我们需要“滚动加载”。解决方案筛选我们在列表上方放置了几个按钮代表不同状态。点击某个按钮时将该状态值赋给一个页面变量filterStatus然后触发列表数据的重新加载调用getOrderList方法并传入filterStatus参数。滚动加载这是一个经典的前端功能。我们放弃了“列表视图”组件自带的分页转而使用一个普通的“容器”结合$w.for循环来渲染列表项。然后我们监听这个容器的滚动事件需要给容器设置固定高度和overflow-y: auto。在滚动事件的回调函数中计算是否滚动到了底部scrollTop clientHeight scrollHeight - 10。如果触底且当前不是正在加载并且还有更多数据根据后端返回的hasMore字段判断则执行加载下一页数据的函数将新数据追加到原有的列表数据数组中。// 滚动加载的核心逻辑片段 export default async function({event, data}) { const listContainer $w(#orderListContainer); // 假设列表容器的ID // 监听滚动事件这个事件需要在组件属性面板中绑定 const scrollTop listContainer.scrollTop; const clientHeight listContainer.clientHeight; const scrollHeight listContainer.scrollHeight; if (scrollTop clientHeight scrollHeight - 10) { if (!this.data.isLoading this.data.hasMore) { $w.page.state.set({ isLoading: true }); // 调用加载下一页数据的方法 await this.loadMoreOrders(); $w.page.state.set({ isLoading: false }); } } }这个过程需要手动管理页码、加载状态和数据合并比使用现成组件复杂但提供了最大的灵活性。5.4 性能优化图片懒加载与代码分包随着页面内容增多特别是首页有很多图片时加载速度会变慢。QClaw生成的H5站点其资源加载策略是统一的。优化措施图片懒加载对于非首屏的图片我们将img标签的src属性改为>
返回列表