欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > 企业内部 Hugging Face NLP 解决方案及示例

企业内部 Hugging Face NLP 解决方案及示例

2025/3/24 6:44:32 来源:https://blog.csdn.net/m0_50657013/article/details/146411166  浏览:    关键词:企业内部 Hugging Face NLP 解决方案及示例

一、企业内部 Hugging Face NLP 解决方案

需求涵盖多个方面:

  1. 企业文档处理(合同、规章制度、技术文件等)
  2. 财务数据分析(ERP 业务数据,问答式报告生成)
  3. 数据可视化(自动生成图表)

为了满足这些需求,我们可以采用以下技术架构:

  • 文本解析(OCR + NLP):解析合同、规章制度等文档
  • 文档问答(RAG 检索增强生成):基于企业知识库进行问答
  • 财务数据分析(SQL + LLM):让 AI 直接查询 ERP 数据并生成业务报告
  • 图表生成(Matplotlib + Plotly + Vega):将分析结果可视化
  • 企业内部 API(FastAPI / Flask):构建 REST / GraphQL 服务

1. 方案架构

(1)企业文档问答

  • 采用 OCR + NLP 解析 PDF、Word、Excel 文档,转换为结构化数据
  • 使用 FAISS / Elasticsearch 构建企业知识库,实现高效查询
  • 结合 GPT / Llama / Mistral 等大模型,生成自然语言回答

(2)财务数据分析

  • SQL + NLP 结合,让 AI 解析用户意图,自动生成 SQL 语句查询 ERP
  • 报告自动化,如销售额趋势、利润率、现金流等
  • 基于 Pandas / Matplotlib / Plotly 生成可视化图表

(3)内部部署

  • 本地 LLM(如 Llama / Mistral / Falcon),避免数据外泄
  • RAG(Retrieval-Augmented Generation) 提升问答准确度
  • Docker / Kubernetes / OCP 部署,结合 CI/CD 进行管理

2. 具体实现

(1)文档解析

安装 pytesseract(OCR)+ pdfplumber(PDF解析)

pip install pytesseract pdfplumber

提取合同、规章制度:

import pdfplumber
import pytesseract
from PIL import Imagedef extract_text_from_pdf(pdf_path):with pdfplumber.open(pdf_path) as pdf:text = ""for page in pdf.pages:text += page.extract_text() + "\n"return text# 示例
pdf_text = extract_text_from_pdf("contract.pdf")
print(pdf_text)

(2)企业文档问答(RAG)

使用 FAISS 进行文本向量化存储:

pip install faiss-cpu sentence-transformers
from sentence_transformers import SentenceTransformer
import faiss
import numpy as npmodel = SentenceTransformer("all-MiniLM-L6-v2")# 示例文本
documents = ["企业规章制度", "合同管理规范", "财务管理要求"]
vectors = model.encode(documents)# 建立索引
index = faiss.IndexFlatL2(vectors.shape[1])
index.add(np.array(vectors))# 查询
query = "合同管理的规定是什么?"
query_vector = model.encode([query])
D, I = index.search(query_vector, k=1)
print(f"最匹配的文档: {documents[I[0][0]]}")

结合 GPT 生成回答:

from transformers import pipelineqa_pipeline = pipeline("question-answering", model="deepset/roberta-base-squad2")context = "合同管理规范: 甲方需按时支付乙方..."
question = "合同付款的时间要求是什么?"result = qa_pipeline(question=question, context=context)
print(result["answer"])

(3)财务数据分析(SQL 生成)

让 AI 解析用户问题,并转换为 SQL 语句:

from transformers import pipelinenl2sql = pipeline("text2text-generation", model="microsoft/SQLCoder")query = "查询2023年每月的销售额"
result = nl2sql(query)
sql_query = result[0]["generated_text"]
print(sql_query)

执行 SQL:

import sqlite3
import pandas as pdconn = sqlite3.connect("erp.db")
df = pd.read_sql(sql_query, conn)
print(df)

(4)数据可视化

安装 Matplotlib 和 Plotly:

pip install matplotlib plotly

生成柱状图:

