1. # kingadmin.py
  2. # ————————04PerfectCRM实现King_admin注册功能————————
  3. from crm import models
  4. #print("kingadmin crm",models.Customer)
  5.  
  6. # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  7. # from king_admin.base_admin import register,BaseAdmin
  8. from king_admin.base_admin import site,BaseAdmin
  9. # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  10.  
  11. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  12. from django.shortcuts import render
  13. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  14.  
  15. # ————————28PerfectCRM实现King_admin编辑限制————————
  16. from django.forms import ValidationError
  17. from django.shortcuts import render,redirect
  18. # ————————28PerfectCRM实现King_admin编辑限制————————
  19.  
  20. #04客户信息表
  21. class CustomerAdmin(BaseAdmin):#定制Djanago admin
  22. # ————————54PerfectCRM实现CRM客户报名链接————————
  23. # list_display = ('id', 'qq', 'source', 'consultant', 'content', 'date') # 显示字段表头
  24. list_display = ('id', 'qq', 'source', 'consultant', 'content', 'date','status','enroll') # 显示字段表头
  25. # ————————54PerfectCRM实现CRM客户报名链接————————
  26. # ————————11PerfectCRM实现King_admin分页显示条数————————
  27. list_per_page = 2 #分页条数 # 默认分页条数10
  28. # ————————11PerfectCRM实现King_admin分页显示条数————————
  29. # ————————16PerfectCRM实现King_admin日期过滤————————
  30. # ————————15PerfectCRM实现King_admin多条件过滤————————
  31. # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
  32. # list_filter = ('source','consultant','consult_courses',)
  33. list_filter = ('date','source','consultant','consult_courses',)
  34. # ————————15PerfectCRM实现King_admin多条件过滤————————
  35. # ————————16PerfectCRM实现King_admin日期过滤————————
  36. # ————————18PerfectCRM实现King_admin搜索关键字————————
  37. #搜索(不能包含CharField)(注意加 逗号 , )
  38. search_fields = ('name','qq',)
  39. # ————————18PerfectCRM实现King_admin搜索关键字————————
  40. # ————————26PerfectCRM实现King_admin自定义排序————————
  41. ordering = '-qq' #自定义排序,默认'-id'
  42. # ————————26PerfectCRM实现King_admin自定义排序————————
  43. # ————————27PerfectCRM实现King_admin编辑复选框————————
  44. filter_horizontal = ('tags',) #复选框
  45. # ————————27PerfectCRM实现King_admin编辑复选框————————
  46. # ————————33PerfectCRM实现King_admin编辑整张表限制————————
  47. readonly_table=True#默认表单不锁定
  48. # ————————33PerfectCRM实现King_admin编辑整张表限制————————
  49.  
  50. # ————————55PerfectCRM实现CRM客户报名状态颜色变化————————
  51. colored_fields = {
  52. 'status':{'已报名':"rgba(145, 255, 0, 0.78)",
  53. '未报名':"#ddd"},}
  54. # ————————55PerfectCRM实现CRM客户报名状态颜色变化————————
  55.  
  56. # ————————54PerfectCRM实现CRM客户报名链接————————
  57. def enroll(self):
  58. '''报名'''
  59. print("customize field enroll",self)
  60. link_name = "报名"
  61. if self.instance.status == 0:
  62. link_name = "报名新课程"
  63. return '''<a target="_blank" class="btn-link" href="/bpm/customer/%s/enrollment/">点击%s</a> ''' % (self.instance.id,link_name)
  64. # url(r'^customer/(\d+)/enrollment/$', sales_views.enrollment, name="enrollment"), # 客户招生#报名流程一 下一步
  65. # target属性用于表示所链接文件打开到的位置 #记住,“”内的文字只是表示一个对象的名子。
  66. enroll.display_name = "报名链接"
  67. # ————————54PerfectCRM实现CRM客户报名链接————————
  68.  
  69. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  70. # from django.shortcuts import render
  71. actions = ['test_actions',]#定制功能 #测试返回到一个新页面
  72. def test_actions(self,request,arg2):#对应的函数 #request类自己的请求 #arg2类的内容
  73. return render(request,"king_admin/table_index.html")
  74. test_actions.short_description = "测试显示中文"
  75. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  76.  
  77. # ————————28PerfectCRM实现King_admin编辑限制————————
  78. # ————————31PerfectCRM实现King_admin编辑多对多限制————————
  79. # readonly_fields = ('qq', 'consultant',) # 不可修改
  80. readonly_fields = ('qq', 'consultant','tags',) # 不可修改
  81. # ————————31PerfectCRM实现King_admin编辑多对多限制————————
  82.  
  83. # ————————29PerfectCRM实现King_admin编辑自定义限制————————
  84. def default_form_validation(self,obj):
  85. print('validation:制定的',obj.cleaned_data)
  86. consult_course=obj.cleaned_data.get('content','')#自制验证字段
  87. if len(consult_course)<10:
  88. return ValidationError(#添加错误信息 返回
  89. ("该字段%(field)s 咨询内容记录不能少于10个字符"),
  90. code='invalid',
  91. params={'field':'content',},
  92. )
  93. # ————————29PerfectCRM实现King_admin编辑自定义限制————————
  94.  
  95. # ————————28PerfectCRM实现King_admin编辑限制————————
  96.  
  97. # ————————30PerfectCRM实现King_admin编辑自定义字段验证————————
  98. def clean_name(self,obj,*args,**kwargs):#名称验证 单个
  99. name=obj.cleaned_data['name']
  100. if not name:
  101. obj.add_error('name','不能为空!')
  102. return ValidationError(#添加错误信息 返回
  103. ("%(field)s:该字段 不能为空"),
  104. code='invalid',
  105. params={'field':'name',},
  106. )
  107. elif len(name)<5:
  108. obj.add_error('name','不能小于5个字符!')
  109. #return ValidationError('',)
  110. return ValidationError(#添加错误信息 返回
  111. ("%(field)s:该字段 不能小于5个字符!"),
  112. code='invalid',
  113. params={'field':'name',},
  114. )
  115. # ————————30PerfectCRM实现King_admin编辑自定义字段验证————————
  116.  
  117. # ————————34PerfectCRM实现CRM自定义用户————————
  118. #10账号表
  119. class UserProfileAdmin(BaseAdmin):#定制Djanago admin
  120. list_display = ('id', 'email', 'name') # 显示字段表头
  121.  
  122. # ————————36PerfectCRM实现King_admin密码修改————————
  123. readonly_fields = ('password',) # 不可修改,限制
  124. filter_horizontal = ('user_permissions','groups') #复选框
  125. modelform_exclude_fields=['last_login']#排除#不显示 #自增日期 #base_admin.py #forms.py
  126. # ————————36PerfectCRM实现King_admin密码修改————————
  127.  
  128. site.register(models.UserProfile, UserProfileAdmin)
  129. # ————————34PerfectCRM实现CRM自定义用户————————
  130.  
  131. # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  132. # register(models.Customer,CustomerAdmin)
  133. # register(models.CourseRecord)
  134. site.register(models.Customer,CustomerAdmin)
  135. site.register(models.CourseRecord)
  136. # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  137.  
  138. # ————————04PerfectCRM实现King_admin注册功能————————

