一、环境搭建与依赖安装
在开始构建系统之前,我们需要准备Python运行环境。本系统基于Python 3.8及以上版本开发,使用轻量级Web框架Flask进行快速部署。请打开终端(Windows下为CMD或PowerShell,Mac/Linux下为Terminal),依次执行以下命令。
1. 安装Python环境
如果尚未安装Python,请访问 https://www.python.org/downloads/ 下载对应操作系统的安装包。安装时务必勾选 "Add Python to PATH" 选项。安装完成后,通过以下命令验证版本:
```bash
python --version
```
2. 创建项目目录并初始化虚拟环境
为了不污染全局环境,我们创建一个独立的文件夹并激活虚拟环境。执行以下命令:
```bash
mkdir print_training_system
cd print_training_system
python -m venv venv
```
3. 激活虚拟环境并安装依赖
根据操作系统不同,激活命令如下。激活后,安装Flask框架:
- Windows:
venv\Scripts\activate
- Mac/Linux:
source venv/bin/activate
激活成功后,命令行前缀会出现 (venv) 标识。接着安装Flask:
```bash
pip install flask
```
二、项目目录结构规划
为了保证代码清晰易维护,我们需要建立规范的目录结构。请在 print_training_system 根目录下手动创建以下文件夹和文件:
- static: 存放CSS、JS及上传的档案文件。
- templates: 存放HTML前端页面。
- uploads: 专门用于存储用户上传的印刷档案和培训视频。
- app.py: 后端核心逻辑文件。
执行以下命令快速生成目录:
```bash
mkdir static templates uploads
type nul > app.py
```
三、数据库设计与初始化
本系统使用SQLite内置数据库,无需安装额外数据库服务。我们需要设计两张表:users(用于员工登录)和 resources(用于存储档案和培训资料信息)。
在 app.py 中写入以下完整代码,包含数据库初始化逻辑。该脚本会在首次运行时自动生成 database.db 文件,并预置一个管理员账号(admin/123456)。
```python
import sqlite3
import os
from flask import Flask, render_template, request, redirect, url_for, session, send_from_directory, flash
from werkzeug.utils import secure_filename
app = Flask(__name__)
app.secret_key = 'print_system_secret_key_change_in_production'
app.config['UPLOAD_FOLDER'] = 'uploads'
app.config['ALLOWED_EXTENSIONS'] = {'pdf', 'png', 'jpg', 'jpeg', 'mp4', 'docx', 'pptx'}
确保上传目录存在
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
def get_db_connection():
conn = sqlite3.connect('database.db')
conn.row_factory = sqlite3.Row
return conn
def init_db():
conn = get_db_connection()
创建用户表
conn.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password TEXT NOT NULL,
role TEXT NOT NULL
)
''')
创建资源表
conn.execute('''
CREATE TABLE IF NOT EXISTS resources (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
category TEXT NOT NULL,
filename TEXT NOT NULL,
upload_date TEXT NOT NULL,
uploader TEXT NOT NULL
)
''')
初始化管理员账号 (如果不存在)
try:
conn.execute('INSERT INTO users (username, password, role) VALUES (?, ?, ?)',
('admin', '123456', 'admin'))
except sqlite3.IntegrityError:
pass 用户已存在
conn.commit()
conn.close()
启动时初始化数据库
init_db()
```
四、后端核心逻辑实现
继续在 app.py 中追加以下代码,实现用户认证、文件上传、列表展示和下载功能。这部分代码直接处理HTTP请求,是系统的核心。
```python
辅助函数:检查文件扩展名
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS']
1. 登录页面路由
@app.route('/', methods=['GET', 'POST'])
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
conn = get_db_connection()
user = conn.execute('SELECT FROM users WHERE username = ? AND password = ?', (username, password)).fetchone()
conn.close()
if user:
session['user_id'] = user['id']
session['username'] = user['username']
session['role'] = user['role']
return redirect(url_for('dashboard'))
else:
flash('用户名或密码错误')
return render_template('login.html')
2. 主控台页面路由
@app.route('/dashboard')
def dashboard():
if 'user_id' not in session:
return redirect(url_for('login'))
conn = get_db_connection()
获取所有资源,按上传时间倒序排列
resources = conn.execute('SELECT FROM resources ORDER BY upload_date DESC').fetchall()
conn.close()
return render_template('dashboard.html', resources=resources)
3. 文件上传处理路由
@app.route('/upload', methods=['POST'])
def upload_file():
if 'user_id' not in session:
return redirect(url_for('login'))
if 'file' not in request.files:
flash('没有文件部分')
return redirect(url_for('dashboard'))
file = request.files['file']
title = request.form['title']
category = request.form['category'] 印刷档案 或 培训资料
if file.filename == '':
flash('未选择文件')
return redirect(url_for('dashboard'))
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
处理文件名重复问题
base, ext = os.path.splitext(filename)
counter = 1
while os.path.exists(os.path.join(app.config['UPLOAD_FOLDER'], filename)):
filename = f"{base}_{counter}{ext}"
counter += 1
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
记录到数据库
conn = get_db_connection()
conn.execute('INSERT INTO resources (title, category, filename, upload_date, uploader) VALUES (?, ?, ?, ?, ?)',
(title, category, filename, datetime.now().strftime('%Y-%m-%d %H:%M:%S'), session['username']))
conn.commit()
conn.close()
flash('文件上传成功')
else:
flash('不支持的文件类型')
return redirect(url_for('dashboard'))
4. 文件下载路由
@app.route('/download/
')
def download_file(filename):
if 'user_id' not in session:
return redirect(url_for('login'))
return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
5. 注销路由
@app.route('/logout')
def logout():
session.clear()
return redirect(url_for('login'))
if __name__ == '__main__':
host='0.0.0.0' 允许局域网访问
app.run(host='0.0.0.0', port=5000, debug=True)
```
五、前端页面模板开发
为了方便操作,我们需要创建三个HTML文件。请在 templates 文件夹下创建 login.html、dashboard.html 和 base.html。
1. 创建基础模板 base.html
这个文件包含通用的头部和尾部样式,使用Bootstrap 5 CDN以保证界面美观且无需编写复杂CSS。
```html
印刷档案培训系统
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
{{ message }}
{% endfor %}
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
```
2. 创建登录页面 login.html
```html
{% extends "base.html" %}
{% block content %}

默认管理员账号: admin / 123456
{% endblock %}
```
3. 创建主控台页面 dashboard.html
```html
{% extends "base.html" %}
{% block content %}
| ID |
标题 |
分类 |
上传者 |
时间 |
操作 |
{% for resource in resources %}
| {{ resource.id }} |
{{ resource.title }} |
{{ resource.category }}
|
{{ resource.uploader }} |
{{ resource.upload_date }} |
下载
|
{% else %}
| 暂无数据 |
{% endfor %}
{% endblock %}
```
六、系统启动与局域网访问
代码和页面准备就绪后,即可启动系统。请确保终端仍处于虚拟环境激活状态,且位于项目根目录下。
1. 启动服务
执行以下命令启动Web服务器:
```bash
python app.py
```
当终端显示 Running on http://0.0.0.0:5000 时,表示启动成功。
2. 本地访问测试
打开本机浏览器,访问 http://127.0.0.1:5000。使用默认账号 admin / 123456 登录。尝试上传一份PDF格式的印刷工艺单,检查是否能正常显示在列表中并下载。
3. 局域网内其他设备访问
为了让车间或其他部门的电脑能访问此系统,需要获取本机的局域网IP地址。
- Windows: 在终端输入
ipconfig,找到“IPv4 地址”(例如 192.168.1.105)。
- Mac/Linux: 在终端输入
ifconfig 或 ip a,查看 inet 地址。
假设本机IP为 192.168.1.105,那么连接在同一Wi-Fi或网线下的其他设备,只需在浏览器中输入 http://192.168.1.105:5000 即可访问系统进行档案查阅和培训学习。
七、常见问题与维护指南
1. 上传文件大小限制
Flask默认限制上传文件大小较小。如果需要上传几百兆的视频培训资料,需要在 app.py 配置中添加:
```python
app.config['MAX_CONTENT_LENGTH'] = 500 1024 1024 限制为500MB
```
2. 数据备份
所有数据存储在 database.db 文件中,所有上传文件在 uploads 文件夹中。定期只需复制这两个文件/文件夹即可完成完整备份。
3. 增加新员工账号
目前系统未开放注册页面。如需添加新员工,可临时使用Python命令行操作,或直接修改SQLite数据库文件。最简单的方法是在 init_db() 函数中仿照admin的写法添加新用户,然后重启一次服务(注意:重启会重置数据库结构,仅建议在初始化阶段使用)。正式环境建议编写一个简单的 /add_user 路由或使用SQLite管理工具如 DB Browser for SQLite 打开 database.db 手动插入记录。