import matplotlib.pyplot as pltdf.plot(kind="bar", x="month", y="sales", color="blue")
plt.xlabel("Month")
plt.ylabel("Sales")
plt.title("Monthly Sales")
plt.show()

3. 内部 API 部署

使用 FastAPI 提供 API 服务:

pip install fastapi uvicorn

创建 app.py

from fastapi import FastAPI
from transformers import pipeline
import sqlite3
import pandas as pdapp = FastAPI()
nl2sql = pipeline("text2text-generation", model="microsoft/SQLCoder")@app.get("/query/")
def query_db(question: str):# 生成 SQLsql_query = nl2sql(question)[0]["generated_text"]# 连接数据库conn = sqlite3.connect("erp.db")df = pd.read_sql(sql_query, conn)return {"query": sql_query, "data": df.to_dict(orient="records")}# 启动服务
# uvicorn app:app --host 0.0.0.0 --port 8000

请求示例:

http://localhost:8000/query/?question=查询2023年每月的销售额

返回:

{"query": "SELECT month, SUM(sales) FROM sales_data WHERE year=2023 GROUP BY month","data": [{"month": "Jan", "sales": 10000}, {"month": "Feb", "sales": 12000}]
}

4. 服务器部署

(1)Docker

创建 Dockerfile

FROM python:3.9
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]

构建 & 运行:

docker build -t nlp-api .
docker run -d -p 8000:8000 nlp-api

(2)Kubernetes 部署

创建 deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: nlp-api
spec:replicas: 2selector:matchLabels:app: nlp-apitemplate:metadata:labels:app: nlp-apispec:containers:- name: nlp-apiimage: myrepo/nlp-api:latestports:- containerPort: 8000

部署:

kubectl apply -f deployment.yaml

5. 总结

企业文档问答(FAISS + NLP)
ERP 财务数据分析(SQL + LLM)
业务分析可视化(Matplotlib / Plotly)
内部 API 部署(FastAPI + Docker + Kubernetes)

二、对企业文档问答、财务数据分析、数据可视化进行优化

1. 企业文档问答(RAG)

企业的合同、技术文件、规章制度等,往往是 非结构化文本,无法直接用 SQL 查询。我们可以采用 检索增强生成(RAG) 方案,将企业文档转换为 向量数据库,然后让 LLM(如 Llama 3 / Mistral)生成更准确的回答。

(1)文档解析(OCR + NLP)

如果文档是 PDF,我们需要 OCR 解析:

pip install pdfplumber pytesseract
import pdfplumberdef extract_text_from_pdf(pdf_path):with pdfplumber.open(pdf_path) as pdf:text = "\n".join(page.extract_text() for page in pdf.pages if page.extract_text())return texttext = extract_text_from_pdf("contract.pdf")
print(text)

(2)向量数据库(FAISS / Chroma)

安装 FAISS:

pip install faiss-cpu sentence-transformers

然后进行文档向量化存储:

from sentence_transformers import SentenceTransformer
import faiss
import numpy as npmodel = SentenceTransformer("all-MiniLM-L6-v2")# 示例文档
docs = ["合同付款要求...", "财务制度...", "企业规章..."]
vectors = model.encode(docs)# 构建 FAISS 索引
index = faiss.IndexFlatL2(vectors.shape[1])
index.add(np.array(vectors))# 查询
query = "合同的付款条件是什么?"
query_vector = model.encode([query])
D, I = index.search(query_vector, k=1)
print(f"最相关的文档: {docs[I[0][0]]}")

(3)生成回答

结合 Llama 3 / Mistral:

from transformers import pipelineqa_pipeline = pipeline("text-generation", model="meta-llama/Llama-3-8B")
context = "合同付款要求: 甲方需在30日内付款..."
question = "合同付款时间是多少?"result = qa_pipeline(f"基于以下信息回答问题: {context} \n 问题: {question}")
print(result[0]["generated_text"])

2. ERP 财务数据分析(SQL + LLM)

我们希望 AI 能够理解用户意图,并自动生成 SQL 查询 ERP 数据

(1)基于自然语言生成 SQL

安装 SQL 解析模型:

pip install transformers

使用 Hugging Face 预训练 SQL 模型:

