上一节主要说的是如何通过url进行权限控制,这一节就说一下如何开发一个权限控制的界面,这样我们就能很方便的创建角色,并分配给用户不同角色和不同权限.

1.编写角色管理页面

这个编写较为简单,主要是通过modelform快速实现的,下面代码比较简单,我就不多说了

效果图如下:

代码如下:

  1. def role_list(request):
  2. """角色列表"""
  3. roles_list = Role.objects.all()
  4. # 分页
  5. current_page_num = request.GET.get('page')
  6. pagination = MyPagination(current_page_num, roles_list.count(), request)
  7. roles_list = roles_list[pagination.start:pagination.end]
  8. return render(request, 'rbac/role_list.html', {'roles_list': roles_list, 'pagination':pagination})
  9.  
  10. def role_operate(request, edit_id=None):
  11. """角色操作"""
  12. role_obj = Role.objects.filter(pk=edit_id).first()
  13. if request.method == "POST":
  14. role_form = RoleModelForm(request.POST, instance=role_obj)
  15. if role_form.is_valid():
  16. role_form.save()
  17. return redirect(reverse('rbac:role_list'))
  18. return render(request, 'rbac/role_operate.html', {'role_form': role_form})
  19. role_form = RoleModelForm(instance=role_obj)
  20. return render(request, 'rbac/role_operate.html', {'role_form': role_form, 'role_obj': role_obj})
  21.  
  22. def role_del(request, del_id):
  23. """删除角色"""
  24. Role.objects.filter(pk=del_id).delete()
  25. return redirect(reverse('rbac:role_list'))
  1. RoleModelForm,这里就只有一个name字段,不给角色字段是创建完用户后到时再分配
  1. class RoleModelForm(forms.ModelForm):
  2. """角色的modelform"""
  3. class Meta:
  4. model = Role
  5. fields = ['name']
  6.  
  7. error_messages = {
  8. 'name': {'required': '角色名称不能为空'}
  9. }
  10. widgets = {
  11. 'name': wid.TextInput(attrs={'class': 'form-control'})
  12. }

2.编写菜单权限管理页面

这个也不是特别难,因为主要就是两张表在页面渲染的事情,效果图如下:

代码如下:

  1. def menu_list(request):
  2. """菜单权限列表"""
  3. # 获取所有的菜单
  4. menu_list = Menu.objects.all()
  5. # 菜单管理目前选择的菜单名称id
  6. mid = request.GET.get('mid')
  7. # 如果mid有值则通过二级菜单中菜单id是一级菜单的和二级菜单下子权限id属于一级菜单的全部找出来显示,没有则显示全部菜单
  8. if mid:
  9. permission_list = Permission.objects.filter(Q(parent__menu__id=mid) | Q(menu_id=mid))
  10. else:
  11. permission_list = Permission.objects.all()
  12. # 查询出权限表中的所有字段
  13. all_permission_list = permission_list.values('id', 'url', 'title', 'url_name',
  14. 'menu_id', 'parent_id', 'menu__title')
  15. # 把所有菜单以字典形式保存在字典中
  16. all_permission_dict = {}
  17. # 第一次for循环将二级菜单加入字典中
  18. for permission in all_permission_list:
  19. menu_id = permission.get('menu_id')
  20. # 有menu_id就证明是二级菜单,加入字典
  21. if menu_id:
  22. permission['children'] = []
  23. all_permission_dict[permission['id']] = permission
  24. # 第二次for循环将三级菜单(子权限)加入到二级菜单的children中
  25. for permission in all_permission_list:
  26. parent_id = permission.get('parent_id')
  27. if parent_id:
  28. all_permission_dict[parent_id]['children'].append(permission)
  29. return render(request, 'rbac/menu_list.html', {'menu_list': menu_list,
  30. 'all_permission_dict': all_permission_dict, 'mid': mid})
  31.  
  32. def menu_operate(request, edit_id=None):
  33. """菜单管理操作"""
  34. menu_obj = Menu.objects.filter(pk=edit_id).first()
  35. if request.method == "POST":
  36. form_obj = MenuModelForm(request.POST, instance=menu_obj)
  37. if form_obj.is_valid():
  38. form_obj.save()
  39. return redirect(reverse('rbac:menu_list'))
  40. return render(request, 'rbac/menu_operate.html', {'form_obj': form_obj})
  41. form_obj = MenuModelForm(instance=menu_obj)
  42. return render(request, 'rbac/menu_operate.html', {'form_obj': form_obj, 'menu_obj': menu_obj})
  43.  
  44. def menu_del(request, del_id):
  45. """菜单管理删除"""
  46. Menu.objects.filter(pk=del_id).delete()
  47. return redirect(reverse('rbac:menu_list'))
  48.  
  49. def permission_operate(request, edit_id=None):
  50. """权限管理操作"""
  51. permission_obj = Permission.objects.filter(pk=edit_id).first()
  52. if request.method == "POST":
  53. form_obj = PermissionModelForm(request.POST, instance=permission_obj)
  54. if form_obj.is_valid():
  55. form_obj.save()
  56. return redirect(reverse('rbac:menu_list'))
  57. return render(request, 'rbac/permission_operate.html', {'form_obj': form_obj})
  58. form_obj = PermissionModelForm(instance=permission_obj)
  59. return render(request, 'rbac/permission_operate.html', {'form_obj': form_obj, 'permission_obj': permission_obj})
  60.  
  61. def permission_del(request, del_id):
  62. """权限管理删除"""
  63. Permission.objects.filter(pk=del_id).delete()
  64. return redirect(reverse('rbac:menu_list'))

