前情提要: 本节内容

    自定制分页器

      保存及查询记录

    代码整理,

    stark组件search 查询

       一:自定制分页器 page

  1:创建类 Pagination  # 自定制分页器

   _ _init_ _ 属性说明 

    2: 分页器的数据说明,以及简单的数据去除

  

  

     3 : 页面分析

如果总数为100个,   设置每页8个数据      

结果展示如下

  4: 展示每页的数据

设置展示本页开始数据索引和本页结束数据索引

由  3 可知 ,每页的展示情况

 5 :展示页码

正常展示

显示最后一页

6 : 展示页码 情况

主要分为4种情况

7: 通过后台将前端页码展示进行渲染

知识点补充:

前面在源码中,request.GET 不允许进行修改值

所以用copy 进行深拷贝.  

在源码中的_ _ copy _ _ 允许进行修改

这步操作的内容的意思的 当页码更改时,其他的参数不会被改动

这个里面有两个参数, 

7 >1:先获取前端数据

7>2: 由于GET方法获取的内容不允许修改,所以进行深拷贝,为self.params, 此为字典形式

7>3 :通过key:valuse 进行新增值 ,这样原来传过来的其他值就不会有问题

7>4:

  1. self.params.urlencode()
    这句可以把字典传话成字符串的格式,
    {'a':1 ,'b':2,'c':3} 转化成
    a=1&b=2&c=3

结果:

最后返回加好标签内容的字符串

