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

 

posted @ 2018-01-30 16:00  ShengLeQi  阅读(360)  评论(0)    收藏  举报