372 lines
14 KiB
Plaintext
372 lines
14 KiB
Plaintext
;iss
|
||
|
||
; 构建时间:2025-8-18 10:28:45
|
||
#define MyAppName "模型管理"
|
||
#define MyAppVersion "v1.0.19"
|
||
#define MyAppPublisher "X"
|
||
#define MyAppURL "~"
|
||
#define MyAppExeName "model"
|
||
#define MyAppExeNameHump "Model"
|
||
#define MyAppExeNameUpper "MODEL"
|
||
#define MyAppAssocName MyAppName + " File"
|
||
#define MyAppAssocExt ".myp"
|
||
#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt
|
||
#define MyAppFirstPath "XManage"
|
||
#define MyAppResources "Resources_203"
|
||
#define InstallPassword GetDateTimeString('yyyymmdd', '', '')
|
||
|
||
|
||
; 默认配置
|
||
[Setup]
|
||
AppId={{7C6B5A4D-3E2F-1G0H-9I8J-7K6L5M4N3O2P}
|
||
; 默认安装路径
|
||
DefaultDirName={autopf}\{#MyAppFirstPath}
|
||
; 安装密码
|
||
Password={#InstallPassword}
|
||
; 是否加密
|
||
Encryption=yes
|
||
; ICO图标
|
||
SetupIconFile={#MyAppResources}\icon.ico
|
||
VersionInfoProductVersion=1.0.0
|
||
VersionInfoCompany=
|
||
VersionInfoDescription={#MyAppName}服务
|
||
VersionInfoCopyright=CopyRight © 2025
|
||
VersionInfoProductName={#MyAppName}
|
||
|
||
; 默认配置
|
||
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={#MyAppExeNameHump}Setup-{#MyAppVersion}-203
|
||
UninstallFilesDir={app}\{#MyAppExeName}
|
||
UninstallDisplayIcon={app}\{#MyAppExeName}\{#MyAppExeName}.exe
|
||
|
||
|
||
|
||
; 语言选择
|
||
[Languages]
|
||
Name: "Chinese"; MessagesFile: "compiler:Languages\Chinese.isl"
|
||
|
||
|
||
|
||
;; 任务
|
||
[Tasks]
|
||
; 是否创建桌面图标
|
||
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
||
|
||
|
||
|
||
;; 程序 ICO
|
||
[Icons]
|
||
Name: "{autoprograms}\{#MyAppFirstPath}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}\{#MyAppExeName}.exe"
|
||
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}\{#MyAppExeName}.exe"; Tasks: desktopicon
|
||
|
||
|
||
|
||
;; 组件安装方式
|
||
[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: MySQL/BIN; Description: MySQL数据库; Types: full; Flags: checkablealone
|
||
Name: MySQL/DATA; Description: {#MyAppName} Data; Types: full;
|
||
|
||
Name: USR; Description: 运行时环境; Types: full mini; Flags: checkablealone
|
||
Name: JDK21; Description: JDK 21 运行时环境; Types: full; Flags: checkablealone
|
||
;Name: Redis; Description: 缓存; Types: full; Flags: checkablealone
|
||
Name: IO; Description: 文件资源服务; Types: full; Flags: checkablealone
|
||
|
||
|
||
|
||
;; 安装包引入文件列表
|
||
[Files]
|
||
; 后端工程+启动器
|
||
Source: "{#MyAppResources}\{#MyAppExeName}.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter;
|
||
Source: "{#MyAppResources}\{#MyAppExeName}-console.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter;
|
||
Source: "{#MyAppResources}\{#MyAppExeName}-x64.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter;
|
||
Source: "{#MyAppResources}\{#MyAppExeName}-x86.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter;
|
||
Source: "{#MyAppResources}\patch.exe"; DestDir: "{app}\{#MyAppExeName}"; DestName: "patch.exe"; Flags: ignoreversion; Components: Starter;
|
||
|
||
;Windows 10 环境,不提供 bat 启动
|
||
;Source: "{#MyAppResources}\{#MyAppExeName}.bat"; DestDir: "{app}\{#MyAppExeName}"; DestName: "{#MyAppExeName}.bat"; Flags: ignoreversion; Components: Starter;
|
||
Source: "{#MyAppResources}\server\demo-0.0.1.jar"; DestDir: "{app}\{#MyAppExeName}\bin"; Flags: ignoreversion; Components: Server;
|
||
|
||
; 更新数据库脚本
|
||
Source: "{#MyAppResources}\script\*"; DestDir: "{app}\{#MyAppExeName}\script"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Server;
|
||
|
||
; 前端工程 + Nginx
|
||
Source: "{#MyAppResources}\web\*"; DestDir: "{app}\{#MyAppExeName}\web"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Starter;
|
||
Source: "{#MyAppResources}\dist\*"; DestDir: "{app}\{#MyAppExeName}\web\dist"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: UI;
|
||
|
||
; Linux 命令集(通用服务)
|
||
Source: "{#MyAppResources}\usr\*"; DestDir: "{app}\usr\"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: USR;
|
||
|
||
; 后端启动 JDK 依赖(通用服务)
|
||
Source: "{#MyAppResources}\java\*"; DestDir: "{app}\jre"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: JDK21;
|
||
|
||
; 数据库依赖
|
||
Source: "{#MyAppResources}\database\ProgramData\*"; DestDir: "{commonappdata}\MySQL"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: MySQL/DATA;
|
||
Source: "{#MyAppResources}\database\ProgramFiles\*"; DestDir: "{pf}\MySQL"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: MySQL/BIN;
|
||
|
||
; MinIO 服务(通用服务)
|
||
Source: "{#MyAppResources}\io\*"; DestDir: "{app}\io"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: IO;
|
||
|
||
|
||
|
||
;; 创建必要目录
|
||
[Dirs]
|
||
Name: "{app}\{#MyAppExeName}\web\logs"; Permissions: users-modify; Components: Starter;
|
||
Name: "{app}\{#MyAppExeName}\web\temp"; Permissions: users-modify; Components: Starter;
|
||
|
||
|
||
|
||
;; 安装时注册表与环境变量列表
|
||
[Registry]
|
||
; 默认注册信息
|
||
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocExt}\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocKey}"; ValueData: ""; Flags: uninsdeletevalue
|
||
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}"; ValueType: string; ValueName: ""; ValueData: "{#MyAppAssocName}"; Flags: uninsdeletekey
|
||
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName}\{#MyAppExeName}.exe,0"
|
||
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}\{#MyAppExeName}.exe"" ""%1"""
|
||
|
||
|
||
|
||
; 配置JDK环境变量(通用服务)
|
||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: JDK21; \
|
||
ValueName: "JDK_21"; ValueData: "{app}\jre";
|
||
|
||
|
||
|
||
;; MinIO环境变量(通用服务)
|
||
;Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: IO; \
|
||
ValueName: "X_MIO"; ValueData: "{app}\io";
|
||
|
||
|
||
|
||
;; Linux(通用服务)
|
||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: USR; \
|
||
ValueName: "X_COMMAND"; ValueData: "{app}\usr";
|
||
; 追加到 PATH 变量
|
||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; Flags: preservestringtype; Components: USR; AfterInstall: RefreshEnvironment; \
|
||
ValueName: "Path"; ValueData: "{olddata};%X_COMMAND%"; Check: NeedsAddPath('%X_COMMAND%');
|
||
|
||
|
||
|
||
;; MySQL环境变量(注册服务使用)
|
||
; 可能存在多个服务打通,MySQL环境变量由此变为 X
|
||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: MySQL/BIN; \
|
||
ValueName: "X_MANAGE_DB_SC"; ValueData: "x_database";
|
||
; 这两个值,将作为后续判断程序是否已经安装做依据
|
||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: MySQL/BIN; \
|
||
ValueName: "X_MANAGE_DB_EXE"; ValueData: "{pf}\MySQL\MySQL Server 8.4.5\bin\mysqld.exe";
|
||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: MySQL/BIN; \
|
||
ValueName: "X_MANAGE_DB_COF"; ValueData: "{commonappdata}\MySQL\MySQL Server 8.4\my.ini";
|
||
|
||
;; MySQL(通用服务),导入脚本数据使用
|
||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: MySQL/BIN; \
|
||
ValueName: "X_COMMAND_MYSQL"; ValueData: "{pf}\MySQL\MySQL Server 8.4.5";
|
||
; 追加到 PATH 变量
|
||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; Flags: preservestringtype; Components: MySQL/BIN; AfterInstall: RefreshEnvironment; \
|
||
ValueName: "Path"; ValueData: "{olddata};%X_COMMAND_MYSQL%\bin"; Check: NeedsAddPath('%X_COMMAND_MYSQL%\bin');
|
||
|
||
|
||
|
||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; \
|
||
ValueName: "{#MyAppExeNameUpper}_MAIN"; ValueData: "{app}\{#MyAppExeName}";
|
||
|
||
;; springboot启动变量(启动程序使用)
|
||
; 可能存在多个服务打通,变量由lib变为服务名
|
||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: Server; \
|
||
ValueName: "{#MyAppExeNameUpper}_MANAGE_BIN"; ValueData: "{app}\{#MyAppExeName}\bin\demo-0.0.1.jar";
|
||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: Server; \
|
||
ValueName: "{#MyAppExeNameUpper}_MANAGE_DB_SERVER"; ValueData: "127.0.0.1";
|
||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: Server; \
|
||
ValueName: "{#MyAppExeNameUpper}_MANAGE_DB_PORT"; ValueData: "33306";
|
||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: Server; \
|
||
ValueName: "{#MyAppExeNameUpper}_VM_PARAMS"; ValueData: " \
|
||
--enable-preview \
|
||
-Dserver.port=28680 \
|
||
-Dproject.database-name=model \
|
||
";
|
||
|
||
|
||
|
||
|
||
;; 安装完运行的菜单与后续操作
|
||
; [Run]
|
||
;; 安装完成后运行 startup.exe
|
||
; Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: postinstall runascurrentuser waituntilterminated skipifsilent hidewizard;
|
||
; Filename: "timeout"; Parameters: "/t 2 /nobreak >nul && {app}\{#MyAppExeName}.exe"; 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 GetInstallPassword(): string;
|
||
begin
|
||
Result := GetDateTimeString('yyyymmdd', '', '');
|
||
end;
|
||
|
||
|
||
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 {#MyAppExeName}-web.exe"; Flags: runascurrentuser runhidden waituntilterminated
|
||
|
||
|
||
;; 卸载时删除的文件
|
||
[UninstallDelete]
|
||
Type: filesandordirs; Name: "{app}\{#MyAppExeName}\log"
|
||
Type: filesandordirs; Name: "{app}\{#MyAppExeName}\script"
|