一、项目简介
金融机构在处理贷款、分期、授信等业务时,需要快速判断申请人的违约风险。本文实现一个可运行的 Python 全栈项目:基于机器学习的金融风险评估系统。系统支持用户注册登录、JWT 鉴权、申请人金融特征录入、风险评分、风险等级输出、历史评估记录和统计看板。
项目不是单纯讲算法,而是从前端页面、后端接口、数据库模型到部署运行完整串联,适合作为课程设计、毕业设计或全栈项目练习。
二、技术栈
- 后端:FastAPI、SQLAlchemy、Pydantic、JWT、Passlib
- 数据库:SQLite
- 前端:Vue 3 + Vite
- 鉴权:Bearer Token / JWT
- 风控模型:轻量机器学习风格特征加权评分器,可替换为真实训练模型
- 打包交付:Markdown 博文 + 完整源码 zip
三、系统架构
text
Vue 3 前端
├─ 注册/登录页面
├─ 风控录入表单
├─ 评估记录表格
└─ 统计看板
│ HTTP + JWT
▼
FastAPI 后端
├─ auth 用户认证模块
├─ risks 风险评估模块
├─ dashboard 统计模块
└─ SQLAlchemy ORM
│
▼
SQLite 数据库
├─ users
└─ risk_applications
用户登录后,前端将 token 保存到 localStorage,调用受保护接口时统一在请求头中携带 Authorization: Bearer <token>。后端校验 token 后,只允许用户访问自己的风险评估数据。
四、功能模块
-
用户模块
- 用户注册
- 用户登录
- 密码哈希存储
- JWT token 生成与校验
- 获取当前登录用户
-
风险评估模块
- 录入申请人姓名、年龄、年收入、贷款金额、信用分、工作年限、负债率、逾期次数
- 计算风险分
- 输出 LOW/MEDIUM/HIGH 风险等级
- 给出审批建议
-
统计看板模块
- 申请总数
- 平均风险分
- 低/中/高风险数量
-
前端交互模块
- 注册页
- 登录页
- 登录状态保持
- 退出登录
- 鉴权 API 请求封装
- 风控表单与记录列表
五、数据库/数据模型设计
系统主要包含两张表。
1. users 用户表
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Integer | 主键 |
| username | String | 用户名,唯一 |
| String | 邮箱,唯一 | |
| hashed_password | String | 哈希后的密码 |
| created_at | DateTime | 创建时间 |
2. risk_applications 风险申请表
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Integer | 主键 |
| applicant_name | String | 申请人姓名 |
| age | Integer | 年龄 |
| annual_income | Float | 年收入 |
| loan_amount | Float | 贷款金额 |
| credit_score | Integer | 信用分 |
| employment_years | Float | 工作年限 |
| debt_ratio | Float | 负债率 |
| overdue_count | Integer | 逾期次数 |
| risk_score | Float | 风险分 |
| risk_level | String | 风险等级 |
| suggestion | Text | 审批建议 |
| owner_id | Integer | 所属用户 |
对应 SQLAlchemy 模型位于:backend/app/models.py。
六、后端接口设计
| 方法 | 地址 | 鉴权 | 说明 |
|---|---|---|---|
| GET | /api/health |
否 | 健康检查 |
| POST | /api/auth/register |
否 | 注册 |
| POST | /api/auth/login |
否 | 登录并返回 token |
| GET | /api/auth/me |
是 | 当前用户 |
| POST | /api/risks |
是 | 创建风险评估 |
| GET | /api/risks |
是 | 查询评估记录 |
| GET | /api/dashboard |
是 | 查询统计看板 |
七、前端页面设计
前端采用 Vue 3 + Vite,核心文件如下:
text
frontend/
├─ package.json
├─ index.html
└─ src/
├─ main.js
├─ App.vue
├─ api.js
└─ style.css
页面分为两种状态:
- 未登录:显示登录/注册切换表单。
- 已登录:显示统计看板、风险评估表单、评估记录表格和退出登录按钮。
src/api.js 负责统一封装 API 请求,并在存在 token 时自动追加认证请求头。
八、核心代码讲解
1. FastAPI 应用入口
backend/app/main.py 中创建 FastAPI 应用,配置 CORS,初始化数据库,并定义认证与业务接口。
python
app = FastAPI(title="金融风险评估系统 API", version="1.0.0")
@app.post("/api/auth/login", response_model=schemas.TokenOut)
def login(payload: schemas.UserLogin, db: Session = Depends(get_db)):
user = crud.get_user_by_username(db, payload.username)
if not user or not crud.verify_password(payload.password, user.hashed_password):
raise HTTPException(status_code=401, detail="用户名或密码错误")
token = create_access_token({"sub": user.username})
return {"access_token": token, "token_type": "bearer", "user": user}
登录成功后返回 JWT,前端后续访问风险评估接口时必须携带 token。
2. 密码哈希与用户创建
backend/app/crud.py 使用 Passlib 对密码进行哈希,避免明文密码入库。
python
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
def hash_password(password: str) -> str:
return pwd_context.hash(password)
def verify_password(plain_password: str, hashed_password: str) -> bool:
return pwd_context.verify(plain_password, hashed_password)
3. 风险评分模型
示例项目内置轻量机器学习风格评分器,对多个特征进行归一化和加权:
python
score = (
credit_component * 35
+ debt_component * 25
+ overdue_component * 20
+ income_loan_ratio * 12
+ employment_component * 6
+ age_component * 2
)
评分越高代表风险越大:
LOW:低风险,可快速复核MEDIUM:中风险,需要补充材料或降低授信额度HIGH:高风险,建议拒绝或人工复核
在真实业务中,可以将该函数替换为训练好的 scikit-learn、XGBoost 或深度学习模型。
4. 前端鉴权请求
frontend/src/api.js 统一封装请求:
javascript
const token = getToken()
if (token) headers.Authorization = `Bearer ${token}`
这样 App.vue 中调用 api.dashboard()、api.risks()、api.createRisk() 时会自动带上 token。
5. Vue 交互逻辑
App.vue 使用组合式 API 管理登录状态、表单数据与列表刷新。用户提交风险表单后,调用后端 /api/risks 接口,成功后重新加载看板与记录。
九、部署与运行步骤
1. 启动后端
bash
cd project/backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
后端默认地址:http://127.0.0.1:8000。
2. 启动前端
bash
cd project/frontend
npm install
npm run dev
前端默认地址:http://127.0.0.1:5173。
3. 使用流程
- 注册账号。
- 登录系统。
- 填写申请人金融信息。
- 提交风险评估。
- 在评估记录和统计看板中查看结果。
十、项目总结
本文完成了一个围绕金融风控业务的 Python 全栈项目,覆盖了从数据库建模、后端接口、认证鉴权、风险评分到 Vue 3 前端展示的完整流程。项目虽然使用轻量评分器模拟机器学习模型,但架构上已经预留了模型替换位置,可以扩展为真实训练模型、批量导入、审批流、模型版本管理和风控规则引擎等功能。