当前位置: 首页 > news >正文

基于Spring Boot的高校科研绩效管理的设计与实现

第 4 章 系统概要设计

本系统围绕高校科研绩效管理的需求,采用了前后端分离的开发模式,力求在界面操作、业务逻辑以及数据管理等多个方面都具有良好的可扩展性和易维护性。系统前端主要利用Vue.js及其配套的Element UI组件库实现界面的交互与可视化;后端基于Spring Boot框架等数据持久化技术来处理科研绩效管理相关的业务逻辑。在数据库层面,系统采用MySQL存储关键数据,通过合理的概念模型和逻辑模型设计,确保数据结构与业务需求相匹配,并且能在后期根据需要进行扩展。下文将围绕系统的前端架构设计、后端架构设计、数据库设计(包含概念模型与逻辑结构)、数据库接入设计以及实体类与DAO层开发进行阐述。

4.1 系统前端架构设计

在设计高校科研绩效管理系统的前端时,需要兼顾易用性、响应速度以及可维护性等因素。为满足这些要求,系统前端采用了以下主要技术和理念:

(1)利用 Vue.js 通过简洁的模版语法和组件化思路,将前端界面拆分为多个相互独立又可复用的功能单元(如项目管理组件、公告管理组件等),降低了开发的难度。

(2)利用Element UI在开发中直接使用基础界面元素(如表格、按钮、对话框等),这些组件外观规范统一,使用它们能够快速实现前端页面效果,并保持整体UI一致性。

(3)利用Vue Router,可以把功能页面分别配置成不同路由地址(如“/teacher/home”、“/admin/announcement”等),并为每个路由关联相应的组件。这样用户访问某个功能时,路由会自动渲染对应的内容。

(4)前端与后端数据交互部分通常需要通过HTTP请求来完成。本系统利用Axios库统一封装GET、POST等请求方式,并在Axios的“请求拦截器”、“响应拦截器”中可做权限验证或错误处理。这样能确保数据交互的一致性与安全性,利于快速定位问题。

4.2 系统后端架构设计

后端采用Spring Boot框架,其优势在于“约定优于配置”的理念能够显著缩短项目初始搭建时间,并且官方对多种第三方库的自动配置支持也比较完善。

在业务分层上,后端采用了典型的分层思路,Controller(表现层)对应MVC模型中的控制器部分,主要接收前端发送的HTTP请求(RESTful风格),调用业务层进行处理,再返回相应的JSON结果或状态信息给前端。Service(业务层)处理系统主体业务逻辑,例如:科研成果的审批流程、绩效计算规则等。这一层中可以编写相对独立的方法。保证逻辑清晰易维护。

DAO(数据访问层)通过MyBatis与数据库进行交互,执行增删改查等操作。采用抽象接口与实现类分离的方式,保证即使数据库或持久层技术发生变化,也能最小化对业务逻辑的影响。

与MySQL连接,在application.yml或application.properties中配置MySQL连接参数后,Spring Boot会自动管理数据源,并使用默认的连接池[13]技术(如HikariCP),确保数据库连接的高效与稳定。

4.3 系统前后端交互设计

前后端交互环节是将用户操作与后台逻辑串联起来的纽带。本系统的交互方式主要是通过HTTP请求[12]来完成,具体可细分如下:

RESTful风格接口。每一个功能模块都对应一系列URL请求。比如:

POST /api/login:处理用户登录;GET /api/announcements:获取公告列表;POST /api/projects:上传新项目数据;PUT /api/projects/{id}:更新项目数据;GET /api/projects/{id}:查看某个项目详情;以及其他各种GET、POST、PUT、DELETE请求。这样前后端协作会比较顺畅,前端只需要在调用这些接口时传入相应的参数或JSON数据,后端完成处理后返回对应的JSON格式结果。

Axios在前端的运用。前端通过 Axios 发送网络请求。例如在教师的项目管理页面中,我们可能需要获取已经提交的项目列表,就会调用类似axios.get('/api/projects?userId=xxx')来获得后端返回的列表数据。如果教师新建一个项目,则会发起axios.post('/api/projects', payload),其中payload是一段包含项目名称、类型、启动时间的 JSON 或表单数据。后端处理完后,会以 JSON 形式返回结果,前端就能确定这次操作是否成功。

在前后端的访问权限或令牌校验中,为防止未登录或者越权访问,后端往往需要在某些接口上加权限判断,前端需要在请求头或Cookie里携带相应的登录令牌(或Session)。如果后端发现当前请求的令牌无效或过期,会返回一个错误状态码,提示需要重新登录。这样能保护系统数据不被随意访问或修改。

在前后端的错误处理与状态响应中,前后端交互过程中,一定会遇到各种可能的错误,比如:网络异常、参数校验失败、后台抛出异常等。为让用户明白发生了什么,后端应该在响应中给出明确的错误码或错误消息,前端在拿到这些消息后,以弹窗或提示条的方式告知用户哪里出了问题,并引导其进行下一步操作。

总体来说,前后端交互的设计重点在于“API接口清晰+数据格式一致+权限控制到位+错误提示友好”,只要把这几个要素做好,整套系统的操作体验就会相当顺畅,这也是我们前后端设计的主要目的。

4.4 数据库设计

数据库是高校科研绩效管理系统的核心数据存储区。为了让后续功能开发更顺利,需要在前期就进行适度的建模和表结构设计。本项目所需管理的数据包括:用户信息、科研成果信息(项目、论文、专利、奖项等)、绩效分值设置、公告数据、审批状态,以及与之相关的一些辅助信息等。

