【云岚到家】-day05-6-项目迁移-门户-CMS

news2024/11/15 12:17:37

【云岚到家】-day05-6-项目迁移-门户-CMS

  • 4 项目迁移-门户
    • 4.1 迁移目标
    • 4.2 能力基础
      • 4.2.1 缓存方案设计与应用能力
      • 4.2.2 静态化技术应用能力
    • 4.3 需求分析
      • 4.3.1 界面原型
    • 4.4 系统设计
      • 4.4.1 表设计
      • 4.4.2 接口与方案
        • 4.4.2.1 首页信息查询接口
        • 4.4.3.1 数据缓存方案
        • 4.4.3.2 页面静态化
    • 4.5 面试常见问题
  • 5 CMS系统
    • 5.1 迁移目标
    • 5.2 需求分析
      • 5.2.1 业务流程
      • 5.2.2 界面原型
      • 5.2.3 功能列表
    • 5.3 系统设计
      • 5.3.1 总体流程
      • 5.3.2 表设计
        • 5.3.2.1 菜单
        • 5.3.2.2 内容草稿
        • 5.3.2.3 正式内容
        • 5.3.2.4 内容回收站
        • 5.3.2.5 内容统计信息
        • 5.3.2.6 内容检索表
        • 5.3.2.7 SQl
      • 5.3.3 提交审核流程
      • 5.3.4 发布流程流程
      • 5.3.5 内容采用OSS存储
    • 5.4 面试常问问题


4 项目迁移-门户

4.1 迁移目标

项目中通过缓存技术实现了APP首页的信息查询,这是针对APP门户的技术方案。

除了APP门户还有PC门户,本次迁移目标的是理解PC门户的实现方案,理解CMS发布系统的技术方案。

门户是一个系统的入口,应用场景广泛,如下所示,通过本次迁移有能力设计APP门户及WEB PC门户的技术方案。

企业门户:包含员工手册、内部新闻、培训材料、公司政策等信息,同时提供员工自助服务和办公工具。
政府门户:政府门户网站提供政府机关和公共服务的信息和服务。包括公告、法规、政府项目、在线服务、税收信息等。
教育门户:提供学校和学区的信息。它可以包括课程表、学术成绩、教材信息、校园活动通知等。
新闻门户:新闻门户网站为用户提供最新的新闻、社论、评论、娱乐和体育等多种信息。用户可以通过新闻门户获取各种领域的资讯。

4.2 能力基础

4.2.1 缓存方案设计与应用能力

在门户中对信息查询类接口应用缓存提高查询效率。

我们可以参考第三章的内容进行缓存方案的设计,同时要避免高并发场景下缓存穿透、击穿、雪崩等问题,使用SpringCache等缓存框架操作缓存。

4.2.2 静态化技术应用能力

对于PC网站的门户页面通常需要使用静态化技术对网页静态化,避免每次请求动态数据,从而提高响应能力。

4.3 需求分析

4.3.1 界面原型

下边列出不同类型门户的界面原型:

系统类门户

在这里插入图片描述

在这里插入图片描述

资讯类门户

在这里插入图片描述

旅游门户

在这里插入图片描述

电商门户

在这里插入图片描述

4.4 系统设计

下边以界面原型中第一个系统类门户为例进行分析和设计 。

4.4.1 表设计

数据库表清单:

表名称表名存储内容
内容表content内容,包含新闻、广告、论坛、企业文化、审计公告、规章制度
员工自我介绍表staff_introduction未正式发布审核通过的内容均认为是草稿
消息统计表message_statistics用户消息统计表,主要统计员工待办任务数,未读邮件数等

表结构如下:

内容表:

名称数据类型是否可空主键长度描述
idbigintNOYES19
titlevarcharYESNO255标题
show_timedatetimeYESNO首页展示时间
typetinyintYESNO3内容类型,1:新闻,2:公告,3:论坛,4企业文化,5审计公告,6:规则制度
thumbnail_urlvarcharYESNO255缩略图
redirect_linksvarcharYESNO255跳转链接
content_pathvarcharYESNO255内容访问oss访问路径,内容非常占磁盘空间,采用廉价的oss可以降低成本
statusvarcharYESNO255内容状态,1:草稿,2:审核中,3:已发布,4:拒绝,5:隐藏,6:回收
release_typetinyintYESNO3发布类型,1:立即发布,2:定时发布
release_timedatetimeYESNO定时发布时该字段才有意义
recovery_timedatetimeYESNO回收时间,如果该时间存在到达该时间内容自动撤销,如果不存在该时间,需要手动撤销
recovery_typetinyintYESNO3回收类型,1:手动回收,2:定时回收
recyclerbigintYESNO19回收人id,后台管理员id
priorityintYESNO10优先级,数字越大优先级越高
visits_numintYESNO10访问人数
home_showbitYESNO1是否首页展示
liked_numintYESNO10点赞人数
create_timedatetimeYESNO创建时间
update_timedatetimeYESNO更新时间
create_bybigintYESNO19创建人id
update_bybigintYESNO19更新人id
is_deletedbitYESNO1逻辑删除

员工自我介绍表:

idbigintNOYES19主键id
staff_idbigintNONO19员工id
avatarvarcharYESNO255员工头像
namevarcharYESNO20员工姓名
introducevarcharYESNO255员工自我介绍
create_timedatetimeYESNO创建时间

消息统计表:

idbigintNOYES19员工id或后台管理员id
email_numintYESNO10未读邮件数量
to_do_task_numintYESNO10待办任务数量

sql语句:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for content
-- ----------------------------
DROP TABLE IF EXISTS `content`;
CREATE TABLE `content`  (
  `id` bigint(0) NOT NULL,
  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标题',
  `show_time` datetime(0) NULL DEFAULT NULL COMMENT '首页展示时间',
  `type` tinyint(0) NULL DEFAULT NULL COMMENT '内容类型,1:新闻,2:公告,3:论坛,4企业文化,5审计公告,6:规则制度',
  `thumbnail_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '缩略图',
  `redirect_links` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '跳转链接',
  `content_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '内容访问oss访问路径,内容非常占磁盘空间,采用廉价的oss可以降低成本',
  `status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '内容状态,1:草稿,2:审核中,3:已发布,4:拒绝,5:隐藏,6:回收',
  `release_type` tinyint(0) NULL DEFAULT NULL COMMENT '发布类型,1:立即发布,2:定时发布',
  `release_time` datetime(0) NULL DEFAULT NULL COMMENT '定时发布时该字段才有意义',
  `recovery_time` datetime(0) NULL DEFAULT NULL COMMENT '回收时间,如果该时间存在到达该时间内容自动撤销,如果不存在该时间,需要手动撤销',
  `recovery_type` tinyint(0) NULL DEFAULT NULL COMMENT '回收类型,1:手动回收,2:定时回收',
  `recycler` bigint(0) NULL DEFAULT NULL COMMENT '回收人id,后台管理员id',
  `priority` int(0) NULL DEFAULT 0 COMMENT '优先级,数字越大优先级越高',
  `visits_num` int(0) NULL DEFAULT NULL COMMENT '访问人数',
  `home_show` bit(1) NULL DEFAULT NULL COMMENT '是否首页展示',
  `liked_num` int(0) NULL DEFAULT NULL COMMENT '点赞人数',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  `create_by` bigint(0) NULL DEFAULT NULL COMMENT '创建人id',
  `update_by` bigint(0) NULL DEFAULT NULL COMMENT '更新人id',
  `is_deleted` bit(1) NULL DEFAULT NULL COMMENT '逻辑删除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Table structure for message_statistics
-- ----------------------------
DROP TABLE IF EXISTS `message_statistics`;
CREATE TABLE `message_statistics`  (
  `id` bigint(0) NOT NULL COMMENT '员工id或后台管理员id',
  `email_num` int(0) NULL DEFAULT NULL COMMENT '未读邮件数量',
  `to_do_task_num` int(0) NULL DEFAULT NULL COMMENT '待办任务数量',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '消息统计数据' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Table structure for staff_introduction
-- ----------------------------
DROP TABLE IF EXISTS `staff_introduction`;
CREATE TABLE `staff_introduction`  (
  `id` bigint(0) NOT NULL COMMENT '主键id',
  `staff_id` bigint(0) NOT NULL COMMENT '员工id',
  `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '员工头像',
  `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '员工姓名',
  `introduce` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '员工自我介绍',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '员工入职介绍' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

4.4.2 接口与方案

涉及的技术:spring、springboot、mybatis-plus、redis、mysql、freemarker

部分技术应用说明:

redis:主要解决信息缓存问题,使用redisTemplate进行缓存读写

阿里云oss:静态化界面、具体内容(例如公告、论坛、新闻的具体内容)

freemarker:用于将模板和数据加工处理成静态界面、以此来提高网站的性能

4.4.2.1 首页信息查询接口

接口名称:首页信息查询接口

接口场景:各种后端平台门户方案,多用于pc版以及公司的门户网站

接口路径:GET /home

请求参数:暂无

响应内容:内容列表信息,json格式,示例如下:

{
    "code": "200",
    "msg": "OK",
    "result": {
        "newsList":[{//新闻
            "id":"long,新闻内容id",
            "title":"string,新闻标题",
            "showTime":"string, 展示时间,前端根据自己格式转换",
            "thumbnailUrl":"string,缩略图""redirectLinks":"string,跳转链接"
        }],
        "commonNoticeList":[{//公告
            "id":"long,公告内容id",
            "title":"string,公告标题",
            "showTime":"string, 展示时间,前端根据自己格式转换",
            "thumbnailUrl":"string,缩略图""redirectLinks":"string,跳转链接"
        }],
        "forumList":[{//论坛
            "id":"long,论坛内容id",
            "title":"string,论坛标题",
            "showTime":"string, 展示时间,前端根据自己格式转换",
            "thumbnailUrl":"string,缩略图""redirectLinks":"string,跳转链接"
        }],
        "enterpriseCultureList":[{//企业文化
            "id":"long,企业文化内容id",
            "title":"string,企业文化标题",
            "showTime":"string, 展示时间,前端根据自己格式转换",
            "thumbnailUrl":"string,缩略图""redirectLinks":"string,跳转链接"
        }],
        "auditNoticeList":[{//审计公告
            "id":"long,审计公告内容id",
            "title":"string,审计公告标题",
            "showTime":"string, 展示时间,前端根据自己格式转换",
            "thumbnailUrl":"string,缩略图""redirectLinks":"string,跳转链接"
        }],
        "regulationList":[{//规则制度
            "id":"long,规则制度内容id",
            "title":"string,规则制度标题",
            "showTime":"string, 展示时间,前端根据自己格式转换",
            "thumbnailUrl":"string,缩略图""redirectLinks":"string,跳转链接"
        }]
        "message":{
            "todoTaskNum":"int,待办数量",
            "emailNum":"int,未读邮件数量"
        },
        "staffIntroductionList":[{ //员工自我介绍信息
            "id":"long,员工自我介绍信息id",
            "name":"string,员工姓名",
            "avatar":"string,员工头像",
            "createTime":"string,入职介绍时间"
            "introduce":"string,自我介绍"
        }]
    }
}
4.4.3.1 数据缓存方案

首页信息查询接口是一个查询接口,没有操作,所以我们只要考虑该接口的读取性能,即如何使首页访问起来更快,在这里我们选择压缩接口(所有信息汇总到一个接口)+缓存。

为什么这么设计呢?首先我们需要缓存的数据是有限的(我们是一个企业内部服务用户量有限),二是我们的信息变换没有那么频繁。

而考虑到缓存我们就要考虑另一个问题了,该如何做缓存。把所有信息集中缓存可以吗?显而易见是有问题的,首页当中有一项是消息,每个人的消息是不一样的,所以,首页中的数据有一部分是公共的例如新闻、公告等,另一些信息是用户独有的,例如待办数量、邮件数量。

所以我们将数据拆分保存,存储结构设计如下:

在这里插入图片描述

公共信息:每个用户看到的都一样,而且变化不大,我们采用String数据结构,使用起来方便简单,所有信息一起生效和失效,对性能影响不大

个性化信息:消息数量,每个用户的数据都是不一样的,每个用户不止有一项数据,我们采用hash结构,每个用户一个Hash,方便数据变更,一次性读取。

4.4.3.2 页面静态化

页面静态化是一种优化网站性能和提高加载速度的策略,它的核心思想是将动态生成的页面内容事先生成并存储为静态文件,而不是每次用户请求时都动态生成页面。这有助于减轻服务器负担,提高页面响应速度。

页面静态化技术通常用于web PC网站,对于一些信息变化不频繁且访问量大的页面使用页面静态化技术:

示例如下:

门户页面

新闻详情页面

订单详情页面

商品详情页面

在本例中,对公告页面进行静态化,门户页面进行静态化、新闻页面静态化。

上述功能可以通过CMS系统实现。详细见CMS系统。

CMS系统用到了页面静态化技术,比如:velocity 、freemarker等,可进行自学,静态化技术入门视频:

静态化技术学习入口

页面静态化后需要上传到文件系统,比如:阿里云的OSS、腾讯云的CFS等。

也可以自行搭建,比如使用开源的minio实现。

minio的使用视频:minio学习入口

4.5 面试常见问题

  1. 首页如何优化

    1)、减少接口的数量,将多个信息汇总的一个接口中

    2)、使用缓存减少直接读取数据库次数

    3)、使用mysql覆盖索引进行查询,避免回表查询,提高mysql查询的效率

  2. redis缓存为什么分别采用String和Hash两种数据结构

    我们系统使用String结构存储了公共信息,使用Hash结构存储了个性化信息。

    公共信息特点:

    1)、每个人看到的都一样,没有区别;2)、更新频率低;3)、实时性要求低

    个性化信息:

    1)、每个人都是独享的;2)、信息变更频率高,数据不会一起变更;3)、实时性要求高

​ 针对公共信息我们采用了String结构,变更次数少可以使用一个字符串解决,读取方便简单;针对个性化信息我们采用Hash结构,变更次数多,每个员工都有一条数据,用户间变更不受影响;每个用户都有多个hashKey,不同数据间更新不受影响,还能一次性读出所有数据,操作简单。

5 CMS系统

5.1 迁移目标

在门户中用到了CMS系统。

CMS(内容管理系统)在各种场景中都有广泛的应用,主要因为它们能够简化和优化内容的创建、编辑、发布和管理过程,提高网站或应用的运营效率。以下是一些常见的CMS系统应用场景:

  1. 博客和个人网站:

    个人博客和网站是CMS系统最早和最常见的应用场景之一。CMS系统可以让个人用户轻松地创建和更新博文,管理页面内容,展示个人作品或生活日志。

  2. 企业网站:

    企业使用CMS系统来创建和维护公司网站,包括企业介绍、产品展示、新闻发布、招聘信息等。CMS使企业能够快速更新网站内容,保持与市场变化的同步。

  3. 新闻门户:

    新闻网站和在线媒体使用CMS系统来管理和发布新闻、文章、图片和视频。CMS系统的多用户支持和版本控制功能有助于团队协作和内容管理。

  4. 餐饮和旅游网站:

    餐饮和旅游行业使用CMS系统来管理菜单、酒店信息、旅游路线等内容。CMS系统使企业能够灵活地更新和调整业务信息。

本次迁移的目标是认识CMS系统的工作流程,理解它的技术方案,在内容管理及内容发布的场景中使用CMS系统或者使用其技术方案。

5.2 需求分析

下述产品为一个内容社区的后台CMS系统

5.2.1 业务流程

在这里插入图片描述

5.2.2 界面原型

在这里插入图片描述

编辑页

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.2.3 功能列表

在这里插入图片描述

5.3 系统设计

5.3.1 总体流程

在这里插入图片描述

编写内容:保存到草稿表,状态为:草稿

提交审核:更新草稿表状态为审核中,将内容生成html静态页面上传到OSS。

审核失败:内容状态为已拒绝

审核通过:内容状态为已发布,将草稿中的内容保存到内容表及内容检索表,对内容检索信息进行分词同步索引到ES中,此时用户可以搜索到内容并查看。

下线:内容状态为隐藏,删除内容检索信息记录,通过Canal+MQ将ES中的索引删除。

删除:写入回收表,内容状态为回收,删除内容检索信息记录,通过Canal+MQ将ES中的索引删除,并且删除OSS中的静态文件。

5.3.2 表设计

CMS发布模块表清单:

mysql表:

表名称表名存储内容
菜单menus内容导航菜单,多级菜单:新闻–>军事
内容草稿content_draft未正式发布审核通过的内容均认为是草稿
正式内容content已经审核通过的内容
内容回收站content_recycle删除的内容
内容统计信息content_statistics对内容的点赞、踩赞、访问量进行统计

elasticsearch表:

表名称表名存储内容
内容检索表content_search内容检索表

表结构如下:

5.3.2.1 菜单
名称数据类型允许为空主键长度字段描述
idbigintNOYES19菜单id
namevarcharYESNO50菜单名称
parent_idbigintYESNO19父菜单id
menu_descvarcharYESNO255菜单描述
statusintYESNO10菜单状态,1:已上架,2:已下架
menu_levelintYESNO10菜单级别,1:一级菜单,2:二级菜单
create_timedatetimeYESNO创建时间
update_timedatetimeYESNO更新时间
create_bybigintYESNO19创建人,后台人员id
update_bybigintYESNO19更新人,后台人员id
5.3.2.2 内容草稿
名称数据类型允许为空主键长度字段描述
idbigintNOYES19内容id
titlevarcharYESNO255内容标题
menu_id_1bigintYESNO19一级菜单id
menu_id_2bigintYESNO19二级菜单id
content_pathvarcharNONO255内容访问oss访问path,内容非常占磁盘空间,采用廉价的oss可以降低成本
thumbnail_urlvarcharYESNO255缩略图url
priceintYESNO10价格,单位分
redirect_linksvarcharYESNO255跳转链接
seo_titlevarcharYESNO50检索标题
key_wordvarcharYESNO255检索关键字
search_descvarcharYESNO255检索描述
anonymous_visitbitYESNO1是否支持匿名访问
allow_evaluatebitYESNO1是否允许评价
release_typeintYESNO10发布类型,1:立即发布,2:定时发布
schedule_release_timedatetimeYESNO定时发布时间
statusintYESNO10内容状态,1:草稿,2:审核中,4:拒绝
reject_reasonvarcharYESNO255审核拒绝原因
create_timedatetimeYESNO创建时间
update_timedatetimeYESNO更新时间
create_bybigintYESNO19创建人id
update_bybigintYESNO19更新人id
is_deletedbitYESNO1逻辑删除
5.3.2.3 正式内容
名称数据类型允许为空主键长度字段描述
idbigintNOYES19内容id
titlevarcharYESNO255内容标题
menu_id_1bigintYESNO19一级菜单id
menu_id_2bigintYESNO19二级菜单id
thumbnail_urlvarcharYESNO255缩略图url
content_pathvarcharNONO255内容访问oss访问path,内容非常占磁盘空间,采用廉价的oss可以降低成本
priceintYESNO10价格,单位分
redirect_linksvarcharYESNO255跳转链接
seo_titlevarcharYESNO50检索标题
key_wordvarcharYESNO255检索关键字
search_descvarcharYESNO255检索描述
anonymous_visitbitYESNO1是否支持匿名访问
allow_evaluatebitYESNO1是否允许评价
statusintYESNO10内容状态,:3:已发布,5:隐藏
release_timedatetimeYESNO发布时间
content_create_timedatetimeYESNO内容的创建时间
create_timedatetimeYESNO创建时间
update_timedatetimeYESNO更新时间
create_bybigintYESNO19创建人id
update_bybigintYESNO19更新人id
5.3.2.4 内容回收站
名称数据类型允许为空主键长度字段描述
idbigintNOYES19内容id
titlevarcharYESNO255内容标题
menu_id_1bigintYESNO19一级菜单id
menu_id_2bigintYESNO19二级菜单id
thumbnail_urlvarcharYESNO255缩略图url
content_pathvarcharNONO255内容访问oss访问path,内容非常占磁盘空间,采用廉价的oss可以降低成本
priceintYESNO10价格,单位分
redirect_linksvarcharYESNO255跳转链接
seo_titlevarcharYESNO50检索标题
key_wordvarcharYESNO255检索关键字
search_descvarcharYESNO255检索描述
anonymous_visitbitYESNO1是否支持匿名访问
allow_evaluatebitYESNO1是否允许评价
statusintYESNO10内容状态,6:回收
release_timedatetimeYESNO发布时间
content_create_timedatetimeYESNO内容的创建时间
create_timedatetimeYESNO创建时间
update_timedatetimeYESNO更新时间
create_bybigintYESNO19创建人id
update_bybigintYESNO19更新人id
5.3.2.5 内容统计信息
名称数据类型允许为空主键长度字段描述
idbigintNOYES19内容id
visits_numintYESNO10浏览量
evaluation_numintYESNO10评论数
liked_numintYESNO10点赞数
disliked_numintYESNO10踩赞数
5.3.2.6 内容检索表
名称数据类型字段描述
idlong内容id
key_wordstext浏览量,进行分词
titletext内容标题,进行分词
menu_id_1long一级菜单
menu_id_2long二级菜单
statusint内容状态:1:草稿,2:审核中,3:已发布,4:拒绝,5:隐藏,6:回收
priceint价格
release_timeint发布时间,10位数字时间戳,秒级
static_urltext静态化后,页面访问地址
update_timeint变更时间,10位数字时间戳,秒级
5.3.2.7 SQl
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for content
-- ----------------------------
DROP TABLE IF EXISTS `content`;
CREATE TABLE `content`  (
  `id` bigint(0) NOT NULL COMMENT '内容id',
  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '内容标题',
  `menu_id_1` bigint(0) NULL DEFAULT NULL COMMENT '一级菜单id',
  `menu_id_2` bigint(0) NULL DEFAULT NULL COMMENT '二级菜单id',
  `content_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '内容访问oss访问路径,内容非常占磁盘空间,采用廉价的oss可以降低成本',
  `thumbnail_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '缩略图url',
  `price` int(0) NULL DEFAULT NULL COMMENT '价格,单位分',
  `redirect_links` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '跳转链接',
  `seo_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '检索标题',
  `key_word` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '检索关键字',
  `search_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '检索描述',
  `anonymous_visit` bit(1) NULL DEFAULT b'1' COMMENT '是否支持匿名访问',
  `allow_evaluate` bit(1) NULL DEFAULT b'1' COMMENT '是否允许评价',
  `static_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '静态化后,页面访问地址',
  `status` int(0) NULL DEFAULT NULL COMMENT '内容状态,3:已发布,5:隐藏',
  `release_time` datetime(0) NULL DEFAULT NULL COMMENT '发布时间',
  `content_create_time` datetime(0) NULL DEFAULT NULL COMMENT '内容的创建时间',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  `create_by` bigint(0) NULL DEFAULT NULL COMMENT '创建人id',
  `update_by` bigint(0) NULL DEFAULT NULL COMMENT '更新人id',
  `is_deleted` bit(1) NULL DEFAULT NULL COMMENT '逻辑删除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '内容' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Table structure for content_draft
-- ----------------------------
DROP TABLE IF EXISTS `content_draft`;
CREATE TABLE `content_draft`  (
  `id` bigint(0) NOT NULL COMMENT '内容id',
  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '内容标题',
  `menu_id_1` bigint(0) NULL DEFAULT NULL COMMENT '一级菜单id',
  `menu_id_2` bigint(0) NULL DEFAULT NULL COMMENT '二级菜单id',
  `content_path` varchar(0) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '内容访问oss访问路径,内容非常占磁盘空间,采用廉价的oss可以降低成本',
  `thumbnail_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '缩略图url',
  `price` int(0) NULL DEFAULT NULL COMMENT '价格,单位分',
  `redirect_links` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '跳转链接',
  `seo_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '检索标题',
  `key_word` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '检索关键字',
  `search_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '检索描述',
  `anonymous_visit` bit(1) NULL DEFAULT b'1' COMMENT '是否支持匿名访问',
  `allow_evaluate` bit(1) NULL DEFAULT b'1' COMMENT '是否允许评价',
  `release_type` int(0) NULL DEFAULT NULL COMMENT '发布类型',
  `schedule_release_time` datetime(0) NULL DEFAULT NULL COMMENT '定时发布时间',
  `status` int(0) NULL DEFAULT NULL COMMENT '内容状态,1:草稿,2:审核中,4:拒绝',
  `reject_reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '拒绝理由',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  `create_by` bigint(0) NULL DEFAULT NULL COMMENT '创建人id',
  `update_by` bigint(0) NULL DEFAULT NULL COMMENT '更新人id',
  `is_deleted` bit(1) NULL DEFAULT NULL COMMENT '逻辑删除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '内容草稿' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Table structure for content_recycle
-- ----------------------------
DROP TABLE IF EXISTS `content_recycle`;
CREATE TABLE `content_recycle`  (
  `id` bigint(0) NOT NULL COMMENT '内容id',
  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '内容标题',
  `menu_id_1` bigint(0) NULL DEFAULT NULL COMMENT '一级菜单id',
  `menu_id_2` bigint(0) NULL DEFAULT NULL COMMENT '二级菜单id',
  `content_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '内容访问oss访问路径,内容非常占磁盘空间,采用廉价的oss可以降低成本',
  `thumbnail_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '缩略图url',
  `price` int(0) NULL DEFAULT NULL COMMENT '价格,单位分',
  `redirect_links` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '跳转链接',
  `seo_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '检索标题',
  `key_word` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '检索关键字',
  `search_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '检索描述',
  `anonymous_visit` bit(1) NULL DEFAULT b'1' COMMENT '是否支持匿名访问',
  `allow_evaluate` bit(1) NULL DEFAULT b'1' COMMENT '是否允许评价',
  `static_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '静态化后,页面访问地址',
  `status` int(0) NULL DEFAULT NULL COMMENT '内容状态,6:回收',
  `release_time` datetime(0) NULL DEFAULT NULL COMMENT '发布时间',
  `content_create_time` datetime(0) NULL DEFAULT NULL COMMENT '内容的创建时间',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  `create_by` bigint(0) NULL DEFAULT NULL COMMENT '创建人id',
  `update_by` bigint(0) NULL DEFAULT NULL COMMENT '更新人id',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '内容' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Table structure for content_statistics
-- ----------------------------
DROP TABLE IF EXISTS `content_statistics`;
CREATE TABLE `content_statistics`  (
  `id` bigint(0) NOT NULL COMMENT '内容id',
  `visits_num` int(0) NULL DEFAULT 0 COMMENT '浏览量',
  `evaluation_num` int(0) NULL DEFAULT NULL COMMENT '评论数',
  `liked_num` int(0) NULL DEFAULT NULL COMMENT '点赞数',
  `disliked_num` int(0) NULL DEFAULT NULL COMMENT '踩赞数',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '内容统计信息' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Table structure for menus
-- ----------------------------
DROP TABLE IF EXISTS `menus`;
CREATE TABLE `menus`  (
  `id` bigint(0) NOT NULL COMMENT '菜单id',
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '菜单名称',
  `parent_id` bigint(0) NULL DEFAULT NULL COMMENT '父菜单id',
  `menu_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '菜单描述',
  `status` int(0) NULL DEFAULT NULL COMMENT '菜单状态,1:已上架,2:已下架',
  `menu_level` int(0) NULL DEFAULT NULL COMMENT '菜单级别,1:一级菜单,2:二级菜单,3:三级菜单',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  `create_by` bigint(0) NULL DEFAULT NULL COMMENT '创建人,后台人员id',
  `update_by` bigint(0) NULL DEFAULT NULL COMMENT '更新人,后台人员id',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '菜单' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

5.3.3 提交审核流程

提交审核后进行以下操作:

草稿中的内容状态为:审核中

将内容生成html上传到OSS并将文件地址保存到数据库

在这里插入图片描述

本流程首先将内容写入内容检索表,再通过Canal+MQ将内容检索信息同步到ES中、并且生成静态文件上传到OSS,将OSS的地址更新到草稿表中,最后更新草稿表的状态,Canal+MQ是家政项目的数据同步方案。

流程中的步骤跨越多个服务:上传文件到OSS、同步索引到ES,更新数据库,这里构成了分布式事务。

基于Canal+MQ的机制解决了分布式事务的:

首先向内容检索表写入记录,Canal读取binlog日志写入MQ。

消费程序监听MQ,拿到消息开始执行以下任务:

生成静态文件上传到OSS

同步索引到ES

更新草稿表的状态及OSS地址。

这三步有一步失败会导致整个执行过程异常,执行失败则MQ中的消息不会删除,通过重试来保证三步工作最终全部成功。

当达到重试次数还没有成功,失败消息会进入失败队列,由单独的处理程序进行处理,实现最终数据一致性。

5.3.4 发布流程流程

审核通过内容自动发布,将内容检索信息同步到 ES中,此时内容被搜索出来,用户点击查看内容。

在这里插入图片描述

说明:

本流程前三步通过本地事务控制,保证内容正式表、内容检索表和删除草稿同时成功或同时失败,再通过Canal+MQ将内容检索信息同步到ES中。这里使用了家政项目的数据同步方案。

5.3.5 内容采用OSS存储

内容详细信息没有使用传统的数据库存储,而存储到分布式文件系统,项目选择了阿里云oss有两个原因:

  1. 内容详细信息通常是文章、咨询、新闻等,通常占用空间都是比较大,如果存储在mysql或者elsaticsearch不但会降低性能,它们的存储成本也是很高的,而阿里云oss是价格低廉的。

  2. 内容发布采用了freemarker静态化,c端用户请求OSS访问静态页面,提高访问性能。

也可以自行搭建分布式文件系统,比如使用开源的minio实现。

minio的使用视频:https://www.bilibili.com/video/BV1j8411N7Bm?p=62&vd_source=81d4489ba9312103debc8ee843169f23

5.4 面试常问问题

  1. 为什么要做静态化

    CMS(内容管理系统)中的页面静态化是一种常见的性能优化手段,这样做有以下几个优点

    1)、提高页面加载速度:静态页面可以直接由Web服务器提供,无需在每次请求时动态生成。这消除了服务器端处理的开销,使页面加载速度更快。快速的页面加载对于提升用户体验、降低跳出率很重要。

    2)、减轻服务器压力:静态页面不需要在每次请求时动态生成,这意味着服务器端的计算资源可以更有效地分配给其他任务。特别是在面对高流量时,静态页面的缓存和提供速度更高效。

    3)、SEO优化:静态页面更有利于搜索引擎优化(SEO)。搜索引擎爬虫更容易理解和索引静态页面,因为它们不需要执行JavaScript或处理动态内容。静态页面有助于提高网站的搜索引擎排名。

    4)、降低数据库访问:动态生成的页面通常需要访问数据库来检索内容。将页面静态化后,可以大幅减少对数据库的访问,降低数据库的负担,提高数据库性能。

    5)、CDN缓存优化:静态页面更容易在内容分发网络(CDN)中进行缓存。CDN可以将静态资源分发到全球多个节点,提供更快的访问速度,同时减轻源服务器的负担。

    6)、稳定性和可靠性:静态页面不涉及动态生成和复杂的业务逻辑,因此在技术上更为简单,更容易维护和部署。这提高了系统的稳定性和可靠性

  2. 静态化适合哪些场景

    静态化适用于多种场景,尤其在需要提高性能、降低服务器负担、改善用户体验以及增强网站安全性等方面,静态化技术都能发挥重要作用。以下是一些适合使用静态化的场景:

    1)、内容不经常变动: 静态化适用于内容相对稳定,不经常变动的网站。例如,企业官方网站的首页、产品介绍页等静态信息。

    2)、博客和新闻网站: 对于博客文章和新闻内容,如果这些内容不需要频繁更新,可以将其静态化,提高页面加载速度,减轻服务器压力。

    3)、产品目录和商品详情页: 电商网站的产品目录和商品详情页通常是相对固定的,可以通过静态化来提高用户访问体验。

    4)、营销活动页面: 静态化适用于营销活动的临时页面,这些页面一般不需要频繁修改,但需要在短时间内迎接大量访问。

    5)、信息展示型网站: 对于那些主要用于信息展示,而非交互性强的网站,静态化是一种有效的优化手段。

    6)、高并发场景: 在高并发的情况下,静态化可以显著减轻服务器负担,提高网站的稳定性和响应速度。

    7)、CDN缓存优化: 静态页面更容易在内容分发网络(CDN)中进行缓存,提高全球范围内的访问速度。

    8)、资源文件静态化: 将CSS、JavaScript和图片等静态资源进行静态化,可以通过CDN进行分发,提高加载速度。

  3. 如何确保mysql、elasticsearch数据的一致性

    mysql和elasticsearch之间通过rabbitmq进行数据同步,保证数据完整有序更新是保证数据一致性的关键。

    1)、rabbitmq消息发送失败需要持久化,在mysql中创建一个异步消息失败表结合xxl-job定时重试异常失败消息

    2)、rabbitmq消息处理异常且多次重试后,将消息写入异常处理队列,通过失败处理程序主动拉取rabbitmq异常消息进行处理

    3)、数据同步的顺序性如何保证,即先修改为1,再修改为2,最终同步到ES中的数据必须是最后一次修改的数据。

    两种方案:

    使用单线程消费。

    基于乐观锁机制,每次变更数据增加版本号,更新数据前比较版本号,如果更新数据的版本号与当前数据版本号不一致则不处理。

  4. 你还知道CMS哪些优化手段

    优化内容管理系统(CMS)是确保网站性能、用户体验和搜索引擎优化的关键一步

    1)、异步加载: 使用异步加载技术,将页面中的一些资源(如JavaScript文件)设为异步加载,以避免阻塞页面渲染,提高页面加载速度。

    2)、Lazy Loading: 对于图片和其他媒体资源,使用延迟加载(Lazy Loading)技术,只在用户滚动到页面上需要时才加载这些资源,而不是一次性加载整个页面。

    3)、优化前端资源: 精简和优化CSS、JavaScript和HTML文件,删除不必要的空格、注释和缩进。使用压缩工具来减小文件大小,减少加载时间。

    4)、使用浏览器缓存: 配置服务器以启用浏览器缓存,减少用户重复访问时需要重新下载的资源,从而提高加载速度。

    5)、CDN优化: 配置CDN以确保它有效地缓存和分发静态资源,提高网站的全球访问速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1925204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++相关概念和易错语法(20)(赋值兼容转换、多继承、继承与组合)

