Django 的员工信息系统

本文介绍了使用 Django 框架构建员工信息系统的全过程,包括登录验证、分页查询、多条件查询、增删改数据及登录拦截等功能。详细讲解了创建管理员模型、配置数据库、前端页面设计、验证码生成、视图函数编写、分页查询实现、URL映射、中间件编写等关键步骤。
摘要由CSDN通过智能技术生成

Django 的员工信息系统

将之前用 ssm 框架搭建的系统再次用 Django 的框架来实现
这里可以移步个人博客

码云地址在文末

功能实现:

  • 登录权限验证
  • 登录状态检测
  • 员工信息分页查询显示
  • 多条件联合查询
  • 增删改数据

一、登录验证

1. 创建管理员模型和用户模型

# user\models.py
from django.db import models


class User(models.Model):
    """用户类"""

    id = models.AutoField(primary_key=True, db_column='id', verbose_name='编号')
    name = models.CharField(max_length=20, db_column='name', verbose_name='名字')
    gender = models.CharField(max_length=20, db_column='gender', verbose_name='性别')
    age = models.CharField(max_length=20, db_column='age', verbose_name='年龄')
    address = models.CharField(max_length=20, db_column='address', verbose_name='籍贯')
    qq = models.CharField(max_length=20, db_column='qq', verbose_name='QQ')
    email = models.CharField(max_length=20, db_column='email', verbose_name='邮箱')

    class Meta:
        db_table = 'user'


class Admin(models.Model):
    """管理员"""

    id = models.AutoField(primary_key=True, db_column='id', verbose_name='编号')
    username = models.CharField(max_length=20, db_column='username', verbose_name='用户名')
    password = models.CharField(max_length=20, db_column='password', verbose_name='密码')

    class Meta:
        db_table = 'manager'

2. 配置MySQL数据库

参考上一篇博客

3. 迁移数据模型

# 迁移 Django 内置的管理数据表
(venv)$ python manage.py migrate
# 生成我们的数据迁移文件
(venv)$ python manage.py makemigrations user
# 迁移我们的数据表
(venv)$ python manage.py migrate

3. 映射 URL

# UserSystem\urls.py
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('user.urls')),
]
# user\urls.py
urlpatterns = [
    # 登录的url
    path('login/', views.login, name='login'),
    # 获取图片验证码
    path('get_captcha/', views.get_captcha, name='get_captcha'),
]

4. 配置全局静态文件

# UserSystem\settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

5. 配置全局默认基本 url

# user\context_processors.py
from UserSystem import settings

def base_url(request):
    if settings.DEBUG:
        return {
   'BASE_URL': 'http://localhost:8000/'}
# 注册到 UserSystem\settings.py
TEMPLATES = [
    {
   
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
   
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                # 注册我们自己配置的文件
                'user.context_processors.base_url'
            ],
        },
    },
]

6. 关闭 xss token

这是 Django 中为了避免存在跨站脚本攻击漏洞而对网页表单的强制要求,我们在开发过程中可以先将这个模块注释掉

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 注释 网页表单验证组件
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

7. 编写前端页面

<!-- templates\login.html -->
<div class="container" style="width: 400px;">
  		<h3 style="text-align: center;">管理员登录</h3>
        <form action="/login/" method="post">
	      <div class="form-group">
	        <label for="username">用户名:</label>
	        <input type="text" name="username" class="form-control" id="username" placeholder="请输入用户名"/>
	      </div>
	      
	      <div class="form-group">
	        <label for="password">密码:</label>
	        <input type="password" name="password" class="form-control" id="password" placeholder="请输入密码"/>
	      </div>
	      
	      <div class="form-inline">
	        <label for="vcode">验证码:</label>
	        <input type="text" name="verifycode" class="form-control" id="verifycode" placeholder="请输入验证码" style="width: 120px;"/>
	        <a href="javascript:refreshCode()">
				<img src="{
    {pageContext.request.contextPath}}/get_captcha/" title="看不清点击刷新" id="vcode"/></a>
	      </div>
	      <hr/>
	      <div class="form-group" style="text-align: center;">
	        <input class="btn btn btn-primary" type="submit" value="登录">
	       </div>
	  	</form>
		
		<!-- 出错显示的信息框 -->
        {% if request.session.error %}
        <div class="alert alert-warning alert-dismissible" role="alert">
		    <button type="button" class="close" data-dismiss="alert" >
		  	<span>&times;</span></button>
		    <strong>{
  {request.session.error}}</strong>
        </div>
        {% endif %}
    </div>

8. 编写验证码生成

# user\captcha.py
import os
import random

from io import BytesIO

from PIL import Image
from PIL import ImageFilter
from PIL.ImageDraw import Draw
from PIL.ImageFont import truetype

from UserSystem.settings import BASE_DIR


class Bezier(object):
    """贝塞尔曲线"""

    def __init__(self):
        self.tsequence = tuple([t / 20.0 for t in range(21)])
        self.beziers = {
   }

    def make_bezier(self, n):
        """绘制贝塞尔曲线"""
        try:
            return self.beziers[n]
        except KeyError:
            combinations = pascal_row(n - 1)
            result = []
            for t in self.tsequence:
                tpowers = (t ** i for i in range(n))
                upowers = ((1 - t) ** i for i in range(n - 1, -1, -1))
                coefs = [c * a * b for c, a, b in zip(combinations,
                                                      tpowers, upowers)]
                result.append(coefs)
            self.beziers[n] = result
            return result


class Captcha(object):
    """验证码"""

    def __init__(self, width, height, fonts=None, color=None):
        self._image = None
        self._fonts = fonts if fonts else \
            
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值