feat: 新增错误问题追踪与管理功能

- 升级程序版本至 v1.5.25
- 新增对比度文本颜色计算与垂直滚动条绘制工具函数,优化选择界面滚动显示
- 网页端新增问题记录管理页面,配套完整的表格与详情展示样式
- 实现issue记录标准化处理、实时事件推送接收与按时间倒序排序展示
- 重构原有选择界面的滚动逻辑,替换为通用滚动条绘制函数
This commit is contained in:
2026-07-29 12:29:54 +08:00
parent 0e8f86b478
commit 7e72bbeae5
5 changed files with 394 additions and 28 deletions
+68 -14
View File
@@ -1,6 +1,6 @@
local CURRENT_STATION_CODE = 'Ticket-Machine'
local API_BASE = 'https://ticket.fse-media.group/api'
local VERSION = 'v1.5.24'
local VERSION = 'v1.5.25'
local UPDATE_CHECK_INTERVAL = 5
-- ###########################
@@ -1081,6 +1081,16 @@ local function nearestCCColor(val)
return colors.gray
end
local function contrastTextColor(bg)
for _, c in ipairs(CC_PALETTE) do
if c.val == bg then
local yiq = (c.rgb[1] * 299 + c.rgb[2] * 587 + c.rgb[3] * 114) / 1000
return yiq >= 140 and colors.black or colors.white
end
end
return colors.white
end
local function clear()
termDev.setBackgroundColor(colors.black)
termDev.clear()
@@ -1115,6 +1125,31 @@ local function addButton(x, y, label, wBtn, hBtn, colorsPair, onClick)
termDev.write(label)
end
local function drawVerticalScrollbar(sbX, startY, endY, offset, maxOffset, step, onUp, onDown)
addButton(sbX, startY - 1, '^', 3, 1, {colors.black, colors.white}, onUp)
addButton(sbX, endY + 1, 'v', 3, 1, {colors.black, colors.white}, onDown)
for py = startY, endY do
termDev.setBackgroundColor(colors.black)
termDev.setCursorPos(sbX, py)
termDev.write(' ')
termDev.setBackgroundColor(colors.gray)
termDev.setCursorPos(sbX, py)
termDev.write(' ')
end
if maxOffset <= 0 then
return
end
local railH = endY - startY + 1
local thumbH = math.max(2, math.floor((railH * railH) / (railH + maxOffset)))
if thumbH > railH then thumbH = railH end
local thumbY = startY + math.floor((railH - thumbH) * (offset / maxOffset))
for py = thumbY, thumbY + thumbH - 1 do
termDev.setBackgroundColor(colors.lightGray)
termDev.setCursorPos(sbX, py)
termDev.write(' ')
end
end
local function inRect(btn, px, py)
return px >= btn.x and px <= (btn.x + btn.w - 1) and py >= btn.y and py <= (btn.y + btn.h - 1)
end
@@ -1381,8 +1416,12 @@ local function showSingleSegmentSelection()
local startIdx = singleSegmentScroll * itemsPerPage + 1
local endIdx = math.min(startIdx + itemsPerPage - 1, #singleSegments)
local bw = math.floor((w - 6) / 2)
local bx1, bx2 = 2, w - bw - 1
local sbX = w - 3
local contentRight = sbX - 2
local colGap = 2
local bw = math.floor((contentRight - 1 - colGap) / 2)
if bw < 8 then bw = 8 end
local bx1, bx2 = 2, 2 + bw + colGap
local by = 5
for i = startIdx, endIdx do
local seg = singleSegments[i]
@@ -1391,20 +1430,27 @@ local function showSingleSegmentSelection()
local x = colIdx == 0 and bx1 or bx2
local y = by + rowIdx * 4
local label = seg.lineName .. ' cogs:' .. tostring(seg.cost)
if #label > bw then label = label:sub(1, bw) end
local lineColor = nearestCCColor(seg.color)
local textColor = contrastTextColor(lineColor)
local isSelected = (state.singleSegment == seg)
addButton(x, y, label, bw, 3, {isSelected and colors.green or colors.blue, colors.white}, function()
local label = seg.lineName .. ' ' .. tostring(seg.cost) .. 'c'
if isSelected then label = '>' .. label end
if #label > bw then label = label:sub(1, bw) end
addButton(x, y, label, bw, 3, {lineColor, textColor}, function()
state.singleSegment = seg
end)
end
if singleSegmentScroll > 0 then
addButton(w-8, 2, 'UP', 6, 1, {colors.gray, colors.white}, function() singleSegmentScroll = singleSegmentScroll - 1 end)
end
if singleSegmentScroll < maxScroll then
addButton(w-8, h-5, 'DN', 6, 1, {colors.gray, colors.white}, function() singleSegmentScroll = singleSegmentScroll + 1 end)
end
drawVerticalScrollbar(
sbX,
by,
h - 6,
singleSegmentScroll * itemsPerPage,
maxScroll * itemsPerPage,
itemsPerPage,
function() singleSegmentScroll = math.max(0, singleSegmentScroll - 1) end,
function() singleSegmentScroll = math.min(maxScroll, singleSegmentScroll + 1) end
)
addCancelButton()
addButton(2, h-3, '<-back', 8, 3, {colors.black, colors.red}, function() state.page = 'home' end)
@@ -1801,8 +1847,16 @@ local function renderLinesSelection(title, selectedCode, backPage, nextPage, inf
local ch = computeHeight(); local maxO = math.max(0, ch - (endY-startY+1))
ui_scroll_offset = math.min(ui_scroll_offset, maxO)
addButton(sbX, startY-1, '^', 3, 1, {colors.black, colors.white}, function() ui_scroll_offset = math.max(0, ui_scroll_offset-4) end)
addButton(sbX, endY+1, 'v', 3, 1, {colors.black, colors.white}, function() ui_scroll_offset = math.min(maxO, ui_scroll_offset+4) end)
drawVerticalScrollbar(
sbX,
startY,
endY,
ui_scroll_offset,
maxO,
4,
function() ui_scroll_offset = math.max(0, ui_scroll_offset-4) end,
function() ui_scroll_offset = math.min(maxO, ui_scroll_offset+4) end
)
local y = startY
for _, l in ipairs(CFG.lines) do