权限管理系统-05-2-django数据库设计和首页

系统架构

系统架构

数据库设计

对casdoor的接口进行研究以后发现只需要移植部分字段,并且为了实现“白名单”功能,需要适当修改某些字段的属性。查看casdoor的数据库结构后,需要移植的字段如下

# yfidmgr/models.py
from django.db import models


class Permissions(models.Model):
    createdTime = models.CharField(max_length=100, default=None)
    displayName = models.CharField(max_length=100, default=None)
    wecom = models.CharField(max_length=100, default=None)
    uid = models.CharField(max_length=100, default=None, unique=True)
    properties = models.TextField(default='{}')
    ranking = models.IntegerField(default=None)
    signupApplication = models.CharField(max_length=100, default=None)
    name = models.CharField(max_length=100)
    email = models.CharField(max_length=100)
    affiliation = models.CharField(max_length=500)
    zoom = models.CharField(max_length=500)
    yandex = models.CharField(max_length=500)
    yammer = models.CharField(max_length=500)
    yahoo = models.CharField(max_length=500)
    xero = models.CharField(max_length=500)
    wepay = models.CharField(max_length=500)
    vk = models.CharField(max_length=100)
    uber = models.CharField(max_length=100)
    typetalk = models.CharField(max_length=100)
    twitter = models.CharField(max_length=100)
    twitch = models.CharField(max_length=100)
    tumblr = models.CharField(max_length=100)
    tiktok = models.CharField(max_length=100)
    stripe = models.CharField(max_length=100)
    strava = models.CharField(max_length=100)
    spotify = models.CharField(max_length=100)
    soundcloud = models.CharField(max_length=100)
    type = models.CharField(max_length=100, default=None)
    update_at = models.DateTimeField(default=None)
  1. 创建数据库
(venv) PS D:\pycode\yfidmgrdev> python manage.py makemigrations 
Migrations for 'yfidmgr':
  yfidmgr\migrations\0001_initial.py
    - Create model Permissions
(venv) PS D:\pycode\yfidmgrdev> python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, yfidmgr
Running migrations:
  Applying yfidmgr.0001_initial... OK

执行以上命令后会生成“app名称_class名称”,其他表是系统默认的。

mysql> shwo tables;
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| yfidmgr_permissions        |
+----------------------------+
11 rows in set (0.00 sec)
  1. 将casdoor的数据同步到django数据库中
# __author__ "xiaoyong"
# Email:1362619268@qq.com
# date: 2023/9/13 22:47

from django.utils import timezone
from .models import Permissions
from .yfid_api import get_user, get_users, update_user, add_user, delete_user
import json
from pathlib import Path
from pypinyin import pinyin, Style

# 将汉字转换为拼音(不带声调,无空格)
def hanzi_to_pinyin(text):
    pinyin_list = pinyin(text, style=Style.NORMAL, heteronym=False)
    pinyin_text = ''.join([item[0] for item in pinyin_list])
    return pinyin_text

def get_all_users():
    # 发送 API 请求并获取响应数据
    data = get_users()

    # 将数据导入到数据库中
    for item in data:
        try:
            # 尝试获取已存在的记录
            Permissions.objects.get(uid=item['id'])

            # 如果记录已存在,执行其他逻辑
            pass

        except Permissions.DoesNotExist:
            # 如果记录不存在,则进行创建操作
            email_add = hanzi_to_pinyin(item['name']) + '@aaa.com'
            Permissions.objects.create(
                createdTime=item['createdTime'],
                displayName=item['displayName'],
                wecom=item['wecom'],
                uid=item['id'],
                properties=item['properties'],
                ranking=item['ranking'],
                signupApplication=item['signupApplication'],
                name=item['name'],
                email=email_add,
                affiliation=item['affiliation'],
                zoom=item['zoom'],
                yandex=item['yandex'],
                yammer=item['yammer'],
                yahoo=item['yahoo'],
                xero=item['xero'],
                wepay=item['wepay'],
                vk=item['vk'],
                uber=item['uber'],
                typetalk=item['typetalk'],
                twitter=item['twitter'],
                twitch=item['twitch'],
                tumblr=item['tumblr'],
                tiktok=item['tiktok'],
                stripe=item['stripe'],
                strava=item['strava'],
                spotify=item['spotify'],
                soundcloud=item['soundcloud'],
                type=item['type'],
                update_at=timezone.now(),
            )

