Files
DjangoAdmin_Flask_EleVue/src/modules/auth/router.py
T
DjangoAdmin DevandClaude b9ce9dc510 refactor: P4c 最终批次-5 auth 模块(login/index 合并)
【改造】login(data) 入参数据/返回 dict/raise BizError(验证码/限流/密码校验);
_record_login 兼容 dict result;logout 修正误导入(auth→log service)
【修复】auth router login+index 合并的 docstring/import 结构混乱
【验收】flake8 零告警;应用启动;登录表单校验运行时正常;12 passed

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 17:30:44 +08:00

306 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# +======================================================================
# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ]
# +----------------------------------------------------------------------
# | Copyright (c) 2021-2026 一米阳光团队 版权所有
# +----------------------------------------------------------------------
# | 开源协议: Apache-2.0
# | 重要声明: 未经书面许可,不得移除或修改本框架相关版权标识。
# +----------------------------------------------------------------------
# | 官方网站: https://www.djangoadmin.cn
# +----------------------------------------------------------------------
# | 研发团队: 一米阳光团队 荣誉出品
# +======================================================================
# | 版权和免责声明:
# | 一、知识产权声明
# | 本团队对该软件框架产品(以下简称“本产品”)拥有完整知识产权,包括但不限于商标权、专利权、
# | 著作权、商业秘密等。前述权利均受中华人民共和国及相关国际法律法规保护。未经本团队书面授权,
# | 任何个人或单位不得基于本产品本身申请任何形式的知识产权。
# | 二、使用限制与禁止条款
# | 您理解并同意,禁止将本产品用于以下任何行为:
# | 1. 任何违反中华人民共和国法律法规的用途;
# | 2. 任何侵害他人合法权益(包括但不限于人身权、财产权、知识产权等)的行为;
# | 3. 任何危害国家安全、公共利益及社会道德风尚的行为。
# | 三、责任豁免
# | 因使用本产品而产生的任何损失或法律纠纷(包括但不限于直接损失、间接损失、附带损失、衍生损失
# | 以及因违约、侵权等引发的责任),本团队均不承担任何法律责任。若因违规使用本产品导致任何第三
# | 方提起索赔或行政机关进行调查,您应独立承担全部责任。
# | 四、违约与法律责任
# | 如发现任何违反本声明的行为,本团队有权:
# | 1. 无条件配合公安机关及其他有权机关的调查取证工作;
# | 2. 依法追究相关方的民事责任,并要求赔偿全部损失;
# | 3. 保留进一步采取刑事控告等法律措施的权利。
# | 五、许可范围说明
# | 1、被授权方应视本产品源代码为核心机密信息,负有最高标准的保密与保管义务。禁止以任何形式(包
# | 括但不限于直接或间接的分享、复制、传播、分发、转售、出租、开源、反向工程、反编译、反汇编或通
# | 过网络服务提供给任何第三方)泄露、披露或处置源代码的全部或部分内容。任何未经授权的复制、使用、
# | 传播行为均构成对本团队知识产权的严重侵权,本团队有权依法追究其全部法律责任,并要求赔偿因此造
# | 成的一切经济损失及商誉损害。
# | 2、本产品仅限于公司或个人在法律允许范围内,用于内部且合规的软件产品研发。具体权利义务以《软件
# | 许可协议》附件为准。
# +======================================================================
"""
登录认证控制器模块
=============================================================
提供登录、验证码、退出登录以及用户自助信息接口。
"""
from flask import Blueprint
from sqlalchemy import and_
from application.middleware.check_demo import check_demo
from src.modules.auth import service as login
from src.modules.log import service as login_log
from src.modules.system.user.models import User
from src.modules.system.menu import service as menu
from src.modules.system.user import service as user
from src.common.utils.request import parse_request_body
from src.core import response as R
from src.common.utils.captcha import generate_captcha
from src.core.jwt import add_token_to_blacklist, get_access_token
from src.common.utils.rich_text import get_file_url
from src.core.security import get_user_id
login_blue = Blueprint("login", __name__, url_prefix="/")
# ============================================================
# 用户登录
# ============================================================
@login_blue.route("/login", methods=["POST"])
def user_login():
"""
用户登录认证
功能说明:
验证用户名、密码和验证码,登录成功后返回访问令牌。
Returns:
JSON: 登录结果,成功时返回 token,失败时返回错误信息
"""
json_data, err = parse_request_body()
if err:
return R.failed(msg=err)
return R.ok(msg="登录成功", data=login.login(json_data))
# ============================================================
# 验证码获取
# ============================================================
@login_blue.route("/captcha", methods=["GET"])
def captcha():
"""
获取图形验证码
功能说明:
生成图形验证码图片,返回 Base64 编码的图片数据和唯一标识 Key。
Returns:
JSON: 验证码信息
- captcha: Base64 编码的图片数据(data:image/png;base64,xxx)
- key: 验证码唯一标识,用于登录时校验
"""
result = generate_captcha()
id_key = result["idKey"] # 验证码唯一标识
data = result["data"] # 验证码图片 Base64 数据
# 拼接完整的图片 DataURL 格式
img_str = "data:image/png;base64," + data
return R.ok(data={"captcha": img_str, "key": id_key})
# ============================================================
# 退出登录
# ============================================================
@login_blue.route("/logout", methods=["GET"])
def logout():
"""
用户退出登录
功能说明:
将当前Token加入黑名单使其立即失效,确保退出后旧Token无法继续使用。
Returns:
JSON: 操作结果
"""
# 从请求头获取Token并加入黑名单
success, access_token, _ = get_access_token()
if success and access_token:
add_token_to_blacklist(access_token)
# 记录退出登录日志
try:
import time
from flask import g, request
from src.modules.log.models import LoginLog
from src.core.security import get_username
from src.common.utils.ip import get_client_ip
from src.common.utils.ip2region import get_ip_location
from src.common.utils.user_agent import parse_user_agent
username = get_username() or "未知"
client_ip = get_client_ip()
ua_info = parse_user_agent()
# 请求耗时
start_time = getattr(g, "request_start_time", None)
consume_time = int((time.time() - start_time) * 1000) if start_time else 0
login_log.record_login_log(
username=username,
source=LoginLog.Source.ADMIN,
status=LoginLog.Status.NORMAL,
log_type=LoginLog.LogType.LOGOUT,
method=request.method,
request_method=request.endpoint or "",
url=request.path,
param="",
result="退出成功",
ip=client_ip,
location=get_ip_location(client_ip),
os=ua_info.get("os", "未知"),
browser=ua_info.get("browser", "未知"),
consume_time=consume_time,
error="",
)
except Exception as e:
import logging
logging.getLogger(__name__).warning(f"记录退出日志失败: {str(e)}")
return R.ok(msg="注销成功")
"""
首页控制器模块
=============================================================
提供系统首页相关的API接口,包括:
- 系统菜单获取
- 当前用户信息获取
- 个人中心信息更新
- 密码更新
- 退出登录
所属包: application.views
依赖模块: application.services.menu - 菜单业务逻辑层
application.services.user - 用户业务逻辑层
application.models.user - 用户数据模型
"""
index_blue = Blueprint("index", __name__, url_prefix="/index")
# ============================================================
# 系统菜单获取
# ============================================================
@index_blue.route("/getMenu", methods=["GET"])
def get_menus():
"""
获取系统菜单列表
功能说明:
根据当前用户的权限,获取可访问的系统菜单树。
Returns:
JSON: 菜单树形结构数据
"""
menu_list = menu.get_user_permission_menus(get_user_id())
return R.ok(data=menu_list)
# ============================================================
# 用户信息获取
# ============================================================
@index_blue.route("/getUser", methods=["GET"])
def get_user():
"""
获取当前用户信息
功能说明:
获取当前登录用户的详细信息,包括:
- 基本信息(姓名、头像、性别、手机号等)
- 权限节点列表
Returns:
JSON: 用户详细信息
"""
# 查询用户信息
current_user = User.query.filter(and_(User.id == get_user_id(), User.is_delete == 0)).first()
if not current_user:
return R.failed("用户不存在")
# 获取权限节点列表
permissions = menu.get_user_permissions(get_user_id())
# 构建用户信息
info = {
"realname": current_user.realname,
"avatar": get_file_url(current_user.avatar),
"gender": current_user.gender,
"mobile": current_user.mobile,
"email": current_user.email,
"intro": current_user.intro,
"address": current_user.address,
"roles": [],
"permissions": permissions,
}
return R.ok(data=info)
# ============================================================
# 个人中心信息更新
# ============================================================
@index_blue.route("/userInfo", methods=["PUT"])
@check_demo
def update_user_info():
"""
更新个人中心信息
功能说明:
修改当前登录用户的基本信息。
Returns:
JSON: 操作结果
"""
result = user.update_user_info()
return result
# ============================================================
# 密码更新
# ============================================================
@index_blue.route("/updatePwd", methods=["PUT"])
@check_demo
def update_pwd():
"""
更新用户密码
功能说明:
修改当前登录用户的登录密码。
Returns:
JSON: 操作结果
"""
result = user.update_password()
return result