This commit is contained in:
2023-04-18 15:52:47 +08:00
parent 96418613dd
commit 469a2e7362
131 changed files with 1544 additions and 1262 deletions
+42 -40
View File
@@ -28,6 +28,7 @@
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main));
groupBox1 = new GroupBox();
connectButton = new Button();
passwordTextBox = new TextBox();
@@ -77,16 +78,16 @@
groupBox1.Controls.Add(label3);
groupBox1.Controls.Add(label2);
groupBox1.Controls.Add(label1);
groupBox1.Location = new Point(24, 25);
groupBox1.Location = new Point(11, 12);
groupBox1.Name = "groupBox1";
groupBox1.Size = new Size(570, 230);
groupBox1.Size = new Size(547, 205);
groupBox1.TabIndex = 0;
groupBox1.TabStop = false;
groupBox1.Text = "第一步:验证数据库";
//
// connectButton
//
connectButton.Location = new Point(195, 168);
connectButton.Location = new Point(195, 150);
connectButton.Name = "connectButton";
connectButton.Size = new Size(128, 40);
connectButton.TabIndex = 6;
@@ -96,7 +97,7 @@
//
// passwordTextBox
//
passwordTextBox.Location = new Point(154, 129);
passwordTextBox.Location = new Point(154, 113);
passwordTextBox.Name = "passwordTextBox";
passwordTextBox.PasswordChar = '*';
passwordTextBox.Size = new Size(271, 23);
@@ -105,7 +106,7 @@
//
// usernameTextBox
//
usernameTextBox.Location = new Point(156, 82);
usernameTextBox.Location = new Point(156, 73);
usernameTextBox.Name = "usernameTextBox";
usernameTextBox.Size = new Size(271, 23);
usernameTextBox.TabIndex = 4;
@@ -113,7 +114,7 @@
//
// serverTextBox
//
serverTextBox.Location = new Point(156, 37);
serverTextBox.Location = new Point(156, 33);
serverTextBox.Name = "serverTextBox";
serverTextBox.Size = new Size(271, 23);
serverTextBox.TabIndex = 3;
@@ -122,7 +123,7 @@
// label3
//
label3.AutoSize = true;
label3.Location = new Point(107, 131);
label3.Location = new Point(107, 113);
label3.Name = "label3";
label3.Size = new Size(32, 17);
label3.TabIndex = 2;
@@ -131,7 +132,7 @@
// label2
//
label2.AutoSize = true;
label2.Location = new Point(101, 83);
label2.Location = new Point(101, 73);
label2.Name = "label2";
label2.Size = new Size(44, 17);
label2.TabIndex = 1;
@@ -140,7 +141,7 @@
// label1
//
label1.AutoSize = true;
label1.Location = new Point(95, 38);
label1.Location = new Point(95, 33);
label1.Name = "label1";
label1.Size = new Size(56, 17);
label1.TabIndex = 0;
@@ -162,9 +163,9 @@
groupBox2.Controls.Add(nginxPortTBox);
groupBox2.Controls.Add(label4);
groupBox2.Controls.Add(label5);
groupBox2.Location = new Point(24, 280);
groupBox2.Location = new Point(12, 223);
groupBox2.Name = "groupBox2";
groupBox2.Size = new Size(570, 418);
groupBox2.Size = new Size(546, 379);
groupBox2.TabIndex = 1;
groupBox2.TabStop = false;
groupBox2.Text = "第二步: 部署参数配置";
@@ -172,7 +173,7 @@
// confimDeployBtn
//
confimDeployBtn.Enabled = false;
confimDeployBtn.Location = new Point(195, 353);
confimDeployBtn.Location = new Point(195, 319);
confimDeployBtn.Name = "confimDeployBtn";
confimDeployBtn.Size = new Size(128, 40);
confimDeployBtn.TabIndex = 19;
@@ -182,7 +183,7 @@
//
// serviceDisplayNameTBox
//
serviceDisplayNameTBox.Location = new Point(152, 303);
serviceDisplayNameTBox.Location = new Point(152, 274);
serviceDisplayNameTBox.Name = "serviceDisplayNameTBox";
serviceDisplayNameTBox.Size = new Size(259, 23);
serviceDisplayNameTBox.TabIndex = 16;
@@ -190,7 +191,7 @@
//
// serviceNameTBox
//
serviceNameTBox.Location = new Point(152, 248);
serviceNameTBox.Location = new Point(152, 228);
serviceNameTBox.Name = "serviceNameTBox";
serviceNameTBox.Size = new Size(259, 23);
serviceNameTBox.TabIndex = 15;
@@ -199,7 +200,7 @@
// label11
//
label11.AutoSize = true;
label11.Location = new Point(11, 304);
label11.Location = new Point(11, 277);
label11.Name = "label11";
label11.Size = new Size(128, 17);
label11.TabIndex = 14;
@@ -208,7 +209,7 @@
// label10
//
label10.AutoSize = true;
label10.Location = new Point(35, 250);
label10.Location = new Point(35, 231);
label10.Name = "label10";
label10.Size = new Size(104, 17);
label10.TabIndex = 13;
@@ -219,7 +220,7 @@
selectPathBtn.Enabled = false;
selectPathBtn.Location = new Point(429, 43);
selectPathBtn.Name = "selectPathBtn";
selectPathBtn.Size = new Size(118, 27);
selectPathBtn.Size = new Size(95, 27);
selectPathBtn.TabIndex = 12;
selectPathBtn.Text = "选择";
selectPathBtn.UseVisualStyleBackColor = true;
@@ -228,7 +229,7 @@
// folderPathTbox
//
folderPathTbox.Enabled = false;
folderPathTbox.Location = new Point(152, 43);
folderPathTbox.Location = new Point(152, 44);
folderPathTbox.Name = "folderPathTbox";
folderPathTbox.Size = new Size(259, 23);
folderPathTbox.TabIndex = 11;
@@ -236,7 +237,7 @@
// label9
//
label9.AutoSize = true;
label9.Location = new Point(83, 43);
label9.Location = new Point(83, 48);
label9.Name = "label9";
label9.Size = new Size(56, 17);
label9.TabIndex = 10;
@@ -244,7 +245,7 @@
//
// dbNameTBox
//
dbNameTBox.Location = new Point(152, 191);
dbNameTBox.Location = new Point(152, 182);
dbNameTBox.Name = "dbNameTBox";
dbNameTBox.Size = new Size(259, 23);
dbNameTBox.TabIndex = 9;
@@ -253,7 +254,7 @@
// label8
//
label8.AutoSize = true;
label8.Location = new Point(47, 197);
label8.Location = new Point(47, 185);
label8.Name = "label8";
label8.Size = new Size(92, 17);
label8.TabIndex = 8;
@@ -261,7 +262,7 @@
//
// apiPortTBox
//
apiPortTBox.Location = new Point(152, 146);
apiPortTBox.Location = new Point(152, 136);
apiPortTBox.Name = "apiPortTBox";
apiPortTBox.Size = new Size(259, 23);
apiPortTBox.TabIndex = 5;
@@ -269,7 +270,7 @@
//
// nginxPortTBox
//
nginxPortTBox.Location = new Point(152, 98);
nginxPortTBox.Location = new Point(152, 90);
nginxPortTBox.Name = "nginxPortTBox";
nginxPortTBox.Size = new Size(259, 23);
nginxPortTBox.TabIndex = 4;
@@ -278,7 +279,7 @@
// label4
//
label4.AutoSize = true;
label4.Location = new Point(11, 153);
label4.Location = new Point(11, 140);
label4.Name = "label4";
label4.Size = new Size(128, 17);
label4.TabIndex = 3;
@@ -287,7 +288,7 @@
// label5
//
label5.AutoSize = true;
label5.Location = new Point(35, 100);
label5.Location = new Point(35, 93);
label5.Name = "label5";
label5.Size = new Size(104, 17);
label5.TabIndex = 2;
@@ -302,18 +303,18 @@
groupBox3.Controls.Add(machineCodeLB);
groupBox3.Controls.Add(label6);
groupBox3.Controls.Add(label7);
groupBox3.Location = new Point(24, 713);
groupBox3.Location = new Point(14, 615);
groupBox3.Name = "groupBox3";
groupBox3.Size = new Size(570, 221);
groupBox3.Size = new Size(544, 221);
groupBox3.TabIndex = 2;
groupBox3.TabStop = false;
groupBox3.Text = "第三步:激活与部署";
//
// btnCopy
//
btnCopy.Location = new Point(429, 51);
btnCopy.Location = new Point(429, 39);
btnCopy.Name = "btnCopy";
btnCopy.Size = new Size(118, 27);
btnCopy.Size = new Size(93, 27);
btnCopy.TabIndex = 13;
btnCopy.Text = "复制";
btnCopy.UseVisualStyleBackColor = true;
@@ -322,7 +323,7 @@
// activeBtn
//
activeBtn.Enabled = false;
activeBtn.Location = new Point(195, 146);
activeBtn.Location = new Point(195, 139);
activeBtn.Name = "activeBtn";
activeBtn.Size = new Size(128, 40);
activeBtn.TabIndex = 9;
@@ -332,14 +333,14 @@
//
// KeySecreteTextBox
//
KeySecreteTextBox.Location = new Point(152, 101);
KeySecreteTextBox.Location = new Point(152, 92);
KeySecreteTextBox.Name = "KeySecreteTextBox";
KeySecreteTextBox.Size = new Size(259, 23);
KeySecreteTextBox.TabIndex = 8;
//
// machineTextBox
//
machineTextBox.Location = new Point(152, 51);
machineTextBox.Location = new Point(152, 42);
machineTextBox.Name = "machineTextBox";
machineTextBox.ReadOnly = true;
machineTextBox.Size = new Size(259, 23);
@@ -348,7 +349,7 @@
// machineCodeLB
//
machineCodeLB.AutoSize = true;
machineCodeLB.Location = new Point(163, 51);
machineCodeLB.Location = new Point(163, 44);
machineCodeLB.Name = "machineCodeLB";
machineCodeLB.Size = new Size(0, 17);
machineCodeLB.TabIndex = 6;
@@ -356,7 +357,7 @@
// label6
//
label6.AutoSize = true;
label6.Location = new Point(95, 101);
label6.Location = new Point(95, 94);
label6.Name = "label6";
label6.Size = new Size(44, 17);
label6.TabIndex = 5;
@@ -365,7 +366,7 @@
// label7
//
label7.AutoSize = true;
label7.Location = new Point(95, 51);
label7.Location = new Point(95, 44);
label7.Name = "label7";
label7.Size = new Size(44, 17);
label7.TabIndex = 4;
@@ -374,9 +375,9 @@
// groupBox4
//
groupBox4.Controls.Add(logTBox);
groupBox4.Location = new Point(618, 25);
groupBox4.Location = new Point(570, 11);
groupBox4.Name = "groupBox4";
groupBox4.Size = new Size(391, 890);
groupBox4.Size = new Size(391, 825);
groupBox4.TabIndex = 4;
groupBox4.TabStop = false;
groupBox4.Text = "部署日志";
@@ -385,7 +386,7 @@
//
logTBox.Location = new Point(6, 22);
logTBox.Name = "logTBox";
logTBox.Size = new Size(359, 862);
logTBox.Size = new Size(359, 797);
logTBox.TabIndex = 0;
logTBox.Text = "";
//
@@ -393,13 +394,14 @@
//
AutoScaleDimensions = new SizeF(7F, 17F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1021, 946);
ClientSize = new Size(977, 847);
Controls.Add(groupBox4);
Controls.Add(groupBox3);
Controls.Add(groupBox2);
Controls.Add(groupBox1);
Icon = (Icon)resources.GetObject("$this.Icon");
Name = "Main";
Text = "EI Image Viewer";
Text = "EI Image Viewer V1";
Load += Main_Load;
groupBox1.ResumeLayout(false);
groupBox1.PerformLayout();
+342 -216
View File
@@ -27,6 +27,8 @@ using static System.Windows.Forms.VisualStyles.VisualStyleElement.ToolBar;
using System.Data.SqlTypes;
using Serilog;
using System.Xml.Linq;
using System.IO;
using Microsoft.Win32;
namespace Start
{
@@ -45,6 +47,8 @@ namespace Start
{
InitializeComponent();
this.MaximizeBox = false;
var physicalAddressList = NetworkInterface.GetAllNetworkInterfaces().Select(t => t.GetPhysicalAddress().ToString());
this.machineTextBox.Text = physicalAddressList.FirstOrDefault()?.ToString();
@@ -61,38 +65,40 @@ namespace Start
private void connectButton_Click(object sender, EventArgs e)
{
string connectionString = $"Server={serverTextBox.Text};User Id={usernameTextBox.Text};Password={passwordTextBox.Text};";
SqlConnection connection = new SqlConnection(connectionString);
try
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
try
{
connection.Open();
WinformLog("数据库连接测试成功!", Color.Green);
WinformLog("数据库连接测试成功!", Color.Green);
isCanDBConfig = false;
serverTextBox.Enabled = isCanDBConfig;
usernameTextBox.Enabled = isCanDBConfig;
passwordTextBox.Enabled = isCanDBConfig;
connectButton.Enabled = false;
isCanDBConfig = false;
serverTextBox.Enabled = isCanDBConfig;
usernameTextBox.Enabled = isCanDBConfig;
passwordTextBox.Enabled = isCanDBConfig;
connectButton.Enabled = false;
selectPathBtn.Enabled = true;
//portBtn.Enabled = true;
//testDBBtn.Enabled = true;
//testServicebtn.Enabled = true;
selectPathBtn.Enabled = true;
//portBtn.Enabled = true;
//testDBBtn.Enabled = true;
//testServicebtn.Enabled = true;
}
catch (Exception ex)
{
WinformLog($"数据库连接测试失败:{ex.Message}", Color.Red);
}
}
catch (Exception ex)
{
WinformLog($"数据库连接测试失败:{ex.Message}", Color.Red);
}
finally
{
connection.Close();
}
}
private void portBtn_Click(object sender, EventArgs e)
@@ -266,6 +272,15 @@ namespace Start
await process.StandardInput.WriteLineAsync(cmd);
await process.StandardInput.FlushAsync();
//while (!process.StandardOutput.EndOfStream)
//{
// var output = await process.StandardOutput.ReadLineAsync();
// if (string.IsNullOrWhiteSpace(output))
// {
// break;
// }
//}
}
private async void activeBtn_Click(object sender, EventArgs e)
@@ -286,19 +301,22 @@ namespace Start
var deployFoder = this.folderPathTbox.Text;
string nginxExtractName = "nginx-1.20.1";
string apiExtractName = "APIPublish";
string nginxExtractName = "EIImageViewerWeb";
string apiExtractName = "EIImageViewerService";
string dataExtraName = "EIImageViewerData";
string nginxStartPath = Path.Combine(deployFoder, @$"{nginxExtractName}\");
var nginxConfigPath = Path.Combine(nginxStartPath, @$"conf\nginx.conf");
var apiBinPath = Path.Combine(deployFoder, "APIPublish/IRacIS.Core.API.exe");
var apiJsonConfigPath = Path.Combine(deployFoder, "APIPublish/appsettings.CertificateApply.json");
var apiBinPath = Path.Combine(deployFoder, "EIImageViewerService/EI_Image_Viewer.exe");
var apiJsonConfigPath = Path.Combine(deployFoder, "EIImageViewerService/appsettings.CertificateApply.json");
string nginxRarFilePath = Path.Combine(AppContext.BaseDirectory, $@"deploy\nginx-1.20.1.rar"); // 要解压缩的RAR文件路径
string apiRarFilePath = Path.Combine(AppContext.BaseDirectory, "deploy/net6.0.rar"); // 要解压缩的RAR文件路径
string nginxRarFilePath = Path.Combine(AppContext.BaseDirectory, $@"Resource\EIImageViewerWeb.rar"); // 要解压缩的RAR文件路径
string apiRarFilePath = Path.Combine(AppContext.BaseDirectory, "Resource/EIImageViewerService.rar"); // 要解压缩的RAR文件路径
string dataRarFilePath = Path.Combine(AppContext.BaseDirectory, "Resource/EIImageViewerData.rar");
@@ -310,6 +328,7 @@ namespace Start
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
// 创建新进程并启动
var process = new Process();
process.StartInfo = startInfo;
@@ -319,13 +338,13 @@ namespace Start
#region nginx
WinformLog($"开始解压 nginx 及前端部署 RAR文件", Color.Green);
await Task.Run(() =>
{
#region nginx
WinformLog($"开始解压 nginx 及前端部署压缩文件...", Color.Green);
string extractPath = Path.Combine(deployFoder, nginxExtractName);
if (!Directory.Exists(extractPath))
{
@@ -349,25 +368,55 @@ namespace Start
}
WinformLog($"nginx 及前端部署 RAR文件已成功解压缩到: + {extractPath}", Color.Green);
WinformLog($"nginx 及前端部署压缩文件已成功解压缩到: {extractPath}", Color.Green);
#endregion
});
await Task.Run( () =>
{
#region
#endregion
WinformLog($"开始解压后端部署压缩文件...", Color.Green);
string apiExtractPath = Path.Combine(deployFoder, apiExtractName);
if (!Directory.Exists(apiExtractPath))
{
Directory.CreateDirectory(apiExtractPath);
}
using (var archive = RarArchive.Open(apiRarFilePath))
{
foreach (var entry in archive.Entries)
{
if (!entry.IsDirectory)
{
entry.WriteToDirectory(apiExtractPath, new ExtractionOptions() { ExtractFullPath = true, Overwrite = true });
}
else
{
string directoryPath = Path.Combine(apiExtractPath, entry.Key);
Directory.CreateDirectory(directoryPath);
}
}
}
#region
WinformLog($"开始解压 后端部署 RAR文件", Color.Green);
WinformLog($"后端部署压缩文件已成功解压缩到: {apiExtractPath}", Color.Green);
#endregion
});
await Task.Run(() =>
{
string extractPath = Path.Combine(deployFoder, apiExtractName);
#region
WinformLog($"开始解压部署依赖模板压缩文件...", Color.Green);
string extractPath = Path.Combine(deployFoder, dataExtraName);
if (!Directory.Exists(extractPath))
{
@@ -375,7 +424,7 @@ namespace Start
}
using (var archive = RarArchive.Open(apiRarFilePath))
using (var archive = RarArchive.Open(dataRarFilePath))
{
foreach (var entry in archive.Entries)
{
@@ -387,195 +436,289 @@ namespace Start
}
WinformLog($"后端部署 RAR文件已成功解压缩到: + {extractPath}", Color.Green);
WinformLog($"依赖模板压缩文件已成功解压缩到: {extractPath}", Color.Green);
#endregion
#region
var otherFileFolder = Path.Combine(AppContext.BaseDirectory, $@"Resource");
if (Directory.Exists(otherFileFolder))
{
// 获取源目录下所有文件
string[] files = Directory.GetFiles(otherFileFolder);
foreach (string file in files)
{
// 筛选掉文件夹
if (!File.GetAttributes(file).HasFlag(FileAttributes.Directory))
{
string extension = Path.GetExtension(file);
if (extension != ".zip" && extension != ".rar" && extension != ".7z" && extension != ".tar" && extension != ".gz")
{
// 获取文件名
string fileName = Path.GetFileName(file);
// 拷贝文件到目标目录
File.Copy(file, Path.Combine(deployFoder, fileName), true);
}
}
}
}
WinformLog($"文档资源释放成功", Color.Green);
#endregion
});
await Task.Run(() =>
{
#region nginx nginx
if (!File.Exists(nginxConfigPath))
{
WinformLog("预设路径不存在nginx", Color.Red);
}
WinformLog("准备写入nginx配置...", Color.Green);
var nginxConfig = File.ReadAllText(nginxConfigPath);
nginxConfig = nginxConfig.Replace("9520", vuePort.ToString());
nginxConfig = nginxConfig.Replace("7100", apiPort.ToString());
File.WriteAllText(nginxConfigPath, nginxConfig);
WinformLog("nginx部署配置写入完成", Color.Green);
// 获取nginx.exe所在的目录
// 创建ProcessStartInfo对象,指定要启动的可执行文件及其参数
ProcessStartInfo psi = new ProcessStartInfo(nginxStartPath + "nginx.exe");
// 指定工作目录,即进入nginx.exe所在的目录
psi.WorkingDirectory = nginxStartPath;
WinformLog(" 开始启动 nginx 服务...", Color.Green);
// 启动可执行文件
Process.Start(psi);
if (Process.GetProcesses().Any(t => t.ProcessName.Contains("nginx") && t.MainModule.FileName.Contains(nginxStartPath)))
{
WinformLog(" nginx 服务启动成功", Color.Green);
}
else
{
WinformLog(" nginx 服务启动失败", Color.Red);
return;
}
#endregion
#region
try
{
string directoryPath = @"C:\ProgramData\.xingcang";
if (!Directory.Exists(directoryPath))
{
Directory.CreateDirectory(directoryPath);
}
var configObj = new
{
key = this.machineTextBox.Text,
value = this.KeySecreteTextBox.Text.Trim(),
user = usernameTextBox.Text,
server = serverTextBox.Text,
password = passwordTextBox.Text,
dbName = dbNameTBox.Text,
deployFolder = deployFoder,
nginxPath = Path.Combine(nginxStartPath, "nginx.exe"),
apiPath = apiBinPath,
serviceName = serviceName,
};
File.WriteAllText(Path.Combine(directoryPath, "config.json"), JsonConvert.SerializeObject(configObj));
WinformLog("写入激活秘钥完成", Color.Green);
}
catch (Exception ex)
{
WinformLog("写入激活秘钥失败,请用管理员方式启动该程序,保证程序可以", Color.Red);
}
#endregion
});
#endregion
#region nginx nginx
await Task.Run(async () =>{
#region
if (!File.Exists(nginxConfigPath))
{
WinformLog("预设路径不存在nginx", Color.Red);
}
WinformLog($"开始创建服务{serviceName}...", Color.Green);
var nginxConfig = File.ReadAllText(nginxConfigPath);
var createStr = $@"sc create {serviceName} binPath= ""{apiBinPath} --urls=""http://127.0.0.1:{apiPort}"" --env CertificateApply"" DisplayName= ""{serviceDisplayName}"" start= auto";
nginxConfig = nginxConfig.Replace("9520", vuePort.ToString());
nginxConfig = nginxConfig.Replace("7100", apiPort.ToString());
// 执行 sc create 命令来创建服务
await ProcessStandardInputAsync(process, createStr);
WinformLog($"服务{serviceName}创建执行结束", Color.Green);
File.WriteAllText(nginxConfigPath, nginxConfig);
// 获取nginx.exe所在的目录
// 创建ProcessStartInfo对象,指定要启动的可执行文件及其参数
ProcessStartInfo psi = new ProcessStartInfo(nginxStartPath + "nginx.exe");
// 指定工作目录,即进入nginx.exe所在的目录
psi.WorkingDirectory = nginxStartPath;
WinformLog(" 开始启动 nginx 服务...", Color.Green);
// 启动可执行文件
Process.Start(psi);
#endregion
if (Process.GetProcesses().Any(t => t.ProcessName.Contains("nginx") && t.MainModule.FileName.Contains(nginxStartPath)))
{
WinformLog(" nginx 服务启动成功", Color.Green);
}
else
{
WinformLog(" nginx 服务启动失败", Color.Red);
return;
}
#endregion
#region
var configObj = new
{
key = this.machineTextBox.Text,
value = this.KeySecreteTextBox.Text.Trim(),
user = usernameTextBox.Text,
server = serverTextBox.Text,
password = passwordTextBox.Text,
dbName = dbNameTBox.Text,
};
File.WriteAllText($@"C:\ProgramData\.xingcang\config.json", JsonConvert.SerializeObject(configObj));
WinformLog("写入激活秘钥完成", Color.Green);
WinformLog($"执行初始化数据库脚本...", Color.Green);
//执行数据库脚本
#region
await ProcessStandardInputAsync(process, $@" SQLCMD -v dbName = ""{dbNameTBox.Text}"" -i ""{AppContext.BaseDirectory}Resource\Data\dbo.sql"" ");
WinformLog("开始写入部署网站服务配置文件...", Color.Green);
var appsettingsJson = File.ReadAllText(apiJsonConfigPath);
// 解析 JSON 字符串
var jObject = JObject.Parse(appsettingsJson);
// 获取 UpdateConfig 属性所在的节点
var updateConfigNode = jObject["ConnectionStrings"];
await ProcessStandardInputAsync(process, $@" SQLCMD -v dbName = ""{dbNameTBox.Text}"" -i ""{AppContext.BaseDirectory}Resource\Data\data.sql"" ");
var connectionString = $"Server={serverTextBox.Text};Database={dbNameTBox.Text};User ID={usernameTextBox.Text};Password={passwordTextBox.Text};TrustServerCertificate=true";
WinformLog($"初始化数据库脚本执行结束", Color.Green);
updateConfigNode["RemoteNew"] = connectionString;
try
{
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
File.WriteAllText(apiJsonConfigPath, jObject.ToString());
}
}
catch (SqlException)
{
Console.WriteLine("连接字符串错误");
WinformLog($"连接字符串错误", Color.Red);
return;
}
WinformLog("部署网站服务配置文件写入并测试OK", Color.Green);
#endregion
#endregion
var createStr = $@"sc create {serviceName} binPath= ""{apiBinPath} --urls=""http://127.0.0.1:{apiPort}"" --env CertificateApply"" DisplayName= ""{serviceDisplayName}"" start= auto";
#region
WinformLog("开始写入部署网站服务配置文件...", Color.Green);
var appsettingsJson = File.ReadAllText(apiJsonConfigPath);
// 解析 JSON 字符串
var jObject = JObject.Parse(appsettingsJson);
// 获取 UpdateConfig 属性所在的节点
var updateConfigNode = jObject["ConnectionStrings"];
#region
var connectionString = $"Server={serverTextBox.Text};Database={dbNameTBox.Text};User ID={usernameTextBox.Text};Password={passwordTextBox.Text};TrustServerCertificate=true";
// 删除已存在的服务
//await ProcessStandardInputAsync(process, $"sc delete {serviceName}");
//Log($"删除服务{serviceName}...", Color.Green);
// 执行 sc create 命令来创建服务
await ProcessStandardInputAsync(process, createStr);
WinformLog($"创建服务{serviceName}...", Color.Green);
WinformLog($"执行初始化数据库脚本...", Color.Green);
//执行数据库脚本
//await ProcessStandardInputAsync(process, Path.Combine(AppContext.BaseDirectory, "deploy/sql/bin.bat"));
await ProcessStandardInputAsync(process, $@" SQLCMD -v dbName = ""{dbNameTBox.Text}"" -i {AppContext.BaseDirectory}deploy\sql\dbo.sql ");
await ProcessStandardInputAsync(process, $@" SQLCMD -v dbName = ""{dbNameTBox.Text}"" -i {AppContext.BaseDirectory}deploy\sql\data.sql ");
WinformLog($"初始化数据库脚本执行结束", Color.Green);
// 执行 sc start 启动服务
WinformLog($"启动部署的后端服务...", Color.Green);
await ProcessStandardInputAsync(process, $"sc start {serviceName}");
// 关闭进程流并等待进程退出
process.StandardInput.Close();
process.WaitForExit();
ServiceController sc = new ServiceController(serviceName);
if (sc.Status == ServiceControllerStatus.Running)
{
WinformLog($"后端服务启动成功", Color.Green);
WinformLog($"部署工作已完成", Color.Green);
updateConfigNode["RemoteNew"] = connectionString;
try
{
WinformLog($"现在打开浏览器...", Color.Green);
// Use ProcessStartInfo class
var start = new ProcessStartInfo($"http://127.0.0.1:{vuePort}")
using (var connection = new SqlConnection(connectionString))
{
UseShellExecute = true,
Verb = "open"
};
Process.Start(start);
connection.Open();
File.WriteAllText(apiJsonConfigPath, jObject.ToString());
}
}
catch (Exception ex)
catch (SqlException)
{
// Handle exception
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
WinformLog($"连接字符串错误", Color.Red);
return;
}
}
else
WinformLog("部署网站服务配置文件写入并测试OK", Color.Green);
#endregion
});
await Task.Run(async () =>
{
WinformLog($"后端服务启动失败", Color.Red);
}
#region
WinformLog($"启动部署的后端服务...", Color.Green);
await ProcessStandardInputAsync(process, $"sc start {serviceName}");
// 关闭进程流并等待进程退出
process.StandardInput.Close();
process.WaitForExit();
ServiceController sc = new ServiceController(serviceName);
if (sc.Status != ServiceControllerStatus.Running)
{
sc.Refresh();
await Task.Delay(3000);
sc.Refresh();
await Task.Delay(2000);
}
if (sc.Status == ServiceControllerStatus.Running)
{
WinformLog($"后端服务启动成功", Color.Green);
WinformLog($"部署工作已完成", Color.Green);
try
{
WinformLog($"现在准备打开浏览器...", Color.Green);
// Use ProcessStartInfo class
var start = new ProcessStartInfo($"http://127.0.0.1:{vuePort}")
{
UseShellExecute = true,
Verb = "open"
};
Process.Start(start);
}
catch (Exception ex)
{
// Handle exception
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
WinformLog($"后端服务启动失败,可以手动启动{serviceDisplayName}尝试", Color.Red);
}
#endregion
});
#endregion
}
private async void selectPathBtn_Click(object sender, EventArgs e)
@@ -589,41 +732,7 @@ namespace Start
WinformLog($"部署路径选择成功", Color.Green);
#region Nginx
var deployFoder = this.folderPathTbox.Text;
string nginxExtractName = "nginx-1.20.1";
string nginxStartPath = Path.Combine(deployFoder, @$"{nginxExtractName}\");
#region
Process process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true; // 不创建新窗口
process.Start();
var proList = Process.GetProcesses().Where(t => t.ProcessName.Contains("nginx") && t.MainModule.FileName.Contains(nginxStartPath));
foreach (var item in proList)
{
item.Kill();
}
await ProcessStandardInputAsync(process, $"sc stop {serviceNameTBox.Text}");
await ProcessStandardInputAsync(process, $"sc delete {serviceNameTBox.Text}");
process.StandardInput.Close();
process.WaitForExit();
#endregion
#endregion
}
}
@@ -639,6 +748,23 @@ namespace Start
Serilog.Log.Logger = new LoggerConfiguration()
.WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
// Check if any version of SQL Server is installed
RegistryKey sqlServerKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Microsoft SQL Server");
if (sqlServerKey != null)
{
WinformLog("当前系统SQL Server 已安装", Color.Green);
}
else
{
WinformLog("SQL Server 未安装,请安装后再运行该部署程序", Color.Red);
}
}
}
}
+137
View File
@@ -60,4 +60,141 @@
<metadata name="folderBrowserDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
QHW69f8D447Kbv4U1JoAAAAASUVORK5CYII=
</value>
</data>
</root>
Binary file not shown.
Binary file not shown.
+16 -10
View File
@@ -6,29 +6,35 @@
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<Platforms>AnyCPU;x86</Platforms>
<Platforms>AnyCPU;</Platforms>
<ApplicationIcon>favicon.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<None Remove="deploy\net6.0.rar" />
<None Remove="deploy\nginx-1.20.1.rar" />
<None Remove="Resource\EIImageViewerData.rar" />
<None Remove="Resource\EIImageViewerService.rar" />
<None Remove="Resource\EIImageViewerWeb.rar" />
<None Remove="ServiceConfig.Json" />
<None Remove="deploy\sql\data.sql" />
<None Remove="deploy\sql\dbo.sql" />
<None Remove="deploy\sql\startNginx.bat" />
<None Remove="Resource\Data\data.sql" />
<None Remove="Resource\Data\dbo.sql" />
<None Remove="Resource\Data\startNginx.bat" />
</ItemGroup>
<ItemGroup>
<Content Include="deploy\net6.0.rar">
<Content Include="favicon.ico" />
<Content Include="Resource\EIImageViewerData.rar">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="deploy\nginx-1.20.1.rar">
<Content Include="Resource\EIImageViewerService.rar">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="deploy\sql\data.sql">
<Content Include="Resource\EIImageViewerWeb.rar">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="deploy\sql\dbo.sql">
<Content Include="Resource\Data\data.sql">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Resource\Data\dbo.sql">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
Binary file not shown.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB