首页 > 编程语言 >小程序云开发实战:从零搭建科技爱好者周刊小程序

小程序云开发实战:从零搭建科技爱好者周刊小程序

时间:2023-08-04 22:34:10浏览次数:48  
标签:文件 markdown 程序 爱好者 周刊 let imgArr 搭建


# 前言

作为一名程序猿经常会逛 github ,也会关注一些科技类资讯,自然就发现了阮一峰老师的科技爱好者周刊,每到周五经常会打开这个开源杂志看看有没有新奇好玩的东西。这个周刊是个开源杂志,目前可以从多个地方查看,除了 github 之外还有阮一峰老师的博客、云加专栏、语雀等地方,但是感觉不如小程序这个形态来的方便快捷,然后发现语雀有小程序但是打开路径还是略长,需要登录后点击【我】再进入【我的收藏】,再从列表中选择收藏的周刊进行查看(而且右上角胶囊菜单没有分享功能)......。所以就想到利用小程序的云开发能力来实现这么一个开源杂志的小程序版

# 界面效果

小程序首页及详情页




小程序云开发实战:从零搭建科技爱好者周刊小程序_java



小程序云开发实战:从零搭建科技爱好者周刊小程序_python_02


# 与语雀的界面对比

语雀小程序中周刊的列表页及详情页



小程序云开发实战:从零搭建科技爱好者周刊小程序_java_03



小程序云开发实战:从零搭建科技爱好者周刊小程序_编程语言_04


  • 以下是使用方式上的一些差异,仅供参考

使用上的差异

入口层级

分享

订阅

语雀内的

层级较深

支持分享海报及发送给朋友(右上角胶囊菜单不支持分享给朋友及朋友圈)

关注后开启推送

本小程序

点击即用

支持右上角胶囊菜单分享给朋友及朋友圈

功能已增加,暂未开放

# 技术选型

# 小程序端

  • 主框架使用 mpvue
  • UI框架采用 Lin-ui
  • 渲染插件使用 wemark

# 服务端

  • 小程序云开发部署若干云函数
  • weeklies:获取周刊列表
  • weekly:获取周刊 markdown 数据
  • 服务器部署基于 koa 框架开发的接口

# 架构方案

主体采用服务器加云开发混合部署,如下图所示:



小程序云开发实战:从零搭建科技爱好者周刊小程序_小程序_05


  • 服务器定期从 github 拉取最新文章的 markdown 文件,并进行基础的数据处理,生成文章的 json 缓存文件
  • 小程序内调用云函数后从独立服务器获取文章数据进行展示
  • 文章内页的数据为markdown类型故采用开源插件 wemark 进行渲染

# 重点问题

1.文章内容渲染的问题。小程序内的 markdown 渲染插件有几种解决方案,最终选择了 wemark 来渲染(当然也可以选其它的) markdown 文件


<wemark :md="content" link highlight type="wemark"></wemark>


2.每期周刊并没有在文件中标注说明创建时间,但是文件是从 github 同步过来的,所以可以通过执行 git log 命令来获取日志从而大致确定文章的更新时间

核心实现示例如下:


// 需要借助 child_process 及 moment 模块
...
var data = fs.readFileSync(row, 'utf-8') // row 为markdown文件本地路径

// 最后更新时间
let dateGit = execSync(
'cd ' + config.base_path + ' && git log -n 1 -s --format=%cd ' + row
).toString() // config.base_path 为本地周刊仓库地址
let lastdate = moment(new Date(dateGit)).format('YYYY-MM-DD')


3.接口数据格式。前期的文章格式并不居有明显的规律性,在文章配图及概要获取上存在一定问题,为了使首页的最终显示效果更加美观,最终确定取封面图及其描述作为每期的介绍。

最终确定的周刊列表 json 格式示例:


{
	"code": 0,
	"data": [{
		"title": "科技爱好者周刊(第125期):数字人民币要取代谁",
		"seq": "125",
		"desc": "西班牙加纳利岛的人们,在火山灰上挖坑种葡萄。火山灰排水快,种出来的葡萄更适合酿酒。([via](https://www.instagram.com/p/CFMtHr3jOtR/))",
		"lastdate": "2020-09-18",
		"file_name": "issue-125.md",
		"img": "https://www.wangbase.com/blogimg/asset/202009/bg2020091705.jpg"
	}]
}


4.markdown 数据的处理,需要匹配 markdown 文件内部引用的图片

markdown 文件内部引用图片不一定完全契合标题,但是一篇文章没有配图也太丑了,所以这里权衡之后决定使用第一张图及其描述作为周刊文章封面及概要

获取图片的方式为正则匹配 markdown 文件内容中的所有图片,然后获取第一张图,并把图片之后的固定 90 个字符作为该期周刊的描述文字


// 获取第一张图
let imgReg = /!\[.*\]((.+))/ //匹配img
let cnt = data
let imgArr = cnt.match(imgReg) //筛选出所有的img

// 图后的内容截取作为描述
let desc = cnt.substr(cnt.indexOf(imgArr[0]) + imgArr[0].length + 2, 90)

let imgUrl = ''
if (imgArr && imgArr.length > 0) {
    let url = imgArr[0]
    imgUrl = url.substring(url.indexOf('(') + 1, url.indexOf(')'))
}


5.数据同步问题。目前基于koa写了一个 webhook 部署在独立服务器上,每周定期拉取最新周刊的 markdown 文件并生成缓存。