from transformers import pipelinenl2sql = pipeline("text2text-generation", model="microsoft/SQLCoder")query = "查询2023年每月销售额"
sql_query = nl2sql(query)[0]["generated_text"]
print(sql_query)

(2)执行 SQL 查询

import sqlite3
import pandas as pdconn = sqlite3.connect("erp.db")
df = pd.read_sql(sql_query, conn)
print(df)

3. 数据可视化(报告自动生成)

基于 SQL 查询结果,自动生成报表和图表。

(1)柱状图

pip install matplotlib plotly
import matplotlib.pyplot as pltdf.plot(kind="bar", x="month", y="sales", color="blue")
plt.xlabel("Month")
plt.ylabel("Sales")
plt.title("Monthly Sales")
plt.show()

(2)仪表盘

可以用 Streamlit 构建可视化界面:

pip install streamlit
import streamlit as stst.title("财务数据分析")
st.bar_chart(df.set_index("month")["sales"])

 启动:

streamlit run dashboard.py

4. 本地 Hugging Face LLM 部署

企业内部部署 LLM,可以使用 Llama 3 / Mistral / Falcon,避免数据外泄。

(1)轻量化推理

如果没有高端 GPU,可以使用 GGUF 量化

pip install llama-cpp-python

运行:

from llama_cpp import Llamamodel = Llama(model_path="llama-3-8B.gguf")
response = model("合同的付款时间是多少?")
print(response)

如果有 NVIDIA GPU,可以使用 vLLM / TensorRT 提速:

pip install vllm
from vllm import LLM, SamplingParamsllm = LLM("meta-llama/Llama-3-8B")
response = llm.generate("企业规章有哪些?", SamplingParams())
print(response)

(2)Docker 部署

创建 Dockerfile

FROM nvidia/cuda:12.1-base
RUN pip install transformers vllm fastapi
WORKDIR /app
COPY app.py /app
CMD ["python", "app.py"]

运行:

docker build -t llm-server .
docker run --gpus all -p 8000:8000 llm-server

(3)Kubernetes 部署

创建 deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: llm-api
spec:replicas: 2selector:matchLabels:app: llm-apitemplate:metadata:labels:app: llm-apispec:containers:- name: llm-apiimage: myrepo/llm-api:latestports:- containerPort: 8000

部署:

kubectl apply -f deployment.yaml

5.总结

企业文档问答(RAG):OCR 解析 + 向量数据库(FAISS)+ LLM 生成答案
ERP 财务数据分析(SQL + LLM):自然语言 → SQL → 业务报表
数据可视化(自动生成报告):Matplotlib / Plotly / Streamlit
本地 LLM 部署:Llama 3 / Mistral / Falcon,支持 GPU / CPU

三、进一步优化: 更复杂的财务分析(利润率、预测模型)

更复杂的财务分析可以围绕 利润率分析财务预测模型 展开,结合 机器学习LLM 自动分析,我们可以实现:

  1. 利润率分析(毛利率、净利率、EBITDA、行业对比)
  2. 财务预测模型(基于时间序列预测未来销售额、利润)
  3. 自动财务报告生成(结合 LLM 生成财务解读)

1. 利润率分析

利润率的核心计算公式:

  • 毛利率 = (收入 - 成本) / 收入
  • 净利率 = 净利润 / 总收入
  • EBITDA(息税折旧摊销前利润)= 营业收入 - 运营成本 + 折旧摊销

(1)计算利润率

import pandas as pd# 模拟 ERP 数据
data = {"month": ["2024-01", "2024-02", "2024-03"],"revenue": [100000, 120000, 90000],  # 总收入"cost": [60000, 70000, 55000],  # 直接成本"expenses": [20000, 25000, 22000],  # 运营费用
}df = pd.DataFrame(data)# 计算利润率
df["gross_profit"] = df["revenue"] - df["cost"]
df["gross_margin"] = df["gross_profit"] / df["revenue"]
df["net_profit"] = df["revenue"] - df["cost"] - df["expenses"]
df["net_margin"] = df["net_profit"] / df["revenue"]print(df[["month", "gross_margin", "net_margin"]])

(2)绘制利润趋势