页面对上面两个数据的for循环展示(这也是最主要的数据展示部分)

  1. {% for p_permission in all_permission_dict.values %}
  2. <tr class="parent" id="{{ p_permission.id }}">
  3. <td class="title"><i class="fa fa-caret-down"></i>{{ p_permission.title }}</td>
  4. <td>{{ p_permission.url }}</td>
  5. <td>{{ p_permission.url_name }}</td>
  6. <td>是</td>
  7. <td>{{ p_permission.menu__title }}</td>
  8. <td>
  9. <a href="{% url 'rbac:permission_edit' p_permission.id %}"><i class="fa fa-edit"></i></a>
  10. <a style="margin-left: 10px" href="{% url 'rbac:permission_del' p_permission.id %}"><i
  11. class="fa fa-trash-o text-danger"></i></a>
  12. </td>
  13. </tr>
  14. {% for c_permission in p_permission.children %}
  15. <tr pid="{{ c_permission.parent_id }}">
  16. <td style="padding-left: 20px">{{ c_permission.title }}</td>
  17. <td>{{ c_permission.url }}</td>
  18. <td>{{ c_permission.url_name }}</td>
  19. <td></td>
  20. <td></td>
  21. <td>
  22. <a href="{% url 'rbac:permission_edit' c_permission.id %}"><i class="fa fa-edit"></i></a>
  23. <a style="margin-left: 10px" href="{% url 'rbac:permission_del' c_permission.id %}"><i
  24. class="fa fa-trash-o text-danger"></i></a>
  25. </td>
  26. </tr>
  27. {% endfor %}
  28.  
  29. {% endfor %}

点击二级菜单显示和隐藏,这里巧妙的用到了二级菜单的id和子权限的parent_id相等去显示和隐藏,下面是显示隐藏的jquery代码

  1. <script>
  2. $('.permisson-area').on('click', 'tr .title', function () {
  3. var caret = $(this).find('i');
  4. var id = $(this).parent().attr('id');
  5. if (caret.hasClass('fa-caret-right')){
  6. caret.removeClass('fa-caret-right').addClass('fa-caret-down');
  7. $(this).parent().nextAll('tr[pid="' + id + '"]').removeClass('hide');
  8. }else{
  9. caret.removeClass('fa-caret-down').addClass('fa-caret-right');
  10. $(this).parent().nextAll('tr[pid=' + id + ']').addClass('hide');
  11. }
  12. })
  13. </script>

