当前位置:首页 > 科技  > 软件

lowcode-cms开源社区源码设计分享

来源: 责编: 时间:2024-01-25 10:41:57 344观看
导读开源背景lowcode可视化社区 是我之前在设计研发 Dooring低代码 平台时开发的一个面向低代码内容分享的知识社区, 内容端采用 SSR 技术来渲染页面, 对 SEO 更加友好, 同时后端服务采用 Nodejs 来实现, 内容端和服务端

tKL28资讯网——每日最新资讯28at.com

开源背景

lowcode可视化社区 是我之前在设计研发 Dooring低代码 平台时开发的一个面向低代码内容分享的知识社区, 内容端采用 SSR 技术来渲染页面, 对 SEO 更加友好, 同时后端服务采用 Nodejs 来实现, 内容端和服务端同端, 也就是传说中的内容服务“同构”. 管理端采用前端最最流行的 React hooks 来实现, 无论是技术人员还是非技术人员, 通过简单的操作就可以轻松部署一套专属自己的 CMS 系统。tKL28资讯网——每日最新资讯28at.com

本着满满的开源精神, 我对这套 CMS 系统进行了开源, 让更多技术小白或者非技术人员, 可以轻松部署自己的网站。tKL28资讯网——每日最新资讯28at.com

接下来我会从技术的角度, 分享一下我开源的 lowcode-cms 系统的技术实现, 以及如何本地运行 + 部署这套开箱即用的 CMS 系统。tKL28资讯网——每日最新资讯28at.com

系统设计架构

tKL28资讯网——每日最新资讯28at.com

接下来我会具体和大家介绍一下管理端, 内容端, 服务端的技术架构。内容端架构设计tKL28资讯网——每日最新资讯28at.com

内容端主要用来展现个人或者企业的内容信息, 相当于一个门户站, 这里为了更好的 SEO, 我采用了模版引擎来渲染 html, 也就是koa-views +  pug 模式, 具体界面如下:tKL28资讯网——每日最新资讯28at.com

tKL28资讯网——每日最新资讯28at.com

当然这只是首页模块, 还有诸如行业产品, 最佳实践, 视频, 手记等, 这里就不一一介绍了, 大家如果会编程的话, 也可以自定义自己的模块页面. 我们接下来看看具体的技术实现。tKL28资讯网——每日最新资讯28at.com

tKL28资讯网——每日最新资讯28at.com

大家可以在github中server的views目录下看到每个渲染层的具体实现, 这里和大家分享一下 lowcode-cms 搭建的ssr模式。tKL28资讯网——每日最新资讯28at.com

1、配置pug支持

import koa from "koa";import views from "koa-views";// ... (此处省略服务端自治的部分代码)// 挂载路由glob.sync(`${config.routerPath}/*.js`).forEach((item) => {  require(item).default(router, config.API_VERSION_PATH);});//使用模版引擎app.use(views(resolve(__dirname, "./views"), { extension: "pug" }));app.use(router.routes()).use(router.allowedMethods());

2、ssr路由数据直出

这块主要是基于用户发起的请求, 在服务端格式化好数据供 pug 消费:tKL28资讯网——每日最新资讯28at.com

