mirror of
https://github.com/hequan2017/seal.git
synced 2026-11-06 07:07:23 +08:00
v0.1 基础版本
v0.1 基础版本
This commit is contained in:
0
system/__init__.py
Normal file
0
system/__init__.py
Normal file
32
system/admin.py
Normal file
32
system/admin.py
Normal 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
5
system/apps.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class SystemConfig(AppConfig):
|
||||
name = 'system'
|
||||
35
system/decorator/get_list.py
Normal file
35
system/decorator/get_list.py
Normal 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
33
system/form.py
Normal 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
|
||||
0
system/migrations/__init__.py
Normal file
0
system/migrations/__init__.py
Normal file
17
system/models.py
Normal file
17
system/models.py
Normal 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
3
system/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
10
system/urls.py
Normal file
10
system/urls.py
Normal 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
101
system/views.py
Normal 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')
|
||||
Reference in New Issue
Block a user