# kingadmin.py

  1. #kingadmin_tags.py
  2.  
  3. # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
  4.  
  5. # # 因为前端禁止使用下划线开头(_meta.verbose_name ),所以通过后端处理后返回前端。
  6. # from django import template #模板
  7. # register = template.Library() #模板库
  8. #
  9. # @register.simple_tag #Django中利用filter与simple_tag为前端自定义函数的实现方法
  10. # def get_app_name(model_obj):
  11. #
  12. # # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
  13. # # return model_obj._meta.verbose_name_plural
  14. # '''
  15. # #判断 数据库 里如果有 verbose_name 或者 verbose_name_plural 就 调用 如果都没有 就使用默认的(英文)
  16. # class Meta:
  17. # verbose_name = "04客户信息表" #在 Django Admin 里 表名显示中文 但是会加s
  18. # verbose_name_plural = "04客户信息表" #在 Django Admin 里 表名显示中文 不会加s
  19. # '''
  20. # model_name = model_obj._meta.verbose_name_plural if model_obj._meta.verbose_name else model_obj._meta.verbose_name_plural
  21. # if not model_name:
  22. # model_name = model_obj._meta.model_name
  23. #
  24. # return model_name
  25. # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
  26.  
  27. # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
  28.  
  29. # ————————07PerfectCRM实现King_admin显示注册的表————————
  30. #因为前端禁止使用下划线开头(_meta.verbose_name ),所以通过后端处理后返回前端。
  31. from django import template #模板
  32. register = template.Library() #模板库
  33.  
  34. @register.simple_tag #Django中利用filter与simple_tag为前端自定义函数的实现方法
  35. def get_model_verbose_name(model_obj):
  36. '''
  37. #判断 数据库 里如果有 verbose_name 或者 verbose_name_plural 就 调用 如果都没有 就使用默认的(英文)
  38. class Meta:
  39. verbose_name = "04客户信息表" #在 Django Admin 里 表名显示中文 但是会加s
  40. verbose_name_plural = "04客户信息表" #在 Django Admin 里 表名显示中文 不会加s
  41. '''
  42. model_name = model_obj._meta.verbose_name_plural if model_obj._meta.verbose_name else model_obj._meta.verbose_name_plural
  43. if not model_name:
  44. model_name = model_obj._meta.model_name
  45. return model_name
  46.  
  47. @register.simple_tag
  48. def get_model_name(model_obj):
  49. return model_obj._meta.model_name
  50. @register.simple_tag
  51. def get_app_name(model_obj):
  52. return model_obj._meta.app_label
  53. # ————————07PerfectCRM实现King_admin显示注册的表————————
  54.  
  55. # # ————————09PerfectCRM实现King_admin显示注册表的内容————————
  56. # from django.utils.safestring import mark_safe #使用mark_safe函数标记后,django将不再对该函数的内容进行转义
  57. # @register.simple_tag
  58. # def build_table_row(admin_obj,obj):#通过kingadmin_tags在后台处理 再传到前端
  59. # row_ele = "" #为了生成一整行返回前端
  60. # if admin_obj.list_display:#如果不为空,有在crm/kingadmin.py注册site.register(models.Customer,CustomerAdmin)
  61. #
  62. # # ————————19PerfectCRM实现King_admin数据修改————————
  63. # #循环所有 要显示 的字符串 进行反射 展示 字段
  64. # # for column in admin_obj.list_display: #循环base_admin里class BaseAdmin下list_display = ()
  65. # for index, column in enumerate(admin_obj.list_display): # 转为列表取 下标 , 字段名
  66. # # ————————19PerfectCRM实现King_admin数据修改————————
  67. #
  68. # column_obj = obj._meta.get_field(column)#遍历获取 传进的参数对象
  69. # if column_obj.choices:#判断如果字段有choices属性
  70. # #获取choices的字符串(外健)
  71. # get_column_data = getattr(obj,"get_%s_display" % column) #反射,传进的参数对象,拼接字段
  72. # column_data = get_column_data()#函数,拿到数据
  73. # else:
  74. # column_data = getattr(obj, column)#反射,
  75. # # ————————10PerfectCRM实现King_admin日期优化————————
  76. # if type(column_data).__name__ == 'datetime':
  77. # column_data = column_data.strftime('%Y-%m-%d %H-%M-%S')
  78. # # ————————10PerfectCRM实现King_admin日期优化————————
  79. #
  80. # # ————————19PerfectCRM实现King_admin数据修改————————
  81. #
  82. # if index == 0: #首列
  83. # # 生成一个链接 跳转到编辑页面 #Format参数是一个格式字符串(%s升级版)
  84. # td_ele = '''<td><a href="/king_admin/{app_name}/{model_name}/{obj_id}/change/">{column_data}</a> </td>'''\
  85. # .format(app_name=admin_obj.model._meta.app_label,
  86. # model_name=admin_obj.model._meta.model_name,
  87. # obj_id=obj.id,
  88. # column_data=column_data)
  89. # else:
  90. # td_ele = '''<td>%s</td>''' % column_data
  91. # # td_ele = '''<td>%s</td>''' % column_data #把反射来的值 拼接字符串 生成<td>
  92. # # ————————19PerfectCRM实现King_admin数据修改————————
  93. # row_ele += td_ele #把 <td> 拼接到上面到空字符串
  94. # else:
  95. # row_ele +="<td>%s</td>" %obj #把<td>拼接到上面到空字符串,crm/models.py里 def __str__(self):的返回值
  96. # return mark_safe(row_ele) #使用mark_safe函数标记后,django将不再对该函数的内容进行转义
  97. # # ————————09PerfectCRM实现King_admin显示注册表的内容————————
  98.  
  99. # ————————54PerfectCRM实现CRM客户报名链接————————
  100. from django.utils.safestring import mark_safe #使用mark_safe函数标记后,django将不再对该函数的内容进行转义
  101. from django.core.exceptions import FieldDoesNotExist
  102. @register.simple_tag
  103. # ————————56PerfectCRM实现CRM客户首列进入更改页优化路径————————
  104. # def build_table_row(admin_obj,obj):#通过kingadmin_tags在后台处理 再传到前端
  105. def build_table_row(admin_obj,obj,request): # 通过kingadmin_tags在后台处理 再传到前端
  106. # ————————56PerfectCRM实现CRM客户首列进入更改页优化路径————————
  107.  
  108. row_ele = "" #为了生成一整行返回前端
  109. # ————————54PerfectCRM实现CRM客户报名链接————————
  110. column_not=[]#表示不是表中字段列表
  111. # ————————54PerfectCRM实现CRM客户报名链接————————
  112.  
  113. if admin_obj.list_display:#如果不为空,有在crm/kingadmin.py注册site.register(models.Customer,CustomerAdmin)
  114. # ————————19PerfectCRM实现King_admin数据修改————————
  115. #循环所有 要显示 的字符串 进行反射 展示 字段
  116. # for column in admin_obj.list_display: #循环base_admin里class BaseAdmin下list_display = ()
  117. for index, column in enumerate(admin_obj.list_display): # 转为列表取 下标 , 字段名
  118. # ————————19PerfectCRM实现King_admin数据修改————————
  119. # ————————54PerfectCRM实现CRM客户报名链接————————
  120. try: #获取表中的字段
  121. # ————————54PerfectCRM实现CRM客户报名链接————————
  122.  
  123. column_obj = obj._meta.get_field(column)#遍历获取 传进的参数对象
  124. if column_obj.choices:#判断如果字段有choices属性
  125. #获取choices的字符串(外健)
  126. get_column_data = getattr(obj,"get_%s_display" % column) #反射,传进的参数对象,拼接字段
  127. column_data = get_column_data()#函数,拿到数据
  128. else:
  129. column_data = getattr(obj, column)#反射,
  130. # ————————10PerfectCRM实现King_admin日期优化————————
  131. if type(column_data).__name__ == 'datetime':
  132. column_data = column_data.strftime('%Y-%m-%d %H-%M-%S')
  133. # ————————10PerfectCRM实现King_admin日期优化————————
  134.  
  135. # ————————19PerfectCRM实现King_admin数据修改————————
  136. if index == 0: #首列
  137. # 生成一个链接 跳转到编辑页面 #Format参数是一个格式字符串(%s升级版)
  138. td_ele = '''<td><a href="/king_admin/{app_name}/{model_name}/{obj_id}/change/">{column_data}</a> </td>'''\
  139. .format(app_name=admin_obj.model._meta.app_label,
  140. model_name=admin_obj.model._meta.model_name,
  141. obj_id=obj.id,
  142. column_data=column_data)
  143. # ————————55PerfectCRM实现CRM客户报名状态颜色变化————————
  144. if column in admin_obj.colored_fields: #特定字段需要显示颜色 #如果admin_obj有配置colored_fields
  145. color_dic = admin_obj.colored_fields[column] #获取配置#字段名# 'status':{'已报名':"rgba(145, 255, 0, 0.78)",
  146. if column_data in color_dic: #如果#已报名#有在配置里
  147. td_ele = "<td style='background-color:%s'>%s</td>" % (color_dic[column_data],column_data) #颜色#已报名
  148. else:
  149. td_ele = "<td>%s</td>" % column_data
  150. # ————————55PerfectCRM实现CRM客户报名状态颜色变化————————
  151.  
  152. else:
  153. td_ele = '''<td>%s</td>''' % column_data
  154. # td_ele = '''<td>%s</td>''' % column_data #把反射来的值 拼接字符串 生成<td>
  155. # ————————19PerfectCRM实现King_admin数据修改————————
  156. # ————————54PerfectCRM实现CRM客户报名链接————————
  157. # admin_obj.column_not = False #表示是表中字段
  158. except FieldDoesNotExist as e: # 如果没有获取到
  159. if hasattr(admin_obj, column): # 从自定义的函数中取值
  160. column_func = getattr(admin_obj, column)
  161. admin_obj.instance = obj # 对象加入
  162.  
  163. column_not.append(column) # 加入非表中字段列表,
  164. admin_obj.column_not = column_not # 对象加入
  165. column_data = column_func()
  166. print('column_data', column_data)
  167. td_ele = '''<td>%s</td>''' % column_data
  168. # ————————54PerfectCRM实现CRM客户报名链接————————
  169. row_ele += td_ele #把 <td> 拼接到上面到空字符串
  170. else:
  171. row_ele +="<td>%s</td>" %obj #把<td>拼接到上面到空字符串,crm/models.py里 def __str__(self):的返回值
  172. return mark_safe(row_ele) #使用mark_safe函数标记后,django将不再对该函数的内容进行转义
  173. # ————————54PerfectCRM实现CRM客户报名链接————————
  174. # ————————54PerfectCRM实现CRM客户报名链接————————
  175. ##表中自定verbose_name列名
  176. @register.simple_tag
  177. def verbose_name_set(admin_obj,column):
  178. try:
  179. verbose_name=admin_obj.model._meta.get_field(column).verbose_name.upper()#获取别名
  180. print(verbose_name,'verbose_name_set')
  181. print(admin_obj.model._meta,'all')
  182. except FieldDoesNotExist as e:
  183. verbose_name=getattr(admin_obj,column).display_name.upper()
  184. return verbose_name
  185. # ————————54PerfectCRM实现CRM客户报名链接————————
  186.  
  187. # ————————13PerfectCRM实现King_admin分页页数————————
  188. #分页功能kingadmin/templates/kingadmin/table_data_list.html里 <a href="?page={{ page }}{% generate_filter_url admin_obj %}">{{ page }}
  189. @register.simple_tag
  190. def generate_filter_url(admin_obj): #拼接URL
  191. url = ''
  192. for k,v in admin_obj.filter_condtions.items():
  193. url += "&%s=%s" %(k,v )
  194. return url
  195. # ————————13PerfectCRM实现King_admin分页页数————————
  196.  
  197. # ————————14PerfectCRM实现King_admin分页的省略显示————————
  198. #分页的省略显示
  199. @register.simple_tag
  200. def pag_omit(request,admin_obj):#传入当前页面值
  201. rest=''#大字符串
  202. # ————————18PerfectCRM实现King_admin搜索关键字————————
  203. search_key = get_search_key(request) # 搜索
  204. # ————————18PerfectCRM实现King_admin搜索关键字————————
  205. # ————————17PerfectCRM实现King_admin单列排序————————
  206. order_by_url = generate_order_by_url(request) # 排序
  207. # ————————17PerfectCRM实现King_admin单列排序————————
  208. # ————————15PerfectCRM实现King_admin多条件过滤————————
  209. filters = generate_filter_url(admin_obj) # 分页
  210. # ————————15PerfectCRM实现King_admin多条件过滤————————
  211. add_tags=False#标志位
  212. for pages in admin_obj.querysets.paginator.page_range:
  213. # 前两页 或 后 两页 或 当前页的前后页
  214. if pages < 3 or pages>admin_obj.querysets.paginator.num_pages -2 or abs(admin_obj.querysets.number -pages) <=2:
  215. #样式
  216. add_tags=False
  217. ele_class='' #颜色
  218. if pages == admin_obj.querysets.number: #--如果是当前页码,颜色加深 不进链接跳转--
  219. ele_class="active" #颜色加深
  220. # ————————18PerfectCRM实现King_admin搜索关键字————————
  221. # ————————17PerfectCRM实现King_admin单列排序————————
  222. # ————————15PerfectCRM实现King_admin多条件过滤————————
  223. # rest+='''<li class="%s"><a href="?page=%s">%s</a></li>'''%(ele_class,pages,pages) #--拼接URL--
  224. # rest+='''<li class="%s"><a href="?page=%s%s">%s</a></li>'''%(ele_class,pages,filters,pages) #--拼接URL--
  225. # ————————15PerfectCRM实现King_admin多条件过滤————————
  226. # rest+='''<li class="%s"><a href="?page=%s%s%s">%s<span class="sr-only">(current)</span></a></li>'''\
  227. # %(ele_class,pages,order_by_url,filters,pages)
  228. # ————————17PerfectCRM实现King_admin单列排序————————
  229. rest+='''<li class="%s"><a href="?page=%s%s%s&_q=%s">%s<span class="sr-only">(current)</span></a></li>'''\
  230. %(ele_class,pages,order_by_url,filters,search_key,pages)
  231. # ————————18PerfectCRM实现King_admin搜索关键字————————
  232. else:#其他的用省略号表示
  233. if add_tags==False:#如果不是标志位的页面
  234. rest+='<li><a>...</a></li>'
  235. add_tags=True#标志位为真
  236. return mark_safe(rest) #使用mark_safe函数标记后,django将不再对该函数的内容进行转义
  237.  
  238. # ————————14PerfectCRM实现King_admin分页的省略显示————————
  239.  
  240. # # ————————15PerfectCRM实现King_admin多条件过滤————————
  241. # #多条件过滤 table_data_list.html 传递参数
  242. # @register.simple_tag
  243. # def get_filter_field (filter_column,admin_obj):
  244. # print("admin obj",admin_obj.model ,filter_column)
  245. # field_obj = admin_obj.model._meta.get_field(filter_column)#调用内置方法
  246. # select_ele = """<select name="%s"> """ %filter_column #拼接成下拉框返回
  247. # for choice in field_obj.get_choices():#循环获取crm/models里class Customer(models.Model):下source_choices = ((0,'转介绍'),
  248. # selected_condtion = admin_obj.filter_condtions.get(filter_column)
  249. # if selected_condtion != None: #if None, 没有过滤这个条件
  250. # print("heoe....",filter_column,selected_condtion,type(selected_condtion))#类型是 整数
  251. # if selected_condtion == str(choice[0]): #就是选择的这个条件,整数转字符串
  252. # selected = "selected"
  253. # else:
  254. # selected = ""
  255. # else:
  256. # selected = ""
  257. #
  258. # #在前端把几个条件提交到后台,后台拿着条件变成一个字典,然后进行过滤,把数据返回前端,并且把条件作为字典返回后端,因为要在前端显示已经过滤的条件。
  259. # option_ele = """<option value="%s" %s>%s</option> """ % (choice[0],selected,choice[1])
  260. # select_ele +=option_ele
  261. # select_ele += "</select>"
  262. # return mark_safe(select_ele)
  263. # # ————————15PerfectCRM实现King_admin多条件过滤————————
  264.  
  265. # # ————————16PerfectCRM实现King_admin日期过滤————————
  266. from django.utils.timezone import datetime,timedelta
  267. @register.simple_tag
  268. def get_filter_field (filter_column,admin_obj):
  269. select_ele = """<select name='{filter_column}'><option value="">---------</option>""" #标签 字符串 #拼接成下拉框返回
  270. field_obj = admin_obj.model._meta.get_field(filter_column)#调用内置方法
  271. selected = ''
  272. if field_obj.choices:
  273. for choice_item in field_obj.choices:
  274. if admin_obj.filter_condtions.get(filter_column) == str(choice_item[0]):
  275. selected = "selected"
  276. select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[0], selected, choice_item[1])
  277. selected = ""
  278.  
  279. if type(field_obj).__name__ in "ForeignKey":
  280. for choice_item in field_obj.get_choices()[1:]:
  281. if admin_obj.filter_condtions.get(filter_column)== str(choice_item[0]): # 就是选择的这个条件,整数转字符串
  282. selected = "selected"
  283. select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[0], selected, choice_item[1])
  284. selected=''
  285.  
  286. if type(field_obj).__name__ in ['DateTimeField', 'DateField']: # 如果是时间格式
  287. date_els = [] # 日期条件项
  288. today_ele = datetime.now().date() # 今天日期
  289. date_els.append(['今天', today_ele]) # 今天
  290. date_els.append(['昨天', today_ele - timedelta(days=1)]) # 昨天
  291. date_els.append(['近7天', today_ele - timedelta(days=7)]) # 一周
  292. date_els.append(['近30天', today_ele - timedelta(days=30)]) # 三十
  293. date_els.append(['本月', today_ele.replace(day=1)]) # 本月
  294. date_els.append(['近90天', today_ele - timedelta(days=90)]) # 90天
  295. date_els.append(['近365天', today_ele - timedelta(days=365)]) # 365天
  296. date_els.append(['本年', today_ele.replace(month=1, day=1)]) ##今年
  297.  
  298. for choice_item in date_els:
  299. if admin_obj.filter_condtions.get("%s__gte" %filter_column)==str(choice_item[1]):
  300. selected = 'selected'
  301. select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[1], selected, choice_item[0])
  302. selected = ''
  303. filter_column_name = "%s__gte" %filter_column
  304. else:
  305. filter_column_name = filter_column
  306.  
  307. select_ele += "</select>"
  308. select_ele=select_ele.format(filter_column=filter_column_name)#格式化时间的判断条件
  309. return mark_safe(select_ele)
  310. # ————————16PerfectCRM实现King_admin日期过滤————————
  311.  
  312. # ————————17PerfectCRM实现King_admin单列排序————————
  313. # kingadmin排序功能
  314. @register.simple_tag
  315. def get_orderby_key(request,column):
  316. current_order_by_key = request.GET.get("_o")
  317. # ————————18PerfectCRM实现King_admin搜索关键字————————
  318. search_key = request.GET.get("_q")
  319. if search_key != None:
  320. if current_order_by_key != None: #如果不为空 #肯定有某列被排序了
  321. if current_order_by_key == column: # 判断是否相等 #当前这列正在被排序
  322. if column.startswith("-"): #startsWith是String类中的一个方法,用来检测某字符串是否以另一个字符串开始,返回值为boolean类型
  323. return column.strip("-") #strip去掉 文本中句子开头与结尾的符号的
  324. else:
  325. return "-%s&_q=%s" % (column, search_key)
  326. return "%s&_q=%s" % (column, search_key)
  327. else:
  328. # ————————18PerfectCRM实现King_admin搜索关键字————————
  329. if current_order_by_key != None: #如果不为空 #肯定有某列被排序了
  330. if current_order_by_key == column: # 判断是否相等 #当前这列正在被排序
  331. if column.startswith("-"): #startsWith是String类中的一个方法,用来检测某字符串是否以另一个字符串开始,返回值为boolean类型
  332. return column.strip("-") #strip去掉 文本中句子开头与结尾的符号的
  333. else:
  334. return "-%s"%column
  335. # else:
  336. # return column
  337. # else:
  338. # return column
  339. return column #同上4句
  340. # kingadmin排序功能
  341.  
  342. # kingadmin排序功能 显示排序图标
  343. # @register.simple_tag
  344. # def display_order_by_icon(request, column):
  345. # current_order_by_key = request.GET.get("_o")
  346. # if current_order_by_key != None: #肯定有某列被排序了
  347. # if current_order_by_key.strip("-") == column: ## 当前这列正在被排序
  348. # if current_order_by_key.startswith("-"):
  349. # icon = "fa-arrow-up"
  350. # else:
  351. # icon = "fa-arrow-down"
  352. # ele = """<i class="fa %s" aria-hidden="true"></i>""" % icon
  353. # return mark_safe(ele)
  354. # return ''
  355. # kingadmin排序功能 显示排序图标
  356. @register.simple_tag
  357. def display_order_by_icon(request, column):
  358. current_order_by_key = request.GET.get("_o")
  359. if current_order_by_key != None: #肯定有某列被排序了
  360. if current_order_by_key.strip("-") == column: # 当前这列正在被排序 #strip去掉 文本中句子开头与结尾的符号的
  361. if current_order_by_key.startswith("-"): #startsWith是String类中的一个方法,用来检测某字符串是否以另一个字符串开始,返回值为boolean类型
  362. icon = "▲"
  363. else:
  364. icon = "▼"
  365. ele = """<i style='color: red'>%s</i>""" % icon
  366. return mark_safe(ele)
  367. return '' #防止出现 None
  368. # kingadmin排序功能 显示排序图标
  369.  
  370. # kingadmin排序功能 # 过滤后排序功能 #}
  371. @register.simple_tag
  372. def get_current_orderby_key(request): #注意生成的URL问题
  373. #获取当前正在排序的字段名 #<input type="hidden" name="_o" value="{% get_current_orderby_key request %}">
  374. current_order_by_key = request.GET.get("_o")
  375. return current_order_by_key or ''
  376. # kingadmin排序功能 # 过滤后排序功能 #}
  377.  
  378. # kingadmin排序功能 # 过滤后排序功能 # 排序分页
  379. @register.simple_tag
  380. def generate_order_by_url (request):
  381. current_order_by_key = request.GET.get("_o")
  382. if current_order_by_key != None: # 肯定有某列被排序了
  383. return "&_o=%s" % current_order_by_key
  384. return ''
  385. # kingadmin排序功能 # 过滤后排序功能 # 排序分页
  386. # ————————17PerfectCRM实现King_admin单列排序————————
  387.  
  388. # ————————18PerfectCRM实现King_admin搜索关键字————————
  389. @register.simple_tag
  390. def get_search_key(request): # 搜索框里保留搜索值
  391. search_key = request.GET.get("_q")
  392. return search_key or ''
  393. # ————————18PerfectCRM实现King_admin搜索关键字————————
  394.  
  395. # ————————23PerfectCRM实现King_admin数据删除————————
  396. # <-------------------获取删除映射关系--------------------------------
  397. @register.simple_tag
  398. def display_all_related_obj(objs):
  399. # 取出对象及所有相关联的数据
  400. from django.db.models.query import QuerySet
  401. if type(objs) != QuerySet:
  402. objs = [objs, ]
  403. if objs:
  404. model_class = objs[0]._meta.model # 取表对象
  405. model_name = objs[0]._meta.model_name # 取表名
  406. return mark_safe(recursive_related_objs_lookup(objs))
  407. # <-----------------递归获取映射关系--------------------------------
  408. def recursive_related_objs_lookup(objs, name=None, conn_batch_size=0):
  409. name = set()
  410. print(name)
  411. print('传递过来的objs:', objs)
  412. # 开始标签的拼接
  413. ul_ele = "<ul style='color: blue'>"
  414. for obj in objs:
  415. li_ele = '''<li>{0}:{1}</li>'''.format(obj._meta.verbose_name, obj.__str__().strip("<>"))
  416. print('str:', obj.__str__(), '类型:', type(obj.__str__()))
  417. print('关联的表的自定表名:', li_ele)
  418. ul_ele += li_ele
  419. print('拼接li_ele:', ul_ele)
  420. # 映射关系处理
  421. # <---------------------------特殊关联处理-----------------------------------
  422. # 多对多关系
  423. for m2m_field in obj._meta.local_many_to_many: # local_many_to_many返回列表,many_to_many返回元祖
  424. print('--开始循环反射-多对多-关系处理--')
  425. sub_ul_ele = "<ul style='color: red'>"
  426. m2m_field_obj = getattr(obj, m2m_field.name) # 反射 如果有选项
  427. print('反射选项:', m2m_field_obj)
  428.  
  429. for m2m_data in m2m_field_obj.select_related():
  430. print('开始循环多对多标签拼接:', m2m_data)
  431.  
  432. sub_li_ele = '''<li>{0}:{1}</li>'''.format(m2m_field.verbose_name, m2m_data.__str__().strip("<>"))
  433. sub_ul_ele += sub_li_ele
  434. sub_ul_ele += '</ul>'
  435. ul_ele += sub_ul_ele
  436. print('生成完整 多对多 标签..:', ul_ele)
  437. # <---------------------------外健关联处理------------------------------------
  438. for related_obj in obj._meta.related_objects:
  439. print('--开始-外健关联-处理--')
  440. if hasattr(obj, related_obj.get_accessor_name()):
  441. print('--判断对象中是否包含反查属性--')
  442. accessor_obj = getattr(obj, related_obj.get_accessor_name())
  443. print('获取反查对应的对象: ')
  444. if hasattr(accessor_obj, 'select_related'):
  445. print('--判断有没有获取数据的方法或属性-- ')
  446. target_object = accessor_obj.select_related()
  447. print('获取数据的方法或属性: ', target_object)
  448.  
  449. if 'ManyToManyRel' in related_obj.__repr__():
  450. print('--开始-外健关联-多对多-处理--.')
  451.  
  452. # 生成UL
  453. sub_ul_ele = '<ul style="color: green">'
  454. for data in target_object:
  455. print('开始循环-外健关联-标签拼接...', data)
  456. sub_li_ele = '''<li>{0}:{1}</li>'''.format(data._meta.verbose_name,
  457. data.__str__().strip("<>"))
  458. sub_ul_ele += sub_li_ele
  459. sub_ul_ele += '</ul>'
  460. ul_ele += sub_ul_ele
  461. print('-外健关联-生成完整标签:', ul_ele)
  462. # <---------------递归处理-------------------
  463. if len(target_object) != conn_batch_size:
  464. print('--有下级对象存在,进行-递归-循环--')
  465. names = target_object.__str__()
  466. print(names, type(names))
  467. if names == name:
  468. print('--如果是自己关联自己,就不递归了--')
  469. ul_ele += '</ul>'
  470. return ul_ele
  471. else:
  472. print('--防止无限递归+1--')
  473. conn_batch_size = conn_batch_size + 1
  474. node = recursive_related_objs_lookup(target_object, name=names,
  475. conn_batch_size=conn_batch_size)
  476. ul_ele += node
  477.  
  478. # <---------------由于使用递归,下面的标签样会发生重复,就不需要使用了--------------------
  479. else:
  480. print('外健关联 一对一:', accessor_obj)
  481. target_object = accessor_obj
  482. print("外健关联 一对一:", target_object, '属性:', type(target_object))
  483.  
  484. ul_ele += '</ul>'
  485. return ul_ele
  486.  
  487. # ————————23PerfectCRM实现King_admin数据删除————————
  488.  
  489. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  490. #自定制 actions功能 显示
  491. @register.simple_tag
  492. def get_admin_actions(admin_obj):
  493. #选择功能
  494. options = "<option class='form-control' value='-1'>-------</option>"#默认为空
  495. actions = admin_obj.default_actions + admin_obj.actions #默认加自定制
  496. print('默认加自定制',actions)
  497. for action in actions:
  498. action_func = getattr(admin_obj,action)#功能方法 #反射
  499. if hasattr(action_func,"short_description"):#反射 如有自定义的名称执行函数方法
  500. action_name = action_func.short_description#等于自定义的名称 #显示中文
  501. else:
  502. action_name = action#等于函数名称
  503. options += """<option value="{action_func_name}">{action_name}</option> """.format(action_func_name=action, action_name=action_name)
  504. return mark_safe(options)
  505. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  506.  
  507. # ————————27PerfectCRM实现King_admin编辑复选框————————
  508. # 复选 框内容待选数据
  509. @register.simple_tag
  510. def get_m2m_available_objs(admin_obj, field_name):
  511. '''返回m2m左侧所有待选数据'''
  512. # c= admin_obj.model.tags.rel.model.objects.all()
  513. # print('c',c)
  514. # m2m_objs= admin_obj.model.tags.rel.model.objects.all()
  515. # print('m2m_objs',m2m_objs)
  516. m2m_model = getattr(admin_obj.model, field_name).rel # 复选框对象
  517. m2m_objs = m2m_model.model.objects.all() # 获取到复选框所有内容
  518. return m2m_objs
  519.  
  520. # 复选 框内容已选中数据
  521. @register.simple_tag
  522. def get_m2m_chosen_objs(admin_obj, field_name, obj):
  523. """
  524. 返回已选中的列表
  525. :param admin_obj:
  526. :param field_name:
  527. :param obj: 数据对象
  528. :return:
  529. """
  530. # print(["--->obj",obj])
  531. if obj.id:
  532. return getattr(obj, field_name).all() # 返回所有的内容
  533. return [] # 没有数据为返回空 创建新的记录使用
  534. # ————————27PerfectCRM实现King_admin编辑复选框————————