import matplotlib.pyplot as pltplt.plot(df["month"], df["gross_margin"], marker="o", label="Gross Margin")
plt.plot(df["month"], df["net_margin"], marker="o", label="Net Margin")plt.xlabel("Month")
plt.ylabel("Profit Margin")
plt.title("Profit Margin Trend")
plt.legend()
plt.grid()
plt.show()

2. 财务预测模型(时间序列)

预测未来 6 个月的收入和利润。

(1)安装 ARIMA 预测库

pip install statsmodels pandas numpy

(2)构建时间序列预测

from statsmodels.tsa.arima.model import ARIMA
import numpy as np# 拆分数据
train_data = df["revenue"]
future_months = ["2024-04", "2024-05", "2024-06"]# 训练 ARIMA 模型
model = ARIMA(train_data, order=(5,1,0))
model_fit = model.fit()# 预测未来 3 个月收入
forecast = model_fit.forecast(steps=3)# 创建预测 DataFrame
future_df = pd.DataFrame({"month": future_months, "predicted_revenue": forecast})
print(future_df)

(3)绘制预测结果

plt.plot(df["month"], df["revenue"], marker="o", label="Actual Revenue")
plt.plot(future_df["month"], future_df["predicted_revenue"], marker="o", linestyle="dashed", label="Forecast Revenue")plt.xlabel("Month")
plt.ylabel("Revenue")
plt.title("Revenue Forecast")
plt.legend()
plt.grid()
plt.show()

3. 自动财务报告生成

基于 LLM 自动解释财务数据。

使用 Llama 3 生成分析

from transformers import pipelinellm = pipeline("text-generation", model="meta-llama/Llama-3-8B")context = f"""
公司 2024 年 1-3 月的毛利率平均为 {df['gross_margin'].mean():.2%},净利率平均为 {df['net_margin'].mean():.2%}。
预测未来 3 个月的收入如下:
- 2024-04: {forecast[0]:,.2f}
- 2024-05: {forecast[1]:,.2f}
- 2024-06: {forecast[2]:,.2f}
请基于此数据撰写一份财务分析报告。
"""response = llm(context)
print(response[0]["generated_text"])

4.总结

利润率分析(毛利率、净利率、EBITDA)
财务预测模型(时间序列 ARIMA 预测)
自动财务报告生成(LLM 生成解读)

四、API 化财务分析(前端自动调用)

 我们可以将 利润率分析、财务预测、自动财务报告 通过 FastAPI 构建成 REST API,让前端可以调用。

1. 方案设计

后端(FastAPI + Pandas + LLM)

  • 计算 毛利率、净利率、EBITDA
  • 预测 未来收入(ARIMA 时间序列)
  • 生成 财务分析报告(Llama 3)

前端(React + Chart.js + REST API)

  • 可视化 利润率曲线
  • 显示 预测数据
  • 生成 财务报告

2. 部署 FastAPI 后端

(1)安装依赖

pip install fastapi uvicorn pandas numpy statsmodels transformers

(2)编写 api.py

from fastapi import FastAPI
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
from transformers import pipelineapp = FastAPI()# 模拟 ERP 财务数据
df = pd.DataFrame({"month": ["2024-01", "2024-02", "2024-03"],"revenue": [100000, 120000, 90000],"cost": [60000, 70000, 55000],"expenses": [20000, 25000, 22000]
})# 计算利润率
df["gross_profit"] = df["revenue"] - df["cost"]
df["gross_margin"] = df["gross_profit"] / df["revenue"]
df["net_profit"] = df["revenue"] - df["cost"] - df["expenses"]
df["net_margin"] = df["net_profit"] / df["revenue"]# LLM 加载
llm = pipeline("text-generation", model="meta-llama/Llama-3-8B")@app.get("/profit-margins")
def get_profit_margins():return df[["month", "gross_margin", "net_margin"]].to_dict(orient="records")@app.get("/forecast")
def forecast_revenue():model = ARIMA(df["revenue"], order=(5,1,0))model_fit = model.fit()forecast = model_fit.forecast(steps=3)future_months = ["2024-04", "2024-05", "2024-06"]return [{"month": m, "predicted_revenue": round(r, 2)} for m, r in zip(future_months, forecast)]@app.get("/report")
def generate_financial_report():context = f"""公司 2024 年 1-3 月的毛利率平均为 {df['gross_margin'].mean():.2%},净利率平均为 {df['net_margin'].mean():.2%}。预测未来 3 个月的收入:- 2024-04: {forecast[0]:,.2f}- 2024-05: {forecast[1]:,.2f}- 2024-06: {forecast[2]:,.2f}请撰写一份财务分析报告。"""response = llm(context)return {"report": response[0]["generated_text"]}# 运行 API
# 启动命令: uvicorn api:app --reload --host 0.0.0.0 --port 8000

