作为一名经历过多次公务员考试的老兵,我深知申论备考的痛点——缺乏高效的刷题工具。市面上的产品要么功能单一,要么价格昂贵。去年备考期间,我决定自己开发一套基于Python Flask和Vue.js的申论刷题系统,经过三个月的迭代,最终形成了一套完整的解决方案。
这个系统的核心价值在于:
技术选型上,我选择了Flask而非Django,主要考虑到:
关键决策点:如果预计系统后期会有复杂的管理后台需求,建议选择Django。但就申论刷题这个场景,Flask完全够用且更高效。
code复制前端层:Vue 3 + Element Plus + Axios
网关层:Nginx (负载均衡+静态资源服务)
应用层:Flask (Python 3.9+)
数据层:MySQL 8.0 + Redis 6.2
基础设施:Docker + Kubernetes (生产环境)
python复制# 关键词批改算法增强版
def advanced_grading(user_answer, standard_answer):
# 预处理:去除标点、停用词
processed_answer = preprocess_text(user_answer)
# 核心关键词匹配
base_score = basic_keyword_match(processed_answer, standard_answer.keywords)
# 逻辑结构加分(检测总分总结构)
structure_bonus = check_structure(processed_answer)
# 表达规范扣分(检测口语化表达)
expression_penalty = check_expression(processed_answer)
return max(0, min(100,
base_score * 0.7 + structure_bonus * 0.3 - expression_penalty))
项目采用工厂模式组织代码结构:
code复制/backend
/app
/api
__init__.py
auth.py # 认证相关
papers.py # 试卷相关
/models
user.py # 用户模型
question.py
/services
grading.py # 批改服务
config.py # 配置
extensions.py # 扩展
数据库设计要点:
python复制class Question(db.Model):
__tablename__ = 'questions'
id = db.Column(db.Integer, primary_key=True)
content = db.Column(db.Text, nullable=False)
answer_keywords = db.Column(db.JSON) # 存储关键词列表
analysis = db.Column(db.Text) # 题目解析
tags = db.Column(db.JSON) # 分类标签
# 建立与用户作答记录的关联
records = db.relationship('AnswerRecord', backref='question', lazy='dynamic')
页面加载优化:
状态管理方案:
javascript复制// 使用Pinia管理刷题状态
export const usePaperStore = defineStore('paper', {
state: () => ({
currentIndex: 0,
answers: {},
timer: null
}),
actions: {
nextQuestion() {
this.currentIndex++
this.autoSave() // 自动保存进度
}
}
})
css复制body {
overscroll-behavior-y: contain;
}
推荐使用Docker Compose编排:
yaml复制version: '3.8'
services:
web:
build: ./backend
ports:
- "5000:5000"
environment:
- FLASK_ENV=production
depends_on:
- redis
- db
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./frontend/dist:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
redis:
image: redis:alpine
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: exam123
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
缓存策略:
数据库优化:
批改进阶方案:
code复制原始答案 → 预处理 → 基础评分 → 结构分析 → 表达评估 → 最终得分
除了常规的CORS配置,还需要注意:
javascript复制server: {
proxy: {
'/api': {
target: 'http://localhost:5000',
changeOrigin: true
}
}
}
nginx复制location /api {
if ($request_method = OPTIONS) {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
return 204;
}
}
初期版本的关键词匹配准确率只有65%,通过以下改进提升到89%:
在模拟考试功能上线后,遇到服务器负载过高问题,通过以下措施解决:
python复制SQLALCHEMY_ENGINE_OPTIONS = {
"pool_size": 20,
"max_overflow": 10,
"pool_timeout": 30,
"pool_recycle": 3600
}
经过半年多的实际运行,这套系统已经稳定支持日均3000+的刷题量。对于想要进一步开发的同行,我的建议是:
AI批改升级:
错题本增强:
安全加固:
这个项目的核心价值在于:它证明了即使是非计算机专业的考生,也可以通过合理的技术选型和渐进式开发,打造出专业级的备考工具。我在开发过程中最大的体会是——技术要为实际需求服务,不必追求最新最炫的技术栈,稳定和实用才是王道。