ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

小程序+公众号H5开发实战:双端骨架、定位与跳转全解析

小程序+公众号H5开发实战:双端骨架、定位与跳转全解析 简介新版多多房产小程序加公众号是一套完整的房产信息发布系统主要面向房产中介、楼盘展示企业及需要对微信公众号进行二次开发的工程师。这套源码将小程序前端和公众号管理后台合二为一可快速实现房源录入、分类展示、详情浏览、用户留言等常见业务流程整体代码结构清晰适合有脚本语言和服务器端语言基础的人群进行学习或改造。压缩包内共有834个文件包括小程序核心的脚本、页面结构、样式配置以及后端接口、后台页面、图片和字体资源大小仅3.13兆下载和部署都很方便。目前已有832人浏览学习描述明确说明‘亲测可用’可直接运行验证。源码按功能模块组织目录并内置常用的组件库和轮播图等交互组件便于理解小程序的组件化开发模式也方便在此基础上进一步扩展房源筛选、地图定位或在线预约功能。对于想快速搭建房产类应用或用于毕业设计、技术实践的开发者这是一份值得收藏的实战源码。1. 拿到的不是小程序源码而是一套需要重新落地的双端骨架解压之后大多数人是懵的项目里没有一坨 .wxml、.js而是一批 CSS 文件。这是很多“小程序公众号”源码包的常态——小程序端和 H5 端共用一套业务后端资源包先给你公众号 H5 端的皮肤层微信公众号绑定后通过 web-view 把 H5 嵌进小程序或者独立跑公众号菜单。多多房产这套 2.5.46 的价值恰好在这个壳上aui.css 承担布局、weui.css 提供微信风格组件、swiper.min.css 处理楼盘轮播house.css 把通用框架的毛边收掉。这篇我会从这批样式文件怎么按序加载讲起再落到 uni-app 嵌入公众号时定位和标题怎么配抓包和启动页该改哪里最后补上从 H5 跳回小程序的完整链路。2. 认识 aui.css 与 weui.css公众号 H5 端皮肤与主题切换2.1 这一批 CSS 文件到底谁先加载多多房产的资源包里有 weuix.css、aui.css、weui.css、swiper.min.css、style.css、demo.css、aui-skin.css、aui-skin-night.css、aui-flex.css、house.css。看起来是十份文件实际上它们分工非常明确aui 和 weui 负责两套基础设计语言skin 处理主题皮肤flex 处理弹性布局house.css 才是真正跟房源卡片、筛选栏、楼栋标签强相关的业务样式。常见做法是把基础核心先加载皮肤按用户偏好切换最后再让 house.css 覆盖默认样式。如果直接在公众号 H5 首页一次性全部 link 进来虽然省事但夜间模式的 aui-skin-night.css 会和 aui-skin.css 冲突后面的文件把前面的颜色全部洗掉。所以加载顺序不是随便写的我一般会在模板里放成下面这样!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1, maximum-scale1, user-scalableno link relstylesheet hrefcss/aui.css link relstylesheet hrefcss/weui.css link relstylesheet hrefcss/weuix.css link relstylesheet hrefcss/aui-skin.css link relstylesheet hrefcss/aui-skin-night.css disabled link relstylesheet hrefcss/aui-flex.css link relstylesheet hrefcss/swiper.min.css link relstylesheet hrefcss/house.css link relstylesheet hrefcss/style.css title房源列表/title /head body div classaui-flex-col house-list.../div script srcjs/swiper.min.js/script /body /html这段代码里aui.css 先定下栅格和基础排版weuix.css 再把微信官方组件的细节补上皮肤文件随后。disabled属性让夜间皮肤默认不生效但浏览器仍会解析它切换时只需去掉 disabled。swiper.min.css 只服务轮播区域不参与全局重置。house.css 和 style.css 放在最后是让业务规则能覆盖框架默认值避免出现「想改房源卡片圆角却找不到选择器」的问题。2.1.1 样式文件职责速查文件职责在房产场景里的典型用处aui.css基础栅格、按钮、表单、列表楼盘详情页的区块间距与底部操作栏weui.css微信官方视觉组件公众号内授权弹窗、表单校验、Actionsheetweuix.cssweui 的扩展样式增强 tab、面板、搜索框等交互组件aui-skin.css日间主题变量默认白色卡片、主色调边框aui-skin-night.css夜间主题变量夜间看房模式下深色背景与反色文字aui-flex.cssflex 布局工具类横向排列的户型标签、楼盘图标的对齐swiper.min.css轮播图样式房源主图、周边配套 bannerhouse.css房产业务样式价格标签、楼栋状态、预约看房按钮style.css项目级自定义针对当前楼盘的覆盖样式aui-flex 的作用常被低估。如果你做过房源卡片就会发现价格区域、面积区间、朝向标签天然是三个 flex itemaui-flex.css 里的aui-flex-row aui-flex-between aui-flex-middle能直接完成左右布局和垂直居中不需要为每一处间距重写 flex 属性。对于二手房的标签列表这个文件能让aui-flex-wrap自动换行避免标签溢出卡片。2.2 主题色与夜间模式的切换原理aui-skin.css 和 aui-skin-night.css 不是简单的暗色变量它们内部定义了background-color、text-color、border-color这一组语义 token。切换主题时通常会同时给html标签打一个>function applyTheme(theme) { const html document.documentElement; const night document.querySelector(link[href$aui-skin-night.css]); const day document.querySelector(link[href$aui-skin.css]); if (theme night) { night.disabled false; day.disabled true; html.setAttribute(data-theme, dark); } else { night.disabled true; day.disabled false; html.setAttribute(data-theme, light); } }这段 JS 的逻辑不难通过选择器找到皮肤文件切换 disabled 状态让浏览器重新计算样式。>web-view srchttps://h5.example.com/house/list?themenightcityId110000/web-view这里的theme参数在 H5 端入口处解析再调用applyTheme。我在实际项目里遇到过「公众号内正常、小程序内主题不生效」的情况最后查出来就是小程序端没有把主题参数拼进 web-view 的 src只发了 token。所以凡是需要 H5 感知的状态尽量都走 URL 参数不要赌两端 storage 同步。3. uni-app 嵌入公众号定位获取、标题动态化与开发者绑定3.1 在公众号 H5 里拿到经纬度房产 App 里最核心的是「附近房源」和「按距离排序」因此 H5 端必须拿到经纬度。在 uni-app 开发 H5 嵌入微信公众号时不能只用uni.getLocation因为微信内置浏览器需要通过 JS-SDK 才能稳定返回坐标。常见做法是先用window.wx.config注入签名再调wx.getLocation。签名需要后端根据当前页面 URL 生成而且 URL 不能带#后面的 hash。为了兼容小程序 web-view 场景我会把取定位封装成带 fallback 的方法import config from /common/config.js; function getWxLocation() { return new Promise((resolve, reject) { if (!window.wx) { uni.getLocation({ type: gcj02, success: resolve, fail: reject }); return; } window.wx.config({ debug: false, appId: config.mpAppId, timestamp: config.jsSdk.timestamp, nonceStr: config.jsSdk.nonceStr, signature: config.jsSdk.signature, jsApiList: [getLocation] }); window.wx.ready(() { window.wx.getLocation({ type: gcj02, success: resolve, fail: reject }); }); }); }代码里第一层判断很关键window.wx不存在时直接用 uni 的定位接口保证普通浏览器和 App 环境也能降级运行。gcj02是国测局坐标小程序地图组件和腾讯位置服务默认都是这个坐标系如果后端地图服务使用百度坐标需要再做坐标偏移转换。// 调用示例 getWxLocation().then((res) { this.latitude res.latitude; this.longitude res.longitude; this.loadNearbyHouse(res.latitude, res.longitude); }).catch(() { uni.showToast({ title: 定位失败请检查授权, icon: none }); });3.1.1 uni.getLocation 与公众号定位的差异场景uni.getLocationwx.getLocation(JS-SDK)普通浏览器部分支持不存在 wx 对象需降级微信内置浏览器偶尔返回国家中心点稳定返回需签名小程序 web-view不适用可用URL 必须列入业务域名授权方式浏览器地理位置授权微信服务号授权两者都要求用户授权但 JS-SDK 的授权是微信统一弹出的体验比浏览器自带弹窗更好。签名接口必须使用当前页面的window.location.href去掉#之后的字符串并且/不转义。如果签名 URL 和后端拿到的不一致wx.ready不会触发此时先不要怀疑代码打开debug: true看报错信息是「config:invalid signature」还是「config:invalid url」能省不少时间。3.2 小程序内动态设置标题公众号端用 document.title房产详情页的标题一般要动态展示「楼盘名-几室几厅」在小程序端可以通过uni.setNavigationBarTitle实现但如果同一个页面既被小程序原生访问又被公众号 H5 访问需要区分处理。// #ifdef MP-WEIXIN uni.setNavigationBarTitle({ title: ${detailInfo.name}-${detailInfo.roomType} }); // #endif // #ifdef H5 document.title ${detailInfo.name}-${detailInfo.roomType}; if (window.WeixinJSBridgeReady) { window.WeixinJSBridgeReady.invoke(setPageTitle, { title: document.title }); } // #endif第一段是小程序专用第二段是 H5 专用。WeixinJSBridgeReady事件可以保证在微信浏览器里标题同步到顶部导航否则 H5 里改了 title公众号的网页标题栏可能不刷新。需要注意WeixinJSBridgeReady不是每一次都稳定触发所以代码里先直接设置document.title再尝试 invoke避免出现 Android 微信里标题半天不动的现象。小程序端动态标题还有一层隐藏问题如果页面延迟加载数据uni.setNavigationBarTitle必须在onLoad里异步回调后执行而不能在页面配置里写死。我一般会在拿到详情接口结果后再设置标题同时把导航背景色一并调成项目主色减少页面切换时的闪白。3.3 微信开发者工具提示“登录用户不是该小程序的开发者”在把多多房产小程序跑起来时开发者工具经常会报“登录用户不是该小程序的开发者”。这个错误只跟权限绑定有关和源码本身关系不大。处理步骤使用小程序管理员账号登录微信公众平台。进入「管理」-「成员管理」-「项目成员」把当前调试的微信号添加为「项目成员」角色选开发者。退出微信开发者工具并重新登录确保右上角头像已切换成被添加的微信号。如果 H5 页面要通过 web-view 加载还需要在「开发管理」-「开发设置」-「业务域名」中把 H5 域名加进去同时下载校验文件放到域名根目录。{ pages: [ { path: pages/house/detail, style: { navigationBarTitleText: 楼盘详情, navigationBarBackgroundColor: #1a73e8, navigationBarTextStyle: white } } ] }上面的 pages.json 片段展示了navigationBarTitleText默认值和导航栏颜色配置。即使之后会用 JS 动态改标题这里最好也保留一个兜底文案避免接口加载期间出现白底黑字的空标题。开发者工具的“本地设置”里也可以临时勾选「不校验合法域名」但这只能用于真机预览上线前必须关闭。4. 微信小程序抓包与加载页优化从链接过滤到导航栏高度4.1 把公众号链接和小程序请求一起抓出来多多房产这套项目里小程序端会请求自己的 API公众号 H5 也会请求同样的接口。排查问题时最怕两个环境混在一起不知道哪个域名出了问题。微信小程序抓包时我通常把代理工具配置成只过滤业务域名这样接口请求和公众号链接会同时显示在抓包面板里能直接对比两端返回差异。# Android 手机设置代理需同局域网 adb shell settings put global http_proxy 192.168.1.10:8888 # 取消代理 adb shell settings delete global http_proxy在 Mac 上常见的抓包工具是 CharlesWindows 上用 Fiddler 较多。需要注意 HTTPS 抓包需要在手机上安装证书Android 7.0 以上还要在项目里配置network_security_config.xml允许 user 证书否则小程序里看到的是加密乱码。network-security-config base-config cleartextTrafficPermittedtrue trust-anchors certificates srcsystem/ certificates srcuser/ /trust-anchors /base-config /network-security-config这段配置表示允许明文流量并且信任用户安装的证书。它只影响本地调试正式包建议去掉user证书信任。抓包时的过滤规则可以写成下面这样只保留业务相关域名减少噪声。.*h5\.example\.com.* .*api\.example\.com.*表格式的常用抓包项如下抓包目标Charles 配置常见问题公众号 H5 请求Proxy - SSL Proxying Settings证书未安装导致 TLS 握手失败小程序 wx.request直接显示在 Structure 里需开启「不校验合法域名」web-view 内嵌页面会以 H5 域名显示确认业务域名已经配置定位接口关注 coordinates 字段gcj02 坐标偏移异常4.1.1 通过 vConsole 就地查看接口请求如果不想开代理也可以在 H5 端引入 vConsole在手机上直接看请求结果。多多房产的 style.css 和 demo.css 都是纯静态文件把它和 vConsole 一起注入页面调试效率很高script srcjs/vconsole.min.js/script script new VConsole(); /scriptvConsole 的好处是能看到console.log、网络请求和 cookie但它看不到小程序原生的wx.request。所以小程序端仍然建议配合抓包工具H5 端用 vConsole 足够。4.2 修改刚进入的加载页面很多房产小程序一进来就是首页加载网络慢时白屏好几秒。“修改刚进入的加载页面”本质上是把启动页改成自定义的骨架屏而不是系统默认的 launch screen。多多房产的 pages.json 里可以把第一个页面指向一个单独的 Splash 页等数据到位后再uni.redirectTo到首页。{ pages: [ { path: pages/splash/splash, style: { navigationStyle: custom, backgroundColor: #f5f5f5, disableScroll: true } }, { path: pages/index/index, style: { navigationBarTitleText: 多多房产, enablePullDownRefresh: true } } ] }// pages/splash/splash.js onLoad() { setTimeout(() { uni.reLaunch({ url: /pages/index/index }); }, 800); }这里的disableScroll防止加载页出现滚动条reLaunch会关闭 splash 页确保用户回退时不会回到加载页。延迟时间不建议超过 1 秒否则用户会认为卡死。如果你需要展示广告或品牌形象可以把这个时间拉长到 3 秒但要提供跳过按钮。4.2.1 导航栏高度与胶囊按钮的适配自定义加载页后通常也需要手动适配微信小程序顶部导航栏高度。因为把navigationStyle设成custom后右上角的胶囊按钮还在但标题栏高度需要自己计算。const info wx.getWindowInfo ? wx.getWindowInfo() : wx.getSystemInfoSync(); const statusBarHeight info.statusBarHeight; const menu wx.getMenuButtonBoundingClientRect(); const navBarHeight (menu.top - statusBarHeight) * 2 menu.height;getMenuButtonBoundingClientRect()会返回胶囊按钮的top和height通过公式算出导航栏自定义视图的高度。这段代码兼容基础库低版本因为老版本没有wx.getWindowInfo需要降级到getSystemInfoSync。很多「自定义导航栏顶部按钮被胶囊遮挡」的 bug都来自这里少算了statusBarHeight。适配时可以把计算结果存到全局变量然后在页面布局里用padding-top撑开。注意不要直接写死 44pxiPhone 14 Pro 和普通 Android 的statusBarHeight不一样硬编码会导致顶部标题偏移。5. 从 H5 跳转小程序weixin://dl/business 的生成、触发与验证5.1 生成 scheme 的两种路径公众号 H5 里最常见的跳小程序方式是 URL Scheme也就是weixin://dl/business开头的链接。生成方式有两种一是在微信公众平台的小程序「工具」-「生成 URL Scheme」里手动填路径二是用云开发或服务端接口动态生成。const cloud require(wx-server-sdk); cloud.init(); exports.main async (event) { const result await cloud.openapi.urlscheme.generate({ jumpWxa: { path: pages/house/detail, query: id1024fromh5 }, expiresAt: Date.now() 30 * 24 * 3600 * 1000 }); return { scheme: result.openlink }; };expiresAt是过期时间的时间戳必须精确到毫秒。有效期内同一 scheme 可以被多次使用但过期后需要重新生成。动态生成方案适合做带参数的活动链接比如从公众号文章跳转到指定房源详情页。5.2 触发条件与验证方法到 H5 端后用window.location.href跳转但必须确保由用户点击触发不能放在onLoad里自动跳。a onclickopenMiniProgram()打开小程序看房/afunction openMiniProgram() { const scheme weixin://dl/business/?txxxxxxxx; window.location.href scheme; }测试时要用微信内置浏览器打开外部浏览器无法识别这个协议。验证的关键是看目标小程序页面的onLoad参数是否正确// pages/house/detail.js onLoad(options) { console.log(from:, options.from, id:, options.id); }如果from和id都能打印出来说明 scheme 的 query 生效如果只打开了小程序却没有参数检查jumpWxa.query的格式它必须是keyvaluekey2value2且不能带?。这个流程里最容易踩的坑是 scheme 在小程序内二次跳转那需要调用wx.miniProgram.navigateBack而不是重新触发 scheme。本文还有配套的精品资源点击获取
返回列表