Skip to content

Commit

Permalink
drf
Browse files Browse the repository at this point in the history
  • Loading branch information
confucianzuoyuan committed Nov 1, 2018
1 parent c8ef795 commit e2675ef
Show file tree
Hide file tree
Showing 9 changed files with 267 additions and 55 deletions.
Binary file modified drfbookstore/db.sqlite3
Binary file not shown.
29 changes: 28 additions & 1 deletion drfbookstore/drfbookstore/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"""

import os
import datetime

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
Expand Down Expand Up @@ -40,9 +41,11 @@
'users',
'books',
'rest_framework',
'rest_framework.authtoken',
]

MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
Expand All @@ -57,7 +60,7 @@
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
Expand Down Expand Up @@ -122,3 +125,27 @@

STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, "static")

AUTH_USER_MODEL = "users.UserProfile"


REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
}

JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=3600),
'JWT_AUTH_HEADER_PREFIX': 'JWT',
}

REGEX_MOBILE = "^1[358]\d{9}$|^147\d{8}$|^176\d{8}$"

AUTHENTICATION_BACKENDS = (
'users.views.CustomBackend',
#'django.contrib.auth.backends.ModelBackend',
)

CORS_ORIGIN_ALLOW_ALL = True
10 changes: 9 additions & 1 deletion drfbookstore/drfbookstore/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,16 @@
from django.views.generic import TemplateView
from drfbookstore.settings import MEDIA_ROOT
from books.views import BooksListViewSet
from users.views import UserViewset
from rest_framework.routers import DefaultRouter
from rest_framework_jwt.views import obtain_jwt_token
from rest_framework.authtoken import views


router = DefaultRouter()

# 配置goods的url,这个basename是干啥的
router.register(r'books', BooksListViewSet, base_name="books")
router.register(r'users', UserViewset, base_name="users")

urlpatterns = [
path('admin/', admin.site.urls),
Expand All @@ -21,5 +25,9 @@
re_path('^', include(router.urls)),
# 自动化文档,1.11版本中注意此处前往不要加$符号
path('docs/', include_docs_urls(title='书城文档')),
path('login/', obtain_jwt_token),
path('api-token-auth/', views.obtain_auth_token),
path('api-auth/', include('rest_framework.urls')),
path('login-page/', TemplateView.as_view(template_name='login.html'), name='login'),
]

66 changes: 66 additions & 0 deletions drfbookstore/templates/login.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.css" />
<div id="app">
<div class="field">
<p class="control has-icons-left has-icons-right">
<input v-model="username" class="input" type="email" placeholder="Email">
<span class="icon is-small is-left">
<i class="fas fa-envelope"></i>
</span>
<span class="icon is-small is-right">
<i class="fas fa-check"></i>
</span>
</p>
</div>
<div class="field">
<p class="control has-icons-left">
<input v-model="password" class="input" type="password" placeholder="Password">
<span class="icon is-small is-left">
<i class="fas fa-lock"></i>
</span>
</p>
</div>
<div class="field">
<a class="button is-danger" @click="login">Login</a>
</div>
</div>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.min.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!',
username: '',
password: '',
},
mounted: function () {
this.$nextTick(function () {
var self = this
$.ajax({
type: "GET",
url: "http://localhost:8000/users/1/",
dataType: 'json',
headers: {
"Authorization": "JWT " + window.localStorage.getItem("usertoken")
},
success: function (data){
self.username = data.username
alert('hello world')
}
});
})
},
methods: {
login () {
var params = {
'username': this.username,
'password': this.password,
}
$.post('http://localhost:8000/login/', params, function(data) {
window.localStorage.setItem("usertoken", data.token);
})
}
}
})
</script>

4 changes: 4 additions & 0 deletions drfbookstore/users/admin.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
from django.contrib import admin
from django.contrib.auth import get_user_model

user = get_user_model()

# Register your models here.
admin.site.register(user)
58 changes: 26 additions & 32 deletions drfbookstore/users/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,53 +1,47 @@
# Generated by Django 2.1.2 on 2018-11-01 03:35
# Generated by Django 2.1.2 on 2018-11-01 06:23

import django.contrib.auth.models
import django.contrib.auth.validators
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone


class Migration(migrations.Migration):

initial = True

dependencies = [
('auth', '0009_alter_user_last_name_max_length'),
]

operations = [
migrations.CreateModel(
name='Address',
name='UserProfile',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('is_delete', models.BooleanField(default=False, verbose_name='删除标记')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('recipient_name', models.CharField(max_length=20, verbose_name='收件人')),
('recipient_addr', models.CharField(max_length=256, verbose_name='收件地址')),
('zip_code', models.CharField(max_length=6, verbose_name='邮政编码')),
('recipient_phone', models.CharField(max_length=11, verbose_name='联系电话')),
('is_default', models.BooleanField(default=False, verbose_name='是否默认')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')),
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('name', models.CharField(blank=True, max_length=30, null=True, verbose_name='姓名')),
('birthday', models.DateField(blank=True, null=True, verbose_name='出生年月')),
('gender', models.CharField(choices=[('male', '男'), ('female', '女')], default='female', max_length=6, verbose_name='性别')),
('mobile', models.CharField(blank=True, help_text='电话号码', max_length=11, null=True, verbose_name='电话')),
('email', models.EmailField(blank=True, max_length=100, null=True, verbose_name='邮箱')),
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
],
options={
'db_table': 's_user_address',
'verbose_name': '用户信息',
'verbose_name_plural': '用户信息',
},
),
migrations.CreateModel(
name='Passport',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('is_delete', models.BooleanField(default=False, verbose_name='删除标记')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('username', models.CharField(max_length=20, verbose_name='用户名称')),
('password', models.CharField(max_length=40, verbose_name='用户密码')),
('email', models.EmailField(max_length=254, verbose_name='用户邮箱')),
('is_active', models.BooleanField(default=False, verbose_name='激活状态')),
managers=[
('objects', django.contrib.auth.models.UserManager()),
],
options={
'db_table': 's_user_account',
},
),
migrations.AddField(
model_name='address',
name='passport',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Passport', verbose_name='账户'),
),
]
41 changes: 21 additions & 20 deletions drfbookstore/users/models.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,26 @@
from datetime import datetime
from django.db import models
from db.base_model import BaseModel
from django.contrib.auth.models import AbstractUser

# Create your models here.
class Passport(BaseModel):
'''用户模型类'''
username = models.CharField(max_length=20, verbose_name='用户名称')
password = models.CharField(max_length=40, verbose_name='用户密码')
email = models.EmailField(verbose_name='用户邮箱')
is_active = models.BooleanField(default=False, verbose_name='激活状态')
class UserProfile(AbstractUser):
"""
用户表,新增字段如下
"""
GENDER_CHOICES = (
("male", u"男"),
("female", u"女")
)
# 用户注册时我们要新建user_profile 但是我们只有手机号
name = models.CharField(max_length=30, null=True, blank=True, verbose_name="姓名")
# 保存出生日期,年龄通过出生日期推算
birthday = models.DateField(null=True, blank=True, verbose_name="出生年月")
gender = models.CharField(max_length=6, choices=GENDER_CHOICES, default="female", verbose_name="性别")
mobile = models.CharField(null=True, blank=True, max_length=11, verbose_name="电话", help_text="电话号码")
email = models.EmailField(max_length=100, null=True, blank=True, verbose_name="邮箱")

class Meta:
db_table = 's_user_account'
verbose_name = "用户信息"
verbose_name_plural = verbose_name

class Address(BaseModel):
'''地址模型类'''
recipient_name = models.CharField(max_length=20, verbose_name='收件人')
recipient_addr = models.CharField(max_length=256, verbose_name='收件地址')
zip_code = models.CharField(max_length=6, verbose_name='邮政编码')
recipient_phone = models.CharField(max_length=11, verbose_name='联系电话')
is_default = models.BooleanField(default=False, verbose_name='是否默认')
passport = models.ForeignKey('Passport', verbose_name='账户', on_delete=models.CASCADE)

class Meta:
db_table = 's_user_address'
def __str__(self):
return self.username
30 changes: 30 additions & 0 deletions drfbookstore/users/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from rest_framework.validators import UniqueValidator
import re
from datetime import datetime, timedelta
from drfbookstore.settings import REGEX_MOBILE
from rest_framework import serializers
from django.contrib.auth import get_user_model

User = get_user_model()

class UserDetailSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ("username", "gender", "birthday", "email", "mobile")

class UserRegSerializer(serializers.ModelSerializer):
username = serializers.CharField(label="用户名", help_text="用户名", required=True, allow_blank=False,
validators=[UniqueValidator(queryset=User.objects.all(), message="用户已经存在")])
password = serializers.CharField(
style={'input_type': 'password'}, help_text="密码", label="密码", write_only=True,
)

# 不加字段名的验证器作用于所有字段之上。attrs是字段validate之后返回的总的dict
def validate(self, attrs):
attrs["mobile"] = attrs["username"]
return attrs

class Meta:
model = User
fields = ("username", "mobile", "password")

Loading

0 comments on commit e2675ef

Please sign in to comment.