4.4.1 数据库概念模型设计

数据库概念设计的目标是建立数据库的抽象架构,其本质是将实际业务需求转化为结构化信息的过程。通过系统化分析需求,提炼出数据间的逻辑关系,最终为数据库构建理论基础。在此过程中,实体-关系图(E-R图)作为核心工具,由实体、属性及实体间关联三个基本要素构成。E-R图凭借其可视化优势,能清晰呈现数据实体间的逻辑联系,为数据库设计提供直观参考。例如,在科研绩效管理的设计中,可通过E-R图展现用户类、成果类等关键实体的结构关系

根据前文所展示的实体结构图,通过分析各实体之间的逻辑关联与交互方式,最终形成了完整反映系统架构的E-R(实体-关系)模型,具体展示如图4-9所示。

4.4.2 数据库逻辑结构设计

通过对整体实体关系模型(E-R图)的系统化解析,能够精准界定所需的核心数据表,并深入剖析各表间的关联逻辑。为清晰呈现关键数据库表的设计框架,采用三线表格形式对主要结构进行可视化说明,具体设计细节如下表所示。

4.5 数据库接入设计

数据库接入指的就是后端如何与具体的数据库进行连接和读写操作。本系统采用了MySQL这一相对常见且易于维护的关系型数据库。在Spring Boot环境下,通常通过如下方式来完成数据库接入:

在配置文件中指定数据库信息。

例如,在 application.properties 或 application.yml 文件中,写明MySQL的驱动、地址、用户名和密码等。然后Spring Boot会自动帮我们初始化数据源。

其他配置,比如  mybatis 的一些设置。使用连接池。为了提高并发处理能力,一般会配合使用连接池(如HikariCP),在系统启动后就预先创建一定数量的数据库连接,避免频繁打开关闭连接带来的性能损耗。Spring Boot在默认情况下就集成了HikariCP,配置即可使用。

MyBatis整合根据项目需求,可以使用MyBatis来操作数据库。MyBatis:SQL写法灵活,可在XML或注解中直接编写SQL;

如果担心后续版本升级,表结构变化多,推荐把建表脚本和更新脚本做好版本控制,也可以采用Liquibase或Flyway来做自动化迁移。这样团队合作时,每个人都能保持数据库结构一致。

4.6 实体类开发

在Java后端中,需要通过“实体类”来承载数据库表记录。一般的做法是为每个表或每个核心业务对象写一个对应的Java类,以存放其字段、get/set方法以及可能的其他业务逻辑。在实际中,还可根据需要添加更多字段或做更精细的命名。通过这些实体类,就能将数据库中的表和Java代码建立一一对应的关系,实现更高效的管理与操作。

图 4-9 代码实体类图

4.7 DAO 层开发

DAO(Data Access Object)层用来处理对数据库的具体访问。在使用MyBatis时,常见的做法是创建Mapper接口和对应的XML映射文件,也可以采用基于注解的配置。以下简要介绍:

Mapper接口示例:

