简介:本资源为2023年最新修复版微信分享裂变HTML源码,面向前端开发者、营销活动策划人员及中小企业技术实施者,解决微信生态内快速构建合规分享裂变页面的技术门槛问题。压缩包共11个文件(428KB),含1个主入口HTML、2个核心JS(jweixin-1.0.0.js与jquery.min.js用于微信SDK对接及交互逻辑)、1个CSS(aui.css提供基础UI样式)、6张PNG/JPG图片(含手指点击引导图、分享成功提示图等视觉素材),完整覆盖页面结构、微信JS-SDK配置、长按图片触发分享、分享成功回调反馈等关键功能模块。目前已有175人学习下载。读者可直接部署运行,快速复用已调试通过的分享机制——包括第501行实现的图片长按唤起微信原生分享菜单、第539行定义的分享后弹窗提示逻辑,以及适配微信最新接口策略的权限校验流程,显著降低开发试错成本。
1. 项目背景与核心价值:为什么“修复版”分享裂变源码依然有市场
最近在整理一些老项目的代码库,翻到了一个尘封已久的文件夹,里面躺着一个名为“微信分享裂变”的HTML源码包。这让我想起几年前,基于微信浏览器的分享功能做裂变营销几乎是每个运营活动的标配。虽然微信官方对分享接口的管控日趋严格,导致很多老代码失效,但时至今日,我发现这个需求并没有消失,反而以另一种形式在延续。很多朋友,尤其是中小企业的运营或独立开发者,仍然在寻找一套能快速搭建、稳定运行的分享引导页方案,用于产品推广、活动引流或者内容传播。
所谓的“2023年最新修复版”,其核心价值就在于“修复”二字。微信的JSSDK(JavaScript SDK)接口规则、分享卡片的预览机制、乃至浏览器内核的更新,都会导致几年前写的分享代码在今天完全无法使用或效果大打折扣。常见的“坑”包括:分享出去的朋友圈标题和描述不生效、分享图标显示为默认的网站LOGO甚至不显示、在安卓和iOS上表现不一致、以及最头疼的“签名无效”错误。这个修复版源码,本质上就是有人踩过了所有这些坑,将适配最新微信环境(截至某个时间点)的解决方案打包成了一个开箱即用的HTML项目。
它解决的痛点非常明确:让非专业前端或后端开发者,也能通过简单的配置,快速拥有一个功能完整的微信分享裂变页面。用户访问这个页面时,页面会通过微信JSSDK自动定制分享到朋友圈、好友、群聊时的标题、描述和图标,从而提升分享的点击率和转化率。这对于预算有限、追求快速验证想法的团队或个人来说,是一个极具性价比的启动方案。
2. 源码核心结构拆解:从HTML到微信配置的全链路
拿到一份这样的源码,我们首先要做的不是直接部署,而是理解它的结构。一个典型的、可用的微信分享裂变HTML源码包,通常包含以下核心文件,它们共同构成了从前端展示到后端接口调用的完整链条。
2.1 前端展示层 (index.html)
这是用户直接看到和交互的页面。一个有效的裂变页面,其HTML结构通常非常简洁,重点在于<head>部分的元标签(Meta Tags)和引入微信JSSDK的脚本。
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <!-- 关键:移动端视口配置,确保页面在手机端正常显示 --> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <!-- 关键:禁止电话号码和邮箱自动识别,保持页面整洁 --> <meta name="format-detection" content="telephone=no, email=no"> <title>你的活动标题 - 分享有礼</title> <!-- 关键:分享到微信时的默认缩略图,比例建议1:1,如200x200像素 --> <link rel="icon" href="images/share-icon.jpg" type="image/jpeg"> <style> /* 简单的响应式样式,确保按钮和布局在不同屏幕下正常 */ body { font-family: 'Microsoft YaHei', sans-serif; margin: 0; padding: 20px; background: linear-gradient(to bottom, #ff7e5f, #feb47b); color: white; text-align: center; } .container { max-width: 400px; margin: 0 auto; } .share-btn { display: block; width: 80%; margin: 30px auto; padding: 15px; background-color: #07c160; color: white; border: none; border-radius: 25px; font-size: 18px; } </style> </head> <body> <div class="container"> <h1>🔥 限时福利!立即分享 🔥</h1> <p>分享本页面给好友,即可解锁专属优惠!</p> <img src="images/main-banner.jpg" alt="活动主图" style="width:100%; border-radius:10px;"> <button class="share-btn" id="shareBtn">点击分享给好友</button> <p class="tip">提示:请点击上方按钮,或直接点击微信右上角“...”进行分享</p> </div> <!-- 引入jQuery(可选,许多老项目依赖) --> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <!-- 关键:引入微信官方JSSDK --> <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script> <!-- 关键:自定义的配置和分享逻辑 --> <script src="js/wx-share-config.js"></script> </body> </html>关键点解析:
viewport设置:user-scalable=no有时会被争议,因为它禁止了用户缩放。但在裂变页这种强引导性的场景下,为了防止用户误缩放导致布局错乱,很多开发者会选择禁用。你需要根据自己页面的复杂程度权衡。- 默认分享图:
link标签的href指向的图标,是当JSSDK配置失败或网络异常时,微信会抓取作为备用分享图标。因此,这个图必须存在且路径正确。 - JSSDK版本:示例中引入了
1.6.0,这是一个相对稳定且兼容性较广的版本。实际上,微信JSSDK一直在更新,但核心分享接口(onMenuShareTimeline,onMenuShareAppMessage)在较新版本中已被updateAppMessageShareData和updateTimelineShareData等新API取代。所谓“修复版”,很可能包含了向新API的兼容或过渡处理。
2.2 微信JSSDK配置层 (js/wx-share-config.js)
这是整个项目的灵魂所在,包含了与微信服务器通信、获取配置、初始化SDK并设置分享内容的所有逻辑。
// js/wx-share-config.js $(document).ready(function() { // 第一步:通过你的后端服务器获取微信JSSDK配置所需的参数 $.ajax({ url: '/api/wechat/jssdk-config', // 这是你需要自己实现的后端接口 type: 'GET', data: { url: window.location.href.split('#')[0] // 传入当前页面的URL,注意要去掉hash部分 }, dataType: 'json', success: function(res) { if (res.success) { // 第二步:使用从后端获取的参数配置微信JSSDK wx.config({ debug: false, // 发布时务必设为false,否则会在控制台打印调试信息 appId: res.data.appId, // 公众号的唯一标识 timestamp: res.data.timestamp, // 生成签名的时间戳 nonceStr: res.data.nonceStr, // 生成签名的随机串 signature: res.data.signature, // 签名 jsApiList: [ // 需要使用的JS接口列表 'onMenuShareTimeline', // 分享到朋友圈(旧API,兼容性考虑) 'onMenuShareAppMessage', // 分享给朋友(旧API) 'updateAppMessageShareData', // 分享给朋友(新API) 'updateTimelineShareData', // 分享到朋友圈(新API) 'showOptionMenu' // 显示右上角菜单(可选) ] }); // 第三步:JSSDK配置就绪后的回调 wx.ready(function() { // 设置“分享给朋友”及“分享到QQ”按钮的内容 var shareData = { title: '我发现了一个超棒的活动,快来一起参与!', // 分享标题 desc: '限时福利,手慢无!点击查看详情。', // 分享描述 link: window.location.href, // 分享链接,默认当前页 imgUrl: 'https://你的域名.com/images/share-card.jpg', // 分享图标,必须为绝对路径,300*300像素以上 success: function () { // 用户点击了分享后执行的回调函数 alert('感谢分享!您的奖励已发放。'); // 这里可以触发你的业务逻辑,比如记录分享、发放积分等 }, cancel: function () { // 用户取消分享后执行的回调函数(可选) } }; // 兼容新旧API:优先使用新API,失败则降级到旧API if (wx.updateAppMessageShareData) { wx.updateAppMessageShareData(shareData); } else { wx.onMenuShareAppMessage(shareData); } if (wx.updateTimelineShareData) { wx.updateTimelineShareData(shareData); } else { wx.onMenuShareTimeline(shareData); } // 可以显示右上角菜单(在某些版本浏览器中,默认可能隐藏) wx.showOptionMenu(); // 为页面上的分享按钮绑定点击事件,触发原生分享面板 $('#shareBtn').click(function() { // 注意:微信环境下,无法通过JS直接调起分享面板。 // 此按钮更多是视觉引导,实际分享需用户点击右上角“...”。 // 但可以在这里做一些引导动画或提示。 alert('请点击屏幕右上角的“...”按钮,选择“发送给朋友”或“分享到朋友圈”'); }); }); // 第四步:处理配置失败的情况 wx.error(function(res) { console.error('微信JSSDK配置失败:', res); // 可以在这里给用户一个友好的提示,比如“当前环境不支持分享功能” alert('初始化失败,请稍后重试或截图分享。'); }); } else { alert('获取分享配置失败:' + res.message); } }, error: function() { alert('网络请求失败,请检查网络连接。'); } }); });为什么需要后端接口 (/api/wechat/jssdk-config)?这是新手最容易卡住的地方。微信JSSDK的安全要求决定了,生成签名(signature)必须在服务器端完成,因为涉及公众号的AppSecret,这个密钥绝不能在前端暴露。后端接口需要做以下几件事:
- 接收前端传来的当前页面URL(已去掉
#后面部分)。 - 调用微信公众平台接口获取
access_token。 - 使用
access_token调用微信jsapi_ticket接口。 - 按照微信官方算法(将
jsapi_ticket、noncestr、timestamp、url按字典序拼接后sha1加密),生成signature。 - 将
appId,timestamp,noncestr,signature返回给前端。
一个“修复版”源码是否完整,关键看它是否提供了这个后端接口的示例代码(可能是PHP、Node.js、Python等),或者至少给出了清晰的实现说明。
2.3 后端接口示例与配置 (server/或相关说明文件)
很多源码包会附带一个简单的后端示例。这里以Node.js (Express框架) 为例,展示核心的签名生成逻辑:
// server/wechat-jssdk.js const express = require('express'); const router = express.Router(); const request = require('request-promise'); const crypto = require('crypto'); // 你的公众号配置(应从环境变量或安全配置中读取,切勿硬编码在代码里!) const APPID = '你的公众号AppID'; const APPSECRET = '你的公众号AppSecret'; // 缓存jsapi_ticket和access_token,避免频繁请求微信服务器 let jsapiTicket = ''; let ticketExpireTime = 0; let accessToken = ''; let tokenExpireTime = 0; // 1. 获取access_token async function getAccessToken() { if (accessToken && Date.now() < tokenExpireTime) { return accessToken; } const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${APPSECRET}`; try { const result = await request(url); const data = JSON.parse(result); if (data.access_token) { accessToken = data.access_token; // 提前200秒过期,避免边缘情况 tokenExpireTime = Date.now() + (data.expires_in - 200) * 1000; return accessToken; } else { throw new Error(`获取access_token失败: ${data.errmsg}`); } } catch (error) { console.error('getAccessToken error:', error); throw error; } } // 2. 获取jsapi_ticket async function getJsapiTicket() { if (jsapiTicket && Date.now() < ticketExpireTime) { return jsapiTicket; } const token = await getAccessToken(); const url = `https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${token}&type=jsapi`; try { const result = await request(url); const data = JSON.parse(result); if (data.ticket) { jsapiTicket = data.ticket; ticketExpireTime = Date.now() + (data.expires_in - 200) * 1000; return jsapiTicket; } else { throw new Error(`获取jsapi_ticket失败: ${data.errmsg}`); } } catch (error) { console.error('getJsapiTicket error:', error); throw error; } } // 3. 生成签名 function createSignature(ticket, noncestr, timestamp, url) { const string1 = `jsapi_ticket=${ticket}&noncestr=${noncestr}×tamp=${timestamp}&url=${url}`; const signature = crypto.createHash('sha1').update(string1).digest('hex'); return signature; } // 4. 提供给前端的配置接口 router.get('/jssdk-config', async (req, res) => { const { url } = req.query; // 前端传来的当前页面完整URL if (!url) { return res.json({ success: false, message: '参数url不能为空' }); } try { const ticket = await getJsapiTicket(); const noncestr = Math.random().toString(36).substr(2, 15); // 生成随机字符串 const timestamp = Math.floor(Date.now() / 1000); // 生成时间戳 const signature = createSignature(ticket, noncestr, timestamp, url); res.json({ success: true, data: { appId: APPID, timestamp: timestamp, nonceStr: noncestr, signature: signature } }); } catch (error) { console.error('JSSDK配置接口错误:', error); res.json({ success: false, message: '服务器配置失败' }); } }); module.exports = router;核心要点与避坑指南:
- 缓存机制:
access_token和jsapi_ticket都有每日调用次数限制(2000次)和有效期(7200秒)。必须实现缓存,绝不能每次请求都重新获取,否则极易触发频率限制导致服务不可用。 - URL一致性:前端传给后端的
url,必须与用户实际打开页面的URL完全一致,包括协议(http/https)、域名、端口(非80/443时)、路径。任何细微差别都会导致签名无效。这也是为什么在wx.config中我们使用window.location.href.split('#')[0]来获取并传递URL。 noncestr和timestamp:noncestr必须是随机字符串;timestamp必须是秒级时间戳。这两个参数参与签名,也需返回给前端用于wx.config。- 安全警告:
APPSECRET是最高权限密钥,必须通过环境变量、配置中心等安全方式管理,绝不能写入前端代码或提交到公开的代码仓库。
3. 2023年环境下的“修复”关键点与深度适配
所谓的“修复”,主要是针对微信生态变化所做的适配。以下是几个必须检查的关键点,也是判断一个源码包是否真的“最新”的依据。
3.1 新旧JSSDK API的兼容与过渡
微信JSSDK的分享接口有过一次重要更新。旧接口onMenuShareTimeline和onMenuShareAppMessage在部分新版微信客户端中可能被降级或逐步废弃。新接口是updateAppMessageShareData、updateTimelineShareData以及onMenuShareWeibo等。
一个健壮的“修复版”代码,必须包含对新旧API的兼容性处理,就像前面示例中那样:
// 兼容性写法 if (wx.updateAppMessageShareData) { // 使用新API wx.updateAppMessageShareData(shareData); // 注意:新API还需要监听“分享”按钮事件(但微信已逐步取消自定义) } else { // 降级使用旧API wx.onMenuShareAppMessage(shareData); }注意:根据微信官方文档,即使使用了新API,也无法再通过JS直接监听用户点击“发送”按钮的事件(
success回调在新API中行为有变)。自定义分享内容后,分享行为本身由微信客户端控制。这意味着,以前那种“用户必须点击分享成功才能获得奖励”的强关联逻辑,在技术层面已经难以完美实现。现在的success回调更接近于“配置成功”的回调,而非“用户分享成功”的回调。这是运营策略需要调整的地方。
3.2 分享卡片预览的“缩略图劫持”问题与解决方案
这是最常见的“坑”。明明在代码里设置了imgUrl,但分享出去后,微信抓取的还是页面里的某张随机图片,或者根本不显示自定义图标。
原因分析:
- 图片尺寸不达标:微信官方建议分享图标长宽比1:1,像素不小于300300。但实践中,为了清晰度,我推荐使用600600或800*800像素的JPG或PNG图片。
- 图片URL不可访问:
imgUrl必须是公网可访问的绝对路径(https://yourdomain.com/path/to/image.jpg),不能是相对路径或本地路径。并且,微信的爬虫(User-Agent通常包含MicroMessenger)必须能正常抓取到这张图片。 - 缓存问题:微信服务器对同一个URL的图片有缓存。如果你更新了图片但URL没变,分享出去的可能还是旧的。需要在图片URL后加查询参数来强制更新,例如
imgUrl?v=20231201。 - 页面内存在其他更“醒目”的图片:微信的爬虫有时会忽略你的设置,自己去页面里找一张它认为最合适的图片。为了“引导”爬虫,你需要:
解决方案(组合拳):
- 在HTML的
<head>中增加Open Graph协议标签:这是修复此问题的关键。微信分享爬虫会优先识别这些元标签。<meta property="og:title" content="你的分享标题"> <meta property="og:description" content="你的分享描述"> <meta property="og:image" content="https://你的域名.com/images/share-card-og.jpg"> <meta property="og:url" content="https://你的域名.com/current-page.html"> <meta property="og:type" content="website"> - 确保
og:image图片的绝对路径正确且可访问。 - 在JSSDK的
shareData中,imgUrl也使用与og:image相同的图片URL。 - 在图片服务器上配置正确的MIME类型(如
image/jpeg)和适当的缓存头,但允许微信爬虫抓取。
3.3 跨域与HTTPS的强制要求
微信JSSDK要求调用它的页面必须部署在已备案的域名下,并且必须使用HTTPS协议(本地开发环境localhost除外)。这是铁律,任何“修复”都无法绕过。
- 部署:你需要将整个HTML项目(包括
index.html、js、css、images文件夹)部署到你的服务器上,并通过HTTPS访问。 - 后端接口:为前端提供JSSDK配置的后端接口,其域名必须与前端页面所在域名一致,或者已正确配置CORS(跨域资源共享)。最省事的做法是前后端同域。
- 业务域名配置:在微信公众平台(公众号后台)的“设置”->“公众号设置”->“功能设置”里,将你的页面域名添加到“JS接口安全域名”中。这一步至关重要,没配置的域名下使用JSSDK会报错。
3.4 安卓与iOS的差异处理
在分享功能上,安卓和iOS的微信客户端有时存在细微差异,例如分享面板的调起方式、默认文案的读取策略等。一个经验是:在iOS上,Open Graph (og:标签) 的权重可能更高;在安卓上,JSSDK的配置可能更直接。因此,确保两者都进行充分测试。
此外,在iOS的某些版本中,如果页面中有视频或复杂动画,可能会影响分享菜单的弹出。保持分享页面的轻量化是一个好习惯。
4. 超越基础:裂变逻辑与数据追踪的实现
一个完整的裂变活动,不仅仅是能分享出去,还要能追踪谁分享了、带来了多少新用户、如何发放奖励。这需要在基础分享功能之上,增加业务逻辑。
4.1 设计可追踪的分享链路
核心思想:为每个用户或每次分享生成唯一的标识符(如邀请码、分享ID),并将其附加在分享链接上。
前端改造 (index.html和wx-share-config.js):
- 当页面加载时,检查URL中是否存在邀请参数(如
?invite_code=abc123)。如果有,则将其保存到本地存储(localStorage)或直接发送给后端,标识当前用户是由谁邀请来的。 - 在生成JSSDK的分享配置时,动态构造分享链接。例如,当前用户的ID是
user_001,那么他分享出去的链接应该是:var shareLink = `https://你的域名.com/activity.html?inviter=user_001`; var shareData = { title: '...', desc: '...', link: shareLink, // 使用带参数的链接 imgUrl: '...', success: function() { // 可以在这里调用后端API,记录user_001进行了一次分享(尽管success回调不可靠,但仍可尝试) $.post('/api/record/share', { userId: 'user_001' }); } };
后端增强:
- 提供一个接口(如
/api/user/generate-invite-code),为用户生成唯一的邀请码。 - 提供一个接口(如
/api/visit/record),当新用户通过带邀请码的链接访问时,记录这次访问关系。 - 提供另一个接口(如
/api/reward/check),让用户检查自己邀请了多少人、是否满足领奖条件。
4.2 奖励发放与防作弊策略
简单的裂变容易引发刷量作弊。需要考虑一些基本策略:
- 同人判定:通过微信的
openid(需网页授权获取)或设备指纹(如IP、User-Agent组合)来判定是否为同一用户。一个openid或设备只能作为一个被邀请人。 - 奖励门槛与延迟发放:例如,邀请3个好友注册(而不仅仅是点击)后获得奖励。奖励发放前有审核期(如24小时),防止利用短期漏洞刷单。
- 分享效果可视化:在活动页面上,为分享者实时显示已邀请人数、进度条、奖励状态等,提升参与感。
这些逻辑的实现超出了纯前端JSSDK的范畴,需要前后端紧密配合。一个“修复版”源码如果包含了这些逻辑的示例或框架,那它的价值就大大提升了。
5. 实战部署、调试与问题排查清单
即使拿到了修复好的源码,部署过程也可能遇到问题。下面是一个从零到一的部署和调试清单。
5.1 部署步骤
- 准备服务器与域名:购买云服务器(如阿里云ECS、腾讯云CVM)和已备案的域名。配置Nginx或Apache,为域名启用HTTPS(可以使用Let‘s Encrypt免费证书)。
- 上传代码:将HTML源码包上传到服务器Web目录(如
/var/www/html/activity)。 - 部署后端服务:根据源码包提供的后端语言(如Node.js、PHP),在服务器上配置相应的运行环境,并启动后端服务。确保后端服务监听的端口(如Node.js的3000端口)能被Nginx反向代理到(例如通过
proxy_pass到http://localhost:3000),或者与前端页面在同一域名下。 - 修改配置:
- 在前端
js/wx-share-config.js中,将$.ajax请求的url改为你部署的后端接口地址(如https://你的域名.com/api/wechat/jssdk-config)。 - 将
shareData中的imgUrl和link,以及HTML中所有资源(图片、CSS、JS)的路径,都改为你的线上绝对路径。 - 在后端代码中,填入你公众号的
APPID和APPSECRET(通过环境变量配置,切勿硬编码!)。
- 在前端
- 配置公众号:登录微信公众平台,在“JS接口安全域名”处添加你的域名(不带
http://或https://)。
5.2 调试与问题排查
当分享功能不生效时,按以下顺序排查:
- 开启JSSDK调试模式:在
wx.config中设置debug: true。重新打开页面,浏览器控制台(Console)会打印详细的配置和错误信息。这是最直接的诊断工具。 - 检查常见错误:
invalid signature(无效签名):占90%以上的问题。- 核对公众号
APPID是否正确。 - 确认“JS接口安全域名”已正确配置。
- 确保前端传给后端签名的URL是动态获取且去掉
#的。在wx.config的success回调里打印一下window.location.href和传给后端的url,看是否一致。 - 检查后端签名算法是否正确。可以用微信官方提供的 签名校验工具 在线比对。
- 检查服务器时间是否准确,与标准时间相差过大可能导致
timestamp失效。
- 核对公众号
the permission value is offline verifying(权限值未验证):jsApiList中填写的接口名错误或该公众号没有此接口权限(分享接口一般都有)。- 配置成功,但分享卡片内容不对:
- 检查
imgUrl是否绝对路径、能否在浏览器直接打开。 - 检查Open Graph (
og:) 标签是否已添加且内容正确。 - 清理微信客户端缓存(iOS:微信设置->通用->存储空间->清理缓存;安卓:微信设置->帮助与反馈->右上角扳手图标->清理缓存)。
- 检查
- 使用微信开发者工具:虽然主要用于小程序,但其“公众号网页调试”功能非常强大。可以模拟微信环境,查看网络请求、Console日志,并能扫码在真机上调试,是定位问题的利器。
- 真机测试:最终一定要在安卓和iOS的微信真机上测试。有时桌面浏览器调试一切正常,真机上却有问题。
5.3 性能与体验优化建议
- 图片优化:分享图标和页面主图是影响加载速度的关键。使用工具(如TinyPNG)压缩图片,在清晰度和大小间取得平衡。考虑使用WebP格式(需考虑浏览器兼容性)。
- 代码精简:移除未使用的JS库(如某些源码可能引用了多个版本的jQuery)。考虑将CSS和JS内联到HTML中,减少HTTP请求,对于单页活动是可行的。
- 加载提示:在JSSDK初始化(异步请求)完成前,页面可以是简单的加载动画,避免用户看到未配置好分享的中间状态。
- 降级方案:始终考虑JSSDK加载或配置失败的情况。可以显示一个默认的分享引导图,提示用户“点击右上角‘...’分享”,并附上活动口令或二维码作为备用。
经过以上五个部分的拆解,你应该对一份“2023年最新修复版微信分享裂变HTML源码”从里到外有了透彻的理解。它不再是一个黑盒,而是一个由前端展示、JSSDK配置、后端签名、业务逻辑组成的有机整体。修复的核心在于紧跟微信平台规则的变化,尤其是签名算法、API兼容性和分享卡片预览机制。在具体使用时,关键在于细心配置、充分测试和拥有清晰的数据追踪思路。希望这份超详细的拆解,能帮你不仅能用起来,更能理解其原理,甚至在此基础上进行定制和优化,让它真正为你所用。
本文还有配套的精品资源,点击获取