涵盖医院全部科研活动的全方位科研项目管理系统
小李:最近我们公司要开发一个科研项目管理系统,听说你们团队之前做过类似的项目?
小王:是啊,我们之前在晋中那边有一个项目,就是关于科研项目管理的。不过这次我们打算用更现代化的技术来重构一下系统。
小李:哦,那具体是怎么设计的?能给我讲讲吗?
小王:当然可以。首先,我们需要考虑的是系统的功能模块。比如,用户管理、项目申请、审批流程、进度跟踪、成果管理等等。
小李:听起来挺复杂的。那你们是怎么处理这些模块之间的交互的呢?
小王:我们采用了分层架构,前端用Vue.js,后端用Spring Boot,数据库用MySQL。这样结构清晰,也方便后续维护。
小李:那你们有没有考虑到横向项目的管理需求?
小王:对,横向项目是我们重点支持的对象。这类项目通常是由企业或机构委托的,需要有明确的合作单位和资金来源。
小李:那系统是如何支持横向项目的呢?
小王:我们在系统里专门设置了“横向项目”模块,可以记录合作单位、合同编号、经费到账情况等信息。同时,还支持项目进度的实时更新和成果的展示。
小李:听起来很实用。那你们有没有写一些示例代码,我可以参考一下?
小王:当然有。我给你看一段关于横向项目数据存储的代码。
小李:好的,请发过来。
小王:这是Java中的实体类代码,用于表示横向项目的信息。
public class HorizontalProject {
private Long id;
private String projectName;
private String partnerUnit;
private String contractNumber;
private BigDecimal fundingAmount;
private Date startDate;
private Date endDate;
private String status;
// Getters and Setters
// ...
}
小李:这个类看起来挺标准的。那数据库表结构是怎样的?
小王:我们使用了MySQL数据库,表结构如下:
CREATE TABLE horizontal_project (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
project_name VARCHAR(255) NOT NULL,
partner_unit VARCHAR(255),
contract_number VARCHAR(100),
funding_amount DECIMAL(10,2),
start_date DATE,
end_date DATE,
status VARCHAR(50)
);
小李:嗯,这和实体类对应得上。那你们是怎么处理项目状态的?比如,是否已立项、进行中、已完成等?
小王:我们定义了一个枚举类型,用来表示不同的状态,例如:PENDING(待审批)、IN_PROGRESS(进行中)、COMPLETED(已完成)。
小李:那这个枚举是怎么在系统中使用的?
小王:在后端服务中,我们通过状态机来控制项目的状态流转。比如,当项目提交后,状态变为PENDING,审批通过后变为IN_PROGRESS,完成后变为COMPLETED。
小李:听起来像是一个状态机的设计模式。那你们有没有使用一些框架来简化状态管理?
小王:是的,我们使用了Spring State Machine来管理项目状态的变化。它帮助我们实现了状态之间的转换逻辑,并且可以记录每个状态变更的详细信息。
小李:那这个状态机是怎么集成到系统中的?
小王:我们首先配置了状态机的各个状态和事件,然后在业务逻辑中调用状态机的transition方法来改变状态。
小李:那你能给我看一下相关的代码吗?
小王:好的,这是我写的StateMachineConfig类,用于配置状态机。
@Configuration
@EnableStateMachine
public class StateMachineConfig extends EnumStateMachineConfigurerAdapter {
@Override
public void configure(StateMachineStateConfigurer states) throws Exception {
states.withStates()
.initial(HorizontalProjectStatus.PENDING)
.state(HorizontalProjectStatus.IN_PROGRESS)
.state(HorizontalProjectStatus.COMPLETED);
}
@Override
public void configure(StateMachineTransitionConfigurer transitions) throws Exception {
transitions
.withExternal().source(HorizontalProjectStatus.PENDING).target(HorizontalProjectStatus.IN_PROGRESS).event(ProjectEvent.APPROVE)
.and()
.withExternal().source(HorizontalProjectStatus.IN_PROGRESS).target(HorizontalProjectStatus.COMPLETED).event(ProjectEvent.COMPLETE);
}
}
小李:这段代码看起来不错。那在业务逻辑中怎么调用这个状态机?
小王:我们通过注入StateMachine对象,在业务方法中调用其sendEvent方法。
小李:那你能给个例子吗?
小王:好的,这是一个简单的Service方法,用于批准项目。
@Service
public class ProjectService {
@Autowired
private StateMachine stateMachine;
public void approveProject(Long projectId) {
// 获取项目信息
HorizontalProject project = projectRepository.findById(projectId).orElseThrow(...);
// 发送审批事件
stateMachine.sendEvent(ProjectEvent.APPROVE);
project.setStatus(HorizontalProjectStatus.IN_PROGRESS);
projectRepository.save(project);
}
}
小李:明白了。那你们有没有考虑过权限控制的问题?比如,不同角色的人访问不同的项目信息?
小王:是的,我们使用了Spring Security来实现权限控制。每个用户有不同的角色,比如管理员、项目负责人、普通成员等。
小李:那权限是怎么分配的?
小王:我们通过RBAC模型来管理权限。每个角色拥有不同的权限,比如查看所有项目、只能查看自己负责的项目等。
小李:那在代码中是怎么体现的?
小王:我们使用了@PreAuthorize注解来限制方法的访问权限。
小李:那你能给我看看具体的例子吗?
小王:好的,这是一个获取所有项目的接口,只有管理员才能访问。
@GetMapping("/projects")
@PreAuthorize("hasRole('ADMIN')")
public List getAllProjects() {
return projectService.getAllProjects();
}

小李:明白了。那你们有没有做前后端分离的架构?
小王:是的,我们采用前后端分离的方式,前端使用Vue.js,后端提供RESTful API。
小李:那你们是怎么处理跨域问题的?
小王:我们使用了Spring的CORS配置,允许前端域名访问API。
小李:那具体怎么配置的?
小王:我们在配置类中添加了CORS设置。
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://localhost:8081")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*");
}
}
小李:看来你们的系统已经非常成熟了。那在晋中地区,这个系统有没有实际应用?
小王:有的,我们在晋中的一些高校和研究机构部署了这个系统,特别是针对横向项目,效果非常好。
小李:那他们反馈怎么样?
小王:反馈很好,特别是在项目管理和进度追踪方面,提高了工作效率。
小李:看来这个系统确实很有价值。谢谢你的讲解!
小王:不客气,如果有需要,我们可以一起优化这个系统。
Copyright © 医院科研管理系统