解决 EQD-6838 排查时硬编码版本号 v20260729a 散落3处、无法按需开关、
看不到实际加载缓存戳的问题。
层1 运行时开关(核心):
- HtmlUtil.cs 新增 GitCommit(读 AssemblyInformationalVersion,零新依赖)
- _MainLayout.cshtml 注入 window.ylotc.__diag(jsVersion+git+built)
- main.js 顶部新增 otcDebug 工具(banner+log),debug 默认 false 生产零输出
- swapTradeEdit.js / fastVue.base.js 硬编码标记改为 otcDebug.banner
- 开启方式:URL ?otcdebug=1(会话)或 localStorage.setItem('otcdebug','1')(持久)
层2 构建守卫:
- pre-commit 新增第三块 bundle 版本一致性检查(rebuild-bundles.py --verify)
- 修复 Windows python3 Store stub 不可用问题(优先用 python)
- 注:bundle 头部不注入 git sha(会随 commit 变化导致 verify 永久失败),
版本可追溯完全由运行时 __diag(后端注入)覆盖
层3 单测预防:
- 新增 diag.test.js(213测试之一),用 console spy 守卫开关行为
- 断言不再含硬编码 v20260729a + 防止第二套调试开关回归
验证:11 suites/213 tests 全绿,--verify 通过,C# 编译0错误
75 lines
2.8 KiB
C#
75 lines
2.8 KiB
C#
using Microsoft.AspNetCore.Html;
|
||
using System.Reflection;
|
||
using YLErp.Events;
|
||
|
||
namespace YLErp
|
||
{
|
||
/// <summary>
|
||
/// HTML帮助类
|
||
/// </summary>
|
||
public static class HtmlUtil
|
||
{
|
||
/// <summary>
|
||
/// JS版本(每次启动后更新,不要用于layout中的js版本设置)
|
||
/// </summary>
|
||
public static readonly string JsVersion;
|
||
|
||
//bin目录文件版本
|
||
public static readonly DateTime BinFileVersion;
|
||
|
||
/// <summary>
|
||
/// Git提交哈希(取自程序集 AssemblyInformationalVersion,由.NET SDK在编译时自动生成,
|
||
/// 格式 "1.0.0+<sha>";前端诊断信息用它精确定位是哪次提交的部署)。
|
||
/// </summary>
|
||
public static readonly string GitCommit;
|
||
|
||
static long _dataCacheUpdateTime;
|
||
|
||
static HtmlUtil()
|
||
{
|
||
//获取bin目录中YLErp开头的文件最后修改日期作为JS和CSS文件版本
|
||
var binDir = new DirectoryInfo(AppContext.BaseDirectory);
|
||
var files = binDir.GetFiles("YLErp*");
|
||
BinFileVersion = files.Any() ? files.Max(n => n.LastWriteTime) : DateTime.MinValue;
|
||
JsVersion = BinFileVersion.ToString("yyMMddHHmmss");
|
||
|
||
//从 AssemblyInformationalVersion 读取 git sha(SDK 编译时已嵌入,零额外依赖)
|
||
var infoVer = typeof(HtmlUtil).Assembly
|
||
.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion;
|
||
//格式 "1.0.0+<sha>",取 + 之后部分;无则回退到完整字符串
|
||
GitCommit = string.IsNullOrEmpty(infoVer) ? "unknown"
|
||
: (infoVer.Contains('+') ? infoVer.Substring(infoVer.LastIndexOf('+') + 1) : infoVer);
|
||
|
||
EventBus.Subscribe<DataCacheUpdateEvent>(t =>
|
||
{
|
||
_dataCacheUpdateTime = DateTimeOffset.Now.ToUnixTimeSeconds();
|
||
});
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取基础数据JS连接
|
||
/// </summary>
|
||
public static IHtmlContent BasicDataJs(params string[] types)
|
||
{
|
||
return new HtmlString(types == null ? "/front/basicData" :
|
||
$"/front/basicData?types={string.Join("&types=", types)}&t={_dataCacheUpdateTime}");
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取基础数据JS连接(无缓存版本)
|
||
/// </summary>
|
||
public static IHtmlContent BasicDataJsV2(params string[] types)
|
||
{
|
||
return new HtmlString(types == null ? "/front/basicData" :
|
||
$"/front/basicData?types={string.Join("&types=", types)}&t={DateTime.Now.Ticks}");
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public static string DateStr(DateTime dt)
|
||
{
|
||
return dt.Year < 1000 ? string.Empty : dt.ToString("yyyy-MM-dd");
|
||
}
|
||
}
|
||
} |