fix: 一键部署

master
Tongg 5 months ago
parent f10c502efd
commit f2d579bd2f
  1. BIN
      UserManagerTool/Images/install.png
  2. 174
      UserManagerTool/InstallWindow.xaml
  3. 113
      UserManagerTool/InstallWindow.xaml.cs
  4. 59
      UserManagerTool/Model/Helper/Common.cs
  5. 2
      UserManagerTool/UserManagerTool.csproj

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

@ -6,8 +6,76 @@
xmlns:local="clr-namespace:UserManagerTool"
mc:Ignorable="d" WindowStartupLocation="CenterScreen"
ResizeMode="NoResize"
Icon="./instal.ico"
Title="Spark 1.0 Install Tools" Height="550" Width="500">
Icon="./instal.ico" Loaded="InstallWindow_OnLoaded"
Title="Spark 1.0 Install Tools" Height="450" Width="500">
<Window.Resources>
<LinearGradientBrush x:Key="PrimaryBlueColor" StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#40b1ff" Offset="0"/>
<GradientStop Color="#3c9ce6" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="PrimaryBlueColorHover" StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#40b1ff" Offset="0"/>
<GradientStop Color="#1c8ccc" Offset="1"/>
</LinearGradientBrush>
<Style x:Key="InstallButton" TargetType="Button">
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="Border"
Background="{StaticResource PrimaryBlueColor}"
CornerRadius="5">
<Label Content="{TemplateBinding Content}"
Foreground="Azure"
FontSize="16"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Border" Property="Background" Value="{StaticResource PrimaryBlueColorHover}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="PrimaryButton" TargetType="Button">
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="Border"
Background="{StaticResource PrimaryBlueColor}"
CornerRadius="0 5 5 0">
<Label Content="{TemplateBinding Content}"
Foreground="Azure"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Border" Property="Background" Value="{StaticResource PrimaryBlueColorHover}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="TextBox" TargetType="TextBox">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="BorderBrush" Value="Transparent" />
<Setter Property="Margin" Value="1" />
<Setter Property="TextAlignment" Value="Left" />
<Setter Property="VerticalContentAlignment" Value="Center" />
</Style>
<Style x:Key="TextBlockTitle" TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Width" Value="80" />
<Setter Property="FontSize" Value="14" />
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
@ -17,14 +85,29 @@
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0" Text="Spark 1.0 安装部署工具" FontSize="20"
HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0 20 0 0"
/>
<Grid Grid.Column="0" Grid.Row="0" Margin="0 20 0 0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Image Grid.Column="1" Source="Images/install.png" Width="50"></Image>
<TextBlock Grid.Column="2" Text="Spark 1.0 安装部署工具" FontSize="25"
Foreground="{StaticResource PrimaryBlueColor}"
FontWeight="Bold"
HorizontalAlignment="Center" VerticalAlignment="Center"
/>
</Grid>
<!-- 部署路径 -->
<Grid Grid.Row="2" Grid.Column="0" Margin="20 10 20 0" Height="30">
<Grid.ColumnDefinitions>
@ -32,9 +115,15 @@
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="部 署 路 径:" VerticalAlignment="Center" Width="80"/>
<TextBox Grid.Column="1" Text="" x:Name="InstallPath" TextAlignment="Left" VerticalContentAlignment="Center"/>
<Button Grid.Column="2" Content="浏览" Width="40" x:Name="BrowseInstallPath" Click="ButtonBase_OnClick"/>
<TextBlock Grid.Column="0" Text="部 署 路 径:" Style="{StaticResource TextBlockTitle}"/>
<Border Grid.Column="1" BorderBrush="#40b1ff"
BorderThickness="1"
CornerRadius="5 0 0 5">
<TextBox Style="{StaticResource TextBox}" Text="D:\SparkClient" x:Name="InstallPath" />
</Border>
<Button Grid.Column="2" Style="{StaticResource PrimaryButton}" Content="浏览" Width="40" x:Name="BrowseInstallPath" Click="ButtonBase_OnClick"/>
</Grid>
<!-- 登录用户 -->
<Grid Grid.Row="3" Grid.Column="0" Margin="20 10 20 0" Height="30">
@ -43,8 +132,12 @@
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="登录用户名:" VerticalAlignment="Center" Width="80"/>
<TextBox Grid.Column="1" Text="" x:Name="DefaultUserName" TextAlignment="Left" VerticalContentAlignment="Center"/>
<TextBlock Grid.Column="0" Text="登录用户名:" Style="{StaticResource TextBlockTitle}"/>
<Border Grid.Column="1" BorderBrush="#40b1ff"
BorderThickness="1"
CornerRadius="5">
<TextBox Style="{StaticResource TextBox}" Text="" x:Name="DefaultUserName" />
</Border>
</Grid>
<!-- 登陆密码 -->
<Grid Grid.Row="4" Grid.Column="0" Margin="20 10 20 0" Height="30">
@ -53,8 +146,13 @@
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="登 录 密 码:" VerticalAlignment="Center" Width="80"/>
<TextBox Grid.Column="1" Text="" x:Name="DefaultPassword" TextAlignment="Left" VerticalContentAlignment="Center"/>
<TextBlock Grid.Column="0" Text="登 录 密 码:" Style="{StaticResource TextBlockTitle}"/>
<Border Grid.Column="1" BorderBrush="#40b1ff"
BorderThickness="1"
CornerRadius="5">
<TextBox Style="{StaticResource TextBox}" Text="" x:Name="DefaultPassword" />
</Border>
</Grid>
<!-- 设备号 -->
<Grid Grid.Row="5" Grid.Column="0" Margin="20 10 20 0" Height="30">
@ -63,28 +161,52 @@
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="设 备 号 码:" VerticalAlignment="Center" Width="80"/>
<TextBox Grid.Column="1" Text="" x:Name="DeviceCode" TextAlignment="Left" VerticalContentAlignment="Center"/>
<TextBlock Grid.Column="0" Text="设 备 号 码:" Style="{StaticResource TextBlockTitle}"/>
<Border Grid.Column="1" BorderBrush="#40b1ff"
BorderThickness="1"
CornerRadius="5">
<TextBox Style="{StaticResource TextBox}" Text="" x:Name="DeviceCode" />
</Border>
</Grid>
<Grid Grid.Row="7" Grid.Column="0" Margin="20 10 20 0" Height="20">
<!-- <Grid.ColumnDefinitions> -->
<!-- <ColumnDefinition Width="Auto" /> -->
<!-- <ColumnDefinition Width="*" /> -->
<!-- <ColumnDefinition Width="*" /> -->
<!-- <ColumnDefinition Width="Auto" /> -->
<!-- </Grid.ColumnDefinitions> -->
<!-- <Button Grid.Column="1" Content="资源完整性检测" x:Name="InstallCheck" Click="ButtonBase_OnClick"/> -->
<!-- <Button Grid.Column="2" Content="运行环境检测" x:Name="ll1" Click="ButtonBase_OnClick"/> -->
<CheckBox Content="部署完成后,在桌面创建快捷方式。" IsChecked="True"></CheckBox>
<Grid Grid.Row="6" Grid.Column="0" Margin="20 10 20 0" Height="30">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="切工仪URL:" Style="{StaticResource TextBlockTitle}"/>
<Border Grid.Column="1" BorderBrush="#40b1ff"
BorderThickness="1"
CornerRadius="5 0 0 5">
<TextBox Style="{StaticResource TextBox}" Text="http://127.0.0.1/cut" x:Name="CutUrl" />
</Border>
<Button Grid.Column="2" Style="{StaticResource PrimaryButton}" Content="Ping" Width="40" x:Name="TestCutUrl" Click="ButtonBase_OnClick"/>
</Grid>
<Grid Grid.Row="8" Grid.Column="0" Margin="20 10 20 20" Height="30">
<!-- <Grid Grid.Row="7" Grid.Column="0" Margin="20 10 20 0" Height="30"> -->
<!-- <Grid.ColumnDefinitions> -->
<!-- <ColumnDefinition Width="Auto" /> -->
<!-- <ColumnDefinition Width="*" /> -->
<!-- <ColumnDefinition Width="Auto" /> -->
<!-- </Grid.ColumnDefinitions> -->
<!-- <TextBlock Grid.Column="0" Text="工 作 空 间:" Style="{StaticResource TextBlockTitle}"/> -->
<!-- <TextBox Grid.Column="1" Text="" x:Name="WorkSpace" TextAlignment="Left" VerticalContentAlignment="Center"/> -->
<!-- <Button Grid.Column="2" Content="浏览" Width="40" x:Name="BrowseWorkSpace" Click="ButtonBase_OnClick"/> -->
<!-- </Grid> -->
<Grid Grid.Row="9" Grid.Column="0" Margin="20 10 20 20" Height="60">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Button Grid.Column="1" Content="一键部署" x:Name="Install" Click="ButtonBase_OnClick"/>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button Grid.Row="0" Grid.Column="1" Style="{StaticResource InstallButton}" Content="开始部署" x:Name="Install" Click="ButtonBase_OnClick"/>
<CheckBox Grid.Row="1" Grid.Column="1" Content="部署成功后,在桌面创建快捷方式。" Height="20" IsChecked="True" Margin="0 5 0 0" x:Name="CheckBox"/>
</Grid>
</Grid>
</Window>