示例代码:


router.get('/weeklies/init', async (ctx, next) => {
  // 拉取最新markdown文件
  const { stdout, stderr } = await exec(
    'cd ' + config.base_path + ' && cd ../ && git pull'
  )
  if (stderr == '') {
    // 读取md文件列表
    let blog_routes = await fg(blog_md_path, {
      onlyFiles: true,
      cwd: __dirname,
      deep: 1,
    })
  
    ctx.data = '仓库更新成功->' + stdout + (await initTitle(blog_routes))
  } else {
    ctx.data = stderr
  }
  await next()
})


# 项目总结

项目整体上比较简单,极简风格,发现了有意思的东西可以方便地分享给朋友或者到朋友圈。目前 markdown 文件内容并没有使用云数据库,而是直接读取的文件,可能会对服务器 IO 有一定考验,后期会采取迁移到云数据库的方式。

标签:文件,markdown,程序,爱好者,周刊,let,imgArr,搭建
From: https://blog.51cto.com/xuedingmaojun/6969449

相关文章

  • 开源一个博客小程序
    本站博客小程序介绍之前就一直想做一个博客小程序方便在手机上查阅,遇到了一些问题迟迟没有推进。前一段时间才把丑陋的初版做出来ಥ_ಥ。开源地址功能规划使用技术适用范围参考资料#功能规划本来是想做一个web端的复刻版,但是由于某些限制,就先弄了一个简版#使用技术mpvue框架......
  • NVIDIA 535.86.05 Linux 图形驱动程序改进 Wayland 支持
    NVIDIA公司近日发布了适用于 Linux、FreeBSD和Solaris系统的NVIDIA535.86.05图形驱动程序,作为其生产分支的维护更新,解决了各种错误和问题。NVIDIA535.86.05是在NVIDIA535.54.03发布一个多月之后发布的,它通过解决在使用某些Wayland合成器时关闭连接的显示器时......
  • NVIDIA 535.86.05 Linux 图形驱动程序改进 Wayland 支持
    NVIDIA公司近日发布了适用于 Linux、FreeBSD和Solaris系统的NVIDIA535.86.05图形驱动程序,作为其生产分支的维护更新,解决了各种错误和问题。NVIDIA535.86.05是在NVIDIA535.54.03发布一个多月之后发布的,它通过解决在使用某些Wayland合成器时关闭连接的显示器时......
  • cdh4 hadoop,hive,impala,hbase本地库搭建及安装
    --hadoop文件位置:log目录:1 /var/log/hadoop-hdfs2 /var/log/hadoop-mapreduce3 /var/log/hbase4 /var/log/hive5 /var/log/hive6 /var/log/impala安装目录:1 /usr/lib启动命令目录:1 /etc/init.d/配置文件目录:1 /etc/hadoop/conf2 /etc/hbase/conf3 /etc/hive/conf......
  • 程序员自由创业周记#5:加一上线
    程序员自由创业周记#5:加一上线这是一位程序员进行独立开发创业的记录,将分享创业过程中的所思所想以及收支明细。充实如果说程序员独立创业的成功率只有5%,那如果家里有一位3岁多还没上幼儿园的小朋友要照顾,成功的概率至少还要降低一半,过去一个月,除了吃饭睡觉几乎都在开发软件和......
  • 程序员自由创业周记#4:从一笔30美元的收入谈起
    本文是一位程序员进行独立开发创业的记录,将分享创业过程中的所思所想以及收支明细。在文末,您还可以找到之前的历史文章。惊喜之旅这次的惊喜源于学伟扫描Pro在美国销售的第一笔订单,这标志着我的产品获得了漂亮国用户的认可,让我感到非常欣慰。学伟扫描是我四年前尝试独立开发......
  • 程序员自由创业周记#3:No1
    本文是程序员进行独立开发创业的记录,会分享创业创业过程中的所思所想和收支明细,文末有往期历史文章。作息如果不是热爱,很难解释为什么能早上6点自然醒后坐在电脑前除了吃饭一直敲代码到23点这个现象,而且还乐此不疲。之前上班的时候生活就很规律,没想到失业后的生活比之前还要规......
  • 程序员自由创业周记#2:前期准备
    程序员自由创业周记#2:前期准备本文是程序员进行独立开发创业的记录,会分享创业创业过程中的所思所想和收支明细,文末有往期历史文章。感恩上次公开了创业的决定后,得到了很多亲朋好友和陌生朋友的鼓励或支持,以不同的形式,感动之情溢于言表。这些都会记在心里,大恩不言谢~创业方向......
  • 程序员自由创业周记#1:做一场梦吧
    程序员自由创业周记#1:做一场梦吧“自由”为了做这一场梦,前前后后准备了4年,从19年接触独立开发/数字游民/自由职业者以后,总觉得这才是我一直追求的生活方式,没有职场的阿谀奉承,没有人强制你某个时间点必须坐到某个座位上,再也没有无休止的会,当然,也没有人再固定每个月往你银行卡......
  • 真正停止爱奇艺PCDN ipes程序的命令
    前言越来越挑战上机的技术了,很多人不会真正的关闭。一开始的ipesstop现在已经被定义为了重新启动,明明是stop,以前也就是stop的作用。背景P2SP技术的一种运用罢了,换了个新词P2PCDN,或者说PCDN什么的,算不得原创或者独创或者近些年刚刚出现。这玩意儿最早大规模使用的就是BT文件传输,最......