当前位置: 首页 > news >正文

【Python使用】嘿马云课堂web完整实战项目第2篇:CMS页面管理需求,后端工程搭建【附代码文档】

教程总体简介:项目概述 项目背景 项目的功能构架 项目的技术架构 CMS 什么是CMS CMS需求分析与工程搭建 静态门户工程搭建 SSI服务端包含技术 页面预览开发 4 添加“页面预览”链接 页面发布 需求分析 技术方案 测试 环境搭建 数据字典 服务端 前端 数据模型 页面原型 前端页面 上传图片开发 前端开发 图片查询 静态页面测试 CMS页面预览测试 CMS添加页面接口 搜索服务 搭建ES环境 后端工程搭建 导入CMS数据库 MongoEngine入门 在Django中使用MongoDB 定义文档 Logstash创建索引 创建搜索应用 定义ESClient 搜索前端技术需求 了解SEO 服务端渲染和客户端渲染 Nuxt.js入门 创建Nuxt工程 页面布局 路由 获取数据 搜索页面 查询全部 分页查询 按分类搜索 按难度等级搜索 集成测试 在线学习与媒资管理 在线学习需求分析 需求描述 视频点播解决方案 视频编码 FFmpeg的基本使用 生成m3u8/ts文件 播放器 搭建学习中心前端 媒资管理 开发环境 上传文件 断点续传解决方案 文件分块与合并 媒资服务端编写 视频处理 发送视频处理消息 我的媒资 选择视频 保存视频信息 Api接口 学习页面获取视频播放地址 在线学习接口 登录注册与认证授权 增加数据 修改数据 删除数据 查询数据 Q对象 其他 查询集 QuerySet 页面管理后端开发 接口说明 接口开发规范 JWT Django REST framework JWT 用户登录前端 前端显示当前用户 用户退出 前端集成认证授权 用户注册后端 订单与选课 分布式事务 问题描述 CAP理论 解决方案 自动添加选课方案 Celery Beat定时任务 订单服务定时发送消息 查询前N条任务 乐观锁取任务 RabbitMQ配置 学习服务添加选课 订单服务结束任务 传智云课堂 封装异常处理 封装JSON返回值 站点列表和模板列表接口 新增页面 页面查询接口定义 自定义条件查询 3 测试接口 页面详情 修改页面 删除页面 CMS前端工程创建 导入系统管理前端工程 单页面应用介绍 CMS前端页面查询开发 创建页面 Table组件测试 页面内容完善 跨域问题解决 进入页面立即查询 前后端请求响应流程小结 新增页面前端开发 页面处理流程 页面静态化及预览发布 页面静态化需求 模板管理 模板管理业务流程 模板制作 GridFS研究 模板存储

完整笔记资料代码:https://gitee.com/yinuo112/Backend/tree/master/Python/嘿马云课堂web完整实战项目/note.md

感兴趣的小伙伴可以自取哦~


全套教程部分目录:


部分文件图片:

CMS页面管理需求

学习目标

  • 了解CMS系统中对页面管理的流程
  • 了解本项目CMS实现功能

1 页面管理流程

在CMS系统中,对页面管理的流程是怎样的呢?

1、创建站点:

​ 一个网站有很多子站点,比如:传智云课堂有主门户、学习中心、搜索等子站点。某个具体的页面是归属于具体的站点,所以要管理页面,先要管理页面所属的站点。

2、创建模板:

​ 页面如何创建呢?比如电商网站的商品详情页面,每个页面的内容布局、版式是相同的,不同的只是内容,这个页面的布局、版式就是页面模板,模板+数据就组成一个完整的页面。要创建一个页面文件,需要先定义此页面的模板,然后拿到页面的数据;最终将页面数据与模板结合(渲染)就拼装成一个完整的页面。

3、创建页面:

​ 创建页面是指填写页面的基本信息,如:页面的名称、页面的url地址等。

4、页面预览:

​ 页面预览是页面发布前的一项工作,页面预览使用静态化技术根据页面模板和数据生成页面内容,并通过浏览器预览页面。页面发布前进行页面预览的目是为了保证页面发布后的正确性。

5、页面发布:

​ 将页面发送到页面所在站点的服务器,页面发布成功就可以通过浏览器来访问了。

