北京网站优化哪家公司好,404错误页面放在网站的哪里,医疗网络营销方式,网页设计教程ppt一、BBS-个人博客项目完整搭建
项目开发流程
一、项目分类
现在互联网公司需要开发的主流web项目一般分为两类#xff1a;面向互联网用户#xff0c;和公司内部管理。面向互联网用户: C(consumer)端项目
公司内部管理#xff1a;B(business)端项目还有一类web应用#xff…一、BBS-个人博客项目完整搭建
项目开发流程
一、项目分类
现在互联网公司需要开发的主流web项目一般分为两类面向互联网用户和公司内部管理。面向互联网用户: C(consumer)端项目
公司内部管理B(business)端项目还有一类web应用基本采用基于角色的权限控制不同的员工在这套系统中拥有不同的权限
适用于公司内部管理。基于权限的后台关系系统RBAC权限管理系统二、项目开发模式分类
最常见的两类为瀑布开发模式和敏捷开发模式。
1、瀑布开发模式瀑布开发模式是一种更倾向于严格控制的管理模式要求在提出需求之后充分完成项目的规划各阶段都要经过严格的评审只有当一个阶段的需求完成得非常好时才能进入下一个阶段。但是瀑布开发模式开发的失败率较高且周期较长于是就产生了敏捷开发模式。2、敏捷开发模式敏捷开发模式的核心是迭代开发它将一个项目完整的开发流程分为了几个周期也可以说是版本由于每个版本的开发流程相似看上去相当于一个重复迭代的过程。这么开发的好处是使一个大的项目能在较短时间内上线并在后续对它进行不断地迭代和优化。3、项目开发流程-立项-需求分析-原型图(产品画的)-切图-技术选型数据库架构设计-前后端协同开发-上线测试服务器联调-测试-修改bug-上线运行
二、BBS多人博客项目基本功能和需求
# 开发任意的项目第一个阶段就是弄清楚你要开发什么功能# 一个项目最重要的是表结构的设计大部分时间都是用来设计表.
# 你在企业中对于一个完成的项目写代码的时间大概有个30%其余的时间都用来做铺垫
比如产品需求的确定技术选型数据库设计...# 注册登录功能
1. 用户表(你可以自己创建也可以使用auth_user表)扩展auth_user表phone avatar用来存储头像的地址create_time用户注册的时间...blog_id OneToOneField(toblog) 2. 站点表(blog)站点名称站点标题站点样式存的是css的路径3. 分类表(cate)分类名称blog ForeignKey(toblog) 4. 标签表标签名称blog ForeignKey(toblog) 5. 文章表(*******************article)文章标题文章摘要文章内容文章发表时间# 1. 通过文章id去点赞表或者评论表中查询# 优化# 2. 在文章表中增加子弹up_num 1down_num 1comment_num 4# 外键关系子弹cate ForeignKey(tocate) tag ManyToManyField(totag)blog ForeignKey(toblog) 6. 点赞点踩表谁给哪篇文章什么时间点了赞还是踩user ForeignKey(touser) article ForeignKey(toarticle) is_up 0/1create_timeid user_id article_id is_up create_time1 1 1 0 ‘’2 2 1 1 ‘’7. 评论表(comment)谁给哪篇文章在什么时间评论了什么内容user ForeignKey(touser) article ForeignKey(toarticle) contentcreate_timeparent_id ForeignKey(tocomment) parent_id ForeignKey(toself)#自关联id user_id article_id content create_time parent_id1 1 1 0 ‘’ 02 2 1 1 ‘’ 13 2 1 1 ‘’ 2子评论评论评论的评论!!!根评论1. Python是世界上最好的语言1.1 PHP是世界上最好的语言1.2 Java是世界上最好的语言无限极分类 category表id cate_name pid1 手机/数码 02 电脑/办公 0...20 手机通讯 121 运营商 1...50 5G手机 2051 手机 20...100 128G/5G 50三、项目程序设计 四、BBS数据库表结构设计
1.用户表UserInfo
通过继承AbstractUser类来扩写Auth_user
•phone用户的联系方式
•bg_img: 用户的主页背景
•province: 用户的省份
•city: 用户的城市
•gender : 用户的性别
•avatar用户的头像
•blog用户的博客站点外键一对一关联博客表Blog
2.博客表Blog
•title博客标题
•subtitle: 博客子标题
•style博客样式
3.文章表Article
•title文章标题
•head_img: 头像
•description文章摘要
•content文章内容
•create_time文章的创建时间
•modify_time: 文章的修改时间
•up_num :点赞数
•down_num:点踩数
•comment_num:评论数
•blog属于哪个博客站点外键关联博客表Blog
•category属于哪个分类外键关联分类表Category
4.标签表Tag
•name标签名
•blog属于哪个博客站点外键关联博客表Blog5.分类表Category
•name分类名
•blog属于哪个博客站点外键关联博客表Blog
6.评论表Comment
•user评论的用户外键关联用户表UserInfo
•article该评论属于哪篇文章外键关联文章表Article
•content评论内容
•comment_time: 评论的创建时间
•comment_id评论的目标id外键进行自关联7.点赞点踩表UpAndDown
•user来自哪个用户外键关联用户表UserInfo
•article属于哪篇文章外键关联文章表Article
•is_up点赞还是点踩根据bool值来判断
•create_time : 点赞或踩的时间8.文章标签表: Tag2Article
根据文章与标签的多对多关系手动建立的第三张表
• tag标签名外键关联标签表Tag
• article属于哪篇文章外键关联文章表Article9.轮播图表 Swiper (拓展)
• image: 轮播图图片名
• title轮播图标题
• img_url: 点击轮播图要跳转的url地址10.日志表: Log(拓展)
• id: 日志id
• ip: 访问的ip地址
• time: 访问的时间
• url: 访问的url
• device: 访问的浏览器
• platform:访问的操作系统类型11.日志表: Log(拓展)
• id: 日志id
• ip: 访问的ip地址
• time: 访问的时间
• url: 访问的url
• device: 访问的浏览器
• platform:访问的操作系统类型五、创建BBS表模型
模型层models.py中写入以下orm语句模型来创建表模型
from django.contrib.auth.models import AbstractUser
from django.utils.html import mark_safe
from django.db import models
from markdown import markdown# 日志表
class Log(models.Model):id models.AutoField(primary_keyTrue)ip models.CharField(max_length64, verbose_name访问IP, help_text访问用户的IP地址)time models.DateTimeField(auto_now_addTrue, verbose_name访问时间, help_text该用户的访问时刻)url models.CharField(max_length64, verbose_name访问的URL, help_text该用户访问的URL地址)device models.CharField(max_length256, nullTrue, verbose_name访问的浏览器, help_text该用户是用什么浏览器访问的)platform models.CharField(max_length256, nullTrue, verbose_name访问的系统, help_text该用户用的是什么操作系统)# 定义这个表中默认显示的字段def __str__(self):return self.ip# 定义这个表在admin后台中显示的别名class Meta:ordering [id]verbose_name_plural 日志# 用户表
class UserInfo(AbstractUser):avatar models.FileField(upload_toavatar/, defaultavatar/default.png, verbose_name头像, help_text该用户的头像)bg_img models.FileField(upload_tobg_img/, defaultbg_img/default_bg.png, verbose_name头像,help_text该用户的主页背景)province models.CharField(max_length32, default, verbose_name省, help_text该用户的省)city models.CharField(max_length32, default, verbose_name城市, help_text该用户的市)gender models.IntegerField(choices((0, 保密), (1, 男), (2, 女)), default0, verbose_name性别,help_text该用户的性别)phone models.CharField(max_length11, nullTrue, default, verbose_name联系方式, help_text该用户的联系方式)blog models.OneToOneField(toBlog, on_deletemodels.CASCADE, nullTrue, verbose_name博客, help_text该用户的博客)def __str__(self):return self.usernameclass Meta:verbose_name_plural 用户# 博客表个人站点
class Blog(models.Model):title models.CharField(max_length32, verbose_name博主昵称, help_text博主昵称)subtitle models.CharField(max_length32, verbose_name子标题/公告, help_text博客的子标题/公告)style models.CharField(max_length32, verbose_name样式, help_text该博客独有的样式) # 此处未启用def __str__(self):return self.titleclass Meta:verbose_name_plural 博客站点# 文章表
class Article(models.Model):title models.CharField(max_length32, verbose_name标题, help_text文章的标题)head_img models.FileField(upload_toarticle_head_img/, defaultarticle_head_img/default_head.png,verbose_name头图,help_text文章的头图)description models.CharField(max_length128, verbose_name摘要, help_text简要描述该文章)content models.TextField(verbose_name内容, help_text文章的内容)markdown models.TextField(verbose_nameMarkdown内容, default暂无, help_text文章的Markdown内容)create_time models.DateTimeField(auto_now_addTrue, verbose_name创建时间, help_text该文章的创建时间)modify_time models.DateTimeField(auto_nowTrue, verbose_name修改时间, help_text该文章的最后修改时间)up_num models.IntegerField(default0, verbose_name点赞数, help_text该文章的点赞数)down_num models.IntegerField(default0, verbose_name点踩数, help_text该文章的点踩数)comment_num models.IntegerField(default0, verbose_name评论数, help_text该文章的评论数)blog models.ForeignKey(toBlog, on_deletemodels.CASCADE, nullTrue, blankTrue, verbose_name博客,help_text该文章属于哪个博客页面)category models.ForeignKey(toCategory, on_deletemodels.CASCADE, nullTrue, blankTrue, verbose_name分类,help_text该文章属于哪个分类)tag models.ManyToManyField(toTag, throughTag2Article,through_fields(article, tag), verbose_name标签,help_text该文章有哪些标签)def get_text_md(self):return mark_safe(markdown(self.content))def __str__(self):return self.titleclass Meta:verbose_name_plural 文章ordering [id, ]# 标签表
class Tag(models.Model):name models.CharField(max_length32, verbose_name标签, help_text标签的名字)blog models.ForeignKey(toBlog, on_deletemodels.DO_NOTHING, nullTrue, blankTrue, verbose_name博客,help_text该标签属于哪个博客页面)def __str__(self):return self.nameclass Meta:verbose_name_plural 标签# 分类表
class Category(models.Model):name models.CharField(max_length32, verbose_name分类, help_text分类的名称)blog models.ForeignKey(toBlog, on_deletemodels.DO_NOTHING, nullTrue, blankTrue, verbose_name博客,help_text该分类属于哪个博客页面)def __str__(self):return self.nameclass Meta:verbose_name_plural 分类# 评论表
class Comment(models.Model):user models.ForeignKey(toUserInfo, on_deletemodels.DO_NOTHING, verbose_name用户, help_text该评论来自哪个用户)article models.ForeignKey(toArticle, on_deletemodels.CASCADE, nullTrue, verbose_name文章,help_text评论的对象是哪篇文章)content models.CharField(max_length256, verbose_name内容, help_text评论的内容)comment_time models.DateTimeField(auto_now_addTrue, verbose_name时间, help_text评论的时间)comment_id models.ForeignKey(toself, on_deletemodels.CASCADE, nullTrue, verbose_name评论id,help_text对哪个id的评论进行评论)def __str__(self):return self.contentclass Meta:verbose_name_plural 评论# 点赞点踩
class UpAndDown(models.Model):user models.ForeignKey(toUserInfo, on_deletemodels.CASCADE, verbose_name用户, help_text来自哪个用户)article models.ForeignKey(toArticle, on_deletemodels.CASCADE, nullTrue, verbose_name文章,help_text针对哪篇文章)is_up models.BooleanField(nullTrue, verbose_name点赞点踩, help_textTrue为点赞False为点踩)create_time models.DateTimeField(auto_now_addTrue, verbose_name创建时间, help_text点赞点踩的时间)def __str__(self):return self.userclass Meta:verbose_name_plural 点赞点踩# 标签、文章关联表
class Tag2Article(models.Model):tag models.ForeignKey(toTag, on_deletemodels.SET_DEFAULT, default, verbose_name标签, help_text关联的标签)article models.ForeignKey(toArticle, on_deletemodels.CASCADE, default, verbose_name文章,help_text关联的文章)class Meta:verbose_name_plural 标签关联文章# 轮播图表
class Swiper(models.Model):image models.FileField(upload_toswiper_img/, defaultswiper_img/default.jpg, verbose_name图片,help_text轮播图的图片)title models.CharField(max_length32, verbose_name标题, help_text图片的标题)img_url models.CharField(max_length64, verbose_nameURL, help_text点击图片要跳转的URL地址)def __str__(self):return self.img_urlclass Meta:verbose_name_plural 轮播图django2表设计
from django.db import models
先写普通字段
之后再写外键字段from django.contrib.auth.models import AbstractUser# auth_user的扩展表(用户表)
class UserInfo(AbstractUser):phone models.BigIntegerField(verbose_name手机号, nullTrue)# 头像avatar models.FileField(upload_toavatar/, defaultavatar/default.png, verbose_name用户头像)给avatar字段传文件对象 该文件会自动存储到avatar文件下 然后avatar字段只保存文件路径avatar/default.pngcreate_time models.DateField(auto_now_addTrue)blog models.OneToOneField(toBlog, nullTrue, on_deletemodels.CASCADE)# 博客表
class Blog(models.Model):site_name models.CharField(verbose_name站点名称, max_length32)site_title models.CharField(verbose_name站点标题, max_length32)# 简单模拟 带你认识样式内部原理的操作site_theme models.CharField(verbose_name站点样式, max_length64) # 存css/js的文件路径# 分类表
class Category(models.Model):name models.CharField(verbose_name文章分类, max_length32)blog models.ForeignKey(toBlog, nullTrue, on_deletemodels.CASCADE)# 标签表
class Tag(models.Model):name models.CharField(verbose_name文章标签, max_length32)blog models.ForeignKey(toBlog, nullTrue, on_deletemodels.CASCADE)# 文章表
class Article(models.Model):title models.CharField(verbose_name文章标题, max_length64)desc models.CharField(verbose_name文章简介, max_length255)# 文章内容有很多 一般情况下都是使用TextFieldcontent models.TextField(verbose_name文章内容)create_time models.DateField(auto_now_addTrue)# 数据库字段设计优化up_num models.IntegerField(verbose_name点赞数, default0)down_num models.IntegerField(verbose_name点踩数, default0)comment_num models.IntegerField(verbose_name评论数, default0)# 外键字段blog models.ForeignKey(toBlog, nullTrue, on_deletemodels.CASCADE)category models.ForeignKey(toCategory, nullTrue, on_deletemodels.CASCADE)tags models.ManyToManyField(toTag,throughArticle2Tag,through_fields(article, tag))# 半自动创建第三章表(文章、标签关联表)
class Article2Tag(models.Model):article models.ForeignKey(toArticle, on_deletemodels.CASCADE)tag models.ForeignKey(toTag, on_deletemodels.CASCADE)# 点赞点彩
class UpAndDown(models.Model):user models.ForeignKey(toUserInfo, on_deletemodels.CASCADE)article models.ForeignKey(toArticle, on_deletemodels.CASCADE)is_up models.BooleanField() # 传布尔值 存0/1# 评论表
class Comment(models.Model):user models.ForeignKey(toUserInfo, nullTrue, on_deletemodels.CASCADE)article models.ForeignKey(toArticle, nullTrue, on_deletemodels.CASCADE)content models.CharField(verbose_name评论内容, max_length255)comment_time models.DateTimeField(verbose_name评论时间, auto_now_addTrue)# 自关联parent models.ForeignKey(toself, nullTrue, on_deletemodels.CASCADE) # 有些评论就是根评论