zoukankan      html  css  js  c++  java
  • cmdb项目-3

    1. cmdb资产审计

    2.stark组件使用

      快速完成网站的一个组件,使用方式与django的admin系统类似 ,仅仅将model注册 ,就可以生成对model增删改查的页面 ,当然这里还包括了模糊搜索 ,排序 ,批量操作等等

      1)拷贝并注册stark应用到项目中(settings)

      2)在根url.py中注册stark组件的url 

    from django.conf.urls import url, include
    from django.contrib import admin
    from stark.service.stark import site
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^api/', include('api.urls')),
        url(r'^stark/', site.urls),
    ]

      3)以业务线为例, 使用stark组件的部分功能

        list_display =  []          # 看了下源码 ,列表中主要放函数与字段 ,如果是函数的话就把从数据库拿到的queryset数据拿来循环 ,如果是字段就返回html展示

        search_list = []           # 允许用哪些字段作为搜索条件 

        order_by = []            # 以某个字段排序 ,升序 ,可以加负号完成反向排序

        action_list = []             # 下拉操作列表选项 ,组件中有multi_delete方法完成批量删除 ,也可以自己定义方法(如批量更新 ,可以在request.POST中选择pk ,再通过model操作进行更新)

        def 定义函数 ,或者重写已有函数

        site注册model ,并添加配置类

    ##stark.py注册model文件
    1.定义配置类
    class BusinessUnitConfig(StarkConfig):
        list_display = [StarkConfig.display_checkbox, 'id', 'name']
        search_list = ['id', 'name']
        order_by = ['-id']
    
        def multi_apply(self, request):
            print(request.POST)
            return redirect('http://www.baidu.com')
    
        multi_apply.text = '批量更新'
    
        action_list = [StarkConfig.multi_delete,multi_apply]
    
    2.应用配置类 ,注册到stark
    site.register(models.BusinessUnit, BusinessUnitConfig)

      4)以Server服务器为例 ,使用stark组件的部分功能

        list_display = []        # 展示choice字段 ,需要定义一个函数指定标题头部 

    ###server的model中device_status_id这个字段
    device_status_choices = (
        (1, '上架'), (2, '在线'),  (3, '离线'),  (4, '下架'),
    )
    device_status_id = models.IntegerField(choices=device_status_choices, default=1)

           方法1:自定义函数 ,返回html代码段 ,对于choice状态不同的id展示不同的颜色 ,在list_display中直接写上函数名即可

           方法2:使用get_choice_text( '字段' ,标题头)

    class ServerConfig(StarkConfig):
    
        # row是orm对象 ,可以展示choices的内容
        def show_status(self, header=None, row=None):
            if header:
                return '状态'
            color = {
                1: 'red',
                2: 'green',
                3: 'blue',
                4: 'yellow'
            }
            # return row.get_device_status_id_display()
            return mark_safe('<span style="color:{}">{}</span>'.format(color.get(row.device_status_id),
                                                                       row.get_device_status_id_display()))
    
        list_display = ['id', 'hostname', show_status, 'os_platform', 'os_version','business_unit', get_choice_text('device_status_id', '状态2')]

        search_list = []      #如果以表中某一个外键为搜索条件, 例如服务器的外键业务线的名称 ?上下滑直接指定即可

        search_list = ['hostname', 'os_version', 'business_unit__name']

        list_filter = []       # 快速检索 ,以按钮的形式将条件展示 ,如果选中拿出对应的pk在filter中组合筛选 (search_list与list_filter两个会联合查询)

          list_filter组合搜索展示choice字段的按钮 ,该字段必须有choice ,text_func与value_func必须使用匿名函数 ,匿名函数的参数就是choices元祖的每一个值

        list_filter = [
            Option('business_unit', is_multi=True),
            # lambda中的x是(1:'上线')   text_func是文本显示结果   value_func是url上对应的值 要对应
            Option('device_status_id', is_multi=True, is_choice=True, text_func=lambda x: x[1], value_func=lambda x: x[0])
        ]

      5)bootstrap的datetimepicker日历时间选择器(为一些填写时间的字段增加体验)  (https://www.jianshu.com/p/48b2343ded54更多功能)

        首先需要自己写modelform并继承stark的modelform ,为生成时间字段增加date-picker类名称

        然后在配置类中引用自定义的modelform

        其次加载js与css文件即可

    class ServerModelForm(StarkModelForm):
        class Meta:
            model = models.Server
            fields = "__all__"
            widgets = {
                'latest_date': DatePickerInput(attrs={'class': 'date-picker'})
            }
    
    
    class ServerConfig(StarkConfig):
        model_form_class = ServerModelForm
    ...

       6)扩展功能 ,stark注册一个model ,生成增删改查资格url与对应的视图函数 ,但是扩展的功能想自定义的功能如何去完成 ?

       扩展功能1.增加显示服务器详情(硬盘内存网卡信息)   2.增加服务器审计信息展示

         在配置类定义url ,通过extra_url()函数实现

         在配置类定义视图函数 

         在配置类定义每行显示的标签以及跳转url

    class ServerConfig(StarkConfig):
        model_form_class = ServerModelForm
    
        def server_detail(self, request, pk):
            server_disks = models.Disk.objects.filter(server_id=pk).order_by('slot')
            server_memorys = models.Memory.objects.filter(server_id=pk)
            server_nics = models.NIC.objects.filter(server_id=pk)
    
            return render(request, 'server/server_detail.html',
                          {'server_disks': server_disks,
                           'server_memorys': server_memorys,
                           'server_nics': server_nics, })
    
        def server_record(self, request, pk):
            server_record = models.AssetRecord.objects.filter(server_id=pk)
    
            return render(request, 'server/server_record.html',
                          {'server_record': server_record,
                           })
    
        def extra_url(self):
            from django.conf.urls import url
            urlpatterns = [
                url(r'^server_detail/(d+)/', self.server_detail),
                url(r'^server_record/(d+)/', self.server_record),
            ]
            return urlpatterns
    
        def show_detail(self, header=None, row=None):
            if header:
                return '主机详情'
            return mark_safe('<a href="/stark/api/server/server_detail/{}">查看</a>'.format(row.pk))
    
        def show_record(self, header=None, row=None):
            if header:
                return '审计'
            return mark_safe('<a href="/stark/api/server/server_record/{}">查看</a>'.format(row.pk))
    
        # row是orm对象 ,可以展示choices的内容
        def show_status(self, header=None, row=None):
            if header:
                return '状态'
            color = {
                1: 'red',
                2: 'green',
                3: 'blue',
                4: 'yellow'
            }
            return mark_safe('<span style="color:{}">{}</span>'.format(color.get(row.device_status_id),
                                                                       row.get_device_status_id_display()))
    
        list_display = ['id',
                        'hostname',
                        show_status,
                        'os_platform',
                        'os_version',
                        'business_unit',
                        get_choice_text('device_status_id', '状态2'), show_detail, show_record]
    
        search_list = ['hostname',
                       'os_version',
                       'business_unit__name']
    
        list_filter = [
            Option('business_unit', is_multi=True),
            # lambda中的x是(1:'上线')   text_func是文本显示结果   value_func是url上对应的值 要对应
            Option('device_status_id', is_multi=True, is_choice=True, text_func=lambda x: x[1], value_func=lambda x: x[0])
        ]
    View Code

    3.stark功能总结

      1)注册model ,生成4个url ,以及4个视图函数

        /stark/应用名/model名/(增删改查)

      2)展示页面的功能

        展示字段 (普通字段 ,choices字段 ,外键字段)

        模糊搜索

        自定义方法

        批量操作

        组合搜索(快速筛选)

        分页

        扩展功能(url)

        保留搜索条件(分页 ,搜索条件在新增编辑时候都保留)

        新增编辑可以自定义modelform与datepicker插件

    4.stark组件的部分功能源码解读

    6. 实现的机制
      1). 注册APP 'stark.apps.StarkConfig',
        django的ready函数   ——》 app目录下找stark.py并执行  
        stark.py导入site对象
        site.register(model的类,配置类)
        实例化一个 Mapping的对象 (model的类,配置对象(model的类, site的对象) )
          class ModelConfigMapping(object):

            def __init__(self, model, config, prev):
              self.model = model
              self.config = config
              self.prev = prev

        site._registry是个列表里面全是mapping对象[ Mapping的对象 ]

      2). stark的路由(多重使用django的url函数进行分发!)
        url(r'stark/', site.urls)
        r'stark/',( [] ,app_name,namespace )

          url(r'api/server/',( [], ))

            api/server/list/
            api/server/add/
            api/server/(?P<pk>d+)/change/
            api/server/(?P<pk>d+)/del/

          根据一个model至少生成4个url地址(包括extra扩展的url)

       

     

  • 相关阅读:
    IE浏览器请求数据是提示下载的问题
    jS清除浏览器缓存
    JS获取时间戳
    keycode
    JS简单解决并发量
    写移动端流氓方法,无意看到,分享下
    CSS中的rem的换算
    jsp会话监听
    jsonp在jsp中的使用
    Java中的位运算符
  • 原文地址:https://www.cnblogs.com/quguanwen/p/11526303.html
Copyright © 2011-2022 走看看