2 本项目CMS实现功能

1、页面管理

管理员在后台添加、修改、删除页面信息

2、页面预览

管理员通过页面预览功能预览页面发布后的效果。

3、页面发布

管理员通过页面发布功能将页面发布到远程门户服务器。

页面发布成功,用户即可在浏览器浏览到最新发布的页面,整个页面添加、发布的过程由于软件自动执行,无需人工登录服务器操作。

3 小结

  • 页面管理流程

  • 创建站点

  • 创建模板
  • 创建页面
  • 页面预览
  • 页面发布

  • 本项目CMS实现功能

  • 页面管理

  • 页面预览
  • 页面发布

后端工程搭建

学习目标

  • 创建后端工程项目
  • 创建CMS应用
  • 创建UCenter应用
  • 同步数据库

1 创建工程

创建虚拟环境:

1
mkvirtualenv cz_study -p python3 # 使用 python3.6

安装Django相关依赖包

1
pip install Django==1.11 djangorestframework==3.9.4 django-filter==2.1.0 Markdown==3.1.1 coreapi==2.3.3

安装MySQL客户端

1
pip install mysqlclient==1.4.2.post1

创建项目

1
django-admin startproject cz_study

2 配置运行

使用pycharm打开cz_study项目,并配置解释器(使用我们新创建的cz_study虚拟环境)

1、编辑cz_study/settings.py

注册Django REST framework

1
INSTALLED_APPS = [...'rest_framework','django_filters',
]

配置MySQL数据库

1
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'cz_study','USER': 'root','PASSWORD': '123456','HOST': 'localhost','PORT': 3306,}
}

语言与时区配置

1
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False

2、创建数据库

进入mysql客户端

1
mysql -uroot -p# 输入root用户的密码

创建cz_study数据库

1
> create database cz_study;

3、运行程序

1
python manage.py runserver