#kingadmin_tags.py

  1. #base_admin.py
  2.  
  3. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  4. from django.shortcuts import render,redirect
  5. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  6.  
  7. # ————————04PerfectCRM实现King_admin注册功能————————
  8.  
  9. #Django admin 注册功能的形式
  10. # sites = {
  11. # 'crm':{
  12. # 'customers':CustomerAdmin,
  13. # 'customerfollowup':CustomerFollowUPAdmin,
  14. # }
  15. # }
  16.  
  17. class AdminRegisterException(Exception): #自定义异常
  18. def __init__(self,msg):
  19. self.message = msg
  20.  
  21. class BaseAdmin(object):#自定义方法
  22. list_display = () #显示的字段(不能包含ManyToManyField)
  23.  
  24. # ————————11PerfectCRM实现King_admin分页显示条数————————
  25. list_per_page = 10 # 默认分页条数10
  26. # ————————11PerfectCRM实现King_admin分页显示条数————————
  27.  
  28. # ————————15PerfectCRM实现King_admin多条件过滤————————
  29. list_filter = () # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
  30. # ————————15PerfectCRM实现King_admin多条件过滤————————
  31.  
  32. # ————————18PerfectCRM实现King_admin搜索关键字————————
  33. search_fields = () #搜索(不能包含CharField)(注意加 逗号 , )
  34. # ————————18PerfectCRM实现King_admin搜索关键字————————
  35.  
  36. # ————————26PerfectCRM实现King_admin自定义排序————————
  37. ordering = None #自定义排序
  38. # ————————26PerfectCRM实现King_admin自定义排序————————
  39.  
  40. # ————————27PerfectCRM实现King_admin编辑复选框————————
  41. filter_horizontal = []#复选框
  42. # ————————27PerfectCRM实现King_admin编辑复选框————————
  43.  
  44. # ————————33PerfectCRM实现King_admin编辑整张表限制————————
  45. readonly_table=False#默认表单不锁定
  46. # ————————33PerfectCRM实现King_admin编辑整张表限制————————
  47.  
  48. # ————————36PerfectCRM实现King_admin密码修改————————
  49. modelform_exclude_fields=[]#排除验证字段
  50. # ————————36PerfectCRM实现King_admin密码修改————————
  51.  
  52. # ————————55PerfectCRM实现CRM客户报名状态颜色变化————————
  53. colored_fields = {}
  54. # ————————55PerfectCRM实现CRM客户报名状态颜色变化————————
  55.  
  56. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  57. actions = []#自定功能
  58.  
  59. default_actions = ["delete_selected",] #默认删除的函数
  60. #默认删除的函数
  61. def delete_selected(self,request,queryset):
  62. # from django.shortcuts import render, redirect
  63. print("goint to delete ",queryset)
  64. app_name=self.model._meta.app_label#app名
  65. model_name=self.model._meta.model_name#表名
  66. objs=queryset#类对象
  67. action=request._admin_action
  68. print(action,'<-------action')
  69.  
  70. # ————————33PerfectCRM实现King_admin编辑整张表限制————————
  71. if self.readonly_table:
  72. errors={'锁定的表单':'当前表单已经锁定,不可进行批量删除操作!'}
  73. else:
  74. errors={}
  75. # ————————33PerfectCRM实现King_admin编辑整张表限制————————
  76.  
  77. if request.POST.get('delete_confirm')=='yes': #{#table_delete.html#}
  78.  
  79. # ————————33PerfectCRM实现King_admin编辑整张表限制————————
  80. if not self.readonly_table:
  81. # ————————33PerfectCRM实现King_admin编辑整张表限制————————
  82. queryset.delete()
  83. return redirect('/king_admin/%s/%s/'%(app_name,model_name))
  84. else:
  85. return redirect('/king_admin/%s/%s/' % (app_name, model_name))
  86. selected_ids=','.join([str(i.id) for i in queryset])
  87. print(selected_ids,'<---selected_ids')
  88. objs=queryset
  89. return render(request,"king_admin/table_delete.html", locals()) #返回删除页
  90. delete_selected.short_description = "默认批量删除"
  91. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  92.  
  93. # ————————28PerfectCRM实现King_admin编辑限制————————
  94. readonly_fields = [] # 不可修改
  95.  
  96. # ————————29PerfectCRM实现King_admin编辑自定义限制————————
  97. #默认表单验证 全部 可重写
  98. def default_form_validation(self,request):
  99. #用户可以在此进行自定义的表单验证,相当于django form 的clean方法
  100. '''默认表单验证 == django form 的clean方法'''
  101. pass
  102. # ————————29PerfectCRM实现King_admin编辑自定义限制————————
  103. # ————————28PerfectCRM实现King_admin编辑限制————————
  104.  
  105. # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  106. class AdminSite(object):
  107. def __init__(self):
  108. self.registered_sites = {} #传到views 里调用
  109. def register(self,model,admin_class=None): #默认值None 使用 BaseAdmin
  110. app_name = model._meta.app_label#用内置方法获取 APP名字 (crm)
  111. model_name = model._meta.model_name#用内置方法获取 表名 (Customer)
  112. if app_name not in self.registered_sites:
  113. self.registered_sites[app_name] = {} #创建 crm={}
  114. if model_name in self.registered_sites[app_name]:
  115. raise AdminRegisterException("app [%s] model [%s] has already registered!异常"
  116. %(app_name,model_name))#自定义异常,
  117. if not admin_class:
  118. admin_class = BaseAdmin #默认值None 使用 BaseAdmin
  119. # self.registered_sites[app_name][model_name] = admin_class #注册APP
  120. # site = AdminSite() # 实例化类 单例模式
  121.  
  122. # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  123. #registered_sites {'crm': {'customer': <class 'crm.kingadmin.CustomerAdmin'>, 'courserecord': <class 'kingadmin.base_admin.BaseAdmin'>}}
  124. #把类名放到class的对象里,然后通过class的对象传到前端
  125. # admin_class.model = model
  126. # self.registered_sites[app_name][model_name] = admin_class #注册APP
  127. #
  128. # site = AdminSite() #实例化类 单例模式
  129. # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  130.  
  131. # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
  132. #没有实例化会使用同一个内存地址
  133. admin_obj = admin_class() #先实例化
  134. admin_obj.model = model #参数赋值给实例
  135. self.registered_sites[app_name][model_name] = admin_obj#注册APP
  136. #实例化后,调用会使用不同的内存地址
  137.  
  138. site = AdminSite() #实例化类 单例模式
  139. # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
  140.  
  141. # registered_sites={}
  142. # def register(model,admin_class=None): #默认值None 使用 BaseAdmin
  143. # app_name = model._meta.app_label#用内置方法获取 APP名字 (crm)
  144. # model_name = model._meta.model_name#用内置方法获取 表名 (Customer)
  145. # if app_name not in registered_sites:
  146. # registered_sites[app_name] = {} #创建 crm={}
  147. # if model_name in registered_sites[app_name]:
  148. # raise AdminRegisterException("app [%s] model [%s] has already registered!异常"
  149. # %(app_name,model_name))#自定义异常
  150. # if not admin_class:
  151. # admin_class = BaseAdmin #默认值None 使用class BaseAdmin
  152. # registered_sites[app_name][model_name] = admin_class #注册APP
  153.  
  154. # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  155.  
  156. # ————————04PerfectCRM实现King_admin注册功能————————

