高校科研信息管理系统是当前教育信息化建设中的重要组成部分,它能够有效整合高校科研资源,规范科研管理流程,提升科研工作效率。这个基于SpringBoot+Vue+MySQL的全栈解决方案,为高校科研管理部门提供了一个开箱即用的信息化管理平台。
作为一名长期从事教育信息化系统开发的工程师,我参与过多个高校科研管理系统的设计与实施。这套源码最大的价值在于它采用了前后端分离的现代化架构,后端使用SpringBoot框架提供RESTful API接口,前端采用Vue.js构建响应式用户界面,数据库选用稳定可靠的MySQL。整套系统架构清晰,代码规范,部署简单,特别适合作为高校信息化建设的参考案例或二次开发基础。
选择SpringBoot作为后端框架主要基于以下考虑:
Vue.js作为前端框架的优势:
MySQL数据库的选择理由:
系统主要包含以下核心模块:
后端采用典型的三层架构:
code复制src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── university/
│ │ └── research/
│ │ ├── config/ # 配置类
│ │ ├── controller/ # 控制器层
│ │ ├── dao/ # 数据访问层
│ │ ├── entity/ # 实体类
│ │ ├── service/ # 业务逻辑层
│ │ └── util/ # 工具类
│ └── resources/
│ ├── application.yml # 应用配置
│ └── mapper/ # MyBatis映射文件
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/admin/**").hasRole("ADMIN")
.antMatchers("/api/teacher/**").hasRole("TEACHER")
.anyRequest().authenticated()
.and()
.formLogin()
.loginProcessingUrl("/api/login")
.successHandler(loginSuccessHandler())
.failureHandler(loginFailureHandler())
.and()
.logout()
.logoutUrl("/api/logout")
.logoutSuccessHandler(logoutSuccessHandler());
}
}
java复制@PostMapping("/upload")
public Result uploadFile(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return Result.error("请选择要上传的文件");
}
try {
String fileName = FileUtil.rename(file.getOriginalFilename());
String filePath = uploadPath + fileName;
File dest = new File(filePath);
file.transferTo(dest);
// 保存文件信息到数据库
ResearchFile researchFile = new ResearchFile();
researchFile.setFileName(fileName);
researchFile.setFilePath(filePath);
researchFile.setFileSize(file.getSize());
fileService.save(researchFile);
return Result.ok("文件上传成功", researchFile);
} catch (IOException e) {
log.error("文件上传失败", e);
return Result.error("文件上传失败");
}
}
前端采用Vue CLI创建的标准项目结构:
code复制src/
├── api/ # API请求封装
├── assets/ # 静态资源
├── components/ # 公共组件
├── router/ # 路由配置
├── store/ # Vuex状态管理
├── styles/ # 全局样式
├── utils/ # 工具函数
└── views/ # 页面组件
javascript复制router.beforeEach((to, from, next) => {
const hasToken = localStorage.getItem('token')
if (to.meta.requiresAuth && !hasToken) {
next('/login')
} else if (to.path === '/login' && hasToken) {
next('/')
} else {
next()
}
})
vue复制<template>
<el-table :data="projectList" style="width: 100%">
<el-table-column prop="projectName" label="项目名称" width="180" />
<el-table-column prop="principal" label="负责人" width="120" />
<el-table-column prop="startDate" label="开始日期" width="120" />
<el-table-column prop="endDate" label="结束日期" width="120" />
<el-table-column prop="status" label="状态" width="120">
<template #default="scope">
<el-tag :type="statusType(scope.row.status)">
{{ statusText(scope.row.status) }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="180">
<template #default="scope">
<el-button size="mini" @click="handleEdit(scope.row)">编辑</el-button>
<el-button size="mini" type="danger" @click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</template>
sql复制CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(100) NOT NULL COMMENT '密码',
`real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名',
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`department` varchar(100) DEFAULT NULL COMMENT '所属院系',
`title` varchar(50) DEFAULT NULL COMMENT '职称',
`role` enum('ADMIN','TEACHER','ASSISTANT') NOT NULL DEFAULT 'TEACHER' COMMENT '角色',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:0-禁用,1-启用',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
sql复制CREATE TABLE `research_projects` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`project_name` varchar(200) NOT NULL COMMENT '项目名称',
`project_code` varchar(50) DEFAULT NULL COMMENT '项目编号',
`project_type` varchar(50) NOT NULL COMMENT '项目类型',
`principal_id` int(11) NOT NULL COMMENT '负责人ID',
`start_date` date NOT NULL COMMENT '开始日期',
`end_date` date NOT NULL COMMENT '结束日期',
`funding` decimal(12,2) DEFAULT '0.00' COMMENT '资助金额',
`status` enum('APPLYING','APPROVED','IN_PROGRESS','COMPLETED','TERMINATED') NOT NULL DEFAULT 'APPLYING' COMMENT '项目状态',
`description` text COMMENT '项目描述',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_principal` (`principal_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='科研项目表';
bash复制mysql -u root -p
CREATE DATABASE research_management DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
bash复制mysql -u root -p research_management < research_management.sql
yaml复制# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/research_management?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: yourpassword
redis:
host: localhost
port: 6379
bash复制mvn clean package
java -jar target/research-management-1.0.0.jar
bash复制npm install
javascript复制// src/api/config.js
export const BASE_URL = process.env.NODE_ENV === 'development'
? 'http://localhost:8080/api'
: 'http://your-server-ip:8080/api'
bash复制npm run build
nginx复制server {
listen 80;
server_name localhost;
location / {
root /path/to/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
在实际部署和使用过程中,我发现系统的权限控制设计非常关键。高校科研管理系统通常涉及多个角色(管理员、院系负责人、普通教师等),每个角色的操作权限和数据访问范围都需要仔细规划。建议在二次开发时,先梳理清楚各角色的权限需求,再对系统进行相应调整。