• python 全栈开发,Day118(django事务,闭包,客户管理,教学管理,权限应用)


    昨日内容回顾

    一、django事务

    什么是事务

    一系列将要发生或正在发生的连续操作。

    作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。

    MySQL事务

    • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
    • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
    • 事务用来管理 insert,update,delete 语句

    事务处理

    用 BEGIN, ROLLBACK, COMMIT来实现

    • BEGIN 开始一个事务
    • ROLLBACK 事务回滚
    • COMMIT 事务确认

    举例:

    比如购买商品,在页面上,会有商品的数量

    django事务

    Django 1.4 事务默认模式是autocommit模式,每个查询都相当于一个事务,每次查询都直接提交commit事务,除非事务被禁止


    在view里面的使用:

    装饰器

    @transaction.commit_on_success
    def view():
        a.save()
        b.save()
        return ...

    with用法

    def func()
        with transaction.commit_on_success():
            a.save()
            b.save()
        return ...

    二、闭包应用

    什么是闭包

    先来理解一下,如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数。再来看定义

    闭包: 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。

    更多详情,请参考链接:

    https://www.cnblogs.com/Lin-Yi/p/7305364.html

    三、客户管理

    四、教学管理

    五、权限应用

    由于时间关系,详细的步骤略...

    总结:

    第一部分:权限管理
        
    第二部分:stark组件
    
    第三部分:crm业务
    1. crm系统主要用于做什么?
        客户关系管理。
        
    2. 主要给谁用?
        - 销售
            - 客户分类,销售底薪+业绩
                - 公户:申请(锁)
                            - 行锁:innodb -> 行锁+表锁+事务
                            - 表锁:Mysiam -> 表锁
                - 私户:150人+自己客户
                - 全户
            - 客户跟进
            - 缴费申请
        - 推广
            - 在公户中录入有效数据
        - 渠道
            - 在公户中录入有效数据
        - 教学,老师
            - 上课 
            - 作业
            - 成绩
        - 教质
            - 考勤
            - 问卷
        - 学生
            - 交作业
            - 查成绩
            - 查看个人信息
            - 问卷
    
    3. 技术点
        - Form的作用?
            - 对用户提交的一组表单数据进行校验。
        - ModelForm的作用?
            - 对用户提交的一组表单数据进行校验。
            - 快速实现增加、修改
        - FormSet的作用?
            - 对用户提交的多组表单数据进行校验。
        - ModelFormSet的作用?
            - 对用户提交的多组表单数据进行校验。
            - 快速实现增加、修改
                    
    第四部分:权限的应用
            
        a. 录入权限信息
            http://127.0.0.1:8000/rbac/menu/list/
            http://127.0.0.1:8000/rbac/multi/permissions/?type=update
            
        b. 分配权限
            创建角色:http://127.0.0.1:8000/rbac/role/list/
            权限分配:http://127.0.0.1:8000/rbac/distribute/permissions/
            
        c. 权限验证+自动生成菜单
            
            # 权限信息初始化
                init_permission(user_obj,request) 
                
                MENU_SESSION_KEY = "u8fkksjdfkjsf"
                PERMISSION_SESSION_KEY = "u8fkksjdfkjsf"
                
            # 中间件请求进行权限校验
                'rbac.middleware.rbac.RbacMiddleware'
                
                PERMISSION_VALID_URL = [
                    '/login/',
                    '/admin/.*',
                ]
            
            # inclusion_tag
                {% load rbac %}
                {% menu request %}
                {% breadcrumb request %}
                
            # 引入css和js
                <link rel="stylesheet" href="{% static 'rbac/css/rbac.css' %} "/>
                <script src="{% static 'rbac/js/rbac.js' %} "></script>
            
        d. 按钮的控制
            
            from django.conf import settings
            from stark.service.stark import StarkConfig
    
            class RbacPermission(object):
    
                def get_add_btn(self):
                    name = "%s:%s" %(self.site.namespace,self.get_add_url_name,)
                    permission_dict = self.request.session.get(settings.PERMISSION_SESSION_KEY)
                    if name in permission_dict:
                        return super().get_add_btn()
    
                def get_list_display(self):
                    val = super().get_list_display()
                    permission_dict = self.request.session.get(settings.PERMISSION_SESSION_KEY)
                    edit_name = "%s:%s" %(self.site.namespace,self.get_change_url_name,)
                    del_name = "%s:%s" %(self.site.namespace,self.get_del_url_name,)
                    if edit_name not in permission_dict:
                        val.remove(StarkConfig.display_edit)
    
                    if del_name not in permission_dict:
                        val.remove(StarkConfig.display_del)
    
                    return val
                    
            
            每个配置去继承即可。
            
    CRM结束:
        1. 课程100% = 3年
        
        2. 学习阶段
            
            初级阶段:增删改查 + Linux
            
            阶段升级:做项目增加熟练度 + 开发组件 + Linux
            
            阶段升级:看源码(Flask+Django) + Linux
            
            阶段升级:架构(Linux硬件+代码(设计模式+领域驱动模型)) + Linux
        
            合伙人搞创业
        
        3. 如何让简历漂亮
            a. 项目+技术点
            
            b. 热点 
            
            c. 自学能力 源码 
            
        4. 设计+讲话能力
    View Code

    完整代码,请参考:

    第一阶段(不包含权限应用)

    链接:https://pan.baidu.com/s/11XFG6QZ_W5wCEt0HzdqPkA 密码:g9ye

    终极版:

    链接:https://pan.baidu.com/s/14Y5ioQkEuJBvoL1pCXsqmg 密码:gz6p

    未完待续...

  • 相关阅读:
    Setting a maximum attachment size
    一机多屏,屏幕顺序容易错?
    node.js " The requested service provider could not be loaded or initialized"
    VS2008中MFC对话框界面编程Caption中文乱码的解决办法
    The application was unable to start correctly (0xc000007b)
    FreeType的项目总是报error LNK2019: unresolved external symbol __imp错误
    MFC对话框:模态对话框及其弹出过程
    MFC如何获取硬盘的序列号
    SharePoint CAML Query小结
    ECS Navicat for MySQL远程连接报10038的错误
  • 原文地址:https://www.cnblogs.com/xiao987334176/p/9588076.html
Copyright © 2020-2023  润新知