public interface UserMapper {

// 根据ID查询用户

User findById(Integer id);

// 插入新用户

int insertUser(User user);

// 更新用户信息

int updateUser(User user);

// 删除用户

int deleteUser(Integer id);

// 根据用户名和密码查询

User findByUsernameAndPassword(@Param("username") String username,

}

Service 与 Mapper的衔接。在业务层(Service层),就可以通过注入UserMapper接口来进行各种数据库操作。例如:

@Service

public class UserService {

@Autowired

private UserMapper userMapper;

public User login(String username, String password){

return userMapper.findByUsernameAndPassword(username, password);

}

如此,DAO层就将数据库查询、插入、更新等操作与业务逻辑分离开来,代码结构更加清晰,日后维护或扩展都比较容易。

第 5 章 系统功能的详细设计及实现

5.1 登录界面

在进入系统前,所有用户都需要先登录。登录既可以识别用户身份,也能根据其角色决定进入哪套功能模块。为了确保系统安全,登录时需要验证用户名与密码,并做权限判断。登录界面基于 Vue 3 + Element Plus 实现,使用 <el-form> 组件封装账号、密码两个输入框,并配置 :rules 进行必填与长度校验。页面通过 Vue Router 注册 /login 路由,样式由 SCSS 管理,采用响应式布局(Flexbox)保证在不同分辨率下居中显示。页面加载时,使用 onMounted 钩子清除 LocalStorage 中的旧 Token,并通过 provide/inject 将全局 Loading 状态注入到根组件,以便页面级骨架屏动效。

5.1.1 登录

点击登录按钮触发 handleLogin() 方法,前端使用 axios.post('/api/auth/login', { username, password }) 发起请求。后端由 Spring Security + JWT 组合实现:AuthenticationManager 校验用户名密码,成功后在 JwtTokenProvider 中签发包含用户 ID、角色和过期时间的 token,并通过 HTTP Header Authorization: Bearer <token> 返回。前端拦截响应,将 Token 存入 LocalStorage,并通过 Axios 拦截器在后续请求中自动添加 Authorization 头。若后端返回 401,则用 ElMessage.error 提示“用户名或密码错误”。

登录表单提交后,会调用后端接口(如POST /api/login),传递username和password。后端会在用户表中进行比对。如果验证成功,则在 Session 或 Token 中记录该用户的角色信息;前端收到成功响应后跳转到相应的主页;如果失败,则告知用户登录失败的原因。

页面布局输入框要求用户输入用户名和密码;登录按钮点击后将表单提交给后端进行验证;提示信息若密码错误或账号不存在,需要给出“用户名或密码不正确”的提示。

角色区分如果是教师角色,则跳转到教师的首页;如果是院级管理员,则跳转到院级管理员的功能界面;如果是校级管理员,则跳转到校级管理员的管理面板。

用户体验登录页面应简洁明了,让用户能快速找到输入位置;输入错误时及时反馈,可以再提供一个“忘记密码”或“重置密码”的引导(具体实现可灵活处理)。

5-1 登录界面图

5.2 教师应用模块

教师在系统中主要关注自己提交的项目、论文、专利、奖项,以及这些成果的审批进度和历年绩效表现等。为了让教师操作更加方便,我们在前端设计了一系列子功能模块。

5.2.1 教师系统首页

在教师端首页模块中,我们采用 Vue 3 的 Composition API 组织业务逻辑,利用 <script setup> 语法将状态管理和生命周期钩子高度内聚。页面组件通过 axios 向后端 /api/dashboard/summary 接口发起 GET 请求,获取教师的科研成果统计数据(项目、论文、专利数量等)。后端基于 Spring Boot 的 @RestController 注解提供该接口,服务层调用 DashboardService 聚合多张表的统计数据,并使用 MyBatis-Plus 的 QueryWrapper 执行多表联查与分组统计。前端拿到响应后,通过 ECharts 初始化一个环形图与折线图,配置 option 时利用响应式 ref 绑定数据,实现图表随数据自动更新,同时通过组件库 Element Plus 的 ElLoading 在数据加载期间显示全局遮罩,保证用户体验。

页面功能显示最新的院级公告与校级公告;列表形式展示公告标题和时间,点击可查看详情;提供快速导航到其他教师功能,比如“项目管理”“论文管理”等。

前端会调用接口GET /api/announcements,后端返回一组公告数据;可分页显示或只显示最近几条,然后有一个“更多”按钮查看全部。

图 5-2 教师公告页面

5.2.2 教师项目管理模块

项目管理模块分为“项目列表”和“项目申报”两部分。列表界面同样使用 Element Plus 的表格与分页组件,并在表格列中通过 formatter 函数将项目状态码映射为文字标签。项目申报表单基于 ElForm,字段校验采用内置规则与自定义校验器(如起止时间先后顺序),并通过 @submit.prevent 拦截提交事件。提交时,前端将表单数据序列化为 JSON,通过 axios.post('/api/projects') 发送到后端。后端在 ProjectController 中接收 DTO,使用 Spring 的 @Valid 注解触发 Hibernate Validator 自动校验,校验通过后由 ProjectService 调用 MyBatis-Plus 的 save() 方法将数据写入 projects 表。为防止重复提交,前端在发送请求前禁用提交按钮,后端在接口层通过 Redis 分布式锁对同一用户的多次并发请求进行限流控制。

教师需要上传或查看自己申报的科研项目信息,包括项目名称、项目类型、启动时间、项目金额、当前状态(审核中、驳回、通过等),并可以进行修改或删除(在审核未通过前)。实现查看项目列表进入“项目管理”页面时,系统根据当前教师ID从后端获取其项目列表;教师点击“上传”按钮后弹出一个表单,填写项目名称、类型、金额、说明等,确认后通过Axios发到后端,后端写进数据库并返回成功信息;若项目处于未提交或被驳回状态,教师可以进行编辑;若项目已提交并通过院级审核,则大多情况下教师只能查看而不能修改。

教师项目管理模块如图 5-3 (a)所示:

图 5-3 教师项目管理模块(a)

图 5-3 教师项目管理查找功能(b)

5.2.3 教师的专利管理

专利管理与项目管理类似,但在文件上传方面额外集成了阿里云 OSS。前端使用 ElUpload 组件,action 属性指向后端 /api/patents/upload,并在请求头中携带用户令牌。后端 PatentController 接收多部分表单,使用阿里云 SDK 的 OSSClientBuilder 将文件流上传至指定 Bucket,并返回存储 URL。随后在专利记录入库时将 URL 保存在 patent_file_url 字段。列表页展示时,通过 ElButton 弹出窗口提供下载链接,点击后直接打开 OSS 上的文件。同时,后端对上传文件大小和类型进行校验,利用 Spring Boot 的 MultipartConfigElement 配置最大文件限制,以及在控制器方法上加 @RequestPart 限定 MIME 类型。

有些教师会申请发明专利、实用新型专利等,需要把专利信息录入系统,以便后续统计并进行绩效考核。专利信息通常包含专利编号、专利类型、授权日期、专利负责人、其他备注等。

界面设计列表模式展示已有专利;点击“新增专利”弹窗填写专利细节;可查询或搜索专利编号、按授权日期排序等。若存在文件上传需求(例如专利证明扫描件),则提供上传入口。

后端处理POST /api/patents 用于新增专利记录;GET /api/patents?userId=xxx 返回当前教师的专利列表;PUT /api/patents/{id} 修改专利信息;DELETE /api/patents/{id} 删除专利(在某些状态下不可删除)。

教师上传专利时,前端会将表单数据(专利编号、授权日期、专利类型等)通过 Axios 发送给后端,后端保存到patent表,同时可将“status”初始设置为“待提交”或“已提交”,并提示教师操作成功。

图 5-4 教师专利管理模块(a)

图 5-4 教师专利管理模块上传功能(b)

5.2.4 教师论文管理模块

论文管理模块核心为 DOI 校验与引用检索。用户提交论文信息时,表单中 DOI 输入框绑定 @blur 事件,触发前端调用 CrossRef API(https://api.crossref.org/works/{doi})校验 DOI 是否存在,并将返回的元数据(标题、作者)自动填充到表单中。若校验失败,则通过 ElMessage.error 提示用户。提交后,后端在 PaperService 中通过 RestTemplate 再次校验一遍,并用 Jackson 将 JSON 解析成 Paper 实体后入库。此外,列表页提供“引用次数查询”功能,前端点击按钮会调用后端包装的 Semantic Scholar API,结果通过 WebSocket (@EnableWebSocket) 推送给前端,实现异步更新引用次数,以免阻塞用户操作。

教师往往会发表论文,且可能需要记录论文类型(核心/普刊等)、发表期刊名称、发表时间等。系统应提供一个论文列表页,让教师随时查看和维护自己的论文清单。前端操作“新增论文”按钮 -> 打开对话框 -> 填写“论文标题”“期刊名称”“论文类型”等 -> 点击确认;

列表可查看已录入的论文。如果论文还在可编辑状态(比如未进入最后审批环节),可点击编辑按钮修改;否则只能查看详细信息,或者等待审核结果。

后端交互GET /api/papers?userId=xxx 查询教师论文列表;POST /api/papers 提交新论文;PUT /api/papers/{id} 修改;DELETE /api/papers/{id} 删除。在审批通过后,教师一般不再随意改动论文信息,以避免与审批记录冲突。教师可以通过搜索框按照标题、期刊等条件进行查询,方便大批量管理论文。

图5-5 教师论文管理模块(a)

5.2.5 教师奖项管理模块

奖项管理模块在实现 CRUD 基础上,增加了导出功能。用户可点击“导出”,前端调用 /api/awards/export 接口,并指定导出格式(Excel/CSV)。后端使用 Apache POI 动态生成 .xlsx 文件,将查询到的奖项列表逐行写入工作表,再通过 HttpServletResponse 的 OutputStream 以流式方式返回给前端。前端拿到二进制流后,利用 FileSaver.js 库触发浏览器下载。整个过程中,为避免内存溢出,POI 使用 SXSSFWorkbook 开启低内存模式,并在写入后及时调用 dispose() 释放临时缓存。

有些教师可能会获得各级各类奖项,如教学成果奖、科研突破奖等,需要将获奖信息上报给系统,后期也可纳入绩效计算。与项目、专利类似,同样是一个“奖项列表 + 新增编辑”形式;主要字段包括“奖项名称”“奖项级别”“颁发机构”“获奖日期”等。与其他科研成果类似,奖项也可在后端设置对应的实体类Award,并通过类似的 Mapper 接口进行CURD(增删改查)。审批流程和状态管理可以复用之前的机制。

图5-6 教师奖项管理模块(a)

5.2.6 教师统计图模块

统计图模块整合了 ECharts,数据接口 /api/teacher/statistics 返回多维度数据(按年月、成果类型分组)。前端在图表组件中,将不同维度的数据拆分成多个 series,通过 echarts.init() 分别渲染折线图、柱状图和饼图,并支持图例切换和数据缩放(dataZoom)。此外,利用 ECharts 提供的 tooltip.formatter 自定义展示内容,并结合 Vue 的事件系统监听 dataZoom 事件,根据缩放范围动态请求后端接口以实现服务端分页加载,适配大规模数据集展示需求。

教师可能想直观了解自己在某个时间段内提交了多少项目、论文、专利或奖项,各自所占的比例如何。我们可以通过前端图表库(如 ECharts)做可视化呈现。

后端提供接口GET /api/statistics/self,返回该教师的成果统计数据,如:{ projectCount: 2, paperCount: 5, patentCount: 1, awardCount: 3 };前端拿到这些数字后,通过 ECharts 生成饼图或柱状图,让教师一目了然。饼图:在一个圆中分割四块,分别显示项目、论文、专利、奖项数量占比;柱状图:横轴是成果类型,纵轴是数量,用不同颜色区分。这样可以让教师更好地把握自己的科研重心,并有助于后续改进

图5-7 教师统计图模块上传功能(a)

5.2.7 教师历年绩效大考分数模块

该模块前端调用 /api/teacher/performance/major-history 接口,后端在 PerformanceController 中使用 MyBatis-Plus 的 LambdaQueryWrapper 按年份和大考类型分组统计 major_scores 表,并结合 JOIN 多表查询教师基本信息。业务层 PerformanceService 将原始数据聚合成 { year: number; score: number }[] 的结构返回。前端在 MajorHistoryChart.vue 组件中,通过 ECharts 渲染折线图,配置 xAxis.data 为年份数组,series.data 为对应分数,并启用 dataZoom 支持区域缩放,用户可以拖拽时间轴动态查看任意区间数据。

有些学校会进行“三年一大考”的科研绩效评估,统计教师在三年内所有科研产出的分数总和,给出一个最终的考核等级或分数。教师在前端页面查看“历年绩效大考”数据,通常会罗列每个三年周期对应的总分;点击某一条,可以查看这三年内累计了哪些项目、论文、专利或奖项,以及各自分值。

后端可能按照时间段查询该教师的成果记录,并参考绩效管理表中的分值进行汇总;也可以事先在数据库“考核记录表”里保存大考分数,用户只需要查询显示即可。界面说明列表:如“2018~2020年综合绩效分数:85分”,点击详情能看到具体贡献和评分细节;筛选:可按照年份范围或某个时间段做查询。这样教师就不必自己手动计算,系统会自动给出清晰的结果。

图5-8 教师历年绩效分数大考模块(a)

图5-8 教师历年绩效分数大考模块查看功能(b)

5.2.8 教师历年绩效分数小考模块  

小考模块与大考类似,但后端接口 /api/teacher/performance/minor-history 在 Service 层使用 MyBatis 自定义 XML 语句,按年月聚合近三年小考数据,并按教师 ID 多维度返回。前端在 MinorHistoryTable.vue 中使用 ElTable 展示年月与分数,同时提供导出按钮,调用 /api/teacher/performance/minor-history/export,后端基于 Apache POI 的 SXSSFWorkbook 逐行写入上下游缓存,以流式输出 Excel,前端利用 Blob + FileSaver.js 触发下载。

一些高校内部还会进行年度或跨年度的校级考核,也可称作“小考”或“校考”。与大考相比,校考的统计周期可能更短,或者主要着眼于某些特定领域成绩。类似大考分数显示,同样给出“某年或某学年期间,该教师获得多少科研分数”;允许查询明细,例如点击“查看详情”,弹出或跳转到成果列表页,列出加分来源。可以共用大考的统计逻辑,只需在查询时区分类型(“大考”或“校考”);若学校要求更细化,也能建立一张独立的表格来存放校考分数记录。通过把校考和大考分开,教师能更清楚地知道自己在不同阶段或维度上的表现,也能根据结果及时调整后续的科研规划。

教师历年绩效分数小考模块如图5-9(a)所示:

图5-9 教师历年绩效分数小考模块(a)

    1.  院级管理员模块

院级管理员通常负责本学院范围内的教师与科研活动。相较于教师,院级管理员有更高的权限,如审批教师提交的成果、管理本院公告、查看学院统计数据、维护本院用户等。以下是该模块的主要功能。

      1. 院级管理员系统首页模块

院级首页组件InstituteDashboard.vue 在onMounted 时并行发起/api/institute/dashboard/summary 和 /api/institute/dashboard/recent-approvals 两个 GET 请求,后端 InstituteDashboardService 利用 MyBatis-Plus 的多表联查分别统计本院教师项目、论文、专利的待办审批数与本月新增成果数,并缓存到 Redis 10 分钟超时。前端将返回数据绑定至多个 ElCard 卡片中,并使用 ECharts 渲染一张饼图展示各类成果占比。

进入首页后,可以看到学院层面的公告、审批待办信息等;也提供了快捷入口链接到“公告管理”“用户管理”“审批科研成果”等界面。公告预览只显示几条最新公告标题;点击可查看全部;待审批数量提示若有若干个待审批项目或论文,会在首页有一个数字提示,让院级管理员迅速了解是否有新任务。前端调用接口 GET /api/department/homeInfo,后端汇总公告、审批数量等基础信息打包返回;显示在页面上后,如果管理员点击某个按钮,会跳转到对应功能页面进行更详细的操作。

图5-10 院级管理系统首页模块

      1. 院级公告管理模块

公告模块前端使用 Vue Router 注册 /teacher/announcements 路由,并在对应组件中通过分页组件 ElPagination 实现公告列表的分页展示。组件内部定义 currentPage、pageSize 为响应式变量,watch 监听页码变化时调用 fetchAnnouncements(),该方法向后端 AnnouncementController 的 /teacher/announcements?page={}&size={} 接口发请求。后端使用 Spring Data JPA 的 Pageable 抽象,自动处理分页与排序,返回 Page<Announcement> 对象。前端解析后,将公告数据填入 ElTable。点击标题可跳转至公告详情页,通过动态路由 /:id 读取 URL 参数并再次发接口查询详细内容。全文检索则集成了 MySQL 的 LIKE 查询,并在后端使用 @Query 注解自定义 SQL,以支持标题和内容的关键字模糊匹配。

院级公告一般面向本学院教师或相关人员,用于下发院内通知。此模块允许院级管理员新建、编辑或删除院级公告。公告可带有标题、正文、发布时间等。页面布局公告列表以时间倒序列出已有公告的标题和发布时间;新增公告:点击“新增”后弹窗或跳转到编辑页面,输入“公告标题”“正文”,选择“公告类型=院级”;编辑/删除:若发现公告有误或已经过期,可以进行修改或删除。后端接口GET /api/announcements?type=院级:查询本学院公告;

POST /api/announcements:新增;PUT /api/announcements/{id}:编辑;DELETE /api/announcements/{id}:删除。只有院级管理员或具有院级权限的用户能操作这部分;公告内容比较重要,尽量提供一个富文本编辑器让管理员排版,以提升阅读效果。

院级公告管理模块如图5-11(a)所示:

图5-11 院级公告管理模块(a)

图5-11 院级公告管理模块(b)

      1.  院级用户管理模块

用户管理在前端实现一个 UserForm.vue 和 UserTable.vue 组合。列表接口 /api/institute/users 后端使用 MyBatis-Plus 的 page() 方法分页,并通过 role_id 过滤本院教师与助理。新增/修改操作调用 /api/institute/users POST/PUT,Service 层使用 BCryptPasswordEncoder 加密默认密码,并在事务内同时写入 users 表和 user_roles 关联表。删除接口走逻辑删除,实体类添加 @TableLogic 注解,用 is_deleted 字段控制。

教师账号管理院级管理员可以在自己学院范围内,为新教师开通账号、修改已有教师信息或重置密码;权限限制只允许管理本院的教师信息,不可越权修改其他学院的用户。

用户列表展示:列出本院教师的用户名、姓名、邮箱、联系电话等;新增用户对话框:填写教师的基本信息,如用户名、密码、姓名、学院(此处只能是本院)、角色(默认为教师);编辑可修改联系信息或重置密码;删除若教师离职或账号无效,可以进行删除操作(具体看学校政策)。

后端可以通过 GET /api/department/users 查询本院用户列表,并在查询SQL中限制仅返回 department=xx 的记录,避免越权。新增或编辑时,也要确保 department=xx,防止管理员更改到别的学院。

院级用户管理模块在如图5-12(a)所示:

图5-12 院级用户管理模块(a)

图5-12 院级用户管理新增功能模块(b)

      1. 院校统计表模块

统计表功能分为在线预览和导出。接口 /api/institute/statistics 在 Service 层调用三次 SQL 聚合,分别按教师、成果类型和考核周期统计,通过 Union All 合并后在 Java 中分片映射成 DTO。前端 StatisticsView.vue 使用 ElTabs 切换不同视图,表格下方提供“导出 CSV”按钮,触发 /api/institute/statistics/export?format=csv,后端用 OpenCSV 将 CSV 写入响应流。

为了让院级管理员更好地了解本学院的科研状况,需要一份统计数据,例如“本院当前年度有多少人提交项目”“论文的总数量是多少”“专利多少”等,并可用图表直观展示。成果数量统计按类型分组(项目、论文、专利、奖项);绩效分数统计本院教师在某段时间获得的总分数;可视化展示:以饼图或柱状图形式显示,让管理员迅速捕捉信息。

GET /api/department/statistics:后端通过SQL聚合函数(Count/Sum)等计算各种成果数量和分值;前端拿到数据后,用 ECharts 之类的组件绘制可视化表格或图表。

院级统计表功能可以让院级管理员可由此发现本学院科研产出的薄弱环节,也能对绩效考核工作进行针对性指导。

图5-13 院级统计表模块(a)

      1.  院校审批科研成果模块

审批模块后端采用 Spring State Machine(SSM)实现成果审批工作流:定义 APPROVED、REJECTED、PENDING 三状态和 approve、reject 两事件,Service 中通过 StateMachineFactory 获取状态机并发送事件。审批列表接口 /api/institute/approvals 使用 MyBatis-Plus 的 eq("institute_id", currentInstituteId) 筛选本院待办,前端在 ElTable 中为每条记录渲染“通过”“驳回”按钮,点击后调用 /api/institute/approvals/{id}/approve 或 /reject,后端状态机触发后发邮件通知申请人。

流程简介教师提交的项目、论文、专利或奖项,先由院级管理员审核;如果院级管理员认为材料无误,就把状态改成“院级通过”,并将其转交给校级管理员;若发现问题,可点击“驳回”,并让教师重新修改或补充资料。前端实现页面显示一个“待审批列表”,列出所有状态为“院级审核中”的成果;点击“详情”可查看具体资料,也可以“通过”或“驳回”;如果通过,发请求到 PUT /api/projects/{id}(或其他成果的接口),将状态更新为“校级审核中”;如果驳回,将状态更新为“院级驳回”,并可附带备注原因。

图5-14 院级审批科研成果模块(a)

      1.  院级考核情况大考模块

本模块调用 /api/institute/performance/major-summary,后端 Service 利用 MyBatis 自定义 XML 按教师分组统计所有大考得分,并计算平均分、最高/最低分。前端在 InstituteMajorSummary.vue 里使用 ECharts 渲染柱状图,xAxis 为教师姓名数组,series 为对应平均分数据,并开启 tooltip.axisPointer 实现悬浮聚焦效果。此外页面提供按分数区间筛选,通过调整 axios 参数重新拉取数据。

页面表现按教师维度罗列各位教师的总分;可以筛选年度区间;如果需要细化,可点击查看教师的大考明细,逐一列出对应的科研成果及分值。后端支持GET /api/department/exam/big:获取本院三年周期考核数据;如果学校要求,院级管理员可以在这里做“复议”或“备注处理”,比如有老师对分数有异议,可以让管理员进行核对并更新记录。

图5-15 院级考核情况大考模块(a)

      1.  院级考核情况小考模块

小考汇总接口 /api/institute/performance/minor-summary 返回按月分的平均小考得分折线数据,后端 Service 通过 MyBatis-Plus 的 selectObjs 与 Lambda 表达式快速映射,前端使用 ECharts 折线图,启用 smooth: true 平滑曲线,并添加 brush 组件支持区域选取后触发回调,高亮选中区间的数据点。

界面选择一个年份,如“2023年”,然后系统列出本院所有教师的考核得分;可以导出Excel或PDF等(如有此需求),方便存档或线下讨论。

逻辑实现后端与大考类似,只是时间范围变短;也可能把大考和小考公用一套逻辑,只是区分examType字段即可。

图5-16 院级考核情况小考模块(a)

    1. 校级管理员管理模块

校级管理员是最高层级的管理者,可以查看和管理全校范围的科研信息,发布校级公告,对院级管理员或教师的行为进行监管。以下为其主要功能。

      1. 校级管理员系统首页模块

校级首页组件 SchoolDashboard.vue 同步请求 /api/school/dashboard/overview(全校汇总)和 /api/school/dashboard/institute-stats(各院统计),后端 Service 通过 MyBatis-Plus 的 selectMaps 一次性获取所有院级数据并缓存到 Redis。前端用多个 ElCard 和一张嵌套饼图展示院系分布,点击扇区可路由跳转到对应院级统计详情。

功能特点显示校级公告、全校待审批数量、全校教师数或统计数据;提供快捷入口到“校级公告管理”“校级绩效管理”“用户管理”“审批成果”等页面。技术实现类似院级首页,但范围是全校范围的数据。后端接口 /api/school/homeInfo 可以一次性返回关键指标,如 “未审批成果数”“本年度新建项目数”“校级公告概览”等。

图5-17 校级管理系统首页模块(a)

      1. 校级用户管理模块

与院级用户管理类似,但可看到全部院系用户。Controller 加 @PreAuthorize("hasRole('SCHOOL_ADMIN')"),Service 在分页查询中不再按 institute_id 限制,并在编辑用户时可修改其所属院系与角色。密码重置接口 /api/school/users/{id}/reset-password 通过 SecurityContext 获取操作人,生成随机初始密码并邮件发送给用户。

校级用户管理主要指对院级管理员账号和其他全校教师账号进行管理,比如:新建院级管理员账号;修改已有管理员或教师信息;删除离校人员账号等。

页面与实现与院级用户管理相似,只是权限更大,可以管理全校所有学院的用户;前端操作逻辑基本一致,后端接口类似,只是查询全部用户而不再限制某个学院。

图5-18 校级管理系统首页模块(a)

校级管理员需要对绩效分值进行统一设置,如“核心期刊论文加10分,普通期刊论文加5分,省级项目加8分,国家级项目加15分”等。此处也可由校级管理员来增改这些规则。具体操作在页面上列出已有的成果类型与对应分值;新增时,管理员选择成果类型、细分类型以及建议的分值;修改时,更改具体分值并保存,然后全校范围后续统计时采用新的规则。

后端与前端:GET /api/performance/rules:查询所有绩效规则;POST /api/performance/rules:新增;PUT /api/performance/rules/{id}:修改;

需要注意的是,如果规则改动,会不会影响之前已计算的分数?通常只能影响后续的新提交成果,或者在系统中设置“生效日期”。

图5-18 校级用户管理新增功能模块(b)

      1. 校级绩效管理模块

绩效规则管理前端 PerformanceRuleForm.vue 使用动态表单,根据指标类型(项目/论文/专利/奖项)自动渲染不同输入控件。提交到 /api/school/performance-rules 后端在 PerformanceRuleService 中校验新规则与现有规则的时间区间无重叠,并持久化到 performance_rules 表。前端实时校验通过 watch 监听表单数据,若发现冲突则禁用提交按钮并提示。

校级管理员需要对绩效分值进行统一设置,如“核心期刊论文加10分,普通期刊论文加5分,省级项目加8分,国家级项目加15分”等。此处也可由校级管理员来增改这些规则。具体操作在页面上列出已有的成果类型与对应分值;新增时,管理员选择成果类型、细分类型以及建议的分值;修改时,更改具体分值并保存,然后全校范围后续统计时采用新的规则。

后端与前端GET /api/performance/rules:查询所有绩效规则;POST /api/performance/rules:新增;PUT /api/performance/rules/{id}:修改;需要注意的是,如果规则改动,会不会影响之前已计算的分数?通常只能影响后续的新提交成果,或者在系统中设置“生效日期”。

校级绩效管理模块如图5-19(a)所示:

图5-19 校级绩效管理模块(a)

图5-19 校级绩效管理模块新增功能(b)

      1. 校级公告管理

与院级公告模块一致,但接口为 /api/school/announcements,Service 使用 JPA 的 @Modifying 自定义批量删除公告功能,前端在表格复选框选中多条后可一键删除。

校级公告面向全校师生,发布一些重大科研通知或政策,如“国家自然科学基金申报通知”“暑期科研项目安排”等。只有校级管理员能管理校级公告。实现与院级公告相似。列表显示:校级公告标题、日期;新增/编辑/删除:通过后端接口实现,对数据库中的announcement表进行操作,type字段设置为“校级”;访问时可以在前端或后端区分公告类型,从而呈现不同类别的公告。

校级公告管理模块如图5-20(a)所示:

图5-20 校级公告管理模块(a)

图5-20 校级公告管理模块新增功能(b)

      1. 校级统计表模块

接口 /api/school/statistics 后端调用多个聚合 SQL 计算全校与各院的考核通过率、平均分、优秀率等,并返回包含分页信息的 DTO 列表。前端使用 ElTable + ElPagination 展示,并提供“下载 PDF”功能,调用 /export/pdf,后端基于 iText 生成含表格与校徽页眉的 PDF 文档。

全校范围内的科研成果汇总,包括对所有学院、教师提交的项目、论文、专利、奖项的统计,以及分数总和。还可以做学院间比较或排名(如果政策允许)。前端呈现使用图表展示多个学院的科研成果占比,或按年度分组的成果数量趋势图;清单形式列出某年度内的所有项目并可按学院筛选。后端实现GET /api/school/statistics:返回全局统计信息,可能要多次使用 group by 进行聚合;前端再根据需要渲染成相应的可视化图表。

图5-21 校级统计表模块(a)

      1. 校级科研审批成果模块

校级审批流程同院级,但工作流使用 Apache ShardingSphere 的分布式事务保障跨库一致性(若各院数据分库)。审批状态流转同样用 Spring State Machine,且在 approve 事件触发后,Service 会调用 MessageQueue(RabbitMQ)异步通知院级管理员进行下一步审批。

在院级审核通过后,科研成果会流转到校级审核环节。校级管理员会查看成果的详细资料,如项目申请书、论文信息等,然后给出最终审批意见。界面操作待审列表:列出所有状态为“校级审核中”的成果;通过或驳回:若通过,则更新状态为“校级通过”,代表最终确认;若驳回,则更新状态为“校级驳回”,教师需要再次修正后重新提交。

后端PUT /api/projects/{id}/approve:通过;PUT /api/projects/{id}/reject:驳回;纸质工作流程转为线上提交与结果记录,减少了大量的人力成本。

图5-22校级科研审批成果模块(a)

      1. 校级考核情况大考模块

调用 /api/school/performance/major-overview,后端 Service 先拉取各院大考平均分,再用 Java Stream 将数据分组合并,并计算全校平均值。前端在 SchoolMajorOverview.vue 中使用 ECharts 的带状图(bar with markers)展示各院平均、全校平均,并支持鼠标悬浮时显示详情。

大考全校视角校级管理员可以看到所有学院教师的三年期大考成绩,也可以按照学院或部门进行分类汇总,甚至可以导出总表。操作进入“校级大考”页面 -> 选择某个三年周期 -> 系统显示全校所有教师对应得分;可对异常信息进行复查,比如某教师分数特别高,可以点进去查看其成果详情确认无误。后端处理与院级逻辑类似,只是查询范围变成全校;如果某教师对评分有异议,可以在系统中提出,校级管理员再结合院级管理员进行核实。

图5-23 校级考核情况大考模块(a)

      1. 校级考核情况小考模块

小考概览接口 /api/school/performance/minor-overview 返回近一年每月全校小考平均分折线数据,后端通过 MyBatis-Plus 的 selectList 并结合 Java 8 时间 API 自动补齐无数据月份。前端使用 ECharts 折线图,并启用 toolbox.saveAsImage 提供一键下载图表功能。

与大考类似,只不过是对短期或年度的考核情况进行全校审查。管理员可以查看各学院的得分情况、对比各学院教师平均成绩等,以便整体掌控全校科研水平。实现要点通过“examType=small”区分小考或年度考核数据;可以按学院或学科进行筛选,方便查看重点学科的科研成果表现。帮助校级领导层及时掌握全校师资的科研状况,也为后续资源分配或科研扶持决策提供依据。

图5-24 校级考核情况小考模块模块(a)

结 论

本毕业设计基于前后端分离的架构,采用 Vue.js + Element UI 进行前端开发,Spring Boot + MyBatis 负责后端业务逻辑与数据持久化,MySQL 作为数据库管理系统,成功设计并实现了一套高校科研绩效管理系统。系统涵盖了科研项目、论文、专利、奖项等多种成果的管理与审批流程,支持教师、院级管理员、校级管理员三类角色的协同操作;同时,结合 ECharts 实现了多维度的统计与可视化展示,显著提升了科研绩效的透明度与效率。系统测试结果表明,应用运行稳定,界面交互流畅,能够有效减少人工录入错误,为科研决策提供了可靠的数据支撑。

尽管本系统在功能完整性和易用性方面已取得良好效果,但在大规模并发访问、高可用性以及跨平台推送等方面仍有提升空间。未来可考虑将系统拆分为微服务架构,引入分布式缓存(如 Redis)优化热点数据访问,并结合消息队列(如 RabbitMQ)和多渠道推送,实现审批结果与提醒的实时高效通知。此外,还可增加权限细化管理、移动端适配及深度分析模块,以满足更复杂的科研管理需求,助力高校科研管理向智能化、精细化方向持续发展。

相关文章:

  • Java线程同步:从多线程协作到银行账户安全
  • Linux核心技术:Linux文件系统与bootFS/rootFS
  • 进程通信-内存共享
  • 【目标检测】【医学图像目标检测】BGF-YOLO:脑肿瘤检测的多尺度注意力特征融合
  • Flink 常用算子详解与最佳实践
  • Python数据可视化实战:让数据从「数字堆」变成「故事书」
  • NestJS——重构日志、数据库、配置
  • Javase 基础加强 —— 08 IO流
  • 【Python 命名元祖】collections.namedtuple 学习指南
  • Java中关于数组的使用(下)
  • springboot中过滤器配置使用
  • 《爱的艺术》
  • python打卡训练营打卡记录day36
  • 电梯调度算法详解与Python实现
  • 简单数学板子和例题
  • 【短距离通信】【WiFi】WiFi7关键技术之4096-QAM、MRU
  • LLMs之Qwen:《Qwen3 Technical Report》翻译与解读
  • 用python实现中国象棋
  • PDF 编辑批量拆分合并OCR 识别
  • TCP 协议的相关特性
  • 教你做文案的网站推荐/百度云盘官网登录入口
  • 重庆企业网站制作外包/东莞谷歌推广公司
  • 佛山龙江做网站的/上海网站建设推广服务
  • 中国建设银行官方网站app下载/佛山seo优化外包
  • 棋牌游戏网站模板下载/东莞seo推广公司
  • 广告公司怎么取名字/关键词首页优化