为了实现档案摘抄制度的数字化落地,我们将使用Python轻量级Web框架Flask配合SQLite数据库。这种方式无需配置复杂的服务器环境,适合快速部署和单机运行。在开始编码前,请确保你的环境中已安装Python 3.8及以上版本。
打开终端或命令行工具,执行以下命令安装必要的依赖库。这里我们使用Flask作为Web框架,Flask-Login用于会话管理,Flask-SQLAlchemy用于数据库操作:
pip install flask flask-sqlalchemy flask-login werkzeug
安装完成后,新建一个项目目录,例如archive_system,并在该目录下创建一个名为app.py的主程序文件。接下来的所有代码都将写入这个文件。
档案摘抄制度的核心在于“流程控制”与“责任追溯”。数据库设计必须包含用户管理、申请单流转和操作日志三个维度。我们不使用复杂的ORM关系,而是直接在代码中定义清晰的表结构,确保每一个字段都对应制度中的具体要求。
在app.py的开头,我们先引入必要的库并进行基础配置。我们将使用SQLite数据库,文件名为archive.db,它会自动生成在当前目录下。
```python
from flask import Flask, request, render_template_string, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
from werkzeug.security import generate_password_hash, check_password_hash
from datetime import datetime
import os
app = Flask(__name__)
app.config['SECRET_KEY'] = 'dev-secret-key-change-in-prod'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///archive.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'
```
制度要求区分“申请人员”与“审批管理人员”。我们需要一个User表来存储身份信息。为了演示方便,我们预留一个is_admin字段来区分权限。
```python
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password_hash = db.Column(db.String(128), nullable=False)
is_admin = db.Column(db.Boolean, default=False) True为管理员,False为普通员工
real_name = db.Column(db.String(50), nullable=False) 真实姓名,用于落款
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
```
这是系统的核心数据表,对应《档案摘抄申请表》。字段设计必须涵盖摘抄内容的描述、页数范围、用途以及审批状态。状态字段status将严格控制流程:0代表待审核,1代表已通过,2代表已驳回。
```python
class ArchiveRequest(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
archive_title = db.Column(db.String(200), nullable=False) 档案题名
content_summary = db.Column(db.Text, nullable=False) 摘抄内容摘要
page_range = db.Column(db.String(100), nullable=False) 摘抄页码范围
purpose = db.Column(db.Text, nullable=False) 摘抄用途
apply_time = db.Column(db.DateTime, default=datetime.now) 申请时间
status = db.Column(db.Integer, default=0) 0:待审核, 1:通过, 2:驳回
audit_comment = db.Column(db.Text) 审批意见
auditor_id = db.Column(db.Integer, db.ForeignKey('user.id')) 审批人ID
audit_time = db.Column(db.DateTime) 审批时间
```
为了满足制度建设中的“留痕”要求,任何关键操作(登录、提交申请审批)都必须记录日志,防止责任推诿。
```python
class AuditLog(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, nullable=False)
action = db.Column(db.String(100), nullable=False) 操作类型
detail = db.Column(db.Text) 操作详情
timestamp = db.Column(db.DateTime, default=datetime.now)
```
在模型定义完成后,我们需要实现具体的业务逻辑。为了确保读者能零门槛运行,我们将HTML模板直接嵌入Python代码中,无需创建额外的模板文件。
系统启动时必须自动创建数据库表,并初始化一个管理员账号(admin/123456)和一个普通员工账号(user/123456)。
```python

初始化数据库和默认用户
@app.before_first_request
def create_tables():
db.create_all()
if not User.query.filter_by(username='admin').first():
admin = User(username='admin', real_name='系统管理员', is_admin=True)
admin.set_password('123456')
db.session.add(admin)
user = User(username='user', real_name='张三', is_admin=False)
user.set_password('123456')
db.session.add(user)
db.session.commit()
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
user = User.query.filter_by(username=username).first()
if user and user.check_password(password):
login_user(user)
记录登录日志
log = AuditLog(user_id=user.id, action='用户登录', detail=f'用户 {username} 登录系统')
db.session.add(log)
db.session.commit()
return redirect(url_for('index'))
flash('用户名或密码错误')
return render_template_string(LOGIN_HTML)
```
这里包含两个关键接口:/submit用于员工提交摘抄申请,/audit/用于管理员进行审批。在审批逻辑中,我们强制要求填写审批意见,这是制度合规的关键点。
```python
@app.route('/submit', methods=['POST'])
@login_required
def submit_request():
if current_user.is_admin:
flash('管理员无需提交申请')
return redirect(url_for('index'))
new_req = ArchiveRequest(
user_id=current_user.id,
archive_title=request.form['archive_title'],
content_summary=request.form['content_summary'],
page_range=request.form['page_range'],
purpose=request.form['purpose']
)
db.session.add(new_req)
记录提交日志
log = AuditLog(user_id=current_user.id, action='提交申请', detail=f'提交档案: {new_req.archive_title}')
db.session.add(log)
db.session.commit()
flash('申请已提交,等待管理员审核')
return redirect(url_for('index'))
@app.route('/audit/
@login_required
def audit_request(req_id):
if not current_user.is_admin:
flash('无权操作')
return redirect(url_for('index'))
req = ArchiveRequest.query.get_or_404(req_id)
action = request.form.get('action') 'approve' or 'reject'
comment = request.form.get('comment')
if not comment:
flash('审批意见不能为空,请填写合规性说明')
return redirect(url_for('index'))
req.status = 1 if action == 'approve' else 2
req.audit_comment = comment
req.auditor_id = current_user.id
req.audit_time = datetime.now()
记录审批日志
action_text = "通过" if action == "approve" else "驳回"
log = AuditLog(user_id=current_user.id, action='审批操作', detail=f'ID:{req_id} {action_text}, 意见:{comment}')
db.session.add(log)
db.session.commit()
flash('审批完成')
return redirect(url_for('index'))
```
为了保持单文件结构,我们定义一个包含登录表单、申请列表和操作按钮的HTML字符串。这里使用了Bootstrap的基础样式类(需联网加载CSS,或仅作简单布局)来保证界面可用性。
```python
LAYOUT_HTML = """
当前用户: {{ current_user.real_name }} ({% if current_user.is_admin %}管理员{% else %}员工{% endif %}) | 退出
| ID | 申请人 | 档案题名 | 页码 | 状态 | 操作 |
|---|---|---|---|---|---|
| {{ req.id }} | {{ req.user.real_name }} | {{ req.archive_title }} | {{ req.page_range }} | {% if req.status == 0 %}待审核{% elif req.status == 1 %}已通过{% else %}已驳回{% endif %} | {% if current_user.is_admin and req.status == 0 %} {% else %} {{ req.audit_comment or '-' }} {% endif %} |
测试账号: 管理员 admin/123456, 员工 user/123456
LOGIN_HTML = LAYOUT_HTML 复用布局
```
将主页路由与模板绑定,并添加退出登录功能,启动Flask应用。
```python
@app.route('/')
@login_required
def index():
requests = ArchiveRequest.query.order_by(ArchiveRequest.apply_time.desc()).all()
return render_template_string(LAYOUT_HTML, requests=requests)
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('login'))
if __name__ == '__main__':
app.run(debug=True, port=5000)
```
代码编写完毕后,整个系统已经具备了档案摘抄制度落地的所有核心功能。请按照以下步骤进行验证,确保逻辑无误。
1. 启动服务
在终端中执行以下命令启动Web服务:
python app.py
看到输出 Running on http://127.0 dd0.1:5000/ 即表示启动成功。此时,当前目录下会自动生成archive.db数据库文件,并预置了测试账号。
2. 员工端操作验证(摘抄申请)
http://127.0.0.1:5000/login。3. 管理端操作验证(制度审批)
4. 合规性日志验证
为了验证制度中的“留痕”要求,你可以停止服务(Ctrl+C),然后使用SQLite查看工具或Python脚本查询数据库。你会发现audit_log表中完整记录了从登录、提交到审批的所有操作细节,
档案整理行业认证,这玩意儿到底是不是你的职场“硬通货”?