修改首页配置

  1. 创建视图:
    视图是URLconf路由到某一URL时执行的函数
    为yfidmgrdev主页编写简单视图,修改yfidmgrdev/views.py如下
from django.shortcuts import render
from .getusers import get_all_users
from .models import Permissions


def index(request):
    get_all_users()  # 调用同步数据函数
    users = Permissions.objects.order_by('-ranking')
    context1 = {'users': users}
    return render(request, "index.html", context1)
  1. 创建网页模板:
    网页模板位于项目目录的templates下
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>权限管理系统首页</title>
</head>
<body>
<div class="container">
权限管理系统首页
    <div class="row">
    <div class="col-12">
        <div class="card">
            <div class="card-header">
                <div class="row align-items-center">
                    <div class="col">
                        <h4>用户列表</h4>
                    </div>
                    <form class="navbar-form navbar-right" id="search-form">
                        <div class="col-auto">
                            <button type="button" id="sync-all-user" title="刷新" class="btn btn-rounded btn-outline-dark"><span class="glyphicon glyphicon-refresh"></span>同步最新数据</button>
                            <a href="#" class="btn btn-rounded btn-outline-dark" title="添加" data-toggle="modal" data-target="#addModal"><span class="glyphicon glyphicon-plus"></span>添加用户</a>
                        </div>
                    </form>
                </div>
            </div>

            <div class="card-body">
                <div class="table-responsive">
                  <table id="example" class="display"  style="min-width: 845px">
                  <thead>
                    <tr>
                        <th>姓名</th>
                        <th>邮箱</th>
                        <th>IP</th>
                        <th>授权系统</th>
                        <th>服务器1授权端口</th>
                        <th>服务器2授权端口</th>
                        <th>操作</th>
                    </tr>
                  </thead>


                    <tbody>
                    {% for user in users %}
                    <tr class="user-row">
                        <td class="text-nowrap">{{ user.name }}</td>
                        <td class="text-nowrap">{{ user.email }}</td>
                        <td class="text-nowrap">{{ user.affiliation }}</td>
                        <td class="text-nowrap">{{ user.zoom }}</td>
                        <td class="text-nowrap">{{ user.yandex }}</td>
                        <td class="text-nowrap">{{ user.yammer }}</td>
                        <td class="text-nowrap">
                            {% if user.name != 'admin' %}
                            <a href="#" class="btn btn-xs btn-primary" data-toggle="modal" data-target="#editModal{{ user.id }}">编辑</a>
                            <button class="btn btn-xs btn-success refresh-button icon-refresh" id="refresh-button" data-id="{{ user.id }}">
                              <span class="glyphicon glyphicon-refresh"></span>
                            </button>
                            <button class="btn btn-xs delete-button btn-danger icon-trash" id="delete-button" data-id="{{ user.id }}">
                                <span class="glyphicon glyphicon-remove"></span>
                            </button>
                            {% endif %}
                            {% csrf_token %}
                        </td>
                    </tr>
                    {% endfor %}
                    </tbody>
                  </table>
                </div>
            </div>
        </div>
    </div>
</div>
</div>
</body>
</html>
  1. 查看无样式版首页
    无样式版首页.png

BUG

其中存在很多bug,例如邮箱会被强制修改,但是我的工作环境需要强制修改,因为confluence注册需要邮箱,可以稍加判断,修改修改。这段代码也只是其中截取的一部分,有的可能看着很奇怪。casdoor接口文件可以查看前面章节。另一点我也算是新手,很多地方可能理解还不够透彻,大佬们请指正。

GZH

  • 欢迎关注同名GZH"小红帽rh",获取更多最新分享。
  • 16
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值