csrf跨站请求的相关装饰器、Auth模块(模块的使用、相关方法、退出系统、修改密码功能、注册功能)、扩展默认的auth_user表
一、csrf跨站请求的相关装饰器
'''
django.middleware.csrf.CsrfViewMiddlewareDjango中有一个中间件对csrf跨站做了验证,我只要把csrf的这个中间件打开,
那就意味着所有的方法都要被验证
'''在所有的视图函数中:只有几个视图函数做验证只有几个函数不做验证csrf_protect: 哪个视图函数加了这个装饰器,这个函数就会做验证
csrf_exempt:哪个视图函数加了这个装饰器,这个函数就不会做验证
-------------------------------------------------------------------------------
注意:加入装饰器验证csrf,先导入下面这行代码:
from django.views.decorators.csrf import csrf_exempt,csrf_protect一、FBV模式下:
情境1:1.先在settings.py配置文件中注释下面这行代码:# 'django.middleware.csrf.CsrfViewMiddleware',2.然后在需要验证的视图函数上面加上 @csrf_protect 则说明这个视图函数需要经过验证.@csrf_protectdef index(request):return render(request, 'index.html')def func(request):return render(request, 'func.html')3. 上述两个视图函数中,由于index函数加了装饰器csrf_protect所以需要经过csrf验证,而func函数不需要情境2:1.先打开settings.py配置文件中下面这行代码:即不用注释'django.middleware.csrf.CsrfViewMiddleware',2.然后在不需要验证的视图函数上面加上 @csrf_exempt 则说明这个视图函数不需要经过验证,而没有加任何装饰的视图函数必须经过csrf验证@csrf_exemptdef index(request):return render(request, 'index.html')def func(request):return render(request, 'func.html')return render(request, 'func.html')3. 上述两个视图函数中,在'django.middleware.csrf.CsrfViewMiddleware',没有被注释的情况下:由于index函数加了装饰器csrf_exempt,所以不需要经过csrf验证,而func函数需要csrf验证。情境3:1.在打开settings.py配置文件中下面这行代码的情况下:'django.middleware.csrf.CsrfViewMiddleware',2.然后在不需要验证的视图函数上面加上 @csrf_exempt 则说明这个视图函数不需要经过验证,而另一个加了装饰器 csrf_protect 的视图函数也必须经过csrf验证@csrf_exemptdef index(request):return render(request, 'index.html')@csrf_protectdef func(request):return render(request, 'func.html')3. 上述两个视图函数中,由于index函数加了装饰器csrf_exempt所以不需要经过csrf验证,而func函数加了装饰器csrf_protect需要csrf验证。二、CBV模式下:
注意:加入装饰器,先导入下面代码:
from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.views import View
from django.utils.decorators import method_decorator方式1:在post函数上,加入csrf_exempt无效,还是报错:Forbidden (403)1.先打开settings.py配置文件中下面这行代码:即不用注释'django.middleware.csrf.CsrfViewMiddleware',2.然后在不需要验证的视图函数上面加上 @csrf_exempt 则说明这个视图函数不需要经过验证,但是结果是还需要验证,说明此方式无效。class Login(View):# 不让post方法做验证@method_decorator(csrf_exempt)def post(self, request):print('post')return HttpResponse('post')方式2:在类的投诉,加入csrf_exempt无效,还是报错:Forbidden (403)1.先打开settings.py配置文件中下面这行代码:即不用注释'django.middleware.csrf.CsrfViewMiddleware',2.在类的头上加了装饰器,但是还是无效@method_decorator(csrf_exempt, name='post')class Login(View):# 不让post方法做验证def post(self, request):print('post')return HttpResponse('post')方式3:CBV的验证只有在dispatch函数上加装饰器,需要验证的函数才能通过验证class Login(View):@method_decorator(csrf_exempt)def dispatch(self, request, *args, **kwargs):return super(Login, self).dispatch(request, *args, **kwargs)# 不让post方法做验证def post(self, request):print('post')return HttpResponse('post')注意:在settings.py配置文件中注释下面这行代码:#'django.middleware.csrf.CsrfViewMiddleware',然后,对三种方式进行验证csrf_protect,都可以CBV针对于csrf_exempt:只有第三张方式才生效,其余两种方式不行
CBV针对于csrf_protect:三种方式都可以# @method_decorator(csrf_protect,name='post') # 第二种方式也行
class Login(View):@method_decorator(csrf_protect) # 第三种方式可以def dispatch(self, request, *args, **kwargs):return super().dispatch(request, *args, **kwargs)# 不让post方法做验证# @method_decorator(csrf_protect) # 第一种方式行def post(self, request):print("post")return HttpResponse("post")
二、Auth模块的使用
Auth模块是什么?Auth模块是Django自带的用户认证模块:我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统–auth,它默认使用 auth_user 表来存储用户数据。注意事项:在执行数据库迁移命令的时候,会自动生成一个默认的表,其中有auth_开头的很多表auth_user表的作用:djagno自带的后台管理系统所依赖的数据就在这张表中默认情况下,auth_user表是空表,没有用户名和密码,因此我们需要自己创建用户数据需要创建一个超级管理员账号才能登录'''
创建超级管理员命令:python manage.py createsuperuser在配置文件settings.py中修改语言为中文和时区:
# 语言
LANGUAGE_CODE = 'zh-hans'
# 时区
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False'''
三、Auth模块的相关方法
登录功能、注册功能、修改密码、退出系统、认证功能等学习如何使用# http://127.0.0.1:8000/accounts/login/?next=/order/
# @login_required # :http://127.0.0.1:8000/accounts/login/?next=/order/
'''当局部和全局都存在的时候,按局部的如果局部没有,按照全局的
'''
@login_required(login_url='/order/login/') # 局部设置
def order(request):pass###################配置文件中全局配置LOGIN_URL = '/login/' # 全局配置'''
如果没有登录则 跳转到 http://127.0.0.1:8000/accounts/login/?next=/order/
但是若加了装饰器,则跳转到指定的路由页面在settings.py配置文件中全局配置,
LOGIN_URL = '/login/'当局部和全局都在的时候,按局部的,若局部没有,则按全局的
'''
@login_required(login_url='/login/') # 局部设置登录
def order(request):# 验证用户是否已经登录认证print(request.user.is_authenticated) # True# 若加了@login_required装饰器,则下面的判断不需要# if request.user.is_authenticated:# # 处理登录之后的逻辑# pass# else:# # 没有登录,跳转登录页面# passreturn HttpResponse('order')def order1(request):return HttpResponse('order')---------------------------------------------------------------------------------------auth模块的后端登录代码:
from django.contrib import authdef login(request):if request.method == 'POST':# 1.接收前端传过来的数据username = request.POST.get('username')password = request.POST.get('password')# 2.验证用户名和密码是否正确# 2.1 去哪个表中查询数据# 2.2 使用这张表中的哪个字段来比较'''这里的登录,我们使用auth模块,登录的时候所使用的表是auth_user表'''# def authenticate(request=None, **credentials):return user 需要关键字传参user_obj = auth.authenticate(request, username=username, password=password) # request.session['username'] = user_obj.usernane'''返回值是登录成功之后的用户对象'''print(user_obj) # lindaprint(user_obj.username) # lindaprint(user_obj.password) # pbkdf2_sha256$150000$auQyjuifJ0ie$I8uTuxyATU6FubswdMCTiL2+Hg+5sqzkvZruPmPdlZ0='''注意事项1:传递参数的时候,用户名和密码必须同时传入'''# if user_obj:# # 保存用户的状态:cookie session# request.session['username'] = user_obj.username# request.session['id'] = user_obj.id'''注意事项2:由于上面使用了auth模块,在此不建议这样写,auth模块都提供有相应的方法要么全部使用auth模块的方法,要么全部自己写,不建议混合使用'''# 3.使用auth模块提供的方法auth.login(request, user_obj)'''只要写了auth.login,那么就可以在全局有任何request的地方使用request.user拿到用户对象'''return redirect('/home/')return render(request, '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>body {{#background: url('https://pic2.zhimg.com/3ae866e7992a94069c7e0c417aac807d_r.jpg') no-repeat;#}background: url('https://img0.baidu.com/it/u=741268616,1401664941&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1691859600&t=5c5bee3052ecec363c1ecc2eea9ac3f7') no-repeat;background-size: 100% 130%;}#login_box {width: 20%;height: 400px;background-color: #00000060;margin: auto;margin-top: 10%;text-align: center;border-radius: 10px;padding: 50px 50px;}h2 {color: #ffffff90;margin-top: 5%;}#input-box {margin-top: 5%;}span {color: #fff;}input {border: 0;width: 60%;font-size: 15px;color: #fff;background: transparent;border-bottom: 2px solid #fff;padding: 5px 10px;outline: none;margin-top: 10px;}button {margin-top: 50px;width: 60%;height: 30px;border-radius: 10px;border: 0;color: #fff;text-align: center;line-height: 30px;font-size: 15px;background-image: linear-gradient(to right, #30cfd0, #330867);}#sign_up {margin-top: 45%;margin-left: 60%;}a {color: #b94648;}</style>
</head><body>
<div id="login_box"><h2>登录页面</h2><form action="" method="post"><div id="input_box"><input type="text" placeholder="请输入用户名" name="username"></div><div class="input_box"><input type="password" placeholder="请输入密码" name="password"></div><button>提交</button>
{# <input type="submit" value="提交">#}<br></form>
</div>
</body>
</html>
四、Auth模块之退出系统
def logout(request):# 清除cookie或者sessionauth.logout(request)return redirect('/home/')
六、Auth模块之修改密码功能
1.验证老密码是否正确
is_right = request.user.check_password(old_password)2.修改密码
request.user.set_password(new_password) # 这种写法没有真正的操作数据库
request.user.save() # 但是执行了save()之后就操作数据库了案例代码:
@login_required
def set_password(request):if request.method == 'POST':old_password = request.POST.get('old_password')new_password = request.POST.get('new_password')re_password = request.POST.get('re_password')# 先验证两次密码是否输入一致if new_password == re_password:# 验证老密码是否正确is_right = request.user.check_password(old_password)if is_right:# 修改密码# 方式1:这种写法没有真正的操作数据库request.user.set_password(new_password)# 方式1需要保存一下才能修改成功到数据库request.user.save()return redirect('/home/')return render(request, 'set_password.html', locals())前端代码:
<div id="login_box"><h2>修改密码</h2><form action="" method="post">{% csrf_token %}<div id="input_box">用户名:<input type="text" name="username" readonly value="{{ request.user.username }}"></div><div class="input_box">旧密码:<input type="password" placeholder="请输入旧密码" name="old_password"></div><div class="input_box">新密码:<input type="password" placeholder="请输入新密码" name="new_password"></div><div class="input_box">请确认:<input type="password" placeholder="确认新密码" name="re_password"></div><button>提交</button>
{# <input type="submit" value="提交">#}<br></form>
</div>
七、Auth模块之注册功能
'''
入库的三种方式:方式1:自动入库到auth_user表,但是密码是明文密码,登录的时候是经过加密处理的,则登录不上User.objects.create(username=username, password=password)方式2:密码是密文入库User.objects.create_user(username=username, password=password)方式3:创建超级用户,并且密码是密文存入,但是必须指定邮箱,否则报错User.objects.create_superuser(username=username, password=password, email='123@qq.com')
'''from django.contrib.auth.models import Userdef register(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')# 入库# 方式1:自动入库到auth_user表,但是密码是明文密码,登录的时候是经过加密处理的,则登录不上# User.objects.create(username=username, password=password)# 方式2:创建普通用户,密码是密文入库# User.objects.create_user(username=username, password=password)# 方式3:创建超级用户,并且密码是密文存入,但是必须指定邮箱,否则报错User.objects.create_superuser(username=username, password=password, email='123@qq.com')return redirect('/login/')return render(request, 'register.html')
八、扩展默认的auth_user表
默认情况下使用的就是auth_user的默认字段
扩展我们自己的字段前提是:所有的模型类都继承
from django.contrib.auth.models import AbstractUser现在是要在auth_user表的基础上扩展字段,不要继承了models.Model**************************************************************************
注意:扩展之后需要在配置文件(settings.py)中加一句话AUTH_USER_MODEL = '应用名.表名'eg:AUTH_USER_MODEL = 'app01.UserInfo'-------------------------------------------------------------------------------------注意:"""在扩展表之前数据库不能够迁移,扩展这个表需要在迁移数据库之前做"""问:如果你迁移了,还想扩展怎么办?1. 换库2. 需要删除很多个应用的migrations文件夹
注意:迁移报错的时候,有可能会用到下面这句代码:python manage.py migrate myapp --fake---------------重点:扩展表之后发生的变化-------------------
"""扩展表之后发生的变化:1. 原来的auth_user表不存在了,换成你自己新建的表名了2. 原来的auth_user表中的字段还都在,然后多了自己扩展的字段3. 继承的类要发生改变AbstractUser4. 在配置文件中加入下面一句话:AUTH_USER_MODEL = 'app01.UserInfo'AUTH_USER_MODEL = '应用名.类名'5. 扩展之后还是按照原来的auth_user表使用6. auth模块中的数据还是你扩展的表7. 扩展之前别迁移.
"""--------------------------------------------------------------------
案例:
因为之前迁移过了,所以我选择换库:从sqlite3---->mysql1.在settings.py配置文件中把数据库换成MySQL:
'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'db22','HOST': '127.0.0.1','PORT': 3306,'USER': 'root','PASSWORD': 'root','CHARSET': 'utf8'},
2.扩展表的字段:先导入AbstractUser,让扩展表继承AbstractUser
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):phone = models.CharField(max_length=64)# 头像avatar = models.CharField(max_length=64)
3.迁移
python manage.py makemigrations
python manage.py migrate
相关文章:
csrf跨站请求的相关装饰器、Auth模块(模块的使用、相关方法、退出系统、修改密码功能、注册功能)、扩展默认的auth_user表
一、csrf跨站请求的相关装饰器 django.middleware.csrf.CsrfViewMiddlewareDjango中有一个中间件对csrf跨站做了验证,我只要把csrf的这个中间件打开, 那就意味着所有的方法都要被验证 在所有的视图函数中:只有几个视图函数做验证只有几个函数…...
(WWW2023)论文阅读-Detecting Social Media Manipulation in Low-ResourceLanguages
论文链接:https://arxiv.org/pdf/2011.05367.pdf 摘要 社交媒体被故意用于恶意目的,包括政治操纵和虚假信息。大多数研究都集中在高资源语言上。然而,恶意行为者会跨国家/地区和语言共享内容,包括资源匮乏的语言。 在这里…...
centos-stream-9 centos9 配置国内yum源 阿里云源
源配置 tips: yum配置文件路径 /etc/yum.repos.d/centos.repo 1.备份源配置 [Very Important!]mv /etc/yum.repos.d/centos.repo /etc/yum.repos.d/centos.repo.backup2.Clean Cache: yum clean all3.Backup the Old CentOS-Base.repo If exist this file.cd /etc/yum.repos.…...

查看单元测试用例覆盖率新姿势:IDEA 集成 JaCoCo
1、什么是 IDEA IDEA 全称 IntelliJ IDEA,是 Java 编程语言开发的集成环境。IntelliJ 在业界被公认为最好的 Java 开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE 支持、各类版本工具(git、SVN 等)、JUnit、CVS 整合、代码分析、 创新的 GUI…...
js和nodejs如何将文件切片和合并
nodejs进行文件切片合并 使用nodejs读取文件流,并对流进行切片合并等操作,就需要用到Buffer对象,可对文件流进行切片,并合并。 const fs require(fs)// 读取一个文件,使用fs读取文件获取一个Buffer类型数据 const b…...

Java内存模型
Java内存模型全称JMM(Java Memory Model) 内存主要有堆和栈组成 下面来一段demo代码详细讲解堆栈的作用,以及流程 public class Employee {private String name;private Integer age;private Department department;public Employee(){}pub…...

[国产MCU]-BL602开发实例-看门狗定时器(WDG)
看门狗定时器(WDG) 文章目录 看门狗定时器(WDG)1、看门狗定时器(WDG)介绍2、看门狗定时器驱动API介绍3、看门狗定时器使用实例看门狗(Watchdog),又叫看门狗定时器(Watchdog Timer),是一种硬件的计时设备,当系统的主程序发生某些错误时,导致未及时清除看门狗计时器…...

28 | Boss直聘数据分析
针对boss直聘网的招聘信息,然后分析互联网发展排名前十的城市在互联网方面职位的薪水,学历要求,经验要求,等等信息。 准备从以下几个方面进行分析: (1)各个城市的平均工资 (2)各个学历的平均工资 (3)各个岗位的平均工资 (4)不同工作经验要求的工资 (5)各个经验…...
Hash 缓存
Hash 缓存 输出文件名(Hash) 静态资源缓存是前端性能优化的一个点,所以在前端开发过程中,一般会最大限度的利用缓存(这里主要是强缓存)。如果设置了强缓存后,每次当我们部署了新的项目文件到线…...
腾讯云CVM服务器标准型S5性能CPU处理器测试
腾讯云服务器CVM标准型S5实例是次新一代的标准型实例,CPU采用主频2.5GHzIntel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器,睿频3.1GHz,云服务器S5基于全新优化虚拟化平台,提供了平衡、稳定的计算、内存和网络资源&#x…...
【左神算法刷题班】第16节:累加和为k的数组、逆序对问题、约瑟夫环问题
题目1 给定一个有正、有负、有0的数组arr, 给定一个整数k, 返回arr的子集是否能累加出k 1)正常怎么做? 2)如果arr中的数值很大,但是arr的长度不大,怎么做? 问题 1)…...
【React | 前端】在React的前端页面中,判断某个变量值是否被定义?根据是否定义显示不同的内容?
问题描述 在React的前端页面中,判断某个变量值是否被定义?根据是否定义显示不同的内容? 问题场景 假如,现在有一个需求是设计一个新功能,新功能中要求新增一个之前没有的变量,假设是计算某一个数组的长度…...

机器学习深度学习——seq2seq实现机器翻译(数据集处理)
👨🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——从编码器-解码器架构到seq2seq(机器翻译) 📚订阅专栏:机…...

锁定Mac的内置键盘,防止外接键盘时的误触
场景:把你的外接键盘放在mac上,然后打字时,发现外接键盘误触mac键盘,导致使用体验极差 解决方案:下载Karabiner-Elements这款软件,并给它开启相关权限。 地址:https://github.com/pqrs-org/Ka…...

由于找不到d3dx9_42.dll,无法继续执行代码。重新安装程序可能会解决此问题
d3dx9_42.dll是一个动态链接库文件,它是Microsoft DirectX 9的一部分。这个文件包含了DirectX 9的一些函数和资源,用于支持计算机上运行基于DirectX 9的应用程序和游戏。它通常用于提供图形、音频和输入设备的支持,以及其他与图形和游戏相关的…...

解决Vue+Element UI使用el-dropdown(下拉菜单)国际化时菜单label信息没有刷新的情况
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 问题描述 在默认中文时,点击布局大小下拉菜单正常显示中文,此时切换至英文时,再次点击下拉菜单,还…...

Prometheus技术文档-概念
Prometheus是一个开源的项目连接如下: Prometheus首页、文档和下载 - 服务监控系统 - OSCHINA - 中文开源技术交流社区 基本概念: Prometheus是一个开源的系统监控和告警系统,由Google的BorgMon监控系统发展而来。它主要用于监控和度量各种…...
JQuery判断radio(单选框)是否选中和获取选中值方法总结
使用checked属性判断选中、jquery获取radio单选按钮的值、获取一组radio被选中项的值、设置单选按钮被选中等,详细如下: 一、利用获取选中值判断选中 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.…...
Effective Python 读书笔记
文章目录 前言第1章:用Pythonic方式来思考 1. 用Pythonic方式来思考 2. 遵循PEP8风格3. 了解bytes, str, unicode区别4. 用辅助函数取代复杂表达式5. 了解切割序列的方法6. 单次切片操作内,不要同时指定start, end, stride 7. 用列表推导取代map, filter…...
Monge矩阵
Monge矩阵 对一个m*n的实数矩阵A,如果对所有i,j,k和l,1≤ i<k ≤ m和1≤ j<l ≤ n,有 A[i,j]A[k,l] ≤ A[i,l]A[k,j] 那么,此矩阵A为Monge矩阵。 换句话说,每当我们从矩阵中挑…...
Ubuntu开机自动运行Docker容器中的Qt UI程序
Ubuntu开机自动运行Docker容器中的Qt UI程序 引言为什么需要这样配置?解决方案概览详细实现步骤1. 创建容器启动脚本2. 创建系统服务3. 配置自动登录和显示设置常见问题解决方案1. 程序无法显示(X11权限问题)2. 分辨率设置不生效3. 服务启动失败安全注意事项结语附录:完整文…...

计算机网络之差错控制中的 CRC(循环冗余校验码)
文章目录 1 概述1.1 简介1.2 特点1.3 基本原则 2 实现步骤3 例题 1 概述 1.1 简介 CRC:Cyclic Redundancy Check(循环冗余校验)是计算机网络中常用的一种差错控制编码方法,用于检测数据传输或存储过程中可能出现的错误。 1.2 特…...

ubuntu系统安装Pyside6报错解决
目录 1,问题: 2,解决方法: 2.1 首先查看pypi是否有你需要包的镜像: 2.2 其它方案: 2.3 如果下载很慢,可以换源: 2.4 查看系统架构 Windows Ubuntu 1,问题…...
【Python】os模块
目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明 🧠 一、技术原理剖析📊 核心架构图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选…...
shell中与>和<相关的数据流重定向操作符整理
shell中与>和<相关的数据流重定向操作符整理 输出重定向操作符>>>2>2>>&> 或 >&&>> 输入重定向操作符<<<<<< 组合重定向2>&1 文件描述符相关重定向[n]< file 和 [n]> file>&- 和 <&…...
Oracle exist
Oracle中的EXISTS是用于检查子查询结果是否为空的逻辑运算符,其核心特点和用法如下: 基础语法 SELECT columns FROM table1 WHERE EXISTS (SELECT 1 FROM table2 WHERE condition); 当子查询返回至少一行时返回TRUE,否则返回FALSE。 执…...

Scratch节日 | 六一儿童节
六一儿童节到啦!快来体验这款超简单又超好玩的 六一儿童节 小游戏吧!只需要一只鼠标,就能尽情释放你的创意,绘出属于你自己的缤纷世界! 🎮 玩法介绍 鼠标滑动:在屏幕上随意滑动鼠标,…...
【C/C++】基于 Docker 容器运行的 Kafka + C++ 练手项目
文章目录 基于 Docker 容器运行的 Kafka C 练手项目1 项目目的2 项目框架3 代码4 编译运行5 功能与接口说明5.1 Producer 接口:producer.cpp关键调用流程参数说明 5.2 Consumer 接口:consumer.cpp关键调用流程消费流程中注意 5.3 工程技术点 基于 Docke…...
LlamaFactory——如何使用魔改后的模型
需求来源:有时我们可能想在llamafactory框架支持的模型上进行一些改动,例如修改forward()方法等,修改方法我们可以通过继承Transformers库中相应的class并重写相应的方法即可,那我们如何使用自己的模型呢? 首先&#…...
Spring Boot + MyBatis-Plus实现操作日志记录
创建数据库表 CREATE TABLE sys_operation_log (log_id bigint NOT NULL AUTO_INCREMENT COMMENT 日志ID,operation_type varchar(20) NOT NULL COMMENT 操作类型,operation_module varchar(50) NOT NULL COMMENT 操作模块,operation_desc varchar(200) DEFAULT NULL COMMENT …...