3.分配权限管理页面编写(这个比较麻烦,主要是数据结构比较复杂,嵌套太多层,注意这还是二级菜单)

实现的效果图如下:

代码如下,备注在代码中写了,详细请看代码:

  1. def distribute_permissions(request):
  2. """分配权限"""
  3. # uid是前端提交的用户id,rid是前端提交的角色id
  4. uid = request.GET.get('uid')
  5. rid = request.GET.get('rid')
  6.  
  7. # 用户添加角色,由于有多个from表单所以给每个from表单一个postType
  8. if request.method == 'POST' and request.POST.get('postType') == 'role' and uid:
  9. user = User.objects.filter(id=uid).first()
  10. if not user:
  11. return HttpResponse('用户不存在')
  12. # 因为是多对多的关系,所以用set就可以直接更新数据了,记得set里面必须是可迭代对象,所以getlist
  13. user.roles.set(request.POST.getlist('roles'))
  14. # 角色添加权限
  15. if request.method == 'POST' and request.POST.get('postType') == 'permission' and rid:
  16. role = Role.objects.filter(id=rid).first()
  17. if not role:
  18. return HttpResponse('角色不存在')
  19. role.permissions.set(request.POST.getlist('permissions'))
  20.  
  21. # 所有用户,界面用户展示
  22. user_list = User.objects.all()
  23. # 取得当前用户的所有角色
  24. user_has_roles = User.objects.filter(id=uid).values('id', 'roles')
  25. # 获取用户拥有的角色id,数据结构是{角色id: None},这种数据结构推荐,到时直接in就能判断了,效率高
  26. user_has_roles_dict = {item['roles']: None for item in user_has_roles}
  27.  
  28. # 角色列表(所有角色),界面用户展示
  29. role_list = Role.objects.all()
  30.  
  31. # 如过选中了角色,那么就根据角色id拿到所有的权限
  32. if rid:
  33. role_has_permissions = Role.objects.filter(id=rid).values('id', 'permissions')
  34. # 如果只选中了用户没有选择角色,那么就通过用户的角色去拿对应的所有权限
  35. elif uid and not rid:
  36. user = User.objects.filter(id=uid).first()
  37. if not user:
  38. return HttpResponse('用户不存在')
  39. role_has_permissions = user.roles.values('id', 'permissions')
  40. else:
  41. # 都没选中,就是初始化状态,界面不勾选任何权限菜单
  42. role_has_permissions = []
  43.  
  44. # 获取角色拥有的权限id,数据结构是{权限id: None}
  45. role_has_permissions_dict = {item['permissions']: None for item in role_has_permissions}
  46.  
  47. # 以列表形式存放所有的菜单信息
  48. all_menu_list = []
  49.  
  50. # 查询出所有菜单
  51. menu_queryset = Menu.objects.values('id', 'title')
  52. # 以字典形式存放所有的菜单信息
  53. menu_dict = {}
  54.  
  55. # 这个for循环的作用是将一级菜单信息分别放入了menu_dict字典和all_menu_list列表中
  56. for item in menu_queryset:
  57. item['children'] = [] # 存放二级菜单(父权限)
  58. menu_dict[item['id']] = item # 注意这里是将item对象赋值给了item['id'],所以menu_dict和all_menu_list是一起变化的
  59. all_menu_list.append(item)
  60.  
  61. """
  62. 下面是这两个的数据结构,字典套字典,然后children字段子菜单就是列表,然后反复这样嵌套
  63. menu_dict = {'menu_id': {'id':1, 'title': 'xxx', 'children': [
  64. {'id', 'title', 'menu_id', 'children': [
  65. {'id', 'title', 'parent_id'}
  66. ]},
  67. ]},
  68. None: {'id': None, 'title': '其他', 'children': [{'id', 'title', 'parent_id'}]}
  69. }
  70. all_menu_list = [
  71. {'id':1, 'title': 'xxx', 'children': [
  72. {'id', 'title', 'menu_id', 'children': [
  73. {'id', 'title', 'parent_id'}
  74. ]},
  75. ]},
  76. {'id': None, 'title': '其他', 'children': [{'id', 'title', 'parent_id'}]}
  77. ]
  78. """
  79. # 像首页这些不属于任何一级菜单,所以可以归属于other下面
  80. other = {'id': None, 'title': '其他', 'children': []}
  81. # 两个数据结构分别加入other
  82. all_menu_list.append(other)
  83. menu_dict[None] = other
  84.  
  85. # 查询二级菜单的权限信息
  86. parent_permission = Permission.objects.filter(menu__isnull=False).values('id', 'title', 'menu_id')
  87. # 二级菜单信息字典
  88. parent_permission_dict = {}
  89. """
  90. parent_permission_dict = {父权限id: {'id', 'title', 'menu_id', 'children': [
  91. {'id', 'title', 'parent_id'}
  92. ]} }
  93. """
  94.  
  95. for per in parent_permission:
  96. per['children'] = [] # 存放子权限
  97. nid = per['id']
  98. menu_id = per['menu_id']
  99. # 以二级菜单id为键,二级菜单信息为值加入到二级菜单字典中
  100. parent_permission_dict[nid] = per
  101. # 一级菜单字典将二级菜单加入到children下,注意一级菜单列表数据结构也会跟着增加(py内存使用导致)
  102. menu_dict[menu_id]['children'].append(per)
  103.  
  104. # 类似上面的操作,将不是二级菜单的权限全部找出来,包括子权限和other
  105. node_permission = Permission.objects.filter(menu__isnull=True).values('id', 'title', 'parent_id')
  106.  
  107. for per in node_permission:
  108. pid = per['parent_id']
  109. # 如果不是子权限,就将信息加入到other的children下
  110. if not pid:
  111. menu_dict[None]['children'].append(per)
  112. continue
  113. # 是子权限就加入到二级菜单的children下,因为menu_dict存放的是二级菜单的对象,所以此时menu_dict就有了各个层级的数据
  114. parent_permission_dict[pid]['children'].append(per)
  115.  
  116. return render(request, 'rbac/distribute_permissions.html',
  117. {
  118. 'user_list': user_list,
  119. 'role_list': role_list,
  120. 'user_has_roles_dict': user_has_roles_dict,
  121. 'role_has_permissions_dict': role_has_permissions_dict,
  122. 'all_menu_list': all_menu_list,
  123. 'uid': uid,
  124. 'rid': rid,
  125. })

