系统架构
数据库设计
对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)
- 创建数据库
(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)
- 将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(),
)
修改首页配置
- 创建视图:
视图是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)
- 创建网页模板:
网页模板位于项目目录的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>
- 查看无样式版首页
BUG
其中存在很多bug,例如邮箱会被强制修改,但是我的工作环境需要强制修改,因为confluence注册需要邮箱,可以稍加判断,修改修改。这段代码也只是其中截取的一部分,有的可能看着很奇怪。casdoor接口文件可以查看前面章节。另一点我也算是新手,很多地方可能理解还不够透彻,大佬们请指正。
GZH
- 欢迎关注同名GZH"小红帽rh",获取更多最新分享。