当前位置: 首页 > news >正文

Django之账号登录及权限管理

账号登录及权限管理

目录

1.登录功能

2.退出登录

3.权限管理

4.代码展示合集

这篇文章, 会讲到如何实现账号登录。账号就是我们上一篇文章写的账号管理功能, 就使用那里面已经创建好的账号。这一次登录, 我们分为三种角色, 分别是员工, 领导, 管理员。不同的角色, 登录进去之后的页面都是不一样的, 管理员权限最大, 拥有所有的功能, 而员工, 只有查看数据的功能, 不能做增删改, 而且能看到的数据, 也只有一部分数, 这种功能, 就是我们所谓的权限管理。

一、登录功能

如果嫌麻烦, 不想自己写登录界面的话, 可以去网上搜一下别人已经写好的登录界面。

网址: blog.csdn.net/ss810540895/article/details/125799099。

我们就找这一个登录界面吧:

在这里插入图片描述

我们把它的源码全部copy下来, 然后在templates下面的新建login文件夹, 接着再新建文件login.html。

login.html代码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>* {margin: 0;padding: 0;}a {text-decoration: none;}input,button {background: transparent;border: 0;outline: none;}body {height: 100vh;background: linear-gradient(#141e30, #243b55);display: flex;justify-content: center;align-items: center;font-size: 16px;color: #03e9f4;}.loginBox {width: 400px;height: 364px;background-color: #0c1622;margin: 100px auto;border-radius: 10px;box-shadow: 0 15px 25px 0 rgba(0, 0, 0, .6);padding: 40px;box-sizing: border-box;}h2 {text-align: center;color: aliceblue;margin-bottom: 30px;font-family: 'Courier New', Courier, monospace;}.item {height: 45px;border-bottom: 1px solid #fff;margin-bottom: 40px;position: relative;}.item input {width: 100%;height: 100%;color: #fff;padding-top: 20px;box-sizing: border-box;}.item input:focus+label,.item input:valid+label {top: 0px;font-size: 2px;}.item label {position: absolute;left: 0;top: 12px;transition: all 0.5s linear;}.btn {padding: 10px 20px;margin-top: 30px;color: #03e9f4;position: relative;overflow: hidden;text-transform: uppercase;letter-spacing: 2px;left: 35%;}.btn:hover {border-radius: 5px;color: #fff;background: #03e9f4;box-shadow: 0 0 5px 0 #03e9f4,0 0 25px 0 #03e9f4,0 0 50px 0 #03e9f4,0 0 100px 0 #03e9f4;transition: all 1s linear;}.btn>span {position: absolute;}.btn>span:nth-child(1) {width: 100%;height: 2px;background: -webkit-linear-gradient(left, transparent, #03e9f4);left: -100%;top: 0px;animation: line1 1s linear infinite;}@keyframes line1 {50%,100% {left: 100%;}}.btn>span:nth-child(2) {width: 2px;height: 100%;background: -webkit-linear-gradient(top, transparent, #03e9f4);right: 0px;top: -100%;animation: line2 1s 0.25s linear infinite;}@keyframes line2 {50%,100% {top: 100%;}}.btn>span:nth-child(3) {width: 100%;height: 2px;background: -webkit-linear-gradient(left, #03e9f4, transparent);left: 100%;bottom: 0px;animation: line3 1s 0.75s linear infinite;}@keyframes line3 {50%,100% {left: -100%;}}.btn>span:nth-child(4) {width: 2px;height: 100%;background: -webkit-linear-gradient(top, transparent, #03e9f4);left: 0px;top: 100%;animation: line4 1s 1s linear infinite;}@keyframes line4 {50%,100% {top: -100%;}}</style>
</head><body><div class="loginBox"><h2>login</h2><form action=""><div class="item"><input type="text" required><label for="">userName</label></div><div class="item"><input type="password" required><label for="">password</label></div><button class="btn">submit<span></span><span></span><span></span><span></span></button></form></div>
</body>
</html>

然后我们在views下创建login.py文件:

login.py代码:

from django.core.exceptions import ValidationError
from django.shortcuts import render, redirectfrom project_one.utils import pwd_data
from project_one.utils.PageData import PageData
from django import formsfrom project_one import models# Create your views here.
class LoginForm(forms.Form):# 在登录界面里面, 只需要用户名和密码的输入框即可, 在attrs里面设置输入框的属性。username = forms.CharField(widget=forms.TextInput(attrs={"placeholder": "用户名", "autocomplete": "off"}))password = forms.CharField(widget=forms.PasswordInput(attrs={"placeholder": "密码", "autocomplete": "off", "type": "password"}))# 对密码进行校验, 在校验函数里面, 我们对密码进行加密处理def clean_password(self):password = self.cleaned_data['password']return pwd_data.md5(password)def login(request):if request.method == 'GET':form = LoginForm()return render(request, "login/login.html", {'form': form})form = LoginForm(request.POST)if form.is_valid():print(form.cleaned_data)admin_object = models.AdminRole.objects.filter(**form.cleaned_data).first()if not admin_object:form.add_error("password", "账号或密码错误")return render(request, "login/login.html", {'form': form})# 如果用户名和密码正确,即可登陆成功,将用户名和密码,身份信息存储在session当中request.session['info'] = {"id": admin_object.id, "username": admin_object.username, "password": admin_object.password, "role": admin_object.role}# 设置账号的时效期, 这里以秒为单位, 我们设置一个账号, 登录以后, 可以有一天时间使用, 时效期过去之后需要重新登录才可以继续使用网页request.session.set_expiry(60*60*24*1)# 登录成功过后, 会跳转到首页。return redirect('/')render(request, "login/login.html", {'form': form})

这里面我们不用之前的modelform而是直接用form, 我们这里只用到了表单, 但并没有用到数据库里面的字段, 不过我们在登录的时候, 判断账号密码是否正确的时候, 用到了admin_object = models.AdminRole.objects.filter(**form.cleaned_data).first()这样一句话。这一句话, 也用了AdminRole那张数据表。意思是说判断输入框里面的内容, 有没有出现在AdminRole数据库里面, 如果有, 并且账号和密码也都对的上号, 那就说明登录成功, 否则就是登录失败。成功和失败, 就是admin_object的布尔值来决定的, models.AdminRole.objects.filter(**form.cleaned_data).first()返回的是布尔值。这里面没有对AdminRole表格进行任何增删改之类的操作, 所以不用modelform而是用form。

配置路由:

urls.py:

"""project_simple URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views1. Add an import:  from my_app import views2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views1. Add an import:  from other_app.views import Home2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from project_one.views import depart, user, assets, admin_role, loginurlpatterns = [path("login/", login.login)
]

运行结果:

在这里插入图片描述

登录下看看:

我们可以看到成功登录:

在这里插入图片描述

登录过后, 跳转到了首页。

但是这里面还有个bug, 就比如人家记住了首页, 或者其它页面的路由, 把/login改为了/index, 然后跳过了登录界面直接到了首页, 那这样的话, 就相当于登录功能没有任何意义。

所以我们不允许别人这样操作, 一旦人家这么操作, 我们就再让界面重定向到登录界面, 这样的话, 人家就无法通过改变路由来切换页面了。

我们这时候就要用到中间件来解决该问题。

我们在app里面创建middleware文件夹, 在下面创建一个auth.py文件。

auth.py代码:

from django.shortcuts import render, redirect, HttpResponse
from django.utils.deprecation import MiddlewareMixin
from django.conf import settings# 自己写中间件, 需要导入包: from django.utils.deprecation import MiddlewareMixin
class AuthMiddleware(MiddlewareMixin):# 登录校验def process_request(self, request):# 避免打开login页面之后验证login页面, 不然就会产生死循环。# 这里需要忽略以下路由if request.path_info in ["/login/", "/logout/"]:returninfo_dict = request.session.get('info')if info_dict:request.unicom_id = info_dict['id']request.unicom_username = info_dict['username']request.unicom_role = info_dict['role']returnreturn redirect("/login/")

这里面的request.unicom_xxx = info_dict[‘xxx’]这样的写法, 就是获取之前在登录那边写的session里面的info信息里面的各个key的值, 我们分别获取id, username和role三个key的值, 之后我们会用到。

这里面的代码就是防止用户通过改变路由的方式来跳过密码登录的一个手段。

然后我们需要在settings.py里面配置中间件:

settings.py(中间件部分的配置代码):

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',# 我们自己写的中间件AuthMiddleware。'project_one.middleware.auth.AuthMiddleware'
]

找到MIDDLEWARE, 里面把我们自己写好的中间件添加进去。

此时此刻, 再打开网页去试一试, 进去之后, 如果有把路由login改为其它路由的操作的话, 网页会重定向到login界面, 那就不会出现刚才那种情况啦。

还有, 我们登录成功之后, 在网页的右上角有个人信息的展示, 那边的昵称必须是展示登录账号的那个昵称。

所以我们还需要修改前端的对应代码:

model_tmp.html:

<ul class="nav navbar-nav navbar-right"><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"aria-expanded="false">欢迎-->{{ request.session.info.username }}<span class="caret"></span></a><ul class="dropdown-menu"><li><a href="#">退出登录</a></li></ul></li>
</ul>

二、退出功能

这个其实很简单, 就是当用户点击退出登录的按钮之后, 我们需要做的就是让网页重定向到登录界面。

我们再login.py里面写重定向代码:

login.py:

def logout(request):# 退出登录的时候, 清除session。request.session.clear()return redirect("/login/")

这里不要忘记清除session, session是一个账户登录之后, 存储的账号相关信息, 在用户选择退出登录的时候, 必须清除。

路由配置:

urls.py:

"""project_simple URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views1. Add an import:  from my_app import views2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views1. Add an import:  from other_app.views import Home2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from project_one.views import depart, user, assets, admin_role, loginurlpatterns = [path("login/", login.login),path("logout/", login.logout)
]

最后我们在前端页面里面绑定退出登录功能的路由:

model_tmp.html

<ul class="nav navbar-nav navbar-right"><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"aria-expanded="false">Nathan<span class="caret"></span></a><ul class="dropdown-menu">{# 给退出登录加上对应的路由 #}<li><a href="/logout/">退出登录</a></li></ul></li>
</ul>

三、权限管理

在文章的一开始我们也说到, 不同的角色, 登录进去的页面和功能都不一样, 权限也不一样。

要实现这个功能, 也需要在中间件里面写相应的代码, 不过我们在写中间件的代码之前, 我们还需要做两步。

1.在每一个路由path的最后面, 都加上name属性:

urls.py

"""project_simple URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views1. Add an import:  from my_app import views2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views1. Add an import:  from other_app.views import Home2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from project_one.views import depart, user, assets, admin_role, loginurlpatterns = [# path('admin/', admin.site.urls),path("", depart.index, name="index"),path("depart/", depart.depart, name="depart"),path("depart/add/", depart.add_depart, name="add_depart"),path("depart/<int:nid>/modify/", depart.depart_modify, name="depart_modify"),path("depart/<int:nid>/del/", depart.del_depart, name="del_depart"),path("user/", user.user_info, name="user_info"),path("user/add/", user.user_add, name="user_add"),path("user/<int:nid>/modify/", user.user_modify, name="user_modify"),path("user/<int:nid>/del/", user.user_del, name="user_del"),path("user/add/modelform", user.user_add_modelform, name="user_add_modelform"),path("user/<int:nid>/modify/modelform", user.user_modify_modelform, name="user_modify_modelform"),path("assets_list/", assets.assets, name="assets"),path("assets/add/", assets.assets_add, name="assets_add"),path("assets/<int:nid>/modify/", assets.assets_modify, name="assets_modify"),path("assets/<int:nid>/del/", assets.assets_del, name="assets_del"),path("admin_list/", admin_role.admin, name="admin"),path("admin/add/", admin_role.admin_add, name="admin_add"),path("admin/<int:nid>/modify/", admin_role.admin_modify, name="admin_modify"),path("admin/<int:nid>/reset/pwd/", admin_role.admin_reset_pwd, name="admin_reset_pwd"),path("admin/<int:nid>/del/", admin_role.admin_del, name="admin_del"),path("login/", login.login, name="login"),path("logout/", login.logout, name="logout")
]
2.在settings.py设置文件里面, 加上权限列表:

settings.py:

UNICOM_PERMISSION = {1: ["add_depart", "depart_modify", "del_depart", "user_add", "user_modify", "user_del", "user_add_modelform","user_modify_modelform", "assets_add", "assets_modify", "assets_del", "admin_add", "admin_modify","admin_reset_pwd", "admin_del"],2: [],3: []
}

这里面的1代表员工(用户), 2代表领导, 3代表管理员。

在1对应的列表里面的所有路由, 都是被禁止访问以及使用的, 也就是说员工有以上列表里面的那些东西是不能够访问的。

然后才是写中间件代码:

auth.py代码:

from django.shortcuts import render, redirect, HttpResponse
from django.utils.deprecation import MiddlewareMixin
from django.conf import settings# 自己写中间件, 需要导入包: from django.utils.deprecation import MiddlewareMixin
class AuthMiddleware(MiddlewareMixin):# 登录校验def process_request(self, request):# 避免打开login页面之后验证login页面, 不然就会产生死循环。# 这里需要忽略以下路由if request.path_info in ["/login/", "/logout/"]:returninfo_dict = request.session.get('info')if info_dict:request.unicom_id = info_dict['id']request.unicom_username = info_dict['username']request.unicom_role = info_dict['role']returnreturn redirect("/login/")def process_view(self, request, view_func, args, kwargs):if request.path_info in ["/login/", "/logout/"]:returnrole = request.unicom_role# 这个就是我们刚才在配置文件settings.py里面配置的UNICOM_PERMISSION列表。# 写这个代码需要导入相应的包:from django.conf import settingsuser_permission_list = settings.UNICOM_PERMISSION[role]# 当前请求的路由name不在这个列表当中, 说明可以访问, 因为我们在settings.py配置文件里面写到, UNICOM_PERMISSION里面写的路由, 是被禁止访问的。这里需要用到request.resolver_match.url_name来代表用户访问网站时候的网址对应的路由。if request.resolver_match.url_name not in user_permission_list:returnreturn HttpResponse("没有权限")

这样, 我们就把权限管理的功能写好了, 我们只需要在前端进行判断当前登录的账号是员工还是管理员就可以了。

user_list.html:

{# 表头内容 #}
{% if request.unicom_role == 3 %}<th>操作</th>
{% endif %}
{# 表中的内容 #}
{% if request.unicom_role == 3 %}<td style="color: green"><a href="/user/{{ data.id }}/modify/modelform"><span style="color: green;" class="glyphicon glyphicon-pencil" aria-hidden="true"></span></a><a href="/user/{{ data.id }}/del/"><span style="color: red;" class="glyphicon glyphicon-trash" aria-hidden="true"></span></a></td>
{% endif %}

depart.html:

{# 表头内容 #}
{% if request.unicom_role == 3 %}<th>操作</th>
{% endif %}
{# 表中的内容 #}
{% if request.unicom_role == 3 %}<td style="color: green"><a href="/depart/{{ data.id }}/modify/"><span style="color: green;" class="glyphicon glyphicon-pencil" aria-hidden="true"></span></a><a href="/depart/{{ data.id }}/del/"><span style="color: red;" class="glyphicon glyphicon-trash" aria-hidden="true"></span></a></td>
{% endif %}

网页里面的if request.unicom_role == 3这行代码就是判断登录的账号是不是管理员账号, 如果是的话, 可以展现操作那一列的数据, 并且可以进行修改和删除, 否则就不行。

model_tmp.html:

{% if request.unicom_role == 1 %}<li class="active"><a href="/depart/">部门页面</a></li><li class="active"><a href="/user/">员工页面</a></li>
{% elif request.unicom_role == 3%}<li class="active"><a href="/depart/">部门页面</a></li><li class="active"><a href="/user/">员工页面</a></li><li class="active"><a href="/assets_list/">资产页面</a></li>
{% endif %}
中间还有很多代码, 略……………………
{% if request.unicom_role == 3 %}<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"aria-expanded="false">平台用户<span class="caret"></span></a>
{% endif %}

这里面的意思也很简单, 就是员工只能看到部门页面的信息和员工页面的信息, 而且只能够查看信息(只能查看信息的原因, 在上面的两个html里面已经写到了), 而管理员, 能够看到部门页面、员工页面、资产页面并且还有平台用户的信息也能够看到, 而且还能增加修改删除里面的所有数据。

运行结果:

我们先登录下员工(普通用户)的账号:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

进到部门或员工页面, 可以看到相应信息, 右边没有操作列。

点击添加信息按钮, 网页会提示没有权限。

意为着不能添加数据, 因为员工没有该权限。
在这里插入图片描述

我们再登录一下管理员的账号:

登录管理员账号Nathan:

在这里插入图片描述

登录过后:

在这里插入图片描述

点开任意一个页面, 比如员工页面:

在这里插入图片描述

最右边有操作列。

点击添加信息按钮:

在这里插入图片描述

可以添加信息。

点击任意一个修改按钮:

在这里插入图片描述
在这里插入图片描述

一样可以修改数据。

同理, 一样可以删除数据。

管理员, 拥有里面的所有权限,不仅所有的页面都可查看, 还可以对数据进行增加修改删除。

四、代码展示合集

登录功能代码:

login.py:

from django.core.exceptions import ValidationError
from django.shortcuts import render, redirectfrom project_one.utils import pwd_data
from project_one.utils.PageData import PageData
from django import formsfrom project_one import models# Create your views here.
class LoginForm(forms.Form):username = forms.CharField(widget=forms.TextInput(attrs={"placeholder": "用户名", "autocomplete": "off"}))password = forms.CharField(widget=forms.PasswordInput(attrs={"placeholder": "密码", "autocomplete": "off", "type": "password"}))# 对密码进行校验, 在校验函数里面, 我们对密码进行加密处理def clean_password(self):password = self.cleaned_data['password']return pwd_data.md5(password)def login(request):if request.method == 'GET':form = LoginForm()return render(request, "login/login.html", {'form': form})form = LoginForm(request.POST)if form.is_valid():print(form.cleaned_data)admin_object = models.AdminRole.objects.filter(**form.cleaned_data).first()if not admin_object:form.add_error("password", "账号或密码错误")return render(request, "login/login.html", {'form': form})# 如果用户名和密码正确,即可登陆成功,将用户名和密码,身份信息存储在session当中request.session['info'] = {"id": admin_object.id, "username": admin_object.username, "password": admin_object.password, "role": admin_object.role}# 设置账号的时效期, 这里以秒为单位, 我们设置一个账号, 登录以后, 可以有一天时间使用, 时效期过去之后需要重新登录才可以继续使用网页request.session.set_expiry(60*60*24*1)return redirect('/')render(request, "login/login.html", {'form': form})def logout(request):# 退出登录的时候, 清除session。request.session.clear()return redirect("/login/")

中间件代码:

auth.py:

from django.shortcuts import render, redirect, HttpResponse
from django.utils.deprecation import MiddlewareMixin
from django.conf import settingsclass AuthMiddleware(MiddlewareMixin):# 登录校验def process_request(self, request):# 避免打开login页面之后验证login页面, 不然就会产生死循环。# 这里需要忽略以下路由if request.path_info in ["/login/", "/logout/"]:returninfo_dict = request.session.get('info')if info_dict:request.unicom_id = info_dict['id']request.unicom_username = info_dict['username']request.unicom_role = info_dict['role']returnreturn redirect("/login/")def process_view(self, request, view_func, args, kwargs):if request.path_info in ["/login/", "/logout/"]:returnrole = request.unicom_roleuser_permission_list = settings.UNICOM_PERMISSION[role]# 当前请求的路由name不在这个列表当中if request.resolver_match.url_name not in user_permission_list:returnreturn HttpResponse("没有权限")

路由配置:

urls.py:

"""project_simple URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views1. Add an import:  from my_app import views2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views1. Add an import:  from other_app.views import Home2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from project_one.views import depart, user, assets, admin_role, loginurlpatterns = [# path('admin/', admin.site.urls),path("", depart.index, name="index"),path("depart/", depart.depart, name="depart"),path("depart/add/", depart.add_depart, name="add_depart"),path("depart/<int:nid>/modify/", depart.depart_modify, name="depart_modify"),path("depart/<int:nid>/del/", depart.del_depart, name="del_depart"),path("user/", user.user_info, name="user_info"),path("user/add/", user.user_add, name="user_add"),path("user/<int:nid>/modify/", user.user_modify, name="user_modify"),path("user/<int:nid>/del/", user.user_del, name="user_del"),path("user/add/modelform", user.user_add_modelform, name="user_add_modelform"),path("user/<int:nid>/modify/modelform", user.user_modify_modelform, name="user_modify_modelform"),path("assets_list/", assets.assets, name="assets"),path("assets/add/", assets.assets_add, name="assets_add"),path("assets/<int:nid>/modify/", assets.assets_modify, name="assets_modify"),path("assets/<int:nid>/del/", assets.assets_del, name="assets_del"),path("admin_list/", admin_role.admin, name="admin"),path("admin/add/", admin_role.admin_add, name="admin_add"),path("admin/<int:nid>/modify/", admin_role.admin_modify, name="admin_modify"),path("admin/<int:nid>/reset/pwd/", admin_role.admin_reset_pwd, name="admin_reset_pwd"),path("admin/<int:nid>/del/", admin_role.admin_del, name="admin_del"),path("login/", login.login, name="login"),path("logout/", login.logout, name="logout")
]

settings.py配置文件需要配置的地方:

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',# 添加自己写好的中间件。'project_one.middleware.auth.AuthMiddleware'
]# 在配置文件里面添加权限管理, 在列表里面的内容, 对应的角色(如员工)不能被访问。
UNICOM_PERMISSION = {1: ["add_depart", "depart_modify", "del_depart", "user_add", "user_modify", "user_del", "user_add_modelform","user_modify_modelform", "assets_add", "assets_modify", "assets_del", "admin_add", "admin_modify","admin_reset_pwd", "admin_del"],2: [],3: []
}

login.html文件:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>* {margin: 0;padding: 0;}a {text-decoration: none;}input,button {background: transparent;border: 0;outline: none;}body {height: 100vh;background: linear-gradient(#141e30, #243b55);display: flex;justify-content: center;align-items: center;font-size: 16px;color: #03e9f4;}.loginBox {width: 400px;height: 364px;background-color: #0c1622;margin: 100px auto;border-radius: 10px;box-shadow: 0 15px 25px 0 rgba(0, 0, 0, .6);padding: 40px;box-sizing: border-box;}h2 {text-align: center;color: aliceblue;margin-bottom: 30px;font-family: 'Courier New', Courier, monospace;}.item {height: 45px;border-bottom: 1px solid #fff;margin-bottom: 40px;position: relative;}.item input {width: 100%;height: 100%;color: #fff;padding-top: 20px;box-sizing: border-box;}.item input:focus+label,.item input:valid+label {top: 0px;font-size: 2px;}.item label {position: absolute;left: 0;top: 12px;transition: all 0.5s linear;}.btn {padding: 10px 20px;margin-top: 30px;color: #03e9f4;position: relative;overflow: hidden;text-transform: uppercase;letter-spacing: 2px;left: 35%;}.btn:hover {border-radius: 5px;color: #fff;background: #03e9f4;box-shadow: 0 0 5px 0 #03e9f4,0 0 25px 0 #03e9f4,0 0 50px 0 #03e9f4,0 0 100px 0 #03e9f4;transition: all 1s linear;}.btn>span {position: absolute;}.btn>span:nth-child(1) {width: 100%;height: 2px;background: -webkit-linear-gradient(to left, transparent, #03e9f4);left: -100%;top: 0px;animation: line1 1s linear infinite;}@keyframes line1 {50%,100% {left: 100%;}}.btn>span:nth-child(2) {width: 2px;height: 100%;background: -webkit-linear-gradient(to top, transparent, #03e9f4);right: 0px;top: -100%;animation: line2 1s 0.25s linear infinite;}@keyframes line2 {50%,100% {top: 100%;}}.btn>span:nth-child(3) {width: 100%;height: 2px;background: -webkit-linear-gradient(to left, #03e9f4, transparent);left: 100%;bottom: 0px;animation: line3 1s 0.75s linear infinite;}@keyframes line3 {50%,100% {left: -100%;}}.btn>span:nth-child(4) {width: 2px;height: 100%;background: -webkit-linear-gradient(to top, transparent, #03e9f4);left: 0px;top: 100%;animation: line4 1s 1s linear infinite;}@keyframes line4 {50%,100% {top: -100%;}}</style>
</head><body><div class="loginBox"><h2>登录界面</h2><form method="post">{% csrf_token %}<div class="item">{{ form.username }}</div><div class="item">{{ form.password }}<span style="color: red">{{ form.password.errors.0 }}</span></div><button class="btn">登录<span></span><span></span><span></span><span></span></button></form></div>
</body>
</html>

model_tmp.html:

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="{% static 'css/bootstrap.css' %}">{% block css %}{% endblock %}
</head>
<body>
<div class="navbar navbar-default"><div class="container"><!-- Brand and toggle get grouped for better mobile display --><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse"data-target="#bs-example-navbar-collapse-1" aria-expanded="false"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="#">管理系统</a></div><!-- Collect the nav links, forms, and other content for toggling --><div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"><ul class="nav navbar-nav">{% if request.unicom_role == 1 %}<li class="active"><a href="/depart/">部门页面</a></li><li class="active"><a href="/user/">员工页面</a></li>{% elif request.unicom_role == 3%}<li class="active"><a href="/depart/">部门页面</a></li><li class="active"><a href="/user/">员工页面</a></li><li class="active"><a href="/assets_list/">资产页面</a></li>{% endif %}
{#                <li class="active"><a href="/depart/">部门页面</a></li>#}
{#                <li class="active"><a href="/user/">员工页面</a></li>#}
{#                <li class="active"><a href="/assets_list/">资产页面</a></li>#}<li class="dropdown">{% if request.unicom_role == 3 %}<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"aria-expanded="false">平台用户<span class="caret"></span></a>{% endif %}<ul class="dropdown-menu"><li><a href="/admin_list/">登录账号</a></li></ul></li></ul><ul class="nav navbar-nav navbar-right"><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"aria-expanded="false">欢迎-->{{ request.session.info.username }}<span class="caret"></span></a><ul class="dropdown-menu"><li><a href="/logout/">退出登录</a></li></ul></li></ul></div><!-- /.navbar-collapse --></div><!-- /.container-fluid -->
</div>{% block content %}
{% endblock %}
<script src="{% static 'js/jquery3.7.1.js' %}"></script>
<script src="{% static 'js/bootstrap.js' %}"></script>
{% block js %}
{% endblock %}
</body>
</html>

user_list.html:

{% extends "index/model_tmp.html" %}{% block content %}<div class="container"><a href="/user/add/" class="btn btn-success">添加信息</a><a href="/user/add/modelform" class="btn btn-warning">添加信息</a><div class="panel panel-danger"><div class="panel-heading"><h3 class="panel-title">员工表</h3></div><div class="panel-body"><table class="table table-hover"><thead><tr><th>ID</th><th>姓名</th><th>性别</th><th>薪水</th><th>年龄</th><th>入职时间</th><th>部门</th>{% if request.unicom_role == 3 %}<th>操作</th>{% endif %}</tr></thead><tbody>{% for data in user_list %}<tr><th scope="row">{{ data.id }}</th><td>{{ data.name }}</td><td>{{ data.get_gender_display }}</td><td>{{ data.salary }}</td><td>{{ data.age }}</td><td>{{ data.create_time|date:"Y-m-d" }}</td><td>{{ data.department.title }}</td>{% if request.unicom_role == 3 %}<td style="color: green"><a href="/user/{{ data.id }}/modify/modelform"><span style="color: green;" class="glyphicon glyphicon-pencil" aria-hidden="true"></span></a><a href="/user/{{ data.id }}/del/"><span style="color: red;" class="glyphicon glyphicon-trash" aria-hidden="true"></span></a></td>{% endif %}</tr>{% endfor %}</tbody></table></div></div>{# 实现分页查询 #}<ul class="pagination">{{ page_string }}</ul></div>
{% endblock %}

depart.html:

{% extends "index/model_tmp.html" %}{% block content %}<div class="container"><a href="/depart/add/" class="btn btn-success">添加信息</a><div class="panel panel-danger"><div class="panel-heading"><h3 class="panel-title">部门表</h3></div><div class="panel-body"><table class="table table-hover"><thead><tr><th>ID</th><th>部门</th>{% if request.unicom_role == 3 %}<th>操作</th>{% endif %}</tr></thead><tbody>{% for data in data_list %}<tr><th scope="row">{{ data.id }}</th><td>{{ data.title }}</td>{% if request.unicom_role == 3 %}<td style="color: green"><a href="/depart/{{ data.id }}/modify/"><span style="color: green;" class="glyphicon glyphicon-pencil" aria-hidden="true"></span></a><a href="/depart/{{ data.id }}/del/"><span style="color: red;" class="glyphicon glyphicon-trash" aria-hidden="true"></span></a></td>{% endif %}</tr>{% endfor %}</tbody></table></div></div>{# 实现分页查询 #}<ul class="pagination">{{ page_string }}</ul></div>
{% endblock %}

好了, 这篇文章的内容就到此结束了!!!

以上就是Django的账号登录及权限管理的所有内容了, 如果有哪里不懂的地方,可以把问题打在评论区, 欢迎大家在评论区交流!!!
如果我有写错的地方, 望大家指正, 也可以联系我, 让我们一起努力, 继续不断的进步.
学习是个漫长的过程, 需要我们不断的去学习并掌握消化知识点, 有不懂或概念模糊不理解的情况下,一定要赶紧的解决问题, 否则问题只会越来越多, 漏洞也就越老越大.
人生路漫漫, 白鹭常相伴!!!

相关文章:

Django之账号登录及权限管理

账号登录及权限管理 目录 1.登录功能 2.退出登录 3.权限管理 4.代码展示合集 这篇文章, 会讲到如何实现账号登录。账号就是我们上一篇文章写的账号管理功能, 就使用那里面已经创建好的账号。这一次登录, 我们分为三种角色, 分别是员工, 领导, 管理员。不同的角色, 登录进去…...

深度学习Y7周:YOLOv8训练自己数据集

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、配置环境 1.官网下载源码 2.安装需要环境 二、准备好自己的数据 目录结构&#xff1a; 主目录 data images&#xff08;存放图片&#xff09; annotati…...

2025年渗透测试面试题总结-某服面试经验分享(附回答)(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 1. 协议类型 2. OSI七层模型 3. 网络层协议 4. HTTP请求头 5. 常见端口 6. 中间件解析漏洞 7. CS…...

手写Promise的静态方法

最近对promise原理的理解&#xff0c;手写下其中的静态方法。 手写Promise的静态方法 1. Promise.resolve2. Promise.reject3. Promise.all4. Promise.any5. Promise.race6. Promise.allSettled 1. Promise.resolve 首先就是resolve方法&#xff0c;它会接收一个值&#xff0…...

Python Cookbook-7.8 使用 Berkeley DB 数据库

任务 你想将一些数据做持久化处理&#xff0c;而且也想体验一下BerkeleyDB数据库的简洁和高效。 解决方案 如果以前在你的计算机中安装过 BerkeleyDB&#xff0c;Python标准库附带的bsddb包(以及可选的 bsddb3&#xff0c;用于访间Berkeley DBrelease 3.2数据库)可以被用来作…...

云手机虚拟地址技术的运营场景

云手机虚拟地址技术通过模拟地理位置&#xff08;GPS/IP地址&#xff09;与设备指纹&#xff0c;结合云端虚拟化能力&#xff0c;在多个商业场景中实现突破性应用。以下是其核心运营场景及技术实现路径的深度解析&#xff1a; 一、跨境电商与区域化运营 本地化合规与流量突破 目…...

操作符详解(2)

目录 9 结构成员访问操作符 9.1.2 结构体变量的定义和初始化 9.2 结构体成员的直接访问 10 操作符的属性&#xff1a;优先级、结合性 10.1 优先级 11 表达式求值 11.1 整型提升 11.2 算术转换 11.3 问题表达式解析 11.3.1 表达式1 11.3.2 表达式2 11.3.3 表达式3 1…...

责任链设计模式

一、核心接口定义 MyAbstractChainHandler<T> 接口继承自 Ordered 接口&#xff0c;用于实现链式处理逻辑。 import org.springframework.core.Ordered;public interface MyAbstractChainHandler<T> extends Ordered {void handle(T requestParam);String getCha…...

【银河麒麟高级服务器操作系统】服务器外挂存储ioerror分析及处理分享

更多银河麒麟操作系统产品及技术讨论&#xff0c;欢迎加入银河麒麟操作系统官方论坛 forum.kylinos.cn 了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;product.kylinos.cn 开发者专区&#xff1a;developer.kylinos.cn 文档中心&a…...

麒麟信安举办特种行业核心代理商中级技术认证培训班

近日&#xff0c;麒麟信安举办为期一周的特种行业核心代理商中级技术认证培训班&#xff0c;吸引了众多来自各地代理商公司的技术骨干踊跃参与。 此次培训班旨在赋能合作伙伴&#xff0c;助力其深入理解并熟练运用麒麟信安产品的核心优势&#xff0c;进一步提升在特种行业中的业…...

非对称加密:为什么RSA让“公开传密”成为可能

在1977年之前&#xff0c;加密世界遵循一个铁律&#xff1a;想要安全通信&#xff0c;必须先秘密交换密钥。无论是凯撒密码还是二战时的恩尼格玛机&#xff0c;都依赖发送方和接收方预先共享同一把“钥匙”。但RSA算法的出现颠覆了这一规则——它让陌生人可以在完全公开的环境下…...

阿里云ddos云防护服务器有哪些功能?ddos防御手段有哪些??

阿里云ddos云防护服务器有哪些功能?ddos防御手段有哪些&#xff1f;&#xff1f; DDoS&#xff08;分布式拒绝服务&#xff09;云防护服务器通过多种技术和策略来抵御大规模网络攻击&#xff0c;确保服务的高可用性。以下是其主要功能和防御手段的详细说明&#xff1a; 一、D…...

如何防止域名DNS被劫持?

防止域名DNS被劫持需要综合技术手段和管理措施&#xff0c;以下是一份详细的防护方案&#xff1a; --- ### **一、基础防护措施** 1. **选择可靠的域名注册商和DNS服务商** - 优先选择支持DNSSEC、提供多因素认证&#xff08;MFA&#xff09;的知名服务商&#xff08;如Cl…...

桥隧坡灾害监测报警:用科技筑起生命安全的“智能防线”

.2024年&#xff0c;梅大高速茶阳路段高边坡塌方事件造成重大伤亡&#xff0c;举国痛心。这场悲剧再次敲响警钟&#xff1a;桥梁、隧道、边坡等高风险区域的实时监测与精准报警&#xff0c;已成为交通安全的生命线。如何用技术手段在灾害发生前“抢跑”&#xff0c;第一时间阻断…...

K8S常见问题汇总

一、 驱逐 master 节点上的所有 Pod 这会“清空”一个节点&#xff08;包括 master&#xff09;上的所有可驱逐的 Pod&#xff1a; kubectl drain <master-node-name> --ignore-daemonsets --delete-emptydir-data--ignore-daemonsets&#xff1a;保留 DaemonSet 类型的…...

ideal创建Springboot项目(Maven,yml)

以下是使用 IntelliJ IDEA 创建基于 Maven 的 Spring Boot 项目并使用 YAML 配置文件的详细步骤&#xff1a; 一、创建 Spring Boot 项目 启动项目创建向导 打开 IntelliJ IDEA&#xff0c;点击“File”->“New”->“Project”。 在弹出的“New Project”窗口中&#…...

解决:‘java‘ 不是内部或外部命令,也不是可运行的程序-Java环境变量配置(含JDK8、JDK21安装包一站式配置)

在使用命令行运行 .jar 文件时&#xff0c;很多用户会遇到如下错误提示&#xff1a; java 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 这个报错表明系统无法识别 java 命令&#xff0c;通常是由于 Java 没有正确安装&#xff0c;或是系统环境变量没有配…...

android.app.Fragment和androidx.fragment:fragment的区别

android.app.Fragment 与 androidx.fragment.app.Fragment 的区别 这两个 Fragment 实现代表了 Android 碎片化开发的两个时代&#xff0c;以下是它们的核心区别&#xff1a; 一、起源与演变 android.app.Fragmentandroidx.fragment.app.Fragment引入时间Android 3.0 (API 1…...

OrangePi Zero 3学习笔记(Android篇)3 - 串口

目录 1. 找到串口号 2. 修改串口权限 3. 串口类 3.1 serialport.hpp 3.2 serialport.cpp 3.2.1 构造函数 3.2.2 Open函数 3.2.3 Close函数 3.2.4 Write函数 3.2.5 Read函数 3.2.6 SetFlowCtrl函数 4. 测试程序 5. 编译 6. 运行验证 除了默认的UART用于shell&…...

Node.js 技术原理分析系列9——Node.js addon一文通

Node.js 是一个开源的、跨平台的JavaScript运行时环境&#xff0c;它允许开发者在服务器端运行JavaScript代码。Node.js 是基于Chrome V8引擎构建的&#xff0c;专为高性能、高并发的网络应用而设计&#xff0c;广泛应用于构建服务器端应用程序、网络应用、命令行工具等。 本系…...

HBuilderX安卓真机运行安装失败解决汇总

前置方案 1. 确认USB调试和连接模式 &#xff08;1&#xff09;开启USB调试&#xff1a;进入手机设置 > 开发者选项 > 确保USB调试已开启&#xff08;如无开发者选项&#xff0c;连续点击“版本号”激活&#xff09;。 &#xff08;2&#xff09;连接模式&#xff1a;将…...

TensorFlow 2.x入门实战:从零基础到图像分类项目

TensorFlow 2.x入门实战&#xff1a;从零基础到图像分类项目 前言 TensorFlow是Google开发的开源机器学习框架&#xff0c;已成为深度学习领域的重要工具。TensorFlow 2.x版本相比1.x有了重大改进&#xff0c;更加易用且功能强大。本文将带你从零开始学习TensorFlow 2.x&…...

SpringBoot+Dubbo+Zookeeper实现分布式系统步骤

SpringBootDubboZookeeper实现分布式系统 一、分布式系统通俗解释二、环境准备&#xff08;详细版&#xff09;1. 软件版本2. 安装Zookeeper&#xff08;单机模式&#xff09; 三、完整项目结构&#xff08;带详细注释&#xff09;四、手把手代码实现步骤1&#xff1a;创建父工…...

数据中台-常用工具组件:DataX、Flink、Dolphin Scheduler、TensorFlow和PyTorch等

数据实施服务工具组件概览 数据中台的数据实施服务涵盖 数据采集、处理、调度、分析与应用 全流程&#xff0c;以下为关键工具组件及其作用&#xff1a; 工具类型核心功能典型应用场景DataX离线数据采集多源异构数据批量同步数据仓库ODS层数据导入Apache Flink实时计算引擎流…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】电商数据分析案例-9.2 流量转化漏斗分析

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 9.2 流量转化漏斗分析&#xff1a;从数据清洗到可视化全流程实战一、背景与目标二、数据准备与清洗2.1 数据来源与字段说明2.2 数据清洗步骤2.2.1 去除无效数据2.2.2 处理时…...

结合Splash与Scrapy:高效爬取动态JavaScript网站

在当今的Web开发中&#xff0c;JavaScript的广泛应用使得许多网站的内容无法通过传统的请求-响应模式直接获取。为了解决这个问题&#xff0c;Scrapy开发者经常需要集成像Splash这样的JavaScript渲染引擎。本文将详细介绍Splash JS引擎的工作原理&#xff0c;并探讨如何将其与S…...

[计算机科学#10]:早期的计算机编程方式

【核知坊】&#xff1a;释放青春想象&#xff0c;码动全新视野。 我们希望使用精简的信息传达知识的骨架&#xff0c;启发创造者开启创造之路&#xff01;&#xff01;&#xff01; 内容摘要&#xff1a;1804年&#xff0c;为了在织布机上编织出丰富多彩的…...

JAVA:Spring Boot 集成 Lua 的技术博客

1、简述 在现代开发中,Lua 以其轻量级、高性能以及易嵌入的特点广泛用于脚本扩展、游戏开发以及配置处理场景。将 Lua 与 Spring Boot 集成,可以在 Java 项目中实现动态脚本功能,增强项目的灵活性和动态配置能力。 样例代码: https://gitee.com/lhdxhl/springboot-example…...

代码随想录算法训练营 Day40 动态规划Ⅷ 股票问题

动态规划 题目 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; 使用二维 dp 数组表示 1. dp[i][0] 表示持有股票的最大金额&#xff0c;dp[i][1] 表示不持有股票的最大金额&#xff0c;表示盈利结果 2. 递推公式由前一天持有金额和是否买股票决定 决定是否…...

【已解决】WORD域相关问题;错误 未找到引用源;复制域出错;交叉引用域到底是个啥

&#xff08;微软赶紧倒闭 所有交叉引用域&#xff0c;有两个状态&#xff1a;1.锁定。2.手动。可通过编辑->链接查看。 “锁定”状态域的能力&#xff1a; 1. 导出PDF格式稳定&#xff08;【已解决】WORD导出PDF时&#xff0c;参考文献上标自动被取消/变为正常文本_word…...

小米 MiMo 开源:7B 参数凭什么 “叫板” AI行业巨头?

目录 一、技术革命的起点&#xff1a;小米AI战略的“破局者” 1.1 战略背景&#xff1a;从硬件厂商到AI基础设施提供商 1.2 团队揭秘&#xff1a;“天才少女”罗福莉与小米AI梦之队 二、技术架构解析&#xff1a;7B参数如何实现“推理跃迁” 2.1 核心技术原理 2.2 技术指…...

构建高可用性的LVS-DR群集:实现无缝的负载均衡与故障转移

目录 一、LVS-DR集群 1.LVS-DR工作原理 2.数据包流向分析 3.LVS-DR模式特点 二、直接路由模式&#xff08;LVS-DR&#xff09; 1.资源清单 2.配置负载调度器(lvs) 3.配置节点服务器(web1、web2) 4.测试LVS群集 5.使用NFS发布共享资源&#xff08;nfs上&#xff09; …...

低光图像增强新色彩空间HVI:技术突破与创新解析(HVI: ANewColor Space for Low-light Image Enhancement)

摘要 低光图像增强&#xff08;LLIE&#xff09;是计算机视觉领域的关键任务&#xff0c;旨在从受损的低光图像中恢复细节信息。针对现有方法在标准RGB&#xff08;sRGB&#xff09;空间易产生色偏与亮度伪影的问题&#xff0c;以及HSV色彩空间转换引发的红/黑噪声问题&#xf…...

Abaqus学习笔记

目录 Abaqus介绍 学习资源 ​编辑Abaqus/CAE abaqus下载安装 abaqus基本操作 Abaqus启动 新建模型 ​编辑 ​编辑修改界面背景 ​编辑​编辑结果信息的显示与否 ​编辑计算结果信息字体设置 ​编辑允许多绘图状态 单位量纲 视图操作 事前说明 ODB文件 本构关系…...

AquaCrop 模型新视角:多技术助力农业精准水管理

技术点目录 模型原理介绍与数据要求及模型分析数据制备、模型运行与案例实践&#xff08;界面GUI版本&#xff09;模型优化与敏感性分析&#xff08;基于R语言实践&#xff09;源代码分析&#xff08;基于FORTRAN&#xff09;未来气候变化影响分析与案例实践&#xff08;基于Py…...

从知识图谱到精准决策:基于MCP的招投标货物比对溯源系统实践

前言 从最初对人工智能的懵懂认知,到逐渐踏入Prompt工程的世界,我们一路探索,从私有化部署的实际场景,到对DeepSeek技术的全面解读,再逐步深入到NL2SQL、知识图谱构建、RAG知识库设计,以及ChatBI这些高阶应用。一路走来,我们在AI的领域里一步一个脚印,不断拓展视野和能…...

【平面波导外腔激光器专题系列】1064nm单纵模平面波导外腔激光器‌

摘要&#xff1a;我们介绍了平面波导外腔二极管激光器 (PW-ECL) 的特性。据我们所知&#xff0c;这是第一款蝶形封装的 1064nm半导体激光器&#xff0c;其可以稳定锁定到外部参考频率。我们从精密实验的角度评估了它的性能&#xff0c;特别是使用碘的超精细吸收线&#xff0c;在…...

C++ 算法学习之旅:从入门到精通的秘籍

在编程的浩瀚宇宙中&#xff0c;C 算法宛如璀璨的星辰&#xff0c;照亮我们前行的道路。作为一名 C 算法小白&#xff0c;或许你和我一样&#xff0c;怀揣着对算法的好奇与憧憬&#xff0c;却又在学习的道路上感到迷茫。别担心&#xff0c;今天我就和大家分享一下如何学习各种基…...

按摩椅上的气囊系统 是现代按摩椅中非常关键的组成部分,它与机芯系统相辅相成,为用户提供全方位、更接近真人按摩的体验

按摩椅上的气囊系统是现代按摩椅中非常关键的组成部分&#xff0c;它与机芯系统相辅相成&#xff0c;为用户提供全方位、更接近真人按摩的体验。 一、按摩椅气囊的产生背景 1. 传统按摩方式的局限 早期的按摩椅主要依赖机械式的“凸轮电机”或简单的机芯滚轮结构&#xff0c;…...

配置Hadoop集群环境-使用脚本命令实现集群文件同步

&#xff08;一&#xff09;Hadoop的运行模式 hadoop一共有如下三种运行方式&#xff1a; 1. 本地运行。数据存储在linux本地&#xff0c;测试偶尔用一下。我们上一节课使用的就是本地运行模式hadoop100。 2. 伪分布式。在一台机器上模拟出 Hadoop 分布式系统的各个组件&…...

Linux系统(OpenEuler22.03-LTS)部署FastGPT

在 openEuler 22.03 LTS 系统上通过 Docker Compose 安装 FastGPT 的步骤如下&#xff1a; 官方参考文档&#xff1a;https://doc.fastgpt.cn/docs/development/docker/ 1. 安装 Docker 和 Docker Compose 可以参考我之前离线安装Docker的文章&#xff1a;openEuler 22.03 LT…...

FastExcel 本地开发和Linux上上传Resource文件的差异性

不能直接通过路径来获取 这个是一个下载导出文件的操作 GetMapping(value "/export/all") public void exportAll(HttpServletResponse response, LaylineListReq req) throws IOException {// 从类路径下获取 Excel 文件资源ClassPathResource classPathResource…...

Excel学习笔记

在excel表格中&#xff0c;某列的数据最大&#xff0c;则整行都红色底色标出&#xff0c;怎么实现&#xff1f; 更改x值&#xff0c;excel图表上动态显示 该值的Y值且动态显示十字交叉线 为了实现如下图所示的效果&#xff0c;需要做出几个辅助列就行。 step1&#xff1a;先写…...

数据中台-数仓分层结构【Doris】

数据仓库采用Doris进行搭建&#xff0c;并分为ODS/DWD/DWM/DWS/ADS等层级结构进行分层数据存储。Doris是百度开源的MPP数据库&#xff0c;可有效支撑大数据量的数据计算和分布式扩展存储。 数据仓库分层架构设计目标 解耦与复用性&#xff1a;通过分层隔离原始数据与业务逻辑&a…...

使用Jmeter对AI模型服务进行压力测试

一、JMeter介绍 Apache JMeter 是一款开源的性能测试工具&#xff0c;主要用于评估Web应用程序的负载和性能。它支持多种类型的测试&#xff0c;包括但不限于&#xff1a; 负载测试&#xff1a;模拟大量用户访问系统以检测其在高负载下的表现。性能测试&#xff1a;评估系统在…...

测试用例管理平台哪些好用?9款主流测试平台对比

在当今软件开发领域&#xff0c;测试用例管理平台已成为提升产品质量和团队协同效率的关键工具。本文将围绕“测试用例管理平台”这一核心关键词&#xff0c;全面解析市面上9款主流产品&#xff0c;帮助企业管理者和测试团队快速了解各平台的核心优势和适用场景&#xff0c;从而…...

C++函数传值与传引用对比分析

在C编程中&#xff0c;函数参数传递的方式直接影响程序的性能、内存管理以及代码逻辑的正确性。传值&#xff08;Pass by Value&#xff09;和传引用&#xff08;Pass by Reference&#xff09;是两种最常用的参数传递方式&#xff0c;它们各有优缺点&#xff0c;适用于不同的场…...

【se-res模块学习】结合CIFAR-10分类任务学习

继CIFAR-10图像分类&#xff1a;【Res残差连接学习】结合CIFAR-10任务学习-CSDN博客 再优化 本次训练结果在测试集上的准确率表现可达到90%以上 1.训练模型&#xff08;MyModel.py&#xff09; import torch import torch.nn as nnclass SENet(nn.Module): # SE-Net模块def…...

二元随机响应(Binary Randomized Response, RR)的翻转概率

随机响应&#xff08;Randomized Response&#xff09;机制 ✅ 回答核心&#xff1a; p 1 1 e ε 才是「翻转概率」 \boxed{p \frac{1}{1 e^{\varepsilon}}} \quad \text{才是「翻转概率」} p1eε1​​才是「翻转概率」 而&#xff1a; q e ε 1 e ε 是「保留真实值」…...

湖北理元理律师事务所:债务优化中的“生活保障”方法论

债务危机往往伴随生活质量骤降&#xff0c;如何在还款与生存间找到平衡点&#xff0c;成为债务优化的核心挑战。湖北理元理律师事务所基于多年实务经验&#xff0c;提出“双轨并行”策略&#xff1a;法律减负与生活保障同步推进。 债务优化的“温度法则” 1.生存资金预留机制…...