一、环境准备与依赖安装
在开始构建系统之前,我们需要准备好Python开发环境。本系统基于Flask轻量级Web框架开发,能够快速实现档案提交、审核及管理功能。请确保你的操作系统已安装Python 3.8或更高版本。
打开终端或命令行工具,依次执行以下命令来创建项目目录并安装必要的依赖包。这里我们使用Flask作为Web框架,Flask-SQLAlchemy用于数据库管理,Flask-Login用于处理用户会话。
```bash
mkdir archive_audit_system
cd archive_audit_system
pip install flask flask-sqlalchemy flask-login flask-wtf email_validator
```
执行完毕后,当前目录下将包含项目所需的虚拟环境依赖。接下来,我们将进行项目结构的搭建。
二、项目目录结构设计
为了保持代码的清晰与可维护性,我们采用标准的MVC(模型-视图-控制器)架构思想组织文件。请在archive_audit_system目录下创建以下文件和文件夹:
- app.py:程序的主入口文件,包含核心逻辑和路由配置。
- models.py:数据库模型定义文件,包含用户、档案及审核记录的数据结构。
- templates/:存放HTML模板文件的文件夹。
- static/:存放CSS、JS等静态资源的文件夹。
可以使用以下命令快速创建空文件和文件夹:
```bash
touch app.py models.py
mkdir templates static
```
三、数据库模型设计
数据库是系统的核心,我们需要设计三张表:User(用户表)、Archive(档案表)和AuditLog(审核日志表)。打开models.py,输入以下完整代码:
```python
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
from datetime import datetime
db = SQLAlchemy()
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(150), unique=True, nullable=False)
password = db.Column(db.String(150), nullable=False)
role = db.Column(db.String(50), nullable=False) 'admin' 或 'auditor' 或 'submitter'
archives = db.relationship('Archive', backref='author', lazy=True)
class Archive(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(200), nullable=False)
content = db.Column(db.Text, nullable=False)
status = db.Column(db.String(50), default='pending') pending, approved, rejected
submit_time = db.Column(db.DateTime, default=datetime.utcnow)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
audit_logs = db.relationship('AuditLog', backref='archive', lazy=True)
class AuditLog(db.Model):
id = db.Column(db.Integer, primary_key=True)
archive_id = db.Column(db.Integer, db.ForeignKey('archive.id'), nullable=False)
auditor_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
action = db.Column(db.String(50), nullable=False) approve 或 reject
comment = db.Column(db.Text)
timestamp = db.Column(db.DateTime, default=datetime.utcnow)
auditor = db.relationship('User', backref='audit_logs')
```
这段代码定义了用户角色(提交者、审核员、管理员),档案的状态流转(待审核、通过、驳回),以及详细的审核日志记录。其中UserMixin为Flask-Login提供了标准的用户属性接口。
四、核心业务逻辑实现
接下来编写app.py,这是系统的运行中枢。我们将实现用户登录、档案提交、审核员查看列表、审核操作(通过/驳回)等核心功能。请将以下代码完整复制到app.py中:
```python
from flask import Flask, render_template, request, redirect, url_for, flash
from flask_login import LoginManager, login_user, login_required, logout_user, current_user
from werkzeug.security import generate_password_hash, check_password_hash
from models import db, User, Archive, AuditLog
app = Flask(__name__)
app.config['SECRET_KEY'] = 'dev-secret-key-change-in-production'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///archive.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
初始化数据库和添加测试数据
@app.before_first_request
def create_tables():
db.create_all()
if not User.query.filter_by(username='admin').first():
hashed_pw = generate_password_hash('123456')
admin = User(username='admin', password=hashed_pw, role='admin')
auditor = User(username='auditor01', password=hashed_pw, role='auditor')
submitter = User(username='user01', password=hashed_pw, role='submitter')
db.session.add_all([admin, auditor, submitter])
db.session.commit()
@app.route('/')
def index():
return redirect(url_for('login'))
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
user = User.query.filter_by(username=username).first()
if user and check_password_hash(user.password, password):
login_user(user)
return redirect(url_for('dashboard'))
flash('用户名或密码错误')
return render_template('login.html')
@app.route('/dashboard')
@login_required
def dashboard():
if current_user.role == 'auditor':
审核员查看所有待审核档案
archives = Archive.query.filter_by(status='pending').all()
return render_template('auditor_dashboard.html', archives=archives)
else:
提交者查看自己的档案
archives = Archive.query.filter_by(user_id=current_user.id).all()
return render_template('user_dashboard.html', archives=archives)
@app.route('/submit', methods=['GET', 'POST'])
@login_required
def submit_archive():
if request.method == 'POST':
title = request.form.get('title')
content = request.form.get('content')
new_archive = Archive(title=title, content=content, user_id=current_user.id)
db.session.add(new_archive)
db.session.commit()
flash('档案提交成功,等待审核')
return redirect(url_for('dashboard'))
return render_template('submit.html')
@app.route('/audit/
', methods=['POST'])
@login_required
def audit_archive(archive_id):
if current_user.role != 'auditor':
flash('无权操作')
return redirect(url_for('dashboard'))
archive = Archive.query.get_or_404(archive_id)
action = request.form.get('action') approve 或 reject
comment = request.form.get('comment')
archive.status = 'approved' if action == 'approve' else 'rejected'
log = AuditLog(archive_id=archive.id, auditor_id=current_user.id, action=action, comment=comment)
db.session.add(log)
db.session.commit()
flash('审核完成')
return redirect(url_for('dashboard'))
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('login'))
if __name__ == '__main__':
app.run(debug=True)
```
代码中包含了自动创建数据库表和预设测试账号的逻辑。预设账号如下:管理员admin、审核员auditor01、普通用户user01,密码均为123456。audit_archive函数专门处理审核员的操作,更新档案状态并写入日志。
五、前端页面模板构建
为了实现交互,我们需要在templates文件夹下创建四个HTML文件。为了保持简洁,我们使用基础的内联样式。
1. 创建templates/base.html(基础布局):
```html
档案审核系统
档案制度建设审核系统
{% if current_user.is_authenticated %}
当前用户: {{ current_user.username }} ({{ current_user.role }}) | 退出
{% endif %}
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}{{ message }}{% endfor %}
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
```
2. 创建templates/login.html(登录页):
```html
{% extends "base.html" %}
{% block content %}
用户登录
{% endblock %}
```
3. 创建templates/user_dashboard.html(普通用户视图):
```html
{% extends "base.html" %}
{% block content %}
我的档案列表
提交新档案
| ID |
标题 |
内容摘要 |
状态 |
提交时间 |
{% for archive in archives %}
| {{ archive.id }} |
{{ archive.title }} |
{{ archive.content[:50] }}... |
{{ archive.status }} |
{{ archive.submit_time }} |
{% endfor %}
{% endblock %}
```
4. 创建templates/auditor_dashboard.html(审核员核心操作页):
```html
{% extends "base.html" %}
{% block content %}
待审核档案列表
| ID |
提交人 |
标题 |
内容 |
操作 |
{% for archive in archives %}
| {{ archive.id }} |
{{ archive.author.username }} |
{{ archive.title }} |
{{ archive.content }} |
|
{% endfor %}
{% endblock %}
```
还需要创建一个简单的templates/submit.html供用户提交档案:
```html
{% extends "base.html" %}
{% block content %}
提交新档案
{% endblock %}
```
六、系统初始化与运行测试
所有代码文件已准备就绪。现在我们将启动系统并进行全流程测试。
1. 启动服务:
在终端执行以下命令启动Flask开发服务器:
```bash
python app.py
```
终端显示Running on http://127.0.0.1:5000/表示启动成功。此时,程序会自动检测并在当前目录下生成archive.db SQLite数据库文件,同时初始化三个测试用户账号。
2. 模拟提交者操作:
- 打开浏览器访问
http://127.0.0.1:5000。
- 使用账号 user01 / 123456 登录。
- 点击“提交新档案”,输入标题“档案管理制度v1.0”和内容“这是关于档案管理的具体制度细则...”,点击提交。
- 确认页面跳转回仪表盘,且显示该档案状态为
pending。
3. 模拟审核员操作:
- 点击右上角“退出”,使用账号 auditor01 / 123456 登录。
- 系统自动识别审核员身份,展示“待审核档案列表”。
- 在刚才提交的档案行中,输入审核意见“内容完整,符合规范”,点击通过按钮。
- 页面刷新后,该档案从列表中消失(状态已更新为approved)。
4. 验证数据流转:
- 再次切回 user01 账号登录。
- 查看档案列表,状态应已变更为
approved。
至此,一个包含用户权限管理、档案提交流转、审核员后台操作及日志记录的完整档案制度建设审核员管理系统已搭建完成。你可以基于此框架继续扩展前端样式或对接企业级数据库。