Python+Flask+echarts实现jira缺陷统计页面
背景#
之前写的测试报告生成脚本(https://www.cnblogs.com/sophia12138/p/15814287.html)
因为领导需要放在服务器随时可以看,类似一个可视化项目,被迫进行修改。
参考:https://www.bilibili.com/video/BV177411j7qJ
前端实现和接口基本是参照大佬的教程,部分地方自己做了改动
思路:
- 不改动原来获取jira中BUG数据的方式
- 不改动原来统计数据的方式
- 增加接口,给前端渲染图表提供数据
- 增加从页面输入查询时间的功能
- 用echarts渲染图表
技术选型:
- 框架:flask
- 前端实现:html、css、js
框架设计:
项目文件
-
static 存放静态文件
- css
- main.css 页面样式
- js
- bar.js 复制的echarts代码
- controller.js 控制前端调用接口
- css
-
templates
- main.html 主页面
-
app.py 实现接口
-
jiraOperation.py 获取jira中BUG数据,并统计
-
utils.py 封装jiraOperation.py中的统计方法,供app.py调用
最终效果图#
页面有点丑,不要介意,可以自己美化。看板猫是必须的
部分代码#
utils.py#
"""
封装jiraOperation中的方法
提供给app.py调用
"""
from jiraOperation import *
username = "username" # 填写jira的账号密码
password = "password."
jql_ALL_BUG = """project = TES AND issuetype = Bug """
# 实例化jiraOperation类
report = jiraOperation()
jira = report.loginJira(username, password) # 登录jira
jira_result = report.searchIssues(jira, jql_ALL_BUG) # 查询jql
jira_result_df = report.getDataframe(jira_result) # 获取BUG信息,输出成DataFrame
def get_l1_data(starttime, endtime):
count_status = report.sprint_bug_status(jira_result_df, starttime, endtime) # 统计BUG状态---当前sprint
return count_status
def get_l11_data():
count_status = report.all_bug_status(jira_result_df) # 统计BUG状态---总计
return count_status
def get_r1_data(starttime, endtime):
count_status = report.sprint_count_status(jira_result_df, starttime, endtime) # 统计BUG状态---当前sprint
return count_status
app.py#
from flask import Flask
from flask import request
from flask import render_template
import utils
from flask import jsonify
app = Flask(__name__)
@app.route('/')
def index():
return render_template("main.html")
@app.route('/l1', methods=["GET"])
def get_l1_data():
startDate = request.args.get("startDate")
endDate = request.args.get("endDate")
data = utils.get_l1_data(startDate, endDate)
return jsonify({'New': int(data['New']), 'Done': int(data['Done']), 'Todo': int(data['Todo'])})
@app.route('/l11')
def get_l11_data():
data = utils.get_l11_data()
return jsonify({'New': int(data['New']), 'Done': int(data['Done']), 'Todo': int(data['Todo'])})
@app.route('/r1', methods=["GET"])
def get_r1_data():
res = []
startDate = request.args.get("startDate")
endDate = request.args.get("endDate")
data = utils.get_r1_data(startDate, endDate)
data_name = data.keys()
for i in data_name:
res.append({"name": i, "value": int(data[i])})
return jsonify({"data": res})
main.html#
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试报告</title>
<link href="../static/css/main.css" rel="stylesheet">
</head>
<body>
<div id="title">BUG统计</div>
<div id="tab">当前sprint日期
<input type="date" id="startDate" />-<input type="date" id="endDate" />
<button type="button" id="btn" onclick="getData()">更新数据</button>
</div>
<div id="l1">
<div class="one_part1">
<a class="partTitle">当前sprint</a>
<div class="num">0</div>
<div class="num">0</div>
<div class="num">0</div>
<div class="txt">新增BUG</div>
<div class="txt">解决BUG</div>
<div class="txt">遗留BUG</div>
</div>
<div class="one_part2">
<a class="partTitle">历史总数</a>
<div class="num2">0</div>
<div class="num2">0</div>
<div class="num2">0</div>
<div class="txt">BUG总数</div>
<div class="txt">解决BUG</div>
<div class="txt">遗留BUG</div>
</div>
</div>
<div id="r1">当前sprintBUG状态统计图</div>
<div id="c1" >当前sprint处理人完成BUG情况</div>
<div id="c2" >历史处理人完成BUG情况</div>
<div id="l2">各模块BUG统计</div>
<div id="r2">BUG类型统计</div>
<div id="c3">各模块BUG严重等级统计</div>
</body>
<script src="../static/js/jquery-1.11.1.min.js"></script>
<script src="../static/js/echarts.min.js"></script>
<script src="../static/js/controller.js"></script>
<script src="../static/js/r1_pie.js"></script>
</html>
controller.js#
function getData() {
console.log({ startDate: $('#startDate').val() ,endDate: $('#endDate').val()})
$.ajax({
url: "/l1",
type: "GET",
data: { startDate: $('#startDate').val() ,endDate: $('#endDate').val()},
dataType: "json",
success: function (data) {
$(".num").eq(0).text(data.New);
$(".num").eq(1).text(data.Done);
$(".num").eq(2).text(data.Todo);
},
error: function () {
console.log("当前sprint数据请求失败")
}
})
$.ajax({
url: "/l11",
success: function (data) {
$(".num2").eq(0).text(data.New);
$(".num2").eq(1).text(data.Done);
$(".num2").eq(2).text(data.Todo);
},
error: function () {
console.log("历史总数请求失败")
}
})
$.ajax({
url: "/r1",
type: "GET",
data: { startDate: $('#startDate').val() ,endDate: $('#endDate').val()},
dataType: "json",
success: function (data) {
r1_option.series[0].data = data.data
r1.setOption(r1_option)
},
error: function () {
console.log("当前sprintBUG状态统计请求失败")
}
})
}
getData()
r1_pie.js#
var r1 = echarts.init(document.getElementById("r1"))
r1_option = {
title: {
text: '当前sprint BUG状态统计'
},
tooltip: {
trigger: 'item'
},
legend: {
top: '5%',
left: 'center'
},
series: [
{
name: '',
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 10,
borderColor: '#fff',
borderWidth: 2
},
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: '30',
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: []
}
]
};
作者: 是小鱼呀
出处:https://www.cnblogs.com/sophia12138/p/15901409.html
本站使用「CC BY 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)