包含前后端完整代码: - 前端:Vue3+Vite+ElementPlus - 后端:FastAPI+SQLAlchemy - 模块:驾驶舱/KPI/战略地图/预警/预算/成本/预测/改善行动 - 当前版本:v1.0.0
71 lines
2.1 KiB
Python
71 lines
2.1 KiB
Python
"""用户认证"""
|
|
import hashlib
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
from sqlalchemy.orm import Session
|
|
from app.database import get_db
|
|
from app.models import User
|
|
from app.auth_middleware import create_token, require_auth, ROLES
|
|
|
|
router = APIRouter(prefix="/api/cma/auth", tags=["认证"])
|
|
|
|
|
|
@router.post("/login")
|
|
def login(data: dict, db: Session = Depends(get_db)):
|
|
username = data.get("username", "")
|
|
password = data.get("password", "")
|
|
user = db.query(User).filter(User.username == username).first()
|
|
if not user or user.password_hash != hashlib.sha256(password.encode()).hexdigest():
|
|
raise HTTPException(401, "用户名或密码错误")
|
|
|
|
token = create_token(user.id)
|
|
return {
|
|
"token": token,
|
|
"user": {
|
|
"id": user.id,
|
|
"username": user.username,
|
|
"name": user.name,
|
|
"role": user.role,
|
|
"role_name": ROLES.get(user.role, {}).get("name", user.role),
|
|
}
|
|
}
|
|
|
|
|
|
@router.post("/register")
|
|
def register(data: dict, db: Session = Depends(get_db)):
|
|
exist = db.query(User).filter(User.username == data.get("username")).first()
|
|
if exist:
|
|
raise HTTPException(400, "用户名已存在")
|
|
user = User(
|
|
username=data["username"],
|
|
password_hash=hashlib.sha256(data["password"].encode()).hexdigest(),
|
|
name=data.get("name", data["username"]),
|
|
role=data.get("role", "business"),
|
|
)
|
|
db.add(user)
|
|
db.commit()
|
|
return {"message": "注册成功"}
|
|
|
|
|
|
@router.get("/me")
|
|
def get_me(current_user: User = Depends(require_auth)):
|
|
"""获取当前用户信息"""
|
|
return {
|
|
"id": current_user.id,
|
|
"username": current_user.username,
|
|
"name": current_user.name,
|
|
"role": current_user.role,
|
|
"role_name": ROLES.get(current_user.role, {}).get("name", current_user.role),
|
|
"phone": current_user.phone,
|
|
}
|
|
|
|
|
|
@router.get("/roles")
|
|
def list_roles():
|
|
"""返回角色列表(给前端用)"""
|
|
return {
|
|
"data": [
|
|
{"code": k, "name": v["name"], "priority": v["priority"]}
|
|
for k, v in ROLES.items()
|
|
]
|
|
}
|