昨日回顾
1.Flask框架跨域如何配置?
2.模型创建的语法是什么?
3.迁移脚本如何编写?
4.迁移的命令有哪些?
5.Flask中如何创建API,如何编写restful风格的API?
今日内容
1.云资讯项目产品介绍 ***
2.MVC模式与大型项目结构创建 *****
3.项目初始化 *****
4.数据库设计 *****
# 产品介绍
云资讯是一款集成多端的科技资讯类阅读产品, 类似于今日头条, 为用户提供科技类新闻资讯.产品共分为以下几个终端:
1.用户端
用户可以从用户端获取新闻资讯, 有阅读, 关注, 评论, 收藏, 选择指定类别频道等功能, 分移动web页面, APP端等.
2.自媒体端
自媒体端是供自媒体工作者使用的, 提供自媒体作者发布资讯, 编辑资讯, 查看自媒体号运营数据的平台
3.MIS管理后台
MIS管理后台是云资讯产品公司运营管理的后台, 可进行用户管理, 文章审核及管理, 评论管理等
# 技术架构设计
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9M25DoGG-1656156686772)(images/8-1.png)]
# 开人员组织架构与开发周期说明
- 产品经理: 1人
- UI设计: 1人
- 前端: 2人
- APP开发: 1人
- Vue开发: 1人
- Web后端: 2人
- 测试: 1人
# 开发周期: 24天
# 设计模式
什么是设计模式呢? 你都学过哪些设计模式?
1.什么是设计模式:
设计模式是由GoF首先提出的, 设计模式就是解决特定问题的解决方案.
2.常见设计模式:
单例模式, 门面模式, MVC模式, 工厂模式
# MVC模式
MVC模式即模型-视图-控制器设计模式.
MVC不仅是一种实现用户界面的软件模式, 同时也是一种易于修改和维护的架构. MVC模式的国祚原理如下:
模型提供数据和业务逻辑(如何存储和查询信息), 视图负责数据的展示(如何呈现), 而控制器是两者之间的粘合剂, 根据用户要求的呈现方式来协调模型和视图.
MVC模式的流程如下图所示:8-2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DsXrPJvH-1656156686773)(images/8-2.png)]
project # 项目总目录
common # 通用目录
cache # 缓存目录
models # 模型目录
settings # 配置文件目录
utils # 工具类脚本目录
project # 项目内层目录
resources # 蓝图源码目录
schedule # 定时任务目录
tests # 测试文件目录
main.py # 主文件
mis # mis服务目录
im # im服务目录
README.md # 说明文件
requirments.txt # 依赖清单
# 项目初始化:
1.创建配置
2.创建数据库连接对象
3.创建测试蓝图
4.封装APP: 加载配置, 注册蓝图, db绑定, 跨域配置, 创建api对象
5.主文件main.py编写, 并运行项目
6.测试蓝图路由的访问
# 1.项目配置类构建: 在settings下创建default.py
class DefaultConfig(object):
"""
Flask默认配置
"""
# flask-sqlalchemy使用的参数
SQLALCHEMY_DATABASE_URI = 'mysql://root:admin123@127.0.0.1:3306/cloudnews'
SQLALCHEMY_TRACK_MODIFICATIONS = False # 追踪数据的修改信号
SQLALCHEMY_ECHO = True
# 2.数据库db对象创建: models下的__init__.py文件
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
# 3.蓝图的创建: resources下创建bptest蓝图文件夹, 并创建bpt蓝图文件进行测试
from flask import Blueprint
from flask_restful import Api, Resource
tbp = Blueprint('tbp', __name__)
api = Api(tbp)
class TestResource(Resource):
def get(self):
return 'bp_test'
api.add_resource(TestResource, '/test')
# 4.封装APP: 在cloudnews文件夹下的__init__.py中创建工厂函数封装APP
from flask import Flask
from cloudnews.resources.bptest.bpt import tbp
from common.models import db
from flask_restful import Api
from flask_cors import CORS
def create_flask_app(config):
app = Flask(__name__)
# 加载配置
app.config.from_object(config)
# 注册蓝图
app.register_blueprint(tbp)
# db对象绑定app
db.init_app(app)
# 跨域配置
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})
# 创建api对象
api = Api(app)
return app
# 5.db绑定APP与蓝图注册
# 注册蓝图
app.register_blueprint(tbp)
# db对象绑定app
db.init_app(app)
# 6.跨域配置与API引入
# 跨域配置
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})
# 创建api对象
api = Api(app)
# 7.主文件编写
import os
import sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print(BASE_DIR)
sys.path.insert(0, BASE_DIR)
#
from cloudnews import create_flask_app
from common.settings.default import DefaultConfig
app = create_flask_app(DefaultConfig)
if __name__ == '__main__':
print(app.url_map)
app.run()
# 8.测试运行: 运行main.py
使用postman访问: http://127.0.0.1:5000/test
响应: bp_test表示项目正常运行
# 数据库设计问题
项目开始的第一件事就是数据的设计, 数据库的设计好坏直接影响项目的进行.数据库的设计主要从以下几个方面进行
- 表结构设计
- 字段类型选择, 是否允许为空, 是否有默认值等约束
- 索引设计
- 数据库引擎的选择
# 数据库设计依据
数据库设计前不是凭空想象的, 而是依据产品原型进行分析设计. 所以在数据库设计之前应有产品提供产品原型, 成员根据产品原型设计数据库, UI根据产品原型设计UI界面.
前端和后端拿到产品原型, 便可以同时进行开发了. 前端与后端之间同时开发的约束为借口文档. 两方分头进行, 统一于接口, 最后进行前后端联调与测试, 最终上线, 不断进行迭代.
云资讯包含三个端, 我们以用户pc端为例进行数据库设计.
(1).表分析
# 1.登录页: 用户登录
用户表
# 2.首页:所有频道, 用户频道, 资讯列表
频道表
用户频道表(一个用户可以关注多个频道, 一个频道可以被多个用户关注 --> 多对多)
资讯表
# 3.资讯详情页:关注, 评论, 收藏, 点赞(属于资讯)
关注(关注与被关注, 多对多-->第三张表)
评论表
收藏表(一个人可以收藏很多, 一篇资讯可以被很多人收藏-->第三张表)
点赞表
# 4.搜索页:
搜索历史表
# 总结:
1.用户表
2.频道表
3.用户频道表(第三张表)
4.资讯表
5.关注表(用户与用户之间的第三张表)
6.评论内容表(设置外键关联用户)
7.收藏表(用户与资讯之间的第三张表)
8.评论点赞表
9.搜索历史表(设置外键关联用户)
4.2表字段分析
# 1.用户表
字段名 字段类型 约束 描述
uid Integer primary_key 用户ID
mobile String 手机号
password String 密码
user_name String 昵称
profile_photo String 头像
last_login DateTime 最后登录时间
is_media Boolean default 是否是自媒体
is_verified Boolean default 是否实名认证
introduction String 简介
certificate String 认证
article_count nteger default 发帖数
following_count Integer default 关注的人数
fans_count Integer default 被关注的人数(粉丝数)
like_count Integer default 累计点赞人数
read_count Integer default 累计阅读人数
account String(32) 账号
email String(64) 邮箱
status db.Integer default 状态,是否可用
# 2.用户关注表
字段名 字段类型 约束 描述
user_id Integer ForeignKey,primary_key 用户ID
foller_id Integer ForeignKey,primary_key 粉丝ID
relation Boolean 状态(1,关注;0, 取消)
create_time DateTime default 创建时间
update_time DateTime default 更新时间
# 3.频道表
字段名 字段类型 约束 描述
cid Integer ForeignKey,primary_key 频道ID
name String 名字
is_delete Boolean default 状态(1,可用; 0,不可用)
sequence Integer default 序号
# 4.用户频道表
字段名 字段类型 约束 描述
id Integer 用户频道ID
uid Integer ForeignKey,primary_key 用户ID
cid Integer ForeignKey,primary_key 频道ID
# 5.资讯表
字段名 字段类型 约束 描述
nid Integer primary_key 文章ID
user_id Integer ForeignKey 用户ID
channel_id Integer ForeignKey 频道ID
title String(64) 标题
cover String(32) 封面
ctime DateTime default 创建时间
comment_count Integer default 评论数
good_count Integer default 点赞数
read_count Integer default 阅读量
is_allow_comment Boolean default 是否允许评论
utime DateTime default 更新时间
content Text 帖文内容
# 6.评论表
字段名 字段类型 约束 描述
cmid Integer primary_key 评论ID
user_id Integer ForeignKey 用户ID
article_id Integer ForeignKey 文章ID
parent_id Integer 被评论的评论id
like_count Integer default 点赞数
reply_count Integer default 回复数
content String(128) 评论内容
is_top Boolean default 是否置顶
status Integer default 评论状态
ctime DateTime default 创建时间
# 7.收藏表
字段名 字段类型 约束 描述
collect_id Integer primary_key 主键
user_id Integer ForeignKey,primary_key 用户ID
news_id Integer ForeignKey,primary_key 资讯ID
is_delete Boolean 状态(1,关注;0, 取消)