Files
zszq-trs/YLErpWeb/Common/HtmlUtil.cs
T
hjhan c97d7e7995 feat(diag): 可保留调试日志+版本可追溯机制(阶段0.5止血增强)
解决 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错误
2026-07-30 10:06:21 +08:00

75 lines
2.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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+&lt;sha&gt;";前端诊断信息用它精确定位是哪次提交的部署)。
/// </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 shaSDK 编译时已嵌入,零额外依赖)
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");
}
}
}