@ -1,5 +1,9 @@
using System.Windows;
using System.Security.Principal;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Win32;
using UserManagerTool.Model.Helper;
namespace UserManagerTool;
@ -21,6 +25,13 @@ public partial class InstallWindow : Window
* 6.
* 7. ->
*/
if (InstallSprakCheck())
{
//检查资源完整性
string strBaseUrl = AppDomain.CurrentDomain.BaseDirectory;
MessageBox.Show("部署完成");
}
}
private bool InstallSprakCheck()
@ -34,12 +45,90 @@ public partial class InstallWindow : Window
* | config -- db文件
* Install.exe
*/
string strInstallPath = InstallPath.Text;
if (string.IsNullOrWhiteSpace(strInstallPath))
{
MessageBox.Show("请选择部署路径!");
return false;
}
else
{
if (!Common.IsValidPath(strInstallPath))
{
MessageBox.Show("无效的部署路径!");
return false;
}
string pattern = @"[\u4e00-\u9fff\s!@#$%^&*(),.?\{}|<>]";
if (Regex.IsMatch(strInstallPath, pattern))
{
MessageBoxResult result = MessageBox.Show("所选路径不建议包括中文、空格等特殊符号,可能引发异常,是否忽略?", "提醒", MessageBoxButton.YesNo, MessageBoxImage.Question);
if (!(result == MessageBoxResult.Yes || result == MessageBoxResult.OK))
{
return false;
}
}
}
string strUserName = DefaultUserName.Text;
string strPassword = DefaultPassword.Text;
if (string.IsNullOrWhiteSpace(strUserName) || string.IsNullOrWhiteSpace(strPassword))
{
MessageBox.Show("请为系统添加一个用户和密码!");
return false;
}
if (strPassword.Length < 6)
{
MessageBox.Show("密码长度至少6位!");
return false;
}
string strDeviceCode = DeviceCode.Text;
if (strDeviceCode.Length < 4)
{
MessageBox.Show("设备号长度至少4位!");
return false;
}
string strCutUrl = CutUrl.Text;
if (string.IsNullOrWhiteSpace(strCutUrl))
{
MessageBox.Show("请设置切工仪URL!");
return false;
}
return true;
}
void TestCutUrlPing()
{
if (Common.IsHostReachable(CutUrl.Text))
{
MessageBox.Show("Ping测试成功!", "成功");
}
else
{
MessageBox.Show("Ping测试失败!", "失败");
}
}
private void SetInstallPath()
{
var dialog = new OpenFolderDialog
{
Title = "请选择部署位置"
};
// 显示对话框并检查结果
bool? result = dialog.ShowDialog();
if (result == true)
{
// 返回用户选择的目录路径
InstallPath.Text = dialog.FolderName.EndsWith(@"\")?dialog.FolderName+"SparkClient":dialog.FolderName+@"\SparkClient";
}
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
@ -51,13 +140,27 @@ public partial class InstallWindow : Window
case "Install":
InstallSprak();
break;
case "InstallCheck":
InstallSprakCheck();
case "TestCutUrl":
TestCutUrlPing();
break;
case "InstallPath":
case "BrowseInstallPath":
SetInstallPath();
break;
}
}
}
private void InstallWindow_OnLoaded(object sender, RoutedEventArgs e)
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
if (!isAdmin)
{
MessageBox.Show("建议以管理员权限运行此程序!", "权限不足", MessageBoxButton.OK, MessageBoxImage.Warning);
}
}
}

