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>×</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 \