环境准备
1. 下载安装对应系统的Python安装包,直接从官方地址下载:https://www.python.org/downloads/
安装时必须勾选「Add Python to PATH」选项,否则后续命令无法正常执行。安装完成后打开终端(Windows按Win+R输入cmd回车,Mac直接打开终端程序),输入以下命令验证安装:
```
python --version
```
输出版本号即说明安装成功。
2. 在终端执行以下命令,安装项目所需依赖:
```
pip install flask flask-sqlalchemy pandas openpyxl
```
等待安装完成即可,所有依赖均为开源免费工具。
项目文件创建
按照以下结构创建文件和文件夹,整个项目仅需1个主程序文件+1个空文件夹,操作简单:
- 新建根文件夹,命名为 passport-manager
- 在根文件夹内新建空白文件,命名为 app.py
- 在根文件夹内新建子文件夹,命名为 instance
复制完整可运行代码

打开刚刚创建的app.py文件,直接复制以下完整代码,无需修改即可使用,自定义配置会标注修改位置:
```
from flask import Flask, render_template_string, request, redirect, send_file
from flask_sqlalchemy import SQLAlchemy
import pandas as pd
import io
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///instance/passport.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
可自行修改管理员账号密码
ADMIN_USER = 'admin'
ADMIN_PWD = '123456'
db = SQLAlchemy(app)
护照档案数据模型
class Passport(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), nullable=False)
passport_no = db.Column(db.String(20), unique=True, nullable=False)
expire_date = db.Column(db.String(10), nullable=False)
status = db.Column(db.String(20), nullable=False)
note = db.Column(db.String(200))
def to_dict(self):
return {
'id': self.id,
'name': self.name,
'passport_no': self.passport_no,
'expire_date': self.expire_date,
'status': self.status,
'note': self.note
}
前端页面模板
HTML_TPL = '''
护照档案管理
护照档案管理系统
{% if not login %}
{% else %}
| 姓名 |
护照号 |
有效期 |
保管状态 |
备注 |
操作 |
{% for item in list %}
| {{item.name}} |
{{item.passport_no}} |
{{item.expire_date}} |
{{item.status}} |
{{item.note}} |
删除
|
{% endfor %}
'''
@app.route('/')
def index():
kw = request.args.get('kw', '')
login = request.cookies.get('passport_login') == '1'
if not login:
return render_template_string(HTML_TPL, login=False)
if kw:
data = Passport.query.filter(Passport.name.contains(kw) | Passport.passport_no.contains(kw)).all()
else:
data = Passport.query.all()
list_data = [item.to_dict() for item in data]
return render_template_string(HTML_TPL, login=True, list=list_data, kw=kw)
@app.route('/login', methods=['POST'])
def login():
username = request.form.get('username')
password = request.form.get('password')
if username == ADMIN_USER and password == ADMIN_PWD:
resp = redirect('/')
resp.set_cookie('passport_login', '1', max_age=36002430)
return resp
return redirect('/')
@app.route('/add', methods=['POST'])
def add():
name = request.form.get('name')
passport_no = request.form.get('passport_no')
expire_date = request.form.get('expire_date')
status = request.form.get('status')
note = request.form.get('note', '')
if Passport.query.filter_by(passport_no=passport_no).first():
return redirect('/')
p = Passport(name=name, passport_no=passport_no, expire_date=expire_date, status=status, note=note)
db.session.add(p)
db.session.commit()
return redirect('/')
@app.route('/delete')
def delete():
id = request.args.get('id')
p = Passport.query.get(id)
if p:
db.session.delete(p)
db.session.commit()
return redirect('/')
@app.route('/export')
def export():
data = [item.to_dict() for item in Passport.query.all()]
df = pd.DataFrame(data)
df = df.rename(columns={
'name':'姓名',
'passport_no':'护照号',
'expire_date':'有效期',
'status':'保管状态',
'note':'备注'
})
output = io.BytesIO()
df.to_excel(output, index=False, engine='openpyxl')
output.seek(0)
return send_file(output, download_name='护照档案列表.xlsx', as_attachment=True)
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(debug=False)
```
启动运行系统
- 打开终端,进入passport-manager根文件夹,Windows示例(文件夹放在D盘根目录):
```
cd D:\passport-manager
```
Mac/Linux示例:
```
cd /home/yourname/passport-manager
```
- 执行启动命令:
```
python app.py
```
- 打开浏览器,输入地址 http://localhost:5000 即可进入管理系统
使用与数据维护
核心功能操作
- 登录:默认账号为 admin,密码为 123456,打开app.py修改ADMIN_USER和ADMIN_PWD即可自定义账号密码
- 新增:登录后填写档案信息,点击「新增档案」即可保存,系统自动去重,同一护照号不会重复录入
- 搜索:输入姓名或护照号关键词即可模糊搜索匹配的档案
- 导出:点击「导出全部档案」即可下载Excel格式的档案列表,直接用于备案
- 删除:点击对应记录的删除按钮,确认后即可删除错误记录
数据备份与迁移
所有档案数据都存储在instance文件夹内的passport.db文件中,备份只需复制整个instance文件夹到安全位置即可,迁移到其他设备时,把原instance文件夹复制到新项目的根目录即可保留所有数据,不会丢失。
局域网多人使用配置
如果需要单位局域网内多人同时访问,只需修改app.py最后一行启动代码,将原有代码改为:
```
app.run(debug=False, host='0.0.0.0', port=5000)
```
修改后重新启动,其他人通过部署电脑的局域网IP+5000端口即可访问,例如部署电脑IP为192.168.1.100,访问地址为http://192.168.1.100:5000,无需额外配置。