zoukankan      html  css  js  c++  java
  • statrc部分

    statrc部分

    1. 如何使用

    #- 在app中编写 stark.py
    #- 在stark.py中进行定制
    #- 默认配置:
    #site.register(models.UserInfo)
    #- 自定义配置:
    #class UserConfig(StarkConfig):
    #list_display = [] # 表格式列表上显示的字段
    #def get_list_display():
    #order_by = []     # 排序
    #action_list=[]    # 批量操作
    #search_list = []  # 模糊搜索
    #list_filter = []  # 组合搜索
    #add_btn           # 是否显示添加按钮
    #model_form_class  # 自定义ModelForm
    #def extra_url(self):  # 自定义扩展 URL
    #def get_urls(self):   # 自定义URL 
    #def changelist_view(self,request):
    #def add_view(self,request):
    #def change_view(self,request):
    #def del_view(self,request):
    #site.register(models.UserInfo,UserConfig)
    View Code

    1. 类当做key

    2. django中的model所在app名称、以及小写类名。

    #def index(request):
                # #print(m1.UserInfo,m1.UserInfo._meta.app_label,m1.UserInfo._meta.model_name)
                # #print(m2.Role,m2.Role._meta.app_label,m2.Role._meta.model_name)
                # 获取当前models类所在app名称、以及小写类名。
                _registry = {
                    m1.UserInfo:'1',
                    m2.Role:'2',
                }
                for k,v in _registry.items():
                    print(k._meta.app_label,k._meta.model_name)
    
                return HttpResponse('...')
    View Code

    1. stark介绍

    快速完成对N张表增删改查+自定义复杂操作。

    2. 单例模式

    我们这么写:
                zhaosen.py
                    class AdminSite(object):
                        pass
    
                    obj1 = AdminSite()
    调用实例:
                import zhaosen 
                zhaosen.obj1 
                zhaosen.obj1 
    单例模式

    3. 路由系统

    - include
            - namespace
        
            - 补充:
                项目/urls.py 
                    from django.conf.urls import url,include
                    from django.contrib import admin
                    from app01 import views
    
    
    
                    urlpatterns = [
                        url(r'^admin/', admin.site.urls),
                        url(r'^rbac/', ([
                                            url(r'^login/', views.login),
                                            url(r'^logout/', views.logout),
                                            url(r'^x1/', ([
                                                            url(r'^add/', views.add,name='n1'),
                                                            url(r'^change/', views.change,name='n2'),
                                                          ],None,'xxx')),
                                        ],None,'rbac')),
                    ]
    
        
        
                app01/views.py 
                    from django.shortcuts import render
                    from django.shortcuts import HttpResponse
                    from django.urls import reverse
    
                    def login(request):
                        url1 = reverse('rbac:xxx:n1')
                        url2 = reverse('rbac:xxx:n2')
    
                        print(url1)
                        print(url2)
                        return HttpResponse('login')
    
                    def logout(request):
                        return HttpResponse('logout')
    
                    def add(request):
                        return HttpResponse('add')
    
                    def change(request):
                        return HttpResponse('change')
            
    路由

    4. 启动后、路由加载前定制一段代码。

        a. 创建一个stark app 组件
            
            b. 编写ready方法
                from django.apps import AppConfig
    
    
                class StarkConfig(AppConfig):
                    name = 'stark'
    
                    def ready(self):
                        from django.utils.module_loading import autodiscover_modules
                        autodiscover_modules('stark')
    
             程序启动时,会先去每个app中找stark.py文件并加载。
             
            c. 其他app中创建stark.py 
            
            d. 程序启东时便会自动加载 stark.py 
            
    View Code

    1. 继承关系

            class StarkConfig(object):
                list_display = []
    
                def __init__(self,model_class):
                    self.model_class = model_class
    
                def changelist_view(self,request):
                    print(self.list_display)
                    return 123
    
            class RoleConfig(StarkConfig):
                list_display = ['id','name']
    
    
            obj1 = StarkConfig('alex')
            obj2 = RoleConfig('oldboy')
    
            obj1.changelist_view(1) # []
            obj2.changelist_view(2) # [id,name]
    View Code

    1. 方法和函数的区别?

                from types import MethodType,FunctionType
                def check(arg):
                    """
                    判断arg是函数则打印1,arg是方法则打印2
                    :param arg:
                    :return:
                    """
                    if isinstance(arg,MethodType):
                        print(2)
                    elif isinstance(arg,FunctionType):
                        print(1)
                    else:
                        print('不认识')
    
                def func():
                    pass
    
                class Foo(object):
                    def display(self):
                        pass
    
                check(func)
                check(Foo.display)
                check(Foo().display)
    View Code

    yield

    def get_result(data_list):
                    
                    for row in data_list:
                        temp = "%s%s" (row.name,row.pwd,)
                        yield temp
    
                def func(request):
    
                    data_list = models.Users.objects.all()
                    result = get_result(data_list)
                        
                    return render(request,'xxx.html',{'result':result})
                    
                xxx.html 
                    
                    {% for row in result %}
                        {{row}}
                    {% endfor%}
            
    View Code

    3. getattr

              def test(request):
                from app01 import models
    
                list_display = ['id','title']
                user_queryset = models.UserInfo.objects.all()
                for item in user_queryset:
                    row = []
                    for field in list_display:
                        row.append(getattr(item,field))
                    print(row)
    
                return HttpResponse('...')
                
            补充:自定义页面显示列
            
                def test(request):
                    from app01 import models
    
                    list_display = ['id','title']
    
    
                    header_list = []
                    for name in list_display:
                        header_list.append(models.UserInfo._meta.get_field(name).verbose_name)
                    print(header_list)
    
                    user_queryset = models.UserInfo.objects.all()
                    for item in user_queryset:
                        row = []
                        for field in list_display:
                            row.append(getattr(item,field))
                        print(row)
    
                    return HttpResponse('...')
    View Code

    3.5 装饰器

                import functools
    
                def wrapper(func):
                    @functools.wraps(func)
                    def inner(*args, **kwargs):
                        return func(*args, **kwargs)
                    return inner
    
                @wrapper
                def f1():
                    print('f1')
    
                @wrapper
                def f2():
                    print('f1')
    
    
                print(f1.__name__)
                print(f2.__name__)
                    
    View Code

    1. 静态字段和字段

            class Foo:
                x = 1  # 类变量、静态字段、静态属性
                
                def __init__(self):
                    y = 6 # 实例变量、字段、对象属性
                
                # 实例方法 
                def func(self):
                    pass 
                
                # 静态方法
                @staticmethod
                def func():
                    pass 
                
                # 类方法
                @classmethod
                def func():
                    pass 
    
                @property
                def start(self)
                    pass 
    View Code

    2. 函数

    #获取函数的名字,可通过 函数.__name__

    3. urlencode

    info = {'k1':'v1','k2':'v2'}
            
            from urllib.parse import urlencode
    
            info = {'k1':'v1','k2':'v2','k3':'v3'}
    
            v = urlencode(info)
            print(v)
    View Code

    4.django中使用 request.GET  --> QueryDict

    import copy
    
            def test(request):
                from django.http.request import QueryDict
                print(request.GET) # <QueryDict: {'k2': ['v2', 'v3'], 'k1': ['v1']}>
    
                # params = copy.deepcopy(request.GET)
                params = request.GET.copy()
                params._mutable = True
                params['k1'] = 666
                params['k3'] = 78
                params.setlist('k4',[10,12])
                print(params['k2']) # request.GET.get('xx')
    
                old = params.getlist('k2')
                old.append('v4')
                params.setlist('k2',old)
    
                # v1 = params.urlencode()
                # print(v1) # k1=v1&k2=v2&k2=v3
                print(params)
                return HttpResponse('...')
    View Code

    5. 保留原来搜索条件

    def test(request):
                from django.http.request import QueryDict
                url_params_str = request.GET.urlencode() # _filter = k1=v1&k2=v2&k2=v3
    
                query_dict = QueryDict(mutable=True)
                query_dict['_filter'] = url_params_str
    
                new_params = query_dict.urlencode()
    
                target_url = "/add_stu/?%s" %new_params
                return redirect(target_url)
    
    
            def add_stu(request):
    
                if request.method == "GET":
                    return render(request,'add_stu.html')
                # 接收到数据,保存到数据库
                origin_params = request.GET.get('_filter')
                back_url = "/test/?%s" %origin_params
                return redirect(back_url)
    View Code

    6. name包含 ‘大’ 或 email包含 “大”

            q = Q()
            q.connecter = "OR"
            q.children.append(('name__contains', ''))
            q.children.append(('email__contains', ''))
            
    View Code

    1. 批量操作[扩展]

            - 反射 
            - __name__ 
            - 一切皆对象
                def multi_delete(self,request):
                    """
                    批量删除的action
                    :param request:
                    :return:
                    """
                    pk_list = request.POST.getlist('pk')
                    self.model_class.objects.filter(pk__in=pk_list).delete()
                    # return HttpResponse('删除成功')
    
                multi_delete.text = "批量删除"
    View Code

    2. 搜索[扩展]

     #       - Q 
     #       - __contains

    3. 保留原搜索条件

            - QueryDict,request.GET/request.POST 
                - urlencode()
                - _mutable = True 
                - 深拷贝 
                - urllib.parse.urlencode
    View Code

    4. 分页 

    #- 分页组件
    #- 保留原条件 

    5. 拆分 

    #- ChangeList类封装 
    #- inclusion_tag
    #- 生成器 

    1. 三个类 

    #ChangeList,封装列表页面需要的所有数据。
    #StarkConfig,生成URL和视图对应关系 + 默认配置 
    #AdminSite,用于保存 数据库类 和 处理该类的对象 的对应关系 + 路由分发
      _registry = {
    
      }

    2. 知识点

            inclusion_tag
                yield
            
            urlencode
            
            _meta.model_name
            _meta.app_label
            
            深浅拷贝 
            
            QueryDict对象默认不可改 _mutable=True 
            
            生成器 
            
            路由分发:
                - include
                - ([],None,None)
                
            函数和方法的区别?
                
            Q的作用?构造复杂的查询条件
            
                models.User.object.filter(name__contains='')
                models.User.object.filter(name__contains='',email__contains='')
                
                构造 or 
                c1 = Q()
                c1.connector = 'OR'
                c1.children.append( ('name__contains','') )
                c1.children.append( ('email__contains','') )
                
                c2 = Q()
                c2.connector = 'ADN'
                c2.children.append( ('id__gt',2) )
                c3.children.append( ('age__lte',5) )
                
                c3 = Q()
                c3.connector = 'ADN'
                
                c3.add(c1,"ADN")
                c3.add(c2,"ADN")
                
                (name=li or email = li)  AND ( id>2 and age<=5)
                
                models.User.object.filter(con)
            
            反射 
                list_display:
                    row.name 
                    getattr(row,'name')
                action:
                    pass
                    
            继承       
                class RoleConfig(StarkConfig):
                    pass 
                    
                self到底是谁?
                
            反向生成URL
                reverse('xxx')
                reverse('namespace:xxx')
            
            分页(保留原搜索条件) 
                
            
            ModelForm组件
                
                
            functools
                - wraps,用于保留原函数的元信息(函数名/函数注释等信息)
                - partial,偏函数为函数默认传参。
                    import functools
    
                    def func(a1,a2):
                        print(a1+a2)
    
                    new_func = functools.partial(func,8)
    
                    new_func(7)
                    new_func(2)
                    new_func(8)
            
            预留可扩展位置
                
            request.GET
                request.GET.get('x')
                request.GET['x']
                request.GET.getlist('xxx')
                request.GET._mutable = True 
                request.GET.copy()
                request.GET.urlencode()
                
            mark_safe 
                
            xss攻击是什么?
                
            单例模式
                
            获取函数名
                __name__
                
            autodiscover_module
            
            装饰器 
                     
            order_by     
                
            __str__
    View Code 

    3. QueryDict对象 

    #params = request.GET.copy()
    #params._mutable = True 
    #params['k1'] = 'v1'
    #params.setlist('k2',[11,22])

    1. 可迭代对象?

            class Row(object):
                def __init__(self,data):
                    self.data = data
    
                def __iter__(self):
                    yield "<div>"
                    yield '全部'
                    for item in self.data:
                        yield "<a href='/index/?p1=1.0'>%s</a>" %item
                    yield "</div>"
    
            data_list= [
                Row(['1.0以下','1.1-1.6']),
                Row(['汽油','柴油','混合动力','电动']),
            ]
    
            for row in data_list:
                for field in row:
                    print(field)
    View Code

    2.封装 

            list_filter = [
                '董方方',
                '黄晓雪',
                '李贝贝',
    
            ]
    
            # ############################ 老封装思想 ############################
    
            list_filter = [
                {'text':'董方方','gender':'','color':'xx'}, # 字典对象做封装
                {'text':'黄晓雪','gender':'','color':'xx'},
                {'text':'李贝贝','gender':'','color':'xx'},
            ]
    
    
            for item in list_filter:
                print(item['text'] + item['gender'])
    
    
            # ############################ 老封装思想 ############################
            class Option(object):
                def __init__(self,text,gender,color):
                    self.text = text
                    self.gender = gender
                    self.color = color
    
                def get_t_g(self):
                    return self.text +self.gender
    
            list_filter = [
                Option(text='董方方',gender='',color = 'xx'), # 字典对象做封装
                Option(text='黄晓雪',gender='',color = 'xx'), # 字典对象做封装
                Option(text='李贝贝',gender='',color = 'xx'), # 字典对象做封装
            ]
    
            for item in list_filter:
                print(item.get_t_g())
        
    View Code

    3. 获取FK/M2M/O2O对应的表中所有的数据

            class UserInfo(models.Model):
    
                title = models.CharField(verbose_name='标题',max_length=32)
    
    
                def __str__(self):
                    return self.title
    
    
            class Depart(models.Model):
    
                name = models.CharField(verbose_name='部门名称',max_length=32)
                tel = models.CharField(verbose_name='联系电话',max_length=32)
                user = models.ForeignKey(verbose_name='负责人',to='UserInfo')
    
                def __str__(self):
                    return self.name
                    
            def get_fk_queryset(request):
                from app01 import models
    
                fk_obj = models.Depart._meta.get_field("user")
                user_info_queryset = fk_obj.rel.model.objects.all()
                print(user_info_queryset)
                
                return HttpResponse('...')
    View Code

    4. 组合搜索的功能

            1. 字段配置  
                list_filter=['name','tel']
                内部:
                    _field = self.config.model_class._meta.get_field('name')
                    if isinstance(_field, ForeignKey) or isinstance(_field, ManyToManyField):
                        _field.rel.model.objects.all()
                    else:
                        model_class.objects.all()
            2. list_filter=[Option(),Option()]
                内部:
                    字段 
                    自定义条件
                    
            3. list_filter=[Option(),Option()]
                内部:
                    Row对象 (可迭代对象)
                    yield 低级
                    
            4. list_filter=[Option(),Option()]
                内部:
                    处理单选 
                    
            5. list_filter=[Option(),Option()]
                内部:
                    处理多选 
    
            6. 数据搜索 
            
            7. 组合搜索应用:
                使用情况:
                    - FK
                    - Choice
                    - M2M 
                Option参数:
                    Option(field=数据库字段名,is_choice=是否是choice,text_func=显示文本的函数,value_func=URL中对应值的函数,condition=筛选条件,is_multi=是否支持多选),
                    
                    示例:
                        list_filter = [
                            # DistinctNameOption('name',condition={'id__gt':9},value_func=lambda x:x[0],text_func=lambda x:x[0],),
                            Option('level',is_choice=True,text_func=lambda x:x[1]),
                            Option('user',text_func=lambda x:x.title,is_multi=True),
                            # Option('tel',text_func=lambda x:x.tel),
                            Option('proj',is_multi=True)
                        ] # 配置项多
            
    View Code

    1. 闭包

            
            def f1(a1,a2):
                def inner():
                    ret = a1 + a3 
                    return ret 
                return inner
                
            n1 = f1('寒舍','滤清瑶') # 内存 a1=寒舍,a2=滤清瑶
            n2 = f1('国舅','小鲜肉') # 内存 a1=国舅,a2=小鲜肉
            n3 = f1('渣渣辉','万鹏程') # 内存 a1=渣渣辉,a2=万鹏程
            
            n1()
            
            # 帮助开发者维护一个“私密”空间,用于为以后执行提供数据。
        
    View Code

    2. Form和ModelForm的区别?

            Form        -> formset
            ModelForm    -> modelformset 

    3. 反射

                import importlib
                from django.utils.module_loading import import_string
    
    
                # 自定义
                """
                path = "x1.xx.Foo"
                module_path,class_name = path.rsplit('.',maxsplit=1)
    
                # 根据字符串的形式导入模块
                m = importlib.import_module(module_path)
                # Foo类
                cls = getattr(m,class_name)
    
                print(cls)
                """
    
                # 基于django内置模块
                """
                v = import_string("x1.xx.Foo")
                print(v)
                """
            
            开放封闭原则;
                
                每次操作都要去修改源码:
                    
                    def email(arg):
                        pass
    
                    def msg(arg):
                        pass
    
                    def wechat(arg):
                        pass
    
                    def dingding(arg):
                        pass
    
                    def execute():
                        user_list = ['韩射','吕轻咬']
    
                        email('xx')
                        # msg('xx')
                        wechat('xx')
                        dingding('xx')
                
                丁丁示例
                
            注意:扩展
    View Code

    1. 相关知识点 

    #- 闭包+反射 
    
    #- bug 

    2. 客户管理

    a. 公户客户/私户客户/所有客户 管理已完成
    
    - 所有客户进行操作:销售主管 CustomerConfig
    
    - 公户客户进行操作:/推广/渠道/销售  PublicCustomerConfig
    
    - 私户客户进行操作:销售  PrivateCustomerConfig
    
     
    
    b. 公户和私户之间的操作:
    
    - 申请
    
    - 移除
    
     
    
    c. 跟进记录
    
    - 所有跟进记录操作
    
    - 私户跟进记录
    
     
    
    d. 缴费 + 分班 
    
    - 缴费记录
    
    - 财务审核
    
    - 审核通过后分班(在student表中添加一条数据)
    View Code

    3. 教学管理

    a. 直接操作学生表,伪造信息。
    
    
    b. 上课记录
    
    - 创建上课记录
    
    - 初始化学生的学习记录
    
    - 查看当天的学习记录
    
    - 点名和作业信息的录入
    View Code

    第一部分:权限管理

    第二部分:stark组件

    第三部分:crm业务

    1. crm系统主要用于做什么?

    #客户关系管理。

    2. 主要给谁用? 

                - 销售
                    - 客户分类,销售底薪+业绩
                        - 公户:申请(锁)
                                    - 行锁:innodb -> 行锁+表锁+事务
                                    - 表锁:Mysiam -> 表锁
                        - 私户:150人+自己客户
                        - 全户
                    - 客户跟进
                    - 缴费申请
                - 推广
                    - 在公户中录入有效数据
                - 渠道
                    - 在公户中录入有效数据
                - 教学,老师
                    - 上课 
                    - 作业
                    - 成绩
                - 教质
                    - 考勤
                    - 问卷
                - 学生
                    - 交作业
                    - 查成绩
                    - 查看个人信息
                    - 问卷
    View Code

    3. 技术点

    - Form的作用?
    - 对用户提交的一组表单数据进行校验。
    - ModelForm的作用?
    - 对用户提交的一组表单数据进行校验。
    - 快速实现增加、修改
    - FormSet的作用?
    - 对用户提交的多组表单数据进行校验。
    - ModelFormSet的作用?
    - 对用户提交的多组表单数据进行校验。
    - 快速实现增加、修改
    View Code

    CRM结束:

    1. 课程100% = 3年
        
        2. 学习阶段
            
            初级阶段:增删改查 + Linux
            
            阶段升级:做项目增加熟练度 + 开发组件 + Linux
            
            阶段升级:看源码(Flask+Django) + Linux
            
            阶段升级:架构(Linux硬件+代码(设计模式+领域驱动模型)) + Linux
        
            合伙人搞创业
        
        3. 如何让简历漂亮
            a. 项目+技术点
            
            b. 热点 
            
            c. 自学能力 源码 
            
        4. 设计+讲话能力
            
        建议:
            1. 上午+下午搞定全天知识点;晚上stark开始+新项目;
            2. 时间:
                    - 内容回顾
                        - 周一~周四:上一天。
                        - 周五:全周
                        
                    - 10:00~10:30 晚上:相互提问 
            3. 时间控制小时
    View Code
  • 相关阅读:
    stenciljs 学习四 组件装饰器
    stenciljs 学习三 组件生命周期
    stenciljs 学习二 pwa 简单应用开发
    stenciljs ionic 团队开发的方便web 组件框架
    stenciljs 学习一 web 组件开发
    使用npm init快速创建web 应用
    adnanh webhook 框架 hook rule
    adnanh webhook 框架 hook 定义
    adnanh webhook 框架request values 说明
    adnanh webhook 框架execute-command 以及参数传递处理
  • 原文地址:https://www.cnblogs.com/chongdongxiaoyu/p/9613302.html
Copyright © 2011-2022 走看看