85 lines
2.5 KiB
Python
85 lines
2.5 KiB
Python
import json
|
||
import time
|
||
from datetime import datetime
|
||
from pathlib import Path
|
||
|
||
# Issue 数据存储在独立的 JSON 文件中
|
||
ISSUES_PATH = Path(__file__).parent / "issues.json"
|
||
|
||
def load_issues():
|
||
"""加载所有 Issue 数据"""
|
||
if ISSUES_PATH.exists():
|
||
try:
|
||
with open(ISSUES_PATH, "r", encoding="utf-8") as f:
|
||
return json.load(f)
|
||
except Exception:
|
||
return []
|
||
return []
|
||
|
||
def save_issues(issues: list):
|
||
"""保存 Issue 数据到文件"""
|
||
with open(ISSUES_PATH, "w", encoding="utf-8") as f:
|
||
json.dump(issues, f, indent=2, ensure_ascii=False)
|
||
|
||
def create_issue(user_id: int, username: str, title: str, issue_type: str, description: str, markdown_sample: str = ""):
|
||
"""创建一条新 Issue"""
|
||
issues = load_issues()
|
||
new_issue = {
|
||
"id": int(time.time() * 1000),
|
||
"user_id": user_id,
|
||
"username": username,
|
||
"title": title,
|
||
"type": issue_type,
|
||
"description": description,
|
||
"markdown_sample": markdown_sample,
|
||
"status": "open",
|
||
"created_at": datetime.now().isoformat(),
|
||
"replies": []
|
||
}
|
||
# 插入到最前面(最新的在前)
|
||
issues.insert(0, new_issue)
|
||
save_issues(issues)
|
||
return new_issue
|
||
|
||
def get_all_issues():
|
||
"""获取所有 Issue(管理员用)"""
|
||
return load_issues()
|
||
|
||
def get_user_issues(user_id: int):
|
||
"""获取某用户提交的所有 Issue"""
|
||
issues = load_issues()
|
||
return [i for i in issues if i.get("user_id") == user_id]
|
||
|
||
def get_issue_by_id(issue_id: int):
|
||
"""根据 ID 获取单条 Issue"""
|
||
for i in load_issues():
|
||
if i.get("id") == issue_id:
|
||
return i
|
||
return None
|
||
|
||
def add_reply(issue_id: int, author: str, content: str):
|
||
"""给指定 Issue 添加一条回复"""
|
||
issues = load_issues()
|
||
for i in issues:
|
||
if i.get("id") == issue_id:
|
||
reply = {
|
||
"id": int(time.time() * 1000),
|
||
"author": author,
|
||
"content": content,
|
||
"created_at": datetime.now().isoformat()
|
||
}
|
||
i["replies"].append(reply)
|
||
save_issues(issues)
|
||
return reply
|
||
return None
|
||
|
||
def update_issue_status(issue_id: int, status: str):
|
||
"""更新 Issue 的状态(open / in_progress / closed)"""
|
||
issues = load_issues()
|
||
for i in issues:
|
||
if i.get("id") == issue_id:
|
||
i["status"] = status
|
||
save_issues(issues)
|
||
return i
|
||
return None
|