This commit is contained in:
王思川 2024-06-05 00:45:24 +08:00
parent 4f50e05343
commit 7a05944bb5
6 changed files with 188 additions and 42 deletions

View File

@ -122,8 +122,8 @@ DATABASES = {
'default': { 'default': {
'ENGINE': 'django.db.backends.mysql', 'ENGINE': 'django.db.backends.mysql',
'NAME': 'xh_digital_manage', # 数据库名 'NAME': 'xh_digital_manage', # 数据库名
'USER': 'ps', # 用户名 'USER': 'wsc', # 用户名
'PASSWORD': 'ps240523..', # 密码 'PASSWORD': 'jsxh9512..', # 密码
'HOST': 'bj-cdb-7qxczedm.sql.tencentcdb.com', # 地址 'HOST': 'bj-cdb-7qxczedm.sql.tencentcdb.com', # 地址
'PORT': '59450', # 端口号 'PORT': '59450', # 端口号
'OPTIONS': { 'OPTIONS': {

View File

@ -46,7 +46,7 @@
</section> </section>
<!-- [ 主内容页 ] 结束 --> <!-- [ 主内容页 ] 结束 -->
{% include "authority_modal.html" %} {% include "authority_modal1.html" %}
{% include "add_modify_modal.html" %} {% include "add_modify_modal.html" %}
{% endblock %} {% endblock %}

View File

@ -3,7 +3,7 @@ from django.urls import path, include
from django.contrib.auth import views as auth_views from django.contrib.auth import views as auth_views
from application.accounts.views import logout_view, user_permissions_list, available_permissions, \ from application.accounts.views import logout_view, user_permissions_list, available_permissions, \
get_user_existing_permissions get_user_existing_permissions, view_permissions
urlpatterns = [ urlpatterns = [
path('login/', auth_views.LoginView.as_view(template_name='accounts/login.html'), name='user_login'), path('login/', auth_views.LoginView.as_view(template_name='accounts/login.html'), name='user_login'),
@ -12,4 +12,5 @@ urlpatterns = [
path('user_permissions/', user_permissions_list, name='user_permissions_list'), path('user_permissions/', user_permissions_list, name='user_permissions_list'),
path('get_user_existing_permissions/', get_user_existing_permissions, name='get_user_existing_permissions'), path('get_user_existing_permissions/', get_user_existing_permissions, name='get_user_existing_permissions'),
path('permissions/', available_permissions, name='available_permissions'), path('permissions/', available_permissions, name='available_permissions'),
path("view_permissions/", view_permissions, name="view_permissions"),
] ]

View File

@ -11,11 +11,55 @@ from django.contrib.auth.models import Permission, User
from django.contrib.auth.views import LoginView from django.contrib.auth.views import LoginView
from django.views.decorators.csrf import csrf_protect from django.views.decorators.csrf import csrf_protect
from XH_Digital_Management import settings
# 本地Django应用导入 # 本地Django应用导入
from application.accounts.models import AccountProfile from application.accounts.models import AccountProfile
from common.utils.page_helper import paginate_query_and_assign_numbers from common.utils.page_helper import paginate_query_and_assign_numbers
def format_permissions(permissions):
action_prefixes = ['Can add ', 'Can change ', 'Can delete ', 'Can view ']
# 创建动作映射字典
action_mapping = {
'add': '新增',
'change': '修改',
'view': '查看',
'delete': '删除'
}
formatted_permissions = []
for perm in permissions:
name = perm['name']
# 从权限名称中移除动作前缀
for prefix in action_prefixes:
if name.startswith(prefix):
name = name.replace(prefix, '')
break
# 从settings中获取APP_NAME_MAPPING
app_label = perm['content_type__app_label']
resource_group = settings.APP_NAME_MAPPING.get(app_label)
# 如果APP_NAME_MAPPING中没有相应的映射则跳过这个权限
if resource_group is None:
continue
# 获取权限的动作描述
action = perm['codename'].split('_')[0]
permission_description = action_mapping.get(action, '未知操作')
# 构建格式化后的权限字典并添加到列表中
formatted_permissions.append({
'id': perm['id'],
'resource_group': resource_group,
'resource': name,
'permission': permission_description,
'codename': perm['codename']
})
return formatted_permissions
@method_decorator(csrf_protect, name='dispatch') @method_decorator(csrf_protect, name='dispatch')
class CustomLoginView(LoginView): class CustomLoginView(LoginView):
template_name = 'accounts/login.html' template_name = 'accounts/login.html'
@ -125,34 +169,17 @@ def available_permissions(request):
# 使用user_id获取用户对象 # 使用user_id获取用户对象
user = get_object_or_404(User, pk=user_id) user = get_object_or_404(User, pk=user_id)
# 获取用户已有的权限 # 获取用户已有的权限并关联content_type的app_label
user_permissions = user.user_permissions.all() user_permissions = user.user_permissions.all().prefetch_related('content_type').values('id', 'name', 'codename', 'content_type__app_label')
# 获取系统中所有的权限 # 获取系统中所有的权限并关联content_type的app_label
all_permissions = Permission.objects.all() all_permissions = Permission.objects.all().prefetch_related('content_type').values('id', 'name', 'codename', 'content_type__app_label')
# 找出用户尚未拥有的权限 # 找出用户尚未拥有的权限
available_permissions = all_permissions.exclude(id__in=user_permissions.values_list('id', flat=True)) available_permissions = all_permissions.exclude(id__in=user_permissions.values_list('id', flat=True))
# 修改权限的显示格式
def format_permission(permission):
name = permission['name']
# 用于匹配 "Can add ", "Can change ", "Can delete ", "Can view " 等
action_prefixes = ['Can add ', 'Can change ', 'Can delete ', 'Can view ']
for prefix in action_prefixes:
if name.startswith(prefix):
# 移除动作描述,保留资源名称
name = name.replace(prefix, '')
break
return {
'id': permission['id'],
'resource': name, # 这里的name已经不包含动作描述
'permission': permission['codename'].split('_')[0], # 动作描述从codename中提取
'codename': permission['codename']
}
# 序列化可添加的权限并格式化 # 序列化可添加的权限并格式化
formatted_permissions_list = [format_permission(perm) for perm in available_permissions.values('id', 'name', 'codename')] formatted_permissions_list = format_permissions(available_permissions)
# 返回JSON响应 # 返回JSON响应
return JsonResponse(formatted_permissions_list, safe=False) return JsonResponse(formatted_permissions_list, safe=False)
@ -173,11 +200,62 @@ def get_user_existing_permissions(request):
# 使用user_id获取用户对象 # 使用user_id获取用户对象
user = get_object_or_404(User, pk=user_id) user = get_object_or_404(User, pk=user_id)
# 获取用户已有的权限 # 获取用户所有权限的QuerySet并包含content_type的app_label
user_permissions = user.user_permissions.all().values('id', 'name', 'codename') user_permissions = user.user_permissions.all().prefetch_related('content_type').values('id', 'name', 'codename', 'content_type__app_label')
# 将权限序列化为列表 # 将权限序列化为列表
permissions_list = list(user_permissions) permissions_list = format_permissions(user_permissions)
# 返回JSON响应 # 返回JSON响应
return JsonResponse(permissions_list, safe=False) return JsonResponse(permissions_list, safe=False)
def get_user_permissions_with_app(request):
user_id = request.GET.get('user_id')
# 使用user_id获取用户对象
user = get_object_or_404(User, pk=user_id)
# 获取用户所有权限的QuerySet
permissions = user.user_permissions.select_related('content_type')
# 创建包含权限和它们所属应用的列表
permissions_with_app = [
{
'permission': perm.codename,
'app': perm.content_type.app_label,
}
for perm in permissions
]
return permissions_with_app
@login_required
def view_permissions(request, user_id):
# 获取指定的用户对象
user = get_object_or_404(User, pk=user_id)
# 获取用户已有的权限ID集合
user_permissions_ids = set(user.user_permissions.values_list('id', flat=True))
# 查询所有权限并包括关联的ContentType
all_permissions = Permission.objects.select_related('content_type').all()
# 将权限组织为一个字典,以资源分组为键
grouped_permissions = {}
for perm in all_permissions:
group = perm.content_type.app_label
perm_dict = {
'id': perm.id,
'name': perm.name,
'codename': perm.codename,
'checked': perm.id in user_permissions_ids # 标记用户是否已有该权限
}
grouped_permissions.setdefault(group, []).append(perm_dict)
# 渲染模板并传递grouped_permissions和user_id
return render(request, 'authority_modal1.html', {
'grouped_permissions': grouped_permissions,
'user_id': user_id
})

View File

@ -9,7 +9,7 @@
<!-- 表格右上方的新增按钮 --> <!-- 表格右上方的新增按钮 -->
<div class="d-flex justify-content-end mb-2"> <div class="d-flex justify-content-end mb-2">
<button type="button" class="btn btn-success btn-sm">新增权限</button> <button type="button" class="btn btn-success btn-sm">新增权限</button>
<a href="{% url 'available_permissions' %}?user_id=1" target="_blank">查看可用权限</a> <a href="{% url 'available_permissions' %}?user_id=1" target="">查看可用权限</a>
<a href="{% url 'get_user_existing_permissions' %}?user_id=1" target="_blank">查看用户已有权限</a> <a href="{% url 'get_user_existing_permissions' %}?user_id=1" target="_blank">查看用户已有权限</a>
</div> </div>
<!-- 权限管理表格 --> <!-- 权限管理表格 -->
@ -19,7 +19,7 @@
<th>资源分组</th> <th>资源分组</th>
<th>资源名称</th> <th>资源名称</th>
<th>新增权限</th> <th>新增权限</th>
<th>除权限</th> <th>除权限</th>
<th>修改权限</th> <th>修改权限</th>
<th>查看权限</th> <th>查看权限</th>
<th>操作</th> <th>操作</th>
@ -34,7 +34,7 @@
<td><input type="checkbox" name="edit_permission"></td> <td><input type="checkbox" name="edit_permission"></td>
<td><input type="checkbox" name="view_permission"></td> <td><input type="checkbox" name="view_permission"></td>
<td> <td>
<button type="button" class="btn btn-danger btn-sm"></button> <button type="button" class="btn btn-danger btn-sm"></button>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -45,7 +45,7 @@
<td><input type="checkbox" name="edit_permission"></td> <td><input type="checkbox" name="edit_permission"></td>
<td><input type="checkbox" name="view_permission"></td> <td><input type="checkbox" name="view_permission"></td>
<td> <td>
<button type="button" class="btn btn-danger btn-sm"></button> <button type="button" class="btn btn-danger btn-sm"></button>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -56,7 +56,7 @@
<td><input type="checkbox" name="edit_permission"></td> <td><input type="checkbox" name="edit_permission"></td>
<td><input type="checkbox" name="view_permission"></td> <td><input type="checkbox" name="view_permission"></td>
<td> <td>
<button type="button" class="btn btn-danger btn-sm"></button> <button type="button" class="btn btn-danger btn-sm"></button>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -67,7 +67,7 @@
<td><input type="checkbox" name="edit_permission"></td> <td><input type="checkbox" name="edit_permission"></td>
<td><input type="checkbox" name="view_permission"></td> <td><input type="checkbox" name="view_permission"></td>
<td> <td>
<button type="button" class="btn btn-danger btn-sm"></button> <button type="button" class="btn btn-danger btn-sm"></button>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -78,7 +78,7 @@
<td><input type="checkbox" name="edit_permission"></td> <td><input type="checkbox" name="edit_permission"></td>
<td><input type="checkbox" name="view_permission"></td> <td><input type="checkbox" name="view_permission"></td>
<td> <td>
<button type="button" class="btn btn-danger btn-sm"></button> <button type="button" class="btn btn-danger btn-sm"></button>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -89,7 +89,7 @@
<td><input type="checkbox" name="edit_permission"></td> <td><input type="checkbox" name="edit_permission"></td>
<td><input type="checkbox" name="view_permission"></td> <td><input type="checkbox" name="view_permission"></td>
<td> <td>
<button type="button" class="btn btn-danger btn-sm"></button> <button type="button" class="btn btn-danger btn-sm"></button>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -100,7 +100,7 @@
<td><input type="checkbox" name="edit_permission"></td> <td><input type="checkbox" name="edit_permission"></td>
<td><input type="checkbox" name="view_permission"></td> <td><input type="checkbox" name="view_permission"></td>
<td> <td>
<button type="button" class="btn btn-danger btn-sm"></button> <button type="button" class="btn btn-danger btn-sm"></button>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -111,7 +111,7 @@
<td><input type="checkbox" name="edit_permission"></td> <td><input type="checkbox" name="edit_permission"></td>
<td><input type="checkbox" name="view_permission"></td> <td><input type="checkbox" name="view_permission"></td>
<td> <td>
<button type="button" class="btn btn-danger btn-sm"></button> <button type="button" class="btn btn-danger btn-sm"></button>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -122,7 +122,7 @@
<td><input type="checkbox" name="edit_permission"></td> <td><input type="checkbox" name="edit_permission"></td>
<td><input type="checkbox" name="view_permission"></td> <td><input type="checkbox" name="view_permission"></td>
<td> <td>
<button type="button" class="btn btn-danger btn-sm"></button> <button type="button" class="btn btn-danger btn-sm"></button>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -133,7 +133,7 @@
<td><input type="checkbox" name="edit_permission"></td> <td><input type="checkbox" name="edit_permission"></td>
<td><input type="checkbox" name="view_permission"></td> <td><input type="checkbox" name="view_permission"></td>
<td> <td>
<button type="button" class="btn btn-danger btn-sm"></button> <button type="button" class="btn btn-danger btn-sm"></button>
</td> </td>
</tr> </tr>
</tbody> </tbody>

View File

@ -0,0 +1,67 @@
<div class="modal" id="userPermissionModal" tabindex="-1" aria-labelledby="userPermissionModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg"> <!-- 修改了模态框的大小 -->
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="userPermissionModalLabel">用户权限管理</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<!-- 表格右上方的新增按钮 -->
<div class="d-flex justify-content-end mb-2">
<button type="button" class="btn btn-success btn-sm">新增权限</button>
</div>
<!-- 权限管理表格 -->
<table class="table">
<thead>
<tr>
<th>资源分组</th>
<th>资源名称</th>
<th>新增权限</th>
<th>移除权限</th>
<th>修改权限</th>
<th>查看权限</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for group, perms in grouped_permissions.items %}
{% for perm in perms %}
<tr>
<td>{{ group }}</td>
<td>{{ perm.name }}</td>
<td>{{ perm.codename }}</td>
<td><input type="checkbox" name="{{ perm.codename }}" {% if perm.checked %}checked{% endif %} disabled></td>
<!-- 根据实际需要填充更多单元格 -->
</tr>
{% endfor %}
{% endfor %}
</tbody>
</table>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">关闭</button>
<button type="button" class="btn btn-primary">保存更改</button>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function() {
// 当模态框被触发显示时
$('#userPermissionModal').on('show.bs.modal', function(event) {
// 可以传递额外的数据例如用户ID
var userId = $(event.relatedTarget).data('userid');
// 发送AJAX请求到服务器以获取权限表格的HTML内容
$.ajax({
url: '/path-to-your-view/' + userId, // 服务器端的URL
type: 'GET',
success: function(response) {
// 将响应的HTML内容插入到模态框的内容区域
$('#permissionsModal .modal-content').html(response);
}
});
});
});
</script>