【模型】203、783,安装包编译iss

This commit is contained in:
yuejiajun 2025-08-18 14:36:43 +08:00
parent 0bf76f6b72
commit 097b00a5a5
62 changed files with 1000 additions and 0 deletions

View File

View File

@ -0,0 +1,35 @@
## 编译流程 783
- 1、 运行 `resources-initialize.bat` 初始化默认资源获取目录
- 2、 Resource/database 存放数据库程序
- 3、 Resource/dist 存放前端 build 内容
- 4、 Resource/io 存放 MinIO 服务
- 5、 Resource/java 存放 JDK21 内容
- 6、 Resource/script 将按照数据库名称存放SQL脚本
- 7、 Resource/server 存放后端 jar
- 8、 Resource/usr 存放脚本运行环境命令
- 9、 Resource/web 存放 nginx 程序
- 10、 Resource/ 存放一个 `icon.ico` 图标
- 11、 Resource/ 存放一个 `model*.exe` 可执行程序,用于安装数据库、启动前后端服务
- 12、 Resource/ 存放一个 `patch.exe` 可执行程序,用于运行库补丁
- 13、 启动 `install-win10-model-783.iss` 进行编译,编译完成后 Release 文件夹中会出现编译后的安装包
- 14、 配合 base 编译后安装程序,形成完整运行环境,支持 Windows 10 运行
## 编译流程 203
- 1、 运行 `resources-initialize.bat` 初始化默认资源获取目录
- 2、 Resource/database 存放数据库程序
- 3、 Resource/dist 存放前端 build 内容
- 4、 Resource/io 存放 MinIO 服务
- 5、 Resource/java 存放 JDK21 内容
- 6、 Resource/script 将按照数据库名称存放SQL脚本
- 7、 Resource/server 存放后端 jar
- 8、 Resource/usr 存放脚本运行环境命令
- 9、 Resource/web 存放 nginx 程序
- 10、 Resource/ 存放一个 `icon.ico` 图标
- 11、 Resource/ 存放一个 `model*.exe` 可执行程序,用于安装数据库、启动前后端服务
- 12、 Resource/ 存放一个 `patch.exe` 可执行程序,用于运行库补丁
- 13、 启动 `install-win10-model-203.iss` 进行编译,编译完成后 Release 文件夹中会出现编译后的安装包
- 14、 配合 base 编译后安装程序,形成完整运行环境,支持 Windows 10 运行

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

View File

@ -0,0 +1 @@
{"version":"1","format":"xl-single","id":"336b01aa-5890-4b41-a360-4cc54cf00592","xl":{"version":"3","this":"20dd394e-1e16-4f61-81f7-e40bbe4768a0","sets":[["20dd394e-1e16-4f61-81f7-e40bbe4768a0"]],"distributionAlgo":"SIPMOD+PARITY"}}

View File

@ -0,0 +1,35 @@
@echo off
chcp 65001 >nul
title MinIO Quick Start
set MINIO_EXE=minio.exe
set DATA_DIR=./data
set CONSOLE_PORT=9001
:: 检查minio.exe是否存在
if not exist "%MINIO_EXE%" (
echo Error: %MINIO_EXE% 不存在!
pause
exit /b 1
)
:: 设置MinIO凭据
:: set MINIO_ROOT_USER=minio_FEaTQx
:: set MINIO_ROOT_PASSWORD=minio_34KYwR
:: 检查数据目录是否存在,不存在则创建
if not exist "%DATA_DIR%" (
mkdir "%DATA_DIR%"
)
if exist "%MINIO_EXE%" (
echo Starting MinIO server...
start "Scenario Server" cmd /k "%MINIO_EXE% server ^"%DATA_DIR%^" --console-address ^":%CONSOLE_PORT%^""
)
echo MinIO:
echo - MinIO API (Port: 9000)
echo - MinIO Web (Port: 9001)
pause

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,48 @@
server {
listen 18680;
server_name _;
# gzip config
gzip on;
gzip_min_length 1k;
gzip_comp_level 9;
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
root dist;
include mime.types;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:28680/;
client_max_body_size 100M;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /file/ {
proxy_pass http://127.0.0.1:9000/;
client_max_body_size 5000M;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
error_page 405 =200 $request_uri;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
}
}

View File

