v0.1 基础版本

v0.1 基础版本
This commit is contained in:
何全
2019-03-02 12:02:55 +08:00
parent 16f25e8147
commit a059c74cb4
2331 changed files with 524759 additions and 2 deletions

0
system/__init__.py Normal file
View File

32
system/admin.py Normal file
View File

@@ -0,0 +1,32 @@
from django.contrib import admin
from system.models import Users
from django.contrib.auth.admin import UserAdmin
class UsersAdmin(UserAdmin):
fieldsets = (
(None, {'fields': ('username', 'password')}),
('基本信息', {'fields': ('first_name', 'last_name', 'email')}),
('权限', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
('登录时间', {'fields': ('last_login', 'date_joined')}),
('其他信息', {'fields': (
'position', 'avatar', 'mobile',)}),
)
@classmethod
def show_group(self, obj):
return [i.name for i in obj.groups.all()]
@classmethod
def show_user_permissions(self, obj):
return [i.name for i in obj.user_permissions.all()]
list_display = ('username', 'show_group', 'show_user_permissions')
list_display_links = ('username',)
search_fields = ('username',)
filter_horizontal = ('groups', 'user_permissions')
admin.site.register(Users, UsersAdmin)
admin.site.site_header = '海豹管理后台'
admin.site.site_title = admin.site.site_header

5
system/apps.py Normal file
View File

@@ -0,0 +1,5 @@
from django.apps import AppConfig
class SystemConfig(AppConfig):
name = 'system'

View File

@@ -0,0 +1,35 @@
from functools import wraps
def get_list(function):
"""
列表页面 获取 搜索
:param function: self.model
:return:
"""
@wraps(function)
def wrapped(self):
# user = self.request.user
# groups = [x['name'] for x in self.request.user.groups.values()]
# request_type = self.request.method
# model = str(self.model._meta).split(".")[1]
filter_dict = {}
not_list = ['page', 'order_by', 'csrfmiddlewaretoken']
for k, v in dict(self.request.GET).items():
if [i for i in v if i != ''] and (k not in not_list):
if '__in' in k:
filter_dict[k] = v
else:
filter_dict[k] = v[0]
self.filter_dict = filter_dict
self.queryset = self.model.objects.filter(**filter_dict).order_by('-id')
order_by_val = self.request.GET.get('order_by', '')
if order_by_val:
self.queryset = self.queryset.order_by(order_by_val) if self.queryset else self.queryset
result = function(self)
return result
return wrapped

33
system/form.py Normal file
View File

@@ -0,0 +1,33 @@
from django import forms
class UserPasswordForm(forms.Form):
old_password = forms.CharField(max_length=128, widget=forms.PasswordInput, label='旧密码')
new_password = forms.CharField(min_length=8, max_length=128, widget=forms.PasswordInput, label='新密码',
help_text="* 你的密码必须包含至少 8 个字符,不能是大家都爱用的常见密码,不能全部为数字")
confirm_password = forms.CharField(min_length=8, max_length=128, widget=forms.PasswordInput, label='确认密码',
help_text="* 和上面密码一致")
def __init__(self, *args, **kwargs):
self.instance = kwargs.pop('instance')
super().__init__(*args, **kwargs)
def clean_old_password(self):
old_password = self.cleaned_data['old_password']
if not self.instance.check_password(old_password):
raise forms.ValidationError('旧密码错误')
return old_password
def clean_confirm_password(self):
new_password = self.cleaned_data['new_password']
confirm_password = self.cleaned_data['confirm_password']
if new_password != confirm_password:
raise forms.ValidationError('新密码与确认密码不一致')
return confirm_password
def save(self):
password = self.cleaned_data['new_password']
self.instance.set_password(password)
self.instance.save()
return self.instance

View File

17
system/models.py Normal file
View File

@@ -0,0 +1,17 @@
from django.db import models
from django.contrib.auth.models import AbstractUser, Group, User
# Create your models here.
class Users(AbstractUser):
position = models.CharField(max_length=64, verbose_name='职位信息', blank=True, null=True)
avatar = models.CharField(max_length=256, verbose_name='头像', blank=True, null=True)
mobile = models.CharField(max_length=11, verbose_name='手机', blank=True, null=True)
class Meta:
db_table = 'users'
verbose_name = '用户信息'
verbose_name_plural = verbose_name
def __str__(self):
return self.username

3
system/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

10
system/urls.py Normal file
View File

@@ -0,0 +1,10 @@
from django.urls import path
from system.views import login_view, UserPasswordUpdateView, logout_view
app_name = "system"
urlpatterns = [
path('login', login_view, name="login"),
path('password_update', UserPasswordUpdateView.as_view(), name="password_update"),
path('logout', logout_view, name="logout"),
]

101
system/views.py Normal file
View File

@@ -0,0 +1,101 @@
import logging
from django.shortcuts import render
from django.contrib.auth import authenticate, login
from django.shortcuts import redirect, render
from system.models import Users
from django.urls import reverse_lazy
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from system.form import UserPasswordForm
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.contrib.auth.decorators import login_required
from django.views.generic import ListView, View, DetailView, CreateView, UpdateView
from django.contrib.auth import logout
logger = logging.getLogger('users')
class CustomBackend(ModelBackend):
"""
用户名字/邮箱名字 登录
:param request:
:return:
"""
def authenticate(self, request, username=None, password=None, **kwargs):
try:
user = Users.objects.get(Q(username=username) | Q(email=username))
if user.check_password(password):
return user
except Exception as e:
logger.error(e)
return None
def login_view(request):
"""
登录
:param request: username,password
:return:
"""
error_msg = "用户名或密码错误,或者被禁用,请重试"
if request.method == "GET":
return render(request, 'system/login.html', {'error_msg': error_msg, })
if request.method == "POST":
u = request.POST.get("username")
p = request.POST.get("password")
user = authenticate(request, username=u, password=p)
if user is not None:
if user.is_active:
login(request, user)
request.session['is_login'] = True
login_ip = request.META['REMOTE_ADDR']
return redirect('/index')
else:
return render(request, 'system/login.html', {'error_msg': error_msg, })
else:
return render(request, 'system/login.html', {'error_msg': error_msg, })
@login_required(login_url="/system/login")
def index(request):
"""
首页
:param request:
:return:
"""
return render(request, 'system/index.html')
class UserPasswordUpdateView(LoginRequiredMixin, UpdateView):
"""
修改密码
:param request:
:return:
"""
template_name = 'system/password.html'
model = Users
form_class = UserPasswordForm
success_url = reverse_lazy('system:logout')
def get_object(self, queryset=None):
return self.request.user
def get_context_data(self, **kwargs):
return super().get_context_data(**kwargs)
def get_success_url(self):
return super().get_success_url()
def logout_view(request):
"""
注销
:param request:
:return:
"""
logout(request)
return redirect('system:login')