/** * 文章路由 * @param {*} router * @param {*} apiPath */const pageRenderRouter = (router) => {  // api路径  const api = {    // 渲染首页    index: "/",    // 最佳实践列表    bestPractice: "/best-practice",    product: "/product",    video: "/video",    note: "/note",    login: "/login",    // 其他渲染路由...  };  // 内容端导航配置  const nav = [    {      id: "0",      title: "最佳实践",      link: "/best-practice"    },    {      id: "1",      title: "行业产品",      link: "/product"    },    {      id: "3",      title: "视频",      link: "/video"    },    {      id: "4",      title: "手记",      link: "/note"    },    {      id: "5",      title: "关于",      link: "/about"    },  ]  const copyright = "版权所有 @lowcode可视化社区"  // 登录  router.get(api.login, async (ctx) => {    await ctx.render("login", {      url: api.login,      title: "登录",      description: "新用户?",      href: "去注册",      firstInput: "邮箱",      twoInput: "密码",      btnText: "登录",      logoText: "Dooring低代码社区",    });  });  // 渲染首页  router.get(api.index, async (ctx) => {    const filePath = `${config.publicPath}/db/homeConfig.json`;    const articlesPath = `${config.publicPath}/db/article_index.json`;    const productsPath = `${config.publicPath}/db/product_index.json`;    const videosPath = `${config.publicPath}/db/video_index.json`;    const homeConfig = RF(filePath);    const articles = RF(articlesPath);    const products = RF(productsPath);    const videos = RF(videosPath);    await ctx.render("index", {      nav,      articles: articles.filter(v => v.review === 1).slice(0, 6),      products: products.filter(v => v.review === 1).slice(0, 6),      videos: videos.filter(v => v.review === 1).slice(0, 6),      copyright,      ...homeConfig    });    // 统计访问量    const viewPath = `${config.publicPath}/db/views.json`;    const views = RF(viewPath);    WF(viewPath, {...views, home: views.home + 1});  });  // 渲染文章详情页  router.get(api.articleDetail, async (ctx) => {    const id = ctx.query.fid;    const articlePath = `${config.publicPath}/db/articles/${id}.json`;    const commentPath = `${config.publicPath}/db/comments/${id}.json`;    const article = RF(articlePath) || {};    const comments = RF(commentPath) || {};    comments.views = comments.views + 1;    await ctx.render("article_detail", {      nav,      viewTitle: article.title,      topImg: article.img,      authorInfo: { name: article.author, date: formatTime(article.ct, "-") },      cate: article.cate,      val:  article.type ? marked(article.val) : article.val,      commentInfoList: comments.comments || [],      flover: comments.flover,      views: comments.views || 0,      copyright,    });    WF(commentPath, comments);  });  // 其他页面渲染服务逻辑...  });};export default pageRenderRouter;

3、模版消费

这里给大家参考一个我写的 pug 页面的例子:tKL28资讯网——每日最新资讯28at.com

tKL28资讯网——每日最新资讯28at.com

大家感兴趣的可以参考一下具体的实现:tKL28资讯网——每日最新资讯28at.com

https://github.com/MrXujiang/lowcode-cmstKL28资讯网——每日最新资讯28at.com

服务端架构设计

tKL28资讯网——每日最新资讯28at.com

服务端本质上主要实现两块能力:tKL28资讯网——每日最新资讯28at.com

  • 内容端页面渲染(SSR)
  • 后台API和三方接口服务对接

服务端我参考了通用后端服务的 MVC 模式, 基于 koa2 搭建了一个简易的服务端 MVC 模型, 如下是一个服务端的代码目录:tKL28资讯网——每日最新资讯28at.com

tKL28资讯网——每日最新资讯28at.com

主要实现的核心模块有:tKL28资讯网——每日最新资讯28at.com

  • 静态资源服务器
  • 微信分享, CDN上传等第三方服务模块
  • api路由
  • 中间件模块
  • 资源上传模块
  • 用户权限模块
  • ssr服务模块

如果搭建感兴趣可以参考 github 中具体的实现代码:https://github.com/MrXujiang/lowcode-cmstKL28资讯网——每日最新资讯28at.com

管理端系统架构设计

tKL28资讯网——每日最新资讯28at.com

tKL28资讯网——每日最新资讯28at.com

管理端采用的是 umi + react + antd4.0 实现的, 当然封装了很多成熟的插件模块, 比如说 富文本编辑器, md编辑器, 文件上传模块等, 大家可以在学习源码的过程中受益非浅。tKL28资讯网——每日最新资讯28at.com

tKL28资讯网——每日最新资讯28at.com

上图就是编辑模块, 我封装了实时预览 md 和富文本的模块, 大家可以拿来即用。tKL28资讯网——每日最新资讯28at.com

本地运行

1、目录介绍

  • server 基于nodejs的服务端, 启动后可直接访问3000 端口, 也就是内容SSR端。
  • admin CMS的管理后台, 集成了用户管理, 内容审核, 内容发布, 数据统计等模块。

开箱即用~~tKL28资讯网——每日最新资讯28at.com

2、本地启动

server端:tKL28资讯网——每日最新资讯28at.com

# 进入server目录cd server# 安装依赖yarn# 服务端启动yarn start

注: 如果是window系统, 可以执行 yarn start:win。tKL28资讯网——每日最新资讯28at.com

管理端:tKL28资讯网——每日最新资讯28at.com

# 进入admin目录cd admin# 安装依赖yarn# 启动yarn start

初始化账号: super_123, 密码: zxzk_123。tKL28资讯网——每日最新资讯28at.com

内容端:tKL28资讯网——每日最新资讯28at.com

访问3000端口即可。tKL28资讯网——每日最新资讯28at.com

部署发布

推荐使用 pm2 来管理 Node 服务进程, 只需要把 server 端上传到服务器, 安装对应依赖, 用 pm2 启动即可:tKL28资讯网——每日最新资讯28at.com

pm2 start server/dist

有关 pm2 相关问题可以在我往期的文章中学习参考。tKL28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-67850-0.htmllowcode-cms开源社区源码设计分享

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 获取双异步返回值时,如何保证主线程不阻塞?

下一篇: 微软 Visual Studio 2022 获推 17.9 Preview 3 更新:增强代码搜索体验

标签:
  • 热门焦点
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • 女孩租房开2小时空调用完100元电费引热议:5级能耗惹不起 月薪过万电费也交不起

    近日,江苏苏州一女孩租房当天充值了100元电费,开着空调不到2小时发现电费已用完。对于为什么这个快,房东表示,电表坏了这种情况很多,之前也遇到过,给租客换
  • 如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • 谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌在KDD 2023发表了一篇工作,探索了推荐系统ranking模型的训练稳定性问题,分析了造成训练稳定性存在问题的潜在原因,以及现有的一些提升模型稳定性方法的不足,并提出了一种新
  • 微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己“当家”的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
  • 亲历马斯克血洗Twitter,硅谷的苦日子在后头

    文/刘哲铭  编辑/李薇  马斯克再次挥下裁员大刀。  美国时间11月14日,Twitter约4400名外包员工遭解雇,此次被解雇的员工的主要工作为内容审核等。此前,T
Top