@ -0,0 +1,11 @@
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include model-windows.conf;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

View File

@ -0,0 +1 @@
{"version":"1","format":"xl-single","id":"336b01aa-5890-4b41-a360-4cc54cf00592","xl":{"version":"3","this":"20dd394e-1e16-4f61-81f7-e40bbe4768a0","sets":[["20dd394e-1e16-4f61-81f7-e40bbe4768a0"]],"distributionAlgo":"SIPMOD+PARITY"}}

View File

@ -0,0 +1,35 @@
@echo off
chcp 65001 >nul
title MinIO Quick Start
set MINIO_EXE=minio.exe
set DATA_DIR=./data
set CONSOLE_PORT=9001
:: 检查minio.exe是否存在
if not exist "%MINIO_EXE%" (
echo Error: %MINIO_EXE% 不存在!
pause
exit /b 1
)
:: 设置MinIO凭据
:: set MINIO_ROOT_USER=minio_FEaTQx
:: set MINIO_ROOT_PASSWORD=minio_34KYwR
:: 检查数据目录是否存在,不存在则创建
if not exist "%DATA_DIR%" (
mkdir "%DATA_DIR%"
)
if exist "%MINIO_EXE%" (
echo Starting MinIO server...
start "Scenario Server" cmd /k "%MINIO_EXE% server ^"%DATA_DIR%^" --console-address ^":%CONSOLE_PORT%^""
)
echo MinIO:
echo - MinIO API (Port: 9000)
echo - MinIO Web (Port: 9001)
pause

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,48 @@
server {
listen 18680;
server_name _;
# gzip config
gzip on;
gzip_min_length 1k;
gzip_comp_level 9;
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
root dist;
include mime.types;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:28680/;
client_max_body_size 100M;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /file/ {
proxy_pass http://127.0.0.1:9000/;
client_max_body_size 5000M;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
error_page 405 =200 $request_uri;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
}
}

View File

@ -0,0 +1,11 @@
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include model-windows.conf;
}

View File

@ -0,0 +1,371 @@
;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}
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"

View File

@ -0,0 +1,379 @@
;iss
; 构建时间2025-8-18 14:13:19
#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_783"
#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}-783
UninstallFilesDir={app}\{#MyAppExeName}
UninstallDisplayIcon={app}\{#MyAppExeName}\{#MyAppExeName}.exe
; 语言选择
[Languages]
Name: "Chinese"; MessagesFile: "compiler:Languages\Chinese.isl"
;; 任务
[Tasks]
; 是否创建桌面图标
; checkablealone 默认选中
; unchecked 默认不选中
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: checkablealone
;; 程序 ICO
[Icons]
; ====================== ========================================================= 此处使用 console 显式console启动
Name: "{autoprograms}\{#MyAppFirstPath}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}\{#MyAppExeName}-console.exe"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}\{#MyAppExeName}-console.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
Filename: "taskkill"; Parameters: "-f -im {#MyAppExeName}-console.exe"; Flags: runascurrentuser runhidden waituntilterminated
Filename: "taskkill"; Parameters: "-f -im {#MyAppExeName}-x86.exe"; Flags: runascurrentuser runhidden waituntilterminated
Filename: "taskkill"; Parameters: "-f -im {#MyAppExeName}-x64.exe"; Flags: runascurrentuser runhidden waituntilterminated
Filename: "taskkill"; Parameters: "-f -im {#MyAppExeName}.exe"; Flags: runascurrentuser runhidden waituntilterminated
;; 卸载时删除的文件
[UninstallDelete]
Type: filesandordirs; Name: "{app}\{#MyAppExeName}\log"
Type: filesandordirs; Name: "{app}\{#MyAppExeName}\script"
Type: filesandordirs; Name: "{app}\{#MyAppExeName}\patch"

View File

@ -0,0 +1,25 @@
@echo off
setlocal enabledelayedexpansion
chcp 65001 >nul
title Initialization
set "BASE_PATH=Resources/"
echo [INFO] 正在创建 【模型】 初始化构建安装包目录结构
for %%f in (
"database"
"dist"
"io"
"java"
"script/model"
"server"
"usr"
"web"
) do (
echo [INFO] 创建: %%~f
mkdir "%BASE_PATH%/%%~f"
echo.
)
pause
endlocal