基于Django+MySQL+HTML的用户注册

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect


class AuthMiddleware(MiddlewareMixin):
    def process_request(self, request):
        # 排除那些不需要登录就能访问的页面
        if request.path_info in ["/login/","image/code/"]:
            return
        # 读取当前访问session信息
        info_dict = request.session.get("info")
        if info_dict:
            return

        # 若没有登录
        return redirect('/login/')

中间件

class BootStrap:
    bootstrap_exclude_fields = []

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        #             重新定义init方法写上super就是执行父类的方法
        for name, field in self.fields.items():
            if name in self.bootstrap_exclude_fields:
                continue
            if field.widget.attrs:
                field.widget.attrs['class'] = 'form-control'
                field.widget.attrs['placeholder'] = field.label
            else:
                field.widget.attrs = {"class": "form-control", "placeholder": field.label}


class BootStrapForm(BootStrap, forms.ModelForm):
    pass


class BootStrapFormForm(BootStrap, forms.Form):
    pass

Class BootStrapForm是modelForm模板

Class BootStrapFormForm是Form模板

def md5(data_string):
    # salt = "xxxxxxxx"
    # obj = hashlib.md5(salt.encode('utf-8'))
    obj = hashlib.md5(settings.SECRET_KEY.encode('utf8'))
    obj.update(data_string.encode('utf-8'))
    return obj.hexdigest()

对输入的字符串进行MD5哈希加密

from new_freshman import models
from django import forms
from django.core.validators import RegexValidator
from django.core.validators import ValidationError
from new_freshman.utils.bootstrap import BootStrapForm



class UserModelForm(BootStrapForm):
    name = forms.CharField(min_length=2, label='用户名',widget=forms.TextInput(attrs={'class':'form-control'}))
    password = forms.CharField(min_length=6, label='密码')

    class Meta:
        model = models.Employee
        fields = ["name", "age", "password", "gender", "time", "depart"]
        # widgets = {
        #     "name": forms.TextInput(attrs={'class': 'form-control'}),
        #     "age": forms.TextInput(attrs={'class': 'form-control'}),
        #     "password": forms.TextInput(attrs={'class': 'form-control'}),
        # }


class PrettyForm(BootStrapForm):
    mobile = forms.CharField(
        label='手机号',
        validators=[RegexValidator(r'^1[3,9]\d{9}$', '手机号格式错误')],
    )

    # 验证方式一(正则)
    # r'^1[3,9]\d{9}$'表示第一个数为1第二个数为3-9,后面9位随意
    # validators = [RegexValidator(r'^159[0-9]+$','数字必须以159开头')]

    class Meta:
        model = models.PrettyNum
        fields = ["mobile", "price", "level", "status"]
        # fields = "__all__"  所有数据
        # exclude = ['level']  除了level外的所有数据
        # widgets = {
        #     "name": forms.TextInput(attrs={'class': 'form-control'}),
        #     "age": forms.TextInput(attrs={'class': 'form-control'}),
        #     "password": forms.TextInput(attrs={'class': 'form-control'}),
        # }
    # 验证方式二(钩子方法)

    def clean_mobile(self):
        txt_mobile = self.cleaned_data['mobile']

        exists = models.PrettyNum.objects.filter(mobile=txt_mobile).exists()
        if exists:
            raise ValidationError("手机号已经存在")
        #         若不通过,就会返还错误信息
        return txt_mobile



class PrettyEditForm(BootStrapForm):
        # mobile = forms.CharField(disabled=True,label='手机号')

        class Meta:
            model = models.PrettyNum
            fields = ["mobile", "price", "level", "status"]

        def clean_mobile(self):
            txt_mobile = self.cleaned_data.get('mobile')

            exists = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txt_mobile).exists()
            if exists:
                raise ValidationError("手机号已经存在")
                #         若不通过,就会返还错误信息
            return txt_mobile

继承上面Bootstrap样式

from django.utils.safestring import mark_safe
import copy


