├── pages ├── index │ ├── panel │ │ ├── panel.json │ │ ├── panel.wxss │ │ ├── panel.wxml │ │ └── panel.js │ ├── list │ │ ├── list.json │ │ ├── list.wxss │ │ ├── list.wxml │ │ └── list.js │ ├── timeline │ │ ├── timeline.json │ │ ├── timeline.wxml │ │ ├── timeline.wxss │ │ └── timeline.js │ ├── index.json │ ├── markdown │ │ ├── markdown.json │ │ ├── markdown.wxss │ │ ├── markdown.js │ │ └── markdown.wxml │ ├── index.wxss │ ├── index.js │ └── index.wxml ├── tree │ ├── tree.json │ ├── tree.wxss │ ├── tree.wxml │ └── tree.js └── about │ ├── about.json │ ├── about.wxss │ ├── about.js │ └── about.wxml ├── images ├── slash-qr.jpg ├── members │ ├── ivan.jpg │ ├── phodal.jpg │ ├── luodayou.jpg │ ├── oathsign.jpg │ └── unclexiao.jpg ├── slash-about.png ├── slash-home.png ├── icons │ ├── icon_me.png │ ├── icon_home.png │ ├── icon_tree.png │ ├── icon_home_active.png │ ├── icon_me_active.png │ └── icon_tree_active.png ├── slash-message.png └── slash-passage.png ├── app.js ├── README.md ├── app.json ├── common ├── wxParse │ ├── wxParse.js │ ├── wxParse.wxss │ ├── htmlparser.js │ ├── wxDiscode.js │ ├── html2json.js │ └── wxParse.wxml ├── request.js └── weui.wxss └── app.wxss /pages/index/panel/panel.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /pages/index/list/list.json: -------------------------------------------------------------------------------- 1 | { 2 | 3 | } -------------------------------------------------------------------------------- /pages/index/timeline/timeline.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /pages/tree/tree.json: -------------------------------------------------------------------------------- 1 | { 2 | "navigationBarTitleText": "技能树" 3 | } -------------------------------------------------------------------------------- /pages/about/about.json: -------------------------------------------------------------------------------- 1 | { 2 | "navigationBarTitleText": "关于" 3 | } -------------------------------------------------------------------------------- /pages/index/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "navigationBarTitleText": "首页" 3 | } -------------------------------------------------------------------------------- /pages/index/markdown/markdown.json: -------------------------------------------------------------------------------- 1 | { 2 | "navigationBarTitleText": "文章" 3 | } -------------------------------------------------------------------------------- /images/slash-qr.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unclexiao/growth/HEAD/images/slash-qr.jpg -------------------------------------------------------------------------------- /images/members/ivan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unclexiao/growth/HEAD/images/members/ivan.jpg -------------------------------------------------------------------------------- /images/slash-about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unclexiao/growth/HEAD/images/slash-about.png -------------------------------------------------------------------------------- /images/slash-home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unclexiao/growth/HEAD/images/slash-home.png -------------------------------------------------------------------------------- /images/icons/icon_me.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unclexiao/growth/HEAD/images/icons/icon_me.png -------------------------------------------------------------------------------- /images/members/phodal.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unclexiao/growth/HEAD/images/members/phodal.jpg -------------------------------------------------------------------------------- /images/slash-message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unclexiao/growth/HEAD/images/slash-message.png -------------------------------------------------------------------------------- /images/slash-passage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unclexiao/growth/HEAD/images/slash-passage.png -------------------------------------------------------------------------------- /images/icons/icon_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unclexiao/growth/HEAD/images/icons/icon_home.png -------------------------------------------------------------------------------- /images/icons/icon_tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unclexiao/growth/HEAD/images/icons/icon_tree.png -------------------------------------------------------------------------------- /images/members/luodayou.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unclexiao/growth/HEAD/images/members/luodayou.jpg -------------------------------------------------------------------------------- /images/members/oathsign.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unclexiao/growth/HEAD/images/members/oathsign.jpg -------------------------------------------------------------------------------- /images/members/unclexiao.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unclexiao/growth/HEAD/images/members/unclexiao.jpg -------------------------------------------------------------------------------- /images/icons/icon_home_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unclexiao/growth/HEAD/images/icons/icon_home_active.png -------------------------------------------------------------------------------- /images/icons/icon_me_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unclexiao/growth/HEAD/images/icons/icon_me_active.png -------------------------------------------------------------------------------- /images/icons/icon_tree_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unclexiao/growth/HEAD/images/icons/icon_tree_active.png -------------------------------------------------------------------------------- /pages/tree/tree.wxss: -------------------------------------------------------------------------------- 1 | page { 2 | height: 100vh; 3 | } 4 | 5 | image { 6 | height: 100%; 7 | width: 100%; 8 | } 9 | -------------------------------------------------------------------------------- /pages/index/list/list.wxss: -------------------------------------------------------------------------------- 1 | /* pages/index/list/list.wxss */ 2 | 3 | .weui-cell-active { 4 | background-color: #ebebeb; 5 | } 6 | -------------------------------------------------------------------------------- /pages/tree/tree.wxml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pages/index/markdown/markdown.wxss: -------------------------------------------------------------------------------- 1 | /* markdown.wxss */ 2 | @import "../../../common/wxParse/wxParse.wxss"; 3 | page{ 4 | padding: 20px 15px; 5 | background: #fff; 6 | box-sizing: border-box; 7 | } -------------------------------------------------------------------------------- /pages/index/timeline/timeline.wxml: -------------------------------------------------------------------------------- 1 | 2 | {{item.section}} 3 | 4 | {{item.description}} 5 | 6 | -------------------------------------------------------------------------------- /pages/about/about.wxss: -------------------------------------------------------------------------------- 1 | image { 2 | margin-right: 15rpx; 3 | vertical-align: middle; 4 | width: 70rpx; 5 | height: 70rpx; 6 | } 7 | 8 | .icon-github{ 9 | margin-right: 10rpx; 10 | } 11 | 12 | .weui-panel:after { 13 | border-bottom: 0; 14 | } -------------------------------------------------------------------------------- /pages/index/panel/panel.wxss: -------------------------------------------------------------------------------- 1 | /* pages/index/panel/panel.wxss */ 2 | 3 | .weui-media-box__desc { 4 | -webkit-line-clamp: 4; 5 | } 6 | 7 | .weui-media-box { 8 | margin: 20rpx 0; 9 | } 10 | 11 | .title { 12 | font-weight: bold; 13 | } 14 | 15 | .weui-media-box__title { 16 | white-space: normal; 17 | } 18 | 19 | .weui-media-box__info__meta { 20 | color: #0366d6; 21 | font-size: 35rpx; 22 | } 23 | -------------------------------------------------------------------------------- /pages/index/timeline/timeline.wxss: -------------------------------------------------------------------------------- 1 | /* pages/index/article/article.wxss */ 2 | 3 | page { 4 | padding: 40rpx 30rpx; 5 | box-sizing: border-box; 6 | } 7 | 8 | .item { 9 | border: 1px solid rgba(153, 153, 153, 0.2); 10 | border-radius: 30rpx; 11 | padding: 20rpx; 12 | margin-bottom: 30rpx; 13 | background-color: #fff; 14 | } 15 | 16 | .title { 17 | color: #159cd4; 18 | line-height: 2; 19 | } 20 | -------------------------------------------------------------------------------- /pages/index/index.wxss: -------------------------------------------------------------------------------- 1 | /* pages/index/index.wxss */ 2 | 3 | 4 | .container { 5 | padding: 80rpx 20rpx; 6 | } 7 | 8 | .iconfont { 9 | font-size: 80rpx; 10 | color: #1296db; 11 | } 12 | 13 | .item { 14 | background-color: #fff; 15 | margin: 10rpx 20rpx; 16 | height: 300rpx; 17 | border: 1px solid rgba(153, 153, 153, 0.2); 18 | box-shadow: 2px 2px 5px #999; 19 | } 20 | 21 | .item-hover { 22 | background-color: #ebebeb; 23 | 24 | } 25 | 26 | .txt { 27 | margin-top: 20rpx; 28 | } 29 | 30 | .row { 31 | margin-top: 20rpx; 32 | } 33 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | 2 | App({ 3 | onLaunch: function () { 4 | 5 | }, 6 | 7 | // 全局辅助方法 8 | utils: { 9 | getTitle: function (name) { 10 | var title = 'Growth'; 11 | switch (name) { 12 | case 'timeline': 13 | title = '学习路线'; 14 | break; 15 | case 'project': 16 | title = '练手项目'; 17 | break; 18 | case 'tool': 19 | title = '高效工具'; 20 | break; 21 | case 'passage': 22 | title = '文章精选'; 23 | break; 24 | } 25 | return title; 26 | } 27 | } 28 | }) 29 | -------------------------------------------------------------------------------- /pages/index/panel/panel.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{item.name}} 7 | {{item.desc}} 8 | 9 | {{item.link}} 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Growth - 陪你成为顶尖开发者 2 | 3 | ![image](/images/slash-qr.jpg) 4 | 5 | [Growth](https://github.com/phodal/growth) 是一款专注于Web开发者成长的应用,涵盖Web开发的流程及技术栈,Web开发的学习路线、成长衡量等各方面。 6 | 7 | 在这里你可以get到: 8 | 9 | - 不同阶段所需的不同技能 10 | - 相关书单推荐 11 | - 获取不同的学习路线 12 | - 寻找合适的练手项目 13 | - 在工具箱里找到合适的工具 14 | - Web应用解决方案 15 | - 阅读在线文章和电子书 16 | 17 | ## 截图 18 | ![image](http://www.unclexiao.com/cdn/temp/slash-home.png) 19 | 20 | ![image](http://www.unclexiao.com/cdn/temp/slash-message.png) 21 | 22 | ![image](http://www.unclexiao.com/cdn/temp/slash-about.png) 23 | 24 | ![image](http://www.unclexiao.com/cdn/temp/slash-passage.png) 25 | 26 | ## 安装 27 | 1. 安装[微信开发者工具](https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html) 28 | 2. 关联[AppID](https://mp.weixin.qq.com) 29 | 3. 导入文件夹 30 | 31 | ## 联系我 32 | **因数据上报涉及到敏感信息,新版的源码暂不公开**。如有疑惑,请联系"趣你的肖蜀黍"公众号: 33 | 34 | ![image](http://www.unclexiao.com/cdn/temp/unclexiao.jpg) 35 | -------------------------------------------------------------------------------- /pages/index/index.js: -------------------------------------------------------------------------------- 1 | // pages/index/index.js 2 | var that; 3 | Page({ 4 | data: { 5 | article: '' 6 | }, 7 | onLoad: function (options) { 8 | // 页面初始化 options为页面跳转所带来的参数 9 | that = this; 10 | }, 11 | onReady: function () { 12 | // 页面渲染完成 13 | 14 | }, 15 | onShow: function () { 16 | // 页面显示 17 | }, 18 | onHide: function () { 19 | // 页面隐藏 20 | }, 21 | onUnload: function () { 22 | // 页面关闭 23 | }, 24 | onShareAppMessage: function () { 25 | return { 26 | title: '带你成为优秀开发者', 27 | path: '/pages/index/index', 28 | success: function (res) { 29 | // 分享成功 30 | }, 31 | fail: function (res) { 32 | // 分享失败 33 | } 34 | } 35 | }, 36 | clickHandler: function (e) { 37 | var menu = e.currentTarget.dataset.menu; 38 | wx.navigateTo({ 39 | url: 'list/list?name=' + menu 40 | }); 41 | } 42 | }) 43 | -------------------------------------------------------------------------------- /pages/tree/tree.js: -------------------------------------------------------------------------------- 1 | // pages/tree/tree.js 2 | Page({ 3 | data: {}, 4 | onLoad: function (options) { 5 | //previrw(); 6 | }, 7 | onReady: function () { 8 | // 页面渲染完成 9 | }, 10 | onShow: function () { 11 | // 页面显示 12 | }, 13 | onHide: function () { 14 | // 页面隐藏 15 | }, 16 | onUnload: function () { 17 | // 页面关闭 18 | }, 19 | clickHandler: function (e) { 20 | previrw(); 21 | }, 22 | onShareAppMessage: function () { 23 | return { 24 | title: '解锁更多姿势~', 25 | path: '/pages/tree/tree', 26 | success: function (res) { 27 | // 分享成功 28 | }, 29 | fail: function (res) { 30 | // 分享失败 31 | } 32 | } 33 | }, 34 | }) 35 | 36 | function previrw() { 37 | wx.previewImage({ 38 | current: 'https://unclexiao.oschina.io/slash/img/front-end-tech-stack-2016.png', // 当前显示图片的http链接 39 | urls: ['https://unclexiao.oschina.io/slash/img/front-end-tech-stack-2016.png'] // 需要预览的图片http链接列表 40 | }) 41 | } -------------------------------------------------------------------------------- /pages/index/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 学习路线 7 | 8 | 9 | 10 | 练手项目 11 | 12 | 13 | 14 | 15 | 16 | 高效工具 17 | 18 | 19 | 20 | 文章精选 21 | 22 | 23 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages": [ 3 | "pages/index/index", 4 | "pages/index/markdown/markdown", 5 | "pages/index/timeline/timeline", 6 | "pages/index/list/list", 7 | "pages/index/panel/panel", 8 | "pages/about/about", 9 | "pages/tree/tree" 10 | ], 11 | "window": { 12 | "navigationBarTextStyle": "black", 13 | "navigationBarTitleText": "Growth", 14 | "navigationBarBackgroundColor": "#F8F8F8", 15 | "backgroundColor": "#F8F8F8" 16 | }, 17 | "tabBar": { 18 | "color": "#515151", 19 | "selectedColor": "#13227a", 20 | "borderStyle": "black", 21 | "backgroundColor": "#ffffff", 22 | "list": [ 23 | { 24 | "pagePath": "pages/index/index", 25 | "iconPath": "/images/icons/icon_home.png", 26 | "selectedIconPath": "/images/icons/icon_home_active.png", 27 | "text": "首页" 28 | }, 29 | { 30 | "pagePath": "pages/tree/tree", 31 | "iconPath": "/images/icons/icon_tree.png", 32 | "selectedIconPath": "/images/icons/icon_tree_active.png", 33 | "text": "技能树" 34 | }, 35 | { 36 | "pagePath": "pages/about/about", 37 | "iconPath": "/images/icons/icon_me.png", 38 | "selectedIconPath": "/images/icons/icon_me_active.png", 39 | "text": "关于" 40 | } 41 | ] 42 | } 43 | } -------------------------------------------------------------------------------- /pages/index/list/list.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{item.name}} 6 | 7 | 8 | 9 | 10 | 11 | 12 | {{item.title}} 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | {{item.name}} 22 | 23 | 24 | 25 | {{subdomain.name}} 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /pages/index/markdown/markdown.js: -------------------------------------------------------------------------------- 1 | // markdown.js 2 | var WxParse = require('../../../common/wxParse/wxParse.js'), 3 | request = require('../../../common/request.js'), 4 | app = getApp(); 5 | 6 | var that = this; 7 | Page({ 8 | data: {}, 9 | onLoad: function (options) { 10 | // 页面初始化 options为页面跳转所带来的参数 11 | that = this; 12 | try { 13 | var detail = wx.getStorageSync('options'); 14 | request.request('articles/' + detail, 'GET', {}, function (res) { 15 | WxParse.wxParse('article', 'md', res, that, 5); 16 | }) 17 | 18 | } catch (e) { 19 | } 20 | // 获取 subTitle,并拼接完整 title 作为分享 title 21 | this.setFullTitle(options.name, options.subTitle); 22 | }, 23 | onReady: function () { 24 | // 页面渲染完成 25 | }, 26 | onShow: function () { 27 | // 页面显示 28 | }, 29 | onHide: function () { 30 | // 页面隐藏 31 | }, 32 | onUnload: function () { 33 | // 页面关闭 34 | }, 35 | // 根据 name 、 subTitle 拼接完整 title,并作为分享 title 36 | // TBD 之后把这类公用方法整合到 app.js 中,提高复用 37 | setFullTitle: function (name, subTitle) { 38 | this.setData({ title: subTitle + app.utils.getTitle(name) }) 39 | wx.setNavigationBarTitle({ 40 | title: this.data.title 41 | }) 42 | }, 43 | 44 | // TBD 目前是假的文章页分享 45 | // TBD 有待完善,由于无法通过参数进入具体文章,暂时先返回上一级列表 46 | onShareAppMessage: function () { 47 | return { 48 | title: this.data.title, 49 | path: '/pages/index/list/list?name=project', 50 | success: function (res) { 51 | // 分享成功 52 | }, 53 | fail: function (res) { 54 | // 分享失败 55 | } 56 | } 57 | }, 58 | }) -------------------------------------------------------------------------------- /pages/index/timeline/timeline.js: -------------------------------------------------------------------------------- 1 | // pages/index/article/article.js 2 | var that = null, 3 | detail = null, 4 | request = require('../../../common/request.js'), 5 | app = getApp(); 6 | Page({ 7 | data: { 8 | passages: [] 9 | }, 10 | onLoad: function (options) { 11 | // 页面初始化 options为页面跳转所带来的参数 12 | try { 13 | var detail = wx.getStorageSync('options'); 14 | this.setData({ detail: transform(detail) }); 15 | } catch (e) { 16 | } 17 | 18 | // 获取 subTitle,并拼接完整 title 作为分享 title 19 | this.setFullTitle(options.name, options.subTitle); 20 | }, 21 | onReady: function () { 22 | // 页面渲染完成 23 | 24 | }, 25 | onShow: function () { 26 | // 页面显示 27 | }, 28 | onHide: function () { 29 | // 页面隐藏 30 | }, 31 | onUnload: function () { 32 | // 页面关闭 33 | }, 34 | // 根据 name 、 subTitle 拼接完整 title,并作为分享 title 35 | setFullTitle: function (name, subTitle) { 36 | this.setData({ title: subTitle + app.utils.getTitle(name) }) 37 | wx.setNavigationBarTitle({ 38 | title: this.data.title 39 | }) 40 | }, 41 | 42 | // TBD 目前是假的文章页分享 43 | // TBD 有待完善,由于无法通过参数进入具体文章,暂时先返回上一级列表 44 | onShareAppMessage: function () { 45 | return { 46 | title: this.data.title, 47 | path: '/pages/index/list/list?name=project', 48 | success: function (res) { 49 | // 分享成功 50 | }, 51 | fail: function (res) { 52 | // 分享失败 53 | } 54 | } 55 | }, 56 | }) 57 | 58 | function transform(detail) { 59 | //TODO 这里需要修改成换行? 60 | for (var i = 0; i < detail.length; i++) { 61 | detail[i].description = detail[i].description.replace(/\|\/g, '\n'); 62 | } 63 | return detail; 64 | 65 | } -------------------------------------------------------------------------------- /pages/about/about.js: -------------------------------------------------------------------------------- 1 | // pages/about/about.js 2 | Page({ 3 | data: { 4 | members: [ 5 | { 6 | name: 'phodal', 7 | icon: '/images/members/phodal.jpg', 8 | desc: '待我代码编成,娶你为妻可好' 9 | }, 10 | { 11 | name: 'unclexiao', 12 | icon: '/images/members/unclexiao.jpg', 13 | desc: '用最意思的方式提高认知,根本停不下来' 14 | }, 15 | { 16 | name: 'oathsign', 17 | icon: '/images/members/oathsign.jpg', 18 | desc: '软件工程师/全栈工程师/冒险家/死宅' 19 | }, 20 | { 21 | name: 'ivanberry', 22 | icon: '/images/members/ivan.jpg', 23 | desc: '矿物加工专业出生,热爱前端,行进在精通CSS的路上,即将成为JavaScript大神' 24 | } 25 | ] 26 | }, 27 | onLoad: function (options) { 28 | // 页面初始化 options为页面跳转所带来的参数 29 | }, 30 | onReady: function () { 31 | // 页面渲染完成 32 | }, 33 | onShow: function () { 34 | // 页面显示 35 | }, 36 | onHide: function () { 37 | // 页面隐藏 38 | }, 39 | onUnload: function () { 40 | // 页面关闭 41 | }, 42 | onShareAppMessage: function () { 43 | return { 44 | title: '陪你成为顶尖开发者', 45 | path: '/pages/about/about', 46 | success: function (res) { 47 | // 分享成功 48 | }, 49 | fail: function (res) { 50 | // 分享失败 51 | } 52 | } 53 | }, 54 | setClipboardData: function (e) { 55 | //复制链接 56 | var url = e.currentTarget.dataset.number; 57 | wx.setClipboardData({ 58 | data: url, 59 | success: function (res) { 60 | wx.showToast({ 61 | title: '群号已复制', 62 | icon: 'success', 63 | duration: 2000 64 | }) 65 | } 66 | }) 67 | } 68 | }) -------------------------------------------------------------------------------- /pages/index/panel/panel.js: -------------------------------------------------------------------------------- 1 | // pages/index/panel/panel.js 2 | 3 | var app = getApp() 4 | 5 | Page({ 6 | data: { 7 | list: [], 8 | title: 'Growth', 9 | }, 10 | onLoad: function (options) { 11 | // 页面初始化 options为页面跳转所带来的参数 12 | try { 13 | var detail = wx.getStorageSync('options'); 14 | this.setData({ list: detail }); 15 | } catch (e) { 16 | } 17 | 18 | // 获取 subTitle,并拼接完整 title 作为分享 title 19 | this.setFullTitle(options.name,options.subTitle); 20 | }, 21 | onReady: function () { 22 | // 页面渲染完成 23 | }, 24 | onShow: function () { 25 | // 页面显示 26 | }, 27 | onHide: function () { 28 | // 页面隐藏 29 | }, 30 | onUnload: function () { 31 | // 页面关闭 32 | }, 33 | 34 | // 根据 name 、 subTitle 拼接完整 title,并作为分享 title 35 | // TBD 之后把这类公用方法整合到 app.js 中,提高复用 36 | setFullTitle: function(name,subTitle) { 37 | this.setData({ title: subTitle + app.utils.getTitle(name) }) 38 | wx.setNavigationBarTitle({ 39 | title: this.data.title 40 | }) 41 | }, 42 | 43 | // TBD 目前是假的文章页分享 44 | // TBD 有待完善,由于无法通过参数进入具体文章,暂时先返回上一级列表 45 | onShareAppMessage: function () { 46 | return { 47 | title: this.data.title, 48 | path: '/pages/index/list/list?name=project', 49 | success: function (res) { 50 | // 分享成功 51 | }, 52 | fail: function (res) { 53 | // 分享失败 54 | } 55 | } 56 | }, 57 | setClipboardData: function (e) { 58 | //复制链接 59 | var url = e.currentTarget.dataset.url; 60 | wx.setClipboardData({ 61 | data: url, 62 | success: function (res) { 63 | wx.showToast({ 64 | title: '链接已复制', 65 | icon: 'success', 66 | duration: 2000 67 | }) 68 | } 69 | }) 70 | } 71 | }) 72 | 73 | -------------------------------------------------------------------------------- /pages/about/about.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 团队成员 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | {{member.name}} 14 | {{member.desc}} 15 | 16 | 17 | 18 | 19 | 20 | 加入我们 21 | 22 | 23 | 公众号 24 | Phodal 25 | 26 | 27 | QQ群 28 | 529600394 29 | 30 | 31 | 论坛 32 | http://forum.growth.ren 33 | 34 | 35 | 官网 36 | http://growth.ren/ 37 | 38 | 39 | 40 | 联系我们 41 | 42 | 43 | 在线客服 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /pages/index/list/list.js: -------------------------------------------------------------------------------- 1 | // pages/index/list/list.js 2 | 3 | var that = null, 4 | menuName = '', 5 | request = require('../../../common/request.js'); 6 | Page({ 7 | data: { 8 | menu: '', 9 | list: '' 10 | }, 11 | onLoad: function (options) { 12 | // 页面初始化 options为页面跳转所带来的参数 13 | that = this; 14 | menuName = options.name; 15 | wx.setNavigationBarTitle({ 16 | title: getTitle(menuName) 17 | }) 18 | }, 19 | onReady: function () { 20 | // 页面渲染完成 21 | request.request(getMenuUrl(menuName), 'GET', {}, function (res) { 22 | that.setData({ 23 | list: res.content, 24 | menu: menuName 25 | }) 26 | }); 27 | }, 28 | onShow: function () { 29 | // 页面显示 30 | }, 31 | onHide: function () { 32 | // 页面隐藏 33 | }, 34 | onUnload: function () { 35 | // 页面关闭 36 | }, 37 | onShareAppMessage: function () { 38 | return { 39 | title: getTitle(menuName), 40 | path: '/pages/index/list/list', 41 | success: function (res) { 42 | // 分享成功 43 | }, 44 | fail: function (res) { 45 | // 分享失败 46 | } 47 | } 48 | }, 49 | clickHandler: function (e) { 50 | try { 51 | //参数无法传递参数,故而使用本地存储 52 | wx.setStorageSync('options', getOptions(e.currentTarget.dataset)); 53 | } catch (e) { 54 | } 55 | 56 | // 传递 subTitle 作为详情页 title 一部分 57 | var subTitle = e.currentTarget.dataset.title 58 | wx.navigateTo({ 59 | url: getNavigateUrl(menuName) + '?name=' + menuName + '&subTitle=' + subTitle 60 | }); 61 | } 62 | }) 63 | 64 | function getMenuUrl(name) { 65 | var url = ''; 66 | switch (name) { 67 | case 'timeline': 68 | url = 'awesome/api/all.json'; 69 | break; 70 | case 'project': 71 | url = 'project/api/all.json'; 72 | break; 73 | case 'tool': 74 | url = 'toolbox/api/all.json'; 75 | break; 76 | case 'passage': 77 | url = 'articles/api/all.json'; 78 | break; 79 | } 80 | return url; 81 | } 82 | 83 | function getNavigateUrl(name) { 84 | var url = ''; 85 | switch (name) { 86 | case 'timeline': 87 | url = '../timeline/timeline'; 88 | break; 89 | case 'project': 90 | url = '../panel/panel'; 91 | break; 92 | default: 93 | url = '../markdown/markdown'; 94 | } 95 | return url; 96 | } 97 | 98 | function getOptions(dataset) { 99 | var obj = {}, list = that.data.list; 100 | var index = dataset.index, 101 | i = dataset.i, 102 | j = dataset.j; 103 | switch (menuName) { 104 | case 'timeline': 105 | obj = list[index].timeline; 106 | break; 107 | case 'project': 108 | obj = list[i].subdomains[j].projects; 109 | break; 110 | default: 111 | obj = list[index].path; 112 | } 113 | return obj; 114 | } 115 | 116 | function getTitle(name) { 117 | var title = 'Growth'; 118 | switch (name) { 119 | case 'timeline': 120 | title = '学习路线'; 121 | break; 122 | case 'project': 123 | title = '练手项目'; 124 | break; 125 | case 'tool': 126 | title = '高效工具'; 127 | break; 128 | case 'passage': 129 | title = '文章精选'; 130 | break; 131 | } 132 | return title; 133 | } -------------------------------------------------------------------------------- /common/wxParse/wxParse.js: -------------------------------------------------------------------------------- 1 | /** 2 | * author: Di (微信小程序开发工程师) 3 | * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) 4 | * 垂直微信小程序开发交流社区 5 | * 6 | * github地址: https://github.com/icindy/wxParse 7 | * 8 | * for: 微信小程序富文本解析 9 | * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 10 | */ 11 | 12 | /** 13 | * utils函数引入 14 | **/ 15 | import showdown from './showdown.js'; 16 | import HtmlToJson from './html2json.js'; 17 | /** 18 | * 配置及公有属性 19 | **/ 20 | /** 21 | * 主函数入口区 22 | **/ 23 | function wxParse(bindName = 'wxParseData', type='html', data='
数据不能为空
', target,imagePadding) { 24 | var that = target; 25 | var transData = {};//存放转化后的数据 26 | if (type == 'html') { 27 | transData = HtmlToJson.html2json(data, bindName); 28 | console.log(JSON.stringify(transData, ' ', ' ')); 29 | } else if (type == 'md' || type == 'markdown') { 30 | var converter = new showdown.Converter(); 31 | var html = converter.makeHtml(data); 32 | transData = HtmlToJson.html2json(html, bindName); 33 | console.log(JSON.stringify(transData, ' ', ' ')); 34 | } 35 | transData.view = {}; 36 | transData.view.imagePadding = 0; 37 | if(typeof(imagePadding) != 'undefined'){ 38 | transData.view.imagePadding = imagePadding 39 | } 40 | var bindData = {}; 41 | bindData[bindName] = transData; 42 | that.setData(bindData) 43 | that.wxParseImgLoad = wxParseImgLoad; 44 | that.wxParseImgTap = wxParseImgTap; 45 | } 46 | // 图片点击事件 47 | function wxParseImgTap(e) { 48 | var that = this; 49 | var nowImgUrl = e.target.dataset.src; 50 | var tagFrom = e.target.dataset.from; 51 | if (typeof (tagFrom) != 'undefined' && tagFrom.length > 0) { 52 | wx.previewImage({ 53 | current: nowImgUrl, // 当前显示图片的http链接 54 | urls: that.data[tagFrom].imageUrls // 需要预览的图片http链接列表 55 | }) 56 | } 57 | } 58 | 59 | /** 60 | * 图片视觉宽高计算函数区 61 | **/ 62 | function wxParseImgLoad(e) { 63 | var that = this; 64 | var tagFrom = e.target.dataset.from; 65 | var idx = e.target.dataset.idx; 66 | if (typeof (tagFrom) != 'undefined' && tagFrom.length > 0) { 67 | calMoreImageInfo(e, idx, that, tagFrom) 68 | } 69 | } 70 | // 假循环获取计算图片视觉最佳宽高 71 | function calMoreImageInfo(e, idx, that, bindName) { 72 | var temData = that.data[bindName]; 73 | if (temData.images.length == 0) { 74 | return; 75 | } 76 | var temImages = temData.images; 77 | //因为无法获取view宽度 需要自定义padding进行计算,稍后处理 78 | var recal = wxAutoImageCal(e.detail.width, e.detail.height,that,bindName); 79 | temImages[idx].width = recal.imageWidth; 80 | temImages[idx].height = recal.imageheight; 81 | temData.images = temImages; 82 | var bindData = {}; 83 | bindData[bindName] = temData; 84 | that.setData(bindData); 85 | } 86 | 87 | // 计算视觉优先的图片宽高 88 | function wxAutoImageCal(originalWidth, originalHeight,that,bindName) { 89 | //获取图片的原始长宽 90 | var windowWidth = 0, windowHeight = 0; 91 | var autoWidth = 0, autoHeight = 0; 92 | var results = {}; 93 | wx.getSystemInfo({ 94 | success: function (res) { 95 | var padding = that.data[bindName].view.imagePadding; 96 | windowWidth = res.windowWidth-2*padding; 97 | windowHeight = res.windowHeight; 98 | //判断按照那种方式进行缩放 99 | console.log("windowWidth" + windowWidth); 100 | if (originalWidth > windowWidth) {//在图片width大于手机屏幕width时候 101 | autoWidth = windowWidth; 102 | console.log("autoWidth" + autoWidth); 103 | autoHeight = (autoWidth * originalHeight) / originalWidth; 104 | console.log("autoHeight" + autoHeight); 105 | results.imageWidth = autoWidth; 106 | results.imageheight = autoHeight; 107 | } else {//否则展示原来的数据 108 | results.imageWidth = originalWidth; 109 | results.imageheight = originalHeight; 110 | } 111 | } 112 | }) 113 | return results; 114 | } 115 | 116 | function wxParseTemArray(temArrayName,bindNameReg,total,that){ 117 | var array = []; 118 | var temData = that.data; 119 | var obj = null; 120 | for(var i = 0; i < total; i++){ 121 | var simArr = temData[bindNameReg+i].nodes; 122 | array.push(simArr); 123 | } 124 | 125 | temArrayName = temArrayName || 'wxParseTemArray'; 126 | obj = JSON.parse('{"'+ temArrayName +'":""}'); 127 | obj[temArrayName] = array; 128 | that.setData(obj); 129 | } 130 | 131 | /** 132 | * 配置emojis 133 | * 134 | */ 135 | 136 | function emojisInit(reg='',baseSrc="/wxParse/emojis/",emojis){ 137 | HtmlToJson.emojisInit(reg,baseSrc,emojis); 138 | } 139 | 140 | module.exports = { 141 | wxParse: wxParse, 142 | wxParseTemArray:wxParseTemArray, 143 | emojisInit:emojisInit 144 | } 145 | 146 | 147 | -------------------------------------------------------------------------------- /common/request.js: -------------------------------------------------------------------------------- 1 | "use strict" 2 | var server = '', accessToken = '', userInfo = {}, systemInfo = {}; 3 | 4 | //配置环境:本地、开发、生产 5 | function getServerUrl(route) { 6 | // var url = '', fileName = route.replace(/\//g, '_'); 7 | // switch (server) { 8 | // case 'local': url = `https://dev.wx.mecollege.cn/web/xiaohui/data/${fileName}.json`; break; 9 | // case 'dev': url = `https://dev.wx.mecollege.cn/index.php?r=${route}`; break; 10 | // default: url = `https://wx.mecollege.cn/index.php?r=${route}`; break; 11 | // } 12 | return `https://unclexiao.oschina.io/slash/${route}`; 13 | } 14 | 15 | 16 | function save(className, data) { 17 | wx.request({ 18 | url: `https://leancloud.cn/1.1/classes/${className}`, //仅为示例,并非真实的接口地址 19 | method: 'POST', 20 | data: data, 21 | header: { 22 | 'X-Avoscloud-Application-Id': '', 23 | 'X-Avoscloud-Application-Key': '', 24 | 'content-type': 'application/json' 25 | }, 26 | success: function (res) { 27 | console.info("report success") 28 | } 29 | }) 30 | } 31 | 32 | function saveError(msg, detail) { 33 | save('ERROR', { 'nickName': userInfo.nickName, userInfo: userInfo, systemInfo: systemInfo, 'msg': msg, detail: detail }); 34 | } 35 | 36 | function saveDebug(obj) { 37 | save('DEBUG', { 'nickName': userInfo.nickName, userInfo: userInfo, systemInfo: systemInfo, 'obj': obj }); 38 | } 39 | 40 | function login(success) { 41 | wx.login({ 42 | success: function (res) { 43 | if (res.code) { 44 | var code = res.code; 45 | var method = (server == 'local' ? 'GET' : 'POST'); 46 | isLoading(); 47 | wx.getUserInfo({ 48 | success: function (resInfo) { 49 | userInfo = resInfo.userInfo//保存用户信息 50 | //参数 51 | wx.request({ 52 | url: getServerUrl('api/get-access-token'), 53 | data: { code: code, encryptedData: resInfo.encryptedData, iv: resInfo.iv }, 54 | method: method, 55 | header: { 56 | 'content-type': 'application/json' 57 | }, 58 | success: function (resRes) { 59 | if (resRes.data && resRes.data.data && resRes.data.data.access_token) { 60 | accessToken = resRes.data.data.access_token; 61 | } else { 62 | console.warn('wx.request warn:api/get-access-token') 63 | saveError('获取Token异常', resRes); 64 | } 65 | if (typeof success == 'function') { 66 | resRes.data.userInfo = resInfo.userInfo; //添加用户信息 67 | success.call(this, resRes.data); 68 | } 69 | wx.hideToast(); 70 | }, 71 | fail: function (err) { 72 | //console.error('wx.request error:api/get-access-token'); 73 | saveError('获取Token失败', err); 74 | wx.hideToast(); 75 | } 76 | }) 77 | }, 78 | fail: function (resInfo) { 79 | //console.error('wx.getUserInfo error:' + resInfo.errMsg); 80 | wx.hideToast(); 81 | saveError('微信授权失败', resInfo); 82 | } 83 | }) 84 | } else { 85 | saveError('微信登录异常', res); 86 | //console.error('wx.login error:' + res.errMsg) 87 | wx.hideToast(); 88 | } 89 | }, 90 | error: function (loginErr) { 91 | saveError('微信登录失败', loginErr); 92 | wx.hideToast(); 93 | } 94 | }); 95 | } 96 | 97 | function request(route, method, data, success, fail) { 98 | isLoading(); 99 | wx.request({ 100 | url: getServerUrl(route), 101 | method: server == 'local' ? 'GET' : method, 102 | data: data, 103 | success: function (res) { 104 | if (typeof success == 'function') { 105 | success.call(this, res.data) 106 | } 107 | wx.hideToast(); 108 | }, 109 | fail: function (err) { 110 | console.error('wx.request error:' + route); 111 | //saveError('服务端接口失败:' + route); 112 | wx.hideToast(); 113 | } 114 | }); 115 | } 116 | function isLoading(options) { 117 | const {title, mask, duration} = options || {}; 118 | let opt = { 119 | title: (title || '加载中'), 120 | mask: (mask || true), 121 | icon: 'loading', 122 | duration: (duration || 5000) 123 | }; 124 | wx.showToast(opt); 125 | }; 126 | 127 | function initInfo() { 128 | wx.getSystemInfo({ 129 | success: function (res) { 130 | systemInfo = res; 131 | }, 132 | error: function () { 133 | saveError('获取信息失败'); 134 | } 135 | }) 136 | } 137 | 138 | initInfo();//初始化系统信息 139 | 140 | //对外的接口 141 | module.exports = { 142 | save: save, 143 | saveError: saveError, 144 | saveDebug: saveDebug, 145 | request, request 146 | } -------------------------------------------------------------------------------- /common/wxParse/wxParse.wxss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * author: Di (微信小程序开发工程师) 4 | * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) 5 | * 垂直微信小程序开发交流社区 6 | * 7 | * github地址: https://github.com/icindy/wxParse 8 | * 9 | * for: 微信小程序富文本解析 10 | * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 11 | */ 12 | 13 | .wxParse{ 14 | margin: 0 5px; 15 | font-family: Helvetica,sans-serif; 16 | font-size: 28rpx; 17 | color: #666; 18 | line-height: 1.8; 19 | } 20 | view{ 21 | word-break:break-all; overflow:auto; 22 | } 23 | .wxParse-inline{ 24 | display: inline; 25 | margin: 0; 26 | padding: 0; 27 | } 28 | /*//标题 */ 29 | .wxParse-div{margin: 0;padding: 0;} 30 | .wxParse-h1{ font-size:2em; margin: .67em 0 } 31 | .wxParse-h2{ font-size:1.5em; margin: .75em 0 } 32 | .wxParse-h3{ font-size:1.17em; margin: .83em 0 } 33 | .wxParse-h4{ margin: 1.12em 0} 34 | .wxParse-h5 { font-size:.83em; margin: 1.5em 0 } 35 | .wxParse-h6{ font-size:.75em; margin: 1.67em 0 } 36 | 37 | .wxParse-h1 { 38 | font-size: 18px; 39 | font-weight: 400; 40 | margin-bottom: .9em; 41 | } 42 | .wxParse-h2 { 43 | font-size: 16px; 44 | font-weight: 400; 45 | margin-bottom: .34em; 46 | } 47 | .wxParse-h3 { 48 | font-weight: 400; 49 | font-size: 15px; 50 | margin-bottom: .34em; 51 | } 52 | .wxParse-h4 { 53 | font-weight: 400; 54 | font-size: 14px; 55 | margin-bottom: .24em; 56 | } 57 | .wxParse-h5 { 58 | font-weight: 400; 59 | font-size: 13px; 60 | margin-bottom: .14em; 61 | } 62 | .wxParse-h6 { 63 | font-weight: 400; 64 | font-size: 12px; 65 | margin-bottom: .04em; 66 | } 67 | 68 | .wxParse-h1, .wxParse-h2, .wxParse-h3, .wxParse-h4, .wxParse-h5, .wxParse-h6, .wxParse-b, .wxParse-strong { font-weight: bolder } 69 | 70 | .wxParse-i,.wxParse-cite,.wxParse-em,.wxParse-var,.wxParse-address{font-style:italic} 71 | .wxParse-pre,.wxParse-tt,.wxParse-code,.wxParse-kbd,.wxParse-samp{font-family:monospace} 72 | .wxParse-pre{white-space:pre} 73 | .wxParse-big{font-size:1.17em} 74 | .wxParse-small,.wxParse-sub,.wxParse-sup{font-size:.83em} 75 | .wxParse-sub{vertical-align:sub} 76 | .wxParse-sup{vertical-align:super} 77 | .wxParse-s,.wxParse-strike,.wxParse-del{text-decoration:line-through} 78 | /*wxparse-自定义个性化的css样式*/ 79 | /*增加video的css样式*/ 80 | .wxParse-strong,.wxParse-s{display: inline} 81 | .wxParse-a{ 82 | color: deepskyblue; 83 | word-break:break-all; 84 | overflow:auto; 85 | } 86 | 87 | .wxParse-video{ 88 | text-align: center; 89 | margin: 10px 0; 90 | } 91 | 92 | .wxParse-video-video{ 93 | width:100%; 94 | } 95 | 96 | .wxParse-img{ 97 | background-color: #efefef; 98 | overflow: hidden; 99 | } 100 | 101 | .wxParse-blockquote { 102 | margin: 0; 103 | padding:10px 0 10px 5px; 104 | font-family:Courier, Calibri,"宋体"; 105 | background:#f5f5f5; 106 | border-left: 3px solid #dbdbdb; 107 | } 108 | 109 | .wxParse-code,.wxParse-wxxxcode-style{ 110 | display: inline; 111 | background:#f5f5f5; 112 | } 113 | .wxParse-ul{ 114 | margin: 20rpx 10rpx; 115 | } 116 | 117 | .wxParse-li,.wxParse-li-inner{ 118 | display: flex; 119 | align-items: baseline; 120 | margin: 10rpx 0; 121 | } 122 | .wxParse-li-text{ 123 | overflow: visible; 124 | align-items: center; 125 | line-height: 20px; 126 | } 127 | 128 | .wxParse-li-circle{ 129 | display: inline-flex; 130 | width: 5px; 131 | height: 5px; 132 | background-color: #333; 133 | margin-right: 5px; 134 | } 135 | 136 | .wxParse-li-square{ 137 | display: inline-flex; 138 | width: 10rpx; 139 | height: 10rpx; 140 | background-color: #333; 141 | margin-right: 5px; 142 | } 143 | .wxParse-li-ring{ 144 | display: inline-flex; 145 | width: 10rpx; 146 | height: 10rpx; 147 | border: 2rpx solid #333; 148 | border-radius: 50%; 149 | background-color: #fff; 150 | margin-right: 5px; 151 | } 152 | 153 | /*.wxParse-table{ 154 | width: 100%; 155 | height: 400px; 156 | } 157 | .wxParse-thead,.wxParse-tfoot,.wxParse-tr{ 158 | display: flex; 159 | flex-direction: row; 160 | } 161 | .wxParse-th,.wxParse-td{ 162 | display: flex; 163 | width: 580px; 164 | overflow: auto; 165 | }*/ 166 | 167 | .wxParse-u { 168 | text-decoration: underline; 169 | } 170 | .wxParse-hide{ 171 | display: none; 172 | } 173 | .WxEmojiView{ 174 | align-items: center; 175 | } 176 | .wxEmoji{ 177 | width: 16px; 178 | height:16px; 179 | } 180 | .wxParse-tr{ 181 | display: flex; 182 | border-right:1px solid #e0e0e0; 183 | border-bottom:1px solid #e0e0e0; 184 | border-top:1px solid #e0e0e0; 185 | } 186 | .wxParse-th, 187 | .wxParse-td{ 188 | flex:1; 189 | padding:5px; 190 | font-size:28rpx; 191 | border-left:1px solid #e0e0e0; 192 | word-break: break-all; 193 | } 194 | .wxParse-td:last{ 195 | border-top:1px solid #e0e0e0; 196 | } 197 | .wxParse-th{ 198 | background:#f0f0f0; 199 | border-top:1px solid #e0e0e0; 200 | } 201 | 202 | -------------------------------------------------------------------------------- /common/wxParse/htmlparser.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * htmlParser改造自: https://github.com/blowsie/Pure-JavaScript-HTML5-Parser 4 | * 5 | * author: Di (微信小程序开发工程师) 6 | * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) 7 | * 垂直微信小程序开发交流社区 8 | * 9 | * github地址: https://github.com/icindy/wxParse 10 | * 11 | * for: 微信小程序富文本解析 12 | * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 13 | */ 14 | // Regular Expressions for parsing tags and attributes 15 | var startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/, 16 | endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/, 17 | attr = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; 18 | 19 | // Empty Elements - HTML 5 20 | var empty = makeMap("area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr"); 21 | 22 | // Block Elements - HTML 5 23 | var block = makeMap("a,address,code,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video"); 24 | 25 | // Inline Elements - HTML 5 26 | var inline = makeMap("abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var"); 27 | 28 | // Elements that you can, intentionally, leave open 29 | // (and which close themselves) 30 | var closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr"); 31 | 32 | // Attributes that have their values filled in disabled="disabled" 33 | var fillAttrs = makeMap("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"); 34 | 35 | // Special Elements (can contain anything) 36 | var special = makeMap("wxxxcode-style,script,style,view,scroll-view,block"); 37 | 38 | function HTMLParser(html, handler) { 39 | var index, chars, match, stack = [], last = html; 40 | stack.last = function () { 41 | return this[this.length - 1]; 42 | }; 43 | 44 | while (html) { 45 | chars = true; 46 | 47 | // Make sure we're not in a script or style element 48 | if (!stack.last() || !special[stack.last()]) { 49 | 50 | // Comment 51 | if (html.indexOf(""); 53 | 54 | if (index >= 0) { 55 | if (handler.comment) 56 | handler.comment(html.substring(4, index)); 57 | html = html.substring(index + 3); 58 | chars = false; 59 | } 60 | 61 | // end tag 62 | } else if (html.indexOf("]*>"), function (all, text) { 100 | text = text.replace(/|/g, "$1$2"); 101 | if (handler.chars) 102 | handler.chars(text); 103 | 104 | return ""; 105 | }); 106 | 107 | 108 | parseEndTag("", stack.last()); 109 | } 110 | 111 | if (html == last) 112 | throw "Parse Error: " + html; 113 | last = html; 114 | } 115 | 116 | // Clean up any remaining tags 117 | parseEndTag(); 118 | 119 | function parseStartTag(tag, tagName, rest, unary) { 120 | tagName = tagName.toLowerCase(); 121 | 122 | if (block[tagName]) { 123 | while (stack.last() && inline[stack.last()]) { 124 | parseEndTag("", stack.last()); 125 | } 126 | } 127 | 128 | if (closeSelf[tagName] && stack.last() == tagName) { 129 | parseEndTag("", tagName); 130 | } 131 | 132 | unary = empty[tagName] || !!unary; 133 | 134 | if (!unary) 135 | stack.push(tagName); 136 | 137 | if (handler.start) { 138 | var attrs = []; 139 | 140 | rest.replace(attr, function (match, name) { 141 | var value = arguments[2] ? arguments[2] : 142 | arguments[3] ? arguments[3] : 143 | arguments[4] ? arguments[4] : 144 | fillAttrs[name] ? name : ""; 145 | 146 | attrs.push({ 147 | name: name, 148 | value: value, 149 | escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') //" 150 | }); 151 | }); 152 | 153 | if (handler.start) { 154 | handler.start(tagName, attrs, unary); 155 | } 156 | 157 | } 158 | } 159 | 160 | function parseEndTag(tag, tagName) { 161 | // If no tag name is provided, clean shop 162 | if (!tagName) 163 | var pos = 0; 164 | 165 | // Find the closest opened tag of the same type 166 | else { 167 | tagName = tagName.toLowerCase(); 168 | for (var pos = stack.length - 1; pos >= 0; pos--) 169 | if (stack[pos] == tagName) 170 | break; 171 | } 172 | if (pos >= 0) { 173 | // Close all the open elements, up the stack 174 | for (var i = stack.length - 1; i >= pos; i--) 175 | if (handler.end) 176 | handler.end(stack[i]); 177 | 178 | // Remove the open elements from the stack 179 | stack.length = pos; 180 | } 181 | } 182 | }; 183 | 184 | 185 | function makeMap(str) { 186 | var obj = {}, items = str.split(","); 187 | for (var i = 0; i < items.length; i++) 188 | obj[items[i]] = true; 189 | return obj; 190 | } 191 | 192 | module.exports = HTMLParser; 193 | -------------------------------------------------------------------------------- /common/wxParse/wxDiscode.js: -------------------------------------------------------------------------------- 1 | // HTML 支持的数学符号 2 | function strNumDiscode(str){ 3 | str = str.replace(/∀/g, '∀'); 4 | str = str.replace(/∂/g, '∂'); 5 | str = str.replace(/&exists;/g, '∃'); 6 | str = str.replace(/∅/g, '∅'); 7 | str = str.replace(/∇/g, '∇'); 8 | str = str.replace(/∈/g, '∈'); 9 | str = str.replace(/∉/g, '∉'); 10 | str = str.replace(/∋/g, '∋'); 11 | str = str.replace(/∏/g, '∏'); 12 | str = str.replace(/∑/g, '∑'); 13 | str = str.replace(/−/g, '−'); 14 | str = str.replace(/∗/g, '∗'); 15 | str = str.replace(/√/g, '√'); 16 | str = str.replace(/∝/g, '∝'); 17 | str = str.replace(/∞/g, '∞'); 18 | str = str.replace(/∠/g, '∠'); 19 | str = str.replace(/∧/g, '∧'); 20 | str = str.replace(/∨/g, '∨'); 21 | str = str.replace(/∩/g, '∩'); 22 | str = str.replace(/∩/g, '∪'); 23 | str = str.replace(/∫/g, '∫'); 24 | str = str.replace(/∴/g, '∴'); 25 | str = str.replace(/∼/g, '∼'); 26 | str = str.replace(/≅/g, '≅'); 27 | str = str.replace(/≈/g, '≈'); 28 | str = str.replace(/≠/g, '≠'); 29 | str = str.replace(/≤/g, '≤'); 30 | str = str.replace(/≥/g, '≥'); 31 | str = str.replace(/⊂/g, '⊂'); 32 | str = str.replace(/⊃/g, '⊃'); 33 | str = str.replace(/⊄/g, '⊄'); 34 | str = str.replace(/⊆/g, '⊆'); 35 | str = str.replace(/⊇/g, '⊇'); 36 | str = str.replace(/⊕/g, '⊕'); 37 | str = str.replace(/⊗/g, '⊗'); 38 | str = str.replace(/⊥/g, '⊥'); 39 | str = str.replace(/⋅/g, '⋅'); 40 | return str; 41 | } 42 | 43 | //HTML 支持的希腊字母 44 | function strGreeceDiscode(str){ 45 | str = str.replace(/Α/g, 'Α'); 46 | str = str.replace(/Β/g, 'Β'); 47 | str = str.replace(/Γ/g, 'Γ'); 48 | str = str.replace(/Δ/g, 'Δ'); 49 | str = str.replace(/Ε/g, 'Ε'); 50 | str = str.replace(/Ζ/g, 'Ζ'); 51 | str = str.replace(/Η/g, 'Η'); 52 | str = str.replace(/Θ/g, 'Θ'); 53 | str = str.replace(/Ι/g, 'Ι'); 54 | str = str.replace(/Κ/g, 'Κ'); 55 | str = str.replace(/Λ/g, 'Λ'); 56 | str = str.replace(/Μ/g, 'Μ'); 57 | str = str.replace(/Ν/g, 'Ν'); 58 | str = str.replace(/Ξ/g, 'Ν'); 59 | str = str.replace(/Ο/g, 'Ο'); 60 | str = str.replace(/Π/g, 'Π'); 61 | str = str.replace(/Ρ/g, 'Ρ'); 62 | str = str.replace(/Σ/g, 'Σ'); 63 | str = str.replace(/Τ/g, 'Τ'); 64 | str = str.replace(/Υ/g, 'Υ'); 65 | str = str.replace(/Φ/g, 'Φ'); 66 | str = str.replace(/Χ/g, 'Χ'); 67 | str = str.replace(/Ψ/g, 'Ψ'); 68 | str = str.replace(/Ω/g, 'Ω'); 69 | 70 | str = str.replace(/α/g, 'α'); 71 | str = str.replace(/β/g, 'β'); 72 | str = str.replace(/γ/g, 'γ'); 73 | str = str.replace(/δ/g, 'δ'); 74 | str = str.replace(/ε/g, 'ε'); 75 | str = str.replace(/ζ/g, 'ζ'); 76 | str = str.replace(/η/g, 'η'); 77 | str = str.replace(/θ/g, 'θ'); 78 | str = str.replace(/ι/g, 'ι'); 79 | str = str.replace(/κ/g, 'κ'); 80 | str = str.replace(/λ/g, 'λ'); 81 | str = str.replace(/μ/g, 'μ'); 82 | str = str.replace(/ν/g, 'ν'); 83 | str = str.replace(/ξ/g, 'ξ'); 84 | str = str.replace(/ο/g, 'ο'); 85 | str = str.replace(/π/g, 'π'); 86 | str = str.replace(/ρ/g, 'ρ'); 87 | str = str.replace(/ς/g, 'ς'); 88 | str = str.replace(/σ/g, 'σ'); 89 | str = str.replace(/τ/g, 'τ'); 90 | str = str.replace(/υ/g, 'υ'); 91 | str = str.replace(/φ/g, 'φ'); 92 | str = str.replace(/χ/g, 'χ'); 93 | str = str.replace(/ψ/g, 'ψ'); 94 | str = str.replace(/ω/g, 'ω'); 95 | str = str.replace(/ϑ/g, 'ϑ'); 96 | str = str.replace(/ϒ/g, 'ϒ'); 97 | str = str.replace(/ϖ/g, 'ϖ'); 98 | str = str.replace(/·/g, '·'); 99 | return str; 100 | } 101 | 102 | // 103 | 104 | function strcharacterDiscode(str){ 105 | // 加入常用解析 106 | str = str.replace(/ /g, ' '); 107 | str = str.replace(/"/g, "'"); 108 | str = str.replace(/&/g, '&'); 109 | // str = str.replace(/</g, '‹'); 110 | // str = str.replace(/>/g, '›'); 111 | 112 | str = str.replace(/</g, '<'); 113 | str = str.replace(/>/g, '>'); 114 | 115 | return str; 116 | } 117 | 118 | // HTML 支持的其他实体 119 | function strOtherDiscode(str){ 120 | str = str.replace(/Œ/g, 'Œ'); 121 | str = str.replace(/œ/g, 'œ'); 122 | str = str.replace(/Š/g, 'Š'); 123 | str = str.replace(/š/g, 'š'); 124 | str = str.replace(/Ÿ/g, 'Ÿ'); 125 | str = str.replace(/ƒ/g, 'ƒ'); 126 | str = str.replace(/ˆ/g, 'ˆ'); 127 | str = str.replace(/˜/g, '˜'); 128 | str = str.replace(/ /g, ''); 129 | str = str.replace(/ /g, ''); 130 | str = str.replace(/ /g, ''); 131 | str = str.replace(/‌/g, ''); 132 | str = str.replace(/‍/g, ''); 133 | str = str.replace(/‎/g, ''); 134 | str = str.replace(/‏/g, ''); 135 | str = str.replace(/–/g, '–'); 136 | str = str.replace(/—/g, '—'); 137 | str = str.replace(/‘/g, '‘'); 138 | str = str.replace(/’/g, '’'); 139 | str = str.replace(/‚/g, '‚'); 140 | str = str.replace(/“/g, '“'); 141 | str = str.replace(/”/g, '”'); 142 | str = str.replace(/„/g, '„'); 143 | str = str.replace(/†/g, '†'); 144 | str = str.replace(/‡/g, '‡'); 145 | str = str.replace(/•/g, '•'); 146 | str = str.replace(/…/g, '…'); 147 | str = str.replace(/‰/g, '‰'); 148 | str = str.replace(/′/g, '′'); 149 | str = str.replace(/″/g, '″'); 150 | str = str.replace(/‹/g, '‹'); 151 | str = str.replace(/›/g, '›'); 152 | str = str.replace(/‾/g, '‾'); 153 | str = str.replace(/€/g, '€'); 154 | str = str.replace(/™/g, '™'); 155 | 156 | str = str.replace(/←/g, '←'); 157 | str = str.replace(/↑/g, '↑'); 158 | str = str.replace(/→/g, '→'); 159 | str = str.replace(/↓/g, '↓'); 160 | str = str.replace(/↔/g, '↔'); 161 | str = str.replace(/↵/g, '↵'); 162 | str = str.replace(/⌈/g, '⌈'); 163 | str = str.replace(/⌉/g, '⌉'); 164 | 165 | str = str.replace(/⌊/g, '⌊'); 166 | str = str.replace(/⌋/g, '⌋'); 167 | str = str.replace(/◊/g, '◊'); 168 | str = str.replace(/♠/g, '♠'); 169 | str = str.replace(/♣/g, '♣'); 170 | str = str.replace(/♥/g, '♥'); 171 | 172 | str = str.replace(/♦/g, '♦'); 173 | 174 | return str; 175 | } 176 | 177 | function strMoreDiscode(str){ 178 | str = str.replace(/\r\n/g,""); 179 | str = str.replace(/\n/g,""); 180 | 181 | str = str.replace(/code/g,"wxxxcode-style"); 182 | return str; 183 | } 184 | 185 | function strDiscode(str){ 186 | str = strNumDiscode(str); 187 | str = strGreeceDiscode(str); 188 | str = strcharacterDiscode(str); 189 | str = strOtherDiscode(str); 190 | str = strMoreDiscode(str); 191 | return str; 192 | } 193 | function urlToHttpUrl(url,rep){ 194 | 195 | var patt1 = new RegExp("^//"); 196 | var result = patt1.test(url); 197 | if(result){ 198 | url = rep+":"+url; 199 | } 200 | return url; 201 | } 202 | 203 | module.exports = { 204 | strDiscode:strDiscode, 205 | urlToHttpUrl:urlToHttpUrl 206 | } -------------------------------------------------------------------------------- /common/wxParse/html2json.js: -------------------------------------------------------------------------------- 1 | /** 2 | * html2Json 改造来自: https://github.com/Jxck/html2json 3 | * 4 | * 5 | * author: Di (微信小程序开发工程师) 6 | * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) 7 | * 垂直微信小程序开发交流社区 8 | * 9 | * github地址: https://github.com/icindy/wxParse 10 | * 11 | * for: 微信小程序富文本解析 12 | * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 13 | */ 14 | 15 | var __placeImgeUrlHttps = "https"; 16 | var __emojisReg = ''; 17 | var __emojisBaseSrc = ''; 18 | var __emojis = {}; 19 | var wxDiscode = require('./wxDiscode.js'); 20 | var HTMLParser = require('./htmlparser.js'); 21 | // Empty Elements - HTML 5 22 | var empty = makeMap("area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr"); 23 | // Block Elements - HTML 5 24 | var block = makeMap("br,a,code,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video"); 25 | 26 | // Inline Elements - HTML 5 27 | var inline = makeMap("abbr,acronym,applet,b,basefont,bdo,big,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var"); 28 | 29 | // Elements that you can, intentionally, leave open 30 | // (and which close themselves) 31 | var closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr"); 32 | 33 | // Attributes that have their values filled in disabled="disabled" 34 | var fillAttrs = makeMap("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"); 35 | 36 | // Special Elements (can contain anything) 37 | var special = makeMap("wxxxcode-style,script,style,view,scroll-view,block"); 38 | function makeMap(str) { 39 | var obj = {}, items = str.split(","); 40 | for (var i = 0; i < items.length; i++) 41 | obj[items[i]] = true; 42 | return obj; 43 | } 44 | 45 | function q(v) { 46 | return '"' + v + '"'; 47 | } 48 | 49 | function removeDOCTYPE(html) { 50 | return html 51 | .replace(/<\?xml.*\?>\n/, '') 52 | .replace(/<.*!doctype.*\>\n/, '') 53 | .replace(/<.*!DOCTYPE.*\>\n/, ''); 54 | } 55 | 56 | 57 | function html2json(html, bindName) { 58 | //处理字符串 59 | html = removeDOCTYPE(html); 60 | html = wxDiscode.strDiscode(html); 61 | //生成node节点 62 | var bufArray = []; 63 | var results = { 64 | node: bindName, 65 | nodes: [], 66 | images:[], 67 | imageUrls:[] 68 | }; 69 | HTMLParser(html, { 70 | start: function (tag, attrs, unary) { 71 | //debug(tag, attrs, unary); 72 | // node for this element 73 | var node = { 74 | node: 'element', 75 | tag: tag, 76 | }; 77 | 78 | if (block[tag]) { 79 | node.tagType = "block"; 80 | } else if (inline[tag]) { 81 | node.tagType = "inline"; 82 | } else if (closeSelf[tag]) { 83 | node.tagType = "closeSelf"; 84 | } 85 | 86 | if (attrs.length !== 0) { 87 | node.attr = attrs.reduce(function (pre, attr) { 88 | var name = attr.name; 89 | var value = attr.value; 90 | if (name == 'class') { 91 | console.dir(value); 92 | // value = value.join("") 93 | node.classStr = value; 94 | } 95 | // has multi attibutes 96 | // make it array of attribute 97 | if (name == 'style') { 98 | console.dir(value); 99 | // value = value.join("") 100 | node.styleStr = value; 101 | } 102 | if (value.match(/ /)) { 103 | value = value.split(' '); 104 | } 105 | 106 | 107 | // if attr already exists 108 | // merge it 109 | if (pre[name]) { 110 | if (Array.isArray(pre[name])) { 111 | // already array, push to last 112 | pre[name].push(value); 113 | } else { 114 | // single value, make it array 115 | pre[name] = [pre[name], value]; 116 | } 117 | } else { 118 | // not exist, put it 119 | pre[name] = value; 120 | } 121 | 122 | return pre; 123 | }, {}); 124 | } 125 | 126 | //对img添加额外数据 127 | if (node.tag === 'img') { 128 | node.imgIndex = results.images.length; 129 | var imgUrl = node.attr.src; 130 | imgUrl = wxDiscode.urlToHttpUrl(imgUrl, __placeImgeUrlHttps); 131 | node.attr.src = imgUrl; 132 | node.from = bindName; 133 | results.images.push(node); 134 | results.imageUrls.push(imgUrl); 135 | } 136 | 137 | // 处理font标签样式属性 138 | if (node.tag === 'font') { 139 | var fontSize = ['x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', '-webkit-xxx-large']; 140 | var styleAttrs = { 141 | 'color': 'color', 142 | 'face': 'font-family', 143 | 'size': 'font-size' 144 | }; 145 | if (!node.attr.style) node.attr.style = []; 146 | if (!node.styleStr) node.styleStr = ''; 147 | for (var key in styleAttrs) { 148 | if (node.attr[key]) { 149 | var value = key === 'size' ? fontSize[node.attr[key]-1] : node.attr[key]; 150 | node.attr.style.push(styleAttrs[key]); 151 | node.attr.style.push(value); 152 | node.styleStr += styleAttrs[key] + ': ' + value + ';'; 153 | } 154 | } 155 | } 156 | 157 | //临时记录source资源 158 | if(node.tag === 'source'){ 159 | results.source = node.attr.src; 160 | } 161 | 162 | if (unary) { 163 | // if this tag dosen't have end tag 164 | // like 165 | // add to parents 166 | var parent = bufArray[0] || results; 167 | if (parent.nodes === undefined) { 168 | parent.nodes = []; 169 | } 170 | parent.nodes.push(node); 171 | } else { 172 | bufArray.unshift(node); 173 | } 174 | }, 175 | end: function (tag) { 176 | //debug(tag); 177 | // merge into parent tag 178 | var node = bufArray.shift(); 179 | if (node.tag !== tag) console.error('invalid state: mismatch end tag'); 180 | 181 | //当有缓存source资源时于于video补上src资源 182 | if(node.tag === 'video' && results.source){ 183 | node.attr.src = results.source; 184 | delete result.source; 185 | } 186 | 187 | if (bufArray.length === 0) { 188 | results.nodes.push(node); 189 | } else { 190 | var parent = bufArray[0]; 191 | if (parent.nodes === undefined) { 192 | parent.nodes = []; 193 | } 194 | parent.nodes.push(node); 195 | } 196 | }, 197 | chars: function (text) { 198 | //debug(text); 199 | var node = { 200 | node: 'text', 201 | text: text, 202 | textArray:transEmojiStr(text) 203 | }; 204 | 205 | if (bufArray.length === 0) { 206 | results.nodes.push(node); 207 | } else { 208 | var parent = bufArray[0]; 209 | if (parent.nodes === undefined) { 210 | parent.nodes = []; 211 | } 212 | parent.nodes.push(node); 213 | } 214 | }, 215 | comment: function (text) { 216 | //debug(text); 217 | // var node = { 218 | // node: 'comment', 219 | // text: text, 220 | // }; 221 | // var parent = bufArray[0]; 222 | // if (parent.nodes === undefined) { 223 | // parent.nodes = []; 224 | // } 225 | // parent.nodes.push(node); 226 | }, 227 | }); 228 | return results; 229 | }; 230 | 231 | function transEmojiStr(str){ 232 | // var eReg = new RegExp("["+__reg+' '+"]"); 233 | // str = str.replace(/\[([^\[\]]+)\]/g,':$1:') 234 | 235 | var emojiObjs = []; 236 | //如果正则表达式为空 237 | if(__emojisReg.length == 0 || !__emojis){ 238 | var emojiObj = {} 239 | emojiObj.node = "text"; 240 | emojiObj.text = str; 241 | array = [emojiObj]; 242 | return array; 243 | } 244 | //这个地方需要调整 245 | str = str.replace(/\[([^\[\]]+)\]/g,':$1:') 246 | var eReg = new RegExp("[:]"); 247 | var array = str.split(eReg); 248 | for(var i = 0; i < array.length; i++){ 249 | var ele = array[i]; 250 | var emojiObj = {}; 251 | if(__emojis[ele]){ 252 | emojiObj.node = "element"; 253 | emojiObj.tag = "emoji"; 254 | emojiObj.text = __emojis[ele]; 255 | emojiObj.baseSrc= __emojisBaseSrc; 256 | }else{ 257 | emojiObj.node = "text"; 258 | emojiObj.text = ele; 259 | } 260 | emojiObjs.push(emojiObj); 261 | } 262 | 263 | return emojiObjs; 264 | } 265 | 266 | function emojisInit(reg='',baseSrc="/wxParse/emojis/",emojis){ 267 | __emojisReg = reg; 268 | __emojisBaseSrc=baseSrc; 269 | __emojis=emojis; 270 | } 271 | 272 | module.exports = { 273 | html2json: html2json, 274 | emojisInit:emojisInit 275 | }; 276 | 277 | -------------------------------------------------------------------------------- /app.wxss: -------------------------------------------------------------------------------- 1 | /*** 定义字体为微软雅黑、苹方 ***/ 2 | @import "common/weui.wxss"; 3 | 4 | page { 5 | font-family: Helvetica, Tahoma, "Microsoft YaHei", "PingFang SC", sans-serif; 6 | background-color: #ebebeb; 7 | } 8 | 9 | /*** 弹性布局 ***/ 10 | 11 | .flex { 12 | display: -webkit-flex; 13 | display: flex; 14 | } 15 | 16 | .flex-x { 17 | display: -webkit-flex; 18 | display: flex; 19 | -webkit-justify-content: center; 20 | justify-content: center; 21 | } 22 | 23 | .flex-y { 24 | display: -webkit-flex; 25 | display: flex; 26 | -webkit-align-items: center; 27 | align-items: center; 28 | } 29 | 30 | .flex-xy { 31 | display: -webkit-flex; 32 | display: flex; 33 | -webkit-justify-content: center; 34 | justify-content: center; 35 | -webkit-align-items: center; 36 | align-items: center; 37 | position: relative; 38 | } 39 | 40 | .flex-column { 41 | display: -webkit-flex; 42 | display: flex; 43 | -webkit-flex-direction: column; 44 | flex-direction: column; 45 | } 46 | 47 | .flex-grow-1 { 48 | -webkit-box-flex: 1; 49 | flex-grow: 1; 50 | } 51 | 52 | /*** 字体图标库(ttp://www.iconfont.cn/plus) ***/ 53 | 54 | @font-face { 55 | font-family: 'iconfont'; 56 | src: url(data:font/truetype;charset=utf-8;base64,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) format('truetype'); 57 | font-weight: 500; 58 | font-style: normal; 59 | } 60 | 61 | .iconfont { 62 | font-family: "iconfont" !important; 63 | font-size: 16px; 64 | font-style: normal; 65 | -webkit-font-smoothing: antialiased; 66 | -webkit-text-stroke-width: 0.2px; 67 | } 68 | 69 | .icon-tag:before { 70 | content: "\e64c"; 71 | } 72 | 73 | .icon-code:before { 74 | content: "\e608"; 75 | } 76 | 77 | .icon-guide:before { 78 | content: "\e65d"; 79 | } 80 | 81 | .icon-wechat:before { 82 | content: "\e604"; 83 | } 84 | 85 | .icon-github:before { 86 | content: "\e69f"; 87 | } 88 | 89 | .icon-read:before { 90 | content: "\e7b9"; 91 | } 92 | 93 | .icon-tool:before { 94 | content: "\e600"; 95 | } 96 | 97 | .icon-iconblog2:before { 98 | content: "\e60f"; 99 | } 100 | 101 | .icon-zhihu:before { 102 | content: "\e617"; 103 | } 104 | 105 | 106 | -------------------------------------------------------------------------------- /common/weui.wxss: -------------------------------------------------------------------------------- 1 | page { 2 | line-height: 1.6; 3 | font-family: -apple-system-font, "Helvetica Neue", sans-serif; 4 | } 5 | 6 | icon { 7 | vertical-align: middle; 8 | } 9 | 10 | .weui-cells { 11 | position: relative; 12 | margin-top: 1.17647059em; 13 | background-color: #fff; 14 | line-height: 1.41176471; 15 | font-size: 17px; 16 | } 17 | 18 | .weui-cells:before { 19 | content: " "; 20 | position: absolute; 21 | left: 0; 22 | top: 0; 23 | right: 0; 24 | height: 1px; 25 | border-top: 1rpx solid #d9d9d9; 26 | color: #d9d9d9; 27 | } 28 | 29 | .weui-cells:after { 30 | content: " "; 31 | position: absolute; 32 | left: 0; 33 | bottom: 0; 34 | right: 0; 35 | height: 1px; 36 | border-bottom: 1rpx solid #d9d9d9; 37 | color: #d9d9d9; 38 | } 39 | 40 | .weui-cells__title { 41 | margin-top: 0.77em; 42 | margin-bottom: 0.3em; 43 | padding-left: 15px; 44 | padding-right: 15px; 45 | color: #999; 46 | font-size: 14px; 47 | } 48 | 49 | .weui-cells_after-title { 50 | margin-top: 0; 51 | } 52 | 53 | .weui-cells__tips { 54 | margin-top: 0.3em; 55 | color: #999; 56 | padding-left: 15px; 57 | padding-right: 15px; 58 | font-size: 14px; 59 | } 60 | 61 | .weui-cell { 62 | padding: 10px 15px; 63 | position: relative; 64 | display: -webkit-box; 65 | display: -webkit-flex; 66 | display: flex; 67 | -webkit-box-align: center; 68 | -webkit-align-items: center; 69 | align-items: center; 70 | } 71 | 72 | .weui-cell:before { 73 | content: " "; 74 | position: absolute; 75 | left: 0; 76 | top: 0; 77 | right: 0; 78 | height: 1px; 79 | border-top: 1rpx solid #d9d9d9; 80 | color: #d9d9d9; 81 | left: 15px; 82 | } 83 | 84 | .weui-cell:first-child:before { 85 | display: none; 86 | } 87 | 88 | .weui-cell_active { 89 | background-color: #ececec; 90 | } 91 | 92 | .weui-cell_primary { 93 | -webkit-box-align: start; 94 | -webkit-align-items: flex-start; 95 | align-items: flex-start; 96 | } 97 | 98 | .weui-cell__bd { 99 | -webkit-box-flex: 1; 100 | -webkit-flex: 1; 101 | flex: 1; 102 | } 103 | 104 | .weui-cell__ft { 105 | text-align: right; 106 | color: #999; 107 | } 108 | 109 | .weui-cell_access { 110 | color: inherit; 111 | } 112 | 113 | .weui-cell__ft_in-access { 114 | padding-right: 13px; 115 | position: relative; 116 | } 117 | 118 | .weui-cell__ft_in-access:after { 119 | content: " "; 120 | display: inline-block; 121 | height: 6px; 122 | width: 6px; 123 | border-width: 2px 2px 0 0; 124 | border-color: #c8c8cd; 125 | border-style: solid; 126 | -webkit-transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0); 127 | transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0); 128 | position: relative; 129 | top: -2px; 130 | position: absolute; 131 | top: 50%; 132 | margin-top: -4px; 133 | right: 2px; 134 | } 135 | 136 | .weui-cell_link { 137 | color: #586c94; 138 | font-size: 14px; 139 | } 140 | 141 | .weui-cell_link:active { 142 | background-color: #ececec; 143 | } 144 | 145 | .weui-cell_link:first-child:before { 146 | display: block; 147 | } 148 | 149 | .weui-icon-radio { 150 | margin-left: 3.2px; 151 | margin-right: 3.2px; 152 | } 153 | 154 | .weui-icon-checkbox_circle, .weui-icon-checkbox_success { 155 | margin-left: 4.6px; 156 | margin-right: 4.6px; 157 | } 158 | 159 | .weui-check__label:active { 160 | background-color: #ececec; 161 | } 162 | 163 | .weui-check { 164 | position: absolute; 165 | left: -9999px; 166 | } 167 | 168 | .weui-check__hd_in-checkbox { 169 | padding-right: 0.35em; 170 | } 171 | 172 | .weui-cell__ft_in-radio { 173 | padding-left: 0.35em; 174 | } 175 | 176 | .weui-cell_input { 177 | padding-top: 0; 178 | padding-bottom: 0; 179 | } 180 | 181 | .weui-label { 182 | width: 105px; 183 | word-wrap: break-word; 184 | word-break: break-all; 185 | } 186 | 187 | .weui-input { 188 | height: 2.58823529em; 189 | min-height: 2.58823529em; 190 | line-height: 2.58823529em; 191 | } 192 | 193 | .weui-toptips { 194 | position: fixed; 195 | -webkit-transform: translateZ(0); 196 | transform: translateZ(0); 197 | top: 0; 198 | left: 0; 199 | right: 0; 200 | padding: 5px; 201 | font-size: 14px; 202 | text-align: center; 203 | color: #fff; 204 | z-index: 5000; 205 | word-wrap: break-word; 206 | word-break: break-all; 207 | } 208 | 209 | .weui-toptips_warn { 210 | background-color: #e64340; 211 | } 212 | 213 | .weui-textarea { 214 | display: block; 215 | width: 100%; 216 | } 217 | 218 | .weui-textarea-counter { 219 | color: #b2b2b2; 220 | text-align: right; 221 | } 222 | 223 | .weui-textarea-counter_warn { 224 | color: #e64340; 225 | } 226 | 227 | .weui-cell_warn { 228 | color: #e64340; 229 | } 230 | 231 | .weui-form-preview { 232 | position: relative; 233 | background-color: #fff; 234 | } 235 | 236 | .weui-form-preview:before { 237 | content: " "; 238 | position: absolute; 239 | left: 0; 240 | top: 0; 241 | right: 0; 242 | height: 1px; 243 | border-top: 1rpx solid #d9d9d9; 244 | color: #d9d9d9; 245 | } 246 | 247 | .weui-form-preview:after { 248 | content: " "; 249 | position: absolute; 250 | left: 0; 251 | bottom: 0; 252 | right: 0; 253 | height: 1px; 254 | border-bottom: 1rpx solid #d9d9d9; 255 | color: #d9d9d9; 256 | } 257 | 258 | .weui-form-preview__value { 259 | font-size: 14px; 260 | } 261 | 262 | .weui-form-preview__value_in-hd { 263 | font-size: 26px; 264 | } 265 | 266 | .weui-form-preview__hd { 267 | position: relative; 268 | padding: 10px 15px; 269 | text-align: right; 270 | line-height: 2.5em; 271 | } 272 | 273 | .weui-form-preview__hd:after { 274 | content: " "; 275 | position: absolute; 276 | left: 0; 277 | bottom: 0; 278 | right: 0; 279 | height: 1px; 280 | border-bottom: 1rpx solid #d9d9d9; 281 | color: #d9d9d9; 282 | left: 15px; 283 | } 284 | 285 | .weui-form-preview__bd { 286 | padding: 10px 15px; 287 | font-size: 0.9em; 288 | text-align: right; 289 | color: #999; 290 | line-height: 2; 291 | } 292 | 293 | .weui-form-preview__ft { 294 | position: relative; 295 | line-height: 50px; 296 | display: -webkit-box; 297 | display: -webkit-flex; 298 | display: flex; 299 | } 300 | 301 | .weui-form-preview__ft:after { 302 | content: " "; 303 | position: absolute; 304 | left: 0; 305 | top: 0; 306 | right: 0; 307 | height: 1px; 308 | border-top: 1rpx solid #d5d5d6; 309 | color: #d5d5d6; 310 | } 311 | 312 | .weui-form-preview__item { 313 | overflow: hidden; 314 | } 315 | 316 | .weui-form-preview__label { 317 | float: left; 318 | margin-right: 1em; 319 | min-width: 4em; 320 | color: #999; 321 | text-align: justify; 322 | text-align-last: justify; 323 | } 324 | 325 | .weui-form-preview__value { 326 | display: block; 327 | overflow: hidden; 328 | word-break: normal; 329 | word-wrap: break-word; 330 | } 331 | 332 | .weui-form-preview__btn { 333 | position: relative; 334 | display: block; 335 | -webkit-box-flex: 1; 336 | -webkit-flex: 1; 337 | flex: 1; 338 | color: #3cc51f; 339 | text-align: center; 340 | } 341 | 342 | .weui-form-preview__btn:after { 343 | content: " "; 344 | position: absolute; 345 | left: 0; 346 | top: 0; 347 | width: 1px; 348 | bottom: 0; 349 | border-left: 1rpx solid #d5d5d6; 350 | color: #d5d5d6; 351 | } 352 | 353 | .weui-form-preview__btn:first-child:after { 354 | display: none; 355 | } 356 | 357 | .weui-form-preview__btn_active { 358 | background-color: #eee; 359 | } 360 | 361 | .weui-form-preview__btn_default { 362 | color: #999; 363 | } 364 | 365 | .weui-form-preview__btn_primary { 366 | color: #0bb20c; 367 | } 368 | 369 | .weui-cell_select { 370 | padding: 0; 371 | } 372 | 373 | .weui-select { 374 | position: relative; 375 | padding-left: 15px; 376 | padding-right: 30px; 377 | height: 2.58823529em; 378 | min-height: 2.58823529em; 379 | line-height: 2.58823529em; 380 | border-right: 1rpx solid #d9d9d9; 381 | } 382 | 383 | .weui-select:before { 384 | content: " "; 385 | display: inline-block; 386 | height: 6px; 387 | width: 6px; 388 | border-width: 2px 2px 0 0; 389 | border-color: #c8c8cd; 390 | border-style: solid; 391 | -webkit-transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0); 392 | transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0); 393 | position: relative; 394 | top: -2px; 395 | position: absolute; 396 | top: 50%; 397 | right: 15px; 398 | margin-top: -4px; 399 | } 400 | 401 | .weui-select_in-select-after { 402 | padding-left: 0; 403 | } 404 | 405 | .weui-cell__hd_in-select-after, .weui-cell__bd_in-select-before { 406 | padding-left: 15px; 407 | } 408 | 409 | .weui-cell_vcode { 410 | padding-right: 0; 411 | } 412 | 413 | .weui-vcode-img { 414 | margin-left: 5px; 415 | height: 2.58823529em; 416 | vertical-align: middle; 417 | } 418 | 419 | .weui-vcode-btn { 420 | display: inline-block; 421 | height: 2.58823529em; 422 | margin-left: 5px; 423 | padding: 0 0.6em 0 0.7em; 424 | border-left: 1px solid #e5e5e5; 425 | line-height: 2.58823529em; 426 | vertical-align: middle; 427 | font-size: 17px; 428 | color: #3cc51f; 429 | white-space: nowrap; 430 | } 431 | 432 | .weui-vcode-btn:active { 433 | color: #52a341; 434 | } 435 | 436 | .weui-cell_switch { 437 | padding-top: 6px; 438 | padding-bottom: 6px; 439 | } 440 | 441 | .weui-uploader__hd { 442 | display: -webkit-box; 443 | display: -webkit-flex; 444 | display: flex; 445 | padding-bottom: 10px; 446 | -webkit-box-align: center; 447 | -webkit-align-items: center; 448 | align-items: center; 449 | } 450 | 451 | .weui-uploader__title { 452 | -webkit-box-flex: 1; 453 | -webkit-flex: 1; 454 | flex: 1; 455 | } 456 | 457 | .weui-uploader__info { 458 | color: #b2b2b2; 459 | } 460 | 461 | .weui-uploader__bd { 462 | margin-bottom: -4px; 463 | margin-right: -9px; 464 | overflow: hidden; 465 | } 466 | 467 | .weui-uploader__file { 468 | float: left; 469 | margin-right: 9px; 470 | margin-bottom: 9px; 471 | } 472 | 473 | .weui-uploader__img { 474 | display: block; 475 | width: 79px; 476 | height: 79px; 477 | } 478 | 479 | .weui-uploader__file_status { 480 | position: relative; 481 | } 482 | 483 | .weui-uploader__file_status:before { 484 | content: " "; 485 | position: absolute; 486 | top: 0; 487 | right: 0; 488 | bottom: 0; 489 | left: 0; 490 | background-color: rgba(0, 0, 0, 0.5); 491 | } 492 | 493 | .weui-uploader__file-content { 494 | position: absolute; 495 | top: 50%; 496 | left: 50%; 497 | -webkit-transform: translate(-50%, -50%); 498 | transform: translate(-50%, -50%); 499 | color: #fff; 500 | } 501 | 502 | .weui-uploader__input-box { 503 | float: left; 504 | position: relative; 505 | margin-right: 9px; 506 | margin-bottom: 9px; 507 | width: 77px; 508 | height: 77px; 509 | border: 1px solid #d9d9d9; 510 | } 511 | 512 | .weui-uploader__input-box:before, .weui-uploader__input-box:after { 513 | content: " "; 514 | position: absolute; 515 | top: 50%; 516 | left: 50%; 517 | -webkit-transform: translate(-50%, -50%); 518 | transform: translate(-50%, -50%); 519 | background-color: #d9d9d9; 520 | } 521 | 522 | .weui-uploader__input-box:before { 523 | width: 2px; 524 | height: 39.5px; 525 | } 526 | 527 | .weui-uploader__input-box:after { 528 | width: 39.5px; 529 | height: 2px; 530 | } 531 | 532 | .weui-uploader__input-box:active { 533 | border-color: #999; 534 | } 535 | 536 | .weui-uploader__input-box:active:before, .weui-uploader__input-box:active:after { 537 | background-color: #999; 538 | } 539 | 540 | .weui-uploader__input { 541 | position: absolute; 542 | z-index: 1; 543 | top: 0; 544 | left: 0; 545 | width: 100%; 546 | height: 100%; 547 | opacity: 0; 548 | } 549 | 550 | .weui-article { 551 | padding: 20px 15px; 552 | font-size: 15px; 553 | } 554 | 555 | .weui-article__section { 556 | margin-bottom: 1.5em; 557 | } 558 | 559 | .weui-article__h1 { 560 | font-size: 18px; 561 | font-weight: 400; 562 | margin-bottom: 0.9em; 563 | } 564 | 565 | .weui-article__h2 { 566 | font-size: 16px; 567 | font-weight: 400; 568 | margin-bottom: 0.34em; 569 | } 570 | 571 | .weui-article__h3 { 572 | font-weight: 400; 573 | font-size: 15px; 574 | margin-bottom: 0.34em; 575 | } 576 | 577 | .weui-article__p { 578 | margin: 0 0 0.8em; 579 | } 580 | 581 | .weui-msg { 582 | padding-top: 36px; 583 | text-align: center; 584 | } 585 | 586 | .weui-msg__link { 587 | display: inline; 588 | color: #586c94; 589 | } 590 | 591 | .weui-msg__icon-area { 592 | margin-bottom: 30px; 593 | } 594 | 595 | .weui-msg__text-area { 596 | margin-bottom: 25px; 597 | padding: 0 20px; 598 | } 599 | 600 | .weui-msg__title { 601 | margin-bottom: 5px; 602 | font-weight: 400; 603 | font-size: 20px; 604 | } 605 | 606 | .weui-msg__desc { 607 | font-size: 14px; 608 | color: #999; 609 | } 610 | 611 | .weui-msg__opr-area { 612 | margin-bottom: 25px; 613 | } 614 | 615 | .weui-msg__extra-area { 616 | margin-bottom: 15px; 617 | font-size: 14px; 618 | color: #999; 619 | } 620 | 621 | @media screen and (min-height: 438px) { 622 | .weui-msg__extra-area { 623 | position: fixed; 624 | left: 0; 625 | bottom: 0; 626 | width: 100%; 627 | text-align: center; 628 | } 629 | } 630 | 631 | .weui-flex { 632 | display: -webkit-box; 633 | display: -webkit-flex; 634 | display: flex; 635 | } 636 | 637 | .weui-flex__item { 638 | -webkit-box-flex: 1; 639 | -webkit-flex: 1; 640 | flex: 1; 641 | } 642 | 643 | .weui-btn { 644 | margin-top: 15px; 645 | } 646 | 647 | .weui-btn:first-child { 648 | margin-top: 0; 649 | } 650 | 651 | .weui-btn-area { 652 | margin: 1.17647059em 15px 0.3em; 653 | } 654 | 655 | .weui-agree { 656 | display: block; 657 | padding: 0.5em 15px; 658 | font-size: 13px; 659 | } 660 | 661 | .weui-agree__text { 662 | color: #999; 663 | } 664 | 665 | .weui-agree__link { 666 | display: inline; 667 | color: #586c94; 668 | } 669 | 670 | .weui-agree__checkbox { 671 | position: absolute; 672 | left: -9999px; 673 | } 674 | 675 | .weui-agree__checkbox-icon { 676 | position: relative; 677 | top: 2px; 678 | display: inline-block; 679 | border: 1px solid #d1d1d1; 680 | background-color: #fff; 681 | border-radius: 3px; 682 | width: 11px; 683 | height: 11px; 684 | } 685 | 686 | .weui-agree__checkbox-icon-check { 687 | position: absolute; 688 | top: 1px; 689 | left: 1px; 690 | } 691 | 692 | .weui-footer { 693 | color: #999; 694 | font-size: 14px; 695 | text-align: center; 696 | } 697 | 698 | .weui-footer_fixed-bottom { 699 | position: fixed; 700 | bottom: 0.52em; 701 | left: 0; 702 | right: 0; 703 | } 704 | 705 | .weui-footer__links { 706 | font-size: 0; 707 | } 708 | 709 | .weui-footer__link { 710 | display: inline-block; 711 | vertical-align: top; 712 | margin: 0 0.62em; 713 | position: relative; 714 | font-size: 14px; 715 | color: #586c94; 716 | } 717 | 718 | .weui-footer__link:before { 719 | content: " "; 720 | position: absolute; 721 | left: 0; 722 | top: 0; 723 | width: 1px; 724 | bottom: 0; 725 | border-left: 1rpx solid #c7c7c7; 726 | color: #c7c7c7; 727 | left: -0.65em; 728 | top: 0.36em; 729 | bottom: 0.36em; 730 | } 731 | 732 | .weui-footer__link:first-child:before { 733 | display: none; 734 | } 735 | 736 | .weui-footer__text { 737 | padding: 0 0.34em; 738 | font-size: 12px; 739 | } 740 | 741 | .weui-grids { 742 | border-top: 1rpx solid #d9d9d9; 743 | border-left: 1rpx solid #d9d9d9; 744 | overflow: hidden; 745 | } 746 | 747 | .weui-grid { 748 | position: relative; 749 | float: left; 750 | padding: 20px 10px; 751 | width: 33.33333333%; 752 | box-sizing: border-box; 753 | border-right: 1rpx solid #d9d9d9; 754 | border-bottom: 1rpx solid #d9d9d9; 755 | } 756 | 757 | .weui-grid_active { 758 | background-color: #ececec; 759 | } 760 | 761 | .weui-grid__icon { 762 | display: block; 763 | width: 28px; 764 | height: 28px; 765 | margin: 0 auto; 766 | } 767 | 768 | .weui-grid__label { 769 | margin-top: 5px; 770 | display: block; 771 | text-align: center; 772 | color: #000; 773 | font-size: 14px; 774 | white-space: nowrap; 775 | text-overflow: ellipsis; 776 | overflow: hidden; 777 | } 778 | 779 | .weui-loading { 780 | margin: 0 5px; 781 | width: 20px; 782 | height: 20px; 783 | display: inline-block; 784 | vertical-align: middle; 785 | -webkit-animation: weuiLoading 1s steps(12, end) infinite; 786 | animation: weuiLoading 1s steps(12, end) infinite; 787 | background: transparent url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=) no-repeat; 788 | background-size: 100%; 789 | } 790 | 791 | .weui-loading.weui-loading_transparent { 792 | background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 100 100'%3E%3Cpath fill='none' d='M0 0h100v100H0z'/%3E%3Crect xmlns='http://www.w3.org/2000/svg' width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.56)' rx='5' ry='5' transform='translate(0 -30)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.5)' rx='5' ry='5' transform='rotate(30 105.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.43)' rx='5' ry='5' transform='rotate(60 75.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.38)' rx='5' ry='5' transform='rotate(90 65 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.32)' rx='5' ry='5' transform='rotate(120 58.66 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.28)' rx='5' ry='5' transform='rotate(150 54.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.25)' rx='5' ry='5' transform='rotate(180 50 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.2)' rx='5' ry='5' transform='rotate(-150 45.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.17)' rx='5' ry='5' transform='rotate(-120 41.34 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.14)' rx='5' ry='5' transform='rotate(-90 35 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.1)' rx='5' ry='5' transform='rotate(-60 24.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.03)' rx='5' ry='5' transform='rotate(-30 -5.98 65)'/%3E%3C/svg%3E"); 793 | } 794 | 795 | @-webkit-keyframes weuiLoading { 796 | 0% { 797 | -webkit-transform: rotate3d(0, 0, 1, 0deg); 798 | transform: rotate3d(0, 0, 1, 0deg); 799 | } 800 | 801 | 100% { 802 | -webkit-transform: rotate3d(0, 0, 1, 360deg); 803 | transform: rotate3d(0, 0, 1, 360deg); 804 | } 805 | } 806 | 807 | @keyframes weuiLoading { 808 | 0% { 809 | -webkit-transform: rotate3d(0, 0, 1, 0deg); 810 | transform: rotate3d(0, 0, 1, 0deg); 811 | } 812 | 813 | 100% { 814 | -webkit-transform: rotate3d(0, 0, 1, 360deg); 815 | transform: rotate3d(0, 0, 1, 360deg); 816 | } 817 | } 818 | 819 | .weui-badge { 820 | display: inline-block; 821 | padding: 0.15em 0.4em; 822 | min-width: 8px; 823 | border-radius: 18px; 824 | background-color: #e64340; 825 | color: #fff; 826 | line-height: 1.2; 827 | text-align: center; 828 | font-size: 12px; 829 | vertical-align: middle; 830 | } 831 | 832 | .weui-badge_dot { 833 | padding: 0.4em; 834 | min-width: 0; 835 | } 836 | 837 | .weui-loadmore { 838 | width: 65%; 839 | margin: 1.5em auto; 840 | line-height: 1.6em; 841 | font-size: 14px; 842 | text-align: center; 843 | } 844 | 845 | .weui-loadmore__tips { 846 | display: inline-block; 847 | vertical-align: middle; 848 | } 849 | 850 | .weui-loadmore_line { 851 | border-top: 1px solid #e5e5e5; 852 | margin-top: 2.4em; 853 | } 854 | 855 | .weui-loadmore__tips_in-line { 856 | position: relative; 857 | top: -0.9em; 858 | padding: 0 0.55em; 859 | background-color: #fff; 860 | color: #999; 861 | } 862 | 863 | .weui-loadmore__tips_in-dot { 864 | position: relative; 865 | padding: 0 0.16em; 866 | width: 4px; 867 | height: 1.6em; 868 | } 869 | 870 | .weui-loadmore__tips_in-dot:before { 871 | content: " "; 872 | position: absolute; 873 | top: 50%; 874 | left: 50%; 875 | margin-top: -1px; 876 | margin-left: -2px; 877 | width: 4px; 878 | height: 4px; 879 | border-radius: 50%; 880 | background-color: #e5e5e5; 881 | } 882 | 883 | .weui-panel { 884 | background-color: #fff; 885 | margin-top: 10px; 886 | position: relative; 887 | overflow: hidden; 888 | } 889 | 890 | .weui-panel:first-child { 891 | margin-top: 0; 892 | } 893 | 894 | .weui-panel:before { 895 | content: " "; 896 | position: absolute; 897 | left: 0; 898 | top: 0; 899 | right: 0; 900 | height: 1px; 901 | border-top: 1rpx solid #e5e5e5; 902 | color: #e5e5e5; 903 | } 904 | 905 | .weui-panel:after { 906 | content: " "; 907 | position: absolute; 908 | left: 0; 909 | bottom: 0; 910 | right: 0; 911 | height: 1px; 912 | border-bottom: 1rpx solid #e5e5e5; 913 | color: #e5e5e5; 914 | } 915 | 916 | .weui-panel__hd { 917 | padding: 14px 15px 10px; 918 | color: #999; 919 | font-size: 13px; 920 | position: relative; 921 | } 922 | 923 | .weui-panel__hd:after { 924 | content: " "; 925 | position: absolute; 926 | left: 0; 927 | bottom: 0; 928 | right: 0; 929 | height: 1px; 930 | border-bottom: 1rpx solid #e5e5e5; 931 | color: #e5e5e5; 932 | left: 15px; 933 | } 934 | 935 | .weui-media-box { 936 | padding: 15px; 937 | position: relative; 938 | } 939 | 940 | .weui-media-box:before { 941 | content: " "; 942 | position: absolute; 943 | left: 0; 944 | top: 0; 945 | right: 0; 946 | height: 1px; 947 | border-top: 1rpx solid #e5e5e5; 948 | color: #e5e5e5; 949 | left: 15px; 950 | } 951 | 952 | .weui-media-box:first-child:before { 953 | display: none; 954 | } 955 | 956 | .weui-media-box__title { 957 | font-weight: 400; 958 | font-size: 17px; 959 | width: auto; 960 | overflow: hidden; 961 | text-overflow: ellipsis; 962 | white-space: nowrap; 963 | word-wrap: normal; 964 | word-wrap: break-word; 965 | word-break: break-all; 966 | } 967 | 968 | .weui-media-box__desc { 969 | color: #999; 970 | font-size: 13px; 971 | line-height: 1.2; 972 | overflow: hidden; 973 | text-overflow: ellipsis; 974 | display: -webkit-box; 975 | -webkit-box-orient: vertical; 976 | -webkit-line-clamp: 2; 977 | } 978 | 979 | .weui-media-box__info { 980 | margin-top: 15px; 981 | padding-bottom: 5px; 982 | font-size: 13px; 983 | color: #cecece; 984 | line-height: 1em; 985 | list-style: none; 986 | overflow: hidden; 987 | } 988 | 989 | .weui-media-box__info__meta { 990 | float: left; 991 | padding-right: 1em; 992 | } 993 | 994 | .weui-media-box__info__meta_extra { 995 | padding-left: 1em; 996 | border-left: 1px solid #cecece; 997 | } 998 | 999 | .weui-media-box__title_in-text { 1000 | margin-bottom: 8px; 1001 | } 1002 | 1003 | .weui-media-box_appmsg { 1004 | display: -webkit-box; 1005 | display: -webkit-flex; 1006 | display: flex; 1007 | -webkit-box-align: center; 1008 | -webkit-align-items: center; 1009 | align-items: center; 1010 | } 1011 | 1012 | .weui-media-box__thumb { 1013 | width: 100%; 1014 | height: 100%; 1015 | vertical-align: top; 1016 | } 1017 | 1018 | .weui-media-box__hd_in-appmsg { 1019 | margin-right: 0.8em; 1020 | width: 60px; 1021 | height: 60px; 1022 | line-height: 60px; 1023 | text-align: center; 1024 | } 1025 | 1026 | .weui-media-box__bd_in-appmsg { 1027 | -webkit-box-flex: 1; 1028 | -webkit-flex: 1; 1029 | flex: 1; 1030 | min-width: 0; 1031 | } 1032 | 1033 | .weui-media-box_small-appmsg { 1034 | padding: 0; 1035 | } 1036 | 1037 | .weui-cells_in-small-appmsg { 1038 | margin-top: 0; 1039 | } 1040 | 1041 | .weui-cells_in-small-appmsg:before { 1042 | display: none; 1043 | } 1044 | 1045 | .weui-progress { 1046 | display: -webkit-box; 1047 | display: -webkit-flex; 1048 | display: flex; 1049 | -webkit-box-align: center; 1050 | -webkit-align-items: center; 1051 | align-items: center; 1052 | } 1053 | 1054 | .weui-progress__bar { 1055 | -webkit-box-flex: 1; 1056 | -webkit-flex: 1; 1057 | flex: 1; 1058 | } 1059 | 1060 | .weui-progress__opr { 1061 | margin-left: 15px; 1062 | font-size: 0; 1063 | } 1064 | 1065 | .weui-navbar { 1066 | display: -webkit-box; 1067 | display: -webkit-flex; 1068 | display: flex; 1069 | position: absolute; 1070 | z-index: 500; 1071 | top: 0; 1072 | width: 100%; 1073 | border-bottom: 1rpx solid #ccc; 1074 | } 1075 | 1076 | .weui-navbar__item { 1077 | position: relative; 1078 | display: block; 1079 | -webkit-box-flex: 1; 1080 | -webkit-flex: 1; 1081 | flex: 1; 1082 | padding: 13px 0; 1083 | text-align: center; 1084 | font-size: 0; 1085 | } 1086 | 1087 | .weui-navbar__item.weui-bar__item_on { 1088 | color: #1aad19; 1089 | } 1090 | 1091 | .weui-navbar__slider { 1092 | position: absolute; 1093 | content: " "; 1094 | left: 0; 1095 | bottom: 0; 1096 | width: 6em; 1097 | height: 3px; 1098 | background-color: #1aad19; 1099 | -webkit-transition: -webkit-transform 0.3s; 1100 | transition: -webkit-transform 0.3s; 1101 | transition: transform 0.3s; 1102 | transition: transform 0.3s, -webkit-transform 0.3s; 1103 | } 1104 | 1105 | .weui-navbar__title { 1106 | display: inline-block; 1107 | font-size: 15px; 1108 | max-width: 8em; 1109 | width: auto; 1110 | overflow: hidden; 1111 | text-overflow: ellipsis; 1112 | white-space: nowrap; 1113 | word-wrap: normal; 1114 | } 1115 | 1116 | .weui-tab { 1117 | position: relative; 1118 | height: 100%; 1119 | } 1120 | 1121 | .weui-tab__panel { 1122 | box-sizing: border-box; 1123 | height: 100%; 1124 | padding-top: 50px; 1125 | overflow: auto; 1126 | -webkit-overflow-scrolling: touch; 1127 | } 1128 | 1129 | .weui-search-bar { 1130 | position: relative; 1131 | padding: 8px 10px; 1132 | display: -webkit-box; 1133 | display: -webkit-flex; 1134 | display: flex; 1135 | box-sizing: border-box; 1136 | background-color: #efeff4; 1137 | border-top: 1rpx solid #d7d6dc; 1138 | border-bottom: 1rpx solid #d7d6dc; 1139 | } 1140 | 1141 | .weui-icon-search { 1142 | margin-right: 8px; 1143 | font-size: inherit; 1144 | } 1145 | 1146 | .weui-icon-search_in-box { 1147 | position: absolute; 1148 | left: 10px; 1149 | top: 7px; 1150 | } 1151 | 1152 | .weui-search-bar__text { 1153 | display: inline-block; 1154 | font-size: 14px; 1155 | vertical-align: middle; 1156 | } 1157 | 1158 | .weui-search-bar__form { 1159 | position: relative; 1160 | -webkit-box-flex: 1; 1161 | -webkit-flex: auto; 1162 | flex: auto; 1163 | border-radius: 5px; 1164 | background: #fff; 1165 | border: 1rpx solid #e6e6ea; 1166 | } 1167 | 1168 | .weui-search-bar__box { 1169 | position: relative; 1170 | padding-left: 30px; 1171 | padding-right: 30px; 1172 | width: 100%; 1173 | box-sizing: border-box; 1174 | z-index: 1; 1175 | } 1176 | 1177 | .weui-search-bar__input { 1178 | height: 28px; 1179 | line-height: 28px; 1180 | font-size: 14px; 1181 | } 1182 | 1183 | .weui-icon-clear { 1184 | position: absolute; 1185 | top: 0; 1186 | right: 0; 1187 | padding: 7px 8px; 1188 | font-size: 0; 1189 | } 1190 | 1191 | .weui-search-bar__label { 1192 | position: absolute; 1193 | top: 0; 1194 | right: 0; 1195 | bottom: 0; 1196 | left: 0; 1197 | z-index: 2; 1198 | border-radius: 3px; 1199 | text-align: center; 1200 | color: #9b9b9b; 1201 | background: #fff; 1202 | line-height: 28px; 1203 | } 1204 | 1205 | .weui-search-bar__cancel-btn { 1206 | margin-left: 10px; 1207 | line-height: 28px; 1208 | color: #09bb07; 1209 | white-space: nowrap; 1210 | } 1211 | -------------------------------------------------------------------------------- /pages/index/markdown/markdown.wxml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | 20 | 21 | 25 | 26 | 36 | 37 | 38 | 39 |