1.赋值兼容转换 赋值兼容转换有一点易混&#xff0c;先看一下下面的代码&#xff0c;想想a、b、c对象里面存的什么&#xff0c;顺便结合以前的知识&#xff0c;对继承加深理解。 #include <iostream> using namespace std;class A { protected:A(int a):_a(a){}int _a; …

PostgreSQL 中如何解决因频繁的小事务导致的性能下降?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中解决因频繁小事务导致性能下降的方法 PostgreSQL 中解决因频繁小事务导致性能下降的方法…

使用机器学习 最近邻算法(Nearest Neighbors)进行点云分析 (scikit-learn Open3D numpy)

使用 NearestNeighbors 进行点云分析 在数据分析和机器学习领域&#xff0c;最近邻算法&#xff08;Nearest Neighbors&#xff09;是一种常用的非参数方法。它广泛应用于分类、回归和聚类分析等任务。下面将介绍如何使用 scikit-learn 库中的 NearestNeighbors 类来进行点云数…

C++ | Leetcode C++题解之第233题数字1的个数

题目&#xff1a; 题解&#xff1a; class Solution { public:int countDigitOne(int n) {// mulk 表示 10^k// 在下面的代码中&#xff0c;可以发现 k 并没有被直接使用到&#xff08;都是使用 10^k&#xff09;// 但为了让代码看起来更加直观&#xff0c;这里保留了 klong l…