前端代码:

  1. {% extends 'layout.html' %}
  2. {% block css %}
  3. <style>
  4. .user-area ul {
  5. padding-left: 20px;
  6. }
  7.  
  8. .user-area li {
  9. cursor: pointer;
  10. padding: 2px 0;
  11. }
  12.  
  13. .user-area li a {
  14. display: block;
  15. }
  16.  
  17. .user-area li.active {
  18. font-weight: bold;
  19. color: red;
  20. }
  21.  
  22. .user-area li.active a {
  23. color: red;
  24. }
  25.  
  26. .role-area tr td a {
  27. display: block;
  28. }
  29.  
  30. .role-area tr.active {
  31. background-color: #f1f7fd;
  32. border-left: 3px solid #fdc00f;
  33. }
  34.  
  35. .permission-area tr.root {
  36. background-color: #f1f7fd;
  37. cursor: pointer;
  38. }
  39.  
  40. .permission-area tr.root td i {
  41. margin: 3px;
  42. }
  43.  
  44. .permission-area .node {
  45.  
  46. }
  47.  
  48. .permission-area .node input[type='checkbox'] {
  49. margin: 0 5px;
  50. }
  51.  
  52. .permission-area .node .parent {
  53. padding: 5px 0;
  54. }
  55.  
  56. .permission-area .node label {
  57. font-weight: normal;
  58. margin-bottom: 0;
  59. font-size: 12px;
  60. }
  61.  
  62. .permission-area .node .children {
  63. padding: 0 0 0 20px;
  64. }
  65.  
  66. .permission-area .node .children .child {
  67. display: inline-block;
  68. margin: 2px 5px;
  69. }
  70.  
  71. table {
  72. font-size: 12px;
  73. }
  74.  
  75. .panel-body {
  76. font-size: 12px;
  77. }
  78.  
  79. .panel-body .form-control {
  80. font-size: 12px;
  81. }
  82. </style>
  83. {% endblock %}
  84. {% block content %}
  85. <div class="container-fluid" style="margin-top: 20px">
  86. <div class="col-sm-3 user-area">
  87. <div class="panel panel-default">
  88. <div class="panel-heading"><i class="fa fa-user"></i> 用户信息</div>
  89. <div class="panel-body">
  90. <ul>
  91. {% for user in user_list %}
  92. <li class={% if user.id|safe == uid %}"active"{% endif %}>
  93. <a href="?uid={{ user.id }}">{{ user.name }}</a>
  94. </li>
  95. {% endfor %}
  96.  
  97. </ul>
  98. </div>
  99. </div>
  100. </div>
  101. <div class="col-sm-3 role-area">
  102. <form action="" method="post">
  103. {% csrf_token %}
  104. <input type="hidden" name="postType" value="role">
  105. <div class="panel panel-default">
  106. <div class="panel-heading"><i class="fa fa-book"></i> 角色
  107. {% if uid %}
  108. <button type="submit" style="padding: 2px 6px;position: relative;top: -3px;"
  109. class="btn btn-success pull-right"><i style="margin-right: 2px"
  110. class="fa fa-save"></i> 保存
  111. </button>
  112. {% endif %}
  113. </div>
  114. <div class="panel-body">
  115. <span style="color: darkgray">提示:点击用户后才能为其分配角色</span>
  116. </div>
  117. <table class="table table-hover">
  118. <thead>
  119. <tr>
  120. <th>角色</th>
  121. <th>选择</th>
  122. </tr>
  123. </thead>
  124. <tbody>
  125. {% load my_tag %}
  126. {% for role in role_list %}
  127. <tr {% if role.id|safe == rid %}class="active"{% endif %}>
  128. <td><a href="?{% get_role_url request role.id %}">{{ role.name }}</a></td>
  129. <td>
  130. {% if role.id in user_has_roles_dict %}
  131. <input type="checkbox" name="roles" value="{{ role.id }}" checked>
  132. {% else %}
  133. <input type="checkbox" name="roles" value="{{ role.id }}">
  134. {% endif %}
  135. </td>
  136. </tr>
  137. {% endfor %}
  138.  
  139. </tbody>
  140. </table>
  141.  
  142. </div>
  143. </form>
  144. </div>
  145. <div class="col-sm-6 permission-area">
  146. <form action="" method="post">
  147. {% csrf_token %}
  148. <input type="hidden" name="postType" value="permission">
  149. <div class="panel panel-default">
  150. <div class="panel-heading"><i class="fa fa-reddit"></i> 权限分配</div>
  151. {% if rid %}
  152. <button type="submit"
  153. style="padding: 2px 6px;position: relative;top: -32px; margin-right: 10px;"
  154. class="btn btn-success pull-right"><i style="margin-right: 2px" class="fa fa-save"></i>
  155. 保存
  156. </button>
  157. {% endif %}
  158. <div class="panel-body">
  159. <span style="color: darkgray">提示:点击角色后,才能为其分配权限</span>
  160. </div>
  161. <table class="table">
  162. <tbody class="permission-tbody">
  163. {% for item in all_menu_list %}
  164. <tr class="root">
  165. <td><i class="fa fa-caret-down"></i>{{ item.title }}</td>
  166. </tr>
  167. <tr class="node">
  168. <td>
  169. {% for node in item.children %}
  170. <div class="parent">
  171. {% if node.id in role_has_permissions_dict %}
  172. <input id="permission_{{ node.id }}" name="permissions"
  173. value="{{ node.id }}" type="checkbox" checked>
  174. {% else %}
  175. <input id="permission_{{ node.id }}" name="permissions"
  176. value="{{ node.id }}" type="checkbox">
  177. {% endif %}
  178. <label for="permission_{{ node.id }}">{{ node.title }}</label>
  179. </div>
  180. <div class="children">
  181. {% for child in node.children %}
  182. <div class="child">
  183. {% if child.id in role_has_permissions_dict %}
  184. <input id="permission_{{ child.id }}" name="permissions"
  185. value="{{ child.id }}" type="checkbox" checked>
  186. {% else %}
  187. <input id="permission_{{ child.id }}" name="permissions"
  188. value="{{ child.id }}" type="checkbox">
  189. {% endif %}
  190. <label for="permission_{{ child.id }}">{{ child.title }}</label>
  191. </div>
  192. {% endfor %}
  193. </div>
  194. {% endfor %}
  195. </td>
  196. </tr>
  197. {% endfor %}
  198. </tbody>
  199. </table>
  200.  
  201. </div>
  202. </form>
  203. </div>
  204. </div>
  205. {% endblock %}
  206. {% block js %}
  207. <script>
  208. $('.permission-tbody').on('click', '.root', function () {
  209. var caret = $(this).find('i');
  210. if (caret.hasClass('fa-caret-right')) {
  211. caret.removeClass('fa-caret-right').addClass('fa-caret-down');
  212. $(this).next('.node').removeClass('hide');
  213. } else {
  214. caret.removeClass('fa-caret-down').addClass('fa-caret-right');
  215. $(this).next('.node').addClass('hide');
  216. }
  217. })
  218. </script>
  219.  
  220. {% endblock %}