@ -1,7 +1,10 @@
using System.Data;
using System.IO;
using System.Net.NetworkInformation;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
namespace UserManagerTool.Model.Helper;
@ -100,4 +103,60 @@ public class Common
return string.Concat(hashBytes.Select(b => b.ToString("X2")));
}
}
public static bool IsValidPath(string path)
{
// 使用正则表达式检查路径格式
string pattern = @"^[a-zA-Z]:\\[^\\/:*?""<>|]+(?:\\(?:[^\\/:*?""<>|]+\\)*[^\\/:*?""<>|]+)?$";
if (!Regex.IsMatch(path, pattern))
{
return false;
}
// 使用 Path.GetFullPath 进一步验证路径
try
{
string fullPath = Path.GetFullPath(path);
return true;
}
catch
{
return false;
}
}
public static bool IsHostReachable(string url)
{
string host = ExtractHostFromUrl(url);
if (string.IsNullOrEmpty(host))
{
return false;
}
try
{
Ping ping = new Ping();
PingReply reply = ping.Send(host, 1000); // 超时时间为 1000 毫秒
return reply.Status == IPStatus.Success;
}
catch (Exception ex)
{
return false;
}
}
public static string ExtractHostFromUrl(string url)
{
// 使用正则表达式提取主机部分
string pattern = @"^(https?:\/\/)?([^\/\?:]+)";
Match match = Regex.Match(url, pattern);
if (match.Success)
{
return match.Groups[2].Value;
}
return null;
}
}

@ -19,6 +19,8 @@
<ItemGroup>
<None Remove="instal.ico" />
<Resource Include="instal.ico" />
<None Remove="Images\install.png" />
<Resource Include="Images\install.png" />
</ItemGroup>
</Project>

Loading…
Cancel
Save