优化器算法

优化器算法 梯度下降算法 首先引用动手学深度学习中对梯度下降算法的直观理解与推导。说明了不断的迭代可能会使得f(x)的值不断下降&#xff0c;从直观上解释了梯度下降的可能性。 将损失函数在x点处一阶泰勒展开。 f ( x ϵ ) f ( x ) ϵ f ′ ( x ) O ( ϵ 2 ) . f(x\eps…

在InternStudio上创建一台GPU服务器

填写配置 创建完成 ssh连接&#xff0c;并测试常用指令 查看开发机信息 查看gpu信息 创建conda环境 跑个test

可重入锁深入学习(有码)

【摘要】 ​今天&#xff0c;梳理下java中的常用锁&#xff0c;但在搞清楚这些锁之前&#xff0c;先理解下 “临界区”。临界区在同步的程序设计中&#xff0c;临界区段活称为关键区块&#xff0c;指的是一个访问共享资源&#xff08;例如&#xff1a;共享设备或是共享存储器&a…

9. Python的魔法函数

Python中的魔法函数 在Python中魔法函数是在为类赋能&#xff0c;使得类能够有更多操作。通过重写类中的魔法函数&#xff0c;可以完成很多具体的任务 1. __str__ 通过str魔法函数&#xff0c;可以设置对类的实例的 print() 内容 2. __len__ 通过len魔法函数&#xff0c;可…