访问 [

3 创建应用

1、创建cms

创建应用

1
django-admin startapp cms

新建文件夹apps,extra_apps,将cms文件夹移动到apps中,并在 cz_study/settings.py 中增加搜索路径:

1
import sys
...
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
sys.path.insert(0, os.path.join(BASE_DIR, 'extra_apps'))

注册应用(cz_study/settings.py)

1
INSTALLED_APPS = [...'cms.apps.CmsConfig',
]

2、创建ucenter

创建应用,并将ucenter文件夹移动到apps中

1
django-admin startapp ucenter

添加用户模型(apps/ucenter/models.py)

1
from datetime import datetime
from django.db import models
from django.contrib.auth.models import AbstractUserclass CzUser(AbstractUser):
    """
    用户信息
    """GENDER_CHOICES = (("male", "男"),("female", "女"))name = models.CharField(verbose_name="姓名", max_length=30, null=True, blank=True)birthday = models.DateField(verbose_name="出生年月", null=True, blank=True)gender = models.CharField(verbose_name="性别", max_length=6, choices=GENDER_CHOICES, default="female")phone = models.CharField(verbose_name="", max_length=11, null=True, blank=True)email = models.EmailField(verbose_name="邮箱", max_length=100, null=True, blank=True)userpic = models.CharField(verbose_name="用户头像", max_length=255, blank=True, null=True)qq = models.CharField(verbose_name="qq号码", max_length=32, blank=True, null=True)class Meta:verbose_name = "用户信息"verbose_name_plural = verbose_namedef __str__(self):return self.username

注册应用(cz_study/settings.py)

1
INSTALLED_APPS = [...'ucenter.apps.UcenterConfig',
]

配置用户模型

1
AUTH_USER_MODEL = 'ucenter.CzUser'

4 同步数据库

生成迁移文件

1
python manage.py makemigrations

同步数据库

1
python manage.py migrate

5 小结

  • 创建项目:django-admin startproject 项目名称

  • 配置

  • INSTALLED_APPS

  • DATABASES
  • 其他配置

  • 运行程序:python manage.py runserver

  • 创建应用:

  • django-admin startapp 应用名称

  • 注册应用:INSTALLED_APPS
  • 配置用户模型:AUTH_USER_MODEL

  • 同步数据库

  • 生成迁移文件:python manage.py makemigrations

  • 同步数据库:python manage.py migrate

导入CMS数据库

学习目标

  • 使用Studio 3T软件导入cms数据库
  • 使用mongoimport导入cms数据库

1 使用Studio 3T软件导入cms数据库

1、创建cz_study数据库

2、导入 cms数据库

右键数据库,点击导入数据库

打开窗口,选择第一个 json。

下一步,选择要导入的数据文件(json文件)

下一步操作即可完成。

导入成功:

2 使用mongoimport导入cms数据库

使用mongoimport命令行从资料中提供的cz_study文件夹中导入数据

1
mongoimport -d=cz_study --file=cz_study/sys_dictionary.json
mongoimport -d=cz_study --file=cz_study/cms_config.json
mongoimport -d=cz_study --file=cz_study/cms_site.json
mongoimport -d=cz_study --file=cz_study/cms_template.json
mongoimport -d=cz_study --file=cz_study/cms_page.json

其中 -d指定要导入到的数据库,--file指定包含导入数据的json文件

3 小结

  • 使用mongoimport导入数据

  • mongoimport -d=cz_study --file=cz_study/sys_dictionary.json

MongoEngine入门

在Django中使用MongoDB

学习目标

  • 了解CMS数据库选型
  • 掌握在Django中使用MongoEngine的依赖包及配置方法

1 数据库选型

CMS采用MongoDB数据库存储CMS页面信息,CMS选用Mongodb的原因如下:

1、Mongodb是非关系型数据库,存储Json格式数据 ,数据格式灵活。

2、相比管理等核心数据CMS数据没有那么重要,且没有事务管理要求。

2 django-rest-framework-mongoengine

安装依赖包

1
pip install mongoengine==0.17.0 django-rest-framework-mongoengine==3.3.1

注册django-rest-framework-mongoengine应用

1
INSTALLED_APPS = [...'rest_framework_mongoengine',
]

连接到MongoDB数据库

1
from mongoengine import connect
connect('cz_study', host='127.0.0.1', port=27017)
connect('test', host='127.0.0.1', port=27017, alias='test')    # 用于后面的测试

3 小结

  • 依赖包:mongoengine、django-rest-framework-mongoengine
  • 注册应用:rest_framework_mongoengine
  • 连接MongoDB:connect('test', host='127.0.0.1', port=27017, alias='test')

定义文档

学习目标

  • 掌握定义文档的方法
  • 了解Django的manage工具提供的shell命令

1 定义文档类

MongoEngine的文档定义与Django的模型定义类似,文档类必须继承mongoengine.Document类

接下来以"图书-英雄"管理为例进行演示。

创建应用booktest并注册,然后在models.py 文件中定义文档类。

1
from mongoengine import Document
from mongoengine import fieldsclass BookInfo(Document):
    """
    定义图书文档类
    """btitle = fields.StringField(max_length=20, verbose_name='名称')bpub_date = fields.DateTimeField(verbose_name='发布日期')bread = fields.IntField(default=0, verbose_name='阅读量')bcomment = fields.IntField(default=0, verbose_name='评论量')is_delete = fields.BooleanField(default=False, verbose_name='逻辑删除')# MongoEngine的meta信息以meta属性指定meta = {'db_alias': 'test',    # 指定数据库别名'collection': 'tb_books',    # 指定集合名称}def __str__(self):
        """定义每个数据对象的显示信息"""return self.btitleclass HeroInfo(Document):
    """
    定义英雄文档类
    """GENDER_CHOICES = ((0, 'female'),(1, 'male'))hname = fields.StringField(max_length=20, verbose_name='名称')hgender = fields.IntField(choices=GENDER_CHOICES, default=0, verbose_name='性别')hcomment = fields.StringField(max_length=200, null=True, verbose_name='描述信息')hbook = fields.ReferenceField(BookInfo, verbose_name='图书')  # 引用字段is_delete = fields.BooleanField(default=False, verbose_name='逻辑删除')meta = {'db_alias': 'test','collection': 'tb_heros',}def __str__(self):return self.hname
1) meta

文档类的meta数据通过meta属性指定

2) 数据库别名

通过db_alias指定数据库别名,可以切换不同的数据库

3) 集合名

通过collection指定集合名

