修改了更新记录中的版本号显示

This commit is contained in:
jinchao 2025-06-11 09:59:41 +08:00
parent b5f41c40b8
commit 7defc9be8d
5 changed files with 224 additions and 76 deletions

Binary file not shown.

View File

@ -40,10 +40,27 @@ class OverviewPage extends HTMLElement {
formatVersionRecord(version) {
const date = version.date;
const time = version.time;
const verNum = version.verNum;
const verNum = this.formatVersionNumber(version);
const title = version.title;
return `<span class="version-date">【${date} ${time}】</span><span class="version-number">v${verNum}</span><span class="version-title">${title}</span>`;
return `<span class="version-date">【${date} ${time}】</span><span class="version-number">V${verNum}</span><span class="version-title">${title}</span>`;
}
formatVersionNumber(version) {
const dateParts = version.date.split('-');
const shortDate = dateParts[0].slice(-2) + dateParts[1] + dateParts[2];
return `${version.verNum}.${shortDate}_${version.stage || 'alpha'}`;
}
getStageLabel(stage) {
const labels = {
'alpha': '开发版',
'beta': '测试版',
'rc': '候选版',
'stable': '正式版'
};
return labels[stage] || '开发版';
}
startClock() {
@ -562,7 +579,7 @@ class OverviewPage extends HTMLElement {
<ul class="version-list">
<li>
<span class="label">当前版本</span>
<span class="value">v${this.versions[0].verNum}</span>
<span class="value">V${this.formatVersionNumber(this.versions[0])}</span>
</li>
<li>
<span class="label">发布日期</span>

View File

@ -55,10 +55,10 @@ class UpdateHistory extends HTMLElement {
// 按版本号降序排序,然后按日期降序
this.versions = data.sort((a, b) => {
const versionA = parseFloat(a.verNum);
const versionB = parseFloat(b.verNum);
if (versionA !== versionB) {
return versionB - versionA;
// 使用版本号比较函数
const versionCompare = this.compareVersions(b.verNum, a.verNum);
if (versionCompare !== 0) {
return versionCompare;
}
const dateA = new Date(a.date + ' ' + a.time);
const dateB = new Date(b.date + ' ' + b.time);
@ -72,6 +72,22 @@ class UpdateHistory extends HTMLElement {
}
}
// 比较版本号
compareVersions(versionA, versionB) {
const partsA = versionA.split('.').map(Number);
const partsB = versionB.split('.').map(Number);
for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {
const partA = partsA[i] || 0;
const partB = partsB[i] || 0;
if (partA > partB) return 1;
if (partA < partB) return -1;
}
return 0;
}
renderVersions() {
const contentContainer = this.shadowRoot.querySelector('#content');
@ -91,7 +107,8 @@ class UpdateHistory extends HTMLElement {
<div class="version-item" data-version="${version.verNum}">
<div class="version-header">
<div class="version-info">
<span class="version-number">v${version.verNum}</span>
<span class="version-number">V${this.formatVersionNumber(version)}</span>
<span class="version-stage ${version.stage || 'alpha'}">${this.getStageLabel(version.stage)}</span>
<span class="version-title">${version.title}</span>
<span class="version-date">${version.date} ${version.time}</span>
<span class="version-author">作者: ${version.author || '未知用户'}</span>
@ -297,6 +314,35 @@ class UpdateHistory extends HTMLElement {
align-items: center;
}
.version-stage {
font-size: 12px;
padding: 2px 8px;
border-radius: 12px;
font-weight: 500;
display: inline-flex;
align-items: center;
}
.version-stage.alpha {
background-color: #E3F2FD;
color: #1976D2;
}
.version-stage.beta {
background-color: #FFF3E0;
color: #F57C00;
}
.version-stage.rc {
background-color: #E8F5E9;
color: #388E3C;
}
.version-stage.stable {
background-color: #F3E5F5;
color: #7B1FA2;
}
.version-title {
font-size: 16px;
font-weight: 500;
@ -565,6 +611,15 @@ class UpdateHistory extends HTMLElement {
<label for="verNum">版本号</label>
<input type="text" class="form-control" id="verNum" required>
</div>
<div class="form-group">
<label for="stage">版本阶段</label>
<select class="form-control" id="stage" required>
<option value="alpha">开发版</option>
<option value="beta">测试版</option>
<option value="rc">候选版</option>
<option value="stable">正式版</option>
</select>
</div>
<div class="form-group">
<label for="date">日期</label>
<input type="text" class="form-control" id="date" required>
@ -633,6 +688,16 @@ class UpdateHistory extends HTMLElement {
}
}
// 格式化版本号显示
formatVersionNumber(version) {
// 将日期转换为六位数字格式 (YYYY-MM-DD -> YYMMDD)
const dateParts = version.date.split('-');
const shortDate = dateParts[0].slice(-2) + dateParts[1] + dateParts[2];
// 组合版本号、日期和阶段
return `${version.verNum}.${shortDate}_${version.stage || 'alpha'}`;
}
// 准备模态框数据
prepareModalData() {
// 获取表单元素
@ -681,6 +746,17 @@ class UpdateHistory extends HTMLElement {
}
}
// 获取版本阶段显示标签
getStageLabel(stage) {
const stageLabels = {
'alpha': '开发版',
'beta': '测试版',
'rc': '候选版',
'stable': '正式版'
};
return stageLabels[stage] || '开发版';
}
// 提交版本信息
async submitVersion() {
const modal = this.shadowRoot.getElementById('versionModal');
@ -689,6 +765,7 @@ class UpdateHistory extends HTMLElement {
const time = this.shadowRoot.getElementById('time').value;
const title = this.shadowRoot.getElementById('title').value;
const note = this.shadowRoot.getElementById('note').value;
const stage = this.shadowRoot.getElementById('stage').value;
// 获取当前登录用户名
let author = '未知用户';
@ -716,7 +793,8 @@ class UpdateHistory extends HTMLElement {
time,
title,
note,
author
author,
stage
})
});

View File

@ -1,22 +1,14 @@
const express = require('express');
const router = express.Router();
const Database = require('better-sqlite3');
const { getXNCorePath } = require('../utils/file-utils');
const { getAllVersions, addVersion } = require('../utils/version-utils');
// 版本信息API
router.get('/versions', (req, res) => {
try {
const xnCorePath = getXNCorePath();
const dbPath = xnCorePath + '/database/XNSim.db';
const db = new Database(dbPath, { readonly: true });
// 移除LIMIT 5限制返回所有版本记录
const versions = db.prepare('SELECT verNum, date, time, title, note, author FROM version ORDER BY date DESC, time DESC').all();
db.close();
const versions = getAllVersions();
res.json(versions);
} catch (error) {
console.error('数据库访问错误:', error);
console.error('获取版本信息失败:', error);
res.status(500).json({ error: '无法获取版本信息' });
}
});
@ -24,60 +16,20 @@ router.get('/versions', (req, res) => {
// 添加新版本记录API
router.post('/versions', (req, res) => {
try {
// 检查用户权限 - 不再依赖session
// 从localStorage获取的用户信息在前端后端无法直接访问
// 由于update-history.js中已经设置了accessLevel为4用于测试这里直接允许所有请求
// 实际生产环境应该实现正确的授权机制
/*
const user = req.session && req.session.user;
if (!user || user.accessLevel < 4) {
return res.status(403).json({ error: '权限不足,需要超级管理员权限' });
}
*/
// 获取请求数据
const { verNum, date, time, title, note, author } = req.body;
// 数据验证
if (!verNum || !date || !time || !title) {
return res.status(400).json({ error: '版本号、日期、时间和标题不能为空' });
}
// 打开数据库
const xnCorePath = getXNCorePath();
const dbPath = xnCorePath + '/database/XNSim.db';
const db = new Database(dbPath);
try {
// 检查版本号是否已存在
const existingVersion = db.prepare('SELECT verNum FROM version WHERE verNum = ?').get(verNum);
if (existingVersion) {
return res.status(400).json({ error: '该版本号已存在' });
}
// 插入新版本记录
const stmt = db.prepare('INSERT INTO version (verNum, date, time, title, note, author) VALUES (?, ?, ?, ?, ?, ?)');
const result = stmt.run(verNum, date, time, title, note || '', author || '未知用户');
db.close();
if (result.changes > 0) {
res.status(201).json({
success: true,
message: '版本记录添加成功',
id: result.lastInsertRowid
});
} else {
res.status(500).json({ error: '添加版本记录失败' });
}
} catch (dbError) {
db.close();
throw dbError;
}
const result = addVersion(req.body);
res.status(201).json(result);
} catch (error) {
console.error('添加版本记录失败:', error);
if (error.message === '该版本号已存在') {
res.status(400).json({ error: error.message });
} else if (error.message === '版本号、日期、时间和标题不能为空') {
res.status(400).json({ error: error.message });
} else if(error.message === '无效的版本阶段') {
res.status(400).json({ error: error.message });
} else {
res.status(500).json({ error: '服务器内部错误' });
}
}
});
module.exports = router;

View File

@ -0,0 +1,101 @@
const Database = require('better-sqlite3');
const { getXNCorePath } = require('./file-utils');
// 版本阶段枚举
const VERSION_STAGES = {
ALPHA: 'alpha', // 开发版
BETA: 'beta', // 测试版
RELEASE_CANDIDATE: 'rc', // 候选版
STABLE: 'stable' // 正式版
};
// 获取所有版本记录
function getAllVersions() {
try {
const xnCorePath = getXNCorePath();
const dbPath = xnCorePath + '/database/XNSim.db';
const db = new Database(dbPath, { readonly: true });
// 添加stage字段到查询中
const versions = db.prepare(`
SELECT verNum, date, time, title, note, author, stage
FROM version
ORDER BY date DESC, time DESC
`).all();
db.close();
return versions;
} catch (error) {
console.error('获取版本记录失败:', error);
throw error;
}
}
// 添加新版本记录
function addVersion(versionData) {
try {
const { verNum, date, time, title, note, author, stage } = versionData;
// 数据验证
if (!verNum || !date || !time || !title) {
throw new Error('版本号、日期、时间和标题不能为空');
}
// 验证版本阶段
if (stage && !Object.values(VERSION_STAGES).includes(stage)) {
throw new Error('无效的版本阶段');
}
const xnCorePath = getXNCorePath();
const dbPath = xnCorePath + '/database/XNSim.db';
const db = new Database(dbPath);
try {
// 检查版本号是否已存在
const existingVersion = db.prepare('SELECT verNum FROM version WHERE verNum = ?').get(verNum);
if (existingVersion) {
throw new Error('该版本号已存在');
}
// 插入新版本记录包含stage字段
const stmt = db.prepare(`
INSERT INTO version (
verNum, date, time, title, note, author, stage
) VALUES (?, ?, ?, ?, ?, ?, ?)
`);
const result = stmt.run(
verNum,
date,
time,
title,
note || '',
author || '未知用户',
stage || VERSION_STAGES.ALPHA // 默认为开发版
);
db.close();
if (result.changes > 0) {
return {
success: true,
message: '版本记录添加成功',
id: result.lastInsertRowid
};
} else {
throw new Error('添加版本记录失败');
}
} catch (dbError) {
db.close();
throw dbError;
}
} catch (error) {
console.error('添加版本记录失败:', error);
throw error;
}
}
module.exports = {
getAllVersions,
addVersion,
VERSION_STAGES
};