3. React 前端(可视化 + API 调用)

(1)安装前端依赖

npm install axios recharts

(2)创建 Dashboard.js

import { useState, useEffect } from "react";
import axios from "axios";
import { LineChart, Line, XAxis, YAxis, Tooltip, CartesianGrid } from "recharts";export default function Dashboard() {const [profitData, setProfitData] = useState([]);const [forecastData, setForecastData] = useState([]);const [report, setReport] = useState("");useEffect(() => {axios.get("http://localhost:8000/profit-margins").then(res => setProfitData(res.data));axios.get("http://localhost:8000/forecast").then(res => setForecastData(res.data));axios.get("http://localhost:8000/report").then(res => setReport(res.data.report));}, []);return (<div className="p-5"><h2 className="text-xl font-bold mb-3">📊 财务数据分析</h2><LineChart width={600} height={300} data={profitData}><CartesianGrid strokeDasharray="3 3" /><XAxis dataKey="month" /><YAxis /><Tooltip /><Line type="monotone" dataKey="gross_margin" stroke="#8884d8" name="毛利率" /><Line type="monotone" dataKey="net_margin" stroke="#82ca9d" name="净利率" /></LineChart><h3 className="text-lg font-bold mt-5">📈 未来收入预测</h3><ul>{forecastData.map((item) => (<li key={item.month}>{item.month}: ¥{item.predicted_revenue}</li>))}</ul><h3 className="text-lg font-bold mt-5">📃 自动财务报告</h3><p>{report}</p></div>);
}

4. 启动前后端

(1)启动 FastAPI

uvicorn api:app --reload --host 0.0.0.0 --port 8000
(2)启动 React
npm start

5. 访问系统

  • 访问 http://localhost:3000,查看财务数据
  • 前端会自动调用后端 API
  • 展示利润率趋势、预测数据、财务分析报告

五、增加数据权限控制

为了确保不同用户只能访问自己授权的数据,我们在 FastAPI 后端增加 JWT 鉴权角色权限控制,确保:

  1. 管理员 可以查看所有财务数据
  2. 财务人员 只能查看自己负责的部门数据
  3. 普通用户 只能访问基本的财务概览

1️.方案设计

后端(FastAPI + JWT + Role-Based Access Control)

  • JWT 认证(OAuth2 Password Flow)
  • 基于角色的权限控制(RBAC)
  • 数据库存储用户 & 权限

前端(React + JWT Token + Context API)

  • 用户登录(存 JWT)
  • 前端根据角色控制界面展示

 2.安装依赖

pip install fastapi uvicorn passlib bcrypt pyjwt python-multipart

3.FastAPI 后端

(1)创建 auth.py(用户认证 + JWT)

from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from passlib.context import CryptContext
import jwt
from datetime import datetime, timedeltaSECRET_KEY = "your_secret_key"
ALGORITHM = "HS256"app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")# 用户数据库(实际应使用数据库)
users_db = {"admin": {"username": "admin", "password": "hashed_admin_password", "role": "admin"},"finance": {"username": "finance", "password": "hashed_finance_password", "role": "finance"},"user": {"username": "user", "password": "hashed_user_password", "role": "user"},
}pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")def create_token(data: dict, expires_delta: timedelta):to_encode = data.copy()expire = datetime.utcnow() + expires_deltato_encode.update({"exp": expire})return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)@app.post("/token")
def login(form_data: OAuth2PasswordRequestForm = Depends()):user = users_db.get(form_data.username)if not user or not pwd_context.verify(form_data.password, user["password"]):raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid credentials")token = create_token({"sub": user["username"], "role": user["role"]}, timedelta(hours=1))return {"access_token": token, "token_type": "bearer"}def get_current_user(token: str = Depends(oauth2_scheme)):try:payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])return {"username": payload["sub"], "role": payload["role"]}except jwt.ExpiredSignatureError:raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Token expired")except jwt.InvalidTokenError:raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token")