tessy 集成测试:小白入门指导手册

目录 1,创建集成测试模块且分析源文件 2,设置测试环境 3,TIE界面设置相关函数 4,SCE界面增加用例 5,编辑数据 6,用例所对应的测试函数序列 7,添加 work task 函数 8,为测试场景添加函数 9,为函数赋值 10,编辑时间序列的数值 11,执行用例 12,其他注意事项…

计算机毕设:服装购物管理系统(Java+Springboot+MySQL+Tomcat),完整源代码+数据库+毕设文档+部署说明

本文关键字&#xff1a;Java编程&#xff1b;Springboot框架&#xff1b;毕业设计&#xff1b;毕设项目&#xff1b;编程实战&#xff1b;医护人员管理系统&#xff1b;项目源代码&#xff1b;程序数据库&#xff1b;毕设文档&#xff1b;项目部署说明&#xff1b; 一、项目说…

Java中JUC包详解

文章目录 J.U.C.包LockReadWriteLockLockSupportAQSReentrantLock对比synchronized加锁原理释放锁原理 CountDownLatchCyclicBarrierSemaphore J.U.C.包 java.util.concurrent&#xff0c;简称 J.U.C.。是Java并发工具包&#xff0c;提供了在多线程编程中常用的工具类和框架&a…

实战检验:Orange Pi AIpro AI开发板的性能测试与使用体验

