Django入门教程——用户管理实现

第六章 用户管理实现

教学目的

  • 复习数据的增删改查的实现。
  • 了解数据MD5加密算法以及实现
  • 模型表单中,自定义控件的使用
  • 中间件的原理和使用

需求分析

系统问题

  • 员工档案涉及到员工的秘密,不能让任何人都可以看到,主要是人事部门进行数据的维护,公司领导具有数据的查看权限。
  • 现在我们开发出来的功能,所有人都可以进行访问,都可以进行数据的修改,不符合需求。

系统功能

  • 管理员用户可以进行用户管理,实现用户的添加、修改、删除等
  • 普通用户可以登录系统,修改个人密码等

用户管理相关数据模型

数据模型设计

在这里插入图片描述

添加用户管理相关数据模型

  1. 添加新的应用python manage.py startapp userinfo

  2. 注册新的应用

    INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','archives','userinfo',
    ]
    
  3. 创建数据模型

    # 用户信息
    class User(models.Model):username = models.CharField(verbose_name='用户账号', max_length=30)password = models.CharField(verbose_name='用户密码', max_length=40)employee = models.ForeignKey(to="archives.Employee", on_delete=models.CASCADE, verbose_name='员工ID', null=True)avatarUrl = models.CharField(verbose_name="头像", max_length=250, null=True, blank=True)role = models.ForeignKey(to="Role", to_field="id", on_delete=models.SET_NULL, verbose_name='角色', null=True)last_login = models.DateTimeField(verbose_name='最后登录时间', auto_now=True)create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)class Meta:db_table = 'sys_user'# 角色
    class Role(models.Model):name = models.CharField(verbose_name='角色名称', max_length=50)remark = models.CharField(verbose_name='备注', max_length=255, null=True, blank=True, )class Meta:db_table = 'sys_role'def __str__(self):return self.name
    
  4. 执行命令创建数据表

    python manage.py makemigrations          
    python manage.py migrate
    

