wordpress 5.2設置中文seo概念的理解
1、業(yè)務背景
財務這邊大部分系統(tǒng)都是供應商項目,由于供應商的研發(fā)人員沒有飛書項目的權限,涉及到供應商系統(tǒng)需求 財務這邊都是通過多維表格進行bug的生命周期管理如圖:
但多維表格沒有跟飛書項目直接關聯(lián),測試組做bug統(tǒng)計的時候無法計入供應商bug,對測試人員的bug數(shù)量造成一些影響。
解決方案:
讀取表格數(shù)據(jù),調(diào)用飛書項目接口,將bug導入到對應飛書項目需求里
2、結(jié)果展示
1、點擊桌面“供應商bug導入”應用圖標
2、輸入文件路徑和飛書項目ID
3、結(jié)果展示
導入結(jié)果:
原始數(shù)據(jù):
備注:代碼邏輯里對bug優(yōu)先級做了映射,高級-- C類、中級-- B類、低級和建議-- C類
3、實現(xiàn)方式
官方文檔: 飛書項目開發(fā)者手冊
1、創(chuàng)建插件
插件入口
點擊個人頭像,從「開發(fā)者后臺」進入插件開發(fā)者后臺;
創(chuàng)建完成后,對插件進行數(shù)據(jù)權限管理和發(fā)布
插件憑證
插件憑證是插件開發(fā)階段、運行階段用于身份鑒權的唯一憑證。
2、名詞解釋
中文名詞 | API名詞 | 描述 |
空間域名 | simple_name | |
字段ID | field_key | |
工作項實例 | instance | 工作項實例是一個具體的事例,例如,一個已經(jīng)創(chuàng)建的需求、缺陷、項目等 |
3、接口調(diào)用
通過基礎名詞解釋可得,我們創(chuàng)建bug就是新增一個工作實例,找到官方文檔中的創(chuàng)建工作項的接口信息
1、創(chuàng)建工作項接口
請求方式 | POST | ||||
請求地址 | /open_api/:project_key/work_item/create | ||||
請求header | 詳見 請求header | ||||
請求參數(shù) | 參數(shù)類型 | 參數(shù)名 | 是否必填 | 值類型 | 說明 |
路徑參數(shù) | project_key | 是 | string | 空間id(project_key),或者空間域名(simple_name) | |
請求體參數(shù) | work_item_type_key | 是 | string | 工作項類型,自定義工作項可通過獲取空間下工作項類型獲取 | |
name | 是 | string | 工作項名稱 | ||
field_value_pairs | 否 | list<FieldValuePair> FieldValuePair | 創(chuàng)建工作項的具體字段可以從獲取創(chuàng)建工作項元數(shù)據(jù) 接口中獲取,字段格式可查看字段與屬性解析格式 | ||
template_id | 是 | int64 | 模板ID,可以從以下途徑獲取:
| ||
請求體格式 | | ||||
返回格式 | |
根據(jù)接口文檔描述,我們需要獲得 請求header 信息。需要查看header文檔
通過請求header文檔,得知我們需要獲取訪問憑證
1、獲取訪問憑證接口
調(diào)用 獲取插件訪問憑證 接口,通過插件憑證 Plugin ID 和 Plugin Secret獲取 plugin_access_token (或者virtual_plugin_access_token)
請求方式 | POST | |||
請求地址 | https://{平臺域名}/open_api/authen/plugin_token | |||
請求頭參數(shù) | 參數(shù)名 | 類型 | 必填 | 說明 |
Content-Type | string | 是 | 固定值:“application/json” | |
請求體參數(shù) | 參數(shù)名 | 類型 | 必填 | 說明 |
plugin_id | string | 是 | 插件唯一標識,Plugin ID | |
plugin_secret | string | 是 | 插件密鑰,Plugin Secret | |
type | int | 否 | 插件訪問憑證類型,可選值:0、1。默認為plugin_access_token,值為1時將返回virtual_plugin_access_token | |
cURL示例 | | |||
響應體參數(shù) | |
"plugin_id" 和 "plugin_secret" 我們創(chuàng)建插件時已經(jīng)獲得,由接口文檔,可以輕松獲取到請求header的憑證信息
2、工作項類型獲取
根據(jù)創(chuàng)建工作項的接口文檔 work_item_type_key 需要通過 獲取空間下工作項類型 接口獲取
為了方便獲取到我們需要的參數(shù),只需要用postman獲取即可
即: "work_item_type_key": "issue"
3、獲取 template_id
同理我們可以調(diào)用獲取字段信息接口,拿到缺陷的 template_id
即: "template_id": 34673,
4、其余自定義字段獲取
可以通過獲取工作項詳情查詢
最終的請求數(shù)據(jù)
{ "work_item_type_key": "issue", "name": data[i][0], "template_id": 34673, "field_value_pairs": [ { "field_alias": "bug_priority", "field_value": {"label": priority_map.get(data[i][6], {"label": "B類", "value": "53cnaxoz_"}).get("label"), "value": priority_map.get(data[i][6], {"label": "B類", "value": "53cnaxoz_"}).get("value") }, }, {"field_alias": "_field_linked_story", "field_value": linked_story}, {"field_alias": "owner", "field_value": reporter_map.get(data[i][1], "7230980664668045340")}, {"field_alias": "issue_reporter", "field_value": reporter_map.get(data[i][1], "7230980664668045340")}, {"field_alias": "issue_operator", "field_value": ["7413123527076806659"]}, {"field_alias": "description", "field_value": data[i][0]}, ] }
2、狀態(tài)流轉(zhuǎn)接口
狀態(tài)流轉(zhuǎn)接口新
請求方式 | POST | ||||
請求地址 | /open_api/:project_key/workflow/:work_item_type_key/:work_item_id/node/state_change | ||||
請求header | 詳見 請求header | ||||
請求參數(shù) | 參數(shù)類型 | 參數(shù)名 | 是否必填 | 值類型 | 說明 |
路徑參數(shù) | work_item_id | 是 | int64 | 工作項ID | |
work_item_type_key | 是 | string | 工作項類型可以,從獲取空間下工作項類型接口獲取 | ||
project_key | 是 | string | 空間id(project_key),或者空間域名(simple_name) | ||
請求體參數(shù) | transition_id | 是 | int64 | 流轉(zhuǎn)到下一狀態(tài)的id,從獲取工作流詳情接口查詢狀態(tài)流獲取 | |
role_owners | 否 | list<RoleOwner> RoleOwner | 角色及負責人 | ||
fields | 否 | list<FieldValuePair> FieldValuePair | 要更新的字段數(shù)組(只能更新狀態(tài)表單) | ||
請求體格式 | |
根據(jù)接口文檔,我們需要獲取header、work_item_id、work_item_type_key、project_key、transition_id等信息
其中header、work_item_type_key、project_key可以參考 “創(chuàng)建工作項” 接口里的獲取方式
1、work_item_id的取值
work_item_id 我們可以從創(chuàng)建工作項接口的返回值里取到
2、transition_id 獲取
transition_id 可以通過調(diào)用 獲取工作流詳情 接口獲取
從接口返回信息可得,bug狀態(tài) :
由 OPEN --> RESOLVED 的 transition_id 是 983309
由 RESOLVED --> CLOSED 的 transition_id 是 983314
狀態(tài)流轉(zhuǎn)的請求json信息
{ "transition_id": 983309, # 狀態(tài)改成 RESOLVED "fields": [ {"field_alias": "bug_remark", "field_value": "供應商bug"}, {"field_alias": "bug_reason", "field_type_key": "select", "field_key": "field_21fcfb", "field_value": {"label": "自測不仔細產(chǎn)生bug", "value": "b39yvbscm"}} ] }
4、代碼示例
import pandas as pd
import json
import requests
from tkinter_test import imp_confirmdef get_plugin_token():"""獲取插件的 token并返回:return: 插件的token信息"""url = 'https://project.feishu.cn/open_api/authen/plugin_token'payload = json.dumps({"plugin_id": plugin_id,"plugin_secret": plugin_secret,"type": 0})headers = {'Content-Type': 'application/json'}response = requests.request("POST", url, headers=headers, data=payload)return response.json()['data']['token']def add_bug_datas(linked_story, file_path):"""把bug導入到對應的飛書項目里:param linked_story: 飛書項目ID:param file_path: bug文件路徑"""df = pd.read_excel(file_path)data = df.iloc[0:, :]data = data.to_numpy()url = "https://project.feishu.cn/open_api/hdltech/work_item/create"for i in range(len(data)):user_data = {"work_item_type_key": "issue","name": data[i][0],"template_id": 34673,"field_value_pairs": [{"field_alias": "bug_priority","field_value": {"label": priority_map.get(data[i][6], {"label": "B類", "value": "53cnaxoz_"}).get("label"),"value": priority_map.get(data[i][6], {"label": "B類", "value": "53cnaxoz_"}).get("value")},},{"field_alias": "_field_linked_story", "field_value": linked_story},{"field_alias": "owner", "field_value": reporter_map.get(data[i][1], "7230980664668045340")},{"field_alias": "issue_reporter", "field_value": reporter_map.get(data[i][1], "7230980664668045340")},{"field_alias": "issue_operator","field_value": ["7413123527076806659"]},{"field_alias": "description", "field_value": data[i][0]},]}data_to_send = json.dumps(user_data).encode("utf-8")header = {"content-type": "application/json","X-User-Key": user_key,"X-PLUGIN-TOKEN": get_plugin_token()}r = requests.post(url, data=data_to_send, headers=header)data_list.append(r.json()["data"])print(r.json())def close_bug():"""更改bug狀態(tài)"""headers = {"Content-Type": "application/json","X-PLUGIN-TOKEN": get_plugin_token(),"X-USER-KEY": user_key,}for bug_id in data_list:bug_id = bug_idurl = f"https://project.feishu.cn/open_api/hdltech/workflow/issue/{bug_id}/node/state_change"data = {"transition_id": 983309, # 狀態(tài)改成 RESOLVED"fields": [{"field_alias": "bug_remark", "field_value": "供應商bug"},{"field_alias": "bug_reason","field_type_key": "select","field_key": "field_21fcfb","field_value": {"label": "自測不仔細產(chǎn)生bug", "value": "b39yvbscm"}}]}requests.post(url, json=data, headers=headers).json()data = {"transition_id": 983314, # 狀態(tài)改成close"fields": [{"field_alias": "bug_remark", "field_value": "供應商bug"},]}result = requests.post(url, json=data, headers=headers).json()print(result)file_path, linked_story = imp_confirm()
add_bug_datas(linked_story, file_path)
close_bug()
#print(file_path, linked_story)
4、彈窗信息的實現(xiàn)
Python GUI編程(Tkinter) :https://docs.python.org/zh-cn/3/library/tk.html
Tkinter文檔
import tkinter as tkroot = tk.Tk()
root.geometry('400x230+500+260')
root.title('導入bug操作')
page = tk.Frame(root)
page.pack()file_path = tk.StringVar()
story_id = tk.StringVar()tk.Label(page).grid(row=0, column=0)
tk.Label(page, text='請輸入文件路徑').grid(row=1, column=1)
tk.Entry(page, textvariable=file_path).grid(row=1, column=2, pady=10)
tk.Label(page, text='請輸入項目ID').grid(row=2, column=1, pady=10)
tk.Entry(page, textvariable=story_id).grid(row=2, column=2, pady=10)def imp_confirm():filepath = file_path.get().replace(" ", "")storyid = story_id.get().replace(" ", "")if len(filepath) == 0:messagebox.showwarning("警告", "文件路徑不能為空")elif len(storyid) == 0:messagebox.showwarning("警告", "項目ID不能為空")elif not storyid.isdigit():messagebox.showwarning('警告', '項目ID為整數(shù)請確認后輸入')else:page.quit()#messagebox.showinfo("提示", "開始導入請稍后")return filepath, int(storyid)tk.Button(page, text='確認', command=imp_confirm).grid(row=3, column=1, pady=10)
tk.Button(page, text='取消', command=page.quit).grid(row=3, column=2)root.mainloop()
5、打包操作
使用 Pyinstaller 進行打包
pyinsatll中文文檔
pyinstaller -w -i im.icns -n 供應商bug導入 opexcel.py