扩展auth_user表;项目开发流程;BBS数据表分析;BBS表设计;注册页面的搭建 # day60
扩展auth_user表
前提:一旦执行过迁移命令,就不能再扩展了
1、要想扩展auth_user表,必须继承AbstractUser类
2、必须在settings.py中,写一个配置,AUTH_USER_MODEL = 'app01.UserInfo'
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
"""
AbstractUser类中的字段不要动,你只需要写自己扩展的字段
"""
phone = models.CharField(max_length=32)
addr = models.CharField(max_length=32)
项目开发流程
1、需求分析
2、交给开发,测试,主管,产品,再次确认需求是否可行
3、开发阶段
# 联调
# 提交测试
dev # 是与前端联调的环境
test # 交给测试开始测
release # 预发布环境
master # 正式环境
git:版本控制,多人协作开发的工具
BBS表设计
以博客园为例分析:
1. 用户表
扩展auth_user表,
增加用户信息字段phone, avatar, create_time
用户表与站点表是一对一关系
2. 站点表
站点名称
站点标题
站点样式 # css.css 存储css路径
3. 标签表
标签名
标签表与站点表是一对多关系
4. 分类表
分类名
分类表与站点表是一对多关系
5. 文章表
标题
摘要
内容
时间
优化的地方:增加与点赞点踩表外键关联字段(可以减少操作数据库,减消耗)
点赞数 + 1
点踩数 + 1
评论数 + 1
一对多站点表
多对多标签表
一对多分类表
6. 点赞点踩表
谁给那篇文件点踩了还是点踩了
user article updown # 字段名
1 1 1
7. 评论表
谁给那篇文件什么时间评论了什么内容(其中pid用于创建无限链接,将pid绑定给id名)
id user artilce content create_time pid
1 1 1 123 123
2 2 1 2234 343 1
评论:有有父评论和子评论,可通过pid实现
1. 我很帅
2. 你不帅
3. 哈哈哈
BBS表设计
from django.db import models
# Create your models here.
"""
建表先建基础字段
"""
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
phone = models.CharField(max_length=32, verbose_name='手机号',null=True)
"""
upload_to写存储图片的路径
只要你给avatar字段传递文件对象,图片自动上传到对应的文件夹
"""
avatar = models.FileField(upload_to='static/img', default='static/img/default.jpg', verbose_name='头像')
create_time = models.DateTimeField(auto_now_add=True)
site = models.OneToOneField(to='Site',null=True)
class Site(models.Model):
site_name = models.CharField(max_length=64, verbose_name='站点名称')
site_title = models.CharField(max_length=64, verbose_name='站点标题')
site_style = models.CharField(max_length=128, verbose_name='样式的路径')
class Tag(models.Model):
name = models.CharField(max_length=64, verbose_name='标签名')
site = models.ForeignKey(to='Site')
class Category(models.Model):
name = models.CharField(max_length=64, verbose_name='分类名')
site = models.ForeignKey(to='Site')
class Article(models.Model):
title = models.CharField(max_length=256, verbose_name='文章标题')
desc = models.CharField(max_length=256, verbose_name='简介')
content = models.TextField(verbose_name='文章内容')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='添加时间')
##############优化字段#########################
up_num = models.IntegerField(verbose_name='点赞数')
down_num = models.IntegerField(verbose_name='点踩数')
comment_num = models.IntegerField(verbose_name='评论数')
#######################外键关系#########################
site = models.ForeignKey(to='Site',null=True)
cate = models.ForeignKey(to='Category',null=True)
tag = models.ManyToManyField(to='Tag',
through='Article2Tag',
through_fields=('article', 'tag')
)
class Article2Tag(models.Model):
article = models.ForeignKey(to='Article',null=True)
tag = models.ForeignKey(to='Tag',null=True)
class UpandDown(models.Model):
user = models.ForeignKey(to='UserInfo')
article = models.ForeignKey(to='Article')
is_up = models.BooleanField() # 0/1
class Comment(models.Model):
user = models.ForeignKey(to='UserInfo')
article = models.ForeignKey(to='Article')
content = models.CharField(max_length=256, verbose_name='评论内容')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='评论时间')
parent = models.ForeignKey(to='self', verbose_name='父id',null=True)
注册页面搭建
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
{% load static %}
<script src="{% static 'layer-v3.5.1/layer/layer.js' %}"></script>
</head>
<body>
<div class="container-fluid">
<div class="row">
<h1 class="text-center">注册页面</h1>
<div class="col-md-8 col-md-offset-2">
<form action="">
<div class="form-group">
<label for="username">用户名:</label>
<input type="text" id="username" class="form-control">
</div>
<div class="form-group">
<label for="username">密码:</label>
<input type="password" id="password" class="form-control">
</div>
<div class="form-group">
<label for="username">确认密码:</label>
<input type="password" id="re_password" class="form-control">
</div>
<div class="form-group">
<label for="myfile">上传头像:
<img src="/static/img/default.jpg" id="myimg" alt="" width="120">
</label>
<input type="file" id="myfile" class="form-control" style="display: none">
</div>
<input type="button" class="btn btn-success pull-right" value="注册">
</form>
</div>
</div>
</div>
<script>
$("#myfile").change(function () {
// 1. 借助于文件阅读器
let myFileReader = new FileReader()
// 2. 拿到文件对象
let myFileObj = $("#myfile")[0].files[0]
// 3. 把文件对象给文件阅读器来说读取数据
myFileReader.readAsDataURL(myFileObj) // 异步操作
myFileReader.onload = function () {
console.log(myFileReader.result)
$("#myimg").attr('src', myFileReader.result)
}
});
// 实现注册功能
$('.btn').click(function () {
// 1. 实例化FormData
let myFormDataObj = new FormData();
// 2. 获取表单数据
let username = $("#username").val();
let password = $("#password").val();
let re_password = $("#re_password").val();
if (!username) {
layer.msg('用户名必须填写')
return
}
if (!password) {
layer.msg('密码必须填写')
return
}
if (!re_password) {
layer.msg('确认密码必须填写')
return
}
// 3. 添加普通数据
myFormDataObj.append('username', username)
myFormDataObj.append('password', password)
myFormDataObj.append('re_password', re_password)
// 4. 添加文件对象
myFormDataObj.append('avatar', $("#myfile")[0].files[0]);
{#myFormDataObj.append('avatar', $("#myfile")[0].files[0]);#}
// 5. 发送ajax请求
$.ajax({
url: '',
type: 'post',
data: myFormDataObj,
contentType: false,
processData: false,
success: function (res) {
{#console.log(res)#}
{#console.log(typeof res)#}
{#console.log(res.url)#}
if (res.code == 200) {
layer.msg(res.msg, {}, function () {
location.href = res.url
})
} else {
layer.msg(res.msg, {icon:2})
}
}
})
})
</script>
</body>
</html>
注册功能的实现
from django.shortcuts import render
from django.http import JsonResponse
from app01 import models
import hashlib
# Create your views here.
def register(request):
if request.method == 'POST':
back_dic = {'code': 200, 'msg': '注册成功'}
username = request.POST.get("username")
password = request.POST.get("password")
re_password = request.POST.get("re_password")
avatar = request.FILES.get('avatar')
# 验证参数
if not username:
back_dic['code'] = 1001
back_dic['msg'] = '用户名不能为空'
return JsonResponse(back_dic)
if not password:
back_dic['code'] = 1002
back_dic['msg'] = '密码不能为空'
return JsonResponse(back_dic)
# 验证用户名是否注册7
res = models.UserInfo.objects.filter(username=username).first()
if res:
back_dic['code'] = 1003
back_dic['msg'] = '用户名已经存在'
return JsonResponse(back_dic)
# 入库
m = hashlib.md5()
m.update(password.encode('utf-8'))
password = m.hexdigest()
print(password)
dic = {}
if avatar:
dic['avatar'] = avatar
dic['username'] = username
dic['password'] = password
models.UserInfo.objects.create(**dic)
back_dic['url'] = '/login/'
# models.UserInfo.objects.create_user(**dic)
return JsonResponse(back_dic)
return render(request, 'register.html')

浙公网安备 33010602011771号