文章目录 前言Orange Pi AIpro 简介Orange Pi AIpro 体验将Linux镜像烧录到TF卡YOLO识别视频中物体肺部CT识别 Orange Pi AIpro 总结 前言 Orange Pi AIpro&#xff0c;作为首款基于昇腾技术的AI开发板&#xff0c;它集成了高性能图形处理器&#xff0c;配备8GB/16GB LPDDR4X内…

MySQL复合查询(重点)

前面我们讲解的mysql表的查询都是对一张表进行查询&#xff0c;在实际开发中这远远不够。 基本查询回顾 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为大写的J mysql> select * from emp where (sal>500 or jobMANAGER) and ename l…

强化学习:bellman方程求解state value例题

最近在学习强化学习相关知识&#xff0c;强烈推荐西湖大学赵世钰老师的课程&#xff0c;讲解的非常清晰流畅&#xff0c;一路学习下来令人身心大爽&#xff0c;感受数学抽丝剥茧&#xff0c;化繁为简的神奇魅力。 bellman方程还是比较容易理解的&#xff1a;当前状态下的state …

嵌入式linux系统中GDB调试器详解

前言 GDB全称GNU symbolic debugger,它是诞生于GNU开源组织的(同时诞生的还有 GCC、Emacs 等)UNIX及UNIX-like下的调试工具,是Linux下最常用的程序调试器,GDB 支持调试多种编程语言编写的程序,包括C、C++、Go、Objective-C、OpenCL、Ada 等。但是在实际应用中,GDB 更常…