至此,页面大致开发完成,单独开发完成rbac之后,还得嵌入项目中去,大致也说一下迁移的过程:

  1. rbac应用于其他项目流程
  2. 1.拷贝rbac到新项目
  3. 2.settings中注册rabc app
  4. 3.数据库迁移
  5. 首先先删除原有migrations下的文件,再执行数据库迁移命令
  6. python manage.py makemigrations
  7. python manage.py migrate
  8. 4.在根目录下的urls.py中添加rbac相关的url
  9. re_path(r'^rbac/', include('rbac.urls', namespace='rbac'))
  10. 5.layout.html的创建和编写,因为rbac中的模板都继承了这个
  11. 6.录入权限信息
  12. 角色管理
  13. 权限管理
  14. 7.分配权限
  15. 先用户关联,原系统用户表一对一关联rbac用户表
  16. from rbac.models import User
  17. user = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
  18. 给用户分角色和权限
  19. 8.登录应用权限
  20. 登录成功后获取rbacuser_obj,然后初始化用户信息
  21.  
  22. 应用权限校验中间件
  23. 9.注意模板layout内容和名称
  24.  
  25. 10.应用面包屑导航栏,中间会遇到很多样式js等不同,慢慢调试吧
  26.  
  27. 11.权限控制到按钮级别