整段page 代码

  1. # -*- coding: utf- -*-
  2. # @Time : // :
  3. # @Author : Endless-cloud
  4. # @Site :
  5. # @File : page.py
  6. # @Software: PyCharm
  7. '''
  8.         ┏┓  ┏┓+ +
  9.        ┏┛┻━━━┛┻┓ + +
  10.        ┃      ┃  
  11.        ┃   ━   ┃ ++ + + +
  12.        ████━████ ┃+
  13.        ┃       ┃ +
  14.        ┃   ┻   ┃
  15.        ┃      ┃ + +
  16.        ┗━┓   ┏━┛
  17.          ┃   ┃           
  18.          ┃   ┃ + + + +
  19.          ┃   ┃    Code is far away from bug with the animal protecting       
  20.          ┃   ┃ +     神兽保佑,代码无bug  
  21.          ┃   ┃
  22.          ┃   ┃  +         
  23.          ┃    ┗━━━┓ + +
  24.          ┃      ┣┓
  25.          ┃       ┏┛
  26.          ┗┓┓┏━┳┓┏┛ + + + +
  27.          ┃┫┫ ┃┫┫
  28.          ┗┻┛ ┗┻┛+ + + +
  29. '''
  30.  
  31. class Pagination(object): # 自定制分页器
  32. def __init__(self, request, current_page, all_data, per_page_num=, max_page_count=):
  33. """
  34.  
  35. :param request: 当前操作界面的请求内容
  36. :param current_page: 当前页
  37. :param all_data: 分页数据中的所有内容
  38. :param per_page_num: 每页显示的数据条数
  39. :param max_page_count: 最多显示的页码个数
  40. """
  41.  
  42. try:
  43. current_page = int(current_page) # 转化当前操作页内容
  44. except Exception as e: # 确保当前操作的内容为数字,如不是数字则强制使页码转化成第一页
  45. current_page =
  46. if current_page < : # 确保穿过来的参数不能为负数
  47. current_page =
  48. self.current_page = current_page # 设定属性 当前页
  49. self.all_count = len(all_data) # 设定转化过数量总数通过len
  50. self.per_page_num = per_page_num # 每页最多多少个
  51.  
  52. all_pager, tmp = divmod(self.all_count, self.per_page_num)
  53. # all_pager 总页数
  54. # tmp 余数多少
  55. if tmp: # 如果有余数
  56. all_pager += # 那么页数加1
  57. self.all_pager = all_pager # 总页数
  58. self.max_page_count = max_page_count # 最多显示多少页
  59. self.max_pager_count_half = int((self.max_page_count - ) / ) # 最大显示页对半分开数量
  60. self.request = request # 获取当前操作的请求
  61.  
  62. # request.GET ,获取的是querydict 源码中不予许修改
  63. import copy
  64. self.params = copy.deepcopy(self.request.GET) # 从新深复制一遍GET内容,因为request不允许修改
  65. ## 获取前端得到内容,使得跳转的时候内容不会变更,即只更改page内容,其他内容不变更
  66. '''
  67. 分析
  68. all_count = 总计100个 per_page_num = 每页使用
  69. current_page 当前操作页 start 开始 end 结束
  70.  
  71. all_count = 总计100个 per_page_num = 每页使用
  72. current_page 当前操作页 start 开始 end 结束
  73.  
  74. 表达式 start =(current_page-) *per_page_num
  75. end =(current_page * per_page_num)
  76.  
  77. '''
  78.  
  79. @property
  80. def start(self): # 展示数据页开始
  81. return (self.current_page - ) * self.per_page_num # 当前操作页- *每页个数
  82.  
  83. @property
  84. def end(self): # 展示数据也结尾
  85. return self.current_page * self.per_page_num # 当前操作页*每页个数
  86.  
  87. '''
  88. 4种情况:
  89. :当操作页面不足显示最多页码个数
  90. :当操作页面内容显示在前11个内(不足减5)
  91. :当操作页面内容显示在后11个内(不足加5)
  92. :正常显示
  93.  
  94. '''
  95.  
  96. def page_html(self): # 页码效果
  97. # 如果总页码 不足 11个:
  98. if self.all_pager <= self.max_page_count: # 如果最大页数 小于设定的展示最多页数
  99. pageRange = range(, self.all_pager + ) # 页码范围 1到最大页数 (,当前最大页数+)
  100. # 总页数 >
  101. else:
  102. # 如果当前操作的页数小于11页的一半 5页
  103. if self.current_page <= self.max_pager_count_half:
  104. pageRange = range(, self.max_page_count + ) # 页码范围为1到12 (,)
  105. # 如果当前操作大于5个
  106. else:
  107. # 当页码翻到最后
  108. # 如果当前操作页加上5 大于最大页数
  109. if (self.current_page + self.max_pager_count_half) > self.all_pager:
  110. pageRange = range(self.all_pager - self.max_page_count + , self.all_pager + )
  111. # 显示 (最大页数-允许显示虽多页数+,最大页数+)
  112. else:
  113. # 正常显示
  114. pageRange = range(self.current_page - self.max_pager_count_half,
  115. self.current_page + self.max_pager_count_half + )
  116. # 显示当前操作页- 或者当前操作页+
  117.  
  118. # 构建分页页码的html
  119. # 直接传到前端用html的形式 ,达成自定制效果
  120. page_html_list = [] # 前端字符串 列表
  121. '''
  122. 首页
  123. '''
  124. self.params["page"] = # 修改request返回的内容
  125. first_page = '<nav aria-label="Page navigation"><ul class="pagination"><li><a href="?%s">首页</a></li>' % (
  126. self.params.urlencode(),
  127. ) # self.params.urlencode() 将字典转化成字符串 即将page= 传入%s
  128. page_html_list.append(first_page) # 将字符串加入到列表中
  129. self.params["page"] = self.current_page - # 当前操作页 减1
  130. if self.current_page <= :
  131. prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
  132. else:
  133. prev_page = '<li><a href="?%s">上一页</a></li>' % (self.params.urlencode(),)
  134. # 否则 把page 当前操作页减1 替换
  135. page_html_list.append(prev_page)
  136. for i in pageRange:
  137. self.params["page"] = i # 是当前page 展示的i
  138. if i == self.current_page: # 如果i 等于当前操作页
  139. temp = '<li claskk="active"><a href="?%s">%s</a></li>' % (self.params.urlencode(), i,)
  140. # 如果当前操作页==i 跳转i页 显示数据i #当前操作页标色
  141. else:
  142. temp = '<li><a href="?%s">%s</a></li>' % (self.params.urlencode(), i,) # 传入的是元祖
  143. # 跳转i 页 ,显示数据i
  144. page_html_list.append(temp)
  145. self.params["page"] = self.current_page + # 获取的params添加内容
  146. if self.current_page >= self.all_pager: # 如果当前操作页大于等于最大页数
  147. next_page = '<li class="disabled"><a href="#">下一页</a></li>' # 使下一页失效
  148. else:
  149. next_page = '<li><a href="?%s">下一页</a></li>' % (self.params.urlencode(),) # 加入到列表里
  150. page_html_list.append(next_page)
  151.  
  152. self.params["page"] = self.all_pager # 使page 等于最大页数
  153. last_page = '<li><a href="?%s">尾页</a></li> </ul></nav>' % (self.params.urlencode())
  154. page_html_list.append(last_page)
  155.  
  156. return ''.join(page_html_list) #直接返回整个字符串