#base_admin.py

Django项目:CRM(客户关系管理系统)--65--55PerfectCRM实现CRM客户报名状态颜色变化的更多相关文章

  1. Django项目:CRM(客户关系管理系统)--84--74PerfectCRM实现CRM权限和权限组限制访问URL

    #models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...

  2. Django项目:CRM(客户关系管理系统)--85--75PerfectCRM实现CRM扩展权限

    # sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...

  3. Django项目:CRM(客户关系管理系统)--82--72PerfectCRM实现CRM动态菜单和角色

    #models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...

  4. Django项目:CRM(客户关系管理系统)--69--59PerfectCRM实现king_admin行内编辑

    #base_admin.py # ————————24PerfectCRM实现King_admin自定义操作数据———————— from django.shortcuts import render ...

  5. Django项目:CRM(客户关系管理系统)--72--62PerfectCRM实现CRM讲师讲课记录

    #urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...

  6. Django项目:CRM(客户关系管理系统)--68--58PerfectCRM实现king_admin批量生成上课记录

    # kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...

  7. Django项目:CRM(客户关系管理系统)--66--56PerfectCRM实现CRM客户报名缴费链接

    # kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...

  8. 文献综述二十:基于UML技术的客户关系管理系统实现

    一.基本信息 标题:基于UML技术的客户关系管理系统实现 时间:2015 出版源:电子设计工程 文件分类:uml技术的研究 二.研究背景 设计出可应用与银行和储户之间沟通的客户关系管理系统,从而实现对 ...

  9. Django CRM客户关系管理系统

    CRM需求分析 随着信息化时代带来的科技创新,CRM客户关系管理系统带来的效益在已经成为很多企业提高竞争优势的一分部,CRM客户关系管理系统将企业管理和客户关系管理集成到统一的平台,其系统功能主要体现 ...