RABC权限控制(页面操作角色,权限和进行分配)的更多相关文章

  1. 【shiro】2.spring整合shiro,注解控制shiro用户/角色/权限And/OR,没有权限跳转到固定页面

    这几天粗浅的把shiro整合到spring中,并且注解控制shiro用户/角色/权限And/OR 步骤: 1.首先maven搭建web项目 2.创建数据库 user/role/authority 其中 ...

  2. asp.net core根据用户权限控制页面元素的显示

    asp.net core根据用户权限控制页面元素的显示 Intro 在 web 应用中我们经常需要根据用户的不同允许用户访问不同的资源,显示不同的内容,之前做了一个 AccessControlHelp ...

  3. .NetCore中如何实现权限控制 基于Claim角色、策略、基于Claim功能点处理

    .NetCore中如果实现权限控制的问题,当我们访问到一个Action操作的时候,我们需要进行权限控制 基于claims 角色控制 基于角色控制总觉得范围有点过大,而且控制起来感觉也不是太好,举一个例 ...

  4. java权限管理与用户角色权限设计

    java权限管理与用户角色权限设计 实现业务系统中的用户权限管理 B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户的权限检测可以通过客户端实现或通过客户端+服务器 ...

  5. yii2 rbac权限控制详细操作步骤

    作者:白狼 出处:http://www.manks.top/article/yii2_rbac_description本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 ...

  6. 巨蟒django之权限6: 权限控制表设计&&登录权限

    1.权限控制表设计 内容 . 什么是权限? . 为什么要有权限? 不同用户拥有不同的功能 . 在web开发中,什么是权限? url 代表 权限 . 开发一个权限的组件,为什么要开发组件? . 表结构的 ...

  7. Web应用程序系统的多用户权限控制设计及实现-权限模块【10】

    前五章均是从整体上讲述了Web应用程序的多用户权限控制实现流程,本章讲述Web权限管理系统的权限配置模块.页面模块涉及到的数据表为权限表.权限配置模块是按照用户组和页面,栏目结合组成的.通过配置一个用 ...

  8. openstack 权限控制 (添加自定义角色)keystone等组件

    每一个平台.系统都会对于用户的权限进行严格的管理与控制. openstack是一个开源的项目,我们可以直接下载其源码,进行更改以达到我们的要求. 这里只是针对于用户的权限进行管理,以keystone: ...

  9. JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作

    1 学习计划 1.演示权限demo 2.权限概述 n 认证 n 授权 3.常见的权限控制方式 n url拦截权限控制 n 方法注解权限控制 4.创建权限数据模型 n 权限表 n 角色表 n 用户表 n ...

