1. 项目背景与核心需求
在线投稿系统是学术期刊、高校学报等机构的核心业务支撑平台。传统投稿方式普遍存在以下痛点:
- 作者需邮寄纸质稿件或通过邮件附件提交,流程繁琐且易丢失
- 编辑部需要人工登记、分类和转发稿件,效率低下
- 审稿进度不透明,作者无法实时跟踪状态
- 多角色(作者/编辑/审稿人)协作缺乏统一平台
我们设计的SpringBoot+Vue在线投稿系统主要解决以下核心需求:
- 作者端:在线撰写/上传稿件、查看审稿进度、接收修改意见
- 编辑端:稿件分类、分配审稿人、状态管理
- 审稿端:在线评审、填写意见表、评分提交
- 系统管理:用户权限控制、投稿规则配置、数据统计
2. 技术架构设计
2.1 前后端分离架构
采用经典的B/S架构:
code复制前端:Vue 3 + Element Plus + Axios
后端:SpringBoot 2.7 + MyBatis-Plus + Redis
数据库:MySQL 8.0
文件存储:MinIO对象存储
选择这套技术栈主要基于:
- Vue 3的Composition API更适合复杂交互场景
- Element Plus提供完善的Admin组件库
- SpringBoot的自动配置简化后端开发
- MinIO替代FastDFS更易部署维护
2.2 核心模块划分
mermaid复制graph TD
A[前端] --> B[用户模块]
A --> C[投稿模块]
A --> D[审稿模块]
E[后端] --> F[权限控制]
E --> G[工作流引擎]
E --> H[文件服务]
3. 关键实现细节
3.1 富文本编辑器集成
投稿内容编辑采用TinyMCE 6.x:
javascript复制// vue组件配置
import { Editor } from '@tinymce/tinymce-vue'
export default {
components: { Editor },
setup() {
const init = {
height: 500,
plugins: 'lists link image table code help wordcount',
toolbar: 'undo redo | formatselect | bold italic | alignleft aligncenter alignright | bullist numlist outdent indent | removeformat | help'
}
return { init }
}
}
特别注意:需要配置图片上传接口,建议使用MinIO的预签名URL实现临时上传
3.2 审稿工作流设计
基于Activiti 7实现状态机:
java复制// 审稿流程定义
@Bean
public ProcessEngineConfiguration processEngine() {
return new StandaloneProcessEngineConfiguration()
.setJdbcUrl(dataSource.getUrl())
.setDatabaseSchemaUpdate("true");
}
// 关键状态节点
START -> 初审 ->
if(通过) -> 外审 ->
if(通过) -> 终审 -> 录用
else -> 退稿
3.3 安全防护措施
- 接口层面:
java复制@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/files/**").permitAll()
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()));
}
}
- 文件安全:
- 所有上传文件重命名存储
- 下载链接设置有效期
- 病毒扫描接口集成
4. 典型问题解决方案
4.1 大文件上传中断
采用分片上传方案:
javascript复制// 前端分片逻辑
const chunkSize = 5 * 1024 * 1024; // 5MB
const chunks = Math.ceil(file.size / chunkSize);
for (let i = 0; i < chunks; i++) {
const chunk = file.slice(i * chunkSize, (i+1) * chunkSize);
await axios.post('/api/upload', chunk, {
headers: {
'Content-Range': `bytes ${i*chunkSize}-${Math.min((i+1)*chunkSize, file.size)-1}/${file.size}`
}
});
}
4.2 审稿人分配冲突
使用乐观锁控制:
sql复制UPDATE reviewer SET current_count = current_count + 1
WHERE id = #{id} AND current_count < max_count
4.3 版本控制需求
稿件修改采用Git式管理:
- 每次修改生成新版本
- 支持版本间差异对比
- 最终采用版本由编辑确定
5. 部署优化实践
5.1 容器化部署
Docker Compose配置示例:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
backend:
build: ./backend
depends_on:
- mysql
ports:
- "8080:8080"
frontend:
build: ./frontend
ports:
- "80:80"
5.2 性能调优
- Nginx静态资源缓存:
nginx复制location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
expires 30d;
}
- SpringBoot连接池配置:
properties复制spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.idle-timeout=30000
6. 扩展功能建议
- 查重服务集成:
- 对接Turnitin等API
- 本地化查重引擎实现
- 移动端适配:
- 基于Vant的H5版本
- 微信小程序封装
- 数据分析看板:
- 投稿量趋势
- 审稿时效统计
- 录用率分析
这套系统在实际部署中需要注意:初期建议限制单文件不超过10MB,审稿流程不宜设置超过5个状态节点,角色权限建议采用RBAC模型进行细粒度控制。对于高校学报类客户,需要特别关注学术不端检测功能的集成需求。