class Pagination(object):
    def __init__(self, request, queryset, page_size=10, page_param="page", plus=5):

        query_dict = copy.deepcopy(request.GET)
        query_dict._mutable = True
        self.query_dict = query_dict
        query_dict.setlist('xx', [11])
        self.page_param = page_param
        page = request.GET.get(page_param, "1")
        if page.isdecimal():
            page = int(page)
        else:
            page = 1
            # 若输入中文则拿到第一页

        self.page = page
        self.page_size = page_size
        self.start = (page - 1) * page_size
        self.end = page * page_size

        self.page_queryset = queryset[self.start:self.end]

        total = queryset.count()
        # 数据总条数
        # 按等级降序排
        # 数据库desc
        total_page_count, div = divmod(total, page_size)
        if div:
            total_page_count += 1
        # 相除得总页数
        self.total_page_count = total_page_count
        self.plus = plus

    def html(self):

        if self.total_page_count <= 2 * self.plus + 1:
            start_page = 1
            end_page = self.total_page_count
        #     # 数据比较少,少于11页
        else:
            if self.page <= self.plus:
                start_page = 1
                end_page = 2 * self.plus + 1
            #     当前页小于5时
            else:

                if (self.page + self.plus) > self.total_page_count:
                    start_page = self.total_page_count - 2 * self.plus
                    end_page = self.total_page_count
                    #     当前页大于五
                else:
                    start_page = self.page - self.plus
                    end_page = self.page + self.plus

            # 显示前后五页
            # 数据库数据多,大于11页

        page_circle = []
        self.query_dict.setlist(self.page_param,[1])

        page_circle.append('<li><a href="?{}">首页</a></li>'.format(self.query_dict.urlencode()))

        if self.page > 1:
            self.query_dict.setlist(self.page_param, [self.page-1])
            prev = '<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode())
        else:
            self.query_dict.setlist(self.page_param, [1])
            prev = '<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode())
        page_circle.append(prev)

        for i in range(start_page, end_page + 1):
            self.query_dict.setlist(self.page_param, [i])
            # for i in range(1, total_page_count+1):
            if i == self.page:
                ele = '<li class = "active"><a href="?={}">{}</a></li>'.format(self.query_dict.urlencode(), i)
            else:
                ele = '<li><a href="?={}">{}</a></li>'.format(self.query_dict.urlencode(), i)
            page_circle.append(ele)

        if self.page < self.total_page_count:
            self.query_dict.setlist(self.page_param, [self.page + 1])
            self.query_dict.urlencode()
            prev = '<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode())
        else:
            self.query_dict.setlist(self.page_param, [self.total_page_count])
            prev = '<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode())
        page_circle.append(prev)

        self.query_dict.setlist(self.page_param, [self.total_page_count])
        page_circle.append('<li><a href="?{}">尾页</a></li>'.format(self.query_dict.urlencode()))

        search_string = """
                       <li>
                            <form style="float: left; margin-left: -1px" method="get">
                                <input name="page"
                                        style="position: relative;float: left;display: inline-block;width: 80px; border-radius: 0"
                                        type="text" class="form-control" placeholder="页码">
                                <button style="border-radius: 0" class="btn btn-default" type="submit">跳转</button>
                            </form>
                        </li>
                        """
        page_circle.append(search_string)
        page_string = mark_safe(''.join(page_circle))
        # ''.join(page_circle)是一个字符串,需要导入from django.utils.safestring import mark_safe
        # mark_safe()将字符串在前端转换成分页形式
        return page_string

分页模板

from django.shortcuts import render, redirect
from new_freshman import models
from django import forms
from new_freshman.utils.bootstrap import BootStrapFormForm
from django.core.exceptions import ValidationError
from new_freshman.utils.encrypt import md5
from new_freshman.utils.code import check_code
from io import BytesIO


class LoginForm(BootStrapFormForm):
    username = forms.CharField(label="用户名", widget=forms.TextInput, required=True)
    password = forms.CharField(label="密码", widget=forms.PasswordInput(render_value=True), required=True)

    def clean_password(self):
        password = self.cleaned_data.get('password')
        return md5(password)


def login(request):
    if request.method == 'GET':
        form = LoginForm()
        return render(request, "login.html", {'form': form})

    form = LoginForm(request.POST)
    if form.is_valid():

        admin_object = models.Admin.objects.filter(**form.cleaned_data).first()
        if not admin_object:
            form.add_error("password", "用户名或密码错误")
            return render(request, "login.html", {'form': form})

        # 网站随机生成字符串;写到用户浏览器的cookie中;在写入到session中;
        request.session["info"] = {"id": admin_object.id, "name": admin_object.username}

        return redirect("/admin_list/")

    return render(request, "login.html", {'form': form})


def logout(request):
    request.session.clear()
    return redirect("/login")