二:stites 中的内容大整改  ,(把所有展示数据单独建立一个类)

原:数据内容

  1. header_list = [] # 定制一个空别表
  2. for field_or_func in self.get_new_list_display():
  3. # 如果是多对多的
  4. if callable(field_or_func):
  5. val = field_or_func(self, header=True)
  6. header_list.append(val)
  7. # header_list.append(field_or_func.__name__)
  8. # 如果是普通属性
  9. else:
  10.  
  11. if field_or_func == "__str__":
  12. val = self.model._meta.model_name.upper()
  13. else:
  14. field_obj = self.model._meta.get_field(field_or_func)
  15. val = field_obj.verbose_name # 自定义属性名
  16.  
  17. header_list.append(val)
  18.  
  19. # 构建展示数据
  20. new_data = []
  21. for obj in queryset:
  22. temp = []
  23. for field_or_func in self.get_new_list_display():
  24. if callable(field_or_func):
  25. val = field_or_func(self, obj) # 获取函数返回值,传入obj进行从操作数据
  26.  
  27. elif not field_or_func == "__str__":
  28. from django.db.models.fields.related import ManyToManyField
  29. field_obj = self.model._meta.get_field(field_or_func) # 获取模型对象
  30. # 判断是否为多对多属性
  31. if type(field_obj) == ManyToManyField:
  32. raise Exception("list_display不能是多对多字段!")
  33. # 判断是否有选择属性
  34. if field_obj.choices:
  35. val = getattr(obj, "get_%s_display" % field_or_func)()
  36. # 调用这个方法,反射方法,调用方法获取对应的内容
  37. else:
  38. val = getattr(obj, field_or_func)
  39. if field_or_func in self.list_display_links:
  40. val = mark_safe("<a href='%s'>%s</a>" % (self.get_change_url(obj), val))
  41.  
  42. else:
  43. val = getattr(obj, field_or_func)()
  44.  
  45. temp.append(val)
  46. # print(">>>>>>>>>>>>",temp)
  47. new_data.append(temp)

今:整改部分

     1 :创建一个类

在原来的地方通过实例对象调用内容

 2:函数说明

3:调用说明

 requset ,当前操作请求  对应requset

self ,当前操作自定义配置类, 对应config_obj

quseryset   当前操作数据对应 queryset

4:分页包调用以及配置

 4>1知识点:

ruquset.GET.get("筛选内容",默认值=None)     

即如果不写默认值则为空,这里写为1 即,没获取到时候为1

4:>2 创建配置每页个数接口

   前提:设置接口

4>3:最后返回的是分好页的数据(通过切片   [索引:索引])