用户的增删改查

  1. 用户列表页面user_list.html

    {%extends 'common/base_list.html'%}
    {% block templet %}
    <!-- 顶部工具栏模板 -->
    <script type="text/html" id="toolbar"><div class="layui-btn-container"><button class="layui-btn  layui-btn-sm" lay-event="add"><i class="layui-icon layui-icon-addition"></i>新增</button></div>
    </script>
    <!-- 表格操作模板 -->
    <script type="text/html" id="TableBar"><div class="layui-clear-space"><a class="layui-btn layui-btn-xs " lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a><a class="layui-btn layui-btn-xs layui-bg-red" lay-event="delete"><i class="layui-icon layui-icon-delete"></i>删除</a></div>
    </script>
    {%endblock%}
    {% block js %}
    <script>
    layui.use(function(){var $ = layui.jquery,form = layui.form,table = layui.table,layer = layui.layer;// 渲染表格table.render({elem: '#TableId',url: '/user/list/',method:'post',toolbar: '#toolbar',defaultToolbar: ['filter', 'exports', 'print'],cols: [[{type: "checkbox", width: 50},{field: 'index', width: 80, title: '序号',align:'center', sort: true},{field: 'id', width: 80, title: 'ID',align:'center', sort: true,hide:true},{field: 'username', width: 150, title: '用户名',align:'center',sort: true},{field: 'employee', width: 150, title: '姓名',align:'center',sort: true},{field: 'role', width: 150, title: '角色',align:'center',sort: true},{field: 'last_login', width: 150, title: '最近登录',align:'center',sort: true},{title: '操作', minWidth: 240, toolbar: '#TableBar', align: "center", fixed: 'right' }]],limits: [10, 20, 50,100,200,500],limit: 10,page: true,skin: 'row',even: true,});// 头部工具栏事件table.on('toolbar(TableFilter)', function (obj) {if (obj.event === 'add') {layer.open({title: ['新增', 'font-size:18px;font-weight:bold;'],type: 2,shade: 0.3,maxmin:true,shadeClose: true,area: ['60%', '600px'],content: '/user/add/',});}});
    });
    </script>
    {%endblock%}
    
  2. 建立视图函数

    # 用户列表
    @csrf_exempt
    def user_list(request):if request.method == "GET":return render(request,"userinfo/user_list.html")page = request.POST.get('page', 1)limit = request.POST.get('limit', 10)searchParams = request.POST.get('searchParams', None)data_obj = User.objects.all()data_page = Paginator(data_obj, limit).page(page)data_list=[]count = (int(page) - 1) * int(limit)for row in data_page:count += 1item_dict = {}field_names = [field.name for field in row._meta.fields]for field in field_names:if field == "employee":item_dict[field] = row.employee.nameelif field == "role":item_dict[field] = row.role.nameelse:item_dict[field] = getattr(row,field)item_dict["index"]=countdata_list.append(item_dict)return res_json_data.table_api(data=data_list,count=len(data_obj))
    
  3. 建立url路由

    from userinfo import views as user_views
    path("user/list/",user_views.user_list),
    
  4. 建立用户编辑表单类

    class edit_form(forms.ModelForm):class Meta:model = models.Userfields = ['username','role','employee']widgets = {"employee":forms.Select(attrs={"lay-search":""}),}def __init__(self,*args,**kwargs):super().__init__(*args,**kwargs)for name,field in self.fields.items():field.widget.attrs.update({"class":"layui-input","placeholder":"输入"+field.label})
    
  5. 建立添加视图函数

    #settings.py
    DEFAULT_PASSWORD = '123'  # 设置默认密码
    
    from django.conf import settings
    # 用户添加
    def user_add(request):if request.method == "GET":form = user_form.edit_form()return render(request,"userinfo/user_edit.html",{"form":form})form = user_form.edit_form(data=request.POST)if form.is_valid():form.instance.password = settings.DEFAULT_PASSWORDform.save()messages.success(request, '添加成功')return render(request,"userinfo/user_edit.html",{"form":form})print(form.errors)return render(request,"userinfo/user_edit.html",{"form":form})
    
  6. 验证用户名不能重复

    def clean_username(self):username = self.cleaned_data.get("username")user = models.User.objects.filter(username=username).first()if user:raise forms.ValidationError("用户名已存在")return username
    
  7. 控制员工选择框只能选择没有创建用户的人员

    def __init__(self,*args,**kwargs):super().__init__(*args,**kwargs)user_obj = models.User.objects.all()user_id_list = [obj.employee_id for obj in user_obj]self.fields['employee'].queryset = Employee.objects.exclude(id__in=user_id_list)for name,field in self.fields.items():field.widget.attrs.update({"class":"layui-input","placeholder":"输入"+field.label})
    

对数据库中的密码进行加密

MD5简介

MD5加密算法是一种单向加密算法,是不可逆的一种的加密方式。MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

加密实现

  1. 建立encryption.py文件

  2. 建立md5加密算法函数

    import hashlib
    from django.conf import settings
    def MD5(str):obj = hashlib.md5(settings.SECRET_KEY.encode('utf-8'))obj.update(str.encode('utf-8'))return obj.hexdigest()
    
  3. 修改视图函数

    form.instance.password = MD5(settings.DEFAULT_PASSWORD)
    

