From 6995306195bf0fa1975f3b0d43a31550e158c66f Mon Sep 17 00:00:00 2001 From: RainSun Date: Fri, 28 Feb 2020 12:49:19 +0800 Subject: [PATCH 1/2] finish rank --- README.md | 23 ++++++++++++++++++++++- coc.py | 36 ++++++++++++++++++++++++++++-------- gunicorn.conf.py | 5 ++++- lib/allFunction.py | 30 +++++++++++++++++++++++++++++- lib/db.py | 36 ++++++++++++++++++++++++++++++++---- 5 files changed, 115 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 2ae7d3f..1fde172 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,14 @@ pip install requests pip install bs4 pip install gunicorn pip install pymongo +pip install flask_cors // 设置全局变量 export FLASK_APP=coc.py export FLASK_ENV=development // 启动临时服务 flask run --host=0.0.0.0 -p 8001 +// beta +flask run --host=127.0.0.1 -p 5005 // 启动永久服务 gunicorn coc:app -c gunicorn.conf.py // 查看已启动服务 @@ -63,6 +66,14 @@ kill (pid) /api/photo/upload 380:图片格式不符 +/api/game/schedule/upload +400:数据校验失败 +401:排名表修改失败 + +/api/game/schedule/get +410: 数据校验失败 +411:排名表获取失败 + # lost and found * /api/laf/add * data @@ -95,4 +106,14 @@ kill (pid) * id * type * comment_type - * comment_index \ No newline at end of file + * comment_index +# game +* /api/game/schedule/upload + * data + * nick + * count + * time + * sign +* /api/game/schedule/get + * data + * sign \ No newline at end of file diff --git a/coc.py b/coc.py index 55c4963..9d5be6f 100644 --- a/coc.py +++ b/coc.py @@ -2,16 +2,22 @@ import sys sys.path.append('./lib') # 引入处理函数 -from allFunction import manageLogin, managePhoto, manageAdd, manageDel, manageGet, manageDetail, manageComment +from allFunction import manageLogin, managePhoto, manageAdd, manageDel, manageGet, manageDetail, manageComment, manageScheduleUpload, manageScheduleGet # 引入flask -from flask import Flask, request, session +from flask import Flask, request, session, redirect # 初始化app app = Flask(__name__) # 引入跨域访问处理模块 -# from flask_cors import CORS +from flask_cors import CORS # 取消跨域访问限制,方便本地测试 注册CORS, "/*" 允许访问所有api -# CORS(app, resources=r'/*') +CORS(app, resources=r'/*') + + +# 测试用根路由 +@app.route('/api/') +def sayHello(): + return 'Hello! Glad to serve you.' # 登录接口,前端提供cid和pwd,包装在data里边然后md5校验也就是data:{cid,pwd,sign} @app.route('/api/login',methods=['POST']) @@ -55,10 +61,24 @@ def laf_comment(): res = manageComment(request) return res -# 审核 -@app.route('/api/shenhe') -def laf_shenhe(): - data = manageGet() +# 更新课表游戏排名信息 +@app.route('/api/game/schedule/upload',methods=['POST']) +def schedule_upload(): + res = manageScheduleUpload(request) + return res + +# 获取课表游戏排名信息 +@app.route('/api/game/schedule/get',methods=['POST']) +def schedule_get(): + res = manageScheduleGet(request) + return res + +# 访问拦截器转发到根路由 +@app.errorhandler(404) +def miss(e): + return redirect('/api') + +# 本地运行启动 if __name__ == '__main__': app.debug = True app.run() \ No newline at end of file diff --git a/gunicorn.conf.py b/gunicorn.conf.py index 0a3f7cd..bd1857b 100644 --- a/gunicorn.conf.py +++ b/gunicorn.conf.py @@ -1,7 +1,10 @@ # 并行工作线程数 workers = 4 # 监听内网端口5000【按需要更改】 -bind = '127.0.0.1:5003' +# coc +# bind = '127.0.0.1:5003' +# beta +bind = '127.0.0.1:5005' # 设置守护进程【关闭连接时,程序仍在运行】 daemon = True # 设置超时时间120s,默认为30s。按自己的需求进行设置 diff --git a/lib/allFunction.py b/lib/allFunction.py index 2b86d7f..c10e57c 100644 --- a/lib/allFunction.py +++ b/lib/allFunction.py @@ -5,7 +5,7 @@ import json from hashlib import md5 from urllib.parse import urlencode, unquote_plus from photoUpload import upload_photo -from db import addLAF, getLost, getFound, getDetail, delLAF, commentLAF, replyLAF +from db import addLAF, getLost, getFound, getDetail, delLAF, commentLAF, replyLAF, addRank, getRank # 主函数 # 处理登录操作 data:{cid,pwd,sign} @@ -114,6 +114,34 @@ def manageComment(request): else: return {'errcode': 370, 'errmsg': '数据校验失败'} +# 处理更新课表游戏排名信息 +def manageScheduleUpload(request): + # json化,应该能当dict用 + data_cache = json.loads(request.form['data']) + # MD5校验 + checked = checkData(data_cache) + data_cache.pop('sign') + if checked: + add_res = addRank( data_cache['nick'], data_cache['count'], data_cache['time']) + return add_res + else: + return {'errcode': 400, 'errmsg': '数据校验失败'} + +# 处理获取课表游戏排名信息 +def manageScheduleGet(request): + # json化,应该能当dict用 + data_cache = json.loads(request.form['data']) + # MD5校验 + checked = checkData(data_cache) + data_cache.pop('sign') + if checked: + # 获取排名表 + get_res = getRank() + return get_res + else: + return {'errcode': 400, 'errmsg': '数据校验失败'} + + # 工具函数 # MD5 校验 diff --git a/lib/db.py b/lib/db.py index ebd18e6..2f8e00d 100644 --- a/lib/db.py +++ b/lib/db.py @@ -13,10 +13,14 @@ def col(arg): return conn.coc.lost elif arg == 'found': return conn.coc.found + elif arg == 'rank': + return conn.coc.rank elif arg == 'lost_test': return conn.coc.lost_test elif arg == 'found_test': return conn.coc.found_test + elif arg == 'rank_test': + return conn.coc.rank_test else: return False @@ -26,7 +30,7 @@ def addLAF(data, add_type): col(add_type).insert_one(data) except Exception as e: # 失败了 - return { 'errcode': 331, 'errmsg': '插入数据库失败', 'errdetail': e} + return { 'errcode': 331, 'errmsg': '插入数据库失败'} return {'errcode': 200, 'errmsg': 'ok'} # 获取全部失物信息 @@ -36,7 +40,7 @@ def getLost(): for i in col('lost').find({'close':'false'},{'title': 1, 'create_time':1, 'img_url':1, 'total_addr':1,'type':1,'content':1}): arr.append(i) except Exception as e: - return {'errcode': 351, 'errmsg': 'lost表获取失败', 'errdetail': e} + return {'errcode': 351, 'errmsg': 'lost表获取失败'} return {'errcode': 200, 'arr': json_util.dumps(arr), 'errmsg': 'ok'} # 获取全部招领信息 @@ -46,7 +50,7 @@ def getFound(): for i in col('found').find({'close':'false'},{'title': 1, 'create_time':1, 'img_url':1, 'total_addr':1,'type':1, 'content':1}): arr.append(i) except Exception as e: - return {'errcode': 352, 'errmsg': 'found表获取失败', 'errdetail': e} + return {'errcode': 352, 'errmsg': 'found表获取失败'} return {'errcode': 200, 'arr': json_util.dumps(arr), 'errmsg': 'ok'} # 获取指定失物信息 @@ -59,7 +63,7 @@ def getDetail(id, get_type, errcode): return {'errcode': errcode, 'errmsg': '数据不存在'} except Exception as e: # id不合法 - return {'errcode': errcode+1, 'errmsg': 'id不合法', 'errdetail': e} + return {'errcode': errcode+1, 'errmsg': 'id不合法'} # 删除某个失物 def delLAF(id, del_type, del_user_info): @@ -91,3 +95,27 @@ def replyLAF(id, comment, laf_type): # 失败 return {'errcode': 372, 'errmsg': '回复数据库修改失败'} return {'errcode': 200, 'errmsg': 'ok'} + +# 向排名表里增加或覆写数据 +def addRank(nick, count, time): + try: + # col('rank').update({"cid":cid}, {'$setOnInsert':{"nick":nick}, '$set':{"grade":grade,"time":time}}, {'upsert':'true'}) + col('rank').insert_one({"count":count,"time":time,"nick":nick}) + except Exception as e: + # 失败 + return {'errcode': 401, 'errmsg': '排名表修改失败'} + return {'errcode': 200, 'errmsg': 'ok'} + +# 获取排名表所有信息(除了id) +def getRank(): + time_rank = [] + count_rank = [] + try: + for i in col('rank').find({},{"_id":0}).sort([("time",1)]).limit(10): + time_rank.append(i) + for i in col('rank').find({},{"_id":0}).sort([("count",1)]).limit(10): + count_rank.append(i) + except Exception as e: + print(e) + return {'errcode': 411, 'errmsg': '排名表获取失败'} + return {'errcode': 200, 'time_rank': time_rank, 'count_rank': count_rank, 'errmsg': 'ok'} \ No newline at end of file From 0fc49f6333733b1586c6c25f137634ca52330ba0 Mon Sep 17 00:00:00 2001 From: RainSun Date: Fri, 28 Feb 2020 17:21:06 +0800 Subject: [PATCH 2/2] update ignore & update sort --- .gitignore | 4 +--- README.md | 2 ++ __pycache__/coc.cpython-37.pyc | Bin 2113 -> 0 bytes lib/__pycache__/db.cpython-37.pyc | Bin 2843 -> 0 bytes lib/__pycache__/photoUpload.cpython-37.pyc | Bin 1262 -> 0 bytes lib/db.py | 4 ++-- 6 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 __pycache__/coc.cpython-37.pyc delete mode 100644 lib/__pycache__/db.cpython-37.pyc delete mode 100644 lib/__pycache__/photoUpload.cpython-37.pyc diff --git a/.gitignore b/.gitignore index bf15cde..e08c6fe 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,2 @@ -lib/__pycache__/allFunction.cpython-37.pyc -lib/__pycache__/crawler.cpython-37.pyc -lib/__pycache__/mail.cpython-37.pyc +__pycache__ .vscode/settings.json diff --git a/README.md b/README.md index 1fde172..877cfa1 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,8 @@ gunicorn coc:app -c gunicorn.conf.py pstree -ap|grep gunicorn // 关闭某服务 kill (pid) +//关闭venv +deactivate ``` ## 错误代码一览 diff --git a/__pycache__/coc.cpython-37.pyc b/__pycache__/coc.cpython-37.pyc deleted file mode 100644 index a690063de510699a20e64356acff4c422a1d3471..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2113 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 diff --git a/lib/db.py b/lib/db.py index 2f8e00d..1443c6f 100644 --- a/lib/db.py +++ b/lib/db.py @@ -111,9 +111,9 @@ def getRank(): time_rank = [] count_rank = [] try: - for i in col('rank').find({},{"_id":0}).sort([("time",1)]).limit(10): + for i in col('rank').find({},{"_id":0}).sort([("time",1),("count",1)]).limit(10): time_rank.append(i) - for i in col('rank').find({},{"_id":0}).sort([("count",1)]).limit(10): + for i in col('rank').find({},{"_id":0}).sort([("count",1),("time",1)]).limit(10): count_rank.append(i) except Exception as e: print(e)