From 77b38edd4995e0c4f2ef3d5d23c98e2f3172ee66 Mon Sep 17 00:00:00 2001 From: yuejiajun <1530620364@qq.com> Date: Sun, 17 Aug 2025 13:51:37 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=A8=A1=E5=9E=8B=E3=80=91=20?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E5=8C=85=E7=BC=96=E8=AF=91=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/model/Execute/Readme.md | 0 server/model/Readme.md | 10 + server/model/Release/Readme.md | 0 .../Resources/web/conf/model-windows.conf | 56 ++++ server/model/Resources/web/conf/web.conf | 11 + server/model/install-win7-model.iss | 274 ++++++++++++++++++ server/model/resources-initialize.bat | 21 ++ 7 files changed, 372 insertions(+) create mode 100644 server/model/Execute/Readme.md create mode 100644 server/model/Release/Readme.md create mode 100644 server/model/Resources/web/conf/model-windows.conf create mode 100644 server/model/Resources/web/conf/web.conf create mode 100644 server/model/install-win7-model.iss create mode 100644 server/model/resources-initialize.bat diff --git a/server/model/Execute/Readme.md b/server/model/Execute/Readme.md new file mode 100644 index 0000000..e69de29 diff --git a/server/model/Readme.md b/server/model/Readme.md index e69de29..47321a0 100644 --- a/server/model/Readme.md +++ b/server/model/Readme.md @@ -0,0 +1,10 @@ + +## 编译流程 + + - 1、 运行 `resources-initialize.bat` 初始化默认资源获取目录 + - 2、 dist 存放前端 build 内容 + - 3、 script 将按照数据库名称,存放SQL脚本 + - 4、 server 存放后端 jar + - 5、 web 存放 nginx 程序 + - 6、 启动 `install-win7-model.iss` 进行编译,编译完成后 Release 文件夹中会出现编译后的安装包 + - 7、 配合 base 编译后安装程序,形成完整运行环境,支持 Windows 7 运行 \ No newline at end of file diff --git a/server/model/Release/Readme.md b/server/model/Release/Readme.md new file mode 100644 index 0000000..e69de29 diff --git a/server/model/Resources/web/conf/model-windows.conf b/server/model/Resources/web/conf/model-windows.conf new file mode 100644 index 0000000..fe01561 --- /dev/null +++ b/server/model/Resources/web/conf/model-windows.conf @@ -0,0 +1,56 @@ +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 /dev-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; + } + } +} diff --git a/server/model/Resources/web/conf/web.conf b/server/model/Resources/web/conf/web.conf new file mode 100644 index 0000000..4341e50 --- /dev/null +++ b/server/model/Resources/web/conf/web.conf @@ -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; +} diff --git a/server/model/install-win7-model.iss b/server/model/install-win7-model.iss new file mode 100644 index 0000000..61d344c --- /dev/null +++ b/server/model/install-win7-model.iss @@ -0,0 +1,274 @@ +;iss + +#define MyAppName "模型管理" +#define MyAppVersion "v1.0.0" +#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 + + +; 默认配置 +[Setup] +AppId={{A0EBDCA7-8C1A-43FD-BD3A-7E9E6D8B7F6C} +; 默认安装路径 +DefaultDirName={localappdata}\XManage +; 安装密码 +Password=20250813 +; 是否加密 +Encryption=yes +; ICO图标 +;SetupIconFile=Resources\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}.bat + + +; 语言选择 +[Languages] +Name: "Chinese"; MessagesFile: "compiler:Languages\Chinese.isl" + + +;; 任务 +[Tasks] +; 是否创建桌面图标 +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked + + +;; 程序 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 + + +;; 组件安装方式 +[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; + + +;; 创建必要目录 +[Dirs] +Name: "{app}\{#MyAppExeName}\web\logs"; Permissions: users-modify; Components: Starter; +Name: "{app}\{#MyAppExeName}\web\temp"; Permissions: users-modify; Components: Starter; + + +;; 安装时注册表与环境变量列表 +[Registry] +Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; \ + ValueName: "{#MyAppExeNameUpper}_MAIN"; ValueData: "{app}\{#MyAppExeName}"; +; 启动jar +Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; \ + ValueName: "{#MyAppExeNameUpper}_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: "{#MyAppExeNameUpper}_VM_PARAMS"; ValueData: " \ + --enable-preview \ + -Dserver.port=28680 \ + -Dproject.database-ip=127.0.0.1 \ + -Dproject.database-port=33306 \ + -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 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 + diff --git a/server/model/resources-initialize.bat b/server/model/resources-initialize.bat new file mode 100644 index 0000000..33edca4 --- /dev/null +++ b/server/model/resources-initialize.bat @@ -0,0 +1,21 @@ +@echo off +setlocal enabledelayedexpansion +chcp 65001 >nul +title Initialization + +set "BASE_PATH=Resources/" + +echo [INFO] 正在创建 【模型】 初始化构建安装包目录结构 +for %%f in ( + "server" + "script/model" + "web" + "dist" +) do ( + echo [INFO] 创建: %%~f + mkdir "%BASE_PATH%/%%~f" + echo. +) + +pause +endlocal \ No newline at end of file