(2)修改 api.py(财务数据权限控制)

from fastapi import Depends
from auth import get_current_user@app.get("/profit-margins")
def get_profit_margins(user: dict = Depends(get_current_user)):if user["role"] not in ["admin", "finance"]:raise HTTPException(status_code=403, detail="Permission denied")return df[["month", "gross_margin", "net_margin"]].to_dict(orient="records")@app.get("/forecast")
def forecast_revenue(user: dict = Depends(get_current_user)):if user["role"] != "admin":raise HTTPException(status_code=403, detail="Permission denied")return [{"month": m, "predicted_revenue": round(r, 2)} for m, r in zip(["2024-04", "2024-05", "2024-06"], forecast)]

4.React 前端

(1)安装依赖

npm install jwt-decode axios

(2)创建 AuthContext.js(管理登录状态)

import { createContext, useState, useEffect } from "react";
import jwtDecode from "jwt-decode";
import axios from "axios";export const AuthContext = createContext();export const AuthProvider = ({ children }) => {const [user, setUser] = useState(null);const [token, setToken] = useState(localStorage.getItem("token") || "");useEffect(() => {if (token) {const decoded = jwtDecode(token);setUser(decoded);}}, [token]);const login = async (username, password) => {try {const res = await axios.post("http://localhost:8000/token", new URLSearchParams({ username, password }));setToken(res.data.access_token);localStorage.setItem("token", res.data.access_token);} catch (error) {console.error("Login failed", error);}};const logout = () => {setToken("");setUser(null);localStorage.removeItem("token");};return (<AuthContext.Provider value={{ user, login, logout }}>{children}</AuthContext.Provider>);
};

(3)修改 Dashboard.js(按角色控制显示内容)

import { useContext, useEffect, useState } from "react";
import { AuthContext } from "./AuthContext";
import axios from "axios";export default function Dashboard() {const { user, logout } = useContext(AuthContext);const [profitData, setProfitData] = useState([]);const [forecastData, setForecastData] = useState([]);useEffect(() => {if (!user) return;const headers = { Authorization: `Bearer ${localStorage.getItem("token")}` };if (user.role === "admin" || user.role === "finance") {axios.get("http://localhost:8000/profit-margins", { headers }).then(res => setProfitData(res.data)).catch(err => console.error("Profit data error", err));}if (user.role === "admin") {axios.get("http://localhost:8000/forecast", { headers }).then(res => setForecastData(res.data)).catch(err => console.error("Forecast data error", err));}}, [user]);if (!user) {return <p>请登录查看财务数据</p>;}return (<div className="p-5"><h2 className="text-xl font-bold mb-3">📊 财务数据分析 ({user.role})</h2>{profitData.length > 0 && (<div><h3>💰 利润率数据</h3><ul>{profitData.map(item => (<li key={item.month}>{item.month}: 毛利率 {item.gross_margin.toFixed(2)}, 净利率 {item.net_margin.toFixed(2)}</li>))}</ul></div>)}{user.role === "admin" && forecastData.length > 0 && (<div><h3>📈 未来收入预测</h3><ul>{forecastData.map(item => (<li key={item.month}>{item.month}: ¥{item.predicted_revenue}</li>))}</ul></div>)}<button onClick={logout} className="mt-5 px-4 py-2 bg-red-500 text-white rounded">登出</button></div>);
}

5.结果

  1. 登录后端获取 JWT 令牌
  2. 前端根据角色展示不同内容
  3. 后端 API 权限控制
  4. 管理员能访问预测,财务人员只能查看利润率,普通用户无权限

六、加入多维度分析(产品利润率、区域销售趋势)

 为了满足 产品利润率分析区域销售趋势 的需求,我们将在 后端 API + 前端仪表盘 增加:

  1. 📈 产品维度 → 每个产品的利润率趋势
  2. 🌍 区域维度 → 各地区销售额趋势
  3. 🛡️ 数据权限控制 → 不同角色访问不同维度数据

1.方案设计

后端(FastAPI)

  • 利润率分析(按产品)
  • 销售趋势分析(按区域)
  • RBAC 角色权限控制

前端(React + Recharts)

  • 利润率折线图 📈
  • 区域销售柱状图 📊

2.FastAPI 后端

 (1)安装 Pandas & FastAPI 依赖

pip install fastapi uvicorn pandas jwt python-multipart

(2)数据示例

我们用 Pandas 生成模拟数据:

import pandas as pd
import numpy as np# 产品利润率数据
product_data = pd.DataFrame({"month": pd.date_range("2024-01-01", periods=6, freq="M").strftime("%Y-%m"),"product": ["A", "B", "C"] * 2,"profit_margin": np.random.uniform(10, 30, 6)
})# 区域销售趋势数据
region_data = pd.DataFrame({"month": pd.date_range("2024-01-01", periods=6, freq="M").strftime("%Y-%m"),"region": ["North", "South", "East", "West"] * 1,"sales": np.random.uniform(50000, 150000, 4)
})

(3)后端 API

from fastapi import FastAPI, Depends, HTTPException
from auth import get_current_user
import pandas as pdapp = FastAPI()@app.get("/product-profit")
def get_product_profit(user: dict = Depends(get_current_user)):if user["role"] not in ["admin", "finance"]:raise HTTPException(status_code=403, detail="Permission denied")return product_data.to_dict(orient="records")@app.get("/sales-trend")
def get_sales_trend(user: dict = Depends(get_current_user)):if user["role"] != "admin":raise HTTPException(status_code=403, detail="Permission denied")return region_data.to_dict(orient="records")

3.React 前端

(1)安装 Recharts

npm install recharts axios jwt-decode

 (2)更新 Dashboard.js

import { useContext, useEffect, useState } from "react";
import { AuthContext } from "./AuthContext";
import axios from "axios";
import { LineChart, Line, BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend } from "recharts";export default function Dashboard() {const { user, logout } = useContext(AuthContext);const [profitData, setProfitData] = useState([]);const [salesData, setSalesData] = useState([]);useEffect(() => {if (!user) return;const headers = { Authorization: `Bearer ${localStorage.getItem("token")}` };if (user.role === "admin" || user.role === "finance") {axios.get("http://localhost:8000/product-profit", { headers }).then(res => setProfitData(res.data)).catch(err => console.error("Product profit error", err));}if (user.role === "admin") {axios.get("http://localhost:8000/sales-trend", { headers }).then(res => setSalesData(res.data)).catch(err => console.error("Sales trend error", err));}}, [user]);if (!user) return <p>请登录查看数据</p>;return (<div className="p-5"><h2 className="text-xl font-bold mb-3">📊 财务数据分析 ({user.role})</h2>{profitData.length > 0 && (<div><h3 className="mt-4">📈 产品利润率分析</h3><LineChart width={600} height={300} data={profitData}><XAxis dataKey="month" /><YAxis /><Tooltip /><Legend /><Line type="monotone" dataKey="profit_margin" stroke="#8884d8" /></LineChart></div>)}{user.role === "admin" && salesData.length > 0 && (<div><h3 className="mt-4">📊 区域销售趋势</h3><BarChart width={600} height={300} data={salesData}><CartesianGrid strokeDasharray="3 3" /><XAxis dataKey="region" /><YAxis /><Tooltip /><Legend /><Bar dataKey="sales" fill="#82ca9d" /></BarChart></div>)}<button onClick={logout} className="mt-5 px-4 py-2 bg-red-500 text-white rounded">登出</button></div>);
}

4.角色权限

角色访问权限
Admin产品利润率 + 区域销售趋势
Finance仅产品利润率
User无权限

5.运行方式

(1)启动后端

uvicorn api:app --reload

(2)运行 React

npm start

6.最终效果

📈 产品利润率折线图
📊 区域销售趋势柱状图
🛡️ 基于角色的权限控制

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词