4) 字段类型
类型说明
DateTimeField日期时间字段,要指定当前时间为默认值,使用DateTimeField(default=datetime.utcnow)
EmailField验证字段是否为合法的Email地址
FloatField浮点数字段
IntField整数字段
ObjectIdField其中包含MongoDB的ObjectId
ReferenceField引用另一个文档,类似于ForeignKey
StringField字符串字段
URLField验证字段是否为合法的URL
5) 参数选项
参数说明
db_field数据库字段名,如未指定,则为field属性的名称
required如果为True,则必须提供字段值,默认值是False
unique如果为True, 这个字段在表中必须有唯一值,默认值是False
default指定字段的默认值
null如果为True,表示允许为空,默认值是False

2 添加测试数据

1
db.tb_books.insert([
{_id: ObjectId("5d6772e94bd611a8efe98c12"), btitle: '射雕英雄传', bpub_date: new Date('1980-05-01'), bread: 12, bcomment: 34, is_delete: 0},
{_id: ObjectId("5d6772e94bd611a8efe98c13"), btitle: '天龙八部', bpub_date: new Date('1986-07-24'), bread: 36, bcomment: 40, is_delete: 0},
{_id: ObjectId("5d6772e94bd611a8efe98c14"), btitle: '笑傲江湖', bpub_date: new Date('1995-12-24'), bread: 20, bcomment: 80, is_delete: 0},
{_id: ObjectId("5d6772e94bd611a8efe98c15"), btitle: '雪山飞狐', bpub_date: new Date('1987-11-11'), bread: 58, bcomment: 24, is_delete: 0}
])
db.tb_heros.insert([
{_id: ObjectId("5d6773df4bd611a8efe98c27"), hname: '郭靖', hgender: 1,hbook: ObjectId("5d6772e94bd611a8efe98c12"), hcomment: '降龙十八掌', is_delete: 0},
{_id: ObjectId("5d6773df4bd611a8efe98c28"), hname: '黄蓉', hgender: 0,hbook: ObjectId("5d6772e94bd611a8efe98c12"), hcomment: '打狗棍法', is_delete: 0},
{_id: ObjectId("5d6773df4bd611a8efe98c29"), hname: '黄药师', hgender: 1,hbook: ObjectId("5d6772e94bd611a8efe98c12"), hcomment: '弹指神通', is_delete: 0},
{_id: ObjectId("5d6773df4bd611a8efe98c2a"), hname: '欧阳锋', hgender: 1,hbook: ObjectId("5d6772e94bd611a8efe98c12"), hcomment: '蛤蟆功', is_delete: 0},
{_id: ObjectId("5d6773df4bd611a8efe98c2b"), hname: '梅超风', hgender: 0,hbook: ObjectId("5d6772e94bd611a8efe98c12"), hcomment: '九阴白骨爪', is_delete: 0},
{_id: ObjectId("5d6773df4bd611a8efe98c2c"), hname: '乔峰', hgender: 1,hbook: ObjectId("5d6772e94bd611a8efe98c13"), hcomment: '降龙十八掌', is_delete: 0},
{_id: ObjectId("5d6773df4bd611a8efe98c2d"), hname: '段誉', hgender: 1,hbook: ObjectId("5d6772e94bd611a8efe98c13"), hcomment: '六脉神剑', is_delete: 0},
{_id: ObjectId("5d6773df4bd611a8efe98c2e"), hname: '虚竹', hgender: 1,hbook: ObjectId("5d6772e94bd611a8efe98c13"), hcomment: '天山六阳掌', is_delete: 0},
{_id: ObjectId("5d6773df4bd611a8efe98c2f"), hname: '王语嫣', hgender: 0,hbook: ObjectId("5d6772e94bd611a8efe98c13"), hcomment: '神仙姐姐', is_delete: 0},
{_id: ObjectId("5d6773df4bd611a8efe98c30"), hname: '令狐冲', hgender: 1,hbook: ObjectId("5d6772e94bd611a8efe98c14"), hcomment: '独孤九剑', is_delete: 0},
{_id: ObjectId("5d6773df4bd611a8efe98c31"), hname: '任盈盈', hgender: 0,hbook: ObjectId("5d6772e94bd611a8efe98c14"), hcomment: '弹琴', is_delete: 0},
{_id: ObjectId("5d6773df4bd611a8efe98c32"), hname: '岳不群', hgender: 1,hbook: ObjectId("5d6772e94bd611a8efe98c14"), hcomment: '华山剑法', is_delete: 0},
{_id: ObjectId("5d6773df4bd611a8efe98c33"), hname: '东方不败', hgender: 0,hbook: ObjectId("5d6772e94bd611a8efe98c14"), hcomment: '葵花宝典', is_delete: 0},
{_id: ObjectId("5d6773df4bd611a8efe98c34"), hname: '胡斐', hgender: 1,hbook: ObjectId("5d6772e94bd611a8efe98c15"), hcomment: '胡家刀法', is_delete: 0},
{_id: ObjectId("5d6773df4bd611a8efe98c35"), hname: '苗若兰', hgender: 0,hbook: ObjectId("5d6772e94bd611a8efe98c15"), hcomment: '黄衣', is_delete: 0},
{_id: ObjectId("5d6773df4bd611a8efe98c36"), hname: '程灵素', hgender: 0,hbook: ObjectId("5d6772e94bd611a8efe98c15"), hcomment: '医术', is_delete: 0},
{_id: ObjectId("5d6773df4bd611a8efe98c37"), hname: '袁紫衣', hgender: 0,hbook: ObjectId("5d6772e94bd611a8efe98c15"), hcomment: '六合拳', is_delete: 0}
])

