save code
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -3,11 +3,12 @@ from fastapi import APIRouter, Depends, HTTPException, status
|
||||
from fastapi.security import OAuth2PasswordRequestForm
|
||||
from sqlalchemy.orm import Session
|
||||
import os
|
||||
import bcrypt
|
||||
from app.config import settings
|
||||
from app.database.database import get_db
|
||||
from app.models.user import User
|
||||
from app.schemas.auth import Token
|
||||
from app.common.utils import verify_password, create_access_token
|
||||
from app.common.utils import create_access_token
|
||||
|
||||
router = APIRouter(prefix="/auth", tags=["认证"])
|
||||
|
||||
@@ -17,8 +18,8 @@ def login(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depend
|
||||
"""用户登录"""
|
||||
user = db.query(User).filter(User.username == form_data.username).first()
|
||||
|
||||
# 密码验证:比较用户存储的密码
|
||||
if not user or form_data.password != user.password:
|
||||
# 密码验证:使用bcrypt直接验证密码
|
||||
if not user or not bcrypt.checkpw(form_data.password.encode('utf-8'), user.password.encode('utf-8')):
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail="Incorrect username or password",
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from typing import List
|
||||
from typing import List, Optional
|
||||
from fastapi import APIRouter, Depends, HTTPException, status
|
||||
from sqlalchemy.orm import Session
|
||||
from app.database.database import get_db
|
||||
@@ -16,11 +16,32 @@ router = APIRouter(prefix="/projects", tags=["项目管理"])
|
||||
def get_projects(
|
||||
skip: int = 0,
|
||||
limit: int = 100,
|
||||
start_date: Optional[str] = None,
|
||||
end_date: Optional[str] = None,
|
||||
min_budget: Optional[int] = None,
|
||||
max_budget: Optional[int] = None,
|
||||
db: Session = Depends(get_db),
|
||||
current_user: User = Depends(get_current_active_user)
|
||||
):
|
||||
"""获取项目列表"""
|
||||
projects = db.query(Project).offset(skip).limit(limit).all()
|
||||
projects = db.query(Project)
|
||||
|
||||
# 按开始日期筛选
|
||||
if start_date:
|
||||
projects = projects.filter(Project.start_date >= start_date)
|
||||
|
||||
# 按结束日期筛选
|
||||
if end_date:
|
||||
projects = projects.filter(Project.end_date <= end_date)
|
||||
|
||||
# 按预算范围筛选
|
||||
if min_budget is not None:
|
||||
projects = projects.filter(Project.budget >= min_budget)
|
||||
|
||||
if max_budget is not None:
|
||||
projects = projects.filter(Project.budget <= max_budget)
|
||||
|
||||
projects = projects.offset(skip).limit(limit).all()
|
||||
return projects
|
||||
|
||||
|
||||
@@ -38,12 +59,24 @@ def create_project(
|
||||
)
|
||||
# 创建新项目
|
||||
db_project = Project(
|
||||
project_code=project.project_code,
|
||||
name=project.name,
|
||||
project_type=project.project_type,
|
||||
description=project.description,
|
||||
department=project.department,
|
||||
contract_amount=project.contract_amount,
|
||||
project_manager=project.project_manager,
|
||||
client_company=project.client_company,
|
||||
client_contact=project.client_contact,
|
||||
contract_date=project.contract_date,
|
||||
budget=project.budget,
|
||||
start_date=project.start_date,
|
||||
end_date=project.end_date,
|
||||
planned_end_date=project.planned_end_date,
|
||||
actual_end_date=project.actual_end_date,
|
||||
progress=project.progress,
|
||||
actual_received_amount=project.actual_received_amount,
|
||||
payment_completion_rate=project.payment_completion_rate,
|
||||
payment_terms=project.payment_terms,
|
||||
status=project.status,
|
||||
created_by=current_user.id
|
||||
)
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,4 +1,4 @@
|
||||
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey
|
||||
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, Float
|
||||
from sqlalchemy.sql import func
|
||||
from app.database.database import Base
|
||||
|
||||
@@ -8,13 +8,25 @@ class Project(Base):
|
||||
__tablename__ = "projects"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
name = Column(String(100), nullable=False)
|
||||
description = Column(Text)
|
||||
created_by = Column(Integer, ForeignKey("users.id"), nullable=False)
|
||||
department = Column(String(50), nullable=False)
|
||||
budget = Column(Integer)
|
||||
start_date = Column(DateTime(timezone=True))
|
||||
end_date = Column(DateTime(timezone=True))
|
||||
status = Column(String(20), default="pending")
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
||||
project_code = Column(String(50), unique=True, index=True) # 项目编号
|
||||
name = Column(String(100), nullable=False) # 项目名称
|
||||
project_type = Column(String(50)) # 工程类别
|
||||
description = Column(Text) # 项目描述
|
||||
created_by = Column(Integer, ForeignKey("users.id"), nullable=False) # 创建人
|
||||
department = Column(String(50), nullable=False) # 所属部门
|
||||
contract_amount = Column(Float) # 合同金额(万元)
|
||||
project_manager = Column(String(100)) # 项目负责人
|
||||
client_company = Column(String(100)) # 建设单位
|
||||
client_contact = Column(String(100)) # 建设单位联系人
|
||||
contract_date = Column(DateTime(timezone=True)) # 合同签订日期
|
||||
budget = Column(Integer) # 预算
|
||||
start_date = Column(DateTime(timezone=True)) # 开始日期
|
||||
planned_end_date = Column(DateTime(timezone=True)) # 计划结束日期
|
||||
actual_end_date = Column(DateTime(timezone=True)) # 实际结束日期
|
||||
progress = Column(Float, default=0.0) # 累计进度(%)
|
||||
actual_received_amount = Column(Float, default=0.0) # 实际收款金额(万元)
|
||||
payment_completion_rate = Column(Float, default=0.0) # 回款完成率(%)
|
||||
payment_terms = Column(Text) # 付款方式
|
||||
status = Column(String(20), default="pending") # 状态
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now()) # 创建时间
|
||||
updated_at = Column(DateTime(timezone=True), onupdate=func.now()) # 更新时间
|
||||
|
||||
Binary file not shown.
@@ -5,13 +5,25 @@ from typing import Optional
|
||||
|
||||
class ProjectBase(BaseModel):
|
||||
"""项目基础模型"""
|
||||
name: str
|
||||
description: Optional[str] = None
|
||||
department: str
|
||||
budget: Optional[int] = None
|
||||
start_date: Optional[datetime] = None
|
||||
end_date: Optional[datetime] = None
|
||||
status: Optional[str] = "pending"
|
||||
project_code: Optional[str] = None # 项目编号
|
||||
name: str # 项目名称
|
||||
project_type: Optional[str] = None # 工程类别
|
||||
description: Optional[str] = None # 项目描述
|
||||
department: str # 所属部门
|
||||
contract_amount: Optional[float] = None # 合同金额(万元)
|
||||
project_manager: Optional[str] = None # 项目负责人
|
||||
client_company: Optional[str] = None # 建设单位
|
||||
client_contact: Optional[str] = None # 建设单位联系人
|
||||
contract_date: Optional[datetime] = None # 合同签订日期
|
||||
budget: Optional[int] = None # 预算
|
||||
start_date: Optional[datetime] = None # 开始日期
|
||||
planned_end_date: Optional[datetime] = None # 计划结束日期
|
||||
actual_end_date: Optional[datetime] = None # 实际结束日期
|
||||
progress: Optional[float] = 0.0 # 累计进度(%)
|
||||
actual_received_amount: Optional[float] = 0.0 # 实际收款金额(万元)
|
||||
payment_completion_rate: Optional[float] = 0.0 # 回款完成率(%)
|
||||
payment_terms: Optional[str] = None # 付款方式
|
||||
status: Optional[str] = "pending" # 状态
|
||||
|
||||
|
||||
class ProjectCreate(ProjectBase):
|
||||
@@ -21,12 +33,24 @@ class ProjectCreate(ProjectBase):
|
||||
|
||||
class ProjectUpdate(BaseModel):
|
||||
"""更新项目模型"""
|
||||
project_code: Optional[str] = None
|
||||
name: Optional[str] = None
|
||||
project_type: Optional[str] = None
|
||||
description: Optional[str] = None
|
||||
department: Optional[str] = None
|
||||
contract_amount: Optional[float] = None
|
||||
project_manager: Optional[str] = None
|
||||
client_company: Optional[str] = None
|
||||
client_contact: Optional[str] = None
|
||||
contract_date: Optional[datetime] = None
|
||||
budget: Optional[int] = None
|
||||
start_date: Optional[datetime] = None
|
||||
end_date: Optional[datetime] = None
|
||||
planned_end_date: Optional[datetime] = None
|
||||
actual_end_date: Optional[datetime] = None
|
||||
progress: Optional[float] = None
|
||||
actual_received_amount: Optional[float] = None
|
||||
payment_completion_rate: Optional[float] = None
|
||||
payment_terms: Optional[str] = None
|
||||
status: Optional[str] = None
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user