fix: package import;add: hist and count,rank list
This commit is contained in:
parent
a5712c9b17
commit
8476f11897
3
.gitignore
vendored
3
.gitignore
vendored
@ -11,3 +11,6 @@ pic/
|
||||
|
||||
# cache
|
||||
__pycache__/
|
||||
|
||||
# test
|
||||
test.*
|
36
app.py
36
app.py
@ -8,13 +8,11 @@
|
||||
|
||||
# here put the import lib
|
||||
import os
|
||||
import lib.elo as elo
|
||||
import lib.utils as utils
|
||||
from lib import *
|
||||
from flask import Flask, request, redirect, render_template
|
||||
|
||||
P0 = None
|
||||
P1 = None
|
||||
ses = utils.get_session()
|
||||
P0, P1 = None, None
|
||||
ses = get_session()
|
||||
app = Flask(__name__, template_folder='./templates/', static_folder='./static/')
|
||||
app.config['ROOT_FOLDER'] = os.path.abspath('.')
|
||||
|
||||
@ -22,24 +20,44 @@ app.config['ROOT_FOLDER'] = os.path.abspath('.')
|
||||
@app.route('/new', methods=["GET"])
|
||||
def root():
|
||||
global P0, P1
|
||||
P0, P1 = utils.match(ses)
|
||||
|
||||
P0, P1 = match(ses)
|
||||
return render_template(
|
||||
'index.html',
|
||||
p0src='./static/pic/{:d}.jpeg'.format(P0.id),
|
||||
p0name=P0.name,
|
||||
p0work='{:.2f}'.format(P0.rate),
|
||||
p0work=P0.work,
|
||||
p1src='./static/pic/{:d}.jpeg'.format(P1.id),
|
||||
p1name=P1.name,
|
||||
p1work='{:.2f}'.format(P1.rate)
|
||||
p1work=P1.work
|
||||
)
|
||||
|
||||
@app.route('/elo', methods=["GET"])
|
||||
def elo_res():
|
||||
global P0, P1
|
||||
|
||||
res = request.args.get('win')
|
||||
elo.set_result(P0, P1, int(res))
|
||||
set_result(P0, P1, int(res))
|
||||
|
||||
ses.commit()
|
||||
P0, P1 = None, None
|
||||
|
||||
return redirect('/new')
|
||||
|
||||
@app.route('/list', methods=["GET"])
|
||||
def rank_list():
|
||||
b = int(request.args.get('b'))
|
||||
len = int(request.args.get('len')) if request.args.get('len') else 10
|
||||
|
||||
res = get_rank(ses, b, len)
|
||||
kw = dict()
|
||||
for k in range(len):
|
||||
kw["P{:d}rank".format(k)] = b + k
|
||||
kw["P{:d}name".format(k)] = res[k].name
|
||||
kw["P{:d}rate".format(k)] = '{:.2f}'.format(res[k].rate)
|
||||
|
||||
return render_template('list.html', **kw)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=True, host='0.0.0.0', port=4002)
|
||||
|
20
lib/__init__.py
Normal file
20
lib/__init__.py
Normal file
@ -0,0 +1,20 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- encoding: utf-8 -*-
|
||||
'''
|
||||
@File : __init__.py
|
||||
@Author : liuyihui
|
||||
@Email : liuyihui02@gmail.com
|
||||
'''
|
||||
|
||||
# here put the import lib
|
||||
from .db_init import Person
|
||||
from .elo import set_result
|
||||
from .utils import match, get_rank, get_session
|
||||
|
||||
__all__ = [
|
||||
"match",
|
||||
"Person",
|
||||
"set_result",
|
||||
"get_rank",
|
||||
"get_session"
|
||||
]
|
@ -19,10 +19,14 @@ class Person(Base):
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
name = Column(String)
|
||||
work = Column(String, default='无')
|
||||
rate = Column(Float, default=1400)
|
||||
rate = Column(Float, default=1400.0)
|
||||
hist = Column(String, default='')
|
||||
count = Column(Integer, default=0)
|
||||
|
||||
def __repr__(self):
|
||||
return "<Person(name='%s', work='%s', rate='%f')>" % (self.name, self.work, self.rate)
|
||||
return "<Person(name='%s', work='%s', rate='%f', count='%d')>" % (
|
||||
self.name, self.work, self.rate, self.count
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
10
lib/elo.py
10
lib/elo.py
@ -8,7 +8,7 @@
|
||||
|
||||
# here put the import lib
|
||||
import math
|
||||
from lib.db_init import Person
|
||||
from .db_init import Person
|
||||
|
||||
def __compute_wre(A: Person, B: Person) -> float:
|
||||
'''compute win rate expectation (wre for short)
|
||||
@ -32,6 +32,11 @@ def __compute_K(P: Person) -> float:
|
||||
else:
|
||||
return 36
|
||||
|
||||
def __add_history(P: Person):
|
||||
P.count += 1
|
||||
if P.count % 10 == 0:
|
||||
P.hist += str('{:.2f}'.format(P.rate))
|
||||
|
||||
def set_result(A: Person, B: Person, res: float) -> None:
|
||||
'''set result of this game
|
||||
|
||||
@ -45,3 +50,6 @@ def set_result(A: Person, B: Person, res: float) -> None:
|
||||
if res >= 0:
|
||||
A.rate += __compute_K(A) * (1 - res - wre1)
|
||||
B.rate += __compute_K(B) * (res - wre2)
|
||||
|
||||
__add_history(A)
|
||||
__add_history(B)
|
||||
|
@ -9,7 +9,7 @@
|
||||
# here put the import lib
|
||||
import math
|
||||
from typing import List
|
||||
from lib.db_init import Person
|
||||
from . import db_init
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy.orm.session import Session
|
||||
@ -17,6 +17,7 @@ from sqlalchemy.sql.expression import desc, func
|
||||
|
||||
engine = create_engine('sqlite:///data.db?check_same_thread=False', echo=False)
|
||||
session_maker = sessionmaker(bind=engine)
|
||||
Person = db_init.Person
|
||||
|
||||
def get_session() -> Session:
|
||||
'''make a session instance
|
||||
|
@ -1 +1,2 @@
|
||||
flask
|
||||
sqlalchemy
|
@ -107,3 +107,55 @@ a {
|
||||
.col-sm p {
|
||||
margin-top : 1%;
|
||||
}
|
||||
.tg {
|
||||
border-collapse: collapse;
|
||||
border-color : #aaa;
|
||||
border-spacing: 0;
|
||||
border-style : solid;
|
||||
border-width : 1px;
|
||||
width : 75%;
|
||||
margin : 3% auto;
|
||||
}
|
||||
td, th {
|
||||
text-align : center;
|
||||
height : 3%;
|
||||
}
|
||||
.tg td {
|
||||
background : #fff;
|
||||
border-color : #aaa;
|
||||
border-style : solid;
|
||||
border-width : 0px;
|
||||
color : #333;
|
||||
font-size : 14px;
|
||||
overflow : hidden;
|
||||
padding : 10px 5px;
|
||||
word-break : normal;
|
||||
}
|
||||
.tg th {
|
||||
background : #f38630;
|
||||
border-color : #aaa;
|
||||
border-style : solid;
|
||||
border-width : 0px;
|
||||
color : #fff;
|
||||
font-size : 14px;
|
||||
font-weight : normal;
|
||||
overflow : hidden;
|
||||
padding : 10px 5px;
|
||||
word-break : normal;
|
||||
}
|
||||
.tg .tg-7d57 {
|
||||
background : #FCFBE3;
|
||||
border-color : inherit;
|
||||
vertical-align: top;
|
||||
}
|
||||
.tg .tg-0pky {
|
||||
border-color : inherit;
|
||||
vertical-align: top;
|
||||
}
|
||||
.tg .tg-0lax {
|
||||
vertical-align: top;
|
||||
}
|
||||
.tg .tg-dg7a {
|
||||
background : #FCFBE3;
|
||||
vertical-align: top;
|
||||
}
|
@ -10,14 +10,14 @@
|
||||
</head>
|
||||
<body>
|
||||
<header id="header" class="header">
|
||||
<div class="textlogo"><p><a href="#">ELO Star</a></p></div>
|
||||
<div class="textlogo"><p><a href="/">ELO Star</a></p></div>
|
||||
<div class="nav">
|
||||
<div class="row">
|
||||
<div class="col-sm">
|
||||
<p><a href="#">排行榜</a></p>
|
||||
<p><a href="/list?b=1&len=10">排行榜</a></p>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
<p><a href="#">添加资料</a></p>
|
||||
<p><a href="/">添加资料</a></p>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
<p><a href="https://git.foolishfox.cn/fox/ELOStar">Gitea</a></p>
|
||||
|
0
templates/info.html
Normal file
0
templates/info.html
Normal file
112
templates/list.html
Normal file
112
templates/list.html
Normal file
@ -0,0 +1,112 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>ELO Star</title>
|
||||
<!-- <link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}"> -->
|
||||
<script src="{{ url_for('static', filename='jquery-3.1.1.min.js') }}"></script>
|
||||
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">
|
||||
</head>
|
||||
<body>
|
||||
<header id="header" class="header">
|
||||
<div class="textlogo"><p><a href="/">ELO Star</a></p></div>
|
||||
<div class="nav">
|
||||
<div class="row">
|
||||
<div class="col-sm">
|
||||
<p><a href="/list?b=1&len=10">排行榜</a></p>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
<p><a href="/">添加资料</a></p>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
<p><a href="https://git.foolishfox.cn/fox/ELOStar">Gitea</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<script>
|
||||
function title_height() {
|
||||
var height = document.getElementById('header').clientHeight;
|
||||
$("#title").css("line-height", height*0.5+"px");
|
||||
}
|
||||
</script>
|
||||
<div class="main">
|
||||
<table class="tg">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="tg-0pky" style="width: 30%;">排名</th>
|
||||
<th class="tg-0pky" style="width: 35%;">姓名</th>
|
||||
<th class="tg-0lax" style="width: 35%;">分数</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="tg-7d57">{{ P0rank }}</td>
|
||||
<td class="tg-7d57">{{ P0name }}</td>
|
||||
<td class="tg-dg7a">{{ P0rate }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="tg-0pky">{{ P1rank }}</td>
|
||||
<td class="tg-0pky">{{ P1name }}</td>
|
||||
<td class="tg-0lax">{{ P1rate }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="tg-7d57">{{ P2rank }}</td>
|
||||
<td class="tg-7d57">{{ P2name }}</td>
|
||||
<td class="tg-dg7a">{{ P2rate }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="tg-0lax">{{ P3rank }}</td>
|
||||
<td class="tg-0lax">{{ P3name }}</td>
|
||||
<td class="tg-0lax">{{ P3rate }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="tg-dg7a">{{ P4rank }}</td>
|
||||
<td class="tg-dg7a">{{ P4name }}</td>
|
||||
<td class="tg-dg7a">{{ P4rate }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="tg-0lax">{{ P5rank }}</td>
|
||||
<td class="tg-0lax">{{ P5name }}</td>
|
||||
<td class="tg-0lax">{{ P5rate }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="tg-dg7a">{{ P6rank }}</td>
|
||||
<td class="tg-dg7a">{{ P6name }}</td>
|
||||
<td class="tg-dg7a">{{ P6rate }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="tg-0lax">{{ P7rank }}</td>
|
||||
<td class="tg-0lax">{{ P7name }}</td>
|
||||
<td class="tg-0lax">{{ P7rate }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="tg-dg7a">{{ P8rank }}</td>
|
||||
<td class="tg-dg7a">{{ P8name }}</td>
|
||||
<td class="tg-dg7a">{{ P8rate }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="tg-0lax">{{ P9rank }}</td>
|
||||
<td class="tg-0lax">{{ P9name }}</td>
|
||||
<td class="tg-0lax">{{ P9rate }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<footer class="footer">
|
||||
<div class="footerRow1">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-sm">
|
||||
<p>© 2021 ELO Star</p>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
<p>Made By <a href="https://foolishfox.cn">Fox</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
Reference in New Issue
Block a user