随机推荐

  1. matlab进行离散点的曲线拟合

    原文:matlab进行离散点的曲线拟合 ployfit是matlab中基于最小二乘法的多项式拟合函数.最基础的用法如下: C=polyfit(X,Y,N) 其中: X : 需要拟合的点的横坐标 Y:需 ...

  2. 潜移默化学会WPF--值转换器

    原文:潜移默化学会WPF--值转换器 1. binding 后面的stringFormat的写法----连接字符串 <TextBlock Text="{Binding Path=Qty ...

  3. WPF控件TextBlock中文字自动换行

    原文:WPF控件TextBlock中文字自动换行 在很多的WPF项目中,往往为了追求界面的美观,需要控制控件中文字的换行显示,现对TextBlock控件换行的实现方式进行总结,希望大家多多拍砖!!! ...

  4. Codejock.Xtreme.Toolkit.Pro.v15.3.1 下载 与 VS2015补丁使用方法

    Codejock.Xtreme.Toolkit.Pro.v15.3.1 下载 与 VS2015补丁使用方法 打算放在CSDN进行下载的,上传完成后发现资源分设置的1分,本打算赚点下载分的.在页面上没有 ...

  5. Win8 Metro(C#)数字图像处理--2.70修正后的阿尔法滤波器

    原文:Win8 Metro(C#)数字图像处理--2.70修正后的阿尔法滤波器 /// <summary> /// Alpha filter. /// </summary> / ...

  6. “重定向次数过多”或者“Too many automatic redirections were attempted”的错误:

    C# 代码 C# code? 1 2 3 4 5 6 7 8 9 String url="http://www.google.com.hk/search?hl=zh-CN&q=孟宪会 ...

  7. C#匹配中文字符串的4种正则表达式分享

    本文介绍在C#中使用匹配中文的正则表达式,包括纯中文.有中文.中文开头.中文结尾等几个正则表达式示例.在正则表达式中,中文可以通过Unicode编码来确定正则表达式范围. 在C#中,匹配中文的正则表达 ...

  8. [PowerDesign]将数据库从SQL Server数据库转换为MySQL

    原文:[PowerDesign]将数据库从SQL Server数据库转换为MySQL 一.迁移Database Schema. 首先使用Sybase Powerdesigner的逆向工程功能,逆向出S ...

  9. Qt编译和使用boost库(附QT5.51的Boost下载)good

    配置gcc可以在cmd中使用 添加MinGW到环境变量 安装过Qt的都已经默认安装过MinGw的环境了,只需要找到配置一下环境变量就行 我的在D:\Qt5.5.1\Tools\mingw492_32\ ...

  10. React Native v0.4 发布,用 React 编写移动应用

    React Native v0.4 发布,自从 React Native 开源以来,包括超过 12.5k stars,1000 commits,500 issues,380 pull requests ...