Python信息系统实验:仓库管理 这是给物流管理专业设计的仓库信息管理实验。尽量采用基本的方式组织数据、模块与实验。同时体现Browser-Application Server-Database 的三层逻辑。
实验要求软件- 开发工具:Python+ Flask+HTML
- 数据库:SQLite
- 架构:三层架构(Browser+Application Servier+Database)
仓库管理实验模拟一个简单的仓库的以下基本管理过程: - 1)库位查询:查询库位编码及其容量
- 2)增加库位
- 3)删除库位
- 4)入库:商品编码、库位
- 5)出库:商品编码
- 6)商品库位查询:根据商品编码找库位
- 7)库位统计
数据库表格- StorageUnit: scode text, ssize int;
- Storage: scode text, ccode text, cname text, status text (=in, out)
Web Flask关于Flask请参考前文。Flask可以做很复杂的应用,但是本文仅仅利用其最简单的能力完成几个页面和功能之间的切换。 几分钟做个Web应用
from flask import Flask from flask import session, redirect, url_for, request from flask import render_template
数据访问接口关于数据库及其访问接口,请参考前文。 Python数据库
from Data import Data
导航采用三组菜单导航 - 基本功能组:主页index、关于about、登录login
- 对存储单元的操纵,主要是列表显示StorageUnitList、增加StorageUnitAdd和删除StorageUnitDelete
- 对存储记录的操纵,主要是列表显示StorageList、增加StorageAdd和删除StorageDelete
- 对于Add和Delete这两类Action,生成表单Form和执行更新分开来,,例如StorageAdd生成Form,而StorageAddExe执行
- 在login,StorageUnitAddExe,StorageUnitDeleteExe,StorageAddExe,StorageDeleteExe中,通过session或request操纵交互数据。
app = Flask(__name__)
@app.route('/') def index(): if 'username' in session: return redirect(url_for('StorageUnitList')) else: return redirect(url_for('login'))
@app.route('/about') def about(): return render_template('about.html', name='Flask')
@app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': u = request.form['username'] if u is None or len(u)==0: return redirect(url_for('login')) session['username'] = u return redirect(url_for('StorageUnitList')) return ''' <center> Warehouse management<br><br> <table border=1> <form action="" method="post"> <tr> <td>user name</td> <td><input type=text name=username></td> </tr> <tr> <td></td> <td><input type=submit value=Login></td> </tr> </form> </table> </center> '''
@app.route('/StorageUnitList') def StorageUnitList(): db = Data() db.createDatabase() d = db.selectStorageUnit() return render_template('StorageUnitList.html', data=d)
@app.route('/StorageUnitAdd', methods=['GET', 'POST']) def StorageUnitAdd(): return ''' <center> Warehouse management --> add a Storage Unit<br><br> <table border=1> <form action="StorageUnitAddExe" method="post"> <tr> <td>code</td> <td><input type=text name=scode></td> </tr> <tr> <td>size</td> <td><input type=text name=ssize></td> </tr> <tr> <td></td> <td><input type=submit value=OK></td> </tr> </form> </table> </center> '''
@app.route('/StorageUnitAddExe', methods=['GET', 'POST']) def StorageUnitAddExe(): scode = request.form['scode'] ssize = request.form['ssize'] if scode is not None and len(scode)>0 and \ ssize is not None and len(ssize)>0: db = Data() db.createDatabase() db.insertStorageUnit(scode,ssize); return redirect(url_for('StorageUnitList'))
@app.route('/StorageUnitDelete', methods=['GET', 'POST']) def StorageUnitDelete(): return ''' <center> Warehouse management --> delete a Storage Unit<br><br> <table border=1> <form action="StorageUnitDeleteExe" method="post"> <tr> <td>code</td> <td><input type=text name=scode></td> </tr> <tr> <td></td> <td><input type=submit value=OK></td> </tr> </form> </table> </center> '''
@app.route('/StorageUnitDeleteExe', methods=['GET', 'POST']) def StorageUnitDeleteExe(): scode = request.form['scode'] if scode is not None and len(scode)>0: db = Data() db.createDatabase() db.deleteStorageUnit(scode); return redirect(url_for('StorageUnitList'))
@app.route('/StorageList') def StorageList(): db = Data() db.createDatabase() d = db.selectStorage() return render_template('StorageList.html', data=d)
@app.route('/StorageAdd', methods=['GET', 'POST']) def StorageAdd(): return ''' <center> Warehouse management --> add a Storage<br><br> <table border=1> <form action="StorageAddExe" method="post"> <tr> <td>storage unit code </td> <td><input type=text name=scode></td> </tr> <tr> <td>goods code </td> <td><input type=text name=ccode></td> </tr> <tr> <td>goods name </td> <td><input type=text name=cname></td> </tr> <tr> <td>status </td> <td><input type=text name=status></td> </tr> <tr> <td></td> <td><input type=submit value=OK></td> </tr> </form> </table> </center> '''
@app.route('/StorageAddExe', methods=['GET', 'POST']) def StorageAddExe(): scode = request.form['scode'] ccode = request.form['ccode'] cname = request.form['cname'] status = request.form['status'] if scode is not None and len(scode)>0 and ccode is not None and \ len(ccode)>0 and cname is not None and \ len(cname)>0 and status is not None and len(status)>0: db = Data() db.createDatabase() if len(db.selectStorageUnitBy(scode))>0: db.insertStorage(scode,ccode,cname,status); return redirect(url_for('StorageList'))
@app.route('/StorageDelete', methods=['GET', 'POST']) def StorageDelete(): return ''' <center> Warehouse management --> delete a Storage Unit<br><br> <table border=1> <form action="StorageDeleteExe" method="post"> <tr> <td>storage unit code</td> <td><input type=text name=scode></td> </tr> <tr> <td>goods code</td> <td><input type=text name=ccode></td> </tr> <tr> <td></td> <td><input type=submit value=OK></td> </tr> </form> </table> </center> '''
@app.route('/StorageDeleteExe', methods=['GET', 'POST']) def StorageDeleteExe(): scode = request.form['scode'] ccode = request.form['ccode'] if scode is not None and len(scode)>0 and \ ccode is not None and len(ccode)>0: db = Data() db.createDatabase() db.deleteStorage(scode, ccode); return redirect(url_for('StorageList'))
# set the secret key: app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT**^4'
if __name__ == '__main__': app.run()
# Flask: # http://docs.jinkan.org/docs/flask/index.html # Template: # http://docs.jinkan.org/docs/jinja2/
Web页面- 如上代码所隐含,使用了一个静态文件,即about.html;
- 使用了两个模板文件,用于生成检索数据库表生成的列表,即StorageList.html和StorageUnitList.html;
- 注意在login,StorageUnitAdd,StorageUnitDelete,StorageAdd,StorageDelete中都生成了Form,这些内容是在浏览器前端显示的。
about.html<html> <body> <center> Warehouse management: this is just a test application for demonstrating logistics information systems.<br> <br> <table border=1> <tr> <td colspan=4>Menu</td> </tr> <tr> <td>Storage Unit</td> <td>[<a href='/StorageUnitList'>list</a>]</td> <td>[<a href='/StorageUnitAdd'>add</a>]</td> <td>[<a href='/StorageUnitDelete'>delete</a>]</td> </tr> <tr> <td>Storage</td> <td>[<a href='/StorageList'>list</a>]</td> <td>[<a href='/StorageAdd'>add</a>]</td> <td>[<a href='/StorageDelete'>delete</a>]</td> </tr> <tr> <td>System</td> <td>[<a href='about'>about</a>]</td> <td>[<a href='login'>login</a>]</td> <td>[<a href='/'>index</a>]</td> </tr> <table> </center> </body> </html>
StorageList.html<html> <body> <center> Warehouse management -> Storage<br> <br> <table border=1> <tr> <td colspan=4>Menu</td> </tr> <tr> <td>Storage Unit</td> <td>[<a href='/StorageUnitList'>list</a>]</td> <td>[<a href='/StorageUnitAdd'>add</a>]</td> <td>[<a href='/StorageUnitDelete'>delete</a>]</td> </tr> <tr> <td>Storage</td> <td>[<a href='/StorageList'>list</a>]</td> <td>[<a href='/StorageAdd'>add</a>]</td> <td>[<a href='/StorageDelete'>delete</a>]</td> </tr> <tr> <td>System</td> <td>[<a href='about'>about</a>]</td> <td>[<a href='login'>login</a>]</td> <td>[<a href='/'>index</a>]</td> </tr> <table>
<br> <table border=1> <tr> <td>Storage Unit Code</td> <td>Goods Code</td> <td>Goods Name</td> <td>Status</td> <tr> {% for a in data %} <tr> <td>{{ a[0] }}</td> <td>{{ a[1] }}</td> <td>{{ a[2] }}</td> <td>{{ a[3] }}</td> </tr> {% endfor %} <table> </center> </body> </html>
StorageUnitList.html<html> <body> <center> Warehouse management -> Storage Units<br> <br> <table border=1> <tr> <td colspan=4>Menu</td> </tr> <tr> <td>Storage Unit</td> <td>[<a href='/StorageUnitList'>list</a>]</td> <td>[<a href='/StorageUnitAdd'>add</a>]</td> <td>[<a href='/StorageUnitDelete'>delete</a>]</td> </tr> <tr> <td>Storage</td> <td>[<a href='/StorageList'>list</a>]</td> <td>[<a href='/StorageAdd'>add</a>]</td> <td>[<a href='/StorageDelete'>delete</a>]</td> </tr> <tr> <td>System</td> <td>[<a href='about'>about</a>]</td> <td>[<a href='login'>login</a>]</td> <td>[<a href='/'>index</a>]</td> </tr> <table>
<br> <table border=1> <tr><td>Code</td><td>Size</td><tr> {% for a in data %} <tr> <td>{{ a[0] }}</td> <td>{{ a[1] }}</td> </tr> {% endfor %} <table> </center> </body> </html>
测试在Anaconda Spyder中执行index.py,得到: * Serving Flask app "index" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
在浏览器输入以下网址测试: http://127.0.0.1:5000/ LoginStorage Unit: ListStorage Unit: AddStorage Unit: DeleteStorage: ListStorage: AddStorage: Delete私信小编01 领取完整代码 |