一个河海大学非官方云上自动健康打卡小程序,基于 vue 和 flask
由于不想写 3000 字检讨,本 repo 应运而生:smile:
- 前端使用了
vue.js
和uniapp
用于构建跨平台的小程序应用 - 后端使用了
flask
构建 RESTful API,使用celery+redis/rabbitMQ
作为任务队列,支持Gunicorn
和uWSGI
托管 API,提供了简易的docker
和docker-compose
示例
uniapp 官方推荐使用 HBuilder X 进行开发和部署,这里以 HBuilder X 为例
使用 HBuilder X 打开 frontend_app 文件夹,按照下图指引即可生成 H5 或微信小程序代码:
将 H5 代码上传部署至服务器或发布微信小程序不在本例的讨论范围,请自行查找相关方法
mkdir hhucheckin
cd hhucheckin
git clone https://github.com/Xiderowg/HHUHealthCheckin.git
cd backend_api
vi .flaskenv
...
vi .testenv
...
- .flaskenv 示例
FLASK_ENV=production
FLASK_APP=checkin_api.app:create_app
SECRET_KEY=修改这里的秘钥
DATABASE_URI=mysql://guest:guest@localhost/checkin
CELERY_BROKER_URL=redis://localhost:6379/0
CELERY_RESULT_BACKEND_URL=redis://localhost:6379/0
MAIL_SMTP_HOST=邮件服务器
MAIL_SMTP_PORT=邮件服务器端口
MAIL_SMTP_USER=邮件服务用户名
MAIL_SMTP_PASS=邮件服务密码
- .testenv 示例
FLASK_ENV=development
FLASK_APP=checkin_api.app:create_app
SECRET_KEY=testing
DATABASE_URI=mysql://guest:guest@localhost:1433/hhucheckin?driver=SQL Server
CELERY_BROKER_URL=amqp://guest:guest@localhost/
CELERY_RESULT_BACKEND_URL=amqp://guest:guest@localhost/
MAIL_SMTP_HOST=邮件服务器
MAIL_SMTP_PORT=邮件服务器端口
MAIL_SMTP_USER=邮件服务用户名
MAIL_SMTP_PASS=邮件服务密码
pip install -r requirements.txt
pip install -e .
checkin_api db upgrade
checkin_api init
*注:默认管理员用户名和密码均为admin
后台(自动)打卡任务依赖于 Celery Worker,需要确保 Celery Worker 正常运行才能保证每日按时打卡
celery worker -A checkin_api.celery_app:app --loglevel=info -B
pip install gunicorn
gunicorn checkin_api.wsgi:app
*注: gunicorn 默认运行在 8000 端口上,如果要配合 docker 使用请修改Dockerfile
和docekr-compose.yml
pip install uwsgi
uwsgi --http 127.0.0.1:5000 --module checkin.wsgi:app
checkin_api run
最简单的调试方式是使用 tox 这一插件进行调试
- 安装 tox:
pip install tox
- 执行测试:
tox -e test
- 安装 pytest:
pip install pytest pytest-runner pytest-flask pytest-factoryboy factory_boy
- 执行测试:
pytest
建议在 pycharm 中以debug
模式进行 pytest,将会自动读取.testenv
中的环境变量进行测试
Endpoint Methods Rule
--------------------------- ---------------- -------------------------
api.checkin_all POST /checkin/all
api.checkin_data GET /users/data
api.checkin_data_by_user_id GET /users/data/<int:user_id>
api.checkin_user POST /checkin
api.create_user POST /users/create
api.get_current_user GET, PUT /users
api.get_user_by_id DELETE, GET, PUT /users/<int:user_id>
api.list_users GET /users/all
auth.login POST /auth/login
auth.refresh POST /auth/refresh
auth.revoke_access_token DELETE /auth/revoke_access
auth.revoke_refresh_token DELETE /auth/revoke_refresh
auth.user_role GET /auth/role
账号认证路由为/auth/login
,利用 curl 测试的例子如下:
curl -X POST -H "Content-Type: application/json" -d '{"username": "admin", "password": "admin"}' http://localhost:5000/auth/login
用户名和密码正确的情况下,接口会返回如下数据:
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlIjoiYWNjZXNzIiwiaWRlbnRpdHkiOjEsImlhdCI6MTUxMDAwMDQ0MSwiZnJlc2giOmZhbHNlLCJqdGkiOiI2OTg0MjZiYi00ZjJjLTQ5MWItYjE5YS0zZTEzYjU3MzFhMTYiLCJuYmYiOjE1MTAwMDA0NDEsImV4cCI6MTUxMDAwMTM0MX0.P-USaEIs35CSVKyEow5UeXWzTQTrrPS_YjVsltqi7N4",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eSI6MSwiaWF0IjoxNTEwMDAwNDQxLCJ0eXBlIjoicmVmcmVzaCIsImp0aSI6IjRmMjgxOTQxLTlmMWYtNGNiNi05YmI1LWI1ZjZhMjRjMmU0ZSIsIm5iZiI6MTUxMDAwMDQ0MSwiZXhwIjoxNTEyNTkyNDQxfQ.SJPsFPgWpZqZpHTc4L5lG_4aEKXVVpLLSW1LO7g4iU0"
}
利用上一步得到的access_token
即可访问其他路由,示例如下:
curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlIjoiYWNjZXNzIiwiaWRlbnRpdHkiOjEsImlhdCI6MTUxMDAwMDQ0MSwiZnJlc2giOmZhbHNlLCJqdGkiOiI2OTg0MjZiYi00ZjJjLTQ5MWItYjE5YS0zZTEzYjU3MzFhMTYiLCJuYmYiOjE1MTAwMDA0NDEsImV4cCI6MTUxMDAwMTM0MX0.P-USaEIs35CSVKyEow5UeXWzTQTrrPS_YjVsltqi7N4" http://127.0.0.1:5000/users
其他路由测试方法类似,请参找源码构建测试用例