随机推荐

  1. 深入解读阿里云数据库POLARDB核心功能会话读一致性

    POLARDB架构 我们知道,POLARDB是一个由多个节点构成的数据库集群,一个主节点,多个读节点.对外默认提供两个地址,一个是集群地址,一个是主地址,推荐使用集群地址,因为它具备读写分离功能可以把 ...

  2. 0916CSP-S模拟测试赛后总结

    40分-rank35. 不想找借口.实力不行. 赛时状态没出什么大问题.就是实力太弱了. 天皇又AK了.去问了一下,他说全是简单题…… 后来发现一些人用非正解AC了. 但是天皇题题正解题题首切啊. 还 ...

  3. 1 A+B问题

    原题网址: http://www.lintcode.com/zh-cn/problem/a-b-problem/# 给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符. 注意事项 你不需 ...

  4. MT Call来电流程分析????

  5. 最全Linux常用命令大全

    查看系统系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMB ...

  6. C++: Basic knowledge Part 1

    1.在 C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”? 首先,extern 是 C/C++ 语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数 ...

  7. JAVA-第一课 环境的配置

    首先 我们需要 下载java的开发工具包 jdk  jdk 的下载地址::http://www.oracle.com/technetwork/java/javase/downloads/index.h ...

  8. html--双飞翼布局

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. activeMQ消息队列安装配置

    1.  下载 到官网下载最新版本,有windows版本和linux版本的. http://activemq.apache.org/download.html 2.   windows下部署 Activ ...

  10. Java虚拟机性能管理神器 - VisualVM(7) 排查JAVA应用程序线程泄漏【转】

    Java虚拟机性能管理神器 - VisualVM(7) 排查JAVA应用程序线程泄漏[转] 标签: javajvm线程泄漏 2015-03-11 19:47 1098人阅读 评论(0) 收藏 举报   ...