linux_进程周边知识——理解冯诺依曼体系结构

前言&#xff1a; 本篇内容是为了让友友们较好地理解进程的概念&#xff0c; 而在真正了解进行概念之前&#xff0c; 要先了解一下冯诺依曼体系结构。 所以博主会先对冯诺伊曼体系结构进行解释&#xff0c; 然后再讲解进程的概念。 ps&#xff1a; 本篇内容适合了解一些linux指…

github中下载zip后,本地仓库如何与github上的项目相关联

有时候网速问题&#xff0c;git clone 太慢&#xff0c;就直接下载zip文件&#xff0c;然后再进行关联 1、下载zip 2、解压&#xff0c;把文件夹名称中-main去掉 3、进行关联 cd <repo> git init git add . git remote add origin https://github.com/<user>/&l…

springboot在线教育平台-计算机毕业设计源码68562

摘要 在数字化时代&#xff0c;随着信息技术的飞速发展&#xff0c;在线教育已成为教育领域的重要趋势。为了满足广大学习者对于灵活、高效学习方式的需求&#xff0c;基于Spring Boot的在线教育平台应运而生。Spring Boot以其快速开发、简便部署以及良好的可扩展性&#xff0c…

第一个基于FISCOBCOS的前后端项目(发行转账)(已开源)

本文旨在介绍一个简单的基于fiscobcos的前后端网站应用。Springbootjs前后端不分离。 所使用到的合约也是一个最基本的。首先您需要知道的是完整项目分为三部分&#xff0c;1是区块链平台webase搭建&#xff08;此项目使用节点前置webase-front即可&#xff09;&#xff0c;2是…

帕金森病患者在日常饮食中需要注意哪些特殊的营养需求?

帕金森病患者的特殊营养需求 帕金森病患者在日常饮食中需要特别注意以下几个方面的营养需求&#xff1a; 蛋白质摄入&#xff1a;由于帕金森病药物可能与蛋白质竞争同一种转运蛋白进入大脑&#xff0c;因此建议将蛋白质的摄入量分散在一天中的多餐中&#xff0c;避免集中在单一…