Django之CRM系统
Django之CRM系统:
这是一个初级版本的crm系统,里面集成了:rbac权限组件和stark增删改查组件。下面来介绍这个crm系统:
1、表设计:

2、rbac组件:
来自:http://www.cnblogs.com/sheng-247/articles/8269352.html
3、stark组件
来自: http://www.cnblogs.com/sheng-247/articles/8315642.html
4、使用方法
1、从权限设置开始:
1. 清除rbac/migrations目录下除了__init__.py 以外的所有文件。 2. 业务用户表继承rabc的UserInfo表,并生成数据库表 (在设计新的业务表的时候,用户表应该继承这个UserInfo类) rbac的用户表结构已经发生改变: class UserInfo(models.Model): """ 用户表 """ name = models.CharField(verbose_name='用户名', max_length=32) password = models.CharField(verbose_name='密码', max_length=64) email = models.CharField(verbose_name='邮箱', max_length=32) session_key = models.CharField(verbose_name='当前登录用户的session_key', max_length=40, null=True, blank=True) # 1. to="Role" 改为 to=Role,因为被继承后会造成Role表不知道去哪里找。 roles = models.ManyToManyField(verbose_name='拥有的所有角色', to=Role) # 2. 这是为"抽象类",让其他models类继承 class Meta: abstract = True def __str__(self): return self.name 3. 设置配置文件 # 注册app INSTALLED_APPS = [ ... 'rbac.apps.RbacConfig', ] # 应用中间件 MIDDLEWARE = [ ... 'rbac.middlewares.rbac.RbacMiddleware', ] # 保存权限信息的session key PERMISSION_SESSION_KEY = 'UKY7F97FUYN' # 保存菜单信息的session key MENU_LIST_SESSION_KEY = "FU87FTPMF" # 白名单 PERMISSION_VALID_URL = [ '/login/', '/admin/.*', ] 4. 基于admin录入权限 5. 编写视图函数,使用特殊的返回值 (第5点还没搞明白!!!!啧啧) from rbac.http.shortcuts import render as rbac_render def users(request): """ 用户列表 :param request: :return: """ user_list = [ {'id': 1, 'name': '铁蛋', 'email': 'td@live.com'}, {'id': 2, 'name': '钢蛋', 'email': 'td@live.com'}, {'id': 3, 'name': '金蛋', 'email': 'td@live.com'}, {'id': 4, 'name': '银蛋', 'email': 'td@live.com'}, ] return rbac_render(request, 'users.html', {'user_list': user_list}) 或 from rbac.http.shortcuts import render as rbac_render class OrderPermission(BasePermission): """ 自定制权限控制类 """ pass def orders(request): """ 用户列表 :param request: :return: """ user_list = [ {'id': 1, 'name': '铁蛋', 'email': 'td@live.com'}, {'id': 2, 'name': '钢蛋', 'email': 'td@live.com'}, {'id': 3, 'name': '金蛋', 'email': 'td@live.com'}, {'id': 4, 'name': '银蛋', 'email': 'td@live.com'}, ] return rbac_render(request, 'users.html', {'user_list': user_list}, OrderPermission) 6. 如果想要使用rbac生成动态菜单,那么就在业务代码可以直接继承示例含有菜单功能的模板,也可以自己定制的html模板或母版,在其中引入生成代码的功能代码。 直接使用示例模板: {% extends 'rbac/layout.html' %} {% block title %}用户列表{% endblock %} {% block css %} {% endblock %} {% block body %} <h1>用户列表</h1> {% endblock %} {% block js %} {% endblock %} 手动引入菜单功能: {% load menu %} <!-- 1. 导入rbac/templatetags目录下menu文件 --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %} {% endblock %}</title> <!-- 2. 导入菜单需要的样式 --> <link rel="stylesheet" href="/static/rbac/menu.css" /> </head> <body> <div class="pg-header"> <div class="logo"> CRM管理系统 </div> </div> <div class="pg-content"> <div class="menu"> <!-- 3. 执行menu_html方法,生成菜单 --> {% menu_html request %} </div> <div class="body"> <h1>这里是内容</h1> </div> <script src="/static/jquery-1.12.4.js"></script> <!-- 4. 导入菜单需要的js效果 --> <script src="/static/rbac/menu.js"></script> </div> </body> </html> 7. 权限重置 a. 去用户表中获取用户session_key b. 根据session_key 在session表中将指定数据删除
2、stark组件使用
1、介绍:
专门用于为其他App提供快速实现增删改查功能的组件
2、设计思路:
1. 用户向 某个地方 去注册数据库表models.UserInfo
2. 读取 某个地方 中所有的类,为每个类生成4个URL
3、知识点:
1. 在django启动时,先解释一个文件,在
from django.apps import AppConfig class StarkConfig(AppConfig): name = 'stark' def ready(self): from django.utils.module_loading import autodiscover_modules # 去程序中已经注册的所有app目录中找:stark.py 并执行 autodiscover_modules('stark')
2. 通过StarkSite类的urls方法:
for model_class,config_obj in self._registry.items(): app_label = model_class._meta.app_label model_name = model_class._meta.model_name temp = url(r'^%s/%s/' %(app_label,model_name), self.login) pts.append(temp)
4、当需要对一张表进行增删改查的就需要使用到CURD组件。
例如:需要对 表customer进行操作:
1、现在业务的应用下面的stark.py中间里面注册:
v1.site.register(models.Customer,customer.CustomerConfig)
![]()
2、在crm的config目录下面增加配置文件:customer.py
![]()
3、配置文件增加配置:
from django.utils.safestring import mark_safe from django.conf.urls import url from django.shortcuts import HttpResponse, render, redirect from crm.permission import BasePermission from stark.service import v1 from crm import models class CustomerConfig(BasePermission,v1.StarkConfig): def display_status(self,row=None,is_header=False): if is_header: return '状态' return row.get_status_display() def display_course(self,row=None,is_header=False): if is_header: return '咨询课程' # [Course对象,Course对象,Course对象,] course_list = row.course.all() text_list = [] for item in course_list: temp = "<span style='display:inline-block;padding:3px;border:1px solid red;margin:0 2px;'>%s</span>" %(item.name,) text_list.append(temp) return mark_safe("".join(text_list)) def display_check(self,row=None,is_header=False): if is_header: return '检查' return mark_safe("<a href='http://www.xxxx.com?nid=%s'>点我</a>" %(row.id,)) list_display = ['id','qq','name',display_course,display_status,display_check] # 搜索 search_list = ['qq','name__contains'] # 组合搜索 comb_filter = ['gender', 'status'] # 自定义视图函数 def extra_url(self): patterns = [ url(r'^user/$', self.user_view), ] return patterns def user_view(self,request): # current_user_id = request.session['user_info']['nid'] current_user_id = 3 customer_list = models.Customer.objects.filter(consultant=current_user_id) return render(request,'customer_user.html',{'customer_list':customer_list})
4、需要对操作表customer权限进行录入:表rbac_permission 录入:
表:rbac_menu

表:rbac_permissiongroup

表:crm_customer

表:rbac_role_permissions

效果:

项目代码:https://github.com/shengleqi/s18crm



浙公网安备 33010602011771号