4>4:抬头部分

 4>5:展示数据

 5:前端做的修改

 

 前端效果

  1. # -*- coding: utf- -*-
  2. # @Time : // :
  3. # @Author : Endless-cloud
  4. # @Site :
  5. # @File : stites.py
  6. # @Software: PyCharm
  7. '''
  8.         ┏┓  ┏┓+ +
  9.        ┏┛┻━━━┛┻┓ + +
  10.        ┃      ┃  
  11.        ┃   ━   ┃ ++ + + +
  12.        ████━████ ┃+
  13.        ┃       ┃ +
  14.        ┃   ┻   ┃
  15.        ┃      ┃ + +
  16.        ┗━┓   ┏━┛
  17.          ┃   ┃           
  18.          ┃   ┃ + + + +
  19.          ┃   ┃    Code is far away from bug with the animal protecting       
  20.          ┃   ┃ +     神兽保佑,代码无bug  
  21.          ┃   ┃
  22.          ┃   ┃  +         
  23.          ┃    ┗━━━┓ + +
  24.          ┃      ┣┓
  25.          ┃       ┏┛
  26.          ┗┓┓┏━┳┓┏┛ + + + +
  27.          ┃┫┫ ┃┫┫
  28.          ┗┻┛ ┗┻┛+ + + +
  29. '''
  30.  
  31. from django.urls import path, re_path
  32.  
  33. from app01.models import *
  34. from django.shortcuts import HttpResponse, render, redirect
  35.  
  36. from django.utils.safestring import mark_safe
  37. from django.urls import reverse
  38.  
  39. class ShowList(object): #
  40. def __init__(self, request, config_obj, queryset):
  41. self.request = request # 接收请求
  42. self.config_obj = config_obj #接收自定义配置类
  43. self.queryset = queryset #接收数据
  44. self.pager_queryset = self.get_pager_queryset() # 实例分页对象获取内容
  45.  
  46. def get_pager_queryset(self):
  47. from stark.utils.page import Pagination # 导入自己写的分页包
  48. current_page = self.request.GET.get("page", ) # 当前操作页
  49. self.pagination = Pagination(self.request, current_page, self.queryset,
  50. per_page_num=self.config_obj.per_page_num or )
  51. queryset = self.queryset[self.pagination.start:self.pagination.end]
  52. return queryset
  53.  
  54. def get_header(self):
  55. header_list = [] # 定制一个空别表
  56. for field_or_func in self.config_obj.get_new_list_display(): # 替换成config_obj 代用,self 代表原自定义配置类
  57. # 如果是多对多的
  58. if callable(field_or_func):
  59. val = field_or_func(self, header=True)
  60. header_list.append(val)
  61. # header_list.append(field_or_func.__name__)
  62. # 如果是普通属性
  63. else:
  64.  
  65. if field_or_func == "__str__":
  66. val = self.config_obj.model._meta.model_name.upper()
  67. else:
  68. field_obj = self.config_obj.model._meta.get_field(field_or_func)
  69. val = field_obj.verbose_name # 自定义属性名
  70.  
  71. header_list.append(val)
  72. return header_list #f返回前端的内容
  73. def get_body(self):
  74.  
  75. # 构建展示数据
  76. new_data = []
  77. for obj in self.pager_queryset:
  78. temp = []
  79. for field_or_func in self.config_obj.get_new_list_display():
  80. if callable(field_or_func):
  81. val = field_or_func(self.config_obj, obj) # 获取函数返回值,传入obj进行从操作数据
  82. # self 统一换成self.config_obj
  83. elif not field_or_func == "__str__":
  84. from django.db.models.fields.related import ManyToManyField
  85. field_obj = self.config_obj.model._meta.get_field(field_or_func) # 获取模型对象
  86. # 判断是否为多对多属性
  87. if type(field_obj) == ManyToManyField:
  88. raise Exception("list_display不能是多对多字段!")
  89. # 判断是否有选择属性
  90. if field_obj.choices:
  91. val = getattr(obj, "get_%s_display" % field_or_func)()
  92. # 调用这个方法,反射方法,调用方法获取对应的内容
  93. else:
  94. val = getattr(obj, field_or_func)
  95. if field_or_func in self.config_obj.list_display_links:
  96. val = mark_safe("<a href='%s'>%s</a>" % (self.config_obj.get_change_url(obj), val))
  97.  
  98. else:
  99. val = getattr(obj, field_or_func)()
  100.  
  101. temp.append(val)
  102. # print(">>>>>>>>>>>>",temp)
  103. new_data.append(temp)
  104.  
  105. return new_data #返回前端数据部分
  106. class ModelStark(object):
  107. '''
  108. 默认配置类
  109. '''
  110. list_display = ("__str__",)
  111. list_display_links = [] # 设置默认为空
  112. model_form_class = None # 设置默认为无
  113. per_page_num=None #设置接口
  114. search_fields = [] #创建search_fidels接口
  115. search_val = None # 默认让search_val的值为none
  116. def __init__(self, model):
  117. self.model = model
  118. self.model_name = self.model._meta.model_name
  119. self.app_label = self.model._meta.app_label
  120.  
  121. # 反向解析当前访问表的增删改查URL
  122.  
  123. def get_list_url(self):
  124. # 反向解析当前表的删除的URL
  125. list_url = reverse("%s_%s_list" % (self.app_label, self.model_name))
  126. return list_url
  127.  
  128. def get_add_url(self, obj=None):
  129. # 反向解析当前表的删除的URL
  130. add_url = reverse("%s_%s_add" % (self.app_label, self.model_name))
  131. return add_url
  132.  
  133. def get_delete_url(self, obj):
  134. # 反向解析当前表的删除的URL
  135. delete_url = reverse("%s_%s_delete" % (self.app_label, self.model_name), args=(obj.pk,))
  136. return delete_url
  137.  
  138. def get_change_url(self, obj):
  139. # 反向解析当前表的change的URL
  140. change_url = reverse("%s_%s_change" % (self.app_label, self.model_name), args=(obj.pk,))
  141. return change_url
  142.  
  143. def get_new_list_display(self):
  144. temp = []
  145. temp.extend(self.list_display) # 继承原来的列表内容
  146. temp.append(ModelStark.show_editbtn) # 注意传过来的是属性
  147. temp.append(ModelStark.show_delbtn) # 注意传过来的是属性
  148. temp.insert(, ModelStark.show_checkbox)
  149. # temp.insert(,self.show_checkbox())
  150. # 同上不加括号,把方法名加入到列表方便掉用
  151. return temp
  152.  
  153. def show_checkbox(self, obj=None, header=False):
  154. # 展示选择列
  155. if header:
  156. return mark_safe("<input type='checkbox'>")
  157. return mark_safe("<input type='checkbox'>")
  158.  
  159. def show_delbtn(self, obj=None, header=False):
  160. if header:
  161. return "删除"
  162.  
  163. return mark_safe("<a href='%s'>删除</a>" % self.get_delete_url(obj))
  164.  
  165. def show_editbtn(self, obj=None, header=False):
  166. if header:
  167. return "编辑"
  168. return mark_safe("<a href='%s'>编辑</a>" % self.get_change_url(obj))
  169.  
  170. def get_search_condition(self, request):
  171. val = request.GET.get("q") # 获取name q的内容
  172.  
  173. from django.db.models import Q # 导入Q 包 .进行或操作
  174. q = Q() # 实例一个Q 对象
  175. if val:# 如果进行了查询操作
  176. self.search_val = val
  177. q.connector = "or" # 更改q为或操作
  178. for field in self.search_fields: # ["title","price"] # 从接口中拿字段
  179. print(field)
  180. # queryset=queryset.filter(Q(title__contains=val)|Q(price__contains=val))
  181. q.children.append((field + "__contains", val))
  182. # 利用小q进行模糊查询,和拼接
  183. # "__contains 模糊查询" 即 title__contains=val 查询
  184. else:
  185. self.search_val = None
  186.  
  187. return q
  188.  
  189. def list_view(self, request):
  190. # print(self) # 当前访问模型表对应的配置类对象
  191. # print(self.model) # 当前访问模型表
  192. queryset = self.model.objects.all()
  193. print("+>>>>>>>", queryset)
  194. # 构建表头
  195. queryset=queryset.filter(self.get_search_condition(request))
  196. show_list = ShowList(request, self, queryset)
  197. # 当前请求 ,当前操作的自定制配置类,当前所有数据
  198. table_name = self.model._meta.verbose_name
  199. add_url = self.get_add_url()
  200. # print("<<<<<<<<<<<",new_data)
  201. return render(request, "stark/list_view.html", locals())
  202.  
  203. # data = self.model.objects.all()
  204. # print(data)
  205. # print("-------",self.list_display)
  206. # data_list=[]
  207. # dict1={}
  208. # for obj in data:
  209. # lis =[]
  210. # for msg in self.list_display:
  211. # lis.append(getattr(obj,msg))
  212. # data_list.append(lis)
  213. # print("jjjjjjjjj",data_list)
  214. # return render(request, 'stark/list_view.html', {
  215. # "data_list":data_list,
  216. # "list_display":self.list_display
  217. # })
  218.  
  219. def get_model_form(self): # 创建获取model_form 内容函数
  220. from django.forms import ModelForm # 导入包
  221. class BaseModelForm(ModelForm): # 创建modelform类,继承modelform
  222. class Meta: # 创建可调用内容
  223. model = self.model # 导入当前操作模型对象
  224. fields = "__all__" # 获取全部
  225.  
  226. return self.model_form_class or BaseModelForm # 如果有内容就传入内容,没有就走默认的Base的
  227. # 有的时候需要重新写class BasemodelForm类并继承他
  228.  
  229. def add_view(self, request): # 视图函数add_view
  230. BaseModelForm = self.get_model_form() # 通过get_model_form运行获取类
  231. if request.method == "GET":
  232. form_obj = BaseModelForm() # 实例化对象获取内容
  233. return render(request, "stark/add_view.html", locals()) # 传到前端内容(属性)
  234. else:
  235. form_obj = BaseModelForm(request.POST) # 向渲染的模型类中加入数据
  236. if form_obj.is_valid(): # 判断接收数据是否可用
  237. form_obj.save() # 将数据保存到数据库
  238. return redirect(self.get_list_url()) # 跳转
  239. else:
  240. return render(request, "stark/add_view.html", locals())
  241.  
  242. def change_view(self, request, id): # 创建change_view路由 ,传入request,id,通过反向解析获取id
  243. BaseModelForm = self.get_model_form() # 通过方法获取modelform类
  244. edit_obj = self.model.objects.filter(pk=id).first() # 通过id获取当前操作对象
  245. if request.method == "GET":
  246. form_obj = BaseModelForm(instance=edit_obj) # 通过instance参数,进行控制为传入对象可以到前端进行渲染
  247. return render(request, "stark/change_view.html", locals())
  248. else:
  249. form_obj = BaseModelForm(request.POST, instance=edit_obj) # 接收前端内容,instance对象,是内容进行覆盖
  250. if form_obj.is_valid():
  251. form_obj.save() # 数据保存
  252. return redirect(self.get_list_url())
  253. else:
  254. return render(request, "stark/change_view.html", locals())
  255.  
  256. def delete_view(self, request, id): # 接收反向解析传过来的id
  257. if request.method == "POST":
  258. self.model.objects.filter(pk=id).delete() # 接收id 删除主键
  259. return redirect(self.get_list_url()) # 跳转
  260. list_url = self.get_list_url() # 把展示界面传过去.方便用户取消
  261.  
  262. return render(request, "stark/delete_view.html", locals()) # 新建删除html
  263.  
  264. @property
  265. def get_urls(self):
  266. temp = [
  267. path("", self.list_view, name="%s_%s_list" % (self.app_label, self.model_name)),
  268. path("add/", self.add_view, name="%s_%s_add" % (self.app_label, self.model_name)),
  269. re_path("(\d+)/change/", self.change_view, name="%s_%s_change" % (self.app_label, self.model_name)),
  270. re_path("(\d+)/delete/", self.delete_view, name="%s_%s_delete" % (self.app_label, self.model_name)),
  271. ]
  272.  
  273. return (temp, None, None)
  274.  
  275. class StarkSite:
  276. '''
  277. stark全局类
  278. '''
  279.  
  280. def __init__(self):
  281. self._registry = {}
  282.  
  283. def register(self, model, admin_class=None, **options):
  284. admin_class = admin_class or ModelStark
  285. self._registry[model] = admin_class(model)
  286.  
  287. def get_urls(self):
  288. # 动态为注册的模型类创建增删改查URL
  289. temp = []
  290. # {Book:ModelAdmin(Book),Publish:ModelAdmin(Publish)}
  291. for model, config_obj in self._registry.items():
  292. # print("---->", model, config_obj)
  293. model_name = model._meta.model_name
  294. app_label = model._meta.app_label
  295. temp.append(
  296. path("%s/%s/" % (app_label, model_name), config_obj.get_urls)
  297. )
  298.  
  299. '''
  300. path("stark/app01/book",self.list_view)
  301. path("stark/app01/book/add",self.add_view)
  302. path("stark/app01/publish",self.list_view)
  303. path("stark/app01/publish/add",self.add_view)
  304.  
  305. '''
  306.  
  307. return temp
  308.  
  309. @property
  310. def urls(self):
  311. return self.get_urls(), None, None
  312.  
  313. site = StarkSite()

