/ 2019-04-19
8. 用户表,存储销售、讲师账户信息
这里我们用django自带的认证系统,并对其进行自定制
class UserProfile(auth.AbstractBaseUser, auth.PermissionsMixin):
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,
)
password = models.CharField(_('password'), max_length=128,
help_text=mark_safe('''<a class='btn-link' href='password'>重置密码</a>'''))
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
is_staff = models.BooleanField(
verbose_name='staff status',
default=True,
help_text='Designates whether the user can log into this admin site.',
)
name = models.CharField(max_length=32)
#role = models.ForeignKey("Role",verbose_name="权限角色")
branch = models.ForeignKey("Branch",verbose_name="所属校区",blank=True,null=True)
roles = models.ManyToManyField('Role',blank=True)
memo = models.TextField('备注', blank=True, null=True, default=None)
date_joined = models.DateTimeField(blank=True, null=True, auto_now_add=True)
USERNAME_FIELD = 'email'
# REQUIRED_FIELDS = ['name','token','department','tel','mobile','memo']
REQUIRED_FIELDS = ['name']
def get_full_name(self):
# The user is identified by their email address
return self.email
def get_short_name(self):
# The user is identified by their email address
return self.email
def __str__(self): # __str__ on Python 2
return self.email
# def has_perm(self, perm, obj=None):
# "Does the user have a specific permission?"
# # Simplest possible answer: Yes, always
# return True
def has_perms(self, perm, obj=None):
"Does the user have a specific permission?"
# Simplest possible answer: Yes, always
return True
def has_module_perms(self, app_label):
"Does the user have permissions to view the app `app_label`?"
# Simplest possible answer: Yes, always
return True
@property
def is_superuser(self):
"Is the user a member of staff?"
# Simplest possible answer: All admins are staff
return self.is_admin
class Meta:
verbose_name = '用户信息'
verbose_name_plural = u"用户信息"
objects = auth.UserManager()
class Meta:
verbose_name = 'CRM账户'
verbose_name_plural = 'CRM账户'
UserProfile
9. 角色表,用于角色划分,用于权限管理,权限功能我们后面会实现,这里只在表里先存个简单的角色名
class Role(models.Model):
'''角色信息'''
name = models.CharField(max_length=32,unique=True)
menus = models.ManyToManyField('FirstLayerMenu',blank=True)
def __str__(self):
return self.name
Role
10. 校区表,存储不同校区
class Branch(models.Model):
'''存储所有校区'''
name = models.CharField(max_length=64,unique=True)
def __str__(self):
return self.name
11. 菜单表,不同的角色看到的菜单不同, 我们支持动态菜单 ,所以需要把菜单 以及 和角色的关联存下
class FirstLayerMenu(models.Model):
'''第一层侧边栏菜单'''
name = models.CharField('菜单名',max_length=64)
url_type_choices = ((0,'related_name'),(1,'absolute_url'))
url_type = models.SmallIntegerField(choices=url_type_choices,default=0)
url_name = models.CharField(max_length=64,unique=True)
order = models.SmallIntegerField(default=0,verbose_name='菜单排序')
sub_menus = models.ManyToManyField('SubMenu',blank=True)
def __str__(self):
return self.name
FirstLayerMenu
12. 二级菜单表, 还可以支持2级子菜单
class SubMenu(models.Model):
'''第二层侧边栏菜单'''
name = models.CharField('二层菜单名', max_length=64)
url_type_choices = ((0,'related_name'),(1,'absolute_url'))
url_type = models.SmallIntegerField(choices=url_type_choices,default=0)
url_name = models.CharField(max_length=64, unique=True)
order = models.SmallIntegerField(default=0, verbose_name='菜单排序')
def __str__(self):
return self.name
SubMenu
13. 缴费记录
class PaymentRecord(models.Model):
enrollment = models.ForeignKey("Enrollment")
pay_type_choices = (('deposit', u"订金/报名费"),
('tution', u"学费"),
('refund', u"退款"),
)
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)
consultant = models.ForeignKey(UserProfile, verbose_name="负责老师", help_text="谁签的单就选谁")
def __str__(self):
return "%s, 类型:%s,数额:%s" %(self.enrollment.customer, self.pay_type, self.paid_fee)
class Meta:
verbose_name = '交款纪录'
verbose_name_plural = "交款纪录"
PaymentRecord
好啦,表基本都建完了,接下来同步数据库,不过在同步数据库前,要改一下settings.py, 因为我们自定义了django的认证表,所以需要明确的告诉django,用我们改过的过来做默认的认证系统。
在settings.py中添加以下行,格式为 app.modelname
AUTH_USER_MODEL = 'crm.UserProfile'
最后一步,同步数据库!
python3 manage.py makemigrations
python3 manage.py migrate
(0)