3 演示工具

Django的manage工具提供的shell命令

1
python manage.py shell

导入两个模型类

1
from booktest.models import BookInfo, HeroInfo

4 小结

  • 文档类必须继承mongoengine.Document类
  • meta

  • db_alias

  • collection

  • 字段类型

  • DateTimeField

  • EmailField
  • FloatField
  • IntField
  • ObjectIdField
  • ReferenceField
  • StringField
  • URLField

  • 参数选项

  • db_field

  • required
  • unique
  • default
  • null

  • Django的manage工具提供的shell命令:python manage.py shell

http://www.lryc.cn/news/577276.html

相关文章:

  • SpringCloud系列(42)--搭建SpringCloud Config分布式配置总控中心(服务端)
  • 鸿蒙5:组件状态共享
  • STM32-第一节-新建工程,GPIO,点亮LED,蜂鸣器
  • 七天学会SpringCloud分布式微服务——05——OpenFeign
  • Hadoop WordCount 程序实现与执行指南
  • 大数据(3)-Hive
  • 【时时三省】vectorcast使用教程
  • 烘焙工业4.0:自动化升级与制造执行MES系统的深度赋能
  • 【软考中级·软件评测师】下午题·面向对象测试之架构考点全析:分层、分布式、微内核与事件驱动
  • 【原创】【5】【视频二创工具发布】基于视觉模型+FFmpeg+MoviePy实现短视频自动化二次编辑+多赛道
  • 国产车哪款有远程代驾功能?远程代驾+自动驾驶
  • 【Wireshark】高级过滤技巧精讲
  • APP 内存测试--Android Profiler实操(入门版)
  • Unity编辑器扩展之扫描项目中所有图片资源,并找出引用这些图片的预制体及其引用路径,最终导出为CSV报告
  • Monorepo+Pnpm+Turborepo
  • Windows 安装 nodejs npm
  • 网络拓扑图绘制全流程:从架构解析到工具实战
  • Jenkins Pipeline 实战指南
  • Java基础(六):数组全面解析
  • python+uniapp基于微信小程序的生鲜订购系统nodejs+java
  • Java 图书管理系统
  • 在拉卡拉分账功能中实现实时更新,需结合异步回调通知和数据库事务来确保数据一致性。以下是具体实现方案
  • 【Linux系统部分】在Linux命令行中写一个简单的shell外壳
  • 网络安全2023—新安全新发展
  • HarmonyOS NEXT仓颉开发语言实战案例:电影App
  • 【AI时代速通QT】第四节:Windows下Qt Creator调试指南
  • Oracle 进阶语法实战:从多维分析到数据清洗的深度应用​(第四课)
  • ChatGPT、DeepSeek等大语言模型助力高效办公、论文与项目撰写、数据分析、机器学习与深度学习建模等科研应用
  • SQL参数化查询:防注入与计划缓存的双重优势
  • 高性能MySQL集群:架构设计与优化实战指南