实现密码重置

  1. 表格行操作模板

    <!-- 表格操作模板 -->
    <script type="text/html" id="TableBar"><div class="layui-clear-space"><a class="layui-btn layui-btn-xs " lay-event="reset"><i class="layui-icon layui-icon-edit"></i>重置密码</a><a class="layui-btn layui-btn-xs layui-bg-red" lay-event="delete"><i class="layui-icon layui-icon-delete"></i>删除</a></div>
    </script>
    
  2. 建立重置密码视图函数

    # 重置密码
    @csrf_exempt
    def reset_password(request):id = request.POST.get("id") #用户idpassword = MD5(settings.DEFAULT_PASSWORD)User.objects.filter(id=id).update(password=password)return res_json_data.success_api()
    
  3. 通过ajax实现密码重置

    // 单元格事件
    table.on('tool(TableFilter)', function (obj) {var data = obj.data; //获得当前行数据if (obj.event === 'reset') {layer.confirm('确认重置为默认密码吗?', {btn: ['确定', '取消'] //按钮}, function(index){$.post('/user/reset/', {"id":data.id},function(data){if (data.success) {layer.msg(data.msg);}})});}
    });
    

    jQuery get() 和 post() 方法用于通过 HTTP GET 或 POST 请求从服务器请求数据。

    语法:$.get( URL [, data ] [, callback ] [, dataType ] )

    • URL:发送请求的 URL字符串。
    • data:可选的,发送给服务器的字符串或 key/value 键值对(字典)。
    • callback:可选的,请求成功后执行的回调函数。
    • dataType:可选的,从服务器返回的数据类型。默认:智能猜测(可以是xml, json, script, 或 html)。

用户登录的实现

界面原型

在这里插入图片描述