# def image_code(request):
#
#     img, code_string = check_code()
#     print(code_string)
#
#     stream = BytesIO()
#     img.save(stream,'png')
#     return HttpResponse(stream.getvalue())

管理员登录界面

from django.shortcuts import render, redirect
from new_freshman import models
from new_freshman.utils.pagination import Pagination
from django import forms
from new_freshman.utils.bootstrap import BootStrapForm
from django.core.exceptions import ValidationError
from new_freshman.utils.encrypt import md5


def admin_list(request):
    # 检查用户是否登录
    # 用户发请求,获取cookie字符串,与session中的字符串对比是否有登陆过
    # info = request.session.get("info")
    # if not info:
    #     return redirect("/login")
    info_dict = request.session.get('info', None)

    data_dict = {}
    search = request.GET.get('q', "")
    if search:
        data_dict["username__contains"] = search

    queryset = models.Admin.objects.filter(**data_dict)

    page_object = Pagination(request, queryset)
    context = {'queryset': page_object.page_queryset, "page_string": page_object.html(), "search": search}

    return render(request, "admin_list.html", context)


class AdminModelForm(BootStrapForm):
    confirm_password = forms.CharField(label="确认密码", widget=forms.PasswordInput(render_value=True))

    # render_value=True密码输入错误后不会消失

    class Meta:
        model = models.Admin
        fields = ["username", "password", "confirm_password"]
        widgets = {
            "password": forms.PasswordInput(render_value=True)
        }

    def clean_password(self):
        password = self.cleaned_data.get("password")
        return md5(password)

    def clean_confirm_password(self):
        password = self.cleaned_data.get('password')
        confirm = md5(self.cleaned_data.get("confirm_password"))
        if confirm != password:
            raise ValidationError("密码不一致")
        return confirm


class AdminEditModelForm(BootStrapForm):
    class Meta:
        model = models.Admin
        fields = ["username"]


class AdminResetModelForm(BootStrapForm):
    confirm_password = forms.CharField(label="确认密码", widget=forms.PasswordInput(render_value=True))

    class Meta:
        model = models.Admin
        fields = ["password"]
        widgets = {
            "password": forms.PasswordInput(render_value=True)
        }

    def clean_password(self):
        password = self.cleaned_data.get("password")
        md5_pwd = md5(password)
        exists = models.Admin.objects.filter(id=self.instance.pk, password=md5_pwd).exists()
        if exists:
            raise ValidationError("不能与以前的密码一致")
        return md5_pwd

    def clean_confirm_password(self):
        password = self.cleaned_data.get('password')
        confirm = md5(self.cleaned_data.get("confirm_password"))
        if confirm != password:
            raise ValidationError("密码不一致")
        return confirm


def admin_add(request):
    title = "新建管理员"

    if request.method == "GET":
        form = AdminModelForm()
        return render(request, "change.html", {'form': form, "title": title})

    form = AdminModelForm(data=request.POST)
    if form.is_valid():
        form.save()
        return redirect('/admin_list/')

    return render(request, "change.html", {'form': form, "title": title})


def admin_edit(request, nid):
    row_object = models.Admin.objects.filter(id=nid).first()
    if not row_object:
        return render(request, "error.html", {"msg": "数据不存在"})
    title = "编辑管理员"
    if request.method == "GET":
        form = AdminEditModelForm(instance=row_object)
        return render(request, "change.html", {"form": form, "title": title})

    form = AdminEditModelForm(data=request.POST, instance=row_object)
    if form.is_valid():
        form.save()
        return redirect('/admin_list/')

    return render(request, "change.html", {'form': form, "title": title})


def admin_delete(request, nid):
    models.Admin.objects.filter(id=nid).delete()

    return redirect("/admin_list/")


def admin_reset(request, nid):
    row_object = models.Admin.objects.filter(id=nid).first()
    if not row_object:
        return render(request, "error.html", {"msg": "数据不存在"})

    title = "重置密码 - {}".format(row_object.username)
    if request.method == "GET":
        form = AdminResetModelForm()
        return render(request, "change.html", {"form": form, "title": title})

    form = AdminResetModelForm(data=request.POST, instance=row_object)
    if form.is_valid():
        form.save()
        return redirect('/admin_list/')
    return render(request, "change.html", {"form": form, "title": title})

部门管理

完整功能展示

用户注册

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值