diff --git a/server/simulation/Execute/Readme.md b/server/simulation/Execute/Readme.md new file mode 100644 index 0000000..e69de29 diff --git a/server/simulation/install-win7-simulation.iss b/server/simulation/install-win7-simulation.iss new file mode 100644 index 0000000..f9efaa3 --- /dev/null +++ b/server/simulation/install-win7-simulation.iss @@ -0,0 +1,271 @@ +;iss + +#define MyAppName "仿真实验" +#define MyAppVersion "v1.0.0" +#define MyAppPublisher "X" +#define MyAppURL "~" +#define MyAppExeName "simulation" +#define MyAppAssocName MyAppName + " File" +#define MyAppAssocExt ".myp" +#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt + + + +; 默认配置 +[Setup] +AppId={{550E8400-E29B-41D4-A716-446655440000} +; 默认安装路径 +DefaultDirName={localappdata}\XManage +; 安装密码 +Password=20250813 +; 是否加密 +Encryption=yes +; ICO图标 +;SetupIconFile=Resources\icon.ico +;UninstallDisplayIcon={app}\{#MyAppExeName}.exe +VersionInfoProductVersion=1.0.0 +VersionInfoCompany= +VersionInfoDescription=仿真实验服务 +VersionInfoCopyright=CopyRight © 2025 +VersionInfoProductName=仿真实验 + +; 默认配置 +AppName={#MyAppName} +AppVersion={#MyAppVersion} +AppPublisher={#MyAppPublisher} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +ChangesAssociations=yes +DisableDirPage=no +DisableProgramGroupPage=yes +Compression=lzma2 +SolidCompression=yes +WizardStyle=modern +ChangesEnvironment=yes +PrivilegesRequired=admin +ArchitecturesAllowed=x64compatible +ArchitecturesInstallIn64BitMode=x64compatible +OutputDir=Release\ +OutputBaseFilename=SimulationSetup-{#MyAppVersion} +UninstallFilesDir={app}\{#MyAppExeName} +UninstallDisplayIcon={app}\{#MyAppExeName}\{#MyAppExeName}.bat + + +; 语言选择 +[Languages] +Name: "Chinese"; MessagesFile: "compiler:Languages\Chinese.isl" + + +;; 任务 +[Tasks] +; 是否创建桌面图标 +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked + + +;; 组件安装方式 +[Types] +; 完整安装所有组件 +Name: full; Description: 完整组件安装; +Name: "mini"; Description: "最小安装"; +; 自定义安装 +Name: custom; Description: 自定义安装; Flags: iscustom + + +;; 组件列表选择项 +[Components] +Name: Starter; Description: {#MyAppName} 启动; Types: full; +Name: UI; Description: {#MyAppName} UI; Types: full mini; +Name: Server; Description: {#MyAppName} Server; Types: full mini; +Name: Data; Description: {#MyAppName} Data; Types: full; + + +;; 安装包引入文件列表 +[Files] +; 后端工程+启动器 +;Source: "Resources\{#MyAppExeName}.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter +;Source: "Resources\{#MyAppExeName}-console.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter +;Source: "Resources\{#MyAppExeName}-x64.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter +;Source: "Resources\{#MyAppExeName}-x86.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter +;Source: "Resources\patch.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter + +Source: "Resources\{#MyAppExeName}.bat"; DestDir: "{app}\{#MyAppExeName}"; DestName: "{#MyAppExeName}.bat"; Flags: ignoreversion; Components: Starter +Source: "Resources\server\demo-0.0.1.jar"; DestDir: "{app}\{#MyAppExeName}\bin"; Flags: ignoreversion; Components: Server + +; 更新数据库脚本 +Source: "Resources\script\*"; DestDir: "{app}\{#MyAppExeName}\script"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Data + +; 前端工程 + Nginx +Source: "Resources\web\*"; DestDir: "{app}\{#MyAppExeName}\web"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Starter; +Source: "Resources\dist\*"; DestDir: "{app}\{#MyAppExeName}\web\dist"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: UI; + + +;; 安装时注册表与环境变量列表 +[Registry] +Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; \ + ValueName: "SIMULATION_MAIN"; ValueData: "{app}\{#MyAppExeName}"; +; 启动jar +Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; \ + ValueName: "SIMULATION_MANAGE_BIN"; ValueData: "{app}\{#MyAppExeName}\bin\demo-0.0.1.jar"; +; 扩展启动vm变量 +Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; \ + ValueName: "SIMULATION_VM_PARAMS"; ValueData: " \ + --enable-preview \ + -Dserver.port=28280 \ + -Djasypt.encryptor.password=jwnwfA1pIoLihBptgbR8S6UEEAfGurjG \ + -Dproject.database-ip=127.0.0.1 \ + -Dproject.database-port=33306 \ + -Dproject.database-name=simulation \ + -Dproject.redis-url=127.0.0.1 \ + -Dproject.rocketmq-url=127.0.0.1:8081 \ + -Dproject.minio-url=http://127.0.0.1:9000 \ + -Dproject.eval-service-url=http://127.0.0.1:28480/evaluation/samples/receiveSync \ + "; + + +;; 程序 ICO +[Icons] +;Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}.exe" +;Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}.exe"; Tasks: desktopicon +Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}\{#MyAppExeName}.bat"; Tasks: desktopicon + + +;; 安装完运行的菜单与后续操作 +; [Run] +;; 安装完成后运行 startup.exe +; Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: postinstall runascurrentuser waituntilterminated skipifsilent hidewizard; + + + +;; 自定义函数 +[Code] + +const + WM_SETTINGCHANGE = 26; // 0x001A 的十进制 + SMTO_ABORTIFHUNG = 2; // 0x0002 的十进制 + + // 定义 VC++ 2019 运行时的注册表检查路径 + VC2019_REDIST_X64 = '{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}'; + VC2019_REDIST_X86 = '{422B21A3-06FA-3F2F-A6C6-21BCC9B8E2F3}'; + +function SendMessageTimeout( + hWnd: Integer; + Msg: Integer; + wParam: Integer; + lParamStr: String; + fuFlags: Integer; + uTimeout: Integer; + var lpdwResult: Integer +): Integer; +external 'SendMessageTimeoutW@user32.dll stdcall'; + + +// 给 Path 系统环境变量追加环境 +function NeedsAddPath(Param: string): boolean; +var + OrigPath: string; +begin + if not RegQueryStringValue(HKEY_LOCAL_MACHINE, + 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', + 'Path', OrigPath) + then begin + Result := True; + exit; + end; + // 检查路径是否已存在 + Result := Pos(';' + Param + ';', ';' + OrigPath + ';') = 0; + if Result = True then + Result := Pos(';' + Param + '\;', ';' + OrigPath + ';') = 0; +end; + + +// 刷新系统环境 +procedure RefreshEnvironment; +var + Res: Integer; +begin + SendMessageTimeout( + HWND_BROADCAST, + WM_SETTINGCHANGE, + 0, + 'Environment', + SMTO_ABORTIFHUNG, + 5000, + Res + ); +end; + + +// 检查环境变量,路径是否存在空格 +function CheckRegistryPath(Path: string): Boolean; +begin + if Pos(' ', Path) > 0 then + begin + SuppressibleMsgBox('安装程序错误: 检测到无效的注册表路径 "' + Path + '"。路径不能包含空格。', mbCriticalError, MB_OK, IDOK); + Abort; + Result := False; + Exit; + end; + Result := True; +end; + + +// 以 UTF-8 写入文件 +function SaveStringToUTF8File(const FileName, Content: String; Append: Boolean): Boolean; +var + UTF8Content: AnsiString; +begin + UTF8Content := UTF8Encode(Content); + Result := SaveStringToFile(FileName, UTF8Content, Append); +end; + + +// 检查是否已安装 VC++ 2019 运行时 +function IsVC2019Installed: Boolean; +var + Version: String; +begin + // 检查64位版本 + Result := RegQueryStringValue( + HKLM, + 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64', + 'Version', + Version + ) or RegKeyExists( + HKLM, + 'SOFTWARE\Classes\Installer\Dependencies\' + VC2019_REDIST_X64 + ); + + // 如果是32位系统或需要检查32位运行时 + if not Result and (not IsWin64) then + Result := RegQueryStringValue( + HKLM, + 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x86', + 'Version', + Version + ) or RegKeyExists( + HKLM, + 'SOFTWARE\Classes\Installer\Dependencies\' + VC2019_REDIST_X86 + ); +end; + + +// 在安装前检查 +function InitializeSetup: Boolean; +begin + // 默认允许安装继续 + Result := True; + // 如果 VC++ 2019 未安装 + if not IsVC2019Installed then + begin + MsgBox('本程序需要 Microsoft Visual C++ 2019 运行时才能继续(1001)', mbError, MB_OK) + // 中止安装 + Result := False; + end; +end; + + +[UninstallRun] +Filename: "taskkill"; Parameters: "-f -im simulation-web.exe"; Flags: runascurrentuser runhidden waituntilterminated + +