crm 系统项目(一) 登录,注册,校验
crm 系統項目(一) 登錄,注冊,校驗
首先創建一個Django項目,關于配置信息不多說,前面有~
models.py文件下創建需要的表格信息,之后導入數據庫
from django.db import models
from multiselectfield import MultiSelectField
course_choices = (('Linux', 'Linux中高級'),
('PythonFullStack', 'Python高級全棧開發'),)
class_type_choices = (('fulltime', '脫產班',),
('online', '網絡班'),
('weekend', '周末班',),)
source_type = (('qq', "qq群"),
('referral', "內部轉介紹"),
('website', "官方網站"),
('baidu_ads', "百度推廣"),
('office_direct', "直接上門"),
('WoM', "口碑"),
('public_class', "公開課"),
('website_luffy', "路飛官網"),
('others', "其它"),)
enroll_status_choices = (('signed', "已報名"),
('unregistered', "未報名"),
('studying', '學習中'),
('paid_in_full', "學費已交齊"))
seek_status_choices = (('A', '近期無報名計劃'), ('B', '1個月內報名'), ('C', '2周內報名'), ('D', '1周內報名'),
('E', '定金'), ('F', '到班'), ('G', '全款'), ('H', '無效'),)
pay_type_choices = (('deposit', "訂金/報名費"),
('tuition', "學費"),
('transfer', "轉班"),
('dropout', "退學"),
('refund', "退款"),)
attendance_choices = (('checked', "已簽到"),
('vacate', "請假"),
('late', "遲到"),
('absence', "缺勤"),
('leave_early', "早退"),)
score_choices = ((100, 'A+'),
(90, 'A'),
(85, 'B+'),
(80, 'B'),
(70, 'B-'),
(60, 'C+'),
(50, 'C'),
(40, 'C-'),
(0, ' D'),
(-1, 'N/A'),
(-100, 'COPY'),
(-1000, 'FAIL'),)
class Department(models.Model):
"""
部門表
"""
name = models.CharField(max_length=32, verbose_name="部門名稱")
count = models.IntegerField(verbose_name="人數", default=0)
# class Meta:
# db_table = 'xxx' # 表名
class UserProfile(models.Model):
"""
用戶表
"""
username = models.EmailField(max_length=255, unique=True,)
password = models.CharField(max_length=128)
name = models.CharField('名字', max_length=32)
department = models.ForeignKey('Department', default=None, blank=True, null=True)
mobile = models.CharField('手機', max_length=32, default=None, blank=True, null=True)
memo = models.TextField('備注', blank=True, null=True, default=None)
date_joined = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True)
class Customer(models.Model):
"""
客戶表
"""
qq = models.CharField('QQ', max_length=64, unique=True, help_text='QQ號必須唯一')
qq_name = models.CharField('QQ昵稱', max_length=64, blank=True, null=True)
name = models.CharField('姓名', max_length=32, blank=True, null=True, help_text='學員報名后,請改為真實姓名')
sex_type = (('male', '男'), ('female', '女'))
sex = models.CharField("性別", choices=sex_type, max_length=16, default='male', blank=True, null=True)
birthday = models.DateField('出生日期', default=None, help_text="格式yyyy-mm-dd", blank=True, null=True)
phone = models.BigIntegerField('手機號', blank=True, null=True)
source = models.CharField('客戶來源', max_length=64, choices=source_type, default='qq')
introduce_from = models.ForeignKey('self', verbose_name="轉介紹自學員", blank=True, null=True)
course = MultiSelectField("咨詢課程", choices=course_choices)
class_type = models.CharField("班級類型", max_length=64, choices=class_type_choices, default='fulltime')
customer_note = models.TextField("客戶備注", blank=True, null=True, )
status = models.CharField("狀態", choices=enroll_status_choices, max_length=64, default="unregistered",
help_text="選擇客戶此時的狀態")
network_consult_note = models.TextField(blank=True, null=True, verbose_name='網絡咨詢師咨詢內容')
date = models.DateTimeField("咨詢日期", auto_now_add=True)
last_consult_date = models.DateField("最后跟進日期", auto_now_add=True)
next_date = models.DateField("預計再次跟進時間", blank=True, null=True)
network_consultant = models.ForeignKey('UserProfile', blank=True, null=True, verbose_name='咨詢師',
related_name='network_consultant')
consultant = models.ForeignKey('UserProfile', verbose_name="銷售", related_name='customers', blank=True, null=True, )
class_list = models.ManyToManyField('ClassList', verbose_name="已報班級", )
class Campuses(models.Model):
"""
校區表
"""
name = models.CharField(verbose_name='校區', max_length=64)
address = models.CharField(verbose_name='詳細地址', max_length=512, blank=True, null=True)
class ClassList(models.Model):
"""
班級表
"""
course = models.CharField("課程名稱", max_length=64, choices=course_choices)
semester = models.IntegerField("學期")
campuses = models.ForeignKey('Campuses', verbose_name="校區")
price = models.IntegerField("學費", default=10000)
memo = models.CharField('說明', blank=True, null=True, max_length=100)
start_date = models.DateField("開班日期")
graduate_date = models.DateField("結業日期", blank=True, null=True)
teachers = models.ManyToManyField('UserProfile', verbose_name="老師")
class_type = models.CharField(choices=class_type_choices, max_length=64, verbose_name='班額及類型', blank=True,
null=True)
class Meta:
unique_together = ("course", "semester", 'campuses')
class ConsultRecord(models.Model):
"""
跟進記錄表
"""
customer = models.ForeignKey('Customer', verbose_name="所咨詢客戶")
note = models.TextField(verbose_name="跟進內容...")
status = models.CharField("跟進狀態", max_length=8, choices=seek_status_choices, help_text="選擇客戶此時的狀態")
consultant = models.ForeignKey("UserProfile", verbose_name="跟進人", related_name='records')
date = models.DateTimeField("跟進日期", auto_now_add=True)
delete_status = models.BooleanField(verbose_name='刪除狀態', default=False)
class Enrollment(models.Model):
"""
報名表
"""
why_us = models.TextField("為什么報名", max_length=1024, default=None, blank=True, null=True)
your_expectation = models.TextField("學完想達到的具體期望", max_length=1024, blank=True, null=True)
contract_agreed = models.BooleanField("我已認真閱讀完培訓協議并同意全部協議內容", default=False)
contract_approved = models.BooleanField("審批通過", help_text="在審閱完學員的資料無誤后勾選此項,合同即生效", default=False)
enrolled_date = models.DateTimeField(auto_now_add=True, verbose_name="報名日期")
memo = models.TextField('備注', blank=True, null=True)
delete_status = models.BooleanField(verbose_name='刪除狀態', default=False)
customer = models.ForeignKey('Customer', verbose_name='客戶名稱')
school = models.ForeignKey('Campuses')
enrolment_class = models.ForeignKey("ClassList", verbose_name="所報班級")
class Meta:
unique_together = ('enrolment_class', 'customer')
class PaymentRecord(models.Model):
"""
繳費記錄表
"""
pay_type = models.CharField("費用類型", choices=pay_type_choices, max_length=64, default="deposit")
paid_fee = models.IntegerField("費用數額", default=0)
note = models.TextField("備注", blank=True, null=True)
date = models.DateTimeField("交款日期", auto_now_add=True)
course = models.CharField("課程名", choices=course_choices, max_length=64, blank=True, null=True, default='N/A')
class_type = models.CharField("班級類型", choices=class_type_choices, max_length=64, blank=True, null=True,
default='N/A')
enrolment_class = models.ForeignKey('ClassList', verbose_name='所報班級', blank=True, null=True)
customer = models.ForeignKey('Customer', verbose_name="客戶")
consultant = models.ForeignKey('UserProfile', verbose_name="銷售")
delete_status = models.BooleanField(verbose_name='刪除狀態', default=False)
status_choices = (
(1, '未審核'),
(2, '已審核'),
)
status = models.IntegerField(verbose_name='審核', default=1, choices=status_choices)
confirm_date = models.DateTimeField(verbose_name="確認日期", null=True, blank=True)
confirm_user = models.ForeignKey(verbose_name="確認人", to='UserProfile', related_name='confirms', null=True,
blank=True)
class CourseRecord(models.Model):
"""課程記錄表"""
day_num = models.IntegerField("節次", help_text="此處填寫第幾節課或第幾天課程...,必須為數字")
date = models.DateField(auto_now_add=True, verbose_name="上課日期")
course_title = models.CharField('本節課程標題', max_length=64, blank=True, null=True)
course_memo = models.TextField('本節課程內容', max_length=300, blank=True, null=True)
has_homework = models.BooleanField(default=True, verbose_name="本節有作業")
homework_title = models.CharField('本節作業標題', max_length=64, blank=True, null=True)
homework_memo = models.TextField('作業描述', max_length=500, blank=True, null=True)
scoring_point = models.TextField('得分點', max_length=300, blank=True, null=True)
re_class = models.ForeignKey('ClassList', verbose_name="班級")
teacher = models.ForeignKey('UserProfile', verbose_name="講師")
class Meta:
unique_together = ('re_class', 'day_num')
class StudyRecord(models.Model):
"""
學習記錄
"""
attendance = models.CharField("考勤", choices=attendance_choices, default="checked", max_length=64)
score = models.IntegerField("本節成績", choices=score_choices, default=-1)
homework_note = models.CharField(max_length=255, verbose_name='作業批語', blank=True, null=True)
date = models.DateTimeField(auto_now_add=True)
note = models.CharField("備注", max_length=255, blank=True, null=True)
homework = models.FileField(verbose_name='作業文件', blank=True, null=True, default=None)
course_record = models.ForeignKey('CourseRecord', verbose_name="某節課程")
student = models.ForeignKey('Customer', verbose_name="學員")
class Meta:
unique_together = ('course_record', 'student')
mdels.py
urls.py
from django.contrib import admin
from django.conf.urls import url
from app1 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^index', views.index),
url(r'^reg', views.reg),
]
urls.py
login.html 登錄頁面
css樣式以及js用到Bootscraipt,
{% load static %}
{#靜態文件的方式#}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄界面</title>
<link rel="stylesheet" href="{% static 'css/reset.css' %}">
<link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<div id="particles-js">
<div class="login">
<div class="login-top">
登錄
</div>
<form action="" method="post">
{% csrf_token %} {# 由于沒有注釋中間件csrf, 需要在form 后 加此, 否則post失敗#}
<div class="login-center clearfix">
<div class="login-center-img"><img src="{% static 'img/name.png' %}"></div>
<div class="login-center-input">
<input type="text" name="user" value="admin" placeholder="請輸入您的用戶名" onfocus="this.placeholder=''"
onblur="this.placeholder='請輸入您的用戶名'">
<div class="login-center-input-text">用戶名</div>
</div>
</div>
<div class="login-center clearfix">
<div class="login-center-img"><img src="{% static 'img/password.png' %}"></div>
<div class="login-center-input">
<input type="password" name="pwd" value="" placeholder="請輸入您的密碼" onfocus="this.placeholder=''"
onblur="this.placeholder='請輸入您的密碼'">
<div class="login-center-input-text">密碼</div>
</div>
</div>
<p>{{ err_msg }}</p>
<div>
<button class="login-button">登錄</button>
</div>
</form>
</div>
<div class="sk-rotating-plane"></div>
<canvas class="particles-js-canvas-el" width="1343" height="163"></canvas>
</div>
<script src="{% static 'js/particles.min.js' %}"></script>
<script src="{% static 'js/app.js' %}"></script>
<script type="text/javascript">
function hasClass(elem, cls) {
cls = cls || '';
if (cls.replace(/s/g, '').length == 0) return false; //當cls沒有參數時,返回false
return new RegExp(' ' + cls + ' ').test(' ' + elem.className + ' ');
}
function addClass(ele, cls) {
if (!hasClass(ele, cls)) {
ele.className = ele.className == '' ? cls : ele.className + ' ' + cls;
}
}
function removeClass(ele, cls) {
if (hasClass(ele, cls)) {
var newClass = ' ' + ele.className.replace(/[
]/g, '') + ' ';
while (newClass.indexOf(' ' + cls + ' ') >= 0) {
newClass = newClass.replace(' ' + cls + ' ', ' ');
}
ele.className = newClass.replace(/^s+|s+$/g, '');
}
}
document.querySelector(".login-button").onclick = function () {
addClass(document.querySelector(".login"), "active")
setTimeout(function () {
addClass(document.querySelector(".sk-rotating-plane"), "active")
document.querySelector(".login").style.display = "none"
}, 800)
setTimeout(function () {
removeClass(document.querySelector(".login"), "active")
removeClass(document.querySelector(".sk-rotating-plane"), "active")
document.querySelector(".login").style.display = "block"
alert("登錄成功")
}, 5000)
}
</script>
</html>
View Code
reg.html 注冊頁面
css樣式以及js用到Bootscraipt,
form 標簽加上novalidate 前段不進行校驗
{{ form_obj.as_p }} ——》 生成所有的p標簽 label input
{{ form_obj.errors }} ——》所有字段的錯誤
{{ form_obj.user }} ——》 該字段的input框
{{ form_obj.user.label }} ——》 該字段的label 中文提示
{{ form_obj.user.id_for_label }} ——》 該字段的id
{{ form_obj.user.errors }} ——》 該字段的所有的錯誤信息
{{ form_obj.user.errors.0 }} ——》 該字段的第一個的錯誤信息
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap/css/bootstrap.css' %}">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-sm-6 col-sm-offset-3">
<form class="form-horizontal" method="post" action="" novalidate>
{% csrf_token %}
<div class="form-group">
<label for="{{ form_obj.username.id_for_label }}"
class="col-sm-2 control-label">{{ form_obj.username.label }}</label>
<div class="col-sm-10">
{{ form_obj.username }}
{{ form_obj.username.errors.0 }}
</div>
</div>
<div class="form-group">
<label for="{{ form_obj.password.id_for_label }}"
class="col-sm-2 control-label">{{ form_obj.password.label }}</label>
<div class="col-sm-10">
{{ form_obj.password }}
{{ form_obj.password.errors.0 }}
</div>
</div>
<div class="form-group">
<label for="{{ form_obj.re_password.id_for_label }}"
class="col-sm-2 control-label">{{ form_obj.re_password.label }}</label>
<div class="col-sm-10">
{{ form_obj.re_password }}
{{ form_obj.re_password.errors.0 }}
</div>
</div>
<div class="form-group">
<label for="{{ form_obj.name.id_for_label }}"
class="col-sm-2 control-label">{{ form_obj.name.label }}</label>
<div class="col-sm-10">
{{ form_obj.name }}
{{ form_obj.name.errors.0 }}
</div>
</div>
<div class="form-group">
<label for="{{ form_obj.department.id_for_label }}"
class="col-sm-2 control-label">{{ form_obj.department.label }}</label>
<div class="col-sm-10">
{{ form_obj.department }}
{{ form_obj.department.errors.0 }}
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">Sign in</button>
</div>
</div>
</form>
</div>
</div>
</div>
</body>
</html>
reg.html
app下新建 form.py 用于注冊時 form表單 建立校驗等
from django import forms
from app1 import models
from django.core.exceptions import ValidationError
import hashlib
# md5加密
def enc_md5(str=''):
md = hashlib.md5() #創建MD5對象
md.update(str.encode(encoding='utf-8'))
return md.hexdigest()
# 注冊form
class ReForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput(), label='密碼', min_length=6)
re_password = forms.CharField(widget=forms.PasswordInput(), label='確認密碼', min_length=6)
class Meta: #通過models 自動創建表單
model = models.UserProfile
fields = "__all__" # 所有字段
# fields = ['username','password']
exclude = ['is_active'] # 排除某些字段
labels = {
'username': '用戶名',
'password': '密碼',
# 're_password': '確認密碼',
'department': '部門',
}
widgets = {
# 'password': forms.PasswordInput(attrs={'class': 'form-control'})
}
error_messages = {
'username': {
'required': '不能為空',
'invalid': '格式錯誤'
}
}
# 給某些表單添加bootscript 類名
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.fields.values():
field.widget.attrs.update({'class': 'form-control'})
# 全局鉤子驗證
def clean(self):
pwd = self.cleaned_data.get('password')
re_pwd = self.cleaned_data.get('re_password')
if pwd == re_pwd and pwd:
# 對密碼進行加密
# md5 = hashlib.md5()
# md5.update(pwd.encode("utf-8"))
# pwd = md5.hexdigest()
# print(pwd)
enc_md5(pwd)
print(enc_md5(pwd))
self.cleaned_data['password'] = pwd
return self.cleaned_data
self.add_error('re_password', '兩次密碼不一致')
raise ValidationError('兩次密碼不一致')
View Code
views.py 視圖
from django.shortcuts import render, redirect, HttpResponse
from app1 import models
import hashlib
from app1.forms import ReForm
# md5加密
def enc_md5(str=''):
md = hashlib.md5() #創建MD5對象
md.update(str.encode(encoding='utf-8'))
return md.hexdigest()
def index(request):
HttpResponse('hahahhahh')
# 登錄
def login(request):
err_msg = ''
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd')
print(user)
# md5 = hashlib.md5()
# md5.update(pwd.encode('utf-8'))
# pwd = md5.hexdigest()
enc_md5(pwd)
# 按照輸入賬戶密碼從數據庫中查找
obj = models.UserProfile.objects.filter(username=user, password=pwd, is_active=True).first()
if obj:
return redirect('/index/')
err_msg = '用戶名或密碼錯誤'
return render(request, 'login.html', {'err_msg': err_msg})
# 注冊
def reg(request):
form_obj = ReForm() #form表單校驗之后的結果
if request.method == 'POST':
form_obj = ReForm(request.POST) #把 POST 請求放入到form 驗證
if form_obj.is_valid(): #如果通過驗證
form_obj.save() #保存數據
return redirect('/login/')
return render(request, 'reg.html',{'form_obj':form_obj})
View Code
效果圖:
登錄 >>>>>>>>>
注冊 >>>>>>>>>>>>>>
總結
以上是生活随笔為你收集整理的crm 系统项目(一) 登录,注册,校验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查询树形的根节点
- 下一篇: excell之如何添加下拉菜单,测试用例