226 lines
8.9 KiB
Python
226 lines
8.9 KiB
Python
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() |