涵盖医院全部科研活动的全方位科研项目管理系统
小明:李老师,我最近在做一个关于科研管理平台的项目,想请教您一些问题。
李老师:当然可以,你对这个平台有什么具体的需求吗?
小明:我们学校现在需要一个科研管理平台,用来管理教师的科研项目、经费、成果等信息。我想知道如何用Python来搭建这样一个系统。
李老师:这确实是一个很有意义的项目。首先,你需要明确系统的功能模块。比如用户管理、项目管理、数据统计、权限控制等。
小明:明白了。那我们可以先从数据库设计开始,您能给我一个例子吗?
李老师:好的,下面是一个简单的数据库模型设计,使用的是SQLAlchemy,这是Python中常用的ORM框架。
# models.py
from sqlalchemy import Column, Integer, String, Date, Float, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
email = Column(String(100), unique=True)
role = Column(String(20)) # 'admin', 'researcher', 'student'
class Project(Base):
__tablename__ = 'projects'
id = Column(Integer, primary_key=True)
title = Column(String(100))
start_date = Column(Date)
end_date = Column(Date)
budget = Column(Float)
user_id = Column(Integer, ForeignKey('users.id'))
user = relationship("User", back_populates="projects")
User.projects = relationship("Project", order_by=Project.id, back_populates="user")
小明:谢谢,这个模型看起来很清晰。接下来我应该怎么处理前端页面呢?
李老师:你可以使用Flask或Django这样的Web框架来快速搭建后端服务,然后用HTML/CSS/JavaScript构建前端页面。如果你希望更现代一点,可以用React或Vue.js做前端。
小明:那我可以先用Flask写一个简单的接口,比如获取所有项目的信息,您能给个例子吗?
李老师:当然可以,下面是一个用Flask写的简单API接口,用于获取所有项目的数据。
# app.py
from flask import Flask, jsonify
from models import Base, engine, Session
from models import Project
app = Flask(__name__)
# 初始化数据库
Base.metadata.create_all(engine)
session = Session()
@app.route('/projects', methods=['GET'])
def get_projects():
projects = session.query(Project).all()
return jsonify([{
'id': p.id,
'title': p.title,
'start_date': p.start_date.strftime('%Y-%m-%d'),
'end_date': p.end_date.strftime('%Y-%m-%d'),
'budget': p.budget
} for p in projects])
if __name__ == '__main__':
app.run(debug=True)
小明:这个接口看起来没问题。那权限控制怎么实现呢?比如管理员和普通用户访问不同的页面。
李老师:权限控制是关键部分。你可以使用Flask-Login或者Django的认证系统来管理用户登录状态,并根据角色分配不同权限。
小明:那我可以写一个登录接口,验证用户身份吗?
李老师:是的,下面是一个简单的登录接口示例,使用JWT(JSON Web Token)进行身份验证。
# auth.py
from flask import Flask, request, jsonify
from flask_jwt import JWT, jwt_required, current_identity
from models import User, Session
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
# 模拟用户数据库
def authenticate(username, password):
user = session.query(User).filter_by(email=username).first()
if user and user.password == password:
return user
def identity(payload):
user_id = payload['identity']
return session.query(User).get(user_id)
jwt = JWT(app, authenticate, identity)
@app.route('/login', methods=['POST'])
def login():
data = request.get_json()
username = data.get('email')
password = data.get('password')
user = session.query(User).filter_by(email=username).first()
if user and user.password == password:
token = jwt.encode_token(user.id)
return jsonify({'token': token.decode('utf-8')})
else:
return jsonify({'error': 'Invalid credentials'}), 401
@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
return jsonify({'message': f'Hello, {current_identity.name}'})
if __name__ == '__main__':
app.run(debug=True)
小明:这个JWT机制挺方便的。那如何集成到前端页面中呢?
李老师:前端可以通过发送POST请求到/login接口获取Token,然后在后续请求中将Token放在Header里,比如Authorization: Bearer <token>。
小明:明白了。那如果我要展示某个用户的项目列表,该怎么实现?
李老师:你可以根据当前登录用户ID查询对应的项目,下面是一个示例接口。
@app.route('/my-projects', methods=['GET'])
@jwt_required()
def my_projects():
user_id = current_identity.id
projects = session.query(Project).filter_by(user_id=user_id).all()
return jsonify([{
'id': p.id,
'title': p.title,
'start_date': p.start_date.strftime('%Y-%m-%d'),
'end_date': p.end_date.strftime('%Y-%m-%d'),
'budget': p.budget
} for p in projects])
小明:这个接口应该可以满足需求。那数据可视化部分怎么处理?比如显示项目的预算分布情况。
李老师:你可以使用ECharts或D3.js这类图表库来实现数据可视化。例如,用Flask返回JSON数据,前端用JavaScript绘制图表。
小明:那我可以先写一个返回预算数据的接口吗?
李老师:当然可以,下面是一个简单的预算统计接口。
@app.route('/budget-stats', methods=['GET'])
@jwt_required()
def budget_stats():
total_budget = session.query(func.sum(Project.budget)).scalar()
project_count = session.query(func.count(Project.id)).scalar()
avg_budget = total_budget / project_count if project_count > 0 else 0
return jsonify({
'total_budget': total_budget,
'project_count': project_count,
'average_budget': avg_budget
})
小明:这样就能在前端展示总预算和平均预算了。那有没有可能加入搜索功能,比如按项目名称搜索?
李老师:当然可以,你可以添加一个搜索接口,根据关键词过滤项目。
@app.route('/search-projects', methods=['GET'])
@jwt_required()
def search_projects():
keyword = request.args.get('keyword')
projects = session.query(Project).filter(Project.title.contains(keyword)).all()
return jsonify([{
'id': p.id,
'title': p.title,
'start_date': p.start_date.strftime('%Y-%m-%d'),
'end_date': p.end_date.strftime('%Y-%m-%d'),
'budget': p.budget
} for p in projects])

小明:这个功能很实用。那么,整个平台是否还需要考虑安全性问题?比如防止SQL注入或者XSS攻击?
李老师:是的,安全性非常重要。你应该使用参数化查询而不是字符串拼接,避免SQL注入。同时,在前端渲染数据时要进行转义,防止XSS攻击。
小明:明白了。那我可以使用WTForms或者Flask-WTF来处理表单验证吗?
李老师:是的,这些库可以帮助你更好地处理表单输入,提高系统的安全性和可维护性。
小明:谢谢李老师,我现在对科研管理平台的开发思路更加清晰了。
李老师:不客气,科研管理平台是一个复杂的系统,但只要一步步来,就一定能成功。如果有其他问题,随时问我。
Copyright © 医院科研管理系统