dashboard/backend/init_db.py
2025-06-09 14:59:40 +08:00

226 lines
8.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()