代码实现

  1. 用户登录路由path("",user_views.user_login)

  2. 登录视图函数

    # 用户登录
    def user_login(request):if request.method == "GET":form = user_form.login_form()return render(request,"userinfo/login.html",{"form":form})
    
  3. 用户登录页面模板

    {% load static %}
    <!DOCTYPE html>
    <html>
    <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>员工信息管理系统</title><link href="{%static 'layui/css/layui.css'%}" rel="stylesheet"><style>body {background:url("{% static 'loginbg.png'%}") 0% 0% / cover no-repeat;font-size:12px;}.main-body {top:50%;left:50%;position:absolute;transform:translate(-50%,-50%);overflow:hidden;width: 428px;background-color: #fff;border-radius:12px;}.login-top {height:117px;background-color:#148be4;border-radius:12px 12px 0 0;font-size:30px;font-weight:400;font-stretch:normal;color:#fff;line-height:117px;text-align:center;overflow:hidden;}.login-top .bg1 {display:inline-block;width:74px;height:74px;opacity:.1;border-radius:0 74px 0 0;position:absolute;left:0;top:43px;background-color: #fff;}.login-top .bg2 {display:inline-block;width:94px;height:94px;opacity:.1;border-radius:50%;position:absolute;right:-16px;top:-16px;background-color: #fff;}.center {width:288px;margin:0 auto;padding-top:40px;padding-bottom:15px;position:relative;}.login-btn {width:288px;height:40px;background-color:#1E9FFF;border-radius:16px;margin:24px auto 0;text-align:center;line-height:40px;color:#fff;font-size:14px;letter-spacing:0;cursor:pointer;border:none;}.center {width:288px;margin:0 auto;padding-top:40px;padding-bottom:15px;position:relative;}</style>
    </head>
    <body><div class="main-body"><div class="login-top"><span>员工信息管理系统</span><span class="bg1"></span><span class="bg2"></span></div></div><script src="{%static 'layui/layui.js'%}"></script>
    <script>
    layui.use(function(){var $ = layui.jquery;var layer = layui.layer;{% for msg in messages %}layer.alert('{{ msg}}');{% endfor %}
    });     
    </script>
    </body>
    </html>
    

    绝对定位布局(position)

    1. 定位方式属性
      • static 默认,元素在文档常规流中当前的布局位置
      • relative :不会脱离文档流,不会浮起来,一般为里面的absolute 元素提供定位依据
      • absolute 元素会被移出正常文档流,相对于上一个绝对定位的父元素来进行定位
      • fixed 元素会被移出正常文档流,相对于屏幕视口(viewport)的位置来指定元素位置
    2. absolute相对定位详解
      • 父元素没有设置相对定位或绝对定位的情况下,元素相对于根元素定位(即html元素)
      • 父元素设置了相对定位或绝对定位,元素会相对于离自己最近的设置了相对或绝对定位的父元素进行定位
    3. 定位属性
      • top样式属性定义了定位元素的上外边距边界与其包含块上边界之间的偏移
      • bottom 定位元素下外边距边界与其包含块下边界之间的偏移
      • left 定位元素的上外边距边界与其包含块上边界之间的偏移
      • right 定位元素的右外边距边界与其包含块右边界之间的偏移
      • transform: translate(12px, 50%); 水平平移,第一个参数对应X轴,第二个参数对应Y轴。如果第二个参数未提供,则默认值为0,注意参数用逗号分隔
  4. 用户登录表单类

    # 登录表单类
    class login_form(forms.ModelForm):class Meta:model =models.Userfields = ['username','password']widgets ={'password':forms.PasswordInput(attrs={"lay-affix":"eye"},render_value=True),}def clean_password(self):password = self.cleaned_data.get("password")return MD5(password)def __init__(self,*args,**kwargs):super().__init__(*args,**kwargs)for name,field in self.fields.items():field.widget.attrs.update({"class":"layui-input","placeholder":"输入"+field.label})
    
    • render_value=True ——保持上次输入的值
  5. 修改视图函数,进行用户登录验证

    # 用户登录
    def user_login(request):if request.method == "GET":form = user_form.login_form()return render(request,"userinfo/login.html",{"form":form})form = user_form.login_form(data=request.POST)if form.is_valid():print(form.cleaned_data,"===校验完成") #打印form提交的所有数据user_obj = User.objects.filter(**form.cleaned_data).first()if not user_obj:messages.warning(request, '用户名或密码错误')return render(request,"userinfo/login.html",{"form":form})# 登录成功return redirect("/employee/list/")print(form.errors)return render(request,"userinfo/login.html",{"form":form})
    

是否登录检验

会话Session

  1. 简介

    Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。

  2. 操作语法

    • 设置session,通过request.session字典

      request.session['user_info'] = {'id':user_obj.id,'user_id':user_obj.id_number,'user_name':user_obj.user_name,'role_id':user_obj.role_id,
      }
      
    • session有效期设置

      request.session.set_expiry(value)

      • 如果value是个整数,session会在设置秒数后失效。
      • 如果value是个datatimetimedelta,session就会在这个时间后失效。
      • 如果value是0,用户关闭浏览器session就会失效。//我们用的就是这种方式
      • 如果value是None,session会依赖全局session失效策略。
    • 获取session值

      后端:user_info = request.session.get('user_info')

      前端:request.session.user_info.name

修改代码实现访问授权

  1. 通过session记录登录用户信息

    # 登录成功
    request.session["user_info"] = {"id":user_obj.id,"username":user_obj.username,"name":user_obj.employee.name,
    }
    request.session.set_expiry(0)
    return redirect("/employee/list/")
    
  2. 用户登录状态验证

    user_info = request.session.get("user_info")
    print(user_info,"==用户信息")
    if not user_info:return redirect("/")
    

中间件

中间件在Django中是一种轻量级、底层的“插件”系统,用于全局地处理请求和响应。它位于Django的请求和响应处理过程之间,可以对HTTP请求和响应进行预处理和后处理,从而实现诸如权限控制、日志记录、数据压缩、缓存等功能。

中间件的请求流程:

在这里插入图片描述

用中间件进行登录验证拦截

  1. 建立auth.py文件,创建中间件类

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import redirect
    from datetime import datetime
    class AuthMiddleware(MiddlewareMixin):def process_request(self, request):print("===访问地址:",request.path,datetime.now())user_info = request.session.get('user_info')print(user_info,"==登陆用户信息")if  user_info:returnreturn redirect("/")
    
  2. 在setting中注册中间件

    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','userinfo.auth.AuthMiddleware',
    ]
    
    • 第9行:注册中间件
  3. 处理302错误,重定向错误

    class AuthMiddleware(MiddlewareMixin):def process_request(self, request):print("===访问地址:",request.path,datetime.now())pass_urls = ['/']if request.path  in pass_urls:returnuser_info = request.session.get('user_info')print(user_info,"==登陆用户信息")if  user_info:returnreturn redirect("/")
    
    • return 没有返回值,将进行放行,否则将进行拦截

