Commit dae18fcf authored by 杨伟's avatar 杨伟

上传代码

parent 41bd14f3
Pipeline #923 canceled with stages
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
.idea/workspace.xml .idea/workspace.xml
**/.ipynb_checkpoints **/.ipynb_checkpoints
.ipynb_checkpoints .ipynb_checkpoints
startup.py
.python-version .python-version
*.pyc *.pyc
*.pyc.orig *.pyc.orig
......
import re
class Data_Page:
"""
:param current_page 当前页码
:param data 要分页的数据
:param path 路由地址(用于生成动态路径)
:param per_page 每页显示条数
:param show_page 显示页码跨度
"""
def __init__(self, current_page, data, path, per_page=50, show_page=10):
self.current_page = int(current_page)
self.per_page = per_page
self.show_page = show_page
self.data = data
self.path = path
self.all_page = self.get_all_page()
def get_all_page(self):
"""计算总页数"""
result, mod = divmod(len(self.data), self.per_page)
if mod:
return result + 1
else:
return result
def create_page(self):
"""创建页码列表"""
if not (isinstance(self.show_page, int) | self.show_page < 1):
self.show_page = 10
half = self.show_page // 2
# 避免出现负数页
if self.current_page - half <= 0:
start = 1
else:
start = self.current_page - half
if self.current_page + half > self.all_page:
end = self.all_page
else:
end = self.current_page + half
# 若当前页靠近两端,保持页面达到show_page的数量
if self.current_page <= 5 : #靠近前端
if self.show_page + 1 <=self.all_page:
end = self.show_page + 1
else:
end = self.all_page
if self.current_page >= self.all_page - 5: #靠近最后
if self.all_page - self.show_page >= 0:
start = self.all_page - self.show_page
else:
start = 1
# 上下页
page_list = []
pre_page = self.current_page - 1 if self.current_page - 1 > 0 else 1
next_page = self.current_page + 1 if self.current_page + 1 < self.all_page else self.all_page
# 将生成的页码标签添加进page_list
page_list.append(self.get_page_url(self.path, '上一页', pre_page))
for i in range(start, end + 1):
url = self.get_page_url(self.path, i, i)
page_list.append(url)
page_list.append(self.get_page_url(self.path, '下一页', next_page))
return self.url_format_by_bootstrap(page_list)
def per_page_content(self, data):
"""计算每页内容"""
start_index = (self.current_page - 1) * self.per_page
end_index = self.current_page * self.per_page
return data[start_index:end_index]
# 声明为静态方法,未使用类中变量
@staticmethod
def get_page_url(path, text, num):
"""获取动态页码链接"""
url = '<a href="{0}?page={1}">{2}</a>'.format(path, num, text)
return url
def url_format_by_bootstrap(self, page_list):
"""将url转化为bootstrap分页需要的格式"""
pre_url = re.findall('href="(.*?)"', page_list[0])[0]
next_url = re.findall('href="(.*?)"', page_list[-1])[0]
page_list[0] = '''
<li>
<a href="{0}" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
</a>
</li>
'''.format(pre_url)
page_list[-1] = '''
<li>
<a href="{0}" aria-label="Next">
<span aria-hidden="true">&raquo;</span>
</a>
</li>
'''.format(next_url)
for index, page in enumerate(page_list[1:-1]):
# 将当前页设置为选中状态
# print(page)
page_num = int(re.search(r'page=(\d+)', page).group(1))
# page_num=1
if self.current_page == page_num:
page_list[index + 1] = '<li class="active">{0}</li>'.format(page)
continue
page_list[index + 1] = '<li>{0}</li>'.format(page)
return page_list
import pandas as pd
import numpy as np
import json
import json_tools
import time
from config.concat_sql import *
def date_treat(df, url, headers, method, codes):
pd.set_option('display.max_columns', 1000)
pd.set_option('display.width', 1000)
pd.set_option('display.max_colwidth', 1000)
# df=pd.DataFrame({'uuid':['12333','98766'],
# 'orderid':['hgufhu009','oiuuuy'],
# 'time':['2018-09-01','2019-09-09']
# },
# columns=['uuid','orderid','time'])
#####数据处理调用
method_ = {"Method": None}
headers_ = {"headers": None}
codes_={"codes":codes}
headers_['headers']= headers
method_['Method'] = method
headers_.update(method_)
name = int(time.strftime("%Y%m%d%H%M%S", time.localtime()))
df_res = pd.DataFrame(columns=['caseID', '测试参数', '测试响应', '开发参数', '开发响应', '对比结果'])
try:
for i in range(0,len(df)):
parm={}
data_l = headers_
data_={}
for col in df.columns:
if pd.isnull(df.loc[i, col]) == False:
data_.update({col:df.loc[i, col]})
else:
pass
else:
data_.update(codes_)
parm = {'data':data_,'url':'None'}
data_l.update(parm)
df_res.loc[i, 'caseID'] = i
data_l['url']=url[0]
df_res.loc[i, '测试参数'] = str(data_l)
data_l['url'] =url[1]
df_res.loc[i, '开发参数'] = str(data_l)
else:
report_name='report_'+str(name)+'.csv'
path='static/report/'+report_name
df_res.to_csv(path,index=False,header=True,encoding='gbk')
return {'msg':'测试用例已生成,请下载report.csv文件,查看用例数据,确认无误后,点击运行','flag':1,'report_name':report_name}
except Exception as e:
print(str(e.args[1]))
return {'msg':str(e.args[1]),'flag':0}
def file_date():
df = pd.read_table(r"0725.txt")[1:5]
df = df.reset_index(drop=True)
print(df, "hahhhahah")
# dropna使得滤除缺失数据更加得心应手。
df = df.dropna(subset=['other_params'])
df.fillna(False, inplace=True)
df['business_type'] = df['business_type'].astype(int)
df = df.loc[df.business_type == 0]
def parse_json(x):
feature = json.loads(x)
return feature['codes']
df['codes'] = pd.DataFrame(df['other_params'].apply(lambda x: parse_json(x)).tolist())
del df['other_params']
# print(df.to_clipboard())
df = df.dropna(subset=["codes"])
# time.sleep(199999)
"""进行数据解析从多个codes 解析完1个code"""
# df = pd.read_csv(r"/Users/luzhaoyang/Desktop/测试.csv")[0:5]
# print(df,"mingmingjiu")
df["codes_list"] = df["codes"].apply(lambda x: len(str(x).split(',')))
dict_df = []
for index, row in df.iterrows():
for k in (row.codes).split(','):
# print(k)
df_new = pd.DataFrame(row).T
df_new["one_code"] = k
dict_df.append(df_new)
df = pd.concat(dict_df)
print(df, 'nishuia ')
df.fillna(False, inplace=True)
df['business_type'] = df['business_type'].astype(int)
df = df.loc[df.business_type == 0]
def sql_date(parm, database=None):
error_s=''
_sql = parm
try:
_df = pd.read_sql(_sql, con_tuomin_xyqb)
except Exception as e:
_df= pd.DataFrame()
error_s= e.args[0]
return _df, error_s
return _df, error_s
if __name__ == "__main__":
import numpy as np
import pandas as pd
pd.set_option('display.max_columns', 1000)
pd.set_option('display.width', 1000)
pd.set_option('display.max_colwidth', 1000)
df_res = pd.read_csv('./report.csv', encoding='gbk')
# df=pd.DataFrame({'uuid':['12333','98766'],
# 'orderid':['hgufhu009','oiuuuy'],
# 'time':['2018-09-01','0000']
# },
# columns=['uuid','orderid','time'])
print(df_res)
print(sum(df_res['对比结果'].isnull()))
if sum(df_res['对比结果'].isnull()) <= 0:
print('0000')
# print(sum(data['calculate'].isnull()))
\ No newline at end of file
import tornado
from tornado import httpclient
import time
import json
from tornado.options import define, options
from tornado.web import Application, RequestHandler
from functools import partial
import pandas as pd
import json_tools
import urllib.parse
import requests
import numpy as np
from Data.Data_page import Data_Page
import types
define("df_res", default="") # 定义
df_res=pd.DataFrame()
define("report_name", default="") # 定义
class table(RequestHandler):
def get(self):
global df_res
global report_name
# report_name ='report_20190904110614.csv'
# path = 'static/report/' + report_name
# df_res = pd.read_csv(path, encoding='gbk')
train_data = np.array(df_res) # np.ndarray()
train_list = train_data.tolist() # list
try:
# num1 = self.get_argument('option1')
current_page_num = self.get_argument('page')
except Exception as e:
current_page_num = 1
# print(num1)
# current_page_num=1
page_info = Data_Page(current_page_num, train_list, '/table')
page_list = page_info.create_page()
user_list = page_info.per_page_content(train_list)
self.render('../templates/case_table.html',user_list=user_list, page_list=page_list,report_name=report_name)
class Send_parm(RequestHandler):
def post(self):
global df_res
global report_name
report_name = self.get_argument('report_name')
path = 'static/report/' + report_name
df_res = pd.read_csv(path, encoding='gbk')
#
if not df_res.empty:
df_ = list(zip(df_res['测试参数'].to_list(), df_res['开发参数'].to_list()))
for i in range(0, len(df_)):
for j in range(0, 2):
a = AsyncResponseHandler(res_l=df_[i][j], index=i, type_=j)
func = partial(a.get, self)
func()
else:
# global df_res
df_res = pd.read_csv(path, encoding='gbk')
# train_data = np.array(df_res) # np.ndarray()
# train_list = train_data.tolist() # list
#
# current_page_num=1
#
# page_info = Data_Page(current_page_num, train_list, '/table')
# page_list = page_info.create_page()
# user_list = page_info.per_page_content(train_list)
self.redirect('/table')
# self.render('../templates/case_table.html', user_list=user_list, page_list=page_list,
# report_name=report_name)
# self.render('../templates/case_table.html', df=train_list, report_name=report_name)
class AsyncResponseHandler(tornado.web.RequestHandler):
def __init__(self,res_l=None, index=0, type_=None, *args, **kwargs):
res_l=str(res_l).replace("'", '"')
self.res_l = json.loads(res_l)
self.index = index
self.type_ = type_
@tornado.web.asynchronous
@tornado.gen.coroutine
def get(self,*args, **kwargs):
headers = self.res_l['headers']
url =self.res_l['url']
method = self.res_l['Method']
body=urllib.parse.urlencode(self.res_l['data'])
self.http_client = tornado.httpclient.AsyncHTTPClient()
resp = yield tornado.gen.Task(
self.http_client.fetch,
url,
method=method,
headers=headers,
body=body,
validate_cert=False)
body_ = resp.body
code_ = resp.code
self._finished = 1
if body_ == None:
body_ = "{'msg':'调用接口失败','code':404}"
else:
body_ = str(body_, 'utf-8')
body_=body_.replace('"',"'")
if code_ != 200:
body_= "{'msg':'{0}','code':{1}}".format(body_, code_)
global df_res
if self.type_ == 0:
df_res.loc[self.index, '测试响应'] = body_
if pd.isnull(df_res.loc[self.index,'开发响应']) == False :
json_cmp(self.index)
elif self.type_ == 1:
df_res.loc[self.index, '开发响应'] = body_
if pd.isnull(df_res.loc[self.index,'测试响应']) == False:
json_cmp(self.index)
self._finished = 1
def dict_get(dicts, objkey, default):
tmp = dicts
for k, v in tmp.items():
if k == objkey:
return v
else:
if isinstance(v, dict):
ret = dict_get(v, objkey, default)
if ret is not default:
return ret
return default
def json_cmp(index):
pd.set_option('display.max_columns', 1000)
pd.set_option('display.width', 1000)
pd.set_option('display.max_colwidth', 1000)
global df_res
str_test = str(df_res.loc[index, '测试响应']).replace("'", '"')
str_dev = str(df_res.loc[index, '开发响应']).replace("'", '"')
test = json.loads(str_test)
dev = json.loads(str_dev)
test_codes=test['code']
dev_codes=dev['code']
if test_codes == 200 and dev_codes ==200:
test_v=dict_get(test,'value', None)
dev_v=dict_get(dev,'value', None)
if test_v != None and dev_v!=None:
if test_v == dev_v:
df_res.loc[index, '对比结果'] = 'Y'
else:
df_res.loc[index, '对比结果'] = '测试:{0},开发:{1}'.format(test_v,dev_v)
else:
df_res.loc[index, '对比结果'] = '测试:{0},开发:{1}'.format(test_v,dev_v)
else:
df_res.loc[index, '对比结果'] = '调用接口失败'
if sum(df_res['对比结果'].isnull()) <= 0:
global report_name
path = 'static/report/' + report_name
df_res.to_csv(path, index=False, header=True, encoding='gbk')
print('end')
else:
pass
if __name__ == "__main__":
import numpy as np
import pandas as pd
pd.set_option('display.max_columns', 1000)
pd.set_option('display.width', 1000)
pd.set_option('display.max_colwidth', 1000)
from sqlalchemy import create_engine
# 准实时线上库
con_zss_online = create_engine('mysql+pymysql://pengcheng.zhang_r:DLOu90XfOgsvKuKC@10.17.115.6:4010/rc_real_time_data_pool?charset=utf8'
,echo=False)
con_dp_analysis = create_engine('mysql+pymysql://pengcheng.zhang_r:DLOu90XfOgsvKuKC@10.17.115.6:4010/dp_analysis?charset=utf8'
,echo=False)
con_zss_online_two = create_engine('mysql+pymysql://rc_feature_fetch_user:VRYB7ChzID6ccq8F@10.17.115.6:4010/rc_real_time_data_pool?charset=utf8'
,echo=False)
con_zss_analysis = create_engine('mysql+pymysql://pengcheng.zhang_r:DLOu90XfOgsvKuKC@172.30.11.22:4010/analysis_real_time?charset=utf8'
,echo=False)
con_tuomin_spider_center = create_engine('mysql+pymysql://pengcheng.zhang_r:0p951ekx8XWz3df@172.30.5.27:8066/spider_center?charset=utf8'
,echo=False)
con_tuomin_workflow = create_engine('mysql+pymysql://pengcheng.zhang_r:0p951ekx8XWz3df@172.30.5.27:8066/workflow?charset=utf8'
,echo=False)
con_feature = create_engine('mysql+pymysql://xyqb_rule_read:1q2w3e4r@xyqb-rule-db.quantgroups.com:6606/?charset=utf8'
,echo=False)
con_feature_xyqb_feature = create_engine('mysql+pymysql://xyqb_rule_read:1q2w3e4r@xyqb-rule-db.quantgroups.com:6606/xyqb_feature?charset=utf8'
,echo=False)
con_feature_hjs = create_engine('mysql+pymysql://pengcheng.zhang:pUtT8iNQvcdkj6ne@172.30.5.27:7336/risk_query?charset=utf8'
,echo=False)
con_tuomin_xyqb = create_engine('mysql+pymysql://pengcheng.zhang_r:0p951ekx8XWz3df@172.30.5.27:8066/xyqb?charset=utf8'
,echo=False)
con_palo = create_engine('mysql+pymysql://pengcheng_zhang:cd4D7GQP@172.20.6.9:9030/?charset=utf8',echo=False)
con_palo_test = create_engine('mysql+pymysql://pengcheng_zhang:cd4D7GQP@172.20.6.9:9030/test?charset=utf8',echo=False)
con_realtime = create_engine('mysql+pymysql://b_events_w:q3ReZoL9x5asCxcx@10.17.115.6:4010/rc_real_time_data_pool?charset=utf8'
,echo=False)
#数据库切换备注一下
# con_comservice = create_engine('mysql+pymysql://rc-historical-fetch-user:s@tkZuEX@eN$Qy9m@10.17.115.6:4010/rc_comservice_data_pool?charset=utf8'
# ,echo=False)
con_comservice = create_engine('mysql+pymysql://rc-historical-fetch-user:s@tkZuEX@eN$Qy9m@10.17.115.6:4010/rc_comservice_data_pool_v2?charset=utf8'
,echo=False)
con_comservice_v3 = create_engine('mysql+pymysql://pengcheng_zhang:phBnseTGbmUd7cKI@fengkong-tidb.quantgroups.com:4010/rc_comservice_data_pool_v3?charset=utf8'
,echo=False)
con_lkbadmin = create_engine('mysql+pymysql://lkbadmin_feature_r:uij89knb762er4cgs67@172.30.220.16:33403/lkbadmin?charset=utf8'
,echo=False)
con_tongdun = create_engine('mysql+pymysql://dailyreport:9XpnRus51fT45D5Y@172.30.5.29:3304/monitor?charset=utf8'
,echo=False)
#手机号对应身份证个数
con_blacklist3_read = create_engine('mysql+pymysql://blacklist3_read:4cbv2AghLmpiSXAm@172.30.220.16:33310/blacklist3?charset=utf8'
,echo=False)
#紧急联系人
con_urgent_people = create_engine('mysql+pymysql://drisk_controlpro:uijk78ytlk953rtg@172.30.220.16:33313/xyqb_user?charset=utf8'
,echo=False)
#身份证归属地(省)黑名单标志
con_realtime_hmd = create_engine('mysql+pymysql://vcc_black_list_w:Kz8p0Wf0iw7nIV85@guangdadb.xyqb.com:3306/vcc_black_list?charset=utf8',echo=False)
#近一个月通话记录成功爬取标志
con_day30_sql = create_engine('mysql+pymysql://qa:qatest@172.30.220.9:3306/lkb_spider?charset=utf8',echo=False)
"""vcc 三期"""
con_vccthree_acsdb = create_engine('mysql+pymysql://qa:qatest@172.17.5.10:31110/acsdb?charset=utf8',echo=False)
con_vccthree_vcc_talos = create_engine('mysql+pymysql://qa:qatest@172.17.5.10:31110/vcc_talos?charset=utf8',echo=False)
\ No newline at end of file
import tornado.web
from tornado import gen
import time
import datetime
from tornado.template import Template
from tornado.escape import json_encode
import os
from Send.Send_run import Send_parm,table
from Data.date_treat import *
class show(tornado.web.RequestHandler):
def get(self):
self.render("templates/run.html",msg='abd',report_name='uuu.csv')
def post(self):
report_name = self.get_argument('report_name')
print(report_name)
class shownew(tornado.web.RequestHandler):
def get(self):
self.render("templates/run.html", msg='测试用例已生成,请下载report.csv文件,查看用例数据,确认无误后,点击运行')
class IndexHandler(tornado.web.RequestHandler):
def get(self):
self.render("templates/index.html")
def post(self, *args, **kwargs):
headers = self.get_argument('hearders')
testurl=self.get_argument('testurl')
devurl = self.get_argument('devurl')
parm=self.get_argument('parm')
methods=self.get_argument('method')
codes=self.get_argument('codes')
database= 'xyqb'#self.get_argument('database')
type='sql'
url=[testurl,devurl]
if headers=='':
headers={"rc_auth_key": "rc_developer", "rc_auth_secret": "rc_secret"}
if headers and testurl and devurl and parm and methods and codes:
if type == 'sql':
if database:
df , error_s=sql_date(parm, database)
if df.empty == False:
data = date_treat(df, url, headers, methods, codes)
else:
if error_s == '':
data = {"msg": '请求参数为空,请检查sql语句', 'flag':0}
else:
data = {"msg": 'Sql语句错误:{0}'.format(error_s), 'flag':0}
else:
data = {"msg":'有必填参数为空,请检查页面','flag':0}
data=dict(data)
if data['flag'] == 1:
self.render("templates/run.html",msg=data['msg'],report_name=data['report_name'] )
else:
self.render("templates/error.html",msg=data['msg'])
settings = {
"static_path": os.path.join(os.path.dirname(__file__), "static")
}#配置静态文件路径
application = tornado.web.Application([
(r"/index", IndexHandler),
(r"/run", Send_parm),
(r"/table", table),
(r"/shownew", shownew)
],**settings)
def make_app():
setting = dict(
template_path=os.path.join(os.path.dirname(__file__), "templates"),
static_path=os.path.join(os.path.dirname(__file__), "static"),
)
return tornado.web.Application([(r'/index', IndexHandler),
],
**setting
)
if __name__ == "__main__":
application.listen(9090)
tornado.ioloop.IOLoop.instance().start()
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project,
Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome,
comprehensive icon sets or copy and paste your own.
Please. Check it out.
-Dave Gandy
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
// Animated Icons
// --------------------------
.@{fa-css-prefix}-spin {
-webkit-animation: fa-spin 2s infinite linear;
animation: fa-spin 2s infinite linear;
}
.@{fa-css-prefix}-pulse {
-webkit-animation: fa-spin 1s infinite steps(8);
animation: fa-spin 1s infinite steps(8);
}
@-webkit-keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
// Bordered & Pulled
// -------------------------
.@{fa-css-prefix}-border {
padding: .2em .25em .15em;
border: solid .08em @fa-border-color;
border-radius: .1em;
}
.@{fa-css-prefix}-pull-left { float: left; }
.@{fa-css-prefix}-pull-right { float: right; }
.@{fa-css-prefix} {
&.@{fa-css-prefix}-pull-left { margin-right: .3em; }
&.@{fa-css-prefix}-pull-right { margin-left: .3em; }
}
/* Deprecated as of 4.4.0 */
.pull-right { float: right; }
.pull-left { float: left; }
.@{fa-css-prefix} {
&.pull-left { margin-right: .3em; }
&.pull-right { margin-left: .3em; }
}
// Base Class Definition
// -------------------------
.@{fa-css-prefix} {
display: inline-block;
font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
// Fixed Width Icons
// -------------------------
.@{fa-css-prefix}-fw {
width: (18em / 14);
text-align: center;
}
/*!
* Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/
@import "variables.less";
@import "mixins.less";
@import "path.less";
@import "core.less";
@import "larger.less";
@import "fixed-width.less";
@import "list.less";
@import "bordered-pulled.less";
@import "animated.less";
@import "rotated-flipped.less";
@import "stacked.less";
@import "icons.less";
@import "screen-reader.less";
This diff is collapsed.
// Icon Sizes
// -------------------------
/* makes the font 33% larger relative to the icon container */
.@{fa-css-prefix}-lg {
font-size: (4em / 3);
line-height: (3em / 4);
vertical-align: -15%;
}
.@{fa-css-prefix}-2x { font-size: 2em; }
.@{fa-css-prefix}-3x { font-size: 3em; }
.@{fa-css-prefix}-4x { font-size: 4em; }
.@{fa-css-prefix}-5x { font-size: 5em; }
// List Icons
// -------------------------
.@{fa-css-prefix}-ul {
padding-left: 0;
margin-left: @fa-li-width;
list-style-type: none;
> li { position: relative; }
}
.@{fa-css-prefix}-li {
position: absolute;
left: -@fa-li-width;
width: @fa-li-width;
top: (2em / 14);
text-align: center;
&.@{fa-css-prefix}-lg {
left: (-@fa-li-width + (4em / 14));
}
}
// Mixins
// --------------------------
.fa-icon() {
display: inline-block;
font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.fa-icon-rotate(@degrees, @rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})";
-webkit-transform: rotate(@degrees);
-ms-transform: rotate(@degrees);
transform: rotate(@degrees);
}
.fa-icon-flip(@horiz, @vert, @rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)";
-webkit-transform: scale(@horiz, @vert);
-ms-transform: scale(@horiz, @vert);
transform: scale(@horiz, @vert);
}
// Only display content to screen readers. A la Bootstrap 4.
//
// See: http://a11yproject.com/posts/how-to-hide-content/
.sr-only() {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0,0,0,0);
border: 0;
}
// Use in conjunction with .sr-only to only display content when it's focused.
//
// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
//
// Credit: HTML5 Boilerplate
.sr-only-focusable() {
&:active,
&:focus {
position: static;
width: auto;
height: auto;
margin: 0;
overflow: visible;
clip: auto;
}
}
/* FONT PATH
* -------------------------- */
@font-face {
font-family: 'FontAwesome';
src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'),
url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
// src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
font-weight: normal;
font-style: normal;
}
// Rotated & Flipped Icons
// -------------------------
.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }
.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); }
// Hook for IE8-9
// -------------------------
:root .@{fa-css-prefix}-rotate-90,
:root .@{fa-css-prefix}-rotate-180,
:root .@{fa-css-prefix}-rotate-270,
:root .@{fa-css-prefix}-flip-horizontal,
:root .@{fa-css-prefix}-flip-vertical {
filter: none;
}
// Screen Readers
// -------------------------
.sr-only { .sr-only(); }
.sr-only-focusable { .sr-only-focusable(); }
// Stacked Icons
// -------------------------
.@{fa-css-prefix}-stack {
position: relative;
display: inline-block;
width: 2em;
height: 2em;
line-height: 2em;
vertical-align: middle;
}
.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
position: absolute;
left: 0;
width: 100%;
text-align: center;
}
.@{fa-css-prefix}-stack-1x { line-height: inherit; }
.@{fa-css-prefix}-stack-2x { font-size: 2em; }
.@{fa-css-prefix}-inverse { color: @fa-inverse; }
This diff is collapsed.
// Spinning Icons
// --------------------------
.#{$fa-css-prefix}-spin {
-webkit-animation: fa-spin 2s infinite linear;
animation: fa-spin 2s infinite linear;
}
.#{$fa-css-prefix}-pulse {
-webkit-animation: fa-spin 1s infinite steps(8);
animation: fa-spin 1s infinite steps(8);
}
@-webkit-keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
// Bordered & Pulled
// -------------------------
.#{$fa-css-prefix}-border {
padding: .2em .25em .15em;
border: solid .08em $fa-border-color;
border-radius: .1em;
}
.#{$fa-css-prefix}-pull-left { float: left; }
.#{$fa-css-prefix}-pull-right { float: right; }
.#{$fa-css-prefix} {
&.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
&.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
}
/* Deprecated as of 4.4.0 */
.pull-right { float: right; }
.pull-left { float: left; }
.#{$fa-css-prefix} {
&.pull-left { margin-right: .3em; }
&.pull-right { margin-left: .3em; }
}
// Base Class Definition
// -------------------------
.#{$fa-css-prefix} {
display: inline-block;
font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
// Fixed Width Icons
// -------------------------
.#{$fa-css-prefix}-fw {
width: (18em / 14);
text-align: center;
}
This diff is collapsed.
// Icon Sizes
// -------------------------
/* makes the font 33% larger relative to the icon container */
.#{$fa-css-prefix}-lg {
font-size: (4em / 3);
line-height: (3em / 4);
vertical-align: -15%;
}
.#{$fa-css-prefix}-2x { font-size: 2em; }
.#{$fa-css-prefix}-3x { font-size: 3em; }
.#{$fa-css-prefix}-4x { font-size: 4em; }
.#{$fa-css-prefix}-5x { font-size: 5em; }
// List Icons
// -------------------------
.#{$fa-css-prefix}-ul {
padding-left: 0;
margin-left: $fa-li-width;
list-style-type: none;
> li { position: relative; }
}
.#{$fa-css-prefix}-li {
position: absolute;
left: -$fa-li-width;
width: $fa-li-width;
top: (2em / 14);
text-align: center;
&.#{$fa-css-prefix}-lg {
left: -$fa-li-width + (4em / 14);
}
}
// Mixins
// --------------------------
@mixin fa-icon() {
display: inline-block;
font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
@mixin fa-icon-rotate($degrees, $rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})";
-webkit-transform: rotate($degrees);
-ms-transform: rotate($degrees);
transform: rotate($degrees);
}
@mixin fa-icon-flip($horiz, $vert, $rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)";
-webkit-transform: scale($horiz, $vert);
-ms-transform: scale($horiz, $vert);
transform: scale($horiz, $vert);
}
// Only display content to screen readers. A la Bootstrap 4.
//
// See: http://a11yproject.com/posts/how-to-hide-content/
@mixin sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0,0,0,0);
border: 0;
}
// Use in conjunction with .sr-only to only display content when it's focused.
//
// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
//
// Credit: HTML5 Boilerplate
@mixin sr-only-focusable {
&:active,
&:focus {
position: static;
width: auto;
height: auto;
margin: 0;
overflow: visible;
clip: auto;
}
}
/* FONT PATH
* -------------------------- */
@font-face {
font-family: 'FontAwesome';
src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),
url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
font-weight: normal;
font-style: normal;
}
// Rotated & Flipped Icons
// -------------------------
.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
// Hook for IE8-9
// -------------------------
:root .#{$fa-css-prefix}-rotate-90,
:root .#{$fa-css-prefix}-rotate-180,
:root .#{$fa-css-prefix}-rotate-270,
:root .#{$fa-css-prefix}-flip-horizontal,
:root .#{$fa-css-prefix}-flip-vertical {
filter: none;
}
// Screen Readers
// -------------------------
.sr-only { @include sr-only(); }
.sr-only-focusable { @include sr-only-focusable(); }
// Stacked Icons
// -------------------------
.#{$fa-css-prefix}-stack {
position: relative;
display: inline-block;
width: 2em;
height: 2em;
line-height: 2em;
vertical-align: middle;
}
.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {
position: absolute;
left: 0;
width: 100%;
text-align: center;
}
.#{$fa-css-prefix}-stack-1x { line-height: inherit; }
.#{$fa-css-prefix}-stack-2x { font-size: 2em; }
.#{$fa-css-prefix}-inverse { color: $fa-inverse; }
This diff is collapsed.
/*!
* Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/
@import "variables";
@import "mixins";
@import "path";
@import "core";
@import "larger";
@import "fixed-width";
@import "list";
@import "bordered-pulled";
@import "animated";
@import "rotated-flipped";
@import "stacked";
@import "icons";
@import "screen-reader";
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<!DOCTYPE html>
<!--{% autoescape None %}-->
<html lang="en">
<head>
<meta charset="UTF-8">
<title>接口测试平台</title>
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/font-awesome-4.7.0/css/font-awesome.min.css">
<style type="text/css">
@import url("/static/css/style.css");
.wrap{
display:-webkit-box;
word-wrap: break-word;
/*white-space: nowrap; */
text-overflow: ellipsis;
overflow:hidden ;
-webkit-line-clamp:3;
-webkit-box-orient:vertical;
/*overflow: hidden;text-overflow:ellipsis;white-space: nowrap;*/
}
/*body{overflow:hidden;}*/
</style>
<script type="text/javascript" src="/static/js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="/static/js/bootstrap.min.js"></script>
</head>
<body style="background-image: url(/static/img/background.jpg)">
<!--<div style="margin-top: 20px;font-size: 20px ; margin-left: 900px">-->
<!--<form style="font-size: 20px;color:whitesmoke" action="/table" method="get">-->
<!--<div style="margin-left: 100px" >-->
<!--<button type="submit" class="btn btn-primary">点击刷新</button>-->
<!--</div>-->
<!--</form>-->
<!--</div>-->
<!--<div class="checkbox">-->
<!--<label class="checkbox-inline">-->
<!--<input type="checkbox" id="inlineCheckbox1" name="option1" > 显示失败及未完成用例-->
<!--</label>-->
<!--<button id="foo"></button>-->
<!--</div>-->
<div style="margin-top: 20px;font-size: 20px ; margin-left: 700px">
<!--<span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span>-->
<a href="/static/report/{{report_name}}" download="{{report_name}}">点击下载测试报告{{report_name}}</a>
</div>
<center>
<div style="margin-top: 20px">
<table id="rounded-corner" summary="2007 Major IT Companies' Profit">
<thead>
<th scope="col" class="rounded-company">caseID</th>
<th scope="col" class="rounded-q1">测试参数</th>
<th scope="col" class="rounded-q2">测试响应</th>
<th scope="col" class="rounded-q3">开发参数</th>
<th scope="col" class="rounded-q4">开发响应</th>
<th scope="col" class="rounded-q5">对比结果</th>
</tr>
</thead>
<tbody>
{% for i in user_list %}
<tr>
<td>
<div class="wrap" style="width: 20px" title="{{i[0]}}">{{i[0]}}</div>
</td>
<td>
<div class="wrap" style="width: 150px" title="{{i[1]}}">{{i[1]}}</div>
</td>
<td>
<div class="wrap" style="width: 150px" title="{{i[2]}}">{{i[2]}}</div>
</td>
<td>
<div class="wrap" style="width: 150px" title="{{i[3]}}">{{i[3]}}</div>
</td>
<td>
<div class="wrap" style="width: 150px" title="{{i[4]}}">{{i[4]}}</div>
</td>
<td>
<div class="wrap" title="{{i[5]}}">{{i[5]}}</div>
</td>
</tr>
{% end %}
</tbody>
</table>
</div>
<div style="color: whitesmoke; margin-top: 10px">
<nav aria-label="Page navigation">
<ul class="pagination">
{% for page in page_list %}
{% raw page %}
{% end %}
</ul>
</nav>
</div>
</center>
</body>
</html>
<!--<script type="text/javascript">-->
<!--$("#foo").click(function()-->
<!--{-->
<!--var word = $("#word").val(); //获取文本框的输入-->
<!--//把word发给后台php程序-->
<!--//返回的数据放在data中,返回状态放在status-->
<!--$.post("/test",{message:word}, function(data,status){-->
<!--if(status == "success")-->
<!--{-->
<!--$("#result").html(data);-->
<!--}-->
<!--else-->
<!--{-->
<!--alert("Ajax 失败");-->
<!--}-->
<!--});-->
<!--});-->
<!--</script>-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3 style="color: red">出错啦!!!{{ msg }}</h3>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>接口测试平台</title>
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/font-awesome-4.7.0/css/font-awesome.min.css">
<script type="text/javascript" src="/static/js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="/static/js/bootstrap.min.js"></script>
</head>
<body style="background-image: url(/static/img/background.jpg)">
<div class="container">
<div id="main" style="width:1000px" >
<!--class="col-lg-5" style="font-size: 5px;color:whitesmoke;margin-top: 5px -->
<div id="left" style="width:400px;float:left;color:whitesmoke;margin-top: 150px">
<h1 style="margin-left: 10px">特征测试平台</h1>
</div>
<div class="row" style="width:600px;float:left;margin-top: 30px" id="right">
<!-- <div class="col-lg-8" style="margin-left: 30px;margin-top: 25px"> -->
<form style="font-size: 15px;color:whitesmoke" action="/index" method="post">
<h1 style="font-size: 25px">参数设置:</h1>
<div class="form-group">
<label style="font-size: 15px">请求头</label>
<input type="text" id="Hearders" name="hearders" class="form-control" placeholder="'headers': {'rc_auth_key': 'rc_developer',
'rc_auth_secret': 'rc_secret'}">
</div>
<div class="form-group">
<label for="exampleInputEmail1">方法类型</label>
<select class="form-control" name="method">
<option value="POST">POST</option>
<option value="GET">GET</option>
</select>
</div>
<div class="form-group">
<label style="font-size: 15px">Code</label>
<input type="text" id="codes" name="codes" class="form-control">
</div>
<!-- <div class="form-group" id="headers">
<label for="exampleInputEmail1">请求地址</label>
<div class="row" style="font-size: 10px">
<div class="col-lg-7 col-md-7 ">
<div class="input-group">
<label style="float: left" class="form-group" >测试:</label>
<input type="text" name='testurl' class="form-control" id="urltest" placeholder="示例:http://127.0.0.1:8080">
</div>
</div>
<div class="col-lg-5 col-md-5">
<label class="form-group">开发:</label>
<input type="text" name='devurl' class="form-control" id="urldev" placeholder="示例:http://127.0.0.1:8080">
</div>
</div>
</div>-->
<div class="form-group">
<label >请求地址</label>
<div class="form-group" style="font-size: 10px">
<div class="input-group" >
<span class="input-group-addon" id="basic-addon1">测试</span>
<input type="text" name='testurl' class="form-control" id="urltest" aria-describedby="basic-addon1" placeholder="示例:http://127.0.0.1:8080">
</div>
<div class="input-group" style="font-size: 10px ;margin-top: 10px ">
<span class="input-group-addon" id="basic-addon2">开发</span>
<input type="text" name='devurl' class="form-control" aria-describedby="basic-addon2" id="urldev" placeholder="示例:http://127.0.0.1:8080">
</div>
</div>
</div>
<h1 style="color:whitesmoke;font-size: 15px">请求体</h1>
<ul class="nav nav-pills" style="font-size: 10px">
<li role="presentation" class="active"><a href="#">Sql</a></li>
<li role="presentation"><a href="#">File</a></li>
<li role="presentation"><a href="#">自定义输入</a></li>
</ul>
<div style="font-size: 15px; width: 600px">
<label >数据库: xyqb</label>
<!--<input style="font-size: 15px" name="database" class="form-control"> -->
</div>
<div class="input-group" style="margin-top: 13px; width: 600px">
<textarea name='parm' id='sql' class="form-control" rows="4"></textarea>
</div >
<div style="float:right;margin-top: 13px">
<button type="submit" id="submit" class="btn btn-primary">提交</button>
</div>
</form>
</div>
</div>
</div>
<!--<script type="text/javascript">-->
<!--$("#submit").click(function (){-->
<!--alert('2222');-->
<!--var testurl = $("#urltest").val();-->
<!--});-->
<!--&lt;!&ndash; pd={'testurl':testurl,'devurl':devurl}-->
<!--$.ajax({-->
<!--type:"post",-->
<!--url:"/index",-->
<!--data:pd,-->
<!--cache:false,-->
<!--success:function(data){-->
<!--alert(1);-->
<!--}})-->
<!--}); &ndash;&gt;-->
<!--</script>-->
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>接口测试平台</title>
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/font-awesome-4.7.0/css/font-awesome.min.css">
<script type="text/javascript" src="/static/js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="/static/js/bootstrap.min.js"></script>
</head>
<body style="background-image: url(/static/img/background.jpg)">
<!--class="container"-->
<div >
<div style="margin-top: 100px;font-size: 25px ; margin-left: 100px" >
<h3 style="color: whitesmoke">{{ msg }}</h3>
</div >
<div style="margin-top: 30px;font-size: 20px ; margin-left: 600px">
<!--<span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span>-->
<a href="/static/report/{{report_name}}" download="{{report_name}}">点击下载测试报告{{report_name}}</a>
</div>>
<form style="font-size: 25px;color:whitesmoke" action="/run" method="post">
<div style="margin-left: 100px" class="btn-group btn-group-lg" >
<button type="submit" class="btn btn-primary">运行</button>
<input type="text" style="display:none" name="report_name" value="{{report_name}}"/>
</div>
</form>
</div>
</div>
</body>
</html>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment