dashboard/backend/init_db.py

226 lines
8.9 KiB
Python
Raw Normal View History

2025-06-09 14:59:40 +08:00
import json
from sqlalchemy.orm import Session
from database import engine, SessionLocal, Base
import models
import main # 导入原有假数据
import logging
# 设置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# 默认仪表盘数据如果main.py中没有定义
default_dashboard_data = {
"paperCount": 3500,
"patentCount": 2000,
"highImpactPapers": 100,
"keyProjects": 50,
"fundingAmount": "500万元",
"researcherStats": {
"academician": 12,
"chiefScientist": 28,
"distinguishedProfessor": 56,
"youngScientist": 120
},
"newsData": [
{"title": "我校科研团队在量子计算领域取得重大突破", "date": "2023-05-15"},
{"title": "张教授团队论文被Nature收录", "date": "2023-04-28"},
{"title": "校长率团访问美国麻省理工学院商讨合作事宜", "date": "2023-04-15"},
{"title": "我校获批3项国家重点研发计划", "date": "2023-03-20"},
{"title": "2023年度国家自然科学基金申请工作启动", "date": "2023-02-10"}
]
}
# 创建所有表
def create_tables():
Base.metadata.create_all(bind=engine)
logger.info("数据库表已创建")
# 导入用户数据
def import_users(db: Session):
# 检查是否已存在用户
existing_users = db.query(models.User).count()
if existing_users == 0:
for username, user_data in main.fake_users_db.items():
db_user = models.User(
username=user_data["username"],
email=user_data.get("email"),
full_name=user_data.get("full_name"),
hashed_password=user_data["hashed_password"],
disabled=user_data.get("disabled", False)
)
db.add(db_user)
db.commit()
logger.info("用户数据已导入")
else:
logger.info("用户数据已存在,跳过导入")
# 导入人才数据
def import_talents(db: Session):
# 检查是否已存在人才数据
existing_talents = db.query(models.Talent).count()
if existing_talents == 0:
for talent_data in main.talents:
# 处理evaluationData字段 - 确保是JSON格式
evaluation_data = talent_data.get("evaluationData")
db_talent = models.Talent(
id=talent_data["id"],
name=talent_data["name"],
gender=talent_data.get("gender"),
birthDate=talent_data.get("birthDate"),
title=talent_data.get("title"),
position=talent_data.get("position"),
education=talent_data.get("education"),
address=talent_data.get("address"),
academicDirection=talent_data.get("academicDirection"),
talentPlan=talent_data.get("talentPlan"),
officeLocation=talent_data.get("officeLocation"),
email=talent_data.get("email"),
phone=talent_data.get("phone"),
tutorType=talent_data.get("tutorType"),
papers=talent_data.get("papers"),
projects=talent_data.get("projects"),
photo=talent_data.get("photo"),
eduWorkHistory=talent_data.get("eduWorkHistory"),
researchDirection=talent_data.get("researchDirection"),
recentProjects=talent_data.get("recentProjects"),
representativePapers=talent_data.get("representativePapers"),
patents=talent_data.get("patents"),
evaluationData=evaluation_data
)
db.add(db_talent)
db.commit()
logger.info("人才数据已导入")
else:
logger.info("人才数据已存在,跳过导入")
# 导入工程研究中心数据
def import_labs(db: Session):
# 检查是否已存在工程研究中心数据
existing_labs = db.query(models.Lab).count()
if existing_labs == 0:
for lab_data in main.labs:
# 处理evaluationData字段 - 确保是JSON格式
evaluation_data = lab_data.get("evaluationData")
db_lab = models.Lab(
id=lab_data["id"],
name=lab_data["name"],
personnel=lab_data.get("personnel"),
nationalProjects=lab_data.get("nationalProjects"),
otherProjects=lab_data.get("otherProjects"),
achievements=lab_data.get("achievements"),
labAchievements=lab_data.get("labAchievements"),
image=lab_data.get("image"),
score=lab_data.get("score"),
evaluationData=evaluation_data
)
db.add(db_lab)
db.commit()
logger.info("工程研究中心数据已导入")
else:
logger.info("工程研究中心数据已存在,跳过导入")
# 导入仪表盘数据
def import_dashboard(db: Session):
# 检查是否已存在仪表盘数据
existing_dashboard = db.query(models.DashboardData).count()
if existing_dashboard == 0:
# 优先使用main.py中的数据如果不存在则使用默认数据
dashboard_data = getattr(main, "dashboard_data", default_dashboard_data)
# 创建仪表盘记录
db_dashboard = models.DashboardData(
id=1, # 主键ID设为1
paperCount=dashboard_data["paperCount"],
patentCount=dashboard_data["patentCount"],
highImpactPapers=dashboard_data["highImpactPapers"],
keyProjects=dashboard_data["keyProjects"],
fundingAmount=dashboard_data["fundingAmount"],
researcherStats=dashboard_data["researcherStats"]
)
db.add(db_dashboard)
db.flush() # 立即写入数据库获取ID
# 创建新闻数据记录
for news_item in dashboard_data["newsData"]:
db_news = models.News(
title=news_item["title"],
date=news_item["date"],
dashboard_id=db_dashboard.id
)
db.add(db_news)
db.commit()
logger.info("仪表盘和新闻数据已导入")
else:
logger.info("仪表盘数据已存在,跳过导入")
# 导入默认维度
def import_dimensions(db: Session):
# 人才评估维度
talent_dimensions = [
{"name": "学术成果", "weight": 1.0, "category": "talent", "description": "包括论文发表、专著、专利等"},
{"name": "科研项目", "weight": 1.0, "category": "talent", "description": "承担的科研项目数量和级别"},
{"name": "人才引进", "weight": 1.0, "category": "talent", "description": "引进的人才数量和质量"},
{"name": "学术影响力", "weight": 1.0, "category": "talent", "description": "学术引用和影响力指标"},
{"name": "教学质量", "weight": 1.0, "category": "talent", "description": "教学评估和学生反馈"},
{"name": "社会服务", "weight": 1.0, "category": "talent", "description": "社会服务和贡献"}
]
# 工程研究中心评估维度
lab_dimensions = [
{"name": "科研产出", "weight": 1.0, "category": "lab", "description": "工程研究中心科研成果产出"},
{"name": "人才培养", "weight": 1.0, "category": "lab", "description": "培养的研究生和博士后数量"},
{"name": "项目承担", "weight": 1.0, "category": "lab", "description": "承担的科研项目数量和级别"},
{"name": "设备利用", "weight": 1.0, "category": "lab", "description": "设备利用率和效益"},
{"name": "学术交流", "weight": 1.0, "category": "lab", "description": "国内外学术交流和合作"},
{"name": "社会服务", "weight": 1.0, "category": "lab", "description": "社会服务和贡献"}
]
# 检查是否已存在维度
existing_dimensions = db.query(models.Dimension).count()
if existing_dimensions == 0:
# 添加人才评估维度
for dim in talent_dimensions:
db_dimension = models.Dimension(**dim)
db.add(db_dimension)
# 添加工程研究中心评估维度
for dim in lab_dimensions:
db_dimension = models.Dimension(**dim)
db.add(db_dimension)
db.commit()
logger.info("默认评估维度已导入")
else:
logger.info("评估维度已存在,跳过导入")
# 主函数
def init_db():
# 创建表结构
create_tables()
# 获取数据库会话
db = SessionLocal()
try:
# 导入各类数据
import_users(db)
import_talents(db)
import_labs(db)
import_dashboard(db)
import_dimensions(db)
logger.info("数据库初始化完成!")
except Exception as e:
logger.error(f"数据库初始化失败: {e}")
finally:
db.close()
# 直接运行脚本时执行初始化
if __name__ == "__main__":
init_db()