注销和密码修改

注销操作

  1. 修改公共模板页面添加用户信息和菜单。

    <li class="layui-nav-item" style="float: right;"><a href="javascript:void(0);"><img src="https://unpkg.com/outeres@0.0.10/demo/avatar/1.jpg" class="layui-nav-img">{{request.session.user_info.name}}</a><dl class="layui-nav-child"><dd><a href="">修改密码</a></dd><dd><a href="/user/logout/">退出</a></dd></dl>
    </li>
    
  2. 添加注销视图函数

    # 用户退出
    def user_logout(request):request.session.clear()return redirect("/")
    

密码修改

  1. 创建单行编辑模版页面single_edit_dlg.html

    {%extends 'common/layout_dlg.html'%}
    {% block css %}
    <style>.layui-input-block{margin-left: 150px; }.layui-form-label{width: 120px;}
    </style>
    {%endblock%}
    {%block content%}
    <div class="layui-card-body"><form class="layui-form"  method="post" novalidate>{% csrf_token %}{% for field in form %}<div class="layui-form-item">{% if field.field.required %}<label class="layui-form-label label-required-next">{{ field.label }}:</label>{% else %}<label class="layui-form-label">{{ field.label }}:</label>{% endif %}<div class="layui-input-block">{{ field }}<span style="color: red">{{ field.errors.0 }}</span></div></div>{% endfor %}<div class="layui-form-item"><div class="layui-input-block"><button type="submit" class="layui-btn" lay-submit>确认提交</button></div></div></form>
    </div>
    {% endblock %}
    {%block js%}
    {% block extendsjs %}{% endblock %}
    {% for msg in messages %}
    <script>layui.use(['layer'], function () {var iconValue = "{{msg.tags}}" == 'success' ? 1 : 2;layer.msg('{{msg}}',{ icon: iconValue, time: 2000 },function (){if( "{{msg.tags}}" == 'success' ){parent.layer.close(parent.layer.getFrameIndex(window.name)); //关闭当前页parent.layui.table.reload('TableId');//重新加载父窗口表格}})})
    </script>
    {% endfor %}
    {% endblock %}
    
  2. 创建密码修改表单类

    # 密码修改表单类
    class password_form(forms.ModelForm):confirm_password = forms.CharField(label="确认新密码",required=True,widget=forms.PasswordInput(render_value=True,attrs={"lay-affix":"eye"}))new_password = forms.CharField(label="新密码",required=True,widget=forms.PasswordInput(render_value=True,attrs={"lay-affix":"eye"}))class Meta:model =models.Userfields = ['username','password','new_password','confirm_password']widgets ={'password':forms.PasswordInput(attrs={"lay-affix":"eye"},render_value=True),}def __init__(self,*args,**kwargs):super().__init__(*args,**kwargs)for name,field in self.fields.items():field.widget.attrs.update({"class":"layui-input","placeholder":"输入"+field.label})
    
  3. 完善密码修改视图函数

    # 修改密码
    def change_password(request):if request.method == "GET":form = user_form.password_form()return render(request,"common/single_edit_dlg.html",{"form":form})user_info = request.session['user_info']user_id = user_info['id']row_obj = User.objects.filter(id=user_id).first()form = user_form.password_form(data=request.POST)if form.is_valid():username = form.cleaned_data['username']password = MD5(form.cleaned_data['password'])if row_obj.username != username or row_obj.password!=password:messages.error(request, '用户名或密码不正确')return render(request,"common/single_edit_dlg.html",{"form":form})if form.cleaned_data['new_password']!= form.cleaned_data['confirm_password']:messages.error(request, '两次密码输入不一致')return render(request,"common/single_edit_dlg.html",{"form":form})new_password = MD5(form.cleaned_data['new_password'])User.objects.filter(id=user_id).update(password=new_password)messages.success(request, '修改成功')return render(request,"common/single_edit_dlg.html",{"form":form})return render(request,"common/single_edit_dlg.html",{"form":form})
    

‘password’])
if row_obj.username != username or row_obj.password!=password:
messages.error(request, ‘用户名或密码不正确’)
return render(request,“common/single_edit_dlg.html”,{“form”:form})
if form.cleaned_data[‘new_password’]!= form.cleaned_data[‘confirm_password’]:
messages.error(request, ‘两次密码输入不一致’)
return render(request,“common/single_edit_dlg.html”,{“form”:form})
new_password = MD5(form.cleaned_data[‘new_password’])
User.objects.filter(id=user_id).update(password=new_password)
messages.success(request, ‘修改成功’)
return render(request,“common/single_edit_dlg.html”,{“form”:form})

   return render(request,"common/single_edit_dlg.html",{"form":form})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/459764.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[ 问题解决篇 ] 解决远程桌面安全登录框的问题

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

微信小程序时间弹窗——年月日时分

需求 1、默认当前时间2、选择时间弹窗限制最大值、最小值3、每次弹起更新最大值为当前时间&#xff0c;默认值为上次选中时间4、 minDate: new Date(2023, 10, 1).getTime(),也可以传入时间字符串new Date(2023-10-1 12:22).getTime() html <view class"flex bb ptb…

【Spring框架】Spring框架的开发方式

目录 Spring框架开发方式前言具体案例导入依赖创建数据库表结构创建实体类编写持久层接口和实现类编写业务层接口和实现类配置文件的编写 IoC注解开发注解开发入门&#xff08;半注解&#xff09;IoC常用注解Spring纯注解方式开发 Spring整合JUnit测试 Spring框架开发方式 前言…

江协科技STM32学习- P24 DMA数据转运DMA+AD多通道

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

【刷题11】CTFHub技能树sql注入系列

整数型注入 看到源码了&#xff0c;直接sql一套秒了 字符型注入 SQL 报错注入 构造payload 1 and (select extractvalue(1,concat(’~’,(select database())))) 后续步骤跟sql基本步骤一样 SQL 布尔注入 人工测试太麻烦&#xff0c;这里直接使用sqlmap,知道这有sql注入漏洞&am…

面试经典 150 题.P26. 删除有序数组中的重复项(003)

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public int removeDuplicates(int[] nums) …

docker中使用ros2humble的rviz2不显示问题

这里写目录标题 docker中使用ros2humble的rviz2不显示问题删除 Docker 镜像和容器删除 Docker 容器Linux服务器下查看系统CPU个数、核心数、(make编译最大的)线程数总结&#xff1a; RVIZ2 不能显示数据集 docker中使用ros2humble的rviz2不显示问题 问题描述&#xff1a; roo…

ELK + Filebeat + Spring Boot:日志分析入门与实践(二)

目录 一、环境 1.1 ELKF环境 1.2 版本 1.3 流程 二、Filebeat安装 2.1 安装 2.2 新增配置采集日志 三、logstash 配置 3.1 配置输出日志到es 3.2 Grok 日志格式解析 3.2 启动 logstash ​3.3 启动项目查看索引 一、环境 1.1 ELKF环境 springboot项目&#xff1a;w…

基于SSM土家风景文化管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;景点分类管理&#xff0c;热门景点管理&#xff0c;门票订单管理&#xff0c;旅游线路管理&#xff0c;系统管理 前提账号功能包括&#xff1a;系统首页&#xff0c;个人中心&…

Linux特种文件系统--tmpfs文件系统

tmpfs类似于RamDisk&#xff08;只能使用物理内存&#xff09;&#xff0c;使用虚拟内存&#xff08;简称VM&#xff09;子系统的页面存储文件。tmpfs完全依赖VM&#xff0c;遵循子系统的整体调度策略。说白了tmpfs跟普通进程差不多&#xff0c;使用的都是某种形式的虚拟内存&a…

不同概率分布的更新过程——Python实现(均匀分布、卡方分布、指数分布等作为概率分布的更新过程)

更新过程(renewal process)是描述元件或设备更新现象的一类随机过程。以下是对更新过程的详细介绍: 一、定义与特点 定义:设对某元件的工作进行观测,假定元件的使用寿命是一随机变量,当元件发生故障时就进行修理或换上新的同类元件,而且元件的更新是即时的(修理或更换…

GIT分布式版本控制系统基础操作

问题大纲 1、什么分布式版本控制系统 2、简述Git的使用分为哪几个步骤 3、克隆和拉取的区别是什么&#xff1f; 4、git相关的所有指令 一、分布式版本控制系统 分布式版本控制系统是一种版本控制系统&#xff0c;它允许每个用户都拥有完整的项目历史记录和版本控制信息。与…

ArcGIS必会的选择要素方法(AND、OR、R、IN等)位置选择等

今天来看看ArcGIS中的几个选择的重要使用方法 1、常规选择、 2、模糊查询、 3、组合复合条件查询&#xff08;AND、OR、IN&#xff09;&#xff0c; 4、空值NULL查询 5、位置选择 推荐学习&#xff1a; 以梦为马&#xff0c;超过万名学员学习ArcGIS入门到实战的应用课程…

Spring Bean创建流程

Spring Bean 创建流程图 大家总是会错误的理解Bean的“实例化”和“初始化”过程&#xff0c;总会以为初始化就是对象执行构造函数生成对象实例的过程&#xff0c;其实不然&#xff0c;在初始化阶段实际对象已经实例化出来了&#xff0c;初始化阶段进行的是依赖的注入和执行一…

rtp协议:rtcp包格式和传输间隔

RTP Control Protocol -- RTCP-rtp控制协议 实时传输控制协议&#xff08;RTCP&#xff09;基于对会话中的所有参与者定期传输控制包&#xff0c;使用与数据包相同的分发机制。底层协议必须提供数据包和控制包的多路复用&#xff0c;例如使用UDP时使用不同的端口号。RTCP执行四…

2024年医疗人工智能研究报告-生成式AI爆发,医疗人工智能走到新的十字路口(附下载)

前言 2024的医疗AI&#xff0c;既是坎坷&#xff0c;又是新生。 快速发展的大语言模型&#xff0c;携着生成式AI掠过医疗领域。过往的互联网医疗、医学影像、新药研发……一个一个场景经由新一代AI重塑&#xff0c;焕发出前所未有的价值。 不过&#xff0c;发现价值并不意味着…

网络请求自定义header导致跨域问题

我记得我的项目之前已经解决了跨域问题。 后来在功能开发着&#xff0c;需要添加一个自定义的header&#xff0c;发现又出现跨域报错。 于是又开始一通摸索折腾。 我的项目前面端是用axios网络请求&#xff0c;通过拦截器添加header&#xff0c;代码如下&#xff1a; //添加请…

macOS 15 Sequoia dmg格式转用于虚拟机的iso格式教程

想要把dmg格式转成iso格式&#xff0c;然后能在虚拟机上用&#xff0c;最起码新版的macOS镜像是不能用UltraISO&#xff0c;dmg2iso这种软件了&#xff0c;你直接转放到VMware里绝对读不出来&#xff0c;办法就是&#xff0c;在Mac系统中转换为cdr&#xff0c;然后再转成iso&am…

大语言模型数据流程源码解读(基于llama3模型)

文章目录 前言一、数据进入LlamaForCausalLM(LlamaPreTrainedModel)类二、数据进入LlamaModel(LlamaPreTrainedModel)类1、input_ids的embedding编码2、position_ids位置获取3、causal_mask因果mask构建1、causal_mask调用2、因果mask代码解读(_update_causal_mask)4、hidden_s…

MATLAB人脸考勤系统

MATLAB人脸考勤系统课题介绍 该课题为基于MATLAB平台的人脸识别系统。传统的人脸识别都是直接人头的比对&#xff0c;现实意义不大&#xff0c;没有一定的新意。该课题识别原理为&#xff1a;先采集待识别人员的人脸&#xff0c;进行训练&#xff0c;得到人脸特征值。测试的时…