三:stark 中的search内容

  知识点: django中的Q()使用

  实例化Q 以后可以进行更改内容且 通过字符串进行修改

 接口内容

注册接口内容

1 :前端代码内容

设置name=q 进行from 表单数据操作 

通过if 

进行判断如果有配置search_fidleds 接口则显示出搜索框,否则

不显示搜索框

 2:stites 数据

_ _contains  进行数据模糊查询

 3: 数据通过search 进行数据过滤

效果展示:

通过''阿'' 进行 搜索

day 68crm(5) 分页器的进一步优化,以及在stark上使用分页器,,以及,整理代码,以及stark组件search查询的更多相关文章

  1. EF之结构进一步优化

    针对之前的使用,做了进一步优化 1.将DAL对象缓存起来 2.仓储类不依赖固定构造的DbContext,执行操作的时候,从线程中动态读取DbContext,这一步也是为了方便将DAL对象缓存起来,解决 ...

  2. 采用DTO和DAO对JDBC程序进行进一步优化

    采用DTO和DAO对JDBC程序进行进一步优化 DTO:数据传输对象,主要用于远程调用等需要远程调用对象的地方DAO:数据访问对象,主要实现封装数据库的访问,通过它可以把数据库中的表转换成DTO类 引 ...

  3. 进一步优化SPA的首屏打开速度(模块化与懒载入) by 嗡

    前言 单页应用的优点在于一次载入全部页面资源,利用本地计算能力渲染页面.提高页面切换速度与用户体验.但缺点在于全部页面资源将被一次性下载完,此时封装出来的静态资源包体积较大,使得第一次打开SPA页面时 ...

  4. 如何优化运行在webkit上的web app

    如何优化运行在webkit上的web app 近来公司有个web app 项目运行在移动版android系统上,发现在电脑上跑的很流畅的web页面在移动版webkit上非常不流畅.根本无法和nativ ...

  5. 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码

    首发于公众号:计算机视觉life 旗下知识星球「从零开始学习SLAM」 这可能是最清晰讲解g2o代码框架的文章 理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种 ...

  6. [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)

    [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...

  7. SSE图像算法优化系列二十一:基于DCT变换图像去噪算法的进一步优化(100W像素30ms)。

    在优化IPOL网站中基于DCT(离散余弦变换)的图像去噪算法(附源代码) 一文中,我们曾经优化过基于DCT变换的图像去噪算法,在那文所提供的Demo中,处理一副1000*1000左右的灰度噪音图像耗时 ...

  8. JavaScript中国象棋程序(8) - 进一步优化

    在这最后一节,我们的主要工作是使用开局库.对根节点的搜索分离出来.以及引入PVS(Principal Variation Search,)主要变例搜索. 8.1.开局库 这一节我们引入book.js文 ...

  9. 进一步优化ListView

    之前我已经分享过一篇:viewHodler的通用写法,就是专门用来优化listview的加载的,但是对于复杂的布局,我们还需要在listview滑动和不滑动时进行自己的处理,今天我看到一篇文章就是讲这 ...

随机推荐

  1. plupload.Uploader多文件上传

    .前台 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CommonUpfi ...

  2. 构造函数constructor 与析构函数destructor(一)

    构造函数定义:构造函数c++中在创建对象时自动调用,用来初始化对象的特殊函数. (1)构造函数的名字必须与类的名字相同,不能有返回值,哪怕是void 也不行. (2)通常情况下构造函数应声明为公有函数 ...

  3. sqlserver中set IDENTITY_INSERT on 和 off 的设置方法

    sqlserver中set IDENTITY_INSERT on 和 off 的设置方法: 执行插入数据库插入数据时报了以下错误,我明明没有给主键set值但还是报错 解决方法如下: qlserver ...

  4. 2018.10.05 NOIP模拟 相遇(dfs序+lca)

    传送门 考虑到两条路径相交的条件: 设两条路径为a,ba,ba,b. 则要么aaa路径的lcalcalca在bbb上. 要么bbb路径的lcalcalca在aaa上. 因此我们维护两棵树. 分别支持路 ...

  5. 2018.08.22 NOIP模拟 string(模拟)

    string [描述] 给定两个字符串 s,t,其中 s 只包含小写字母以及*,t 只包含小写字母. 你可以进行任意多次操作,每次选择 s 中的一个*,将它修改为任意多个(可以是 0 个)它的前一个字 ...

  6. 19. Fight over Fox-hunting 猎狐引发的冲突

    . Fight over Fox-hunting 猎狐引发的冲突 ① Foxes and farmers have never got on well.These small dog-like ani ...

  7. redhat 6用yum方式安装nginx

    前提条件:如果发生了没有注册redhat账号造成没有权限使用yum的情况下,可以参考:http://www.cnblogs.com/boshen-hzb/p/6080431.html 1.cd /et ...

  8. 转@RequestParam,@PathParam,@PathVariable等注解区别

    转自:http://blog.csdn.net/u011410529/article/details/66974974 @RequestParam 和 @PathVariable 注解是用于从requ ...

  9. openwrt,mjpeg流,wifi摄像头与APP联动,拍照、录像

    最近公司好忙,自己主管的产品又忙着上线,好久都没更新博客了. 最近产品在做一款wifi摄像头,摄像头与手机同时连接在一个局域网内,即可实现摄像头图像在手机显示,并且拍照录像等功能 mjpeg是一张一张 ...

  10. Apache服务器的简单配置与安全策略

    在之前讲的关于weevely后门分析中,有说到利用Apache的配置文件.htaccess来隐藏php后门.关于.htaccess文件的用途,在此结合Apache服务器的具体配置作一详解,也算是自己的 ...